@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
@@ -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
@@ -916,10 +916,10 @@ function openReviewFrictionDialog(conflict: NonNullable<ReturnType<typeof parseC
916
916
  <UModal v-model:open="modalOpen" :title="t('board.addTask.title')">
917
917
  <template #body>
918
918
  <div class="space-y-4" data-testid="add-task-modal">
919
- <p v-if="container" class="text-xs text-slate-400">
919
+ <p v-if="container" class="text-xs text-muted">
920
920
  <i18n-t keypath="board.addTask.newTaskIn" tag="span" scope="global">
921
921
  <template #container>
922
- <span class="font-medium text-slate-200">{{ container.title }}</span>
922
+ <span class="font-medium text-default">{{ container.title }}</span>
923
923
  </template>
924
924
  </i18n-t>
925
925
  </p>
@@ -940,7 +940,7 @@ function openReviewFrictionDialog(conflict: NonNullable<ReturnType<typeof parseC
940
940
  >
941
941
  <p
942
942
  v-if="row.caption"
943
- class="mb-1 px-1 text-[11px] font-semibold uppercase tracking-wide text-slate-500"
943
+ class="mb-1 px-1 text-[11px] font-semibold uppercase tracking-wide text-dimmed"
944
944
  data-testid="task-type-category"
945
945
  >
946
946
  {{ row.caption }}
@@ -981,10 +981,7 @@ function openReviewFrictionDialog(conflict: NonNullable<ReturnType<typeof parseC
981
981
  </UFormField>
982
982
 
983
983
  <!-- Recurring tasks are configured as a schedule on the service frame. -->
984
- <div
985
- v-if="isRecurring"
986
- class="rounded-lg border border-slate-800 p-3 text-[11px] text-slate-400"
987
- >
984
+ <div v-if="isRecurring" class="rounded-lg border border-default p-3 text-[11px] text-muted">
988
985
  <template v-if="recurringFrameId">
989
986
  {{ t('board.addTask.recurringWithFrame') }}
990
987
  </template>
@@ -1023,10 +1020,10 @@ function openReviewFrictionDialog(conflict: NonNullable<ReturnType<typeof parseC
1023
1020
  autoresize
1024
1021
  readonly
1025
1022
  class="w-full"
1026
- :ui="{ base: 'cursor-default text-slate-300' }"
1023
+ :ui="{ base: 'cursor-default text-toned' }"
1027
1024
  />
1028
1025
  </UFormField>
1029
- <p v-if="resolvingIssueBodies" class="text-[11px] text-slate-500">
1026
+ <p v-if="resolvingIssueBodies" class="text-[11px] text-dimmed">
1030
1027
  {{ t('board.addTask.loadingIssue') }}
1031
1028
  </p>
1032
1029
 
@@ -1054,10 +1051,10 @@ function openReviewFrictionDialog(conflict: NonNullable<ReturnType<typeof parseC
1054
1051
 
1055
1052
  <UCheckbox v-if="uiMode.isAdvanced" v-model="technical" name="technical">
1056
1053
  <template #label>
1057
- <span class="text-sm text-slate-200">{{ t('board.addTask.technical') }}</span>
1054
+ <span class="text-sm text-default">{{ t('board.addTask.technical') }}</span>
1058
1055
  </template>
1059
1056
  <template #description>
1060
- <span class="text-[11px] text-slate-500">
1057
+ <span class="text-[11px] text-dimmed">
1061
1058
  {{ t('board.addTask.technicalHint') }}
1062
1059
  </span>
1063
1060
  </template>
@@ -1109,22 +1106,22 @@ function openReviewFrictionDialog(conflict: NonNullable<ReturnType<typeof parseC
1109
1106
  <label
1110
1107
  v-for="phase in BUG_FISHING_PHASES"
1111
1108
  :key="phase.id"
1112
- class="flex items-start gap-2 rounded-md px-1.5 py-1 text-[12px] hover:bg-slate-800/40"
1109
+ class="flex items-start gap-2 rounded-md px-1.5 py-1 text-[12px] hover:bg-elevated/40"
1113
1110
  >
1114
1111
  <input
1115
1112
  v-model="fishingPhaseIds"
1116
1113
  type="checkbox"
1117
1114
  :value="phase.id"
1118
- class="mt-0.5 accent-sky-500"
1115
+ class="mt-0.5 accent-app-info-500"
1119
1116
  :data-testid="`add-task-fishing-angle-${phase.id}`"
1120
1117
  />
1121
1118
  <span class="min-w-0">
1122
- <span class="block text-slate-200">{{ phase.title }}</span>
1123
- <span class="block text-[11px] text-slate-500">{{ phase.goal }}</span>
1119
+ <span class="block text-default">{{ phase.title }}</span>
1120
+ <span class="block text-[11px] text-dimmed">{{ phase.goal }}</span>
1124
1121
  </span>
1125
1122
  </label>
1126
1123
  </div>
1127
- <p v-if="fishingPhaseIds.length === 0" class="mt-1.5 text-[11px] text-slate-500">
1124
+ <p v-if="fishingPhaseIds.length === 0" class="mt-1.5 text-[11px] text-dimmed">
1128
1125
  {{ t('board.addTask.bugFishingFields.angles.allSelected') }}
1129
1126
  </p>
1130
1127
  </UFormField>
@@ -1388,11 +1385,11 @@ function openReviewFrictionDialog(conflict: NonNullable<ReturnType<typeof parseC
1388
1385
  </div>
1389
1386
 
1390
1387
  <div v-if="configDescriptors.length" class="space-y-3">
1391
- <span class="text-[11px] font-semibold uppercase tracking-wide text-slate-400">
1388
+ <span class="text-[11px] font-semibold uppercase tracking-wide text-muted">
1392
1389
  {{ t('board.addTask.agentConfiguration') }}
1393
1390
  </span>
1394
1391
  <div v-for="d in configDescriptors" :key="d.id" class="space-y-1">
1395
- <div class="text-[11px] text-slate-400">{{ d.label }}</div>
1392
+ <div class="text-[11px] text-muted">{{ d.label }}</div>
1396
1393
  <div v-if="d.type === 'select'" class="flex flex-wrap gap-1">
1397
1394
  <UButton
1398
1395
  v-for="opt in d.options"
@@ -1414,7 +1411,7 @@ function openReviewFrictionDialog(conflict: NonNullable<ReturnType<typeof parseC
1414
1411
  :data-testid="`agent-config-${d.id}`"
1415
1412
  @update:model-value="(v: string | number) => setConfig(d.id, String(v))"
1416
1413
  />
1417
- <p class="text-[11px] leading-snug text-slate-500">{{ d.description }}</p>
1414
+ <p class="text-[11px] leading-snug text-dimmed">{{ d.description }}</p>
1418
1415
  </div>
1419
1416
  </div>
1420
1417
 
@@ -1443,7 +1440,7 @@ function openReviewFrictionDialog(conflict: NonNullable<ReturnType<typeof parseC
1443
1440
  :issues-hint="t('board.addTask.noIssuesHint')"
1444
1441
  />
1445
1442
 
1446
- <p class="text-[11px] text-slate-500">
1443
+ <p class="text-[11px] text-dimmed">
1447
1444
  {{ t('board.addTask.plannedHint') }}
1448
1445
  </p>
1449
1446
  </template>
@@ -133,7 +133,7 @@ async function retry() {
133
133
 
134
134
  <template>
135
135
  <div
136
- class="nodrag rounded-lg border border-rose-900/60 bg-rose-950/40"
136
+ class="nodrag rounded-lg border border-app-error-900/60 bg-app-error-950/40"
137
137
  :class="compact ? 'px-3 py-2' : 'px-3 py-2.5'"
138
138
  data-testid="agent-failure-banner"
139
139
  :data-run-kind="run.kind"
@@ -141,15 +141,15 @@ async function retry() {
141
141
  <div class="flex items-center gap-1.5" :class="compact ? 'text-[11px]' : 'text-xs'">
142
142
  <UIcon
143
143
  name="i-lucide-alert-triangle"
144
- class="shrink-0 text-rose-400"
144
+ class="shrink-0 text-app-error-400"
145
145
  :class="compact ? 'h-3.5 w-3.5' : 'h-4 w-4'"
146
146
  />
147
- <span class="text-rose-300">{{ title }}</span>
147
+ <span class="text-app-error-300">{{ title }}</span>
148
148
  </div>
149
149
 
150
150
  <p
151
151
  v-if="failure?.message"
152
- class="mt-1 leading-snug text-rose-300/90"
152
+ class="mt-1 leading-snug text-app-error-300/90"
153
153
  :class="compact ? 'line-clamp-2 text-[10px]' : 'text-[11px]'"
154
154
  :title="failure.message"
155
155
  >
@@ -158,7 +158,7 @@ async function retry() {
158
158
 
159
159
  <p
160
160
  v-if="failure?.hint"
161
- class="mt-1 leading-snug text-rose-400/70"
161
+ class="mt-1 leading-snug text-app-error-400/70"
162
162
  :class="compact ? 'text-[10px]' : 'text-[11px]'"
163
163
  >
164
164
  {{ failure.hint }}
@@ -168,7 +168,7 @@ async function retry() {
168
168
  name the concrete .env fix rather than only pointing at the (unhelpful-here) tab. -->
169
169
  <p
170
170
  v-if="showEnvironmentLocalHint && !compact"
171
- class="mt-1 text-[11px] leading-snug text-rose-400/70"
171
+ class="mt-1 text-[11px] leading-snug text-app-error-400/70"
172
172
  data-testid="agent-failure-environment-local-hint"
173
173
  >
174
174
  {{
@@ -192,14 +192,14 @@ async function retry() {
192
192
  v-if="!compact && failure"
193
193
  :detail="failure.detail"
194
194
  :message="failure.message"
195
- summary-class="text-[10px] text-rose-400/60 hover:text-rose-300"
196
- pre-class="bg-rose-950/60 text-[10px] text-rose-200/80"
195
+ summary-class="text-[10px] text-app-error-400/60 hover:text-app-error-300"
196
+ pre-class="bg-app-error-950/60 text-[10px] text-app-error-200/80"
197
197
  />
198
198
 
199
199
  <div class="mt-2 flex flex-wrap items-center gap-2">
200
200
  <button
201
201
  type="button"
202
- class="nodrag flex items-center gap-1 rounded-md bg-rose-900/40 text-rose-200 hover:bg-rose-900/70 disabled:opacity-60"
202
+ class="nodrag flex items-center gap-1 rounded-md bg-app-error-900/40 text-app-error-200 hover:bg-app-error-900/70 disabled:opacity-60"
203
203
  :class="compact ? 'px-2 py-0.5 text-[10px]' : 'px-2 py-1 text-[11px]'"
204
204
  :disabled="retrying || !access.canExecuteRuns.value"
205
205
  :title="access.canExecuteRuns.value ? undefined : t('access.noRunExecute')"
@@ -216,7 +216,7 @@ async function retry() {
216
216
  <button
217
217
  v-if="run.kind === 'bootstrap'"
218
218
  type="button"
219
- class="nodrag flex items-center gap-1 rounded-md bg-rose-900/20 text-rose-300 hover:bg-rose-900/50"
219
+ class="nodrag flex items-center gap-1 rounded-md bg-app-error-900/20 text-app-error-300 hover:bg-app-error-900/50"
220
220
  :class="compact ? 'px-2 py-0.5 text-[10px]' : 'px-2 py-1 text-[11px]'"
221
221
  data-testid="agent-failure-inspect"
222
222
  @click.stop="inspectRun"
@@ -233,7 +233,7 @@ async function retry() {
233
233
  <button
234
234
  v-if="isEnvironmentFailure"
235
235
  type="button"
236
- class="nodrag flex items-center gap-1 rounded-md bg-rose-900/20 text-rose-300 hover:bg-rose-900/50"
236
+ class="nodrag flex items-center gap-1 rounded-md bg-app-error-900/20 text-app-error-300 hover:bg-app-error-900/50"
237
237
  :class="compact ? 'px-2 py-0.5 text-[10px]' : 'px-2 py-1 text-[11px]'"
238
238
  data-testid="agent-failure-configure-environment"
239
239
  @click.stop="openFailureSetup"
@@ -15,11 +15,11 @@ const { t } = useI18n()
15
15
  <template>
16
16
  <details
17
17
  v-if="failures.length"
18
- class="nodrag rounded-lg border border-slate-700/60 bg-slate-900/40 px-3 py-2"
18
+ class="nodrag rounded-lg border border-muted/60 bg-default/40 px-3 py-2"
19
19
  data-testid="agent-failure-history"
20
20
  >
21
21
  <summary
22
- class="flex cursor-pointer items-center gap-1.5 text-[11px] text-slate-400 hover:text-slate-200"
22
+ class="flex cursor-pointer items-center gap-1.5 text-[11px] text-muted hover:text-default"
23
23
  >
24
24
  <UIcon name="i-lucide-history" class="h-3.5 w-3.5 shrink-0" />
25
25
  {{ t('board.failure.history.previousErrors', { count: failures.length }, failures.length) }}
@@ -141,7 +141,8 @@ function onPaneClick() {
141
141
  @pane-click="onPaneClick"
142
142
  @contextmenu.prevent
143
143
  >
144
- <Background pattern-color="#1e293b" :gap="22" :size="1.4" />
144
+ <!-- The dot grid rides the border token: `neutral-800` in dark (the shade it always was), `200` in light. -->
145
+ <Background pattern-color="var(--ui-border)" :gap="22" :size="1.4" />
145
146
  <!-- No minimap: it's a precise-pointer affordance (too small to hit on touch,
146
147
  eats scarce width on narrow windows) that earned its keep on neither
147
148
  desktop nor mobile. The toolbar's zoom-in/out + fit-view controls are the
@@ -163,10 +164,10 @@ function onPaneClick() {
163
164
  v-if="board.frames.length === 0"
164
165
  class="pointer-events-none absolute inset-0 flex flex-col items-center justify-center gap-4 text-center"
165
166
  >
166
- <UIcon name="i-lucide-layout-dashboard" class="h-10 w-10 text-slate-600" />
167
+ <UIcon name="i-lucide-layout-dashboard" class="h-10 w-10 text-app-600" />
167
168
  <div>
168
- <h2 class="text-base font-semibold text-slate-300">{{ t('board.canvas.emptyTitle') }}</h2>
169
- <p class="mt-1 max-w-sm text-sm text-slate-500">
169
+ <h2 class="text-base font-semibold text-toned">{{ t('board.canvas.emptyTitle') }}</h2>
170
+ <p class="mt-1 max-w-sm text-sm text-dimmed">
170
171
  {{ t('board.canvas.emptyBody') }}
171
172
  </p>
172
173
  </div>
@@ -195,7 +196,7 @@ function onPaneClick() {
195
196
  </UButton>
196
197
  </div>
197
198
  <!-- A read-only viewer sees the empty state but no create affordances. -->
198
- <p v-else class="max-w-sm text-xs text-slate-600">{{ t('access.noBoardWrite') }}</p>
199
+ <p v-else class="max-w-sm text-xs text-app-600">{{ t('access.noBoardWrite') }}</p>
199
200
  </div>
200
201
 
201
202
  <!-- task dependency arrows, overlaid in screen space -->
@@ -180,10 +180,10 @@ async function create() {
180
180
  <UModal v-model:open="open" :title="t('initiative.create.title')">
181
181
  <template #body>
182
182
  <div class="space-y-4" data-testid="create-initiative-modal">
183
- <p v-if="frame" class="text-xs text-slate-400">
183
+ <p v-if="frame" class="text-xs text-muted">
184
184
  <i18n-t keypath="initiative.create.inFrame" tag="span" scope="global">
185
185
  <template #frame>
186
- <span class="font-medium text-slate-200">{{ frame.title }}</span>
186
+ <span class="font-medium text-default">{{ frame.title }}</span>
187
187
  </template>
188
188
  </i18n-t>
189
189
  </p>
@@ -191,9 +191,7 @@ async function create() {
191
191
  <!-- Preset picker: only when a deployment registered presets beyond the built-in generic
192
192
  one, so a single-preset install keeps today's plain form. -->
193
193
  <div v-if="presets.length > 1" class="space-y-1.5">
194
- <span class="text-xs font-medium text-slate-300">{{
195
- t('initiative.create.preset')
196
- }}</span>
194
+ <span class="text-xs font-medium text-toned">{{ t('initiative.create.preset') }}</span>
197
195
  <div class="grid gap-2" data-testid="initiative-preset-picker">
198
196
  <button
199
197
  v-for="p in presets"
@@ -204,8 +202,8 @@ async function create() {
204
202
  class="flex items-start gap-3 rounded-md border px-3 py-2 text-left transition"
205
203
  :class="
206
204
  p.id === selectedPresetId
207
- ? 'border-primary-500 bg-primary-950/30'
208
- : 'border-slate-700 hover:border-slate-600'
205
+ ? 'border-primary bg-primary/10'
206
+ : 'border-muted hover:border-app-600'
209
207
  "
210
208
  @click="selectPreset(p.id)"
211
209
  >
@@ -215,10 +213,10 @@ async function create() {
215
213
  :style="{ color: p.presentation.color }"
216
214
  />
217
215
  <span class="min-w-0">
218
- <span class="block text-sm font-medium text-slate-200">
216
+ <span class="block text-sm font-medium text-default">
219
217
  {{ p.presentation.label }}
220
218
  </span>
221
- <span class="block text-[11px] text-slate-400">
219
+ <span class="block text-[11px] text-muted">
222
220
  {{ p.presentation.description }}
223
221
  </span>
224
222
  </span>
@@ -266,7 +264,7 @@ async function create() {
266
264
  :issues-hint="t('initiative.create.contextIssuesHint')"
267
265
  />
268
266
 
269
- <p class="text-[11px] text-slate-500">
267
+ <p class="text-[11px] text-dimmed">
270
268
  {{ t('initiative.create.hint') }}
271
269
  </p>
272
270
  </div>
@@ -16,7 +16,7 @@ const { connecting } = useDependencyConnect()
16
16
  :y1="connecting.y1"
17
17
  :x2="connecting.x2"
18
18
  :y2="connecting.y2"
19
- stroke="#f59e0b"
19
+ stroke="var(--ui-warning)"
20
20
  :stroke-width="2"
21
21
  stroke-dasharray="5 4"
22
22
  stroke-opacity="0.9"
@@ -20,27 +20,27 @@ const ordered = computed(() => [...props.failures].reverse())
20
20
  <li
21
21
  v-for="failure in ordered"
22
22
  :key="failure.occurredAt"
23
- class="rounded-md border border-slate-800/80 bg-slate-950/50 px-2.5 py-2"
23
+ class="rounded-md border border-default/80 bg-app-950/50 px-2.5 py-2"
24
24
  data-testid="agent-failure-history-entry"
25
25
  >
26
- <div class="flex items-center gap-1.5 text-[10px] text-slate-500">
27
- <UIcon name="i-lucide-alert-triangle" class="h-3 w-3 shrink-0 text-rose-400/70" />
26
+ <div class="flex items-center gap-1.5 text-[10px] text-dimmed">
27
+ <UIcon name="i-lucide-alert-triangle" class="h-3 w-3 shrink-0 text-app-error-400/70" />
28
28
  <time>{{ d(new Date(failure.occurredAt), 'long') }}</time>
29
29
  </div>
30
30
 
31
- <p class="mt-1 text-[11px] leading-snug text-slate-300" :title="failure.message">
31
+ <p class="mt-1 text-[11px] leading-snug text-toned" :title="failure.message">
32
32
  {{ failure.message }}
33
33
  </p>
34
34
 
35
- <p v-if="failure.hint" class="mt-1 text-[10px] leading-snug text-slate-500">
35
+ <p v-if="failure.hint" class="mt-1 text-[10px] leading-snug text-dimmed">
36
36
  {{ failure.hint }}
37
37
  </p>
38
38
 
39
39
  <FailureDetail
40
40
  :detail="failure.detail"
41
41
  :message="failure.message"
42
- summary-class="text-[10px] text-slate-500 hover:text-slate-300"
43
- pre-class="bg-slate-950/80 text-[10px] text-slate-400"
42
+ summary-class="text-[10px] text-dimmed hover:text-toned"
43
+ pre-class="bg-app-950/80 text-[10px] text-muted"
44
44
  />
45
45
  </li>
46
46
  </ol>
@@ -410,10 +410,10 @@ async function add() {
410
410
  <UModal v-model:open="modalOpen" :title="t('board.recurring.title')">
411
411
  <template #body>
412
412
  <div class="space-y-4">
413
- <p v-if="frame" class="text-xs text-slate-400">
413
+ <p v-if="frame" class="text-xs text-muted">
414
414
  <i18n-t keypath="board.recurring.on" tag="span" scope="global">
415
415
  <template #frame>
416
- <span class="font-medium text-slate-200">{{ frame.title }}</span>
416
+ <span class="font-medium text-default">{{ frame.title }}</span>
417
417
  </template>
418
418
  </i18n-t>
419
419
  </p>
@@ -449,11 +449,11 @@ async function add() {
449
449
  />
450
450
  </UFormField>
451
451
 
452
- <div class="flex items-start gap-2 rounded-lg border border-slate-800 p-3">
452
+ <div class="flex items-start gap-2 rounded-lg border border-default p-3">
453
453
  <USwitch v-model="onDemand" :disabled="onDemandLocked" size="sm" class="mt-0.5" />
454
454
  <div class="space-y-0.5">
455
- <p class="text-xs font-medium text-slate-200">{{ t('board.recurring.onDemand') }}</p>
456
- <p class="text-[11px] text-slate-500">
455
+ <p class="text-xs font-medium text-default">{{ t('board.recurring.onDemand') }}</p>
456
+ <p class="text-[11px] text-dimmed">
457
457
  {{
458
458
  onDemandLocked
459
459
  ? t('board.recurring.onDemandLockedHint')
@@ -465,11 +465,11 @@ async function add() {
465
465
 
466
466
  <RecurringRecurrenceEditor v-if="!onDemand" v-model="recurrence" />
467
467
 
468
- <div v-if="filesTicket" class="space-y-3 rounded-lg border border-slate-800 p-3">
469
- <p class="text-[11px] font-semibold uppercase tracking-wide text-slate-400">
468
+ <div v-if="filesTicket" class="space-y-3 rounded-lg border border-default p-3">
469
+ <p class="text-[11px] font-semibold uppercase tracking-wide text-muted">
470
470
  {{ t('board.recurring.issueTracker') }}
471
471
  </p>
472
- <p class="text-[11px] text-slate-500">
472
+ <p class="text-[11px] text-dimmed">
473
473
  {{ t('board.recurring.issueTrackerHint') }}
474
474
  </p>
475
475
  <div class="flex gap-1">
@@ -538,25 +538,25 @@ async function add() {
538
538
  @update:model-value="setTrackerTrigger"
539
539
  />
540
540
  <div>
541
- <p class="text-xs font-medium text-slate-200">
541
+ <p class="text-xs font-medium text-default">
542
542
  {{ t('board.recurring.trackerTrigger') }}
543
543
  </p>
544
- <p class="text-[11px] text-slate-500">
544
+ <p class="text-[11px] text-dimmed">
545
545
  {{ t('board.recurring.trackerTriggerHint') }}
546
546
  </p>
547
547
  </div>
548
548
  </div>
549
549
 
550
- <div v-if="showIntake" class="space-y-3 rounded-lg border border-slate-800 p-3">
551
- <p class="text-[11px] font-semibold uppercase tracking-wide text-slate-400">
550
+ <div v-if="showIntake" class="space-y-3 rounded-lg border border-default p-3">
551
+ <p class="text-[11px] font-semibold uppercase tracking-wide text-muted">
552
552
  {{ t('board.recurring.intake') }}
553
553
  </p>
554
- <p class="text-[11px] text-slate-500">
554
+ <p class="text-[11px] text-dimmed">
555
555
  {{ t('board.recurring.intakeHint') }}
556
556
  </p>
557
557
  <!-- Two different remedies: connect something, versus connect something ELSE. A source
558
558
  that is connected but cannot run a scheduled search is not an absent connection. -->
559
- <p v-if="intakeSources.length === 0" class="text-[11px] text-amber-500">
559
+ <p v-if="intakeSources.length === 0" class="text-[11px] text-app-warning-500">
560
560
  {{
561
561
  tasks.anyOffered
562
562
  ? t('board.recurring.intakeNoIntakeSources')
@@ -626,7 +626,7 @@ async function add() {
626
626
  </UFormField>
627
627
 
628
628
  <template v-if="intakeSource">
629
- <p class="text-[11px] text-slate-500">
629
+ <p class="text-[11px] text-dimmed">
630
630
  {{
631
631
  intakeDispatch === 'per-ticket'
632
632
  ? t('board.recurring.intakeDispatchPerTicketHint')
@@ -659,7 +659,7 @@ async function add() {
659
659
  still holding a value would read as a filter that is on. Stated here because a
660
660
  schedule fires unattended — the only other evidence of the gap is a bugfix run
661
661
  started on a docs chore. -->
662
- <p v-else class="text-xs text-amber-400">
662
+ <p v-else class="text-xs text-app-warning-400">
663
663
  {{
664
664
  t('board.recurring.intakeIssueTypeUnsupported', {
665
665
  tracker: intakeSourceLabel,
@@ -677,7 +677,7 @@ async function add() {
677
677
  </template>
678
678
  </div>
679
679
 
680
- <p class="text-[11px] text-slate-500">
680
+ <p class="text-[11px] text-dimmed">
681
681
  {{ t('board.recurring.footerHint') }}
682
682
  </p>
683
683
  </div>
@@ -81,24 +81,24 @@ function createAnyway() {
81
81
  >
82
82
  <template #body>
83
83
  <div v-if="ctx" class="space-y-5">
84
- <p class="text-sm text-slate-300">{{ body }}</p>
84
+ <p class="text-sm text-toned">{{ body }}</p>
85
85
 
86
- <div class="rounded-lg border border-slate-700 bg-slate-900/50 p-2">
87
- <p class="mb-1.5 px-1 text-[11px] font-semibold uppercase tracking-wide text-slate-500">
86
+ <div class="rounded-lg border border-muted bg-default/50 p-2">
87
+ <p class="mb-1.5 px-1 text-[11px] font-semibold uppercase tracking-wide text-dimmed">
88
88
  {{ t('errors.reviewFriction.waitingHeading') }}
89
89
  </p>
90
90
  <ul class="space-y-1">
91
91
  <li v-for="item in ctx.debt" :key="item.blockId">
92
92
  <button
93
93
  type="button"
94
- class="flex w-full items-center justify-between gap-3 rounded-md px-2 py-1.5 text-left text-sm hover:bg-slate-800/60 disabled:opacity-50"
94
+ class="flex w-full items-center justify-between gap-3 rounded-md px-2 py-1.5 text-left text-sm hover:bg-elevated/60 disabled:opacity-50"
95
95
  :disabled="pending"
96
96
  @click="goToBlock(item.blockId)"
97
97
  >
98
- <span class="truncate text-slate-200">
98
+ <span class="truncate text-default">
99
99
  {{ item.title || t('errors.reviewFriction.untitled') }}
100
100
  </span>
101
- <span class="shrink-0 text-[12px] text-slate-500">
101
+ <span class="shrink-0 text-[12px] text-dimmed">
102
102
  {{ t('errors.reviewFriction.waiting', { minutes: item.waitingMinutes }) }}
103
103
  </span>
104
104
  </button>