@cat-factory/app 0.302.1 → 0.303.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (328) hide show
  1. package/README.md +16 -0
  2. package/app/app.config.ts +19 -10
  3. package/app/assets/css/main.css +13 -13
  4. package/app/assets/css/prose.css +22 -22
  5. package/app/assets/css/tokens.css +298 -0
  6. package/app/components/assistant/AssistantModal.vue +22 -22
  7. package/app/components/auth/AuthGate.vue +1 -1
  8. package/app/components/auth/BackendMisconfiguredScreen.vue +10 -10
  9. package/app/components/auth/LoginScreen.vue +34 -36
  10. package/app/components/auth/ResetPasswordScreen.vue +12 -12
  11. package/app/components/auth/UserMenu.vue +4 -4
  12. package/app/components/binaryCandidates/BinaryCandidatesWindow.vue +27 -25
  13. package/app/components/binaryOutput/BinaryOutputReport.vue +15 -15
  14. package/app/components/binaryOutput/StoredAssetView.vue +5 -5
  15. package/app/components/board/AddTaskModal.vue +17 -20
  16. package/app/components/board/AgentFailureCard.vue +11 -11
  17. package/app/components/board/AgentFailureHistory.vue +2 -2
  18. package/app/components/board/BoardCanvas.vue +6 -5
  19. package/app/components/board/CreateInitiativeModal.vue +8 -10
  20. package/app/components/board/DependencyConnectOverlay.vue +1 -1
  21. package/app/components/board/FailureHistoryList.vue +7 -7
  22. package/app/components/board/RecurringPipelineModal.vue +17 -17
  23. package/app/components/board/ReviewFrictionDialog.vue +6 -6
  24. package/app/components/board/StepExecutionHistory.vue +13 -13
  25. package/app/components/board/TaskDependencyEdges.vue +8 -8
  26. package/app/components/board/nodes/AgentChip.vue +10 -10
  27. package/app/components/board/nodes/BlockNode.vue +29 -29
  28. package/app/components/board/nodes/DecisionBadge.vue +2 -2
  29. package/app/components/board/nodes/EpicNode.vue +14 -10
  30. package/app/components/board/nodes/FrameSwimlanes.vue +7 -9
  31. package/app/components/board/nodes/InitiativeCard.vue +8 -8
  32. package/app/components/board/nodes/LaneGroup.vue +1 -1
  33. package/app/components/board/nodes/LaneTask.vue +2 -2
  34. package/app/components/board/nodes/ResizeGrips.vue +4 -4
  35. package/app/components/board/nodes/TaskCard.vue +18 -18
  36. package/app/components/board/nodes/TaskLane.vue +5 -5
  37. package/app/components/board/nodes/TaskPipelineMini.vue +18 -18
  38. package/app/components/bootstrap/AdoptionReviewModal.vue +29 -26
  39. package/app/components/bootstrap/BootstrapModal.vue +21 -23
  40. package/app/components/bootstrap/BootstrapRunSteps.vue +1 -1
  41. package/app/components/brainstorm/BrainstormWindow.vue +30 -33
  42. package/app/components/bugFishing/BugFishingWindow.vue +49 -49
  43. package/app/components/clarity/ClarityReviewWindow.vue +30 -30
  44. package/app/components/common/AsyncViewError.vue +5 -5
  45. package/app/components/common/ClarificationItem.vue +8 -13
  46. package/app/components/common/ConfirmDialog.vue +4 -2
  47. package/app/components/common/DescriptorFields.vue +1 -1
  48. package/app/components/common/EmptyState.vue +3 -3
  49. package/app/components/common/InterviewGateNotice.vue +7 -7
  50. package/app/components/common/KeyboardShortcutsHelp.vue +1 -1
  51. package/app/components/common/MarkdownProse.vue +14 -13
  52. package/app/components/consensus/ConsensusSessionWindow.vue +26 -26
  53. package/app/components/context/ContextAttachmentFields.vue +17 -17
  54. package/app/components/docs/DocInterviewWindow.vue +14 -14
  55. package/app/components/documents/ContextDocumentPicker.vue +17 -17
  56. package/app/components/documents/DocumentImportModal.vue +7 -7
  57. package/app/components/documents/DocumentSourceConnectModal.vue +3 -3
  58. package/app/components/documents/DocumentSyncState.vue +5 -5
  59. package/app/components/documents/DocumentTemplatesModal.vue +15 -15
  60. package/app/components/documents/RepoContextDocPicker.vue +5 -5
  61. package/app/components/documents/SpawnPreviewModal.vue +12 -12
  62. package/app/components/documents/StartFromDesignModal.vue +11 -11
  63. package/app/components/documents/TaskContextDocs.vue +5 -5
  64. package/app/components/environments/EnvSetupStepper.vue +6 -6
  65. package/app/components/environments/EnvironmentStatusPanel.vue +17 -17
  66. package/app/components/environments/steps/EnvPickStep.vue +3 -3
  67. package/app/components/environments/steps/EnvPreflightStep.vue +9 -9
  68. package/app/components/environments/steps/EnvReviewStep.vue +25 -22
  69. package/app/components/environments/steps/EnvSaveStep.vue +7 -5
  70. package/app/components/environments/steps/JourneyStepNav.vue +1 -1
  71. package/app/components/focus/BlockFocusView.vue +17 -19
  72. package/app/components/followUp/FollowUpWindow.vue +23 -23
  73. package/app/components/forkDecision/ForkDecisionWindow.vue +37 -39
  74. package/app/components/foundational/FoundationalContractSummary.vue +7 -7
  75. package/app/components/foundational/FoundationalServiceCatalogList.vue +11 -11
  76. package/app/components/foundational/FoundationalServiceManager.vue +1 -1
  77. package/app/components/foundational/FoundationalServiceRegistry.vue +13 -13
  78. package/app/components/foundational/FoundationalServiceSources.vue +13 -13
  79. package/app/components/foundational/FoundationalSuppressions.vue +7 -7
  80. package/app/components/foundational/ServiceCatalogConnection.vue +10 -10
  81. package/app/components/fragments/FragmentLibraryManager.vue +41 -44
  82. package/app/components/fragments/FragmentSelector.vue +13 -13
  83. package/app/components/fragments/GitHubDocUrlImport.vue +1 -1
  84. package/app/components/gates/GateFailingCheckList.vue +5 -5
  85. package/app/components/gates/GateResultView.vue +50 -47
  86. package/app/components/github/AddServiceFromRepoModal.vue +14 -14
  87. package/app/components/github/BranchProtectionPreflight.vue +13 -13
  88. package/app/components/github/GitHubConnect.vue +7 -7
  89. package/app/components/github/GitHubOnboarding.vue +7 -7
  90. package/app/components/github/GitHubPanel.vue +37 -40
  91. package/app/components/github/RepoTreeBrowser.vue +18 -18
  92. package/app/components/humanTest/HumanTestWindow.vue +30 -33
  93. package/app/components/initiative/InitiativePlanNotice.vue +5 -5
  94. package/app/components/initiative/InitiativePlanReview.vue +27 -29
  95. package/app/components/initiative/InitiativePlanningWindow.vue +10 -10
  96. package/app/components/initiative/InitiativeTrackerWindow.vue +71 -65
  97. package/app/components/inputGate/InputGateNotice.vue +2 -4
  98. package/app/components/judge/JudgeResultView.vue +30 -32
  99. package/app/components/kaizen/KaizenPanel.vue +40 -36
  100. package/app/components/kaizen/KaizenStepStatus.vue +21 -21
  101. package/app/components/layout/AccountAuditLog.vue +10 -10
  102. package/app/components/layout/AccountDeploymentSettings.vue +20 -20
  103. package/app/components/layout/AccountFailureKindRules.vue +13 -13
  104. package/app/components/layout/AccountFoundationalSettings.vue +1 -1
  105. package/app/components/layout/AccountFragmentSettings.vue +1 -1
  106. package/app/components/layout/AccountModelPolicySettings.vue +9 -9
  107. package/app/components/layout/AccountPlatformAlertSettings.vue +11 -11
  108. package/app/components/layout/AccountRiskPolicySettings.vue +2 -2
  109. package/app/components/layout/AccountRunCredentialSettings.vue +5 -5
  110. package/app/components/layout/AccountSkillSettings.vue +1 -1
  111. package/app/components/layout/AccountTeamSettings.vue +23 -15
  112. package/app/components/layout/AiProvidersBanner.vue +11 -8
  113. package/app/components/layout/AppearanceSwitcher.vue +108 -0
  114. package/app/components/layout/BoardSwitcher.vue +8 -11
  115. package/app/components/layout/BoardToolbar.vue +3 -3
  116. package/app/components/layout/CommandBar.vue +7 -9
  117. package/app/components/layout/ConnectionStatusBanner.vue +2 -2
  118. package/app/components/layout/DefaultTestEnvBanner.vue +5 -5
  119. package/app/components/layout/GitHubPatBanner.vue +5 -5
  120. package/app/components/layout/GitHubPatPermissionsBanner.vue +16 -10
  121. package/app/components/layout/InfraSetupBanner.vue +6 -6
  122. package/app/components/layout/IntegrationsHub.vue +15 -15
  123. package/app/components/layout/LanguageSwitcher.vue +5 -5
  124. package/app/components/layout/ModelProvidersHub.vue +13 -16
  125. package/app/components/layout/NotificationsInbox.vue +10 -10
  126. package/app/components/layout/PersonalSetupModal.vue +8 -8
  127. package/app/components/layout/ProviderConfigBanner.vue +4 -4
  128. package/app/components/layout/RolePrompt.vue +7 -7
  129. package/app/components/layout/SideBar.vue +6 -4
  130. package/app/components/layout/SpendWarningBanner.vue +17 -14
  131. package/app/components/layout/TranslationWarningBanner.vue +4 -4
  132. package/app/components/layout/UiModeSwitcher.vue +13 -13
  133. package/app/components/layout/UiRoleSwitcher.vue +8 -8
  134. package/app/components/layout/WorkspaceMembersSettings.vue +15 -11
  135. package/app/components/media/ArtifactLightbox.vue +13 -13
  136. package/app/components/media/ImageCompare.vue +31 -24
  137. package/app/components/merge/MergeEffortChips.vue +2 -2
  138. package/app/components/notifications/NotificationSettingsPanel.vue +14 -12
  139. package/app/components/observability/OutcomeFilterChips.vue +6 -6
  140. package/app/components/observability/RunFailureSummary.vue +28 -25
  141. package/app/components/observability/StepMetricsBar.vue +26 -28
  142. package/app/components/observability/StepModelActivity.vue +2 -2
  143. package/app/components/observability/ToolCallList.vue +24 -24
  144. package/app/components/outcome/OutcomeSummaryWindow.vue +47 -47
  145. package/app/components/palettes/AgentPalette.vue +8 -8
  146. package/app/components/palettes/AgentTierSelect.vue +1 -1
  147. package/app/components/palettes/PipelinePurposeSelect.vue +1 -1
  148. package/app/components/panels/AgentStepDetail.vue +52 -51
  149. package/app/components/panels/AttemptEntryHeader.vue +4 -6
  150. package/app/components/panels/DecisionModal.vue +7 -7
  151. package/app/components/panels/GenericStructuredResultView.vue +7 -7
  152. package/app/components/panels/InspectorPanel.vue +17 -17
  153. package/app/components/panels/MergerResultView.vue +19 -19
  154. package/app/components/panels/ObservabilityPanel.vue +115 -123
  155. package/app/components/panels/OperatorDashboardPanel.vue +89 -97
  156. package/app/components/panels/ReportsPanel.vue +69 -66
  157. package/app/components/panels/ReportsSpendBreakdown.vue +9 -9
  158. package/app/components/panels/ResultWindowShell.vue +38 -38
  159. package/app/components/panels/RunDetailLoadState.vue +2 -2
  160. package/app/components/panels/StepContainerStatus.vue +9 -9
  161. package/app/components/panels/StepDelegatedStatus.logic.spec.ts +135 -0
  162. package/app/components/panels/StepDelegatedStatus.logic.ts +160 -0
  163. package/app/components/panels/StepDelegatedStatus.vue +181 -0
  164. package/app/components/panels/StepEffortReport.vue +16 -15
  165. package/app/components/panels/StepFragmentAdherence.vue +14 -10
  166. package/app/components/panels/StepMetadataCard.vue +74 -45
  167. package/app/components/panels/StepReproductionReport.vue +25 -21
  168. package/app/components/panels/StepRunMeta.vue +20 -20
  169. package/app/components/panels/StepTestReport.logic.spec.ts +8 -3
  170. package/app/components/panels/StepTestReport.logic.ts +4 -4
  171. package/app/components/panels/StepTestReport.vue +28 -28
  172. package/app/components/panels/StepToolServers.vue +14 -11
  173. package/app/components/panels/StepValidationReport.vue +7 -7
  174. package/app/components/panels/inspector/ContainerSummary.vue +9 -9
  175. package/app/components/panels/inspector/DocReferenceRepos.vue +3 -3
  176. package/app/components/panels/inspector/EnvProbeReport.vue +24 -27
  177. package/app/components/panels/inspector/EpicChildren.vue +8 -12
  178. package/app/components/panels/inspector/FrontendBindingsResolved.vue +11 -11
  179. package/app/components/panels/inspector/FrontendConfig.vue +37 -41
  180. package/app/components/panels/inspector/InitiativeInspector.vue +3 -3
  181. package/app/components/panels/inspector/InspectorSection.vue +6 -6
  182. package/app/components/panels/inspector/RecurringScheduleSettings.vue +16 -19
  183. package/app/components/panels/inspector/ServiceConnections.vue +2 -2
  184. package/app/components/panels/inspector/ServiceReleaseHealthConfig.vue +2 -2
  185. package/app/components/panels/inspector/ServiceSelfTests.vue +21 -17
  186. package/app/components/panels/inspector/ServiceTestConfig.vue +51 -59
  187. package/app/components/panels/inspector/ServiceTestSecrets.vue +5 -5
  188. package/app/components/panels/inspector/ServiceTestingContext.vue +3 -3
  189. package/app/components/panels/inspector/ServiceValidationConfig.vue +2 -2
  190. package/app/components/panels/inspector/TaskAgentConfig.vue +3 -3
  191. package/app/components/panels/inspector/TaskAprioriBranches.vue +8 -5
  192. package/app/components/panels/inspector/TaskDependencies.vue +1 -1
  193. package/app/components/panels/inspector/TaskEstimateBadge.vue +11 -11
  194. package/app/components/panels/inspector/TaskExecution.vue +17 -17
  195. package/app/components/panels/inspector/TaskReviewTarget.vue +2 -2
  196. package/app/components/panels/inspector/TaskRunSettings.vue +35 -37
  197. package/app/components/panels/inspector/TaskStructure.vue +3 -3
  198. package/app/components/pipeline/AgentKindIcon.vue +1 -1
  199. package/app/components/pipeline/AgentPromptEditor.vue +17 -17
  200. package/app/components/pipeline/BinaryOutputStepPicker.vue +42 -56
  201. package/app/components/pipeline/EstimateThresholdFields.vue +4 -4
  202. package/app/components/pipeline/GateConfigFields.vue +13 -10
  203. package/app/components/pipeline/IterationCapPrompt.vue +4 -2
  204. package/app/components/pipeline/PipelineBuilder.vue +47 -55
  205. package/app/components/pipeline/PipelineHealthModal.vue +27 -29
  206. package/app/components/pipeline/PipelinePicker.vue +10 -10
  207. package/app/components/pipeline/PipelinePreview.vue +10 -10
  208. package/app/components/pipeline/PipelineProgress.vue +64 -67
  209. package/app/components/prReview/PrReviewPhaseBadge.vue +7 -7
  210. package/app/components/prReview/PrReviewWindow.vue +75 -77
  211. package/app/components/providers/AiPresetMismatchDialog.vue +5 -5
  212. package/app/components/providers/AiProviderOnboardingModal.vue +9 -9
  213. package/app/components/providers/ApiKeysSection.vue +13 -13
  214. package/app/components/providers/PersonalCredentialModal.vue +2 -2
  215. package/app/components/providers/PersonalSubscriptionSection.vue +10 -10
  216. package/app/components/providers/SignInRequiredNotice.vue +1 -1
  217. package/app/components/providers/VendorCredentialsModal.vue +10 -10
  218. package/app/components/provisioning/ProvisioningLogsDrawer.vue +13 -13
  219. package/app/components/ralph/RalphLoopResultView.vue +28 -30
  220. package/app/components/recurring/RecurrenceEditor.vue +2 -2
  221. package/app/components/requirements/RequirementsReviewWindow.vue +51 -58
  222. package/app/components/riskPolicy/RiskPolicyPicker.vue +12 -15
  223. package/app/components/riskPolicy/RiskPolicyPreview.vue +14 -14
  224. package/app/components/sandbox/SandboxPanel.vue +58 -59
  225. package/app/components/settings/AccountSettingsPanel.vue +1 -1
  226. package/app/components/settings/ApiTokensPanel.vue +10 -10
  227. package/app/components/settings/BudgetSettings.vue +18 -22
  228. package/app/components/settings/CapabilityCredentialsPanel.vue +15 -15
  229. package/app/components/settings/CloudflareHandlerSection.vue +20 -20
  230. package/app/components/settings/ComposeEnvironmentSetupSection.vue +13 -13
  231. package/app/components/settings/ConnectionTestVerdict.vue +3 -3
  232. package/app/components/settings/ConnectionWarnings.vue +1 -1
  233. package/app/components/settings/ConsensusGroupsSection.vue +27 -35
  234. package/app/components/settings/CustomManifestTypeEditor.vue +10 -10
  235. package/app/components/settings/DefaultProvisionTypeSection.vue +6 -6
  236. package/app/components/settings/InfraHandlersConfigurator.vue +24 -22
  237. package/app/components/settings/InfrastructureBackendPicker.vue +6 -6
  238. package/app/components/settings/InfrastructureWindow.vue +5 -5
  239. package/app/components/settings/IssueTrackerPanel.vue +29 -23
  240. package/app/components/settings/KubernetesEngineForm.vue +11 -11
  241. package/app/components/settings/KubernetesEnvironmentForm.vue +4 -4
  242. package/app/components/settings/LocalContainerPoolSettings.vue +6 -11
  243. package/app/components/settings/LocalModelEndpointsPanel.vue +20 -18
  244. package/app/components/settings/McpAuthorizeScreen.vue +13 -15
  245. package/app/components/settings/McpOAuthCallbackScreen.vue +16 -10
  246. package/app/components/settings/MergeClassRulesEditor.vue +6 -9
  247. package/app/components/settings/MergeRolePolicyEditor.vue +16 -16
  248. package/app/components/settings/ModelConfigurationPanel.vue +23 -30
  249. package/app/components/settings/ModelPresetHealthModal.vue +15 -13
  250. package/app/components/settings/ObservabilityConnectionPanel.vue +4 -4
  251. package/app/components/settings/OpenRouterCatalogPanel.vue +23 -19
  252. package/app/components/settings/PackageRegistriesPanel.vue +8 -8
  253. package/app/components/settings/ProviderConnectionTab.vue +8 -11
  254. package/app/components/settings/ProviderManifestEditor.vue +9 -9
  255. package/app/components/settings/ProviderPreferenceEditor.vue +8 -8
  256. package/app/components/settings/RiskPolicyCreateForm.vue +10 -10
  257. package/app/components/settings/RiskPolicyEditorRow.vue +14 -14
  258. package/app/components/settings/RiskPolicyHealthModal.vue +15 -13
  259. package/app/components/settings/RiskPolicyInheritedRow.vue +1 -1
  260. package/app/components/settings/RiskPolicyPanel.vue +10 -15
  261. package/app/components/settings/ServiceFragmentDefaultsPanel.vue +7 -7
  262. package/app/components/settings/SharedStacksPanel.vue +9 -12
  263. package/app/components/settings/TaskSourceCard.vue +4 -4
  264. package/app/components/settings/TaskTypeSuppressionsPanel.vue +6 -6
  265. package/app/components/settings/ToolServerChecklist.vue +36 -29
  266. package/app/components/settings/UsageSettings.vue +15 -15
  267. package/app/components/settings/UserSecretsSection.vue +9 -12
  268. package/app/components/settings/WorkspaceMetadataSettings.vue +5 -5
  269. package/app/components/settings/WorkspaceSettingsPanel.vue +47 -47
  270. package/app/components/skills/ReviewSkillQueue.vue +10 -10
  271. package/app/components/skills/SkillLibraryManager.vue +23 -20
  272. package/app/components/slack/SlackPanel.vue +13 -17
  273. package/app/components/spec/ServiceSpecWindow.vue +45 -42
  274. package/app/components/tasks/BugHuntModal.vue +24 -27
  275. package/app/components/tasks/ContextIssuePicker.vue +11 -11
  276. package/app/components/tasks/TaskContextIssues.vue +3 -3
  277. package/app/components/tasks/TaskImportModal.vue +7 -7
  278. package/app/components/tasks/TaskSourceConnectModal.vue +10 -8
  279. package/app/components/testing/TestReportWindow.vue +99 -82
  280. package/app/components/theme/ThemeImportModal.vue +115 -0
  281. package/app/components/tutorial/TutorialCatalogue.vue +9 -9
  282. package/app/components/tutorial/TutorialNudge.vue +5 -5
  283. package/app/components/tutorial/TutorialOverlay.vue +12 -12
  284. package/app/components/tutorial/TutorialPrompt.vue +6 -9
  285. package/app/components/vcs/GitLabConnect.vue +4 -4
  286. package/app/components/vcs/VcsConnectSurfaces.vue +2 -2
  287. package/app/components/visualConfirm/VisualConfirmationWindow.vue +36 -36
  288. package/app/composables/api/client.ts +6 -1
  289. package/app/composables/usePipelineErrorToast.ts +17 -0
  290. package/app/modular/agent-kinds.ts +24 -0
  291. package/app/pages/index.vue +5 -5
  292. package/app/plugins/theme.client.ts +125 -0
  293. package/app/spa-loading-template.html +52 -14
  294. package/app/stores/agents.ts +1 -1
  295. package/app/stores/theme.spec.ts +56 -0
  296. package/app/stores/theme.ts +87 -0
  297. package/app/types/domain.ts +19 -0
  298. package/app/types/execution.ts +4 -0
  299. package/app/utils/agentOutput.ts +1 -1
  300. package/app/utils/binaryOutput.ts +6 -6
  301. package/app/utils/bootstrapSteps.ts +14 -14
  302. package/app/utils/catalog.ts +87 -83
  303. package/app/utils/colorTint.ts +10 -0
  304. package/app/utils/failureKinds.ts +1 -0
  305. package/app/utils/observability.ts +3 -3
  306. package/app/utils/pipelineRender.ts +13 -17
  307. package/app/utils/swimlanes.ts +4 -4
  308. package/app/utils/theme/bootPalette.spec.ts +54 -0
  309. package/app/utils/theme/bootPalette.ts +108 -0
  310. package/app/utils/theme/builtins.spec.ts +38 -0
  311. package/app/utils/theme/builtins.ts +55 -0
  312. package/app/utils/theme/css.ts +162 -0
  313. package/app/utils/theme/doc.ts +353 -0
  314. package/app/utils/theme/link.ts +93 -0
  315. package/app/utils/theme/presets.ts +509 -0
  316. package/app/utils/theme/theme.spec.ts +224 -0
  317. package/i18n/locales/de.json +61 -4
  318. package/i18n/locales/en.json +70 -4
  319. package/i18n/locales/es.json +61 -4
  320. package/i18n/locales/fr.json +61 -4
  321. package/i18n/locales/he.json +61 -4
  322. package/i18n/locales/it.json +61 -4
  323. package/i18n/locales/ja.json +61 -4
  324. package/i18n/locales/pl.json +61 -4
  325. package/i18n/locales/tr.json +61 -4
  326. package/i18n/locales/uk.json +61 -4
  327. package/nuxt.config.ts +37 -11
  328. package/package.json +10 -9
