@cat-factory/app 0.302.2 → 0.303.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (328) hide show
  1. package/README.md +99 -14
  2. package/app/app.config.ts +19 -10
  3. package/app/assets/css/main.css +13 -13
  4. package/app/assets/css/prose.css +22 -22
  5. package/app/assets/css/tokens.css +298 -0
  6. package/app/components/assistant/AssistantModal.vue +22 -22
  7. package/app/components/auth/AuthGate.vue +1 -1
  8. package/app/components/auth/BackendMisconfiguredScreen.vue +10 -10
  9. package/app/components/auth/LoginScreen.vue +34 -36
  10. package/app/components/auth/ResetPasswordScreen.vue +12 -12
  11. package/app/components/auth/UserMenu.vue +4 -4
  12. package/app/components/binaryCandidates/BinaryCandidatesWindow.vue +27 -25
  13. package/app/components/binaryOutput/BinaryOutputReport.vue +15 -15
  14. package/app/components/binaryOutput/StoredAssetView.vue +5 -5
  15. package/app/components/board/AddTaskModal.vue +17 -20
  16. package/app/components/board/AgentFailureCard.vue +11 -11
  17. package/app/components/board/AgentFailureHistory.vue +2 -2
  18. package/app/components/board/BoardCanvas.vue +6 -5
  19. package/app/components/board/CreateInitiativeModal.vue +8 -10
  20. package/app/components/board/DependencyConnectOverlay.vue +1 -1
  21. package/app/components/board/FailureHistoryList.vue +7 -7
  22. package/app/components/board/RecurringPipelineModal.vue +17 -17
  23. package/app/components/board/ReviewFrictionDialog.vue +6 -6
  24. package/app/components/board/StepExecutionHistory.vue +13 -13
  25. package/app/components/board/TaskDependencyEdges.vue +8 -8
  26. package/app/components/board/nodes/AgentChip.vue +10 -10
  27. package/app/components/board/nodes/BlockNode.vue +29 -29
  28. package/app/components/board/nodes/DecisionBadge.vue +2 -2
  29. package/app/components/board/nodes/EpicNode.vue +14 -10
  30. package/app/components/board/nodes/FrameSwimlanes.vue +7 -9
  31. package/app/components/board/nodes/InitiativeCard.vue +8 -8
  32. package/app/components/board/nodes/LaneGroup.vue +1 -1
  33. package/app/components/board/nodes/LaneTask.vue +2 -2
  34. package/app/components/board/nodes/ResizeGrips.vue +4 -4
  35. package/app/components/board/nodes/TaskCard.vue +18 -18
  36. package/app/components/board/nodes/TaskLane.vue +5 -5
  37. package/app/components/board/nodes/TaskPipelineMini.vue +18 -18
  38. package/app/components/bootstrap/AdoptionReviewModal.vue +29 -26
  39. package/app/components/bootstrap/BootstrapModal.vue +21 -23
  40. package/app/components/bootstrap/BootstrapRunSteps.vue +1 -1
  41. package/app/components/brainstorm/BrainstormWindow.vue +30 -33
  42. package/app/components/bugFishing/BugFishingWindow.vue +49 -49
  43. package/app/components/clarity/ClarityReviewWindow.vue +30 -30
  44. package/app/components/common/AsyncViewError.vue +5 -5
  45. package/app/components/common/ClarificationItem.vue +8 -13
  46. package/app/components/common/ConfirmDialog.vue +4 -2
  47. package/app/components/common/DescriptorFields.vue +1 -1
  48. package/app/components/common/EmptyState.vue +3 -3
  49. package/app/components/common/InterviewGateNotice.vue +7 -7
  50. package/app/components/common/KeyboardShortcutsHelp.vue +1 -1
  51. package/app/components/common/MarkdownProse.vue +14 -13
  52. package/app/components/consensus/ConsensusSessionWindow.vue +26 -26
  53. package/app/components/context/ContextAttachmentFields.vue +17 -17
  54. package/app/components/docs/DocInterviewWindow.vue +14 -14
  55. package/app/components/documents/ContextDocumentPicker.vue +17 -17
  56. package/app/components/documents/DocumentImportModal.vue +7 -7
  57. package/app/components/documents/DocumentSourceConnectModal.vue +3 -3
  58. package/app/components/documents/DocumentSyncState.vue +5 -5
  59. package/app/components/documents/DocumentTemplatesModal.vue +15 -15
  60. package/app/components/documents/RepoContextDocPicker.vue +5 -5
  61. package/app/components/documents/SpawnPreviewModal.vue +12 -12
  62. package/app/components/documents/StartFromDesignModal.vue +11 -11
  63. package/app/components/documents/TaskContextDocs.vue +5 -5
  64. package/app/components/environments/EnvSetupStepper.vue +6 -6
  65. package/app/components/environments/EnvironmentStatusPanel.vue +17 -17
  66. package/app/components/environments/steps/EnvPickStep.vue +3 -3
  67. package/app/components/environments/steps/EnvPreflightStep.vue +9 -9
  68. package/app/components/environments/steps/EnvReviewStep.vue +25 -22
  69. package/app/components/environments/steps/EnvSaveStep.vue +7 -5
  70. package/app/components/environments/steps/JourneyStepNav.vue +1 -1
  71. package/app/components/focus/BlockFocusView.vue +17 -19
  72. package/app/components/followUp/FollowUpWindow.vue +23 -23
  73. package/app/components/forkDecision/ForkDecisionWindow.vue +37 -39
  74. package/app/components/foundational/FoundationalContractSummary.vue +7 -7
  75. package/app/components/foundational/FoundationalServiceCatalogList.vue +11 -11
  76. package/app/components/foundational/FoundationalServiceManager.vue +1 -1
  77. package/app/components/foundational/FoundationalServiceRegistry.vue +13 -13
  78. package/app/components/foundational/FoundationalServiceSources.vue +13 -13
  79. package/app/components/foundational/FoundationalSuppressions.vue +7 -7
  80. package/app/components/foundational/ServiceCatalogConnection.vue +10 -10
  81. package/app/components/fragments/FragmentLibraryManager.vue +41 -44
  82. package/app/components/fragments/FragmentSelector.vue +13 -13
  83. package/app/components/fragments/GitHubDocUrlImport.vue +1 -1
  84. package/app/components/gates/GateFailingCheckList.vue +5 -5
  85. package/app/components/gates/GateResultView.vue +50 -47
  86. package/app/components/github/AddServiceFromRepoModal.vue +14 -14
  87. package/app/components/github/BranchProtectionPreflight.vue +13 -13
  88. package/app/components/github/GitHubConnect.vue +7 -7
  89. package/app/components/github/GitHubOnboarding.vue +7 -7
  90. package/app/components/github/GitHubPanel.vue +37 -40
  91. package/app/components/github/RepoTreeBrowser.vue +18 -18
  92. package/app/components/humanTest/HumanTestWindow.vue +30 -33
  93. package/app/components/initiative/InitiativePlanNotice.vue +5 -5
  94. package/app/components/initiative/InitiativePlanReview.vue +27 -29
  95. package/app/components/initiative/InitiativePlanningWindow.vue +10 -10
  96. package/app/components/initiative/InitiativeTrackerWindow.vue +71 -65
  97. package/app/components/inputGate/InputGateNotice.vue +2 -4
  98. package/app/components/judge/JudgeResultView.vue +30 -32
  99. package/app/components/kaizen/KaizenPanel.vue +40 -36
  100. package/app/components/kaizen/KaizenStepStatus.vue +21 -21
  101. package/app/components/layout/AccountAuditLog.vue +10 -10
  102. package/app/components/layout/AccountDeploymentSettings.vue +20 -20
  103. package/app/components/layout/AccountFailureKindRules.vue +13 -13
  104. package/app/components/layout/AccountFoundationalSettings.vue +1 -1
  105. package/app/components/layout/AccountFragmentSettings.vue +1 -1
  106. package/app/components/layout/AccountModelPolicySettings.vue +9 -9
  107. package/app/components/layout/AccountPlatformAlertSettings.vue +11 -11
  108. package/app/components/layout/AccountRiskPolicySettings.vue +2 -2
  109. package/app/components/layout/AccountRunCredentialSettings.vue +5 -5
  110. package/app/components/layout/AccountSkillSettings.vue +1 -1
  111. package/app/components/layout/AccountTeamSettings.vue +23 -15
  112. package/app/components/layout/AiProvidersBanner.vue +11 -8
  113. package/app/components/layout/AppearanceSwitcher.vue +108 -0
  114. package/app/components/layout/BoardSwitcher.vue +8 -11
  115. package/app/components/layout/BoardToolbar.vue +3 -3
  116. package/app/components/layout/CommandBar.vue +7 -9
  117. package/app/components/layout/ConnectionStatusBanner.vue +2 -2
  118. package/app/components/layout/DefaultTestEnvBanner.vue +5 -5
  119. package/app/components/layout/GitHubPatBanner.vue +5 -5
  120. package/app/components/layout/GitHubPatPermissionsBanner.vue +16 -10
  121. package/app/components/layout/InfraSetupBanner.vue +6 -6
  122. package/app/components/layout/IntegrationsHub.vue +15 -15
  123. package/app/components/layout/LanguageSwitcher.vue +5 -5
  124. package/app/components/layout/ModelProvidersHub.vue +13 -16
  125. package/app/components/layout/NotificationsInbox.vue +10 -10
  126. package/app/components/layout/PersonalSetupModal.vue +8 -8
  127. package/app/components/layout/ProviderConfigBanner.vue +4 -4
  128. package/app/components/layout/RolePrompt.vue +7 -7
  129. package/app/components/layout/SideBar.vue +6 -4
  130. package/app/components/layout/SpendWarningBanner.vue +17 -14
  131. package/app/components/layout/TranslationWarningBanner.vue +4 -4
  132. package/app/components/layout/UiModeSwitcher.vue +13 -13
  133. package/app/components/layout/UiRoleSwitcher.vue +8 -8
  134. package/app/components/layout/WorkspaceMembersSettings.vue +15 -11
  135. package/app/components/media/ArtifactLightbox.vue +13 -13
  136. package/app/components/media/ImageCompare.vue +31 -24
  137. package/app/components/merge/MergeEffortChips.vue +2 -2
  138. package/app/components/notifications/NotificationSettingsPanel.vue +14 -12
  139. package/app/components/observability/OutcomeFilterChips.vue +6 -6
  140. package/app/components/observability/RunFailureSummary.vue +28 -25
  141. package/app/components/observability/StepMetricsBar.vue +26 -28
  142. package/app/components/observability/StepModelActivity.vue +2 -2
  143. package/app/components/observability/ToolCallList.vue +24 -24
  144. package/app/components/outcome/OutcomeSummaryWindow.vue +47 -47
  145. package/app/components/palettes/AgentPalette.vue +8 -8
  146. package/app/components/palettes/AgentTierSelect.vue +1 -1
  147. package/app/components/palettes/PipelinePurposeSelect.vue +1 -1
  148. package/app/components/panels/AgentStepDetail.vue +52 -51
  149. package/app/components/panels/AttemptEntryHeader.vue +4 -6
  150. package/app/components/panels/DecisionModal.vue +7 -7
  151. package/app/components/panels/GenericStructuredResultView.vue +7 -7
  152. package/app/components/panels/InspectorPanel.vue +17 -17
  153. package/app/components/panels/MergerResultView.vue +19 -19
  154. package/app/components/panels/ObservabilityPanel.vue +115 -123
  155. package/app/components/panels/OperatorDashboardPanel.vue +89 -97
  156. package/app/components/panels/ReportsPanel.vue +69 -66
  157. package/app/components/panels/ReportsSpendBreakdown.vue +9 -9
  158. package/app/components/panels/ResultWindowShell.vue +38 -38
  159. package/app/components/panels/RunDetailLoadState.vue +2 -2
  160. package/app/components/panels/StepContainerStatus.vue +9 -9
  161. package/app/components/panels/StepDelegatedStatus.logic.spec.ts +135 -0
  162. package/app/components/panels/StepDelegatedStatus.logic.ts +160 -0
  163. package/app/components/panels/StepDelegatedStatus.vue +181 -0
  164. package/app/components/panels/StepEffortReport.vue +16 -15
  165. package/app/components/panels/StepFragmentAdherence.vue +14 -10
  166. package/app/components/panels/StepMetadataCard.vue +74 -45
  167. package/app/components/panels/StepReproductionReport.vue +25 -21
  168. package/app/components/panels/StepRunMeta.vue +20 -20
  169. package/app/components/panels/StepTestReport.logic.spec.ts +8 -3
  170. package/app/components/panels/StepTestReport.logic.ts +4 -4
  171. package/app/components/panels/StepTestReport.vue +28 -28
  172. package/app/components/panels/StepToolServers.vue +14 -11
  173. package/app/components/panels/StepValidationReport.vue +7 -7
  174. package/app/components/panels/inspector/ContainerSummary.vue +9 -9
  175. package/app/components/panels/inspector/DocReferenceRepos.vue +3 -3
  176. package/app/components/panels/inspector/EnvProbeReport.vue +24 -27
  177. package/app/components/panels/inspector/EpicChildren.vue +8 -12
  178. package/app/components/panels/inspector/FrontendBindingsResolved.vue +11 -11
  179. package/app/components/panels/inspector/FrontendConfig.vue +37 -41
  180. package/app/components/panels/inspector/InitiativeInspector.vue +3 -3
  181. package/app/components/panels/inspector/InspectorSection.vue +6 -6
  182. package/app/components/panels/inspector/RecurringScheduleSettings.vue +16 -19
  183. package/app/components/panels/inspector/ServiceConnections.vue +2 -2
  184. package/app/components/panels/inspector/ServiceReleaseHealthConfig.vue +2 -2
  185. package/app/components/panels/inspector/ServiceSelfTests.vue +21 -17
  186. package/app/components/panels/inspector/ServiceTestConfig.vue +51 -59
  187. package/app/components/panels/inspector/ServiceTestSecrets.vue +5 -5
  188. package/app/components/panels/inspector/ServiceTestingContext.vue +3 -3
  189. package/app/components/panels/inspector/ServiceValidationConfig.vue +2 -2
  190. package/app/components/panels/inspector/TaskAgentConfig.vue +3 -3
  191. package/app/components/panels/inspector/TaskAprioriBranches.vue +8 -5
  192. package/app/components/panels/inspector/TaskDependencies.vue +1 -1
  193. package/app/components/panels/inspector/TaskEstimateBadge.vue +11 -11
  194. package/app/components/panels/inspector/TaskExecution.vue +17 -17
  195. package/app/components/panels/inspector/TaskReviewTarget.vue +2 -2
  196. package/app/components/panels/inspector/TaskRunSettings.vue +35 -37
  197. package/app/components/panels/inspector/TaskStructure.vue +3 -3
  198. package/app/components/pipeline/AgentKindIcon.vue +1 -1
  199. package/app/components/pipeline/AgentPromptEditor.vue +17 -17
  200. package/app/components/pipeline/BinaryOutputStepPicker.vue +42 -56
  201. package/app/components/pipeline/EstimateThresholdFields.vue +4 -4
  202. package/app/components/pipeline/GateConfigFields.vue +13 -10
  203. package/app/components/pipeline/IterationCapPrompt.vue +4 -2
  204. package/app/components/pipeline/PipelineBuilder.vue +47 -55
  205. package/app/components/pipeline/PipelineHealthModal.vue +27 -29
  206. package/app/components/pipeline/PipelinePicker.vue +10 -10
  207. package/app/components/pipeline/PipelinePreview.vue +10 -10
  208. package/app/components/pipeline/PipelineProgress.vue +64 -67
  209. package/app/components/prReview/PrReviewPhaseBadge.vue +7 -7
  210. package/app/components/prReview/PrReviewWindow.vue +75 -77
  211. package/app/components/providers/AiPresetMismatchDialog.vue +5 -5
  212. package/app/components/providers/AiProviderOnboardingModal.vue +9 -9
  213. package/app/components/providers/ApiKeysSection.vue +13 -13
  214. package/app/components/providers/PersonalCredentialModal.vue +2 -2
  215. package/app/components/providers/PersonalSubscriptionSection.vue +10 -10
  216. package/app/components/providers/SignInRequiredNotice.vue +1 -1
  217. package/app/components/providers/VendorCredentialsModal.vue +10 -10
  218. package/app/components/provisioning/ProvisioningLogsDrawer.vue +13 -13
  219. package/app/components/ralph/RalphLoopResultView.vue +28 -30
  220. package/app/components/recurring/RecurrenceEditor.vue +2 -2
  221. package/app/components/requirements/RequirementsReviewWindow.vue +51 -58
  222. package/app/components/riskPolicy/RiskPolicyPicker.vue +12 -15
  223. package/app/components/riskPolicy/RiskPolicyPreview.vue +14 -14
  224. package/app/components/sandbox/SandboxPanel.vue +58 -59
  225. package/app/components/settings/AccountSettingsPanel.vue +1 -1
  226. package/app/components/settings/ApiTokensPanel.vue +10 -10
  227. package/app/components/settings/BudgetSettings.vue +18 -22
  228. package/app/components/settings/CapabilityCredentialsPanel.vue +15 -15
  229. package/app/components/settings/CloudflareHandlerSection.vue +20 -20
  230. package/app/components/settings/ComposeEnvironmentSetupSection.vue +13 -13
  231. package/app/components/settings/ConnectionTestVerdict.vue +3 -3
  232. package/app/components/settings/ConnectionWarnings.vue +1 -1
  233. package/app/components/settings/ConsensusGroupsSection.vue +27 -35
  234. package/app/components/settings/CustomManifestTypeEditor.vue +10 -10
  235. package/app/components/settings/DefaultProvisionTypeSection.vue +6 -6
  236. package/app/components/settings/InfraHandlersConfigurator.vue +24 -22
  237. package/app/components/settings/InfrastructureBackendPicker.vue +6 -6
  238. package/app/components/settings/InfrastructureWindow.vue +5 -5
  239. package/app/components/settings/IssueTrackerPanel.vue +29 -23
  240. package/app/components/settings/KubernetesEngineForm.vue +11 -11
  241. package/app/components/settings/KubernetesEnvironmentForm.vue +4 -4
  242. package/app/components/settings/LocalContainerPoolSettings.vue +6 -11
  243. package/app/components/settings/LocalModelEndpointsPanel.vue +20 -18
  244. package/app/components/settings/McpAuthorizeScreen.vue +13 -15
  245. package/app/components/settings/McpOAuthCallbackScreen.vue +16 -10
  246. package/app/components/settings/MergeClassRulesEditor.vue +6 -9
  247. package/app/components/settings/MergeRolePolicyEditor.vue +16 -16
  248. package/app/components/settings/ModelConfigurationPanel.vue +23 -30
  249. package/app/components/settings/ModelPresetHealthModal.vue +15 -13
  250. package/app/components/settings/ObservabilityConnectionPanel.vue +4 -4
  251. package/app/components/settings/OpenRouterCatalogPanel.vue +26 -19
  252. package/app/components/settings/PackageRegistriesPanel.vue +8 -8
  253. package/app/components/settings/ProviderConnectionTab.vue +8 -11
  254. package/app/components/settings/ProviderManifestEditor.vue +9 -9
  255. package/app/components/settings/ProviderPreferenceEditor.vue +8 -8
  256. package/app/components/settings/RiskPolicyCreateForm.vue +10 -10
  257. package/app/components/settings/RiskPolicyEditorRow.vue +14 -14
  258. package/app/components/settings/RiskPolicyHealthModal.vue +15 -13
  259. package/app/components/settings/RiskPolicyInheritedRow.vue +1 -1
  260. package/app/components/settings/RiskPolicyPanel.vue +10 -15
  261. package/app/components/settings/ServiceFragmentDefaultsPanel.vue +7 -7
  262. package/app/components/settings/SharedStacksPanel.vue +9 -12
  263. package/app/components/settings/TaskSourceCard.vue +4 -4
  264. package/app/components/settings/TaskTypeSuppressionsPanel.vue +6 -6
  265. package/app/components/settings/ToolServerChecklist.vue +36 -29
  266. package/app/components/settings/UsageSettings.vue +15 -15
  267. package/app/components/settings/UserSecretsSection.vue +9 -12
  268. package/app/components/settings/WorkspaceMetadataSettings.vue +5 -5
  269. package/app/components/settings/WorkspaceSettingsPanel.vue +47 -47
  270. package/app/components/skills/ReviewSkillQueue.vue +10 -10
  271. package/app/components/skills/SkillLibraryManager.vue +23 -20
  272. package/app/components/slack/SlackPanel.vue +13 -17
  273. package/app/components/spec/ServiceSpecWindow.vue +45 -42
  274. package/app/components/tasks/BugHuntModal.vue +24 -27
  275. package/app/components/tasks/ContextIssuePicker.vue +11 -11
  276. package/app/components/tasks/TaskContextIssues.vue +3 -3
  277. package/app/components/tasks/TaskImportModal.vue +7 -7
  278. package/app/components/tasks/TaskSourceConnectModal.vue +10 -8
  279. package/app/components/testing/TestReportWindow.vue +99 -82
  280. package/app/components/theme/ThemeImportModal.vue +115 -0
  281. package/app/components/tutorial/TutorialCatalogue.vue +9 -9
  282. package/app/components/tutorial/TutorialNudge.vue +5 -5
  283. package/app/components/tutorial/TutorialOverlay.vue +12 -12
  284. package/app/components/tutorial/TutorialPrompt.vue +6 -9
  285. package/app/components/vcs/GitLabConnect.vue +4 -4
  286. package/app/components/vcs/VcsConnectSurfaces.vue +2 -2
  287. package/app/components/visualConfirm/VisualConfirmationWindow.vue +36 -36
  288. package/app/composables/api/client.ts +6 -1
  289. package/app/composables/usePipelineErrorToast.ts +17 -0
  290. package/app/modular/agent-kinds.ts +24 -0
  291. package/app/pages/index.vue +5 -5
  292. package/app/plugins/theme.client.ts +125 -0
  293. package/app/spa-loading-template.html +52 -14
  294. package/app/stores/agents.ts +1 -1
  295. package/app/stores/theme.spec.ts +56 -0
  296. package/app/stores/theme.ts +87 -0
  297. package/app/types/domain.ts +19 -0
  298. package/app/types/execution.ts +4 -0
  299. package/app/utils/agentOutput.ts +1 -1
  300. package/app/utils/binaryOutput.ts +6 -6
  301. package/app/utils/bootstrapSteps.ts +14 -14
  302. package/app/utils/catalog.ts +87 -83
  303. package/app/utils/colorTint.ts +10 -0
  304. package/app/utils/failureKinds.ts +1 -0
  305. package/app/utils/observability.ts +3 -3
  306. package/app/utils/pipelineRender.ts +13 -17
  307. package/app/utils/swimlanes.ts +4 -4
  308. package/app/utils/theme/bootPalette.spec.ts +54 -0
  309. package/app/utils/theme/bootPalette.ts +108 -0
  310. package/app/utils/theme/builtins.spec.ts +38 -0
  311. package/app/utils/theme/builtins.ts +55 -0
  312. package/app/utils/theme/css.ts +162 -0
  313. package/app/utils/theme/doc.ts +353 -0
  314. package/app/utils/theme/link.ts +93 -0
  315. package/app/utils/theme/presets.ts +509 -0
  316. package/app/utils/theme/theme.spec.ts +224 -0
  317. package/i18n/locales/de.json +61 -4
  318. package/i18n/locales/en.json +70 -4
  319. package/i18n/locales/es.json +61 -4
  320. package/i18n/locales/fr.json +61 -4
  321. package/i18n/locales/he.json +61 -4
  322. package/i18n/locales/it.json +61 -4
  323. package/i18n/locales/ja.json +61 -4
  324. package/i18n/locales/pl.json +61 -4
  325. package/i18n/locales/tr.json +61 -4
  326. package/i18n/locales/uk.json +61 -4
  327. package/nuxt.config.ts +37 -11
  328. package/package.json +10 -9
