@cat-factory/app 0.302.2 → 0.303.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (328) hide show
  1. package/README.md +99 -14
  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 +26 -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 +10 -9
@@ -207,8 +207,8 @@ const CLASS_HINTS = computed<Record<FindingClass, string>>(() => ({
207
207
  practice: t('requirements.findingClass.practiceHint'),
208
208
  }))
209
209
  const CLASS_LABEL_COLOR = {
210
- judgement: 'text-amber-300',
211
- practice: 'text-sky-300',
210
+ judgement: 'text-app-warning-300',
211
+ practice: 'text-app-info-300',
212
212
  } as const satisfies Record<FindingClass, string>
213
213
 
214
214
  // How sure the Writer says it is. Shown on every suggestion, because the confidence is what an
@@ -449,9 +449,9 @@ const ATTENTION_LABELS = computed<Record<FindingAttention, string>>(() => ({
449
449
  settled: t('requirements.group.settled'),
450
450
  }))
451
451
  const ATTENTION_LABEL_COLOR = {
452
- action: 'text-amber-300',
453
- waiting: 'text-indigo-300',
454
- settled: 'text-slate-500',
452
+ action: 'text-app-warning-300',
453
+ waiting: 'text-primary',
454
+ settled: 'text-dimmed',
455
455
  } as const satisfies Record<FindingAttention, string>
456
456
  // Whether a finding's recorded reply is the human's OWN answer (vs an untouched auto-generated
457
457
  // recommended default). Drives the "User answered" marker on the Answer option.
@@ -699,7 +699,7 @@ async function resolveExceeded(choice: 'extra-round' | 'proceed' | 'stop-reset')
699
699
  <ResultWindowShell
700
700
  :open="open"
701
701
  icon="i-lucide-clipboard-check"
702
- icon-class="bg-indigo-500/15 text-indigo-300"
702
+ icon-class="bg-primary/15 text-primary"
703
703
  :title="t('requirements.title')"
704
704
  :subtitle="block?.title"
705
705
  :step-ref="{ instanceId, stepIndex }"
@@ -716,31 +716,26 @@ async function resolveExceeded(choice: 'extra-round' | 'proceed' | 'stop-reset')
716
716
  <div class="flex min-h-0 flex-1 flex-col lg:flex-row">
717
717
  <!-- main column -->
718
718
  <div class="min-w-0 flex-1 overflow-y-auto px-6 py-5">
719
- <i18n-t
720
- keypath="requirements.intro"
721
- tag="p"
722
- class="mb-4 text-sm text-slate-400"
723
- scope="global"
724
- >
719
+ <i18n-t keypath="requirements.intro" tag="p" class="mb-4 text-sm text-muted" scope="global">
725
720
  <template #level>{{ block?.level ?? t('requirements.levelFallback') }}</template>
726
721
  <template #answer
727
- ><span class="text-slate-300">{{ t('requirements.answerVerb') }}</span></template
722
+ ><span class="text-toned">{{ t('requirements.answerVerb') }}</span></template
728
723
  >
729
724
  <template #dismiss
730
- ><span class="text-slate-300">{{ t('requirements.dismissVerb') }}</span></template
725
+ ><span class="text-toned">{{ t('requirements.dismissVerb') }}</span></template
731
726
  >
732
727
  </i18n-t>
733
728
 
734
729
  <!-- Why the findings never ask a technical question: this gate settles the
735
730
  product/business layer, and the architect/researcher steps settle the rest.
736
731
  Without this a reader reads the missing technical questions as an oversight. -->
737
- <p class="mb-4 text-xs text-slate-500">{{ t('requirements.scopeNote') }}</p>
732
+ <p class="mb-4 text-xs text-dimmed">{{ t('requirements.scopeNote') }}</p>
738
733
 
739
734
  <!-- empty state — the reviewer runs automatically as the first pipeline
740
735
  gate step, so there's nothing to do here until then -->
741
736
  <div
742
737
  v-if="!review && !busy && !loading"
743
- class="rounded-lg border border-dashed border-slate-700 p-8 text-center text-sm text-slate-500"
738
+ class="rounded-lg border border-dashed border-muted p-8 text-center text-sm text-dimmed"
744
739
  >
745
740
  {{ t('requirements.empty') }}
746
741
  </div>
