@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
@@ -31,13 +31,14 @@ const { t } = useI18n()
31
31
  class="shrink-0 text-app-error-400"
32
32
  :class="dense ? 'h-3 w-3' : 'h-3.5 w-3.5'"
33
33
  />
34
- <a
34
+ <ULink
35
+ raw
35
36
  v-if="c.url"
36
- :href="c.url"
37
+ :to="c.url"
37
38
  target="_blank"
38
39
  rel="noopener"
39
40
  class="group min-w-0 flex-1 truncate text-app-info-300 hover:text-app-info-200 hover:underline"
40
- :class="dense ? 'text-[12px]' : 'text-[13px]'"
41
+ :class="dense ? 'text-xs' : 'text-sm'"
41
42
  :title="t('gates.ci.openOnGithub', { name: c.name })"
42
43
  >
43
44
  {{ c.name }}
@@ -45,16 +46,16 @@ const { t } = useI18n()
45
46
  name="i-lucide-external-link"
46
47
  class="ms-0.5 inline h-3 w-3 opacity-60 group-hover:opacity-100"
47
48
  />
48
- </a>
49
+ </ULink>
49
50
  <span
50
51
  v-else
51
52
  class="min-w-0 flex-1 truncate"
52
- :class="dense ? 'text-[12px] text-toned' : 'text-[13px] text-default'"
53
+ :class="dense ? 'text-xs text-toned' : 'text-sm text-default'"
53
54
  >{{ c.name }}</span
54
55
  >
55
56
  <span
56
57
  class="shrink-0 uppercase text-app-error-300"
57
- :class="dense ? 'text-[10px]' : 'text-[11px]'"
58
+ :class="dense ? 'text-3xs' : 'text-2xs'"
58
59
  >{{ c.conclusion ?? t('gates.ci.conclusionFallback') }}</span
59
60
  >
60
61
  </li>
@@ -13,6 +13,7 @@ import StepRunMeta from '~/components/panels/StepRunMeta.vue'
13
13
  import AttemptEntryHeader from '~/components/panels/AttemptEntryHeader.vue'
14
14
  import GateFailingCheckList from '~/components/gates/GateFailingCheckList.vue'
15
15
  import CopyButton from '~/components/common/CopyButton.vue'
16
+ import SectionLabel from '~/components/common/SectionLabel.vue'
16
17
 
17
18
  const board = useBoardStore()
18
19
  const execution = useExecutionStore()
