@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
@@ -11,6 +11,7 @@ import { computed, ref, watch } from 'vue'
11
11
  import type { OpenRouterModelMeta } from '~/types/openrouter'
12
12
  import IntegrationBackTitle from '~/components/layout/IntegrationBackTitle.vue'
13
13
  import SecretInput from '~/components/common/SecretInput.vue'
14
+ import SectionLabel from '~/components/common/SectionLabel.vue'
14
15
 
15
16
  const { t } = useI18n()
16
17
  const ui = useUiStore()
@@ -239,19 +240,20 @@ function manageKeys() {
239
240
  v-if="!keyConnected"
240
241
  class="space-y-3 rounded-lg border border-muted bg-default/60 p-4"
241
242
  >
242
- <h4 class="text-xs font-semibold uppercase tracking-wide text-dimmed">
243
+ <SectionLabel as="h4">
243
244
  {{ t('settings.openRouterCatalog.connectHeading') }}
244
- </h4>
245
+ </SectionLabel>
245
246
  <ol class="list-decimal space-y-1 ps-5 text-sm text-toned">
246
247
  <li>
247
248
  <i18n-t keypath="settings.openRouterCatalog.step1" tag="span" scope="global">
248
249
  <template #link>
249
- <a
250
- href="https://openrouter.ai/keys"
250
+ <ULink
251
+ raw
252
+ to="https://openrouter.ai/keys"
251
253
  target="_blank"
252
254
  rel="noopener noreferrer"
253
255
  class="text-primary underline"
254
- >{{ t('settings.openRouterCatalog.step1Link') }}</a
256
+ >{{ t('settings.openRouterCatalog.step1Link') }}</ULink
255
257
  >
256
258
  </template>
257
259
  </i18n-t>
@@ -363,7 +365,7 @@ function manageKeys() {
363
365
  />
364
366
  <span class="min-w-0 flex-1">
365
367
  <span class="block truncate text-default">{{ m.name }}</span>
366
- <span class="block truncate font-mono text-[11px] text-dimmed">{{ m.id }}</span>
368
+ <span class="block truncate font-mono text-2xs text-dimmed">{{ m.id }}</span>
367
369
  <!--
368
370
  A withdrawal date is the one fact about a model that fails SILENTLY: past it the
369
371
  route simply stops answering and the run falls through to whatever the picker
@@ -371,11 +373,11 @@ function manageKeys() {
371
373
  -->
372
374
  <span
373
375
  v-if="m.expirationDate"
374
- class="block truncate text-[11px] text-app-warning-400"
376
+ class="block truncate text-2xs text-app-warning-400"
375
377
  >{{ t('settings.openRouterCatalog.retiresOn', { date: m.expirationDate }) }}</span
376
378
  >
377
379
  </span>
378
- <span class="shrink-0 text-end text-[11px] text-dimmed">
380
+ <span class="shrink-0 text-end text-2xs text-dimmed">
379
381
  <span v-if="m.contextLength" class="block">{{
380
382
  contextLabel(m.contextLength)
381
383
  }}</span>
@@ -115,7 +115,7 @@ async function removeEntry(entryId: string) {
115
115
  <div class="min-w-0 space-y-1">
116
116
  <div class="flex items-center gap-2">
117
117
  <span class="text-sm font-medium">{{ vendorLabel(entry.vendor) }}</span>
118
- <span class="text-[11px] text-dimmed">
118
+ <span class="text-2xs text-dimmed">
119
119
  {{ t('settings.packageRegistries.list.tokenTail', { tail: entry.tokenTail }) }}
120
120
  </span>
121
121
  </div>
@@ -132,7 +132,7 @@ async function removeEntry(entryId: string) {
132
132
  <!-- An entry with no scopes authenticates its host without routing any scope to
133
133
  it (the deliberate mixed public/private setup) — say so, or the row reads as
134
134
  half-configured. -->
135
- <span v-if="!entry.scopes.length" class="text-[11px] text-dimmed">
135
+ <span v-if="!entry.scopes.length" class="text-2xs text-dimmed">
136
136
  {{ t('settings.packageRegistries.list.noScopes') }}
137
137
  </span>
138
138
  </div>
@@ -164,7 +164,7 @@ async function removeEntry(entryId: string) {
164
164
  data-testid="package-registry-vendor"
165
165
  />
166
166
  </UFormField>
167
- <p class="text-[11px] text-dimmed">
167
+ <p class="text-2xs text-dimmed">
168
168
  {{ t('settings.packageRegistries.add.host', { host: vendorHost }) }}
169
169
  </p>
170
170
 
@@ -197,7 +197,7 @@ async function removeEntry(entryId: string) {
197
197
  </div>
198
198
  <!-- Why leaving this empty is often the RIGHT answer — a scope mapping is all-or-nothing,
199
199
  so an org publishing some of its `@org` packages publicly breaks under one. -->
200
- <p class="text-[11px] text-dimmed">
200
+ <p class="text-2xs text-dimmed">
201
201
  {{ t('settings.packageRegistries.add.scopesNote') }}
202
202
  </p>
203
203
 
@@ -19,6 +19,7 @@ import ConnectionTestVerdict from '~/components/settings/ConnectionTestVerdict.v
19
19
  import ProvisioningLogsDrawer from '~/components/provisioning/ProvisioningLogsDrawer.vue'
20
20
  import ProviderManifestEditor from '~/components/settings/ProviderManifestEditor.vue'
21
21
  import KubernetesEnvironmentForm from '~/components/settings/KubernetesEnvironmentForm.vue'
22
+ import SectionLabel from '~/components/common/SectionLabel.vue'
22
23
 
23
24
  const props = defineProps<{
24
25
  kind: ProviderConnectionKind
@@ -383,7 +384,7 @@ function fieldHelp(key: string): string | undefined {
383
384
  >
384
385
  <div>
385
386
  <span class="font-medium text-default">{{ connection.label }}</span>
386
- <div class="text-[11px] text-app-success-400">
387
+ <div class="text-2xs text-app-success-400">
387
388
  {{ t('settings.providerConnection.connectedAt', { baseUrl: connection.baseUrl }) }}
388
389
  </div>
389
390
  </div>
@@ -426,14 +427,14 @@ function fieldHelp(key: string): string | undefined {
426
427
 
427
428
  <!-- NATIVE provider: the friendly, descriptor-driven flat field form. -->
428
429
  <div v-else-if="isNative" class="rounded-lg border border-dashed border-muted p-3 space-y-3">
429
- <p class="text-[11px] font-semibold uppercase tracking-wide text-muted">
430
+ <SectionLabel as="p">
430
431
  {{
431
432
  connection
432
433
  ? t('settings.providerConnection.form.updateConfiguration')
433
434
  : t('settings.providerConnection.form.connect')
434
435
  }}
435
- </p>
436
- <p v-if="connection && hasSecretFields" class="text-[11px] text-app-warning-300/80">
436
+ </SectionLabel>
437
+ <p v-if="connection && hasSecretFields" class="text-2xs text-app-warning-300/80">
437
438
  {{
438
439
  t(
439
440
  'settings.providerConnection.form.reenterSecrets',
@@ -22,6 +22,7 @@ import type { ProviderConnectionKind } from '~/types/providerConnections'
22
22
  import ConnectionWarnings from '~/components/settings/ConnectionWarnings.vue'
23
23
  import ConnectionTestVerdict from '~/components/settings/ConnectionTestVerdict.vue'
24
24
  import SecretInput from '~/components/common/SecretInput.vue'
25
+ import SectionLabel from '~/components/common/SectionLabel.vue'
25
26
 
26
27
  const props = defineProps<{
27
28
  kind: ProviderConnectionKind
@@ -197,9 +198,9 @@ function onSave() {
197
198
 
198
199
  <template>
199
200
  <div class="space-y-3 rounded-lg border border-dashed border-muted p-3">
200
- <p class="text-[11px] font-semibold uppercase tracking-wide text-muted">
201
+ <SectionLabel as="p">
201
202
  {{ t('settings.providerConnection.manifestEditor.title') }}
202
- </p>
203
+ </SectionLabel>
203
204
 
204
205
  <UFormField
205
206
  :label="t('settings.providerConnection.manifestEditor.jsonLabel')"
@@ -214,7 +215,7 @@ function onSave() {
214
215
  />
215
216
  </UFormField>
216
217
 
217
- <p v-if="!savedManifest && !jsonError && !schemaError" class="text-[11px] text-dimmed">
218
+ <p v-if="!savedManifest && !jsonError && !schemaError" class="text-2xs text-dimmed">
218
219
  {{ t('settings.providerConnection.manifestEditor.starterHint') }}
219
220
  </p>
220
221
 
@@ -236,16 +237,16 @@ function onSave() {
236
237
 
237
238
  <!-- Secret sub-form: one write-only input per secret key the manifest references. -->
238
239
  <div class="space-y-2">
239
- <p class="text-[11px] font-semibold uppercase tracking-wide text-muted">
240
+ <SectionLabel as="p">
240
241
  {{ t('settings.providerConnection.manifestEditor.secretsLabel') }}
241
- </p>
242
- <p v-if="!secretKeys.length" class="text-[11px] text-dimmed">
242
+ </SectionLabel>
243
+ <p v-if="!secretKeys.length" class="text-2xs text-dimmed">
243
244
  {{ t('settings.providerConnection.manifestEditor.noSecrets') }}
244
245
  </p>
245
246
  <template v-else-if="connected">
246
247
  <p
247
248
  v-if="storedSecretKeys && storedSecretKeys.length"
248
- class="text-[11px] text-muted"
249
+ class="text-2xs text-muted"
249
250
  data-testid="manifest-editor-stored"
250
251
  >
251
252
  {{
@@ -254,7 +255,7 @@ function onSave() {
254
255
  })
255
256
  }}
256
257
  </p>
257
- <p class="text-[11px] text-app-warning-300/80">
258
+ <p class="text-2xs text-app-warning-300/80">
258
259
  {{ t('settings.providerConnection.manifestEditor.reenterSecrets') }}
259
260
  </p>
260
261
  </template>
@@ -26,6 +26,8 @@ import {
26
26
  moveFlavor,
27
27
  subscriptionOverridesOrder,
28
28
  } from '~/components/settings/ProviderPreferenceEditor.logic'
29
+ import SectionLabel from '~/components/common/SectionLabel.vue'
30
+ import IconButton from '~/components/common/IconButton.vue'
29
31
 
30
32
  const props = defineProps<{
31
33
  /** The preset's stored order; empty/absent ⇒ the deployment's default order. */
@@ -90,9 +92,9 @@ function reset() {
90
92
  <template>
91
93
  <div>
92
94
  <div class="mb-1 flex items-start justify-between gap-3">
93
- <span class="text-[11px] font-semibold uppercase tracking-wide text-muted">
95
+ <SectionLabel as="span">
94
96
  {{ t('settings.modelConfiguration.routeOrder.label') }}
95
- </span>
97
+ </SectionLabel>
96
98
  <UButton
97
99
  v-if="isCustom"
98
100
  size="xs"
@@ -105,7 +107,7 @@ function reset() {
105
107
  {{ t('settings.modelConfiguration.routeOrder.reset') }}
106
108
  </UButton>
107
109
  </div>
108
- <p class="mb-2 text-[11px] leading-relaxed text-dimmed">
110
+ <p class="mb-2 text-2xs leading-relaxed text-dimmed">
109
111
  {{
110
112
  isCustom
111
113
  ? t('settings.modelConfiguration.routeOrder.customHint')
@@ -118,7 +120,7 @@ function reset() {
118
120
  route a connected plan quietly overrules is the one thing this control must not do. -->
119
121
  <p
120
122
  v-if="subscriptionWins"
121
- class="mb-2 text-[11px] leading-relaxed text-app-warning-400/90"
123
+ class="mb-2 text-2xs leading-relaxed text-app-warning-400/90"
122
124
  data-testid="preset-route-order-subscription-warning"
123
125
  >
124
126
  {{ t('settings.modelConfiguration.routeOrder.subscriptionOverrideHint') }}
@@ -128,7 +130,7 @@ function reset() {
128
130
  answering a different question than this order asks. -->
129
131
  <p
130
132
  v-if="badgesShowAnotherOrder"
131
- class="mb-2 text-[11px] leading-relaxed text-dimmed"
133
+ class="mb-2 text-2xs leading-relaxed text-dimmed"
132
134
  data-testid="preset-route-order-badge-hint"
133
135
  >
134
136
  {{ t('settings.modelConfiguration.routeOrder.badgesUseDefaultPresetHint') }}
@@ -144,33 +146,31 @@ function reset() {
144
146
  :data-testid="`preset-route-${flavor}`"
145
147
  >
146
148
  <span
147
- class="flex h-5 w-5 shrink-0 items-center justify-center rounded bg-elevated text-[10px] font-semibold text-muted"
149
+ class="flex h-5 w-5 shrink-0 items-center justify-center rounded-sm bg-elevated text-3xs font-semibold text-muted"
148
150
  >
149
151
  {{ index + 1 }}
150
152
  </span>
151
153
  <div class="min-w-0 flex-1">
152
154
  <p class="truncate text-sm text-default">{{ t(ROUTE_LABELS[flavor]) }}</p>
153
- <p class="truncate text-[11px] text-dimmed">{{ t(ROUTE_HINTS[flavor]) }}</p>
155
+ <p class="truncate text-2xs text-dimmed">{{ t(ROUTE_HINTS[flavor]) }}</p>
154
156
  </div>
155
157
  <div class="flex shrink-0 items-center gap-1">
156
- <UButton
158
+ <IconButton
157
159
  size="xs"
158
160
  variant="ghost"
159
161
  color="neutral"
160
162
  icon="i-lucide-chevron-up"
161
163
  :disabled="index === 0"
162
- :title="t('settings.modelConfiguration.routeOrder.moveUp')"
163
- :aria-label="t('settings.modelConfiguration.routeOrder.moveUp')"
164
+ :label="t('settings.modelConfiguration.routeOrder.moveUp')"
164
165
  @click="move(index, -1)"
165
166
  />
166
- <UButton
167
+ <IconButton
167
168
  size="xs"
168
169
  variant="ghost"
169
170
  color="neutral"
170
171
  icon="i-lucide-chevron-down"
171
172
  :disabled="index === order.length - 1"
172
- :title="t('settings.modelConfiguration.routeOrder.moveDown')"
173
- :aria-label="t('settings.modelConfiguration.routeOrder.moveDown')"
173
+ :label="t('settings.modelConfiguration.routeOrder.moveDown')"
174
174
  @click="move(index, 1)"
175
175
  />
176
176
  </div>
@@ -10,6 +10,7 @@ import {
10
10
  blankRiskPolicyDraft,
11
11
  forkGatingFromDraft,
12
12
  } from '~/utils/riskPolicyDraft'
13
+ import SectionLabel from '~/components/common/SectionLabel.vue'
13
14
 
14
15
  const props = defineProps<{ busy: boolean }>()
15
16
 
@@ -56,14 +57,14 @@ function submit() {
56
57
 
57
58
  <template>
58
59
  <div class="rounded-lg border border-dashed border-muted p-3">
59
- <p class="mb-2 text-[11px] font-semibold uppercase tracking-wide text-muted">
60
+ <SectionLabel as="p" class="mb-2">
60
61
  {{ t('settings.riskPolicy.newPreset') }}
61
- </p>
62
+ </SectionLabel>
62
63
  <div class="flex flex-wrap items-end gap-3">
63
64
  <label class="block min-w-40 flex-1">
64
- <span class="mb-1 block text-[10px] uppercase tracking-wide text-dimmed">
65
+ <SectionLabel as="span" class="mb-1 block">
65
66
  {{ t('settings.riskPolicy.create.name') }}
66
- </span>
67
+ </SectionLabel>
67
68
  <UInput
68
69
  v-model="draft.name"
69
70
  size="sm"
@@ -71,11 +72,12 @@ function submit() {
71
72
  data-testid="risk-policy-create-name"
72
73
  />
73
74
  </label>
74
- <label class="block w-20">
75
- <span class="mb-1 block text-[10px] uppercase tracking-wide text-dimmed">
75
+ <label class="block">
76
+ <SectionLabel as="span" class="mb-1 block">
76
77
  {{ t('settings.riskPolicy.create.complexity') }}
77
- </span>
78
+ </SectionLabel>
78
79
  <UInput
80
+ class="w-20"
79
81
  v-model.number="draft.maxComplexity"
80
82
  type="number"
81
83
  :min="0"
@@ -84,11 +86,12 @@ function submit() {
84
86
  data-testid="risk-policy-create-complexity"
85
87
  />
86
88
  </label>
87
- <label class="block w-20">
88
- <span class="mb-1 block text-[10px] uppercase tracking-wide text-dimmed">
89
+ <label class="block">
90
+ <SectionLabel as="span" class="mb-1 block">
89
91
  {{ t('settings.riskPolicy.create.risk') }}
90
- </span>
92
+ </SectionLabel>
91
93
  <UInput
94
+ class="w-20"
92
95
  v-model.number="draft.maxRisk"
93
96
  type="number"
94
97
  :min="0"
@@ -97,11 +100,12 @@ function submit() {
97
100
  data-testid="risk-policy-create-risk"
98
101
  />
99
102
  </label>
100
- <label class="block w-20">
101
- <span class="mb-1 block text-[10px] uppercase tracking-wide text-dimmed">
103
+ <label class="block">
104
+ <SectionLabel as="span" class="mb-1 block">
102
105
  {{ t('settings.riskPolicy.create.impact') }}
103
- </span>
106
+ </SectionLabel>
104
107
  <UInput
108
+ class="w-20"
105
109
  v-model.number="draft.maxImpact"
106
110
  type="number"
107
111
  :min="0"
@@ -110,17 +114,25 @@ function submit() {
110
114
  data-testid="risk-policy-create-impact"
111
115
  />
112
116
  </label>
113
- <label class="block w-20">
114
- <span class="mb-1 block text-[10px] uppercase tracking-wide text-dimmed">
117
+ <label class="block">
118
+ <SectionLabel as="span" class="mb-1 block">
115
119
  {{ t('settings.riskPolicy.create.ciFix') }}
116
- </span>
117
- <UInput v-model.number="draft.ciMaxAttempts" type="number" :min="0" :max="50" size="sm" />
120
+ </SectionLabel>
121
+ <UInput
122
+ class="w-20"
123
+ v-model.number="draft.ciMaxAttempts"
124
+ type="number"
125
+ :min="0"
126
+ :max="50"
127
+ size="sm"
128
+ />
118
129
  </label>
119
- <label class="block w-20">
120
- <span class="mb-1 block text-[10px] uppercase tracking-wide text-dimmed">
130
+ <label class="block">
131
+ <SectionLabel as="span" class="mb-1 block">
121
132
  {{ t('settings.riskPolicy.create.reqIter') }}
122
- </span>
133
+ </SectionLabel>
123
134
  <UInput
135
+ class="w-20"
124
136
  v-model.number="draft.maxRequirementIterations"
125
137
  type="number"
126
138
  :min="1"
@@ -128,11 +140,12 @@ function submit() {
128
140
  size="sm"
129
141
  />
130
142
  </label>
131
- <label class="block w-20">
132
- <span class="mb-1 block text-[10px] uppercase tracking-wide text-dimmed">
143
+ <label class="block">
144
+ <SectionLabel as="span" class="mb-1 block">
133
145
  {{ t('settings.riskPolicy.create.companionRework') }}
134
- </span>
146
+ </SectionLabel>
135
147
  <UInput
148
+ class="w-20"
136
149
  v-model.number="draft.companionMaxReworks"
137
150
  type="number"
138
151
  :min="0"
@@ -140,11 +153,12 @@ function submit() {
140
153
  size="sm"
141
154
  />
142
155
  </label>
143
- <label class="block w-32">
144
- <span class="mb-1 block text-[10px] uppercase tracking-wide text-dimmed">
156
+ <label class="block">
157
+ <SectionLabel as="span" class="mb-1 block">
145
158
  {{ t('settings.riskPolicy.create.autoPass') }}
146
- </span>
159
+ </SectionLabel>
147
160
  <USelect
161
+ class="w-32"
148
162
  v-model="draft.maxRequirementConcernAllowed"
149
163
  :items="concernOptions"
150
164
  value-key="value"
@@ -23,6 +23,8 @@ import {
23
23
  import { RISK_POLICY_AXES, RISK_POLICY_CEILING_FIELD } from '~/utils/riskPolicy'
24
24
  import MergeClassRulesEditor from '~/components/settings/MergeClassRulesEditor.vue'
25
25
  import MergeRolePolicyEditor from '~/components/settings/MergeRolePolicyEditor.vue'
26
+ import SectionLabel from '~/components/common/SectionLabel.vue'
27
+ import IconButton from '~/components/common/IconButton.vue'
26
28
 
27
29
  const props = defineProps<{
28
30
  policy: RiskPolicyLibraryEntry
@@ -143,22 +145,22 @@ const deleteBlocked = computed(
143
145
  {{ t('settings.riskPolicy.makeDefault') }}
144
146
  </UButton>
145
147
  </template>
146
- <UButton
148
+ <IconButton
147
149
  color="error"
148
150
  variant="ghost"
149
151
  size="xs"
150
152
  icon="i-lucide-trash-2"
151
153
  :disabled="deleteBlocked || busy?.startsWith(policy.id)"
152
- :title="deleteBlockedReason"
154
+ :label="deleteBlockedReason"
153
155
  @click="emit('remove')"
154
156
  />
155
157
  </div>
156
158
 
157
159
  <div class="grid grid-cols-1 gap-3 sm:grid-cols-4">
158
160
  <label v-for="axis in RISK_POLICY_AXES" :key="axis" class="block">
159
- <span class="mb-1 block text-[10px] uppercase tracking-wide text-dimmed">
161
+ <SectionLabel as="span" class="mb-1 block">
160
162
  {{ t(CEILING_LABEL_KEYS[axis]) }}
161
- </span>
163
+ </SectionLabel>
162
164
  <UInput
163
165
  v-model.number="draft[RISK_POLICY_CEILING_FIELD[axis]]"
164
166
  type="number"
@@ -168,15 +170,15 @@ const deleteBlocked = computed(
168
170
  />
169
171
  </label>
170
172
  <label class="block">
171
- <span class="mb-1 block text-[10px] uppercase tracking-wide text-dimmed">
173
+ <SectionLabel as="span" class="mb-1 block">
172
174
  {{ t('settings.riskPolicy.field.ciMaxAttempts') }}
173
- </span>
175
+ </SectionLabel>
174
176
  <UInput v-model.number="draft.ciMaxAttempts" type="number" :min="0" :max="50" size="sm" />
175
177
  </label>
176
178
  <label class="block">
177
- <span class="mb-1 block text-[10px] uppercase tracking-wide text-dimmed">
179
+ <SectionLabel as="span" class="mb-1 block">
178
180
  {{ t('settings.riskPolicy.field.maxRequirementIterations') }}
179
- </span>
181
+ </SectionLabel>
180
182
  <UInput
181
183
  v-model.number="draft.maxRequirementIterations"
182
184
  type="number"
@@ -186,9 +188,9 @@ const deleteBlocked = computed(
186
188
  />
187
189
  </label>
188
190
  <label class="block">
189
- <span class="mb-1 block text-[10px] uppercase tracking-wide text-dimmed">
191
+ <SectionLabel as="span" class="mb-1 block">
190
192
  {{ t('settings.riskPolicy.field.companionMaxReworks') }}
191
- </span>
193
+ </SectionLabel>
192
194
  <UInput
193
195
  v-model.number="draft.companionMaxReworks"
194
196
  type="number"
@@ -198,9 +200,9 @@ const deleteBlocked = computed(
198
200
  />
199
201
  </label>
200
202
  <label class="block">
201
- <span class="mb-1 block text-[10px] uppercase tracking-wide text-dimmed">
203
+ <SectionLabel as="span" class="mb-1 block">
202
204
  {{ t('settings.riskPolicy.field.maxRequirementConcernAllowed') }}
203
- </span>
205
+ </SectionLabel>
204
206
  <USelect
205
207
  v-model="draft.maxRequirementConcernAllowed"
206
208
  :items="concernOptions"
@@ -245,9 +247,9 @@ const deleteBlocked = computed(
245
247
  />
246
248
  <div v-if="draft.forkEnabled" class="mt-3 grid grid-cols-1 gap-3 sm:grid-cols-4">
247
249
  <label v-for="axis in RISK_POLICY_AXES" :key="axis" class="block">
248
- <span class="mb-1 block text-[10px] uppercase tracking-wide text-dimmed">
250
+ <SectionLabel as="span" class="mb-1 block">
249
251
  {{ t(FORK_FLOOR_LABEL_KEYS[axis]) }}
250
- </span>
252
+ </SectionLabel>
251
253
  <UInput
252
254
  v-model.number="draft[FORK_FLOOR_FIELD[axis]]"
253
255
  type="number"
@@ -257,9 +259,9 @@ const deleteBlocked = computed(
257
259
  />
258
260
  </label>
259
261
  <label class="block">
260
- <span class="mb-1 block text-[10px] uppercase tracking-wide text-dimmed">
262
+ <SectionLabel as="span" class="mb-1 block">
261
263
  {{ t('settings.riskPolicy.forkDecision.onMissingLabel') }}
262
- </span>
264
+ </SectionLabel>
263
265
  <USelect v-model="draft.forkOnMissing" :items="onMissingOptions" size="sm" />
264
266
  </label>
265
267
  </div>
@@ -283,9 +285,9 @@ const deleteBlocked = computed(
283
285
  on an attended policy would be a control over a decision this policy never makes. It is
284
286
  not hidden as an "advanced override" — it is inert, which is a different thing. -->
285
287
  <label v-if="draft.unattended" class="mt-3 block">
286
- <span class="mb-1 block text-[10px] uppercase tracking-wide text-dimmed">
288
+ <SectionLabel as="span" class="mb-1 block">
287
289
  {{ t('settings.riskPolicy.autoAnswer.label') }}
288
- </span>
290
+ </SectionLabel>
289
291
  <UInput
290
292
  v-model.number="draft.minAutoAnswerConfidence"
291
293
  type="number"
@@ -294,7 +296,7 @@ const deleteBlocked = computed(
294
296
  size="sm"
295
297
  data-testid="risk-policy-auto-answer-floor"
296
298
  />
297
- <span class="mt-1 block text-[11px] text-dimmed">
299
+ <span class="mt-1 block text-2xs text-dimmed">
298
300
  {{ t('settings.riskPolicy.autoAnswer.hint') }}
299
301
  </span>
300
302
  </label>
@@ -64,7 +64,7 @@ const reseedableCount = computed(
64
64
  {{ t('riskPolicy.health.newHeading') }}
65
65
  </h3>
66
66
  </div>
67
- <p class="text-[11px] text-dimmed">{{ t('riskPolicy.health.newDescription') }}</p>
67
+ <p class="text-2xs text-dimmed">{{ t('riskPolicy.health.newDescription') }}</p>
68
68
  <ul class="space-y-2">
69
69
  <li
70
70
  v-for="i in newPresets"
@@ -99,7 +99,7 @@ const reseedableCount = computed(
99
99
  {{ t('riskPolicy.health.updatesHeading') }}
100
100
  </h3>
101
101
  </div>
102
- <p class="text-[11px] text-dimmed">
102
+ <p class="text-2xs text-dimmed">
103
103
  {{ t('riskPolicy.health.updatesDescription') }}
104
104
  </p>
105
105
  <ul class="space-y-2">
@@ -110,7 +110,7 @@ const reseedableCount = computed(
110
110
  >
111
111
  <div class="min-w-0">
112
112
  <span class="truncate text-sm font-medium text-app-100">{{ i.name }}</span>
113
- <p class="text-[11px] text-app-warning-400/80">
113
+ <p class="text-2xs text-app-warning-400/80">
114
114
  {{
115
115
  t('riskPolicy.health.versionAvailable', {
116
116
  from: i.fromVersion ?? 0,
@@ -13,6 +13,7 @@ import { riskPolicyCopyName } from '~/utils/riskPolicy'
13
13
  import RiskPolicyCreateForm from '~/components/settings/RiskPolicyCreateForm.vue'
14
14
  import RiskPolicyEditorRow from '~/components/settings/RiskPolicyEditorRow.vue'
15
15
  import RiskPolicyInheritedRow from '~/components/settings/RiskPolicyInheritedRow.vue'
16
+ import SectionLabel from '~/components/common/SectionLabel.vue'
16
17
 
17
18
  const { t } = useI18n()
18
19
 
@@ -179,10 +180,10 @@ function unhide(presetId: string) {
179
180
  <!-- Inherited FIRST: they are the org's posture, and a board reading its own list wants to see
180
181
  what it is working from before what it has changed. -->
181
182
  <section v-if="inherited.length > 0" class="space-y-2">
182
- <p class="text-[11px] font-semibold uppercase tracking-wide text-muted">
183
+ <SectionLabel as="p">
183
184
  {{ t('settings.riskPolicy.inherited.heading') }}
184
- </p>
185
- <p class="text-[11px] text-dimmed">{{ t('settings.riskPolicy.inherited.hint') }}</p>
185
+ </SectionLabel>
186
+ <p class="text-2xs text-dimmed">{{ t('settings.riskPolicy.inherited.hint') }}</p>
186
187
  <RiskPolicyInheritedRow
187
188
  v-for="policy in inherited"
188
189
  :key="policy.id"
@@ -194,12 +195,9 @@ function unhide(presetId: string) {
194
195
  </section>
195
196
 
196
197
  <section class="space-y-4">
197
- <p
198
- v-if="inherited.length > 0"
199
- class="text-[11px] font-semibold uppercase tracking-wide text-muted"
200
- >
198
+ <SectionLabel v-if="inherited.length > 0" as="p">
201
199
  {{ t('settings.riskPolicy.own.heading') }}
202
- </p>
200
+ </SectionLabel>
203
201
  <RiskPolicyEditorRow
204
202
  v-for="policy in own"
205
203
  :key="policy.id"
@@ -217,10 +215,10 @@ function unhide(presetId: string) {
217
215
  whether it still shadows an account policy: one whose policy the account has since withdrawn
218
216
  withholds nothing, and reading it as a live opt-out would misstate what the board is doing. -->
219
217
  <section v-if="store.suppressions.length > 0 || suppressionsFailed" class="space-y-2">
220
- <p class="text-[11px] font-semibold uppercase tracking-wide text-muted">
218
+ <SectionLabel as="p">
221
219
  {{ t('settings.riskPolicy.hidden.heading') }}
222
- </p>
223
- <p v-if="suppressionsFailed" class="text-[11px] text-app-warning-400">
220
+ </SectionLabel>
221
+ <p v-if="suppressionsFailed" class="text-2xs text-app-warning-400">
224
222
  {{ t('settings.riskPolicy.hidden.loadFailed') }}
225
223
  </p>
226
224
  <div
@@ -230,8 +228,8 @@ function unhide(presetId: string) {
230
228
  data-testid="risk-policy-hidden-row"
231
229
  :data-policy-id="entry.id"
232
230
  >
233
- <span class="flex-1 truncate text-[12px] text-toned">{{ entry.name }}</span>
234
- <span v-if="!entry.inherited" class="text-[11px] text-dimmed">
231
+ <span class="flex-1 truncate text-xs text-toned">{{ entry.name }}</span>
232
+ <span v-if="!entry.inherited" class="text-2xs text-dimmed">
235
233
  {{ t('settings.riskPolicy.hidden.withdrawn') }}
236
234
  </span>
237
235
  <UButton