@cat-factory/app 0.302.1 → 0.303.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (328) hide show
  1. package/README.md +16 -0
  2. package/app/app.config.ts +19 -10
  3. package/app/assets/css/main.css +13 -13
  4. package/app/assets/css/prose.css +22 -22
  5. package/app/assets/css/tokens.css +298 -0
  6. package/app/components/assistant/AssistantModal.vue +22 -22
  7. package/app/components/auth/AuthGate.vue +1 -1
  8. package/app/components/auth/BackendMisconfiguredScreen.vue +10 -10
  9. package/app/components/auth/LoginScreen.vue +34 -36
  10. package/app/components/auth/ResetPasswordScreen.vue +12 -12
  11. package/app/components/auth/UserMenu.vue +4 -4
  12. package/app/components/binaryCandidates/BinaryCandidatesWindow.vue +27 -25
  13. package/app/components/binaryOutput/BinaryOutputReport.vue +15 -15
  14. package/app/components/binaryOutput/StoredAssetView.vue +5 -5
  15. package/app/components/board/AddTaskModal.vue +17 -20
  16. package/app/components/board/AgentFailureCard.vue +11 -11
  17. package/app/components/board/AgentFailureHistory.vue +2 -2
  18. package/app/components/board/BoardCanvas.vue +6 -5
  19. package/app/components/board/CreateInitiativeModal.vue +8 -10
  20. package/app/components/board/DependencyConnectOverlay.vue +1 -1
  21. package/app/components/board/FailureHistoryList.vue +7 -7
  22. package/app/components/board/RecurringPipelineModal.vue +17 -17
  23. package/app/components/board/ReviewFrictionDialog.vue +6 -6
  24. package/app/components/board/StepExecutionHistory.vue +13 -13
  25. package/app/components/board/TaskDependencyEdges.vue +8 -8
  26. package/app/components/board/nodes/AgentChip.vue +10 -10
  27. package/app/components/board/nodes/BlockNode.vue +29 -29
  28. package/app/components/board/nodes/DecisionBadge.vue +2 -2
  29. package/app/components/board/nodes/EpicNode.vue +14 -10
  30. package/app/components/board/nodes/FrameSwimlanes.vue +7 -9
  31. package/app/components/board/nodes/InitiativeCard.vue +8 -8
  32. package/app/components/board/nodes/LaneGroup.vue +1 -1
  33. package/app/components/board/nodes/LaneTask.vue +2 -2
  34. package/app/components/board/nodes/ResizeGrips.vue +4 -4
  35. package/app/components/board/nodes/TaskCard.vue +18 -18
  36. package/app/components/board/nodes/TaskLane.vue +5 -5
  37. package/app/components/board/nodes/TaskPipelineMini.vue +18 -18
  38. package/app/components/bootstrap/AdoptionReviewModal.vue +29 -26
  39. package/app/components/bootstrap/BootstrapModal.vue +21 -23
  40. package/app/components/bootstrap/BootstrapRunSteps.vue +1 -1
  41. package/app/components/brainstorm/BrainstormWindow.vue +30 -33
  42. package/app/components/bugFishing/BugFishingWindow.vue +49 -49
  43. package/app/components/clarity/ClarityReviewWindow.vue +30 -30
  44. package/app/components/common/AsyncViewError.vue +5 -5
  45. package/app/components/common/ClarificationItem.vue +8 -13
  46. package/app/components/common/ConfirmDialog.vue +4 -2
  47. package/app/components/common/DescriptorFields.vue +1 -1
  48. package/app/components/common/EmptyState.vue +3 -3
  49. package/app/components/common/InterviewGateNotice.vue +7 -7
  50. package/app/components/common/KeyboardShortcutsHelp.vue +1 -1
  51. package/app/components/common/MarkdownProse.vue +14 -13
  52. package/app/components/consensus/ConsensusSessionWindow.vue +26 -26
  53. package/app/components/context/ContextAttachmentFields.vue +17 -17
  54. package/app/components/docs/DocInterviewWindow.vue +14 -14
  55. package/app/components/documents/ContextDocumentPicker.vue +17 -17
  56. package/app/components/documents/DocumentImportModal.vue +7 -7
  57. package/app/components/documents/DocumentSourceConnectModal.vue +3 -3
  58. package/app/components/documents/DocumentSyncState.vue +5 -5
  59. package/app/components/documents/DocumentTemplatesModal.vue +15 -15
  60. package/app/components/documents/RepoContextDocPicker.vue +5 -5
  61. package/app/components/documents/SpawnPreviewModal.vue +12 -12
  62. package/app/components/documents/StartFromDesignModal.vue +11 -11
  63. package/app/components/documents/TaskContextDocs.vue +5 -5
  64. package/app/components/environments/EnvSetupStepper.vue +6 -6
  65. package/app/components/environments/EnvironmentStatusPanel.vue +17 -17
  66. package/app/components/environments/steps/EnvPickStep.vue +3 -3
  67. package/app/components/environments/steps/EnvPreflightStep.vue +9 -9
  68. package/app/components/environments/steps/EnvReviewStep.vue +25 -22
  69. package/app/components/environments/steps/EnvSaveStep.vue +7 -5
  70. package/app/components/environments/steps/JourneyStepNav.vue +1 -1
  71. package/app/components/focus/BlockFocusView.vue +17 -19
  72. package/app/components/followUp/FollowUpWindow.vue +23 -23
  73. package/app/components/forkDecision/ForkDecisionWindow.vue +37 -39
  74. package/app/components/foundational/FoundationalContractSummary.vue +7 -7
  75. package/app/components/foundational/FoundationalServiceCatalogList.vue +11 -11
  76. package/app/components/foundational/FoundationalServiceManager.vue +1 -1
  77. package/app/components/foundational/FoundationalServiceRegistry.vue +13 -13
  78. package/app/components/foundational/FoundationalServiceSources.vue +13 -13
  79. package/app/components/foundational/FoundationalSuppressions.vue +7 -7
  80. package/app/components/foundational/ServiceCatalogConnection.vue +10 -10
  81. package/app/components/fragments/FragmentLibraryManager.vue +41 -44
  82. package/app/components/fragments/FragmentSelector.vue +13 -13
  83. package/app/components/fragments/GitHubDocUrlImport.vue +1 -1
  84. package/app/components/gates/GateFailingCheckList.vue +5 -5
  85. package/app/components/gates/GateResultView.vue +50 -47
  86. package/app/components/github/AddServiceFromRepoModal.vue +14 -14
  87. package/app/components/github/BranchProtectionPreflight.vue +13 -13
  88. package/app/components/github/GitHubConnect.vue +7 -7
  89. package/app/components/github/GitHubOnboarding.vue +7 -7
  90. package/app/components/github/GitHubPanel.vue +37 -40
  91. package/app/components/github/RepoTreeBrowser.vue +18 -18
  92. package/app/components/humanTest/HumanTestWindow.vue +30 -33
  93. package/app/components/initiative/InitiativePlanNotice.vue +5 -5
  94. package/app/components/initiative/InitiativePlanReview.vue +27 -29
  95. package/app/components/initiative/InitiativePlanningWindow.vue +10 -10
  96. package/app/components/initiative/InitiativeTrackerWindow.vue +71 -65
  97. package/app/components/inputGate/InputGateNotice.vue +2 -4
  98. package/app/components/judge/JudgeResultView.vue +30 -32
  99. package/app/components/kaizen/KaizenPanel.vue +40 -36
  100. package/app/components/kaizen/KaizenStepStatus.vue +21 -21
  101. package/app/components/layout/AccountAuditLog.vue +10 -10
  102. package/app/components/layout/AccountDeploymentSettings.vue +20 -20
  103. package/app/components/layout/AccountFailureKindRules.vue +13 -13
  104. package/app/components/layout/AccountFoundationalSettings.vue +1 -1
  105. package/app/components/layout/AccountFragmentSettings.vue +1 -1
  106. package/app/components/layout/AccountModelPolicySettings.vue +9 -9
  107. package/app/components/layout/AccountPlatformAlertSettings.vue +11 -11
  108. package/app/components/layout/AccountRiskPolicySettings.vue +2 -2
  109. package/app/components/layout/AccountRunCredentialSettings.vue +5 -5
  110. package/app/components/layout/AccountSkillSettings.vue +1 -1
  111. package/app/components/layout/AccountTeamSettings.vue +23 -15
  112. package/app/components/layout/AiProvidersBanner.vue +11 -8
  113. package/app/components/layout/AppearanceSwitcher.vue +108 -0
  114. package/app/components/layout/BoardSwitcher.vue +8 -11
  115. package/app/components/layout/BoardToolbar.vue +3 -3
  116. package/app/components/layout/CommandBar.vue +7 -9
  117. package/app/components/layout/ConnectionStatusBanner.vue +2 -2
  118. package/app/components/layout/DefaultTestEnvBanner.vue +5 -5
  119. package/app/components/layout/GitHubPatBanner.vue +5 -5
  120. package/app/components/layout/GitHubPatPermissionsBanner.vue +16 -10
  121. package/app/components/layout/InfraSetupBanner.vue +6 -6
  122. package/app/components/layout/IntegrationsHub.vue +15 -15
  123. package/app/components/layout/LanguageSwitcher.vue +5 -5
  124. package/app/components/layout/ModelProvidersHub.vue +13 -16
  125. package/app/components/layout/NotificationsInbox.vue +10 -10
  126. package/app/components/layout/PersonalSetupModal.vue +8 -8
  127. package/app/components/layout/ProviderConfigBanner.vue +4 -4
  128. package/app/components/layout/RolePrompt.vue +7 -7
  129. package/app/components/layout/SideBar.vue +6 -4
  130. package/app/components/layout/SpendWarningBanner.vue +17 -14
  131. package/app/components/layout/TranslationWarningBanner.vue +4 -4
  132. package/app/components/layout/UiModeSwitcher.vue +13 -13
  133. package/app/components/layout/UiRoleSwitcher.vue +8 -8
  134. package/app/components/layout/WorkspaceMembersSettings.vue +15 -11
  135. package/app/components/media/ArtifactLightbox.vue +13 -13
  136. package/app/components/media/ImageCompare.vue +31 -24
  137. package/app/components/merge/MergeEffortChips.vue +2 -2
  138. package/app/components/notifications/NotificationSettingsPanel.vue +14 -12
  139. package/app/components/observability/OutcomeFilterChips.vue +6 -6
  140. package/app/components/observability/RunFailureSummary.vue +28 -25
  141. package/app/components/observability/StepMetricsBar.vue +26 -28
  142. package/app/components/observability/StepModelActivity.vue +2 -2
  143. package/app/components/observability/ToolCallList.vue +24 -24
  144. package/app/components/outcome/OutcomeSummaryWindow.vue +47 -47
  145. package/app/components/palettes/AgentPalette.vue +8 -8
  146. package/app/components/palettes/AgentTierSelect.vue +1 -1
  147. package/app/components/palettes/PipelinePurposeSelect.vue +1 -1
  148. package/app/components/panels/AgentStepDetail.vue +52 -51
  149. package/app/components/panels/AttemptEntryHeader.vue +4 -6
  150. package/app/components/panels/DecisionModal.vue +7 -7
  151. package/app/components/panels/GenericStructuredResultView.vue +7 -7
  152. package/app/components/panels/InspectorPanel.vue +17 -17
  153. package/app/components/panels/MergerResultView.vue +19 -19
  154. package/app/components/panels/ObservabilityPanel.vue +115 -123
  155. package/app/components/panels/OperatorDashboardPanel.vue +89 -97
  156. package/app/components/panels/ReportsPanel.vue +69 -66
  157. package/app/components/panels/ReportsSpendBreakdown.vue +9 -9
  158. package/app/components/panels/ResultWindowShell.vue +38 -38
  159. package/app/components/panels/RunDetailLoadState.vue +2 -2
  160. package/app/components/panels/StepContainerStatus.vue +9 -9
  161. package/app/components/panels/StepDelegatedStatus.logic.spec.ts +135 -0
  162. package/app/components/panels/StepDelegatedStatus.logic.ts +160 -0
  163. package/app/components/panels/StepDelegatedStatus.vue +181 -0
  164. package/app/components/panels/StepEffortReport.vue +16 -15
  165. package/app/components/panels/StepFragmentAdherence.vue +14 -10
  166. package/app/components/panels/StepMetadataCard.vue +74 -45
  167. package/app/components/panels/StepReproductionReport.vue +25 -21
  168. package/app/components/panels/StepRunMeta.vue +20 -20
  169. package/app/components/panels/StepTestReport.logic.spec.ts +8 -3
  170. package/app/components/panels/StepTestReport.logic.ts +4 -4
  171. package/app/components/panels/StepTestReport.vue +28 -28
  172. package/app/components/panels/StepToolServers.vue +14 -11
  173. package/app/components/panels/StepValidationReport.vue +7 -7
  174. package/app/components/panels/inspector/ContainerSummary.vue +9 -9
  175. package/app/components/panels/inspector/DocReferenceRepos.vue +3 -3
  176. package/app/components/panels/inspector/EnvProbeReport.vue +24 -27
  177. package/app/components/panels/inspector/EpicChildren.vue +8 -12
  178. package/app/components/panels/inspector/FrontendBindingsResolved.vue +11 -11
  179. package/app/components/panels/inspector/FrontendConfig.vue +37 -41
  180. package/app/components/panels/inspector/InitiativeInspector.vue +3 -3
  181. package/app/components/panels/inspector/InspectorSection.vue +6 -6
  182. package/app/components/panels/inspector/RecurringScheduleSettings.vue +16 -19
  183. package/app/components/panels/inspector/ServiceConnections.vue +2 -2
  184. package/app/components/panels/inspector/ServiceReleaseHealthConfig.vue +2 -2
  185. package/app/components/panels/inspector/ServiceSelfTests.vue +21 -17
  186. package/app/components/panels/inspector/ServiceTestConfig.vue +51 -59
  187. package/app/components/panels/inspector/ServiceTestSecrets.vue +5 -5
  188. package/app/components/panels/inspector/ServiceTestingContext.vue +3 -3
  189. package/app/components/panels/inspector/ServiceValidationConfig.vue +2 -2
  190. package/app/components/panels/inspector/TaskAgentConfig.vue +3 -3
  191. package/app/components/panels/inspector/TaskAprioriBranches.vue +8 -5
  192. package/app/components/panels/inspector/TaskDependencies.vue +1 -1
  193. package/app/components/panels/inspector/TaskEstimateBadge.vue +11 -11
  194. package/app/components/panels/inspector/TaskExecution.vue +17 -17
  195. package/app/components/panels/inspector/TaskReviewTarget.vue +2 -2
  196. package/app/components/panels/inspector/TaskRunSettings.vue +35 -37
  197. package/app/components/panels/inspector/TaskStructure.vue +3 -3
  198. package/app/components/pipeline/AgentKindIcon.vue +1 -1
  199. package/app/components/pipeline/AgentPromptEditor.vue +17 -17
  200. package/app/components/pipeline/BinaryOutputStepPicker.vue +42 -56
  201. package/app/components/pipeline/EstimateThresholdFields.vue +4 -4
  202. package/app/components/pipeline/GateConfigFields.vue +13 -10
  203. package/app/components/pipeline/IterationCapPrompt.vue +4 -2
  204. package/app/components/pipeline/PipelineBuilder.vue +47 -55
  205. package/app/components/pipeline/PipelineHealthModal.vue +27 -29
  206. package/app/components/pipeline/PipelinePicker.vue +10 -10
  207. package/app/components/pipeline/PipelinePreview.vue +10 -10
  208. package/app/components/pipeline/PipelineProgress.vue +64 -67
  209. package/app/components/prReview/PrReviewPhaseBadge.vue +7 -7
  210. package/app/components/prReview/PrReviewWindow.vue +75 -77
  211. package/app/components/providers/AiPresetMismatchDialog.vue +5 -5
  212. package/app/components/providers/AiProviderOnboardingModal.vue +9 -9
  213. package/app/components/providers/ApiKeysSection.vue +13 -13
  214. package/app/components/providers/PersonalCredentialModal.vue +2 -2
  215. package/app/components/providers/PersonalSubscriptionSection.vue +10 -10
  216. package/app/components/providers/SignInRequiredNotice.vue +1 -1
  217. package/app/components/providers/VendorCredentialsModal.vue +10 -10
  218. package/app/components/provisioning/ProvisioningLogsDrawer.vue +13 -13
  219. package/app/components/ralph/RalphLoopResultView.vue +28 -30
  220. package/app/components/recurring/RecurrenceEditor.vue +2 -2
  221. package/app/components/requirements/RequirementsReviewWindow.vue +51 -58
  222. package/app/components/riskPolicy/RiskPolicyPicker.vue +12 -15
  223. package/app/components/riskPolicy/RiskPolicyPreview.vue +14 -14
  224. package/app/components/sandbox/SandboxPanel.vue +58 -59
  225. package/app/components/settings/AccountSettingsPanel.vue +1 -1
  226. package/app/components/settings/ApiTokensPanel.vue +10 -10
  227. package/app/components/settings/BudgetSettings.vue +18 -22
  228. package/app/components/settings/CapabilityCredentialsPanel.vue +15 -15
  229. package/app/components/settings/CloudflareHandlerSection.vue +20 -20
  230. package/app/components/settings/ComposeEnvironmentSetupSection.vue +13 -13
  231. package/app/components/settings/ConnectionTestVerdict.vue +3 -3
  232. package/app/components/settings/ConnectionWarnings.vue +1 -1
  233. package/app/components/settings/ConsensusGroupsSection.vue +27 -35
  234. package/app/components/settings/CustomManifestTypeEditor.vue +10 -10
  235. package/app/components/settings/DefaultProvisionTypeSection.vue +6 -6
  236. package/app/components/settings/InfraHandlersConfigurator.vue +24 -22
  237. package/app/components/settings/InfrastructureBackendPicker.vue +6 -6
  238. package/app/components/settings/InfrastructureWindow.vue +5 -5
  239. package/app/components/settings/IssueTrackerPanel.vue +29 -23
  240. package/app/components/settings/KubernetesEngineForm.vue +11 -11
  241. package/app/components/settings/KubernetesEnvironmentForm.vue +4 -4
  242. package/app/components/settings/LocalContainerPoolSettings.vue +6 -11
  243. package/app/components/settings/LocalModelEndpointsPanel.vue +20 -18
  244. package/app/components/settings/McpAuthorizeScreen.vue +13 -15
  245. package/app/components/settings/McpOAuthCallbackScreen.vue +16 -10
  246. package/app/components/settings/MergeClassRulesEditor.vue +6 -9
  247. package/app/components/settings/MergeRolePolicyEditor.vue +16 -16
  248. package/app/components/settings/ModelConfigurationPanel.vue +23 -30
  249. package/app/components/settings/ModelPresetHealthModal.vue +15 -13
  250. package/app/components/settings/ObservabilityConnectionPanel.vue +4 -4
  251. package/app/components/settings/OpenRouterCatalogPanel.vue +23 -19
  252. package/app/components/settings/PackageRegistriesPanel.vue +8 -8
  253. package/app/components/settings/ProviderConnectionTab.vue +8 -11
  254. package/app/components/settings/ProviderManifestEditor.vue +9 -9
  255. package/app/components/settings/ProviderPreferenceEditor.vue +8 -8
  256. package/app/components/settings/RiskPolicyCreateForm.vue +10 -10
  257. package/app/components/settings/RiskPolicyEditorRow.vue +14 -14
  258. package/app/components/settings/RiskPolicyHealthModal.vue +15 -13
  259. package/app/components/settings/RiskPolicyInheritedRow.vue +1 -1
  260. package/app/components/settings/RiskPolicyPanel.vue +10 -15
  261. package/app/components/settings/ServiceFragmentDefaultsPanel.vue +7 -7
  262. package/app/components/settings/SharedStacksPanel.vue +9 -12
  263. package/app/components/settings/TaskSourceCard.vue +4 -4
  264. package/app/components/settings/TaskTypeSuppressionsPanel.vue +6 -6
  265. package/app/components/settings/ToolServerChecklist.vue +36 -29
  266. package/app/components/settings/UsageSettings.vue +15 -15
  267. package/app/components/settings/UserSecretsSection.vue +9 -12
  268. package/app/components/settings/WorkspaceMetadataSettings.vue +5 -5
  269. package/app/components/settings/WorkspaceSettingsPanel.vue +47 -47
  270. package/app/components/skills/ReviewSkillQueue.vue +10 -10
  271. package/app/components/skills/SkillLibraryManager.vue +23 -20
  272. package/app/components/slack/SlackPanel.vue +13 -17
  273. package/app/components/spec/ServiceSpecWindow.vue +45 -42
  274. package/app/components/tasks/BugHuntModal.vue +24 -27
  275. package/app/components/tasks/ContextIssuePicker.vue +11 -11
  276. package/app/components/tasks/TaskContextIssues.vue +3 -3
  277. package/app/components/tasks/TaskImportModal.vue +7 -7
  278. package/app/components/tasks/TaskSourceConnectModal.vue +10 -8
  279. package/app/components/testing/TestReportWindow.vue +99 -82
  280. package/app/components/theme/ThemeImportModal.vue +115 -0
  281. package/app/components/tutorial/TutorialCatalogue.vue +9 -9
  282. package/app/components/tutorial/TutorialNudge.vue +5 -5
  283. package/app/components/tutorial/TutorialOverlay.vue +12 -12
  284. package/app/components/tutorial/TutorialPrompt.vue +6 -9
  285. package/app/components/vcs/GitLabConnect.vue +4 -4
  286. package/app/components/vcs/VcsConnectSurfaces.vue +2 -2
  287. package/app/components/visualConfirm/VisualConfirmationWindow.vue +36 -36
  288. package/app/composables/api/client.ts +6 -1
  289. package/app/composables/usePipelineErrorToast.ts +17 -0
  290. package/app/modular/agent-kinds.ts +24 -0
  291. package/app/pages/index.vue +5 -5
  292. package/app/plugins/theme.client.ts +125 -0
  293. package/app/spa-loading-template.html +52 -14
  294. package/app/stores/agents.ts +1 -1
  295. package/app/stores/theme.spec.ts +56 -0
  296. package/app/stores/theme.ts +87 -0
  297. package/app/types/domain.ts +19 -0
  298. package/app/types/execution.ts +4 -0
  299. package/app/utils/agentOutput.ts +1 -1
  300. package/app/utils/binaryOutput.ts +6 -6
  301. package/app/utils/bootstrapSteps.ts +14 -14
  302. package/app/utils/catalog.ts +87 -83
  303. package/app/utils/colorTint.ts +10 -0
  304. package/app/utils/failureKinds.ts +1 -0
  305. package/app/utils/observability.ts +3 -3
  306. package/app/utils/pipelineRender.ts +13 -17
  307. package/app/utils/swimlanes.ts +4 -4
  308. package/app/utils/theme/bootPalette.spec.ts +54 -0
  309. package/app/utils/theme/bootPalette.ts +108 -0
  310. package/app/utils/theme/builtins.spec.ts +38 -0
  311. package/app/utils/theme/builtins.ts +55 -0
  312. package/app/utils/theme/css.ts +162 -0
  313. package/app/utils/theme/doc.ts +353 -0
  314. package/app/utils/theme/link.ts +93 -0
  315. package/app/utils/theme/presets.ts +509 -0
  316. package/app/utils/theme/theme.spec.ts +224 -0
  317. package/i18n/locales/de.json +61 -4
  318. package/i18n/locales/en.json +70 -4
  319. package/i18n/locales/es.json +61 -4
  320. package/i18n/locales/fr.json +61 -4
  321. package/i18n/locales/he.json +61 -4
  322. package/i18n/locales/it.json +61 -4
  323. package/i18n/locales/ja.json +61 -4
  324. package/i18n/locales/pl.json +61 -4
  325. package/i18n/locales/tr.json +61 -4
  326. package/i18n/locales/uk.json +61 -4
  327. package/nuxt.config.ts +37 -11
  328. package/package.json +10 -9
