@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
@@ -51,18 +51,18 @@ function phaseLabel(outcome: ReproductionPhaseOutcome): string {
51
51
  class="space-y-2"
52
52
  data-testid="step-reproduction-report"
53
53
  :class="
54
- variant === 'card' ? 'scroll-mt-4 rounded-xl border border-slate-800 bg-slate-900/50 p-4' : ''
54
+ variant === 'card' ? 'scroll-mt-4 rounded-xl border border-default bg-default/50 p-4' : ''
55
55
  "
56
56
  >
57
57
  <div
58
58
  v-if="variant === 'card'"
59
- class="flex items-center gap-1.5 text-[11px] font-semibold uppercase tracking-wide text-slate-400"
59
+ class="flex items-center gap-1.5 text-[11px] font-semibold uppercase tracking-wide text-muted"
60
60
  >
61
61
  <UIcon :name="presentation.icon" class="h-3.5 w-3.5" />
62
62
  <span>{{ t('panels.stepDetail.reproduction.heading') }}</span>
63
63
  </div>
64
64
 
65
- <p class="text-[11px] text-slate-400" data-testid="reproduction-verdict">
65
+ <p class="text-[11px] text-muted" data-testid="reproduction-verdict">
66
66
  {{ t(presentation.verdict) }}
67
67
  </p>
68
68
 
@@ -70,27 +70,31 @@ function phaseLabel(outcome: ReproductionPhaseOutcome): string {
70
70
  trees can tell a test that misses the defect from a resumed run whose pre-fix tree already
71
71
  carried this step's own interrupted work, so re-deriving a cause from the exit codes here
72
72
  is exactly the inference that gets it wrong. -->
73
- <p v-if="report.note" class="text-[11px] text-amber-300" data-testid="reproduction-observation">
73
+ <p
74
+ v-if="report.note"
75
+ class="text-[11px] text-app-warning-300"
76
+ data-testid="reproduction-observation"
77
+ >
74
78
  {{ report.note }}
75
79
  </p>
76
80
 
77
81
  <!-- A structural infeasibility declaration: the reason, and what the agent verified instead.
78
82
  This is what keeps "could not be reproduced" from looking like "nobody tried". -->
79
83
  <template v-if="report.status === 'declared_infeasible'">
80
- <div v-if="report.reason" class="rounded-md border border-slate-800 bg-slate-950/40 p-2">
81
- <p class="text-[11px] font-semibold uppercase tracking-wide text-slate-400">
84
+ <div v-if="report.reason" class="rounded-md border border-default bg-app-950/40 p-2">
85
+ <p class="text-[11px] font-semibold uppercase tracking-wide text-muted">
82
86
  {{ t('panels.stepDetail.reproduction.reason') }}
83
87
  </p>
84
- <p class="mt-1 whitespace-pre-wrap text-[12px] text-slate-300">{{ report.reason }}</p>
88
+ <p class="mt-1 whitespace-pre-wrap text-[12px] text-toned">{{ report.reason }}</p>
85
89
  </div>
86
90
  <div
87
91
  v-if="report.alternativeVerification"
88
- class="rounded-md border border-slate-800 bg-slate-950/40 p-2"
92
+ class="rounded-md border border-default bg-app-950/40 p-2"
89
93
  >
90
- <p class="text-[11px] font-semibold uppercase tracking-wide text-slate-400">
94
+ <p class="text-[11px] font-semibold uppercase tracking-wide text-muted">
91
95
  {{ t('panels.stepDetail.reproduction.alternative') }}
92
96
  </p>
93
- <p class="mt-1 whitespace-pre-wrap text-[12px] text-slate-300">
97
+ <p class="mt-1 whitespace-pre-wrap text-[12px] text-toned">
94
98
  {{ report.alternativeVerification }}
95
99
  </p>
96
100
  </div>
@@ -98,17 +102,17 @@ function phaseLabel(outcome: ReproductionPhaseOutcome): string {
98
102
 
99
103
  <template v-else>
100
104
  <div v-if="report.command" class="flex items-baseline gap-2">
101
- <span class="shrink-0 text-[11px] text-slate-500">{{
105
+ <span class="shrink-0 text-[11px] text-dimmed">{{
102
106
  t('panels.stepDetail.reproduction.command')
103
107
  }}</span>
104
- <span class="truncate font-mono text-[11px] text-slate-300">{{ report.command }}</span>
108
+ <span class="truncate font-mono text-[11px] text-toned">{{ report.command }}</span>
105
109
  </div>
106
110
 
107
111
  <!-- A dropped path can leave the pre-fix tree without the reproduction, which greens it and
108
112
  reads as "the test does not capture the defect". Stated, never implied. -->
109
113
  <p
110
114
  v-if="report.omittedTestPaths"
111
- class="text-[11px] text-amber-300"
115
+ class="text-[11px] text-app-warning-300"
112
116
  data-testid="reproduction-omitted-paths"
113
117
  >
114
118
  {{
@@ -123,7 +127,7 @@ function phaseLabel(outcome: ReproductionPhaseOutcome): string {
123
127
  <div
124
128
  v-for="phase in phases"
125
129
  :key="phase.key"
126
- class="rounded-md border border-slate-800 bg-slate-950/40 p-2"
130
+ class="rounded-md border border-default bg-app-950/40 p-2"
127
131
  data-testid="reproduction-phase"
128
132
  >
129
133
  <div class="flex items-center gap-2">
@@ -133,15 +137,15 @@ function phaseLabel(outcome: ReproductionPhaseOutcome): string {
133
137
  :class="
134
138
  phase.outcome
135
139
  ? phase.outcome.passed
136
- ? 'text-emerald-400'
137
- : 'text-rose-400'
138
- : 'text-slate-600'
140
+ ? 'text-app-success-400'
141
+ : 'text-app-error-400'
142
+ : 'text-app-600'
139
143
  "
140
144
  />
141
- <span class="text-[12px] font-medium text-slate-200">
145
+ <span class="text-[12px] font-medium text-default">
142
146
  {{ t(phase.label) }}
143
147
  </span>
144
- <span class="ms-auto shrink-0 text-[11px] tabular-nums text-slate-400">
148
+ <span class="ms-auto shrink-0 text-[11px] tabular-nums text-muted">
145
149
  {{
146
150
  phase.outcome ? phaseLabel(phase.outcome) : t('panels.stepDetail.reproduction.notRun')
147
151
  }}
@@ -149,12 +153,12 @@ function phaseLabel(outcome: ReproductionPhaseOutcome): string {
149
153
  </div>
150
154
  <pre
151
155
  v-if="phase.outcome?.outputTail"
152
- class="mt-1.5 max-h-48 overflow-auto whitespace-pre-wrap break-words rounded bg-slate-950 p-2 font-mono text-[11px] text-slate-400"
156
+ class="mt-1.5 max-h-48 overflow-auto whitespace-pre-wrap break-words rounded bg-app-950 p-2 font-mono text-[11px] text-muted"
153
157
  data-testid="reproduction-output"
154
158
  >{{ phase.outcome.outputTail }}</pre>
155
159
  </div>
156
160
 
157
- <p class="text-[11px] text-slate-500">
161
+ <p class="text-[11px] text-dimmed">
158
162
  {{
159
163
  t('panels.stepDetail.reproduction.attempts', {
160
164
  attempts: report.attempts,
@@ -57,26 +57,26 @@ async function copyRunId() {
57
57
  <template>
58
58
  <div class="flex flex-col gap-4">
59
59
  <div v-if="stepNumber && totalSteps">
60
- <h4 class="mb-1 text-[11px] font-semibold uppercase tracking-wide text-slate-500">
60
+ <h4 class="mb-1 text-[11px] font-semibold uppercase tracking-wide text-dimmed">
61
61
  {{ t('panels.stepMeta.step') }}
62
62
  </h4>
63
- <p class="text-[12px] text-slate-300">
63
+ <p class="text-[12px] text-toned">
64
64
  {{ t('panels.stepMeta.stepOf', { number: stepNumber, total: totalSteps }) }}
65
65
  </p>
66
66
  </div>
67
67
 
68
68
  <div v-if="durationLabel">
69
- <h4 class="mb-1 text-[11px] font-semibold uppercase tracking-wide text-slate-500">
69
+ <h4 class="mb-1 text-[11px] font-semibold uppercase tracking-wide text-dimmed">
70
70
  {{ t('panels.stepMeta.duration') }}
71
71
  </h4>
72
- <p class="flex items-center gap-1.5 text-[12px] tabular-nums text-slate-300">
72
+ <p class="flex items-center gap-1.5 text-[12px] tabular-nums text-toned">
73
73
  <UIcon
74
74
  v-if="isRunning"
75
75
  name="i-lucide-loader-circle"
76
- class="h-3 w-3 animate-spin text-indigo-400"
76
+ class="h-3 w-3 animate-spin text-primary"
77
77
  />
78
78
  {{ durationLabel }}
79
- <span v-if="isRunning" class="text-[11px] text-slate-500">{{
79
+ <span v-if="isRunning" class="text-[11px] text-dimmed">{{
80
80
  t('panels.stepMeta.elapsed')
81
81
  }}</span>
82
82
  </p>
@@ -86,54 +86,54 @@ async function copyRunId() {
86
86
  the elapsed clock above — a long, quiet phase keeps this small while elapsed climbs, so a
87
87
  genuinely-active-but-quiet run reads apart from a wedged one. Only while actively running. -->
88
88
  <div v-if="isRunning && activityAgoLabel" data-testid="step-activity">
89
- <h4 class="mb-1 text-[11px] font-semibold uppercase tracking-wide text-slate-500">
89
+ <h4 class="mb-1 text-[11px] font-semibold uppercase tracking-wide text-dimmed">
90
90
  {{ t('panels.stepMeta.activity') }}
91
91
  </h4>
92
- <p class="flex items-center gap-1.5 text-[12px] tabular-nums text-slate-300">
93
- <span class="h-1.5 w-1.5 rounded-full bg-emerald-400" />
92
+ <p class="flex items-center gap-1.5 text-[12px] tabular-nums text-toned">
93
+ <span class="h-1.5 w-1.5 rounded-full bg-app-success-400" />
94
94
  {{ t('panels.stepMeta.activityAgo', { duration: activityAgoLabel }) }}
95
95
  </p>
96
96
  </div>
97
97
 
98
98
  <div v-if="formatClock(step.startedAt)">
99
- <h4 class="mb-1 text-[11px] font-semibold uppercase tracking-wide text-slate-500">
99
+ <h4 class="mb-1 text-[11px] font-semibold uppercase tracking-wide text-dimmed">
100
100
  {{ t('panels.stepMeta.started') }}
101
101
  </h4>
102
- <p class="text-[12px] text-slate-300">{{ formatClock(step.startedAt) }}</p>
102
+ <p class="text-[12px] text-toned">{{ formatClock(step.startedAt) }}</p>
103
103
  </div>
104
104
 
105
105
  <div v-if="formatClock(step.finishedAt)">
106
- <h4 class="mb-1 text-[11px] font-semibold uppercase tracking-wide text-slate-500">
106
+ <h4 class="mb-1 text-[11px] font-semibold uppercase tracking-wide text-dimmed">
107
107
  {{ t('panels.stepMeta.finished') }}
108
108
  </h4>
109
- <p class="text-[12px] text-slate-300">{{ formatClock(step.finishedAt) }}</p>
109
+ <p class="text-[12px] text-toned">{{ formatClock(step.finishedAt) }}</p>
110
110
  </div>
111
111
 
112
112
  <div v-if="step.model">
113
- <h4 class="mb-1 text-[11px] font-semibold uppercase tracking-wide text-slate-500">
113
+ <h4 class="mb-1 text-[11px] font-semibold uppercase tracking-wide text-dimmed">
114
114
  {{ t('panels.stepMeta.model') }}
115
115
  </h4>
116
- <p class="break-all text-[12px] text-slate-300" :title="step.model">
116
+ <p class="break-all text-[12px] text-toned" :title="step.model">
117
117
  {{ modelLabel ?? step.model }}
118
118
  </p>
119
119
  </div>
120
120
 
121
121
  <div v-if="promptVariant">
122
- <h4 class="mb-1 text-[11px] font-semibold uppercase tracking-wide text-slate-500">
122
+ <h4 class="mb-1 text-[11px] font-semibold uppercase tracking-wide text-dimmed">
123
123
  {{ t('panels.stepMeta.promptVariant') }}
124
124
  </h4>
125
- <p class="break-all text-[12px] text-slate-300">{{ promptVariant.label }}</p>
126
- <p v-if="promptVariant.note" class="mt-0.5 text-[11px] text-amber-400/80">
125
+ <p class="break-all text-[12px] text-toned">{{ promptVariant.label }}</p>
126
+ <p v-if="promptVariant.note" class="mt-0.5 text-[11px] text-app-warning-400/80">
127
127
  {{ promptVariant.note }}
128
128
  </p>
129
129
  </div>
130
130
 
131
131
  <div v-if="runId">
132
- <h4 class="mb-1 text-[11px] font-semibold uppercase tracking-wide text-slate-500">
132
+ <h4 class="mb-1 text-[11px] font-semibold uppercase tracking-wide text-dimmed">
133
133
  {{ t('panels.stepMeta.run') }}
134
134
  </h4>
135
135
  <p
136
- class="cursor-pointer break-all font-mono text-[12px] text-slate-400 hover:text-slate-200"
136
+ class="cursor-pointer break-all font-mono text-[12px] text-muted hover:text-default"
137
137
  :title="t('panels.stepMeta.clickToCopy', { id: runId })"
138
138
  @click="copyRunId"
139
139
  >
@@ -15,11 +15,16 @@ const LABELS: Record<RequirementVerdictStatus, string> = {
15
15
 
16
16
  describe('resolveVerdictMeta', () => {
17
17
  it('resolves each known status to its own label and colour', () => {
18
- expect(resolveVerdictMeta('met', LABELS)).toEqual({ label: 'Met', color: '#22c55e' })
19
- expect(resolveVerdictMeta('not_met', LABELS)).toEqual({ label: 'Not met', color: '#ef4444' })
18
+ // A verdict is a status, so its dot takes the semantic alias: it recolours with the theme
19
+ // and stays distinct from the category hues an agent kind wears.
20
+ expect(resolveVerdictMeta('met', LABELS)).toEqual({ label: 'Met', color: 'var(--ui-success)' })
21
+ expect(resolveVerdictMeta('not_met', LABELS)).toEqual({
22
+ label: 'Not met',
23
+ color: 'var(--ui-error)',
24
+ })
20
25
  expect(resolveVerdictMeta('not_covered', LABELS)).toEqual({
21
26
  label: 'Not checked',
22
- color: '#64748b',
27
+ color: 'var(--ui-text-muted)',
23
28
  })
24
29
  })
25
30
 
@@ -20,13 +20,13 @@ export interface VerdictMeta {
20
20
  * exists to prevent. Amber is the same "attention, but not a failure" tone the panel's severity
21
21
  * scale already uses for `medium`.
22
22
  */
23
- export const UNKNOWN_VERDICT_COLOR = '#f59e0b'
23
+ export const UNKNOWN_VERDICT_COLOR = 'var(--ui-warning)'
24
24
 
25
25
  /** Dot colour per known verdict. Exhaustive over the closed union (drift guard tier 2). */
26
26
  export const VERDICT_COLORS: Record<RequirementVerdictStatus, string> = {
27
- met: '#22c55e',
28
- not_met: '#ef4444',
29
- not_covered: '#64748b',
27
+ met: 'var(--ui-success)',
28
+ not_met: 'var(--ui-error)',
29
+ not_covered: 'var(--ui-text-muted)',
30
30
  }
31
31
 
32
32
  /**
@@ -14,15 +14,15 @@ defineProps<{
14
14
  const { t } = useI18n()
15
15
 
16
16
  const SEVERITY_COLOR: Record<string, string> = {
17
- low: '#64748b',
18
- medium: '#f59e0b',
19
- high: '#f97316',
20
- critical: '#ef4444',
17
+ low: 'var(--ui-text-muted)',
18
+ medium: 'var(--ui-warning)',
19
+ high: 'var(--app-hue-orange)',
20
+ critical: 'var(--ui-error)',
21
21
  }
22
22
  const OUTCOME_COLOR: Record<string, string> = {
23
- passed: '#22c55e',
24
- failed: '#ef4444',
25
- skipped: '#64748b',
23
+ passed: 'var(--ui-success)',
24
+ failed: 'var(--ui-error)',
25
+ skipped: 'var(--ui-text-muted)',
26
26
  }
27
27
 
28
28
  // Per-spec-requirement verdict labels, keyed by the requirement id the service's in-repo `spec/`
@@ -44,8 +44,8 @@ function verdictMeta(status: RequirementVerdictStatus): VerdictMeta {
44
44
  <template>
45
45
  <section class="mt-4 scroll-mt-4">
46
46
  <div class="mb-2 flex items-center gap-1.5 text-[11px]">
47
- <UIcon name="i-lucide-flask-conical" class="h-3.5 w-3.5 text-slate-400" />
48
- <span class="font-semibold uppercase tracking-wide text-slate-400">
47
+ <UIcon name="i-lucide-flask-conical" class="h-3.5 w-3.5 text-muted" />
48
+ <span class="font-semibold uppercase tracking-wide text-muted">
49
49
  {{ t('panels.testReport.title') }}
50
50
  </span>
51
51
  <UBadge :color="report.greenlight ? 'success' : 'warning'" variant="subtle" size="sm">
@@ -53,7 +53,7 @@ function verdictMeta(status: RequirementVerdictStatus): VerdictMeta {
53
53
  report.greenlight ? t('panels.testReport.greenlit') : t('panels.testReport.needsFixes')
54
54
  }}
55
55
  </UBadge>
56
- <span v-if="phase && phase.attempts > 0" class="text-[11px] text-slate-500">
56
+ <span v-if="phase && phase.attempts > 0" class="text-[11px] text-dimmed">
57
57
  {{ t('panels.testReport.fixAttempts', { count: phase.attempts, max: phase.maxAttempts })
58
58
  }}<span v-if="phase.phase === 'fixing'"> {{ t('panels.testReport.fixing') }}</span>
59
59
  </span>
@@ -61,25 +61,25 @@ function verdictMeta(status: RequirementVerdictStatus): VerdictMeta {
61
61
  <MarkdownProse
62
62
  v-if="report.summary"
63
63
  :text="report.summary"
64
- class="mb-3 text-[13px] leading-relaxed text-slate-300"
64
+ class="mb-3 text-[13px] leading-relaxed text-toned"
65
65
  />
66
66
 
67
67
  <div v-if="report.tested.length" class="mb-3">
68
- <div class="mb-1 text-[11px] text-slate-500">{{ t('panels.testReport.tested') }}</div>
69
- <ul class="space-y-0.5 text-[12px] text-slate-300">
68
+ <div class="mb-1 text-[11px] text-dimmed">{{ t('panels.testReport.tested') }}</div>
69
+ <ul class="space-y-0.5 text-[12px] text-toned">
70
70
  <li v-for="(item, i) in report.tested" :key="i">• {{ item }}</li>
71
71
  </ul>
72
72
  </div>
73
73
 
74
74
  <div v-if="report.outcomes.length" class="mb-3 space-y-1">
75
- <div class="text-[11px] text-slate-500">{{ t('panels.testReport.outcomes') }}</div>
75
+ <div class="text-[11px] text-dimmed">{{ t('panels.testReport.outcomes') }}</div>
76
76
  <div v-for="(o, i) in report.outcomes" :key="i" class="flex items-start gap-2 text-[12px]">
77
77
  <span
78
78
  class="mt-1 h-2 w-2 shrink-0 rounded-full"
79
- :style="{ backgroundColor: OUTCOME_COLOR[o.status] ?? '#64748b' }"
79
+ :style="{ backgroundColor: OUTCOME_COLOR[o.status] ?? 'var(--ui-text-muted)' }"
80
80
  />
81
- <span class="text-slate-300"
82
- >{{ o.name }}<span v-if="o.detail" class="text-slate-500"> — {{ o.detail }}</span></span
81
+ <span class="text-toned"
82
+ >{{ o.name }}<span v-if="o.detail" class="text-dimmed"> — {{ o.detail }}</span></span
83
83
  >
84
84
  </div>
85
85
  </div>
@@ -91,7 +91,7 @@ function verdictMeta(status: RequirementVerdictStatus): VerdictMeta {
91
91
  class="mb-3 space-y-1"
92
92
  data-testid="test-report-requirement-verdicts"
93
93
  >
94
- <div class="text-[11px] text-slate-500">
94
+ <div class="text-[11px] text-dimmed">
95
95
  {{ t('panels.testReport.requirementVerdicts.title') }}
96
96
  </div>
97
97
  <div
@@ -103,30 +103,30 @@ function verdictMeta(status: RequirementVerdictStatus): VerdictMeta {
103
103
  class="mt-1 h-2 w-2 shrink-0 rounded-full"
104
104
  :style="{ backgroundColor: verdictMeta(verdict.status).color }"
105
105
  />
106
- <span class="text-slate-300">
107
- <span class="font-mono text-[11px] text-slate-400">{{ verdict.requirementId }}</span>
108
- <span class="text-slate-500"> — {{ verdictMeta(verdict.status).label }}</span>
109
- <span v-if="verdict.detail" class="text-slate-500"> · {{ verdict.detail }}</span>
106
+ <span class="text-toned">
107
+ <span class="font-mono text-[11px] text-muted">{{ verdict.requirementId }}</span>
108
+ <span class="text-dimmed"> — {{ verdictMeta(verdict.status).label }}</span>
109
+ <span v-if="verdict.detail" class="text-dimmed"> · {{ verdict.detail }}</span>
110
110
  </span>
111
111
  </div>
112
112
  </div>
113
113
 
114
114
  <div v-if="report.concerns.length" class="space-y-1">
115
- <div class="text-[11px] text-slate-500">{{ t('panels.testReport.concerns') }}</div>
115
+ <div class="text-[11px] text-dimmed">{{ t('panels.testReport.concerns') }}</div>
116
116
  <div
117
117
  v-for="(c, i) in report.concerns"
118
118
  :key="i"
119
- class="rounded border border-slate-700/60 p-2 text-[12px]"
119
+ class="rounded border border-muted/60 p-2 text-[12px]"
120
120
  >
121
121
  <div class="flex items-center gap-1.5">
122
122
  <span
123
- class="rounded px-1 text-[10px] font-semibold uppercase text-white"
124
- :style="{ backgroundColor: SEVERITY_COLOR[c.severity] ?? '#64748b' }"
123
+ class="rounded px-1 text-[10px] font-semibold uppercase text-highlighted"
124
+ :style="{ backgroundColor: SEVERITY_COLOR[c.severity] ?? 'var(--ui-text-muted)' }"
125
125
  >{{ c.severity }}</span
126
126
  >
127
- <span class="font-medium text-slate-200">{{ c.title }}</span>
127
+ <span class="font-medium text-default">{{ c.title }}</span>
128
128
  </div>
129
- <MarkdownProse v-if="c.detail" :text="c.detail" class="mt-1 text-slate-400" />
129
+ <MarkdownProse v-if="c.detail" :text="c.detail" class="mt-1 text-muted" />
130
130
  </div>
131
131
  </div>
132
132
  </section>
@@ -107,10 +107,10 @@ const drops = computed(() =>
107
107
  <section
108
108
  v-if="hasAny"
109
109
  data-testid="step-tool-servers"
110
- class="scroll-mt-4 rounded-xl border border-slate-800 bg-slate-900/50 p-4"
110
+ class="scroll-mt-4 rounded-xl border border-default bg-default/50 p-4"
111
111
  >
112
112
  <div
113
- class="mb-2 flex items-center gap-1.5 text-[11px] font-semibold uppercase tracking-wide text-slate-400"
113
+ class="mb-2 flex items-center gap-1.5 text-[11px] font-semibold uppercase tracking-wide text-muted"
114
114
  >
115
115
  <UIcon name="i-lucide-plug" class="h-3.5 w-3.5" />
116
116
  <span>{{ t('panels.stepDetail.toolServers.heading') }}</span>
@@ -119,7 +119,7 @@ const drops = computed(() =>
119
119
  <p
120
120
  v-if="dispatchedAs"
121
121
  data-testid="step-tool-servers-dispatched-as"
122
- class="mb-2 text-[12px] text-slate-400"
122
+ class="mb-2 text-[12px] text-muted"
123
123
  >
124
124
  {{ t('panels.stepDetail.toolServers.dispatchedAs', { agent: dispatchedAs }) }}
125
125
  </p>
@@ -133,8 +133,8 @@ const drops = computed(() =>
133
133
  class="inline-flex items-center gap-1.5 rounded-full border px-2 py-0.5 text-[12px]"
134
134
  :class="
135
135
  server.isFault
136
- ? 'border-amber-500/30 bg-amber-500/10 text-amber-200'
137
- : 'border-emerald-500/30 bg-emerald-500/10 text-emerald-200'
136
+ ? 'border-app-warning-500/30 bg-app-warning-500/10 text-app-warning-200'
137
+ : 'border-app-success-500/30 bg-app-success-500/10 text-app-success-200'
138
138
  "
139
139
  :title="
140
140
  server.tools?.length
@@ -171,7 +171,7 @@ const drops = computed(() =>
171
171
  v-for="server in unattributed"
172
172
  :key="server.id"
173
173
  data-testid="step-tool-server-unattributed"
174
- class="flex items-start gap-1.5 text-[12px] text-slate-400"
174
+ class="flex items-start gap-1.5 text-[12px] text-muted"
175
175
  >
176
176
  <UIcon name="i-lucide-circle-help" class="mt-0.5 h-3.5 w-3.5 shrink-0" />
177
177
  <span>{{
@@ -185,12 +185,15 @@ const drops = computed(() =>
185
185
  v-for="server in drops"
186
186
  :key="server.id"
187
187
  data-testid="step-tool-server-unavailable"
188
- class="flex items-start gap-1.5 text-[12px] text-slate-300"
188
+ class="flex items-start gap-1.5 text-[12px] text-toned"
189
189
  >
190
- <UIcon name="i-lucide-plug-zap" class="mt-0.5 h-3.5 w-3.5 shrink-0 text-amber-400/80" />
190
+ <UIcon
191
+ name="i-lucide-plug-zap"
192
+ class="mt-0.5 h-3.5 w-3.5 shrink-0 text-app-warning-400/80"
193
+ />
191
194
  <span>
192
- <span class="font-medium text-slate-200">{{ server.label || server.id }}</span>
193
- <span class="text-slate-400"> {{ server.reasonText }}</span>
195
+ <span class="font-medium text-default">{{ server.label || server.id }}</span>
196
+ <span class="text-muted"> {{ server.reasonText }}</span>
194
197
  <!--
195
198
  Absent for a reason this build no longer recognises: it knows the code was recorded and
196
199
  not what it meant, so there is no surface it can honestly send an operator to.
@@ -198,7 +201,7 @@ const drops = computed(() =>
198
201
  <span
199
202
  v-if="server.remedy"
200
203
  data-testid="step-tool-server-remedy"
201
- class="mt-0.5 block text-slate-500"
204
+ class="mt-0.5 block text-dimmed"
202
205
  >{{ server.remedy }}</span
203
206
  >
204
207
  </span>
@@ -15,7 +15,7 @@ const failed = computed(() => props.report.outcomes.filter((o) => !o.passed))
15
15
 
16
16
  <template>
17
17
  <div class="space-y-2" data-testid="step-validation-report">
18
- <p class="text-[11px] text-slate-400">
18
+ <p class="text-[11px] text-muted">
19
19
  {{
20
20
  report.passed
21
21
  ? t('panels.stepDetail.validation.passedSummary', {
@@ -34,20 +34,20 @@ const failed = computed(() => props.report.outcomes.filter((o) => !o.passed))
34
34
  <div
35
35
  v-for="outcome in report.outcomes"
36
36
  :key="outcome.label"
37
- class="rounded-md border border-slate-800 bg-slate-950/40 p-2"
37
+ class="rounded-md border border-default bg-app-950/40 p-2"
38
38
  data-testid="validation-outcome"
39
39
  >
40
40
  <div class="flex items-center gap-2">
41
41
  <UIcon
42
42
  :name="outcome.passed ? 'i-lucide-check' : 'i-lucide-x'"
43
43
  class="h-3.5 w-3.5 shrink-0"
44
- :class="outcome.passed ? 'text-emerald-400' : 'text-rose-400'"
44
+ :class="outcome.passed ? 'text-app-success-400' : 'text-app-error-400'"
45
45
  />
46
- <span class="text-[12px] font-medium text-slate-200">{{ outcome.label }}</span>
47
- <span class="truncate font-mono text-[11px] text-slate-500">{{ outcome.command }}</span>
46
+ <span class="text-[12px] font-medium text-default">{{ outcome.label }}</span>
47
+ <span class="truncate font-mono text-[11px] text-dimmed">{{ outcome.command }}</span>
48
48
  <span
49
49
  v-if="!outcome.passed"
50
- class="ms-auto shrink-0 rounded bg-rose-500/15 px-1.5 py-0.5 text-[11px] tabular-nums text-rose-300"
50
+ class="ms-auto shrink-0 rounded bg-app-error-500/15 px-1.5 py-0.5 text-[11px] tabular-nums text-app-error-300"
51
51
  >
52
52
  {{
53
53
  outcome.timedOut
@@ -58,7 +58,7 @@ const failed = computed(() => props.report.outcomes.filter((o) => !o.passed))
58
58
  </div>
59
59
  <pre
60
60
  v-if="outcome.outputTail"
61
- class="mt-1.5 max-h-48 overflow-auto whitespace-pre-wrap break-words rounded bg-slate-950 p-2 font-mono text-[11px] text-slate-400"
61
+ class="mt-1.5 max-h-48 overflow-auto whitespace-pre-wrap break-words rounded bg-app-950 p-2 font-mono text-[11px] text-muted"
62
62
  data-testid="validation-output"
63
63
  >{{ outcome.outputTail }}</pre>
64
64
  </div>
@@ -36,12 +36,12 @@ function addTask() {
36
36
  <li
37
37
  v-for="m in modules"
38
38
  :key="m.id"
39
- class="flex cursor-pointer items-center gap-2 rounded-md px-2 py-1 hover:bg-slate-800/60"
39
+ class="flex cursor-pointer items-center gap-2 rounded-md px-2 py-1 hover:bg-elevated/60"
40
40
  @click="ui.select(m.id)"
41
41
  >
42
- <UIcon name="i-lucide-package" class="h-3.5 w-3.5 text-violet-400" />
43
- <span class="truncate text-xs text-slate-200">{{ m.title }}</span>
44
- <span class="ms-auto text-[10px] text-slate-500">{{
42
+ <UIcon name="i-lucide-package" class="h-3.5 w-3.5 text-app-secondary-400" />
43
+ <span class="truncate text-xs text-default">{{ m.title }}</span>
44
+ <span class="ms-auto text-[10px] text-dimmed">{{
45
45
  t(
46
46
  'inspector.container.taskCount',
47
47
  { count: board.tasksOf(m.id).length },
@@ -68,19 +68,19 @@ function addTask() {
68
68
  <li
69
69
  v-for="task in tasks"
70
70
  :key="task.id"
71
- class="flex cursor-pointer items-center gap-2 rounded-md px-2 py-1 hover:bg-slate-800/60"
71
+ class="flex cursor-pointer items-center gap-2 rounded-md px-2 py-1 hover:bg-elevated/60"
72
72
  @click="ui.select(task.id)"
73
73
  >
74
74
  <span
75
75
  class="h-2 w-2 shrink-0 rounded-full"
76
76
  :style="{ backgroundColor: STATUS_META[task.status].color }"
77
77
  />
78
- <span class="truncate text-xs text-slate-200">{{ task.title }}</span>
79
- <span class="ms-auto text-[10px] text-slate-500">{{ STATUS_META[task.status].label }}</span>
78
+ <span class="truncate text-xs text-default">{{ task.title }}</span>
79
+ <span class="ms-auto text-[10px] text-dimmed">{{ STATUS_META[task.status].label }}</span>
80
80
  </li>
81
81
  </ul>
82
- <div v-else class="text-[11px] text-slate-500">{{ t('inspector.container.noTasks') }}</div>
83
- <p v-if="isFrame" class="text-[11px] text-slate-500">
82
+ <div v-else class="text-[11px] text-dimmed">{{ t('inspector.container.noTasks') }}</div>
83
+ <p v-if="isFrame" class="text-[11px] text-dimmed">
84
84
  {{ t('inspector.container.servicesHint') }}
85
85
  </p>
86
86
  </InspectorSection>
@@ -83,7 +83,7 @@ function detach(repoId: number) {
83
83
  <template>
84
84
  <div data-testid="doc-reference-repos">
85
85
  <div class="mb-1 flex items-center justify-between">
86
- <span class="text-[11px] font-semibold uppercase tracking-wide text-slate-400">
86
+ <span class="text-[11px] font-semibold uppercase tracking-wide text-muted">
87
87
  {{ t('inspector.referenceRepos.title') }}
88
88
  </span>
89
89
  </div>
@@ -133,11 +133,11 @@ function detach(repoId: number) {
133
133
  />
134
134
  </template>
135
135
  </UInputMenu>
136
- <div v-else class="text-[11px] text-slate-500">
136
+ <div v-else class="text-[11px] text-dimmed">
137
137
  {{ t('inspector.referenceRepos.connectFirst') }}
138
138
  </div>
139
139
 
140
- <div class="mt-1 text-[11px] text-slate-500">
140
+ <div class="mt-1 text-[11px] text-dimmed">
141
141
  {{ t('inspector.referenceRepos.hint') }}
142
142
  </div>
143
143
  </div>