reviewflow 3.21.0 → 3.23.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 (254) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/README.md +44 -1
  3. package/dist/config/projectConfig.d.ts +1 -0
  4. package/dist/config/projectConfig.d.ts.map +1 -1
  5. package/dist/config/projectConfig.js +13 -0
  6. package/dist/config/projectConfig.js.map +1 -1
  7. package/dist/dashboard/index.html +258 -44
  8. package/dist/dashboard/modules/animations.d.ts +164 -0
  9. package/dist/dashboard/modules/animations.d.ts.map +1 -0
  10. package/dist/dashboard/modules/animations.js +405 -0
  11. package/dist/dashboard/modules/animations.js.map +1 -0
  12. package/dist/dashboard/modules/cardCounters.d.ts +16 -1
  13. package/dist/dashboard/modules/cardCounters.d.ts.map +1 -1
  14. package/dist/dashboard/modules/cardCounters.js +36 -2
  15. package/dist/dashboard/modules/cardCounters.js.map +1 -1
  16. package/dist/dashboard/modules/i18n.d.ts.map +1 -1
  17. package/dist/dashboard/modules/i18n.js +20 -2
  18. package/dist/dashboard/modules/i18n.js.map +1 -1
  19. package/dist/dashboard/modules/settingsModal.d.ts.map +1 -1
  20. package/dist/dashboard/modules/settingsModal.js +28 -8
  21. package/dist/dashboard/modules/settingsModal.js.map +1 -1
  22. package/dist/dashboard/styles.css +731 -372
  23. package/dist/main/routes.d.ts.map +1 -1
  24. package/dist/main/routes.js +20 -0
  25. package/dist/main/routes.js.map +1 -1
  26. package/dist/main/server.d.ts.map +1 -1
  27. package/dist/main/server.js +22 -0
  28. package/dist/main/server.js.map +1 -1
  29. package/dist/modules/claude-invocation/interface-adapters/gateways/reviewReport.fileSystem.gateway.d.ts +1 -0
  30. package/dist/modules/claude-invocation/interface-adapters/gateways/reviewReport.fileSystem.gateway.d.ts.map +1 -1
  31. package/dist/modules/claude-invocation/interface-adapters/gateways/reviewReport.fileSystem.gateway.js +26 -5
  32. package/dist/modules/claude-invocation/interface-adapters/gateways/reviewReport.fileSystem.gateway.js.map +1 -1
  33. package/dist/modules/cli-configuration/interface-adapters/controllers/http/repositories.routes.d.ts.map +1 -1
  34. package/dist/modules/cli-configuration/interface-adapters/controllers/http/repositories.routes.js +1 -0
  35. package/dist/modules/cli-configuration/interface-adapters/controllers/http/repositories.routes.js.map +1 -1
  36. package/dist/modules/platform-integration/entities/approvalRevocation/approvalRevocation.gateway.d.ts +10 -0
  37. package/dist/modules/platform-integration/entities/approvalRevocation/approvalRevocation.gateway.d.ts.map +1 -0
  38. package/dist/modules/platform-integration/entities/approvalRevocation/approvalRevocation.gateway.js +2 -0
  39. package/dist/modules/platform-integration/entities/approvalRevocation/approvalRevocation.gateway.js.map +1 -0
  40. package/dist/modules/platform-integration/entities/github/githubIssueCommentEvent.guard.d.ts +50 -0
  41. package/dist/modules/platform-integration/entities/github/githubIssueCommentEvent.guard.d.ts.map +1 -0
  42. package/dist/modules/platform-integration/entities/github/githubIssueCommentEvent.guard.js +21 -0
  43. package/dist/modules/platform-integration/entities/github/githubIssueCommentEvent.guard.js.map +1 -0
  44. package/dist/modules/platform-integration/entities/github/githubPullRequestReviewEvent.guard.d.ts +53 -0
  45. package/dist/modules/platform-integration/entities/github/githubPullRequestReviewEvent.guard.d.ts.map +1 -0
  46. package/dist/modules/platform-integration/entities/github/githubPullRequestReviewEvent.guard.js +23 -0
  47. package/dist/modules/platform-integration/entities/github/githubPullRequestReviewEvent.guard.js.map +1 -0
  48. package/dist/modules/platform-integration/entities/gitlab/gitlabNoteEvent.guard.d.ts +62 -0
  49. package/dist/modules/platform-integration/entities/gitlab/gitlabNoteEvent.guard.d.ts.map +1 -0
  50. package/dist/modules/platform-integration/entities/gitlab/gitlabNoteEvent.guard.js +33 -0
  51. package/dist/modules/platform-integration/entities/gitlab/gitlabNoteEvent.guard.js.map +1 -0
  52. package/dist/modules/platform-integration/entities/noteComment/noteCommentPost.gateway.d.ts +9 -0
  53. package/dist/modules/platform-integration/entities/noteComment/noteCommentPost.gateway.d.ts.map +1 -0
  54. package/dist/modules/platform-integration/entities/noteComment/noteCommentPost.gateway.js +2 -0
  55. package/dist/modules/platform-integration/entities/noteComment/noteCommentPost.gateway.js.map +1 -0
  56. package/dist/modules/platform-integration/interface-adapters/controllers/webhook/eventFilter.d.ts +28 -0
  57. package/dist/modules/platform-integration/interface-adapters/controllers/webhook/eventFilter.d.ts.map +1 -1
  58. package/dist/modules/platform-integration/interface-adapters/controllers/webhook/eventFilter.js +48 -0
  59. package/dist/modules/platform-integration/interface-adapters/controllers/webhook/eventFilter.js.map +1 -1
  60. package/dist/modules/platform-integration/interface-adapters/controllers/webhook/github.controller.d.ts +10 -0
  61. package/dist/modules/platform-integration/interface-adapters/controllers/webhook/github.controller.d.ts.map +1 -1
  62. package/dist/modules/platform-integration/interface-adapters/controllers/webhook/github.controller.js +159 -1
  63. package/dist/modules/platform-integration/interface-adapters/controllers/webhook/github.controller.js.map +1 -1
  64. package/dist/modules/platform-integration/interface-adapters/controllers/webhook/gitlab.controller.d.ts +10 -0
  65. package/dist/modules/platform-integration/interface-adapters/controllers/webhook/gitlab.controller.d.ts.map +1 -1
  66. package/dist/modules/platform-integration/interface-adapters/controllers/webhook/gitlab.controller.js +129 -5
  67. package/dist/modules/platform-integration/interface-adapters/controllers/webhook/gitlab.controller.js.map +1 -1
  68. package/dist/modules/platform-integration/interface-adapters/gateways/cli/approvalRevocation.github.cli.gateway.d.ts +8 -0
  69. package/dist/modules/platform-integration/interface-adapters/gateways/cli/approvalRevocation.github.cli.gateway.d.ts.map +1 -0
  70. package/dist/modules/platform-integration/interface-adapters/gateways/cli/approvalRevocation.github.cli.gateway.js +15 -0
  71. package/dist/modules/platform-integration/interface-adapters/gateways/cli/approvalRevocation.github.cli.gateway.js.map +1 -0
  72. package/dist/modules/platform-integration/interface-adapters/gateways/cli/approvalRevocation.gitlab.cli.gateway.d.ts +8 -0
  73. package/dist/modules/platform-integration/interface-adapters/gateways/cli/approvalRevocation.gitlab.cli.gateway.d.ts.map +1 -0
  74. package/dist/modules/platform-integration/interface-adapters/gateways/cli/approvalRevocation.gitlab.cli.gateway.js +12 -0
  75. package/dist/modules/platform-integration/interface-adapters/gateways/cli/approvalRevocation.gitlab.cli.gateway.js.map +1 -0
  76. package/dist/modules/platform-integration/interface-adapters/gateways/cli/noteCommentPost.github.cli.gateway.d.ts +8 -0
  77. package/dist/modules/platform-integration/interface-adapters/gateways/cli/noteCommentPost.github.cli.gateway.d.ts.map +1 -0
  78. package/dist/modules/platform-integration/interface-adapters/gateways/cli/noteCommentPost.github.cli.gateway.js +11 -0
  79. package/dist/modules/platform-integration/interface-adapters/gateways/cli/noteCommentPost.github.cli.gateway.js.map +1 -0
  80. package/dist/modules/platform-integration/interface-adapters/gateways/cli/noteCommentPost.gitlab.cli.gateway.d.ts +8 -0
  81. package/dist/modules/platform-integration/interface-adapters/gateways/cli/noteCommentPost.gitlab.cli.gateway.d.ts.map +1 -0
  82. package/dist/modules/platform-integration/interface-adapters/gateways/cli/noteCommentPost.gitlab.cli.gateway.js +12 -0
  83. package/dist/modules/platform-integration/interface-adapters/gateways/cli/noteCommentPost.gitlab.cli.gateway.js.map +1 -0
  84. package/dist/modules/review-execution/entities/reviewContext/reviewContext.gateway.d.ts +1 -0
  85. package/dist/modules/review-execution/entities/reviewContext/reviewContext.gateway.d.ts.map +1 -1
  86. package/dist/modules/review-execution/entities/reviewContext/reviewContext.schema.d.ts +10 -2
  87. package/dist/modules/review-execution/entities/reviewContext/reviewContext.schema.d.ts.map +1 -1
  88. package/dist/modules/review-execution/entities/reviewContext/reviewContextResult.factory.d.ts +11 -0
  89. package/dist/modules/review-execution/entities/reviewContext/reviewContextResult.factory.d.ts.map +1 -0
  90. package/dist/modules/review-execution/entities/reviewContext/reviewContextResult.factory.js +22 -0
  91. package/dist/modules/review-execution/entities/reviewContext/reviewContextResult.factory.js.map +1 -0
  92. package/dist/modules/review-execution/entities/reviewContext/reviewContextResult.guard.d.ts +10 -0
  93. package/dist/modules/review-execution/entities/reviewContext/reviewContextResult.guard.d.ts.map +1 -1
  94. package/dist/modules/review-execution/entities/reviewContext/reviewContextResult.schema.d.ts +31 -1
  95. package/dist/modules/review-execution/entities/reviewContext/reviewContextResult.schema.d.ts.map +1 -1
  96. package/dist/modules/review-execution/entities/reviewContext/reviewContextResult.schema.js +11 -1
  97. package/dist/modules/review-execution/entities/reviewContext/reviewContextResult.schema.js.map +1 -1
  98. package/dist/modules/review-execution/interface-adapters/gateways/reviewContext.fileSystem.gateway.d.ts +1 -0
  99. package/dist/modules/review-execution/interface-adapters/gateways/reviewContext.fileSystem.gateway.d.ts.map +1 -1
  100. package/dist/modules/review-execution/interface-adapters/gateways/reviewContext.fileSystem.gateway.js +27 -1
  101. package/dist/modules/review-execution/interface-adapters/gateways/reviewContext.fileSystem.gateway.js.map +1 -1
  102. package/dist/modules/review-execution/services/reviewRecovery.service.d.ts +33 -0
  103. package/dist/modules/review-execution/services/reviewRecovery.service.d.ts.map +1 -0
  104. package/dist/modules/review-execution/services/reviewRecovery.service.js +80 -0
  105. package/dist/modules/review-execution/services/reviewRecovery.service.js.map +1 -0
  106. package/dist/modules/tracking/entities/bypassMarker/bypassMarker.d.ts +10 -0
  107. package/dist/modules/tracking/entities/bypassMarker/bypassMarker.d.ts.map +1 -0
  108. package/dist/modules/tracking/entities/bypassMarker/bypassMarker.js +17 -0
  109. package/dist/modules/tracking/entities/bypassMarker/bypassMarker.js.map +1 -0
  110. package/dist/modules/tracking/entities/qualityGate/qualityGate.d.ts +15 -0
  111. package/dist/modules/tracking/entities/qualityGate/qualityGate.d.ts.map +1 -0
  112. package/dist/modules/tracking/entities/qualityGate/qualityGate.js +24 -0
  113. package/dist/modules/tracking/entities/qualityGate/qualityGate.js.map +1 -0
  114. package/dist/modules/tracking/entities/tracking/trackedMr.d.ts +6 -0
  115. package/dist/modules/tracking/entities/tracking/trackedMr.d.ts.map +1 -1
  116. package/dist/modules/tracking/entities/tracking/trackedMr.js.map +1 -1
  117. package/dist/modules/tracking/interface-adapters/controllers/http/mrTracking.routes.d.ts +1 -0
  118. package/dist/modules/tracking/interface-adapters/controllers/http/mrTracking.routes.d.ts.map +1 -1
  119. package/dist/modules/tracking/interface-adapters/controllers/http/mrTracking.routes.js +14 -3
  120. package/dist/modules/tracking/interface-adapters/controllers/http/mrTracking.routes.js.map +1 -1
  121. package/dist/modules/tracking/interface-adapters/controllers/http/mrTrackingAdvanced.routes.d.ts.map +1 -1
  122. package/dist/modules/tracking/interface-adapters/controllers/http/mrTrackingAdvanced.routes.js +1 -0
  123. package/dist/modules/tracking/interface-adapters/controllers/http/mrTrackingAdvanced.routes.js.map +1 -1
  124. package/dist/modules/tracking/usecases/tracking/handlePlatformApproval.usecase.d.ts +28 -0
  125. package/dist/modules/tracking/usecases/tracking/handlePlatformApproval.usecase.d.ts.map +1 -0
  126. package/dist/modules/tracking/usecases/tracking/handlePlatformApproval.usecase.js +37 -0
  127. package/dist/modules/tracking/usecases/tracking/handlePlatformApproval.usecase.js.map +1 -0
  128. package/dist/modules/tracking/usecases/tracking/recordBypass.usecase.d.ts +28 -0
  129. package/dist/modules/tracking/usecases/tracking/recordBypass.usecase.d.ts.map +1 -0
  130. package/dist/modules/tracking/usecases/tracking/recordBypass.usecase.js +28 -0
  131. package/dist/modules/tracking/usecases/tracking/recordBypass.usecase.js.map +1 -0
  132. package/dist/modules/tracking/usecases/tracking/recordReviewCompletion.usecase.d.ts +1 -0
  133. package/dist/modules/tracking/usecases/tracking/recordReviewCompletion.usecase.d.ts.map +1 -1
  134. package/dist/modules/tracking/usecases/tracking/recordReviewCompletion.usecase.js +10 -1
  135. package/dist/modules/tracking/usecases/tracking/recordReviewCompletion.usecase.js.map +1 -1
  136. package/dist/modules/tracking/usecases/tracking/trackAssignment.usecase.d.ts.map +1 -1
  137. package/dist/modules/tracking/usecases/tracking/trackAssignment.usecase.js +1 -0
  138. package/dist/modules/tracking/usecases/tracking/trackAssignment.usecase.js.map +1 -1
  139. package/dist/modules/tracking/usecases/tracking/transitionState.usecase.d.ts +15 -2
  140. package/dist/modules/tracking/usecases/tracking/transitionState.usecase.d.ts.map +1 -1
  141. package/dist/modules/tracking/usecases/tracking/transitionState.usecase.js +8 -2
  142. package/dist/modules/tracking/usecases/tracking/transitionState.usecase.js.map +1 -1
  143. package/dist/tests/acceptance/170-prebuilt-worktree-lifecycle.acceptance.test.js +1 -0
  144. package/dist/tests/acceptance/170-prebuilt-worktree-lifecycle.acceptance.test.js.map +1 -1
  145. package/dist/tests/acceptance/180-quality-threshold-block-approval-iter-B.acceptance.test.d.ts +17 -0
  146. package/dist/tests/acceptance/180-quality-threshold-block-approval-iter-B.acceptance.test.d.ts.map +1 -0
  147. package/dist/tests/acceptance/180-quality-threshold-block-approval-iter-B.acceptance.test.js +294 -0
  148. package/dist/tests/acceptance/180-quality-threshold-block-approval-iter-B.acceptance.test.js.map +1 -0
  149. package/dist/tests/acceptance/180-quality-threshold-block-approval-iter-C.acceptance.test.d.ts +16 -0
  150. package/dist/tests/acceptance/180-quality-threshold-block-approval-iter-C.acceptance.test.d.ts.map +1 -0
  151. package/dist/tests/acceptance/180-quality-threshold-block-approval-iter-C.acceptance.test.js +316 -0
  152. package/dist/tests/acceptance/180-quality-threshold-block-approval-iter-C.acceptance.test.js.map +1 -0
  153. package/dist/tests/acceptance/180-quality-threshold-block-approval.acceptance.test.d.ts +20 -0
  154. package/dist/tests/acceptance/180-quality-threshold-block-approval.acceptance.test.d.ts.map +1 -0
  155. package/dist/tests/acceptance/180-quality-threshold-block-approval.acceptance.test.js +146 -0
  156. package/dist/tests/acceptance/180-quality-threshold-block-approval.acceptance.test.js.map +1 -0
  157. package/dist/tests/acceptance/91-dashboard-multi-project-overview.acceptance.test.js +2 -0
  158. package/dist/tests/acceptance/91-dashboard-multi-project-overview.acceptance.test.js.map +1 -1
  159. package/dist/tests/factories/projectConfig.factory.d.ts +1 -0
  160. package/dist/tests/factories/projectConfig.factory.d.ts.map +1 -1
  161. package/dist/tests/factories/projectConfig.factory.js +3 -0
  162. package/dist/tests/factories/projectConfig.factory.js.map +1 -1
  163. package/dist/tests/factories/trackedMr.factory.d.ts.map +1 -1
  164. package/dist/tests/factories/trackedMr.factory.js +1 -0
  165. package/dist/tests/factories/trackedMr.factory.js.map +1 -1
  166. package/dist/tests/stubs/approvalRevocation.stub.d.ts +7 -0
  167. package/dist/tests/stubs/approvalRevocation.stub.d.ts.map +1 -0
  168. package/dist/tests/stubs/approvalRevocation.stub.js +11 -0
  169. package/dist/tests/stubs/approvalRevocation.stub.js.map +1 -0
  170. package/dist/tests/stubs/noteCommentPost.stub.d.ts +6 -0
  171. package/dist/tests/stubs/noteCommentPost.stub.d.ts.map +1 -0
  172. package/dist/tests/stubs/noteCommentPost.stub.js +7 -0
  173. package/dist/tests/stubs/noteCommentPost.stub.js.map +1 -0
  174. package/dist/tests/stubs/reviewContextGateway.stub.d.ts +1 -0
  175. package/dist/tests/stubs/reviewContextGateway.stub.d.ts.map +1 -1
  176. package/dist/tests/stubs/reviewContextGateway.stub.js +3 -0
  177. package/dist/tests/stubs/reviewContextGateway.stub.js.map +1 -1
  178. package/dist/tests/units/config/projectConfig.test.js +62 -0
  179. package/dist/tests/units/config/projectConfig.test.js.map +1 -1
  180. package/dist/tests/units/dashboard/modules/animations.test.d.ts +10 -0
  181. package/dist/tests/units/dashboard/modules/animations.test.d.ts.map +1 -0
  182. package/dist/tests/units/dashboard/modules/animations.test.js +223 -0
  183. package/dist/tests/units/dashboard/modules/animations.test.js.map +1 -0
  184. package/dist/tests/units/dashboard/modules/cardCounters.test.js +56 -0
  185. package/dist/tests/units/dashboard/modules/cardCounters.test.js.map +1 -1
  186. package/dist/tests/units/entities/reviewContext/reviewContext.schema.test.js +1 -0
  187. package/dist/tests/units/entities/reviewContext/reviewContext.schema.test.js.map +1 -1
  188. package/dist/tests/units/entities/reviewContext/reviewContextResult.factory.test.d.ts +2 -0
  189. package/dist/tests/units/entities/reviewContext/reviewContextResult.factory.test.d.ts.map +1 -0
  190. package/dist/tests/units/entities/reviewContext/reviewContextResult.factory.test.js +43 -0
  191. package/dist/tests/units/entities/reviewContext/reviewContextResult.factory.test.js.map +1 -0
  192. package/dist/tests/units/entities/reviewContext/reviewContextResult.guard.test.js +7 -3
  193. package/dist/tests/units/entities/reviewContext/reviewContextResult.guard.test.js.map +1 -1
  194. package/dist/tests/units/entities/reviewContext/reviewContextResult.schema.test.js +12 -1
  195. package/dist/tests/units/entities/reviewContext/reviewContextResult.schema.test.js.map +1 -1
  196. package/dist/tests/units/interface-adapters/controllers/webhook/eventFilter.test.js +50 -1
  197. package/dist/tests/units/interface-adapters/controllers/webhook/eventFilter.test.js.map +1 -1
  198. package/dist/tests/units/interface-adapters/controllers/webhook/github.controller.test.js +63 -0
  199. package/dist/tests/units/interface-adapters/controllers/webhook/github.controller.test.js.map +1 -1
  200. package/dist/tests/units/interface-adapters/controllers/webhook/gitlab.controller.test.js +11 -0
  201. package/dist/tests/units/interface-adapters/controllers/webhook/gitlab.controller.test.js.map +1 -1
  202. package/dist/tests/units/interface-adapters/gateways/reviewContext.fileSystem.gateway.test.js +64 -4
  203. package/dist/tests/units/interface-adapters/gateways/reviewContext.fileSystem.gateway.test.js.map +1 -1
  204. package/dist/tests/units/modules/claude-invocation/interface-adapters/gateways/reviewReport.fileSystem.gateway.test.js +56 -0
  205. package/dist/tests/units/modules/claude-invocation/interface-adapters/gateways/reviewReport.fileSystem.gateway.test.js.map +1 -1
  206. package/dist/tests/units/modules/cli-configuration/interface-adapters/controllers/http/repositories.routes.test.js +1 -1
  207. package/dist/tests/units/modules/cli-configuration/interface-adapters/controllers/http/repositories.routes.test.js.map +1 -1
  208. package/dist/tests/units/modules/platform-integration/entities/github/githubIssueCommentEvent.guard.test.d.ts +2 -0
  209. package/dist/tests/units/modules/platform-integration/entities/github/githubIssueCommentEvent.guard.test.d.ts.map +1 -0
  210. package/dist/tests/units/modules/platform-integration/entities/github/githubIssueCommentEvent.guard.test.js +39 -0
  211. package/dist/tests/units/modules/platform-integration/entities/github/githubIssueCommentEvent.guard.test.js.map +1 -0
  212. package/dist/tests/units/modules/platform-integration/entities/github/githubPullRequestReviewEvent.guard.test.d.ts +2 -0
  213. package/dist/tests/units/modules/platform-integration/entities/github/githubPullRequestReviewEvent.guard.test.d.ts.map +1 -0
  214. package/dist/tests/units/modules/platform-integration/entities/github/githubPullRequestReviewEvent.guard.test.js +54 -0
  215. package/dist/tests/units/modules/platform-integration/entities/github/githubPullRequestReviewEvent.guard.test.js.map +1 -0
  216. package/dist/tests/units/modules/platform-integration/entities/gitlab/gitlabNoteEvent.guard.test.d.ts +2 -0
  217. package/dist/tests/units/modules/platform-integration/entities/gitlab/gitlabNoteEvent.guard.test.d.ts.map +1 -0
  218. package/dist/tests/units/modules/platform-integration/entities/gitlab/gitlabNoteEvent.guard.test.js +48 -0
  219. package/dist/tests/units/modules/platform-integration/entities/gitlab/gitlabNoteEvent.guard.test.js.map +1 -0
  220. package/dist/tests/units/modules/tracking/entities/bypassMarker/bypassMarker.test.d.ts +2 -0
  221. package/dist/tests/units/modules/tracking/entities/bypassMarker/bypassMarker.test.d.ts.map +1 -0
  222. package/dist/tests/units/modules/tracking/entities/bypassMarker/bypassMarker.test.js +29 -0
  223. package/dist/tests/units/modules/tracking/entities/bypassMarker/bypassMarker.test.js.map +1 -0
  224. package/dist/tests/units/modules/tracking/entities/qualityGate/qualityGate.test.d.ts +2 -0
  225. package/dist/tests/units/modules/tracking/entities/qualityGate/qualityGate.test.d.ts.map +1 -0
  226. package/dist/tests/units/modules/tracking/entities/qualityGate/qualityGate.test.js +52 -0
  227. package/dist/tests/units/modules/tracking/entities/qualityGate/qualityGate.test.js.map +1 -0
  228. package/dist/tests/units/modules/tracking/interface-adapters/controllers/http/mrTracking.routes.test.d.ts +2 -0
  229. package/dist/tests/units/modules/tracking/interface-adapters/controllers/http/mrTracking.routes.test.d.ts.map +1 -0
  230. package/dist/tests/units/modules/tracking/interface-adapters/controllers/http/mrTracking.routes.test.js +103 -0
  231. package/dist/tests/units/modules/tracking/interface-adapters/controllers/http/mrTracking.routes.test.js.map +1 -0
  232. package/dist/tests/units/modules/tracking/usecases/tracking/handlePlatformApproval.usecase.test.d.ts +2 -0
  233. package/dist/tests/units/modules/tracking/usecases/tracking/handlePlatformApproval.usecase.test.d.ts.map +1 -0
  234. package/dist/tests/units/modules/tracking/usecases/tracking/handlePlatformApproval.usecase.test.js +113 -0
  235. package/dist/tests/units/modules/tracking/usecases/tracking/handlePlatformApproval.usecase.test.js.map +1 -0
  236. package/dist/tests/units/modules/tracking/usecases/tracking/recordBypass.usecase.test.d.ts +2 -0
  237. package/dist/tests/units/modules/tracking/usecases/tracking/recordBypass.usecase.test.d.ts.map +1 -0
  238. package/dist/tests/units/modules/tracking/usecases/tracking/recordBypass.usecase.test.js +77 -0
  239. package/dist/tests/units/modules/tracking/usecases/tracking/recordBypass.usecase.test.js.map +1 -0
  240. package/dist/tests/units/modules/worktree-management/usecases/sweepStaleWorktrees.usecase.test.js +1 -0
  241. package/dist/tests/units/modules/worktree-management/usecases/sweepStaleWorktrees.usecase.test.js.map +1 -1
  242. package/dist/tests/units/services/reviewRecovery.service.test.d.ts +2 -0
  243. package/dist/tests/units/services/reviewRecovery.service.test.d.ts.map +1 -0
  244. package/dist/tests/units/services/reviewRecovery.service.test.js +49 -0
  245. package/dist/tests/units/services/reviewRecovery.service.test.js.map +1 -0
  246. package/dist/tests/units/services/runReviewRecovery.service.test.d.ts +2 -0
  247. package/dist/tests/units/services/runReviewRecovery.service.test.d.ts.map +1 -0
  248. package/dist/tests/units/services/runReviewRecovery.service.test.js +199 -0
  249. package/dist/tests/units/services/runReviewRecovery.service.test.js.map +1 -0
  250. package/dist/tests/units/usecases/tracking/recordReviewCompletion.usecase.test.js +71 -0
  251. package/dist/tests/units/usecases/tracking/recordReviewCompletion.usecase.test.js.map +1 -1
  252. package/dist/tests/units/usecases/tracking/transitionState.usecase.test.js +87 -4
  253. package/dist/tests/units/usecases/tracking/transitionState.usecase.test.js.map +1 -1
  254. package/package.json +1 -1