@@ -298,7 +298,7 @@ async function resolveExceeded(choice: 'extra-round' | 'proceed' | 'stop-reset')
298
298
  <ResultWindowShell
299
299
  :open="open"
300
300
  icon="i-lucide-bug"
301
- icon-class="bg-indigo-500/15 text-indigo-300"
301
+ icon-class="bg-primary/15 text-primary"
302
302
  :title="t('clarity.title')"
303
303
  :subtitle="block?.title"
304
304
  variant="centered"
@@ -314,14 +314,14 @@ async function resolveExceeded(choice: 'extra-round' | 'proceed' | 'stop-reset')
314
314
  <div class="flex min-h-0 flex-1 flex-col lg:flex-row">
315
315
  <!-- main column -->
316
316
  <div class="min-w-0 flex-1 overflow-y-auto px-6 py-5">
317
- <p class="mb-4 text-sm text-slate-400">
317
+ <p class="mb-4 text-sm text-muted">
318
318
  <i18n-t keypath="clarity.intro" tag="span" scope="global">
319
319
  <template #level>{{ block?.level ?? t('clarity.itemFallback') }}</template>
320
320
  <template #answer
321
- ><span class="text-slate-300">{{ t('clarity.introAnswer') }}</span></template
321
+ ><span class="text-toned">{{ t('clarity.introAnswer') }}</span></template
322
322
  >