@@ -748,7 +743,7 @@ async function resolveExceeded(choice: 'extra-round' | 'proceed' | 'stop-reset')
748
743
  <!-- working state (initial fetch on open, or a reviewer pass running) -->
749
744
  <div
750
745
  v-else-if="(busy || loading) && !review"
751
- class="flex items-center justify-center gap-2 p-8 text-sm text-slate-400"
746
+ class="flex items-center justify-center gap-2 p-8 text-sm text-muted"
752
747
  >
753
748
  <UIcon name="i-lucide-loader-circle" class="h-4 w-4 animate-spin" />
754
749
  {{ loading && !busy ? t('requirements.loadingReview') : t('requirements.reviewing') }}
@@ -758,7 +753,7 @@ async function resolveExceeded(choice: 'extra-round' | 'proceed' | 'stop-reset')
758
753
  <!-- converged: reviewer satisfied -->
759
754
  <div
760
755
  v-if="incorporated"
761
- class="mb-4 flex items-center gap-2 rounded-lg border border-emerald-900/60 bg-emerald-950/30 p-4 text-sm text-emerald-300"
756
+ class="mb-4 flex items-center gap-2 rounded-lg border border-app-success-900/60 bg-app-success-950/30 p-4 text-sm text-app-success-300"
762
757
  data-testid="requirements-settled"
763
758
  >
764
759
  <UIcon name="i-lucide-circle-check" class="h-5 w-5 shrink-0" />
@@ -779,7 +774,7 @@ async function resolveExceeded(choice: 'extra-round' | 'proceed' | 'stop-reset')
779
774
  the human can see which of the two LLM calls is currently in progress. -->
780
775
  <div
781
776
  v-else-if="working"
782
- class="mb-4 flex items-center gap-2 rounded-lg border border-indigo-900/60 bg-indigo-950/30 p-4 text-sm text-indigo-200"
777
+ class="mb-4 flex items-center gap-2 rounded-lg border border-primary/60 bg-primary/10 p-4 text-sm text-primary"
783
778
  >
784
779
  <UIcon name="i-lucide-loader-circle" class="h-5 w-5 shrink-0 animate-spin" />
785
780
  <span v-if="incorporating">
@@ -809,9 +804,9 @@ async function resolveExceeded(choice: 'extra-round' | 'proceed' | 'stop-reset')
809
804
  >
810
805
  {{ CLASS_LABELS[group] }}
811
806
  </span>
812
- <span class="h-px flex-1 bg-slate-700" />
807
+ <span class="h-px flex-1 bg-accented" />
813
808
  </div>
814
- <p class="mt-0.5 text-[11px] text-slate-500">{{ CLASS_HINTS[group] }}</p>
809
+ <p class="mt-0.5 text-[11px] text-dimmed">{{ CLASS_HINTS[group] }}</p>
815
810
  </div>
816
811
  <div v-if="startsAttentionGroup(index)" class="flex items-center gap-2 pt-1">
817
812
  <span
@@ -820,10 +815,10 @@ async function resolveExceeded(choice: 'extra-round' | 'proceed' | 'stop-reset')
820
815
  >
821
816
  {{ ATTENTION_LABELS[attention] }}
822
817
  </span>
823
- <span class="h-px flex-1 bg-slate-800" />
818
+ <span class="h-px flex-1 bg-elevated" />
824
819
  </div>
825
820
  <div
826
- class="rounded-lg border border-slate-800 bg-slate-900/60 p-3"
821
+ class="rounded-lg border border-default bg-default/60 p-3"
827
822
  :class="{ 'opacity-60': item.status === 'dismissed' }"
828
823
  data-testid="requirements-finding"
829
824
  :data-finding-status="item.status"
@@ -832,11 +827,11 @@ async function resolveExceeded(choice: 'extra-round' | 'proceed' | 'stop-reset')
832
827
  <div class="flex items-start gap-2">
833
828
  <UIcon
834
829
  :name="CATEGORY_ICON[item.category]"
835
- class="mt-0.5 h-4 w-4 shrink-0 text-slate-400"
830
+ class="mt-0.5 h-4 w-4 shrink-0 text-muted"
836
831
  />
837
832
  <div class="min-w-0 flex-1">
838
833
  <div class="flex flex-wrap items-center gap-1.5">
839
- <span class="text-sm font-medium text-white">{{ item.title }}</span>
834
+ <span class="text-sm font-medium text-highlighted">{{ item.title }}</span>
840
835
  <UBadge size="xs" variant="subtle" :color="SEVERITY_COLOR[item.severity]">
