@cat-factory/app 0.302.1 → 0.303.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (328) hide show
  1. package/README.md +16 -0
  2. package/app/app.config.ts +19 -10
  3. package/app/assets/css/main.css +13 -13
  4. package/app/assets/css/prose.css +22 -22
  5. package/app/assets/css/tokens.css +298 -0
  6. package/app/components/assistant/AssistantModal.vue +22 -22
  7. package/app/components/auth/AuthGate.vue +1 -1
  8. package/app/components/auth/BackendMisconfiguredScreen.vue +10 -10
  9. package/app/components/auth/LoginScreen.vue +34 -36
  10. package/app/components/auth/ResetPasswordScreen.vue +12 -12
  11. package/app/components/auth/UserMenu.vue +4 -4
  12. package/app/components/binaryCandidates/BinaryCandidatesWindow.vue +27 -25
  13. package/app/components/binaryOutput/BinaryOutputReport.vue +15 -15
  14. package/app/components/binaryOutput/StoredAssetView.vue +5 -5
  15. package/app/components/board/AddTaskModal.vue +17 -20
  16. package/app/components/board/AgentFailureCard.vue +11 -11
  17. package/app/components/board/AgentFailureHistory.vue +2 -2
  18. package/app/components/board/BoardCanvas.vue +6 -5
  19. package/app/components/board/CreateInitiativeModal.vue +8 -10
  20. package/app/components/board/DependencyConnectOverlay.vue +1 -1
  21. package/app/components/board/FailureHistoryList.vue +7 -7
  22. package/app/components/board/RecurringPipelineModal.vue +17 -17
  23. package/app/components/board/ReviewFrictionDialog.vue +6 -6
  24. package/app/components/board/StepExecutionHistory.vue +13 -13
  25. package/app/components/board/TaskDependencyEdges.vue +8 -8
  26. package/app/components/board/nodes/AgentChip.vue +10 -10
  27. package/app/components/board/nodes/BlockNode.vue +29 -29
  28. package/app/components/board/nodes/DecisionBadge.vue +2 -2
  29. package/app/components/board/nodes/EpicNode.vue +14 -10
  30. package/app/components/board/nodes/FrameSwimlanes.vue +7 -9
  31. package/app/components/board/nodes/InitiativeCard.vue +8 -8
  32. package/app/components/board/nodes/LaneGroup.vue +1 -1
  33. package/app/components/board/nodes/LaneTask.vue +2 -2
  34. package/app/components/board/nodes/ResizeGrips.vue +4 -4
  35. package/app/components/board/nodes/TaskCard.vue +18 -18
  36. package/app/components/board/nodes/TaskLane.vue +5 -5
  37. package/app/components/board/nodes/TaskPipelineMini.vue +18 -18
  38. package/app/components/bootstrap/AdoptionReviewModal.vue +29 -26
  39. package/app/components/bootstrap/BootstrapModal.vue +21 -23
  40. package/app/components/bootstrap/BootstrapRunSteps.vue +1 -1
  41. package/app/components/brainstorm/BrainstormWindow.vue +30 -33
  42. package/app/components/bugFishing/BugFishingWindow.vue +49 -49
  43. package/app/components/clarity/ClarityReviewWindow.vue +30 -30
  44. package/app/components/common/AsyncViewError.vue +5 -5
  45. package/app/components/common/ClarificationItem.vue +8 -13
  46. package/app/components/common/ConfirmDialog.vue +4 -2
  47. package/app/components/common/DescriptorFields.vue +1 -1
  48. package/app/components/common/EmptyState.vue +3 -3
  49. package/app/components/common/InterviewGateNotice.vue +7 -7
  50. package/app/components/common/KeyboardShortcutsHelp.vue +1 -1
  51. package/app/components/common/MarkdownProse.vue +14 -13
  52. package/app/components/consensus/ConsensusSessionWindow.vue +26 -26
  53. package/app/components/context/ContextAttachmentFields.vue +17 -17
  54. package/app/components/docs/DocInterviewWindow.vue +14 -14
  55. package/app/components/documents/ContextDocumentPicker.vue +17 -17
  56. package/app/components/documents/DocumentImportModal.vue +7 -7
  57. package/app/components/documents/DocumentSourceConnectModal.vue +3 -3
  58. package/app/components/documents/DocumentSyncState.vue +5 -5
  59. package/app/components/documents/DocumentTemplatesModal.vue +15 -15
  60. package/app/components/documents/RepoContextDocPicker.vue +5 -5
  61. package/app/components/documents/SpawnPreviewModal.vue +12 -12
  62. package/app/components/documents/StartFromDesignModal.vue +11 -11
  63. package/app/components/documents/TaskContextDocs.vue +5 -5
  64. package/app/components/environments/EnvSetupStepper.vue +6 -6
  65. package/app/components/environments/EnvironmentStatusPanel.vue +17 -17
  66. package/app/components/environments/steps/EnvPickStep.vue +3 -3
  67. package/app/components/environments/steps/EnvPreflightStep.vue +9 -9
  68. package/app/components/environments/steps/EnvReviewStep.vue +25 -22
  69. package/app/components/environments/steps/EnvSaveStep.vue +7 -5
  70. package/app/components/environments/steps/JourneyStepNav.vue +1 -1
  71. package/app/components/focus/BlockFocusView.vue +17 -19
  72. package/app/components/followUp/FollowUpWindow.vue +23 -23
  73. package/app/components/forkDecision/ForkDecisionWindow.vue +37 -39
  74. package/app/components/foundational/FoundationalContractSummary.vue +7 -7
  75. package/app/components/foundational/FoundationalServiceCatalogList.vue +11 -11
  76. package/app/components/foundational/FoundationalServiceManager.vue +1 -1
  77. package/app/components/foundational/FoundationalServiceRegistry.vue +13 -13
  78. package/app/components/foundational/FoundationalServiceSources.vue +13 -13
  79. package/app/components/foundational/FoundationalSuppressions.vue +7 -7
  80. package/app/components/foundational/ServiceCatalogConnection.vue +10 -10
  81. package/app/components/fragments/FragmentLibraryManager.vue +41 -44
  82. package/app/components/fragments/FragmentSelector.vue +13 -13
  83. package/app/components/fragments/GitHubDocUrlImport.vue +1 -1
  84. package/app/components/gates/GateFailingCheckList.vue +5 -5
  85. package/app/components/gates/GateResultView.vue +50 -47
  86. package/app/components/github/AddServiceFromRepoModal.vue +14 -14
  87. package/app/components/github/BranchProtectionPreflight.vue +13 -13
  88. package/app/components/github/GitHubConnect.vue +7 -7
  89. package/app/components/github/GitHubOnboarding.vue +7 -7
  90. package/app/components/github/GitHubPanel.vue +37 -40
  91. package/app/components/github/RepoTreeBrowser.vue +18 -18
  92. package/app/components/humanTest/HumanTestWindow.vue +30 -33
  93. package/app/components/initiative/InitiativePlanNotice.vue +5 -5
  94. package/app/components/initiative/InitiativePlanReview.vue +27 -29
  95. package/app/components/initiative/InitiativePlanningWindow.vue +10 -10
  96. package/app/components/initiative/InitiativeTrackerWindow.vue +71 -65
  97. package/app/components/inputGate/InputGateNotice.vue +2 -4
  98. package/app/components/judge/JudgeResultView.vue +30 -32
  99. package/app/components/kaizen/KaizenPanel.vue +40 -36
  100. package/app/components/kaizen/KaizenStepStatus.vue +21 -21
  101. package/app/components/layout/AccountAuditLog.vue +10 -10
  102. package/app/components/layout/AccountDeploymentSettings.vue +20 -20
  103. package/app/components/layout/AccountFailureKindRules.vue +13 -13
  104. package/app/components/layout/AccountFoundationalSettings.vue +1 -1
  105. package/app/components/layout/AccountFragmentSettings.vue +1 -1
  106. package/app/components/layout/AccountModelPolicySettings.vue +9 -9
  107. package/app/components/layout/AccountPlatformAlertSettings.vue +11 -11
  108. package/app/components/layout/AccountRiskPolicySettings.vue +2 -2
  109. package/app/components/layout/AccountRunCredentialSettings.vue +5 -5
  110. package/app/components/layout/AccountSkillSettings.vue +1 -1
  111. package/app/components/layout/AccountTeamSettings.vue +23 -15
  112. package/app/components/layout/AiProvidersBanner.vue +11 -8
  113. package/app/components/layout/AppearanceSwitcher.vue +108 -0
  114. package/app/components/layout/BoardSwitcher.vue +8 -11
  115. package/app/components/layout/BoardToolbar.vue +3 -3
  116. package/app/components/layout/CommandBar.vue +7 -9
  117. package/app/components/layout/ConnectionStatusBanner.vue +2 -2
  118. package/app/components/layout/DefaultTestEnvBanner.vue +5 -5
  119. package/app/components/layout/GitHubPatBanner.vue +5 -5
  120. package/app/components/layout/GitHubPatPermissionsBanner.vue +16 -10
  121. package/app/components/layout/InfraSetupBanner.vue +6 -6
  122. package/app/components/layout/IntegrationsHub.vue +15 -15
  123. package/app/components/layout/LanguageSwitcher.vue +5 -5
  124. package/app/components/layout/ModelProvidersHub.vue +13 -16
  125. package/app/components/layout/NotificationsInbox.vue +10 -10
  126. package/app/components/layout/PersonalSetupModal.vue +8 -8
  127. package/app/components/layout/ProviderConfigBanner.vue +4 -4
  128. package/app/components/layout/RolePrompt.vue +7 -7
  129. package/app/components/layout/SideBar.vue +6 -4
  130. package/app/components/layout/SpendWarningBanner.vue +17 -14
  131. package/app/components/layout/TranslationWarningBanner.vue +4 -4
  132. package/app/components/layout/UiModeSwitcher.vue +13 -13
  133. package/app/components/layout/UiRoleSwitcher.vue +8 -8
  134. package/app/components/layout/WorkspaceMembersSettings.vue +15 -11
  135. package/app/components/media/ArtifactLightbox.vue +13 -13
  136. package/app/components/media/ImageCompare.vue +31 -24
  137. package/app/components/merge/MergeEffortChips.vue +2 -2
  138. package/app/components/notifications/NotificationSettingsPanel.vue +14 -12
  139. package/app/components/observability/OutcomeFilterChips.vue +6 -6
  140. package/app/components/observability/RunFailureSummary.vue +28 -25
  141. package/app/components/observability/StepMetricsBar.vue +26 -28
  142. package/app/components/observability/StepModelActivity.vue +2 -2
  143. package/app/components/observability/ToolCallList.vue +24 -24
  144. package/app/components/outcome/OutcomeSummaryWindow.vue +47 -47
  145. package/app/components/palettes/AgentPalette.vue +8 -8
  146. package/app/components/palettes/AgentTierSelect.vue +1 -1
  147. package/app/components/palettes/PipelinePurposeSelect.vue +1 -1
  148. package/app/components/panels/AgentStepDetail.vue +52 -51
  149. package/app/components/panels/AttemptEntryHeader.vue +4 -6
  150. package/app/components/panels/DecisionModal.vue +7 -7
  151. package/app/components/panels/GenericStructuredResultView.vue +7 -7
  152. package/app/components/panels/InspectorPanel.vue +17 -17
  153. package/app/components/panels/MergerResultView.vue +19 -19
  154. package/app/components/panels/ObservabilityPanel.vue +115 -123
  155. package/app/components/panels/OperatorDashboardPanel.vue +89 -97
  156. package/app/components/panels/ReportsPanel.vue +69 -66
  157. package/app/components/panels/ReportsSpendBreakdown.vue +9 -9
  158. package/app/components/panels/ResultWindowShell.vue +38 -38
  159. package/app/components/panels/RunDetailLoadState.vue +2 -2
  160. package/app/components/panels/StepContainerStatus.vue +9 -9
  161. package/app/components/panels/StepDelegatedStatus.logic.spec.ts +135 -0
  162. package/app/components/panels/StepDelegatedStatus.logic.ts +160 -0
  163. package/app/components/panels/StepDelegatedStatus.vue +181 -0
  164. package/app/components/panels/StepEffortReport.vue +16 -15
  165. package/app/components/panels/StepFragmentAdherence.vue +14 -10
  166. package/app/components/panels/StepMetadataCard.vue +74 -45
  167. package/app/components/panels/StepReproductionReport.vue +25 -21
  168. package/app/components/panels/StepRunMeta.vue +20 -20
  169. package/app/components/panels/StepTestReport.logic.spec.ts +8 -3
  170. package/app/components/panels/StepTestReport.logic.ts +4 -4
  171. package/app/components/panels/StepTestReport.vue +28 -28
  172. package/app/components/panels/StepToolServers.vue +14 -11
  173. package/app/components/panels/StepValidationReport.vue +7 -7
  174. package/app/components/panels/inspector/ContainerSummary.vue +9 -9
  175. package/app/components/panels/inspector/DocReferenceRepos.vue +3 -3
  176. package/app/components/panels/inspector/EnvProbeReport.vue +24 -27
  177. package/app/components/panels/inspector/EpicChildren.vue +8 -12
  178. package/app/components/panels/inspector/FrontendBindingsResolved.vue +11 -11
  179. package/app/components/panels/inspector/FrontendConfig.vue +37 -41
  180. package/app/components/panels/inspector/InitiativeInspector.vue +3 -3
  181. package/app/components/panels/inspector/InspectorSection.vue +6 -6
  182. package/app/components/panels/inspector/RecurringScheduleSettings.vue +16 -19
  183. package/app/components/panels/inspector/ServiceConnections.vue +2 -2
  184. package/app/components/panels/inspector/ServiceReleaseHealthConfig.vue +2 -2
  185. package/app/components/panels/inspector/ServiceSelfTests.vue +21 -17
  186. package/app/components/panels/inspector/ServiceTestConfig.vue +51 -59
  187. package/app/components/panels/inspector/ServiceTestSecrets.vue +5 -5
  188. package/app/components/panels/inspector/ServiceTestingContext.vue +3 -3
  189. package/app/components/panels/inspector/ServiceValidationConfig.vue +2 -2
  190. package/app/components/panels/inspector/TaskAgentConfig.vue +3 -3
  191. package/app/components/panels/inspector/TaskAprioriBranches.vue +8 -5
  192. package/app/components/panels/inspector/TaskDependencies.vue +1 -1
  193. package/app/components/panels/inspector/TaskEstimateBadge.vue +11 -11
  194. package/app/components/panels/inspector/TaskExecution.vue +17 -17
  195. package/app/components/panels/inspector/TaskReviewTarget.vue +2 -2
  196. package/app/components/panels/inspector/TaskRunSettings.vue +35 -37
  197. package/app/components/panels/inspector/TaskStructure.vue +3 -3
  198. package/app/components/pipeline/AgentKindIcon.vue +1 -1
  199. package/app/components/pipeline/AgentPromptEditor.vue +17 -17
  200. package/app/components/pipeline/BinaryOutputStepPicker.vue +42 -56
  201. package/app/components/pipeline/EstimateThresholdFields.vue +4 -4
  202. package/app/components/pipeline/GateConfigFields.vue +13 -10
  203. package/app/components/pipeline/IterationCapPrompt.vue +4 -2
  204. package/app/components/pipeline/PipelineBuilder.vue +47 -55
  205. package/app/components/pipeline/PipelineHealthModal.vue +27 -29
  206. package/app/components/pipeline/PipelinePicker.vue +10 -10
  207. package/app/components/pipeline/PipelinePreview.vue +10 -10
  208. package/app/components/pipeline/PipelineProgress.vue +64 -67
  209. package/app/components/prReview/PrReviewPhaseBadge.vue +7 -7
  210. package/app/components/prReview/PrReviewWindow.vue +75 -77
  211. package/app/components/providers/AiPresetMismatchDialog.vue +5 -5
  212. package/app/components/providers/AiProviderOnboardingModal.vue +9 -9
  213. package/app/components/providers/ApiKeysSection.vue +13 -13
  214. package/app/components/providers/PersonalCredentialModal.vue +2 -2
  215. package/app/components/providers/PersonalSubscriptionSection.vue +10 -10
  216. package/app/components/providers/SignInRequiredNotice.vue +1 -1
  217. package/app/components/providers/VendorCredentialsModal.vue +10 -10
  218. package/app/components/provisioning/ProvisioningLogsDrawer.vue +13 -13
  219. package/app/components/ralph/RalphLoopResultView.vue +28 -30
  220. package/app/components/recurring/RecurrenceEditor.vue +2 -2
  221. package/app/components/requirements/RequirementsReviewWindow.vue +51 -58
  222. package/app/components/riskPolicy/RiskPolicyPicker.vue +12 -15
  223. package/app/components/riskPolicy/RiskPolicyPreview.vue +14 -14
  224. package/app/components/sandbox/SandboxPanel.vue +58 -59
  225. package/app/components/settings/AccountSettingsPanel.vue +1 -1
  226. package/app/components/settings/ApiTokensPanel.vue +10 -10
  227. package/app/components/settings/BudgetSettings.vue +18 -22
  228. package/app/components/settings/CapabilityCredentialsPanel.vue +15 -15
  229. package/app/components/settings/CloudflareHandlerSection.vue +20 -20
  230. package/app/components/settings/ComposeEnvironmentSetupSection.vue +13 -13
  231. package/app/components/settings/ConnectionTestVerdict.vue +3 -3
  232. package/app/components/settings/ConnectionWarnings.vue +1 -1
  233. package/app/components/settings/ConsensusGroupsSection.vue +27 -35
  234. package/app/components/settings/CustomManifestTypeEditor.vue +10 -10
  235. package/app/components/settings/DefaultProvisionTypeSection.vue +6 -6
  236. package/app/components/settings/InfraHandlersConfigurator.vue +24 -22
  237. package/app/components/settings/InfrastructureBackendPicker.vue +6 -6
  238. package/app/components/settings/InfrastructureWindow.vue +5 -5
  239. package/app/components/settings/IssueTrackerPanel.vue +29 -23
  240. package/app/components/settings/KubernetesEngineForm.vue +11 -11
  241. package/app/components/settings/KubernetesEnvironmentForm.vue +4 -4
  242. package/app/components/settings/LocalContainerPoolSettings.vue +6 -11
  243. package/app/components/settings/LocalModelEndpointsPanel.vue +20 -18
  244. package/app/components/settings/McpAuthorizeScreen.vue +13 -15
  245. package/app/components/settings/McpOAuthCallbackScreen.vue +16 -10
  246. package/app/components/settings/MergeClassRulesEditor.vue +6 -9
  247. package/app/components/settings/MergeRolePolicyEditor.vue +16 -16
  248. package/app/components/settings/ModelConfigurationPanel.vue +23 -30
  249. package/app/components/settings/ModelPresetHealthModal.vue +15 -13
  250. package/app/components/settings/ObservabilityConnectionPanel.vue +4 -4
  251. package/app/components/settings/OpenRouterCatalogPanel.vue +23 -19
  252. package/app/components/settings/PackageRegistriesPanel.vue +8 -8
  253. package/app/components/settings/ProviderConnectionTab.vue +8 -11
  254. package/app/components/settings/ProviderManifestEditor.vue +9 -9
  255. package/app/components/settings/ProviderPreferenceEditor.vue +8 -8
  256. package/app/components/settings/RiskPolicyCreateForm.vue +10 -10
  257. package/app/components/settings/RiskPolicyEditorRow.vue +14 -14
  258. package/app/components/settings/RiskPolicyHealthModal.vue +15 -13
  259. package/app/components/settings/RiskPolicyInheritedRow.vue +1 -1
  260. package/app/components/settings/RiskPolicyPanel.vue +10 -15
  261. package/app/components/settings/ServiceFragmentDefaultsPanel.vue +7 -7
  262. package/app/components/settings/SharedStacksPanel.vue +9 -12
  263. package/app/components/settings/TaskSourceCard.vue +4 -4
  264. package/app/components/settings/TaskTypeSuppressionsPanel.vue +6 -6
  265. package/app/components/settings/ToolServerChecklist.vue +36 -29
  266. package/app/components/settings/UsageSettings.vue +15 -15
  267. package/app/components/settings/UserSecretsSection.vue +9 -12
  268. package/app/components/settings/WorkspaceMetadataSettings.vue +5 -5
  269. package/app/components/settings/WorkspaceSettingsPanel.vue +47 -47
  270. package/app/components/skills/ReviewSkillQueue.vue +10 -10
  271. package/app/components/skills/SkillLibraryManager.vue +23 -20
  272. package/app/components/slack/SlackPanel.vue +13 -17
  273. package/app/components/spec/ServiceSpecWindow.vue +45 -42
  274. package/app/components/tasks/BugHuntModal.vue +24 -27
  275. package/app/components/tasks/ContextIssuePicker.vue +11 -11
  276. package/app/components/tasks/TaskContextIssues.vue +3 -3
  277. package/app/components/tasks/TaskImportModal.vue +7 -7
  278. package/app/components/tasks/TaskSourceConnectModal.vue +10 -8
  279. package/app/components/testing/TestReportWindow.vue +99 -82
  280. package/app/components/theme/ThemeImportModal.vue +115 -0
  281. package/app/components/tutorial/TutorialCatalogue.vue +9 -9
  282. package/app/components/tutorial/TutorialNudge.vue +5 -5
  283. package/app/components/tutorial/TutorialOverlay.vue +12 -12
  284. package/app/components/tutorial/TutorialPrompt.vue +6 -9
  285. package/app/components/vcs/GitLabConnect.vue +4 -4
  286. package/app/components/vcs/VcsConnectSurfaces.vue +2 -2
  287. package/app/components/visualConfirm/VisualConfirmationWindow.vue +36 -36
  288. package/app/composables/api/client.ts +6 -1
  289. package/app/composables/usePipelineErrorToast.ts +17 -0
  290. package/app/modular/agent-kinds.ts +24 -0
  291. package/app/pages/index.vue +5 -5
  292. package/app/plugins/theme.client.ts +125 -0
  293. package/app/spa-loading-template.html +52 -14
  294. package/app/stores/agents.ts +1 -1
  295. package/app/stores/theme.spec.ts +56 -0
  296. package/app/stores/theme.ts +87 -0
  297. package/app/types/domain.ts +19 -0
  298. package/app/types/execution.ts +4 -0
  299. package/app/utils/agentOutput.ts +1 -1
  300. package/app/utils/binaryOutput.ts +6 -6
  301. package/app/utils/bootstrapSteps.ts +14 -14
  302. package/app/utils/catalog.ts +87 -83
  303. package/app/utils/colorTint.ts +10 -0
  304. package/app/utils/failureKinds.ts +1 -0
  305. package/app/utils/observability.ts +3 -3
  306. package/app/utils/pipelineRender.ts +13 -17
  307. package/app/utils/swimlanes.ts +4 -4
  308. package/app/utils/theme/bootPalette.spec.ts +54 -0
  309. package/app/utils/theme/bootPalette.ts +108 -0
  310. package/app/utils/theme/builtins.spec.ts +38 -0
  311. package/app/utils/theme/builtins.ts +55 -0
  312. package/app/utils/theme/css.ts +162 -0
  313. package/app/utils/theme/doc.ts +353 -0
  314. package/app/utils/theme/link.ts +93 -0
  315. package/app/utils/theme/presets.ts +509 -0
  316. package/app/utils/theme/theme.spec.ts +224 -0
  317. package/i18n/locales/de.json +61 -4
  318. package/i18n/locales/en.json +70 -4
  319. package/i18n/locales/es.json +61 -4
  320. package/i18n/locales/fr.json +61 -4
  321. package/i18n/locales/he.json +61 -4
  322. package/i18n/locales/it.json +61 -4
  323. package/i18n/locales/ja.json +61 -4
  324. package/i18n/locales/pl.json +61 -4
  325. package/i18n/locales/tr.json +61 -4
  326. package/i18n/locales/uk.json +61 -4
  327. package/nuxt.config.ts +37 -11
  328. package/package.json +10 -9