@@ -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>
@@ -258,7 +258,7 @@ async function resolveExceeded(choice: 'extra-round' | 'proceed' | 'stop-reset')
258
258
  <ResultWindowShell
259
259
  :open="open"
260
260
  :icon="isArchitecture ? 'i-lucide-drafting-compass' : 'i-lucide-lightbulb'"
261
- icon-class="bg-amber-500/15 text-amber-300"
261
+ icon-class="bg-app-warning-500/15 text-app-warning-300"
262
262
  :title="
263
263
  isArchitecture ? t('brainstorm.title.architecture') : t('brainstorm.title.requirements')
264
264
  "
@@ -276,15 +276,15 @@ async function resolveExceeded(choice: 'extra-round' | 'proceed' | 'stop-reset')
276
276
  <div class="flex min-h-0 flex-1">
277
277
  <!-- main column -->
278
278
  <div class="min-w-0 flex-1 overflow-y-auto px-6 py-5">
279
- <p class="mb-4 text-sm text-slate-400">
279
+ <p class="mb-4 text-sm text-muted">
280
280
  <i18n-t keypath="brainstorm.intro" tag="span" scope="global">
281
281
  <template #subject>{{ subjectNoun }}</template>
282
282
  <template #doc>{{ docNoun }}</template>
283
283
  <template #choose>