841
836
  {{ SEVERITY_LABELS[item.severity] }}
842
837
  </UBadge>
@@ -868,7 +863,7 @@ async function resolveExceeded(choice: 'extra-round' | 'proceed' | 'stop-reset')
868
863
  card around it takes the span (see the shell's `width` prop: the unit is
869
864
  the paragraph, not the section). The badge row above and the mode buttons
870
865
  and textarea below are what the full width is actually for. -->
871
- <p class="mt-1 max-w-3xl whitespace-pre-line text-sm text-slate-400">
866
+ <p class="mt-1 max-w-3xl whitespace-pre-line text-sm text-muted">
872
867
  {{ item.detail }}
873
868
  </p>
874
869
 
@@ -876,9 +871,9 @@ async function resolveExceeded(choice: 'extra-round' | 'proceed' | 'stop-reset')
876
871
  ones the answer lives in the textarea below, seeded from the reply) -->
877
872
  <div
878
873
  v-if="item.reply && item.status !== 'open' && item.status !== 'answered'"
879
- class="mt-2 max-w-3xl rounded-md border-s-2 border-slate-700 bg-slate-950/40 px-3 py-1.5 text-sm text-slate-300"
874
+ class="mt-2 max-w-3xl rounded-md border-s-2 border-muted bg-app-950/40 px-3 py-1.5 text-sm text-toned"
880
875
  >
881
- <span class="text-[10px] uppercase tracking-wide text-slate-500">
876
+ <span class="text-[10px] uppercase tracking-wide text-dimmed">
882
877
  {{ t('requirements.answerLabel') }}
883
878
  </span>
884
879
  <p class="whitespace-pre-line">{{ item.reply }}</p>
@@ -906,7 +901,7 @@ async function resolveExceeded(choice: 'extra-round' | 'proceed' | 'stop-reset')
906
901
  <UIcon
907
902
  v-if="opt.mode === 'answer' && isUserAnswered(item)"
908
903
  name="i-lucide-check"
909
- class="h-3.5 w-3.5 text-emerald-400"
904
+ class="h-3.5 w-3.5 text-app-success-400"
910
905
  />
911
906
  </UButton>
912
907
  </div>
@@ -917,7 +912,7 @@ async function resolveExceeded(choice: 'extra-round' | 'proceed' | 'stop-reset')
917
912
  answer; the human can keep it, edit it, or switch modes. -->
918
913
  <div
919
914
  v-if="autoDefaults.get(item.id)"
920
- class="mt-2 flex flex-wrap items-center gap-1.5 text-xs text-indigo-300"
915
+ class="mt-2 flex flex-wrap items-center gap-1.5 text-xs text-primary"
921
916
  >
922
917
  <UIcon name="i-lucide-sparkles" class="h-3.5 w-3.5 shrink-0" />
923
918
  <span>{{ t('requirements.recommendedDefault') }}</span>
@@ -969,7 +964,7 @@ async function resolveExceeded(choice: 'extra-round' | 'proceed' | 'stop-reset')
969
964
  />
970
965
  <p
971
966
  v-if="isUserAnswered(item)"
972
- class="mt-1 flex items-center gap-1 text-[11px] text-emerald-400"
967
+ class="mt-1 flex items-center gap-1 text-[11px] text-app-success-400"
973
968
  >
974
969
  <UIcon name="i-lucide-check" class="h-3 w-3 shrink-0" />
975
970
  {{ t('requirements.userAnswered') }}
@@ -981,7 +976,7 @@ async function resolveExceeded(choice: 'extra-round' | 'proceed' | 'stop-reset')
981
976
  <template v-else-if="modeFor(item) === 'recommend'">
982
977
  <div
983
978
  v-if="pendingRecFor(item)"
984
- class="mt-2 flex items-center gap-1.5 text-xs text-indigo-300"
979
+ class="mt-2 flex items-center gap-1.5 text-xs text-primary"
985
980
  >
986
981
  <UIcon name="i-lucide-loader-circle" class="h-3.5 w-3.5 animate-spin" />
987
982
  {{ t('requirements.generatingSuggestion') }}
@@ -990,7 +985,7 @@ async function resolveExceeded(choice: 'extra-round' | 'proceed' | 'stop-reset')
990
985
  <div
