@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
@@ -32,6 +32,7 @@ import {
32
32
  unattributedObservations,
33
33
  } from '~/components/panels/StepToolServers.logic'
34
34
  import { agentKindMeta } from '~/utils/catalog'
35
+ import SectionLabel from '~/components/common/SectionLabel.vue'
35
36
 
36
37
  const props = defineProps<{
37
38
  toolServers: StepToolServers
@@ -109,17 +110,15 @@ const drops = computed(() =>
109
110
  data-testid="step-tool-servers"
110
111
  class="scroll-mt-4 rounded-xl border border-default bg-default/50 p-4"
111
112
  >
112
- <div
113
- class="mb-2 flex items-center gap-1.5 text-[11px] font-semibold uppercase tracking-wide text-muted"
114
- >
113
+ <SectionLabel class="mb-2 flex items-center gap-1.5">
115
114
  <UIcon name="i-lucide-plug" class="h-3.5 w-3.5" />
116
115
  <span>{{ t('panels.stepDetail.toolServers.heading') }}</span>
117
- </div>
116
+ </SectionLabel>
118
117
 
119
118
  <p
120
119
  v-if="dispatchedAs"
121
120
  data-testid="step-tool-servers-dispatched-as"
122
- class="mb-2 text-[12px] text-muted"
121
+ class="mb-2 text-xs text-muted"
123
122
  >
124
123
  {{ t('panels.stepDetail.toolServers.dispatchedAs', { agent: dispatchedAs }) }}
125
124
  </p>
@@ -130,7 +129,7 @@ const drops = computed(() =>
130
129
  :key="server.id"
131
130
  data-testid="step-tool-server-wired"
132
131
  :data-observed-fault="server.isFault ? 'true' : undefined"
133
- class="inline-flex items-center gap-1.5 rounded-full border px-2 py-0.5 text-[12px]"
132
+ class="inline-flex items-center gap-1.5 rounded-full border px-2 py-0.5 text-xs"
134
133
  :class="
135
134
  server.isFault
136
135
  ? 'border-app-warning-500/30 bg-app-warning-500/10 text-app-warning-200'
@@ -171,7 +170,7 @@ const drops = computed(() =>
171
170
  v-for="server in unattributed"
172
171
  :key="server.id"
173
172
  data-testid="step-tool-server-unattributed"
174
- class="flex items-start gap-1.5 text-[12px] text-muted"
173
+ class="flex items-start gap-1.5 text-xs text-muted"
175
174
  >
176
175
  <UIcon name="i-lucide-circle-help" class="mt-0.5 h-3.5 w-3.5 shrink-0" />
177
176
  <span>{{
@@ -185,7 +184,7 @@ const drops = computed(() =>
185
184
  v-for="server in drops"
186
185
  :key="server.id"
187
186
  data-testid="step-tool-server-unavailable"
188
- class="flex items-start gap-1.5 text-[12px] text-toned"
187
+ class="flex items-start gap-1.5 text-xs text-toned"
189
188
  >
190
189
  <UIcon
191
190
  name="i-lucide-plug-zap"
@@ -15,7 +15,7 @@ const failed = computed(() => props.report.outcomes.filter((o) => !o.passed))
15
15
 
16
16
  <template>
17
17
  <div class="space-y-2" data-testid="step-validation-report">
18
- <p class="text-[11px] text-muted">
18
+ <p class="text-2xs text-muted">
19
19
  {{
20
20
  report.passed
21
21
  ? t('panels.stepDetail.validation.passedSummary', {
@@ -43,11 +43,11 @@ const failed = computed(() => props.report.outcomes.filter((o) => !o.passed))
43
43
  class="h-3.5 w-3.5 shrink-0"
44
44
  :class="outcome.passed ? 'text-app-success-400' : 'text-app-error-400'"
45
45
  />
46
- <span class="text-[12px] font-medium text-default">{{ outcome.label }}</span>
47
- <span class="truncate font-mono text-[11px] text-dimmed">{{ outcome.command }}</span>
46
+ <span class="text-xs font-medium text-default">{{ outcome.label }}</span>
47
+ <span class="truncate font-mono text-2xs text-dimmed">{{ outcome.command }}</span>
48
48
  <span
49
49
  v-if="!outcome.passed"
50
- class="ms-auto shrink-0 rounded bg-app-error-500/15 px-1.5 py-0.5 text-[11px] tabular-nums text-app-error-300"
50
+ class="ms-auto shrink-0 rounded-sm bg-app-error-500/15 px-1.5 py-0.5 text-2xs tabular-nums text-app-error-300"
51
51
  >
52
52
  {{
53
53
  outcome.timedOut
@@ -58,7 +58,7 @@ const failed = computed(() => props.report.outcomes.filter((o) => !o.passed))
58
58
  </div>
59
59
  <pre
60
60
  v-if="outcome.outputTail"
61
- class="mt-1.5 max-h-48 overflow-auto whitespace-pre-wrap break-words rounded bg-app-950 p-2 font-mono text-[11px] text-muted"
61
+ class="mt-1.5 max-h-48 overflow-auto whitespace-pre-wrap break-words rounded-sm bg-app-950 p-2 font-mono text-2xs text-muted"
62
62
  data-testid="validation-output"
63
63
  >{{ outcome.outputTail }}</pre>
64
64
  </div>
@@ -41,7 +41,7 @@ function addTask() {
41
41
  >
42
42
  <UIcon name="i-lucide-package" class="h-3.5 w-3.5 text-app-secondary-400" />
43
43
  <span class="truncate text-xs text-default">{{ m.title }}</span>
44
- <span class="ms-auto text-[10px] text-dimmed">{{
44
+ <span class="ms-auto text-3xs text-dimmed">{{
45
45
  t(
46
46
  'inspector.container.taskCount',
47
47
  { count: board.tasksOf(m.id).length },
@@ -76,11 +76,11 @@ function addTask() {
76
76
  :style="{ backgroundColor: STATUS_META[task.status].color }"
77
77
  />
78
78
  <span class="truncate text-xs text-default">{{ task.title }}</span>
79
- <span class="ms-auto text-[10px] text-dimmed">{{ STATUS_META[task.status].label }}</span>
79
+ <span class="ms-auto text-3xs text-dimmed">{{ STATUS_META[task.status].label }}</span>
80
80
  </li>
81
81
  </ul>
82
- <div v-else class="text-[11px] text-dimmed">{{ t('inspector.container.noTasks') }}</div>
83
- <p v-if="isFrame" class="text-[11px] text-dimmed">
82
+ <div v-else class="text-2xs text-dimmed">{{ t('inspector.container.noTasks') }}</div>
83
+ <p v-if="isFrame" class="text-2xs text-dimmed">
84
84
  {{ t('inspector.container.servicesHint') }}
85
85
  </p>
86
86
  </InspectorSection>
@@ -6,6 +6,7 @@
6
6
  // search as the add-service picker (`useRepoSearch`), not a filter over the synced projection.
7
7
  import type { Block, GitHubAvailableRepo, ReferenceRepo } from '~/types/domain'
8
8
  import RepoSearchEmpty from '~/components/github/RepoSearchEmpty.vue'
9
+ import SectionLabel from '~/components/common/SectionLabel.vue'
9
10
 
10
11
  const props = defineProps<{ block: Block }>()
11
12
 
@@ -83,9 +84,9 @@ function detach(repoId: number) {
83
84
  <template>
84
85
  <div data-testid="doc-reference-repos">
85
86
  <div class="mb-1 flex items-center justify-between">
86
- <span class="text-[11px] font-semibold uppercase tracking-wide text-muted">
87
+ <SectionLabel as="span">
87
88
  {{ t('inspector.referenceRepos.title') }}
88
- </span>
89
+ </SectionLabel>
89
90
  </div>
90
91
 
91
92
  <!-- Attached reference repos: chips with a remove control. -->
@@ -133,11 +134,11 @@ function detach(repoId: number) {
133
134
  />
134
135
  </template>
135
136
  </UInputMenu>
136
- <div v-else class="text-[11px] text-dimmed">
137
+ <div v-else class="text-2xs text-dimmed">
137
138
  {{ t('inspector.referenceRepos.connectFirst') }}
138
139
  </div>
139
140
 
140
- <div class="mt-1 text-[11px] text-dimmed">
141
+ <div class="mt-1 text-2xs text-dimmed">
141
142
  {{ t('inspector.referenceRepos.hint') }}
142
143
  </div>
143
144
  </div>
@@ -81,14 +81,17 @@ function outcomeClass(outcome: EnvironmentProbeReport['operations'][number]['out
81
81
  </script>
82
82
 
83
83
  <template>
84
- <div class="space-y-2 rounded border border-default bg-muted p-2" data-testid="env-probe-report">
85
- <p class="text-[11px] font-medium" :class="verdictClass" data-testid="env-probe-verdict">
84
+ <div
85
+ class="space-y-2 rounded-sm border border-default bg-muted p-2"
86
+ data-testid="env-probe-report"
87
+ >
88
+ <p class="text-2xs font-medium" :class="verdictClass" data-testid="env-probe-verdict">
86
89
  {{ verdictLabel }}
87
90
  </p>
88
91
 
89
92
  <!-- The tallies the PLATFORM computed from the agent's per-operation judgements, including
90
93
  how many successes were behind authentication: the count the verdict turns on. -->
91
- <p class="text-[11px] text-muted">
94
+ <p class="text-2xs text-muted">
92
95
  {{
93
96
  t('inspector.testConfig.envProbe.counts', {
94
97
  succeeded: report.succeeded,
@@ -101,19 +104,19 @@ function outcomeClass(outcome: EnvironmentProbeReport['operations'][number]['out
101
104
  <!-- What the platform did not tell the agent: the actionable half of the report, so it comes
102
105
  before the evidence. -->
103
106
  <div v-if="report.missingContext.length" data-testid="env-probe-missing">
104
- <p class="text-[11px] font-medium text-app-warning-300/90">
107
+ <p class="text-2xs font-medium text-app-warning-300/90">
105
108
  {{ t('inspector.testConfig.envProbe.missingContext') }}
106
109
  </p>
107
- <ul class="mt-0.5 list-disc space-y-0.5 pl-4 text-[11px] text-toned">
110
+ <ul class="mt-0.5 list-disc space-y-0.5 pl-4 text-2xs text-toned">
108
111
  <li v-for="(line, i) in report.missingContext" :key="i">{{ line }}</li>
109
112
  </ul>
110
113
  </div>
111
114
 
112
115
  <div v-if="report.blockers.length" data-testid="env-probe-blockers">
113
- <p class="text-[11px] font-medium text-app-error-300/90">
116
+ <p class="text-2xs font-medium text-app-error-300/90">
114
117
  {{ t('inspector.testConfig.envProbe.blockers') }}
115
118
  </p>
116
- <ul class="mt-0.5 space-y-0.5 text-[11px] text-toned">
119
+ <ul class="mt-0.5 space-y-0.5 text-2xs text-toned">
117
120
  <li v-for="(blocker, i) in report.blockers" :key="i">
118
121
  <span class="text-muted">{{ failureLabel(blocker.kind) }}:</span>
119
122
  {{ blocker.detail }}
@@ -124,10 +127,10 @@ function outcomeClass(outcome: EnvironmentProbeReport['operations'][number]['out
124
127
  <!-- The operations, as evidence for the verdict above. This is the "what was attempted" a dry
125
128
  run exists to report: without it a verdict is an opinion. -->
126
129
  <div v-if="report.operations.length" data-testid="env-probe-operations">
127
- <p class="text-[11px] font-medium text-toned">
130
+ <p class="text-2xs font-medium text-toned">
128
131
  {{ t('inspector.testConfig.envProbe.operations') }}
129
132
  </p>
130
- <ul class="mt-0.5 space-y-1 text-[11px]">
133
+ <ul class="mt-0.5 space-y-1 text-2xs">
131
134
  <li v-for="(op, i) in report.operations" :key="i" class="flex items-start gap-1.5">
132
135
  <UIcon
133
136
  :name="outcomeIcon(op.outcome)"
@@ -151,12 +154,12 @@ function outcomeClass(outcome: EnvironmentProbeReport['operations'][number]['out
151
154
  whole attempt. The two ways an operation fails to reach the list are rendered SEPARATELY
152
155
  because they send a reader somewhere different: one says the agent reported more than is
153
156
  shown, the other says its reply was malformed. -->
154
- <p v-if="report.operationsOmitted" class="mt-1 text-[11px] text-dimmed">
157
+ <p v-if="report.operationsOmitted" class="mt-1 text-2xs text-dimmed">
155
158
  {{
156
159
  t('inspector.testConfig.envProbe.operationsOmitted', { count: report.operationsOmitted })
157
160
  }}
158
161
  </p>
159
- <p v-if="report.operationsUnreadable" class="mt-1 text-[11px] text-dimmed">
162
+ <p v-if="report.operationsUnreadable" class="mt-1 text-2xs text-dimmed">
160
163
  {{
161
164
  t('inspector.testConfig.envProbe.operationsUnreadable', {
162
165
  count: report.operationsUnreadable,
@@ -165,8 +168,8 @@ function outcomeClass(outcome: EnvironmentProbeReport['operations'][number]['out
165
168
  </p>
166
169
  </div>
167
170
 
168
- <p v-if="report.summary" class="text-[11px] text-muted">{{ report.summary }}</p>
169
- <p v-if="report.model" class="text-[11px] text-app-600">
171
+ <p v-if="report.summary" class="text-2xs text-muted">{{ report.summary }}</p>
172
+ <p v-if="report.model" class="text-2xs text-app-600">
170
173
  {{ t('inspector.testConfig.envProbe.model', { model: report.model }) }}
171
174
  </p>
172
175
  </div>
@@ -3,6 +3,7 @@ import { computed } from 'vue'
3
3
  import type { Block } from '~/types/domain'
4
4
  import { STATUS_META } from '~/utils/catalog'
5
5
  import InspectorSection from '~/components/panels/inspector/InspectorSection.vue'
6
+ import SectionLabel from '~/components/common/SectionLabel.vue'
6
7
 
7
8
  // The epic inspector body: the full tree of member tasks (which may live under different
8
9
  // services/modules), grouped service → module → task. Each task row selects it. Membership
@@ -52,30 +53,31 @@ const groups = computed(() => {
52
53
  default-open
53
54
  >
54
55
  <template #actions>
55
- <span class="text-[11px] text-dimmed">{{
56
+ <span class="text-2xs text-dimmed">{{
56
57
  t('inspector.epicChildren.doneCount', { done, total: members.length })
57
58
  }}</span>
58
59
  </template>
59
60
 
60
- <div v-if="members.length === 0" class="text-[11px] text-dimmed">
61
+ <div v-if="members.length === 0" class="text-2xs text-dimmed">
61
62
  {{ t('inspector.epicChildren.empty') }}
62
63
  </div>
63
64
 
64
65
  <div v-else class="space-y-2">
65
66
  <div v-for="(group, gi) in groups" :key="gi" class="rounded-md border border-muted/60 p-2">
66
- <div class="mb-1 flex items-center gap-1 text-[11px] font-medium text-toned">
67
+ <div class="mb-1 flex items-center gap-1 text-2xs font-medium text-toned">
67
68
  <UIcon name="i-lucide-box" class="h-3 w-3 text-dimmed" />
68
69
  {{ group.service?.title ?? t('inspector.epicChildren.unassigned') }}
69
70
  </div>
70
71
  <div v-for="(mod, mi) in [...group.modules.values()]" :key="mi" class="ps-1">
71
- <div v-if="mod.module" class="text-[10px] uppercase tracking-wide text-dimmed">
72
+ <SectionLabel v-if="mod.module">
72
73
  {{ mod.module.title }}
73
- </div>
74
- <button
74
+ </SectionLabel>
75
+ <UButton
76
+ color="neutral"
77
+ variant="ghost"
75
78
  v-for="task in mod.tasks"
76
79
  :key="task.id"
77
- type="button"
78
- class="flex w-full items-center gap-1.5 rounded px-1 py-0.5 text-start text-xs text-default hover:bg-elevated"
80
+ class="flex w-full items-center gap-1.5 rounded-sm px-1 py-0.5 text-start text-xs text-default hover:bg-elevated"
79
81
  @click="ui.select(task.id)"
80
82
  >
81
83
  <span
@@ -83,10 +85,10 @@ const groups = computed(() => {
83
85
  :style="{ backgroundColor: STATUS_META[task.status].color }"
84
86
  />
85
87
  <span class="truncate">{{ task.title }}</span>
86
- <span class="ms-auto shrink-0 text-[10px] text-dimmed">
88
+ <span class="ms-auto shrink-0 text-3xs text-dimmed">
87
89
  {{ STATUS_META[task.status].label }}
88
90
  </span>
89
- </button>
91
+ </UButton>
90
92
  </div>
91
93
  </div>
92
94
  </div>
@@ -7,6 +7,7 @@ import {
7
7
  type FrontendConfig,
8
8
  type ResolvedFrontendBinding,
9
9
  } from '@cat-factory/contracts'
10
+ import SectionLabel from '~/components/common/SectionLabel.vue'
10
11
 
11
12
  // The resolution of a frontend frame's backend bindings — each env var → a bound service's live
12
13
  // ephemeral URL, or WireMock. Two modes, same view:
@@ -66,13 +67,13 @@ const rows = computed(() => {
66
67
 
67
68
  <template>
68
69
  <div v-if="rows.length || duplicates.length" class="space-y-1.5" data-testid="frontend-resolved">
69
- <div class="text-[11px] font-semibold uppercase tracking-wide text-dimmed">
70
+ <SectionLabel>
70
71
  {{ t('inspector.frontendConfig.resolved.title') }}
71
- </div>
72
+ </SectionLabel>
72
73
 
73
74
  <p
74
75
  v-if="duplicates.length"
75
- class="text-[11px] leading-snug text-app-warning-300/80"
76
+ class="text-2xs leading-snug text-app-warning-300/80"
76
77
  data-testid="frontend-resolved-duplicates"
77
78
  >
78
79
  {{ t('inspector.frontendConfig.resolved.duplicateWarning', { vars: duplicates.join(', ') }) }}
@@ -82,7 +83,7 @@ const rows = computed(() => {
82
83
  <li
83
84
  v-for="row in rows"
84
85
  :key="row.envVar"
85
- class="flex items-baseline gap-1.5 text-[11px] leading-snug"
86
+ class="flex items-baseline gap-1.5 text-2xs leading-snug"
86
87
  data-testid="frontend-resolved-row"
87
88
  >
88
89
  <span
@@ -12,6 +12,7 @@ import type {
12
12
  } from '~/types/domain'
13
13
  import FrontendBindingsResolved from '~/components/panels/inspector/FrontendBindingsResolved.vue'
14
14
  import InspectorSection from '~/components/panels/inspector/InspectorSection.vue'
15
+ import IconButton from '~/components/common/IconButton.vue'
15
16
  import { apiErrorEnvelope } from '~/composables/api/errors'
16
17
 
17
18
  // Frontend-frame (`type: 'frontend'`) configuration: how to build, serve, and mock this
@@ -229,11 +230,11 @@ onUnmounted(() => preview.stopPolling(props.block.id))
229
230
  persisted until Apply. Only shown when the frame is linked to a repo. -->
230
231
  <div
231
232
  v-if="repoLink"
232
- class="space-y-2 rounded border border-default bg-default/40 p-2"
233
+ class="space-y-2 rounded-sm border border-default bg-default/40 p-2"
233
234
  data-testid="frontend-detect"
234
235
  >
235
236
  <div class="flex items-center justify-between gap-2">
236
- <span class="text-[11px] text-muted">{{ t('inspector.frontendConfig.detect.title') }}</span>
237
+ <span class="text-2xs text-muted">{{ t('inspector.frontendConfig.detect.title') }}</span>
237
238
  <UButton
238
239
  size="xs"
239
240
  variant="soft"
@@ -246,16 +247,16 @@ onUnmounted(() => preview.stopPolling(props.block.id))
246
247
  {{ t('inspector.frontendConfig.detect.button') }}
247
248
  </UButton>
248
249
  </div>
249
- <p class="text-[11px] leading-snug text-dimmed">
250
+ <p class="text-2xs leading-snug text-dimmed">
250
251
  {{ t('inspector.frontendConfig.detect.hint') }}
251
252
  </p>
252
253
 
253
- <p v-if="detectError" class="text-[11px] text-app-error-300/80">
254
+ <p v-if="detectError" class="text-2xs text-app-error-300/80">
254
255
  {{ detectError }}
255
256
  </p>
256
257
 
257
258
  <template v-if="detectResult && !detecting">
258
- <p v-if="!detectResult.detected" class="text-[11px] text-app-warning-300/80">
259
+ <p v-if="!detectResult.detected" class="text-2xs text-app-warning-300/80">
259
260
  {{ t('inspector.frontendConfig.detect.none') }}
260
261
  </p>
261
262
 
@@ -263,7 +264,7 @@ onUnmounted(() => preview.stopPolling(props.block.id))
263
264
  <li
264
265
  v-for="(n, i) in detectResult.notes"
265
266
  :key="i"
266
- class="flex items-start gap-1.5 text-[11px] leading-snug text-dimmed"
267
+ class="flex items-start gap-1.5 text-2xs leading-snug text-dimmed"
267
268
  >
268
269
  <span
269
270
  :class="
@@ -310,9 +311,7 @@ onUnmounted(() => preview.stopPolling(props.block.id))
310
311
  <!-- Build: package manager + frontend directory + install command + build script + output dir -->
311
312
  <InspectorSection v-model:open="showBuild" :title="t('inspector.frontendConfig.groups.build')">
312
313
  <div class="space-y-1">
313
- <span class="text-[11px] text-muted">{{
314
- t('inspector.frontendConfig.packageManager')
315
- }}</span>
314
+ <span class="text-2xs text-muted">{{ t('inspector.frontendConfig.packageManager') }}</span>
316
315
  <div class="flex flex-wrap gap-1">
317
316
  <UButton
318
317
  v-for="pm in PACKAGE_MANAGERS"
@@ -328,7 +327,7 @@ onUnmounted(() => preview.stopPolling(props.block.id))
328
327
  </div>
329
328
 
330
329
  <div class="space-y-1">
331
- <label class="text-[11px] text-muted">{{ t('inspector.frontendConfig.directory') }}</label>
330
+ <label class="text-2xs text-muted">{{ t('inspector.frontendConfig.directory') }}</label>
332
331
  <UInput
333
332
  :model-value="config.directory ?? ''"
334
333
  size="xs"
@@ -340,13 +339,13 @@ onUnmounted(() => preview.stopPolling(props.block.id))
340
339
  (e: KeyboardEvent) => saveText('directory', (e.target as HTMLInputElement).value)
341
340
  "
342
341
  />
343
- <p class="text-[11px] leading-snug text-dimmed">
342
+ <p class="text-2xs leading-snug text-dimmed">
344
343
  {{ t('inspector.frontendConfig.directoryHint') }}
345
344
  </p>
346
345
  </div>
347
346
 
348
347
  <div class="space-y-1">
349
- <label class="text-[11px] text-muted">{{
348
+ <label class="text-2xs text-muted">{{
350
349
  t('inspector.frontendConfig.installCommand')
351
350
  }}</label>
352
351
  <UInput
@@ -366,9 +365,7 @@ onUnmounted(() => preview.stopPolling(props.block.id))
366
365
 
367
366
  <div class="grid grid-cols-2 gap-2">
368
367
  <div class="space-y-1">
369
- <label class="text-[11px] text-muted">{{
370
- t('inspector.frontendConfig.buildScript')
371
- }}</label>
368
+ <label class="text-2xs text-muted">{{ t('inspector.frontendConfig.buildScript') }}</label>
372
369
  <UInput
373
370
  :model-value="config.buildScript ?? ''"
374
371
  size="xs"
@@ -382,9 +379,7 @@ onUnmounted(() => preview.stopPolling(props.block.id))
382
379
  />
383
380
  </div>
384
381
  <div class="space-y-1">
385
- <label class="text-[11px] text-muted">{{
386
- t('inspector.frontendConfig.outputDir')
387
- }}</label>
382
+ <label class="text-2xs text-muted">{{ t('inspector.frontendConfig.outputDir') }}</label>
388
383
  <UInput
389
384
  :model-value="config.outputDir ?? ''"
390
385
  size="xs"
@@ -403,7 +398,7 @@ onUnmounted(() => preview.stopPolling(props.block.id))
403
398
  <!-- Serve: mode (static vs command) + serve script (command mode) + port -->
404
399
  <InspectorSection v-model:open="showServe" :title="t('inspector.frontendConfig.groups.serve')">
405
400
  <div class="space-y-1">
406
- <span class="text-[11px] text-muted">{{ t('inspector.frontendConfig.serveMode') }}</span>
401
+ <span class="text-2xs text-muted">{{ t('inspector.frontendConfig.serveMode') }}</span>
407
402
  <div class="flex flex-wrap gap-1">
408
403
  <UButton
409
404
  :color="serveMode === 'static' ? 'primary' : 'neutral'"
@@ -423,23 +418,21 @@ onUnmounted(() => preview.stopPolling(props.block.id))
423
418
  </UButton>
424
419
  </div>
425
420
  <!-- Explain each mode, and disambiguate from the separate envInjection axis. -->
426
- <p class="text-[11px] leading-snug text-dimmed">
421
+ <p class="text-2xs leading-snug text-dimmed">
427
422
  <span class="text-muted">{{ t('inspector.frontendConfig.serveStatic') }}:</span>
428
423
  {{ t('inspector.frontendConfig.serveStaticDesc') }}
429
424
  </p>
430
- <p class="text-[11px] leading-snug text-dimmed">
425
+ <p class="text-2xs leading-snug text-dimmed">
431
426
  <span class="text-muted">{{ t('inspector.frontendConfig.serveCommand') }}:</span>
432
427
  {{ t('inspector.frontendConfig.serveCommandDesc') }}
433
428
  </p>
434
- <p class="text-[11px] leading-snug text-dimmed/80">
429
+ <p class="text-2xs leading-snug text-dimmed/80">
435
430
  {{ t('inspector.frontendConfig.serveEnvAxisNote') }}
436
431
  </p>
437
432
  </div>
438
433
 
439
434
  <div v-if="serveMode === 'command'" class="space-y-1">
440
- <label class="text-[11px] text-muted">{{
441
- t('inspector.frontendConfig.serveScript')
442
- }}</label>
435
+ <label class="text-2xs text-muted">{{ t('inspector.frontendConfig.serveScript') }}</label>
443
436
  <UInput
444
437
  :model-value="config.serveScript ?? ''"
445
438
  size="xs"
@@ -454,7 +447,7 @@ onUnmounted(() => preview.stopPolling(props.block.id))
454
447
  </div>
455
448
 
456
449
  <div class="space-y-1">
457
- <label class="text-[11px] text-muted">{{ t('inspector.frontendConfig.servePort') }}</label>
450
+ <label class="text-2xs text-muted">{{ t('inspector.frontendConfig.servePort') }}</label>
458
451
  <UInput
459
452
  :model-value="config.servePort != null ? String(config.servePort) : ''"
460
453
  type="number"
@@ -475,7 +468,7 @@ onUnmounted(() => preview.stopPolling(props.block.id))
475
468
  :title="t('inspector.frontendConfig.groups.mocking')"
476
469
  >
477
470
  <div class="space-y-1">
478
- <label class="text-[11px] text-muted">{{
471
+ <label class="text-2xs text-muted">{{
479
472
  t('inspector.frontendConfig.mockMappingsPath')
480
473
  }}</label>
481
474
  <UInput
@@ -491,7 +484,7 @@ onUnmounted(() => preview.stopPolling(props.block.id))
491
484
  (e: KeyboardEvent) => saveText('mockMappingsPath', (e.target as HTMLInputElement).value)
492
485
  "
493
486
  />
494
- <p class="text-[11px] leading-snug text-dimmed">
487
+ <p class="text-2xs leading-snug text-dimmed">
495
488
  {{ t('inspector.frontendConfig.mockMappingsHint') }}
496
489
  </p>
497
490
  </div>
@@ -521,7 +514,7 @@ onUnmounted(() => preview.stopPolling(props.block.id))
521
514
  {{ t('inspector.frontendConfig.envRuntime') }}
522
515
  </UButton>
523
516
  </div>
524
- <p class="text-[11px] leading-snug text-dimmed">
517
+ <p class="text-2xs leading-snug text-dimmed">
525
518
  {{ t('inspector.frontendConfig.envInjectionHint') }}
526
519
  </p>
527
520
  </div>
@@ -564,17 +557,17 @@ onUnmounted(() => preview.stopPolling(props.block.id))
564
557
  class="flex-1"
565
558
  @update:model-value="(v: string) => setBindingSource(i, v)"
566
559
  />
567
- <UButton
560
+ <IconButton
568
561
  size="xs"
569
562
  variant="ghost"
570
563
  color="neutral"
571
564
  icon="i-lucide-x"
572
- :title="t('inspector.frontendConfig.bindings.remove')"
565
+ :label="t('inspector.frontendConfig.bindings.remove')"
573
566
  @click="removeBinding(i)"
574
567
  />
575
568
  </div>
576
569
  </div>
577
- <div v-else class="text-[11px] text-dimmed">
570
+ <div v-else class="text-2xs text-dimmed">
578
571
  {{ t('inspector.frontendConfig.bindings.empty') }}
579
572
  </div>
580
573
 
@@ -603,7 +596,7 @@ onUnmounted(() => preview.stopPolling(props.block.id))
603
596
  save({ previewEnabled: v === true ? true : undefined })
604
597
  "
605
598
  />
606
- <p class="mt-1 text-[11px] leading-snug text-dimmed">
599
+ <p class="mt-1 text-2xs leading-snug text-dimmed">
607
600
  {{
608
601
  previewSupported
609
602
  ? t('inspector.frontendConfig.previewHint')
@@ -615,7 +608,7 @@ onUnmounted(() => preview.stopPolling(props.block.id))
615
608
  <div v-if="previewActive" class="mt-2 space-y-1.5" data-testid="preview-panel">
616
609
  <div class="flex items-center gap-2">
617
610
  <span
618
- class="text-[11px] font-medium"
611
+ class="text-2xs font-medium"
619
612
  :class="{
620
613
  'text-app-success-400': previewStatus === 'ready',
621
614
  'text-app-warning-400': previewStatus === 'starting',
@@ -671,7 +664,7 @@ onUnmounted(() => preview.stopPolling(props.block.id))
671
664
 
672
665
  <p
673
666
  v-if="previewStatus === 'failed' && previewState?.error"
674
- class="text-[11px] leading-snug text-app-error-400"
667
+ class="text-2xs leading-snug text-app-error-400"
675
668
  data-testid="preview-error"
676
669
  >
677
670
  {{ previewState.error }}
@@ -679,7 +672,7 @@ onUnmounted(() => preview.stopPolling(props.block.id))
679
672
 
680
673
  <p
681
674
  v-if="previewRequestError"
682
- class="text-[11px] leading-snug text-app-error-400"
675
+ class="text-2xs leading-snug text-app-error-400"
683
676
  data-testid="preview-request-error"
684
677
  >
685
678
  {{ previewRequestError }}
@@ -52,12 +52,12 @@ function control(action: 'pause' | 'resume' | 'cancel') {
52
52
  <UBadge color="primary" variant="subtle" size="sm">
53
53
  {{ t(INITIATIVE_STATUS_LABEL_KEYS[status]) }}
54
54
  </UBadge>
55
- <span v-if="progress" class="text-[11px] text-muted">
55
+ <span v-if="progress" class="text-2xs text-muted">
56
56
  {{ t('initiative.card.progress', { done: progress.settled, total: progress.total }) }}
57
57
  </span>
58
58
  </div>
59
59
 
60
- <p v-if="initiative?.goal" class="whitespace-pre-wrap text-[12px] text-toned">
60
+ <p v-if="initiative?.goal" class="whitespace-pre-wrap text-xs text-toned">
61
61
  {{ initiative.goal }}
62
62
  </p>
63
63
 
@@ -165,7 +165,7 @@ function control(action: 'pause' | 'resume' | 'cancel') {
165
165
  </UButton>
166
166
  </div>
167
167
 
168
- <p class="text-[11px] text-dimmed">
168
+ <p class="text-2xs text-dimmed">
169
169
  {{ t('initiative.inspector.hint') }}
170
170
  </p>
171
171
  </div>