@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
@@ -143,37 +143,37 @@ const STATUS_META = computed<
143
143
  label: t('gates.status.passed'),
144
144
  badge: 'success',
145
145
  icon: 'i-lucide-circle-check',
146
- text: 'text-emerald-300',
146
+ text: 'text-app-success-300',
147
147
  },
148
148
  'gave-up': {
149
149
  label: t('gates.status.gaveUp'),
150
150
  badge: 'error',
151
151
  icon: 'i-lucide-circle-x',
152
- text: 'text-rose-300',
152
+ text: 'text-app-error-300',
153
153
  },
154
154
  fixing: {
155
155
  label: t('gates.status.fixing'),
156
156
  badge: 'warning',
157
157
  icon: 'i-lucide-loader',
158
- text: 'text-amber-300',
158
+ text: 'text-app-warning-300',
159
159
  },
160
160
  failing: {
161
161
  label: t('gates.status.failing'),
162
162
  badge: 'error',
163
163
  icon: 'i-lucide-circle-x',
164
- text: 'text-rose-300',
164
+ text: 'text-app-error-300',
165
165
  },
166
166
  pending: {
167
167
  label: t('gates.status.pending'),
168
168
  badge: 'neutral',
169
169
  icon: 'i-lucide-clock',
170
- text: 'text-slate-300',
170
+ text: 'text-toned',
171
171
  },
172
172
  checking: {
173
173
  label: t('gates.status.checking'),
174
174
  badge: 'neutral',
175
175
  icon: 'i-lucide-loader',
176
- text: 'text-slate-300',
176
+ text: 'text-toned',
177
177
  },
178
178
  }))
179
179
 