284
- <span class="text-slate-300">{{ t('brainstorm.introChoose') }}</span>
284
+ <span class="text-toned">{{ t('brainstorm.introChoose') }}</span>
285
285
  </template>
286
286
  <template #dismiss>
287
- <span class="text-slate-300">{{ t('brainstorm.introDismiss') }}</span>
287
+ <span class="text-toned">{{ t('brainstorm.introDismiss') }}</span>
288
288
  </template>
289
289
  </i18n-t>
290
290
  </p>
@@ -292,7 +292,7 @@ async function resolveExceeded(choice: 'extra-round' | 'proceed' | 'stop-reset')
292
292
  <!-- empty state -->
293
293
  <div
294
294
  v-if="!session && !busy && !loading"
295
- class="rounded-lg border border-dashed border-slate-700 p-8 text-center text-sm text-slate-500"
295
+ class="rounded-lg border border-dashed border-muted p-8 text-center text-sm text-dimmed"
296
296
  >
297
297
  {{ t('brainstorm.empty') }}
298
298
  </div>
@@ -300,7 +300,7 @@ async function resolveExceeded(choice: 'extra-round' | 'proceed' | 'stop-reset')
300
300
  <!-- working state (initial fetch on open, or an agent pass running) -->
301
301
  <div
302
302
  v-else-if="(busy || loading) && !session"