323
323
  <template #dismiss
324
- ><span class="text-slate-300">{{ t('clarity.introDismiss') }}</span></template
324
+ ><span class="text-toned">{{ t('clarity.introDismiss') }}</span></template
325
325
  >
326
326
  </i18n-t>
327
327
  </p>
@@ -330,7 +330,7 @@ async function resolveExceeded(choice: 'extra-round' | 'proceed' | 'stop-reset')
330
330
  gate step, so there's nothing to do here until then -->
331
331
  <div
332
332
  v-if="!review && !busy && !loading"
333
- class="rounded-lg border border-dashed border-slate-700 p-8 text-center text-sm text-slate-500"
333
+ class="rounded-lg border border-dashed border-muted p-8 text-center text-sm text-dimmed"
334
334
  >
335
335
  {{ t('clarity.empty') }}
336
336
  </div>
@@ -338,7 +338,7 @@ async function resolveExceeded(choice: 'extra-round' | 'proceed' | 'stop-reset')
338
338
  <!-- working state (initial fetch on open, or a reviewer pass running) -->
339
339
  <div
340
340
  v-else-if="(busy || loading) && !review"
341
- class="flex items-center justify-center gap-2 p-8 text-sm text-slate-400"
341
+ class="flex items-center justify-center gap-2 p-8 text-sm text-muted"
342
342
  >