@@ -29,11 +29,11 @@ const VERDICT_KEYS: Record<EnvironmentProbeVerdict, string> = {
29
29
  }
30
30
 
31
31
  const VERDICT_CLASS: Record<EnvironmentProbeVerdict, string> = {
32
- operable: 'text-emerald-300/90',
32
+ operable: 'text-app-success-300/90',
33
33
  // Amber, not rose: the LIFECYCLE succeeded and the finding is partial. Colouring it as a
34
34
  // failure would make it read as the run breaking rather than as the diagnostic working.
35
- partially_operable: 'text-amber-300/90',
36
- inoperable: 'text-rose-300/90',
35
+ partially_operable: 'text-app-warning-300/90',
36
+ inoperable: 'text-app-error-300/90',
37
37
  }
38
38
 
39
39
  /**
@@ -64,7 +64,7 @@ const verdictLabel = computed(() => {
64
64
  return key && te(key) ? t(key) : props.report.verdict
65
65
  })
66
66
 
67
- const verdictClass = computed(() => VERDICT_CLASS[props.report.verdict] ?? 'text-slate-300')
67
+ const verdictClass = computed(() => VERDICT_CLASS[props.report.verdict] ?? 'text-toned')
68
68
 
69
69
  /** The icon per operation outcome. `not_attempted` is its own mark, never a failure's. */