@@ -1,20 +1,62 @@
1
+
1
2
  * { margin: 0; padding: 0; box-sizing: border-box; }
2
3
 
3
4
  :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;
5
+ /* warm near-black backgrounds */
6
+ --bg-0: #0E0E10;
7
+ --bg-1: #141416;
8
+ --bg-2: #1A1A1D;
9
+ --bg-3: #212125;
10
+ --bg-4: #2A2A2F;
11
+ /* warm paper white inks */
12
+ --ink-0: #F4F2EE;
13
+ --ink-1: #C9C6BE;
14
+ --ink-2: #8A8780;
15
+ --ink-3: #5A5852;
16
+ --ink-4: #3A3935;
17
+ /* single sacred accent: amber-gold */
18
+ --accent: #F4A93D;
19
+ --accent-hover: #FFBC54;
20
+ --accent-active: #D8901F;
21
+ --accent-ghost: rgba(244, 169, 61, 0.10);
22
+ /* desaturated status set */
23
+ --success: #7BC47F;
24
+ --warning: #E0B341;
25
+ --danger: #D9656A;
26
+ --info: #7BA3C7;
27
+ /* typography */
28
+ --font-sans: 'Geist', system-ui, -apple-system, sans-serif;
29
+ --font-mono: 'JetBrains Mono', 'SF Mono', Menlo, monospace;
30
+ /* type scale */
31
+ --type-xs: 11px;
32
+ --type-sm: 12.5px;
33
+ --type-base: 14px;
34
+ --type-lg: 18px;
35
+ --type-xl: 28px;
36
+ /* spacing */
37
+ --space-1: 4px;
38
+ --space-2: 8px;
39
+ --space-3: 12px;
40
+ --space-4: 16px;
41
+ --space-5: 24px;
42
+ --space-6: 32px;
43
+ --space-7: 48px;
44
+
45
+ /* Legacy aliases — keeps existing selectors that reference --nsc-* working */
46
+ --nsc-bg-base: var(--bg-0);
47
+ --nsc-bg-elevated: var(--bg-1);
48
+ --nsc-bg-surface: var(--bg-2);
49
+ --nsc-bg-surface-strong: var(--bg-3);
50
+ --nsc-border-soft: var(--ink-4);
51
+ --nsc-border-strong: rgba(90, 88, 82, 0.5);
52
+ --nsc-text-primary: var(--ink-0);
53
+ --nsc-text-secondary: var(--ink-1);
54
+ --nsc-text-muted: var(--ink-2);
55
+ --nsc-focus: var(--accent);
56
+ --nsc-action: var(--accent-hover);
57
+ --nsc-warning: var(--warning);
58
+ --nsc-success: var(--success);
59
+ --nsc-danger: var(--danger);
18
60
  }
