@cat-factory/app 0.302.2 → 0.303.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 (328) hide show
  1. package/README.md +16 -0
  2. package/app/app.config.ts +19 -10
  3. package/app/assets/css/main.css +13 -13
  4. package/app/assets/css/prose.css +22 -22
  5. package/app/assets/css/tokens.css +298 -0
  6. package/app/components/assistant/AssistantModal.vue +22 -22
  7. package/app/components/auth/AuthGate.vue +1 -1
  8. package/app/components/auth/BackendMisconfiguredScreen.vue +10 -10
  9. package/app/components/auth/LoginScreen.vue +34 -36
  10. package/app/components/auth/ResetPasswordScreen.vue +12 -12
  11. package/app/components/auth/UserMenu.vue +4 -4
  12. package/app/components/binaryCandidates/BinaryCandidatesWindow.vue +27 -25
  13. package/app/components/binaryOutput/BinaryOutputReport.vue +15 -15
  14. package/app/components/binaryOutput/StoredAssetView.vue +5 -5
  15. package/app/components/board/AddTaskModal.vue +17 -20
  16. package/app/components/board/AgentFailureCard.vue +11 -11
  17. package/app/components/board/AgentFailureHistory.vue +2 -2
  18. package/app/components/board/BoardCanvas.vue +6 -5
  19. package/app/components/board/CreateInitiativeModal.vue +8 -10
  20. package/app/components/board/DependencyConnectOverlay.vue +1 -1
  21. package/app/components/board/FailureHistoryList.vue +7 -7
  22. package/app/components/board/RecurringPipelineModal.vue +17 -17
  23. package/app/components/board/ReviewFrictionDialog.vue +6 -6
  24. package/app/components/board/StepExecutionHistory.vue +13 -13
  25. package/app/components/board/TaskDependencyEdges.vue +8 -8
  26. package/app/components/board/nodes/AgentChip.vue +10 -10
  27. package/app/components/board/nodes/BlockNode.vue +29 -29
  28. package/app/components/board/nodes/DecisionBadge.vue +2 -2
  29. package/app/components/board/nodes/EpicNode.vue +14 -10
  30. package/app/components/board/nodes/FrameSwimlanes.vue +7 -9
  31. package/app/components/board/nodes/InitiativeCard.vue +8 -8
  32. package/app/components/board/nodes/LaneGroup.vue +1 -1
  33. package/app/components/board/nodes/LaneTask.vue +2 -2
  34. package/app/components/board/nodes/ResizeGrips.vue +4 -4
  35. package/app/components/board/nodes/TaskCard.vue +18 -18
  36. package/app/components/board/nodes/TaskLane.vue +5 -5
  37. package/app/components/board/nodes/TaskPipelineMini.vue +18 -18
  38. package/app/components/bootstrap/AdoptionReviewModal.vue +29 -26
  39. package/app/components/bootstrap/BootstrapModal.vue +21 -23
  40. package/app/components/bootstrap/BootstrapRunSteps.vue +1 -1
  41. package/app/components/brainstorm/BrainstormWindow.vue +30 -33
  42. package/app/components/bugFishing/BugFishingWindow.vue +49 -49
  43. package/app/components/clarity/ClarityReviewWindow.vue +30 -30
  44. package/app/components/common/AsyncViewError.vue +5 -5
  45. package/app/components/common/ClarificationItem.vue +8 -13
  46. package/app/components/common/ConfirmDialog.vue +4 -2
  47. package/app/components/common/DescriptorFields.vue +1 -1
  48. package/app/components/common/EmptyState.vue +3 -3
  49. package/app/components/common/InterviewGateNotice.vue +7 -7
  50. package/app/components/common/KeyboardShortcutsHelp.vue +1 -1
  51. package/app/components/common/MarkdownProse.vue +14 -13
  52. package/app/components/consensus/ConsensusSessionWindow.vue +26 -26
  53. package/app/components/context/ContextAttachmentFields.vue +17 -17
  54. package/app/components/docs/DocInterviewWindow.vue +14 -14
  55. package/app/components/documents/ContextDocumentPicker.vue +17 -17
  56. package/app/components/documents/DocumentImportModal.vue +7 -7
  57. package/app/components/documents/DocumentSourceConnectModal.vue +3 -3
  58. package/app/components/documents/DocumentSyncState.vue +5 -5
  59. package/app/components/documents/DocumentTemplatesModal.vue +15 -15
  60. package/app/components/documents/RepoContextDocPicker.vue +5 -5
  61. package/app/components/documents/SpawnPreviewModal.vue +12 -12
  62. package/app/components/documents/StartFromDesignModal.vue +11 -11
  63. package/app/components/documents/TaskContextDocs.vue +5 -5
  64. package/app/components/environments/EnvSetupStepper.vue +6 -6
  65. package/app/components/environments/EnvironmentStatusPanel.vue +17 -17
  66. package/app/components/environments/steps/EnvPickStep.vue +3 -3
  67. package/app/components/environments/steps/EnvPreflightStep.vue +9 -9
  68. package/app/components/environments/steps/EnvReviewStep.vue +25 -22
  69. package/app/components/environments/steps/EnvSaveStep.vue +7 -5
  70. package/app/components/environments/steps/JourneyStepNav.vue +1 -1
  71. package/app/components/focus/BlockFocusView.vue +17 -19
  72. package/app/components/followUp/FollowUpWindow.vue +23 -23
  73. package/app/components/forkDecision/ForkDecisionWindow.vue +37 -39
  74. package/app/components/foundational/FoundationalContractSummary.vue +7 -7
  75. package/app/components/foundational/FoundationalServiceCatalogList.vue +11 -11
  76. package/app/components/foundational/FoundationalServiceManager.vue +1 -1
  77. package/app/components/foundational/FoundationalServiceRegistry.vue +13 -13
  78. package/app/components/foundational/FoundationalServiceSources.vue +13 -13
  79. package/app/components/foundational/FoundationalSuppressions.vue +7 -7
  80. package/app/components/foundational/ServiceCatalogConnection.vue +10 -10
  81. package/app/components/fragments/FragmentLibraryManager.vue +41 -44
  82. package/app/components/fragments/FragmentSelector.vue +13 -13
  83. package/app/components/fragments/GitHubDocUrlImport.vue +1 -1
  84. package/app/components/gates/GateFailingCheckList.vue +5 -5
  85. package/app/components/gates/GateResultView.vue +50 -47
  86. package/app/components/github/AddServiceFromRepoModal.vue +14 -14
  87. package/app/components/github/BranchProtectionPreflight.vue +13 -13
  88. package/app/components/github/GitHubConnect.vue +7 -7
  89. package/app/components/github/GitHubOnboarding.vue +7 -7
  90. package/app/components/github/GitHubPanel.vue +37 -40
  91. package/app/components/github/RepoTreeBrowser.vue +18 -18
  92. package/app/components/humanTest/HumanTestWindow.vue +30 -33
  93. package/app/components/initiative/InitiativePlanNotice.vue +5 -5
  94. package/app/components/initiative/InitiativePlanReview.vue +27 -29
  95. package/app/components/initiative/InitiativePlanningWindow.vue +10 -10
  96. package/app/components/initiative/InitiativeTrackerWindow.vue +71 -65
  97. package/app/components/inputGate/InputGateNotice.vue +2 -4
  98. package/app/components/judge/JudgeResultView.vue +30 -32
  99. package/app/components/kaizen/KaizenPanel.vue +40 -36
  100. package/app/components/kaizen/KaizenStepStatus.vue +21 -21
  101. package/app/components/layout/AccountAuditLog.vue +10 -10
  102. package/app/components/layout/AccountDeploymentSettings.vue +20 -20
  103. package/app/components/layout/AccountFailureKindRules.vue +13 -13
  104. package/app/components/layout/AccountFoundationalSettings.vue +1 -1
  105. package/app/components/layout/AccountFragmentSettings.vue +1 -1
  106. package/app/components/layout/AccountModelPolicySettings.vue +9 -9
  107. package/app/components/layout/AccountPlatformAlertSettings.vue +11 -11
  108. package/app/components/layout/AccountRiskPolicySettings.vue +2 -2
  109. package/app/components/layout/AccountRunCredentialSettings.vue +5 -5
  110. package/app/components/layout/AccountSkillSettings.vue +1 -1
  111. package/app/components/layout/AccountTeamSettings.vue +23 -15
  112. package/app/components/layout/AiProvidersBanner.vue +11 -8
  113. package/app/components/layout/AppearanceSwitcher.vue +108 -0
  114. package/app/components/layout/BoardSwitcher.vue +8 -11
  115. package/app/components/layout/BoardToolbar.vue +3 -3
  116. package/app/components/layout/CommandBar.vue +7 -9
  117. package/app/components/layout/ConnectionStatusBanner.vue +2 -2
  118. package/app/components/layout/DefaultTestEnvBanner.vue +5 -5
  119. package/app/components/layout/GitHubPatBanner.vue +5 -5
  120. package/app/components/layout/GitHubPatPermissionsBanner.vue +16 -10
  121. package/app/components/layout/InfraSetupBanner.vue +6 -6
  122. package/app/components/layout/IntegrationsHub.vue +15 -15
  123. package/app/components/layout/LanguageSwitcher.vue +5 -5
  124. package/app/components/layout/ModelProvidersHub.vue +13 -16
  125. package/app/components/layout/NotificationsInbox.vue +10 -10
  126. package/app/components/layout/PersonalSetupModal.vue +8 -8
  127. package/app/components/layout/ProviderConfigBanner.vue +4 -4
  128. package/app/components/layout/RolePrompt.vue +7 -7
  129. package/app/components/layout/SideBar.vue +6 -4
  130. package/app/components/layout/SpendWarningBanner.vue +17 -14
  131. package/app/components/layout/TranslationWarningBanner.vue +4 -4
  132. package/app/components/layout/UiModeSwitcher.vue +13 -13
  133. package/app/components/layout/UiRoleSwitcher.vue +8 -8
  134. package/app/components/layout/WorkspaceMembersSettings.vue +15 -11
  135. package/app/components/media/ArtifactLightbox.vue +13 -13
  136. package/app/components/media/ImageCompare.vue +31 -24
  137. package/app/components/merge/MergeEffortChips.vue +2 -2
  138. package/app/components/notifications/NotificationSettingsPanel.vue +14 -12
  139. package/app/components/observability/OutcomeFilterChips.vue +6 -6
  140. package/app/components/observability/RunFailureSummary.vue +28 -25
  141. package/app/components/observability/StepMetricsBar.vue +26 -28
  142. package/app/components/observability/StepModelActivity.vue +2 -2
  143. package/app/components/observability/ToolCallList.vue +24 -24
  144. package/app/components/outcome/OutcomeSummaryWindow.vue +47 -47
  145. package/app/components/palettes/AgentPalette.vue +8 -8
  146. package/app/components/palettes/AgentTierSelect.vue +1 -1
  147. package/app/components/palettes/PipelinePurposeSelect.vue +1 -1
  148. package/app/components/panels/AgentStepDetail.vue +52 -51
  149. package/app/components/panels/AttemptEntryHeader.vue +4 -6
  150. package/app/components/panels/DecisionModal.vue +7 -7
  151. package/app/components/panels/GenericStructuredResultView.vue +7 -7
  152. package/app/components/panels/InspectorPanel.vue +17 -17
  153. package/app/components/panels/MergerResultView.vue +19 -19
  154. package/app/components/panels/ObservabilityPanel.vue +115 -123
  155. package/app/components/panels/OperatorDashboardPanel.vue +89 -97
  156. package/app/components/panels/ReportsPanel.vue +69 -66
  157. package/app/components/panels/ReportsSpendBreakdown.vue +9 -9
  158. package/app/components/panels/ResultWindowShell.vue +38 -38
  159. package/app/components/panels/RunDetailLoadState.vue +2 -2
  160. package/app/components/panels/StepContainerStatus.vue +9 -9
  161. package/app/components/panels/StepDelegatedStatus.logic.spec.ts +135 -0
  162. package/app/components/panels/StepDelegatedStatus.logic.ts +160 -0
  163. package/app/components/panels/StepDelegatedStatus.vue +181 -0
  164. package/app/components/panels/StepEffortReport.vue +16 -15
  165. package/app/components/panels/StepFragmentAdherence.vue +14 -10
  166. package/app/components/panels/StepMetadataCard.vue +74 -45
  167. package/app/components/panels/StepReproductionReport.vue +25 -21
  168. package/app/components/panels/StepRunMeta.vue +20 -20
  169. package/app/components/panels/StepTestReport.logic.spec.ts +8 -3
  170. package/app/components/panels/StepTestReport.logic.ts +4 -4
  171. package/app/components/panels/StepTestReport.vue +28 -28
  172. package/app/components/panels/StepToolServers.vue +14 -11
  173. package/app/components/panels/StepValidationReport.vue +7 -7
  174. package/app/components/panels/inspector/ContainerSummary.vue +9 -9
  175. package/app/components/panels/inspector/DocReferenceRepos.vue +3 -3
  176. package/app/components/panels/inspector/EnvProbeReport.vue +24 -27
  177. package/app/components/panels/inspector/EpicChildren.vue +8 -12
  178. package/app/components/panels/inspector/FrontendBindingsResolved.vue +11 -11
  179. package/app/components/panels/inspector/FrontendConfig.vue +37 -41
  180. package/app/components/panels/inspector/InitiativeInspector.vue +3 -3
  181. package/app/components/panels/inspector/InspectorSection.vue +6 -6
  182. package/app/components/panels/inspector/RecurringScheduleSettings.vue +16 -19
  183. package/app/components/panels/inspector/ServiceConnections.vue +2 -2
  184. package/app/components/panels/inspector/ServiceReleaseHealthConfig.vue +2 -2
  185. package/app/components/panels/inspector/ServiceSelfTests.vue +21 -17
  186. package/app/components/panels/inspector/ServiceTestConfig.vue +51 -59
  187. package/app/components/panels/inspector/ServiceTestSecrets.vue +5 -5
  188. package/app/components/panels/inspector/ServiceTestingContext.vue +3 -3
  189. package/app/components/panels/inspector/ServiceValidationConfig.vue +2 -2
  190. package/app/components/panels/inspector/TaskAgentConfig.vue +3 -3
  191. package/app/components/panels/inspector/TaskAprioriBranches.vue +8 -5
  192. package/app/components/panels/inspector/TaskDependencies.vue +1 -1
  193. package/app/components/panels/inspector/TaskEstimateBadge.vue +11 -11
  194. package/app/components/panels/inspector/TaskExecution.vue +17 -17
  195. package/app/components/panels/inspector/TaskReviewTarget.vue +2 -2
  196. package/app/components/panels/inspector/TaskRunSettings.vue +35 -37
  197. package/app/components/panels/inspector/TaskStructure.vue +3 -3
  198. package/app/components/pipeline/AgentKindIcon.vue +1 -1
  199. package/app/components/pipeline/AgentPromptEditor.vue +17 -17
  200. package/app/components/pipeline/BinaryOutputStepPicker.vue +42 -56
  201. package/app/components/pipeline/EstimateThresholdFields.vue +4 -4
  202. package/app/components/pipeline/GateConfigFields.vue +13 -10
  203. package/app/components/pipeline/IterationCapPrompt.vue +4 -2
  204. package/app/components/pipeline/PipelineBuilder.vue +47 -55
  205. package/app/components/pipeline/PipelineHealthModal.vue +27 -29
  206. package/app/components/pipeline/PipelinePicker.vue +10 -10
  207. package/app/components/pipeline/PipelinePreview.vue +10 -10
  208. package/app/components/pipeline/PipelineProgress.vue +64 -67
  209. package/app/components/prReview/PrReviewPhaseBadge.vue +7 -7
  210. package/app/components/prReview/PrReviewWindow.vue +75 -77
  211. package/app/components/providers/AiPresetMismatchDialog.vue +5 -5
  212. package/app/components/providers/AiProviderOnboardingModal.vue +9 -9
  213. package/app/components/providers/ApiKeysSection.vue +13 -13
  214. package/app/components/providers/PersonalCredentialModal.vue +2 -2
  215. package/app/components/providers/PersonalSubscriptionSection.vue +10 -10
  216. package/app/components/providers/SignInRequiredNotice.vue +1 -1
  217. package/app/components/providers/VendorCredentialsModal.vue +10 -10
  218. package/app/components/provisioning/ProvisioningLogsDrawer.vue +13 -13
  219. package/app/components/ralph/RalphLoopResultView.vue +28 -30
  220. package/app/components/recurring/RecurrenceEditor.vue +2 -2
  221. package/app/components/requirements/RequirementsReviewWindow.vue +51 -58
  222. package/app/components/riskPolicy/RiskPolicyPicker.vue +12 -15
  223. package/app/components/riskPolicy/RiskPolicyPreview.vue +14 -14
  224. package/app/components/sandbox/SandboxPanel.vue +58 -59
  225. package/app/components/settings/AccountSettingsPanel.vue +1 -1
  226. package/app/components/settings/ApiTokensPanel.vue +10 -10
  227. package/app/components/settings/BudgetSettings.vue +18 -22
  228. package/app/components/settings/CapabilityCredentialsPanel.vue +15 -15
  229. package/app/components/settings/CloudflareHandlerSection.vue +20 -20
  230. package/app/components/settings/ComposeEnvironmentSetupSection.vue +13 -13
  231. package/app/components/settings/ConnectionTestVerdict.vue +3 -3
  232. package/app/components/settings/ConnectionWarnings.vue +1 -1
  233. package/app/components/settings/ConsensusGroupsSection.vue +27 -35
  234. package/app/components/settings/CustomManifestTypeEditor.vue +10 -10
  235. package/app/components/settings/DefaultProvisionTypeSection.vue +6 -6
  236. package/app/components/settings/InfraHandlersConfigurator.vue +24 -22
  237. package/app/components/settings/InfrastructureBackendPicker.vue +6 -6
  238. package/app/components/settings/InfrastructureWindow.vue +5 -5
  239. package/app/components/settings/IssueTrackerPanel.vue +29 -23
  240. package/app/components/settings/KubernetesEngineForm.vue +11 -11
  241. package/app/components/settings/KubernetesEnvironmentForm.vue +4 -4
  242. package/app/components/settings/LocalContainerPoolSettings.vue +6 -11
  243. package/app/components/settings/LocalModelEndpointsPanel.vue +20 -18
  244. package/app/components/settings/McpAuthorizeScreen.vue +13 -15
  245. package/app/components/settings/McpOAuthCallbackScreen.vue +16 -10
  246. package/app/components/settings/MergeClassRulesEditor.vue +6 -9
  247. package/app/components/settings/MergeRolePolicyEditor.vue +16 -16
  248. package/app/components/settings/ModelConfigurationPanel.vue +23 -30
  249. package/app/components/settings/ModelPresetHealthModal.vue +15 -13
  250. package/app/components/settings/ObservabilityConnectionPanel.vue +4 -4
  251. package/app/components/settings/OpenRouterCatalogPanel.vue +23 -19
  252. package/app/components/settings/PackageRegistriesPanel.vue +8 -8
  253. package/app/components/settings/ProviderConnectionTab.vue +8 -11
  254. package/app/components/settings/ProviderManifestEditor.vue +9 -9
  255. package/app/components/settings/ProviderPreferenceEditor.vue +8 -8
  256. package/app/components/settings/RiskPolicyCreateForm.vue +10 -10
  257. package/app/components/settings/RiskPolicyEditorRow.vue +14 -14
  258. package/app/components/settings/RiskPolicyHealthModal.vue +15 -13
  259. package/app/components/settings/RiskPolicyInheritedRow.vue +1 -1
  260. package/app/components/settings/RiskPolicyPanel.vue +10 -15
  261. package/app/components/settings/ServiceFragmentDefaultsPanel.vue +7 -7
  262. package/app/components/settings/SharedStacksPanel.vue +9 -12
  263. package/app/components/settings/TaskSourceCard.vue +4 -4
  264. package/app/components/settings/TaskTypeSuppressionsPanel.vue +6 -6
  265. package/app/components/settings/ToolServerChecklist.vue +36 -29
  266. package/app/components/settings/UsageSettings.vue +15 -15
  267. package/app/components/settings/UserSecretsSection.vue +9 -12
  268. package/app/components/settings/WorkspaceMetadataSettings.vue +5 -5
  269. package/app/components/settings/WorkspaceSettingsPanel.vue +47 -47
  270. package/app/components/skills/ReviewSkillQueue.vue +10 -10
  271. package/app/components/skills/SkillLibraryManager.vue +23 -20
  272. package/app/components/slack/SlackPanel.vue +13 -17
  273. package/app/components/spec/ServiceSpecWindow.vue +45 -42
  274. package/app/components/tasks/BugHuntModal.vue +24 -27
  275. package/app/components/tasks/ContextIssuePicker.vue +11 -11
  276. package/app/components/tasks/TaskContextIssues.vue +3 -3
  277. package/app/components/tasks/TaskImportModal.vue +7 -7
  278. package/app/components/tasks/TaskSourceConnectModal.vue +10 -8
  279. package/app/components/testing/TestReportWindow.vue +99 -82
  280. package/app/components/theme/ThemeImportModal.vue +115 -0
  281. package/app/components/tutorial/TutorialCatalogue.vue +9 -9
  282. package/app/components/tutorial/TutorialNudge.vue +5 -5
  283. package/app/components/tutorial/TutorialOverlay.vue +12 -12
  284. package/app/components/tutorial/TutorialPrompt.vue +6 -9
  285. package/app/components/vcs/GitLabConnect.vue +4 -4
  286. package/app/components/vcs/VcsConnectSurfaces.vue +2 -2
  287. package/app/components/visualConfirm/VisualConfirmationWindow.vue +36 -36
  288. package/app/composables/api/client.ts +6 -1
  289. package/app/composables/usePipelineErrorToast.ts +17 -0
  290. package/app/modular/agent-kinds.ts +24 -0
  291. package/app/pages/index.vue +5 -5
  292. package/app/plugins/theme.client.ts +125 -0
  293. package/app/spa-loading-template.html +52 -14
  294. package/app/stores/agents.ts +1 -1
  295. package/app/stores/theme.spec.ts +56 -0
  296. package/app/stores/theme.ts +87 -0
  297. package/app/types/domain.ts +19 -0
  298. package/app/types/execution.ts +4 -0
  299. package/app/utils/agentOutput.ts +1 -1
  300. package/app/utils/binaryOutput.ts +6 -6
  301. package/app/utils/bootstrapSteps.ts +14 -14
  302. package/app/utils/catalog.ts +87 -83
  303. package/app/utils/colorTint.ts +10 -0
  304. package/app/utils/failureKinds.ts +1 -0
  305. package/app/utils/observability.ts +3 -3
  306. package/app/utils/pipelineRender.ts +13 -17
  307. package/app/utils/swimlanes.ts +4 -4
  308. package/app/utils/theme/bootPalette.spec.ts +54 -0
  309. package/app/utils/theme/bootPalette.ts +108 -0
  310. package/app/utils/theme/builtins.spec.ts +38 -0
  311. package/app/utils/theme/builtins.ts +55 -0
  312. package/app/utils/theme/css.ts +162 -0
  313. package/app/utils/theme/doc.ts +353 -0
  314. package/app/utils/theme/link.ts +93 -0
  315. package/app/utils/theme/presets.ts +509 -0
  316. package/app/utils/theme/theme.spec.ts +224 -0
  317. package/i18n/locales/de.json +61 -4
  318. package/i18n/locales/en.json +70 -4
  319. package/i18n/locales/es.json +61 -4
  320. package/i18n/locales/fr.json +61 -4
  321. package/i18n/locales/he.json +61 -4
  322. package/i18n/locales/it.json +61 -4
  323. package/i18n/locales/ja.json +61 -4
  324. package/i18n/locales/pl.json +61 -4
  325. package/i18n/locales/tr.json +61 -4
  326. package/i18n/locales/uk.json +61 -4
  327. package/nuxt.config.ts +37 -11
  328. package/package.json +9 -8