303
- class="flex items-center justify-center gap-2 p-8 text-sm text-slate-400"
303
+ class="flex items-center justify-center gap-2 p-8 text-sm text-muted"
304
304
  >
305
305
  <UIcon name="i-lucide-loader-circle" class="h-4 w-4 animate-spin" />
306
306
  {{ loading && !busy ? t('brainstorm.loading') : t('brainstorm.generating') }}
@@ -310,7 +310,7 @@ async function resolveExceeded(choice: 'extra-round' | 'proceed' | 'stop-reset')
310
310
  <!-- converged -->
311
311
  <div
312
312
  v-if="incorporated"
313
- class="mb-4 flex items-center gap-2 rounded-lg border border-emerald-900/60 bg-emerald-950/30 p-4 text-sm text-emerald-300"
313
+ class="mb-4 flex items-center gap-2 rounded-lg border border-app-success-900/60 bg-app-success-950/30 p-4 text-sm text-app-success-300"
314
314
  >
315
315
  <UIcon name="i-lucide-circle-check" class="h-5 w-5 shrink-0" />
316
316
  {{ t('brainstorm.settledBanner', { doc: docNoun }) }}
@@ -329,7 +329,7 @@ async function resolveExceeded(choice: 'extra-round' | 'proceed' | 'stop-reset')
329
329
  <!-- working: the async cycle is running in the driver -->