343
343
  <UIcon name="i-lucide-loader-circle" class="h-4 w-4 animate-spin" />
344
344
  {{ loading && !busy ? t('clarity.loadingReview') : t('clarity.triaging') }}
@@ -348,7 +348,7 @@ async function resolveExceeded(choice: 'extra-round' | 'proceed' | 'stop-reset')
348
348
  <!-- converged: reviewer satisfied -->
349
349
  <div
350
350
  v-if="incorporated"
351
- 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"
351
+ 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"
352
352
  >
353
353
  <UIcon name="i-lucide-circle-check" class="h-5 w-5 shrink-0" />
354
354
  {{ t('clarity.converged') }}
@@ -368,7 +368,7 @@ async function resolveExceeded(choice: 'extra-round' | 'proceed' | 'stop-reset')
368
368
  the human can see which of the two LLM calls is currently in progress. -->
369
369
  <div
370
370
  v-else-if="working"
371
- class="mb-4 flex items-center gap-2 rounded-lg border border-indigo-900/60 bg-indigo-950/30 p-4 text-sm text-indigo-200"
371
+ class="mb-4 flex items-center gap-2 rounded-lg border border-primary/60 bg-primary/10 p-4 text-sm text-primary"
372
372
  >
373
373
  <UIcon name="i-lucide-loader-circle" class="h-5 w-5 shrink-0 animate-spin" />
374
374
  <span v-if="incorporating">
@@ -384,17 +384,17 @@ async function resolveExceeded(choice: 'extra-round' | 'proceed' | 'stop-reset')
384
384
  <div
385
385
  v-for="item in sortedItems"
386
386
  :key="item.id"
387
- class="rounded-lg border border-slate-800 bg-slate-900/60 p-3"
387
+ class="rounded-lg border border-default bg-default/60 p-3"
388
388
  :class="{ 'opacity-60': item.status === 'dismissed' }"
389
389
  >
390
390
  <div class="flex items-start gap-2">
391
391
  <UIcon
392
392
  :name="CATEGORY_ICON[item.category]"
393
- class="mt-0.5 h-4 w-4 shrink-0 text-slate-400"
393
+ class="mt-0.5 h-4 w-4 shrink-0 text-muted"
394
394
  />
395
395
  <div class="min-w-0 flex-1">
396
396
  <div class="flex flex-wrap items-center gap-1.5">
397
- <span class="text-sm font-medium text-white">{{ item.title }}</span>
397
+ <span class="text-sm font-medium text-highlighted">{{ item.title }}</span>
398
398
  <UBadge size="xs" variant="subtle" :color="SEVERITY_COLOR[item.severity]">
399
399
  {{ t(SEVERITY_LABELS[item.severity]) }}
400
400
  </UBadge>
@@ -414,7 +414,7 @@ async function resolveExceeded(choice: 'extra-round' | 'proceed' | 'stop-reset')
414
414
  card around it takes the span (see the shell's `width` prop: the unit is the
415
415
  paragraph, not the section). The badge row above and the answer control
416
416
  below are what the full width is actually for. -->
