@cat-factory/app 0.307.1 → 0.309.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 (255) hide show
  1. package/README.md +21 -0
  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 +3 -2
  6. package/app/components/auth/UserMenu.vue +1 -1
  7. package/app/components/binaryCandidates/BinaryCandidatesWindow.vue +15 -15
  8. package/app/components/binaryOutput/BinaryOutputReport.vue +10 -14
  9. package/app/components/binaryOutput/StoredAssetView.vue +5 -5
  10. package/app/components/board/AddTaskModal.vue +16 -14
  11. package/app/components/board/AgentFailureCard.vue +9 -9
  12. package/app/components/board/AgentFailureHistory.vue +1 -1
  13. package/app/components/board/CreateInitiativeModal.vue +2 -2
  14. package/app/components/board/FailureDetail.vue +1 -1
  15. package/app/components/board/FailureHistoryList.vue +5 -5
  16. package/app/components/board/RecurringPipelineModal.vue +12 -11
  17. package/app/components/board/ReviewFrictionDialog.vue +4 -3
  18. package/app/components/board/StepExecutionHistory.vue +8 -8
  19. package/app/components/board/nodes/AgentChip.vue +1 -1
  20. package/app/components/board/nodes/BlockNode.vue +8 -9
  21. package/app/components/board/nodes/EpicNode.vue +4 -4
  22. package/app/components/board/nodes/FrameSwimlanes.vue +4 -7
  23. package/app/components/board/nodes/InitiativeCard.vue +4 -4
  24. package/app/components/board/nodes/LaneGroup.vue +3 -5
  25. package/app/components/board/nodes/TaskCard.vue +8 -8
  26. package/app/components/board/nodes/TaskLane.vue +3 -3
  27. package/app/components/board/nodes/TaskPipelineMini.vue +13 -12
  28. package/app/components/bootstrap/AdoptionReviewModal.vue +7 -6
  29. package/app/components/bootstrap/BootstrapModal.vue +11 -10
  30. package/app/components/bootstrap/BootstrapRunSteps.vue +1 -1
  31. package/app/components/brainstorm/BrainstormWindow.vue +8 -7
  32. package/app/components/bugFishing/BugFishingWindow.vue +37 -36
  33. package/app/components/clarity/ClarityReviewWindow.vue +8 -7
  34. package/app/components/common/AsyncViewError.vue +1 -1
  35. package/app/components/common/ClarificationItem.vue +6 -6
  36. package/app/components/common/DescriptorFields.vue +1 -1
  37. package/app/components/common/EmptyState.vue +1 -1
  38. package/app/components/common/InterviewGateNotice.vue +4 -4
  39. package/app/components/common/MarkdownProse.vue +8 -2
  40. package/app/components/common/SectionLabel.vue +38 -0
  41. package/app/components/consensus/ConsensusSessionWindow.vue +10 -9
  42. package/app/components/context/ContextAttachmentFields.vue +9 -8
  43. package/app/components/docs/DocInterviewWindow.vue +10 -9
  44. package/app/components/documents/ContextDocumentPicker.vue +10 -12
  45. package/app/components/documents/DocumentImportModal.vue +3 -2
  46. package/app/components/documents/DocumentSourceConnectModal.vue +2 -2
  47. package/app/components/documents/DocumentSyncState.vue +1 -1
  48. package/app/components/documents/DocumentTemplatesModal.vue +5 -4
  49. package/app/components/documents/RepoContextDocPicker.vue +3 -6
  50. package/app/components/documents/StartFromDesignModal.vue +4 -4
  51. package/app/components/documents/TaskContextDocs.vue +1 -1
  52. package/app/components/environments/EnvSetupStepper.vue +3 -3
  53. package/app/components/environments/EnvironmentStatusPanel.vue +11 -10
  54. package/app/components/environments/steps/EnvPreflightStep.vue +8 -8
  55. package/app/components/environments/steps/EnvReviewStep.vue +23 -22
  56. package/app/components/environments/steps/EnvSaveStep.vue +5 -5
  57. package/app/components/focus/BlockFocusView.vue +11 -10
  58. package/app/components/followUp/FollowUpWindow.vue +10 -10
  59. package/app/components/forkDecision/ForkDecisionWindow.vue +23 -26
  60. package/app/components/foundational/FoundationalContractSummary.vue +2 -2
  61. package/app/components/foundational/FoundationalServiceCatalogList.vue +3 -3
  62. package/app/components/foundational/FoundationalServiceRegistry.vue +3 -3
  63. package/app/components/foundational/FoundationalSuppressions.vue +2 -2
  64. package/app/components/fragments/FragmentLibraryManager.vue +3 -3
  65. package/app/components/fragments/FragmentSelector.vue +10 -11
  66. package/app/components/gates/GateFailingCheckList.vue +3 -3
  67. package/app/components/gates/GateResultView.vue +39 -38
  68. package/app/components/github/AddServiceFromRepoModal.vue +5 -4
  69. package/app/components/github/BranchProtectionPreflight.vue +5 -5
  70. package/app/components/github/GitHubConnect.vue +5 -3
  71. package/app/components/github/GitHubPanel.vue +14 -13
  72. package/app/components/github/RepoTreeBrowser.vue +1 -1
  73. package/app/components/humanTest/HumanTestWindow.vue +18 -17
  74. package/app/components/initiative/InitiativePlanNotice.vue +3 -3
  75. package/app/components/initiative/InitiativePlanReview.vue +19 -21
  76. package/app/components/initiative/InitiativePlanningWindow.vue +5 -5
  77. package/app/components/initiative/InitiativeTrackerWindow.vue +54 -53
  78. package/app/components/judge/JudgeResultView.vue +24 -25
  79. package/app/components/kaizen/KaizenPanel.vue +4 -4
  80. package/app/components/kaizen/KaizenStepStatus.vue +7 -6
  81. package/app/components/layout/AccountAuditLog.vue +1 -1
  82. package/app/components/layout/AccountDeploymentSettings.vue +10 -10
  83. package/app/components/layout/AccountFailureKindRules.vue +13 -13
  84. package/app/components/layout/AccountFoundationalSettings.vue +1 -1
  85. package/app/components/layout/AccountFragmentSettings.vue +1 -1
  86. package/app/components/layout/AccountModelPolicySettings.vue +7 -7
  87. package/app/components/layout/AccountPlatformAlertSettings.vue +8 -8
  88. package/app/components/layout/AccountRiskPolicySettings.vue +2 -2
  89. package/app/components/layout/AccountRunCredentialSettings.vue +3 -3
  90. package/app/components/layout/AccountSkillSettings.vue +1 -1
  91. package/app/components/layout/AccountTeamSettings.vue +4 -0
  92. package/app/components/layout/AiProvidersBanner.vue +1 -1
  93. package/app/components/layout/AppearanceSwitcher.vue +1 -1
  94. package/app/components/layout/BoardSwitcher.vue +3 -2
  95. package/app/components/layout/BoardToolbar.vue +6 -2
  96. package/app/components/layout/CommandBar.vue +4 -2
  97. package/app/components/layout/DefaultTestEnvBanner.vue +2 -2
  98. package/app/components/layout/IntegrationsHub.vue +4 -3
  99. package/app/components/layout/LanguageSwitcher.vue +1 -1
  100. package/app/components/layout/ModelProvidersHub.vue +6 -4
  101. package/app/components/layout/NotificationsInbox.vue +8 -7
  102. package/app/components/layout/PersonalSetupModal.vue +5 -3
  103. package/app/components/layout/RolePrompt.vue +1 -1
  104. package/app/components/layout/SideBar.vue +3 -5
  105. package/app/components/layout/SpendWarningBanner.vue +3 -3
  106. package/app/components/layout/TranslationWarningBanner.vue +1 -1
  107. package/app/components/layout/UiModeSwitcher.vue +7 -6
  108. package/app/components/layout/UiRoleSwitcher.vue +2 -2
  109. package/app/components/media/ArtifactLightbox.vue +6 -6
  110. package/app/components/media/ImageCompare.vue +16 -16
  111. package/app/components/merge/MergeEffortChips.vue +4 -6
  112. package/app/components/notifications/NotificationSettingsPanel.vue +6 -5
  113. package/app/components/observability/OutcomeFilterChips.vue +1 -1
  114. package/app/components/observability/RunFailureSummary.vue +14 -17
  115. package/app/components/observability/StepMetricsBar.vue +9 -8
  116. package/app/components/observability/StepModelActivity.vue +4 -3
  117. package/app/components/observability/ToolCallList.vue +15 -18
  118. package/app/components/outcome/OutcomeSummaryWindow.vue +43 -42
  119. package/app/components/palettes/AgentPalette.vue +7 -5
  120. package/app/components/palettes/AgentTierSelect.vue +1 -1
  121. package/app/components/palettes/PipelinePurposeSelect.vue +2 -1
  122. package/app/components/panels/AgentStepDetail.vue +27 -30
  123. package/app/components/panels/AttemptEntryHeader.vue +2 -2
  124. package/app/components/panels/DecisionModal.vue +1 -1
  125. package/app/components/panels/GenericStructuredResultView.vue +6 -5
  126. package/app/components/panels/InspectorPanel.vue +15 -13
  127. package/app/components/panels/MergerResultView.vue +10 -9
  128. package/app/components/panels/ObservabilityPanel.vue +66 -76
  129. package/app/components/panels/OperatorDashboardPanel.vue +27 -26
  130. package/app/components/panels/ReportsPanel.vue +26 -25
  131. package/app/components/panels/ReportsSpendBreakdown.vue +2 -2
  132. package/app/components/panels/ResultWindowShell.vue +19 -18
  133. package/app/components/panels/RunDetailLoadState.vue +1 -1
  134. package/app/components/panels/StepContainerStatus.vue +8 -7
  135. package/app/components/panels/StepDelegatedStatus.vue +13 -12
  136. package/app/components/panels/StepEffortReport.vue +12 -17
  137. package/app/components/panels/StepFragmentAdherence.vue +9 -10
  138. package/app/components/panels/StepMetadataCard.vue +41 -43
  139. package/app/components/panels/StepReproductionReport.vue +18 -20
  140. package/app/components/panels/StepRunMeta.vue +27 -26
  141. package/app/components/panels/StepTestReport.vue +16 -15
  142. package/app/components/panels/StepToolServers.vue +7 -8
  143. package/app/components/panels/StepValidationReport.vue +5 -5
  144. package/app/components/panels/inspector/ContainerSummary.vue +4 -4
  145. package/app/components/panels/inspector/DocReferenceRepos.vue +5 -4
  146. package/app/components/panels/inspector/EnvProbeReport.vue +16 -13
  147. package/app/components/panels/inspector/EpicChildren.vue +8 -7
  148. package/app/components/panels/inspector/FrontendBindingsResolved.vue +5 -4
  149. package/app/components/panels/inspector/FrontendConfig.vue +26 -34
  150. package/app/components/panels/inspector/InitiativeInspector.vue +3 -3
  151. package/app/components/panels/inspector/InspectorSection.vue +7 -4
  152. package/app/components/panels/inspector/RecurringScheduleSettings.vue +9 -8
  153. package/app/components/panels/inspector/ServiceConnections.vue +2 -2
  154. package/app/components/panels/inspector/ServiceReleaseHealthConfig.vue +2 -2
  155. package/app/components/panels/inspector/ServiceSelfTests.vue +9 -13
  156. package/app/components/panels/inspector/ServiceTestConfig.vue +41 -45
  157. package/app/components/panels/inspector/ServiceTestSecrets.vue +3 -3
  158. package/app/components/panels/inspector/ServiceTestingContext.vue +2 -2
  159. package/app/components/panels/inspector/ServiceValidationConfig.vue +2 -2
  160. package/app/components/panels/inspector/TaskAgentConfig.vue +2 -2
  161. package/app/components/panels/inspector/TaskAprioriBranches.vue +6 -5
  162. package/app/components/panels/inspector/TaskDependencies.vue +1 -1
  163. package/app/components/panels/inspector/TaskEstimateBadge.vue +3 -7
  164. package/app/components/panels/inspector/TaskExecution.vue +13 -12
  165. package/app/components/panels/inspector/TaskRunSettings.vue +35 -38
  166. package/app/components/panels/inspector/TaskStructure.vue +5 -4
  167. package/app/components/pipeline/AgentPromptEditor.vue +15 -14
  168. package/app/components/pipeline/BinaryOutputStepPicker.vue +42 -52
  169. package/app/components/pipeline/EstimateThresholdFields.vue +2 -2
  170. package/app/components/pipeline/GateConfigFields.vue +6 -6
  171. package/app/components/pipeline/IterationCapPrompt.vue +1 -1
  172. package/app/components/pipeline/PipelineBuilder.vue +28 -27
  173. package/app/components/pipeline/PipelineHealthModal.vue +7 -7
  174. package/app/components/pipeline/PipelinePicker.vue +3 -3
  175. package/app/components/pipeline/PipelinePreview.vue +6 -7
  176. package/app/components/pipeline/PipelineProgress.vue +23 -24
  177. package/app/components/prReview/PrReviewWindow.vue +42 -41
  178. package/app/components/providers/AiPresetMismatchDialog.vue +4 -3
  179. package/app/components/providers/AiProviderOnboardingModal.vue +2 -2
  180. package/app/components/providers/ApiKeysSection.vue +7 -6
  181. package/app/components/providers/PersonalSubscriptionSection.vue +4 -3
  182. package/app/components/providers/VendorCredentialsModal.vue +5 -4
  183. package/app/components/provisioning/ProvisioningLogsDrawer.vue +10 -9
  184. package/app/components/ralph/RalphLoopResultView.vue +25 -26
  185. package/app/components/requirements/RequirementsReviewWindow.vue +13 -12
  186. package/app/components/riskPolicy/RiskPolicyPicker.vue +5 -5
  187. package/app/components/riskPolicy/RiskPolicyPreview.vue +16 -15
  188. package/app/components/sandbox/SandboxPanel.vue +21 -20
  189. package/app/components/settings/ApiTokensPanel.vue +1 -1
  190. package/app/components/settings/BudgetSettings.vue +18 -17
  191. package/app/components/settings/CapabilityCredentialsPanel.vue +5 -5
  192. package/app/components/settings/CloudflareHandlerSection.vue +16 -16
  193. package/app/components/settings/ComposeEnvironmentSetupSection.vue +14 -12
  194. package/app/components/settings/ConnectionTestVerdict.vue +1 -1
  195. package/app/components/settings/ConsensusGroupsSection.vue +21 -20
  196. package/app/components/settings/CustomManifestTypeEditor.vue +8 -7
  197. package/app/components/settings/DefaultProvisionTypeSection.vue +5 -5
  198. package/app/components/settings/InfraHandlersConfigurator.vue +14 -15
  199. package/app/components/settings/InfrastructureBackendPicker.vue +2 -2
  200. package/app/components/settings/IssueTrackerPanel.vue +9 -15
  201. package/app/components/settings/KubernetesEngineForm.vue +9 -8
  202. package/app/components/settings/KubernetesEnvironmentForm.vue +4 -3
  203. package/app/components/settings/LocalContainerPoolSettings.vue +2 -2
  204. package/app/components/settings/LocalModelEndpointsPanel.vue +10 -9
  205. package/app/components/settings/MergeClassRulesEditor.vue +6 -5
  206. package/app/components/settings/MergeRolePolicyEditor.vue +13 -12
  207. package/app/components/settings/ModelConfigurationPanel.vue +8 -11
  208. package/app/components/settings/ModelPresetHealthModal.vue +3 -3
  209. package/app/components/settings/ObservabilityConnectionPanel.vue +1 -1
  210. package/app/components/settings/OpenRouterCatalogPanel.vue +6 -5
  211. package/app/components/settings/PackageRegistriesPanel.vue +4 -4
  212. package/app/components/settings/ProviderConnectionTab.vue +5 -4
  213. package/app/components/settings/ProviderManifestEditor.vue +9 -8
  214. package/app/components/settings/ProviderPreferenceEditor.vue +8 -7
  215. package/app/components/settings/RiskPolicyCreateForm.vue +40 -26
  216. package/app/components/settings/RiskPolicyEditorRow.vue +18 -17
  217. package/app/components/settings/RiskPolicyHealthModal.vue +3 -3
  218. package/app/components/settings/RiskPolicyPanel.vue +11 -13
  219. package/app/components/settings/ServiceFragmentDefaultsPanel.vue +5 -4
  220. package/app/components/settings/SharedStacksPanel.vue +5 -5
  221. package/app/components/settings/TaskSourceCard.vue +2 -2
  222. package/app/components/settings/TaskTypeSuppressionsPanel.vue +4 -4
  223. package/app/components/settings/ToolServerChecklist.vue +22 -22
  224. package/app/components/settings/UsageSettings.vue +13 -13
  225. package/app/components/settings/UserSecretsSection.vue +4 -3
  226. package/app/components/settings/WorkspaceMetadataSettings.vue +6 -5
  227. package/app/components/settings/WorkspaceSettingsPanel.vue +72 -58
  228. package/app/components/skills/ReviewSkillQueue.vue +8 -7
  229. package/app/components/skills/SkillLibraryManager.vue +2 -2
  230. package/app/components/slack/SlackPanel.vue +8 -7
  231. package/app/components/spec/ServiceSpecWindow.vue +15 -16
  232. package/app/components/tasks/BugHuntModal.vue +1 -1
  233. package/app/components/tasks/ContextIssuePicker.vue +4 -6
  234. package/app/components/tasks/TaskContextIssues.vue +1 -1
  235. package/app/components/tasks/TaskImportModal.vue +3 -2
  236. package/app/components/tasks/TaskSourceConnectModal.vue +5 -5
  237. package/app/components/testing/TestReportWindow.vue +54 -53
  238. package/app/components/tutorial/TutorialNudge.vue +3 -2
  239. package/app/components/tutorial/TutorialOverlay.vue +3 -2
  240. package/app/components/vcs/GitLabConnect.vue +1 -1
  241. package/app/components/visualConfirm/VisualConfirmationWindow.vue +23 -25
  242. package/app/composables/usePipelineErrorToast.ts +2 -0
  243. package/app/utils/catalog.ts +8 -0
  244. package/app/utils/theme/builtins.ts +7 -1
  245. package/i18n/locales/de.json +6 -3
  246. package/i18n/locales/en.json +6 -3
  247. package/i18n/locales/es.json +6 -3
  248. package/i18n/locales/fr.json +6 -3
  249. package/i18n/locales/he.json +6 -3
  250. package/i18n/locales/it.json +6 -3
  251. package/i18n/locales/ja.json +6 -3
  252. package/i18n/locales/pl.json +6 -3
  253. package/i18n/locales/tr.json +6 -3
  254. package/i18n/locales/uk.json +6 -3
  255. package/package.json +2 -2
