@cat-factory/app 0.302.2 → 0.303.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (328) hide show
  1. package/README.md +99 -14
  2. package/app/app.config.ts +19 -10
  3. package/app/assets/css/main.css +13 -13
  4. package/app/assets/css/prose.css +22 -22
  5. package/app/assets/css/tokens.css +298 -0
  6. package/app/components/assistant/AssistantModal.vue +22 -22
  7. package/app/components/auth/AuthGate.vue +1 -1
  8. package/app/components/auth/BackendMisconfiguredScreen.vue +10 -10
  9. package/app/components/auth/LoginScreen.vue +34 -36
  10. package/app/components/auth/ResetPasswordScreen.vue +12 -12
  11. package/app/components/auth/UserMenu.vue +4 -4
  12. package/app/components/binaryCandidates/BinaryCandidatesWindow.vue +27 -25
  13. package/app/components/binaryOutput/BinaryOutputReport.vue +15 -15
  14. package/app/components/binaryOutput/StoredAssetView.vue +5 -5
  15. package/app/components/board/AddTaskModal.vue +17 -20
  16. package/app/components/board/AgentFailureCard.vue +11 -11
  17. package/app/components/board/AgentFailureHistory.vue +2 -2
  18. package/app/components/board/BoardCanvas.vue +6 -5
  19. package/app/components/board/CreateInitiativeModal.vue +8 -10
  20. package/app/components/board/DependencyConnectOverlay.vue +1 -1
  21. package/app/components/board/FailureHistoryList.vue +7 -7
  22. package/app/components/board/RecurringPipelineModal.vue +17 -17
  23. package/app/components/board/ReviewFrictionDialog.vue +6 -6
  24. package/app/components/board/StepExecutionHistory.vue +13 -13
  25. package/app/components/board/TaskDependencyEdges.vue +8 -8
  26. package/app/components/board/nodes/AgentChip.vue +10 -10
  27. package/app/components/board/nodes/BlockNode.vue +29 -29
  28. package/app/components/board/nodes/DecisionBadge.vue +2 -2
  29. package/app/components/board/nodes/EpicNode.vue +14 -10
  30. package/app/components/board/nodes/FrameSwimlanes.vue +7 -9
  31. package/app/components/board/nodes/InitiativeCard.vue +8 -8
  32. package/app/components/board/nodes/LaneGroup.vue +1 -1
  33. package/app/components/board/nodes/LaneTask.vue +2 -2
  34. package/app/components/board/nodes/ResizeGrips.vue +4 -4
  35. package/app/components/board/nodes/TaskCard.vue +18 -18
  36. package/app/components/board/nodes/TaskLane.vue +5 -5
  37. package/app/components/board/nodes/TaskPipelineMini.vue +18 -18
  38. package/app/components/bootstrap/AdoptionReviewModal.vue +29 -26
  39. package/app/components/bootstrap/BootstrapModal.vue +21 -23
  40. package/app/components/bootstrap/BootstrapRunSteps.vue +1 -1
  41. package/app/components/brainstorm/BrainstormWindow.vue +30 -33
  42. package/app/components/bugFishing/BugFishingWindow.vue +49 -49
  43. package/app/components/clarity/ClarityReviewWindow.vue +30 -30
  44. package/app/components/common/AsyncViewError.vue +5 -5
  45. package/app/components/common/ClarificationItem.vue +8 -13
  46. package/app/components/common/ConfirmDialog.vue +4 -2
  47. package/app/components/common/DescriptorFields.vue +1 -1
  48. package/app/components/common/EmptyState.vue +3 -3
  49. package/app/components/common/InterviewGateNotice.vue +7 -7
  50. package/app/components/common/KeyboardShortcutsHelp.vue +1 -1
  51. package/app/components/common/MarkdownProse.vue +14 -13
  52. package/app/components/consensus/ConsensusSessionWindow.vue +26 -26
  53. package/app/components/context/ContextAttachmentFields.vue +17 -17
  54. package/app/components/docs/DocInterviewWindow.vue +14 -14
  55. package/app/components/documents/ContextDocumentPicker.vue +17 -17
  56. package/app/components/documents/DocumentImportModal.vue +7 -7
  57. package/app/components/documents/DocumentSourceConnectModal.vue +3 -3
  58. package/app/components/documents/DocumentSyncState.vue +5 -5
  59. package/app/components/documents/DocumentTemplatesModal.vue +15 -15
  60. package/app/components/documents/RepoContextDocPicker.vue +5 -5
  61. package/app/components/documents/SpawnPreviewModal.vue +12 -12
  62. package/app/components/documents/StartFromDesignModal.vue +11 -11
  63. package/app/components/documents/TaskContextDocs.vue +5 -5
  64. package/app/components/environments/EnvSetupStepper.vue +6 -6
  65. package/app/components/environments/EnvironmentStatusPanel.vue +17 -17
  66. package/app/components/environments/steps/EnvPickStep.vue +3 -3
  67. package/app/components/environments/steps/EnvPreflightStep.vue +9 -9
  68. package/app/components/environments/steps/EnvReviewStep.vue +25 -22
  69. package/app/components/environments/steps/EnvSaveStep.vue +7 -5
  70. package/app/components/environments/steps/JourneyStepNav.vue +1 -1
  71. package/app/components/focus/BlockFocusView.vue +17 -19
  72. package/app/components/followUp/FollowUpWindow.vue +23 -23
  73. package/app/components/forkDecision/ForkDecisionWindow.vue +37 -39
  74. package/app/components/foundational/FoundationalContractSummary.vue +7 -7
  75. package/app/components/foundational/FoundationalServiceCatalogList.vue +11 -11
  76. package/app/components/foundational/FoundationalServiceManager.vue +1 -1
  77. package/app/components/foundational/FoundationalServiceRegistry.vue +13 -13
  78. package/app/components/foundational/FoundationalServiceSources.vue +13 -13
  79. package/app/components/foundational/FoundationalSuppressions.vue +7 -7
  80. package/app/components/foundational/ServiceCatalogConnection.vue +10 -10
  81. package/app/components/fragments/FragmentLibraryManager.vue +41 -44
  82. package/app/components/fragments/FragmentSelector.vue +13 -13
  83. package/app/components/fragments/GitHubDocUrlImport.vue +1 -1
  84. package/app/components/gates/GateFailingCheckList.vue +5 -5
  85. package/app/components/gates/GateResultView.vue +50 -47
  86. package/app/components/github/AddServiceFromRepoModal.vue +14 -14
  87. package/app/components/github/BranchProtectionPreflight.vue +13 -13
  88. package/app/components/github/GitHubConnect.vue +7 -7
  89. package/app/components/github/GitHubOnboarding.vue +7 -7
  90. package/app/components/github/GitHubPanel.vue +37 -40
  91. package/app/components/github/RepoTreeBrowser.vue +18 -18
  92. package/app/components/humanTest/HumanTestWindow.vue +30 -33
  93. package/app/components/initiative/InitiativePlanNotice.vue +5 -5
  94. package/app/components/initiative/InitiativePlanReview.vue +27 -29
  95. package/app/components/initiative/InitiativePlanningWindow.vue +10 -10
  96. package/app/components/initiative/InitiativeTrackerWindow.vue +71 -65
  97. package/app/components/inputGate/InputGateNotice.vue +2 -4
  98. package/app/components/judge/JudgeResultView.vue +30 -32
  99. package/app/components/kaizen/KaizenPanel.vue +40 -36
  100. package/app/components/kaizen/KaizenStepStatus.vue +21 -21
  101. package/app/components/layout/AccountAuditLog.vue +10 -10
  102. package/app/components/layout/AccountDeploymentSettings.vue +20 -20
  103. package/app/components/layout/AccountFailureKindRules.vue +13 -13
  104. package/app/components/layout/AccountFoundationalSettings.vue +1 -1
  105. package/app/components/layout/AccountFragmentSettings.vue +1 -1
  106. package/app/components/layout/AccountModelPolicySettings.vue +9 -9
  107. package/app/components/layout/AccountPlatformAlertSettings.vue +11 -11
  108. package/app/components/layout/AccountRiskPolicySettings.vue +2 -2
  109. package/app/components/layout/AccountRunCredentialSettings.vue +5 -5
  110. package/app/components/layout/AccountSkillSettings.vue +1 -1
  111. package/app/components/layout/AccountTeamSettings.vue +23 -15
  112. package/app/components/layout/AiProvidersBanner.vue +11 -8
  113. package/app/components/layout/AppearanceSwitcher.vue +108 -0
  114. package/app/components/layout/BoardSwitcher.vue +8 -11
  115. package/app/components/layout/BoardToolbar.vue +3 -3
  116. package/app/components/layout/CommandBar.vue +7 -9
  117. package/app/components/layout/ConnectionStatusBanner.vue +2 -2
  118. package/app/components/layout/DefaultTestEnvBanner.vue +5 -5
  119. package/app/components/layout/GitHubPatBanner.vue +5 -5
  120. package/app/components/layout/GitHubPatPermissionsBanner.vue +16 -10
  121. package/app/components/layout/InfraSetupBanner.vue +6 -6
  122. package/app/components/layout/IntegrationsHub.vue +15 -15
  123. package/app/components/layout/LanguageSwitcher.vue +5 -5
  124. package/app/components/layout/ModelProvidersHub.vue +13 -16
  125. package/app/components/layout/NotificationsInbox.vue +10 -10
  126. package/app/components/layout/PersonalSetupModal.vue +8 -8
  127. package/app/components/layout/ProviderConfigBanner.vue +4 -4
  128. package/app/components/layout/RolePrompt.vue +7 -7
  129. package/app/components/layout/SideBar.vue +6 -4
  130. package/app/components/layout/SpendWarningBanner.vue +17 -14
  131. package/app/components/layout/TranslationWarningBanner.vue +4 -4
  132. package/app/components/layout/UiModeSwitcher.vue +13 -13
  133. package/app/components/layout/UiRoleSwitcher.vue +8 -8
  134. package/app/components/layout/WorkspaceMembersSettings.vue +15 -11
  135. package/app/components/media/ArtifactLightbox.vue +13 -13
  136. package/app/components/media/ImageCompare.vue +31 -24
  137. package/app/components/merge/MergeEffortChips.vue +2 -2
  138. package/app/components/notifications/NotificationSettingsPanel.vue +14 -12
  139. package/app/components/observability/OutcomeFilterChips.vue +6 -6
  140. package/app/components/observability/RunFailureSummary.vue +28 -25
  141. package/app/components/observability/StepMetricsBar.vue +26 -28
  142. package/app/components/observability/StepModelActivity.vue +2 -2
  143. package/app/components/observability/ToolCallList.vue +24 -24
  144. package/app/components/outcome/OutcomeSummaryWindow.vue +47 -47
  145. package/app/components/palettes/AgentPalette.vue +8 -8
  146. package/app/components/palettes/AgentTierSelect.vue +1 -1
  147. package/app/components/palettes/PipelinePurposeSelect.vue +1 -1
  148. package/app/components/panels/AgentStepDetail.vue +52 -51
  149. package/app/components/panels/AttemptEntryHeader.vue +4 -6
  150. package/app/components/panels/DecisionModal.vue +7 -7
  151. package/app/components/panels/GenericStructuredResultView.vue +7 -7
  152. package/app/components/panels/InspectorPanel.vue +17 -17
  153. package/app/components/panels/MergerResultView.vue +19 -19
  154. package/app/components/panels/ObservabilityPanel.vue +115 -123
  155. package/app/components/panels/OperatorDashboardPanel.vue +89 -97
  156. package/app/components/panels/ReportsPanel.vue +69 -66
  157. package/app/components/panels/ReportsSpendBreakdown.vue +9 -9
  158. package/app/components/panels/ResultWindowShell.vue +38 -38
  159. package/app/components/panels/RunDetailLoadState.vue +2 -2
  160. package/app/components/panels/StepContainerStatus.vue +9 -9
  161. package/app/components/panels/StepDelegatedStatus.logic.spec.ts +135 -0
  162. package/app/components/panels/StepDelegatedStatus.logic.ts +160 -0
  163. package/app/components/panels/StepDelegatedStatus.vue +181 -0
  164. package/app/components/panels/StepEffortReport.vue +16 -15
  165. package/app/components/panels/StepFragmentAdherence.vue +14 -10
  166. package/app/components/panels/StepMetadataCard.vue +74 -45
  167. package/app/components/panels/StepReproductionReport.vue +25 -21
  168. package/app/components/panels/StepRunMeta.vue +20 -20
  169. package/app/components/panels/StepTestReport.logic.spec.ts +8 -3
  170. package/app/components/panels/StepTestReport.logic.ts +4 -4
  171. package/app/components/panels/StepTestReport.vue +28 -28
  172. package/app/components/panels/StepToolServers.vue +14 -11
  173. package/app/components/panels/StepValidationReport.vue +7 -7
  174. package/app/components/panels/inspector/ContainerSummary.vue +9 -9
  175. package/app/components/panels/inspector/DocReferenceRepos.vue +3 -3
  176. package/app/components/panels/inspector/EnvProbeReport.vue +24 -27
  177. package/app/components/panels/inspector/EpicChildren.vue +8 -12
  178. package/app/components/panels/inspector/FrontendBindingsResolved.vue +11 -11
  179. package/app/components/panels/inspector/FrontendConfig.vue +37 -41
  180. package/app/components/panels/inspector/InitiativeInspector.vue +3 -3
  181. package/app/components/panels/inspector/InspectorSection.vue +6 -6
  182. package/app/components/panels/inspector/RecurringScheduleSettings.vue +16 -19
  183. package/app/components/panels/inspector/ServiceConnections.vue +2 -2
  184. package/app/components/panels/inspector/ServiceReleaseHealthConfig.vue +2 -2
  185. package/app/components/panels/inspector/ServiceSelfTests.vue +21 -17
  186. package/app/components/panels/inspector/ServiceTestConfig.vue +51 -59
  187. package/app/components/panels/inspector/ServiceTestSecrets.vue +5 -5
  188. package/app/components/panels/inspector/ServiceTestingContext.vue +3 -3
  189. package/app/components/panels/inspector/ServiceValidationConfig.vue +2 -2
  190. package/app/components/panels/inspector/TaskAgentConfig.vue +3 -3
  191. package/app/components/panels/inspector/TaskAprioriBranches.vue +8 -5
  192. package/app/components/panels/inspector/TaskDependencies.vue +1 -1
  193. package/app/components/panels/inspector/TaskEstimateBadge.vue +11 -11
  194. package/app/components/panels/inspector/TaskExecution.vue +17 -17
  195. package/app/components/panels/inspector/TaskReviewTarget.vue +2 -2
  196. package/app/components/panels/inspector/TaskRunSettings.vue +35 -37
  197. package/app/components/panels/inspector/TaskStructure.vue +3 -3
  198. package/app/components/pipeline/AgentKindIcon.vue +1 -1
  199. package/app/components/pipeline/AgentPromptEditor.vue +17 -17
  200. package/app/components/pipeline/BinaryOutputStepPicker.vue +42 -56
  201. package/app/components/pipeline/EstimateThresholdFields.vue +4 -4
  202. package/app/components/pipeline/GateConfigFields.vue +13 -10
  203. package/app/components/pipeline/IterationCapPrompt.vue +4 -2
  204. package/app/components/pipeline/PipelineBuilder.vue +47 -55
  205. package/app/components/pipeline/PipelineHealthModal.vue +27 -29
  206. package/app/components/pipeline/PipelinePicker.vue +10 -10
  207. package/app/components/pipeline/PipelinePreview.vue +10 -10
  208. package/app/components/pipeline/PipelineProgress.vue +64 -67
  209. package/app/components/prReview/PrReviewPhaseBadge.vue +7 -7
  210. package/app/components/prReview/PrReviewWindow.vue +75 -77
  211. package/app/components/providers/AiPresetMismatchDialog.vue +5 -5
  212. package/app/components/providers/AiProviderOnboardingModal.vue +9 -9
  213. package/app/components/providers/ApiKeysSection.vue +13 -13
  214. package/app/components/providers/PersonalCredentialModal.vue +2 -2
  215. package/app/components/providers/PersonalSubscriptionSection.vue +10 -10
  216. package/app/components/providers/SignInRequiredNotice.vue +1 -1
  217. package/app/components/providers/VendorCredentialsModal.vue +10 -10
  218. package/app/components/provisioning/ProvisioningLogsDrawer.vue +13 -13
  219. package/app/components/ralph/RalphLoopResultView.vue +28 -30
  220. package/app/components/recurring/RecurrenceEditor.vue +2 -2
  221. package/app/components/requirements/RequirementsReviewWindow.vue +51 -58
  222. package/app/components/riskPolicy/RiskPolicyPicker.vue +12 -15
  223. package/app/components/riskPolicy/RiskPolicyPreview.vue +14 -14
  224. package/app/components/sandbox/SandboxPanel.vue +58 -59
  225. package/app/components/settings/AccountSettingsPanel.vue +1 -1
  226. package/app/components/settings/ApiTokensPanel.vue +10 -10
  227. package/app/components/settings/BudgetSettings.vue +18 -22
  228. package/app/components/settings/CapabilityCredentialsPanel.vue +15 -15
  229. package/app/components/settings/CloudflareHandlerSection.vue +20 -20
  230. package/app/components/settings/ComposeEnvironmentSetupSection.vue +13 -13
  231. package/app/components/settings/ConnectionTestVerdict.vue +3 -3
  232. package/app/components/settings/ConnectionWarnings.vue +1 -1
  233. package/app/components/settings/ConsensusGroupsSection.vue +27 -35
  234. package/app/components/settings/CustomManifestTypeEditor.vue +10 -10
  235. package/app/components/settings/DefaultProvisionTypeSection.vue +6 -6
  236. package/app/components/settings/InfraHandlersConfigurator.vue +24 -22
  237. package/app/components/settings/InfrastructureBackendPicker.vue +6 -6
  238. package/app/components/settings/InfrastructureWindow.vue +5 -5
  239. package/app/components/settings/IssueTrackerPanel.vue +29 -23
  240. package/app/components/settings/KubernetesEngineForm.vue +11 -11
  241. package/app/components/settings/KubernetesEnvironmentForm.vue +4 -4
  242. package/app/components/settings/LocalContainerPoolSettings.vue +6 -11
  243. package/app/components/settings/LocalModelEndpointsPanel.vue +20 -18
  244. package/app/components/settings/McpAuthorizeScreen.vue +13 -15
  245. package/app/components/settings/McpOAuthCallbackScreen.vue +16 -10
  246. package/app/components/settings/MergeClassRulesEditor.vue +6 -9
  247. package/app/components/settings/MergeRolePolicyEditor.vue +16 -16
  248. package/app/components/settings/ModelConfigurationPanel.vue +23 -30
  249. package/app/components/settings/ModelPresetHealthModal.vue +15 -13
  250. package/app/components/settings/ObservabilityConnectionPanel.vue +4 -4
  251. package/app/components/settings/OpenRouterCatalogPanel.vue +26 -19
  252. package/app/components/settings/PackageRegistriesPanel.vue +8 -8
  253. package/app/components/settings/ProviderConnectionTab.vue +8 -11
  254. package/app/components/settings/ProviderManifestEditor.vue +9 -9
  255. package/app/components/settings/ProviderPreferenceEditor.vue +8 -8
  256. package/app/components/settings/RiskPolicyCreateForm.vue +10 -10
  257. package/app/components/settings/RiskPolicyEditorRow.vue +14 -14
  258. package/app/components/settings/RiskPolicyHealthModal.vue +15 -13
  259. package/app/components/settings/RiskPolicyInheritedRow.vue +1 -1
  260. package/app/components/settings/RiskPolicyPanel.vue +10 -15
  261. package/app/components/settings/ServiceFragmentDefaultsPanel.vue +7 -7
  262. package/app/components/settings/SharedStacksPanel.vue +9 -12
  263. package/app/components/settings/TaskSourceCard.vue +4 -4
  264. package/app/components/settings/TaskTypeSuppressionsPanel.vue +6 -6
  265. package/app/components/settings/ToolServerChecklist.vue +36 -29
  266. package/app/components/settings/UsageSettings.vue +15 -15
  267. package/app/components/settings/UserSecretsSection.vue +9 -12
  268. package/app/components/settings/WorkspaceMetadataSettings.vue +5 -5
  269. package/app/components/settings/WorkspaceSettingsPanel.vue +47 -47
  270. package/app/components/skills/ReviewSkillQueue.vue +10 -10
  271. package/app/components/skills/SkillLibraryManager.vue +23 -20
  272. package/app/components/slack/SlackPanel.vue +13 -17
  273. package/app/components/spec/ServiceSpecWindow.vue +45 -42
  274. package/app/components/tasks/BugHuntModal.vue +24 -27
  275. package/app/components/tasks/ContextIssuePicker.vue +11 -11
  276. package/app/components/tasks/TaskContextIssues.vue +3 -3
  277. package/app/components/tasks/TaskImportModal.vue +7 -7
  278. package/app/components/tasks/TaskSourceConnectModal.vue +10 -8
  279. package/app/components/testing/TestReportWindow.vue +99 -82
  280. package/app/components/theme/ThemeImportModal.vue +115 -0
  281. package/app/components/tutorial/TutorialCatalogue.vue +9 -9
  282. package/app/components/tutorial/TutorialNudge.vue +5 -5
  283. package/app/components/tutorial/TutorialOverlay.vue +12 -12
  284. package/app/components/tutorial/TutorialPrompt.vue +6 -9
  285. package/app/components/vcs/GitLabConnect.vue +4 -4
  286. package/app/components/vcs/VcsConnectSurfaces.vue +2 -2
  287. package/app/components/visualConfirm/VisualConfirmationWindow.vue +36 -36
  288. package/app/composables/api/client.ts +6 -1
  289. package/app/composables/usePipelineErrorToast.ts +17 -0
  290. package/app/modular/agent-kinds.ts +24 -0
  291. package/app/pages/index.vue +5 -5
  292. package/app/plugins/theme.client.ts +125 -0
  293. package/app/spa-loading-template.html +52 -14
  294. package/app/stores/agents.ts +1 -1
  295. package/app/stores/theme.spec.ts +56 -0
  296. package/app/stores/theme.ts +87 -0
  297. package/app/types/domain.ts +19 -0
  298. package/app/types/execution.ts +4 -0
  299. package/app/utils/agentOutput.ts +1 -1
  300. package/app/utils/binaryOutput.ts +6 -6
  301. package/app/utils/bootstrapSteps.ts +14 -14
  302. package/app/utils/catalog.ts +87 -83
  303. package/app/utils/colorTint.ts +10 -0
  304. package/app/utils/failureKinds.ts +1 -0
  305. package/app/utils/observability.ts +3 -3
  306. package/app/utils/pipelineRender.ts +13 -17
  307. package/app/utils/swimlanes.ts +4 -4
  308. package/app/utils/theme/bootPalette.spec.ts +54 -0
  309. package/app/utils/theme/bootPalette.ts +108 -0
  310. package/app/utils/theme/builtins.spec.ts +38 -0
  311. package/app/utils/theme/builtins.ts +55 -0
  312. package/app/utils/theme/css.ts +162 -0
  313. package/app/utils/theme/doc.ts +353 -0
  314. package/app/utils/theme/link.ts +93 -0
  315. package/app/utils/theme/presets.ts +509 -0
  316. package/app/utils/theme/theme.spec.ts +224 -0
  317. package/i18n/locales/de.json +61 -4
  318. package/i18n/locales/en.json +70 -4
  319. package/i18n/locales/es.json +61 -4
  320. package/i18n/locales/fr.json +61 -4
  321. package/i18n/locales/he.json +61 -4
  322. package/i18n/locales/it.json +61 -4
  323. package/i18n/locales/ja.json +61 -4
  324. package/i18n/locales/pl.json +61 -4
  325. package/i18n/locales/tr.json +61 -4
  326. package/i18n/locales/uk.json +61 -4
  327. package/nuxt.config.ts +37 -11
  328. package/package.json +10 -9
