@cat-factory/app 0.308.0 → 0.310.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 (265) hide show
  1. package/README.md +32 -2
  2. package/app/assets/css/main.css +22 -0
  3. package/app/assets/css/prose.css +4 -4
  4. package/app/assets/css/type.css +24 -0
  5. package/app/components/assistant/AssistantModal.vue +8 -6
  6. package/app/components/auth/BackendMisconfiguredScreen.vue +4 -3
  7. package/app/components/auth/LoginScreen.vue +40 -26
  8. package/app/components/auth/ResetPasswordScreen.vue +9 -4
  9. package/app/components/auth/UserMenu.vue +5 -4
  10. package/app/components/binaryCandidates/BinaryCandidatesWindow.vue +48 -37
  11. package/app/components/binaryOutput/BinaryOutputReport.vue +10 -14
  12. package/app/components/binaryOutput/StoredAssetView.vue +13 -11
  13. package/app/components/board/AddTaskModal.vue +30 -27
  14. package/app/components/board/AgentFailureCard.vue +21 -18
  15. package/app/components/board/AgentFailureHistory.vue +18 -9
  16. package/app/components/board/CreateInitiativeModal.vue +7 -6
  17. package/app/components/board/FailureDetail.vue +22 -12
  18. package/app/components/board/FailureHistoryList.vue +5 -5
  19. package/app/components/board/RecurringPipelineModal.vue +12 -11
  20. package/app/components/board/ReviewFrictionDialog.vue +8 -6
  21. package/app/components/board/StepExecutionHistory.vue +8 -8
  22. package/app/components/board/nodes/AgentChip.vue +1 -1
  23. package/app/components/board/nodes/BlockNode.vue +25 -24
  24. package/app/components/board/nodes/DecisionBadge.vue +4 -3
  25. package/app/components/board/nodes/EpicNode.vue +4 -4
  26. package/app/components/board/nodes/FrameSwimlanes.vue +8 -10
  27. package/app/components/board/nodes/InitiativeCard.vue +4 -4
  28. package/app/components/board/nodes/LaneGroup.vue +3 -5
  29. package/app/components/board/nodes/TaskCard.vue +20 -15
  30. package/app/components/board/nodes/TaskLane.vue +3 -3
  31. package/app/components/board/nodes/TaskPipelineMini.vue +21 -18
  32. package/app/components/bootstrap/AdoptionReviewModal.vue +36 -26
  33. package/app/components/bootstrap/BootstrapModal.vue +14 -13
  34. package/app/components/bootstrap/BootstrapRunSteps.vue +1 -1
  35. package/app/components/brainstorm/BrainstormWindow.vue +13 -10
  36. package/app/components/bugFishing/BugFishingWindow.vue +81 -58
  37. package/app/components/clarity/ClarityReviewWindow.vue +13 -10
  38. package/app/components/common/AsyncViewError.vue +1 -1
  39. package/app/components/common/ClarificationItem.vue +6 -6
  40. package/app/components/common/CopyButton.vue +12 -11
  41. package/app/components/common/DescriptorFields.vue +1 -1
  42. package/app/components/common/EmptyState.vue +1 -1
  43. package/app/components/common/IconButton.vue +34 -9
  44. package/app/components/common/InterviewGateNotice.vue +4 -4
  45. package/app/components/common/MarkdownProse.vue +8 -2
  46. package/app/components/common/SectionLabel.vue +38 -0
  47. package/app/components/consensus/ConsensusSessionWindow.vue +10 -9
  48. package/app/components/context/ContextAttachmentFields.vue +32 -20
  49. package/app/components/docs/DocInterviewWindow.vue +10 -9
  50. package/app/components/documents/ContextDocumentPicker.vue +22 -21
  51. package/app/components/documents/DocumentImportModal.vue +7 -5
  52. package/app/components/documents/DocumentOriginLink.vue +12 -9
  53. package/app/components/documents/DocumentSourceConnectModal.vue +2 -2
  54. package/app/components/documents/DocumentSyncState.vue +4 -4
  55. package/app/components/documents/DocumentTemplatesModal.vue +5 -4
  56. package/app/components/documents/RepoContextDocPicker.vue +7 -9
  57. package/app/components/documents/StartFromDesignModal.vue +4 -4
  58. package/app/components/documents/TaskContextDocs.vue +1 -1
  59. package/app/components/environments/EnvSetupStepper.vue +3 -3
  60. package/app/components/environments/EnvironmentStatusPanel.vue +15 -13
  61. package/app/components/environments/steps/EnvPreflightStep.vue +8 -8
  62. package/app/components/environments/steps/EnvReviewStep.vue +23 -22
  63. package/app/components/environments/steps/EnvSaveStep.vue +5 -5
  64. package/app/components/focus/BlockFocusView.vue +11 -10
  65. package/app/components/followUp/FollowUpWindow.vue +18 -15
  66. package/app/components/forkDecision/ForkDecisionWindow.vue +85 -97
  67. package/app/components/foundational/FoundationalContractSummary.vue +2 -2
  68. package/app/components/foundational/FoundationalServiceCatalogList.vue +6 -5
  69. package/app/components/foundational/FoundationalServiceRegistry.vue +10 -9
  70. package/app/components/foundational/FoundationalServiceSources.vue +7 -6
  71. package/app/components/foundational/FoundationalSuppressions.vue +2 -2
  72. package/app/components/fragments/FragmentLibraryManager.vue +8 -7
  73. package/app/components/fragments/FragmentSelector.vue +22 -20
  74. package/app/components/gates/GateFailingCheckList.vue +7 -6
  75. package/app/components/gates/GateResultView.vue +55 -49
  76. package/app/components/github/AddServiceFromRepoModal.vue +16 -11
  77. package/app/components/github/BranchProtectionPreflight.vue +5 -5
  78. package/app/components/github/GitHubConnect.vue +5 -3
  79. package/app/components/github/GitHubOnboarding.vue +7 -2
  80. package/app/components/github/GitHubPanel.vue +23 -19
  81. package/app/components/github/RepoTreeBrowser.vue +16 -13
  82. package/app/components/humanTest/HumanTestWindow.vue +29 -24
  83. package/app/components/initiative/InitiativePlanNotice.vue +3 -3
  84. package/app/components/initiative/InitiativePlanReview.vue +46 -38
  85. package/app/components/initiative/InitiativePlanningWindow.vue +5 -5
  86. package/app/components/initiative/InitiativeTrackerWindow.vue +213 -165
  87. package/app/components/judge/JudgeResultView.vue +28 -27
  88. package/app/components/kaizen/KaizenPanel.vue +70 -56
  89. package/app/components/kaizen/KaizenStepStatus.vue +7 -6
  90. package/app/components/layout/AccountAuditLog.vue +1 -1
  91. package/app/components/layout/AccountDeploymentSettings.vue +10 -10
  92. package/app/components/layout/AccountFailureKindRules.vue +13 -13
  93. package/app/components/layout/AccountFoundationalSettings.vue +1 -1
  94. package/app/components/layout/AccountFragmentSettings.vue +1 -1
  95. package/app/components/layout/AccountModelPolicySettings.vue +7 -7
  96. package/app/components/layout/AccountPlatformAlertSettings.vue +8 -8
  97. package/app/components/layout/AccountRiskPolicySettings.vue +2 -2
  98. package/app/components/layout/AccountRunCredentialSettings.vue +3 -3
  99. package/app/components/layout/AccountSkillSettings.vue +1 -1
  100. package/app/components/layout/AccountTeamSettings.vue +13 -9
  101. package/app/components/layout/AiProvidersBanner.vue +1 -1
  102. package/app/components/layout/AppearanceSwitcher.vue +5 -4
  103. package/app/components/layout/BoardSwitcher.vue +13 -10
  104. package/app/components/layout/BoardToolbar.vue +10 -5
  105. package/app/components/layout/CommandBar.vue +8 -5
  106. package/app/components/layout/DefaultTestEnvBanner.vue +6 -5
  107. package/app/components/layout/IntegrationsHub.vue +12 -9
  108. package/app/components/layout/LanguageSwitcher.vue +5 -4
  109. package/app/components/layout/ModelProvidersHub.vue +10 -7
  110. package/app/components/layout/NotificationsInbox.vue +47 -36
  111. package/app/components/layout/PersonalSetupModal.vue +9 -6
  112. package/app/components/layout/RolePrompt.vue +5 -4
  113. package/app/components/layout/SideBar.vue +7 -8
  114. package/app/components/layout/SpendWarningBanner.vue +3 -3
  115. package/app/components/layout/TranslationWarningBanner.vue +5 -4
  116. package/app/components/layout/UiModeSwitcher.vue +15 -12
  117. package/app/components/layout/UiRoleSwitcher.vue +10 -8
  118. package/app/components/layout/WorkspaceMembersSettings.vue +2 -2
  119. package/app/components/media/ArtifactLightbox.vue +74 -44
  120. package/app/components/media/ImageCompare.vue +80 -85
  121. package/app/components/merge/MergeEffortChips.vue +4 -6
  122. package/app/components/notifications/NotificationSettingsPanel.vue +6 -5
  123. package/app/components/observability/OutcomeFilterChips.vue +6 -5
  124. package/app/components/observability/RunFailureSummary.vue +22 -23
  125. package/app/components/observability/StepMetricsBar.vue +9 -8
  126. package/app/components/observability/StepModelActivity.vue +8 -5
  127. package/app/components/observability/ToolCallList.vue +19 -20
  128. package/app/components/outcome/OutcomeSummaryWindow.vue +48 -46
  129. package/app/components/palettes/AgentPalette.vue +21 -15
  130. package/app/components/palettes/AgentTierSelect.vue +1 -1
  131. package/app/components/palettes/PipelinePurposeSelect.vue +1 -1
  132. package/app/components/panels/AgentStepDetail.vue +57 -49
  133. package/app/components/panels/AttemptEntryHeader.vue +2 -2
  134. package/app/components/panels/DecisionModal.vue +1 -1
  135. package/app/components/panels/GenericStructuredResultView.vue +6 -5
  136. package/app/components/panels/InspectorPanel.vue +15 -13
  137. package/app/components/panels/MergerResultView.vue +10 -9
  138. package/app/components/panels/ObservabilityPanel.vue +211 -186
  139. package/app/components/panels/OperatorDashboardPanel.vue +124 -115
  140. package/app/components/panels/ReportsPanel.vue +87 -83
  141. package/app/components/panels/ReportsSpendBreakdown.vue +2 -2
  142. package/app/components/panels/ResultWindowShell.vue +152 -137
  143. package/app/components/panels/RunDetailLoadState.vue +1 -1
  144. package/app/components/panels/StepContainerStatus.vue +17 -16
  145. package/app/components/panels/StepDelegatedStatus.vue +24 -21
  146. package/app/components/panels/StepEffortReport.vue +12 -17
  147. package/app/components/panels/StepFragmentAdherence.vue +9 -10
  148. package/app/components/panels/StepMetadataCard.vue +41 -43
  149. package/app/components/panels/StepReproductionReport.vue +18 -20
  150. package/app/components/panels/StepRestartControl.vue +3 -2
  151. package/app/components/panels/StepRunMeta.vue +27 -26
  152. package/app/components/panels/StepTestReport.vue +16 -15
  153. package/app/components/panels/StepToolServers.vue +7 -8
  154. package/app/components/panels/StepValidationReport.vue +5 -5
  155. package/app/components/panels/inspector/ContainerSummary.vue +4 -4
  156. package/app/components/panels/inspector/DocReferenceRepos.vue +5 -4
  157. package/app/components/panels/inspector/EnvProbeReport.vue +16 -13
  158. package/app/components/panels/inspector/EpicChildren.vue +12 -10
  159. package/app/components/panels/inspector/FrontendBindingsResolved.vue +5 -4
  160. package/app/components/panels/inspector/FrontendConfig.vue +29 -36
  161. package/app/components/panels/inspector/InitiativeInspector.vue +3 -3
  162. package/app/components/panels/inspector/InspectorSection.vue +25 -17
  163. package/app/components/panels/inspector/RecurringScheduleSettings.vue +9 -8
  164. package/app/components/panels/inspector/ServiceConnections.vue +5 -4
  165. package/app/components/panels/inspector/ServiceReleaseHealthConfig.vue +2 -2
  166. package/app/components/panels/inspector/ServiceSelfTests.vue +9 -13
  167. package/app/components/panels/inspector/ServiceTestConfig.vue +46 -49
  168. package/app/components/panels/inspector/ServiceTestSecrets.vue +3 -3
  169. package/app/components/panels/inspector/ServiceTestingContext.vue +2 -2
  170. package/app/components/panels/inspector/ServiceValidationConfig.vue +2 -2
  171. package/app/components/panels/inspector/TaskAgentConfig.vue +2 -2
  172. package/app/components/panels/inspector/TaskAprioriBranches.vue +6 -5
  173. package/app/components/panels/inspector/TaskDependencies.vue +1 -1
  174. package/app/components/panels/inspector/TaskEstimateBadge.vue +3 -7
  175. package/app/components/panels/inspector/TaskExecution.vue +18 -16
  176. package/app/components/panels/inspector/TaskRunSettings.vue +45 -44
  177. package/app/components/panels/inspector/TaskStructure.vue +5 -4
  178. package/app/components/pipeline/AgentPromptEditor.vue +15 -14
  179. package/app/components/pipeline/BinaryOutputStepPicker.vue +42 -52
  180. package/app/components/pipeline/EstimateThresholdFields.vue +14 -11
  181. package/app/components/pipeline/GateConfigFields.vue +19 -23
  182. package/app/components/pipeline/IterationCapPrompt.vue +1 -1
  183. package/app/components/pipeline/PipelineBuilder.vue +113 -99
  184. package/app/components/pipeline/PipelineHealthModal.vue +7 -7
  185. package/app/components/pipeline/PipelinePicker.vue +11 -9
  186. package/app/components/pipeline/PipelinePreview.vue +6 -7
  187. package/app/components/pipeline/PipelineProgress.vue +49 -45
  188. package/app/components/prReview/PrReviewWindow.vue +87 -65
  189. package/app/components/providers/AiPresetMismatchDialog.vue +4 -3
  190. package/app/components/providers/AiProviderOnboardingModal.vue +2 -2
  191. package/app/components/providers/ApiKeysSection.vue +11 -9
  192. package/app/components/providers/PersonalSubscriptionSection.vue +4 -3
  193. package/app/components/providers/VendorCredentialsModal.vue +5 -4
  194. package/app/components/provisioning/ProvisioningLogsDrawer.vue +10 -9
  195. package/app/components/ralph/RalphLoopResultView.vue +29 -29
  196. package/app/components/requirements/RequirementsReviewWindow.vue +22 -17
  197. package/app/components/riskPolicy/RiskPolicyPicker.vue +13 -11
  198. package/app/components/riskPolicy/RiskPolicyPreview.vue +16 -15
  199. package/app/components/sandbox/SandboxPanel.vue +93 -73
  200. package/app/components/settings/ApiTokensPanel.vue +1 -1
  201. package/app/components/settings/BudgetSettings.vue +18 -17
  202. package/app/components/settings/CapabilityCredentialsPanel.vue +5 -5
  203. package/app/components/settings/CloudflareHandlerSection.vue +44 -41
  204. package/app/components/settings/ComposeEnvironmentSetupSection.vue +14 -12
  205. package/app/components/settings/ConnectionTestVerdict.vue +1 -1
  206. package/app/components/settings/ConsensusGroupsSection.vue +58 -47
  207. package/app/components/settings/CustomManifestTypeEditor.vue +8 -7
  208. package/app/components/settings/DefaultProvisionTypeSection.vue +5 -5
  209. package/app/components/settings/InfraHandlersConfigurator.vue +26 -24
  210. package/app/components/settings/InfrastructureBackendPicker.vue +18 -18
  211. package/app/components/settings/IssueTrackerPanel.vue +30 -21
  212. package/app/components/settings/KubernetesEngineForm.vue +9 -8
  213. package/app/components/settings/KubernetesEnvironmentForm.vue +4 -3
  214. package/app/components/settings/LocalContainerPoolSettings.vue +2 -2
  215. package/app/components/settings/LocalModelEndpointsPanel.vue +13 -11
  216. package/app/components/settings/MergeClassRulesEditor.vue +6 -5
  217. package/app/components/settings/MergeRolePolicyEditor.vue +13 -12
  218. package/app/components/settings/ModelConfigurationPanel.vue +17 -19
  219. package/app/components/settings/ModelPresetHealthModal.vue +3 -3
  220. package/app/components/settings/ObservabilityConnectionPanel.vue +1 -1
  221. package/app/components/settings/OpenRouterCatalogPanel.vue +10 -8
  222. package/app/components/settings/PackageRegistriesPanel.vue +4 -4
  223. package/app/components/settings/ProviderConnectionTab.vue +5 -4
  224. package/app/components/settings/ProviderManifestEditor.vue +9 -8
  225. package/app/components/settings/ProviderPreferenceEditor.vue +13 -13
  226. package/app/components/settings/RiskPolicyCreateForm.vue +40 -26
  227. package/app/components/settings/RiskPolicyEditorRow.vue +21 -19
  228. package/app/components/settings/RiskPolicyHealthModal.vue +3 -3
  229. package/app/components/settings/RiskPolicyPanel.vue +11 -13
  230. package/app/components/settings/ServiceFragmentDefaultsPanel.vue +15 -12
  231. package/app/components/settings/SharedStacksPanel.vue +5 -5
  232. package/app/components/settings/TaskSourceCard.vue +2 -2
  233. package/app/components/settings/TaskTypeSuppressionsPanel.vue +4 -4
  234. package/app/components/settings/ToolServerChecklist.vue +22 -22
  235. package/app/components/settings/UsageSettings.vue +13 -13
  236. package/app/components/settings/UserSecretsSection.vue +4 -3
  237. package/app/components/settings/WorkspaceMetadataSettings.vue +6 -5
  238. package/app/components/settings/WorkspaceSettingsPanel.vue +72 -58
  239. package/app/components/skills/ReviewSkillQueue.vue +12 -10
  240. package/app/components/skills/SkillLibraryManager.vue +9 -8
  241. package/app/components/slack/SlackPanel.vue +17 -12
  242. package/app/components/spec/ServiceSpecWindow.vue +19 -19
  243. package/app/components/tasks/BugHuntModal.vue +1 -1
  244. package/app/components/tasks/ContextIssuePicker.vue +16 -15
  245. package/app/components/tasks/TaskContextIssues.vue +5 -4
  246. package/app/components/tasks/TaskImportModal.vue +3 -2
  247. package/app/components/tasks/TaskSourceConnectModal.vue +5 -5
  248. package/app/components/testing/TestReportWindow.vue +67 -60
  249. package/app/components/theme/ThemeImportModal.vue +2 -2
  250. package/app/components/tutorial/TutorialNudge.vue +3 -2
  251. package/app/components/tutorial/TutorialOverlay.vue +3 -2
  252. package/app/components/vcs/GitLabConnect.vue +1 -1
  253. package/app/components/visualConfirm/VisualConfirmationWindow.vue +79 -54
  254. package/app/utils/theme/builtins.ts +7 -1
  255. package/i18n/locales/de.json +7 -3
  256. package/i18n/locales/en.json +7 -3
  257. package/i18n/locales/es.json +7 -3
  258. package/i18n/locales/fr.json +7 -3
  259. package/i18n/locales/he.json +7 -3
  260. package/i18n/locales/it.json +7 -3
  261. package/i18n/locales/ja.json +7 -3
  262. package/i18n/locales/pl.json +7 -3
  263. package/i18n/locales/tr.json +7 -3
  264. package/i18n/locales/uk.json +7 -3
  265. package/package.json +1 -1