70
70
  function outcomeIcon(outcome: EnvironmentProbeReport['operations'][number]['outcome']): string {
@@ -74,24 +74,21 @@ function outcomeIcon(outcome: EnvironmentProbeReport['operations'][number]['outc
74
74
  }
75
75
 
76
76
  function outcomeClass(outcome: EnvironmentProbeReport['operations'][number]['outcome']): string {
77
- if (outcome === 'succeeded') return 'text-emerald-400'
78
- if (outcome === 'failed') return 'text-rose-400'
79
- return 'text-slate-500'
77
+ if (outcome === 'succeeded') return 'text-app-success-400'
78
+ if (outcome === 'failed') return 'text-app-error-400'
79
+ return 'text-dimmed'
80
80
  }
81
81
  </script>
82
82
 
83
83
  <template>
84
- <div
85
- class="space-y-2 rounded border border-white/5 bg-white/[0.02] p-2"
86
- data-testid="env-probe-report"
87
- >
84
+ <div class="space-y-2 rounded border border-default bg-muted p-2" data-testid="env-probe-report">
88
85
  <p class="text-[11px] font-medium" :class="verdictClass" data-testid="env-probe-verdict">
89
86
  {{ verdictLabel }}
90
87
  </p>
91
88
 
92
89
  <!-- The tallies the PLATFORM computed from the agent's per-operation judgements, including
93
90
  how many successes were behind authentication: the count the verdict turns on. -->
94
- <p class="text-[11px] text-slate-400">
91
+ <p class="text-[11px] text-muted">
95
92
  {{
96
93
  t('inspector.testConfig.envProbe.counts', {
97
94
  succeeded: report.succeeded,
@@ -104,21 +101,21 @@ function outcomeClass(outcome: EnvironmentProbeReport['operations'][number]['out
104
101
  <!-- What the platform did not tell the agent: the actionable half of the report, so it comes
105
102
  before the evidence. -->
106
103
  <div v-if="report.missingContext.length" data-testid="env-probe-missing">
107
- <p class="text-[11px] font-medium text-amber-300/90">
104
+ <p class="text-[11px] font-medium text-app-warning-300/90">
108
105
  {{ t('inspector.testConfig.envProbe.missingContext') }}
109
106
  </p>
110
- <ul class="mt-0.5 list-disc space-y-0.5 pl-4 text-[11px] text-slate-300">
107
+ <ul class="mt-0.5 list-disc space-y-0.5 pl-4 text-[11px] text-toned">
111
108
  <li v-for="(line, i) in report.missingContext" :key="i">{{ line }}</li>
112
109
  </ul>
113
110
  </div>
114
111
 
115
112
  <div v-if="report.blockers.length" data-testid="env-probe-blockers">
116
- <p class="text-[11px] font-medium text-rose-300/90">
113
+ <p class="text-[11px] font-medium text-app-error-300/90">
117
114
  {{ t('inspector.testConfig.envProbe.blockers') }}
118
115
  </p>
119
- <ul class="mt-0.5 space-y-0.5 text-[11px] text-slate-300">
116
+ <ul class="mt-0.5 space-y-0.5 text-[11px] text-toned">
120
117
  <li v-for="(blocker, i) in report.blockers" :key="i">
121
- <span class="text-slate-400">{{ failureLabel(blocker.kind) }}:</span>
118
+ <span class="text-muted">{{ failureLabel(blocker.kind) }}:</span>
122
119
  {{ blocker.detail }}
123
120
  </li>
124
121
  </ul>
@@ -127,7 +124,7 @@ function outcomeClass(outcome: EnvironmentProbeReport['operations'][number]['out
127
124
  <!-- The operations, as evidence for the verdict above. This is the "what was attempted" a dry
128
125
  run exists to report: without it a verdict is an opinion. -->
129
126
  <div v-if="report.operations.length" data-testid="env-probe-operations">
130
- <p class="text-[11px] font-medium text-slate-300">
127
+ <p class="text-[11px] font-medium text-toned">
131
128
  {{ t('inspector.testConfig.envProbe.operations') }}
132
129
  </p>
133
130
  <ul class="mt-0.5 space-y-1 text-[11px]">
@@ -138,15 +135,15 @@ function outcomeClass(outcome: EnvironmentProbeReport['operations'][number]['out
138
135
  :class="outcomeClass(op.outcome)"
139
136
  />
140
137
  <span class="min-w-0">
141
- <span class="text-slate-200">{{ op.name }}</span>
142
- <span v-if="op.authenticated" class="ml-1 text-slate-500">
138
+ <span class="text-default">{{ op.name }}</span>
139
+ <span v-if="op.authenticated" class="ml-1 text-dimmed">
143
140
  {{ t('inspector.testConfig.envProbe.authenticated') }}
144
141
  </span>
145
- <span v-if="op.target" class="ml-1 font-mono text-slate-500">{{ op.target }}</span>
146
- <span v-if="op.failure" class="block text-rose-300/70">
142
+ <span v-if="op.target" class="ml-1 font-mono text-dimmed">{{ op.target }}</span>
143
+ <span v-if="op.failure" class="block text-app-error-300/70">
147
144
  {{ failureLabel(op.failure) }}<template v-if="op.detail">: {{ op.detail }}</template>
148
145
  </span>
149
- <span v-else-if="op.detail" class="block text-slate-400">{{ op.detail }}</span>
146
+ <span v-else-if="op.detail" class="block text-muted">{{ op.detail }}</span>
150
147
  </span>
151
148
  </li>
152
149
  </ul>
@@ -154,12 +151,12 @@ function outcomeClass(outcome: EnvironmentProbeReport['operations'][number]['out
154
151
  whole attempt. The two ways an operation fails to reach the list are rendered SEPARATELY
155
152
  because they send a reader somewhere different: one says the agent reported more than is
156
153
  shown, the other says its reply was malformed. -->
157
- <p v-if="report.operationsOmitted" class="mt-1 text-[11px] text-slate-500">
154
+ <p v-if="report.operationsOmitted" class="mt-1 text-[11px] text-dimmed">
158
155
  {{
159
156
  t('inspector.testConfig.envProbe.operationsOmitted', { count: report.operationsOmitted })
160
157
  }}
161
158
  </p>
162
- <p v-if="report.operationsUnreadable" class="mt-1 text-[11px] text-slate-500">
159
+ <p v-if="report.operationsUnreadable" class="mt-1 text-[11px] text-dimmed">
163
160
  {{
164
161
  t('inspector.testConfig.envProbe.operationsUnreadable', {
165
162
  count: report.operationsUnreadable,
@@ -168,8 +165,8 @@ function outcomeClass(outcome: EnvironmentProbeReport['operations'][number]['out
168
165
  </p>
169
166
  </div>
170
167
 
171
- <p v-if="report.summary" class="text-[11px] text-slate-400">{{ report.summary }}</p>
172
- <p v-if="report.model" class="text-[11px] text-slate-600">
168
+ <p v-if="report.summary" class="text-[11px] text-muted">{{ report.summary }}</p>
169
+ <p v-if="report.model" class="text-[11px] text-app-600">
173
170
  {{ t('inspector.testConfig.envProbe.model', { model: report.model }) }}
174
171
  </p>
175
172
  </div>
@@ -52,34 +52,30 @@ const groups = computed(() => {
52
52
  default-open
53
53
  >
54
54
  <template #actions>
55
- <span class="text-[11px] text-slate-500">{{
55
+ <span class="text-[11px] text-dimmed">{{
56
56
  t('inspector.epicChildren.doneCount', { done, total: members.length })
57
57
  }}</span>
58
58
  </template>
59
59
 
60
- <div v-if="members.length === 0" class="text-[11px] text-slate-500">
60
+ <div v-if="members.length === 0" class="text-[11px] text-dimmed">
61
61
  {{ t('inspector.epicChildren.empty') }}
62
62
  </div>
63
63
 
64
64
  <div v-else class="space-y-2">
65
- <div
66
- v-for="(group, gi) in groups"
67
- :key="gi"
68
- class="rounded-md border border-slate-700/60 p-2"
69
- >
70
- <div class="mb-1 flex items-center gap-1 text-[11px] font-medium text-slate-300">
71
- <UIcon name="i-lucide-box" class="h-3 w-3 text-slate-500" />
65
+ <div v-for="(group, gi) in groups" :key="gi" class="rounded-md border border-muted/60 p-2">
66
+ <div class="mb-1 flex items-center gap-1 text-[11px] font-medium text-toned">
67
+ <UIcon name="i-lucide-box" class="h-3 w-3 text-dimmed" />
72
68
  {{ group.service?.title ?? t('inspector.epicChildren.unassigned') }}
73
69
  </div>
74
70
  <div v-for="(mod, mi) in [...group.modules.values()]" :key="mi" class="ps-1">
75
- <div v-if="mod.module" class="text-[10px] uppercase tracking-wide text-slate-500">
71
+ <div v-if="mod.module" class="text-[10px] uppercase tracking-wide text-dimmed">
76
72
  {{ mod.module.title }}
77
73
  </div>
78
74
  <button
79
75
  v-for="task in mod.tasks"
80
76
  :key="task.id"
81
77
  type="button"
82
- class="flex w-full items-center gap-1.5 rounded px-1 py-0.5 text-start text-xs text-slate-200 hover:bg-slate-800"
78
+ class="flex w-full items-center gap-1.5 rounded px-1 py-0.5 text-start text-xs text-default hover:bg-elevated"
83
79
  @click="ui.select(task.id)"
84
80
  >
85
81
  <span
@@ -87,7 +83,7 @@ const groups = computed(() => {
87
83
  :style="{ backgroundColor: STATUS_META[task.status].color }"
88
84
  />
89
85
  <span class="truncate">{{ task.title }}</span>
90
- <span class="ms-auto shrink-0 text-[10px] text-slate-500">
86
+ <span class="ms-auto shrink-0 text-[10px] text-dimmed">
91
87
  {{ STATUS_META[task.status].label }}
92
88
  </span>
93
89
  </button>
@@ -66,13 +66,13 @@ const rows = computed(() => {
66
66
 
67
67
  <template>
68
68
  <div v-if="rows.length || duplicates.length" class="space-y-1.5" data-testid="frontend-resolved">
69
- <div class="text-[11px] font-semibold uppercase tracking-wide text-slate-500">
69
+ <div class="text-[11px] font-semibold uppercase tracking-wide text-dimmed">
70
70
  {{ t('inspector.frontendConfig.resolved.title') }}
71
71
  </div>
72
72
 
73
73
  <p
74
74
  v-if="duplicates.length"
75
- class="text-[11px] leading-snug text-amber-300/80"
75
+ class="text-[11px] leading-snug text-app-warning-300/80"
76
76
  data-testid="frontend-resolved-duplicates"
77
77
  >
78
78
  {{ t('inspector.frontendConfig.resolved.duplicateWarning', { vars: duplicates.join(', ') }) }}
@@ -88,21 +88,21 @@ const rows = computed(() => {
88
88
  <span
89
89
  class="mt-1 h-1.5 w-1.5 shrink-0 rounded-full"
90
90
  :class="{
91
- 'bg-emerald-400': row.kind === 'live',
92
- 'bg-amber-400': row.kind === 'service-offline',
93
- 'bg-slate-500': row.kind === 'mock',
91
+ 'bg-app-success-400': row.kind === 'live',
92
+ 'bg-app-warning-400': row.kind === 'service-offline',
93
+ 'bg-app-500': row.kind === 'mock',
94
94
  }"
95
95
  />
96
- <span class="font-mono text-slate-300">{{ row.envVar }}</span>
97
- <span class="text-slate-600">→</span>
96
+ <span class="font-mono text-toned">{{ row.envVar }}</span>
97
+ <span class="text-app-600">→</span>
98
98
  <template v-if="row.kind === 'live'">
99
- <span class="truncate font-mono text-emerald-300/90">{{ row.serviceUrl }}</span>
100
- <span v-if="row.serviceTitle" class="text-slate-500">({{ row.serviceTitle }})</span>
99
+ <span class="truncate font-mono text-app-success-300/90">{{ row.serviceUrl }}</span>
100
+ <span v-if="row.serviceTitle" class="text-dimmed">({{ row.serviceTitle }})</span>
101
101
  </template>
102
- <span v-else-if="row.kind === 'service-offline'" class="text-amber-300/80">
102
+ <span v-else-if="row.kind === 'service-offline'" class="text-app-warning-300/80">
103
103
  {{ t('inspector.frontendConfig.resolved.serviceOffline', { service: row.serviceTitle }) }}
104
104
  </span>
105
- <span v-else class="text-slate-500">
105
+ <span v-else class="text-dimmed">
106
106
  {{ t('inspector.frontendConfig.resolved.mock') }}
107
107
  </span>
108
108
  </li>
@@ -229,13 +229,11 @@ onUnmounted(() => preview.stopPolling(props.block.id))
229
229
  persisted until Apply. Only shown when the frame is linked to a repo. -->
230
230
  <div
231
231
  v-if="repoLink"
232
- class="space-y-2 rounded border border-slate-800 bg-slate-900/40 p-2"
232
+ class="space-y-2 rounded border border-default bg-default/40 p-2"
233
233
  data-testid="frontend-detect"
234
234
  >
235
235
  <div class="flex items-center justify-between gap-2">
236
- <span class="text-[11px] text-slate-400">{{
237
- t('inspector.frontendConfig.detect.title')
238
- }}</span>
236
+ <span class="text-[11px] text-muted">{{ t('inspector.frontendConfig.detect.title') }}</span>
239
237
  <UButton
240
238
  size="xs"
241
239
  variant="soft"
@@ -248,16 +246,16 @@ onUnmounted(() => preview.stopPolling(props.block.id))
248
246
  {{ t('inspector.frontendConfig.detect.button') }}
249
247
  </UButton>
250
248
  </div>
251
- <p class="text-[11px] leading-snug text-slate-500">
249
+ <p class="text-[11px] leading-snug text-dimmed">
252
250
  {{ t('inspector.frontendConfig.detect.hint') }}
253
251
  </p>
254
252
 
255
- <p v-if="detectError" class="text-[11px] text-rose-300/80">
253
+ <p v-if="detectError" class="text-[11px] text-app-error-300/80">
256
254
  {{ detectError }}
257
255
  </p>
258
256
 
259
257
  <template v-if="detectResult && !detecting">
260
- <p v-if="!detectResult.detected" class="text-[11px] text-amber-300/80">
258
+ <p v-if="!detectResult.detected" class="text-[11px] text-app-warning-300/80">
261
259
  {{ t('inspector.frontendConfig.detect.none') }}
262
260
  </p>
263
261
 
@@ -265,9 +263,13 @@ onUnmounted(() => preview.stopPolling(props.block.id))
265
263
  <li
266
264
  v-for="(n, i) in detectResult.notes"
267
265
  :key="i"
268
- class="flex items-start gap-1.5 text-[11px] leading-snug text-slate-500"
266
+ class="flex items-start gap-1.5 text-[11px] leading-snug text-dimmed"
269
267
  >
270
- <span :class="n.confidence === 'high' ? 'text-emerald-400/70' : 'text-amber-400/70'">
268
+ <span
269
+ :class="
270
+ n.confidence === 'high' ? 'text-app-success-400/70' : 'text-app-warning-400/70'
271
+ "
272
+ >
271
273
  {{
272
274
  n.confidence === 'high'
273
275
  ? t('inspector.frontendConfig.detect.confidenceHigh')
@@ -308,7 +310,7 @@ onUnmounted(() => preview.stopPolling(props.block.id))
308
310
  <!-- Build: package manager + frontend directory + install command + build script + output dir -->
309
311
  <InspectorSection v-model:open="showBuild" :title="t('inspector.frontendConfig.groups.build')">
310
312
  <div class="space-y-1">
311
- <span class="text-[11px] text-slate-400">{{
313
+ <span class="text-[11px] text-muted">{{
312
314
  t('inspector.frontendConfig.packageManager')
313
315
  }}</span>
314
316
  <div class="flex flex-wrap gap-1">
@@ -326,9 +328,7 @@ onUnmounted(() => preview.stopPolling(props.block.id))
326
328
  </div>
327
329
 
328
330
  <div class="space-y-1">
329
- <label class="text-[11px] text-slate-400">{{
330
- t('inspector.frontendConfig.directory')
331
- }}</label>
331
+ <label class="text-[11px] text-muted">{{ t('inspector.frontendConfig.directory') }}</label>
332
332
  <UInput
333
333
  :model-value="config.directory ?? ''"
334
334
  size="xs"
@@ -340,13 +340,13 @@ onUnmounted(() => preview.stopPolling(props.block.id))
340
340
  (e: KeyboardEvent) => saveText('directory', (e.target as HTMLInputElement).value)
341
341
  "
342
342
  />
343
- <p class="text-[11px] leading-snug text-slate-500">
343
+ <p class="text-[11px] leading-snug text-dimmed">
344
344
  {{ t('inspector.frontendConfig.directoryHint') }}
345
345
  </p>
346
346
  </div>
347
347
 
348
348
  <div class="space-y-1">
349
- <label class="text-[11px] text-slate-400">{{
349
+ <label class="text-[11px] text-muted">{{
350
350
  t('inspector.frontendConfig.installCommand')
351
351
  }}</label>
352
352
  <UInput
@@ -366,7 +366,7 @@ onUnmounted(() => preview.stopPolling(props.block.id))
366
366
 
367
367
  <div class="grid grid-cols-2 gap-2">
368
368
  <div class="space-y-1">
369
- <label class="text-[11px] text-slate-400">{{
369
+ <label class="text-[11px] text-muted">{{
370
370
  t('inspector.frontendConfig.buildScript')
371
371
  }}</label>
372
372
  <UInput
@@ -382,7 +382,7 @@ onUnmounted(() => preview.stopPolling(props.block.id))
382
382
  />
383
383
  </div>
384
384
  <div class="space-y-1">
385
- <label class="text-[11px] text-slate-400">{{
385
+ <label class="text-[11px] text-muted">{{
386
386
  t('inspector.frontendConfig.outputDir')
387
387
  }}</label>
388
388
  <UInput
@@ -403,9 +403,7 @@ onUnmounted(() => preview.stopPolling(props.block.id))
403
403
  <!-- Serve: mode (static vs command) + serve script (command mode) + port -->
404
404
  <InspectorSection v-model:open="showServe" :title="t('inspector.frontendConfig.groups.serve')">
405
405
  <div class="space-y-1">
406
- <span class="text-[11px] text-slate-400">{{
407
- t('inspector.frontendConfig.serveMode')
408
- }}</span>
406
+ <span class="text-[11px] text-muted">{{ t('inspector.frontendConfig.serveMode') }}</span>
409
407
  <div class="flex flex-wrap gap-1">
410
408
  <UButton
411
409
  :color="serveMode === 'static' ? 'primary' : 'neutral'"
@@ -425,21 +423,21 @@ onUnmounted(() => preview.stopPolling(props.block.id))
425
423
  </UButton>
426
424
  </div>
427
425
  <!-- Explain each mode, and disambiguate from the separate envInjection axis. -->
428
- <p class="text-[11px] leading-snug text-slate-500">
429
- <span class="text-slate-400">{{ t('inspector.frontendConfig.serveStatic') }}:</span>
426
+ <p class="text-[11px] leading-snug text-dimmed">
427
+ <span class="text-muted">{{ t('inspector.frontendConfig.serveStatic') }}:</span>
430
428
  {{ t('inspector.frontendConfig.serveStaticDesc') }}
431
429
  </p>
432
- <p class="text-[11px] leading-snug text-slate-500">
433
- <span class="text-slate-400">{{ t('inspector.frontendConfig.serveCommand') }}:</span>
430
+ <p class="text-[11px] leading-snug text-dimmed">
431
+ <span class="text-muted">{{ t('inspector.frontendConfig.serveCommand') }}:</span>
434
432
  {{ t('inspector.frontendConfig.serveCommandDesc') }}
435
433
  </p>
436
- <p class="text-[11px] leading-snug text-slate-500/80">
434
+ <p class="text-[11px] leading-snug text-dimmed/80">
437
435
  {{ t('inspector.frontendConfig.serveEnvAxisNote') }}
438
436
  </p>
439
437
  </div>
440
438
 
441
439
  <div v-if="serveMode === 'command'" class="space-y-1">
442
- <label class="text-[11px] text-slate-400">{{
440
+ <label class="text-[11px] text-muted">{{
443
441
  t('inspector.frontendConfig.serveScript')
444
442
  }}</label>
445
443
  <UInput
@@ -456,9 +454,7 @@ onUnmounted(() => preview.stopPolling(props.block.id))
456
454
  </div>
457
455
 
458
456
  <div class="space-y-1">
459
- <label class="text-[11px] text-slate-400">{{
460
- t('inspector.frontendConfig.servePort')
461
- }}</label>
457
+ <label class="text-[11px] text-muted">{{ t('inspector.frontendConfig.servePort') }}</label>
462
458
  <UInput
463
459
  :model-value="config.servePort != null ? String(config.servePort) : ''"
464
460
  type="number"
@@ -479,7 +475,7 @@ onUnmounted(() => preview.stopPolling(props.block.id))
479
475
  :title="t('inspector.frontendConfig.groups.mocking')"
480
476
  >
481
477
  <div class="space-y-1">
482
- <label class="text-[11px] text-slate-400">{{
478
+ <label class="text-[11px] text-muted">{{
483
479
  t('inspector.frontendConfig.mockMappingsPath')
484
480
  }}</label>
485
481
  <UInput
@@ -495,7 +491,7 @@ onUnmounted(() => preview.stopPolling(props.block.id))
495
491
  (e: KeyboardEvent) => saveText('mockMappingsPath', (e.target as HTMLInputElement).value)
496
492
  "
497
493
  />
498
- <p class="text-[11px] leading-snug text-slate-500">
494
+ <p class="text-[11px] leading-snug text-dimmed">
499
495
  {{ t('inspector.frontendConfig.mockMappingsHint') }}
500
496
  </p>
501
497
  </div>
@@ -525,7 +521,7 @@ onUnmounted(() => preview.stopPolling(props.block.id))
525
521
  {{ t('inspector.frontendConfig.envRuntime') }}
526
522
  </UButton>
527
523
  </div>
528
- <p class="text-[11px] leading-snug text-slate-500">
524
+ <p class="text-[11px] leading-snug text-dimmed">
529
525
  {{ t('inspector.frontendConfig.envInjectionHint') }}
530
526
  </p>
531
527
  </div>
@@ -578,14 +574,14 @@ onUnmounted(() => preview.stopPolling(props.block.id))
578
574
  />
579
575
  </div>
580
576
  </div>
581
- <div v-else class="text-[11px] text-slate-500">
577
+ <div v-else class="text-[11px] text-dimmed">
582
578
  {{ t('inspector.frontendConfig.bindings.empty') }}
583
579
  </div>
584
580
 
585
581
  <!-- How the bindings resolve RIGHT NOW: each env var → a bound service's live ephemeral
586
582
  URL, or WireMock — plus the duplicate-env-var warning. The same view a UI-test run
587
583
  would resolve against (shared helpers), so what you see is what a run will drive. -->
588
- <div class="border-t border-slate-800/60 pt-2">
584
+ <div class="border-t border-default/60 pt-2">
589
585
  <FrontendBindingsResolved :config="config" />
590
586
  </div>
591
587
  </div>
@@ -607,7 +603,7 @@ onUnmounted(() => preview.stopPolling(props.block.id))
607
603
  save({ previewEnabled: v === true ? true : undefined })
608
604
  "
609
605
  />
610
- <p class="mt-1 text-[11px] leading-snug text-slate-500">
606
+ <p class="mt-1 text-[11px] leading-snug text-dimmed">
611
607
  {{
612
608
  previewSupported
613
609
  ? t('inspector.frontendConfig.previewHint')
@@ -621,10 +617,10 @@ onUnmounted(() => preview.stopPolling(props.block.id))
621
617
  <span
622
618
  class="text-[11px] font-medium"
623
619
  :class="{
624
- 'text-emerald-400': previewStatus === 'ready',
625
- 'text-amber-400': previewStatus === 'starting',
626
- 'text-rose-400': previewStatus === 'failed',
627
- 'text-slate-400': previewStatus === 'stopped',
620
+ 'text-app-success-400': previewStatus === 'ready',
621
+ 'text-app-warning-400': previewStatus === 'starting',
622
+ 'text-app-error-400': previewStatus === 'failed',
623
+ 'text-muted': previewStatus === 'stopped',
628
624
  }"
629
625
  data-testid="preview-status"
630
626
  >
@@ -675,7 +671,7 @@ onUnmounted(() => preview.stopPolling(props.block.id))
675
671
 
676
672
  <p
677
673
  v-if="previewStatus === 'failed' && previewState?.error"
678
- class="text-[11px] leading-snug text-rose-400"
674
+ class="text-[11px] leading-snug text-app-error-400"
679
675
  data-testid="preview-error"
680
676
  >
681
677
  {{ previewState.error }}
@@ -683,7 +679,7 @@ onUnmounted(() => preview.stopPolling(props.block.id))
683
679
 
684
680
  <p
685
681
  v-if="previewRequestError"
686
- class="text-[11px] leading-snug text-rose-400"
682
+ class="text-[11px] leading-snug text-app-error-400"
687
683
  data-testid="preview-request-error"
688
684
  >
689
685
  {{ previewRequestError }}
@@ -52,12 +52,12 @@ function control(action: 'pause' | 'resume' | 'cancel') {
52
52
  <UBadge color="primary" variant="subtle" size="sm">
53
53
  {{ t(INITIATIVE_STATUS_LABEL_KEYS[status]) }}
54
54
  </UBadge>
55
- <span v-if="progress" class="text-[11px] text-slate-400">
55
+ <span v-if="progress" class="text-[11px] text-muted">
56
56
  {{ t('initiative.card.progress', { done: progress.settled, total: progress.total }) }}
57
57
  </span>
58
58
  </div>
59
59
 
60
- <p v-if="initiative?.goal" class="whitespace-pre-wrap text-[12px] text-slate-300">
60
+ <p v-if="initiative?.goal" class="whitespace-pre-wrap text-[12px] text-toned">
61
61
  {{ initiative.goal }}
62
62
  </p>
63
63
 
@@ -165,7 +165,7 @@ function control(action: 'pause' | 'resume' | 'cancel') {
165
165
  </UButton>
166
166
  </div>
167
167
 
168
- <p class="text-[11px] text-slate-500">
168
+ <p class="text-[11px] text-dimmed">
169
169
  {{ t('initiative.inspector.hint') }}
170
170
  </p>
171
171
  </div>
@@ -24,26 +24,26 @@ if (props.defaultOpen) open.value = true
24
24
  </script>
25
25
 
26
26
  <template>
27
- <section class="border-t border-slate-800 pt-2" data-testid="inspector-section">
27
+ <section class="border-t border-default pt-2" data-testid="inspector-section">
28
28
  <div class="flex items-center gap-1.5">
29
29
  <button
30
30
  type="button"
31
- class="flex min-w-0 flex-1 items-center gap-1.5 text-start text-[11px] font-semibold uppercase tracking-wide text-slate-400 hover:text-slate-200"
31
+ class="flex min-w-0 flex-1 items-center gap-1.5 text-start text-[11px] font-semibold uppercase tracking-wide text-muted hover:text-default"
32
32
  :aria-expanded="open"
33
33
  data-testid="inspector-section-toggle"
34
34
  @click="open = !open"
35
35
  >
36
36
  <UIcon
37
37
  :name="open ? 'i-lucide-chevron-down' : 'i-lucide-chevron-right'"
38
- class="h-3.5 w-3.5 shrink-0 text-slate-500"
38
+ class="h-3.5 w-3.5 shrink-0 text-dimmed"
39
39
  />
40
40
  <UIcon v-if="icon" :name="icon" class="h-3.5 w-3.5 shrink-0" />
41
41
  <span class="truncate">{{ title }}</span>
42
- <span v-if="count" class="font-normal normal-case text-slate-500">({{ count }})</span>
42
+ <span v-if="count" class="font-normal normal-case text-dimmed">({{ count }})</span>
43
43
  <UIcon
44
44
  v-if="warning"
45
45
  name="i-lucide-triangle-alert"
46
- class="h-3.5 w-3.5 shrink-0 text-amber-400"
46
+ class="h-3.5 w-3.5 shrink-0 text-app-warning-400"
47
47
  />
48
48
  </button>
49
49
  <!-- An action ("+", attach, menu) mutates the body list, so expand (never collapse)
@@ -53,7 +53,7 @@ if (props.defaultOpen) open.value = true
53
53
  </div>
54
54
  </div>
55
55
  <div v-if="open" class="mt-2 space-y-3">
56
- <p v-if="hint" class="text-[11px] leading-snug text-slate-500">{{ hint }}</p>
56
+ <p v-if="hint" class="text-[11px] leading-snug text-dimmed">{{ hint }}</p>
57
57
  <slot />
58
58
  </div>
59
59
  </section>
@@ -103,10 +103,10 @@ async function runNow() {
103
103
  }
104
104
 
105
105
  const RUN_COLOR: Record<string, string> = {
106
- running: 'text-amber-400',
107
- done: 'text-emerald-400',
108
- failed: 'text-rose-400',
109
- skipped: 'text-slate-500',
106
+ running: 'text-app-warning-400',
107
+ done: 'text-app-success-400',
108
+ failed: 'text-app-error-400',
109
+ skipped: 'text-dimmed',
110
110
  }
111
111
  const RUN_STATUS_KEYS: Record<string, string> = {
112
112
  running: 'inspector.recurring.runStatus.running',
@@ -123,13 +123,10 @@ function fmtTime(ms: number) {
123
123
  </script>
124
124
 
125
125
  <template>
126
- <div
127
- v-if="schedule"
128
- class="space-y-2 rounded-lg border border-indigo-900/50 bg-indigo-950/20 p-3"
129
- >
126
+ <div v-if="schedule" class="space-y-2 rounded-lg border border-primary/50 bg-primary/10 p-3">
130
127
  <div class="flex items-center justify-between">
131
128
  <span
132
- class="flex items-center gap-1.5 text-[11px] font-semibold uppercase tracking-wide text-indigo-300"
129
+ class="flex items-center gap-1.5 text-[11px] font-semibold uppercase tracking-wide text-primary"
133
130
  >
134
131
  <UIcon name="i-lucide-repeat" class="h-3.5 w-3.5" />
135
132
  {{ t('inspector.recurring.title') }}
@@ -149,13 +146,13 @@ function fmtTime(ms: number) {
149
146
  </UBadge>
150
147
  </div>
151
148
 
152
- <p class="text-[11px] text-slate-400">
153
- <span class="text-slate-300">{{ pipelineName }}</span>
149
+ <p class="text-[11px] text-muted">
150
+ <span class="text-toned">{{ pipelineName }}</span>
154
151
  </p>
155
152
 
156
153
  <!-- On-demand: no cadence, no pause/resume — it fires only when a person triggers it. -->
157
154
  <template v-if="schedule.onDemand">
158
- <p class="text-[11px] text-slate-500">{{ t('inspector.recurring.onDemandHint') }}</p>
155
+ <p class="text-[11px] text-dimmed">{{ t('inspector.recurring.onDemandHint') }}</p>
159
156
  <div class="flex flex-wrap gap-1.5 pt-1">
160
157
  <UButton size="xs" variant="soft" icon="i-lucide-play" :loading="busy" @click="runNow">
161
158
  {{ t('inspector.recurring.runNow') }}
@@ -164,8 +161,8 @@ function fmtTime(ms: number) {
164
161
  </template>
165
162
 
166
163
  <template v-else-if="!editing">
167
- <p class="text-[11px] text-slate-400">{{ describeCadence(schedule.recurrence) }}</p>
168
- <p class="text-[11px] text-slate-500">
164
+ <p class="text-[11px] text-muted">{{ describeCadence(schedule.recurrence) }}</p>
165
+ <p class="text-[11px] text-dimmed">
169
166
  {{ t('inspector.recurring.nextRun', { time: fmtTime(schedule.nextRunAt) }) }}
170
167
  </p>
171
168
  <div class="flex flex-wrap gap-1.5 pt-1">
@@ -215,16 +212,16 @@ function fmtTime(ms: number) {
215
212
  </template>
216
213
 
217
214
  <!-- run history -->
218
- <div v-if="runs.length" class="space-y-1 border-t border-slate-800 pt-2">
219
- <span class="text-[10px] font-semibold uppercase tracking-wide text-slate-500">
215
+ <div v-if="runs.length" class="space-y-1 border-t border-default pt-2">
216
+ <span class="text-[10px] font-semibold uppercase tracking-wide text-dimmed">
220
217
  {{ t('inspector.recurring.recentRuns') }}
221
218
  </span>
222
219
  <div v-for="run in runs" :key="run.id" class="flex items-center gap-2 text-[11px]">
223
- <span :class="RUN_COLOR[run.status] ?? 'text-slate-400'" class="w-14 shrink-0">
220
+ <span :class="RUN_COLOR[run.status] ?? 'text-muted'" class="w-14 shrink-0">
224
221
  {{ runStatusLabel(run.status) }}
225
222
  </span>
226
- <span class="truncate text-slate-500">{{ fmtTime(run.startedAt) }}</span>
227
- <span v-if="run.outcome" class="ms-auto truncate text-slate-500">{{ run.outcome }}</span>
223
+ <span class="truncate text-dimmed">{{ fmtTime(run.startedAt) }}</span>
224
+ <span v-if="run.outcome" class="ms-auto truncate text-dimmed">{{ run.outcome }}</span>
228
225
  </div>
229
226
  </div>
230
227
  </div>
@@ -135,12 +135,12 @@ const usedBy = computed(() =>
135
135
  />
136
136
  </div>
137
137
  </div>
138
- <div v-else class="text-[11px] text-slate-500">
138
+ <div v-else class="text-[11px] text-dimmed">
139
139
  {{ t('inspector.serviceConnections.empty') }}
140
140
  </div>
141
141
 
142
142
  <div v-if="usedBy.length" class="space-y-1" data-testid="service-connections-used-by">
143
- <span class="text-[11px] text-slate-400">{{ t('inspector.serviceConnections.usedBy') }}</span>
143
+ <span class="text-[11px] text-muted">{{ t('inspector.serviceConnections.usedBy') }}</span>
144
144
  <div class="flex flex-wrap gap-1">
145
145
  <UBadge v-for="f in usedBy" :key="f.id" size="sm" variant="soft" color="neutral">
146
146
  {{ f.title || f.id }}