@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
@@ -213,16 +213,14 @@ const noSignInMethod = computed(
213
213
 
214
214
  <template>
215
215
  <div
216
- class="flex h-screen w-screen items-center justify-center bg-slate-950 text-slate-100"
216
+ class="flex h-screen w-screen items-center justify-center bg-app-950 text-app-100"
217
217
  data-testid="login-screen"
218
218
  >
219
- <div
220
- class="w-full max-w-sm rounded-xl border border-slate-800 bg-slate-900/80 p-8 backdrop-blur"
221
- >
219
+ <div class="w-full max-w-sm rounded-xl border border-default bg-default/80 p-8 backdrop-blur">
222
220
  <div class="mb-6 text-center">
223
- <UIcon name="i-lucide-layout-dashboard" class="mx-auto mb-3 h-10 w-10 text-indigo-400" />
224
- <h1 class="mb-1 text-lg font-semibold text-white">{{ t('auth.login.appTitle') }}</h1>
225
- <p class="text-sm text-slate-400">
221
+ <UIcon name="i-lucide-layout-dashboard" class="mx-auto mb-3 h-10 w-10 text-primary" />
222
+ <h1 class="mb-1 text-lg font-semibold text-highlighted">{{ t('auth.login.appTitle') }}</h1>
223
+ <p class="text-sm text-muted">
226
224
  <template v-if="mode === 'forgot'">{{ t('auth.login.forgotSubtitle') }}</template>
227
225
  <template v-else>{{
228
226
  invite ? t('auth.login.inviteSubtitle') : t('auth.login.subtitle')
@@ -243,10 +241,10 @@ const noSignInMethod = computed(
243
241
  >
244
242
  {{ t('auth.mothership.signIn') }}
245
243
  </UButton>
246
- <p class="px-1 text-xs text-slate-400">{{ t('auth.mothership.hint') }}</p>
244
+ <p class="px-1 text-xs text-muted">{{ t('auth.mothership.hint') }}</p>
247
245
  <p
248
246
  v-if="auth.mothershipError"
249
- class="px-1 text-xs text-rose-400"
247
+ class="px-1 text-xs text-app-error-400"
250
248
  data-testid="mothership-error"
251
249
  >
252
250
  {{ t('auth.mothership.error') }}
@@ -294,22 +292,22 @@ const noSignInMethod = computed(
294
292
  :href="tokenCreateUrl(p)"
295
293
  target="_blank"
296
294
  rel="noopener noreferrer"
297
- class="text-xs text-indigo-400 hover:underline"
295
+ class="text-xs text-primary hover:underline"
298
296
  >
299
297
  {{ t('auth.localMode.createToken', { provider: PROVIDER_LABELS[p] }) }}
300
298
  </a>
301
299
  </div>
302
300
  </template>
303
301
 
304
- <p v-if="patError" class="text-sm text-rose-400">{{ patError }}</p>
302
+ <p v-if="patError" class="text-sm text-app-error-400">{{ patError }}</p>
305
303
  </div>
306
304
 
307
305
  <div
308
306
  v-if="isLocalMode && auth.providers.password && mode !== 'forgot'"
309
- class="my-4 flex items-center gap-3 text-xs text-slate-500"
307
+ class="my-4 flex items-center gap-3 text-xs text-dimmed"
310
308
  >
311
- <span class="h-px flex-1 bg-slate-800" /> {{ t('auth.localMode.orDivider') }}
312
- <span class="h-px flex-1 bg-slate-800" />
309
+ <span class="h-px flex-1 bg-elevated" /> {{ t('auth.localMode.orDivider') }}
310
+ <span class="h-px flex-1 bg-elevated" />
313
311
  </div>
314
312
 
315
313
  <!-- A refused SSO round-trip: name the rule that refused, don't return the user to an
@@ -341,10 +339,10 @@ const noSignInMethod = computed(
341
339
 
342
340
  <div
343
341
  v-if="showSsoDivider && mode !== 'forgot'"
344
- class="my-4 flex items-center gap-3 text-xs text-slate-500"
342
+ class="my-4 flex items-center gap-3 text-xs text-dimmed"
345
343
  >
346
- <span class="h-px flex-1 bg-slate-800" /> {{ t('auth.login.or') }}
347
- <span class="h-px flex-1 bg-slate-800" />
344
+ <span class="h-px flex-1 bg-elevated" /> {{ t('auth.login.or') }}
345
+ <span class="h-px flex-1 bg-elevated" />
348
346
  </div>
349
347
 
350
348
  <!-- OAuth providers -->
@@ -374,10 +372,10 @@ const noSignInMethod = computed(
374
372
 
375
373
  <div
376
374
  v-if="showOAuthDivider && mode !== 'forgot'"
377
- class="my-4 flex items-center gap-3 text-xs text-slate-500"
375
+ class="my-4 flex items-center gap-3 text-xs text-dimmed"
378
376
  >
379
- <span class="h-px flex-1 bg-slate-800" /> {{ t('auth.login.or') }}
380
- <span class="h-px flex-1 bg-slate-800" />
377
+ <span class="h-px flex-1 bg-elevated" /> {{ t('auth.login.or') }}
378
+ <span class="h-px flex-1 bg-elevated" />
381
379
  </div>
382
380
 
383
381
  <!-- Email / password -->
@@ -413,7 +411,7 @@ const noSignInMethod = computed(
413
411
  class="w-full"
414
412
  data-testid="login-password"
415
413
  />
416
- <p v-if="error" class="text-sm text-rose-400" data-testid="login-error">{{ error }}</p>
414
+ <p v-if="error" class="text-sm text-app-error-400" data-testid="login-error">{{ error }}</p>
417
415
  <UButton
418
416
  block
419
417
  size="lg"
@@ -424,13 +422,13 @@ const noSignInMethod = computed(
424
422
  >
425
423
  {{ mode === 'signup' ? t('auth.login.createAccount') : t('auth.login.signIn') }}
426
424
  </UButton>
427
- <p class="text-center text-xs text-slate-400">
425
+ <p class="text-center text-xs text-muted">
428
426
  <template v-if="mode === 'login'">
429
427
  <i18n-t keypath="auth.login.needAccount" tag="span" scope="global">
430
428
  <template #signUp>
431
429
  <button
432
430
  type="button"
433
- class="text-indigo-400 hover:underline"
431
+ class="text-primary hover:underline"
434
432
  @click="setMode('signup')"
435
433
  >
436
434
  {{ t('auth.login.signUp') }}
@@ -443,7 +441,7 @@ const noSignInMethod = computed(
443
441
  <template #signIn>
444
442
  <button
445
443
  type="button"
446
- class="text-indigo-400 hover:underline"
444
+ class="text-primary hover:underline"
447
445
  @click="setMode('login')"
448
446
  >
449
447
  {{ t('auth.login.signIn') }}
@@ -452,8 +450,8 @@ const noSignInMethod = computed(
452
450
  </i18n-t>
453
451
  </template>
454
452
  </p>
455
- <p v-if="mode === 'login'" class="text-center text-xs text-slate-400">
456
- <button type="button" class="text-indigo-400 hover:underline" @click="setMode('forgot')">
453
+ <p v-if="mode === 'login'" class="text-center text-xs text-muted">
454
+ <button type="button" class="text-primary hover:underline" @click="setMode('forgot')">
457
455
  {{ t('auth.login.forgotPassword') }}
458
456
  </button>
459
457
  </p>
@@ -469,10 +467,10 @@ const noSignInMethod = computed(
469
467
  auth.providers.password ||
470
468
  hasConfiguredPat
471
469
  "
472
- class="my-4 flex items-center gap-3 text-xs text-slate-500"
470
+ class="my-4 flex items-center gap-3 text-xs text-dimmed"
473
471
  >
474
- <span class="h-px flex-1 bg-slate-800" /> {{ t('auth.login.or') }}
475
- <span class="h-px flex-1 bg-slate-800" />
472
+ <span class="h-px flex-1 bg-elevated" /> {{ t('auth.login.or') }}
473
+ <span class="h-px flex-1 bg-elevated" />
476
474
  </div>
477
475
  <form class="space-y-3" @submit.prevent="submitRemotePat">
478
476
  <div v-if="remotePatProviders.length > 1" class="flex gap-2">
@@ -502,7 +500,7 @@ const noSignInMethod = computed(
502
500
  size="lg"
503
501
  class="w-full"
504
502
  />
505
- <p v-if="remotePatError" class="text-sm text-rose-400">{{ remotePatError }}</p>
503
+ <p v-if="remotePatError" class="text-sm text-app-error-400">{{ remotePatError }}</p>
506
504
  <UButton
507
505
  block
508
506
  size="lg"
@@ -515,7 +513,7 @@ const noSignInMethod = computed(
515
513
  </UButton>
516
514
  <!-- Local mode only: say what else the token is for BEFORE it is handed over, since it
517
515
  becomes the credential every agent step on this machine clones and pushes with. -->
518
- <p v-if="isLocalMode" class="px-1 text-xs text-slate-400">
516
+ <p v-if="isLocalMode" class="px-1 text-xs text-muted">
519
517
  {{ t('auth.localMode.tokenBecomesCredential') }}
520
518
  </p>
521
519
  <p class="px-1 text-center">
@@ -523,7 +521,7 @@ const noSignInMethod = computed(
523
521
  :href="tokenCreateUrl(remotePatProvider)"
524
522
  target="_blank"
525
523
  rel="noopener noreferrer"
526
- class="text-xs text-indigo-400 hover:underline"
524
+ class="text-xs text-primary hover:underline"
527
525
  >
528
526
  {{
529
527
  t('auth.localMode.createToken', { provider: PROVIDER_LABELS[remotePatProvider] })
@@ -550,7 +548,7 @@ const noSignInMethod = computed(
550
548
  @submit.prevent="submitForgot"
551
549
  >
552
550
  <template v-if="forgotSent">
553
- <p class="text-sm text-slate-300">
551
+ <p class="text-sm text-toned">
554
552
  {{ t('auth.login.forgotSent') }}
555
553
  </p>
556
554
  </template>
@@ -564,13 +562,13 @@ const noSignInMethod = computed(
564
562
  size="lg"
565
563
  class="w-full"
566
564
  />
567
- <p v-if="error" class="text-sm text-rose-400">{{ error }}</p>
565
+ <p v-if="error" class="text-sm text-app-error-400">{{ error }}</p>
568
566
  <UButton block size="lg" color="primary" type="submit" :loading="busy">
569
567
  {{ t('auth.login.sendResetLink') }}
570
568
  </UButton>
571
569
  </template>
572
- <p class="text-center text-xs text-slate-400">
573
- <button type="button" class="text-indigo-400 hover:underline" @click="setMode('login')">
570
+ <p class="text-center text-xs text-muted">
571
+ <button type="button" class="text-primary hover:underline" @click="setMode('login')">
574
572
  {{ t('auth.login.backToSignIn') }}
575
573
  </button>
576
574
  </p>
@@ -48,18 +48,18 @@ function goToLogin() {
48
48
  </script>
49
49
 
50
50
  <template>
51
- <div class="flex h-screen w-screen items-center justify-center bg-slate-950 text-slate-100">
52
- <div
53
- class="w-full max-w-sm rounded-xl border border-slate-800 bg-slate-900/80 p-8 backdrop-blur"
54
- >
51
+ <div class="flex h-screen w-screen items-center justify-center bg-app-950 text-app-100">
52
+ <div class="w-full max-w-sm rounded-xl border border-default bg-default/80 p-8 backdrop-blur">
55
53
  <div class="mb-6 text-center">
56
- <UIcon name="i-lucide-key-round" class="mx-auto mb-3 h-10 w-10 text-indigo-400" />
57
- <h1 class="mb-1 text-lg font-semibold text-white">{{ t('auth.resetPassword.title') }}</h1>
58
- <p class="text-sm text-slate-400">{{ t('auth.resetPassword.subtitle') }}</p>
54
+ <UIcon name="i-lucide-key-round" class="mx-auto mb-3 h-10 w-10 text-primary" />
55
+ <h1 class="mb-1 text-lg font-semibold text-highlighted">
56
+ {{ t('auth.resetPassword.title') }}
57
+ </h1>
58
+ <p class="text-sm text-muted">{{ t('auth.resetPassword.subtitle') }}</p>
59
59
  </div>
60
60
 
61
61
  <template v-if="done">
62
- <p class="mb-4 text-sm text-slate-300">
62
+ <p class="mb-4 text-sm text-toned">
63
63
  {{ t('auth.resetPassword.doneBody') }}
64
64
  </p>
65
65
  <UButton block size="lg" color="primary" @click="goToLogin">{{
@@ -68,7 +68,7 @@ function goToLogin() {
68
68
  </template>
69
69
 
70
70
  <template v-else-if="!token">
71
- <p class="mb-4 text-sm text-rose-400">
71
+ <p class="mb-4 text-sm text-app-error-400">
72
72
  {{ t('auth.resetPassword.missingToken') }}
73
73
  </p>
74
74
  <UButton block size="lg" color="neutral" variant="subtle" @click="goToLogin">
@@ -93,12 +93,12 @@ function goToLogin() {
93
93
  size="lg"
94
94
  class="w-full"
95
95
  />
96
- <p v-if="error" class="text-sm text-rose-400">{{ error }}</p>
96
+ <p v-if="error" class="text-sm text-app-error-400">{{ error }}</p>
97
97
  <UButton block size="lg" color="primary" type="submit" :loading="busy">
98
98
  {{ t('auth.resetPassword.submit') }}
99
99
  </UButton>
100
- <p class="text-center text-xs text-slate-400">
101
- <button type="button" class="text-indigo-400 hover:underline" @click="goToLogin">
100
+ <p class="text-center text-xs text-muted">
101
+ <button type="button" class="text-primary hover:underline" @click="goToLogin">
102
102
  {{ t('auth.resetPassword.backToSignIn') }}
103
103
  </button>
104
104
  </p>
@@ -37,7 +37,7 @@ const items = computed<DropdownMenuItem[][]>(() => [
37
37
  type="button"
38
38
  data-testid="user-menu"
39
39
  :title="collapsed ? auth.user.name || auth.user.login : undefined"
40
- class="flex w-full items-center gap-2 rounded-lg border border-slate-800 bg-slate-900/60 p-2 text-start transition hover:bg-slate-800/60"
40
+ class="flex w-full items-center gap-2 rounded-lg border border-default bg-default/60 p-2 text-start transition hover:bg-elevated/60"
41
41
  :class="collapsed ? 'justify-center' : ''"
42
42
  >
43
43
  <UAvatar
@@ -47,12 +47,12 @@ const items = computed<DropdownMenuItem[][]>(() => [
47
47
  icon="i-lucide-user"
48
48
  />
49
49
  <div v-if="!collapsed" class="min-w-0 flex-1">
50
- <div class="truncate text-xs font-medium text-white">
50
+ <div class="truncate text-xs font-medium text-highlighted">
51
51
  {{ auth.user.name || auth.user.login }}
52
52
  </div>
53
- <div class="truncate text-[10px] text-slate-500">@{{ auth.user.login }}</div>
53
+ <div class="truncate text-[10px] text-dimmed">@{{ auth.user.login }}</div>
54
54
  </div>
55
- <UIcon v-if="!collapsed" name="i-lucide-chevron-up" class="h-4 w-4 shrink-0 text-slate-500" />
55
+ <UIcon v-if="!collapsed" name="i-lucide-chevron-up" class="h-4 w-4 shrink-0 text-dimmed" />
56
56
  </button>
57
57
  </UDropdownMenu>
58
58
  </template>
@@ -190,7 +190,7 @@ const { requestClose } = useUnsavedGuard({
190
190
  <ResultWindowShell
191
191
  :open="open"
192
192
  icon="i-lucide-images"
193
- icon-class="bg-sky-500/15 text-sky-300"
193
+ icon-class="bg-app-info-500/15 text-app-info-300"
194
194
  :title="headerTitle"
195
195
  :subtitle="t('binaryCandidates.subtitle')"
196
196
  width="5xl"
@@ -202,7 +202,7 @@ const { requestClose } = useUnsavedGuard({
202
202
  declared its candidates and one whose block was unreadable need different fixes. -->
203
203
  <p
204
204
  v-if="noChoiceKey"
205
- class="mb-3 rounded border border-amber-500/30 bg-amber-500/5 px-3 py-2 text-xs text-amber-200"
205
+ class="mb-3 rounded border border-app-warning-500/30 bg-app-warning-500/5 px-3 py-2 text-xs text-app-warning-200"
206
206
  data-testid="binary-candidates-no-choice"
207
207
  >
208
208
  {{ t(noChoiceKey) }}
@@ -211,7 +211,7 @@ const { requestClose } = useUnsavedGuard({
211
211
  <!-- An automatic keep is NOT a review, and must never render as one. -->
212
212
  <p
213
213
  v-if="view.automatic"
214
- class="mb-3 rounded border border-slate-600/40 bg-slate-800/40 px-3 py-2 text-xs text-slate-300"
214
+ class="mb-3 rounded border border-app-600/40 bg-elevated/40 px-3 py-2 text-xs text-toned"
215
215
  data-testid="binary-candidates-automatic"
216
216
  >
217
217
  {{ t('binaryCandidates.automatic') }}
@@ -221,7 +221,7 @@ const { requestClose } = useUnsavedGuard({
221
221
  over all five. -->
222
222
  <p
223
223
  v-if="warnings"
224
- class="mb-3 text-xs text-amber-300"
224
+ class="mb-3 text-xs text-app-warning-300"
225
225
  data-testid="binary-candidates-warnings"
226
226
  >
227
227
  <span v-if="view.state.omitted">{{
@@ -236,7 +236,7 @@ const { requestClose } = useUnsavedGuard({
236
236
  </p>
237
237
 
238
238
  <div v-for="group in view.groups" :key="group.subject ?? '·'" class="mb-6">
239
- <h3 class="mb-2 text-xs font-medium text-slate-400">
239
+ <h3 class="mb-2 text-xs font-medium text-muted">
240
240
  {{ group.subject ?? t('binaryCandidates.unlabelledSubject') }}
241
241
  </h3>
242
242
  <div class="grid grid-cols-1 gap-3 sm:grid-cols-2 lg:grid-cols-3">
@@ -246,8 +246,8 @@ const { requestClose } = useUnsavedGuard({
246
246
  class="rounded border p-2 transition"
247
247
  :class="[
248
248
  selected.includes(row.id) || row.kept
249
- ? 'border-sky-400/60 bg-sky-500/5'
250
- : 'border-slate-700/60',
249
+ ? 'border-app-info-400/60 bg-app-info-500/5'
250
+ : 'border-muted/60',
251
251
  view.awaiting ? 'cursor-pointer' : '',
252
252
  ]"
253
253
  data-testid="binary-candidate-card"
@@ -268,13 +268,13 @@ const { requestClose } = useUnsavedGuard({
268
268
  that is no longer selected. -->
269
269
  <label
270
270
  v-if="view.awaiting"
271
- class="mb-1.5 flex cursor-pointer items-center gap-2 text-[11px] text-slate-400"
271
+ class="mb-1.5 flex cursor-pointer items-center gap-2 text-[11px] text-muted"
272
272
  @click.stop
273
273
  >
274
274
  <input
275
275
  :type="view.multiSelect ? 'checkbox' : 'radio'"
276
276
  name="binary-candidate"
277
- class="accent-sky-500"
277
+ class="accent-app-info-500"
278
278
  :checked="selected.includes(row.id)"
279
279
  :aria-label="candidateLabel(row)"
280
280
  data-testid="binary-candidate-select"
@@ -304,22 +304,22 @@ const { requestClose } = useUnsavedGuard({
304
304
  rather than left as an empty frame the reader reads as a failed generation. -->
305
305
  <p
306
306
  v-else
307
- class="mb-2 flex h-24 items-center justify-center rounded bg-slate-800/60 px-2 text-center text-[10px] text-slate-400"
307
+ class="mb-2 flex h-24 items-center justify-center rounded bg-elevated/60 px-2 text-center text-[10px] text-muted"
308
308
  data-testid="binary-candidate-no-preview"
309
309
  >
310
310
  {{ t('binaryCandidates.noPreview') }}
311
311
  </p>
312
- <p class="text-xs text-slate-200">
312
+ <p class="text-xs text-default">
313
313
  {{
314
314
  row.generator
315
315
  ? t('binaryCandidates.fromGenerator', { generator: row.generator })
316
316
  : t('binaryCandidates.unattributed')
317
317
  }}
318
318
  </p>
319
- <p v-if="row.note" class="mt-1 text-[11px] text-slate-400">{{ row.note }}</p>
320
- <p class="mt-1 break-all text-[10px] text-slate-500">{{ row.location }}</p>
321
- <p v-if="row.contentType" class="text-[10px] text-slate-500">{{ row.contentType }}</p>
322
- <p v-if="row.kept" class="mt-1 text-[11px] text-emerald-300">
319
+ <p v-if="row.note" class="mt-1 text-[11px] text-muted">{{ row.note }}</p>
320
+ <p class="mt-1 break-all text-[10px] text-dimmed">{{ row.location }}</p>
321
+ <p v-if="row.contentType" class="text-[10px] text-dimmed">{{ row.contentType }}</p>
322
+ <p v-if="row.kept" class="mt-1 text-[11px] text-app-success-300">
323
323
  {{
324
324
  row.storeAs
325
325
  ? t('binaryCandidates.keptAs', { id: row.storeAs })
@@ -352,19 +352,21 @@ const { requestClose } = useUnsavedGuard({
352
352
  />
353
353
  <p
354
354
  v-if="missingAliases.length"
355
- class="mt-1 text-[11px] text-amber-300"
355
+ class="mt-1 text-[11px] text-app-warning-300"
356
356
  data-testid="binary-candidates-missing-alias"
357
357
  >
358
358
  {{ t('binaryCandidates.missingAlias') }}
359
359
  </p>
360
360
  <p
361
361
  v-else-if="duplicateAliases"
362
- class="mt-1 text-[11px] text-amber-300"
362
+ class="mt-1 text-[11px] text-app-warning-300"
363
363
  data-testid="binary-candidates-duplicate-alias"
364
364
  >
365
365
  {{ t('binaryCandidates.duplicateAlias') }}
366
366
  </p>
367
- <p v-if="candidates.error" class="mt-1 text-[11px] text-red-300">{{ candidates.error }}</p>
367
+ <p v-if="candidates.error" class="mt-1 text-[11px] text-app-error-300">
368
+ {{ candidates.error }}
369
+ </p>
368
370
  <div class="mt-2 flex justify-end">
369
371
  <UButton
370
372
  size="xs"
@@ -388,28 +390,28 @@ const { requestClose } = useUnsavedGuard({
388
390
  simply not fetched. -->
389
391
  <div
390
392
  v-else-if="absence === 'no_run'"
391
- class="flex min-h-0 flex-1 flex-col items-center justify-center gap-2 px-5 py-10 text-center text-slate-400"
393
+ class="flex min-h-0 flex-1 flex-col items-center justify-center gap-2 px-5 py-10 text-center text-muted"
392
394
  data-testid="binary-candidates-no-run"
393
395
  >
394
396
  <UIcon name="i-lucide-unlink" class="h-8 w-8 opacity-40" />
395
397
  <p class="text-sm">{{ t('binaryCandidates.noRun.title') }}</p>
396
- <p class="max-w-md text-[11px] text-slate-500">{{ t('binaryCandidates.noRun.hint') }}</p>
398
+ <p class="max-w-md text-[11px] text-dimmed">{{ t('binaryCandidates.noRun.hint') }}</p>
397
399
  </div>
398
400
  <div
399
401
  v-else-if="absence === 'loading'"
400
- class="flex min-h-0 flex-1 flex-col items-center justify-center gap-2 px-5 py-10 text-center text-slate-400"
402
+ class="flex min-h-0 flex-1 flex-col items-center justify-center gap-2 px-5 py-10 text-center text-muted"
401
403
  data-testid="binary-candidates-loading"
402
404
  >
403
405
  <UIcon name="i-lucide-loader-circle" class="h-8 w-8 animate-spin opacity-60" />
404
406
  </div>
405
407
  <div
406
408
  v-else-if="absence === 'load_failed'"
407
- class="flex min-h-0 flex-1 flex-col items-center justify-center gap-2 px-5 py-10 text-center text-slate-400"
409
+ class="flex min-h-0 flex-1 flex-col items-center justify-center gap-2 px-5 py-10 text-center text-muted"
408
410
  data-testid="binary-candidates-load-error"
409
411
  >
410
- <UIcon name="i-lucide-triangle-alert" class="h-8 w-8 text-amber-400/70" />
412
+ <UIcon name="i-lucide-triangle-alert" class="h-8 w-8 text-app-warning-400/70" />
411
413
  <p class="text-sm">{{ t('binaryCandidates.loadFailed') }}</p>
412
- <p class="max-w-md break-words text-[11px] text-slate-500">{{ candidates.error }}</p>
414
+ <p class="max-w-md break-words text-[11px] text-dimmed">{{ candidates.error }}</p>
413
415
  <UButton
414
416
  size="xs"
415
417
  color="neutral"
@@ -423,7 +425,7 @@ const { requestClose } = useUnsavedGuard({
423
425
  </div>
424
426
  <div
425
427
  v-else
426
- class="flex min-h-0 flex-1 flex-col items-center justify-center gap-2 px-5 py-10 text-center text-slate-400"
428
+ class="flex min-h-0 flex-1 flex-col items-center justify-center gap-2 px-5 py-10 text-center text-muted"
427
429
  data-testid="binary-candidates-empty"
428
430
  >
429
431
  <UIcon name="i-lucide-images" class="h-8 w-8 opacity-40" />
@@ -55,13 +55,13 @@ const state = computed(() => {
55
55
  v-if="view"
56
56
  class="space-y-3"
57
57
  :class="
58
- variant === 'card' ? 'scroll-mt-4 rounded-xl border border-slate-800 bg-slate-900/50 p-4' : ''
58
+ variant === 'card' ? 'scroll-mt-4 rounded-xl border border-default bg-default/50 p-4' : ''
59
59
  "
60
60
  data-testid="binary-output-report"
61
61
  >
62
62
  <div
63
63
  v-if="variant === 'card'"
64
- class="flex items-center gap-1.5 text-[11px] font-semibold uppercase tracking-wide text-slate-400"
64
+ class="flex items-center gap-1.5 text-[11px] font-semibold uppercase tracking-wide text-muted"
65
65
  >
66
66
  <UIcon name="i-lucide-image" class="h-3.5 w-3.5" />
67
67
  <span>{{ t('binaryOutput.heading') }}</span>
@@ -72,7 +72,7 @@ const state = computed(() => {
72
72
  question the artifacts below cannot answer. An AUTOMATIC keep says so: nobody looked. -->
73
73
  <p
74
74
  v-if="candidates && candidates.state.candidates.length > 0"
75
- class="text-[12px] leading-relaxed text-slate-300"
75
+ class="text-[12px] leading-relaxed text-toned"
76
76
  data-testid="binary-output-candidate-decision"
77
77
  >
78
78
  {{
@@ -107,28 +107,28 @@ const state = computed(() => {
107
107
  records a declaration against a step that never held one), and rendering a blank
108
108
  would read as a missing value rather than an absent comparison. -->
109
109
  <dl class="grid grid-cols-[auto_1fr] gap-x-3 gap-y-1 text-[11px]">
110
- <dt class="text-slate-500">{{ t('binaryOutput.target') }}</dt>
110
+ <dt class="text-dimmed">{{ t('binaryOutput.target') }}</dt>
111
111
  <dd
112
112
  v-if="view.target"
113
- class="min-w-0 font-mono text-slate-300"
113
+ class="min-w-0 font-mono text-toned"
114
114
  data-testid="binary-output-target"
115
115
  >
116
116
  {{ view.target }}
117
117
  </dd>
118
- <dd v-else class="min-w-0 text-slate-400" data-testid="binary-output-target">
118
+ <dd v-else class="min-w-0 text-muted" data-testid="binary-output-target">
119
119
  {{ t('binaryOutput.targetNone') }}
120
120
  </dd>
121
121
  <template v-if="view.contextServices.length">
122
- <dt class="text-slate-500">{{ t('binaryOutput.contextServices') }}</dt>
123
- <dd class="min-w-0 font-mono text-slate-400">{{ view.contextServices.join(', ') }}</dd>
122
+ <dt class="text-dimmed">{{ t('binaryOutput.contextServices') }}</dt>
123
+ <dd class="min-w-0 font-mono text-muted">{{ view.contextServices.join(', ') }}</dd>
124
124
  </template>
125
125
  <!-- The formats the step REQUIRED, beside where they were meant to go. Rendered whenever
126
126
  the step stated any, including on a run that delivered them: the requirement is what
127
127
  makes the content types below it readable, and a reader checking whether a mesh will
128
128
  load needs to see what was asked for even when nothing went wrong. -->
129
129
  <template v-if="view.mediaTypes.length">
130
- <dt class="text-slate-500">{{ t('binaryOutput.mediaTypes') }}</dt>
131
- <dd class="min-w-0 font-mono text-slate-400" data-testid="binary-output-media-types">
130
+ <dt class="text-dimmed">{{ t('binaryOutput.mediaTypes') }}</dt>
131
+ <dd class="min-w-0 font-mono text-muted" data-testid="binary-output-media-types">
132
132
  {{ view.mediaTypes.join(', ') }}
133
133
  </dd>
134
134
  </template>
@@ -147,7 +147,7 @@ const state = computed(() => {
147
147
  <li
148
148
  v-for="(row, i) in view.rows"
149
149
  :key="`${row.service}:${row.location}:${i}`"
150
- class="relative rounded-md border border-slate-800 bg-slate-950/40 px-2.5 py-2"
150
+ class="relative rounded-md border border-default bg-app-950/40 px-2.5 py-2"
151
151
  data-testid="binary-output-artifact"
152
152
  >
153
153
  <CopyButton :text="row.location" class="absolute end-1 top-1" />
@@ -158,10 +158,10 @@ const state = computed(() => {
158
158
  :label="row.entity ?? row.description"
159
159
  class="mb-2 pe-8"
160
160
  />
161
- <code class="block break-all pe-8 font-mono text-[11px] text-slate-200">{{
161
+ <code class="block break-all pe-8 font-mono text-[11px] text-default">{{
162
162
  row.location
163
163
  }}</code>
164
- <div class="mt-1 flex flex-wrap items-center gap-x-2 gap-y-1 text-[10px] text-slate-500">
164
+ <div class="mt-1 flex flex-wrap items-center gap-x-2 gap-y-1 text-[10px] text-dimmed">
165
165
  <span class="font-mono">{{ row.service }}</span>
166
166
  <!-- The join the report cannot make on its own, and the question a human opens this
167
167
  for: did it go where the step pointed it? -->
@@ -225,7 +225,7 @@ const state = computed(() => {
225
225
  {{ t('binaryOutput.missizedBadge') }}
226
226
  </UBadge>
227
227
  </div>
228
- <p v-if="row.description" class="mt-1 text-[11px] leading-relaxed text-slate-400">
228
+ <p v-if="row.description" class="mt-1 text-[11px] leading-relaxed text-muted">
229
229
  {{ row.description }}
230
230
  </p>
231
231
  </li>
@@ -234,7 +234,7 @@ const state = computed(() => {
234
234
  <!-- Every qualification the report counted, each naming its own number. Never folded into
235
235
  one "some entries were dropped": the fix for an unknown service id is not the fix for
236
236
  a malformed entry, and neither is the fix for a list that stops short of the tail. -->
237
- <ul class="space-y-1 text-[11px] text-amber-400">
237
+ <ul class="space-y-1 text-[11px] text-app-warning-400">
238
238
  <!-- The step's OWN target went missing from the catalog, and an id the AGENT invented,
239
239
  are two different failures with two different fixes (re-register it, versus correct
240
240
  the declaration). `binaryOutputView` returns them as DISJOINT fields precisely so
@@ -89,7 +89,7 @@ const filename = computed(() => {
89
89
  frame. -->
90
90
  <p
91
91
  v-else-if="!isImage && url"
92
- class="flex items-center gap-1.5 rounded bg-slate-800/60 px-2 py-1.5 text-[11px] text-slate-300"
92
+ class="flex items-center gap-1.5 rounded bg-elevated/60 px-2 py-1.5 text-[11px] text-toned"
93
93
  data-testid="stored-asset-file"
94
94
  >
95
95
  <UIcon name="i-lucide-file" class="h-3.5 w-3.5 shrink-0" />
@@ -97,7 +97,7 @@ const filename = computed(() => {
97
97
  </p>
98
98
  <p
99
99
  v-else-if="status === 'error'"
100
- class="flex items-center gap-1.5 text-[11px] text-amber-300"
100
+ class="flex items-center gap-1.5 text-[11px] text-app-warning-300"
101
101
  data-testid="stored-asset-error"
102
102
  >
103
103
  <span>{{ t('binaryOutput.asset.loadFailed') }}</span>
@@ -105,7 +105,7 @@ const filename = computed(() => {
105
105
  {{ t('binaryOutput.asset.retry') }}
106
106
  </UButton>
107
107
  </p>
108
- <p v-else class="text-[11px] text-slate-500" data-testid="stored-asset-loading">
108
+ <p v-else class="text-[11px] text-dimmed" data-testid="stored-asset-loading">
109
109
  {{ t('binaryOutput.asset.loading') }}
110
110
  </p>
111
111
 
@@ -116,7 +116,7 @@ const filename = computed(() => {
116
116
  :href="url"
117
117
  target="_blank"
118
118
  rel="noopener"
119
- class="text-sky-300 hover:underline"
119
+ class="text-app-info-300 hover:underline"
120
120
  data-testid="stored-asset-open"
121
121
  @click.stop
122
122
  >{{ t('binaryOutput.asset.open') }}</a
@@ -124,7 +124,7 @@ const filename = computed(() => {
124
124
  <a
125
125
  :href="url"
126
126
  :download="filename"
127
- class="text-sky-300 hover:underline"
127
+ class="text-app-info-300 hover:underline"
128
128
  data-testid="stored-asset-download"
129
129
  @click.stop
130
130
  >{{ t('binaryOutput.asset.download') }}</a