@@ -204,7 +204,7 @@ async function checkSetup(source: TaskSourceKind) {
204
204
  <h3 class="text-sm font-semibold text-default">
205
205
  {{ t('settings.issueTracker.filing.heading') }}
206
206
  </h3>
207
- <p class="mt-1 text-[11px] text-muted">
207
+ <p class="mt-1 text-2xs text-muted">
208
208
  <i18n-t keypath="settings.issueTracker.filing.description" tag="span" scope="global">
209
209
  <template #none>
210
210
  <span class="text-toned">{{ t('settings.issueTracker.filing.none') }}</span>
@@ -269,39 +269,48 @@ async function checkSetup(source: TaskSourceKind) {
269
269
  </div>
270
270
 
271
271
  <!-- Inline readiness hints for the picked tracker. -->
272
- <p
273
- v-if="trackerKind === 'github' && !githubAvailable"
274
- class="text-[11px] text-app-warning-400"
275
- >
272
+ <p v-if="trackerKind === 'github' && !githubAvailable" class="text-2xs text-app-warning-400">
276
273
  <i18n-t keypath="settings.issueTracker.filing.githubHint" tag="span" scope="global">
277
274
  <template #link>
278
- <button class="underline" @click="ui.openGitHub()">
275
+ <UButton
276
+ color="neutral"
277
+ variant="link"
278
+ class="p-0 text-2xs underline"
279
+ @click="ui.openGitHub()"
280
+ >
279
281
  {{ t('settings.issueTracker.filing.githubHintLink') }}
280
- </button>
282
+ </UButton>
281
283
  </template>
282
284
  </i18n-t>
283
285
  </p>
284
- <p
285
- v-else-if="trackerKind === 'jira' && !jiraConnected"
286
- class="text-[11px] text-app-warning-400"
287
- >
286
+ <p v-else-if="trackerKind === 'jira' && !jiraConnected" class="text-2xs text-app-warning-400">
288
287
  <i18n-t keypath="settings.issueTracker.filing.jiraHint" tag="span" scope="global">
289
288
  <template #link>
290
- <button class="underline" @click="ui.openTaskConnect('jira')">
289
+ <UButton
290
+ color="neutral"
291
+ variant="link"
292
+ class="p-0 text-2xs underline"
293
+ @click="ui.openTaskConnect('jira')"
294
+ >
291
295
  {{ t('settings.issueTracker.filing.connectLink') }}
292
- </button>
296
+ </UButton>
293
297
  </template>
294
298
  </i18n-t>
295
299
  </p>
296
300
  <p
297
301
  v-else-if="trackerKind === 'linear' && !linearConnected"
298
- class="text-[11px] text-app-warning-400"
302
+ class="text-2xs text-app-warning-400"
299
303
  >
300
304
  <i18n-t keypath="settings.issueTracker.filing.linearHint" tag="span" scope="global">
301
305
  <template #link>
302
- <button class="underline" @click="ui.openTaskConnect('linear')">
306
+ <UButton
307
+ color="neutral"
308
+ variant="link"
309
+ class="p-0 text-2xs underline"
310
+ @click="ui.openTaskConnect('linear')"
311
+ >
303
312
  {{ t('settings.issueTracker.filing.connectLink') }}
304
- </button>
313
+ </UButton>
305
314
  </template>
306
315
  </i18n-t>
307
316
  </p>
@@ -313,7 +322,7 @@ async function checkSetup(source: TaskSourceKind) {
313
322
  >
314
323
  <UInput v-model="jiraProjectKey" placeholder="ENG" size="sm" class="w-full" />
315
324
  <template #help>
316
- <span class="text-[11px] text-dimmed">
325
+ <span class="text-2xs text-dimmed">
317
326
  {{ t('settings.issueTracker.filing.jiraProjectKeyHelp') }}
318
327
  </span>
319
328
  </template>
@@ -340,7 +349,7 @@ async function checkSetup(source: TaskSourceKind) {
340
349
  />
341
350
  <UInput v-else v-model="linearTeamId" placeholder="team_…" size="sm" class="w-full" />
342
351
  <template #help>
343
- <span class="text-[11px] text-dimmed">
352
+ <span class="text-2xs text-dimmed">
344
353
  {{ t('settings.issueTracker.filing.linearTeamIdHelp') }}
345
354
  </span>
346
355
  </template>
@@ -353,7 +362,7 @@ async function checkSetup(source: TaskSourceKind) {
353
362
  <h3 class="text-sm font-semibold text-default">
354
363
  {{ t('settings.issueTracker.linking.heading') }}
355
364
  </h3>
356
- <p class="mt-1 text-[11px] text-muted">
365
+ <p class="mt-1 text-2xs text-muted">
357
366
  {{ t('settings.issueTracker.linking.description') }}
358
367
  </p>
359
368
  </div>
@@ -370,7 +379,7 @@ async function checkSetup(source: TaskSourceKind) {
370
379
  @remedy="openRemedy(source)"
371
380
  />
372
381
 
373
- <p v-if="tasks.sources.length === 0" class="text-[11px] text-dimmed">
382
+ <p v-if="tasks.sources.length === 0" class="text-2xs text-dimmed">
374
383
  {{ t('settings.issueTracker.linking.none') }}
375
384
  </p>
376
385
  </section>
@@ -381,7 +390,7 @@ async function checkSetup(source: TaskSourceKind) {
381
390
  <h3 class="text-sm font-semibold text-default">
382
391
  {{ t('settings.issueTracker.writeback.heading') }}
383
392
  </h3>
384
- <p class="mt-1 text-[11px] text-muted">
393
+ <p class="mt-1 text-2xs text-muted">
385
394
  <i18n-t keypath="settings.issueTracker.writeback.description" tag="span" scope="global">
386
395
  <template #done>
387
396
  <span class="text-toned">{{ t('settings.issueTracker.writeback.done') }}</span>
@@ -17,6 +17,7 @@ import type {
17
17
  } from '@cat-factory/contracts'
18
18
  import { isKubernetesUrlSource } from '@cat-factory/contracts'
19
19
  import type { K3sSetupPrefill } from '~/stores/ui'
20
+ import SectionLabel from '~/components/common/SectionLabel.vue'
20
21
 
21
22
  // The kube branch of the discriminated handler config this form produces (the `local-k3s` /
22
23
  // `remote-kubernetes` engines share `kubernetesEngineConfigSchema`). Emitting this typed
@@ -369,17 +370,17 @@ async function copyAutoSetupCommand() {
369
370
 
370
371
  <template>
371
372
  <div class="rounded-lg border border-dashed border-muted p-3 space-y-3">
372
- <p class="text-[11px] font-semibold uppercase tracking-wide text-muted">
373
+ <SectionLabel as="p">
373
374
  {{
374
375
  connected
375
376
  ? t('settings.providerConnection.form.updateConfiguration')
376
377
  : t('settings.providerConnection.form.connect')
377
378
  }}
378
- </p>
379
+ </SectionLabel>
379
380
 
380
381
  <p
381
382
  v-if="engine === 'local-k3s'"
382
- class="rounded-md border border-app-info-500/30 bg-app-info-500/10 p-2 text-[11px] text-app-info-200"
383
+ class="rounded-md border border-app-info-500/30 bg-app-info-500/10 p-2 text-2xs text-app-info-200"
383
384
  >
384
385
  {{ t('settings.infrastructure.kubernetesEngine.localK3sHint') }}
385
386
  </p>
@@ -391,16 +392,16 @@ async function copyAutoSetupCommand() {
391
392
  v-if="engine === 'local-k3s'"
392
393
  class="rounded-md border border-muted bg-default/40 p-2 space-y-1.5"
393
394
  >
394
- <p class="flex items-center gap-1.5 text-[11px] font-semibold text-toned">
395
+ <p class="flex items-center gap-1.5 text-2xs font-semibold text-toned">
395
396
  <UIcon name="i-lucide-wand-2" class="h-3.5 w-3.5 text-muted" />
396
397
  {{ t('settings.infrastructure.kubernetesEngine.autoSetup.title') }}
397
398
  </p>
398
- <p class="text-[11px] text-muted">
399
+ <p class="text-2xs text-muted">
399
400
  {{ t('settings.infrastructure.kubernetesEngine.autoSetup.description') }}
400
401
  </p>
401
402
  <div class="flex items-center gap-1.5">
402
403
  <code
403
- class="flex-1 rounded bg-app-950 px-2 py-1 font-mono text-[11px] text-default select-all"
404
+ class="flex-1 rounded-sm bg-app-950 px-2 py-1 font-mono text-2xs text-default select-all"
404
405
  >
405
406
  {{ AUTO_SETUP_COMMAND }}
406
407
  </code>
@@ -438,7 +439,7 @@ async function copyAutoSetupCommand() {
438
439
  "
439
440
  >
440
441
  <template v-if="tokenStored" #hint>
441
- <span class="inline-flex items-center gap-1 text-[11px] text-app-success-400">
442
+ <span class="inline-flex items-center gap-1 text-2xs text-app-success-400">
442
443
  <UIcon name="i-lucide-check-circle-2" class="h-3.5 w-3.5" />
443
444
  {{ t('settings.infrastructure.kubernetesEngine.tokenSaved') }}
444
445
  </span>
@@ -457,7 +458,7 @@ async function copyAutoSetupCommand() {
457
458
  and the operator may legitimately overrule it. -->
458
459
  <p
459
460
  v-if="tokenProblem"
460
- class="mt-1 text-[11px]"
461
+ class="mt-1 text-2xs"
461
462
  :class="tokenBlocking ? 'text-app-error-400' : 'text-app-warning-400'"
462
463
  data-testid="service-account-token-problem"
463
464
  >
@@ -15,6 +15,7 @@ import ConnectionWarnings from '~/components/settings/ConnectionWarnings.vue'
15
15
  import ConnectionTestVerdict from '~/components/settings/ConnectionTestVerdict.vue'
16
16
  import SecretInput from '~/components/common/SecretInput.vue'
17
17
  import type { ProviderConnection } from '~/types/providerConnections'
18
+ import SectionLabel from '~/components/common/SectionLabel.vue'
18
19
 
19
20
  const props = defineProps<{
20
21
  connection: ProviderConnection | null
@@ -264,13 +265,13 @@ function optional(label: string): string {
264
265
 
265
266
  <template>
266
267
  <div class="rounded-lg border border-dashed border-muted p-3 space-y-3">
267
- <p class="text-[11px] font-semibold uppercase tracking-wide text-muted">
268
+ <SectionLabel as="p">
268
269
  {{
269
270
  connection?.kind === 'kubernetes'
270
271
  ? t('settings.providerConnection.form.updateConfiguration')
271
272
  : t('settings.providerConnection.form.connect')
272
273
  }}
273
- </p>
274
+ </SectionLabel>
274
275
 
275
276
  <UFormField :label="t('settings.providerConnection.kubernetesEnv.label')">
276
277
  <UInput
@@ -295,7 +296,7 @@ function optional(label: string): string {
295
296
  and the operator may legitimately overrule it. -->
296
297
  <p
297
298
  v-if="tokenProblem"
298
- class="mt-1 text-[11px]"
299
+ class="mt-1 text-2xs"
299
300
  :class="tokenBlocking ? 'text-app-error-400' : 'text-app-warning-400'"
300
301
  data-testid="service-account-token-problem"
301
302
  >
@@ -93,7 +93,7 @@ async function save() {
93
93
  <i18n-t
94
94
  keypath="settings.localMode.pool.description"
95
95
  tag="p"
96
- class="text-[11px] text-muted"
96
+ class="text-2xs text-muted"
97
97
  scope="global"
98
98
  >
99
99
  <template #appleContainer>
@@ -141,7 +141,7 @@ async function save() {
141
141
  <h4 class="text-sm font-semibold text-default">
142
142
  {{ t('settings.localMode.checkout.heading') }}
143
143
  </h4>
144
- <p class="text-[11px] text-muted">
144
+ <p class="text-2xs text-muted">
145
145
  {{ t('settings.localMode.checkout.description') }}
146
146
  </p>
147
147
  </div>
@@ -17,6 +17,8 @@ import {
17
17
  } from '~/types/localModels'
18
18
  import IntegrationBackTitle from '~/components/layout/IntegrationBackTitle.vue'
19
19
  import SecretInput from '~/components/common/SecretInput.vue'
20
+ import SectionLabel from '~/components/common/SectionLabel.vue'
21
+ import IconButton from '~/components/common/IconButton.vue'
20
22
 
21
23
  const { t } = useI18n()
22
24
  const ui = useUiStore()
@@ -301,7 +303,7 @@ async function remove(p: LocalRunner) {
301
303
  <div>
302
304
  <span class="font-medium text-default">{{ e.label }}</span>
303
305
  <span class="ms-2 text-xs text-dimmed">{{ LOCAL_RUNNER_LABELS[e.provider] }}</span>
304
- <div class="text-[11px] text-dimmed">
306
+ <div class="text-2xs text-dimmed">
305
307
  {{ e.baseUrl }} ·
306
308
  {{
307
309
  t(
@@ -316,7 +318,7 @@ async function remove(p: LocalRunner) {
316
318
  </div>
317
319
  <!-- A row whose URL the deployment no longer permits: its models are withheld
318
320
  from the picker, so this is the only place that can say why. -->
319
- <div v-if="e.urlBlockedReason" class="mt-1 text-[11px] text-app-warning-400">
321
+ <div v-if="e.urlBlockedReason" class="mt-1 text-2xs text-app-warning-400">
320
322
  {{ t('settings.localModelEndpoints.blocked') }}
321
323
  <span class="block text-app-warning-300/70">{{
322
324
  urlReasonText(e.urlBlockedReason)
@@ -325,18 +327,18 @@ async function remove(p: LocalRunner) {
325
327
  <!-- Part of the stored model list could not be read and was discarded. Without this
326
328
  the shortened list reads exactly like a runner nothing was ever enabled on, and
327
329
  only one of those is fixed by re-ticking. -->
328
- <div v-if="e.unreadableModels" class="mt-1 text-[11px] text-app-warning-400">
330
+ <div v-if="e.unreadableModels" class="mt-1 text-2xs text-app-warning-400">
329
331
  {{ t('settings.localModelEndpoints.modelsDiscarded') }}
330
332
  </div>
331
333
  </div>
332
334
  <div class="flex items-center gap-1">
333
- <UButton
335
+ <IconButton
334
336
  icon="i-lucide-pencil"
335
337
  color="neutral"
336
338
  variant="ghost"
337
339
  size="xs"
338
340
  :disabled="busy"
339
- :title="t('settings.localModelEndpoints.edit')"
341
+ :label="t('settings.localModelEndpoints.edit')"
340
342
  @click="selectRunner(e.provider)"
341
343
  />
342
344
  <UButton
@@ -352,13 +354,13 @@ async function remove(p: LocalRunner) {
352
354
 
353
355
  <!-- add / edit form -->
354
356
  <div class="rounded-lg border border-dashed border-muted p-3 space-y-3">
355
- <p class="text-[11px] font-semibold uppercase tracking-wide text-muted">
357
+ <SectionLabel as="p">
356
358
  {{
357
359
  existing
358
360
  ? t('settings.localModelEndpoints.editRunner')
359
361
  : t('settings.localModelEndpoints.addRunner')
360
362
  }}
361
- </p>
363
+ </SectionLabel>
362
364
 
363
365
  <div class="flex flex-wrap items-end gap-3">
364
366
  <UFormField :label="t('settings.localModelEndpoints.runnerType')">
@@ -415,7 +417,7 @@ async function remove(p: LocalRunner) {
415
417
  </UButton>
416
418
  <span v-if="testError" class="text-xs text-app-error-400">
417
419
  {{ testError }}
418
- <span v-if="testErrorDetail" class="block text-[11px] text-app-error-300/70">{{
420
+ <span v-if="testErrorDetail" class="block text-2xs text-app-error-300/70">{{
419
421
  testErrorDetail
420
422
  }}</span>
421
423
  </span>
@@ -435,10 +437,10 @@ async function remove(p: LocalRunner) {
435
437
 
436
438
  <!-- discovered models multi-select, each with its declared image support -->
437
439
  <div v-if="discovered.length" class="space-y-1.5">
438
- <span class="block text-[10px] uppercase tracking-wide text-dimmed">
440
+ <SectionLabel as="span" class="block">
439
441
  {{ t('settings.localModelEndpoints.enableModels') }}
440
- </span>
441
- <p class="text-[11px] text-dimmed">
442
+ </SectionLabel>
443
+ <p class="text-2xs text-dimmed">
442
444
  {{ t('settings.localModelEndpoints.imageInputHint') }}
443
445
  </p>
444
446
  <div class="space-y-1.5">
@@ -10,6 +10,7 @@
10
10
  import { computed } from 'vue'
11
11
  import { autoMergeShare, frictionlessShare, RULEABLE_CHANGE_CLASSES } from '@cat-factory/contracts'
12
12
  import type { MergeClassRule, MergeClassRules } from '~/types/merge'
13
+ import SectionLabel from '~/components/common/SectionLabel.vue'
13
14
 
14
15
  const props = defineProps<{
15
16
  /** The preset's current rules; an absent class means "use the score ceilings". */
@@ -83,13 +84,13 @@ function setRule(changeClass: (typeof RULEABLE_CHANGE_CLASSES)[number], rule: Me
83
84
  <template>
84
85
  <div data-testid="merge-class-rules" class="space-y-2">
85
86
  <div>
86
- <span class="block text-[10px] uppercase tracking-wide text-dimmed">
87
+ <SectionLabel as="span" class="block">
87
88
  {{ t('settings.riskPolicy.classRules.heading') }}
88
- </span>
89
- <p class="mt-0.5 text-[11px] leading-snug text-dimmed">
89
+ </SectionLabel>
90
+ <p class="mt-0.5 text-2xs leading-snug text-dimmed">
90
91
  {{ t('settings.riskPolicy.classRules.help') }}
91
92
  </p>
92
- <p v-if="!autoMergeEnabled" class="mt-1 text-[11px] leading-snug text-app-warning-400/90">
93
+ <p v-if="!autoMergeEnabled" class="mt-1 text-2xs leading-snug text-app-warning-400/90">
93
94
  {{ t('settings.riskPolicy.classRules.autoMergeOffWarning') }}
94
95
  </p>
95
96
  </div>
@@ -111,7 +112,7 @@ function setRule(changeClass: (typeof RULEABLE_CHANGE_CLASSES)[number], rule: Me
111
112
  :data-testid="`merge-class-rule-${row.changeClass}`"
112
113
  @update:model-value="setRule(row.changeClass, $event as MergeClassRule)"
113
114
  />
114
- <span class="text-[11px] text-dimmed" :data-testid="`merge-class-record-${row.changeClass}`">
115
+ <span class="text-2xs text-dimmed" :data-testid="`merge-class-record-${row.changeClass}`">
115
116
  <template v-if="row.merged === 0">
116
117
  {{ t('settings.riskPolicy.classRules.noData') }}
117
118
  </template>
@@ -34,6 +34,7 @@ import {
34
34
  toggleSubmissionClass,
35
35
  type RoleRuleSelection,
36
36
  } from '~/components/settings/MergeRolePolicyEditor.logic'
37
+ import SectionLabel from '~/components/common/SectionLabel.vue'
37
38
 
38
39
  const props = defineProps<{
39
40
  /** The preset's per-role narrowing map; a role with no entry is exactly the base rules. */
@@ -162,10 +163,10 @@ function setSubmissionClass(
162
163
  <template>
163
164
  <div data-testid="merge-role-policy" class="space-y-2">
164
165
  <div>
165
- <span class="block text-[10px] uppercase tracking-wide text-dimmed">
166
+ <SectionLabel as="span" class="block">
166
167
  {{ t('settings.riskPolicy.roleRules.heading') }}
167
- </span>
168
- <p class="mt-0.5 text-[11px] leading-snug text-dimmed">
168
+ </SectionLabel>
169
+ <p class="mt-0.5 text-2xs leading-snug text-dimmed">
169
170
  {{ t('settings.riskPolicy.roleRules.help') }}
170
171
  </p>
171
172
  <!-- Auto-merge off already sends every pull request to a human, so the per-class narrowing
@@ -173,7 +174,7 @@ function setSubmissionClass(
173
174
  MANUAL merge as well, which is the one thing the master switch leaves open. -->
174
175
  <p
175
176
  v-if="!autoMergeEnabled"
176
- class="mt-1 text-[11px] leading-snug text-app-warning-400/90"
177
+ class="mt-1 text-2xs leading-snug text-app-warning-400/90"
177
178
  data-testid="merge-role-auto-merge-off"
178
179
  >
179
180
  {{ t('settings.riskPolicy.roleRules.autoMergeOffWarning') }}
@@ -218,7 +219,7 @@ function setSubmissionClass(
218
219
  only, and a role can land nothing at all while showing "No class limits". -->
219
220
  <span
220
221
  v-if="group.submissionScoped"
221
- class="text-[11px] text-app-warning-400/90"
222
+ class="text-2xs text-app-warning-400/90"
222
223
  :data-testid="`merge-role-submission-badge-${group.role}`"
223
224
  >
224
225
  {{ t('settings.riskPolicy.roleRules.submissionBadge') }}
@@ -230,7 +231,7 @@ function setSubmissionClass(
230
231
  row says which of the three is actually governing. -->
231
232
  <p
232
233
  v-if="group.sandboxed"
233
- class="mt-1 text-[11px] leading-snug text-app-warning-400/90"
234
+ class="mt-1 text-2xs leading-snug text-app-warning-400/90"
234
235
  :data-testid="`merge-role-sandbox-note-${group.role}`"
235
236
  >
236
237
  {{ t('settings.riskPolicy.roleRules.sandboxNote') }}
@@ -249,7 +250,7 @@ function setSubmissionClass(
249
250
  :data-testid="`merge-role-submission-${group.role}`"
250
251
  @update:model-value="setSubmissionScoped(group.role, $event)"
251
252
  />
252
- <p class="text-[11px] leading-snug text-dimmed">
253
+ <p class="text-2xs leading-snug text-dimmed">
253
254
  {{ t('settings.riskPolicy.roleRules.submissionHelp') }}
254
255
  </p>
255
256
  <div v-if="group.submissionScoped" class="flex flex-wrap gap-x-4 gap-y-1">
@@ -268,7 +269,7 @@ function setSubmissionClass(
268
269
  does rather than reading as a switch somebody forgot to fill in. -->
269
270
  <p
270
271
  v-if="group.submissionScoped && !group.submissionRows.some((r) => r.allowed)"
271
- class="text-[11px] leading-snug text-app-warning-400/90"
272
+ class="text-2xs leading-snug text-app-warning-400/90"
272
273
  :data-testid="`merge-role-submission-none-${group.role}`"
273
274
  >
274
275
  {{ t('settings.riskPolicy.roleRules.submissionNone') }}
@@ -276,10 +277,10 @@ function setSubmissionClass(
276
277
  </div>
277
278
 
278
279
  <div class="space-y-1.5 border-t border-default/70 pt-2">
279
- <p class="text-[11px] leading-snug text-dimmed">
280
+ <p class="text-2xs leading-snug text-dimmed">
280
281
  {{ t('settings.riskPolicy.roleRules.classHeading') }}
281
282
  </p>
282
- <p v-if="!anyBaseRule" class="text-[11px] leading-snug text-dimmed">
283
+ <p v-if="!anyBaseRule" class="text-2xs leading-snug text-dimmed">
283
284
  {{ t('settings.riskPolicy.roleRules.baseHint') }}
284
285
  </p>
285
286
  <div
@@ -302,12 +303,12 @@ function setSubmissionClass(
302
303
  "
303
304
  />
304
305
  <!-- Nothing left to narrow: the base rule already routes this class to a human. -->
305
- <span v-if="row.items.length === 1" class="text-[11px] text-dimmed">
306
+ <span v-if="row.items.length === 1" class="text-2xs text-dimmed">
306
307
  {{ t('settings.riskPolicy.roleRules.alreadyStrictest') }}
307
308
  </span>
308
309
  <span
309
310
  v-else-if="row.redundant"
310
- class="text-[11px] text-app-warning-400/90"
311
+ class="text-2xs text-app-warning-400/90"
311
312
  :data-testid="`merge-role-redundant-${group.role}-${row.changeClass}`"
312
313
  >
313
314
  {{ t('settings.riskPolicy.roleRules.redundant') }}
@@ -22,6 +22,8 @@ import { cachingLabel, contextLabel, costLabel, displayFlavor, isSelectable } fr
22
22
  import ConsensusGroupsSection from '~/components/settings/ConsensusGroupsSection.vue'
23
23
  import ProviderPreferenceEditor from '~/components/settings/ProviderPreferenceEditor.vue'
24
24
  import { showOverrideField } from '~/utils/uiMode'
25
+ import SectionLabel from '~/components/common/SectionLabel.vue'
26
+ import IconButton from '~/components/common/IconButton.vue'
25
27
 
26
28
  const { t } = useI18n()
27
29
  const ui = useUiStore()
@@ -330,13 +332,13 @@ async function save() {
330
332
  >
331
333
  {{ t('settings.modelConfiguration.back') }}
332
334
  </UButton>
333
- <UButton
335
+ <IconButton
334
336
  icon="i-lucide-x"
335
337
  color="neutral"
336
338
  variant="ghost"
337
339
  size="sm"
338
340
  :class="editor ? '' : 'ms-auto'"
339
- :title="t('settings.modelConfiguration.closeEsc')"
341
+ :label="t('settings.modelConfiguration.closeEsc')"
340
342
  @click="
341
343
  () => {
342
344
  open = false
@@ -390,32 +392,32 @@ async function save() {
390
392
  {{ t('settings.modelConfiguration.list.default') }}
391
393
  </UBadge>
392
394
  <div class="ms-auto flex items-center gap-1">
393
- <UButton
395
+ <IconButton
394
396
  v-if="!p.isDefault"
395
397
  size="xs"
396
398
  variant="ghost"
397
399
  color="neutral"
398
400
  icon="i-lucide-star"
399
401
  :loading="busy"
400
- :title="t('settings.modelConfiguration.list.setDefaultTitle')"
402
+ :label="t('settings.modelConfiguration.list.setDefaultTitle')"
401
403
  @click="setDefault(p)"
402
404
  />
403
- <UButton
405
+ <IconButton
404
406
  size="xs"
405
407
  variant="ghost"
406
408
  color="neutral"
407
409
  icon="i-lucide-pencil"
408
- :title="t('settings.modelConfiguration.list.editTitle')"
410
+ :label="t('settings.modelConfiguration.list.editTitle')"
409
411
  @click="startEdit(p)"
410
412
  />
411
- <UButton
413
+ <IconButton
412
414
  size="xs"
413
415
  variant="ghost"
414
416
  color="error"
415
417
  icon="i-lucide-trash-2"
416
418
  :disabled="p.isDefault"
417
419
  :loading="busy"
418
- :title="
420
+ :label="
419
421
  p.isDefault
420
422
  ? t('settings.modelConfiguration.list.deleteDisabledTitle')
421
423
  : t('settings.modelConfiguration.list.deleteTitle')
@@ -424,7 +426,7 @@ async function save() {
424
426
  />
425
427
  </div>
426
428
  </div>
427
- <div class="mt-1.5 text-[11px] text-muted">
429
+ <div class="mt-1.5 text-2xs text-muted">
428
430
  {{ t('settings.modelConfiguration.list.basePrefix') }}
429
431
  <span class="text-toned">{{ modelLabel(p.baseModelId) }}</span>
430
432
  <span v-if="Object.keys(p.overrides).length">
@@ -460,11 +462,9 @@ async function save() {
460
462
  <template v-else>
461
463
  <div class="space-y-4 rounded-xl border border-default bg-default/50 p-4">
462
464
  <div>
463
- <label
464
- class="mb-1 block text-[11px] font-semibold uppercase tracking-wide text-muted"
465
- >
465
+ <SectionLabel as="label" class="mb-1 block">
466
466
  {{ t('settings.modelConfiguration.editor.nameLabel') }}
467
- </label>
467
+ </SectionLabel>
468
468
  <UInput
469
469
  v-model="editor.name"
470
470
  :placeholder="t('settings.modelConfiguration.editor.namePlaceholder')"
@@ -474,11 +474,9 @@ async function save() {
474
474
  </div>
475
475
 
476
476
  <div>
477
- <label
478
- class="mb-1 block text-[11px] font-semibold uppercase tracking-wide text-muted"
479
- >
477
+ <SectionLabel as="label" class="mb-1 block">
480
478
  {{ t('settings.modelConfiguration.editor.baseModelLabel') }}
481
- </label>
479
+ </SectionLabel>
482
480
  <UDropdownMenu
483
481
  :items="baseMenu"
484
482
  :ui="{ content: 'max-h-80 overflow-y-auto z-[60]' }"
@@ -514,9 +512,9 @@ async function save() {
514
512
 
515
513
  <div>
516
514
  <div class="mb-1 flex items-start justify-between gap-3">
517
- <span class="text-[11px] font-semibold uppercase tracking-wide text-muted">
515
+ <SectionLabel as="span">
518
516
  {{ t('settings.modelConfiguration.editor.perAgentOverrides') }}
519
- </span>
517
+ </SectionLabel>
520
518
  <AgentTierSelect class="w-56 shrink-0" :hidden-count="hiddenByTier" />
521
519
  </div>
522
520
  <UInput
@@ -73,7 +73,7 @@ const reseedableCount = computed(
73
73
  {{ t('modelPreset.health.newHeading') }}
74
74
  </h3>
75
75
  </div>
76
- <p class="text-[11px] text-dimmed">{{ t('modelPreset.health.newDescription') }}</p>
76
+ <p class="text-2xs text-dimmed">{{ t('modelPreset.health.newDescription') }}</p>
77
77
  <ul class="space-y-2">
78
78
  <li
79
79
  v-for="i in newPresets"
@@ -108,7 +108,7 @@ const reseedableCount = computed(
108
108
  {{ t('modelPreset.health.updatesHeading') }}
109
109
  </h3>
110
110
  </div>
111
- <p class="text-[11px] text-dimmed">
111
+ <p class="text-2xs text-dimmed">
112
112
  {{ t('modelPreset.health.updatesDescription') }}
113
113
  </p>
114
114
  <ul class="space-y-2">
@@ -119,7 +119,7 @@ const reseedableCount = computed(
119
119
  >
120
120
  <div class="min-w-0">
121
121
  <span class="truncate text-sm font-medium text-app-100">{{ i.name }}</span>
122
- <p class="text-[11px] text-app-warning-400/80">
122
+ <p class="text-2xs text-app-warning-400/80">
123
123
  {{
124
124
  t('modelPreset.health.versionAvailable', {
125
125
  from: i.fromVersion ?? 0,
@@ -236,7 +236,7 @@ const connectedLabel = computed(() => {
236
236
  }}
237
237
  </UBadge>
238
238
  </div>
239
- <p class="text-[11px] text-muted">
239
+ <p class="text-2xs text-muted">
240
240
  {{ t('settings.observabilityConnection.incident.description') }}
241
241
  </p>
242
242