19
61
 
20
62
  /* Lucide icons base styling */
@@ -105,19 +147,40 @@
105
147
  }
106
148
 
107
149
  body {
108
- font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
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);
150
+ font-family: var(--font-sans);
151
+ background: var(--bg-0);
152
+ color: var(--ink-0);
113
153
  min-height: 100vh;
114
- padding: 1.5rem 0;
154
+ padding: 0;
155
+ -webkit-font-smoothing: antialiased;
156
+ -moz-osx-font-smoothing: grayscale;
115
157
  }
116
158
 
117
- .container { margin: 1rem; }
159
+ /* Top accent line */
160
+ body::before {
161
+ content: '';
162
+ position: fixed;
163
+ top: 0;
164
+ left: 0;
165
+ right: 0;
166
+ height: 2px;
167
+ background: linear-gradient(90deg, transparent 0%, var(--accent) 40%, var(--accent-hover) 70%, transparent 100%);
168
+ opacity: 0.6;
169
+ z-index: 9999;
170
+ }
171
+
172
+ /* Custom scrollbar */
173
+ ::-webkit-scrollbar { width: 6px; height: 6px; }
174
+ ::-webkit-scrollbar-track { background: transparent; }
175
+ ::-webkit-scrollbar-thumb { background: var(--ink-4); border-radius: 99px; }
176
+ ::-webkit-scrollbar-thumb:hover { background: var(--ink-3); }
177
+
178
+ ::selection { background: var(--accent-ghost); color: var(--ink-0); }
179
+
180
+ .container { margin: 0.75rem; }
118
181
 