417
- <p class="mt-1 max-w-3xl whitespace-pre-line text-sm text-slate-400">
417
+ <p class="mt-1 max-w-3xl whitespace-pre-line text-sm text-muted">
418
418
  {{ item.detail }}
419
419
  </p>
420
420
 
@@ -422,9 +422,9 @@ async function resolveExceeded(choice: 'extra-round' | 'proceed' | 'stop-reset')
422
422
  the answer lives in the textarea below, seeded from the reply) -->
423
423
  <div
424
424
  v-if="item.reply && item.status !== 'open' && item.status !== 'answered'"
425
- 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"
425
+ 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"
426
426
  >
427
- <span class="text-[10px] uppercase tracking-wide text-slate-500">
427
+ <span class="text-[10px] uppercase tracking-wide text-dimmed">
428
428
  {{ t('clarity.answerLabel') }}
429
429
  </span>
430
430
  <p class="whitespace-pre-line">{{ item.reply }}</p>
@@ -479,8 +479,8 @@ async function resolveExceeded(choice: 'extra-round' | 'proceed' | 'stop-reset')
479
479
  </div>
480
480
 
481
481
  <!-- clarified document: the standard-format bug report -->
482
- <section v-if="outline" class="mt-6 border-t border-slate-800 pt-5">
483
- <div class="mb-3 flex items-center gap-1.5 text-[11px] text-emerald-400">
482
+ <section v-if="outline" class="mt-6 border-t border-default pt-5">
483
+ <div class="mb-3 flex items-center gap-1.5 text-[11px] text-app-success-400">
484
484
  <UIcon name="i-lucide-file-check-2" class="h-3.5 w-3.5" />
485
485
  <span class="font-semibold uppercase tracking-wide">
486
486
  {{ incorporated ? t('clarity.docHeading') : t('clarity.docHeadingDraft') }}
@@ -497,18 +497,18 @@ async function resolveExceeded(choice: 'extra-round' | 'proceed' | 'stop-reset')
497
497
  >
498
498
  <UIcon
499
499
  name="i-lucide-chevron-right"
500
- class="h-3.5 w-3.5 shrink-0 text-slate-500 transition-transform"
500
+ class="h-3.5 w-3.5 shrink-0 text-dimmed transition-transform"
501
501
  :class="collapsed[s.id] ? '' : 'rotate-90'"
502
502
  />
503
503
  <span
504
- class="font-semibold text-white"
504
+ class="font-semibold text-highlighted"
505
505
  :class="s.depth <= 1 ? 'text-base' : s.depth === 2 ? 'text-sm' : 'text-xs'"
506
506
  v-html="s.titleHtml"
507
507
  />
508
508
  </button>
509
509
  <div
510
510
  v-show="!s.title || !collapsed[s.id]"
511
- class="reader-prose mt-1 ps-5.5 text-[13px] leading-relaxed text-slate-300"
511
+ class="reader-prose mt-1 ps-5.5 text-[13px] leading-relaxed text-toned"
512
512
  v-html="s.bodyHtml"
513
513
  />
514
514
  </div>
@@ -521,32 +521,32 @@ async function resolveExceeded(choice: 'extra-round' | 'proceed' | 'stop-reset')
521
521
  tablet, UX-32). The informational stats collapse away below `lg` to keep the
522
522
  bottom bar compact; the actions themselves always show. -->
523
523
  <aside
524
- class="flex w-full shrink-0 flex-col border-t border-slate-800 lg:w-72 lg:border-s lg:border-t-0"
524
+ class="flex w-full shrink-0 flex-col border-t border-default lg:w-72 lg:border-s lg:border-t-0"
525
525
  >
526
526
  <div class="flex flex-col gap-4 px-4 py-5">
527
- <div v-if="review" class="hidden space-y-2 text-xs text-slate-400 lg:block">
527
+ <div v-if="review" class="hidden space-y-2 text-xs text-muted lg:block">
528
528
  <div class="flex items-center justify-between">
529
529
  <span>{{ t('clarity.rail.findings') }}</span>
530
- <span class="text-slate-300">{{ review.items.length }}</span>
530
+ <span class="text-toned">{{ review.items.length }}</span>
531
531
  </div>
532
532
  <div class="flex items-center justify-between">
533
533
  <span>{{ t('clarity.rail.open') }}</span>
534
- <span class="text-slate-300">{{ openCount }}</span>
534
+ <span class="text-toned">{{ openCount }}</span>
535
535
  </div>
536
536
  <div class="flex items-center justify-between">
537
537
  <span>{{ t('clarity.rail.answered') }}</span>
538
- <span class="text-slate-300">{{ answeredCount }}</span>
538
+ <span class="text-toned">{{ answeredCount }}</span>
539
539
  </div>
540
540
  <div v-if="review.model" class="flex items-center justify-between">
541
541
  <span>{{ t('clarity.rail.model') }}</span>