330
330
  <div
331
331
  v-else-if="working"
332
- class="mb-4 flex items-center gap-2 rounded-lg border border-amber-900/60 bg-amber-950/30 p-4 text-sm text-amber-200"
332
+ class="mb-4 flex items-center gap-2 rounded-lg border border-app-warning-900/60 bg-app-warning-950/30 p-4 text-sm text-app-warning-200"
333
333
  >
334
334
  <UIcon name="i-lucide-loader-circle" class="h-5 w-5 shrink-0 animate-spin" />
335
335
  <span v-if="incorporating">
@@ -345,17 +345,17 @@ async function resolveExceeded(choice: 'extra-round' | 'proceed' | 'stop-reset')
345
345
  <div
346
346
  v-for="item in sortedItems"
347
347
  :key="item.id"
348
- class="rounded-lg border border-slate-800 bg-slate-900/60 p-3"
348
+ class="rounded-lg border border-default bg-default/60 p-3"
349
349
  :class="{ 'opacity-60': item.status === 'dismissed' }"
350
350
  >
351
351
  <div class="flex items-start gap-2">
352
352
  <UIcon
353
353
  :name="CATEGORY_ICON[item.category]"
354
- class="mt-0.5 h-4 w-4 shrink-0 text-slate-400"
354
+ class="mt-0.5 h-4 w-4 shrink-0 text-muted"
355
355
  />