991
986
  v-for="rec in [readyRecFor(item)!]"
992
987
  :key="rec.id"
993
- class="mt-2 rounded-lg border border-indigo-900/50 bg-indigo-950/20 p-3"
988
+ class="mt-2 rounded-lg border border-primary/50 bg-primary/10 p-3"
994
989
  >
995
990
  <UBadge
996
991
  v-if="rec.groundedInFragment"
@@ -1026,7 +1021,7 @@ async function resolveExceeded(choice: 'extra-round' | 'proceed' | 'stop-reset')
1026
1021
  </UBadge>
1027
1022
  <!-- The Writer's suggested answer — agent prose, so it takes the
1028
1023
  measure like the finding's own question above it. -->
1029
- <p class="mt-1 max-w-3xl whitespace-pre-line text-sm text-slate-300">
1024
+ <p class="mt-1 max-w-3xl whitespace-pre-line text-sm text-toned">
1030
1025
  {{ rec.recommendedText }}
1031
1026
  </p>
1032
1027
  <div class="mt-2 flex flex-wrap items-center gap-2">
@@ -1098,7 +1093,7 @@ async function resolveExceeded(choice: 'extra-round' | 'proceed' | 'stop-reset')
1098
1093
  :placeholder="t('requirements.guidancePlaceholder')"
1099
1094
  :disabled="frozen"
1100
1095
  />
1101
- <p class="mt-1 flex items-center gap-1 text-[11px] text-indigo-300/80">
1096
+ <p class="mt-1 flex items-center gap-1 text-[11px] text-primary/80">
1102
1097
  <UIcon name="i-lucide-wand-2" class="h-3 w-3 shrink-0" />
1103
1098
  {{ t('requirements.guidanceHint') }}
1104
1099
  </p>
@@ -1106,7 +1101,7 @@ async function resolveExceeded(choice: 'extra-round' | 'proceed' | 'stop-reset')
1106
1101
  </template>
1107
1102
 
1108
1103
  <!-- DISMISS: nothing to fill in — a short note explains the effect -->
1109
- <p v-else class="mt-2 text-[11px] text-slate-500">
1104
+ <p v-else class="mt-2 text-[11px] text-dimmed">
1110
1105
  {{ t('requirements.dismissedHint') }}
1111
1106
  </p>
1112
1107
  </template>
@@ -1119,9 +1114,9 @@ async function resolveExceeded(choice: 'extra-round' | 'proceed' | 'stop-reset')
1119
1114
  <!-- incorporated document: the standard-format requirements. The whole section
1120
1115
  collapses as a unit (a long doc otherwise pushes the findings/recommendations
1121
1116
  off-screen); the per-heading toggles below still work when it's expanded. -->
1122
- <section v-if="outline" class="mt-6 border-t border-slate-800 pt-5">
1117
+ <section v-if="outline" class="mt-6 border-t border-default pt-5">
1123
1118
  <button
1124
- class="mb-3 flex w-full items-center gap-1.5 text-[11px] text-emerald-400"
1119
+ class="mb-3 flex w-full items-center gap-1.5 text-[11px] text-app-success-400"
1125
1120
  @click="toggleDoc"
1126
1121
  >
1127
1122
  <UIcon
@@ -1151,18 +1146,18 @@ async function resolveExceeded(choice: 'extra-round' | 'proceed' | 'stop-reset')
1151
1146
  >
1152
1147
  <UIcon
1153
1148
  name="i-lucide-chevron-right"
1154
- class="h-3.5 w-3.5 shrink-0 text-slate-500 transition-transform"
1149
+ class="h-3.5 w-3.5 shrink-0 text-dimmed transition-transform"
1155
1150
  :class="collapsed[s.id] ? '' : 'rotate-90'"
1156
1151
  />
1157
1152
  <span
1158
- class="font-semibold text-white"
1153
+ class="font-semibold text-highlighted"
1159
1154
  :class="s.depth <= 1 ? 'text-base' : s.depth === 2 ? 'text-sm' : 'text-xs'"
1160
1155
  v-html="s.titleHtml"
1161
1156
  />
1162
1157
  </button>
1163
1158
  <div
1164
1159
  v-show="!s.title || !collapsed[s.id]"
1165
- class="reader-prose mt-1 ps-5.5 text-[13px] leading-relaxed text-slate-300"
1160
+ class="reader-prose mt-1 ps-5.5 text-[13px] leading-relaxed text-toned"
1166
1161
  v-html="s.bodyHtml"
