@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
@@ -357,20 +357,20 @@ async function save() {
357
357
  <div class="space-y-6">
358
358
  <!-- Run-timing escalation -->
359
359
  <section class="space-y-2">
360
- <h3 class="text-sm font-semibold text-slate-200">
360
+ <h3 class="text-sm font-semibold text-default">
361
361
  {{ t('settings.workspaceSettings.waiting.heading') }}
362
362
  </h3>
363
- <p class="text-[11px] text-slate-400">
363
+ <p class="text-[11px] text-muted">
364
364
  <i18n-t keypath="settings.workspaceSettings.waiting.body" tag="span" scope="global">
365
365
  <template #overdue>
366
- <span class="text-error-400">{{
366
+ <span class="text-app-error-400">{{
367
367
  t('settings.workspaceSettings.waiting.overdue')
368
368
  }}</span>
369
369
  </template>
370
370
  </i18n-t>
371
371
  </p>
372
372
  <label class="block w-48">
373
- <span class="mb-1 block text-[10px] uppercase tracking-wide text-slate-500">
373
+ <span class="mb-1 block text-[10px] uppercase tracking-wide text-dimmed">
374
374
  {{ t('settings.workspaceSettings.waiting.escalateAfter') }}
375
375
  </span>
376
376
  <UInput
@@ -384,14 +384,14 @@ async function save() {
384
384
 
385
385
  <!-- Per-service running-task limit -->
386
386
  <section class="space-y-2">
387
- <h3 class="text-sm font-semibold text-slate-200">
387
+ <h3 class="text-sm font-semibold text-default">
388
388
  {{ t('settings.workspaceSettings.taskLimit.heading') }}
389
389
  </h3>
390
- <p class="text-[11px] text-slate-400">
390
+ <p class="text-[11px] text-muted">
391
391
  {{ t('settings.workspaceSettings.taskLimit.body') }}
392
392
  </p>
393
393
  <label class="block w-64">
394
- <span class="mb-1 block text-[10px] uppercase tracking-wide text-slate-500">{{
394
+ <span class="mb-1 block text-[10px] uppercase tracking-wide text-dimmed">{{
395
395
  t('settings.workspaceSettings.taskLimit.mode')
396
396
  }}</span>
397
397
  <USelect
@@ -404,7 +404,7 @@ async function save() {
404
404
  </label>
405
405
 
406
406
  <label v-if="draft.taskLimitMode === 'shared'" class="block w-48">
407
- <span class="mb-1 block text-[10px] uppercase tracking-wide text-slate-500">
407
+ <span class="mb-1 block text-[10px] uppercase tracking-wide text-dimmed">
408
408
  {{ t('settings.workspaceSettings.taskLimit.maxRunning') }}
409
409
  </span>
410
410
  <UInput v-model.number="draft.taskLimitShared" type="number" :min="1" size="sm" />
@@ -412,7 +412,7 @@ async function save() {
412
412
 
413
413
  <div v-else-if="draft.taskLimitMode === 'per_type'" class="grid grid-cols-2 gap-3">
414
414
  <label v-for="taskType in TASK_TYPES" :key="taskType" class="block">
415
- <span class="mb-1 block text-[10px] uppercase tracking-wide text-slate-500">
415
+ <span class="mb-1 block text-[10px] uppercase tracking-wide text-dimmed">
416
416
  {{ maxTaskTypeLabel(taskType) }}
417
417
  </span>
418
418
  <UInput
@@ -428,14 +428,14 @@ async function save() {
428
428
  <!-- The pre-dispatch input gate: the structural check of a task's own wording, run
429
429
  before a run's first agent step is dispatched. -->
430
430
  <section class="space-y-2">
431
- <h3 class="text-sm font-semibold text-slate-200">
431
+ <h3 class="text-sm font-semibold text-default">
432
432
  {{ t('settings.workspaceSettings.inputGate.heading') }}
433
433
  </h3>
434
- <p class="text-[11px] text-slate-400">
434
+ <p class="text-[11px] text-muted">
435
435
  {{ t('settings.workspaceSettings.inputGate.body') }}
436
436
  </p>
437
437
  <label class="block w-64">
438
- <span class="mb-1 block text-[10px] uppercase tracking-wide text-slate-500">{{
438
+ <span class="mb-1 block text-[10px] uppercase tracking-wide text-dimmed">{{
439
439
  t('settings.workspaceSettings.inputGate.mode')
440
440
  }}</span>
441
441
  <USelect
@@ -451,14 +451,14 @@ async function save() {
451
451
 
452
452
  <!-- Review-debt friction on task creation -->
453
453
  <section class="space-y-2">
454
- <h3 class="text-sm font-semibold text-slate-200">
454
+ <h3 class="text-sm font-semibold text-default">
455
455
  {{ t('settings.workspaceSettings.reviewFriction.heading') }}
456
456
  </h3>
457
- <p class="text-[11px] text-slate-400">
457
+ <p class="text-[11px] text-muted">
458
458
  {{ t('settings.workspaceSettings.reviewFriction.body') }}
459
459
  </p>
460
460
  <label class="block w-64">
461
- <span class="mb-1 block text-[10px] uppercase tracking-wide text-slate-500">{{
461
+ <span class="mb-1 block text-[10px] uppercase tracking-wide text-dimmed">{{
462
462
  t('settings.workspaceSettings.reviewFriction.mode')
463
463
  }}</span>
464
464
  <USelect
@@ -471,7 +471,7 @@ async function save() {
471
471
  </label>
472
472
 
473
473
  <label v-if="draft.reviewFrictionMode !== 'off'" class="block w-48">
474
- <span class="mb-1 block text-[10px] uppercase tracking-wide text-slate-500">
474
+ <span class="mb-1 block text-[10px] uppercase tracking-wide text-dimmed">
475
475
  {{ t('settings.workspaceSettings.reviewFriction.warnCount') }}
476
476
  </span>
477
477
  <UInput
@@ -483,17 +483,17 @@ async function save() {
483
483
  </label>
484
484
 
485
485
  <div v-if="draft.reviewFrictionMode === 'enforce'" class="space-y-2">
486
- <p class="text-[11px] text-slate-400">
486
+ <p class="text-[11px] text-muted">
487
487
  {{ t('settings.workspaceSettings.reviewFriction.enforceHint') }}
488
488
  </p>
489
489
  <label class="flex items-center gap-2">
490
490
  <USwitch v-model="draft.reviewFrictionBlockCountEnabled" size="sm" />
491
- <span class="text-[13px] text-slate-300">{{
491
+ <span class="text-[13px] text-toned">{{
492
492
  t('settings.workspaceSettings.reviewFriction.blockCountToggle')
493
493
  }}</span>
494
494
  </label>
495
495
  <label v-if="draft.reviewFrictionBlockCountEnabled" class="block w-48">
496
- <span class="mb-1 block text-[10px] uppercase tracking-wide text-slate-500">
496
+ <span class="mb-1 block text-[10px] uppercase tracking-wide text-dimmed">
497
497
  {{ t('settings.workspaceSettings.reviewFriction.blockCount') }}
498
498
  </span>
499
499
  <UInput
@@ -505,12 +505,12 @@ async function save() {
505
505
  </label>
506
506
  <label class="flex items-center gap-2">
507
507
  <USwitch v-model="draft.reviewFrictionBlockStuckEnabled" size="sm" />
508
- <span class="text-[13px] text-slate-300">{{
508
+ <span class="text-[13px] text-toned">{{
509
509
  t('settings.workspaceSettings.reviewFriction.blockStuckToggle')
510
510
  }}</span>
511
511
  </label>
512
512
  <label v-if="draft.reviewFrictionBlockStuckEnabled" class="block w-48">
513
- <span class="mb-1 block text-[10px] uppercase tracking-wide text-slate-500">
513
+ <span class="mb-1 block text-[10px] uppercase tracking-wide text-dimmed">
514
514
  {{ t('settings.workspaceSettings.reviewFriction.blockStuckMinutes') }}
515
515
  </span>
516
516
  <UInput
@@ -525,15 +525,15 @@ async function save() {
525
525
 
526
526
  <!-- Agent observability -->
527
527
  <section class="space-y-2">
528
- <h3 class="text-sm font-semibold text-slate-200">
528
+ <h3 class="text-sm font-semibold text-default">
529
529
  {{ t('settings.workspaceSettings.observability.heading') }}
530
530
  </h3>
531
- <p class="text-[11px] text-slate-400">
531
+ <p class="text-[11px] text-muted">
532
532
  {{ t('settings.workspaceSettings.observability.body') }}
533
533
  </p>
534
534
  <label class="flex items-center gap-2">
535
535
  <USwitch v-model="draft.storeAgentContext" size="sm" />
536
- <span class="text-sm text-slate-200">{{
536
+ <span class="text-sm text-default">{{
537
537
  t('settings.workspaceSettings.observability.toggle')
538
538
  }}</span>
539
539
  </label>
@@ -541,15 +541,15 @@ async function save() {
541
541
 
542
542
  <!-- Engine-maintained PR verification report -->
543
543
  <section class="space-y-2">
544
- <h3 class="text-sm font-semibold text-slate-200">
544
+ <h3 class="text-sm font-semibold text-default">
545
545
  {{ t('settings.workspaceSettings.prReport.heading') }}
546
546
  </h3>
547
- <p class="text-[11px] text-slate-400">
547
+ <p class="text-[11px] text-muted">
548
548
  {{ t('settings.workspaceSettings.prReport.body') }}
549
549
  </p>
550
550
  <label class="flex items-center gap-2">
551
551
  <USwitch v-model="draft.publishPrVerificationReport" size="sm" />
552
- <span class="text-sm text-slate-200">{{
552
+ <span class="text-sm text-default">{{
553
553
  t('settings.workspaceSettings.prReport.toggle')
554
554
  }}</span>
555
555
  </label>
@@ -557,14 +557,14 @@ async function save() {
557
557
 
558
558
  <!-- Visual-confirmation artifact retention -->
559
559
  <section class="space-y-2">
560
- <h3 class="text-sm font-semibold text-slate-200">
560
+ <h3 class="text-sm font-semibold text-default">
561
561
  {{ t('settings.workspaceSettings.retention.heading') }}
562
562
  </h3>
563
- <p class="text-[11px] text-slate-400">
563
+ <p class="text-[11px] text-muted">
564
564
  {{ t('settings.workspaceSettings.retention.body') }}
565
565
  </p>
566
566
  <label class="block w-48">
567
- <span class="mb-1 block text-[10px] uppercase tracking-wide text-slate-500">
567
+ <span class="mb-1 block text-[10px] uppercase tracking-wide text-dimmed">
568
568
  {{ t('settings.workspaceSettings.retention.days') }}
569
569
  </span>
570
570
  <UInput
@@ -579,14 +579,14 @@ async function save() {
579
579
 
580
580
  <!-- What the board's Done swimlane keeps in view -->
581
581
  <section class="space-y-2">
582
- <h3 class="text-sm font-semibold text-slate-200">
582
+ <h3 class="text-sm font-semibold text-default">
583
583
  {{ t('settings.workspaceSettings.doneLane.heading') }}
584
584
  </h3>
585
- <p class="text-[11px] text-slate-400">
585
+ <p class="text-[11px] text-muted">
586
586
  {{ t('settings.workspaceSettings.doneLane.body') }}
587
587
  </p>
588
588
  <label class="block w-48">
589
- <span class="mb-1 block text-[10px] uppercase tracking-wide text-slate-500">
589
+ <span class="mb-1 block text-[10px] uppercase tracking-wide text-dimmed">
590
590
  {{ t('settings.workspaceSettings.doneLane.maxItems') }}
591
591
  </span>
592
592
  <UInput
@@ -598,17 +598,17 @@ async function save() {
598
598
  data-testid="done-lane-max-items"
599
599
  />
600
600
  </label>
601
- <p v-if="draft.doneLaneMaxItems === 0" class="text-[11px] text-slate-500">
601
+ <p v-if="draft.doneLaneMaxItems === 0" class="text-[11px] text-dimmed">
602
602
  {{ t('settings.workspaceSettings.doneLane.zeroHint') }}
603
603
  </p>
604
604
  <label class="flex items-center gap-2">
605
605
  <UCheckbox v-model="draft.doneLaneRetentionEnabled" size="sm" />
606
- <span class="text-[11px] text-slate-300">{{
606
+ <span class="text-[11px] text-toned">{{
607
607
  t('settings.workspaceSettings.doneLane.ageToggle')
608
608
  }}</span>
609
609
  </label>
610
610
  <label v-if="draft.doneLaneRetentionEnabled" class="block w-48">
611
- <span class="mb-1 block text-[10px] uppercase tracking-wide text-slate-500">
611
+ <span class="mb-1 block text-[10px] uppercase tracking-wide text-dimmed">
612
612
  {{ t('settings.workspaceSettings.doneLane.days') }}
613
613
  </span>
614
614
  <UInput
@@ -620,17 +620,17 @@ async function save() {
620
620
  data-testid="done-lane-retention-days"
621
621
  />
622
622
  </label>
623
- <p class="text-[11px] text-slate-500">
623
+ <p class="text-[11px] text-dimmed">
624
624
  {{ t('settings.workspaceSettings.doneLane.hidesOnlyHint') }}
625
625
  </p>
626
626
  </section>
627
627
 
628
628
  <!-- Run credential: the App installation vs. the initiator's own token -->
629
629
  <section class="space-y-2">
630
- <h3 class="text-sm font-semibold text-slate-200">
630
+ <h3 class="text-sm font-semibold text-default">
631
631
  {{ t('settings.workspaceSettings.runCredential.heading') }}
632
632
  </h3>
633
- <p class="text-[11px] text-slate-400">
633
+ <p class="text-[11px] text-muted">
634
634
  {{ t('settings.workspaceSettings.runCredential.body') }}
635
635
  </p>
636
636
  <label class="flex items-center gap-2">
@@ -639,18 +639,18 @@ async function save() {
639
639
  size="sm"
640
640
  data-testid="allow-initiator-pat"
641
641
  />
642
- <span class="text-sm text-slate-200">{{
642
+ <span class="text-sm text-default">{{
643
643
  t('settings.workspaceSettings.runCredential.toggle')
644
644
  }}</span>
645
645
  </label>
646
- <p v-if="!draft.allowInitiatorPat" class="text-[11px] text-amber-300">
646
+ <p v-if="!draft.allowInitiatorPat" class="text-[11px] text-app-warning-300">
647
647
  {{ t('settings.workspaceSettings.runCredential.offHint') }}
648
648
  </p>
649
649
  <!-- Stated rather than read: the account floor lives behind an ACCOUNT-admin
650
650
  endpoint, which a workspace admin may not hold, so probing it here would 403
651
651
  for exactly the people this note is for. A static line sets the expectation
652
652
  without pretending to report a value we cannot see. -->
653
- <p v-if="draft.allowInitiatorPat" class="text-[11px] text-slate-500">
653
+ <p v-if="draft.allowInitiatorPat" class="text-[11px] text-dimmed">
654
654
  {{ t('settings.workspaceSettings.runCredential.accountFloorNote') }}
655
655
  </p>
656
656
  </section>
@@ -659,10 +659,10 @@ async function save() {
659
659
  It is a property of how this team fixes bugs rather than of any one hunt, which
660
660
  is why it is a board setting and not a field on the expedition. -->
661
661
  <section class="space-y-2">
662
- <h3 class="text-sm font-semibold text-slate-200">
662
+ <h3 class="text-sm font-semibold text-default">
663
663
  {{ t('settings.workspaceSettings.bugFishing.heading') }}
664
664
  </h3>
665
- <p class="text-[11px] text-slate-400">
665
+ <p class="text-[11px] text-muted">
666
666
  {{ t('settings.workspaceSettings.bugFishing.body') }}
667
667
  </p>
668
668
  <USelectMenu
@@ -677,15 +677,15 @@ async function save() {
677
677
 
678
678
  <!-- Kaizen agent -->
679
679
  <section class="space-y-2">
680
- <h3 class="text-sm font-semibold text-slate-200">
680
+ <h3 class="text-sm font-semibold text-default">
681
681
  {{ t('settings.workspaceSettings.kaizen.heading') }}
682
682
  </h3>
683
- <p class="text-[11px] text-slate-400">
683
+ <p class="text-[11px] text-muted">
684
684
  {{ t('settings.workspaceSettings.kaizen.body') }}
685
685
  </p>
686
686
  <label class="flex items-center gap-2">
687
687
  <USwitch v-model="draft.kaizenEnabled" size="sm" />
688
- <span class="text-sm text-slate-200">{{
688
+ <span class="text-sm text-default">{{
689
689
  t('settings.workspaceSettings.kaizen.toggle')
690
690
  }}</span>
691
691
  </label>
@@ -63,7 +63,7 @@ function toggle(id: string) {
63
63
  <template>
64
64
  <div>
65
65
  <div class="mb-1 flex items-center justify-between gap-2">
66
- <span class="text-[11px] font-semibold uppercase tracking-wide text-slate-400">
66
+ <span class="text-[11px] font-semibold uppercase tracking-wide text-muted">
67
67
  {{ t('skills.reviewQueue.label') }}
68
68
  </span>
69
69
  <UPopover v-model:open="open" :content="{ align: 'end' }">
@@ -87,8 +87,8 @@ function toggle(id: string) {
87
87
  v-for="s in offered"
88
88
  :key="s.id"
89
89
  type="button"
90
- class="flex w-full items-start gap-2 rounded px-2 py-1.5 text-start text-sm hover:bg-slate-800/60 disabled:cursor-not-allowed disabled:opacity-40"
91
- :class="selectedSet.has(s.id) ? 'text-slate-100' : 'text-slate-300'"
90
+ class="flex w-full items-start gap-2 rounded px-2 py-1.5 text-start text-sm hover:bg-elevated/60 disabled:cursor-not-allowed disabled:opacity-40"
91
+ :class="selectedSet.has(s.id) ? 'text-app-100' : 'text-toned'"
92
92
  :disabled="atCap && !selectedSet.has(s.id)"
93
93
  :aria-pressed="selectedSet.has(s.id)"
94
94
  :data-testid="`review-skill-option-${s.id}`"
@@ -97,28 +97,28 @@ function toggle(id: string) {
97
97
  <UIcon
98
98
  :name="selectedSet.has(s.id) ? 'i-lucide-check' : 'i-lucide-plus'"
99
99
  class="mt-0.5 h-4 w-4 shrink-0"
100
- :class="selectedSet.has(s.id) ? 'text-primary-400' : 'text-slate-500'"
100
+ :class="selectedSet.has(s.id) ? 'text-primary' : 'text-dimmed'"
101
101
  />
102
102
  <span class="min-w-0 flex-1">
103
103
  <span class="block truncate">{{ s.name }}</span>
104
- <span class="block truncate text-[11px] text-slate-500">
104
+ <span class="block truncate text-[11px] text-dimmed">
105
105
  {{ s.description }}
106
106
  </span>
107
107
  </span>
108
108
  </button>
109
109
  </template>
110
- <p v-else class="px-2 py-3 text-[12px] text-slate-500">
110
+ <p v-else class="px-2 py-3 text-[12px] text-dimmed">
111
111
  {{ t('skills.reviewQueue.pickerEmpty') }}
112
112
  </p>
113
113
  </div>
114
114
 
115
115
  <p
116
116
  v-if="atCap"
117
- class="border-t border-slate-800 px-2 py-1.5 text-[11px] text-amber-400"
117
+ class="border-t border-default px-2 py-1.5 text-[11px] text-app-warning-400"
118
118
  >
119
119
  {{ t('skills.reviewQueue.capped', { max: MAX_REVIEW_SKILLS }) }}
120
120
  </p>
121
- <div class="flex justify-end border-t border-slate-800 p-1.5">
121
+ <div class="flex justify-end border-t border-default p-1.5">
122
122
  <UButton
123
123
  size="xs"
124
124
  color="neutral"
@@ -145,11 +145,11 @@ function toggle(id: string) {
145
145
  data-testid="review-skill-badge"
146
146
  @click="toggle(s.id)"
147
147
  >
148
- <span class="me-1 tabular-nums text-slate-400">{{ i + 1 }}</span>
148
+ <span class="me-1 tabular-nums text-muted">{{ i + 1 }}</span>
149
149
  {{ s.name }}<UIcon name="i-lucide-x" class="ms-0.5 h-3 w-3" />
150
150
  </UBadge>
151
151
  </div>
152
- <p v-else class="text-[11px] text-slate-500">
152
+ <p v-else class="text-[11px] text-dimmed">
153
153
  {{ t('skills.reviewQueue.hint') }}
154
154
  </p>
155
155
  </div>
@@ -152,7 +152,7 @@ async function unlinkSource(id: string) {
152
152
  with a raw 503 — say so instead. -->
153
153
  <div
154
154
  v-if="library.available === false"
155
- class="rounded-md border border-slate-800 bg-slate-900/40 p-3 text-sm text-slate-400"
155
+ class="rounded-md border border-default bg-default/40 p-3 text-sm text-muted"
156
156
  >
157
157
  {{ t('skills.unavailable') }}
158
158
  </div>
@@ -164,24 +164,27 @@ async function unlinkSource(id: string) {
164
164
  <div
165
165
  v-for="s in library.catalog"
166
166
  :key="s.id"
167
- class="flex items-start gap-2 rounded-md border border-slate-800 bg-slate-900/60 p-3"
167
+ class="flex items-start gap-2 rounded-md border border-default bg-default/60 p-3"
168
168
  >
169
- <UIcon name="i-lucide-book-open-check" class="mt-0.5 h-4 w-4 shrink-0 text-sky-400" />
169
+ <UIcon
170
+ name="i-lucide-book-open-check"
171
+ class="mt-0.5 h-4 w-4 shrink-0 text-app-info-400"
172
+ />
170
173
  <div class="min-w-0 flex-1">
171
174
  <div class="flex items-center gap-2">
172
- <p class="truncate text-sm font-medium text-slate-100">{{ s.name }}</p>
175
+ <p class="truncate text-sm font-medium text-app-100">{{ s.name }}</p>
173
176
  <UBadge color="neutral" variant="subtle" size="sm" class="shrink-0">
174
177
  {{ t(SKILL_GROUP_LABEL_KEYS[s.group]) }}
175
178
  </UBadge>
176
179
  </div>
177
- <p class="text-xs text-slate-400">{{ s.description }}</p>
180
+ <p class="text-xs text-muted">{{ s.description }}</p>
178
181
  <!-- The manifest declared a group this build does not know (a typo, or a member
179
182
  retired since the sync). It is filed under Other, and saying which value was
180
183
  declared is what lets the author fix their frontmatter. -->
181
- <p v-if="s.declaredGroup" class="mt-1 text-[11px] text-amber-400">
184
+ <p v-if="s.declaredGroup" class="mt-1 text-[11px] text-app-warning-400">
182
185
  {{ t('skills.catalog.groupUnknown', { group: s.declaredGroup }) }}
183
186
  </p>
184
- <p class="mt-1 flex flex-wrap gap-x-3 text-[11px] text-slate-500">
187
+ <p class="mt-1 flex flex-wrap gap-x-3 text-[11px] text-dimmed">
185
188
  <span v-if="s.resources.length">
186
189
  {{ t('skills.catalog.resources', { count: s.resources.length }) }}
187
190
  </span>
@@ -191,7 +194,7 @@ async function unlinkSource(id: string) {
191
194
  </p>
192
195
  </div>
193
196
  </div>
194
- <p v-if="!library.catalog.length" class="text-sm text-slate-500">
197
+ <p v-if="!library.catalog.length" class="text-sm text-dimmed">
195
198
  {{ t('skills.catalog.empty') }}
196
199
  </p>
197
200
  </div>
@@ -202,15 +205,15 @@ async function unlinkSource(id: string) {
202
205
  <div
203
206
  v-for="s in library.sources"
204
207
  :key="s.id"
205
- class="flex items-center gap-2 rounded-md border border-slate-800 bg-slate-900/60 p-3"
208
+ class="flex items-center gap-2 rounded-md border border-default bg-default/60 p-3"
206
209
  >
207
- <UIcon name="i-lucide-git-branch" class="h-4 w-4 text-slate-400" />
210
+ <UIcon name="i-lucide-git-branch" class="h-4 w-4 text-muted" />
208
211
  <div class="min-w-0">
209
- <span class="font-mono text-sm text-slate-100">
212
+ <span class="font-mono text-sm text-app-100">
210
213
  {{ s.repoOwner }}/{{ s.repoName
211
- }}<span class="text-slate-500">/{{ s.dirPath || '' }}</span>
214
+ }}<span class="text-dimmed">/{{ s.dirPath || '' }}</span>
212
215
  </span>
213
- <p class="text-xs text-slate-500">
216
+ <p class="text-xs text-dimmed">
214
217
  {{
215
218
  s.lastSyncedAt
216
219
  ? t('skills.sources.metaSynced', {
@@ -258,18 +261,18 @@ async function unlinkSource(id: string) {
258
261
  />
259
262
  </div>
260
263
  </div>
261
- <p v-if="!library.sources.length" class="text-sm text-slate-500">
264
+ <p v-if="!library.sources.length" class="text-sm text-dimmed">
262
265
  {{ t('skills.sources.empty') }}
263
266
  </p>
264
267
 
265
268
  <!-- Link a new source. Needs the GitHub integration; hide the form when it's off. -->
266
269
  <div
267
270
  v-if="!library.sourcesAvailable"
268
- class="rounded-md border border-slate-800 bg-slate-900/40 p-3 text-sm text-slate-500"
271
+ class="rounded-md border border-default bg-default/40 p-3 text-sm text-dimmed"
269
272
  >
270
273
  {{ t('skills.sources.githubRequired') }}
271
274
  </div>
272
- <div v-else class="rounded-md border border-slate-800 p-3">
275
+ <div v-else class="rounded-md border border-default p-3">
273
276
  <p class="mb-2 text-sm font-medium">{{ t('skills.sources.linkTitle') }}</p>
274
277
  <div class="flex flex-col gap-2">
275
278
  <!-- Connected: search a repo + browse to the skills directory -->
@@ -277,16 +280,16 @@ async function unlinkSource(id: string) {
277
280
  <GitHubRepoSearchSelect v-model="sourceRepoId" @update:repo="sourceRepo = $event" />
278
281
  <div
279
282
  v-if="sourceRepoId !== undefined"
280
- class="rounded-md border border-slate-800 bg-slate-900/40 p-2"
283
+ class="rounded-md border border-default bg-default/40 p-2"
281
284
  >
282
- <p class="mb-2 text-xs text-slate-400">
285
+ <p class="mb-2 text-xs text-muted">
283
286
  {{ t('skills.sources.browseHint') }}
284
287
  </p>
285
288
  <RepoTreeBrowser v-model="sourceDir" :repo-github-id="sourceRepoId" mode="dir" />
286
- <p class="mt-2 truncate text-xs text-slate-400">
289
+ <p class="mt-2 truncate text-xs text-muted">
287
290
  <template v-if="sourceDir">
288
291
  {{ t('skills.sources.selectedDir') }}
289
- <code class="text-slate-200">{{ sourceDir }}</code>
292
+ <code class="text-default">{{ sourceDir }}</code>
290
293
  </template>
291
294
  <template v-else>{{ t('skills.sources.wholeRepo') }}</template>
292
295
  </p>
@@ -208,12 +208,12 @@ async function saveMapping() {
208
208
  </template>
209
209
  <template #body>
210
210
  <div class="space-y-5">
211
- <p class="text-xs text-slate-400">
211
+ <p class="text-xs text-muted">
212
212
  {{ t('slack.panel.intro') }}
213
213
  </p>
214
214
 
215
215
  <!-- not connected: connect UI -->
216
- <div v-if="!slack.connected" class="space-y-3 rounded-lg border border-slate-700 p-3">
216
+ <div v-if="!slack.connected" class="space-y-3 rounded-lg border border-muted p-3">
217
217
  <UButton
218
218
  v-if="slack.oauthEnabled"
219
219
  color="primary"
@@ -224,7 +224,7 @@ async function saveMapping() {
224
224
  {{ t('slack.connect.addToSlack') }}
225
225
  </UButton>
226
226
  <div class="space-y-1">
227
- <span class="block text-[10px] uppercase tracking-wide text-slate-500">
227
+ <span class="block text-[10px] uppercase tracking-wide text-dimmed">
228
228
  {{ t('slack.connect.orPasteToken') }}
229
229
  </span>
230
230
  <div class="flex gap-2">
@@ -245,11 +245,9 @@ async function saveMapping() {
245
245
 
246
246
  <!-- connected -->
247
247
  <template v-else>
248
- <div
249
- class="flex items-center gap-2 rounded-lg border border-slate-700 bg-slate-800/40 p-3"
250
- >
251
- <UIcon name="i-lucide-slack" class="text-emerald-400" />
252
- <span class="flex-1 text-sm text-slate-200">
248
+ <div class="flex items-center gap-2 rounded-lg border border-muted bg-elevated/40 p-3">
249
+ <UIcon name="i-lucide-slack" class="text-app-success-400" />
250
+ <span class="flex-1 text-sm text-default">
253
251
  <i18n-t keypath="slack.connected.label" tag="span">
254
252
  <template #team>
255
253
  <span class="font-semibold">{{ slack.connection?.teamName }}</span>
@@ -269,16 +267,16 @@ async function saveMapping() {
269
267
 
270
268
  <!-- routing -->
271
269
  <div class="space-y-3">
272
- <p class="text-[11px] font-semibold uppercase tracking-wide text-slate-400">
270
+ <p class="text-[11px] font-semibold uppercase tracking-wide text-muted">
273
271
  {{ t('slack.routing.heading') }}
274
272
  </p>
275
273
  <div
276
274
  v-for="row in ROUTABLE"
277
275
  :key="row.type"
278
- class="flex items-center gap-3 rounded-lg border border-slate-700 bg-slate-800/40 p-2"
276
+ class="flex items-center gap-3 rounded-lg border border-muted bg-elevated/40 p-2"
279
277
  >
280
278
  <USwitch v-model="routes[row.type]!.enabled" size="sm" />
281
- <span class="w-32 text-sm text-slate-300">{{ row.label }}</span>
279
+ <span class="w-32 text-sm text-toned">{{ row.label }}</span>
282
280
  <UInput
283
281
  v-model="routes[row.type]!.channel"
284
282
  size="sm"
@@ -294,7 +292,7 @@ async function saveMapping() {
294
292
 
295
293
  <label class="flex items-center gap-2">
296
294
  <USwitch v-model="mentionsEnabled" size="sm" />
297
- <span class="text-sm text-slate-300">{{ t('slack.routing.mentionMembers') }}</span>
295
+ <span class="text-sm text-toned">{{ t('slack.routing.mentionMembers') }}</span>
298
296
  </label>
299
297
 
300
298
  <div class="flex justify-end">
@@ -313,15 +311,13 @@ async function saveMapping() {
313
311
 
314
312
  <!-- member mapping -->
315
313
  <div v-if="mentionsEnabled" class="space-y-2">
316
- <p class="text-[11px] font-semibold uppercase tracking-wide text-slate-400">
314
+ <p class="text-[11px] font-semibold uppercase tracking-wide text-muted">
317
315
  {{ t('slack.members.heading') }}
318
316
  </p>
319
- <p class="text-[11px] leading-snug text-slate-500">
317
+ <p class="text-[11px] leading-snug text-dimmed">
320
318
  <i18n-t keypath="slack.members.hint" tag="span">
321
319
  <template #product>
322
- <span class="font-medium text-slate-400">{{
323
- t('slack.members.productLabel')
324
- }}</span>
320
+ <span class="font-medium text-muted">{{ t('slack.members.productLabel') }}</span>
325
321
  </template>
326
322
  </i18n-t>
327
323
  </p>