@@ -191,7 +191,7 @@ const conflictVerdict = computed(() => {
191
191
  <ResultWindowShell
192
192
  :open="open"
193
193
  :icon="meta.icon"
194
- icon-class="bg-sky-500/15 text-sky-300"
194
+ icon-class="bg-app-info-500/15 text-app-info-300"
195
195
  :title="headerTitle"
196
196
  :subtitle="subtitle"
197
197
  :step-ref="{ instanceId, stepIndex }"
@@ -214,11 +214,11 @@ const conflictVerdict = computed(() => {
214
214
  <div class="min-w-0 flex-1 overflow-y-auto px-5 py-4">
215
215
  <div
216
216
  v-if="!gate"
217
- class="flex h-full flex-col items-center justify-center gap-2 text-center text-slate-400"
217
+ class="flex h-full flex-col items-center justify-center gap-2 text-center text-muted"
218
218
  >
219
219
  <UIcon :name="meta.icon" class="h-8 w-8 opacity-40" />
220
220
  <p class="text-sm">{{ t('gates.noActivity') }}</p>
221
- <p class="max-w-sm text-[11px] text-slate-500">
221
+ <p class="max-w-sm text-[11px] text-dimmed">
222
222
  {{ t('gates.noActivityHint') }}
223
223
  </p>
224
224
  </div>
@@ -227,10 +227,13 @@ const conflictVerdict = computed(() => {
227
227
  <!-- Passed -->
228
228
  <div
229
229
  v-if="status === 'passed'"
230
- class="flex items-start gap-2 rounded-lg border border-emerald-500/30 bg-emerald-500/10 px-3 py-2.5"
230
+ class="flex items-start gap-2 rounded-lg border border-app-success-500/30 bg-app-success-500/10 px-3 py-2.5"
231
231
  >
232
- <UIcon name="i-lucide-circle-check" class="mt-0.5 h-4 w-4 shrink-0 text-emerald-400" />
233
- <p class="text-[13px] leading-relaxed text-emerald-200">
232
+ <UIcon
233
+ name="i-lucide-circle-check"
234
+ class="mt-0.5 h-4 w-4 shrink-0 text-app-success-400"
235
+ />
236
+ <p class="text-[13px] leading-relaxed text-app-success-200">
234
237
  {{ step?.output || (isCi ? t('gates.passedCi') : t('gates.passedConflicts')) }}
235
238
  </p>
236
239
  </div>
@@ -238,10 +241,10 @@ const conflictVerdict = computed(() => {
238
241
  <!-- Human review: approval progress, the feedback being fixed, freeform fix box -->
239
242
  <template v-else-if="isHumanReview">
240
243
  <div
241
- class="flex items-center gap-2 rounded-md border border-slate-800 bg-slate-950/40 px-3 py-2"
244
+ class="flex items-center gap-2 rounded-md border border-default bg-app-950/40 px-3 py-2"
242
245
  >
243
- <UIcon name="i-lucide-users" class="h-4 w-4 shrink-0 text-violet-300" />
244
- <span class="text-[13px] text-slate-200">
246
+ <UIcon name="i-lucide-users" class="h-4 w-4 shrink-0 text-app-secondary-300" />
247
+ <span class="text-[13px] text-default">
245
248
  {{
246
249
  t(
247
250
  'gates.humanReview.approvals',
@@ -260,10 +263,10 @@ const conflictVerdict = computed(() => {
260
263
  </div>
261
264
  <div
262
265
  v-if="gate.lastFailureSummary"
263
- class="relative mt-2 rounded-md border border-slate-800 bg-slate-950/40 px-3 py-2"
266
+ class="relative mt-2 rounded-md border border-default bg-app-950/40 px-3 py-2"
264
267
  >
265
268
  <CopyButton :text="gate.lastFailureSummary" class="absolute end-1 top-1" />
266
- <p class="whitespace-pre-wrap pe-8 text-[12px] leading-relaxed text-slate-300">
269
+ <p class="whitespace-pre-wrap pe-8 text-[12px] leading-relaxed text-toned">
267
270
  {{ gate.lastFailureSummary }}
268
271
  </p>
269
272
  </div>
@@ -272,7 +275,7 @@ const conflictVerdict = computed(() => {
272
275
  :href="prUrl"
273
276
  target="_blank"
274
277
  rel="noopener"
275
- class="mt-2 inline-flex items-center gap-1 text-[12px] text-sky-300 hover:text-sky-200 hover:underline"
278
+ class="mt-2 inline-flex items-center gap-1 text-[12px] text-app-info-300 hover:text-app-info-200 hover:underline"
276
279
  >
277
280
  {{ t('gates.humanReview.reviewPr') }}
278
281
  <UIcon name="i-lucide-external-link" class="h-3 w-3" />
@@ -280,10 +283,10 @@ const conflictVerdict = computed(() => {
280
283
 
281
284
  <!-- Freeform fix request: dispatch the fixer now with these instructions. -->
282
285
  <section v-if="status !== 'gave-up'" class="mt-4">
283
- <h3 class="mb-1.5 text-[11px] font-semibold uppercase tracking-wide text-slate-500">
286
+ <h3 class="mb-1.5 text-[11px] font-semibold uppercase tracking-wide text-dimmed">
284
287
  {{ t('gates.humanReview.requestFixHeading') }}
285
288
  </h3>
286
- <p class="mb-2 text-[11px] leading-relaxed text-slate-500">
289
+ <p class="mb-2 text-[11px] leading-relaxed text-dimmed">
287
290
  {{ t('gates.humanReview.requestFixDescription') }}
288
291
  </p>
289
292
  <textarea
@@ -291,7 +294,7 @@ const conflictVerdict = computed(() => {
291
294
  rows="3"
292
295
  :disabled="fixBusy"
293
296
  :placeholder="t('gates.humanReview.requestFixPlaceholder')"
294
- class="w-full resize-y rounded-md border border-slate-800 bg-slate-950/60 px-3 py-2 text-[13px] text-slate-200 placeholder:text-slate-600 focus:border-violet-500/60 focus:outline-none focus-visible:ring-2 focus-visible:ring-violet-500/60"
297
+ class="w-full resize-y rounded-md border border-default bg-app-950/60 px-3 py-2 text-[13px] text-default placeholder:text-app-600 focus:border-app-secondary-500/60 focus:outline-none focus-visible:ring-2 focus-visible:ring-app-secondary-500/60"
295
298
  />
296
299
  <div class="mt-2 flex justify-end">
297
300
  <UButton
@@ -313,30 +316,30 @@ const conflictVerdict = computed(() => {
313
316
 
314
317
  <!-- CI: failing checks -->
315
318
  <template v-else-if="isCi">
316
- <h3 class="mb-2 text-[11px] font-semibold uppercase tracking-wide text-slate-500">
319
+ <h3 class="mb-2 text-[11px] font-semibold uppercase tracking-wide text-dimmed">
317
320
  {{ t('gates.ci.failingChecks') }}
318
321
  </h3>
319
322
  <GateFailingCheckList v-if="failingChecks.length" :checks="failingChecks" />
320
- <p v-else class="text-[13px] leading-relaxed text-slate-300">
323
+ <p v-else class="text-[13px] leading-relaxed text-toned">
321
324
  {{ gate.lastFailureSummary || t('gates.ci.failureFallback') }}
322
325
  </p>
323
326
  </template>
324
327
 
325
328
  <!-- Doc quality: the deterministic structural findings the gate raised -->
326
329
  <template v-else-if="isDocQuality">
327
- <h3 class="mb-2 text-[11px] font-semibold uppercase tracking-wide text-slate-500">
330
+ <h3 class="mb-2 text-[11px] font-semibold uppercase tracking-wide text-dimmed">
328
331
  {{ t('gates.docQuality.findings') }}
329
332
  </h3>
330
333
  <div
331
334
  v-if="gate.lastFailureSummary"
332
- class="relative rounded-md border border-slate-800 bg-slate-950/40 px-3 py-2"
335
+ class="relative rounded-md border border-default bg-app-950/40 px-3 py-2"
333
336
  >
334
337
  <CopyButton :text="gate.lastFailureSummary" class="absolute end-1 top-1" />
335
- <p class="whitespace-pre-wrap pe-8 text-[12px] leading-relaxed text-slate-300">
338
+ <p class="whitespace-pre-wrap pe-8 text-[12px] leading-relaxed text-toned">
336
339
  {{ gate.lastFailureSummary }}
337
340
  </p>
338
341
  </div>
339
- <p v-else class="text-[13px] leading-relaxed text-slate-300">
342
+ <p v-else class="text-[13px] leading-relaxed text-toned">
340
343
  {{ t('gates.docQuality.findingsFallback') }}
341
344
  </p>
342
345
  <a
@@ -344,7 +347,7 @@ const conflictVerdict = computed(() => {
344
347
  :href="prUrl"
345
348
  target="_blank"
346
349
  rel="noopener"
347
- class="mt-2 inline-flex items-center gap-1 text-[12px] text-sky-300 hover:text-sky-200 hover:underline"
350
+ class="mt-2 inline-flex items-center gap-1 text-[12px] text-app-info-300 hover:text-app-info-200 hover:underline"
348
351
  >
349
352
  {{ t('gates.docQuality.viewPr') }}
350
353
  <UIcon name="i-lucide-external-link" class="h-3 w-3" />
@@ -353,28 +356,28 @@ const conflictVerdict = computed(() => {
353
356
 
354
357
  <!-- Conflicts: verdict + the resolver's account of what it left -->
355
358
  <template v-else>
356
- <h3 class="mb-2 text-[11px] font-semibold uppercase tracking-wide text-slate-500">
359
+ <h3 class="mb-2 text-[11px] font-semibold uppercase tracking-wide text-dimmed">
357
360
  {{ t('gates.conflicts.mergeability') }}
358
361
  </h3>
359
362
  <div
360
- class="flex items-center gap-2 rounded-md border border-slate-800 bg-slate-950/40 px-3 py-2"
363
+ class="flex items-center gap-2 rounded-md border border-default bg-app-950/40 px-3 py-2"
361
364
  >
362
365
  <UIcon
363
366
  :name="STATUS_META[status].icon"
364
367
  class="h-4 w-4 shrink-0"
365
368
  :class="STATUS_META[status].text"
366
369
  />
367
- <span class="text-[13px] text-slate-200">{{ conflictVerdict }}</span>
370
+ <span class="text-[13px] text-default">{{ conflictVerdict }}</span>
368
371
  </div>
369
372
  <!-- GitHub's API reports mergeability as a single bit (no file list), but the
370
373
  conflict resolver discovers the conflicting files in the container and
371
374
  reports them back — surface that account here. -->
372
375
  <div
373
376
  v-if="gate.lastFailureSummary"
374
- class="relative mt-2 rounded-md border border-slate-800 bg-slate-950/40 px-3 py-2"
377
+ class="relative mt-2 rounded-md border border-default bg-app-950/40 px-3 py-2"
375
378
  >
376
379
  <CopyButton :text="gate.lastFailureSummary" class="absolute end-1 top-1" />
377
- <p class="whitespace-pre-wrap pe-8 text-[12px] leading-relaxed text-slate-300">
380
+ <p class="whitespace-pre-wrap pe-8 text-[12px] leading-relaxed text-toned">
378
381
  {{ gate.lastFailureSummary }}
379
382
  </p>
380
383
  </div>
@@ -383,7 +386,7 @@ const conflictVerdict = computed(() => {
383
386
  :href="prUrl"
384
387
  target="_blank"
385
388
  rel="noopener"
386
- class="mt-2 inline-flex items-center gap-1 text-[12px] text-sky-300 hover:text-sky-200 hover:underline"
389
+ class="mt-2 inline-flex items-center gap-1 text-[12px] text-app-info-300 hover:text-app-info-200 hover:underline"
387
390
  >
388
391
  {{ t('gates.conflicts.viewPr') }}
389
392
  <UIcon name="i-lucide-external-link" class="h-3 w-3" />
@@ -392,14 +395,14 @@ const conflictVerdict = computed(() => {
392
395
 
393
396
  <!-- Attempt history (both gates): what each helper run did and how it ended. -->
394
397
  <section v-if="attempts.length" class="mt-5">
395
- <h3 class="mb-2 text-[11px] font-semibold uppercase tracking-wide text-slate-500">
398
+ <h3 class="mb-2 text-[11px] font-semibold uppercase tracking-wide text-dimmed">
396
399
  {{ t('gates.attemptsHeading', { helper: helperMeta.label }) }}
397
400
  </h3>
398
401
  <ol class="space-y-2">
399
402
  <li
400
403
  v-for="a in attempts"
401
404
  :key="a.attempt"
402
- class="rounded-md border border-slate-800 bg-slate-950/40 px-3 py-2"
405
+ class="rounded-md border border-default bg-app-950/40 px-3 py-2"
403
406
  >
404
407
  <AttemptEntryHeader
405
408
  :label="t('gates.attempt', { number: a.attempt })"
@@ -415,7 +418,7 @@ const conflictVerdict = computed(() => {
415
418
  v-if="a.instructions || (a.failingChecks && a.failingChecks.length)"
416
419
  class="mt-1.5"
417
420
  >
418
- <p class="text-[11px] text-slate-500">
421
+ <p class="text-[11px] text-dimmed">
419
422
  {{ t('gates.attemptInstructions', { helper: helperMeta.label }) }}
420
423
  </p>
421
424
  <GateFailingCheckList
@@ -426,17 +429,17 @@ const conflictVerdict = computed(() => {
426
429
  />
427
430
  <p
428
431
  v-else-if="a.instructions"
429
- class="mt-1 whitespace-pre-wrap text-[12px] leading-relaxed text-slate-300"
432
+ class="mt-1 whitespace-pre-wrap text-[12px] leading-relaxed text-toned"
430
433
  >
431
434
  {{ a.instructions }}
432
435
  </p>
433
436
  </div>
434
437
  <!-- The helper's own report of what it did / what remains. -->
435
438
  <template v-if="a.summary">
436
- <p class="mt-1.5 text-[11px] text-slate-500">
439
+ <p class="mt-1.5 text-[11px] text-dimmed">
437
440
  {{ t('gates.attemptReport', { helper: helperMeta.label }) }}
438
441
  </p>
439
- <p class="mt-1 whitespace-pre-wrap text-[12px] leading-relaxed text-slate-400">
442
+ <p class="mt-1 whitespace-pre-wrap text-[12px] leading-relaxed text-muted">
440
443
  {{ a.summary }}
441
444
  </p>
442
445
  </template>
@@ -448,10 +451,10 @@ const conflictVerdict = computed(() => {
448
451
 
449
452
  <!-- Sidebar: gate state -->
450
453
  <aside
451
- class="hidden w-60 shrink-0 flex-col gap-4 border-s border-slate-800 bg-slate-900/50 px-4 py-4 lg:flex"
454
+ class="hidden w-60 shrink-0 flex-col gap-4 border-s border-default bg-default/50 px-4 py-4 lg:flex"
452
455
  >
453
456
  <div v-if="gate">
454
- <h4 class="mb-2 text-[11px] font-semibold uppercase tracking-wide text-slate-500">
457
+ <h4 class="mb-2 text-[11px] font-semibold uppercase tracking-wide text-dimmed">
455
458
  {{ t('gates.sidebar.state') }}
456
459
  </h4>
457
460
  <div class="flex items-center gap-2 text-[13px]">
@@ -465,10 +468,10 @@ const conflictVerdict = computed(() => {
465
468
  </div>
466
469
 
467
470
  <div v-if="gate">
468
- <h4 class="mb-1 text-[11px] font-semibold uppercase tracking-wide text-slate-500">
471
+ <h4 class="mb-1 text-[11px] font-semibold uppercase tracking-wide text-dimmed">
469
472
  {{ helperMeta.label }}
470
473
  </h4>
471
- <p class="text-[12px] text-slate-300">
474
+ <p class="text-[12px] text-toned">
472
475
  <!-- The human-review gate's budget is effectively unbounded (it waits for a human
473
476
  indefinitely), so render a plain round count rather than "0/9007199254740991". -->
474
477
  <template v-if="isHumanReview">
@@ -493,10 +496,10 @@ const conflictVerdict = computed(() => {
493
496
  </div>
494
497
 
495
498
  <div v-if="shortSha">
496
- <h4 class="mb-1 text-[11px] font-semibold uppercase tracking-wide text-slate-500">
499
+ <h4 class="mb-1 text-[11px] font-semibold uppercase tracking-wide text-dimmed">
497
500
  {{ t('gates.sidebar.gatedCommit') }}
498
501
  </h4>
499
- <p class="font-mono text-[12px] text-slate-300">{{ shortSha }}</p>
502
+ <p class="font-mono text-[12px] text-toned">{{ shortSha }}</p>
500
503
  </div>
501
504
 
502
505
  <!-- Shared run metadata + embedded observability (model, run id, timing,
@@ -511,7 +514,7 @@ const conflictVerdict = computed(() => {
511
514
  :failure-at="instance?.failure?.occurredAt"
512
515
  />
513
516
 
514
- <p class="mt-auto text-[10px] leading-relaxed text-slate-600">
517
+ <p class="mt-auto text-[10px] leading-relaxed text-app-600">
515
518
  {{ t('gates.sidebar.footer', { helper: helperMeta.label }) }}
516
519
  </p>
517
520
  </aside>
@@ -442,7 +442,7 @@ function done() {
442
442
  <UModal v-model:open="open" :title="t('github.addService.title')" :ui="{ content: 'max-w-xl' }">
443
443
  <template #body>
444
444
  <div class="space-y-6">
445
- <p class="text-sm text-slate-400">
445
+ <p class="text-sm text-muted">
446
446
  {{
447
447
  introProvider
448
448
  ? t('vcs.addService.intro', { provider: VCS_PROVIDER_LABELS[introProvider] })
@@ -454,11 +454,11 @@ function done() {
454
454
  offer whichever connect methods the deployment serves (never just the App) -->
455
455
  <div
456
456
  v-if="needsConnection"
457
- class="space-y-3 rounded-md border border-amber-500/30 bg-amber-500/5 p-3"
457
+ class="space-y-3 rounded-md border border-app-warning-500/30 bg-app-warning-500/5 p-3"
458
458
  >
459
459
  <div class="flex items-start gap-2">
460
- <UIcon name="i-lucide-plug-zap" class="mt-0.5 h-4 w-4 shrink-0 text-amber-400" />
461
- <p class="text-sm text-amber-200/90">
460
+ <UIcon name="i-lucide-plug-zap" class="mt-0.5 h-4 w-4 shrink-0 text-app-warning-400" />
461
+ <p class="text-sm text-app-warning-200/90">
462
462
  {{ t('vcs.addService.connectFirst') }}
463
463
  </p>
464
464
  </div>
@@ -531,9 +531,9 @@ function done() {
531
531
 
532
532
  <div
533
533
  v-if="isMonorepo"
534
- class="space-y-3 rounded-md border border-slate-700/60 bg-slate-900/40 p-3"
534
+ class="space-y-3 rounded-md border border-muted/60 bg-default/40 p-3"
535
535
  >
536
- <p class="text-xs text-slate-400">
536
+ <p class="text-xs text-muted">
537
537
  {{ t('github.addService.monorepoBrowseHint') }}
538
538
  </p>
539
539
  <RepoTreeBrowser
@@ -547,20 +547,20 @@ function done() {
547
547
 
548
548
  <!-- the selection cart + the add action sit right beside the tree, so the
549
549
  picked services and the button that adds them are never scrolled apart -->
550
- <div class="space-y-2 rounded-md border border-slate-800 bg-slate-950/40 p-2.5">
551
- <p class="text-[11px] font-semibold uppercase tracking-wide text-slate-400">
550
+ <div class="space-y-2 rounded-md border border-default bg-app-950/40 p-2.5">
551
+ <p class="text-[11px] font-semibold uppercase tracking-wide text-muted">
552
552
  {{ t('github.addService.selectedServices') }}
553
553
  </p>
554
554
  <div v-if="selectedDirectories.length" class="flex flex-wrap gap-1.5">
555
555
  <span
556
556
  v-for="dir in selectedDirectories"
557
557
  :key="dir"
558
- class="inline-flex items-center gap-1 rounded bg-slate-800 px-2 py-0.5 text-xs text-slate-200"
558
+ class="inline-flex items-center gap-1 rounded bg-elevated px-2 py-0.5 text-xs text-default"
559
559
  >
560
- <code class="text-slate-200">{{ dir }}</code>
560
+ <code class="text-default">{{ dir }}</code>
561
561
  <button
562
562
  type="button"
563
- class="text-slate-400 hover:text-slate-100"
563
+ class="text-muted hover:text-app-100"
564
564
  :aria-label="t('github.addService.removeService', { directory: dir })"
565
565
  @click="removeSelected(dir)"
566
566
  >
@@ -568,7 +568,7 @@ function done() {
568
568
  </button>
569
569
  </span>
570
570
  </div>
571
- <p v-else class="text-xs text-slate-500">
571
+ <p v-else class="text-xs text-dimmed">
572
572
  {{ t('github.addService.noServicesSelected') }}
573
573
  </p>
574
574
 
@@ -617,10 +617,10 @@ function done() {
617
617
  <!-- just-added service: configure it with the same controls as the inspector -->
618
618
  <div
619
619
  v-if="configuredBlock"
620
- class="space-y-4 rounded-md border border-emerald-900/50 bg-emerald-950/20 p-3"
620
+ class="space-y-4 rounded-md border border-app-success-900/50 bg-app-success-950/20 p-3"
621
621
  >
622
622
  <div
623
- class="flex items-center gap-1.5 text-[11px] font-semibold uppercase tracking-wide text-emerald-400"
623
+ class="flex items-center gap-1.5 text-[11px] font-semibold uppercase tracking-wide text-app-success-400"
624
624
  >
625
625
  <UIcon name="i-lucide-check" class="h-3.5 w-3.5" />
626
626
  {{ t('github.addService.addedConfigure', { title: configuredBlock.title }) }}
@@ -48,9 +48,9 @@ const exposedCount = computed(
48
48
  )
49
49
 
50
50
  const STATE_STYLE: Record<BranchProtectionStateValue, string> = {
51
- unprotected: 'text-rose-300',
52
- unknown: 'text-amber-300',
53
- protected: 'text-emerald-400',
51
+ unprotected: 'text-app-error-300',
52
+ unknown: 'text-app-warning-300',
53
+ protected: 'text-app-success-400',
54
54
  }
55
55
 
56
56
  // Exhaustive Records of LITERAL keys, not an assembled `\`…\${state}\`` lookup: the typed-key
@@ -115,8 +115,8 @@ async function check() {
115
115
 
116
116
  <template>
117
117
  <section class="space-y-2" data-testid="branch-protection-preflight">
118
- <h3 class="text-sm font-semibold text-slate-200">{{ t('vcs.branchProtection.heading') }}</h3>
119
- <p class="text-[11px] text-slate-400">{{ t('vcs.branchProtection.body') }}</p>
118
+ <h3 class="text-sm font-semibold text-default">{{ t('vcs.branchProtection.heading') }}</h3>
119
+ <p class="text-[11px] text-muted">{{ t('vcs.branchProtection.body') }}</p>
120
120
 
121
121
  <UButton
122
122
  color="neutral"
@@ -131,7 +131,7 @@ async function check() {
131
131
  </UButton>
132
132
 
133
133
  <div v-if="failure" class="space-y-1" data-testid="branch-protection-failure">
134
- <p class="text-xs text-rose-400">{{ t(failure.descriptionKey) }}</p>
134
+ <p class="text-xs text-app-error-400">{{ t(failure.descriptionKey) }}</p>
135
135
  <!-- The raw prose stays reachable, never dropped: the backend's messages here name the
136
136
  operator remedy, and the request id is the join to the one server log line that
137
137
  explains it. One click away, so it is never what a user is shown FIRST. -->
@@ -146,7 +146,7 @@ async function check() {
146
146
  >
147
147
  {{ t('errors.generic.showDetail') }}
148
148
  </UButton>
149
- <p v-if="showFailureDetail" class="font-mono text-[10px] break-all text-slate-500">
149
+ <p v-if="showFailureDetail" class="font-mono text-[10px] break-all text-dimmed">
150
150
  {{ failure.detail }}
151
151
  </p>
152
152
  </div>
@@ -155,7 +155,7 @@ async function check() {
155
155
  would otherwise read exactly like a clean bill of health. -->
156
156
  <p
157
157
  v-else-if="report && report.capability === 'unavailable'"
158
- class="text-xs text-amber-300"
158
+ class="text-xs text-app-warning-300"
159
159
  data-testid="branch-protection-unavailable"
160
160
  >
161
161
  {{ t('vcs.branchProtection.unavailable') }}
@@ -164,7 +164,7 @@ async function check() {
164
164
  <template v-else-if="report">
165
165
  <p
166
166
  class="text-xs"
167
- :class="exposedCount ? 'text-rose-300' : 'text-emerald-400'"
167
+ :class="exposedCount ? 'text-app-error-300' : 'text-app-success-400'"
168
168
  data-testid="branch-protection-summary"
169
169
  >
170
170
  {{
@@ -178,15 +178,15 @@ async function check() {
178
178
  <li
179
179
  v-for="row in rows"
180
180
  :key="row.repoGithubId"
181
- class="rounded-md border border-slate-800 bg-slate-900/40 px-2 py-1.5"
181
+ class="rounded-md border border-default bg-default/40 px-2 py-1.5"
182
182
  >
183
183
  <div class="flex items-baseline justify-between gap-2">
184
- <span class="font-mono text-xs text-slate-300">{{ row.owner }}/{{ row.name }}</span>
184
+ <span class="font-mono text-xs text-toned">{{ row.owner }}/{{ row.name }}</span>
185
185
  <span class="text-[11px]" :class="STATE_STYLE[row.protection.state]">
186
186
  {{ STATE_LABEL[row.protection.state]() }}
187
187
  </span>
188
188
  </div>
189
- <p class="text-[10px] text-slate-500">
189
+ <p class="text-[10px] text-dimmed">
190
190
  {{ row.defaultBranch }}<span v-if="detailLine(row)"> — {{ detailLine(row) }}</span>
191
191
  </p>
192
192
  </li>
@@ -194,7 +194,7 @@ async function check() {
194
194
 
195
195
  <!-- A cap that truncated silently would read as "these are all your repositories", which
196
196
  on a security report is the same failure as calling an unprobed repo protected. -->
197
- <p v-if="report.omittedRepos > 0" class="text-[11px] text-amber-300">
197
+ <p v-if="report.omittedRepos > 0" class="text-[11px] text-app-warning-300">
198
198
  {{ t('vcs.branchProtection.omitted', { count: report.omittedRepos }, report.omittedRepos) }}
199
199
  </p>
200
200
  </template>
@@ -73,7 +73,7 @@ async function connectManually() {
73
73
  <!-- discovered installations: pick one the App is already on -->
74
74
  <section class="space-y-2">
75
75
  <div class="flex items-center justify-between">
76
- <span class="text-xs font-medium uppercase tracking-wide text-slate-500">
76
+ <span class="text-xs font-medium uppercase tracking-wide text-dimmed">
77
77
  {{ t('github.connect.yourInstallations') }}
78
78
  </span>
79
79
  <UButton
@@ -90,7 +90,7 @@ async function connectManually() {
90
90
 
91
91
  <div
92
92
  v-if="github.loadingInstallations && !github.installations.length"
93
- class="flex items-center gap-2 py-3 text-sm text-slate-400"
93
+ class="flex items-center gap-2 py-3 text-sm text-muted"
94
94
  >
95
95
  <UIcon name="i-lucide-loader" class="h-4 w-4 animate-spin" />
96
96
  {{ t('github.connect.lookingForInstallations') }}
@@ -98,7 +98,7 @@ async function connectManually() {
98
98
 
99
99
  <p
100
100
  v-else-if="!github.installations.length"
101
- class="rounded-md border border-dashed border-slate-800 px-3 py-3 text-sm text-slate-400"
101
+ class="rounded-md border border-dashed border-default px-3 py-3 text-sm text-muted"
102
102
  >
103
103
  {{ t('github.connect.noInstallations') }}
104
104
  </p>
@@ -106,7 +106,7 @@ async function connectManually() {
106
106
  <div
107
107
  v-for="inst in github.installations"
108
108
  :key="inst.installationId"
109
- class="flex items-center justify-between gap-2 rounded-md border border-slate-800 bg-slate-900/60 px-3 py-2"
109
+ class="flex items-center justify-between gap-2 rounded-md border border-default bg-default/60 px-3 py-2"
110
110
  >
111
111
  <div class="flex min-w-0 items-center gap-2">
112
112
  <UAvatar
@@ -115,10 +115,10 @@ async function connectManually() {
115
115
  size="2xs"
116
116
  :alt="inst.accountLogin"
117
117
  />
118
- <UIcon v-else name="i-lucide-github" class="h-4 w-4 text-slate-400" />
118
+ <UIcon v-else name="i-lucide-github" class="h-4 w-4 text-muted" />
119
119
  <div class="min-w-0">
120
- <div class="truncate text-sm text-slate-200">{{ inst.accountLogin }}</div>
121
- <div class="text-[11px] text-slate-500">
120
+ <div class="truncate text-sm text-default">{{ inst.accountLogin }}</div>
121
+ <div class="text-[11px] text-dimmed">
122
122
  {{
123
123
  t('github.connect.installationMeta', {
124
124
  targetType: inst.targetType,
@@ -24,15 +24,15 @@ const title = computed(() =>
24
24
 
25
25
  <template>
26
26
  <div
27
- class="flex h-full w-full items-center justify-center overflow-y-auto bg-slate-950 text-slate-100"
27
+ class="flex h-full w-full items-center justify-center overflow-y-auto bg-app-950 text-app-100"
28
28
  >
29
29
  <div
30
- class="my-8 w-full max-w-md rounded-xl border border-slate-800 bg-slate-900/80 p-8 backdrop-blur"
30
+ class="my-8 w-full max-w-md rounded-xl border border-default bg-default/80 p-8 backdrop-blur"
31
31
  >
32
32
  <div class="mb-5 text-center">
33
- <UIcon :name="icon" class="mx-auto mb-3 h-10 w-10 text-indigo-400" />
34
- <h1 class="mb-1 text-lg font-semibold text-white">{{ title }}</h1>
35
- <p class="text-sm text-slate-400">
33
+ <UIcon :name="icon" class="mx-auto mb-3 h-10 w-10 text-primary" />
34
+ <h1 class="mb-1 text-lg font-semibold text-highlighted">{{ title }}</h1>
35
+ <p class="text-sm text-muted">
36
36
  {{ t('vcs.onboarding.intro') }}
37
37
  </p>
38
38
  </div>
@@ -41,10 +41,10 @@ const title = computed(() =>
41
41
 
42
42
  <p
43
43
  v-if="auth.required && auth.user"
44
- class="mt-6 border-t border-slate-800 pt-4 text-center text-xs text-slate-500"
44
+ class="mt-6 border-t border-default pt-4 text-center text-xs text-dimmed"
45
45
  >
46
46
  {{ t('github.onboarding.signedInAs', { login: auth.user.login }) }} ·
47
- <button class="text-slate-300 underline-offset-2 hover:underline" @click="auth.logout()">
47
+ <button class="text-toned underline-offset-2 hover:underline" @click="auth.logout()">
48
48
  {{ t('github.onboarding.signOut') }}
49
49
  </button>
50
50
  </p>