@cat-factory/app 0.302.2 → 0.303.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (328) hide show
  1. package/README.md +99 -14
  2. package/app/app.config.ts +19 -10
  3. package/app/assets/css/main.css +13 -13
  4. package/app/assets/css/prose.css +22 -22
  5. package/app/assets/css/tokens.css +298 -0
  6. package/app/components/assistant/AssistantModal.vue +22 -22
  7. package/app/components/auth/AuthGate.vue +1 -1
  8. package/app/components/auth/BackendMisconfiguredScreen.vue +10 -10
  9. package/app/components/auth/LoginScreen.vue +34 -36
  10. package/app/components/auth/ResetPasswordScreen.vue +12 -12
  11. package/app/components/auth/UserMenu.vue +4 -4
  12. package/app/components/binaryCandidates/BinaryCandidatesWindow.vue +27 -25
  13. package/app/components/binaryOutput/BinaryOutputReport.vue +15 -15
  14. package/app/components/binaryOutput/StoredAssetView.vue +5 -5
  15. package/app/components/board/AddTaskModal.vue +17 -20
  16. package/app/components/board/AgentFailureCard.vue +11 -11
  17. package/app/components/board/AgentFailureHistory.vue +2 -2
  18. package/app/components/board/BoardCanvas.vue +6 -5
  19. package/app/components/board/CreateInitiativeModal.vue +8 -10
  20. package/app/components/board/DependencyConnectOverlay.vue +1 -1
  21. package/app/components/board/FailureHistoryList.vue +7 -7
  22. package/app/components/board/RecurringPipelineModal.vue +17 -17
  23. package/app/components/board/ReviewFrictionDialog.vue +6 -6
  24. package/app/components/board/StepExecutionHistory.vue +13 -13
  25. package/app/components/board/TaskDependencyEdges.vue +8 -8
  26. package/app/components/board/nodes/AgentChip.vue +10 -10
  27. package/app/components/board/nodes/BlockNode.vue +29 -29
  28. package/app/components/board/nodes/DecisionBadge.vue +2 -2
  29. package/app/components/board/nodes/EpicNode.vue +14 -10
  30. package/app/components/board/nodes/FrameSwimlanes.vue +7 -9
  31. package/app/components/board/nodes/InitiativeCard.vue +8 -8
  32. package/app/components/board/nodes/LaneGroup.vue +1 -1
  33. package/app/components/board/nodes/LaneTask.vue +2 -2
  34. package/app/components/board/nodes/ResizeGrips.vue +4 -4
  35. package/app/components/board/nodes/TaskCard.vue +18 -18
  36. package/app/components/board/nodes/TaskLane.vue +5 -5
  37. package/app/components/board/nodes/TaskPipelineMini.vue +18 -18
  38. package/app/components/bootstrap/AdoptionReviewModal.vue +29 -26
  39. package/app/components/bootstrap/BootstrapModal.vue +21 -23
  40. package/app/components/bootstrap/BootstrapRunSteps.vue +1 -1
  41. package/app/components/brainstorm/BrainstormWindow.vue +30 -33
  42. package/app/components/bugFishing/BugFishingWindow.vue +49 -49
  43. package/app/components/clarity/ClarityReviewWindow.vue +30 -30
  44. package/app/components/common/AsyncViewError.vue +5 -5
  45. package/app/components/common/ClarificationItem.vue +8 -13
  46. package/app/components/common/ConfirmDialog.vue +4 -2
  47. package/app/components/common/DescriptorFields.vue +1 -1
  48. package/app/components/common/EmptyState.vue +3 -3
  49. package/app/components/common/InterviewGateNotice.vue +7 -7
  50. package/app/components/common/KeyboardShortcutsHelp.vue +1 -1
  51. package/app/components/common/MarkdownProse.vue +14 -13
  52. package/app/components/consensus/ConsensusSessionWindow.vue +26 -26
  53. package/app/components/context/ContextAttachmentFields.vue +17 -17
  54. package/app/components/docs/DocInterviewWindow.vue +14 -14
  55. package/app/components/documents/ContextDocumentPicker.vue +17 -17
  56. package/app/components/documents/DocumentImportModal.vue +7 -7
  57. package/app/components/documents/DocumentSourceConnectModal.vue +3 -3
  58. package/app/components/documents/DocumentSyncState.vue +5 -5
  59. package/app/components/documents/DocumentTemplatesModal.vue +15 -15
  60. package/app/components/documents/RepoContextDocPicker.vue +5 -5
  61. package/app/components/documents/SpawnPreviewModal.vue +12 -12
  62. package/app/components/documents/StartFromDesignModal.vue +11 -11
  63. package/app/components/documents/TaskContextDocs.vue +5 -5
  64. package/app/components/environments/EnvSetupStepper.vue +6 -6
  65. package/app/components/environments/EnvironmentStatusPanel.vue +17 -17
  66. package/app/components/environments/steps/EnvPickStep.vue +3 -3
  67. package/app/components/environments/steps/EnvPreflightStep.vue +9 -9
  68. package/app/components/environments/steps/EnvReviewStep.vue +25 -22
  69. package/app/components/environments/steps/EnvSaveStep.vue +7 -5
  70. package/app/components/environments/steps/JourneyStepNav.vue +1 -1
  71. package/app/components/focus/BlockFocusView.vue +17 -19
  72. package/app/components/followUp/FollowUpWindow.vue +23 -23
  73. package/app/components/forkDecision/ForkDecisionWindow.vue +37 -39
  74. package/app/components/foundational/FoundationalContractSummary.vue +7 -7
  75. package/app/components/foundational/FoundationalServiceCatalogList.vue +11 -11
  76. package/app/components/foundational/FoundationalServiceManager.vue +1 -1
  77. package/app/components/foundational/FoundationalServiceRegistry.vue +13 -13
  78. package/app/components/foundational/FoundationalServiceSources.vue +13 -13
  79. package/app/components/foundational/FoundationalSuppressions.vue +7 -7
  80. package/app/components/foundational/ServiceCatalogConnection.vue +10 -10
  81. package/app/components/fragments/FragmentLibraryManager.vue +41 -44
  82. package/app/components/fragments/FragmentSelector.vue +13 -13
  83. package/app/components/fragments/GitHubDocUrlImport.vue +1 -1
  84. package/app/components/gates/GateFailingCheckList.vue +5 -5
  85. package/app/components/gates/GateResultView.vue +50 -47
  86. package/app/components/github/AddServiceFromRepoModal.vue +14 -14
  87. package/app/components/github/BranchProtectionPreflight.vue +13 -13
  88. package/app/components/github/GitHubConnect.vue +7 -7
  89. package/app/components/github/GitHubOnboarding.vue +7 -7
  90. package/app/components/github/GitHubPanel.vue +37 -40
  91. package/app/components/github/RepoTreeBrowser.vue +18 -18
  92. package/app/components/humanTest/HumanTestWindow.vue +30 -33
  93. package/app/components/initiative/InitiativePlanNotice.vue +5 -5
  94. package/app/components/initiative/InitiativePlanReview.vue +27 -29
  95. package/app/components/initiative/InitiativePlanningWindow.vue +10 -10
  96. package/app/components/initiative/InitiativeTrackerWindow.vue +71 -65
  97. package/app/components/inputGate/InputGateNotice.vue +2 -4
  98. package/app/components/judge/JudgeResultView.vue +30 -32
  99. package/app/components/kaizen/KaizenPanel.vue +40 -36
  100. package/app/components/kaizen/KaizenStepStatus.vue +21 -21
  101. package/app/components/layout/AccountAuditLog.vue +10 -10
  102. package/app/components/layout/AccountDeploymentSettings.vue +20 -20
  103. package/app/components/layout/AccountFailureKindRules.vue +13 -13
  104. package/app/components/layout/AccountFoundationalSettings.vue +1 -1
  105. package/app/components/layout/AccountFragmentSettings.vue +1 -1
  106. package/app/components/layout/AccountModelPolicySettings.vue +9 -9
  107. package/app/components/layout/AccountPlatformAlertSettings.vue +11 -11
  108. package/app/components/layout/AccountRiskPolicySettings.vue +2 -2
  109. package/app/components/layout/AccountRunCredentialSettings.vue +5 -5
  110. package/app/components/layout/AccountSkillSettings.vue +1 -1
  111. package/app/components/layout/AccountTeamSettings.vue +23 -15
  112. package/app/components/layout/AiProvidersBanner.vue +11 -8
  113. package/app/components/layout/AppearanceSwitcher.vue +108 -0
  114. package/app/components/layout/BoardSwitcher.vue +8 -11
  115. package/app/components/layout/BoardToolbar.vue +3 -3
  116. package/app/components/layout/CommandBar.vue +7 -9
  117. package/app/components/layout/ConnectionStatusBanner.vue +2 -2
  118. package/app/components/layout/DefaultTestEnvBanner.vue +5 -5
  119. package/app/components/layout/GitHubPatBanner.vue +5 -5
  120. package/app/components/layout/GitHubPatPermissionsBanner.vue +16 -10
  121. package/app/components/layout/InfraSetupBanner.vue +6 -6
  122. package/app/components/layout/IntegrationsHub.vue +15 -15
  123. package/app/components/layout/LanguageSwitcher.vue +5 -5
  124. package/app/components/layout/ModelProvidersHub.vue +13 -16
  125. package/app/components/layout/NotificationsInbox.vue +10 -10
  126. package/app/components/layout/PersonalSetupModal.vue +8 -8
  127. package/app/components/layout/ProviderConfigBanner.vue +4 -4
  128. package/app/components/layout/RolePrompt.vue +7 -7
  129. package/app/components/layout/SideBar.vue +6 -4
  130. package/app/components/layout/SpendWarningBanner.vue +17 -14
  131. package/app/components/layout/TranslationWarningBanner.vue +4 -4
  132. package/app/components/layout/UiModeSwitcher.vue +13 -13
  133. package/app/components/layout/UiRoleSwitcher.vue +8 -8
  134. package/app/components/layout/WorkspaceMembersSettings.vue +15 -11
  135. package/app/components/media/ArtifactLightbox.vue +13 -13
  136. package/app/components/media/ImageCompare.vue +31 -24
  137. package/app/components/merge/MergeEffortChips.vue +2 -2
  138. package/app/components/notifications/NotificationSettingsPanel.vue +14 -12
  139. package/app/components/observability/OutcomeFilterChips.vue +6 -6
  140. package/app/components/observability/RunFailureSummary.vue +28 -25
  141. package/app/components/observability/StepMetricsBar.vue +26 -28
  142. package/app/components/observability/StepModelActivity.vue +2 -2
  143. package/app/components/observability/ToolCallList.vue +24 -24
  144. package/app/components/outcome/OutcomeSummaryWindow.vue +47 -47
  145. package/app/components/palettes/AgentPalette.vue +8 -8
  146. package/app/components/palettes/AgentTierSelect.vue +1 -1
  147. package/app/components/palettes/PipelinePurposeSelect.vue +1 -1
  148. package/app/components/panels/AgentStepDetail.vue +52 -51
  149. package/app/components/panels/AttemptEntryHeader.vue +4 -6
  150. package/app/components/panels/DecisionModal.vue +7 -7
  151. package/app/components/panels/GenericStructuredResultView.vue +7 -7
  152. package/app/components/panels/InspectorPanel.vue +17 -17
  153. package/app/components/panels/MergerResultView.vue +19 -19
  154. package/app/components/panels/ObservabilityPanel.vue +115 -123
  155. package/app/components/panels/OperatorDashboardPanel.vue +89 -97
  156. package/app/components/panels/ReportsPanel.vue +69 -66
  157. package/app/components/panels/ReportsSpendBreakdown.vue +9 -9
  158. package/app/components/panels/ResultWindowShell.vue +38 -38
  159. package/app/components/panels/RunDetailLoadState.vue +2 -2
  160. package/app/components/panels/StepContainerStatus.vue +9 -9
  161. package/app/components/panels/StepDelegatedStatus.logic.spec.ts +135 -0
  162. package/app/components/panels/StepDelegatedStatus.logic.ts +160 -0
  163. package/app/components/panels/StepDelegatedStatus.vue +181 -0
  164. package/app/components/panels/StepEffortReport.vue +16 -15
  165. package/app/components/panels/StepFragmentAdherence.vue +14 -10
  166. package/app/components/panels/StepMetadataCard.vue +74 -45
  167. package/app/components/panels/StepReproductionReport.vue +25 -21
  168. package/app/components/panels/StepRunMeta.vue +20 -20
  169. package/app/components/panels/StepTestReport.logic.spec.ts +8 -3
  170. package/app/components/panels/StepTestReport.logic.ts +4 -4
  171. package/app/components/panels/StepTestReport.vue +28 -28
  172. package/app/components/panels/StepToolServers.vue +14 -11
  173. package/app/components/panels/StepValidationReport.vue +7 -7
  174. package/app/components/panels/inspector/ContainerSummary.vue +9 -9
  175. package/app/components/panels/inspector/DocReferenceRepos.vue +3 -3
  176. package/app/components/panels/inspector/EnvProbeReport.vue +24 -27
  177. package/app/components/panels/inspector/EpicChildren.vue +8 -12
  178. package/app/components/panels/inspector/FrontendBindingsResolved.vue +11 -11
  179. package/app/components/panels/inspector/FrontendConfig.vue +37 -41
  180. package/app/components/panels/inspector/InitiativeInspector.vue +3 -3
  181. package/app/components/panels/inspector/InspectorSection.vue +6 -6
  182. package/app/components/panels/inspector/RecurringScheduleSettings.vue +16 -19
  183. package/app/components/panels/inspector/ServiceConnections.vue +2 -2
  184. package/app/components/panels/inspector/ServiceReleaseHealthConfig.vue +2 -2
  185. package/app/components/panels/inspector/ServiceSelfTests.vue +21 -17
  186. package/app/components/panels/inspector/ServiceTestConfig.vue +51 -59
  187. package/app/components/panels/inspector/ServiceTestSecrets.vue +5 -5
  188. package/app/components/panels/inspector/ServiceTestingContext.vue +3 -3
  189. package/app/components/panels/inspector/ServiceValidationConfig.vue +2 -2
  190. package/app/components/panels/inspector/TaskAgentConfig.vue +3 -3
  191. package/app/components/panels/inspector/TaskAprioriBranches.vue +8 -5
  192. package/app/components/panels/inspector/TaskDependencies.vue +1 -1
  193. package/app/components/panels/inspector/TaskEstimateBadge.vue +11 -11
  194. package/app/components/panels/inspector/TaskExecution.vue +17 -17
  195. package/app/components/panels/inspector/TaskReviewTarget.vue +2 -2
  196. package/app/components/panels/inspector/TaskRunSettings.vue +35 -37
  197. package/app/components/panels/inspector/TaskStructure.vue +3 -3
  198. package/app/components/pipeline/AgentKindIcon.vue +1 -1
  199. package/app/components/pipeline/AgentPromptEditor.vue +17 -17
  200. package/app/components/pipeline/BinaryOutputStepPicker.vue +42 -56
  201. package/app/components/pipeline/EstimateThresholdFields.vue +4 -4
  202. package/app/components/pipeline/GateConfigFields.vue +13 -10
  203. package/app/components/pipeline/IterationCapPrompt.vue +4 -2
  204. package/app/components/pipeline/PipelineBuilder.vue +47 -55
  205. package/app/components/pipeline/PipelineHealthModal.vue +27 -29
  206. package/app/components/pipeline/PipelinePicker.vue +10 -10
  207. package/app/components/pipeline/PipelinePreview.vue +10 -10
  208. package/app/components/pipeline/PipelineProgress.vue +64 -67
  209. package/app/components/prReview/PrReviewPhaseBadge.vue +7 -7
  210. package/app/components/prReview/PrReviewWindow.vue +75 -77
  211. package/app/components/providers/AiPresetMismatchDialog.vue +5 -5
  212. package/app/components/providers/AiProviderOnboardingModal.vue +9 -9
  213. package/app/components/providers/ApiKeysSection.vue +13 -13
  214. package/app/components/providers/PersonalCredentialModal.vue +2 -2
  215. package/app/components/providers/PersonalSubscriptionSection.vue +10 -10
  216. package/app/components/providers/SignInRequiredNotice.vue +1 -1
  217. package/app/components/providers/VendorCredentialsModal.vue +10 -10
  218. package/app/components/provisioning/ProvisioningLogsDrawer.vue +13 -13
  219. package/app/components/ralph/RalphLoopResultView.vue +28 -30
  220. package/app/components/recurring/RecurrenceEditor.vue +2 -2
  221. package/app/components/requirements/RequirementsReviewWindow.vue +51 -58
  222. package/app/components/riskPolicy/RiskPolicyPicker.vue +12 -15
  223. package/app/components/riskPolicy/RiskPolicyPreview.vue +14 -14
  224. package/app/components/sandbox/SandboxPanel.vue +58 -59
  225. package/app/components/settings/AccountSettingsPanel.vue +1 -1
  226. package/app/components/settings/ApiTokensPanel.vue +10 -10
  227. package/app/components/settings/BudgetSettings.vue +18 -22
  228. package/app/components/settings/CapabilityCredentialsPanel.vue +15 -15
  229. package/app/components/settings/CloudflareHandlerSection.vue +20 -20
  230. package/app/components/settings/ComposeEnvironmentSetupSection.vue +13 -13
  231. package/app/components/settings/ConnectionTestVerdict.vue +3 -3
  232. package/app/components/settings/ConnectionWarnings.vue +1 -1
  233. package/app/components/settings/ConsensusGroupsSection.vue +27 -35
  234. package/app/components/settings/CustomManifestTypeEditor.vue +10 -10
  235. package/app/components/settings/DefaultProvisionTypeSection.vue +6 -6
  236. package/app/components/settings/InfraHandlersConfigurator.vue +24 -22
  237. package/app/components/settings/InfrastructureBackendPicker.vue +6 -6
  238. package/app/components/settings/InfrastructureWindow.vue +5 -5
  239. package/app/components/settings/IssueTrackerPanel.vue +29 -23
  240. package/app/components/settings/KubernetesEngineForm.vue +11 -11
  241. package/app/components/settings/KubernetesEnvironmentForm.vue +4 -4
  242. package/app/components/settings/LocalContainerPoolSettings.vue +6 -11
  243. package/app/components/settings/LocalModelEndpointsPanel.vue +20 -18
  244. package/app/components/settings/McpAuthorizeScreen.vue +13 -15
  245. package/app/components/settings/McpOAuthCallbackScreen.vue +16 -10
  246. package/app/components/settings/MergeClassRulesEditor.vue +6 -9
  247. package/app/components/settings/MergeRolePolicyEditor.vue +16 -16
  248. package/app/components/settings/ModelConfigurationPanel.vue +23 -30
  249. package/app/components/settings/ModelPresetHealthModal.vue +15 -13
  250. package/app/components/settings/ObservabilityConnectionPanel.vue +4 -4
  251. package/app/components/settings/OpenRouterCatalogPanel.vue +26 -19
  252. package/app/components/settings/PackageRegistriesPanel.vue +8 -8
  253. package/app/components/settings/ProviderConnectionTab.vue +8 -11
  254. package/app/components/settings/ProviderManifestEditor.vue +9 -9
  255. package/app/components/settings/ProviderPreferenceEditor.vue +8 -8
  256. package/app/components/settings/RiskPolicyCreateForm.vue +10 -10
  257. package/app/components/settings/RiskPolicyEditorRow.vue +14 -14
  258. package/app/components/settings/RiskPolicyHealthModal.vue +15 -13
  259. package/app/components/settings/RiskPolicyInheritedRow.vue +1 -1
  260. package/app/components/settings/RiskPolicyPanel.vue +10 -15
  261. package/app/components/settings/ServiceFragmentDefaultsPanel.vue +7 -7
  262. package/app/components/settings/SharedStacksPanel.vue +9 -12
  263. package/app/components/settings/TaskSourceCard.vue +4 -4
  264. package/app/components/settings/TaskTypeSuppressionsPanel.vue +6 -6
  265. package/app/components/settings/ToolServerChecklist.vue +36 -29
  266. package/app/components/settings/UsageSettings.vue +15 -15
  267. package/app/components/settings/UserSecretsSection.vue +9 -12
  268. package/app/components/settings/WorkspaceMetadataSettings.vue +5 -5
  269. package/app/components/settings/WorkspaceSettingsPanel.vue +47 -47
  270. package/app/components/skills/ReviewSkillQueue.vue +10 -10
  271. package/app/components/skills/SkillLibraryManager.vue +23 -20
  272. package/app/components/slack/SlackPanel.vue +13 -17
  273. package/app/components/spec/ServiceSpecWindow.vue +45 -42
  274. package/app/components/tasks/BugHuntModal.vue +24 -27
  275. package/app/components/tasks/ContextIssuePicker.vue +11 -11
  276. package/app/components/tasks/TaskContextIssues.vue +3 -3
  277. package/app/components/tasks/TaskImportModal.vue +7 -7
  278. package/app/components/tasks/TaskSourceConnectModal.vue +10 -8
  279. package/app/components/testing/TestReportWindow.vue +99 -82
  280. package/app/components/theme/ThemeImportModal.vue +115 -0
  281. package/app/components/tutorial/TutorialCatalogue.vue +9 -9
  282. package/app/components/tutorial/TutorialNudge.vue +5 -5
  283. package/app/components/tutorial/TutorialOverlay.vue +12 -12
  284. package/app/components/tutorial/TutorialPrompt.vue +6 -9
  285. package/app/components/vcs/GitLabConnect.vue +4 -4
  286. package/app/components/vcs/VcsConnectSurfaces.vue +2 -2
  287. package/app/components/visualConfirm/VisualConfirmationWindow.vue +36 -36
  288. package/app/composables/api/client.ts +6 -1
  289. package/app/composables/usePipelineErrorToast.ts +17 -0
  290. package/app/modular/agent-kinds.ts +24 -0
  291. package/app/pages/index.vue +5 -5
  292. package/app/plugins/theme.client.ts +125 -0
  293. package/app/spa-loading-template.html +52 -14
  294. package/app/stores/agents.ts +1 -1
  295. package/app/stores/theme.spec.ts +56 -0
  296. package/app/stores/theme.ts +87 -0
  297. package/app/types/domain.ts +19 -0
  298. package/app/types/execution.ts +4 -0
  299. package/app/utils/agentOutput.ts +1 -1
  300. package/app/utils/binaryOutput.ts +6 -6
  301. package/app/utils/bootstrapSteps.ts +14 -14
  302. package/app/utils/catalog.ts +87 -83
  303. package/app/utils/colorTint.ts +10 -0
  304. package/app/utils/failureKinds.ts +1 -0
  305. package/app/utils/observability.ts +3 -3
  306. package/app/utils/pipelineRender.ts +13 -17
  307. package/app/utils/swimlanes.ts +4 -4
  308. package/app/utils/theme/bootPalette.spec.ts +54 -0
  309. package/app/utils/theme/bootPalette.ts +108 -0
  310. package/app/utils/theme/builtins.spec.ts +38 -0
  311. package/app/utils/theme/builtins.ts +55 -0
  312. package/app/utils/theme/css.ts +162 -0
  313. package/app/utils/theme/doc.ts +353 -0
  314. package/app/utils/theme/link.ts +93 -0
  315. package/app/utils/theme/presets.ts +509 -0
  316. package/app/utils/theme/theme.spec.ts +224 -0
  317. package/i18n/locales/de.json +61 -4
  318. package/i18n/locales/en.json +70 -4
  319. package/i18n/locales/es.json +61 -4
  320. package/i18n/locales/fr.json +61 -4
  321. package/i18n/locales/he.json +61 -4
  322. package/i18n/locales/it.json +61 -4
  323. package/i18n/locales/ja.json +61 -4
  324. package/i18n/locales/pl.json +61 -4
  325. package/i18n/locales/tr.json +61 -4
  326. package/i18n/locales/uk.json +61 -4
  327. package/nuxt.config.ts +37 -11
  328. package/package.json +10 -9
