@cat-factory/app 0.302.2 → 0.303.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (328) hide show
  1. package/README.md +16 -0
  2. package/app/app.config.ts +19 -10
  3. package/app/assets/css/main.css +13 -13
  4. package/app/assets/css/prose.css +22 -22
  5. package/app/assets/css/tokens.css +298 -0
  6. package/app/components/assistant/AssistantModal.vue +22 -22
  7. package/app/components/auth/AuthGate.vue +1 -1
  8. package/app/components/auth/BackendMisconfiguredScreen.vue +10 -10
  9. package/app/components/auth/LoginScreen.vue +34 -36
  10. package/app/components/auth/ResetPasswordScreen.vue +12 -12
  11. package/app/components/auth/UserMenu.vue +4 -4
  12. package/app/components/binaryCandidates/BinaryCandidatesWindow.vue +27 -25
  13. package/app/components/binaryOutput/BinaryOutputReport.vue +15 -15
  14. package/app/components/binaryOutput/StoredAssetView.vue +5 -5
  15. package/app/components/board/AddTaskModal.vue +17 -20
  16. package/app/components/board/AgentFailureCard.vue +11 -11
  17. package/app/components/board/AgentFailureHistory.vue +2 -2
  18. package/app/components/board/BoardCanvas.vue +6 -5
  19. package/app/components/board/CreateInitiativeModal.vue +8 -10
  20. package/app/components/board/DependencyConnectOverlay.vue +1 -1
  21. package/app/components/board/FailureHistoryList.vue +7 -7
  22. package/app/components/board/RecurringPipelineModal.vue +17 -17
  23. package/app/components/board/ReviewFrictionDialog.vue +6 -6
  24. package/app/components/board/StepExecutionHistory.vue +13 -13
  25. package/app/components/board/TaskDependencyEdges.vue +8 -8
  26. package/app/components/board/nodes/AgentChip.vue +10 -10
  27. package/app/components/board/nodes/BlockNode.vue +29 -29
  28. package/app/components/board/nodes/DecisionBadge.vue +2 -2
  29. package/app/components/board/nodes/EpicNode.vue +14 -10
  30. package/app/components/board/nodes/FrameSwimlanes.vue +7 -9
  31. package/app/components/board/nodes/InitiativeCard.vue +8 -8
  32. package/app/components/board/nodes/LaneGroup.vue +1 -1
  33. package/app/components/board/nodes/LaneTask.vue +2 -2
  34. package/app/components/board/nodes/ResizeGrips.vue +4 -4
  35. package/app/components/board/nodes/TaskCard.vue +18 -18
  36. package/app/components/board/nodes/TaskLane.vue +5 -5
  37. package/app/components/board/nodes/TaskPipelineMini.vue +18 -18
  38. package/app/components/bootstrap/AdoptionReviewModal.vue +29 -26
  39. package/app/components/bootstrap/BootstrapModal.vue +21 -23
  40. package/app/components/bootstrap/BootstrapRunSteps.vue +1 -1
  41. package/app/components/brainstorm/BrainstormWindow.vue +30 -33
  42. package/app/components/bugFishing/BugFishingWindow.vue +49 -49
  43. package/app/components/clarity/ClarityReviewWindow.vue +30 -30
  44. package/app/components/common/AsyncViewError.vue +5 -5
  45. package/app/components/common/ClarificationItem.vue +8 -13
  46. package/app/components/common/ConfirmDialog.vue +4 -2
  47. package/app/components/common/DescriptorFields.vue +1 -1
  48. package/app/components/common/EmptyState.vue +3 -3
  49. package/app/components/common/InterviewGateNotice.vue +7 -7
  50. package/app/components/common/KeyboardShortcutsHelp.vue +1 -1
  51. package/app/components/common/MarkdownProse.vue +14 -13
  52. package/app/components/consensus/ConsensusSessionWindow.vue +26 -26
  53. package/app/components/context/ContextAttachmentFields.vue +17 -17
  54. package/app/components/docs/DocInterviewWindow.vue +14 -14
  55. package/app/components/documents/ContextDocumentPicker.vue +17 -17
  56. package/app/components/documents/DocumentImportModal.vue +7 -7
  57. package/app/components/documents/DocumentSourceConnectModal.vue +3 -3
  58. package/app/components/documents/DocumentSyncState.vue +5 -5
  59. package/app/components/documents/DocumentTemplatesModal.vue +15 -15
  60. package/app/components/documents/RepoContextDocPicker.vue +5 -5
  61. package/app/components/documents/SpawnPreviewModal.vue +12 -12
  62. package/app/components/documents/StartFromDesignModal.vue +11 -11
  63. package/app/components/documents/TaskContextDocs.vue +5 -5
  64. package/app/components/environments/EnvSetupStepper.vue +6 -6
  65. package/app/components/environments/EnvironmentStatusPanel.vue +17 -17
  66. package/app/components/environments/steps/EnvPickStep.vue +3 -3
  67. package/app/components/environments/steps/EnvPreflightStep.vue +9 -9
  68. package/app/components/environments/steps/EnvReviewStep.vue +25 -22
  69. package/app/components/environments/steps/EnvSaveStep.vue +7 -5
  70. package/app/components/environments/steps/JourneyStepNav.vue +1 -1
  71. package/app/components/focus/BlockFocusView.vue +17 -19
  72. package/app/components/followUp/FollowUpWindow.vue +23 -23
  73. package/app/components/forkDecision/ForkDecisionWindow.vue +37 -39
  74. package/app/components/foundational/FoundationalContractSummary.vue +7 -7
  75. package/app/components/foundational/FoundationalServiceCatalogList.vue +11 -11
  76. package/app/components/foundational/FoundationalServiceManager.vue +1 -1
  77. package/app/components/foundational/FoundationalServiceRegistry.vue +13 -13
  78. package/app/components/foundational/FoundationalServiceSources.vue +13 -13
  79. package/app/components/foundational/FoundationalSuppressions.vue +7 -7
  80. package/app/components/foundational/ServiceCatalogConnection.vue +10 -10
  81. package/app/components/fragments/FragmentLibraryManager.vue +41 -44
  82. package/app/components/fragments/FragmentSelector.vue +13 -13
  83. package/app/components/fragments/GitHubDocUrlImport.vue +1 -1
  84. package/app/components/gates/GateFailingCheckList.vue +5 -5
  85. package/app/components/gates/GateResultView.vue +50 -47
  86. package/app/components/github/AddServiceFromRepoModal.vue +14 -14
  87. package/app/components/github/BranchProtectionPreflight.vue +13 -13
  88. package/app/components/github/GitHubConnect.vue +7 -7
  89. package/app/components/github/GitHubOnboarding.vue +7 -7
  90. package/app/components/github/GitHubPanel.vue +37 -40
  91. package/app/components/github/RepoTreeBrowser.vue +18 -18
  92. package/app/components/humanTest/HumanTestWindow.vue +30 -33
  93. package/app/components/initiative/InitiativePlanNotice.vue +5 -5
  94. package/app/components/initiative/InitiativePlanReview.vue +27 -29
  95. package/app/components/initiative/InitiativePlanningWindow.vue +10 -10
  96. package/app/components/initiative/InitiativeTrackerWindow.vue +71 -65
  97. package/app/components/inputGate/InputGateNotice.vue +2 -4
  98. package/app/components/judge/JudgeResultView.vue +30 -32
  99. package/app/components/kaizen/KaizenPanel.vue +40 -36
  100. package/app/components/kaizen/KaizenStepStatus.vue +21 -21
  101. package/app/components/layout/AccountAuditLog.vue +10 -10
  102. package/app/components/layout/AccountDeploymentSettings.vue +20 -20
  103. package/app/components/layout/AccountFailureKindRules.vue +13 -13
  104. package/app/components/layout/AccountFoundationalSettings.vue +1 -1
  105. package/app/components/layout/AccountFragmentSettings.vue +1 -1
  106. package/app/components/layout/AccountModelPolicySettings.vue +9 -9
  107. package/app/components/layout/AccountPlatformAlertSettings.vue +11 -11
  108. package/app/components/layout/AccountRiskPolicySettings.vue +2 -2
  109. package/app/components/layout/AccountRunCredentialSettings.vue +5 -5
  110. package/app/components/layout/AccountSkillSettings.vue +1 -1
  111. package/app/components/layout/AccountTeamSettings.vue +23 -15
  112. package/app/components/layout/AiProvidersBanner.vue +11 -8
  113. package/app/components/layout/AppearanceSwitcher.vue +108 -0
  114. package/app/components/layout/BoardSwitcher.vue +8 -11
  115. package/app/components/layout/BoardToolbar.vue +3 -3
  116. package/app/components/layout/CommandBar.vue +7 -9
  117. package/app/components/layout/ConnectionStatusBanner.vue +2 -2
  118. package/app/components/layout/DefaultTestEnvBanner.vue +5 -5
  119. package/app/components/layout/GitHubPatBanner.vue +5 -5
  120. package/app/components/layout/GitHubPatPermissionsBanner.vue +16 -10
  121. package/app/components/layout/InfraSetupBanner.vue +6 -6
  122. package/app/components/layout/IntegrationsHub.vue +15 -15
  123. package/app/components/layout/LanguageSwitcher.vue +5 -5
  124. package/app/components/layout/ModelProvidersHub.vue +13 -16
  125. package/app/components/layout/NotificationsInbox.vue +10 -10
  126. package/app/components/layout/PersonalSetupModal.vue +8 -8
  127. package/app/components/layout/ProviderConfigBanner.vue +4 -4
  128. package/app/components/layout/RolePrompt.vue +7 -7
  129. package/app/components/layout/SideBar.vue +6 -4
  130. package/app/components/layout/SpendWarningBanner.vue +17 -14
  131. package/app/components/layout/TranslationWarningBanner.vue +4 -4
  132. package/app/components/layout/UiModeSwitcher.vue +13 -13
  133. package/app/components/layout/UiRoleSwitcher.vue +8 -8
  134. package/app/components/layout/WorkspaceMembersSettings.vue +15 -11
  135. package/app/components/media/ArtifactLightbox.vue +13 -13
  136. package/app/components/media/ImageCompare.vue +31 -24
  137. package/app/components/merge/MergeEffortChips.vue +2 -2
  138. package/app/components/notifications/NotificationSettingsPanel.vue +14 -12
  139. package/app/components/observability/OutcomeFilterChips.vue +6 -6
  140. package/app/components/observability/RunFailureSummary.vue +28 -25
  141. package/app/components/observability/StepMetricsBar.vue +26 -28
  142. package/app/components/observability/StepModelActivity.vue +2 -2
  143. package/app/components/observability/ToolCallList.vue +24 -24
  144. package/app/components/outcome/OutcomeSummaryWindow.vue +47 -47
  145. package/app/components/palettes/AgentPalette.vue +8 -8
  146. package/app/components/palettes/AgentTierSelect.vue +1 -1
  147. package/app/components/palettes/PipelinePurposeSelect.vue +1 -1
  148. package/app/components/panels/AgentStepDetail.vue +52 -51
  149. package/app/components/panels/AttemptEntryHeader.vue +4 -6
  150. package/app/components/panels/DecisionModal.vue +7 -7
  151. package/app/components/panels/GenericStructuredResultView.vue +7 -7
  152. package/app/components/panels/InspectorPanel.vue +17 -17
  153. package/app/components/panels/MergerResultView.vue +19 -19
  154. package/app/components/panels/ObservabilityPanel.vue +115 -123
  155. package/app/components/panels/OperatorDashboardPanel.vue +89 -97
  156. package/app/components/panels/ReportsPanel.vue +69 -66
  157. package/app/components/panels/ReportsSpendBreakdown.vue +9 -9
  158. package/app/components/panels/ResultWindowShell.vue +38 -38
  159. package/app/components/panels/RunDetailLoadState.vue +2 -2
  160. package/app/components/panels/StepContainerStatus.vue +9 -9
  161. package/app/components/panels/StepDelegatedStatus.logic.spec.ts +135 -0
  162. package/app/components/panels/StepDelegatedStatus.logic.ts +160 -0
  163. package/app/components/panels/StepDelegatedStatus.vue +181 -0
  164. package/app/components/panels/StepEffortReport.vue +16 -15
  165. package/app/components/panels/StepFragmentAdherence.vue +14 -10
  166. package/app/components/panels/StepMetadataCard.vue +74 -45
  167. package/app/components/panels/StepReproductionReport.vue +25 -21
  168. package/app/components/panels/StepRunMeta.vue +20 -20
  169. package/app/components/panels/StepTestReport.logic.spec.ts +8 -3
  170. package/app/components/panels/StepTestReport.logic.ts +4 -4
  171. package/app/components/panels/StepTestReport.vue +28 -28
  172. package/app/components/panels/StepToolServers.vue +14 -11
  173. package/app/components/panels/StepValidationReport.vue +7 -7
  174. package/app/components/panels/inspector/ContainerSummary.vue +9 -9
  175. package/app/components/panels/inspector/DocReferenceRepos.vue +3 -3
  176. package/app/components/panels/inspector/EnvProbeReport.vue +24 -27
  177. package/app/components/panels/inspector/EpicChildren.vue +8 -12
  178. package/app/components/panels/inspector/FrontendBindingsResolved.vue +11 -11
  179. package/app/components/panels/inspector/FrontendConfig.vue +37 -41
  180. package/app/components/panels/inspector/InitiativeInspector.vue +3 -3
  181. package/app/components/panels/inspector/InspectorSection.vue +6 -6
  182. package/app/components/panels/inspector/RecurringScheduleSettings.vue +16 -19
  183. package/app/components/panels/inspector/ServiceConnections.vue +2 -2
  184. package/app/components/panels/inspector/ServiceReleaseHealthConfig.vue +2 -2
  185. package/app/components/panels/inspector/ServiceSelfTests.vue +21 -17
  186. package/app/components/panels/inspector/ServiceTestConfig.vue +51 -59
  187. package/app/components/panels/inspector/ServiceTestSecrets.vue +5 -5
  188. package/app/components/panels/inspector/ServiceTestingContext.vue +3 -3
  189. package/app/components/panels/inspector/ServiceValidationConfig.vue +2 -2
  190. package/app/components/panels/inspector/TaskAgentConfig.vue +3 -3
  191. package/app/components/panels/inspector/TaskAprioriBranches.vue +8 -5
  192. package/app/components/panels/inspector/TaskDependencies.vue +1 -1
  193. package/app/components/panels/inspector/TaskEstimateBadge.vue +11 -11
  194. package/app/components/panels/inspector/TaskExecution.vue +17 -17
  195. package/app/components/panels/inspector/TaskReviewTarget.vue +2 -2
  196. package/app/components/panels/inspector/TaskRunSettings.vue +35 -37
  197. package/app/components/panels/inspector/TaskStructure.vue +3 -3
  198. package/app/components/pipeline/AgentKindIcon.vue +1 -1
  199. package/app/components/pipeline/AgentPromptEditor.vue +17 -17
  200. package/app/components/pipeline/BinaryOutputStepPicker.vue +42 -56
  201. package/app/components/pipeline/EstimateThresholdFields.vue +4 -4
  202. package/app/components/pipeline/GateConfigFields.vue +13 -10
  203. package/app/components/pipeline/IterationCapPrompt.vue +4 -2
  204. package/app/components/pipeline/PipelineBuilder.vue +47 -55
  205. package/app/components/pipeline/PipelineHealthModal.vue +27 -29
  206. package/app/components/pipeline/PipelinePicker.vue +10 -10
  207. package/app/components/pipeline/PipelinePreview.vue +10 -10
  208. package/app/components/pipeline/PipelineProgress.vue +64 -67
  209. package/app/components/prReview/PrReviewPhaseBadge.vue +7 -7
  210. package/app/components/prReview/PrReviewWindow.vue +75 -77
  211. package/app/components/providers/AiPresetMismatchDialog.vue +5 -5
  212. package/app/components/providers/AiProviderOnboardingModal.vue +9 -9
  213. package/app/components/providers/ApiKeysSection.vue +13 -13
  214. package/app/components/providers/PersonalCredentialModal.vue +2 -2
  215. package/app/components/providers/PersonalSubscriptionSection.vue +10 -10
  216. package/app/components/providers/SignInRequiredNotice.vue +1 -1
  217. package/app/components/providers/VendorCredentialsModal.vue +10 -10
  218. package/app/components/provisioning/ProvisioningLogsDrawer.vue +13 -13
  219. package/app/components/ralph/RalphLoopResultView.vue +28 -30
  220. package/app/components/recurring/RecurrenceEditor.vue +2 -2
  221. package/app/components/requirements/RequirementsReviewWindow.vue +51 -58
  222. package/app/components/riskPolicy/RiskPolicyPicker.vue +12 -15
  223. package/app/components/riskPolicy/RiskPolicyPreview.vue +14 -14
  224. package/app/components/sandbox/SandboxPanel.vue +58 -59
  225. package/app/components/settings/AccountSettingsPanel.vue +1 -1
  226. package/app/components/settings/ApiTokensPanel.vue +10 -10
  227. package/app/components/settings/BudgetSettings.vue +18 -22
  228. package/app/components/settings/CapabilityCredentialsPanel.vue +15 -15
  229. package/app/components/settings/CloudflareHandlerSection.vue +20 -20
  230. package/app/components/settings/ComposeEnvironmentSetupSection.vue +13 -13
  231. package/app/components/settings/ConnectionTestVerdict.vue +3 -3
  232. package/app/components/settings/ConnectionWarnings.vue +1 -1
  233. package/app/components/settings/ConsensusGroupsSection.vue +27 -35
  234. package/app/components/settings/CustomManifestTypeEditor.vue +10 -10
  235. package/app/components/settings/DefaultProvisionTypeSection.vue +6 -6
  236. package/app/components/settings/InfraHandlersConfigurator.vue +24 -22
  237. package/app/components/settings/InfrastructureBackendPicker.vue +6 -6
  238. package/app/components/settings/InfrastructureWindow.vue +5 -5
  239. package/app/components/settings/IssueTrackerPanel.vue +29 -23
  240. package/app/components/settings/KubernetesEngineForm.vue +11 -11
  241. package/app/components/settings/KubernetesEnvironmentForm.vue +4 -4
  242. package/app/components/settings/LocalContainerPoolSettings.vue +6 -11
  243. package/app/components/settings/LocalModelEndpointsPanel.vue +20 -18
  244. package/app/components/settings/McpAuthorizeScreen.vue +13 -15
  245. package/app/components/settings/McpOAuthCallbackScreen.vue +16 -10
  246. package/app/components/settings/MergeClassRulesEditor.vue +6 -9
  247. package/app/components/settings/MergeRolePolicyEditor.vue +16 -16
  248. package/app/components/settings/ModelConfigurationPanel.vue +23 -30
  249. package/app/components/settings/ModelPresetHealthModal.vue +15 -13
  250. package/app/components/settings/ObservabilityConnectionPanel.vue +4 -4
  251. package/app/components/settings/OpenRouterCatalogPanel.vue +23 -19
  252. package/app/components/settings/PackageRegistriesPanel.vue +8 -8
  253. package/app/components/settings/ProviderConnectionTab.vue +8 -11
  254. package/app/components/settings/ProviderManifestEditor.vue +9 -9
  255. package/app/components/settings/ProviderPreferenceEditor.vue +8 -8
  256. package/app/components/settings/RiskPolicyCreateForm.vue +10 -10
  257. package/app/components/settings/RiskPolicyEditorRow.vue +14 -14
  258. package/app/components/settings/RiskPolicyHealthModal.vue +15 -13
  259. package/app/components/settings/RiskPolicyInheritedRow.vue +1 -1
  260. package/app/components/settings/RiskPolicyPanel.vue +10 -15
  261. package/app/components/settings/ServiceFragmentDefaultsPanel.vue +7 -7
  262. package/app/components/settings/SharedStacksPanel.vue +9 -12
  263. package/app/components/settings/TaskSourceCard.vue +4 -4
  264. package/app/components/settings/TaskTypeSuppressionsPanel.vue +6 -6
  265. package/app/components/settings/ToolServerChecklist.vue +36 -29
  266. package/app/components/settings/UsageSettings.vue +15 -15
  267. package/app/components/settings/UserSecretsSection.vue +9 -12
  268. package/app/components/settings/WorkspaceMetadataSettings.vue +5 -5
  269. package/app/components/settings/WorkspaceSettingsPanel.vue +47 -47
  270. package/app/components/skills/ReviewSkillQueue.vue +10 -10
  271. package/app/components/skills/SkillLibraryManager.vue +23 -20
  272. package/app/components/slack/SlackPanel.vue +13 -17
  273. package/app/components/spec/ServiceSpecWindow.vue +45 -42
  274. package/app/components/tasks/BugHuntModal.vue +24 -27
  275. package/app/components/tasks/ContextIssuePicker.vue +11 -11
  276. package/app/components/tasks/TaskContextIssues.vue +3 -3
  277. package/app/components/tasks/TaskImportModal.vue +7 -7
  278. package/app/components/tasks/TaskSourceConnectModal.vue +10 -8
  279. package/app/components/testing/TestReportWindow.vue +99 -82
  280. package/app/components/theme/ThemeImportModal.vue +115 -0
  281. package/app/components/tutorial/TutorialCatalogue.vue +9 -9
  282. package/app/components/tutorial/TutorialNudge.vue +5 -5
  283. package/app/components/tutorial/TutorialOverlay.vue +12 -12
  284. package/app/components/tutorial/TutorialPrompt.vue +6 -9
  285. package/app/components/vcs/GitLabConnect.vue +4 -4
  286. package/app/components/vcs/VcsConnectSurfaces.vue +2 -2
  287. package/app/components/visualConfirm/VisualConfirmationWindow.vue +36 -36
  288. package/app/composables/api/client.ts +6 -1
  289. package/app/composables/usePipelineErrorToast.ts +17 -0
  290. package/app/modular/agent-kinds.ts +24 -0
  291. package/app/pages/index.vue +5 -5
  292. package/app/plugins/theme.client.ts +125 -0
  293. package/app/spa-loading-template.html +52 -14
  294. package/app/stores/agents.ts +1 -1
  295. package/app/stores/theme.spec.ts +56 -0
  296. package/app/stores/theme.ts +87 -0
  297. package/app/types/domain.ts +19 -0
  298. package/app/types/execution.ts +4 -0
  299. package/app/utils/agentOutput.ts +1 -1
  300. package/app/utils/binaryOutput.ts +6 -6
  301. package/app/utils/bootstrapSteps.ts +14 -14
  302. package/app/utils/catalog.ts +87 -83
  303. package/app/utils/colorTint.ts +10 -0
  304. package/app/utils/failureKinds.ts +1 -0
  305. package/app/utils/observability.ts +3 -3
  306. package/app/utils/pipelineRender.ts +13 -17
  307. package/app/utils/swimlanes.ts +4 -4
  308. package/app/utils/theme/bootPalette.spec.ts +54 -0
  309. package/app/utils/theme/bootPalette.ts +108 -0
  310. package/app/utils/theme/builtins.spec.ts +38 -0
  311. package/app/utils/theme/builtins.ts +55 -0
  312. package/app/utils/theme/css.ts +162 -0
  313. package/app/utils/theme/doc.ts +353 -0
  314. package/app/utils/theme/link.ts +93 -0
  315. package/app/utils/theme/presets.ts +509 -0
  316. package/app/utils/theme/theme.spec.ts +224 -0
  317. package/i18n/locales/de.json +61 -4
  318. package/i18n/locales/en.json +70 -4
  319. package/i18n/locales/es.json +61 -4
  320. package/i18n/locales/fr.json +61 -4
  321. package/i18n/locales/he.json +61 -4
  322. package/i18n/locales/it.json +61 -4
  323. package/i18n/locales/ja.json +61 -4
  324. package/i18n/locales/pl.json +61 -4
  325. package/i18n/locales/tr.json +61 -4
  326. package/i18n/locales/uk.json +61 -4
  327. package/nuxt.config.ts +37 -11
  328. package/package.json +9 -8