@@ -96,9 +96,9 @@ const CHUNK_STATUS_KEY: Record<StepSubtaskItem['status'], string> = {
96
96
  pending: 'prReview.reviewing.chunkStatus.pending',
97
97
  }
98
98
  const CHUNK_STATUS_CLASS: Record<StepSubtaskItem['status'], string> = {
99
- completed: 'bg-emerald-500/15 text-emerald-300',
100
- in_progress: 'bg-indigo-500/15 text-indigo-300',
101
- pending: 'bg-slate-700/60 text-slate-400',
99
+ completed: 'bg-app-success-500/15 text-app-success-300',
100
+ in_progress: 'bg-primary/15 text-primary',
101
+ pending: 'bg-accented/60 text-muted',
102
102
  }
103
103
  function chunkStatusLabel(status: StepSubtaskItem['status']): string {
104
104
  return t(CHUNK_STATUS_KEY[status])
@@ -116,11 +116,11 @@ const postedIds = computed(() => new Set(state.value?.postedFindingIds ?? []))
116
116
 
117
117
  /** Severity → chip classes (styling, not copy). */
118
118
  const SEVERITY_CLASS: Record<PrReviewSeverity, string> = {
119
- blocker: 'bg-rose-500/15 text-rose-300 ring-rose-500/30',
120
- high: 'bg-orange-500/15 text-orange-300 ring-orange-500/30',
121
- medium: 'bg-amber-500/15 text-amber-300 ring-amber-500/30',
122
- low: 'bg-sky-500/15 text-sky-300 ring-sky-500/30',
123
- nit: 'bg-slate-500/15 text-slate-300 ring-slate-500/30',
119
+ blocker: 'bg-app-error-500/15 text-app-error-300 ring-app-error-500/30',
120
+ high: 'bg-app-hue-orange/15 text-app-hue-orange ring-app-hue-orange/30',
121
+ medium: 'bg-app-warning-500/15 text-app-warning-300 ring-app-warning-500/30',
122
+ low: 'bg-app-info-500/15 text-app-info-300 ring-app-info-500/30',
123
+ nit: 'bg-app-500/15 text-toned ring-app-500/30',
124
124
  }
125
125
 
126
126
  /** Findings grouped under their slice (in the review's slice order), plus an "Other" bucket. */
@@ -283,7 +283,7 @@ const { requestClose } = useUnsavedGuard({
283
283
  <ResultWindowShell
284
284
  :open="open"
285
285
  icon="i-lucide-clipboard-check"
286
- icon-class="bg-indigo-500/15 text-indigo-300"
286
+ icon-class="bg-primary/15 text-primary"
287
287
  :title="block ? t('prReview.titleWithBlock', { title: block.title }) : t('prReview.title')"
288
288
  :subtitle="t('prReview.subtitle')"
289
289
  width="full"
@@ -295,7 +295,7 @@ const { requestClose } = useUnsavedGuard({
295
295
  :href="state.prUrl"
296
296
  target="_blank"
297
297
  rel="noopener"
298
- class="rounded-md px-2 py-1 text-[11px] text-indigo-300 hover:bg-slate-800"
298
+ class="rounded-md px-2 py-1 text-[11px] text-primary hover:bg-elevated"
299
299
  >
300
300
  {{ t('prReview.openPr') }}
301
301
  </a>
@@ -316,29 +316,29 @@ const { requestClose } = useUnsavedGuard({
316
316
  <div
317
317
  v-if="planning"
318
318
  data-testid="pr-review-planning"
319
- class="flex flex-1 flex-col items-center justify-center gap-2 py-10 text-center text-slate-400"
319
+ class="flex flex-1 flex-col items-center justify-center gap-2 py-10 text-center text-muted"
320
320
  >
321
321
  <UIcon name="i-lucide-loader-circle" class="h-8 w-8 animate-spin opacity-60" />
322
- <p class="text-sm text-slate-200">{{ t('prReview.reviewing.planning.title') }}</p>
323
- <p class="max-w-sm text-[11px] text-slate-500">
322
+ <p class="text-sm text-default">{{ t('prReview.reviewing.planning.title') }}</p>
323
+ <p class="max-w-sm text-[11px] text-dimmed">
324
324
  {{ t('prReview.reviewing.planning.hint') }}
325
325
  </p>
326
326
  </div>
327
327
 
328
328
  <!-- REVIEWING: a per-slice plan exists — show every slice with its status + which are active now. -->
329
329
  <div v-else data-testid="pr-review-reviewing-chunks" class="py-2">
330
- <div class="mb-1 flex items-center gap-2 text-sm text-slate-200">
330
+ <div class="mb-1 flex items-center gap-2 text-sm text-default">
331
331
  <UIcon
332
332
  name="i-lucide-loader-circle"
333
- class="h-4 w-4 shrink-0 animate-spin text-indigo-300"
333
+ class="h-4 w-4 shrink-0 animate-spin text-primary"
334
334
  />
335
335
  <span>{{ t('prReview.reviewing.reviewingChunks.title') }}</span>
336
336
  </div>
337
- <p class="mb-3 text-[11px] text-slate-500">
337
+ <p class="mb-3 text-[11px] text-dimmed">
338
338
  {{ t('prReview.reviewing.reviewingChunks.hint') }}
339
339
  </p>
340
340
 
341
- <div class="flex items-center justify-between text-[11px] text-slate-400">
341
+ <div class="flex items-center justify-between text-[11px] text-muted">
342
342
  <span data-testid="pr-review-chunk-count">
343
343
  {{
344
344
  t('prReview.reviewing.chunks', {
@@ -347,13 +347,13 @@ const { requestClose } = useUnsavedGuard({
347
347
  })
348
348
  }}
349
349
  </span>
350
- <span v-if="subtasks!.inProgress > 0" class="text-indigo-300">
350
+ <span v-if="subtasks!.inProgress > 0" class="text-primary">
351
351
  {{ t('prReview.reviewing.inProgress', { count: subtasks!.inProgress }) }}
352
352
  </span>
353
353
  </div>
354
- <div class="mt-1 h-1.5 overflow-hidden rounded-full bg-slate-700/60">
354
+ <div class="mt-1 h-1.5 overflow-hidden rounded-full bg-accented/60">
355
355
  <div
356
- class="h-full rounded-full bg-indigo-400 transition-all duration-500"
356
+ class="h-full rounded-full bg-primary transition-all duration-500"
357
357
  :style="{ width: `${chunkPercent}%` }"
358
358
  />
359
359
  </div>
@@ -367,13 +367,13 @@ const { requestClose } = useUnsavedGuard({
367
367
  class="mt-3 rounded-lg border px-2.5 py-2"
368
368
  :class="
369
369
  activeChunks.length
370
- ? 'border-indigo-500/30 bg-indigo-500/5'
371
- : 'border-slate-800 bg-slate-900/40'
370
+ ? 'border-primary/30 bg-primary/5'
371
+ : 'border-default bg-default/40'
372
372
  "
373
373
  >
374
374
  <p
375
375
  class="mb-1 text-[10px] font-semibold uppercase tracking-wide"
376
- :class="activeChunks.length ? 'text-indigo-300' : 'text-slate-500'"
376
+ :class="activeChunks.length ? 'text-primary' : 'text-dimmed'"
377
377
  >
378
378
  {{ t('prReview.reviewing.activeHeading') }}
379
379
  </p>
@@ -381,25 +381,23 @@ const { requestClose } = useUnsavedGuard({
381
381
  <li
382
382
  v-for="(label, i) in activeChunks"
383
383
  :key="i"
384
- class="flex items-start gap-1.5 text-[12px] text-slate-100"
384
+ class="flex items-start gap-1.5 text-[12px] text-app-100"
385
385
  >
386
386
  <UIcon
387
387
  name="i-lucide-loader-circle"
388
- class="mt-0.5 h-3.5 w-3.5 shrink-0 animate-spin text-indigo-300"
388
+ class="mt-0.5 h-3.5 w-3.5 shrink-0 animate-spin text-primary"
389
389
  />
390
390
  <span class="min-w-0">{{ label }}</span>
391
391
  </li>
392
392
  </ul>
393
- <p v-else data-testid="pr-review-active-idle" class="text-[12px] text-slate-400">
393
+ <p v-else data-testid="pr-review-active-idle" class="text-[12px] text-muted">
394
394
  {{ t('prReview.reviewing.activeIdle') }}
395
395
  </p>
396
396
  </div>
397
397
 
398
398
  <!-- Every chunk with its explicit status (Reviewed / Reviewing… / Queued). -->
399
399
  <template v-if="subtasks!.items?.length">
400
- <p
401
- class="mb-1.5 mt-3 text-[10px] font-semibold uppercase tracking-wide text-slate-400"
402
- >
400
+ <p class="mb-1.5 mt-3 text-[10px] font-semibold uppercase tracking-wide text-muted">
403
401
  {{ t('prReview.reviewing.chunksHeading') }}
404
402
  </p>
405
403
  <ul class="space-y-1.5" data-testid="pr-review-chunks">
@@ -410,10 +408,10 @@ const { requestClose } = useUnsavedGuard({
410
408
  class="flex items-center gap-1.5 text-[12px]"
411
409
  :class="
412
410
  item.status === 'completed'
413
- ? 'text-slate-500'
411
+ ? 'text-dimmed'
414
412
  : item.status === 'in_progress'
415
- ? 'text-slate-100'
416
- : 'text-slate-400'
413
+ ? 'text-app-100'
414
+ : 'text-muted'
417
415
  "
418
416
  >
419
417
  <UIcon
@@ -444,16 +442,16 @@ const { requestClose } = useUnsavedGuard({
444
442
  here can tell wedged from quiet-but-working (see `canResume`). Re-reviews only the
445
443
  slices that never reported; the finished ones are re-aggregated from their captured
446
444
  reports. -->
447
- <div class="mt-4 border-t border-slate-800 pt-3">
445
+ <div class="mt-4 border-t border-default pt-3">
448
446
  <p
449
447
  v-if="prReview.error"
450
448
  data-testid="pr-review-resume-error"
451
- class="mb-2 rounded-md bg-rose-500/10 px-3 py-2 text-[12px] text-rose-300"
449
+ class="mb-2 rounded-md bg-app-error-500/10 px-3 py-2 text-[12px] text-app-error-300"
452
450
  >
453
451
  {{ prReview.error }}
454
452
  </p>
455
453
  <div class="flex items-start justify-between gap-3">
456
- <p class="min-w-0 text-[11px] text-slate-500">{{ t('prReview.resume.hint') }}</p>
454
+ <p class="min-w-0 text-[11px] text-dimmed">{{ t('prReview.resume.hint') }}</p>
457
455
  <UButton
458
456
  data-testid="pr-review-resume"
459
457
  size="xs"
@@ -475,13 +473,13 @@ const { requestClose } = useUnsavedGuard({
475
473
  <div
476
474
  v-else-if="working"
477
475
  data-testid="pr-review-working"
478
- class="flex h-full flex-col items-center justify-center gap-2 py-10 text-center text-slate-400"
476
+ class="flex h-full flex-col items-center justify-center gap-2 py-10 text-center text-muted"
479
477
  >
480
478
  <UIcon name="i-lucide-loader-circle" class="h-8 w-8 animate-spin opacity-60" />
481
479
  <p class="text-sm">
482
480
  {{ status === 'fixing' ? t('prReview.fixing.title') : t('prReview.posting.title') }}
483
481
  </p>
484
- <p class="max-w-sm text-[11px] text-slate-500">
482
+ <p class="max-w-sm text-[11px] text-dimmed">
485
483
  {{ status === 'fixing' ? t('prReview.fixing.hint') : t('prReview.posting.hint') }}
486
484
  </p>
487
485
  </div>
@@ -489,7 +487,7 @@ const { requestClose } = useUnsavedGuard({
489
487
  <template v-else>
490
488
  <p
491
489
  v-if="prReview.error"
492
- class="mb-3 rounded-md bg-rose-500/10 px-3 py-2 text-[12px] text-rose-300"
490
+ class="mb-3 rounded-md bg-app-error-500/10 px-3 py-2 text-[12px] text-app-error-300"
493
491
  >
494
492
  {{ prReview.error }}
495
493
  </p>
@@ -503,8 +501,8 @@ const { requestClose } = useUnsavedGuard({
503
501
  class="mb-3 rounded-lg border px-3 py-2 text-[12px]"
504
502
  :class="
505
503
  postReport.failures.length > 0 || postReport.bodyPosted === false
506
- ? 'border-amber-500/40 bg-amber-500/10 text-amber-200'
507
- : 'border-emerald-500/40 bg-emerald-500/10 text-emerald-200'
504
+ ? 'border-app-warning-500/40 bg-app-warning-500/10 text-app-warning-200'
505
+ : 'border-app-success-500/40 bg-app-success-500/10 text-app-success-200'
508
506
  "
509
507
  >
510
508
  <div class="mb-1 flex items-center gap-1.5 font-medium">
@@ -533,7 +531,7 @@ const { requestClose } = useUnsavedGuard({
533
531
  <p class="mt-1.5 font-medium">{{ t('prReview.postReport.failuresHeading') }}</p>
534
532
  <ul class="mt-0.5 space-y-0.5" data-testid="pr-review-post-failures">
535
533
  <li v-for="f in postReport.failures" :key="f.findingId" class="flex gap-1.5">
536
- <code class="shrink-0 text-amber-100"
534
+ <code class="shrink-0 text-app-warning-100"
537
535
  >{{ f.path }}<template v-if="f.line != null">:{{ f.line }}</template></code
538
536
  >
539
537
  <span class="opacity-90">— {{ f.reason }}</span>
@@ -549,9 +547,9 @@ const { requestClose } = useUnsavedGuard({
549
547
  shell's `width` prop) — this window is `full`-width. -->
550
548
  <div
551
549
  v-if="state?.summary"
552
- class="mb-3 max-w-3xl rounded-md bg-slate-800/50 px-3 py-2 text-[12px] text-slate-300"
550
+ class="mb-3 max-w-3xl rounded-md bg-elevated/50 px-3 py-2 text-[12px] text-toned"
553
551
  >
554
- <span class="mb-1 block text-slate-500">{{ t('prReview.summaryLabel') }}</span>
552
+ <span class="mb-1 block text-dimmed">{{ t('prReview.summaryLabel') }}</span>
555
553
  <MarkdownProse :text="state.summary" />
556
554
  </div>
557
555
 
@@ -566,7 +564,7 @@ const { requestClose } = useUnsavedGuard({
566
564
  <!-- A clean PR / resolved review with no findings. -->
567
565
  <div
568
566
  v-if="findings.length === 0"
569
- class="rounded-xl border border-slate-800 bg-slate-900/60 px-4 py-6 text-center text-[13px] text-slate-300"
567
+ class="rounded-xl border border-default bg-default/60 px-4 py-6 text-center text-[13px] text-toned"
570
568
  >
571
569
  {{ t('prReview.noFindings') }}
572
570
  </div>
@@ -576,31 +574,31 @@ const { requestClose } = useUnsavedGuard({
576
574
  <div
577
575
  v-if="challenging"
578
576
  data-testid="pr-review-challenging"
579
- class="mb-3 flex items-center gap-2 rounded-md border border-indigo-500/40 bg-indigo-500/10 px-3 py-2 text-[12px] text-indigo-200"
577
+ class="mb-3 flex items-center gap-2 rounded-md border border-primary/40 bg-primary/10 px-3 py-2 text-[12px] text-primary"
580
578
  >
581
579
  <UIcon name="i-lucide-loader-circle" class="h-4 w-4 shrink-0 animate-spin" />
582
580
  <span>{{ t('prReview.challenge.investigatingBanner') }}</span>
583
581
  </div>
584
582
 
585
583
  <!-- Selection toolbar -->
586
- <div v-if="awaiting" class="mb-2 flex items-center gap-3 text-[11px] text-slate-400">
584
+ <div v-if="awaiting" class="mb-2 flex items-center gap-3 text-[11px] text-muted">
587
585
  <span data-testid="pr-review-selected-count">
588
586
  {{ t('prReview.selectedCount', { count: activeSelectedIds.length }) }}
589
587
  </span>
590
- <button class="text-indigo-300 hover:underline" @click="selectAll">
588
+ <button class="text-primary hover:underline" @click="selectAll">
591
589
  {{ t('prReview.selectAll') }}
592
590
  </button>
593
- <button class="text-indigo-300 hover:underline" @click="clearAll">
591
+ <button class="text-primary hover:underline" @click="clearAll">
594
592
  {{ t('prReview.clear') }}
595
593
  </button>
596
594
  </div>
597
595
 
598
596
  <!-- Findings grouped by slice -->
599
597
  <section v-for="g in groups" :key="g.id" class="mb-4">
600
- <h3 class="mb-1.5 text-[11px] font-semibold uppercase tracking-wide text-slate-400">
598
+ <h3 class="mb-1.5 text-[11px] font-semibold uppercase tracking-wide text-muted">
601
599
  {{ g.title }}
602
600
  </h3>
603
- <p v-if="g.rationale" class="mb-1.5 max-w-3xl text-[11px] text-slate-500">
601
+ <p v-if="g.rationale" class="mb-1.5 max-w-3xl text-[11px] text-dimmed">
604
602
  {{ g.rationale }}
605
603
  </p>
606
604
  <article
@@ -610,8 +608,8 @@ const { requestClose } = useUnsavedGuard({
610
608
  class="mb-1.5 rounded-xl border px-3 py-2 transition"
611
609
  :class="[
612
610
  awaiting && selected.has(f.id) && !isRetracted(f)
613
- ? 'border-indigo-500/60 bg-indigo-500/5'
614
- : 'border-slate-800 bg-slate-900/60',
611
+ ? 'border-primary/60 bg-primary/5'
612
+ : 'border-default bg-default/60',
615
613
  isRetracted(f) ? 'opacity-60' : '',
616
614
  ]"
617
615
  >
@@ -619,7 +617,7 @@ const { requestClose } = useUnsavedGuard({
619
617
  <input
620
618
  v-if="awaiting || challenging"
621
619
  type="checkbox"
622
- class="mt-1 accent-indigo-500"
620
+ class="mt-1 accent-primary"
623
621
  data-testid="pr-review-finding-toggle"
624
622
  :checked="selected.has(f.id) && !isRetracted(f)"
625
623
  :disabled="!awaiting || isRetracted(f)"
@@ -633,13 +631,13 @@ const { requestClose } = useUnsavedGuard({
633
631
  >
634
632
  {{ t(`prReview.severity.${f.severity}`) }}
635
633
  </span>
636
- <span class="rounded bg-slate-800 px-1.5 py-0.5 text-[10px] text-slate-300">
634
+ <span class="rounded bg-elevated px-1.5 py-0.5 text-[10px] text-toned">
637
635
  {{ t(`prReview.category.${f.category}`) }}
638
636
  </span>
639
637
  <span
640
638
  v-if="postedIds.has(f.id)"
641
639
  data-testid="pr-review-finding-posted"
642
- class="rounded bg-emerald-500/15 px-1.5 py-0.5 text-[10px] font-semibold uppercase text-emerald-300 ring-1 ring-emerald-500/30"
640
+ class="rounded bg-app-success-500/15 px-1.5 py-0.5 text-[10px] font-semibold uppercase text-app-success-300 ring-1 ring-app-success-500/30"
643
641
  >
644
642
  {{ t('prReview.postReport.postedBadge') }}
645
643
  </span>
@@ -647,47 +645,47 @@ const { requestClose } = useUnsavedGuard({
647
645
  <span
648
646
  v-if="isRetracted(f)"
649
647
  data-testid="pr-review-finding-retracted"
650
- class="rounded bg-rose-500/15 px-1.5 py-0.5 text-[10px] font-semibold uppercase text-rose-300 ring-1 ring-rose-500/30"
648
+ class="rounded bg-app-error-500/15 px-1.5 py-0.5 text-[10px] font-semibold uppercase text-app-error-300 ring-1 ring-app-error-500/30"
651
649
  >
652
650
  {{ t('prReview.challenge.retractedBadge') }}
653
651
  </span>
654
652
  <span
655
653
  v-else-if="isAmended(f)"
656
654
  data-testid="pr-review-finding-amended"
657
- class="rounded bg-sky-500/15 px-1.5 py-0.5 text-[10px] font-semibold uppercase text-sky-300 ring-1 ring-sky-500/30"
655
+ class="rounded bg-app-info-500/15 px-1.5 py-0.5 text-[10px] font-semibold uppercase text-app-info-300 ring-1 ring-app-info-500/30"
658
656
  >
659
657
  {{ t('prReview.challenge.strengthenedBadge') }}
660
658
  </span>
661
659
  <span
662
660
  v-else-if="isUpheld(f)"
663
661
  data-testid="pr-review-finding-upheld"
664
- class="rounded bg-emerald-500/15 px-1.5 py-0.5 text-[10px] font-semibold uppercase text-emerald-300 ring-1 ring-emerald-500/30"
662
+ class="rounded bg-app-success-500/15 px-1.5 py-0.5 text-[10px] font-semibold uppercase text-app-success-300 ring-1 ring-app-success-500/30"
665
663
  >
666
664
  {{ t('prReview.challenge.upheldBadge') }}
667
665
  </span>
668
666
  <span
669
667
  v-else-if="isChallengeFailed(f)"
670
668
  data-testid="pr-review-finding-challenge-failed"
671
- class="rounded bg-amber-500/15 px-1.5 py-0.5 text-[10px] font-semibold uppercase text-amber-300 ring-1 ring-amber-500/30"
669
+ class="rounded bg-app-warning-500/15 px-1.5 py-0.5 text-[10px] font-semibold uppercase text-app-warning-300 ring-1 ring-app-warning-500/30"
672
670
  >
673
671
  {{ t('prReview.challenge.failedBadge') }}
674
672
  </span>
675
673
  <span
676
674
  v-else-if="isInvestigating(f)"
677
675
  data-testid="pr-review-finding-investigating"
678
- class="flex items-center gap-1 rounded bg-indigo-500/15 px-1.5 py-0.5 text-[10px] font-semibold uppercase text-indigo-300 ring-1 ring-indigo-500/30"
676
+ class="flex items-center gap-1 rounded bg-primary/15 px-1.5 py-0.5 text-[10px] font-semibold uppercase text-primary ring-1 ring-primary/30"
679
677
  >
680
678
  <UIcon name="i-lucide-loader-circle" class="h-3 w-3 animate-spin" />
681
679
  {{ t('prReview.challenge.investigatingBadge') }}
682
680
  </span>
683
681
  <h4
684
- class="min-w-0 flex-1 text-[13px] font-medium text-slate-100"
682
+ class="min-w-0 flex-1 text-[13px] font-medium text-app-100"
685
683
  :class="isRetracted(f) ? 'line-through' : ''"
686
684
  >
687
685
  {{ f.title }}
688
686
  </h4>
689
687
  </div>
690
- <p class="mt-0.5 text-[11px] text-slate-500">
688
+ <p class="mt-0.5 text-[11px] text-dimmed">
691
689
  {{ f.path
692
690
  }}<template v-if="f.line != null">
693
691
  · {{ t('prReview.line', { line: f.line }) }}</template
@@ -703,7 +701,7 @@ const { requestClose } = useUnsavedGuard({
703
701
  <MarkdownProse
704
702
  v-if="f.detail"
705
703
  :text="f.detail"
706
- class="mt-1 max-w-3xl text-[12px] text-slate-300"
704
+ class="mt-1 max-w-3xl text-[12px] text-toned"
707
705
  :class="isRetracted(f) ? 'line-through' : ''"
708
706
  />
709
707
  <!-- The suggested fix is a VALUE a human copies (a patch line, a command, a
@@ -713,9 +711,9 @@ const { requestClose } = useUnsavedGuard({
713
711
  failure summary is left alone. -->
714
712
  <p
715
713
  v-if="f.suggestedFix"
716
- class="mt-1 max-w-3xl whitespace-pre-wrap rounded-md bg-slate-800/50 px-2 py-1 text-[11px] text-slate-300"
714
+ class="mt-1 max-w-3xl whitespace-pre-wrap rounded-md bg-elevated/50 px-2 py-1 text-[11px] text-toned"
717
715
  >
718
- <span class="text-slate-500">{{ t('prReview.suggestedFix') }}</span>
716
+ <span class="text-dimmed">{{ t('prReview.suggestedFix') }}</span>
719
717
  {{ f.suggestedFix }}
720
718
  </p>
721
719
 
@@ -727,10 +725,10 @@ const { requestClose } = useUnsavedGuard({
727
725
  class="mt-1.5 max-w-3xl rounded-md px-2 py-1 text-[11px]"
728
726
  :class="
729
727
  isRetracted(f)
730
- ? 'bg-rose-500/10 text-rose-200'
728
+ ? 'bg-app-error-500/10 text-app-error-200'
731
729
  : isChallengeFailed(f)
732
- ? 'bg-amber-500/10 text-amber-200'
733
- : 'bg-sky-500/10 text-sky-200'
730
+ ? 'bg-app-warning-500/10 text-app-warning-200'
731
+ : 'bg-app-info-500/10 text-app-info-200'
734
732
  "
735
733
  >
736
734
  <!-- A label that used to prefix its value inline now heads the block the
@@ -752,7 +750,7 @@ const { requestClose } = useUnsavedGuard({
752
750
  <button
753
751
  v-if="!isRetracted(f)"
754
752
  data-testid="pr-review-finding-challenge"
755
- class="flex items-center gap-1 text-indigo-300 hover:underline disabled:opacity-50"
753
+ class="flex items-center gap-1 text-primary hover:underline disabled:opacity-50"
756
754
  :disabled="!canResolve || !access.canExecuteRuns.value"
757
755
  @click="openChallenge(f.id)"
758
756
  >
@@ -765,7 +763,7 @@ const { requestClose } = useUnsavedGuard({
765
763
  </button>
766
764
  <button
767
765
  data-testid="pr-review-finding-dismiss"
768
- class="flex items-center gap-1 text-slate-400 hover:text-rose-300 hover:underline disabled:opacity-50"
766
+ class="flex items-center gap-1 text-muted hover:text-app-error-300 hover:underline disabled:opacity-50"
769
767
  :disabled="!canResolve || !access.canExecuteRuns.value"
770
768
  @click="onDismiss(f.id)"
771
769
  >
@@ -778,28 +776,28 @@ const { requestClose } = useUnsavedGuard({
778
776
  <div
779
777
  v-if="challengeForId === f.id"
780
778
  data-testid="pr-review-challenge-box"
781
- class="mt-2 rounded-md border border-indigo-500/40 bg-slate-900/80 p-2"
779
+ class="mt-2 rounded-md border border-primary/40 bg-default/80 p-2"
782
780
  >
783
781
  <textarea
784
782
  v-model="challengeText"
785
783
  data-testid="pr-review-challenge-input"
786
784
  rows="2"
787
785
  :placeholder="t('prReview.challenge.placeholder')"
788
- class="w-full resize-y rounded border border-slate-700 bg-slate-950/60 px-2 py-1 text-[12px] text-slate-200 outline-none focus:border-indigo-500"
786
+ class="w-full resize-y rounded border border-muted bg-app-950/60 px-2 py-1 text-[12px] text-default outline-none focus:border-primary"
789
787
  />
790
- <p class="mt-1 text-[10px] text-slate-500">
788
+ <p class="mt-1 text-[10px] text-dimmed">
791
789
  {{ t('prReview.challenge.hint') }}
792
790
  </p>
793
791
  <div class="mt-1.5 flex justify-end gap-2">
794
792
  <button
795
- class="rounded px-2 py-1 text-[11px] text-slate-400 hover:text-slate-200"
793
+ class="rounded px-2 py-1 text-[11px] text-muted hover:text-default"
796
794
  @click="cancelChallenge"
797
795
  >
798
796
  {{ t('common.cancel') }}
799
797
  </button>
800
798
  <button
801
799
  data-testid="pr-review-challenge-submit"
802
- class="rounded bg-indigo-500/80 px-2 py-1 text-[11px] font-medium text-white hover:bg-indigo-500 disabled:opacity-50"
800
+ class="rounded bg-primary/80 px-2 py-1 text-[11px] font-medium text-inverted hover:bg-primary/90 disabled:opacity-50"
803
801
  :disabled="!canResolve"
804
802
  @click="submitChallenge(f.id)"
805
803
  >
@@ -821,7 +819,7 @@ const { requestClose } = useUnsavedGuard({
821
819
  <aside
822
820
  v-if="step"
823
821
  data-testid="pr-review-run-meta"
824
- class="hidden w-60 shrink-0 flex-col gap-4 overflow-y-auto border-s border-slate-800 bg-slate-900/50 px-4 py-4 lg:flex"
822
+ class="hidden w-60 shrink-0 flex-col gap-4 overflow-y-auto border-s border-default bg-default/50 px-4 py-4 lg:flex"
825
823
  >
826
824
  <StepRunMeta
827
825
  :step="step"
@@ -837,7 +835,7 @@ const { requestClose } = useUnsavedGuard({
837
835
  <!-- Footer -->
838
836
  <footer
839
837
  v-if="awaiting"
840
- class="flex items-center justify-end gap-2 border-t border-slate-800 px-5 py-3"
838
+ class="flex items-center justify-end gap-2 border-t border-default px-5 py-3"
841
839
  >
842
840
  <UButton
843
841
  color="neutral"
@@ -45,16 +45,16 @@ function go(action: () => void) {
45
45
  <i18n-t
46
46
  keypath="providers.presetMismatch.intro"
47
47
  tag="p"
48
- class="text-sm text-slate-300"
48
+ class="text-sm text-toned"
49
49
  scope="global"
50
50
  >
51
51
  <template #name>
52
- <span class="font-medium text-slate-100">{{ presetName }}</span>
52
+ <span class="font-medium text-app-100">{{ presetName }}</span>
53
53
  </template>
54
54
  </i18n-t>
55
55
 
56
- <div class="rounded-lg border border-slate-700 bg-slate-900/50 p-3">
57
- <p class="mb-1.5 text-[11px] font-semibold uppercase tracking-wide text-slate-500">
56
+ <div class="rounded-lg border border-muted bg-default/50 p-3">
57
+ <p class="mb-1.5 text-[11px] font-semibold uppercase tracking-wide text-dimmed">
58
58
  {{ t('providers.presetMismatch.unavailable') }}
59
59
  </p>
60
60
  <div class="flex flex-wrap gap-1.5">
@@ -70,7 +70,7 @@ function go(action: () => void) {
70
70
  </div>
71
71
  </div>
72
72
 
73
- <p class="text-[13px] text-slate-400">
73
+ <p class="text-[13px] text-muted">
74
74
  {{ t('providers.presetMismatch.advice') }}
75
75
  </p>
76
76
 
@@ -77,11 +77,11 @@ const routes = computed<Route[]>(() => [
77
77
  <template #body>
78
78
  <div class="space-y-5">
79
79
  <div
80
- class="flex items-start gap-3 rounded-lg border border-amber-500/40 bg-amber-950/40 p-4"
80
+ class="flex items-start gap-3 rounded-lg border border-app-warning-500/40 bg-app-warning-950/40 p-4"
81
81
  >
82
- <UIcon name="i-lucide-cpu" class="mt-0.5 h-6 w-6 shrink-0 text-amber-400" />
83
- <div class="min-w-0 text-sm text-amber-100/90">
84
- <p class="font-medium text-amber-100">
82
+ <UIcon name="i-lucide-cpu" class="mt-0.5 h-6 w-6 shrink-0 text-app-warning-400" />
83
+ <div class="min-w-0 text-sm text-app-warning-100/90">
84
+ <p class="font-medium text-app-warning-100">
85
85
  {{ t('providers.onboarding.noModelTitle') }}
86
86
  </p>
87
87
  <p class="mt-1">
@@ -94,17 +94,17 @@ const routes = computed<Route[]>(() => [
94
94
  <div
95
95
  v-for="r in routes"
96
96
  :key="r.title"
97
- class="flex items-start gap-3 rounded-xl border border-slate-700 bg-slate-900/50 p-4"
97
+ class="flex items-start gap-3 rounded-xl border border-muted bg-default/50 p-4"
98
98
  >
99
- <UIcon :name="r.icon" class="mt-0.5 h-5 w-5 shrink-0 text-indigo-300" />
99
+ <UIcon :name="r.icon" class="mt-0.5 h-5 w-5 shrink-0 text-primary" />
100
100
  <div class="min-w-0 flex-1">
101
101
  <div class="flex items-center gap-2">
102
- <p class="text-sm font-semibold text-slate-100">{{ r.title }}</p>
102
+ <p class="text-sm font-semibold text-app-100">{{ r.title }}</p>
103
103
  <UBadge v-if="r.badge" color="primary" variant="subtle" size="sm">
104
104
  {{ r.badge }}
105
105
  </UBadge>
106
106
  </div>
107
- <p class="mt-0.5 text-[13px] leading-relaxed text-slate-400">{{ r.body }}</p>
107
+ <p class="mt-0.5 text-[13px] leading-relaxed text-muted">{{ r.body }}</p>
108
108
  </div>
109
109
  <UButton
110
110
  size="sm"
@@ -118,7 +118,7 @@ const routes = computed<Route[]>(() => [
118
118
  </div>
119
119
  </div>
120
120
 
121
- <p class="text-[11px] leading-relaxed text-slate-500">
121
+ <p class="text-[11px] leading-relaxed text-dimmed">
122
122
  {{ t('providers.onboarding.operatorNote') }}
123
123
  </p>
124
124
  </div>