1167
1162
  />
1168
1163
  </div>
@@ -1176,29 +1171,27 @@ async function resolveExceeded(choice: 'extra-round' | 'proceed' | 'stop-reset')
1176
1171
  tablet, UX-32). The informational stats collapse away below `lg` to keep the
1177
1172
  bottom bar compact; the actions themselves always show. -->
1178
1173
  <aside
1179
- class="flex w-full shrink-0 flex-col border-t border-slate-800 lg:w-72 lg:border-s lg:border-t-0"
1174
+ class="flex w-full shrink-0 flex-col border-t border-default lg:w-72 lg:border-s lg:border-t-0"
1180
1175
  >
1181
1176
  <div class="flex flex-col gap-4 px-4 py-5">
1182
- <div v-if="review" class="hidden space-y-2 text-xs text-slate-400 lg:block">
1177
+ <div v-if="review" class="hidden space-y-2 text-xs text-muted lg:block">
1183
1178
  <div class="flex items-center justify-between">
1184
1179
  <span>{{ t('requirements.stats.findings') }}</span>
1185
- <span class="text-slate-300">{{ review.items.length }}</span>
1180
+ <span class="text-toned">{{ review.items.length }}</span>
1186
1181
  </div>
1187
1182
  <div class="flex items-center justify-between">
1188
1183
  <span>{{ t('requirements.stats.open') }}</span>
1189
- <span class="text-slate-300">{{ openCount }}</span>
1184
+ <span class="text-toned">{{ openCount }}</span>
1190
1185
  </div>
1191
1186
  <div class="flex items-center justify-between">
1192
1187
  <span>{{ t('requirements.stats.answered') }}</span>
1193
- <span class="text-slate-300">{{ answeredCount }}</span>
1188
+ <span class="text-toned">{{ answeredCount }}</span>
1194
1189
  </div>
1195
1190
  <!-- awaited recommendations — kept here (always visible) so the human can see what
1196
1191
  the Writer is still producing / what's waiting on them even while reading the
1197
1192
  incorporated document or acting elsewhere in the window. -->
1198
1193
  <template v-if="generatingRecommendations.length || readyRecommendations.length">
1199
- <div
1200
- class="flex items-center gap-1.5 border-t border-slate-800/60 pt-2 text-indigo-300"
1201
- >
1194
+ <div class="flex items-center gap-1.5 border-t border-default/60 pt-2 text-primary">
1202
1195
  <UIcon name="i-lucide-wand-2" class="h-3 w-3" />
1203
1196
  <span class="font-medium">{{ t('requirements.stats.recommendations') }}</span>
1204
1197
  </div>
@@ -1207,16 +1200,16 @@ async function resolveExceeded(choice: 'extra-round' | 'proceed' | 'stop-reset')
1207
1200
  class="flex items-center justify-between"
1208
1201
  >
1209
1202
  <span>{{ t('requirements.stats.recsGenerating') }}</span>
1210
- <span class="text-indigo-300">{{ generatingRecommendations.length }}</span>
1203
+ <span class="text-primary">{{ generatingRecommendations.length }}</span>
1211
1204
  </div>
1212
1205
  <div v-if="readyRecommendations.length" class="flex items-center justify-between">
1213
1206
  <span>{{ t('requirements.stats.recsToReview') }}</span>
1214
- <span class="text-indigo-300">{{ readyRecommendations.length }}</span>
1207
+ <span class="text-primary">{{ readyRecommendations.length }}</span>
1215
1208
  </div>
1216
1209
  </template>
1217
1210
  <div v-if="review.model" class="flex items-center justify-between">
1218
1211
  <span>{{ t('requirements.stats.model') }}</span>