119
182
  @media (min-width: 1024px) {
120
- .container { margin: 68px; }
183
+ .container { margin: 1.25rem 2rem; }
121
184
  }
122
185
 
123
186
  .dashboard-layout {
@@ -190,17 +253,64 @@ header {
190
253
  gap: 1rem;
191
254
  margin-bottom: 2rem;
192
255
  flex-wrap: wrap;
256
+ position: sticky;
257
+ top: 0;
258
+ z-index: 100;
259
+ padding: 0.75rem 0;
260
+ margin-top: -0.5rem;
261
+ backdrop-filter: blur(16px) saturate(140%);
262
+ -webkit-backdrop-filter: blur(16px) saturate(140%);
263
+ background: rgba(14, 14, 16, 0.85);
264
+ border-bottom: 1px solid var(--ink-4);
193
265
  }
194
266
 
195
267
  .logo {
196
- width: 48px; height: 48px;
197
- background: linear-gradient(145deg, #58c4ff 0%, #3c8cc4 100%);
198
- border-radius: 12px;
268
+ width: 44px; height: 44px;
199
269
  display: flex; align-items: center; justify-content: center;
200
- font-size: 24px;
270
+ position: relative;
271
+ flex-shrink: 0;
272
+ }
273
+
274
+ .logo svg {
275
+ width: 44px;
276
+ height: 44px;
277
+ overflow: visible;
278
+ }
279
+
280
+ .logo .logo-frame {
281
+ fill: none;
282
+ stroke: var(--accent);
283
+ stroke-width: 1.5;
284
+ opacity: 0.35;
201
285
  }
202
286
 
203
- h1 { font-size: 1.75rem; font-weight: 600; }
287
+ .logo .logo-line {
288
+ stroke: var(--ink-1);
289
+ stroke-width: 2;
290
+ stroke-linecap: round;
291
+ fill: none;
292
+ }
293
+
294
+ .logo .logo-line--accent { stroke: var(--accent); }
295
+
296
+ .logo .logo-check {
297
+ stroke: var(--success);
298
+ stroke-width: 2.5;
299
+ stroke-linecap: round;
300
+ stroke-linejoin: round;
301
+ fill: none;
302
+ }
303
+
304
+ .logo .logo-pulse {
305
+ fill: var(--accent);
306
+ filter: drop-shadow(0 0 4px var(--accent));
307
+ }
308
+
309
+ @media (prefers-reduced-motion: reduce) {
310
+ .logo .logo-pulse { animation: none !important; }
311
+ }
312
+
313
+ h1 { font-size: 1.75rem; font-weight: 700; letter-spacing: -0.025em; }
204
314
 
205
315
  .header-actions {
206
316
  display: flex;
@@ -223,11 +333,14 @@ h1 { font-size: 1.75rem; font-weight: 600; }
223
333
  }
224
334
 
225
335
  .btn-primary {
226
- background: rgba(96, 199, 255, 0.16);
227
- color: #9ce1ff;
228
- border: 1px solid rgba(96, 199, 255, 0.34);
336
+ background: var(--accent-ghost);
337
+ color: var(--accent);
338
+ border: 1px solid rgba(244, 169, 61, 0.34);
339
+ }
340
+ .btn-primary:hover {
341
+ background: rgba(244, 169, 61, 0.18);
342
+ border-color: var(--accent);
229
343
  }
230
- .btn-primary:hover { background: rgba(96, 199, 255, 0.25); }
231
344
 
232
345
  .btn-secondary {
233
346
  background: rgba(255, 255, 255, 0.03);
@@ -393,9 +506,9 @@ input:focus-visible,
393
506
  font-weight: 500;
394
507
  }
395
508
 
396
- .status-indicator.online { background: rgba(34, 197, 94, 0.2); color: #22c55e; }
397
- .status-indicator.offline { background: rgba(240, 127, 136, 0.2); color: var(--nsc-danger); }
398
- .status-indicator.connecting { background: rgba(122, 216, 255, 0.2); color: var(--nsc-focus); }
509
+ .status-indicator.online { background: rgba(123, 196, 127, 0.12); color: var(--success); border: 1px solid rgba(123, 196, 127, 0.2); }
510
+ .status-indicator.offline { background: rgba(217, 101, 106, 0.12); color: var(--danger); border: 1px solid rgba(217, 101, 106, 0.2); }
511
+ .status-indicator.connecting { background: var(--accent-ghost); color: var(--accent); border: 1px solid rgba(244, 169, 61, 0.2); }
399
512
 
400
513
  .status-dot {
401
514
  width: 8px; height: 8px;
@@ -414,12 +527,22 @@ input:focus-visible,
414
527
  }
415
528
 
416
529
  .card {
417
- background: linear-gradient(170deg, var(--nsc-bg-surface) 0%, #142034 100%);
418
- border: 1px solid var(--nsc-border-soft);
530
+ background: var(--bg-2);
531
+ border: none;
532
+ box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.04);
419
533
  border-radius: 12px;
420
534
  padding: 1.25rem;
421
535
  position: relative;
422
536
  overflow: hidden;
537
+ height: 92px;
538
+ display: flex;
539
+ flex-direction: column;
540
+ justify-content: space-between;
541
+ transition: background 120ms ease;
542
+ }
543
+
544
+ .card:hover {
545
+ background: var(--bg-3);
423
546
  }
424
547
 
425
548
  .card::before {
@@ -433,20 +556,39 @@ input:focus-visible,
433
556
  }
434
557
 
435
558
  .card-priority::before {
436
- background: linear-gradient(180deg, #7ad8ff 0%, rgba(122, 216, 255, 0.2) 100%);
559
+ background: var(--accent);
560
+ opacity: 0.7;
437
561
  }
438
562
 
439
- .card-label { font-size: 0.75rem; color: var(--nsc-text-secondary); margin-bottom: 0.5rem; }
440
- .card-value { font-size: 1.75rem; font-weight: 700; }
441
- .card-value.running { color: var(--nsc-focus); }
442
- .card-value.queued { color: #8ab7ff; }
563
+ .card-label {
564
+ font-size: var(--type-xs);
565
+ font-family: var(--font-mono);
566
+ color: var(--ink-2);
567
+ margin-bottom: 0.5rem;
568
+ text-transform: uppercase;
569
+ letter-spacing: 0.08em;
570
+ }
571
+
572
+ .card-label::before { content: '// '; opacity: 0.5; }
573
+
574
+ .card-value {
575
+ font-size: var(--type-xl);
576
+ font-weight: 500;
577
+ font-family: var(--font-mono);
578
+ font-variant-numeric: tabular-nums;
579
+ color: var(--ink-0);
580
+ line-height: 1;
581
+ }
582
+
583
+ .card-value.running { color: var(--accent); }
584
+ .card-value.queued { color: var(--ink-1); }
443
585
 
444
586
  .focus-strip {
445
587
  display: grid;
446
- grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
588
+ grid-template-columns: repeat(3, 1fr);
447
589
  gap: 0.75rem;
448
- margin-top: -0.75rem;
449
- margin-bottom: 1.5rem;
590
+ margin-top: 0;
591
+ margin-bottom: 1.25rem;
450
592
  }
451
593
 
452
594
  .focus-strip.compact .focus-meta {
@@ -459,14 +601,15 @@ input:focus-visible,
459
601
  }
460
602
 
461
603
  .focus-chip {
462
- background: linear-gradient(160deg, var(--nsc-bg-surface) 0%, var(--nsc-bg-surface-strong) 100%);
463
- border: 1px solid var(--nsc-border-soft);
464
- border-radius: 10px;
604
+ background: var(--bg-2);
605
+ border: 1px solid var(--ink-4);
606
+ border-radius: 8px;
465
607
  padding: 0.65rem 0.75rem;
466
608
  display: flex;
467
609
  justify-content: space-between;
468
610
  align-items: center;
469
611
  gap: 0.5rem;
612
+ transition: border-color 150ms ease;
470
613
  }
471
614
 
472
615
  .focus-copy {
@@ -476,26 +619,47 @@ input:focus-visible,
476
619
  }
477
620
 
478
621
  .focus-label {
479
- font-size: 0.72rem;
480
- color: var(--nsc-text-secondary);
622
+ font-size: var(--type-xs);
623
+ font-family: var(--font-mono);
624
+ color: var(--ink-2);
481
625
  text-transform: uppercase;
482
- letter-spacing: 0.05em;
626
+ letter-spacing: 0.08em;
483
627
  }
484
628
 
485
629
  .focus-meta {
486
- font-size: 0.68rem;
487
- color: var(--nsc-text-muted);
630
+ font-size: var(--type-xs);
631
+ color: var(--ink-3);
488
632
  }
489
633
 
490
634
  .focus-value {
491
- font-size: 1.05rem;
492
- font-weight: 700;
493
- color: var(--nsc-text-primary);
635
+ font-size: var(--type-xl);
636
+ font-weight: 500;
637
+ font-family: var(--font-mono);
638
+ font-variant-numeric: tabular-nums;
639
+ color: var(--ink-0);
640
+ line-height: 1;
641
+ }
642
+
643
+ /* Default state — quiet (count === 0) */
644
+ .focus-now .focus-value,
645
+ .focus-next .focus-value,
646
+ .focus-blocked .focus-value {
647
+ color: var(--ink-2);
494
648
  }
495
649
 
496
- .focus-now .focus-value { color: var(--nsc-focus); }
497
- .focus-next .focus-value { color: var(--nsc-warning); }
498
- .focus-blocked .focus-value { color: var(--nsc-danger); }
650
+ /* Active state count > 0 */
651
+ .focus-now[data-active="true"] .focus-value { color: var(--accent); }
652
+ .focus-next[data-active="true"] .focus-value { color: var(--accent); }
653
+ /* Critical state — blocked > 0 */
654
+ .focus-blocked[data-active="critical"] .focus-value { color: var(--danger); }
655
+
656
+ .focus-now { border-color: rgba(244, 169, 61, 0.15); }
657
+ .focus-next { border-color: rgba(224, 179, 65, 0.12); }
658
+ .focus-blocked { border-color: rgba(217, 101, 106, 0.12); }
659
+
660
+ .focus-now[data-active="true"] { border-color: rgba(244, 169, 61, 0.35); }
661
+ .focus-next[data-active="true"] { border-color: rgba(224, 179, 65, 0.28); }
662
+ .focus-blocked[data-active="critical"] { border-color: rgba(217, 101, 106, 0.3); }
499
663
 
500
664
  .focus-toggle-btn {
501
665
  background: rgba(255, 255, 255, 0.03);
@@ -546,17 +710,34 @@ input:focus-visible,
546
710
  .card-claude.checking .status { color: #f59e0b; }
547
711
 
548
712
  .section {
549
- background: linear-gradient(175deg, var(--nsc-bg-elevated) 0%, #101b2d 100%);
550
- border: 1px solid var(--nsc-border-soft);
713
+ background: var(--bg-1);
714
+ border: 1px solid var(--ink-4);
551
715
  border-radius: 12px;
552
716
  margin-bottom: 1.5rem;
553
717
  overflow: hidden;
718
+ position: relative;
719
+ }
720
+
721
+ .section[data-attention="true"]::before {
722
+ content: '';
723
+ position: absolute;
724
+ left: 0;
725
+ top: 0;
726
+ bottom: 0;
727
+ width: 2px;
728
+ background: var(--accent);
729
+ z-index: 1;
554
730
  }
555
731
 
556
732
  .section-header {
557
733
  padding: 1rem 1.5rem;
558
- border-bottom: 1px solid var(--nsc-border-soft);
734
+ border-bottom: 1px solid var(--ink-4);
559
735
  font-weight: 600;
736
+ font-family: var(--font-mono);
737
+ font-size: var(--type-sm);
738
+ letter-spacing: 0.05em;
739
+ text-transform: uppercase;
740
+ color: var(--ink-1);
560
741
  display: flex;
561
742
  align-items: center;
562
743
  gap: 0.5rem;
@@ -574,10 +755,14 @@ input:focus-visible,
574
755
  }
575
756
 
576
757
  .section-header .badge-count {
577
- background: rgba(240, 127, 136, 0.16);
578
- color: #ff9ea5;
758
+ background: rgba(217, 101, 106, 0.12);
759
+ color: var(--danger);
579
760
  padding: 0.125rem 0.5rem;
580
761
  border-radius: 9999px;
762
+ font-family: var(--font-mono);
763
+ font-size: var(--type-xs);
764
+ font-variant-numeric: tabular-nums;
765
+ font-weight: 500;
581
766
  }
582
767
 
583
768
  .section-header .btn-sync {
@@ -2283,324 +2468,95 @@ body.compact-density .quality-trend {
2283
2468
  }
2284
2469
  }
2285
2470
 
2286
- /* =====================================================
2287
- DESIGN UPGRADE — Premium polish layer
2288
- Applied on top of base styles for visual refinement.
2289
- ===================================================== */
2290
-
2291
- /* Font smoothing + better background */
2292
- body {
2293
- -webkit-font-smoothing: antialiased;
2294
- -moz-osx-font-smoothing: grayscale;
2295
- background:
2296
- radial-gradient(ellipse 1400px 900px at 8% -12%, rgba(30, 58, 110, 0.55) 0%, transparent 55%),
2297
- radial-gradient(ellipse 600px 500px at 92% 105%, rgba(40, 20, 80, 0.25) 0%, transparent 50%),
2298
- linear-gradient(155deg, #080e1a 0%, #0b1220 40%, #0d1528 100%);
2299
- }
2300
-
2301
- /* Top accent gradient line */
2302
- body::before {
2303
- content: '';
2304
- position: fixed;
2305
- top: 0;
2306
- left: 0;
2307
- right: 0;
2308
- height: 2px;
2309
- background: linear-gradient(90deg,
2310
- transparent 0%,
2311
- rgba(96, 199, 255, 0.4) 20%,
2312
- rgba(98, 211, 168, 0.4) 50%,
2313
- rgba(244, 188, 113, 0.3) 80%,
2314
- transparent 100%
2315
- );
2316
- z-index: 9999;
2317
- }
2318
-
2319
- /* Custom scrollbar */
2320
- ::-webkit-scrollbar { width: 6px; height: 6px; }
2321
- ::-webkit-scrollbar-track { background: transparent; }
2322
- ::-webkit-scrollbar-thumb { background: rgba(130, 160, 200, 0.18); border-radius: 99px; }
2323
- ::-webkit-scrollbar-thumb:hover { background: rgba(130, 160, 200, 0.3); }
2324
-
2325
- /* Text selection */
2326
- ::selection {
2327
- background: rgba(96, 199, 255, 0.25);
2328
- color: #fff;
2329
- }
2330
-
2331
- /* --- Header --- */
2332
- header {
2333
- position: sticky;
2334
- top: 0;
2335
- z-index: 100;
2336
- padding: 0.75rem 0;
2337
- margin: -0.5rem 0 1.5rem;
2338
- backdrop-filter: blur(16px) saturate(140%);
2339
- -webkit-backdrop-filter: blur(16px) saturate(140%);
2340
- background: rgba(11, 18, 32, 0.72);
2341
- border-bottom: 1px solid rgba(130, 170, 220, 0.08);
2342
- }
2343
-
2344
- h1 {
2345
- font-weight: 700;
2346
- letter-spacing: -0.025em;
2347
- font-size: 1.6rem;
2348
- }
2349
-
2350
- .logo {
2351
- background: linear-gradient(145deg, #5ec8ff 0%, #3b8fd4 50%, #2a6db0 100%);
2352
- box-shadow: 0 2px 12px rgba(90, 190, 255, 0.25), inset 0 1px 0 rgba(255, 255, 255, 0.15);
2353
- border-radius: 14px;
2354
- }
2355
-
2356
- .version-label {
2357
- font-family: 'SF Mono', 'Fira Code', 'Cascadia Code', monospace;
2358
- font-size: 0.7rem;
2359
- letter-spacing: 0.02em;
2360
- background: rgba(122, 216, 255, 0.06);
2361
- border-color: rgba(122, 216, 255, 0.15);
2362
- color: rgba(122, 216, 255, 0.7);
2363
- }
2364
-
2365
- .status-indicator {
2366
- font-size: 0.8rem;
2367
- padding: 0.4rem 0.85rem;
2368
- backdrop-filter: blur(8px);
2369
- }
2370
- .status-indicator.online {
2371
- background: rgba(34, 197, 94, 0.12);
2372
- border: 1px solid rgba(34, 197, 94, 0.2);
2373
- }
2374
-
2375
- /* --- Cards --- */
2376
- .card {
2377
- background: linear-gradient(170deg, rgba(22, 34, 53, 0.85) 0%, rgba(14, 23, 40, 0.95) 100%);
2378
- backdrop-filter: blur(12px);
2379
- border: 1px solid rgba(130, 170, 220, 0.1);
2380
- border-radius: 14px;
2381
- box-shadow: 0 1px 3px rgba(0, 0, 0, 0.12), 0 4px 12px rgba(0, 0, 0, 0.06);
2382
- transition: border-color 0.3s, box-shadow 0.3s, transform 0.2s;
2383
- }
2384
- .card:hover {
2385
- border-color: rgba(130, 170, 220, 0.18);
2386
- box-shadow: 0 2px 8px rgba(0, 0, 0, 0.2), 0 8px 24px rgba(0, 0, 0, 0.1);
2387
- transform: translateY(-1px);
2388
- }
2389
-
2390
- .card-priority::before {
2391
- width: 3px;
2392
- background: linear-gradient(180deg, rgba(122, 216, 255, 0.8) 0%, rgba(122, 216, 255, 0.1) 100%);
2393
- }
2394
-
2395
- .card-value {
2396
- font-weight: 800;
2397
- letter-spacing: -0.02em;
2398
- }
2399
-
2400
- /* --- Sections --- */
2401
- .section {
2402
- background: linear-gradient(178deg, rgba(17, 26, 43, 0.9) 0%, rgba(12, 20, 35, 0.95) 100%);
2403
- backdrop-filter: blur(8px);
2404
- border: 1px solid rgba(130, 170, 220, 0.08);
2405
- border-radius: 14px;
2406
- box-shadow: 0 1px 2px rgba(0, 0, 0, 0.08), 0 4px 16px rgba(0, 0, 0, 0.04);
2407
- }
2408
-
2409
- .section-header {
2410
- font-weight: 700;
2411
- letter-spacing: -0.01em;
2412
- font-size: 0.95rem;
2413
- padding: 1rem 1.25rem;
2414
- }
2415
- .section-header.clickable:hover {
2416
- background: rgba(122, 216, 255, 0.03);
2417
- }
2418
- .section-header .badge-count {
2419
- background: rgba(240, 127, 136, 0.1);
2420
- border: 1px solid rgba(240, 127, 136, 0.15);
2421
- font-size: 0.72rem;
2422
- font-weight: 700;
2423
- }
2424
-
2425
- /* --- Buttons --- */
2426
- .btn {
2427
- border-radius: 10px;
2428
- font-weight: 600;
2429
- letter-spacing: 0.01em;
2430
- transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);
2431
- }
2432
- .btn:active { transform: scale(0.97); }
2433
-
2434
- .btn-primary {
2435
- background: rgba(96, 199, 255, 0.12);
2436
- border: 1px solid rgba(96, 199, 255, 0.22);
2437
- }
2438
- .btn-primary:hover {
2439
- background: rgba(96, 199, 255, 0.2);
2440
- box-shadow: 0 0 16px rgba(96, 199, 255, 0.08);
2441
- }
2442
-
2443
- .btn-action {
2444
- border-radius: 6px;
2445
- font-weight: 600;
2446
- transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);
2447
- }
2448
- .btn-action:active { transform: scale(0.96); }
2449
-
2450
- /* --- Focus strip --- */
2451
- .focus-chip {
2452
- backdrop-filter: blur(8px);
2453
- border-radius: 12px;
2454
- transition: border-color 0.2s, box-shadow 0.2s;
2455
- }
2456
- .focus-now { border-color: rgba(122, 216, 255, 0.2); }
2457
- .focus-now:hover { box-shadow: 0 0 20px rgba(122, 216, 255, 0.06); }
2458
- .focus-next { border-color: rgba(244, 188, 113, 0.2); }
2459
- .focus-next:hover { box-shadow: 0 0 20px rgba(244, 188, 113, 0.06); }
2460
- .focus-blocked { border-color: rgba(240, 127, 136, 0.2); }
2461
- .focus-blocked:hover { box-shadow: 0 0 20px rgba(240, 127, 136, 0.06); }
2462
-
2463
- /* --- MR items --- */
2471
+ /* --- MR items upgrade --- */
2464
2472
  .mr-item-accordion {
2465
- border: 1px solid rgba(130, 170, 220, 0.08);
2473
+ border: 1px solid var(--ink-4);
2466
2474
  border-left: 2px solid transparent;
2467
- border-radius: 12px;
2468
- background: linear-gradient(180deg, rgba(13, 23, 42, 0.7) 0%, rgba(10, 19, 36, 0.85) 100%);
2469
- backdrop-filter: blur(6px);
2470
- transition: border-color 0.2s, box-shadow 0.2s, border-left-color 0.2s;
2475
+ border-radius: 10px;
2476
+ background: var(--bg-2);
2477
+ transition: border-color 0.2s, border-left-color 0.2s;
2471
2478
  }
2472
2479
  .mr-item-accordion:hover {
2473
- border-color: rgba(130, 170, 220, 0.14);
2474
- border-left-color: rgba(122, 216, 255, 0.3);
2480
+ border-color: var(--ink-3);
2481
+ border-left-color: var(--accent);
2475
2482
  }
2476
2483
  .mr-item-header:hover {
2477
- background: rgba(122, 216, 255, 0.02);
2484
+ background: var(--bg-3);
2485
+ }
2486
+
2487
+ /* Active review card — live radial wash */
2488
+ .mr-item-accordion.is-running {
2489
+ border: 1px solid var(--accent);
2490
+ background: radial-gradient(circle at top left, var(--accent-ghost), transparent 60%), var(--bg-2);
2478
2491
  }
2479
2492
 
2480
2493
  /* Review status glow */
2481
- .review-status.running { box-shadow: 0 0 8px rgba(245, 158, 11, 0.5); }
2482
- .review-status.completed { box-shadow: 0 0 6px rgba(34, 197, 94, 0.4); }
2483
- .review-status.failed { box-shadow: 0 0 6px rgba(239, 68, 68, 0.4); }
2494
+ .review-status.running { box-shadow: 0 0 8px rgba(244, 169, 61, 0.45); }
2495
+ .review-status.completed { box-shadow: 0 0 6px rgba(123, 196, 127, 0.4); }
2496
+ .review-status.failed { box-shadow: 0 0 6px rgba(217, 101, 106, 0.4); }
2484
2497
 
2485
2498
  /* Avatars */
2486
2499
  .mr-avatar, .review-avatar {
2487
- box-shadow: 0 2px 8px rgba(0, 0, 0, 0.25), 0 0 0 1px rgba(255, 255, 255, 0.04);
2488
- border: 2px solid rgba(255, 255, 255, 0.08);
2500
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.25);
2501
+ border: 2px solid var(--ink-4);
2489
2502
  }
2490
2503
 
2491
- /* Stat badges */
2492
- .stat-badge {
2493
- border-radius: 6px;
2494
- font-weight: 700;
2495
- letter-spacing: 0.01em;
2496
- backdrop-filter: blur(4px);
2497
- }
2498
-
2499
- /* --- Queue lanes --- */
2500
- .queue-lane-header {
2501
- background: rgba(255, 255, 255, 0.015);
2502
- border-bottom: 1px solid rgba(130, 170, 220, 0.06);
2503
- }
2504
- .queue-lane-title {
2505
- font-size: 0.7rem;
2506
- font-weight: 800;
2507
- letter-spacing: 0.06em;
2508
- color: var(--nsc-text-secondary);
2509
- }
2510
- .queue-lane-count {
2511
- background: rgba(122, 216, 255, 0.08);
2512
- border-color: rgba(122, 216, 255, 0.15);
2513
- color: var(--nsc-focus);
2514
- }
2515
- .queue-lane {
2516
- border-radius: 12px;
2517
- backdrop-filter: blur(6px);
2518
- }
2519
-
2520
- /* --- Now lane --- */
2504
+ /* Now lane */
2521
2505
  .now-lane {
2522
- background: linear-gradient(165deg, rgba(96, 199, 255, 0.08) 0%, rgba(122, 216, 255, 0.03) 100%);
2523
- backdrop-filter: blur(8px);
2524
- border: 1px solid rgba(96, 199, 255, 0.18);
2525
- border-left: 3px solid rgba(96, 199, 255, 0.5);
2526
- border-radius: 14px;
2527
- box-shadow: 0 0 24px rgba(96, 199, 255, 0.04);
2528
- }
2529
- .now-lane-kicker {
2530
- font-size: 0.64rem;
2531
- letter-spacing: 0.06em;
2532
- }
2533
- .now-lane-quality {
2534
- background: rgba(0, 0, 0, 0.15);
2535
- border-color: rgba(130, 170, 220, 0.1);
2536
- border-radius: 10px;
2537
- backdrop-filter: blur(4px);
2538
- }
2539
-
2540
- /* --- Stat cards --- */
2541
- .stat-card {
2506
+ background: radial-gradient(circle at top left, var(--accent-ghost), transparent 60%), var(--bg-2);
2507
+ border: 1px solid rgba(244, 169, 61, 0.25);
2508
+ border-left: 3px solid var(--accent);
2542
2509
  border-radius: 12px;
2543
- backdrop-filter: blur(8px);
2544
- transition: all 0.25s cubic-bezier(0.4, 0, 0.2, 1);
2545
- }
2546
- .stat-card:hover {
2547
- transform: translateY(-2px);
2548
- box-shadow: 0 4px 20px rgba(0, 0, 0, 0.15);
2549
2510
  }
2550
2511
 
2551
- /* --- Progress bar --- */
2552
- .progress-bar {
2553
- background: rgba(255, 255, 255, 0.06);
2554
- height: 5px;
2555
- }
2556
- .progress-bar-fill {
2557
- background: linear-gradient(90deg, #60c7ff 0%, #62d3a8 100%);
2558
- box-shadow: 0 0 8px rgba(96, 199, 255, 0.3);
2512
+ /* Section header clickable hover */
2513
+ .section-header.clickable:hover {
2514
+ background: var(--bg-2);
2559
2515
  }
2560
2516
 
2561
- /* --- Toasts --- */
2517
+ /* Toasts */
2562
2518
  .toast {
2563
2519
  backdrop-filter: blur(16px) saturate(140%);
2564
- border-radius: 12px;
2520
+ border-radius: 10px;
2565
2521
  font-weight: 600;
2566
- box-shadow: 0 4px 24px rgba(0, 0, 0, 0.3), 0 0 0 1px rgba(255, 255, 255, 0.04);
2522
+ box-shadow: 0 4px 24px rgba(0, 0, 0, 0.3);
2567
2523
  }
2568
2524
  .toast.success {
2569
- background: rgba(34, 197, 94, 0.14);
2570
- border: 1px solid rgba(34, 197, 94, 0.25);
2525
+ background: rgba(123, 196, 127, 0.12);
2526
+ border: 1px solid rgba(123, 196, 127, 0.25);
2571
2527
  }
2572
2528
  .toast.error {
2573
- background: rgba(239, 68, 68, 0.14);
2574
- border: 1px solid rgba(239, 68, 68, 0.25);
2529
+ background: rgba(217, 101, 106, 0.12);
2530
+ border: 1px solid rgba(217, 101, 106, 0.25);
2575
2531
  }
2576
2532
  .toast.info {
2577
- background: rgba(59, 130, 246, 0.14);
2578
- border: 1px solid rgba(59, 130, 246, 0.25);
2533
+ background: var(--accent-ghost);
2534
+ border: 1px solid rgba(244, 169, 61, 0.2);
2579
2535
  }
2580
2536
 
2581
- /* --- Modal --- */
2537
+ /* Modal */
2582
2538
  .modal-overlay {
2583
2539
  backdrop-filter: blur(6px);
2584
- background: rgba(0, 0, 0, 0.5);
2540
+ background: rgba(0, 0, 0, 0.6);
2585
2541
  }
2586
2542
  .modal-content {
2587
- background: rgba(22, 34, 53, 0.95);
2588
- backdrop-filter: blur(20px);
2589
- border: 1px solid rgba(130, 170, 220, 0.12);
2590
- border-radius: 16px;
2591
- box-shadow: 0 8px 40px rgba(0, 0, 0, 0.4), 0 0 0 1px rgba(255, 255, 255, 0.03);
2543
+ background: var(--bg-2);
2544
+ border: 1px solid var(--ink-4);
2545
+ border-radius: 14px;
2546
+ box-shadow: 0 8px 40px rgba(0, 0, 0, 0.4);
2592
2547
  }
2593
2548
 
2594
- /* --- Inputs / Selects --- */
2549
+ /* Inputs / Selects */
2595
2550
  .project-input, .model-select, .token-input {
2596
- border-radius: 10px;
2597
- background: rgba(0, 0, 0, 0.25);
2598
- border: 1px solid rgba(130, 170, 220, 0.1);
2551
+ border-radius: 8px;
2552
+ background: var(--bg-3);
2553
+ border: 1px solid var(--ink-4);
2554
+ color: var(--ink-0);
2599
2555
  transition: border-color 0.2s, box-shadow 0.2s;
2600
2556
  }
2601
2557
  .project-input:focus, .model-select:focus, .token-input:focus {
2602
- border-color: rgba(96, 199, 255, 0.4);
2603
- box-shadow: 0 0 0 3px rgba(96, 199, 255, 0.08);
2558
+ border-color: var(--accent);
2559
+ box-shadow: 0 0 0 3px var(--accent-ghost);
2604
2560
  outline: none;
2605
2561
  }
2606
2562
 
@@ -2610,56 +2566,64 @@ a:focus-visible,
2610
2566
  select:focus-visible,
2611
2567
  input:focus-visible,
2612
2568
  [role='button']:focus-visible {
2613
- outline: 2px solid rgba(122, 216, 255, 0.6);
2569
+ outline: 2px solid var(--accent);
2614
2570
  outline-offset: 2px;
2615
- box-shadow: 0 0 0 4px rgba(122, 216, 255, 0.1);
2571
+ box-shadow: 0 0 0 4px var(--accent-ghost);
2616
2572
  }
2617
2573
 
2618
- /* --- Empty states --- */
2574
+ /* Empty states */
2619
2575
  .empty-state {
2620
- color: rgba(130, 155, 190, 0.5);
2621
- font-style: italic;
2576
+ color: var(--ink-3);
2622
2577
  font-size: 0.85rem;
2578
+ font-family: var(--font-mono);
2579
+ padding: 1rem;
2623
2580
  }
2624
2581
 
2625
- /* --- Config info --- */
2582
+ /* Config info */
2626
2583
  .config-info {
2627
2584
  border-radius: 10px;
2628
- backdrop-filter: blur(4px);
2629
2585
  }
2630
2586
  .config-status.success {
2631
2587
  border-radius: 99px;
2632
2588
  font-weight: 600;
2633
2589
  }
2634
2590
 
2635
- /* --- Data loading --- */
2591
+ /* Data loading */
2636
2592
  .data-loading {
2637
- backdrop-filter: blur(4px);
2638
- border-color: rgba(122, 216, 255, 0.12);
2639
- color: rgba(122, 216, 255, 0.7);
2593
+ border-color: rgba(244, 169, 61, 0.2);
2594
+ color: var(--accent);
2640
2595
  }
2641
2596
 
2642
- /* --- Logs --- */
2597
+ /* Logs */
2643
2598
  .log-entry {
2644
- font-family: 'SF Mono', 'Fira Code', 'Cascadia Code', 'Monaco', monospace;
2599
+ font-family: var(--font-mono);
2645
2600
  font-size: 0.72rem;
2646
- border-bottom-color: rgba(130, 170, 220, 0.05);
2647
- border-radius: 6px;
2601
+ border-bottom-color: var(--ink-4);
2602
+ border-radius: 4px;
2648
2603
  margin-bottom: 1px;
2649
2604
  transition: background 0.15s;
2650
2605
  }
2651
2606
  .log-entry:hover {
2652
- background: rgba(255, 255, 255, 0.02);
2607
+ background: var(--bg-3);
2653
2608
  }
2654
2609
 
2655
- /* --- Markdown --- */
2610
+ /* Markdown */
2656
2611
  .markdown-content {
2657
- background: rgba(0, 0, 0, 0.15);
2658
- border: 1px solid rgba(130, 170, 220, 0.06);
2659
- border-radius: 12px;
2612
+ background: var(--bg-3);
2613
+ border: 1px solid var(--ink-4);
2614
+ border-radius: 10px;
2615
+ }
2616
+
2617
+ /* Progress bar */
2618
+ .progress-bar {
2619
+ background: var(--ink-4);
2620
+ height: 4px;
2621
+ }
2622
+ .progress-bar-fill {
2623
+ background: var(--accent);
2660
2624
  }
2661
2625
 
2662
- /* --- Collapsible list toggle --- */
2626
+ /* Collapsible list toggle */
2663
2627
  .collapsible-toggle {
2664
2628
  display: flex;
2665
2629
  align-items: center;
@@ -2669,9 +2633,9 @@ input:focus-visible,
2669
2633
  padding: 0.6rem 0;
2670
2634
  margin-top: 0.25rem;
2671
2635
  background: transparent;
2672
- border: 1px dashed rgba(130, 170, 220, 0.12);
2673
- border-radius: 10px;
2674
- color: var(--nsc-text-muted);
2636
+ border: 1px dashed var(--ink-4);
2637
+ border-radius: 8px;
2638
+ color: var(--ink-2);
2675
2639
  font-size: 0.78rem;
2676
2640
  font-weight: 600;
2677
2641
  cursor: pointer;
@@ -4905,7 +4869,7 @@ body.overview-tab-active .dashboard-main > *:not(#overview-section) {
4905
4869
  align-items: center;
4906
4870
  justify-content: space-between;
4907
4871
  gap: 0.5rem;
4908
- width: 100%;
4872
+ width: auto;
4909
4873
  padding: 0.4rem 0.6rem;
4910
4874
  margin-bottom: 0.35rem;
4911
4875
  background: transparent;
@@ -4956,11 +4920,14 @@ body.overview-tab-active .dashboard-main > *:not(#overview-section) {
4956
4920
  #manage-panel .manage-panel-inner {
4957
4921
  display: flex;
4958
4922
  flex-direction: column;
4959
- gap: 0.5rem;
4960
- padding: 0.5rem;
4961
- border: 1px solid rgba(251, 191, 36, 0.15);
4962
- border-radius: 4px;
4963
- background: rgba(20, 17, 14, 0.6);
4923
+ gap: 0.6rem;
4924
+ padding: 0.75rem;
4925
+ border: 1px solid rgba(251, 191, 36, 0.35);
4926
+ border-radius: 6px;
4927
+ background: var(--bg-3);
4928
+ box-shadow: 0 12px 36px rgba(0, 0, 0, 0.55), 0 0 0 1px rgba(0, 0, 0, 0.3);
4929
+ max-width: min(480px, 90vw);
4930
+ width: 100%;
4964
4931
  }
4965
4932
 
4966
4933
  #manage-panel .manage-rows {
@@ -5250,8 +5217,12 @@ body.overview-tab-active .dashboard-main > *:not(#overview-section) {
5250
5217
  }
5251
5218
 
5252
5219
  .project-bar > #manage-panel {
5253
- flex: 0 0 auto;
5254
- min-width: 0;
5220
+ position: absolute;
5221
+ top: 100%;
5222
+ left: 0;
5223
+ z-index: 20;
5224
+ width: min(480px, 90vw);
5225
+ margin-top: 0.25rem;
5255
5226
  }
5256
5227
 
5257
5228
  .project-bar > #dashboard-tabs {
@@ -5509,3 +5480,391 @@ body.overview-tab-active .dashboard-main > *:not(#overview-section) {
5509
5480
  transition: none !important;
5510
5481
  }
5511
5482
  }
5483
+
5484
+ /* ============================================================
5485
+ OPERATOR'S CONSOLE — Amber redesign additions
5486
+ ============================================================ */
5487
+
5488
+ /* Tabular numerals for all number-displaying elements */
5489
+ #running-count,
5490
+ #queued-count,
5491
+ #completed-count,
5492
+ .focus-value,
5493
+ .badge-count,
5494
+ .card-value,
5495
+ .focus-now-count,
5496
+ .focus-next-count,
5497
+ .focus-blocked-count {
5498
+ font-variant-numeric: tabular-nums;
5499
+ font-family: var(--font-mono);
5500
+ font-weight: 500;
5501
+ }
5502
+
5503
+ /* Heartbeat empty state container */
5504
+ .heartbeat-empty-state {
5505
+ display: flex;
5506
+ flex-direction: column;
5507
+ align-items: center;
5508
+ gap: 1rem;
5509
+ padding: 2rem 1rem;
5510
+ text-align: center;
5511
+ }
5512
+
5513
+ .heartbeat-label {
5514
+ font-family: var(--font-mono);
5515
+ font-size: var(--type-xs);
5516
+ color: var(--ink-2);
5517
+ letter-spacing: 0.12em;
5518
+ text-transform: uppercase;
5519
+ }
5520
+
5521
+ .heartbeat-message {
5522
+ font-family: var(--font-sans);
5523
+ font-size: var(--type-sm);
5524
+ color: var(--ink-1);
5525
+ }
5526
+
5527
+ .heartbeat-line-container {
5528
+ width: 240px;
5529
+ height: 1px;
5530
+ background: var(--ink-4);
5531
+ position: relative;
5532
+ overflow: hidden;
5533
+ }
5534
+
5535
+ @media (prefers-reduced-motion: reduce) {
5536
+ .heartbeat-line-container {
5537
+ background: linear-gradient(90deg, transparent 0%, var(--accent) 50%, transparent 100%);
5538
+ opacity: 0.4;
5539
+ }
5540
+ }
5541
+
5542
+ /* Sidebar layout reset for slimmer profile */
5543
+ .dashboard-sidebar {
5544
+ display: flex;
5545
+ flex-direction: column;
5546
+ gap: 0.75rem;
5547
+ }
5548
+
5549
+ /* Attention strip (focus-strip moved to main) */
5550
+ .attention-strip {
5551
+ display: flex;
5552
+ flex-wrap: wrap;
5553
+ gap: 0.75rem;
5554
+ margin-bottom: 1.25rem;
5555
+ }
5556
+
5557
+ /* Tabs type-only upgrade */
5558
+ .dashboard-tab-bar-wrapper .dashboard-tab {
5559
+ position: relative;
5560
+ }
5561
+
5562
+ /* Shared tab underline element (injected via JS) */
5563
+ .tab-underline-indicator {
5564
+ position: absolute;
5565
+ bottom: -1px;
5566
+ height: 2px;
5567
+ background: var(--accent);
5568
+ pointer-events: none;
5569
+ opacity: 0;
5570
+ transition: none;
5571
+ }
5572
+
5573
+ /* Version label with mono font */
5574
+ .version-label {
5575
+ font-family: var(--font-mono);
5576
+ font-size: var(--type-xs);
5577
+ color: var(--ink-2);
5578
+ background: var(--bg-3);
5579
+ border: 1px solid var(--ink-4);
5580
+ border-radius: 4px;
5581
+ padding: 0.2rem 0.5rem;
5582
+ letter-spacing: 0.04em;
5583
+ }
5584
+
5585
+ /* Context bar chips (toolchain) */
5586
+ .context-bar {
5587
+ display: flex;
5588
+ flex-wrap: wrap;
5589
+ gap: 0.5rem;
5590
+ align-items: center;
5591
+ margin-bottom: 0.75rem;
5592
+ padding: 0.4rem 0;
5593
+ border-bottom: 1px solid var(--ink-4);
5594
+ }
5595
+
5596
+ .context-chip {
5597
+ display: inline-flex;
5598
+ align-items: center;
5599
+ gap: 0.3rem;
5600
+ padding: 0.2rem 0.55rem;
5601
+ background: var(--bg-3);
5602
+ border: 1px solid var(--ink-4);
5603
+ border-radius: 99px;
5604
+ font-family: var(--font-mono);
5605
+ font-size: var(--type-xs);
5606
+ color: var(--ink-2);
5607
+ letter-spacing: 0.04em;
5608
+ }
5609
+
5610
+ .context-chip .status-dot {
5611
+ width: 6px;
5612
+ height: 6px;
5613
+ }
5614
+
5615
+ /* Scope marker — minimal single-line, no separator block decoration */
5616
+ .cards-scope-marker {
5617
+ font-size: 13px;
5618
+ color: var(--ink-3);
5619
+ font-family: var(--font-mono);
5620
+ letter-spacing: 0.08em;
5621
+ text-transform: uppercase;
5622
+ opacity: 1;
5623
+ padding: 0;
5624
+ margin: 0 0 0.5rem 0;
5625
+ border: none;
5626
+ background: none;
5627
+ display: flex;
5628
+ gap: 0.4rem;
5629
+ align-items: baseline;
5630
+ }
5631
+
5632
+ .cards-scope-marker .cards-scope-prefix {
5633
+ color: var(--ink-3);
5634
+ opacity: 0.6;
5635
+ }
5636
+
5637
+ .cards-scope-marker .cards-scope-label {
5638
+ color: var(--ink-3);
5639
+ font-weight: 500;
5640
+ }
5641
+
5642
+ /* Version update button with amber accent */
5643
+ .btn-update {
5644
+ background: var(--accent);
5645
+ color: var(--bg-0);
5646
+ border: none;
5647
+ }
5648
+ .btn-update:hover { background: var(--accent-hover); }
5649
+
5650
+ /* Queue lane count with amber */
5651
+ .queue-lane-count {
5652
+ background: var(--accent-ghost);
5653
+ border-color: rgba(244, 169, 61, 0.25);
5654
+ color: var(--accent);
5655
+ font-family: var(--font-mono);
5656
+ font-variant-numeric: tabular-nums;
5657
+ }
5658
+
5659
+ /* Collapsible toggle hover */
5660
+ .collapsible-toggle:hover {
5661
+ background: var(--bg-3);
5662
+ border-color: var(--ink-3);
5663
+ color: var(--ink-1);
5664
+ }
5665
+ .collapsible-toggle:active { transform: scale(0.98); }
5666
+
5667
+ /* Stat badge with mono font */
5668
+ .stat-badge {
5669
+ font-family: var(--font-mono);
5670
+ font-variant-numeric: tabular-nums;
5671
+ font-weight: 500;
5672
+ border-radius: 4px;
5673
+ }
5674
+
5675
+ /* Team insights with token colors */
5676
+ .team-insights {
5677
+ background: var(--bg-2);
5678
+ border: 1px solid var(--ink-4);
5679
+ border-radius: 10px;
5680
+ padding: 1rem;
5681
+ }
5682
+
5683
+ /* AI section with amber accent */
5684
+ .ai-generate-btn {
5685
+ border-color: rgba(244, 169, 61, 0.35);
5686
+ background: var(--accent-ghost);
5687
+ color: var(--accent);
5688
+ }
5689
+ .ai-generate-btn:hover {
5690
+ background: rgba(244, 169, 61, 0.18);
5691
+ border-color: var(--accent);
5692
+ }
5693
+
5694
+ .ai-badge {
5695
+ background: var(--accent-ghost);
5696
+ border: 1px solid rgba(244, 169, 61, 0.35);
5697
+ color: var(--accent);
5698
+ }
5699
+
5700
+ .ai-team-card {
5701
+ background: var(--bg-2);
5702
+ border: 1px solid var(--ink-4);
5703
+ border-left: 3px solid var(--accent);
5704
+ border-radius: 10px;
5705
+ }
5706
+
5707
+ .ai-team-card-header {
5708
+ color: var(--accent);
5709
+ }
5710
+
5711
+ /* Sheet panels with new bg */
5712
+ .sheet-panel {
5713
+ background: var(--bg-1);
5714
+ border-left: 1px solid var(--ink-4);
5715
+ }
5716
+
5717
+ .sheet-stat-card {
5718
+ background: var(--bg-3);
5719
+ border: 1px solid var(--ink-4);
5720
+ }
5721
+
5722
+ /* Dev card with new bg */
5723
+ .dev-card {
5724
+ background: var(--bg-2);
5725
+ border: 1px solid var(--ink-4);
5726
+ }
5727
+ .dev-card:hover {
5728
+ border-color: var(--ink-2);
5729
+ }
5730
+
5731
+ /* Focus ring update */
5732
+ button:focus-visible,
5733
+ a:focus-visible,
5734
+ select:focus-visible,
5735
+ input:focus-visible,
5736
+ [role='button']:focus-visible {
5737
+ outline: 2px solid var(--accent);
5738
+ outline-offset: 2px;
5739
+ box-shadow: 0 0 0 4px var(--accent-ghost);
5740
+ }
5741
+
5742
+ @media (prefers-reduced-motion: reduce) {
5743
+ .status-dot {
5744
+ animation: none !important;
5745
+ }
5746
+ .heartbeat-line-container {
5747
+ overflow: visible;
5748
+ }
5749
+ .context-bar,
5750
+ .attention-strip,
5751
+ .context-chip {
5752
+ transition: none !important;
5753
+ animation: none !important;
5754
+ }
5755
+ .card {
5756
+ transition: none !important;
5757
+ }
5758
+ }
5759
+
5760
+ /* Logo SVG — life signal */
5761
+ @keyframes logo-pulse-breath {
5762
+ 0%, 100% { transform: scale(0.7); opacity: 0.35; }
5763
+ 50% { transform: scale(1.1); opacity: 1; }
5764
+ }
5765
+ @keyframes logo-check-glow {
5766
+ 0%, 90%, 100% { opacity: 0.6; }
5767
+ 93% { opacity: 1; filter: drop-shadow(0 0 3px var(--success)); }
5768
+ }
5769
+ @keyframes logo-flow-line {
5770
+ 0%, 100% { stroke-dashoffset: 0; opacity: 1; }
5771
+ 50% { stroke-dashoffset: -10; opacity: 0.6; }
5772
+ }
5773
+ .logo .logo-pulse {
5774
+ transform-origin: center;
5775
+ transform-box: fill-box;
5776
+ animation: logo-pulse-breath 2.8s ease-in-out infinite;
5777
+ }
5778
+ .logo .logo-check {
5779
+ animation: logo-check-glow 4.5s ease-in-out infinite;
5780
+ }
5781
+ .logo .logo-line--accent {
5782
+ stroke-dasharray: 12 4;
5783
+ animation: logo-flow-line 3.5s linear infinite;
5784
+ }
5785
+ @media (prefers-reduced-motion: reduce) {
5786
+ .logo .logo-pulse,
5787
+ .logo .logo-check,
5788
+ .logo .logo-line--accent {
5789
+ animation: none !important;
5790
+ }
5791
+ }
5792
+
5793
+ /* Task 6 — Toolchain chips: inline mono text, right-aligned in project-bar */
5794
+ /* Renamed from .context-chip to .toolchain-chip to avoid collision with the
5795
+ legacy .context-chip pill rule (line 5597). No !important needed. */
5796
+ .context-chips {
5797
+ flex: 0 0 auto;
5798
+ display: flex;
5799
+ gap: 1.75rem;
5800
+ align-items: center;
5801
+ margin-left: auto;
5802
+ padding: 0 0.25rem;
5803
+ height: 100%;
5804
+ }
5805
+ .context-chips .toolchain-chip {
5806
+ display: flex;
5807
+ flex-direction: row;
5808
+ align-items: center;
5809
+ gap: 0.5rem;
5810
+ font-family: var(--font-mono);
5811
+ font-size: 11px;
5812
+ white-space: nowrap;
5813
+ min-height: 28px;
5814
+ letter-spacing: 0.04em;
5815
+ }
5816
+ .context-chips .toolchain-chip-label {
5817
+ text-transform: uppercase;
5818
+ letter-spacing: 0.12em;
5819
+ color: var(--ink-2);
5820
+ font-size: 10px;
5821
+ font-weight: 500;
5822
+ }
5823
+ .context-chips .toolchain-chip .card-claude {
5824
+ display: inline-flex;
5825
+ align-items: center;
5826
+ gap: 6px;
5827
+ flex-direction: row;
5828
+ font-size: 12px;
5829
+ padding: 0;
5830
+ background: transparent;
5831
+ }
5832
+ .context-chips .toolchain-chip .card-claude .status { font-size: 12px; }
5833
+ .context-chips .toolchain-chip .card-claude .version {
5834
+ color: var(--ink-3);
5835
+ font-size: 10px;
5836
+ }
5837
+ .context-chips .toolchain-chip .card-claude.available,
5838
+ .context-chips .toolchain-chip .card-claude.available .status { color: var(--success); }
5839
+ .context-chips .toolchain-chip .card-claude.unavailable,
5840
+ .context-chips .toolchain-chip .card-claude.unavailable .status { color: var(--danger); }
5841
+ .context-chips .toolchain-chip .card-claude.checking,
5842
+ .context-chips .toolchain-chip .card-claude.checking .status { color: var(--warning); }
5843
+ .context-chips .toolchain-chip-model .model-select {
5844
+ background: var(--bg-1);
5845
+ color: var(--ink-1);
5846
+ border: 1px solid var(--ink-4);
5847
+ border-radius: 4px;
5848
+ padding: 3px 8px;
5849
+ font-family: var(--font-mono);
5850
+ font-size: 11px;
5851
+ line-height: 16px;
5852
+ cursor: pointer;
5853
+ transition: border-color 150ms ease;
5854
+ }
5855
+ .context-chips .toolchain-chip-model .model-select:hover { border-color: var(--accent); }
5856
+ .context-chips .toolchain-chip-model .model-select:focus {
5857
+ outline: none;
5858
+ border-color: var(--accent);
5859
+ box-shadow: 0 0 0 2px var(--accent-ghost);
5860
+ }
5861
+
5862
+ @media (max-width: 1100px) {
5863
+ .context-chips {
5864
+ margin-left: 0;
5865
+ width: 100%;
5866
+ flex-basis: 100%;
5867
+ margin-top: 0.5rem;
5868
+ justify-content: flex-end;
5869
+ }
5870
+ }