@@ -592,13 +592,13 @@ async function unlinkSource(id: string) {
592
592
  would fail with a raw 503 — say so instead (any entry point lands here). -->
593
593
  <div
594
594
  v-if="library.available === false"
595
- class="rounded-md border border-slate-800 bg-slate-900/40 p-3 text-sm text-slate-400"
595
+ class="rounded-md border border-default bg-default/40 p-3 text-sm text-muted"
596
596
  >
597
597
  {{ t('fragments.unavailable') }}
598
598
  </div>
599
599
 
600
600
  <template v-else>
601
- <p class="text-sm text-slate-400">
601
+ <p class="text-sm text-muted">
602
602
  <template v-if="isWorkspace">
603
603
  {{ t('fragments.intro.workspace') }}
604
604
  </template>
@@ -626,7 +626,7 @@ async function unlinkSource(id: string) {
626
626
 
627
627
  <!-- Resolved (merged) catalog — workspace scope only -->
628
628
  <div v-if="tab === 'catalog'" class="flex flex-col gap-2">
629
- <p class="text-xs text-slate-500">
629
+ <p class="text-xs text-dimmed">
630
630
  {{
631
631
  t(
632
632
  'fragments.catalog.summary',
@@ -638,10 +638,10 @@ async function unlinkSource(id: string) {
638
638
  <div
639
639
  v-for="f in library.resolved"
640
640
  :key="f.id"
641
- class="rounded-md border border-slate-800 bg-slate-900/60 p-3"
641
+ class="rounded-md border border-default bg-default/60 p-3"
642
642
  >
643
643
  <div class="flex items-center gap-2">
644
- <span class="font-medium text-slate-100">{{ f.title }}</span>
644
+ <span class="font-medium text-app-100">{{ f.title }}</span>
645
645
  <UBadge size="xs" :color="tierColor[f.tier]" variant="subtle">
646
646
  {{ tierLabel[f.tier] }}
647
647
  </UBadge>
@@ -654,9 +654,9 @@ async function unlinkSource(id: string) {
654
654
  >
655
655
  {{ t('fragments.catalog.live', { source: f.documentRef.source }) }}
656
656
  </UBadge>
657
- <span class="ms-auto font-mono text-[11px] text-slate-500">{{ f.id }}</span>
657
+ <span class="ms-auto font-mono text-[11px] text-dimmed">{{ f.id }}</span>
658
658
  </div>
659
- <p class="mt-1 text-sm text-slate-400">{{ f.summary }}</p>
659
+ <p class="mt-1 text-sm text-muted">{{ f.summary }}</p>
660
660
  <div v-if="f.tags?.length" class="mt-1 flex flex-wrap gap-1">
661
661
  <UBadge v-for="tag in f.tags" :key="tag" size="xs" variant="outline" color="neutral">
662
662
  {{ tag }}
@@ -670,7 +670,7 @@ async function unlinkSource(id: string) {
670
670
  <div
671
671
  v-for="f in library.fragments"
672
672
  :key="f.id"
673
- class="rounded-md border border-slate-800 bg-slate-900/60 p-3"
673
+ class="rounded-md border border-default bg-default/60 p-3"
674
674
  >
675
675
  <!-- Inline editor (hand-authored fragments): title / summary / body / tags, with the
676
676
  same auto-generate-title button as the create form. -->
@@ -716,7 +716,7 @@ async function unlinkSource(id: string) {
716
716
  :placeholder="t('fragments.authored.briefPlaceholder')"
717
717
  :rows="2"
718
718
  />
719
- <p class="text-xs text-slate-500">{{ t('fragments.authored.briefHint') }}</p>
719
+ <p class="text-xs text-dimmed">{{ t('fragments.authored.briefHint') }}</p>
720
720
  </div>
721
721
  <UInput
722
722
  v-model="editDraft.tags"
@@ -740,12 +740,12 @@ async function unlinkSource(id: string) {
740
740
  <div v-else class="flex items-start gap-2">
741
741
  <div class="min-w-0">
742
742
  <div class="flex items-center gap-2">
743
- <span class="font-medium text-slate-100">{{ f.title }}</span>
743
+ <span class="font-medium text-app-100">{{ f.title }}</span>
744
744
  <UBadge v-if="f.source" size="xs" color="info" variant="subtle">{{
745
745
  t('fragments.authored.fromRepo')
746
746
  }}</UBadge>
747
747
  </div>
748
- <p class="text-sm text-slate-400">{{ f.summary }}</p>
748
+ <p class="text-sm text-muted">{{ f.summary }}</p>
749
749
  </div>
750
750
  <div class="ms-auto flex gap-1">
751
751
  <!-- Editing a repo-SOURCED fragment locally would be overwritten on the next sync,
@@ -769,7 +769,7 @@ async function unlinkSource(id: string) {
769
769
  </div>
770
770
  </div>
771
771
  </div>
772
- <p v-if="!library.fragments.length" class="text-sm text-slate-500">
772
+ <p v-if="!library.fragments.length" class="text-sm text-dimmed">
773
773
  {{
774
774
  isWorkspace
775
775
  ? t('fragments.authored.empty.workspace')
@@ -777,7 +777,7 @@ async function unlinkSource(id: string) {
777
777
  }}
778
778
  </p>
779
779
 
780
- <div class="rounded-md border border-slate-800 p-3">
780
+ <div class="rounded-md border border-default p-3">
781
781
  <p class="mb-2 text-sm font-medium">{{ t('fragments.authored.addTitle') }}</p>
782
782
  <div class="flex flex-col gap-2">
783
783
  <div class="flex gap-2">
@@ -822,7 +822,7 @@ async function unlinkSource(id: string) {
822
822
  :placeholder="t('fragments.authored.briefPlaceholder')"
823
823
  :rows="2"
824
824
  />
825
- <p class="text-xs text-slate-500">{{ t('fragments.authored.briefHint') }}</p>
825
+ <p class="text-xs text-dimmed">{{ t('fragments.authored.briefHint') }}</p>
826
826
  </div>
827
827
  <UInput v-model="draft.tags" :placeholder="t('fragments.authored.tagsPlaceholder')" />
828
828
  <UButton
@@ -841,25 +841,25 @@ async function unlinkSource(id: string) {
841
841
 
842
842
  <!-- Document-backed (living) fragments -->
843
843
  <div v-else-if="tab === 'documents'" class="flex flex-col gap-3">
844
- <p class="text-xs text-slate-500">
844
+ <p class="text-xs text-dimmed">
845
845
  {{ t('fragments.documents.intro') }}
846
846
  </p>
847
847
 
848
848
  <div
849
849
  v-for="f in documentFragments"
850
850
  :key="f.id"
851
- class="flex items-start gap-2 rounded-md border border-slate-800 bg-slate-900/60 p-3"
851
+ class="flex items-start gap-2 rounded-md border border-default bg-default/60 p-3"
852
852
  >
853
- <UIcon name="i-lucide-radio" class="mt-0.5 h-4 w-4 text-emerald-400" />
853
+ <UIcon name="i-lucide-radio" class="mt-0.5 h-4 w-4 text-app-success-400" />
854
854
  <div class="min-w-0">
855
855
  <div class="flex items-center gap-2">
856
- <span class="font-medium text-slate-100">{{ f.title }}</span>
856
+ <span class="font-medium text-app-100">{{ f.title }}</span>
857
857
  <UBadge size="xs" color="success" variant="subtle">
858
858
  {{ f.documentRef?.source }}
859
859
  </UBadge>
860
860
  </div>
861
- <p class="text-sm text-slate-400">{{ f.summary }}</p>
862
- <p v-if="f.resolvedAt" class="text-[11px] text-slate-500">
861
+ <p class="text-sm text-muted">{{ f.summary }}</p>
862
+ <p v-if="f.resolvedAt" class="text-[11px] text-dimmed">
863
863
  {{
864
864
  t('fragments.documents.lastResolved', { date: d(new Date(f.resolvedAt), 'long') })
865
865
  }}
@@ -884,16 +884,16 @@ async function unlinkSource(id: string) {
884
884
  />
885
885
  </div>
886
886
  </div>
887
- <p v-if="!documentFragments.length" class="text-sm text-slate-500">
887
+ <p v-if="!documentFragments.length" class="text-sm text-dimmed">
888
888
  {{ t('fragments.documents.empty') }}
889
889
  </p>
890
890
 
891
- <div class="rounded-md border border-slate-800 p-3">
891
+ <div class="rounded-md border border-default p-3">
892
892
  <p class="mb-2 text-sm font-medium">{{ t('fragments.documents.linkTitle') }}</p>
893
- <div v-if="docLinkDisabled" class="text-sm text-slate-500">
893
+ <div v-if="docLinkDisabled" class="text-sm text-dimmed">
894
894
  {{ t('fragments.documents.disabledHint') }}
895
895
  </div>
896
- <div v-else-if="!documents.connectedSources.length" class="text-sm text-slate-500">
896
+ <div v-else-if="!documents.connectedSources.length" class="text-sm text-dimmed">
897
897
  {{ t('fragments.documents.connectFirst') }}
898
898
  </div>
899
899
  <div v-else class="flex flex-col gap-2">
@@ -921,9 +921,9 @@ async function unlinkSource(id: string) {
921
921
  <GitHubRepoSearchSelect v-model="docRepoId" @update:repo="docRepo = $event" />
922
922
  <div
923
923
  v-if="docRepoId !== undefined"
924
- class="rounded-md border border-slate-800 bg-slate-900/40 p-2"
924
+ class="rounded-md border border-default bg-default/40 p-2"
925
925
  >
926
- <p class="mb-2 text-xs text-slate-400">
926
+ <p class="mb-2 text-xs text-muted">
927
927
  {{ t('fragments.documents.githubBrowseHint') }}
928
928
  </p>
929
929
  <RepoTreeBrowser
@@ -936,18 +936,15 @@ async function unlinkSource(id: string) {
936
936
  @toggle="toggleDocFile"
937
937
  />
938
938
  <div v-if="stagedDocRefs.length" class="mt-2 space-y-1">
939
- <p class="text-xs font-medium text-slate-400">
939
+ <p class="text-xs font-medium text-muted">
940
940
  {{ t('fragments.documents.selectedFiles', { count: stagedDocRefs.length }) }}
941
941
  </p>
942
942
  <div
943
943
  v-for="staged in stagedDocRefs"
944
944
  :key="staged.path"
945
- class="flex items-center gap-1.5 rounded bg-slate-800/60 px-2 py-1 text-xs text-slate-300"
945
+ class="flex items-center gap-1.5 rounded bg-elevated/60 px-2 py-1 text-xs text-toned"
946
946
  >
947
- <UIcon
948
- name="i-lucide-file-code-2"
949
- class="h-3.5 w-3.5 shrink-0 text-indigo-400"
950
- />
947
+ <UIcon name="i-lucide-file-code-2" class="h-3.5 w-3.5 shrink-0 text-primary" />
951
948
  <span class="truncate">{{ staged.path }}</span>
952
949
  <UButton
953
950
  class="ms-auto"
@@ -985,7 +982,7 @@ async function unlinkSource(id: string) {
985
982
  </UButton>
986
983
  <p
987
984
  v-if="docLinkBlockedReason"
988
- class="flex items-center gap-1 text-xs text-slate-500"
985
+ class="flex items-center gap-1 text-xs text-dimmed"
989
986
  data-testid="fragment-link-blocked-reason"
990
987
  >
991
988
  <UIcon name="i-lucide-info" class="h-3.5 w-3.5 shrink-0" />
@@ -1001,15 +998,15 @@ async function unlinkSource(id: string) {
1001
998
  <div
1002
999
  v-for="s in library.sources"
1003
1000
  :key="s.id"
1004
- class="flex items-center gap-2 rounded-md border border-slate-800 bg-slate-900/60 p-3"
1001
+ class="flex items-center gap-2 rounded-md border border-default bg-default/60 p-3"
1005
1002
  >
1006
- <UIcon name="i-lucide-git-branch" class="h-4 w-4 text-slate-400" />
1003
+ <UIcon name="i-lucide-git-branch" class="h-4 w-4 text-muted" />
1007
1004
  <div class="min-w-0">
1008
- <span class="font-mono text-sm text-slate-100">
1005
+ <span class="font-mono text-sm text-app-100">
1009
1006
  {{ s.repoOwner }}/{{ s.repoName
1010
- }}<span class="text-slate-500">/{{ s.dirPath || '' }}</span>
1007
+ }}<span class="text-dimmed">/{{ s.dirPath || '' }}</span>
1011
1008
  </span>
1012
- <p class="text-xs text-slate-500">
1009
+ <p class="text-xs text-dimmed">
1013
1010
  {{
1014
1011
  s.lastSyncedAt
1015
1012
  ? t('fragments.sources.metaSynced', { ref: s.gitRef })
@@ -1051,11 +1048,11 @@ async function unlinkSource(id: string) {
1051
1048
  />
1052
1049
  </div>
1053
1050
  </div>
1054
- <p v-if="!library.sources.length" class="text-sm text-slate-500">
1051
+ <p v-if="!library.sources.length" class="text-sm text-dimmed">
1055
1052
  {{ t('fragments.sources.empty') }}
1056
1053
  </p>
1057
1054
 
1058
- <div class="rounded-md border border-slate-800 p-3">
1055
+ <div class="rounded-md border border-default p-3">
1059
1056
  <p class="mb-2 text-sm font-medium">{{ t('fragments.sources.linkTitle') }}</p>
1060
1057
  <div class="flex flex-col gap-2">
1061
1058
  <!-- Connected: search a repo + browse to the guideline directory -->
@@ -1063,16 +1060,16 @@ async function unlinkSource(id: string) {
1063
1060
  <GitHubRepoSearchSelect v-model="sourceRepoId" @update:repo="sourceRepo = $event" />
1064
1061
  <div
1065
1062
  v-if="sourceRepoId !== undefined"
1066
- class="rounded-md border border-slate-800 bg-slate-900/40 p-2"
1063
+ class="rounded-md border border-default bg-default/40 p-2"
1067
1064
  >
1068
- <p class="mb-2 text-xs text-slate-400">
1065
+ <p class="mb-2 text-xs text-muted">
1069
1066
  {{ t('fragments.sources.browseHint') }}
1070
1067
  </p>
1071
1068
  <RepoTreeBrowser v-model="sourceDir" :repo-github-id="sourceRepoId" mode="dir" />
1072
- <p class="mt-2 truncate text-xs text-slate-400">
1069
+ <p class="mt-2 truncate text-xs text-muted">
1073
1070
  <template v-if="sourceDir">
1074
1071
  {{ t('fragments.sources.selectedDir') }}
1075
- <code class="text-slate-200">{{ sourceDir }}</code>
1072
+ <code class="text-default">{{ sourceDir }}</code>
1076
1073
  </template>
1077
1074
  <template v-else>{{ t('fragments.sources.wholeRepo') }}</template>
1078
1075
  </p>
@@ -76,7 +76,7 @@ function manageAccount() {
76
76
  <template>
77
77
  <div>
78
78
  <div class="mb-1 flex items-center justify-between gap-2">
79
- <span v-if="label" class="text-[11px] font-semibold uppercase tracking-wide text-slate-400">
79
+ <span v-if="label" class="text-[11px] font-semibold uppercase tracking-wide text-muted">
80
80
  {{ label }}
81
81
  </span>
82
82
  <span v-else />
@@ -99,7 +99,7 @@ function manageAccount() {
99
99
  <template v-if="categoryGroups.length">
100
100
  <div v-for="group in categoryGroups" :key="group.category">
101
101
  <p
102
- class="px-2 pb-0.5 pt-1.5 text-[11px] font-semibold uppercase tracking-wide text-slate-500"
102
+ class="px-2 pb-0.5 pt-1.5 text-[11px] font-semibold uppercase tracking-wide text-dimmed"
103
103
  >
104
104
  {{ group.category }}
105
105
  </p>
@@ -107,8 +107,8 @@ function manageAccount() {
107
107
  v-for="f in group.fragments"
108
108
  :key="f.id"
109
109
  type="button"
110
- class="flex w-full items-center gap-2 rounded px-2 py-1.5 text-start text-sm hover:bg-slate-800/60"
111
- :class="selectedSet.has(f.id) ? 'text-slate-100' : 'text-slate-300'"
110
+ class="flex w-full items-center gap-2 rounded px-2 py-1.5 text-start text-sm hover:bg-elevated/60"
111
+ :class="selectedSet.has(f.id) ? 'text-app-100' : 'text-toned'"
112
112
  :title="f.summary"
113
113
  :data-testid="`fragment-option-${f.id}`"
114
114
  :aria-pressed="selectedSet.has(f.id)"
@@ -117,38 +117,38 @@ function manageAccount() {
117
117
  <UIcon
118
118
  :name="selectedSet.has(f.id) ? 'i-lucide-check' : 'i-lucide-plus'"
119
119
  class="h-4 w-4 shrink-0"
120
- :class="selectedSet.has(f.id) ? 'text-primary-400' : 'text-slate-500'"
120
+ :class="selectedSet.has(f.id) ? 'text-primary' : 'text-dimmed'"
121
121
  />
122
122
  <span class="flex-1 truncate">{{ f.title }}</span>
123
123
  </button>
124
124
  </div>
125
125
  </template>
126
- <p v-else class="px-2 py-3 text-[12px] text-slate-500">
126
+ <p v-else class="px-2 py-3 text-[12px] text-dimmed">
127
127
  {{ t('inspector.fragments.pickerEmpty') }}
128
128
  </p>
129
129
 
130
- <div class="mt-1 border-t border-slate-800 pt-1">
130
+ <div class="mt-1 border-t border-default pt-1">
131
131
  <button
132
132
  type="button"
133
- class="flex w-full items-center gap-2 rounded px-2 py-1.5 text-start text-sm text-slate-300 hover:bg-slate-800/60"
133
+ class="flex w-full items-center gap-2 rounded px-2 py-1.5 text-start text-sm text-toned hover:bg-elevated/60"
134
134
  @click="manageBoard"
135
135
  >
136
- <UIcon name="i-lucide-book-marked" class="h-4 w-4 shrink-0 text-slate-400" />
136
+ <UIcon name="i-lucide-book-marked" class="h-4 w-4 shrink-0 text-muted" />
137
137
  <span class="flex-1 truncate">{{ t('inspector.fragments.manageBoard') }}</span>
138
138
  </button>
139
139
  <button
140
140
  v-if="accounts.enabled"
141
141
  type="button"
142
- class="flex w-full items-center gap-2 rounded px-2 py-1.5 text-start text-sm text-slate-300 hover:bg-slate-800/60"
142
+ class="flex w-full items-center gap-2 rounded px-2 py-1.5 text-start text-sm text-toned hover:bg-elevated/60"
143
143
  @click="manageAccount"
144
144
  >
145
- <UIcon name="i-lucide-users" class="h-4 w-4 shrink-0 text-slate-400" />
145
+ <UIcon name="i-lucide-users" class="h-4 w-4 shrink-0 text-muted" />
146
146
  <span class="flex-1 truncate">{{ t('inspector.fragments.manageAccount') }}</span>
147
147
  </button>
148
148
  </div>
149
149
  </div>
150
150
 
151
- <div class="flex justify-end border-t border-slate-800 p-1.5">
151
+ <div class="flex justify-end border-t border-default p-1.5">
152
152
  <UButton
153
153
  size="xs"
154
154
  color="neutral"
@@ -178,7 +178,7 @@ function manageAccount() {
178
178
  {{ f.title }}<UIcon name="i-lucide-x" class="ms-0.5 h-3 w-3" />
179
179
  </UBadge>
180
180
  </div>
181
- <div v-else-if="emptyText" class="text-[11px] text-slate-500">
181
+ <div v-else-if="emptyText" class="text-[11px] text-dimmed">
182
182
  {{ emptyText }}
183
183
  </div>
184
184
  </div>
@@ -76,7 +76,7 @@ async function importUrl() {
76
76
  {{ t('fragments.documents.urlImport.action') }}
77
77
  </UButton>
78
78
  </div>
79
- <p v-if="error" class="text-xs text-red-400" data-testid="fragment-url-import-error">
79
+ <p v-if="error" class="text-xs text-app-error-400" data-testid="fragment-url-import-error">
80
80
  {{ error }}
81
81
  </p>
82
82
  </div>
@@ -23,12 +23,12 @@ const { t } = useI18n()
23
23
  :key="`${c.name}-${i}`"
24
24
  class="flex items-center"
25
25
  :class="
26
- dense ? 'gap-1.5' : 'gap-2 rounded-md border border-slate-800 bg-slate-950/40 px-3 py-1.5'
26
+ dense ? 'gap-1.5' : 'gap-2 rounded-md border border-default bg-app-950/40 px-3 py-1.5'
27
27
  "
28
28
  >
29
29
  <UIcon
30
30
  name="i-lucide-circle-x"
31
- class="shrink-0 text-rose-400"
31
+ class="shrink-0 text-app-error-400"
32
32
  :class="dense ? 'h-3 w-3' : 'h-3.5 w-3.5'"
33
33
  />
34
34
  <a
@@ -36,7 +36,7 @@ const { t } = useI18n()
36
36
  :href="c.url"
37
37
  target="_blank"
38
38
  rel="noopener"
39
- class="group min-w-0 flex-1 truncate text-sky-300 hover:text-sky-200 hover:underline"
39
+ class="group min-w-0 flex-1 truncate text-app-info-300 hover:text-app-info-200 hover:underline"
40
40
  :class="dense ? 'text-[12px]' : 'text-[13px]'"
41
41
  :title="t('gates.ci.openOnGithub', { name: c.name })"
42
42
  >
@@ -49,11 +49,11 @@ const { t } = useI18n()
49
49
  <span
50
50
  v-else
51
51
  class="min-w-0 flex-1 truncate"
52
- :class="dense ? 'text-[12px] text-slate-300' : 'text-[13px] text-slate-200'"
52
+ :class="dense ? 'text-[12px] text-toned' : 'text-[13px] text-default'"
53
53
  >{{ c.name }}</span
54
54
  >
55
55
  <span
56
- class="shrink-0 uppercase text-rose-300"
56
+ class="shrink-0 uppercase text-app-error-300"
57
57
  :class="dense ? 'text-[10px]' : 'text-[11px]'"
58
58
  >{{ c.conclusion ?? t('gates.ci.conclusionFallback') }}</span
59
59
  >