@@ -264,7 +264,7 @@ async function remove(k: ApiKey) {
264
264
  <template>
265
265
  <div class="space-y-4">
266
266
  <div>
267
- <h4 class="text-xs font-semibold uppercase tracking-wide text-slate-500">
267
+ <h4 class="text-xs font-semibold uppercase tracking-wide text-dimmed">
268
268
  {{
269
269
  category === 'proxy'
270
270
  ? t('providers.apiKeys.proxyHeading')
@@ -272,18 +272,18 @@ async function remove(k: ApiKey) {
272
272
  }}
273
273
  </h4>
274
274
  <template v-if="category === 'proxy'">
275
- <p v-if="isAccount" class="mt-1 text-sm text-slate-400">
275
+ <p v-if="isAccount" class="mt-1 text-sm text-muted">
276
276
  {{ t('providers.apiKeys.proxyAccountIntro') }}
277
277
  </p>
278
- <p v-else class="mt-1 text-sm text-slate-400">
278
+ <p v-else class="mt-1 text-sm text-muted">
279
279
  {{ t('providers.apiKeys.proxyIntro') }}
280
280
  </p>
281
281
  </template>
282
282
  <template v-else>
283
- <p v-if="isAccount" class="mt-1 text-sm text-slate-400">
283
+ <p v-if="isAccount" class="mt-1 text-sm text-muted">
284
284
  {{ t('providers.apiKeys.directAccountIntro') }}
285
285
  </p>
286
- <p v-else class="mt-1 text-sm text-slate-400">
286
+ <p v-else class="mt-1 text-sm text-muted">
287
287
  {{ t('providers.apiKeys.directIntro') }}
288
288
  </p>
289
289
  </template>
@@ -324,7 +324,7 @@ async function remove(k: ApiKey) {
324
324
 
325
325
  <!-- where to get the key -->
326
326
  <ol
327
- class="list-decimal space-y-1.5 rounded-lg border border-slate-700 bg-slate-900/60 p-4 ps-8 text-sm text-slate-300"
327
+ class="list-decimal space-y-1.5 rounded-lg border border-muted bg-default/60 p-4 ps-8 text-sm text-toned"
328
328
  >
329
329
  <li v-for="(step, i) in selected.steps" :key="i">{{ step }}</li>
330
330
  <li>
@@ -332,7 +332,7 @@ async function remove(k: ApiKey) {
332
332
  :href="selected.url"
333
333
  target="_blank"
334
334
  rel="noopener noreferrer"
335
- class="text-primary-400 underline"
335
+ class="text-primary underline"
336
336
  >
337
337
  {{ t('providers.apiKeys.openKeys', { provider: selected.label }) }}
338
338
  </a>
@@ -343,7 +343,7 @@ async function remove(k: ApiKey) {
343
343
  the caching flavour, so long agentic runs stop re-billing the whole prompt. -->
344
344
  <p
345
345
  v-if="cachesPrompts(selected.value)"
346
- class="flex items-center gap-1.5 text-[12px] text-emerald-400/90"
346
+ class="flex items-center gap-1.5 text-[12px] text-app-success-400/90"
347
347
  >
348
348
  <UIcon name="i-lucide-zap" class="h-3.5 w-3.5 shrink-0" />
349
349
  {{ t('providers.apiKeys.cachingNote', { provider: selected.label }) }}
@@ -380,22 +380,22 @@ async function remove(k: ApiKey) {
380
380
 
381
381
  <!-- connected keys for the selected scope -->
382
382
  <div v-if="connected.length" class="space-y-2">
383
- <h5 class="text-xs font-semibold uppercase tracking-wide text-slate-500">
383
+ <h5 class="text-xs font-semibold uppercase tracking-wide text-dimmed">
384
384
  {{ t('providers.apiKeys.connected', { count: connected.length }) }}
385
385
  </h5>
386
386
  <div
387
387
  v-for="k in connected"
388
388
  :key="k.id"
389
- class="flex items-center justify-between rounded-md border border-slate-700 bg-slate-900/50 px-3 py-2 text-sm"
389
+ class="flex items-center justify-between rounded-md border border-muted bg-default/50 px-3 py-2 text-sm"
390
390
  :class="{ 'opacity-55': !k.enabled }"
391
391
  >
392
392
  <div>
393
- <span class="font-medium text-slate-200">{{ k.label }}</span>
394
- <span class="ms-2 text-xs text-slate-500">{{ providerLabel(k.provider) }}</span>
393
+ <span class="font-medium text-default">{{ k.label }}</span>
394
+ <span class="ms-2 text-xs text-dimmed">{{ providerLabel(k.provider) }}</span>
395
395
  <UBadge v-if="!k.enabled" color="neutral" variant="subtle" size="sm" class="ms-2">
396
396
  {{ t('providers.apiKeys.disabledBadge') }}
397
397
  </UBadge>
398
- <div class="text-[11px] tabular-nums text-slate-500">
398
+ <div class="text-[11px] tabular-nums text-dimmed">
399
399
  {{
400
400
  t(
401
401
  'providers.apiKeys.usage',
@@ -93,7 +93,7 @@ function goConnect() {
93
93
  <template #body>
94
94
  <div class="space-y-4">
95
95
  <template v-if="needsConnect">
96
- <p class="text-sm text-slate-400">
96
+ <p class="text-sm text-muted">
97
97
  {{ t('providers.personalCredential.connectBody', { vendor: vendorLabel }) }}
98
98
  </p>
99
99
  <div class="flex justify-end gap-2">
@@ -115,7 +115,7 @@ function goConnect() {
115
115
  </template>
116
116
 
117
117
  <template v-else>
118
- <p class="text-sm text-slate-400">
118
+ <p class="text-sm text-muted">
119
119
  {{ t('providers.personalCredential.passwordBody', { vendor: vendorLabel }) }}
120
120
  </p>
121
121
  <UFormField :label="t('providers.personalCredential.passwordField')">
@@ -208,10 +208,10 @@ async function disconnect(v: SubscriptionVendor) {
208
208
  <template>
209
209
  <div class="space-y-3">
210
210
  <div>
211
- <h4 class="text-xs font-semibold uppercase tracking-wide text-slate-500">
211
+ <h4 class="text-xs font-semibold uppercase tracking-wide text-dimmed">
212
212
  {{ t('personalSubscriptions.heading') }}
213
213
  </h4>
214
- <p class="mt-1 text-sm text-slate-400">{{ t('personalSubscriptions.intro') }}</p>
214
+ <p class="mt-1 text-sm text-muted">{{ t('personalSubscriptions.intro') }}</p>
215
215
  </div>
216
216
 
217
217
  <ProvidersSignInRequiredNotice
@@ -223,12 +223,12 @@ async function disconnect(v: SubscriptionVendor) {
223
223
  <div
224
224
  v-for="sub in personal.subscriptions"
225
225
  :key="sub.vendor"
226
- class="flex items-center justify-between rounded-md border border-slate-700 bg-slate-900/50 px-3 py-2 text-sm"
226
+ class="flex items-center justify-between rounded-md border border-muted bg-default/50 px-3 py-2 text-sm"
227
227
  >
228
228
  <div>
229
- <span class="font-medium text-slate-200">{{ sub.label }}</span>
230
- <span class="ms-2 text-xs text-slate-500">{{ vendorLabel(sub.vendor) }}</span>
231
- <div class="text-[11px] text-slate-500">
229
+ <span class="font-medium text-default">{{ sub.label }}</span>
230
+ <span class="ms-2 text-xs text-dimmed">{{ vendorLabel(sub.vendor) }}</span>
231
+ <div class="text-[11px] text-dimmed">
232
232
  <template v-if="sub.expiresAt">
233
233
  {{ t('personalSubscriptions.expires', { date: d(new Date(sub.expiresAt), 'short') }) }}
234
234
  </template>
@@ -244,7 +244,7 @@ async function disconnect(v: SubscriptionVendor) {
244
244
  />
245
245
  </div>
246
246
 
247
- <p v-for="(line, i) in renewals" :key="i" class="text-sm text-amber-400/90">{{ line }}</p>
247
+ <p v-for="(line, i) in renewals" :key="i" class="text-sm text-app-warning-400/90">{{ line }}</p>
248
248
 
249
249
  <!-- vendor picker -->
250
250
  <UFormField :label="t('personalSubscriptions.vendorField')">
@@ -258,7 +258,7 @@ async function disconnect(v: SubscriptionVendor) {
258
258
 
259
259
  <!-- connect / replace form -->
260
260
  <ol
261
- class="list-decimal space-y-1.5 rounded-lg border border-slate-700 bg-slate-900/60 p-4 ps-8 text-sm text-slate-300"
261
+ class="list-decimal space-y-1.5 rounded-lg border border-muted bg-default/60 p-4 ps-8 text-sm text-toned"
262
262
  >
263
263
  <li v-for="(step, i) in selectedMeta.steps" :key="i">{{ step }}</li>
264
264
  </ol>
@@ -292,11 +292,11 @@ async function disconnect(v: SubscriptionVendor) {
292
292
  </UFormField>
293
293
  </div>
294
294
  <div class="flex items-center justify-end gap-3">
295
- <p v-if="savedNotice" class="flex items-center gap-1.5 text-sm text-emerald-400">
295
+ <p v-if="savedNotice" class="flex items-center gap-1.5 text-sm text-app-success-400">
296
296
  <UIcon name="i-lucide-check" class="size-4" />
297
297
  {{ savedNotice }}
298
298
  </p>
299
- <p v-else-if="disabledReason" class="text-sm text-rose-400">{{ disabledReason }}</p>
299
+ <p v-else-if="disabledReason" class="text-sm text-app-error-400">{{ disabledReason }}</p>
300
300
  <UButton
301
301
  :loading="busy"
302
302
  :disabled="disabledReason !== null"
@@ -10,7 +10,7 @@ defineProps<{ message: string }>()
10
10
 
11
11
  <template>
12
12
  <div
13
- class="flex items-start gap-2.5 rounded-lg border border-amber-500/40 bg-amber-500/10 p-3 text-sm text-amber-200"
13
+ class="flex items-start gap-2.5 rounded-lg border border-app-warning-500/40 bg-app-warning-500/10 p-3 text-sm text-app-warning-200"
14
14
  role="alert"
15
15
  >
16
16
  <UIcon name="i-lucide-lock" class="mt-0.5 h-4 w-4 shrink-0" />
@@ -199,10 +199,10 @@ function vendorLabel(v: SubscriptionVendor): string {
199
199
  `personal` tab — point them there before they read a pool form that can't
200
200
  take their credential. -->
201
201
  <div
202
- class="flex items-center gap-3 rounded-lg border border-indigo-500/30 bg-indigo-950/30 px-3 py-2.5"
202
+ class="flex items-center gap-3 rounded-lg border border-primary/30 bg-primary/10 px-3 py-2.5"
203
203
  >
204
- <UIcon name="i-lucide-user" class="h-5 w-5 shrink-0 text-indigo-300" />
205
- <p class="min-w-0 flex-1 text-[13px] text-slate-300">
204
+ <UIcon name="i-lucide-user" class="h-5 w-5 shrink-0 text-primary" />
205
+ <p class="min-w-0 flex-1 text-[13px] text-toned">
206
206
  {{ t('providers.vendorCredentials.personalCallout.text') }}
207
207
  </p>
208
208
  <UButton
@@ -216,7 +216,7 @@ function vendorLabel(v: SubscriptionVendor): string {
216
216
  </UButton>
217
217
  </div>
218
218
 
219
- <p class="text-sm text-slate-400">
219
+ <p class="text-sm text-muted">
220
220
  {{ t('providers.vendorCredentials.poolIntro') }}
221
221
  </p>
222
222
 
@@ -233,7 +233,7 @@ function vendorLabel(v: SubscriptionVendor): string {
233
233
 
234
234
  <!-- guided steps -->
235
235
  <ol
236
- class="list-decimal space-y-1.5 rounded-lg border border-slate-700 bg-slate-900/60 p-4 ps-8 text-sm text-slate-300"
236
+ class="list-decimal space-y-1.5 rounded-lg border border-muted bg-default/60 p-4 ps-8 text-sm text-toned"
237
237
  >
238
238
  <li v-for="(step, i) in steps" :key="i">{{ step }}</li>
239
239
  </ol>
@@ -267,7 +267,7 @@ function vendorLabel(v: SubscriptionVendor): string {
267
267
 
268
268
  <!-- connected pool -->
269
269
  <div v-if="creds.credentials.length" class="space-y-2">
270
- <h4 class="text-xs font-semibold uppercase tracking-wide text-slate-500">
270
+ <h4 class="text-xs font-semibold uppercase tracking-wide text-dimmed">
271
271
  {{
272
272
  t('providers.vendorCredentials.connected', { count: creds.credentials.length })
273
273
  }}
@@ -275,16 +275,16 @@ function vendorLabel(v: SubscriptionVendor): string {
275
275
  <div
276
276
  v-for="c in creds.credentials"
277
277
  :key="c.id"
278
- class="flex items-center justify-between rounded-md border border-slate-700 bg-slate-900/50 px-3 py-2 text-sm"
278
+ class="flex items-center justify-between rounded-md border border-muted bg-default/50 px-3 py-2 text-sm"
279
279
  :class="{ 'opacity-55': !c.enabled }"
280
280
  >
281
281
  <div>
282
- <span class="font-medium text-slate-200">{{ c.label }}</span>
283
- <span class="ms-2 text-xs text-slate-500">{{ vendorLabel(c.vendor) }}</span>
282
+ <span class="font-medium text-default">{{ c.label }}</span>
283
+ <span class="ms-2 text-xs text-dimmed">{{ vendorLabel(c.vendor) }}</span>
284
284
  <UBadge v-if="!c.enabled" color="neutral" variant="subtle" size="sm" class="ms-2">
285
285
  {{ t('providers.vendorCredentials.disabledBadge') }}
286
286
  </UBadge>
287
- <div class="text-[11px] tabular-nums text-slate-500">
287
+ <div class="text-[11px] tabular-nums text-dimmed">
288
288
  {{
289
289
  t(
290
290
  'providers.vendorCredentials.usage',
@@ -113,9 +113,9 @@ function when(epochMs: number): string {
113
113
  </script>
114
114
 
115
115
  <template>
116
- <div class="rounded-lg border border-slate-700 bg-slate-900/50">
117
- <div class="flex items-center justify-between border-b border-slate-800 px-3 py-2">
118
- <p class="text-[11px] font-semibold uppercase tracking-wide text-slate-400">
116
+ <div class="rounded-lg border border-muted bg-default/50">
117
+ <div class="flex items-center justify-between border-b border-default px-3 py-2">
118
+ <p class="text-[11px] font-semibold uppercase tracking-wide text-muted">
119
119
  {{ t('provisioning.title') }}
120
120
  </p>
121
121
  <UButton
@@ -129,41 +129,41 @@ function when(epochMs: number): string {
129
129
  </UButton>
130
130
  </div>
131
131
 
132
- <p v-if="state.error" class="px-3 py-2 text-[12px] text-rose-300">{{ state.error }}</p>
132
+ <p v-if="state.error" class="px-3 py-2 text-[12px] text-app-error-300">{{ state.error }}</p>
133
133
  <p
134
134
  v-else-if="!state.loading && state.entries.length === 0"
135
- class="px-3 py-3 text-[12px] text-slate-500"
135
+ class="px-3 py-3 text-[12px] text-dimmed"
136
136
  >
137
137
  {{ t('provisioning.empty') }}
138
138
  </p>
139
139
 
140
- <ul v-else class="max-h-80 divide-y divide-slate-800 overflow-auto">
140
+ <ul v-else class="max-h-80 divide-y divide-default overflow-auto">
141
141
  <li v-for="entry in state.entries" :key="entry.id" class="px-3 py-2">
142
142
  <div class="flex items-center gap-2 text-[12px]">
143
143
  <UIcon
144
144
  :name="entry.outcome === 'success' ? 'i-lucide-check-circle' : 'i-lucide-x-circle'"
145
145
  class="h-3.5 w-3.5 shrink-0"
146
- :class="entry.outcome === 'success' ? 'text-emerald-400' : 'text-rose-400'"
146
+ :class="entry.outcome === 'success' ? 'text-app-success-400' : 'text-app-error-400'"
147
147
  />
148
- <span class="font-medium text-slate-200">{{ OPERATION_LABEL[entry.operation] }}</span>
148
+ <span class="font-medium text-default">{{ OPERATION_LABEL[entry.operation] }}</span>
149
149
  <span
150
150
  class="rounded px-1.5 py-0.5 text-[10px] uppercase tracking-wide"
151
151
  :class="
152
152
  entry.outcome === 'success'
153
- ? 'bg-emerald-950/60 text-emerald-300'
154
- : 'bg-rose-950/60 text-rose-300'
153
+ ? 'bg-app-success-950/60 text-app-success-300'
154
+ : 'bg-app-error-950/60 text-app-error-300'
155
155
  "
156
156
  >{{ OUTCOME_LABEL[entry.outcome] }}</span
157
157
  >
158
- <span class="ms-auto text-[11px] text-slate-500">{{ when(entry.createdAt) }}</span>
158
+ <span class="ms-auto text-[11px] text-dimmed">{{ when(entry.createdAt) }}</span>
159
159
  </div>
160
- <div v-if="entry.targetId" class="mt-0.5 text-[11px] text-slate-500">
160
+ <div v-if="entry.targetId" class="mt-0.5 text-[11px] text-dimmed">
161
161
  {{ entry.providerId ? `${entry.providerId} · ` : '' }}{{ entry.targetId }}
162
162
  </div>
163
163
  <!-- The verbatim provider/runtime error on a failed attempt. -->
164
164
  <pre
165
165
  v-if="entry.error"
166
- class="mt-1 max-h-28 overflow-auto whitespace-pre-wrap rounded border border-rose-900/50 bg-rose-950/30 p-1.5 text-[11px] text-rose-200/90"
166
+ class="mt-1 max-h-28 overflow-auto whitespace-pre-wrap rounded border border-app-error-900/50 bg-app-error-950/30 p-1.5 text-[11px] text-app-error-200/90"
167
167
  >{{ entry.error }}</pre>
168
168
  </li>
169
169
  </ul>
@@ -82,31 +82,31 @@ const STATUS_META = computed<
82
82
  label: t('ralph.status.passed'),
83
83
  badge: 'success',
84
84
  icon: 'i-lucide-circle-check',
85
- text: 'text-emerald-300',
85
+ text: 'text-app-success-300',
86
86
  },
87
87
  stalled: {
88
88
  label: t('ralph.status.stalled'),
89
89
  badge: 'error',
90
90
  icon: 'i-lucide-circle-slash',
91
- text: 'text-rose-300',
91
+ text: 'text-app-error-300',
92
92
  },
93
93
  'gave-up': {
94
94
  label: t('ralph.status.gaveUp'),
95
95
  badge: 'error',
96
96
  icon: 'i-lucide-circle-x',
97
- text: 'text-rose-300',
97
+ text: 'text-app-error-300',
98
98
  },
99
99
  running: {
100
100
  label: t('ralph.status.running'),
101
101
  badge: 'warning',
102
102
  icon: 'i-lucide-loader',
103
- text: 'text-amber-300',
103
+ text: 'text-app-warning-300',
104
104
  },
105
105
  failing: {
106
106
  label: t('ralph.status.failing'),
107
107
  badge: 'error',
108
108
  icon: 'i-lucide-circle-x',
109
- text: 'text-rose-300',
109
+ text: 'text-app-error-300',
110
110
  },
111
111
  }))
112
112
  </script>
@@ -115,7 +115,7 @@ const STATUS_META = computed<
115
115
  <ResultWindowShell
116
116
  :open="open"
117
117
  :icon="meta.icon"
118
- icon-class="bg-violet-500/15 text-violet-300"
118
+ icon-class="bg-app-secondary-500/15 text-app-secondary-300"
119
119
  :title="headerTitle"
120
120
  :subtitle="t('ralph.subtitle')"
121
121
  :step-ref="{ instanceId, stepIndex }"
@@ -137,7 +137,7 @@ const STATUS_META = computed<
137
137
  <div class="min-w-0 flex-1 overflow-y-auto px-5 py-4">
138
138
  <div
139
139
  v-if="!ralph"
140
- class="flex h-full flex-col items-center justify-center gap-2 text-center text-slate-400"
140
+ class="flex h-full flex-col items-center justify-center gap-2 text-center text-muted"
141
141
  >
142
142
  <UIcon :name="meta.icon" class="h-8 w-8 opacity-40" />
143
143
  <p class="text-sm">{{ t('ralph.noActivity') }}</p>
@@ -145,27 +145,25 @@ const STATUS_META = computed<
145
145
 
146
146
  <template v-else>
147
147
  <!-- The completion criterion. -->
148
- <h3 class="mb-1.5 text-[11px] font-semibold uppercase tracking-wide text-slate-500">
148
+ <h3 class="mb-1.5 text-[11px] font-semibold uppercase tracking-wide text-dimmed">
149
149
  {{ t('ralph.validationCommand') }}
150
150
  </h3>
151
- <div class="relative rounded-md border border-slate-800 bg-slate-950/60 px-3 py-2">
151
+ <div class="relative rounded-md border border-default bg-app-950/60 px-3 py-2">
152
152
  <CopyButton :text="ralph.validationCommand" class="absolute end-1 top-1" />
153
- <code class="block whitespace-pre-wrap pe-8 font-mono text-[12px] text-slate-200">{{
153
+ <code class="block whitespace-pre-wrap pe-8 font-mono text-[12px] text-default">{{
154
154
  ralph.validationCommand
155
155
  }}</code>
156
156
  </div>
157
157
 
158
158
  <!-- The most recent validation output. -->
159
159
  <template v-if="ralph.lastValidationTail">
160
- <h3
161
- class="mb-1.5 mt-4 text-[11px] font-semibold uppercase tracking-wide text-slate-500"
162
- >
160
+ <h3 class="mb-1.5 mt-4 text-[11px] font-semibold uppercase tracking-wide text-dimmed">
163
161
  {{ t('ralph.lastOutput', { exit: ralph.lastExitCode ?? '?' }) }}
164
162
  </h3>
165
- <div class="relative rounded-md border border-slate-800 bg-slate-950/60 px-3 py-2">
163
+ <div class="relative rounded-md border border-default bg-app-950/60 px-3 py-2">
166
164
  <CopyButton :text="ralph.lastValidationTail" class="absolute end-1 top-1" />
167
165
  <pre
168
- class="whitespace-pre-wrap pe-8 font-mono text-[11px] leading-relaxed text-slate-400"
166
+ class="whitespace-pre-wrap pe-8 font-mono text-[11px] leading-relaxed text-muted"
169
167
  >{{ ralph.lastValidationTail }}</pre>
170
168
  </div>
171
169
  </template>
@@ -175,7 +173,7 @@ const STATUS_META = computed<
175
173
  :href="prUrl"
176
174
  target="_blank"
177
175
  rel="noopener"
178
- class="mt-3 inline-flex items-center gap-1 text-[12px] text-sky-300 hover:text-sky-200 hover:underline"
176
+ class="mt-3 inline-flex items-center gap-1 text-[12px] text-app-info-300 hover:text-app-info-200 hover:underline"
179
177
  >
180
178
  {{ t('ralph.viewPr') }}
181
179
  <UIcon name="i-lucide-external-link" class="h-3 w-3" />
@@ -185,7 +183,7 @@ const STATUS_META = computed<
185
183
  the sidebar (e.g. "3 of 20") reads as an unexplained abandonment. -->
186
184
  <p
187
185
  v-if="status === 'stalled'"
188
- class="mt-3 rounded-md border border-rose-900/60 bg-rose-950/30 px-3 py-2 text-[12px] leading-relaxed text-rose-200"
186
+ class="mt-3 rounded-md border border-app-error-900/60 bg-app-error-950/30 px-3 py-2 text-[12px] leading-relaxed text-app-error-200"
189
187
  data-testid="ralph-stalled-note"
190
188
  >
191
189
  {{ t('ralph.stalledNote') }}
@@ -193,14 +191,14 @@ const STATUS_META = computed<
193
191
 
194
192
  <!-- Iteration history: what each pass produced and whether its validation passed. -->
195
193
  <section v-if="attempts.length" class="mt-5">
196
- <h3 class="mb-2 text-[11px] font-semibold uppercase tracking-wide text-slate-500">
194
+ <h3 class="mb-2 text-[11px] font-semibold uppercase tracking-wide text-dimmed">
197
195
  {{ t('ralph.iterationsHeading') }}
198
196
  </h3>
199
197
  <!-- The log is capped (it rides the run's detail blob); say so rather than letting a
200
198
  long loop's partial history read as if those iterations never ran. -->
201
199
  <p
202
200
  v-if="droppedAttempts"
203
- class="mb-2 text-[11px] text-slate-500"
201
+ class="mb-2 text-[11px] text-dimmed"
204
202
  data-testid="ralph-iterations-truncated"
205
203
  >
206
204
  {{ t('ralph.iterationsTruncated', { count: droppedAttempts }, droppedAttempts) }}
@@ -209,32 +207,32 @@ const STATUS_META = computed<
209
207
  <li
210
208
  v-for="a in attempts"
211
209
  :key="a.attempt"
212
- class="rounded-md border border-slate-800 bg-slate-950/40 px-3 py-2"
210
+ class="rounded-md border border-default bg-app-950/40 px-3 py-2"
213
211
  data-testid="ralph-iteration"
214
212
  >
215
213
  <div class="flex items-center gap-2">
216
214
  <UIcon
217
215
  :name="a.validationPassed ? 'i-lucide-circle-check' : 'i-lucide-circle-x'"
218
216
  class="h-3.5 w-3.5"
219
- :class="a.validationPassed ? 'text-emerald-400' : 'text-rose-400'"
217
+ :class="a.validationPassed ? 'text-app-success-400' : 'text-app-error-400'"
220
218
  />
221
- <span class="text-[12px] font-medium text-slate-200">
219
+ <span class="text-[12px] font-medium text-default">
222
220
  {{ t('ralph.iteration', { number: a.attempt }) }}
223
221
  </span>
224
- <span class="text-[11px] text-slate-500">
222
+ <span class="text-[11px] text-dimmed">
225
223
  {{
226
224
  a.validationPassed
227
225
  ? t('ralph.iterationPassed')
228
226
  : t('ralph.iterationFailed', { exit: a.exitCode ?? '?' })
229
227
  }}
230
228
  </span>
231
- <span class="ms-auto text-[10px] text-slate-600">{{
229
+ <span class="ms-auto text-[10px] text-app-600">{{
232
230
  d(new Date(a.at), 'long')
233
231
  }}</span>
234
232
  </div>
235
233
  <p
236
234
  v-if="a.summary"
237
- class="mt-1 whitespace-pre-wrap text-[12px] leading-relaxed text-slate-400"
235
+ class="mt-1 whitespace-pre-wrap text-[12px] leading-relaxed text-muted"
238
236
  >
239
237
  {{ a.summary }}
240
238
  </p>
@@ -245,10 +243,10 @@ const STATUS_META = computed<
245
243
  </div>
246
244
 
247
245
  <aside
248
- 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"
246
+ class="hidden w-60 shrink-0 flex-col gap-4 border-s border-default bg-default/50 px-4 py-4 lg:flex"
249
247
  >
250
248
  <div v-if="ralph">
251
- <h4 class="mb-2 text-[11px] font-semibold uppercase tracking-wide text-slate-500">
249
+ <h4 class="mb-2 text-[11px] font-semibold uppercase tracking-wide text-dimmed">
252
250
  {{ t('ralph.sidebar.state') }}
253
251
  </h4>
254
252
  <div class="flex items-center gap-2 text-[13px]">
@@ -261,10 +259,10 @@ const STATUS_META = computed<
261
259
  </div>
262
260
  </div>
263
261
  <div v-if="ralph">
264
- <h4 class="mb-1 text-[11px] font-semibold uppercase tracking-wide text-slate-500">
262
+ <h4 class="mb-1 text-[11px] font-semibold uppercase tracking-wide text-dimmed">
265
263
  {{ t('ralph.sidebar.iterations') }}
266
264
  </h4>
267
- <p class="text-[12px] text-slate-300" data-testid="ralph-iteration-count">
265
+ <p class="text-[12px] text-toned" data-testid="ralph-iteration-count">
268
266
  {{ t('ralph.sidebar.count', { attempts: ralph.attempts, max: ralph.maxIterations }) }}
269
267
  </p>
270
268
  </div>
@@ -277,7 +275,7 @@ const STATUS_META = computed<
277
275
  :run-failed="instance?.status === 'failed'"
278
276
  :failure-at="instance?.failure?.occurredAt"
279
277
  />
280
- <p class="mt-auto text-[10px] leading-relaxed text-slate-600">
278
+ <p class="mt-auto text-[10px] leading-relaxed text-app-600">
281
279
  {{ t('ralph.sidebar.footer') }}
282
280
  </p>
283
281
  </aside>
@@ -76,7 +76,7 @@ const timezoneOptions = computed(() =>
76
76
  class="w-24"
77
77
  @update:model-value="patch({ intervalHours: Math.max(1, Number($event) || 1) })"
78
78
  />
79
- <span class="text-xs text-slate-400">{{ t('recurring.hours') }}</span>
79
+ <span class="text-xs text-muted">{{ t('recurring.hours') }}</span>
80
80
  </div>
81
81
  </UFormField>
82
82
 
@@ -110,7 +110,7 @@ const timezoneOptions = computed(() =>
110
110
  class="w-28"
111
111
  @update:model-value="patch({ windowStartHour: Number($event) })"
112
112
  />
113
- <span class="text-xs text-slate-400">{{ t('recurring.to') }}</span>
113
+ <span class="text-xs text-muted">{{ t('recurring.to') }}</span>
114
114
  <USelect
115
115
  :model-value="modelValue.windowEndHour ?? 24 % 24"
116
116
  :items="hours"