356
356
  <div class="min-w-0 flex-1">
357
357
  <div class="flex flex-wrap items-center gap-1.5">
358
- <span class="text-sm font-medium text-white">{{ item.title }}</span>
358
+ <span class="text-sm font-medium text-highlighted">{{ item.title }}</span>
359
359
  <UBadge size="xs" variant="subtle" :color="SEVERITY_COLOR[item.severity]">
360
360
  {{ t(SEVERITY_LABELS[item.severity]) }}
361
361
  </UBadge>
@@ -375,16 +375,16 @@ async function resolveExceeded(choice: 'extra-round' | 'proceed' | 'stop-reset')
375
375
  around it takes the span (see the shell's `width` prop: the unit is the
376
376
  paragraph, not the section). The badge row above and the choose/dismiss
377
377
  control below are what the full width is actually for. -->
378
- <p class="mt-1 max-w-3xl whitespace-pre-line text-sm text-slate-400">
378
+ <p class="mt-1 max-w-3xl whitespace-pre-line text-sm text-muted">
379
379
  {{ item.detail }}
380
380
  </p>
381
381
 
382
382
  <!-- recorded choice -->
383
383
  <div
384
384
  v-if="item.reply"
385
- class="mt-2 max-w-3xl rounded-md border-s-2 border-slate-700 bg-slate-950/40 px-3 py-1.5 text-sm text-slate-300"
385
+ class="mt-2 max-w-3xl rounded-md border-s-2 border-muted bg-app-950/40 px-3 py-1.5 text-sm text-toned"
386
386
  >