1219
- <span class="truncate ps-2 text-slate-500">{{
1212
+ <span class="truncate ps-2 text-dimmed">{{
1220
1213
  models.labelForRef(review.model) ?? review.model
1221
1214
  }}</span>
1222
1215
  </div>
@@ -1230,7 +1223,7 @@ async function resolveExceeded(choice: 'extra-round' | 'proceed' | 'stop-reset')
1230
1223
  on the cap decision and a fresh recommendation batch has no path to settle). -->
1231
1224
  <div
1232
1225
  v-if="review && pendingRecommendRequests.length > 0 && (status === 'ready' || merged)"
1233
- class="border-t border-slate-800 pt-4"
1226
+ class="border-t border-default pt-4"
1234
1227
  >
1235
1228
  <UButton
1236
1229
  color="primary"
@@ -1254,7 +1247,7 @@ async function resolveExceeded(choice: 'extra-round' | 'proceed' | 'stop-reset')
1254
1247
  </div>
1255
1248
 
1256
1249
  <!-- action: ready (answer → incorporate / proceed) -->
1257
- <div v-if="review && status === 'ready'" class="space-y-2 border-t border-slate-800 pt-4">
1250
+ <div v-if="review && status === 'ready'" class="space-y-2 border-t border-default pt-4">
1258
1251
  <UButton
1259
1252
  v-if="canProceed"
1260
1253
  color="primary"
@@ -1284,7 +1277,7 @@ async function resolveExceeded(choice: 'extra-round' | 'proceed' | 'stop-reset')
1284
1277
  >
1285
1278
  {{ t('requirements.actions.incorporateAnswers') }}
1286
1279
  </UButton>
1287
- <p class="text-[11px] leading-relaxed text-slate-500">
1280
+ <p class="text-[11px] leading-relaxed text-dimmed">
1288
1281
  <template v-if="canProceed">
1289
1282
  {{ t('requirements.help.canProceed') }}
1290
1283
  </template>
@@ -1296,7 +1289,7 @@ async function resolveExceeded(choice: 'extra-round' | 'proceed' | 'stop-reset')
1296
1289
  </div>
1297
1290
 
1298
1291
  <!-- action: merged (inspect → re-review / redo) -->
1299
- <div v-if="review && merged" class="space-y-2 border-t border-slate-800 pt-4">
1292
+ <div v-if="review && merged" class="space-y-2 border-t border-default pt-4">
1300
1293
  <UButton
1301
1294
  color="primary"
1302
1295
  size="sm"
@@ -1348,14 +1341,14 @@ async function resolveExceeded(choice: 'extra-round' | 'proceed' | 'stop-reset')
1348
1341
  {{ t('requirements.actions.redoWithDirection') }}
1349
1342
  </UButton>
1350
1343
  </div>
1351
- <p class="text-[11px] leading-relaxed text-slate-500">
1344
+ <p class="text-[11px] leading-relaxed text-dimmed">
1352
1345
  {{ t('requirements.help.merged') }}
1353
1346
  </p>
1354
1347
  </div>
1355
1348
 
1356
1349
  <div
1357
1350
  v-if="review && incorporated"
1358
- class="border-t border-slate-800 pt-4 text-[11px] leading-relaxed text-slate-500"
1351
+ class="border-t border-default pt-4 text-[11px] leading-relaxed text-dimmed"
1359
1352
  >
1360
1353
  {{ t('requirements.settledFooter') }}
1361
1354
  </div>
@@ -138,14 +138,14 @@ function choose(id: string) {
138
138
  @focusout="onPanelFocusOut"
139
139
  >
140
140
  <!-- left: selectable options, NAME ONLY -->
141
- <ul class="w-1/2 shrink-0 overflow-y-auto border-e border-slate-800 p-1">
141
+ <ul class="w-1/2 shrink-0 overflow-y-auto border-e border-default p-1">
142
142
  <li>
143
143
  <button
144
144
  type="button"
145
145
  class="flex w-full items-center gap-2 rounded px-2 py-1.5 text-start text-sm"
146
146
  :class="[
147
- refused.has('') ? 'cursor-not-allowed opacity-50' : 'hover:bg-slate-800/60',
148
- modelValue ? 'text-slate-300' : 'text-slate-100',
147
+ refused.has('') ? 'cursor-not-allowed opacity-50' : 'hover:bg-elevated/60',
148
+ modelValue ? 'text-toned' : 'text-app-100',
149
149
  ]"
150
150
  :aria-disabled="refused.has('')"
151
151
  :title="refusalText('')"
@@ -156,13 +156,13 @@ function choose(id: string) {
156
156
  >
157
157
  <UIcon
158
158
  :name="refused.has('') ? 'i-lucide-lock' : 'i-lucide-rotate-ccw'"
159
- class="h-4 w-4 shrink-0 text-slate-400"
159
+ class="h-4 w-4 shrink-0 text-muted"
160
160
  />
161
161
  <span class="flex-1 truncate">{{ noneLabel }}</span>
162
162
  <UIcon
163
163
  v-if="!modelValue"
164
164
  name="i-lucide-check"
165
- class="h-4 w-4 shrink-0 text-primary-400"
165
+ class="h-4 w-4 shrink-0 text-primary"
166
166
  />
167
167
  </button>
168
168
  </li>
@@ -171,8 +171,8 @@ function choose(id: string) {
171
171
  type="button"
172
172
  class="flex w-full items-center gap-2 rounded px-2 py-1.5 text-start text-sm"
173
173
  :class="[
174
- refused.has(p.id) ? 'cursor-not-allowed opacity-50' : 'hover:bg-slate-800/60',
175
- modelValue === p.id ? 'text-slate-100' : 'text-slate-300',
174
+ refused.has(p.id) ? 'cursor-not-allowed opacity-50' : 'hover:bg-elevated/60',
175
+ modelValue === p.id ? 'text-app-100' : 'text-toned',
176
176
  ]"
177
177
  :aria-disabled="refused.has(p.id)"
178
178
  :title="refusalText(p.id)"
@@ -183,13 +183,13 @@ function choose(id: string) {
183
183
  >
184
184
  <UIcon
185
185
  :name="refused.has(p.id) ? 'i-lucide-lock' : 'i-lucide-git-merge'"
186
- class="h-4 w-4 shrink-0 text-slate-400"
186
+ class="h-4 w-4 shrink-0 text-muted"
187
187
  />
188
188
  <span class="flex-1 truncate">{{ p.name }}</span>
189
189
  <UIcon
190
190
  v-if="modelValue === p.id"
191
191
  name="i-lucide-check"
192
- class="h-4 w-4 shrink-0 text-primary-400"
192
+ class="h-4 w-4 shrink-0 text-primary"
193
193
  />
194
194
  </button>
195
195
  </li>
@@ -200,20 +200,17 @@ function choose(id: string) {
200
200
  <template v-if="preview.policy">
201
201
  <p
202
202
  v-if="previewRefusal"
203
- class="mb-2 text-[11px] leading-snug text-amber-400"
203
+ class="mb-2 text-[11px] leading-snug text-app-warning-400"
204
204
  data-testid="risk-policy-refusal"
205
205
  >
206
206
  {{ t(`riskPolicy.picker.refused.${previewRefusal}`) }}
207
207
  </p>
208
- <p
209
- v-if="preview.viaWorkspaceDefault"
210
- class="mb-2 text-[11px] leading-snug text-slate-500"
211
- >
208
+ <p v-if="preview.viaWorkspaceDefault" class="mb-2 text-[11px] leading-snug text-dimmed">
212
209
  {{ t('riskPolicy.picker.workspaceDefaultCaption') }}
213
210
  </p>
214
211
  <RiskPolicyPreview :policy="preview.policy" />
215
212
  </template>
216
- <div v-else class="text-[12px] leading-snug text-slate-500">
213
+ <div v-else class="text-[12px] leading-snug text-dimmed">
217
214
  {{ t('riskPolicy.picker.noneHint') }}
218
215
  </div>
219
216
  </div>
@@ -48,7 +48,7 @@ const ceilings = computed(() =>
48
48
  <template>
49
49
  <div class="space-y-3" data-testid="risk-policy-preview">
50
50
  <div class="flex items-center gap-1.5">
51
- <span class="text-sm font-semibold text-slate-100">{{ policy.name }}</span>
51
+ <span class="text-sm font-semibold text-app-100">{{ policy.name }}</span>
52
52
  <UBadge v-if="policy.isDefault" size="sm" variant="soft" color="neutral">
53
53
  {{ t('riskPolicy.preview.defaultBadge') }}
54
54
  </UBadge>
@@ -56,7 +56,7 @@ const ceilings = computed(() =>
56
56
 
57
57
  <!-- the three ceilings, grouped under one heading that names what they are -->
58
58
  <div v-if="policy.autoMergeEnabled">
59
- <div class="mb-1 flex items-center gap-1 text-[10px] uppercase tracking-wide text-slate-500">
59
+ <div class="mb-1 flex items-center gap-1 text-[10px] uppercase tracking-wide text-dimmed">
60
60
  <UIcon name="i-lucide-git-merge" class="h-3 w-3" />
61
61
  {{ t('riskPolicy.preview.autoMergeHeading') }}
62
62
  </div>
@@ -64,51 +64,51 @@ const ceilings = computed(() =>
64
64
  <div
65
65
  v-for="c in ceilings"
66
66
  :key="c.axis"
67
- class="flex items-baseline justify-between gap-3 rounded bg-slate-800/70 px-1.5 py-0.5 text-[12px]"
67
+ class="flex items-baseline justify-between gap-3 rounded bg-elevated/70 px-1.5 py-0.5 text-[12px]"
68
68
  >
69
- <dt class="text-slate-300">{{ c.label }}</dt>
70
- <dd class="tabular-nums text-slate-100">
69
+ <dt class="text-toned">{{ c.label }}</dt>
70
+ <dd class="tabular-nums text-app-100">
71
71
  {{ t('riskPolicy.preview.ceiling', { value: n(c.max, { key: 'percent' }) }) }}
72
72
  </dd>
73
73
  </div>
74
74
  </dl>
75
- <p class="mt-1.5 text-[12px] leading-snug text-slate-400">
75
+ <p class="mt-1.5 text-[12px] leading-snug text-muted">
76
76
  {{ t('riskPolicy.preview.autoMergeExplainer') }}
77
77
  </p>
78
78
  </div>
79
79
  <div v-else>
80
- <div class="mb-1 flex items-center gap-1 text-[10px] uppercase tracking-wide text-slate-500">
80
+ <div class="mb-1 flex items-center gap-1 text-[10px] uppercase tracking-wide text-dimmed">
81
81
  <UIcon name="i-lucide-user-check" class="h-3 w-3" />
82
82
  {{ t('riskPolicy.preview.manualHeading') }}
83
83
  </div>
84
- <p class="text-[12px] leading-snug text-slate-400">
84
+ <p class="text-[12px] leading-snug text-muted">
85
85
  {{ t('riskPolicy.preview.manualExplainer') }}
86
86
  </p>
87
87
  </div>
88
88
 
89
89
  <!-- Who started the run changes what may land, on a policy that says so. -->
90
90
  <div v-if="roleLayer.any" data-testid="risk-policy-preview-roles">
91
- <div class="mb-1 flex items-center gap-1 text-[10px] uppercase tracking-wide text-slate-500">
91
+ <div class="mb-1 flex items-center gap-1 text-[10px] uppercase tracking-wide text-dimmed">
92
92
  <UIcon name="i-lucide-users" class="h-3 w-3" />
93
93
  {{ t('riskPolicy.preview.roleHeading') }}
94
94
  </div>
95
- <p v-if="roleLayer.sandboxed" class="text-[12px] leading-snug text-slate-400">
95
+ <p v-if="roleLayer.sandboxed" class="text-[12px] leading-snug text-muted">
96
96
  {{ t('riskPolicy.preview.roleSandboxed', { roles: roleLayer.sandboxed }) }}
97
97
  </p>
98
- <p v-if="roleLayer.scoped" class="text-[12px] leading-snug text-slate-400">
98
+ <p v-if="roleLayer.scoped" class="text-[12px] leading-snug text-muted">
99
99
  {{ t('riskPolicy.preview.roleScoped', { roles: roleLayer.scoped }) }}
100
100
  </p>
101
- <p v-if="roleLayer.narrowed" class="text-[12px] leading-snug text-slate-400">
101
+ <p v-if="roleLayer.narrowed" class="text-[12px] leading-snug text-muted">
102
102
  {{ t('riskPolicy.preview.roleNarrowed', { roles: roleLayer.narrowed }) }}
103
103
  </p>
104
104
  </div>
105
105
 
106
106
  <div>
107
- <div class="mb-1 flex items-center gap-1 text-[10px] uppercase tracking-wide text-slate-500">
107
+ <div class="mb-1 flex items-center gap-1 text-[10px] uppercase tracking-wide text-dimmed">
108
108
  <UIcon name="i-lucide-wrench" class="h-3 w-3" />
109
109
  {{ t('riskPolicy.preview.ciHeading') }}
110
110
  </div>
111
- <p class="text-[12px] leading-snug text-slate-400">
111
+ <p class="text-[12px] leading-snug text-muted">
112
112
  {{
113
113
  t('riskPolicy.preview.ciAttempts', { count: policy.ciMaxAttempts }, policy.ciMaxAttempts)
114
114
  }}