@@ -154,16 +154,16 @@ function reveal(blockId: string): void {
154
154
  <UModal v-model:open="open" :title="t('assistant.title')" :ui="{ content: 'max-w-2xl' }">
155
155
  <template #body>
156
156
  <div class="space-y-4">
157
- <p class="text-sm text-slate-400">{{ t('assistant.intro') }}</p>
157
+ <p class="text-sm text-muted">{{ t('assistant.intro') }}</p>
158
158
 
159
159
  <!-- The read FAILED: this deployment may well have a model, and nobody can tell from here.
160
160
  So it offers the read again instead of explaining a configuration that may be fine. -->
161
161
  <div
162
162
  v-if="surface === 'unreadable'"
163
- class="flex items-start gap-2 rounded-md bg-slate-800/60 p-3 text-sm text-slate-300"
163
+ class="flex items-start gap-2 rounded-md bg-elevated/60 p-3 text-sm text-toned"
164
164
  data-testid="assistant-unreadable"
165
165
  >
166
- <UIcon name="i-lucide-unplug" class="mt-0.5 h-4 w-4 shrink-0 text-amber-400" />
166
+ <UIcon name="i-lucide-unplug" class="mt-0.5 h-4 w-4 shrink-0 text-app-warning-400" />
167
167
  <div class="space-y-2">
168
168
  <p>{{ t('assistant.unreadable') }}</p>
169
169
  <UButton
@@ -181,10 +181,10 @@ function reveal(blockId: string): void {
181
181
  <!-- No model wired: say so, rather than offering a box whose every submit would 503. -->
182
182
  <div
183
183
  v-else-if="surface === 'unwired'"
184
- class="flex items-start gap-2 rounded-md bg-slate-800/60 p-3 text-sm text-slate-300"
184
+ class="flex items-start gap-2 rounded-md bg-elevated/60 p-3 text-sm text-toned"
185
185
  data-testid="assistant-unwired"
186
186
  >
187
- <UIcon name="i-lucide-plug" class="mt-0.5 h-4 w-4 shrink-0 text-slate-500" />
187
+ <UIcon name="i-lucide-plug" class="mt-0.5 h-4 w-4 shrink-0 text-dimmed" />
188
188
  <span>{{ t('assistant.unavailable') }}</span>
189
189
  </div>
190
190
 
@@ -192,10 +192,10 @@ function reveal(blockId: string): void {
192
192
  and every submit against it would be refused with `assistant_no_actions`. -->
193
193
  <div
194
194
  v-else-if="surface === 'no_actions'"
195
- class="flex items-start gap-2 rounded-md bg-slate-800/60 p-3 text-sm text-slate-300"
195
+ class="flex items-start gap-2 rounded-md bg-elevated/60 p-3 text-sm text-toned"
196
196
  data-testid="assistant-no-actions"
197
197
  >
198
- <UIcon name="i-lucide-list-x" class="mt-0.5 h-4 w-4 shrink-0 text-slate-500" />
198
+ <UIcon name="i-lucide-list-x" class="mt-0.5 h-4 w-4 shrink-0 text-dimmed" />
199
199
  <span>{{ t('assistant.noActions') }}</span>
200
200
  </div>
201
201
 
@@ -240,7 +240,7 @@ function reveal(blockId: string): void {
240
240
  role="status"
241
241
  :aria-live="submitReason ? 'polite' : 'off'"
242
242
  class="flex items-center gap-1 text-xs"
243
- :class="submitReason ? 'text-amber-400' : 'text-slate-500'"
243
+ :class="submitReason ? 'text-app-warning-400' : 'text-dimmed'"
244
244
  data-testid="assistant-submit-status"
245
245
  >
246
246
  <UIcon
@@ -254,7 +254,7 @@ function reveal(blockId: string): void {
254
254
 
255
255
  <!-- What it can do, always visible: the catalog is the affordance. -->
256
256
  <div v-if="examples.length" class="space-y-2">
257
- <p class="text-xs font-medium uppercase tracking-wide text-slate-500">
257
+ <p class="text-xs font-medium uppercase tracking-wide text-dimmed">
258
258
  {{ t('assistant.examplesTitle') }}
259
259
  </p>
260
260
  <div class="flex flex-col gap-1">
@@ -262,11 +262,11 @@ function reveal(blockId: string): void {
262
262
  v-for="entry in examples"
263
263
  :key="entry.actionId"
264
264
  type="button"
265
- class="rounded-md px-2 py-1 text-left text-sm text-slate-300 hover:bg-slate-800"
265
+ class="rounded-md px-2 py-1 text-left text-sm text-toned hover:bg-elevated"
266
266
  @click="useExample(entry.example)"
267
267
  >
268
- <span class="text-slate-400">{{ entry.label }}</span>
269
- <span class="block text-xs text-slate-500">“{{ entry.example }}”</span>
268
+ <span class="text-muted">{{ entry.label }}</span>
269
+ <span class="block text-xs text-dimmed">“{{ entry.example }}”</span>
270
270
  </button>
271
271
  </div>
272
272
  </div>
@@ -274,12 +274,12 @@ function reveal(blockId: string): void {
274
274
  <!-- The outcome. Rendered from the turn's data; no model prose reaches this. -->
275
275
  <div
276
276
  v-if="outcome"
277
- class="rounded-md border border-slate-700 p-3 text-sm"
277
+ class="rounded-md border border-muted p-3 text-sm"
278
278
  data-testid="assistant-outcome"
279
279
  >
280
280
  <template v-if="outcome.status === 'performed'">
281
- <div class="flex items-start gap-2 text-slate-200">
282
- <UIcon name="i-lucide-check" class="mt-0.5 h-4 w-4 shrink-0 text-emerald-400" />
281
+ <div class="flex items-start gap-2 text-default">
282
+ <UIcon name="i-lucide-check" class="mt-0.5 h-4 w-4 shrink-0 text-app-success-400" />
283
283
  <div class="space-y-2">
284
284
  <p v-if="outcome.result.actionId === 'declare-service-dependency'">
285
285
  {{
@@ -329,8 +329,11 @@ function reveal(blockId: string): void {
329
329
  </template>
330
330
 
331
331
  <template v-else-if="outcome.status === 'needs_input'">
332
- <div class="flex items-start gap-2 text-slate-200">
333
- <UIcon name="i-lucide-help-circle" class="mt-0.5 h-4 w-4 shrink-0 text-amber-400" />
332
+ <div class="flex items-start gap-2 text-default">
333
+ <UIcon
334
+ name="i-lucide-help-circle"
335
+ class="mt-0.5 h-4 w-4 shrink-0 text-app-warning-400"
336
+ />
334
337
  <div class="space-y-2">
335
338
  <p>{{ t(`assistant.needsInput.${outcome.reason}`) }}</p>
336
339
  <div v-if="outcome.candidates.length" class="flex flex-wrap gap-1">
@@ -351,11 +354,8 @@ function reveal(blockId: string): void {
351
354
  </template>
352
355
 
353
356
  <template v-else>
354
- <div class="flex items-start gap-2 text-slate-200">
355
- <UIcon
356
- name="i-lucide-circle-slash"
357
- class="mt-0.5 h-4 w-4 shrink-0 text-slate-500"
358
- />
357
+ <div class="flex items-start gap-2 text-default">
358
+ <UIcon name="i-lucide-circle-slash" class="mt-0.5 h-4 w-4 shrink-0 text-dimmed" />
359
359
  <p>{{ t('assistant.declined') }}</p>
360
360
  </div>
361
361
  </template>
@@ -22,7 +22,7 @@ onMounted(() => void auth.bootstrap().finally(() => markBoot('auth-ready')))
22
22
  <template>
23
23
  <div
24
24
  v-if="!auth.ready"
25
- class="flex h-screen w-screen flex-col items-center justify-center gap-3 bg-slate-950 text-slate-400"
25
+ class="flex h-screen w-screen flex-col items-center justify-center gap-3 bg-app-950 text-muted"
26
26
  >
27
27
  <UIcon name="i-lucide-loader" class="h-8 w-8 animate-spin" />
28
28
  <span class="text-sm">{{ t('auth.gate.loading') }}</span>
@@ -18,13 +18,13 @@ function reload() {
18
18
 
19
19
  <template>
20
20
  <div
21
- class="flex h-screen w-screen flex-col items-center justify-center bg-slate-950 p-6 text-slate-200"
21
+ class="flex h-screen w-screen flex-col items-center justify-center bg-app-950 p-6 text-default"
22
22
  >
23
23
  <div class="w-full max-w-2xl">
24
24
  <div class="mb-6 text-center">
25
- <UIcon name="i-lucide-server-cog" class="mx-auto mb-3 h-10 w-10 text-amber-400" />
25
+ <UIcon name="i-lucide-server-cog" class="mx-auto mb-3 h-10 w-10 text-app-warning-400" />
26
26
  <h1 class="text-lg font-semibold">{{ t('app.misconfigured.title') }}</h1>
27
- <p class="mx-auto mt-2 max-w-lg text-sm text-slate-400">
27
+ <p class="mx-auto mt-2 max-w-lg text-sm text-muted">
28
28
  {{ t('app.misconfigured.intro') }}
29
29
  </p>
30
30
  </div>
@@ -33,12 +33,12 @@ function reload() {
33
33
  <li
34
34
  v-for="problem in problems"
35
35
  :key="problem.key"
36
- class="rounded-lg border border-slate-800 bg-slate-900/60 p-4"
36
+ class="rounded-lg border border-default bg-default/60 p-4"
37
37
  >
38
- <code class="text-sm font-semibold text-amber-300">{{ problem.key }}</code>
39
- <p class="mt-1 text-sm text-slate-300">{{ problem.summary }}</p>
40
- <p class="mt-2 text-sm text-slate-400">
41
- <span class="font-medium text-slate-300">{{ t('app.misconfigured.howToFix') }}</span>
38
+ <code class="text-sm font-semibold text-app-warning-300">{{ problem.key }}</code>
39
+ <p class="mt-1 text-sm text-toned">{{ problem.summary }}</p>
40
+ <p class="mt-2 text-sm text-muted">
41
+ <span class="font-medium text-toned">{{ t('app.misconfigured.howToFix') }}</span>
42
42
  {{ problem.remedy }}
43
43
  </p>
44
44
  <a
@@ -46,7 +46,7 @@ function reload() {
46
46
  :href="problem.docsUrl"
47
47
  target="_blank"
48
48
  rel="noopener noreferrer"
49
- class="mt-2 inline-flex items-center gap-1 text-sm text-amber-300 hover:text-amber-200"
49
+ class="mt-2 inline-flex items-center gap-1 text-sm text-app-warning-300 hover:text-app-warning-200"
50
50
  >
51
51
  <UIcon name="i-lucide-book-open" class="h-4 w-4" />
52
52
  {{ t('app.misconfigured.viewDocs') }}
@@ -59,7 +59,7 @@ function reload() {
59
59
  {{ t('app.misconfigured.reload') }}
60
60
  </UButton>
61
61
  </div>
62
- <p class="mt-4 text-center text-xs text-slate-500">{{ t('app.misconfigured.hint') }}</p>
62
+ <p class="mt-4 text-center text-xs text-dimmed">{{ t('app.misconfigured.hint') }}</p>
63
63
  </div>
64
64
  </div>
65
65
  </template>
@@ -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" />