@@ -30,6 +30,7 @@ import ResultWindowShell from '~/components/panels/ResultWindowShell.vue'
30
30
  import StepRunMeta from '~/components/panels/StepRunMeta.vue'
31
31
  import StepFragmentAdherence from '~/components/panels/StepFragmentAdherence.vue'
32
32
  import MarkdownProse from '~/components/common/MarkdownProse.vue'
33
+ import SectionLabel from '~/components/common/SectionLabel.vue'
33
34
 
34
35
  const execution = useExecutionStore()
35
36
  const board = useBoardStore()
@@ -295,7 +296,7 @@ const { requestClose } = useUnsavedGuard({
295
296
  :href="state.prUrl"
296
297
  target="_blank"
297
298
  rel="noopener"
298
- class="rounded-md px-2 py-1 text-[11px] text-primary hover:bg-elevated"
299
+ class="rounded-md px-2 py-1 text-2xs text-primary hover:bg-elevated"
299
300
  >
300
301
  {{ t('prReview.openPr') }}
301
302
  </a>
@@ -320,7 +321,7 @@ const { requestClose } = useUnsavedGuard({
320
321
  >
321
322
  <UIcon name="i-lucide-loader-circle" class="h-8 w-8 animate-spin opacity-60" />
322
323
  <p class="text-sm text-default">{{ t('prReview.reviewing.planning.title') }}</p>
323
- <p class="max-w-sm text-[11px] text-dimmed">
324
+ <p class="max-w-sm text-2xs text-dimmed">
324
325
  {{ t('prReview.reviewing.planning.hint') }}
325
326
  </p>
326
327
  </div>
@@ -334,11 +335,11 @@ const { requestClose } = useUnsavedGuard({
334
335
  />
335
336
  <span>{{ t('prReview.reviewing.reviewingChunks.title') }}</span>
336
337
  </div>
337
- <p class="mb-3 text-[11px] text-dimmed">
338
+ <p class="mb-3 text-2xs text-dimmed">
338
339
  {{ t('prReview.reviewing.reviewingChunks.hint') }}
339
340
  </p>
340
341
 
341
- <div class="flex items-center justify-between text-[11px] text-muted">
342
+ <div class="flex items-center justify-between text-2xs text-muted">
342
343
  <span data-testid="pr-review-chunk-count">
343
344
  {{
344
345
  t('prReview.reviewing.chunks', {
@@ -372,7 +373,7 @@ const { requestClose } = useUnsavedGuard({
372
373
  "
373
374
  >
374
375
  <p
375
- class="mb-1 text-[10px] font-semibold uppercase tracking-wide"
376
+ class="mb-1 text-3xs font-semibold uppercase tracking-wide"
376
377
  :class="activeChunks.length ? 'text-primary' : 'text-dimmed'"
377
378
  >
378
379
  {{ t('prReview.reviewing.activeHeading') }}
@@ -381,7 +382,7 @@ const { requestClose } = useUnsavedGuard({
381
382
  <li
382
383
  v-for="(label, i) in activeChunks"
383
384
  :key="i"
384
- class="flex items-start gap-1.5 text-[12px] text-app-100"
385
+ class="flex items-start gap-1.5 text-xs text-app-100"
385
386
  >
386
387
  <UIcon
387
388
  name="i-lucide-loader-circle"
@@ -390,22 +391,22 @@ const { requestClose } = useUnsavedGuard({
390
391
  <span class="min-w-0">{{ label }}</span>
391
392
  </li>
392
393
  </ul>
393
- <p v-else data-testid="pr-review-active-idle" class="text-[12px] text-muted">
394
+ <p v-else data-testid="pr-review-active-idle" class="text-xs text-muted">
394
395
  {{ t('prReview.reviewing.activeIdle') }}
395
396
  </p>
396
397
  </div>
397
398
 
398
399
  <!-- Every chunk with its explicit status (Reviewed / Reviewing… / Queued). -->
399
400
  <template v-if="subtasks!.items?.length">
400
- <p class="mb-1.5 mt-3 text-[10px] font-semibold uppercase tracking-wide text-muted">
401
+ <SectionLabel as="p" class="mb-1.5 mt-3">
401
402
  {{ t('prReview.reviewing.chunksHeading') }}
402
- </p>
403
+ </SectionLabel>
403
404
  <ul class="space-y-1.5" data-testid="pr-review-chunks">
404
405
  <li
405
406
  v-for="(item, i) in subtasks!.items"
406
407
  :key="i"
407
408
  data-testid="pr-review-chunk"
408
- class="flex items-center gap-1.5 text-[12px]"
409
+ class="flex items-center gap-1.5 text-xs"
409
410
  :class="
410
411
  item.status === 'completed'
411
412
  ? 'text-dimmed'
@@ -427,7 +428,7 @@ const { requestClose } = useUnsavedGuard({
427
428
  </span>
428
429
  <span
429
430
  data-testid="pr-review-chunk-status"
430
- class="shrink-0 rounded px-1.5 py-0.5 text-[10px] font-medium uppercase"
431
+ class="shrink-0 rounded-sm px-1.5 py-0.5 text-3xs font-medium uppercase"
431
432
  :class="CHUNK_STATUS_CLASS[item.status]"
432
433
  >
433
434
  {{ chunkStatusLabel(item.status) }}
@@ -446,12 +447,12 @@ const { requestClose } = useUnsavedGuard({
446
447
  <p
447
448
  v-if="prReview.error"
448
449
  data-testid="pr-review-resume-error"
449
- class="mb-2 rounded-md bg-app-error-500/10 px-3 py-2 text-[12px] text-app-error-300"
450
+ class="mb-2 rounded-md bg-app-error-500/10 px-3 py-2 text-xs text-app-error-300"
450
451
  >
451
452
  {{ prReview.error }}
452
453
  </p>
453
454
  <div class="flex items-start justify-between gap-3">
454
- <p class="min-w-0 text-[11px] text-dimmed">{{ t('prReview.resume.hint') }}</p>
455
+ <p class="min-w-0 text-2xs text-dimmed">{{ t('prReview.resume.hint') }}</p>
455
456
  <UButton
456
457
  data-testid="pr-review-resume"
457
458
  size="xs"
@@ -479,7 +480,7 @@ const { requestClose } = useUnsavedGuard({
479
480
  <p class="text-sm">
480
481
  {{ status === 'fixing' ? t('prReview.fixing.title') : t('prReview.posting.title') }}
481
482
  </p>
482
- <p class="max-w-sm text-[11px] text-dimmed">
483
+ <p class="max-w-sm text-2xs text-dimmed">
483
484
  {{ status === 'fixing' ? t('prReview.fixing.hint') : t('prReview.posting.hint') }}
484
485
  </p>
485
486
  </div>
@@ -487,7 +488,7 @@ const { requestClose } = useUnsavedGuard({
487
488
  <template v-else>
488
489
  <p
489
490
  v-if="prReview.error"
490
- class="mb-3 rounded-md bg-app-error-500/10 px-3 py-2 text-[12px] text-app-error-300"
491
+ class="mb-3 rounded-md bg-app-error-500/10 px-3 py-2 text-xs text-app-error-300"
491
492
  >
492
493
  {{ prReview.error }}
493
494
  </p>
@@ -498,7 +499,7 @@ const { requestClose } = useUnsavedGuard({
498
499
  <div
499
500
  v-if="postReport"
500
501
  data-testid="pr-review-post-report"
501
- class="mb-3 rounded-lg border px-3 py-2 text-[12px]"
502
+ class="mb-3 rounded-lg border px-3 py-2 text-xs"
502
503
  :class="
503
504
  postReport.failures.length > 0 || postReport.bodyPosted === false
504
505
  ? 'border-app-warning-500/40 bg-app-warning-500/10 text-app-warning-200'
@@ -547,7 +548,7 @@ const { requestClose } = useUnsavedGuard({
547
548
  shell's `width` prop) — this window is `full`-width. -->
548
549
  <div
549
550
  v-if="state?.summary"
550
- class="mb-3 max-w-3xl rounded-md bg-elevated/50 px-3 py-2 text-[12px] text-toned"
551
+ class="mb-3 max-w-3xl rounded-md bg-elevated/50 px-3 py-2 text-xs text-toned"
551
552
  >
552
553
  <span class="mb-1 block text-dimmed">{{ t('prReview.summaryLabel') }}</span>
553
554
  <MarkdownProse :text="state.summary" />
@@ -564,7 +565,7 @@ const { requestClose } = useUnsavedGuard({
564
565
  <!-- A clean PR / resolved review with no findings. -->
565
566
  <div
566
567
  v-if="findings.length === 0"
567
- class="rounded-xl border border-default bg-default/60 px-4 py-6 text-center text-[13px] text-toned"
568
+ class="rounded-xl border border-default bg-default/60 px-4 py-6 text-center text-sm text-toned"
568
569
  >
569
570
  {{ t('prReview.noFindings') }}
570
571
  </div>
@@ -574,14 +575,14 @@ const { requestClose } = useUnsavedGuard({
574
575
  <div
575
576
  v-if="challenging"
576
577
  data-testid="pr-review-challenging"
577
- class="mb-3 flex items-center gap-2 rounded-md border border-primary/40 bg-primary/10 px-3 py-2 text-[12px] text-primary"
578
+ class="mb-3 flex items-center gap-2 rounded-md border border-primary/40 bg-primary/10 px-3 py-2 text-xs text-primary"
578
579
  >
579
580
  <UIcon name="i-lucide-loader-circle" class="h-4 w-4 shrink-0 animate-spin" />
580
581
  <span>{{ t('prReview.challenge.investigatingBanner') }}</span>
581
582
  </div>
582
583
 
583
584
  <!-- Selection toolbar -->
584
- <div v-if="awaiting" class="mb-2 flex items-center gap-3 text-[11px] text-muted">
585
+ <div v-if="awaiting" class="mb-2 flex items-center gap-3 text-2xs text-muted">
585
586
  <span data-testid="pr-review-selected-count">
586
587
  {{ t('prReview.selectedCount', { count: activeSelectedIds.length }) }}
587
588
  </span>
@@ -595,10 +596,10 @@ const { requestClose } = useUnsavedGuard({
595
596
 
596
597
  <!-- Findings grouped by slice -->
597
598
  <section v-for="g in groups" :key="g.id" class="mb-4">
598
- <h3 class="mb-1.5 text-[11px] font-semibold uppercase tracking-wide text-muted">
599
+ <SectionLabel as="h3" class="mb-1.5">
599
600
  {{ g.title }}
600
- </h3>
601
- <p v-if="g.rationale" class="mb-1.5 max-w-3xl text-[11px] text-dimmed">
601
+ </SectionLabel>
602
+ <p v-if="g.rationale" class="mb-1.5 max-w-3xl text-2xs text-dimmed">
602
603
  {{ g.rationale }}
603
604
  </p>
604
605
  <article
@@ -626,18 +627,18 @@ const { requestClose } = useUnsavedGuard({
626
627
  <div class="min-w-0 flex-1">
627
628
  <div class="flex flex-wrap items-center gap-1.5">
628
629
  <span
629
- class="rounded px-1.5 py-0.5 text-[10px] font-semibold uppercase ring-1"
630
+ class="rounded-sm px-1.5 py-0.5 text-3xs font-semibold uppercase ring-1"
630
631
  :class="SEVERITY_CLASS[f.severity]"
631
632
  >
632
633
  {{ t(`prReview.severity.${f.severity}`) }}
633
634
  </span>
634
- <span class="rounded bg-elevated px-1.5 py-0.5 text-[10px] text-toned">
635
+ <span class="rounded-sm bg-elevated px-1.5 py-0.5 text-3xs text-toned">
635
636
  {{ t(`prReview.category.${f.category}`) }}
636
637
  </span>
637
638
  <span
638
639
  v-if="postedIds.has(f.id)"
639
640
  data-testid="pr-review-finding-posted"
640
- class="rounded bg-app-success-500/15 px-1.5 py-0.5 text-[10px] font-semibold uppercase text-app-success-300 ring-1 ring-app-success-500/30"
641
+ class="rounded-sm bg-app-success-500/15 px-1.5 py-0.5 text-3xs font-semibold uppercase text-app-success-300 ring-1 ring-app-success-500/30"
641
642
  >
642
643
  {{ t('prReview.postReport.postedBadge') }}
643
644
  </span>
@@ -645,47 +646,47 @@ const { requestClose } = useUnsavedGuard({
645
646
  <span
646
647
  v-if="isRetracted(f)"
647
648
  data-testid="pr-review-finding-retracted"
648
- class="rounded bg-app-error-500/15 px-1.5 py-0.5 text-[10px] font-semibold uppercase text-app-error-300 ring-1 ring-app-error-500/30"
649
+ class="rounded-sm bg-app-error-500/15 px-1.5 py-0.5 text-3xs font-semibold uppercase text-app-error-300 ring-1 ring-app-error-500/30"
649
650
  >
650
651
  {{ t('prReview.challenge.retractedBadge') }}
651
652
  </span>
652
653
  <span
653
654
  v-else-if="isAmended(f)"
654
655
  data-testid="pr-review-finding-amended"
655
- class="rounded bg-app-info-500/15 px-1.5 py-0.5 text-[10px] font-semibold uppercase text-app-info-300 ring-1 ring-app-info-500/30"
656
+ class="rounded-sm bg-app-info-500/15 px-1.5 py-0.5 text-3xs font-semibold uppercase text-app-info-300 ring-1 ring-app-info-500/30"
656
657
  >
657
658
  {{ t('prReview.challenge.strengthenedBadge') }}
658
659
  </span>
659
660
  <span
660
661
  v-else-if="isUpheld(f)"
661
662
  data-testid="pr-review-finding-upheld"
662
- class="rounded bg-app-success-500/15 px-1.5 py-0.5 text-[10px] font-semibold uppercase text-app-success-300 ring-1 ring-app-success-500/30"
663
+ class="rounded-sm bg-app-success-500/15 px-1.5 py-0.5 text-3xs font-semibold uppercase text-app-success-300 ring-1 ring-app-success-500/30"
663
664
  >
664
665
  {{ t('prReview.challenge.upheldBadge') }}
665
666
  </span>
666
667
  <span
667
668
  v-else-if="isChallengeFailed(f)"
668
669
  data-testid="pr-review-finding-challenge-failed"
669
- class="rounded bg-app-warning-500/15 px-1.5 py-0.5 text-[10px] font-semibold uppercase text-app-warning-300 ring-1 ring-app-warning-500/30"
670
+ class="rounded-sm bg-app-warning-500/15 px-1.5 py-0.5 text-3xs font-semibold uppercase text-app-warning-300 ring-1 ring-app-warning-500/30"
670
671
  >
671
672
  {{ t('prReview.challenge.failedBadge') }}
672
673
  </span>
673
674
  <span
674
675
  v-else-if="isInvestigating(f)"
675
676
  data-testid="pr-review-finding-investigating"
676
- class="flex items-center gap-1 rounded bg-primary/15 px-1.5 py-0.5 text-[10px] font-semibold uppercase text-primary ring-1 ring-primary/30"
677
+ class="flex items-center gap-1 rounded-sm bg-primary/15 px-1.5 py-0.5 text-3xs font-semibold uppercase text-primary ring-1 ring-primary/30"
677
678
  >
678
679
  <UIcon name="i-lucide-loader-circle" class="h-3 w-3 animate-spin" />
679
680
  {{ t('prReview.challenge.investigatingBadge') }}
680
681
  </span>
681
682
  <h4
682
- class="min-w-0 flex-1 text-[13px] font-medium text-app-100"
683
+ class="min-w-0 flex-1 text-sm font-medium text-app-100"
683
684
  :class="isRetracted(f) ? 'line-through' : ''"
684
685
  >
685
686
  {{ f.title }}
686
687
  </h4>
687
688
  </div>
688
- <p class="mt-0.5 text-[11px] text-dimmed">
689
+ <p class="mt-0.5 text-2xs text-dimmed">
689
690
  {{ f.path
690
691
  }}<template v-if="f.line != null">
691
692
  · {{ t('prReview.line', { line: f.line }) }}</template
@@ -701,7 +702,7 @@ const { requestClose } = useUnsavedGuard({
701
702
  <MarkdownProse
702
703
  v-if="f.detail"
703
704
  :text="f.detail"
704
- class="mt-1 max-w-3xl text-[12px] text-toned"
705
+ class="mt-1 max-w-3xl text-xs text-toned"
705
706
  :class="isRetracted(f) ? 'line-through' : ''"
706
707
  />
707
708
  <!-- The suggested fix is a VALUE a human copies (a patch line, a command, a
@@ -711,7 +712,7 @@ const { requestClose } = useUnsavedGuard({
711
712
  failure summary is left alone. -->
712
713
  <p
713
714
  v-if="f.suggestedFix"
714
- class="mt-1 max-w-3xl whitespace-pre-wrap rounded-md bg-elevated/50 px-2 py-1 text-[11px] text-toned"
715
+ class="mt-1 max-w-3xl whitespace-pre-wrap rounded-md bg-elevated/50 px-2 py-1 text-2xs text-toned"
715
716
  >
716
717
  <span class="text-dimmed">{{ t('prReview.suggestedFix') }}</span>
717
718
  {{ f.suggestedFix }}
@@ -722,7 +723,7 @@ const { requestClose } = useUnsavedGuard({
722
723
  <div
723
724
  v-if="f.challenge?.justification"
724
725
  data-testid="pr-review-finding-justification"
725
- class="mt-1.5 max-w-3xl rounded-md px-2 py-1 text-[11px]"
726
+ class="mt-1.5 max-w-3xl rounded-md px-2 py-1 text-2xs"
726
727
  :class="
727
728
  isRetracted(f)
728
729
  ? 'bg-app-error-500/10 text-app-error-200'
@@ -745,7 +746,7 @@ const { requestClose } = useUnsavedGuard({
745
746
  <!-- Per-finding actions: Challenge + Dismiss (only while awaiting a selection). -->
746
747
  <div
747
748
  v-if="awaiting && !isInvestigating(f)"
748
- class="mt-1.5 flex items-center gap-3 text-[11px]"
749
+ class="mt-1.5 flex items-center gap-3 text-2xs"
749
750
  >
750
751
  <button
751
752
  v-if="!isRetracted(f)"
@@ -783,21 +784,21 @@ const { requestClose } = useUnsavedGuard({
783
784
  data-testid="pr-review-challenge-input"
784
785
  rows="2"
785
786
  :placeholder="t('prReview.challenge.placeholder')"
786
- class="w-full resize-y rounded border border-muted bg-app-950/60 px-2 py-1 text-[12px] text-default outline-none focus:border-primary"
787
+ class="w-full resize-y rounded-sm border border-muted bg-app-950/60 px-2 py-1 text-xs text-default outline-none focus:border-primary"
787
788
  />
788
- <p class="mt-1 text-[10px] text-dimmed">
789
+ <p class="mt-1 text-3xs text-dimmed">
789
790
  {{ t('prReview.challenge.hint') }}
790
791
  </p>
791
792
  <div class="mt-1.5 flex justify-end gap-2">
792
793
  <button
793
- class="rounded px-2 py-1 text-[11px] text-muted hover:text-default"
794
+ class="rounded-sm px-2 py-1 text-2xs text-muted hover:text-default"
794
795
  @click="cancelChallenge"
795
796
  >
796
797
  {{ t('common.cancel') }}
797
798
  </button>
798
799
  <button
799
800
  data-testid="pr-review-challenge-submit"
800
- class="rounded bg-primary/80 px-2 py-1 text-[11px] font-medium text-inverted hover:bg-primary/90 disabled:opacity-50"
801
+ class="rounded-sm bg-primary/80 px-2 py-1 text-2xs font-medium text-inverted hover:bg-primary/90 disabled:opacity-50"
801
802
  :disabled="!canResolve"
802
803
  @click="submitChallenge(f.id)"
803
804
  >
@@ -7,6 +7,7 @@
7
7
  // auto-opens once per session (driven from pages/index.vue) and clears once the preset is
8
8
  // fixed (or all its models become available).
9
9
  import { computed } from 'vue'
10
+ import SectionLabel from '~/components/common/SectionLabel.vue'
10
11
 
11
12
  const { t } = useI18n()
12
13
  const ui = useUiStore()
@@ -54,9 +55,9 @@ function go(action: () => void) {
54
55
  </i18n-t>
55
56
 
56
57
  <div class="rounded-lg border border-muted bg-default/50 p-3">
57
- <p class="mb-1.5 text-[11px] font-semibold uppercase tracking-wide text-dimmed">
58
+ <SectionLabel as="p" class="mb-1.5">
58
59
  {{ t('providers.presetMismatch.unavailable') }}
59
- </p>
60
+ </SectionLabel>
60
61
  <div class="flex flex-wrap gap-1.5">
61
62
  <UBadge
62
63
  v-for="label in unavailableLabels"
@@ -70,7 +71,7 @@ function go(action: () => void) {
70
71
  </div>
71
72
  </div>
72
73
 
73
- <p class="text-[13px] text-muted">
74
+ <p class="text-sm text-muted">
74
75
  {{ t('providers.presetMismatch.advice') }}
75
76
  </p>
76
77
 
@@ -104,7 +104,7 @@ const routes = computed<Route[]>(() => [
104
104
  {{ r.badge }}
105
105
  </UBadge>
106
106
  </div>
107
- <p class="mt-0.5 text-[13px] leading-relaxed text-muted">{{ r.body }}</p>
107
+ <p class="mt-0.5 text-sm leading-relaxed text-muted">{{ r.body }}</p>
108
108
  </div>
109
109
  <UButton
110
110
  size="sm"
@@ -118,7 +118,7 @@ const routes = computed<Route[]>(() => [
118
118
  </div>
119
119
  </div>
120
120
 
121
- <p class="text-[11px] leading-relaxed text-dimmed">
121
+ <p class="text-2xs leading-relaxed text-dimmed">
122
122
  {{ t('providers.onboarding.operatorNote') }}
123
123
  </p>
124
124
  </div>
@@ -19,6 +19,7 @@ import { computed, ref, watch } from 'vue'
19
19
  import { providerCachesPrompts } from '@cat-factory/contracts'
20
20
  import type { ApiKey, ApiKeyProvider } from '~/types/domain'
21
21
  import SecretInput from '~/components/common/SecretInput.vue'
22
+ import SectionLabel from '~/components/common/SectionLabel.vue'
22
23
 
23
24
  const props = withDefaults(defineProps<{ accountId?: string; category?: 'direct' | 'proxy' }>(), {
24
25
  category: 'direct',
@@ -264,13 +265,13 @@ async function remove(k: ApiKey) {
264
265
  <template>
265
266
  <div class="space-y-4">
266
267
  <div>
267
- <h4 class="text-xs font-semibold uppercase tracking-wide text-dimmed">
268
+ <SectionLabel as="h4">
268
269
  {{
269
270
  category === 'proxy'
270
271
  ? t('providers.apiKeys.proxyHeading')
271
272
  : t('providers.apiKeys.directHeading')
272
273
  }}
273
- </h4>
274
+ </SectionLabel>
274
275
  <template v-if="category === 'proxy'">
275
276
  <p v-if="isAccount" class="mt-1 text-sm text-muted">
276
277
  {{ t('providers.apiKeys.proxyAccountIntro') }}
@@ -343,7 +344,7 @@ async function remove(k: ApiKey) {
343
344
  the caching flavour, so long agentic runs stop re-billing the whole prompt. -->
344
345
  <p
345
346
  v-if="cachesPrompts(selected.value)"
346
- class="flex items-center gap-1.5 text-[12px] text-app-success-400/90"
347
+ class="flex items-center gap-1.5 text-xs text-app-success-400/90"
347
348
  >
348
349
  <UIcon name="i-lucide-zap" class="h-3.5 w-3.5 shrink-0" />
349
350
  {{ t('providers.apiKeys.cachingNote', { provider: selected.label }) }}
@@ -380,9 +381,9 @@ async function remove(k: ApiKey) {
380
381
 
381
382
  <!-- connected keys for the selected scope -->
382
383
  <div v-if="connected.length" class="space-y-2">
383
- <h5 class="text-xs font-semibold uppercase tracking-wide text-dimmed">
384
+ <SectionLabel as="h5">
384
385
  {{ t('providers.apiKeys.connected', { count: connected.length }) }}
385
- </h5>
386
+ </SectionLabel>
386
387
  <div
387
388
  v-for="k in connected"
388
389
  :key="k.id"
@@ -395,7 +396,7 @@ async function remove(k: ApiKey) {
395
396
  <UBadge v-if="!k.enabled" color="neutral" variant="subtle" size="sm" class="ms-2">
396
397
  {{ t('providers.apiKeys.disabledBadge') }}
397
398
  </UBadge>
398
- <div class="text-[11px] tabular-nums text-dimmed">
399
+ <div class="text-2xs tabular-nums text-dimmed">
399
400
  {{
400
401
  t(
401
402
  'providers.apiKeys.usage',
@@ -7,6 +7,7 @@
7
7
  import { computed, onBeforeUnmount, onMounted, ref, watch } from 'vue'
8
8
  import type { SubscriptionVendor } from '~/types/domain'
9
9
  import SecretInput from '~/components/common/SecretInput.vue'
10
+ import SectionLabel from '~/components/common/SectionLabel.vue'
10
11
 
11
12
  const personal = usePersonalSubscriptionsStore()
12
13
  const auth = useAuthStore()
@@ -208,9 +209,9 @@ async function disconnect(v: SubscriptionVendor) {
208
209
  <template>
209
210
  <div class="space-y-3">
210
211
  <div>
211
- <h4 class="text-xs font-semibold uppercase tracking-wide text-dimmed">
212
+ <SectionLabel as="h4">
212
213
  {{ t('personalSubscriptions.heading') }}
213
- </h4>
214
+ </SectionLabel>
214
215
  <p class="mt-1 text-sm text-muted">{{ t('personalSubscriptions.intro') }}</p>
215
216
  </div>
216
217
 
@@ -228,7 +229,7 @@ async function disconnect(v: SubscriptionVendor) {
228
229
  <div>
229
230
  <span class="font-medium text-default">{{ sub.label }}</span>
230
231
  <span class="ms-2 text-xs text-dimmed">{{ vendorLabel(sub.vendor) }}</span>
231
- <div class="text-[11px] text-dimmed">
232
+ <div class="text-2xs text-dimmed">
232
233
  <template v-if="sub.expiresAt">
233
234
  {{ t('personalSubscriptions.expires', { date: d(new Date(sub.expiresAt), 'short') }) }}
234
235
  </template>
@@ -9,6 +9,7 @@ import { computed, ref, watch } from 'vue'
9
9
  import type { SubscriptionVendor } from '~/types/domain'
10
10
  import IntegrationBackTitle from '~/components/layout/IntegrationBackTitle.vue'
11
11
  import SecretInput from '~/components/common/SecretInput.vue'
12
+ import SectionLabel from '~/components/common/SectionLabel.vue'
12
13
 
13
14
  const { t, n } = useI18n()
14
15
  const ui = useUiStore()
@@ -202,7 +203,7 @@ function vendorLabel(v: SubscriptionVendor): string {
202
203
  class="flex items-center gap-3 rounded-lg border border-primary/30 bg-primary/10 px-3 py-2.5"
203
204
  >
204
205
  <UIcon name="i-lucide-user" class="h-5 w-5 shrink-0 text-primary" />
205
- <p class="min-w-0 flex-1 text-[13px] text-toned">
206
+ <p class="min-w-0 flex-1 text-sm text-toned">
206
207
  {{ t('providers.vendorCredentials.personalCallout.text') }}
207
208
  </p>
208
209
  <UButton
@@ -267,11 +268,11 @@ function vendorLabel(v: SubscriptionVendor): string {
267
268
 
268
269
  <!-- connected pool -->
269
270
  <div v-if="creds.credentials.length" class="space-y-2">
270
- <h4 class="text-xs font-semibold uppercase tracking-wide text-dimmed">
271
+ <SectionLabel as="h4">
271
272
  {{
272
273
  t('providers.vendorCredentials.connected', { count: creds.credentials.length })
273
274
  }}
274
- </h4>
275
+ </SectionLabel>
275
276
  <div
276
277
  v-for="c in creds.credentials"
277
278
  :key="c.id"
@@ -284,7 +285,7 @@ function vendorLabel(v: SubscriptionVendor): string {
284
285
  <UBadge v-if="!c.enabled" color="neutral" variant="subtle" size="sm" class="ms-2">
285
286
  {{ t('providers.vendorCredentials.disabledBadge') }}
286
287
  </UBadge>
287
- <div class="text-[11px] tabular-nums text-dimmed">
288
+ <div class="text-2xs tabular-nums text-dimmed">
288
289
  {{
289
290
  t(
290
291
  'providers.vendorCredentials.usage',
@@ -22,6 +22,7 @@ import type {
22
22
  ProvisioningOutcome,
23
23
  ProvisioningSubsystem,
24
24
  } from '~/types/provisioningLogs'
25
+ import SectionLabel from '~/components/common/SectionLabel.vue'
25
26
 
26
27
  const props = defineProps<{
27
28
  subsystem?: ProvisioningSubsystem
@@ -115,9 +116,9 @@ function when(epochMs: number): string {
115
116
  <template>
116
117
  <div class="rounded-lg border border-muted bg-default/50">
117
118
  <div class="flex items-center justify-between border-b border-default px-3 py-2">
118
- <p class="text-[11px] font-semibold uppercase tracking-wide text-muted">
119
+ <SectionLabel as="p">
119
120
  {{ t('provisioning.title') }}
120
- </p>
121
+ </SectionLabel>
121
122
  <UButton
122
123
  icon="i-lucide-rotate-ccw"
123
124
  variant="ghost"
@@ -129,17 +130,17 @@ function when(epochMs: number): string {
129
130
  </UButton>
130
131
  </div>
131
132
 
132
- <p v-if="state.error" class="px-3 py-2 text-[12px] text-app-error-300">{{ state.error }}</p>
133
+ <p v-if="state.error" class="px-3 py-2 text-xs text-app-error-300">{{ state.error }}</p>
133
134
  <p
134
135
  v-else-if="!state.loading && state.entries.length === 0"
135
- class="px-3 py-3 text-[12px] text-dimmed"
136
+ class="px-3 py-3 text-xs text-dimmed"
136
137
  >
137
138
  {{ t('provisioning.empty') }}
138
139
  </p>
139
140
 
140
141
  <ul v-else class="max-h-80 divide-y divide-default overflow-auto">
141
142
  <li v-for="entry in state.entries" :key="entry.id" class="px-3 py-2">
142
- <div class="flex items-center gap-2 text-[12px]">
143
+ <div class="flex items-center gap-2 text-xs">
143
144
  <UIcon
144
145
  :name="entry.outcome === 'success' ? 'i-lucide-check-circle' : 'i-lucide-x-circle'"
145
146
  class="h-3.5 w-3.5 shrink-0"
@@ -147,7 +148,7 @@ function when(epochMs: number): string {
147
148
  />
148
149
  <span class="font-medium text-default">{{ OPERATION_LABEL[entry.operation] }}</span>
149
150
  <span
150
- class="rounded px-1.5 py-0.5 text-[10px] uppercase tracking-wide"
151
+ class="rounded-sm px-1.5 py-0.5 text-3xs uppercase tracking-wide"
151
152
  :class="
152
153
  entry.outcome === 'success'
153
154
  ? 'bg-app-success-950/60 text-app-success-300'
@@ -155,15 +156,15 @@ function when(epochMs: number): string {
155
156
  "
156
157
  >{{ OUTCOME_LABEL[entry.outcome] }}</span
157
158
  >
158
- <span class="ms-auto text-[11px] text-dimmed">{{ when(entry.createdAt) }}</span>
159
+ <span class="ms-auto text-2xs text-dimmed">{{ when(entry.createdAt) }}</span>
159
160
  </div>
160
- <div v-if="entry.targetId" class="mt-0.5 text-[11px] text-dimmed">
161
+ <div v-if="entry.targetId" class="mt-0.5 text-2xs text-dimmed">
161
162
  {{ entry.providerId ? `${entry.providerId} · ` : '' }}{{ entry.targetId }}
162
163
  </div>
163
164
  <!-- The verbatim provider/runtime error on a failed attempt. -->
164
165
  <pre
165
166
  v-if="entry.error"
166
- class="mt-1 max-h-28 overflow-auto whitespace-pre-wrap rounded border border-app-error-900/50 bg-app-error-950/30 p-1.5 text-[11px] text-app-error-200/90"
167
+ class="mt-1 max-h-28 overflow-auto whitespace-pre-wrap rounded-sm border border-app-error-900/50 bg-app-error-950/30 p-1.5 text-2xs text-app-error-200/90"
167
168
  >{{ entry.error }}</pre>
168
169
  </li>
169
170
  </ul>