387
- <span class="text-[10px] uppercase tracking-wide text-slate-500">
387
+ <span class="text-[10px] uppercase tracking-wide text-dimmed">
388
388
  {{ t('brainstorm.yourChoice') }}
389
389
  </span>
390
390
  <p class="whitespace-pre-line">{{ item.reply }}</p>
@@ -453,8 +453,8 @@ async function resolveExceeded(choice: 'extra-round' | 'proceed' | 'stop-reset')
453
453
  </div>
454
454
 
455
455
  <!-- converged document: the standard-format direction -->
456
- <section v-if="outline" class="mt-6 border-t border-slate-800 pt-5">
457
- <div class="mb-3 flex items-center gap-1.5 text-[11px] text-emerald-400">
456
+ <section v-if="outline" class="mt-6 border-t border-default pt-5">
457
+ <div class="mb-3 flex items-center gap-1.5 text-[11px] text-app-success-400">
458
458
  <UIcon name="i-lucide-file-check-2" class="h-3.5 w-3.5" />
459
459
  <span class="font-semibold uppercase tracking-wide">
460
460
  {{ incorporated ? docNoun : t('brainstorm.docDraft', { doc: docNoun }) }}
@@ -471,18 +471,18 @@ async function resolveExceeded(choice: 'extra-round' | 'proceed' | 'stop-reset')
471
471
  >
472
472
  <UIcon
473
473
  name="i-lucide-chevron-right"
474
- class="h-3.5 w-3.5 shrink-0 text-slate-500 transition-transform"
474
+ class="h-3.5 w-3.5 shrink-0 text-dimmed transition-transform"
475
475
  :class="collapsed[s.id] ? '' : 'rotate-90'"
476
476
  />
477
477
  <span