@@ -153,12 +153,12 @@ function stage() {
153
153
  <UModal v-model:open="open" :title="t('documents.startFromDesign.title')">
154
154
  <template #body>
155
155
  <div class="space-y-4">
156
- <p class="text-sm text-slate-400">{{ t('documents.startFromDesign.intro') }}</p>
156
+ <p class="text-sm text-muted">{{ t('documents.startFromDesign.intro') }}</p>
157
157
 
158
158
  <!-- No connected design source: the flow cannot run, and saying which step is missing
159
159
  beats an input that refuses every paste. The connect route is withheld from a member
160
160
  for the same reason the picker's add tier is: connecting stores a credential. -->
161
- <p v-if="sources.length === 0" class="text-sm text-amber-300">
161
+ <p v-if="sources.length === 0" class="text-sm text-app-warning-300">
162
162
  {{ t('documents.startFromDesign.noSource') }}
163
163
  </p>
164
164
 
@@ -176,7 +176,7 @@ function stage() {
176
176
 
177
177
  <div
178
178
  v-if="state.status === 'checking'"
179
- class="flex items-center gap-2 text-sm text-slate-400"
179
+ class="flex items-center gap-2 text-sm text-muted"
180
180
  >
181
181
  <UIcon name="i-lucide-loader" class="h-4 w-4 animate-spin" />
182
182
  {{ t('documents.startFromDesign.checking') }}
@@ -184,32 +184,32 @@ function stage() {
184
184
 
185
185
  <div
186
186
  v-else-if="row"
187
- class="space-y-1 rounded-lg border border-slate-800 bg-slate-900/60 p-3"
187
+ class="space-y-1 rounded-lg border border-default bg-default/60 p-3"
188
188
  data-testid="start-from-design-resolved"
189
189
  >
190
- <div class="flex items-center gap-2 text-sm text-white">
191
- <UIcon name="i-lucide-frame" class="h-4 w-4 text-indigo-400" />
190
+ <div class="flex items-center gap-2 text-sm text-highlighted">
191
+ <UIcon name="i-lucide-frame" class="h-4 w-4 text-primary" />
192
192
  <span class="truncate">{{ row.label }}</span>
193
193
  </div>
194
- <p v-if="row.trimmed" class="text-[11px] text-slate-400">
194
+ <p v-if="row.trimmed" class="text-[11px] text-muted">
195
195
  {{ t('documents.startFromDesign.trimmed') }}
196
196
  </p>
197
197
  <!-- Its own line, in amber: a trim resolves the same page, a drop widens ONE frame to
198
198
  the whole design file, and the second is what a designer needs to see. -->
199
- <p v-if="row.droppedScope" class="text-[11px] text-amber-300">
199
+ <p v-if="row.droppedScope" class="text-[11px] text-app-warning-300">
200
200
  {{ t('documents.startFromDesign.widened', { scope: row.droppedScope }) }}
201
201
  </p>
202
- <p v-if="row.unchecked && target" class="text-[11px] text-slate-400">
202
+ <p v-if="row.unchecked && target" class="text-[11px] text-muted">
203
203
  {{ t('documents.startFromDesign.unchecked') }}
204
204
  </p>
205
- <p v-else-if="row.unchecked" class="text-[11px] text-amber-300">
205
+ <p v-else-if="row.unchecked" class="text-[11px] text-app-warning-300">
206
206
  {{ t('documents.startFromDesign.uncheckedAmbiguous') }}
207
207
  </p>
208
208
  </div>
209
209
 
210
210
  <p
211
211
  v-else-if="state.status === 'rejected'"
212
- class="text-sm text-amber-300"
212
+ class="text-sm text-app-warning-300"
213
213
  data-testid="start-from-design-rejected"
214
214
  >
215
215
  {{ t('documents.startFromDesign.rejected') }}
@@ -149,23 +149,23 @@ async function attach(item: PendingContext) {
149
149
  <div
150
150
  v-for="doc in linked"
151
151
  :key="`${doc.source}:${doc.externalId}`"
152
- class="rounded-md border border-slate-800 bg-slate-900/60 px-2 py-1.5"
152
+ class="rounded-md border border-default bg-default/60 px-2 py-1.5"
153
153
  >
154
154
  <DocumentOriginLink
155
155
  :url="doc.url"
156
- class="flex items-center gap-1.5 text-xs text-slate-300"
157
- hover-class="hover:text-white"
156
+ class="flex items-center gap-1.5 text-xs text-toned"
157
+ hover-class="hover:text-highlighted"
158
158
  >
159
159
  <UIcon
160
160
  :name="documents.descriptorForOrigin(doc.source)?.icon ?? 'i-lucide-file-text'"
161
- class="h-3.5 w-3.5 shrink-0 text-indigo-400"
161
+ class="h-3.5 w-3.5 shrink-0 text-primary"
162
162
  />
163
163
  <span class="truncate">{{ doc.title }}</span>
164
164
  </DocumentOriginLink>
165
165
  <DocumentSyncState :doc="doc" class="mt-1" />
166
166
  </div>
167
167
  </div>
168
- <p v-else class="text-[11px] text-slate-500">
168
+ <p v-else class="text-[11px] text-dimmed">
169
169
  {{ emptyHint }}
170
170
  </p>
171
171
  </InspectorSection>
@@ -37,7 +37,7 @@ function stepLabel(key: string | undefined): string {
37
37
 
38
38
  <template>
39
39
  <div class="space-y-2" data-testid="env-setup-stepper">
40
- <p v-if="total" class="text-[11px] font-medium text-slate-400" data-testid="env-setup-progress">
40
+ <p v-if="total" class="text-[11px] font-medium text-muted" data-testid="env-setup-progress">
41
41
  {{ t('environmentWizard.progress', { index: index + 1, total }) }}
42
42
  </p>
43
43
  <ol class="flex items-center gap-2 text-[11px]">
@@ -50,19 +50,19 @@ function stepLabel(key: string | undefined): string {
50
50
  <span
51
51
  class="flex h-5 w-5 items-center justify-center rounded-full text-[10px] font-semibold"
52
52
  :class="{
53
- 'bg-primary-500 text-white': i === index,
54
- 'bg-emerald-600/70 text-white': i < index,
55
- 'bg-slate-700 text-slate-300': i > index,
53
+ 'bg-primary text-inverted': i === index,
54
+ 'bg-app-success-600/70 text-highlighted': i < index,
55
+ 'bg-accented text-toned': i > index,
56
56
  }"
57
57
  >{{ i + 1 }}</span
58
58
  >
59
- <span :class="i === index ? 'text-slate-100' : 'text-slate-500'">
59
+ <span :class="i === index ? 'text-app-100' : 'text-dimmed'">
60
60
  {{ stepLabel(step.progressLabel) }}
61
61
  </span>
62
62
  <UIcon
63
63
  v-if="i < steps.length - 1"
64
64
  name="i-lucide-chevron-right"
65
- class="h-3 w-3 text-slate-600"
65
+ class="h-3 w-3 text-app-600"
66
66
  />
67
67
  </li>
68
68
  </ol>
@@ -60,32 +60,32 @@ const ENV_STATUS_META = computed<
60
60
  >(() => ({
61
61
  provisioning: {
62
62
  label: t('environments.status.provisioning'),
63
- color: 'text-amber-300',
63
+ color: 'text-app-warning-300',
64
64
  icon: 'i-lucide-loader-circle',
65
65
  },
66
66
  ready: {
67
67
  label: t('environments.status.ready'),
68
- color: 'text-emerald-300',
68
+ color: 'text-app-success-300',
69
69
  icon: 'i-lucide-circle-dot',
70
70
  },
71
71
  failed: {
72
72
  label: t('environments.status.failed'),
73
- color: 'text-rose-300',
73
+ color: 'text-app-error-300',
74
74
  icon: 'i-lucide-circle-alert',
75
75
  },
76
76
  expired: {
77
77
  label: t('environments.status.expired'),
78
- color: 'text-slate-400',
78
+ color: 'text-muted',
79
79
  icon: 'i-lucide-circle-off',
80
80
  },
81
81
  tearing_down: {
82
82
  label: t('environments.status.tearing_down'),
83
- color: 'text-slate-400',
83
+ color: 'text-muted',
84
84
  icon: 'i-lucide-loader-circle',
85
85
  },
86
86
  torn_down: {
87
87
  label: t('environments.status.torn_down'),
88
- color: 'text-slate-400',
88
+ color: 'text-muted',
89
89
  icon: 'i-lucide-circle-off',
90
90
  },
91
91
  }))
@@ -105,8 +105,8 @@ const envInTransition = computed(
105
105
  </script>
106
106
 
107
107
  <template>
108
- <section class="rounded-lg border border-slate-800 bg-slate-900/60 p-3">
109
- <h3 class="mb-2 text-[11px] font-semibold uppercase tracking-wide text-slate-500">
108
+ <section class="rounded-lg border border-default bg-default/60 p-3">
109
+ <h3 class="mb-2 text-[11px] font-semibold uppercase tracking-wide text-dimmed">
110
110
  {{ t('environments.title') }}
111
111
  </h3>
112
112
  <div v-if="environment" class="space-y-2">
@@ -128,30 +128,30 @@ const envInTransition = computed(
128
128
  :href="environment.url"
129
129
  target="_blank"
130
130
  rel="noopener"
131
- class="inline-flex items-center gap-1.5 break-all text-[13px] text-sky-300 hover:underline"
131
+ class="inline-flex items-center gap-1.5 break-all text-[13px] text-app-info-300 hover:underline"
132
132
  >
133
133
  <UIcon name="i-lucide-external-link" class="h-3.5 w-3.5 shrink-0" />
134
134
  {{ environment.url }}
135
135
  </a>
136
- <p v-if="environment.expiresAt" class="text-[11px] text-slate-500">
136
+ <p v-if="environment.expiresAt" class="text-[11px] text-dimmed">
137
137
  {{ t('environments.expires', { date: d(new Date(environment.expiresAt), 'long') }) }}
138
138
  </p>
139
139
  <!-- The resolved provision type + engine recorded at provision time, so a run states
140
140
  exactly what was provisioned and how (the what/where ÷ how split). -->
141
141
  <dl v-if="provisionTypeLabel || engineLabel" class="flex flex-wrap gap-x-4 gap-y-0.5">
142
142
  <div v-if="provisionTypeLabel" class="flex items-center gap-1 text-[11px]">
143
- <dt class="text-slate-500">{{ t('environments.provisionTypeLabel') }}</dt>
144
- <dd class="text-slate-300">{{ provisionTypeLabel }}</dd>
143
+ <dt class="text-dimmed">{{ t('environments.provisionTypeLabel') }}</dt>
144
+ <dd class="text-toned">{{ provisionTypeLabel }}</dd>
145
145
  </div>
146
146
  <div v-if="engineLabel" class="flex items-center gap-1 text-[11px]">
147
- <dt class="text-slate-500">{{ t('environments.engineLabel') }}</dt>
148
- <dd class="text-slate-300">{{ engineLabel }}</dd>
147
+ <dt class="text-dimmed">{{ t('environments.engineLabel') }}</dt>
148
+ <dd class="text-toned">{{ engineLabel }}</dd>
149
149
  </div>
150
150
  </dl>
151
151
  <!-- The verbatim provider error when the environment failed/expired. -->
152
152
  <pre
153
153
  v-if="failureShown"
154
- class="mt-1 max-h-32 overflow-auto whitespace-pre-wrap rounded border border-rose-900/60 bg-rose-950/40 p-1.5 text-[11px] text-rose-200/90"
154
+ class="mt-1 max-h-32 overflow-auto whitespace-pre-wrap rounded border border-app-error-900/60 bg-app-error-950/40 p-1.5 text-[11px] text-app-error-200/90"
155
155
  >{{ environment.lastError }}</pre>
156
156
  <!-- What the provider says it is still waiting on. Muted rather than alarming: an
157
157
  environment mid-rollout is healthy, and styling this like the error above would report
@@ -159,12 +159,12 @@ const envInTransition = computed(
159
159
  prose. -->
160
160
  <p
161
161
  v-if="statusNote"
162
- class="mt-1 max-h-32 overflow-auto whitespace-pre-wrap break-words text-[11px] text-slate-400"
162
+ class="mt-1 max-h-32 overflow-auto whitespace-pre-wrap break-words text-[11px] text-muted"
163
163
  >
164
164
  {{ t('environments.statusNote', { note: statusNote }) }}
165
165
  </p>
166
166
  </div>
167
- <p v-else class="text-[12px] text-slate-500">
167
+ <p v-else class="text-[12px] text-dimmed">
168
168
  {{ degradedReason ?? t('environments.empty') }}
169
169
  </p>
170
170
  </section>
@@ -17,11 +17,11 @@ const { t } = useI18n()
17
17
 
18
18
  <template>
19
19
  <section class="space-y-3" data-testid="env-setup-step-pick">
20
- <p class="text-sm text-slate-400">{{ t('environmentWizard.pick.intro') }}</p>
20
+ <p class="text-sm text-muted">{{ t('environmentWizard.pick.intro') }}</p>
21
21
  <!-- The one-service scope caveat, stated on the step that asks for the service: nothing
22
22
  here changes any other service, and running it twice just re-edits this one's recipe. -->
23
- <p class="text-xs leading-relaxed text-slate-500">{{ t('environmentWizard.pick.scope') }}</p>
24
- <p v-if="!store.serviceFrames.length" class="text-sm text-slate-500">
23
+ <p class="text-xs leading-relaxed text-dimmed">{{ t('environmentWizard.pick.scope') }}</p>
24
+ <p v-if="!store.serviceFrames.length" class="text-sm text-dimmed">
25
25
  {{ t('environmentWizard.pick.empty') }}
26
26
  </p>
27
27
  <div v-else class="space-y-1.5">
@@ -35,7 +35,7 @@ const PREFLIGHT_COLOR: Record<'pass' | 'warn' | 'fail', 'success' | 'warning' |
35
35
  <template>
36
36
  <section class="space-y-3" data-testid="env-setup-step-preflight">
37
37
  <div class="flex items-center justify-between gap-2">
38
- <p class="text-sm text-slate-400">{{ t('environmentWizard.preflight.intro') }}</p>
38
+ <p class="text-sm text-muted">{{ t('environmentWizard.preflight.intro') }}</p>
39
39
  <UButton
40
40
  size="xs"
41
41
  variant="soft"
@@ -51,21 +51,21 @@ const PREFLIGHT_COLOR: Record<'pass' | 'warn' | 'fail', 'success' | 'warning' |
51
51
 
52
52
  <p
53
53
  v-if="!store.recipe.prerequisites?.length"
54
- class="text-[12px] text-slate-500"
54
+ class="text-[12px] text-dimmed"
55
55
  data-testid="env-setup-preflight-none"
56
56
  >
57
57
  {{ t('environmentWizard.preflight.none') }}
58
58
  </p>
59
59
  <p
60
60
  v-else-if="preflightsUnavailable"
61
- class="text-[12px] text-amber-300/80"
61
+ class="text-[12px] text-app-warning-300/80"
62
62
  data-testid="env-setup-preflight-unavailable"
63
63
  >
64
64
  {{ t('environmentWizard.preflight.unavailable') }}
65
65
  </p>
66
66
  <p
67
67
  v-if="store.preflightError"
68
- class="text-[12px] text-rose-300/80"
68
+ class="text-[12px] text-app-error-300/80"
69
69
  data-testid="env-setup-preflight-error"
70
70
  >
71
71
  {{ store.preflightError }}
@@ -79,21 +79,21 @@ const PREFLIGHT_COLOR: Record<'pass' | 'warn' | 'fail', 'success' | 'warning' |
79
79
  <li
80
80
  v-for="r in store.preflightResults"
81
81
  :key="r.title"
82
- class="rounded border border-slate-800 bg-slate-900/40 p-2"
82
+ class="rounded border border-default bg-default/40 p-2"
83
83
  >
84
84
  <div class="flex items-center gap-2">
85
85
  <UBadge :color="PREFLIGHT_COLOR[r.status]" variant="subtle" size="sm">
86
86
  {{ r.status }}
87
87
  </UBadge>
88
- <span class="text-[12px] text-slate-200">{{ r.title }}</span>
89
- <span v-if="!r.required" class="ms-auto text-[10px] text-slate-500">
88
+ <span class="text-[12px] text-default">{{ r.title }}</span>
89
+ <span v-if="!r.required" class="ms-auto text-[10px] text-dimmed">
90
90
  {{ t('environmentWizard.preflight.optional') }}
91
91
  </span>
92
92
  </div>
93
- <p v-if="r.detail" class="mt-1 text-[11px] text-slate-400">{{ r.detail }}</p>
93
+ <p v-if="r.detail" class="mt-1 text-[11px] text-muted">{{ r.detail }}</p>
94
94
  <pre
95
95
  v-if="r.status !== 'pass' && r.remediation"
96
- class="mt-1 max-h-40 overflow-auto whitespace-pre-wrap rounded border border-amber-900/40 bg-amber-950/20 p-1.5 text-[11px] text-amber-200/90"
96
+ class="mt-1 max-h-40 overflow-auto whitespace-pre-wrap rounded border border-app-warning-900/40 bg-app-warning-950/20 p-1.5 text-[11px] text-app-warning-200/90"
97
97
  >{{ r.remediation }}</pre>
98
98
  </li>
99
99
  </ul>
@@ -113,8 +113,8 @@ const canLeaveReview = computed(
113
113
  <!-- detection status -->
114
114
  <div class="flex items-center justify-between gap-2">
115
115
  <div class="min-w-0">
116
- <p class="text-sm font-medium text-slate-200">{{ store.targetFrame?.title }}</p>
117
- <p class="text-[11px] text-slate-500">{{ t('environmentWizard.review.detectHint') }}</p>
116
+ <p class="text-sm font-medium text-default">{{ store.targetFrame?.title }}</p>
117
+ <p class="text-[11px] text-dimmed">{{ t('environmentWizard.review.detectHint') }}</p>
118
118
  </div>
119
119
  <UButton
120
120
  size="xs"
@@ -130,12 +130,12 @@ const canLeaveReview = computed(
130
130
  </UButton>
131
131
  </div>
132
132
 
133
- <p v-if="!store.hasRepo" class="text-[12px] text-amber-300/80">
133
+ <p v-if="!store.hasRepo" class="text-[12px] text-app-warning-300/80">
134
134
  {{ t('environmentWizard.review.noRepo') }}
135
135
  </p>
136
136
  <p
137
137
  v-else-if="store.detectError"
138
- class="text-[12px] text-rose-300/80"
138
+ class="text-[12px] text-app-error-300/80"
139
139
  data-testid="env-setup-detect-error"
140
140
  >
141
141
  {{ t('environmentWizard.review.detectError') }}
@@ -145,15 +145,11 @@ const canLeaveReview = computed(
145
145
  <!-- deep analysis (opt-in; elevated to a prominent nudge when the repo ships its own CLI) -->
146
146
  <div
147
147
  class="rounded-md border p-3"
148
- :class="
149
- repoCliHint
150
- ? 'border-primary-700/60 bg-primary-950/30'
151
- : 'border-slate-800 bg-slate-900/40'
152
- "
148
+ :class="repoCliHint ? 'border-primary/60 bg-primary/10' : 'border-default bg-default/40'"
153
149
  >
154
150
  <p
155
151
  v-if="repoCliHint"
156
- class="mb-2 flex items-start gap-1.5 text-[11px] text-primary-300"
152
+ class="mb-2 flex items-start gap-1.5 text-[11px] text-primary"
157
153
  data-testid="env-setup-cli-nudge"
158
154
  >
159
155
  <UIcon name="i-lucide-lightbulb" class="mt-0.5 h-3.5 w-3.5 shrink-0" />
@@ -161,10 +157,10 @@ const canLeaveReview = computed(
161
157
  </p>
162
158
  <div class="flex items-center justify-between gap-2">
163
159
  <div class="min-w-0">
164
- <p class="text-[12px] font-medium text-slate-300">
160
+ <p class="text-[12px] font-medium text-toned">
165
161
  {{ t('environmentWizard.analysis.title') }}
166
162
  </p>
167
- <p class="text-[11px] text-slate-500">{{ t('environmentWizard.analysis.hint') }}</p>
163
+ <p class="text-[11px] text-dimmed">{{ t('environmentWizard.analysis.hint') }}</p>
168
164
  </div>
169
165
  <UButton
170
166
  size="xs"
@@ -181,12 +177,15 @@ const canLeaveReview = computed(
181
177
  </div>
182
178
  <p
183
179
  v-if="!store.canAnalyze"
184
- class="mt-2 text-[11px] text-slate-500"
180
+ class="mt-2 text-[11px] text-dimmed"
185
181
  data-testid="env-setup-analysis-unavailable"
186
182
  >
187
183
  {{ t('environmentWizard.analysis.unavailable') }}
188
184
  </p>
189
- <p v-else-if="store.analysisStatus === 'failed'" class="mt-2 text-[11px] text-rose-300/80">
185
+ <p
186
+ v-else-if="store.analysisStatus === 'failed'"
187
+ class="mt-2 text-[11px] text-app-error-300/80"
188
+ >
190
189
  {{ t('environmentWizard.analysis.failed') }}
191
190
  </p>
192
191
  <div
@@ -194,7 +193,7 @@ const canLeaveReview = computed(
194
193
  class="mt-2 space-y-2"
195
194
  data-testid="env-setup-analysis-ready"
196
195
  >
197
- <p v-if="store.merged?.summary" class="text-[11px] leading-snug text-slate-400">
196
+ <p v-if="store.merged?.summary" class="text-[11px] leading-snug text-muted">
198
197
  {{ store.merged.summary }}
199
198
  </p>
200
199
  <UButton
@@ -212,7 +211,7 @@ const canLeaveReview = computed(
212
211
 
213
212
  <!-- per-field provenance -->
214
213
  <div v-if="store.merged?.fields.length" class="space-y-1.5">
215
- <p class="text-[11px] font-semibold uppercase tracking-wide text-slate-400">
214
+ <p class="text-[11px] font-semibold uppercase tracking-wide text-muted">
216
215
  {{ t('environmentWizard.review.provenanceTitle') }}
217
216
  </p>
218
217
  <div class="flex flex-wrap gap-1.5">
@@ -262,7 +261,7 @@ const canLeaveReview = computed(
262
261
 
263
262
  <!-- compose file layering -->
264
263
  <div v-if="composeFileCandidates.length" class="space-y-1.5">
265
- <p class="text-[11px] font-semibold uppercase tracking-wide text-slate-400">
264
+ <p class="text-[11px] font-semibold uppercase tracking-wide text-muted">
266
265
  {{ t('environmentWizard.review.composeFiles') }}
267
266
  </p>
268
267
  <div class="flex flex-wrap gap-1.5">
@@ -283,7 +282,7 @@ const canLeaveReview = computed(
283
282
 
284
283
  <!-- compose profiles -->
285
284
  <div v-if="profileCandidates.length" class="space-y-1.5">
286
- <p class="text-[11px] font-semibold uppercase tracking-wide text-slate-400">
285
+ <p class="text-[11px] font-semibold uppercase tracking-wide text-muted">
287
286
  {{ t('environmentWizard.review.profiles') }}
288
287
  </p>
289
288
  <div class="flex flex-wrap gap-1.5">
@@ -304,16 +303,16 @@ const canLeaveReview = computed(
304
303
 
305
304
  <!-- seed dumps -->
306
305
  <div v-if="seedDumpCandidates.length" class="space-y-1.5">
307
- <p class="text-[11px] font-semibold uppercase tracking-wide text-slate-400">
306
+ <p class="text-[11px] font-semibold uppercase tracking-wide text-muted">
308
307
  {{ t('environmentWizard.review.seedDumps') }}
309
308
  </p>
310
309
  <div class="space-y-1">
311
310
  <div
312
311
  v-for="c in seedDumpCandidates"
313
312
  :key="c.path"
314
- class="flex items-center justify-between gap-2 rounded border border-slate-800 bg-slate-900/40 px-2 py-1"
313
+ class="flex items-center justify-between gap-2 rounded border border-default bg-default/40 px-2 py-1"
315
314
  >
316
- <span class="truncate text-[11px] text-slate-300">{{ c.path }}</span>
315
+ <span class="truncate text-[11px] text-toned">{{ c.path }}</span>
317
316
  <UButton
318
317
  size="xs"
319
318
  :color="seedAdded(c.path) ? 'success' : 'neutral'"
@@ -352,7 +351,11 @@ const canLeaveReview = computed(
352
351
  class="w-full font-mono text-[11px]"
353
352
  data-testid="env-setup-raw-text"
354
353
  />
355
- <p v-if="rawError" class="text-[11px] text-rose-300/80" data-testid="env-setup-raw-error">
354
+ <p
355
+ v-if="rawError"
356
+ class="text-[11px] text-app-error-300/80"
357
+ data-testid="env-setup-raw-error"
358
+ >
356
359
  {{ rawError }}
357
360
  </p>
358
361
  <div class="flex justify-end">
@@ -31,7 +31,7 @@ useEnvironmentWizardTarget(() => props.input.frameId)
31
31
  <UInput v-model="store.handlerLabel" class="w-full" data-testid="env-setup-handler-label" />
32
32
  </UFormField>
33
33
 
34
- <div class="rounded-md border border-slate-800 bg-slate-900/40 p-3 text-[12px] text-slate-300">
34
+ <div class="rounded-md border border-default bg-default/40 p-3 text-[12px] text-toned">
35
35
  <p>
36
36
  {{
37
37
  t('environmentWizard.save.summary', {
@@ -44,7 +44,7 @@ useEnvironmentWizardTarget(() => props.input.frameId)
44
44
 
45
45
  <p
46
46
  v-if="store.saveError"
47
- class="text-[12px] text-rose-300/80"
47
+ class="text-[12px] text-app-error-300/80"
48
48
  data-testid="env-setup-save-error"
49
49
  >
50
50
  {{ store.saveError }}
@@ -66,7 +66,7 @@ useEnvironmentWizardTarget(() => props.input.frameId)
66
66
  <!-- saved: confirmation + optional trial provision -->
67
67
  <template v-else>
68
68
  <div
69
- class="flex items-center gap-2 rounded-md border border-emerald-800/50 bg-emerald-950/30 p-2 text-[12px] text-emerald-200"
69
+ class="flex items-center gap-2 rounded-md border border-app-success-800/50 bg-app-success-950/30 p-2 text-[12px] text-app-success-200"
70
70
  data-testid="env-setup-saved"
71
71
  >
72
72
  <UIcon name="i-lucide-check-circle" class="h-4 w-4" />
@@ -74,7 +74,7 @@ useEnvironmentWizardTarget(() => props.input.frameId)
74
74
  </div>
75
75
 
76
76
  <div class="flex items-center justify-between gap-2">
77
- <p class="text-[11px] text-slate-500">{{ t('environmentWizard.trial.hint') }}</p>
77
+ <p class="text-[11px] text-dimmed">{{ t('environmentWizard.trial.hint') }}</p>
78
78
  <UButton
79
79
  size="xs"
80
80
  variant="soft"
@@ -88,7 +88,9 @@ useEnvironmentWizardTarget(() => props.input.frameId)
88
88
  {{ t('environmentWizard.trial.run') }}
89
89
  </UButton>
90
90
  </div>
91
- <p v-if="store.trialError" class="text-[11px] text-rose-300/80">{{ store.trialError }}</p>
91
+ <p v-if="store.trialError" class="text-[11px] text-app-error-300/80">
92
+ {{ store.trialError }}
93
+ </p>
92
94
  <ProvisioningLogsDrawer v-if="store.trialStarted" subsystem="environment" />
93
95
  </template>
94
96
 
@@ -14,7 +14,7 @@ const { t } = useI18n()
14
14
  </script>
15
15
 
16
16
  <template>
17
- <div class="flex items-center justify-between border-t border-slate-800 pt-3">
17
+ <div class="flex items-center justify-between border-t border-default pt-3">
18
18
  <UButton
19
19
  color="neutral"
20
20
  variant="ghost"
@@ -95,14 +95,14 @@ function openApprovalFor(approvalId: string) {
95
95
  leave animation survives this component being unmounted by its v-if gate. -->
96
96
  <div
97
97
  v-if="block && statusMeta && typeMeta"
98
- class="absolute inset-0 z-30 flex flex-col bg-slate-950/95 backdrop-blur"
98
+ class="absolute inset-0 z-30 flex flex-col bg-app-950/95 backdrop-blur"
99
99
  role="dialog"
100
100
  aria-modal="true"
101
101
  data-testid="block-focus-view"
102
102
  :data-focus-block="block.id"
103
103
  >
104
104
  <!-- header / breadcrumb -->
105
- <header class="flex items-center gap-3 border-b border-slate-800 px-6 py-4">
105
+ <header class="flex items-center gap-3 border-b border-default px-6 py-4">
106
106
  <UButton
107
107
  icon="i-lucide-arrow-left"
108
108
  :ui="{ leadingIcon: 'rtl:-scale-x-100', trailingIcon: 'rtl:-scale-x-100' }"
@@ -113,16 +113,16 @@ function openApprovalFor(approvalId: string) {
113
113
  >
114
114
  {{ t('focus.board') }}
115
115
  </UButton>
116
- <UIcon name="i-lucide-chevron-right" class="h-4 w-4 text-slate-600 rtl:-scale-x-100" />
116
+ <UIcon name="i-lucide-chevron-right" class="h-4 w-4 text-app-600 rtl:-scale-x-100" />
117
117
  <div
118
118
  class="flex h-9 w-9 items-center justify-center rounded-lg"
119
- :style="{ backgroundColor: typeMeta.accent + '22' }"
119
+ :style="{ backgroundColor: tint(typeMeta.accent) }"
120
120
  >
121
121
  <UIcon :name="typeMeta.icon" class="h-5 w-5" :style="{ color: typeMeta.accent }" />
122
122
  </div>
123
123
  <div>
124
- <h1 class="text-lg font-semibold text-white">{{ block.title }}</h1>
125
- <div class="text-xs text-slate-500">
124
+ <h1 class="text-lg font-semibold text-highlighted">{{ block.title }}</h1>
125
+ <div class="text-xs text-dimmed">
126
126
  {{ t('focus.typeSubtitle', { type: typeMeta.label }) }}
127
127
  </div>
128
128
  </div>
@@ -199,11 +199,11 @@ function openApprovalFor(approvalId: string) {
199
199
  <div class="grid flex-1 grid-cols-[1fr_300px] gap-6 overflow-hidden p-6">
200
200
  <!-- main: pipeline flow -->
201
201
  <section
202
- class="flex flex-col overflow-auto rounded-2xl border border-slate-800 bg-slate-900/60 p-6"
202
+ class="flex flex-col overflow-auto rounded-2xl border border-default bg-default/60 p-6"
203
203
  >
204
204
  <div class="mb-4 flex items-center gap-2">
205
- <UIcon name="i-lucide-workflow" class="h-4 w-4 text-slate-500" />
206
- <h2 class="text-sm font-semibold uppercase tracking-wide text-slate-400">
205
+ <UIcon name="i-lucide-workflow" class="h-4 w-4 text-dimmed" />
206
+ <h2 class="text-sm font-semibold uppercase tracking-wide text-muted">
207
207
  {{ instance ? instance.pipelineName : t('focus.noPipelineRunning') }}
208
208
  </h2>
209
209
  </div>
@@ -217,33 +217,31 @@ function openApprovalFor(approvalId: string) {
217
217
 
218
218
  <div
219
219
  v-else
220
- class="flex flex-1 items-center justify-center rounded-xl border border-dashed border-slate-700 text-sm text-slate-500"
220
+ class="flex flex-1 items-center justify-center rounded-xl border border-dashed border-muted text-sm text-dimmed"
221
221
  >
222
222
  {{ t('focus.emptyPipelineHint') }}
223
223
  </div>
224
224
  </section>
225
225
 
226
226
  <!-- side: details -->
227
- <aside
228
- class="space-y-4 overflow-auto rounded-2xl border border-slate-800 bg-slate-900/60 p-5"
229
- >
227
+ <aside class="space-y-4 overflow-auto rounded-2xl border border-default bg-default/60 p-5">
230
228
  <div>
231
- <div class="mb-1 text-[11px] font-semibold uppercase tracking-wide text-slate-400">
229
+ <div class="mb-1 text-[11px] font-semibold uppercase tracking-wide text-muted">
232
230
  {{ t('focus.description') }}
233
231
  </div>
234
- <p class="text-sm text-slate-300">{{ block.description }}</p>
232
+ <p class="text-sm text-toned">{{ block.description }}</p>
235
233
  </div>
236
234
  <div v-if="instance">
237
- <div class="mb-1 text-[11px] font-semibold uppercase tracking-wide text-slate-400">
235
+ <div class="mb-1 text-[11px] font-semibold uppercase tracking-wide text-muted">
238
236
  {{ t('focus.overallProgress') }}
239
237
  </div>
240
238
  <UProgress :model-value="Math.round(block.progress * 100)" />
241
- <div class="mt-1 text-[11px] text-slate-400">
239
+ <div class="mt-1 text-[11px] text-muted">
242
240
  {{ n(block.progress, 'percent') }}
243
241
  </div>
244
242
  </div>
245
243
  <div>
246
- <div class="mb-1 text-[11px] font-semibold uppercase tracking-wide text-slate-400">
244
+ <div class="mb-1 text-[11px] font-semibold uppercase tracking-wide text-muted">
247
245
  {{ t('focus.dependencies') }}
248
246
  </div>
249
247
  <div v-if="deps.length" class="flex flex-wrap gap-1">
@@ -251,7 +249,7 @@ function openApprovalFor(approvalId: string) {
251
249
  {{ d.title }}
252
250
  </UBadge>
253
251
  </div>
254
- <div v-else class="text-[11px] text-slate-500">{{ t('focus.noDependencies') }}</div>
252
+ <div v-else class="text-[11px] text-dimmed">{{ t('focus.noDependencies') }}</div>
255
253
  </div>
256
254
  </aside>
257
255
  </div>