542
- <span class="truncate ps-2 text-slate-500">{{
542
+ <span class="truncate ps-2 text-dimmed">{{
543
543
  models.labelForRef(review.model) ?? review.model
544
544
  }}</span>
545
545
  </div>
546
546
  </div>
547
547
 
548
548
  <!-- action: ready (answer → incorporate / proceed) -->
549
- <div v-if="review && status === 'ready'" class="space-y-2 border-t border-slate-800 pt-4">
549
+ <div v-if="review && status === 'ready'" class="space-y-2 border-t border-default pt-4">
550
550
  <UButton
551
551
  v-if="canProceed"
552
552
  color="primary"
@@ -574,7 +574,7 @@ async function resolveExceeded(choice: 'extra-round' | 'proceed' | 'stop-reset')
574
574
  >
575
575
  {{ t('clarity.incorporateAnswers') }}
576
576
  </UButton>
577
- <p class="text-[11px] leading-relaxed text-slate-500">
577
+ <p class="text-[11px] leading-relaxed text-dimmed">
578
578
  <template v-if="canProceed">
579
579
  {{ t('clarity.hint.proceed') }}
580
580
  </template>
@@ -586,7 +586,7 @@ async function resolveExceeded(choice: 'extra-round' | 'proceed' | 'stop-reset')
586
586
  </div>
587
587
 
588
588
  <!-- action: merged (inspect → re-review / redo) -->
589
- <div v-if="review && merged" class="space-y-2 border-t border-slate-800 pt-4">
589
+ <div v-if="review && merged" class="space-y-2 border-t border-default pt-4">
590
590
  <UButton
591
591
  color="primary"
592
592
  size="sm"
@@ -636,14 +636,14 @@ async function resolveExceeded(choice: 'extra-round' | 'proceed' | 'stop-reset')
636
636
  {{ t('clarity.redoWithDirection') }}
637
637
  </UButton>
638
638
  </div>
639
- <p class="text-[11px] leading-relaxed text-slate-500">
639
+ <p class="text-[11px] leading-relaxed text-dimmed">
640
640
  {{ t('clarity.redoHint') }}
641
641
  </p>
642
642
  </div>
643
643
 
644
644
  <div
645
645
  v-if="review && incorporated"
646
- class="border-t border-slate-800 pt-4 text-[11px] leading-relaxed text-slate-500"
646
+ class="border-t border-default pt-4 text-[11px] leading-relaxed text-dimmed"
647
647
  >
648
648
  {{ t('clarity.incorporatedFooter') }}
649
649
  </div>
@@ -11,15 +11,15 @@ function reload() {
11
11
  <template>
12
12
  <div
13
13
  data-testid="async-view-error"
14
- class="fixed inset-0 z-50 grid place-items-center bg-slate-950/80 p-6 backdrop-blur-sm"
14
+ class="fixed inset-0 z-50 grid place-items-center bg-app-950/80 p-6 backdrop-blur-sm"
15
15
  role="alert"
16
16
  >
17
- <div class="max-w-sm rounded-2xl border border-slate-700 bg-slate-900 p-5 shadow-2xl">
18
- <div class="flex items-center gap-2 text-sm font-semibold text-slate-100">
19
- <UIcon name="i-lucide-unplug" class="h-4 w-4 shrink-0 text-amber-400" />
17
+ <div class="max-w-sm rounded-2xl border border-muted bg-default p-5 shadow-2xl">
18
+ <div class="flex items-center gap-2 text-sm font-semibold text-app-100">
19
+ <UIcon name="i-lucide-unplug" class="h-4 w-4 shrink-0 text-app-warning-400" />
20
20
  {{ t('errors.asyncView.title') }}
21
21
  </div>
22
- <p class="mt-2 text-[12px] leading-relaxed text-slate-400">
22
+ <p class="mt-2 text-[12px] leading-relaxed text-muted">
23
23
  {{ t('errors.asyncView.body') }}
24
24
  </p>
25
25
  <UButton class="mt-4" color="primary" variant="soft" size="xs" @click="reload">
@@ -49,21 +49,18 @@ const draft = computed({
49
49
  </script>
50
50
 
51
51
  <template>
52
- <div
53
- class="rounded-lg border border-slate-800 bg-slate-950/40 p-3"
54
- data-testid="clarification-item"
55
- >
52
+ <div class="rounded-lg border border-default bg-app-950/40 p-3" data-testid="clarification-item">
56
53
  <div class="flex items-start justify-between gap-2">
57
- <p class="text-[13px] font-medium text-slate-200">{{ prompt }}</p>
54
+ <p class="text-[13px] font-medium text-default">{{ prompt }}</p>
58
55
  <slot name="badges" />
59
56
  </div>
60
- <p v-if="detail" class="mt-1 whitespace-pre-wrap text-[12px] leading-relaxed text-slate-400">
57
+ <p v-if="detail" class="mt-1 whitespace-pre-wrap text-[12px] leading-relaxed text-muted">
61
58
  {{ detail }}
62
59
  </p>
63
60
 
64
61
  <!-- dismissed: a "not relevant" chip + reopen -->
65
62
  <div v-if="dismissed" class="mt-2 flex items-center justify-between gap-2">
66
- <span class="inline-flex items-center gap-1 text-[11px] text-slate-500">
63
+ <span class="inline-flex items-center gap-1 text-[11px] text-dimmed">
67
64
  <UIcon name="i-lucide-x" class="h-3.5 w-3.5" />{{ t('clarification.dismissed') }}
68
65
  </span>
69
66
  <UButton
@@ -82,7 +79,7 @@ const draft = computed({
82
79
  <!-- a recommendation is being requested/generated: a working chip, no answer box -->
83
80
  <div
84
81
  v-else-if="requested"
85
- class="mt-2 inline-flex items-center gap-1 text-[11px] text-indigo-300"
82
+ class="mt-2 inline-flex items-center gap-1 text-[11px] text-primary"
86
83
  data-testid="clarification-requested"
87
84
  >
88
85
  <UIcon name="i-lucide-loader-circle" class="h-3.5 w-3.5 animate-spin" />
@@ -131,15 +128,13 @@ const draft = computed({
131
128
  <!-- inline AI suggestion + "use this answer" -->
132
129
  <div
133
130
  v-if="recommendation"
134
- class="mt-2 rounded-md border border-indigo-800/50 bg-indigo-950/30 p-2"
131
+ class="mt-2 rounded-md border border-primary/50 bg-primary/10 p-2"
135
132
  data-testid="clarification-recommendation"
136
133
  >
137
- <div
138
- class="mb-1 flex items-center gap-1 text-[10px] uppercase tracking-wide text-indigo-300"
139
- >
134
+ <div class="mb-1 flex items-center gap-1 text-[10px] uppercase tracking-wide text-primary">
140
135
  <UIcon name="i-lucide-wand-2" class="h-3 w-3" />{{ t('clarification.suggestion') }}
141
136
  </div>
142
- <p class="whitespace-pre-wrap text-[12px] text-slate-200">{{ recommendation }}</p>
137
+ <p class="whitespace-pre-wrap text-[12px] text-default">{{ recommendation }}</p>
143
138
  <UButton
144
139
  class="mt-1.5"
145
140
  size="xs"
@@ -60,11 +60,13 @@ const isDestructive = computed(() => current.value?.variant === 'destructive')
60
60
  <div
61
61
  v-if="current?.icon"
62
62
  class="flex h-9 w-9 shrink-0 items-center justify-center rounded-lg"
63
- :class="isDestructive ? 'bg-red-500/10 text-red-400' : 'bg-slate-700/40 text-slate-300'"
63
+ :class="
64
+ isDestructive ? 'bg-app-error-500/10 text-app-error-400' : 'bg-accented/40 text-toned'
65
+ "
64
66
  >
65
67
  <UIcon :name="current.icon" class="h-5 w-5" />
66
68
  </div>
67
- <p v-if="current?.description" class="text-sm text-slate-300">
69
+ <p v-if="current?.description" class="text-sm text-toned">
68
70
  {{ current.description }}
69
71
  </p>
70
72
  </div>
@@ -112,7 +112,7 @@ function selectItems(field: DescriptorField) {
112
112
  testid that would have to be slugified to be selectable. -->
113
113
  <p
114
114
  v-if="caption"
115
- class="-mb-1 text-[11px] font-semibold uppercase tracking-wide text-slate-400"
115
+ class="-mb-1 text-[11px] font-semibold uppercase tracking-wide text-muted"
116
116
  :class="{ 'pt-2': startsGroup }"
117
117
  :data-testid="`${testidPrefix}-section`"
118
118
  >
@@ -17,12 +17,12 @@ withDefaults(
17
17
 
18
18
  <template>
19
19
  <div
20
- class="flex flex-col items-center justify-center text-center text-slate-500"
20
+ class="flex flex-col items-center justify-center text-center text-dimmed"
21
21
  :class="compact ? 'gap-1 py-4' : 'gap-2 py-10'"
22
22
  data-testid="empty-state"
23
23
  >
24
- <UIcon :name="icon" :class="compact ? 'h-5 w-5' : 'h-8 w-8'" class="text-slate-600" />
25
- <p :class="compact ? 'text-xs' : 'text-sm'" class="font-medium text-slate-400">
24
+ <UIcon :name="icon" :class="compact ? 'h-5 w-5' : 'h-8 w-8'" class="text-app-600" />
25
+ <p :class="compact ? 'text-xs' : 'text-sm'" class="font-medium text-muted">
26
26
  {{ title }}
27
27
  </p>
28
28
  <p v-if="description" :class="compact ? 'text-[11px]' : 'text-xs'" class="max-w-xs">
@@ -21,19 +21,19 @@ defineProps<{
21
21
  <template>
22
22
  <div
23
23
  v-if="variant === 'working'"
24
- class="flex flex-col items-center gap-2 rounded-lg border border-slate-800 bg-slate-950/40 p-6 text-center"
24
+ class="flex flex-col items-center gap-2 rounded-lg border border-default bg-app-950/40 p-6 text-center"
25
25
  :data-testid="testid"
26
26
  >
27
- <UIcon name="i-lucide-loader-circle" class="h-5 w-5 animate-spin text-indigo-300" />
28
- <p class="text-[13px] text-slate-200">{{ title }}</p>
29
- <p class="text-[12px] text-slate-400">{{ hint }}</p>
27
+ <UIcon name="i-lucide-loader-circle" class="h-5 w-5 animate-spin text-primary" />
28
+ <p class="text-[13px] text-default">{{ title }}</p>
29
+ <p class="text-[12px] text-muted">{{ hint }}</p>
30
30
  </div>
31
31
  <div
32
32
  v-else
33
- class="rounded-lg border border-red-900/60 bg-red-950/20 p-4 text-center"
33
+ class="rounded-lg border border-app-error-900/60 bg-app-error-950/20 p-4 text-center"
34
34
  :data-testid="testid"
35
35
  >
36
- <p class="text-[13px] text-red-200">{{ title }}</p>
37
- <p class="mt-1 text-[12px] text-slate-400">{{ hint }}</p>
36
+ <p class="text-[13px] text-app-error-200">{{ title }}</p>
37
+ <p class="mt-1 text-[12px] text-muted">{{ hint }}</p>
38
38
  </div>
39
39
  </template>
@@ -37,7 +37,7 @@ const shortcuts = computed(() => [
37
37
  :key="i"
38
38
  class="flex items-center justify-between gap-4 rounded-md px-1 py-1.5"
39
39
  >
40
- <dt class="text-sm text-slate-300">{{ s.label }}</dt>
40
+ <dt class="text-sm text-toned">{{ s.label }}</dt>
41
41
  <dd class="flex shrink-0 items-center gap-1">
42
42
  <UKbd v-for="k in s.keys" :key="k" :value="k" />
43
43
  </dd>
@@ -22,7 +22,8 @@ const html = computed(() => renderMarkdown(props.text))
22
22
 
23
23
  <style scoped>
24
24
  /* Prose styling for the sanitized markdown injected via v-html (out of scoped reach
25
- without :deep), mirroring the inspector reader's prose styling. */
25
+ without :deep), mirroring the reader's `prose.css` token for token so both flip with the
26
+ theme and the mode. */
26
27
  .cf-prose :deep(p) {
27
28
  margin: 0.5rem 0;
28
29
  }
@@ -48,36 +49,36 @@ const html = computed(() => renderMarkdown(props.text))
48
49
  }
49
50
  .cf-prose :deep(strong) {
50
51
  font-weight: 600;
51
- color: rgb(226 232 240);
52
+ color: var(--ui-text-highlighted);
52
53
  }
53
54
  .cf-prose :deep(em) {
54
55
  font-style: italic;
55
56
  }
56
57
  .cf-prose :deep(code) {
57
58
  border-radius: 0.25rem;
58
- background: rgb(30 41 59 / 0.8);
59
+ background: var(--ui-bg-elevated);
59
60
  padding: 0.1rem 0.3rem;
60
- font-family: ui-monospace, monospace;
61
+ font-family: var(--font-mono);
61
62
  font-size: 0.85em;
62
- color: rgb(199 210 254);
63
+ color: var(--ui-primary);
63
64
  }
64
65
  .cf-prose :deep(pre) {
65
66
  margin: 0.6rem 0;
66
67
  overflow: auto;
67
68
  border-radius: 0.5rem;
68
- background: rgb(2 6 23 / 0.6);
69
+ background: var(--app-bg-canvas);
69
70
  padding: 0.75rem 0.9rem;
70
71
  }
71
72
  .cf-prose :deep(pre code) {
72
73
  background: transparent;
73
74
  padding: 0;
74
- color: rgb(203 213 225);
75
+ color: var(--ui-text-toned);
75
76
  }
76
77
  .cf-prose :deep(blockquote) {
77
78
  margin: 0.6rem 0;
78
- border-left: 3px solid rgb(99 102 241 / 0.5);
79
+ border-left: 3px solid color-mix(in srgb, var(--ui-primary) 50%, transparent);
79
80
  padding-left: 0.75rem;
80
- color: rgb(148 163 184);
81
+ color: var(--ui-text-muted);
81
82
  }
82
83
  .cf-prose :deep(h1),
83
84
  .cf-prose :deep(h2),
@@ -85,7 +86,7 @@ const html = computed(() => renderMarkdown(props.text))
85
86
  .cf-prose :deep(h4) {
86
87
  margin: 0.7rem 0 0.4rem;
87
88
  font-weight: 600;
88
- color: rgb(226 232 240);
89
+ color: var(--ui-text-highlighted);
89
90
  }
90
91
  .cf-prose :deep(table) {
91
92
  margin: 0.6rem 0;
@@ -94,16 +95,16 @@ const html = computed(() => renderMarkdown(props.text))
94
95
  }
95
96
  .cf-prose :deep(th),
96
97
  .cf-prose :deep(td) {
97
- border: 1px solid rgb(51 65 85);
98
+ border: 1px solid var(--ui-border-muted);
98
99
  padding: 0.3rem 0.6rem;
99
100
  }
100
101
  .cf-prose :deep(th) {
101
- background: rgb(30 41 59 / 0.6);
102
+ background: var(--ui-bg-elevated);
102
103
  font-weight: 600;
103
104
  }
104
105
  .cf-prose :deep(hr) {
105
106
  margin: 1rem 0;
106
107
  border: none;
107
- border-top: 1px solid rgb(51 65 85);
108
+ border-top: 1px solid var(--ui-border-muted);
108
109
  }
109
110
  </style>
@@ -68,10 +68,10 @@ const STATUS_LABEL_KEYS: Record<string, string> = {
68
68
  failed: 'consensus.status.failed',
69
69
  }
70
70
  const STATUS_CLASS: Record<string, string> = {
71
- running: 'bg-sky-500/15 text-sky-300',
72
- synthesizing: 'bg-indigo-500/15 text-indigo-300',
73
- done: 'bg-emerald-500/15 text-emerald-300',
74
- failed: 'bg-rose-500/15 text-rose-300',
71
+ running: 'bg-app-info-500/15 text-app-info-300',
72
+ synthesizing: 'bg-primary/15 text-primary',
73
+ done: 'bg-app-success-500/15 text-app-success-300',
74
+ failed: 'bg-app-error-500/15 text-app-error-300',
75
75
  }
76
76
 
77
77
  function strategyLabel(strategy: string): string {
@@ -116,7 +116,7 @@ function topScore(c: ConsensusContribution): { label: string; value: number } |
116
116
  <ResultWindowShell
117
117
  :open="open"
118
118
  icon="i-lucide-users-round"
119
- icon-class="bg-amber-500/15 text-amber-300"
119
+ icon-class="bg-app-warning-500/15 text-app-warning-300"
120
120
  :title="headerTitle"
121
121
  :subtitle="headerSubtitle"
122
122
  variant="centered"
@@ -130,31 +130,31 @@ function topScore(c: ConsensusContribution): { label: string; value: number } |
130
130
  this task" has the transcript but not the reason. -->
131
131
  <span
132
132
  v-if="session.groupName"
133
- class="rounded-full bg-emerald-900/50 px-2.5 py-1 text-xs font-medium text-emerald-200"
133
+ class="rounded-full bg-app-success-900/50 px-2.5 py-1 text-xs font-medium text-app-success-200"
134
134
  :title="t('consensus.groupTitle')"
135
135
  >
136
136
  {{ session.groupName }}
137
137
  </span>
138
138
  <span
139
139
  class="rounded-full px-2.5 py-1 text-xs font-medium"
140
- :class="STATUS_CLASS[session.status] ?? 'bg-slate-700 text-slate-300'"
140
+ :class="STATUS_CLASS[session.status] ?? 'bg-accented text-toned'"
141
141
  >
142
142
  {{ statusLabel(session.status) }}
143
143
  </span>
144
144
  </template>
145
145
 
146
146
  <div class="flex-1 overflow-y-auto px-6 py-5">
147
- <div v-if="loading && !session" class="py-16 text-center text-sm text-slate-500">
147
+ <div v-if="loading && !session" class="py-16 text-center text-sm text-dimmed">
148
148
  {{ t('consensus.loading') }}
149
149
  </div>
150
- <div v-else-if="!session" class="py-16 text-center text-sm text-slate-500">
150
+ <div v-else-if="!session" class="py-16 text-center text-sm text-dimmed">
151
151
  {{ t('consensus.empty') }}
152
152
  </div>
153
153
  <template v-else>
154
154
  <!-- failure -->
155
155
  <div
156
156
  v-if="session.status === 'failed'"
157
- class="mb-5 flex items-start gap-2 rounded-lg border border-rose-800/60 bg-rose-950/40 px-4 py-3 text-sm text-rose-200"
157
+ class="mb-5 flex items-start gap-2 rounded-lg border border-app-error-800/60 bg-app-error-950/40 px-4 py-3 text-sm text-app-error-200"
158
158
  >
159
159
  <span class="min-w-0 flex-1">{{
160
160
  t('consensus.failed', { error: session.error ?? t('consensus.unknownError') })
@@ -165,25 +165,25 @@ function topScore(c: ConsensusContribution): { label: string; value: number } |
165
165
  <!-- synthesized result -->
166
166
  <section v-if="session.synthesis" class="mb-6">
167
167
  <div class="mb-2 flex items-center gap-2">
168
- <h3 class="text-xs font-semibold uppercase tracking-wide text-slate-400">
168
+ <h3 class="text-xs font-semibold uppercase tracking-wide text-muted">
169
169
  {{ t('consensus.synthesizedResult') }}
170
170
  </h3>
171
171
  <span
172
172
  v-if="session.confidence != null"
173
- class="rounded bg-emerald-500/15 px-1.5 py-0.5 text-xs text-emerald-300"
173
+ class="rounded bg-app-success-500/15 px-1.5 py-0.5 text-xs text-app-success-300"
174
174
  >{{ t('consensus.confidence', { pct: pct(session.confidence) }) }}</span
175
175
  >
176
176
  <CopyButton :text="session.synthesis" class="ms-auto -my-1" />
177
177
  </div>
178
178
  <MarkdownProse
179
179
  :text="session.synthesis"
180
- class="rounded-lg border border-slate-800 bg-slate-950/60 px-4 py-3 text-sm text-slate-200"
180
+ class="rounded-lg border border-default bg-app-950/60 px-4 py-3 text-sm text-default"
181
181
  />
182
182
  <ul v-if="session.dissent?.length" class="mt-2 space-y-1">
183
183
  <li
184
184
  v-for="(d, i) in session.dissent"
185
185
  :key="i"
186
- class="flex items-start gap-2 text-xs text-amber-300/90"
186
+ class="flex items-start gap-2 text-xs text-app-warning-300/90"
187
187
  >
188
188
  <UIcon name="i-lucide-triangle-alert" class="mt-0.5 h-3.5 w-3.5 shrink-0" />
189
189
  <span>{{ d }}</span>
@@ -193,20 +193,20 @@ function topScore(c: ConsensusContribution): { label: string; value: number } |
193
193
 
194
194
  <!-- participants -->
195
195
  <section class="mb-6">
196
- <h3 class="mb-2 text-xs font-semibold uppercase tracking-wide text-slate-400">
196
+ <h3 class="mb-2 text-xs font-semibold uppercase tracking-wide text-muted">
197
197
  {{ t('consensus.panel') }}
198
198
  </h3>
199
199
  <div class="flex flex-wrap gap-2">
200
200
  <div
201
201
  v-for="(p, i) in session.participants"
202
202
  :key="p.id"
203
- class="rounded-lg border border-slate-800 bg-slate-950/40 px-3 py-1.5 text-xs"
203
+ class="rounded-lg border border-default bg-app-950/40 px-3 py-1.5 text-xs"
204
204
  >
205
- <span class="font-medium text-slate-200">{{
205
+ <span class="font-medium text-default">{{
206
206
  t('consensus.expert', { letter: String.fromCharCode(65 + i) })
207
207
  }}</span>
208
- <span class="text-slate-400"> · {{ p.role }}</span>
209
- <span v-if="p.modelId" class="ms-1 text-slate-500"
208
+ <span class="text-muted"> · {{ p.role }}</span>
209
+ <span v-if="p.modelId" class="ms-1 text-dimmed"
210
210
  >({{ models.labelForRef(p.modelId) ?? p.modelId }})</span
211
211
  >
212
212
  </div>
@@ -215,7 +215,7 @@ function topScore(c: ConsensusContribution): { label: string; value: number } |
215
215
 
216
216
  <!-- rounds -->
217
217
  <section v-for="round in session.rounds" :key="round.index" class="mb-5">
218
- <h3 class="mb-2 text-xs font-semibold uppercase tracking-wide text-slate-400">
218
+ <h3 class="mb-2 text-xs font-semibold uppercase tracking-wide text-muted">
219
219
  {{ t('consensus.round.heading', { n: round.index + 1 }) }} ·
220
220
  {{ roundLabel(round.kind) }}
221
221
  </h3>
@@ -223,16 +223,16 @@ function topScore(c: ConsensusContribution): { label: string; value: number } |
223
223
  <div
224
224
  v-for="c in round.contributions"
225
225
  :key="c.participantId"
226
- class="rounded-lg border border-slate-800 bg-slate-950/40 px-4 py-3"
226
+ class="rounded-lg border border-default bg-app-950/40 px-4 py-3"
227
227
  >
228
228
  <div class="mb-1 flex items-center gap-2">
229
- <span class="text-xs font-semibold text-slate-200">{{
229
+ <span class="text-xs font-semibold text-default">{{
230
230
  anonLabel(c.participantId)
231
231
  }}</span>
232
- <span class="text-xs text-slate-500">{{ roleFor(c.participantId) }}</span>
232
+ <span class="text-xs text-dimmed">{{ roleFor(c.participantId) }}</span>
233
233
  <span
234
234
  v-if="topScore(c)"
235
- class="ms-auto rounded bg-slate-800 px-1.5 py-0.5 text-xs text-slate-300"
235
+ class="ms-auto rounded bg-elevated px-1.5 py-0.5 text-xs text-toned"
236
236
  >{{
237
237
  t('consensus.topScore', {
238
238
  label: topScore(c)!.label,
@@ -242,12 +242,12 @@ function topScore(c: ConsensusContribution): { label: string; value: number } |
242
242
  >
243
243
  <CopyButton :text="c.text" :class="topScore(c) ? '-my-1' : 'ms-auto -my-1'" />
244
244
  </div>
245
- <MarkdownProse :text="c.text" class="text-sm text-slate-300" />
245
+ <MarkdownProse :text="c.text" class="text-sm text-toned" />
246
246
  <div v-if="c.scores?.length" class="mt-2 flex flex-wrap gap-1.5">
247
247
  <span
248
248
  v-for="s in c.scores"
249
249
  :key="s.dimension"
250
- class="rounded bg-slate-800/80 px-1.5 py-0.5 text-xs text-slate-400"
250
+ class="rounded bg-elevated/80 px-1.5 py-0.5 text-xs text-muted"
251
251
  >{{ s.dimension }}: {{ pct(s.value) }}</span
252
252
  >
253
253
  </div>