@cat-factory/app 0.302.2 → 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 +9 -8
@@ -311,9 +311,9 @@ function selectTask() {
311
311
  :data-status="task.status"
312
312
  :data-task-type="task.taskType"
313
313
  data-testid="task-card"
314
- class="nodrag w-full cursor-pointer rounded-lg border bg-slate-950/70 p-2 text-start transition"
314
+ class="nodrag w-full cursor-pointer rounded-lg border bg-app-950/70 p-2 text-start transition"
315
315
  :class="[
316
- selected ? 'border-white' : 'border-slate-700 hover:border-slate-500',
316
+ selected ? 'border-inverted' : 'border-muted hover:border-app-500',
317
317
  task.status === 'pr_ready' ? 'board-pulse-green' : attention ? 'board-pulse' : '',
318
318
  ]"
319
319
  @click.stop="selectTask"
@@ -328,7 +328,7 @@ function selectTask() {
328
328
  <span
329
329
  v-if="typeBadge"
330
330
  class="inline-flex h-3.5 w-3.5 shrink-0 items-center justify-center rounded"
331
- :style="{ color: typeBadge.color, backgroundColor: `${typeBadge.color}22` }"
331
+ :style="{ color: typeBadge.color, backgroundColor: tint(typeBadge.color) }"
332
332
  :title="typeBadge.label"
333
333
  :data-task-type-badge="task.taskType"
334
334
  data-testid="task-type-badge"
@@ -338,7 +338,7 @@ function selectTask() {
338
338
  <UIcon
339
339
  v-if="schedule"
340
340
  name="i-lucide-repeat"
341
- class="h-3 w-3 shrink-0 text-indigo-400"
341
+ class="h-3 w-3 shrink-0 text-primary"
342
342
  :title="
343
343
  schedule.enabled
344
344
  ? t('board.task.recurringPipeline')
@@ -349,12 +349,12 @@ function selectTask() {
349
349
  class="ms-auto truncate text-[9px] uppercase tracking-wide"
350
350
  :class="
351
351
  runFailed
352
- ? 'text-rose-400'
352
+ ? 'text-app-error-400'
353
353
  : reviewStage
354
- ? 'text-indigo-300'
354
+ ? 'text-primary'
355
355
  : attention
356
- ? 'text-amber-400'
357
- : 'text-slate-500'
356
+ ? 'text-app-warning-400'
357
+ : 'text-dimmed'
358
358
  "
359
359
  >
360
360
  {{ statusText }}
@@ -362,7 +362,7 @@ function selectTask() {
362
362
  <!-- drag-to-connect handle: drag onto another task to make it depend on this one -->
363
363
  <button
364
364
  type="button"
365
- class="nodrag shrink-0 cursor-crosshair touch-none rounded-full p-0.5 text-slate-500 hover:bg-slate-800 hover:text-amber-400 pointer-coarse:p-2.5"
365
+ class="nodrag shrink-0 cursor-crosshair touch-none rounded-full p-0.5 text-dimmed hover:bg-elevated hover:text-app-warning-400 pointer-coarse:p-2.5"
366
366
  :title="t('board.task.dragToConnect')"
367
367
  @pointerdown.stop="startConnect(task.id, $event)"
368
368
  @click.stop
@@ -379,7 +379,7 @@ function selectTask() {
379
379
  title is the one always-rendered part of the body that no control can occupy. -->
380
380
  <div
381
381
  data-testid="task-title"
382
- class="mt-1 line-clamp-2 break-words text-[11px] font-semibold leading-snug text-slate-100"
382
+ class="mt-1 line-clamp-2 break-words text-[11px] font-semibold leading-snug text-app-100"
383
383
  :title="task.title"
384
384
  >
385
385
  {{ task.title }}
@@ -410,13 +410,13 @@ function selectTask() {
410
410
  <UIcon
411
411
  :name="runnable ? 'i-lucide-link' : 'i-lucide-lock'"
412
412
  class="h-3 w-3"
413
- :class="runnable ? 'text-slate-500' : 'text-amber-400'"
413
+ :class="runnable ? 'text-dimmed' : 'text-app-warning-400'"
414
414
  />
415
415
  <span
416
416
  v-for="d in deps"
417
417
  :key="d.id"
418
- class="inline-flex items-center gap-0.5 rounded bg-slate-800/80 px-1 py-0.5 text-[9px]"
419
- :class="d.status === 'done' ? 'text-slate-400' : 'text-amber-300'"
418
+ class="inline-flex items-center gap-0.5 rounded bg-elevated/80 px-1 py-0.5 text-[9px]"
419
+ :class="d.status === 'done' ? 'text-muted' : 'text-app-warning-300'"
420
420
  :title="depLabel(d)"
421
421
  >
422
422
  <UIcon
@@ -431,7 +431,7 @@ function selectTask() {
431
431
  <div class="nodrag mt-2 flex flex-wrap items-center gap-1">
432
432
  <!-- a reviewer gate folding/re-reviewing in the background: a working indicator,
433
433
  NOT a gate — the human is back on the board and summoned only if input is needed -->
434
- <span v-if="reviewStage" class="inline-flex items-center gap-1 text-[9px] text-indigo-300">
434
+ <span v-if="reviewStage" class="inline-flex items-center gap-1 text-[9px] text-primary">
435
435
  <UIcon name="i-lucide-loader-circle" class="h-3 w-3 animate-spin" />
436
436
  {{ reviewStageLabel }}
437
437
  </span>
@@ -481,7 +481,7 @@ function selectTask() {
481
481
  </UButton>
482
482
  <span
483
483
  v-if="runnable && defaultPipeline"
484
- class="inline-flex items-center gap-0.5 text-[9px] text-slate-500"
484
+ class="inline-flex items-center gap-0.5 text-[9px] text-dimmed"
485
485
  >
486
486
  <UIcon name="i-lucide-workflow" class="h-2.5 w-2.5" />{{ defaultPipeline.name }}
487
487
  </span>
@@ -539,7 +539,7 @@ function selectTask() {
539
539
  <!-- A merged task is the one people come back to READ, so its result stays openable
540
540
  rather than collapsing to a tick the moment it lands. -->
541
541
  <template v-else-if="task.status === 'done'">
542
- <span class="inline-flex items-center gap-1 text-[9px] text-emerald-400">
542
+ <span class="inline-flex items-center gap-1 text-[9px] text-app-success-400">
543
543
  <UIcon name="i-lucide-check-check" class="h-3 w-3" /> {{ t('board.task.implemented') }}
544
544
  </span>
545
545
  <UButton
@@ -562,10 +562,10 @@ function selectTask() {
562
562
  cost a row of card height each and add nothing. -->
563
563
  <div
564
564
  v-if="showModuleChip"
565
- class="mt-2 flex flex-wrap items-center gap-1 border-t border-slate-800 pt-2"
565
+ class="mt-2 flex flex-wrap items-center gap-1 border-t border-default pt-2"
566
566
  >
567
567
  <span
568
- class="inline-flex items-center gap-1 rounded bg-violet-500/15 px-1.5 py-0.5 text-[9px] text-violet-200"
568
+ class="inline-flex items-center gap-1 rounded bg-app-secondary-500/15 px-1.5 py-0.5 text-[9px] text-app-secondary-200"
569
569
  :title="t('board.task.module', { name: task.moduleName })"
570
570
  >
571
571
  <UIcon :name="MODULE_META.icon" class="h-3 w-3" :style="{ color: MODULE_META.color }" />
@@ -36,20 +36,20 @@ const isEmpty = computed(() => props.rendered.groups.every((g) => g.entries.leng
36
36
 
37
37
  <template>
38
38
  <div
39
- class="flex min-w-0 flex-col rounded-lg bg-slate-900/40"
39
+ class="flex min-w-0 flex-col rounded-lg bg-default/40"
40
40
  :style="{ width: LANE_GEOMETRY.laneWidth + 'px' }"
41
41
  :data-lane="rendered.lane"
42
42
  >
43
43
  <!-- Lane header -->
44
44
  <div
45
45
  class="flex items-center gap-1.5 rounded-t-lg border-b px-2 py-1.5"
46
- :style="{ borderColor: meta.color + '33' }"
46
+ :style="{ borderColor: tint(meta.color, 20) }"
47
47
  >
48
48
  <UIcon :name="meta.icon" class="h-3.5 w-3.5 shrink-0" :style="{ color: meta.color }" />
49
- <span class="truncate text-[11px] font-semibold text-slate-200">{{ t(meta.labelKey) }}</span>
49
+ <span class="truncate text-[11px] font-semibold text-default">{{ t(meta.labelKey) }}</span>
50
50
  <span
51
51
  class="ms-auto shrink-0 rounded px-1 text-[10px] font-semibold tabular-nums"
52
- :style="{ backgroundColor: meta.color + '22', color: meta.color }"
52
+ :style="{ backgroundColor: tint(meta.color), color: meta.color }"
53
53
  :data-testid="`lane-count-${rendered.lane}`"
54
54
  >{{ rendered.total }}</span
55
55
  >
@@ -65,7 +65,7 @@ const isEmpty = computed(() => props.rendered.groups.every((g) => g.entries.leng
65
65
  <!-- An empty lane SAYS it is empty. Left blank, "nothing needs you" and "the lane failed
66
66
  to render" look identical, and the first is worth stating: it is the answer a reader
67
67
  scanning the needs-you column is hoping for. -->
68
- <p v-if="isEmpty" class="px-1 pt-2 text-[10px] leading-snug text-slate-600">
68
+ <p v-if="isEmpty" class="px-1 pt-2 text-[10px] leading-snug text-app-600">
69
69
  {{ t(meta.emptyKey) }}
70
70
  </p>
71
71
  <LaneGroup
@@ -57,10 +57,10 @@ function openStep(i: number) {
57
57
 
58
58
  /** Per-state accent, matching the inspector/focus pipeline views. */
59
59
  const STATE_META: Record<AgentState, { color: string; icon: string }> = {
60
- pending: { color: '#64748b', icon: 'i-lucide-circle-dashed' },
61
- working: { color: '#6366f1', icon: 'i-lucide-loader' },
62
- waiting_decision: { color: '#f59e0b', icon: 'i-lucide-circle-help' },
63
- done: { color: '#22c55e', icon: 'i-lucide-circle-check' },
60
+ pending: { color: 'var(--ui-text-muted)', icon: 'i-lucide-circle-dashed' },
61
+ working: { color: 'var(--ui-primary)', icon: 'i-lucide-loader' },
62
+ waiting_decision: { color: 'var(--ui-warning)', icon: 'i-lucide-circle-help' },
63
+ done: { color: 'var(--ui-success)', icon: 'i-lucide-circle-check' },
64
64
  }
65
65
 
66
66
  // A reviewer gate (requirements-review / clarity-review) folding answers or re-reviewing in
@@ -100,15 +100,15 @@ const ITEM_ICON: Record<string, string> = {
100
100
  </script>
101
101
 
102
102
  <template>
103
- <div v-if="showSteps" class="mt-2 space-y-1 border-t border-slate-800 pt-2">
104
- <div class="flex items-center gap-1 text-[9px] uppercase tracking-wide text-slate-500">
103
+ <div v-if="showSteps" class="mt-2 space-y-1 border-t border-default pt-2">
104
+ <div class="flex items-center gap-1 text-[9px] uppercase tracking-wide text-dimmed">
105
105
  <UIcon name="i-lucide-workflow" class="h-2.5 w-2.5" />
106
106
  {{ t('board.task.buildSteps') }}
107
107
  </div>
108
- <div v-for="(s, i) in steps" :key="i" class="rounded bg-slate-900/60 px-1.5 py-1">
108
+ <div v-for="(s, i) in steps" :key="i" class="rounded bg-default/60 px-1.5 py-1">
109
109
  <button
110
110
  type="button"
111
- class="flex w-full cursor-pointer items-center gap-1 rounded text-start focus:outline-none focus-visible:ring-2 focus-visible:ring-indigo-500/60"
111
+ class="flex w-full cursor-pointer items-center gap-1 rounded text-start focus:outline-none focus-visible:ring-2 focus-visible:ring-primary/60"
112
112
  :title="`${agentKindMeta(s.agentKind).label} — ${agentKindMeta(s.agentKind).description}\n${t('board.task.clickToViewStep')}`"
113
113
  @click.stop="openStep(i)"
114
114
  >
@@ -117,19 +117,19 @@ const ITEM_ICON: Record<string, string> = {
117
117
  class="h-3 w-3 shrink-0"
118
118
  :style="{ color: agentKindMeta(s.agentKind).color }"
119
119
  />
120
- <span class="truncate text-[10px] text-slate-200">
120
+ <span class="truncate text-[10px] text-default">
121
121
  {{ agentKindMeta(s.agentKind).label }}
122
122
  </span>
123
123
  <UIcon
124
124
  v-if="stepHasOutput(s)"
125
125
  name="i-lucide-file-text"
126
- class="h-2.5 w-2.5 shrink-0 text-slate-500"
126
+ class="h-2.5 w-2.5 shrink-0 text-dimmed"
127
127
  />
128
128
  <!-- The plain N/M count, replaced by the phase line below while a `pr-reviewer` step is
129
129
  live — its slice progress reads better as Slicing… / Reviewing X/Y slices. -->
130
130
  <span
131
131
  v-if="s.subtasks && s.subtasks.total > 0 && !prPhaseActive(s)"
132
- class="ms-auto shrink-0 font-mono text-[9px] tabular-nums text-slate-400"
132
+ class="ms-auto shrink-0 font-mono text-[9px] tabular-nums text-muted"
133
133
  >
134
134
  {{ s.subtasks.completed }}/{{ s.subtasks.total }}
135
135
  </span>
@@ -162,7 +162,7 @@ const ITEM_ICON: Record<string, string> = {
162
162
  !reviews.isBackground(s.agentKind, props.taskId)
163
163
  "
164
164
  type="button"
165
- class="mt-1 flex w-full items-center justify-center gap-1 rounded bg-amber-500 px-1.5 py-0.5 text-[9px] font-semibold text-amber-950 transition hover:bg-amber-400"
165
+ class="mt-1 flex w-full items-center justify-center gap-1 rounded bg-app-warning-500 px-1.5 py-0.5 text-[9px] font-semibold text-app-warning-50 dark:text-app-warning-950 transition hover:bg-app-warning-400"
166
166
  @click.stop="ui.openApprovalDetail(instance.id, s.approval.id)"
167
167
  >
168
168
  <UIcon name="i-lucide-shield-check" class="h-2.5 w-2.5" />
@@ -172,10 +172,10 @@ const ITEM_ICON: Record<string, string> = {
172
172
  <!-- per-step subtask progress bar -->
173
173
  <div
174
174
  v-if="s.subtasks && s.subtasks.total > 0"
175
- class="mt-1 h-0.5 w-full overflow-hidden rounded bg-slate-700/60"
175
+ class="mt-1 h-0.5 w-full overflow-hidden rounded bg-accented/60"
176
176
  >
177
177
  <div
178
- class="h-full rounded bg-indigo-400 transition-all"
178
+ class="h-full rounded bg-primary transition-all"
179
179
  :style="{ width: `${(s.subtasks.completed / s.subtasks.total) * 100}%` }"
180
180
  />
181
181
  </div>
@@ -192,7 +192,7 @@ const ITEM_ICON: Record<string, string> = {
192
192
  companionByStep[i]!.state === 'running' ? 'animate-spin' : '',
193
193
  ]"
194
194
  />
195
- <span class="truncate text-slate-400">
195
+ <span class="truncate text-muted">
196
196
  {{ agentKindMeta(companionByStep[i]!.kind).label }}
197
197
  </span>
198
198
  <span
@@ -211,10 +211,10 @@ const ITEM_ICON: Record<string, string> = {
211
211
  class="flex items-start gap-1 text-[9px]"
212
212
  :class="
213
213
  item.status === 'completed'
214
- ? 'text-slate-500 line-through'
214
+ ? 'text-dimmed line-through'
215
215
  : item.status === 'in_progress'
216
- ? 'text-slate-100'
217
- : 'text-slate-400'
216
+ ? 'text-app-100'
217
+ : 'text-muted'
218
218
  "
219
219
  >
220
220
  <UIcon
@@ -182,11 +182,14 @@ watch(open, (isOpen) => {
182
182
  presenting an empty list, which would read as "there was nothing to decide". -->
183
183
  <div
184
184
  v-if="unavailable"
185
- class="space-y-2 rounded-md border border-amber-500/30 bg-amber-500/5 p-3"
185
+ class="space-y-2 rounded-md border border-app-warning-500/30 bg-app-warning-500/5 p-3"
186
186
  >
187
187
  <div class="flex items-start gap-2">
188
- <UIcon name="i-lucide-triangle-alert" class="mt-0.5 h-4 w-4 shrink-0 text-amber-400" />
189
- <p class="text-sm text-amber-200/90">
188
+ <UIcon
189
+ name="i-lucide-triangle-alert"
190
+ class="mt-0.5 h-4 w-4 shrink-0 text-app-warning-400"
191
+ />
192
+ <p class="text-sm text-app-warning-200/90">
190
193
  {{
191
194
  t(
192
195
  `bootstrap.adoption.unavailable.${plan?.unavailableReason ?? 'analysis_unusable'}`,
@@ -194,7 +197,7 @@ watch(open, (isOpen) => {
194
197
  }}
195
198
  </p>
196
199
  </div>
197
- <p v-if="plan?.unavailableDetail" class="pl-6 text-xs text-slate-400">
200
+ <p v-if="plan?.unavailableDetail" class="pl-6 text-xs text-muted">
198
201
  {{ plan.unavailableDetail }}
199
202
  </p>
200
203
  </div>
@@ -204,7 +207,7 @@ watch(open, (isOpen) => {
204
207
  exhausted budget is called out rather than left for someone to infer from a short
205
208
  list: it is the difference between a thin read and a thin reading. -->
206
209
  <div v-if="surveyReads.length" class="space-y-2 text-xs">
207
- <p class="text-slate-400">
210
+ <p class="text-muted">
208
211
  {{
209
212
  t('bootstrap.adoption.survey.summary', {
210
213
  read: readSummary.read,
@@ -212,17 +215,17 @@ watch(open, (isOpen) => {
212
215
  })
213
216
  }}
214
217
  </p>
215
- <p v-if="readSummary.missed > 0" class="text-slate-500">
218
+ <p v-if="readSummary.missed > 0" class="text-dimmed">
216
219
  {{ t('bootstrap.adoption.survey.missed', { count: readSummary.missed }) }}
217
220
  </p>
218
- <p v-if="exhausted" class="text-amber-300/90">
221
+ <p v-if="exhausted" class="text-app-warning-300/90">
219
222
  {{ t(`bootstrap.adoption.survey.exhausted.${exhausted}`) }}
220
223
  </p>
221
- <p v-if="recordsDropped > 0" class="text-amber-300/90">
224
+ <p v-if="recordsDropped > 0" class="text-app-warning-300/90">
222
225
  {{ t('bootstrap.adoption.survey.truncated', { count: recordsDropped }) }}
223
226
  </p>
224
227
  <details>
225
- <summary class="cursor-pointer text-slate-500 hover:text-slate-300">
228
+ <summary class="cursor-pointer text-dimmed hover:text-toned">
226
229
  {{ t('bootstrap.adoption.survey.show') }}
227
230
  </summary>
228
231
  <ul class="mt-2 space-y-1">
@@ -237,12 +240,12 @@ watch(open, (isOpen) => {
237
240
  >
238
241
  <span
239
242
  class="shrink-0 font-mono text-[10px] uppercase"
240
- :class="entry.outcome === 'read' ? 'text-slate-500' : 'text-amber-400/80'"
243
+ :class="entry.outcome === 'read' ? 'text-dimmed' : 'text-app-warning-400/80'"
241
244
  >
242
245
  {{ t(`bootstrap.adoption.survey.outcome.${entry.outcome}`) }}
243
246
  </span>
244
- <span class="font-mono text-slate-400">{{ entry.path }}</span>
245
- <span v-if="entry.note" class="text-slate-600">{{ entry.note }}</span>
247
+ <span class="font-mono text-muted">{{ entry.path }}</span>
248
+ <span v-if="entry.note" class="text-app-600">{{ entry.note }}</span>
246
249
  </li>
247
250
  </ul>
248
251
  </details>
@@ -260,7 +263,7 @@ watch(open, (isOpen) => {
260
263
 
261
264
  <template v-else>
262
265
  <div class="flex items-center justify-between gap-3">
263
- <p class="text-sm text-slate-400">{{ t('bootstrap.adoption.intro') }}</p>
266
+ <p class="text-sm text-muted">{{ t('bootstrap.adoption.intro') }}</p>
264
267
  <UButton
265
268
  color="neutral"
266
269
  variant="subtle"
@@ -279,14 +282,14 @@ watch(open, (isOpen) => {
279
282
  class="space-y-3 rounded-md border p-3"
280
283
  :class="
281
284
  touched.has(decision.id)
282
- ? 'border-slate-700 bg-slate-900/40'
283
- : 'border-amber-500/40 bg-amber-500/5'
285
+ ? 'border-muted bg-default/40'
286
+ : 'border-app-warning-500/40 bg-app-warning-500/5'
284
287
  "
285
288
  >
286
289
  <div class="flex items-start justify-between gap-3">
287
290
  <div>
288
- <p class="text-sm font-medium text-slate-100">{{ decision.title }}</p>
289
- <p class="text-[11px] uppercase tracking-wide text-slate-500">
291
+ <p class="text-sm font-medium text-app-100">{{ decision.title }}</p>
292
+ <p class="text-[11px] uppercase tracking-wide text-dimmed">
290
293
  {{ t(`bootstrap.adoption.area.${decision.area}`) }}
291
294
  </p>
292
295
  </div>
@@ -296,29 +299,29 @@ watch(open, (isOpen) => {
296
299
  </div>
297
300
 
298
301
  <div class="grid gap-2 text-xs sm:grid-cols-2">
299
- <div class="rounded bg-slate-900/60 p-2">
300
- <p class="mb-1 font-semibold text-slate-300">
302
+ <div class="rounded bg-default/60 p-2">
303
+ <p class="mb-1 font-semibold text-toned">
301
304
  {{ t('bootstrap.adoption.side.monorepo') }}
302
305
  </p>
303
- <p class="text-slate-400">
306
+ <p class="text-muted">
304
307
  {{ decision.monorepoPractice ?? t('bootstrap.adoption.side.nothing') }}
305
308
  </p>
306
309
  </div>
307
- <div class="rounded bg-slate-900/60 p-2">
308
- <p class="mb-1 font-semibold text-slate-300">
310
+ <div class="rounded bg-default/60 p-2">
311
+ <p class="mb-1 font-semibold text-toned">
309
312
  {{ t('bootstrap.adoption.side.template') }}
310
313
  </p>
311
- <p class="text-slate-400">
314
+ <p class="text-muted">
312
315
  {{ decision.templatePractice ?? t('bootstrap.adoption.side.nothing') }}
313
316
  </p>
314
317
  </div>
315
318
  </div>
316
319
 
317
- <p class="text-xs text-slate-400">{{ decision.rationale }}</p>
320
+ <p class="text-xs text-muted">{{ decision.rationale }}</p>
318
321
 
319
322
  <!-- The evidence is what makes the suggestion checkable rather than an assertion,
320
323
  so it is shown, not tucked away. -->
321
- <p v-if="decision.evidence.length" class="text-[11px] text-slate-500">
324
+ <p v-if="decision.evidence.length" class="text-[11px] text-dimmed">
322
325
  {{ t('bootstrap.adoption.evidence') }}
323
326
  <span class="font-mono">{{ decision.evidence.join(', ') }}</span>
324
327
  </p>
@@ -365,7 +368,7 @@ watch(open, (isOpen) => {
365
368
 
366
369
  <template #footer>
367
370
  <div class="flex w-full items-center justify-between gap-3">
368
- <p v-if="!unavailable && remaining > 0" class="text-xs text-amber-300/90">
371
+ <p v-if="!unavailable && remaining > 0" class="text-xs text-app-warning-300/90">
369
372
  {{ t('bootstrap.adoption.remaining', { count: remaining }) }}
370
373
  </p>
371
374
  <span v-else />
@@ -619,7 +619,7 @@ const statusLabel = computed<Record<BootstrapStatus, string>>(() => ({
619
619
  the user creates it in one click on a host we can name; or the user creates it
620
620
  themselves somewhere we cannot name, where promising a click below would be a lie
621
621
  (the button is absent for exactly the same reason). -->
622
- <p class="text-sm text-slate-400">
622
+ <p class="text-sm text-muted">
623
623
  {{
624
624
  intoMonorepo
625
625
  ? t('bootstrap.monorepo.intro')
@@ -635,11 +635,11 @@ const statusLabel = computed<Record<BootstrapStatus, string>>(() => ({
635
635
  whichever methods the deployment serves, never just the GitHub App. -->
636
636
  <div
637
637
  v-if="needsConnection"
638
- class="space-y-3 rounded-md border border-amber-500/30 bg-amber-500/5 p-3"
638
+ class="space-y-3 rounded-md border border-app-warning-500/30 bg-app-warning-500/5 p-3"
639
639
  >
640
640
  <div class="flex items-start gap-2">
641
- <UIcon name="i-lucide-plug-zap" class="mt-0.5 h-4 w-4 shrink-0 text-amber-400" />
642
- <p class="text-sm text-amber-200/90">
641
+ <UIcon name="i-lucide-plug-zap" class="mt-0.5 h-4 w-4 shrink-0 text-app-warning-400" />
642
+ <p class="text-sm text-app-warning-200/90">
643
643
  {{ t('vcs.bootstrap.connectPrompt') }}
644
644
  </p>
645
645
  </div>
@@ -648,7 +648,7 @@ const statusLabel = computed<Record<BootstrapStatus, string>>(() => ({
648
648
 
649
649
  <!-- launch -->
650
650
  <section class="space-y-4">
651
- <h3 class="text-[11px] font-semibold uppercase tracking-wide text-slate-400">
651
+ <h3 class="text-[11px] font-semibold uppercase tracking-wide text-muted">
652
652
  {{ t('bootstrap.section.newRepo') }}
653
653
  </h3>
654
654
 
@@ -676,7 +676,7 @@ const statusLabel = computed<Record<BootstrapStatus, string>>(() => ({
676
676
  :description="t('bootstrap.monorepo.repo.description')"
677
677
  required
678
678
  >
679
- <div v-if="!monorepoRepoItems.length" class="text-sm text-slate-400">
679
+ <div v-if="!monorepoRepoItems.length" class="text-sm text-muted">
680
680
  {{ t('bootstrap.monorepo.repo.empty') }}
681
681
  </div>
682
682
  <USelect
@@ -716,9 +716,9 @@ const statusLabel = computed<Record<BootstrapStatus, string>>(() => ({
716
716
  decide nothing, so say that instead of listing a repo for nothing. -->
717
717
  <div
718
718
  v-if="browsingDirectory && monorepoRepoId !== undefined"
719
- class="rounded-md border border-slate-800 bg-slate-900/40 p-2"
719
+ class="rounded-md border border-default bg-default/40 p-2"
720
720
  >
721
- <p class="mb-2 text-xs text-slate-400">
721
+ <p class="mb-2 text-xs text-muted">
722
722
  {{
723
723
  directoryLeaf
724
724
  ? t('bootstrap.monorepo.directory.browseHint')
@@ -749,7 +749,7 @@ const statusLabel = computed<Record<BootstrapStatus, string>>(() => ({
749
749
  :description="t('bootstrap.reference.description')"
750
750
  required
751
751
  >
752
- <div v-if="!bootstrap.hasArchitectures" class="text-sm text-slate-400">
752
+ <div v-if="!bootstrap.hasArchitectures" class="text-sm text-muted">
753
753
  {{ t('bootstrap.reference.empty') }}
754
754
  </div>
755
755
  <USelect
@@ -893,7 +893,7 @@ const statusLabel = computed<Record<BootstrapStatus, string>>(() => ({
893
893
  <UFormField :label="t('bootstrap.visibility.label')">
894
894
  <div class="flex items-center gap-2">
895
895
  <USwitch v-model="isPrivate" />
896
- <span class="text-sm text-slate-300">{{ t('bootstrap.visibility.private') }}</span>
896
+ <span class="text-sm text-toned">{{ t('bootstrap.visibility.private') }}</span>
897
897
  </div>
898
898
  </UFormField>
899
899
 
@@ -912,17 +912,17 @@ const statusLabel = computed<Record<BootstrapStatus, string>>(() => ({
912
912
 
913
913
  <!-- recent jobs -->
914
914
  <section v-if="agentRuns.bootstrapJobs.length" class="space-y-2">
915
- <h3 class="text-[11px] font-semibold uppercase tracking-wide text-slate-400">
915
+ <h3 class="text-[11px] font-semibold uppercase tracking-wide text-muted">
916
916
  {{ t('bootstrap.recent.title') }}
917
917
  </h3>
918
918
  <div
919
919
  v-for="job in agentRuns.bootstrapJobs.slice(0, 5)"
920
920
  :key="job.id"
921
- class="flex items-center justify-between gap-2 rounded-md border border-slate-800 bg-slate-900/60 px-3 py-2 text-sm"
921
+ class="flex items-center justify-between gap-2 rounded-md border border-default bg-default/60 px-3 py-2 text-sm"
922
922
  >
923
923
  <div class="min-w-0">
924
- <div class="truncate text-slate-200">{{ job.repoName }}</div>
925
- <div class="truncate text-[11px] text-slate-500">
924
+ <div class="truncate text-default">{{ job.repoName }}</div>
925
+ <div class="truncate text-[11px] text-dimmed">
926
926
  {{
927
927
  job.referenceArchitectureName
928
928
  ? t('bootstrap.recent.fromArch', { name: job.referenceArchitectureName })
@@ -935,7 +935,7 @@ const statusLabel = computed<Record<BootstrapStatus, string>>(() => ({
935
935
  v-if="job.repoUrl"
936
936
  :to="job.repoUrl"
937
937
  target="_blank"
938
- class="text-[11px] text-indigo-400 hover:underline"
938
+ class="text-[11px] text-primary hover:underline"
939
939
  >
940
940
  {{ t('bootstrap.recent.open') }}
941
941
  </ULink>
@@ -947,7 +947,7 @@ const statusLabel = computed<Record<BootstrapStatus, string>>(() => ({
947
947
  v-if="job.prUrl"
948
948
  :to="job.prUrl"
949
949
  target="_blank"
950
- class="text-[11px] text-indigo-400 hover:underline"
950
+ class="text-[11px] text-primary hover:underline"
951
951
  >
952
952
  {{ t('bootstrap.recent.openPr') }}
953
953
  </ULink>
@@ -963,7 +963,7 @@ const statusLabel = computed<Record<BootstrapStatus, string>>(() => ({
963
963
  <!-- reference architecture management -->
964
964
  <section class="space-y-3">
965
965
  <div class="flex items-center justify-between">
966
- <h3 class="text-[11px] font-semibold uppercase tracking-wide text-slate-400">
966
+ <h3 class="text-[11px] font-semibold uppercase tracking-wide text-muted">
967
967
  {{ t('bootstrap.arch.title') }}
968
968
  </h3>
969
969
  <UButton
@@ -980,13 +980,11 @@ const statusLabel = computed<Record<BootstrapStatus, string>>(() => ({
980
980
  <div
981
981
  v-for="a in bootstrap.architectures"
982
982
  :key="a.id"
983
- class="flex items-center justify-between gap-2 rounded-md border border-slate-800 bg-slate-900/60 px-3 py-2"
983
+ class="flex items-center justify-between gap-2 rounded-md border border-default bg-default/60 px-3 py-2"
984
984
  >
985
985
  <div class="min-w-0">
986
- <div class="truncate text-sm text-slate-200">{{ a.name }}</div>
987
- <div class="truncate text-[11px] text-slate-500">
988
- {{ a.repoOwner }}/{{ a.repoName }}
989
- </div>
986
+ <div class="truncate text-sm text-default">{{ a.name }}</div>
987
+ <div class="truncate text-[11px] text-dimmed">{{ a.repoOwner }}/{{ a.repoName }}</div>
990
988
  </div>
991
989
  <div class="flex items-center gap-1">
992
990
  <UButton
@@ -1009,7 +1007,7 @@ const statusLabel = computed<Record<BootstrapStatus, string>>(() => ({
1009
1007
  <!-- add / edit form -->
1010
1008
  <div
1011
1009
  v-if="showArchForm"
1012
- class="space-y-3 rounded-md border border-slate-700 bg-slate-900/80 p-3"
1010
+ class="space-y-3 rounded-md border border-muted bg-default/80 p-3"
1013
1011
  >
1014
1012
  <!-- The options come from the connected projection, so a repo to pick means a
1015
1013
  connection exists and `providerLabel` names it rather than guessing. -->
@@ -44,7 +44,7 @@ function stateLabel(state: BootstrapStepState): string {
44
44
  :class="BOOTSTRAP_STEP_STYLE[step.state].iconClass"
45
45
  />
46
46
  <span :class="BOOTSTRAP_STEP_STYLE[step.state].labelClass">{{ stepLabel(step.id) }}</span>
47
- <span class="ms-auto shrink-0 text-slate-500">{{ stateLabel(step.state) }}</span>
47
+ <span class="ms-auto shrink-0 text-dimmed">{{ stateLabel(step.state) }}</span>
48
48
  </li>
49
49
  </ol>
50
50
  </template>