@@ -218,7 +219,7 @@ const conflictVerdict = computed(() => {
218
219
  >
219
220
  <UIcon :name="meta.icon" class="h-8 w-8 opacity-40" />
220
221
  <p class="text-sm">{{ t('gates.noActivity') }}</p>
221
- <p class="max-w-sm text-[11px] text-dimmed">
222
+ <p class="max-w-sm text-2xs text-dimmed">
222
223
  {{ t('gates.noActivityHint') }}
223
224
  </p>
224
225
  </div>
@@ -233,7 +234,7 @@ const conflictVerdict = computed(() => {
233
234
  name="i-lucide-circle-check"
234
235
  class="mt-0.5 h-4 w-4 shrink-0 text-app-success-400"
235
236
  />
236
- <p class="text-[13px] leading-relaxed text-app-success-200">
237
+ <p class="text-sm leading-relaxed text-app-success-200">
237
238
  {{ step?.output || (isCi ? t('gates.passedCi') : t('gates.passedConflicts')) }}
238
239
  </p>
239
240
  </div>
@@ -244,7 +245,7 @@ const conflictVerdict = computed(() => {
244
245
  class="flex items-center gap-2 rounded-md border border-default bg-app-950/40 px-3 py-2"
245
246
  >
246
247
  <UIcon name="i-lucide-users" class="h-4 w-4 shrink-0 text-app-secondary-300" />
247
- <span class="text-[13px] text-default">
248
+ <span class="text-sm text-default">
248
249
  {{
249
250
  t(
250
251
  'gates.humanReview.approvals',
@@ -266,35 +267,38 @@ const conflictVerdict = computed(() => {
266
267
  class="relative mt-2 rounded-md border border-default bg-app-950/40 px-3 py-2"
267
268
  >
268
269
  <CopyButton :text="gate.lastFailureSummary" class="absolute end-1 top-1" />
269
- <p class="whitespace-pre-wrap pe-8 text-[12px] leading-relaxed text-toned">
270
+ <p class="whitespace-pre-wrap pe-8 text-xs leading-relaxed text-toned">
270
271
  {{ gate.lastFailureSummary }}
271
272
  </p>
272
273
  </div>
273
- <a
274
+ <ULink
275
+ raw
274
276
  v-if="prUrl"
275
- :href="prUrl"
277
+ :to="prUrl"
276
278
  target="_blank"
277
279
  rel="noopener"
278
- class="mt-2 inline-flex items-center gap-1 text-[12px] text-app-info-300 hover:text-app-info-200 hover:underline"
280
+ class="mt-2 inline-flex items-center gap-1 text-xs text-app-info-300 hover:text-app-info-200 hover:underline"
279
281
  >
280
282
  {{ t('gates.humanReview.reviewPr') }}
281
283
  <UIcon name="i-lucide-external-link" class="h-3 w-3" />
282
- </a>
284
+ </ULink>
283
285
 
284
286
  <!-- Freeform fix request: dispatch the fixer now with these instructions. -->
285
287
  <section v-if="status !== 'gave-up'" class="mt-4">
286
- <h3 class="mb-1.5 text-[11px] font-semibold uppercase tracking-wide text-dimmed">
288
+ <SectionLabel as="h3" class="mb-1.5">
287
289
  {{ t('gates.humanReview.requestFixHeading') }}
288
- </h3>
289
- <p class="mb-2 text-[11px] leading-relaxed text-dimmed">
290
+ </SectionLabel>
291
+ <p class="mb-2 text-2xs leading-relaxed text-dimmed">
290
292
  {{ t('gates.humanReview.requestFixDescription') }}
291
293
  </p>
292
- <textarea
294
+ <UTextarea
293
295
  v-model="fixInstructions"
294
- rows="3"
296
+ :rows="3"
295
297
  :disabled="fixBusy"
296
298
  :placeholder="t('gates.humanReview.requestFixPlaceholder')"
297
- class="w-full resize-y rounded-md border border-default bg-app-950/60 px-3 py-2 text-[13px] text-default placeholder:text-app-600 focus:border-app-secondary-500/60 focus:outline-none focus-visible:ring-2 focus-visible:ring-app-secondary-500/60"
299
+ size="sm"
300
+ class="w-full"
301
+ :ui="{ base: 'resize-y' }"
298
302
  />
299
303
  <div class="mt-2 flex justify-end">
300
304
  <UButton
@@ -316,49 +320,50 @@ const conflictVerdict = computed(() => {
316
320
 
317
321
  <!-- CI: failing checks -->
318
322
  <template v-else-if="isCi">
319
- <h3 class="mb-2 text-[11px] font-semibold uppercase tracking-wide text-dimmed">
323
+ <SectionLabel as="h3" class="mb-2">
320
324
  {{ t('gates.ci.failingChecks') }}
321
- </h3>
325
+ </SectionLabel>
322
326
  <GateFailingCheckList v-if="failingChecks.length" :checks="failingChecks" />
323
- <p v-else class="text-[13px] leading-relaxed text-toned">
327
+ <p v-else class="text-sm leading-relaxed text-toned">
324
328
  {{ gate.lastFailureSummary || t('gates.ci.failureFallback') }}
325
329
  </p>
326
330
  </template>
327
331
 
328
332
  <!-- Doc quality: the deterministic structural findings the gate raised -->
329
333
  <template v-else-if="isDocQuality">
330
- <h3 class="mb-2 text-[11px] font-semibold uppercase tracking-wide text-dimmed">
334
+ <SectionLabel as="h3" class="mb-2">
331
335
  {{ t('gates.docQuality.findings') }}
332
- </h3>
336
+ </SectionLabel>
333
337
  <div
334
338
  v-if="gate.lastFailureSummary"
335
339
  class="relative rounded-md border border-default bg-app-950/40 px-3 py-2"
336
340
  >
337
341
  <CopyButton :text="gate.lastFailureSummary" class="absolute end-1 top-1" />
338
- <p class="whitespace-pre-wrap pe-8 text-[12px] leading-relaxed text-toned">
342
+ <p class="whitespace-pre-wrap pe-8 text-xs leading-relaxed text-toned">
339
343
  {{ gate.lastFailureSummary }}
340
344
  </p>
341
345
  </div>
342
- <p v-else class="text-[13px] leading-relaxed text-toned">
346
+ <p v-else class="text-sm leading-relaxed text-toned">
343
347
  {{ t('gates.docQuality.findingsFallback') }}
344
348
  </p>
345
- <a
349
+ <ULink
350
+ raw
346
351
  v-if="prUrl"
347
- :href="prUrl"
352
+ :to="prUrl"
348
353
  target="_blank"
349
354
  rel="noopener"
350
- class="mt-2 inline-flex items-center gap-1 text-[12px] text-app-info-300 hover:text-app-info-200 hover:underline"
355
+ class="mt-2 inline-flex items-center gap-1 text-xs text-app-info-300 hover:text-app-info-200 hover:underline"
351
356
  >
352
357
  {{ t('gates.docQuality.viewPr') }}
353
358
  <UIcon name="i-lucide-external-link" class="h-3 w-3" />
354
- </a>
359
+ </ULink>
355
360
  </template>
356
361
 
357
362
  <!-- Conflicts: verdict + the resolver's account of what it left -->
358
363
  <template v-else>
359
- <h3 class="mb-2 text-[11px] font-semibold uppercase tracking-wide text-dimmed">
364
+ <SectionLabel as="h3" class="mb-2">
360
365
  {{ t('gates.conflicts.mergeability') }}
361
- </h3>
366
+ </SectionLabel>
362
367
  <div
363
368
  class="flex items-center gap-2 rounded-md border border-default bg-app-950/40 px-3 py-2"
364
369
  >
@@ -367,7 +372,7 @@ const conflictVerdict = computed(() => {
367
372
  class="h-4 w-4 shrink-0"
368
373
  :class="STATUS_META[status].text"
369
374
  />
370
- <span class="text-[13px] text-default">{{ conflictVerdict }}</span>
375
+ <span class="text-sm text-default">{{ conflictVerdict }}</span>
371
376
  </div>
372
377
  <!-- GitHub's API reports mergeability as a single bit (no file list), but the
373
378
  conflict resolver discovers the conflicting files in the container and
@@ -377,27 +382,28 @@ const conflictVerdict = computed(() => {
377
382
  class="relative mt-2 rounded-md border border-default bg-app-950/40 px-3 py-2"
378
383
  >
379
384
  <CopyButton :text="gate.lastFailureSummary" class="absolute end-1 top-1" />
380
- <p class="whitespace-pre-wrap pe-8 text-[12px] leading-relaxed text-toned">
385
+ <p class="whitespace-pre-wrap pe-8 text-xs leading-relaxed text-toned">
381
386
  {{ gate.lastFailureSummary }}
382
387
  </p>
383
388
  </div>
384
- <a
389
+ <ULink
390
+ raw
385
391
  v-if="prUrl"
386
- :href="prUrl"
392
+ :to="prUrl"
387
393
  target="_blank"
388
394
  rel="noopener"
389
- class="mt-2 inline-flex items-center gap-1 text-[12px] text-app-info-300 hover:text-app-info-200 hover:underline"
395
+ class="mt-2 inline-flex items-center gap-1 text-xs text-app-info-300 hover:text-app-info-200 hover:underline"
390
396
  >
391
397
  {{ t('gates.conflicts.viewPr') }}
392
398
  <UIcon name="i-lucide-external-link" class="h-3 w-3" />
393
- </a>
399
+ </ULink>
394
400
  </template>
395
401
 
396
402
  <!-- Attempt history (both gates): what each helper run did and how it ended. -->
397
403
  <section v-if="attempts.length" class="mt-5">
398
- <h3 class="mb-2 text-[11px] font-semibold uppercase tracking-wide text-dimmed">
404
+ <SectionLabel as="h3" class="mb-2">
399
405
  {{ t('gates.attemptsHeading', { helper: helperMeta.label }) }}
400
- </h3>
406
+ </SectionLabel>
401
407
  <ol class="space-y-2">
402
408
  <li
403
409
  v-for="a in attempts"
@@ -418,7 +424,7 @@ const conflictVerdict = computed(() => {
418
424
  v-if="a.instructions || (a.failingChecks && a.failingChecks.length)"
419
425
  class="mt-1.5"
420
426
  >
421
- <p class="text-[11px] text-dimmed">
427
+ <p class="text-2xs text-dimmed">
422
428
  {{ t('gates.attemptInstructions', { helper: helperMeta.label }) }}
423
429
  </p>
424
430
  <GateFailingCheckList
@@ -429,17 +435,17 @@ const conflictVerdict = computed(() => {
429
435
  />
430
436
  <p
431
437
  v-else-if="a.instructions"
432
- class="mt-1 whitespace-pre-wrap text-[12px] leading-relaxed text-toned"
438
+ class="mt-1 whitespace-pre-wrap text-xs leading-relaxed text-toned"
433
439
  >
434
440
  {{ a.instructions }}
435
441
  </p>
436
442
  </div>
437
443
  <!-- The helper's own report of what it did / what remains. -->
438
444
  <template v-if="a.summary">
439
- <p class="mt-1.5 text-[11px] text-dimmed">
445
+ <p class="mt-1.5 text-2xs text-dimmed">
440
446
  {{ t('gates.attemptReport', { helper: helperMeta.label }) }}
441
447
  </p>
442
- <p class="mt-1 whitespace-pre-wrap text-[12px] leading-relaxed text-muted">
448
+ <p class="mt-1 whitespace-pre-wrap text-xs leading-relaxed text-muted">
443
449
  {{ a.summary }}
444
450
  </p>
445
451
  </template>
@@ -454,10 +460,10 @@ const conflictVerdict = computed(() => {
454
460
  class="hidden w-60 shrink-0 flex-col gap-4 border-s border-default bg-default/50 px-4 py-4 lg:flex"
455
461
  >
456
462
  <div v-if="gate">
457
- <h4 class="mb-2 text-[11px] font-semibold uppercase tracking-wide text-dimmed">
463
+ <SectionLabel as="h4" class="mb-2">
458
464
  {{ t('gates.sidebar.state') }}
459
- </h4>
460
- <div class="flex items-center gap-2 text-[13px]">
465
+ </SectionLabel>
466
+ <div class="flex items-center gap-2 text-sm">
461
467
  <UIcon
462
468
  :name="STATUS_META[status].icon"
463
469
  class="h-4 w-4"
@@ -468,10 +474,10 @@ const conflictVerdict = computed(() => {
468
474
  </div>
469
475
 
470
476
  <div v-if="gate">
471
- <h4 class="mb-1 text-[11px] font-semibold uppercase tracking-wide text-dimmed">
477
+ <SectionLabel as="h4" class="mb-1">
472
478
  {{ helperMeta.label }}
473
- </h4>
474
- <p class="text-[12px] text-toned">
479
+ </SectionLabel>
480
+ <p class="text-xs text-toned">
475
481
  <!-- The human-review gate's budget is effectively unbounded (it waits for a human
476
482
  indefinitely), so render a plain round count rather than "0/9007199254740991". -->
477
483
  <template v-if="isHumanReview">
@@ -496,10 +502,10 @@ const conflictVerdict = computed(() => {
496
502
  </div>
497
503
 
498
504
  <div v-if="shortSha">
499
- <h4 class="mb-1 text-[11px] font-semibold uppercase tracking-wide text-dimmed">
505
+ <SectionLabel as="h4" class="mb-1">
500
506
  {{ t('gates.sidebar.gatedCommit') }}
501
- </h4>
502
- <p class="font-mono text-[12px] text-toned">{{ shortSha }}</p>
507
+ </SectionLabel>
508
+ <p class="font-mono text-xs text-toned">{{ shortSha }}</p>
503
509
  </div>
504
510
 
505
511
  <!-- Shared run metadata + embedded observability (model, run id, timing,
@@ -514,7 +520,7 @@ const conflictVerdict = computed(() => {
514
520
  :failure-at="instance?.failure?.occurredAt"
515
521
  />
516
522
 
517
- <p class="mt-auto text-[10px] leading-relaxed text-app-600">
523
+ <p class="mt-auto text-3xs leading-relaxed text-app-600">
518
524
  {{ t('gates.sidebar.footer', { helper: helperMeta.label }) }}
519
525
  </p>
520
526
  </aside>
@@ -27,6 +27,8 @@ import VcsConnectSurfaces from '~/components/vcs/VcsConnectSurfaces.vue'
27
27
  import ServiceTestConfig from '~/components/panels/inspector/ServiceTestConfig.vue'
28
28
  import ServiceFragments from '~/components/panels/inspector/ServiceFragments.vue'
29
29
  import { appInstallationManageUrl, VCS_PROVIDER_LABELS } from '~/utils/vcs'
30
+ import SectionLabel from '~/components/common/SectionLabel.vue'
31
+ import IconButton from '~/components/common/IconButton.vue'
30
32
 
31
33
  const { t } = useI18n()
32
34
 
@@ -548,24 +550,27 @@ function done() {
548
550
  <!-- the selection cart + the add action sit right beside the tree, so the
549
551
  picked services and the button that adds them are never scrolled apart -->
550
552
  <div class="space-y-2 rounded-md border border-default bg-app-950/40 p-2.5">
551
- <p class="text-[11px] font-semibold uppercase tracking-wide text-muted">
553
+ <SectionLabel as="p">
552
554
  {{ t('github.addService.selectedServices') }}
553
- </p>
555
+ </SectionLabel>
554
556
  <div v-if="selectedDirectories.length" class="flex flex-wrap gap-1.5">
555
557
  <span
556
558
  v-for="dir in selectedDirectories"
557
559
  :key="dir"
558
- class="inline-flex items-center gap-1 rounded bg-elevated px-2 py-0.5 text-xs text-default"
560
+ class="inline-flex items-center gap-1 rounded-sm bg-elevated px-2 py-0.5 text-xs text-default"
559
561
  >
560
562
  <code class="text-default">{{ dir }}</code>
561
- <button
562
- type="button"
563
- class="text-muted hover:text-app-100"
564
- :aria-label="t('github.addService.removeService', { directory: dir })"
563
+ <IconButton
564
+ color="neutral"
565
+ variant="ghost"
566
+ icon="i-lucide-x"
567
+ :label="t('github.addService.removeService', { directory: dir })"
568
+ :ui="{
569
+ base: 'p-0 text-muted hover:bg-transparent hover:text-app-100',
570
+ leadingIcon: 'h-3 w-3',
571
+ }"
565
572
  @click="removeSelected(dir)"
566
- >
567
- <UIcon name="i-lucide-x" class="h-3 w-3" />
568
- </button>
573
+ />
569
574
  </span>
570
575
  </div>
571
576
  <p v-else class="text-xs text-dimmed">
@@ -620,7 +625,7 @@ function done() {
620
625
  class="space-y-4 rounded-md border border-app-success-900/50 bg-app-success-950/20 p-3"
621
626
  >
622
627
  <div
623
- class="flex items-center gap-1.5 text-[11px] font-semibold uppercase tracking-wide text-app-success-400"
628
+ class="flex items-center gap-1.5 text-2xs font-semibold uppercase tracking-wide text-app-success-400"
624
629
  >
625
630
  <UIcon name="i-lucide-check" class="h-3.5 w-3.5" />
626
631
  {{ t('github.addService.addedConfigure', { title: configuredBlock.title }) }}
@@ -116,7 +116,7 @@ async function check() {
116
116
  <template>
117
117
  <section class="space-y-2" data-testid="branch-protection-preflight">
118
118
  <h3 class="text-sm font-semibold text-default">{{ t('vcs.branchProtection.heading') }}</h3>
119
- <p class="text-[11px] text-muted">{{ t('vcs.branchProtection.body') }}</p>
119
+ <p class="text-2xs text-muted">{{ t('vcs.branchProtection.body') }}</p>
120
120
 
121
121
  <UButton
122
122
  color="neutral"
@@ -146,7 +146,7 @@ async function check() {
146
146
  >
147
147
  {{ t('errors.generic.showDetail') }}
148
148
  </UButton>
149
- <p v-if="showFailureDetail" class="font-mono text-[10px] break-all text-dimmed">
149
+ <p v-if="showFailureDetail" class="font-mono text-3xs break-all text-dimmed">
150
150
  {{ failure.detail }}
151
151
  </p>
152
152
  </div>
@@ -182,11 +182,11 @@ async function check() {
182
182
  >
183
183
  <div class="flex items-baseline justify-between gap-2">
184
184
  <span class="font-mono text-xs text-toned">{{ row.owner }}/{{ row.name }}</span>
185
- <span class="text-[11px]" :class="STATE_STYLE[row.protection.state]">
185
+ <span class="text-2xs" :class="STATE_STYLE[row.protection.state]">
186
186
  {{ STATE_LABEL[row.protection.state]() }}
187
187
  </span>
188
188
  </div>
189
- <p class="text-[10px] text-dimmed">
189
+ <p class="text-3xs text-dimmed">
190
190
  {{ row.defaultBranch }}<span v-if="detailLine(row)"> — {{ detailLine(row) }}</span>
191
191
  </p>
192
192
  </li>
@@ -194,7 +194,7 @@ async function check() {
194
194
 
195
195
  <!-- A cap that truncated silently would read as "these are all your repositories", which
196
196
  on a security report is the same failure as calling an unprobed repo protected. -->
197
- <p v-if="report.omittedRepos > 0" class="text-[11px] text-app-warning-300">
197
+ <p v-if="report.omittedRepos > 0" class="text-2xs text-app-warning-300">
198
198
  {{ t('vcs.branchProtection.omitted', { count: report.omittedRepos }, report.omittedRepos) }}
199
199
  </p>
200
200
  </template>
@@ -6,6 +6,8 @@
6
6
  // successful connect the github store flips `connected`, which the host surfaces
7
7
  // react to. Shared by the GitHub panel and the bootstrap modal so the connect
8
8
  // flow lives in one place.
9
+ import SectionLabel from '~/components/common/SectionLabel.vue'
10
+
9
11
  const { t } = useI18n()
10
12
  const github = useGitHubStore()
11
13
  const toast = useToast()
@@ -73,9 +75,9 @@ async function connectManually() {
73
75
  <!-- discovered installations: pick one the App is already on -->
74
76
  <section class="space-y-2">
75
77
  <div class="flex items-center justify-between">
76
- <span class="text-xs font-medium uppercase tracking-wide text-dimmed">
78
+ <SectionLabel as="span">
77
79
  {{ t('github.connect.yourInstallations') }}
78
- </span>
80
+ </SectionLabel>
79
81
  <UButton
80
82
  size="xs"
81
83
  color="neutral"
@@ -118,7 +120,7 @@ async function connectManually() {
118
120
  <UIcon v-else name="i-lucide-github" class="h-4 w-4 text-muted" />
119
121
  <div class="min-w-0">
120
122
  <div class="truncate text-sm text-default">{{ inst.accountLogin }}</div>
121
- <div class="text-[11px] text-dimmed">
123
+ <div class="text-2xs text-dimmed">
122
124
  {{
123
125
  t('github.connect.installationMeta', {
124
126
  targetType: inst.targetType,
@@ -44,9 +44,14 @@ const title = computed(() =>
44
44
  class="mt-6 border-t border-default pt-4 text-center text-xs text-dimmed"
45
45
  >
46
46
  {{ t('github.onboarding.signedInAs', { login: auth.user.login }) }} ·
47
- <button class="text-toned underline-offset-2 hover:underline" @click="auth.logout()">
47
+ <UButton
48
+ color="neutral"
49
+ variant="link"
50
+ class="p-0 text-xs text-toned underline-offset-2 hover:underline"
51
+ @click="auth.logout()"
52
+ >
48
53
  {{ t('github.onboarding.signOut') }}
49
- </button>
54
+ </UButton>
50
55
  </p>
51
56
  </div>
52
57
  </div>
@@ -11,6 +11,7 @@ import BranchProtectionPreflight from './BranchProtectionPreflight.vue'
11
11
  import VcsConnectSurfaces from '~/components/vcs/VcsConnectSurfaces.vue'
12
12
  import IntegrationBackTitle from '~/components/layout/IntegrationBackTitle.vue'
13
13
  import { VCS_PROVIDER_ICONS, VCS_PROVIDER_LABELS } from '~/utils/vcs'
14
+ import SectionLabel from '~/components/common/SectionLabel.vue'
14
15
 
15
16
  const { t } = useI18n()
16
17
  const ui = useUiStore()
@@ -317,7 +318,7 @@ async function merge(pr: GitHubPullRequest) {
317
318
  <div class="truncate text-sm text-default">
318
319
  {{ github.connection?.accountLogin }}
319
320
  </div>
320
- <div class="text-[11px] text-dimmed">{{ connectionMeta }}</div>
321
+ <div class="text-2xs text-dimmed">{{ connectionMeta }}</div>
321
322
  </div>
322
323
  </div>
323
324
  <div class="flex items-center gap-1">
@@ -380,9 +381,9 @@ async function merge(pr: GitHubPullRequest) {
380
381
  <section v-else-if="tab === 'repos'" class="space-y-2">
381
382
  <!-- manage which repos this board links -->
382
383
  <div class="flex items-center justify-between">
383
- <span class="text-[11px] uppercase tracking-wide text-dimmed">
384
+ <SectionLabel as="span">
384
385
  {{ t('github.panel.linkedToBoard') }}
385
- </span>
386
+ </SectionLabel>
386
387
  <UButton
387
388
  size="xs"
388
389
  color="neutral"
@@ -399,7 +400,7 @@ async function merge(pr: GitHubPullRequest) {
399
400
  </div>
400
401
 
401
402
  <div v-if="managing" class="space-y-2 rounded-md border border-muted bg-default/80 p-3">
402
- <p class="text-[12px] text-muted">
403
+ <p class="text-xs text-muted">
403
404
  {{
404
405
  isAppConnection ? t('vcs.panel.manageHintApp') : t('vcs.panel.manageHintToken')
405
406
  }}
@@ -419,11 +420,12 @@ async function merge(pr: GitHubPullRequest) {
419
420
  }}
420
421
  </p>
421
422
  <div v-else class="max-h-64 space-y-1 overflow-y-auto">
422
- <button
423
+ <UButton
424
+ color="neutral"
425
+ variant="ghost"
423
426
  v-for="r in github.availableRepos"
424
427
  :key="r.githubId"
425
- type="button"
426
- class="flex w-full items-center gap-2 rounded px-2 py-1.5 text-start transition hover:bg-elevated/60"
428
+ class="flex w-full items-center gap-2 rounded-sm px-2 py-1.5 text-start transition hover:bg-elevated/60"
427
429
  @click="toggleSelected(r.githubId)"
428
430
  >
429
431
  <UIcon
@@ -435,7 +437,7 @@ async function merge(pr: GitHubPullRequest) {
435
437
  <UBadge v-if="r.private" color="neutral" variant="subtle" size="sm">
436
438
  {{ t('github.panel.private') }}
437
439
  </UBadge>
438
- </button>
440
+ </UButton>
439
441
  </div>
440
442
  <div class="flex items-center justify-end gap-2 pt-1">
441
443
  <UButton
@@ -483,8 +485,10 @@ async function merge(pr: GitHubPullRequest) {
483
485
  class="rounded-md border border-default bg-default/60"
484
486
  >
485
487
  <div class="flex items-center justify-between gap-2 px-3 py-2">
486
- <button
487
- class="flex min-w-0 items-center gap-2 text-start"
488
+ <UButton
489
+ color="neutral"
490
+ variant="ghost"
491
+ class="flex min-w-0 items-center gap-2 p-0 text-start hover:bg-transparent"
488
492
  @click="toggleRepo(repo)"
489
493
  >
490
494
  <UIcon
@@ -501,15 +505,15 @@ async function merge(pr: GitHubPullRequest) {
501
505
  <UBadge v-if="repo.private" color="neutral" variant="subtle" size="sm">
502
506
  {{ t('github.panel.private') }}
503
507
  </UBadge>
504
- </button>
508
+ </UButton>
505
509
  <div class="flex items-center gap-2">
506
- <span v-if="repo.defaultBranch" class="text-[11px] text-dimmed">
510
+ <span v-if="repo.defaultBranch" class="text-2xs text-dimmed">
507
511
  {{ repo.defaultBranch }}
508
512
  </span>
509
513
  <ULink
510
514
  :to="github.repoUrl(repo.githubId) ?? '#'"
511
515
  target="_blank"
512
- class="text-[11px] text-primary hover:underline"
516
+ class="text-2xs text-primary hover:underline"
513
517
  >
514
518
  {{ t('github.panel.open') }}
515
519
  </ULink>
@@ -523,7 +527,7 @@ async function merge(pr: GitHubPullRequest) {
523
527
  <div
524
528
  v-for="b in github.branches[repo.githubId] ?? []"
525
529
  :key="b.name"
526
- class="flex items-center justify-between gap-2 text-[12px]"
530
+ class="flex items-center justify-between gap-2 text-xs"
527
531
  >
528
532
  <span class="flex items-center gap-1.5 truncate text-toned">
529
533
  <UIcon name="i-lucide-git-branch" class="h-3.5 w-3.5 text-dimmed" />
@@ -532,7 +536,7 @@ async function merge(pr: GitHubPullRequest) {
532
536
  {{ t('github.panel.protected') }}
533
537
  </UBadge>
534
538
  </span>
535
- <code class="text-[10px] text-dimmed">{{ b.headSha.slice(0, 7) }}</code>
539
+ <code class="text-3xs text-dimmed">{{ b.headSha.slice(0, 7) }}</code>
536
540
  </div>
537
541
 
538
542
  <!-- new branch -->
@@ -644,7 +648,7 @@ async function merge(pr: GitHubPullRequest) {
644
648
  <div class="truncate text-sm text-default">
645
649
  <span class="text-dimmed">#{{ pr.number }}</span> {{ pr.title }}
646
650
  </div>
647
- <div class="truncate text-[11px] text-dimmed">
651
+ <div class="truncate text-2xs text-dimmed">
648
652
  {{ github.repoFor(pr.repoGithubId)?.name }} · {{ pr.headRef }} → {{ pr.baseRef }}
649
653
  </div>
650
654
  </div>
@@ -669,7 +673,7 @@ async function merge(pr: GitHubPullRequest) {
669
673
  <ULink
670
674
  :to="github.pullUrl(pr) ?? '#'"
671
675
  target="_blank"
672
- class="text-[11px] text-primary hover:underline"
676
+ class="text-2xs text-primary hover:underline"
673
677
  >
674
678
  {{ t('github.panel.open') }}
675
679
  </ULink>
@@ -691,7 +695,7 @@ async function merge(pr: GitHubPullRequest) {
691
695
  <div class="truncate text-sm text-default">
692
696
  <span class="text-dimmed">#{{ issue.number }}</span> {{ issue.title }}
693
697
  </div>
694
- <div class="truncate text-[11px] text-dimmed">
698
+ <div class="truncate text-2xs text-dimmed">
695
699
  {{ github.repoFor(issue.repoGithubId)?.name }}
696
700
  <span v-if="issue.labels.length">· {{ issue.labels.join(', ') }}</span>
697
701
  </div>
@@ -707,7 +711,7 @@ async function merge(pr: GitHubPullRequest) {
707
711
  <ULink
708
712
  :to="github.issueUrl(issue) ?? '#'"
709
713
  target="_blank"
710
- class="text-[11px] text-primary hover:underline"
714
+ class="text-2xs text-primary hover:underline"
711
715
  >
712
716
  {{ t('github.panel.open') }}
713
717
  </ULink>