@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
@@ -391,7 +391,7 @@ async function copyOutput() {
391
391
  v-if="open && step && agent"
392
392
  data-testid="step-detail"
393
393
  :data-agent-kind="step?.agentKind"
394
- class="fixed inset-0 z-50 flex max-h-[100dvh] bg-slate-950/96 backdrop-blur-sm"
394
+ class="fixed inset-0 z-50 flex max-h-[100dvh] bg-app-950/96 backdrop-blur-sm"
395
395
  role="dialog"
396
396
  aria-modal="true"
397
397
  >
@@ -399,10 +399,10 @@ async function copyOutput() {
399
399
  <aside
400
400
  v-if="outline.hasToc"
401
401
  data-testid="step-detail-toc"
402
- class="hidden w-72 shrink-0 flex-col border-e border-slate-800 bg-slate-900/60 md:flex"
402
+ class="hidden w-72 shrink-0 flex-col border-e border-default bg-default/60 md:flex"
403
403
  >
404
- <div class="border-b border-slate-800 px-4 py-3">
405
- <div class="text-[11px] font-semibold uppercase tracking-wide text-slate-500">
404
+ <div class="border-b border-default px-4 py-3">
405
+ <div class="text-[11px] font-semibold uppercase tracking-wide text-dimmed">
406
406
  {{ t('panels.stepDetail.contents') }}
407
407
  </div>
408
408
  </div>
@@ -411,8 +411,8 @@ async function copyOutput() {
411
411
  class="block w-full truncate rounded-md px-2 py-1 text-start text-[13px] transition"
412
412
  :class="
413
413
  activeId === 'step-details'
414
- ? 'bg-indigo-500/15 font-medium text-indigo-200'
415
- : 'text-slate-400 hover:bg-slate-800/60 hover:text-slate-200'
414
+ ? 'bg-primary/15 font-medium text-primary'
415
+ : 'text-muted hover:bg-elevated/60 hover:text-default'
416
416
  "
417
417
  @click="goTo('step-details')"
418
418
  >
@@ -424,8 +424,8 @@ async function copyOutput() {
424
424
  class="block w-full truncate rounded-md px-2 py-1 text-start text-[13px] transition"
425
425
  :class="
426
426
  activeId === s.id
427
- ? 'bg-indigo-500/15 font-medium text-indigo-200'
428
- : 'text-slate-400 hover:bg-slate-800/60 hover:text-slate-200'
427
+ ? 'bg-primary/15 font-medium text-primary'
428
+ : 'text-muted hover:bg-elevated/60 hover:text-default'
429
429
  "
430
430
  :style="{ paddingLeft: `${(s.depth - outline.minDepth) * 0.85 + 0.5}rem` }"
431
431
  :title="s.title"
@@ -438,16 +438,16 @@ async function copyOutput() {
438
438
 
439
439
  <!-- main column -->
440
440
  <div class="flex min-w-0 flex-1 flex-col">
441
- <header class="flex items-center gap-3 border-b border-slate-800 px-6 py-4">
441
+ <header class="flex items-center gap-3 border-b border-default px-6 py-4">
442
442
  <div
443
443
  class="flex h-9 w-9 shrink-0 items-center justify-center rounded-lg"
444
- :style="{ backgroundColor: agent.color + '22' }"
444
+ :style="{ backgroundColor: tint(agent.color) }"
445
445
  >
446
446
  <UIcon :name="agent.icon" class="h-5 w-5" :style="{ color: agent.color }" />
447
447
  </div>
448
448
  <div class="min-w-0">
449
- <h1 class="truncate text-base font-semibold text-white">{{ agent.label }}</h1>
450
- <p v-if="block" class="truncate text-xs text-slate-500">{{ block.title }}</p>
449
+ <h1 class="truncate text-base font-semibold text-highlighted">{{ agent.label }}</h1>
450
+ <p v-if="block" class="truncate text-xs text-dimmed">{{ block.title }}</p>
451
451
  </div>
452
452
  <div class="ms-auto flex items-center gap-1.5">
453
453
  <UBadge
@@ -519,7 +519,7 @@ async function copyOutput() {
519
519
  <section
520
520
  id="step-details"
521
521
  :ref="(el) => (sectionEls['step-details'] = el as HTMLElement | null)"
522
- class="scroll-mt-4 rounded-xl border border-slate-800 bg-slate-900/50 p-4"
522
+ class="scroll-mt-4 rounded-xl border border-default bg-default/50 p-4"
523
523
  >
524
524
  <StepMetadataCard
525
525
  :step="step"
@@ -599,11 +599,11 @@ async function copyOutput() {
599
599
 
600
600
  <div
601
601
  v-if="parkPresentation"
602
- class="rounded-xl border border-amber-500/30 bg-amber-500/5 p-4"
602
+ class="rounded-xl border border-app-warning-500/30 bg-app-warning-500/5 p-4"
603
603
  data-testid="dedicated-park-redirect"
604
604
  :data-park="dedicatedPark"
605
605
  >
606
- <p class="text-[13px] leading-relaxed text-amber-200/90">
606
+ <p class="text-[13px] leading-relaxed text-app-warning-200/90">
607
607
  {{ t(parkPresentation.noticeKey) }}
608
608
  </p>
609
609
  <UButton
@@ -640,7 +640,7 @@ async function copyOutput() {
640
640
  <li
641
641
  v-for="(note, i) in runNotes"
642
642
  :key="i"
643
- class="flex items-start gap-1.5 text-[11px] leading-snug text-amber-300/80"
643
+ class="flex items-start gap-1.5 text-[11px] leading-snug text-app-warning-300/80"
644
644
  >
645
645
  <UIcon name="i-lucide-info" class="mt-0.5 h-3.5 w-3.5 shrink-0" />
646
646
  <span>{{ note }}</span>
@@ -755,7 +755,7 @@ async function copyOutput() {
755
755
  <!-- edit-then-approve: a direct editor over the raw conclusions; the
756
756
  edits become the approved proposal that flows to the next step -->
757
757
  <section v-if="editing" class="scroll-mt-4">
758
- <div class="mb-2 flex items-center gap-1.5 text-[11px] text-amber-400">
758
+ <div class="mb-2 flex items-center gap-1.5 text-[11px] text-app-warning-400">
759
759
  <UIcon name="i-lucide-pencil" class="h-3.5 w-3.5" />
760
760
  <span class="font-semibold uppercase tracking-wide">{{
761
761
  t('panels.stepDetail.editingConclusions')
@@ -783,16 +783,16 @@ async function copyOutput() {
783
783
  >
784
784
  <button
785
785
  v-if="s.depth > 0"
786
- class="group flex w-full items-center gap-2 rounded-md py-1 text-start transition hover:text-white"
786
+ class="group flex w-full items-center gap-2 rounded-md py-1 text-start transition hover:text-highlighted"
787
787
  @click="toggle(s.id)"
788
788
  >
789
789
  <UIcon
790
790
  name="i-lucide-chevron-right"
791
- class="h-4 w-4 shrink-0 text-slate-500 transition-transform group-hover:text-slate-300"
791
+ class="h-4 w-4 shrink-0 text-dimmed transition-transform group-hover:text-toned"
792
792
  :class="collapsed[s.id] ? '' : 'rotate-90'"
793
793
  />
794
794
  <span
795
- class="font-semibold text-slate-100"
795
+ class="font-semibold text-app-100"
796
796
  :class="s.depth <= 1 ? 'text-lg' : s.depth === 2 ? 'text-base' : 'text-sm'"
797
797
  v-html="s.titleHtml"
798
798
  />
@@ -800,7 +800,7 @@ async function copyOutput() {
800
800
  <!-- eslint-disable-next-line vue/no-v-html -->
801
801
  <div
802
802
  v-show="!collapsed[s.id]"
803
- class="reader-prose mt-1 text-[13px] leading-relaxed text-slate-300"
803
+ class="reader-prose mt-1 text-[13px] leading-relaxed text-toned"
804
804
  :class="[
805
805
  s.depth > 0 ? 'ps-6' : '',
806
806
  genericApprovalPending && !editing ? 'review-mode' : '',
@@ -813,7 +813,7 @@ async function copyOutput() {
813
813
 
814
814
  <p
815
815
  v-else
816
- class="rounded-lg border border-dashed border-slate-800 py-6 text-center text-sm text-slate-500"
816
+ class="rounded-lg border border-dashed border-default py-6 text-center text-sm text-dimmed"
817
817
  >
818
818
  {{ t('panels.stepDetail.noProseOutput') }}
819
819
  </p>
@@ -826,24 +826,28 @@ async function copyOutput() {
826
826
  bottom sheet (still reachable) below lg, so the gate is always actionable. -->
827
827
  <aside
828
828
  v-if="genericApprovalPending"
829
- class="absolute inset-x-0 bottom-0 z-10 flex max-h-[70dvh] flex-col rounded-t-2xl border-t border-slate-700 bg-slate-900/95 shadow-2xl backdrop-blur lg:static lg:inset-auto lg:z-auto lg:max-h-none lg:w-96 lg:shrink-0 lg:rounded-none lg:border-s lg:border-t-0 lg:border-slate-800 lg:bg-slate-900/60 lg:shadow-none lg:backdrop-blur-none"
829
+ class="absolute inset-x-0 bottom-0 z-10 flex max-h-[70dvh] flex-col rounded-t-2xl border-t border-muted bg-default/95 shadow-2xl backdrop-blur lg:static lg:inset-auto lg:z-auto lg:max-h-none lg:w-96 lg:shrink-0 lg:rounded-none lg:border-s lg:border-t-0 lg:border-default lg:bg-default/60 lg:shadow-none lg:backdrop-blur-none"
830
830
  >
831
- <div class="border-b border-slate-800 px-4 py-3">
832
- <div class="text-[11px] font-semibold uppercase tracking-wide text-amber-400">
831
+ <div class="border-b border-default px-4 py-3">
832
+ <div class="text-[11px] font-semibold uppercase tracking-wide text-app-warning-400">
833
833
  {{
834
834
  editing
835
835
  ? t('panels.stepDetail.approveWithCorrections')
836
836
  : t('panels.stepDetail.reviewAndApprove')
837
837
  }}
838
838
  </div>
839
- <p class="mt-1 text-[12px] text-slate-400">
839
+ <p class="mt-1 text-[12px] text-muted">
840
840
  {{ editing ? t('panels.stepDetail.editHint') : t('panels.stepDetail.reviewHint') }}
841
841
  </p>
842
842
  <!-- The gate's configured POLICY, when it has one. Both lines exist because an
843
843
  approve on such a gate legitimately may not advance the run: without the tally, a
844
844
  correctly-recorded approval is indistinguishable from a call that failed, and
845
845
  without the refusal a person would press a button the server answers 403. -->
846
- <p v-if="gateQuorum" class="mt-1 text-[12px] text-amber-300/90" data-testid="gate-quorum">
846
+ <p
847
+ v-if="gateQuorum"
848
+ class="mt-1 text-[12px] text-app-warning-300/90"
849
+ data-testid="gate-quorum"
850
+ >
847
851
  {{
848
852
  t('panels.stepDetail.quorumProgress', {
849
853
  recorded: gateQuorum.recorded,
@@ -852,11 +856,7 @@ async function copyOutput() {
852
856
  }}
853
857
  <span v-if="viewerHasApproved">{{ t('panels.stepDetail.quorumYours') }}</span>
854
858
  </p>
855
- <p
856
- v-if="gateRefusal"
857
- class="mt-1 text-[12px] text-slate-400"
858
- data-testid="gate-not-approver"
859
- >
859
+ <p v-if="gateRefusal" class="mt-1 text-[12px] text-muted" data-testid="gate-not-approver">
860
860
  {{ t(GATE_REFUSAL_KEYS[gateRefusal]) }}
861
861
  </p>
862
862
  </div>
@@ -864,7 +864,7 @@ async function copyOutput() {
864
864
  <div class="flex-1 space-y-3 overflow-auto overscroll-contain px-4 py-3">
865
865
  <p
866
866
  v-if="editing"
867
- class="rounded-lg border border-amber-500/30 bg-amber-500/5 p-3 text-[12px] leading-relaxed text-amber-200/90"
867
+ class="rounded-lg border border-app-warning-500/30 bg-app-warning-500/5 p-3 text-[12px] leading-relaxed text-app-warning-200/90"
868
868
  >
869
869
  {{ t('panels.stepDetail.editingNotice') }}
870
870
  </p>
@@ -873,13 +873,13 @@ async function copyOutput() {
873
873
  <div
874
874
  v-if="draftTarget"
875
875
  data-testid="step-review-composer"
876
- class="rounded-lg border border-indigo-500/40 bg-indigo-500/5 p-3"
876
+ class="rounded-lg border border-primary/40 bg-primary/5 p-3"
877
877
  >
878
- <div class="mb-1 text-[10px] uppercase tracking-wide text-indigo-300">
878
+ <div class="mb-1 text-[10px] uppercase tracking-wide text-primary">
879
879
  {{ t('panels.stepDetail.commentingOn') }}
880
880
  </div>
881
881
  <pre
882
- class="mb-2 max-h-24 overflow-auto whitespace-pre-wrap rounded bg-slate-950/60 p-2 text-[11px] text-slate-300"
882
+ class="mb-2 max-h-24 overflow-auto whitespace-pre-wrap rounded bg-app-950/60 p-2 text-[11px] text-toned"
883
883
  >{{ draftTarget.quotedSource }}</pre>
884
884
  <UTextarea
885
885
  v-model="draftBody"
@@ -911,14 +911,14 @@ async function copyOutput() {
911
911
  v-for="(c, idx) in reviewComments"
912
912
  :key="idx"
913
913
  data-testid="step-review-comment"
914
- class="rounded-lg border border-slate-800 bg-slate-900/50 p-3"
914
+ class="rounded-lg border border-default bg-default/50 p-3"
915
915
  >
916
916
  <div class="mb-1 flex items-start justify-between gap-2">
917
- <div class="text-[10px] uppercase tracking-wide text-slate-500">
917
+ <div class="text-[10px] uppercase tracking-wide text-dimmed">
918
918
  {{ t('panels.stepDetail.commentN', { number: idx + 1 }) }}
919
919
  </div>
920
920
  <button
921
- class="text-slate-500 transition hover:text-rose-400"
921
+ class="text-dimmed transition hover:text-app-error-400"
922
922
  :title="t('panels.stepDetail.removeComment')"
923
923
  @click="removeComment(idx)"
924
924
  >
@@ -926,15 +926,13 @@ async function copyOutput() {
926
926
  </button>
927
927
  </div>
928
928
  <pre
929
- class="mb-1 max-h-20 overflow-auto whitespace-pre-wrap rounded bg-slate-950/50 p-1.5 text-[10px] text-slate-400"
929
+ class="mb-1 max-h-20 overflow-auto whitespace-pre-wrap rounded bg-app-950/50 p-1.5 text-[10px] text-muted"
930
930
  >{{ c.quotedSource }}</pre>
931
- <p class="text-[12px] text-slate-200">{{ c.body }}</p>
931
+ <p class="text-[12px] text-default">{{ c.body }}</p>
932
932
  </div>
933
933
 
934
934
  <div>
935
- <label
936
- class="mb-1 block text-[11px] font-semibold uppercase tracking-wide text-slate-400"
937
- >
935
+ <label class="mb-1 block text-[11px] font-semibold uppercase tracking-wide text-muted">
938
936
  {{ t('panels.stepDetail.overallFeedback') }}
939
937
  </label>
940
938
  <UTextarea
@@ -953,7 +951,7 @@ async function copyOutput() {
953
951
  <!-- edit-then-approve actions -->
954
952
  <div
955
953
  v-if="editing"
956
- class="space-y-2 border-t border-slate-800 px-4 pt-3 pb-[calc(0.75rem+env(safe-area-inset-bottom))]"
954
+ class="space-y-2 border-t border-default px-4 pt-3 pb-[calc(0.75rem+env(safe-area-inset-bottom))]"
957
955
  >
958
956
  <UButton
959
957
  color="primary"
@@ -979,7 +977,7 @@ async function copyOutput() {
979
977
 
980
978
  <div
981
979
  v-else
982
- class="space-y-2 border-t border-slate-800 px-4 pt-3 pb-[calc(0.75rem+env(safe-area-inset-bottom))]"
980
+ class="space-y-2 border-t border-default px-4 pt-3 pb-[calc(0.75rem+env(safe-area-inset-bottom))]"
983
981
  >
984
982
  <UButton
985
983
  color="primary"
@@ -1007,20 +1005,23 @@ async function copyOutput() {
1007
1005
  </UButton>
1008
1006
  <p
1009
1007
  v-else-if="!proposalEditable"
1010
- class="text-[10px] text-slate-500"
1008
+ class="text-[10px] text-dimmed"
1011
1009
  data-testid="step-rendered-output-note"
1012
1010
  >
1013
1011
  {{ t('panels.stepDetail.renderedOutputNote') }}
1014
1012
  </p>
1015
1013
  <!-- Withheld only until the quorum is one approval away, so it says so rather than
1016
1014
  leaving a reviewer to wonder where the affordance went. -->
1017
- <p v-else class="text-[10px] text-slate-500" data-testid="step-quorum-edit-locked">
1015
+ <p v-else class="text-[10px] text-dimmed" data-testid="step-quorum-edit-locked">
1018
1016
  {{ t('panels.stepDetail.quorumEditLocked') }}
1019
1017
  </p>
1020
1018
 
1021
1019
  <!-- destructive: a two-step inline confirm instead of a native dialog -->
1022
- <div v-if="rejectArmed" class="rounded-lg border border-rose-500/40 bg-rose-500/5 p-2.5">
1023
- <p class="mb-2 text-[11px] text-rose-200">
1020
+ <div
1021
+ v-if="rejectArmed"
1022
+ class="rounded-lg border border-app-error-500/40 bg-app-error-500/5 p-2.5"
1023
+ >
1024
+ <p class="mb-2 text-[11px] text-app-error-200">
1024
1025
  {{ t('panels.stepDetail.rejectConfirmPrompt') }}
1025
1026
  </p>
1026
1027
  <div class="flex gap-2">
@@ -1072,7 +1073,7 @@ async function copyOutput() {
1072
1073
  {{ t('panels.stepDetail.reject') }}
1073
1074
  </UButton>
1074
1075
  </div>
1075
- <p class="text-[10px] text-slate-500">
1076
+ <p class="text-[10px] text-dimmed">
1076
1077
  {{ t('panels.stepDetail.requestChangesHint') }}
1077
1078
  </p>
1078
1079
  </div>
@@ -23,14 +23,12 @@ function formatClock(ms: number | null | undefined, fmt: 'short' | 'long'): stri
23
23
  <template>
24
24
  <div class="flex items-center gap-2">
25
25
  <UIcon v-if="icon" :name="icon" class="h-3.5 w-3.5 shrink-0" :class="iconClass" />
26
- <span class="text-[13px] font-medium text-slate-200">{{ label }}</span>
26
+ <span class="text-[13px] font-medium text-default">{{ label }}</span>
27
27
  <UBadge :color="outcome === 'failed' ? 'error' : 'neutral'" variant="subtle" size="sm">{{
28
28
  outcomeLabel
29
29
  }}</UBadge>
30
- <span
31
- v-if="formatClock(at, dateFormat ?? 'short')"
32
- class="ms-auto text-[11px] text-slate-500"
33
- >{{ formatClock(at, dateFormat ?? 'short') }}</span
34
- >
30
+ <span v-if="formatClock(at, dateFormat ?? 'short')" class="ms-auto text-[11px] text-dimmed">{{
31
+ formatClock(at, dateFormat ?? 'short')
32
+ }}</span>
35
33
  </div>
36
34
  </template>
@@ -55,27 +55,27 @@ async function choose(option: string) {
55
55
  <UModal v-model:open="open" :title="t('panels.decision.title')">
56
56
  <template #body>
57
57
  <div v-if="decision && agent" class="space-y-4" data-testid="decision-modal">
58
- <div class="flex items-center gap-2 text-sm text-slate-400">
58
+ <div class="flex items-center gap-2 text-sm text-muted">
59
59
  <div
60
60
  class="flex h-8 w-8 items-center justify-center rounded-lg"
61
- :style="{ backgroundColor: agent.color + '22' }"
61
+ :style="{ backgroundColor: tint(agent.color) }"
62
62
  >
63
63
  <UIcon :name="agent.icon" class="h-4 w-4" :style="{ color: agent.color }" />
64
64
  </div>
65
65
  <div>
66
66
  <i18n-t v-if="block" keypath="panels.decision.agentOnBlock" tag="span" scope="global">
67
67
  <template #agent>
68
- <span class="font-medium text-slate-200">{{ agent.label }}</span>
68
+ <span class="font-medium text-default">{{ agent.label }}</span>
69
69
  </template>
70
70
  <template #block>
71
- <span class="font-medium text-slate-200">{{ block.title }}</span>
71
+ <span class="font-medium text-default">{{ block.title }}</span>
72
72
  </template>
73
73
  </i18n-t>
74
- <span v-else class="font-medium text-slate-200">{{ agent.label }}</span>
74
+ <span v-else class="font-medium text-default">{{ agent.label }}</span>
75
75
  </div>
76
76
  </div>
77
77
 
78
- <p class="text-base font-medium text-white">{{ decision.question }}</p>
78
+ <p class="text-base font-medium text-highlighted">{{ decision.question }}</p>
79
79
 
80
80
  <div class="grid gap-2">
81
81
  <UButton
@@ -93,7 +93,7 @@ async function choose(option: string) {
93
93
  {{ opt }}
94
94
  </UButton>
95
95
  </div>
96
- <p class="text-[11px] text-slate-500">
96
+ <p class="text-[11px] text-dimmed">
97
97
  {{ t('panels.decision.visualizationHint') }}
98
98
  </p>
99
99
  </div>
@@ -58,7 +58,7 @@ const customJson = computed<string | null>(() => {
58
58
  <ResultWindowShell
59
59
  :open="open"
60
60
  :icon="meta?.icon ?? 'i-lucide-braces'"
61
- icon-class="bg-cyan-500/15 text-cyan-300"
61
+ icon-class="bg-app-hue-cyan/15 text-app-hue-cyan"
62
62
  :title="headerTitle"
63
63
  :subtitle="meta?.description ?? t('panels.structuredResult.fallbackDescription')"
64
64
  :step-ref="{ instanceId, stepIndex }"
@@ -71,28 +71,28 @@ const customJson = computed<string | null>(() => {
71
71
  <MarkdownProse
72
72
  v-if="step?.output"
73
73
  :text="step.output"
74
- class="mb-4 text-[13px] leading-relaxed text-slate-300"
74
+ class="mb-4 text-[13px] leading-relaxed text-toned"
75
75
  />
76
76
 
77
77
  <template v-if="customJson">
78
78
  <div class="mb-2 flex items-center gap-2">
79
- <h3 class="text-[11px] font-semibold uppercase tracking-wide text-slate-500">
79
+ <h3 class="text-[11px] font-semibold uppercase tracking-wide text-dimmed">
80
80
  {{ t('panels.structuredResult.structuredOutput') }}
81
81
  </h3>
82
82
  <CopyButton :text="customJson" class="-my-1" />
83
83
  </div>
84
84
  <pre
85
- class="overflow-x-auto rounded-lg border border-slate-800 bg-slate-950/60 p-3 text-[12px] leading-relaxed text-slate-200"
85
+ class="overflow-x-auto rounded-lg border border-default bg-app-950/60 p-3 text-[12px] leading-relaxed text-default"
86
86
  ><code>{{ customJson }}</code></pre>
87
87
  </template>
88
88
 
89
89
  <div
90
90
  v-else-if="!step?.output"
91
- class="flex h-full flex-col items-center justify-center gap-2 text-center text-slate-400"
91
+ class="flex h-full flex-col items-center justify-center gap-2 text-center text-muted"
92
92
  >
93
93
  <UIcon name="i-lucide-braces" class="h-8 w-8 opacity-40" />
94
94
  <p class="text-sm">{{ t('panels.structuredResult.noResult') }}</p>
95
- <p class="max-w-sm text-[11px] text-slate-500">
95
+ <p class="max-w-sm text-[11px] text-dimmed">
96
96
  {{ t('panels.structuredResult.noResultHint') }}
97
97
  </p>
98
98
  </div>
@@ -100,7 +100,7 @@ const customJson = computed<string | null>(() => {
100
100
 
101
101
  <!-- Sidebar: shared run metadata + observability rollup -->
102
102
  <aside
103
- class="hidden w-60 shrink-0 flex-col gap-4 border-s border-slate-800 bg-slate-900/50 px-4 py-4 lg:flex"
103
+ class="hidden w-60 shrink-0 flex-col gap-4 border-s border-default bg-default/50 px-4 py-4 lg:flex"
104
104
  >
105
105
  <StepRunMeta
106
106
  v-if="step"
@@ -342,7 +342,7 @@ const showOriginalDescription = ref(false)
342
342
  v-if="block && statusMeta && typeMeta"
343
343
  data-testid="inspector-panel"
344
344
  :data-inspector-block="block.id"
345
- class="fixed inset-x-0 bottom-0 z-20 overflow-hidden rounded-t-2xl border border-slate-700 bg-slate-900/95 shadow-2xl backdrop-blur lg:absolute lg:inset-x-auto lg:bottom-auto lg:end-4 lg:top-16 lg:w-80 lg:rounded-2xl"
345
+ class="fixed inset-x-0 bottom-0 z-20 overflow-hidden rounded-t-2xl border border-muted bg-default/95 shadow-2xl backdrop-blur lg:absolute lg:inset-x-auto lg:bottom-auto lg:end-4 lg:top-16 lg:w-80 lg:rounded-2xl"
346
346
  >
347
347
  <div class="h-1.5 w-full" :style="{ backgroundColor: statusMeta.color }" />
348
348
  <!-- A tall task (execution steps + scenarios + docs) can overflow the
@@ -358,17 +358,17 @@ const showOriginalDescription = ref(false)
358
358
  <div class="flex items-center gap-2">
359
359
  <div
360
360
  class="flex h-9 w-9 items-center justify-center rounded-lg"
361
- :style="{ backgroundColor: typeMeta.accent + '22' }"
361
+ :style="{ backgroundColor: tint(typeMeta.accent) }"
362
362
  >
363
363
  <UIcon :name="typeMeta.icon" class="h-5 w-5" :style="{ color: typeMeta.accent }" />
364
364
  </div>
365
365
  <div>
366
- <div class="text-sm font-semibold text-white">{{ block.title }}</div>
366
+ <div class="text-sm font-semibold text-highlighted">{{ block.title }}</div>
367
367
  <div class="mt-0.5 flex items-center gap-1.5">
368
368
  <UBadge :color="statusMeta.chip" variant="subtle" size="sm">
369
369
  {{ statusLabel }}
370
370
  </UBadge>
371
- <span class="text-[10px] uppercase tracking-wide text-slate-500">{{ level }}</span>
371
+ <span class="text-[10px] uppercase tracking-wide text-dimmed">{{ level }}</span>
372
372
  </div>
373
373
  </div>
374
374
  </div>
@@ -401,18 +401,18 @@ const showOriginalDescription = ref(false)
401
401
  <!-- reworked: the standardized requirements document takes focus; the raw
402
402
  description is frozen and tucked behind an expander. -->
403
403
  <template v-if="frozenByRework">
404
- <div class="rounded-lg border border-emerald-900/60 bg-emerald-950/20 p-3">
404
+ <div class="rounded-lg border border-app-success-900/60 bg-app-success-950/20 p-3">
405
405
  <div
406
- class="mb-1.5 flex items-center gap-1.5 text-[11px] font-semibold uppercase tracking-wide text-emerald-400"
406
+ class="mb-1.5 flex items-center gap-1.5 text-[11px] font-semibold uppercase tracking-wide text-app-success-400"
407
407
  >
408
408
  <UIcon name="i-lucide-file-check-2" class="h-3.5 w-3.5" />
409
409
  {{ t('panels.inspector.reworkedRequirements') }}
410
410
  </div>
411
- <p class="line-clamp-5 whitespace-pre-line text-[13px] leading-relaxed text-slate-300">
411
+ <p class="line-clamp-5 whitespace-pre-line text-[13px] leading-relaxed text-toned">
412
412
  {{ reqReworkedText }}
413
413
  </p>
414
414
  <div class="mt-2 flex items-center justify-between gap-2">
415
- <p class="text-[11px] text-slate-500">
415
+ <p class="text-[11px] text-dimmed">
416
416
  {{ t('panels.inspector.agentStepsUseDocument') }}
417
417
  </p>
418
418
  <UButton
@@ -464,23 +464,23 @@ const showOriginalDescription = ref(false)
464
464
  @change="saveDescription"
465
465
  @blur="saveDescription"
466
466
  />
467
- <p v-if="isTask && !editable" class="flex items-center gap-1 text-[11px] text-slate-500">
467
+ <p v-if="isTask && !editable" class="flex items-center gap-1 text-[11px] text-dimmed">
468
468
  <UIcon name="i-lucide-lock" class="h-3 w-3" />
469
469
  {{ t('panels.inspector.taskStartedLocked') }}
470
470
  </p>
471
471
 
472
472
  <!-- prior incorporated requirements kept as a base after a review-driven reset -->
473
- <div v-if="reqHasPriorDoc" class="rounded-lg border border-slate-700 bg-slate-800/40 p-3">
473
+ <div v-if="reqHasPriorDoc" class="rounded-lg border border-muted bg-elevated/40 p-3">
474
474
  <div
475
- class="mb-1.5 flex items-center gap-1.5 text-[11px] font-semibold uppercase tracking-wide text-slate-400"
475
+ class="mb-1.5 flex items-center gap-1.5 text-[11px] font-semibold uppercase tracking-wide text-muted"
476
476
  >
477
477
  <UIcon name="i-lucide-history" class="h-3.5 w-3.5" />
478
478
  {{ t('panels.inspector.lastIncorporatedRequirements') }}
479
479
  </div>
480
- <p class="line-clamp-5 whitespace-pre-line text-[13px] leading-relaxed text-slate-300">
480
+ <p class="line-clamp-5 whitespace-pre-line text-[13px] leading-relaxed text-toned">
481
481
  {{ reqReworkedText }}
482
482
  </p>
483
- <p class="mt-2 text-[11px] text-slate-500">
483
+ <p class="mt-2 text-[11px] text-dimmed">
484
484
  {{ t('panels.inspector.priorDocHint') }}
485
485
  </p>
486
486
  </div>
@@ -493,10 +493,10 @@ const showOriginalDescription = ref(false)
493
493
  <!-- running bootstrap: show the steps, let the user inspect it, let them stop it -->
494
494
  <div
495
495
  v-else-if="runningRun"
496
- class="space-y-2 rounded-lg border border-amber-900/60 bg-amber-950/30 px-3 py-2"
496
+ class="space-y-2 rounded-lg border border-app-warning-900/60 bg-app-warning-950/30 px-3 py-2"
497
497
  >
498
498
  <div class="flex items-center justify-between gap-2">
499
- <span class="flex items-center gap-1.5 text-xs text-amber-300">
499
+ <span class="flex items-center gap-1.5 text-xs text-app-warning-300">
500
500
  <UIcon name="i-lucide-loader-circle" class="h-3.5 w-3.5 animate-spin" />
501
501
  {{ t('panels.inspector.bootstrapping') }}
502
502
  </span>
@@ -586,7 +586,7 @@ const showOriginalDescription = ref(false)
586
586
  >
587
587
  {{ t('panels.inspector.mapService') }}
588
588
  </UButton>
589
- <p v-if="isFrame && !serviceRepo" class="text-[11px] text-slate-500">
589
+ <p v-if="isFrame && !serviceRepo" class="text-[11px] text-dimmed">
590
590
  {{ t('panels.inspector.mapServiceNoRepo') }}
591
591
  </p>
592
592
 
@@ -613,7 +613,7 @@ const showOriginalDescription = ref(false)
613
613
  on a disabled button doesn't fire hover events. -->
614
614
  <p
615
615
  v-if="isTask && runBlockedReason"
616
- class="flex items-start gap-1.5 text-[11px] text-amber-300/90"
616
+ class="flex items-start gap-1.5 text-[11px] text-app-warning-300/90"
617
617
  data-testid="run-blocked-reason"
618
618
  >
619
619
  <UIcon name="i-lucide-lock" class="mt-px h-3 w-3 shrink-0" />