478
- class="font-semibold text-white"
478
+ class="font-semibold text-highlighted"
479
479
  :class="s.depth <= 1 ? 'text-base' : s.depth === 2 ? 'text-sm' : 'text-xs'"
480
480
  v-html="s.titleHtml"
481
481
  />
482
482
  </button>
483
483
  <div
484
484
  v-show="!s.title || !collapsed[s.id]"
485
- class="reader-prose mt-1 ps-5.5 text-[13px] leading-relaxed text-slate-300"
485
+ class="reader-prose mt-1 ps-5.5 text-[13px] leading-relaxed text-toned"
486
486
  v-html="s.bodyHtml"
487
487
  />
488
488
  </div>
@@ -491,32 +491,29 @@ async function resolveExceeded(choice: 'extra-round' | 'proceed' | 'stop-reset')
491
491
  </div>
492
492
 
493
493
  <!-- right action rail -->
494
- <aside class="hidden w-72 shrink-0 flex-col border-s border-slate-800 lg:flex">
494
+ <aside class="hidden w-72 shrink-0 flex-col border-s border-default lg:flex">
495
495
  <div class="flex flex-col gap-4 px-4 py-5">
496
- <div v-if="session" class="space-y-2 text-xs text-slate-400">
496
+ <div v-if="session" class="space-y-2 text-xs text-muted">
497
497
  <div class="flex items-center justify-between">
498
498
  <span>{{ t('brainstorm.rail.options') }}</span>
499
- <span class="text-slate-300">{{ session.items.length }}</span>
499
+ <span class="text-toned">{{ session.items.length }}</span>
500
500
  </div>
501
501
  <div class="flex items-center justify-between">
502
502
  <span>{{ t('brainstorm.rail.open') }}</span>
503
- <span class="text-slate-300">{{ openCount }}</span>
503
+ <span class="text-toned">{{ openCount }}</span>
504
504
  </div>
505
505
  <div class="flex items-center justify-between">
506
506
  <span>{{ t('brainstorm.rail.chosen') }}</span>
507
- <span class="text-slate-300">{{ answeredCount }}</span>
507
+ <span class="text-toned">{{ answeredCount }}</span>
508
508
  </div>
509
509
  <div v-if="session.model" class="flex items-center justify-between">
510
510
  <span>{{ t('brainstorm.rail.model') }}</span>
511
- <span class="truncate ps-2 text-slate-500">{{ session.model }}</span>
511
+ <span class="truncate ps-2 text-dimmed">{{ session.model }}</span>
512
512
  </div>
513
513
  </div>
514
514
 
515
515
  <!-- action: ready (choose → incorporate / proceed) -->
516
- <div
517
- v-if="session && status === 'ready'"
518
- class="space-y-2 border-t border-slate-800 pt-4"
519
- >
516
+ <div v-if="session && status === 'ready'" class="space-y-2 border-t border-default pt-4">
520
517
  <UButton
521
518
  v-if="canProceed"
522
519
  color="primary"
@@ -544,7 +541,7 @@ async function resolveExceeded(choice: 'extra-round' | 'proceed' | 'stop-reset')
544
541
  >
545
542
  {{ t('brainstorm.incorporateChoices') }}
546
543
  </UButton>
547
- <p class="text-[11px] leading-relaxed text-slate-500">
544
+ <p class="text-[11px] leading-relaxed text-dimmed">
548
545
  <template v-if="canProceed">
549
546
  {{ t('brainstorm.hint.allDismissed') }}
550
547
  </template>
@@ -556,7 +553,7 @@ async function resolveExceeded(choice: 'extra-round' | 'proceed' | 'stop-reset')
556
553
  </div>
557
554
 
558
555
  <!-- action: merged (inspect → re-run / redo) -->
559
- <div v-if="session && merged" class="space-y-2 border-t border-slate-800 pt-4">
556
+ <div v-if="session && merged" class="space-y-2 border-t border-default pt-4">
560
557
  <UButton
561
558
  color="primary"
562
559
  size="sm"
@@ -606,14 +603,14 @@ async function resolveExceeded(choice: 'extra-round' | 'proceed' | 'stop-reset')
606
603
  {{ t('brainstorm.redoWithDirection') }}
607
604
  </UButton>
608
605
  </div>
609
- <p class="text-[11px] leading-relaxed text-slate-500">
606
+ <p class="text-[11px] leading-relaxed text-dimmed">
610
607
  {{ t('brainstorm.mergedHint') }}
611
608
  </p>
612
609
  </div>
613
610
 
614
611
  <div
615
612
  v-if="session && incorporated"
616
- class="border-t border-slate-800 pt-4 text-[11px] leading-relaxed text-slate-500"
613
+ class="border-t border-default pt-4 text-[11px] leading-relaxed text-dimmed"
617
614
  >
618
615
  {{ t('brainstorm.incorporatedFooter') }}
619
616
  </div>