@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
@@ -14,6 +14,7 @@ import ImageCompare from '~/components/media/ImageCompare.vue'
14
14
  import ArtifactLightbox from '~/components/media/ArtifactLightbox.vue'
15
15
  import ResultWindowShell from '~/components/panels/ResultWindowShell.vue'
16
16
  import StepRunMeta from '~/components/panels/StepRunMeta.vue'
17
+ import SectionLabel from '~/components/common/SectionLabel.vue'
17
18
 
18
19
  const board = useBoardStore()
19
20
  const execution = useExecutionStore()
@@ -203,21 +204,23 @@ async function uploadFor(view: string, file: File) {
203
204
  await visualConfirm.uploadReference(blockId.value, file, view)
204
205
  }
205
206
  const uploadView = ref('')
206
- const fileInput = ref<HTMLInputElement | null>(null)
207
- async function onFilePicked(e: Event) {
208
- const input = e.target as HTMLInputElement
209
- const file = input.files?.[0]
207
+ // The views this run already captured, offered as suggestions on the combobox.
208
+ const viewSuggestions = computed(() => pairs.value.map((p) => p.view))
209
+ const pendingUpload = ref<File | null>(null)
210
+ watch(pendingUpload, async (file) => {
210
211
  const view = uploadView.value.trim()
211
212
  // Require a view name: a reference with no view can't pair with any captured screenshot,
212
- // so it would be silently orphaned. The input is also disabled until a view is entered.
213
+ // so it would be silently orphaned. The control is also disabled until a view is entered.
213
214
  if (!file || !blockId.value || !view) {
214
- if (fileInput.value) fileInput.value.value = ''
215
+ pendingUpload.value = null
215
216
  return
216
217
  }
217
218
  await visualConfirm.uploadReference(blockId.value, file, view)
218
219
  uploadView.value = ''
219
- if (fileInput.value) fileInput.value.value = ''
220
- }
220
+ // Cleared so a fresh pick is a fresh file. `UFileUpload` carries `reset` for the other half of
221
+ // this: without it the native input keeps its value and the SAME file fires no change event.
222
+ pendingUpload.value = null
223
+ })
221
224
  </script>
222
225
 
223
226
  <template>
@@ -242,7 +245,7 @@ async function onFilePicked(e: Event) {
242
245
  <template v-else>
243
246
  <p
244
247
  v-if="vc.degradedReason"
245
- class="rounded-lg border border-app-warning-700/40 bg-app-warning-500/5 px-3 py-2 text-[12px] text-app-warning-300/90"
248
+ class="rounded-lg border border-app-warning-700/40 bg-app-warning-500/5 px-3 py-2 text-xs text-app-warning-300/90"
246
249
  >
247
250
  {{ vc.degradedReason }}
248
251
  </p>
@@ -251,7 +254,7 @@ async function onFilePicked(e: Event) {
251
254
  reference the reviewer is judging against is never anonymous. -->
252
255
  <section
253
256
  v-if="design"
254
- class="rounded-lg border border-default bg-default/60 px-3 py-2 text-[12px] text-toned"
257
+ class="rounded-lg border border-default bg-default/60 px-3 py-2 text-xs text-toned"
255
258
  >
256
259
  <p class="flex items-center gap-1.5">
257
260
  <UIcon name="i-lucide-figma" class="h-3.5 w-3.5 shrink-0 text-app-warning-300" />
@@ -265,10 +268,7 @@ async function onFilePicked(e: Event) {
265
268
  <!-- One line per short design, carrying both ways it can fall short: what its source
266
269
  kept, and what this gallery's shared ceiling cut from it. A design the ceiling shut
267
270
  out entirely reads as one with no frames unless it is named here. -->
268
- <ul
269
- v-if="design.gaps?.length"
270
- class="mt-1.5 space-y-1 text-[11px] text-app-warning-300/90"
271
- >
271
+ <ul v-if="design.gaps?.length" class="mt-1.5 space-y-1 text-2xs text-app-warning-300/90">
272
272
  <li v-for="gap in design.gaps" :key="`${gap.title}-${gap.reason ?? 'capped'}`">
273
273
  {{ t('visualConfirm.design.gapLine', { title: gap.title }) }}
274
274
  <template v-if="gap.reason">{{ DESIGN_GAP_LABELS[gap.reason] }}</template>
@@ -281,7 +281,7 @@ async function onFilePicked(e: Event) {
281
281
 
282
282
  <p
283
283
  v-if="working"
284
- class="flex items-center gap-2 rounded-lg border border-default bg-app-950/40 px-3 py-2 text-[12px] text-toned"
284
+ class="flex items-center gap-2 rounded-lg border border-default bg-app-950/40 px-3 py-2 text-xs text-toned"
285
285
  >
286
286
  <UIcon name="i-lucide-loader" class="h-3.5 w-3.5 animate-spin text-app-warning-300" />
287
287
  {{ phase ? PHASE_LABEL[phase] : '' }}
@@ -303,8 +303,10 @@ async function onFilePicked(e: Event) {
303
303
  />
304
304
  <!-- Per-view note (folded into the fixer findings) -->
305
305
  <div v-if="awaitingHuman" class="px-1">
306
- <button
307
- class="flex items-center gap-1.5 text-[11px] text-muted hover:text-default"
306
+ <UButton
307
+ color="neutral"
308
+ variant="ghost"
309
+ class="flex items-center gap-1.5 p-0 text-2xs text-muted hover:bg-transparent hover:text-default"
308
310
  @click="noteOpen[p.view] = !noteOpen[p.view]"
309
311
  >
310
312
  <UIcon
@@ -314,49 +316,71 @@ async function onFilePicked(e: Event) {
314
316
  {{ t('visualConfirm.noteIssue', { view: p.view }) }}
315
317
  <span
316
318
  v-if="perViewNotes[p.view]?.trim()"
317
- class="rounded-full bg-app-warning-500/15 px-1.5 text-[9px] text-app-warning-300"
319
+ class="rounded-full bg-app-warning-500/15 px-1.5 text-3xs text-app-warning-300"
318
320
  >{{ t('visualConfirm.noted') }}</span
319
321
  >
320
- </button>
321
- <textarea
322
+ </UButton>
323
+ <UTextarea
322
324
  v-if="noteOpen[p.view]"
323
325
  v-model="perViewNotes[p.view]"
324
- rows="2"
326
+ :rows="2"
325
327
  :placeholder="t('visualConfirm.notePlaceholder', { view: p.view })"
326
- class="mt-1 w-full rounded-md border border-muted bg-app-950 px-2 py-1.5 text-[12px] text-default placeholder:text-app-600 focus:border-app-warning-500 focus:outline-none focus-visible:ring-2 focus-visible:ring-app-warning-500/60"
328
+ size="xs"
329
+ class="mt-1 w-full"
327
330
  />
328
331
  </div>
329
332
  </div>
330
333
  </section>
331
- <p v-else class="text-[12px] italic text-dimmed">
334
+ <p v-else class="text-xs italic text-dimmed">
332
335
  {{ t('visualConfirm.noScreenshots') }}
333
336
  </p>
334
337
 
335
338
  <!-- Upload a reference for any view -->
336
339
  <section class="rounded-lg border border-default bg-default/60 p-3">
337
- <h3 class="mb-2 text-[11px] font-semibold uppercase tracking-wide text-dimmed">
340
+ <SectionLabel as="h3" class="mb-2">
338
341
  {{ t('visualConfirm.upload.heading') }}
339
- </h3>
342
+ </SectionLabel>
340
343
  <div class="flex flex-wrap items-center gap-2">
341
- <input
344
+ <!-- The known views are suggestions, not a closed list: a reference can be uploaded
345
+ for a view the run has not produced yet, which is the case this field exists for.
346
+ `mode="autocomplete"` is what makes that work: the DEFAULT combobox mode writes
347
+ its model only when something is SELECTED, so typing a new view name would leave
348
+ `uploadView` empty and the picker beside it disabled. -->
349
+ <UInputMenu
342
350
  v-model="uploadView"
343
- list="vc-views"
351
+ mode="autocomplete"
352
+ :items="viewSuggestions"
353
+ size="xs"
344
354
  :placeholder="t('visualConfirm.upload.viewPlaceholder')"
345
- class="rounded-md border border-muted bg-app-950 px-2 py-1 text-[12px] text-default placeholder:text-app-600"
346
355
  />
347
- <datalist id="vc-views">
348
- <option v-for="p in pairs" :key="p.view" :value="p.view" />
349
- </datalist>
350
- <input
351
- ref="fileInput"
352
- type="file"
356
+ <!-- `reset` so the native input is cleared on every open: re-picking the SAME file
357
+ after a rejected or completed upload otherwise fires no change event at all. -->
358
+ <!-- The trigger is our OWN button in the default slot, not `variant="button"`:
359
+ that variant renders the icon alone and drops `label` on the floor, so the
360
+ control reached a screen reader with no name at all. -->
361
+ <UFileUpload
362
+ v-model="pendingUpload"
363
+ size="xs"
364
+ reset
353
365
  accept="image/png,image/jpeg"
366
+ :preview="false"
354
367
  :disabled="busy || !uploadView.trim()"
355
- class="text-[12px] text-toned file:me-2 file:rounded file:border-0 file:bg-elevated file:px-2 file:py-1 file:text-default disabled:opacity-40"
356
- @change="onFilePicked"
357
- />
368
+ class="w-fit"
369
+ >
370
+ <template #default="{ open }">
371
+ <UButton
372
+ color="neutral"
373
+ variant="soft"
374
+ size="xs"
375
+ icon="i-lucide-upload"
376
+ :disabled="busy || !uploadView.trim()"
377
+ :label="t('visualConfirm.upload.choose')"
378
+ @click="open()"
379
+ />
380
+ </template>
381
+ </UFileUpload>
358
382
  </div>
359
- <p class="mt-1.5 text-[10px] text-app-600">
383
+ <p class="mt-1.5 text-3xs text-app-600">
360
384
  {{
361
385
  uploadView.trim()
362
386
  ? t('visualConfirm.upload.tipReady')
@@ -367,17 +391,18 @@ async function onFilePicked(e: Event) {
367
391
 
368
392
  <!-- Request fix -->
369
393
  <section v-if="awaitingHuman" class="rounded-lg border border-default bg-default/60 p-3">
370
- <h3 class="mb-2 text-[11px] font-semibold uppercase tracking-wide text-dimmed">
394
+ <SectionLabel as="h3" class="mb-2">
371
395
  {{ t('visualConfirm.requestFix.heading') }}
372
- </h3>
373
- <textarea
396
+ </SectionLabel>
397
+ <UTextarea
374
398
  v-model="globalFindings"
375
- rows="3"
399
+ :rows="3"
376
400
  :placeholder="t('visualConfirm.requestFix.placeholder')"
377
- class="w-full rounded-md border border-muted bg-app-950 px-3 py-2 text-[13px] text-default placeholder:text-app-600 focus:border-app-warning-500 focus:outline-none focus-visible:ring-2 focus-visible:ring-app-warning-500/60"
401
+ size="sm"
402
+ class="w-full"
378
403
  />
379
404
  <div class="mt-2 flex items-center justify-between">
380
- <span class="text-[11px] text-dimmed">
405
+ <span class="text-2xs text-dimmed">
381
406
  {{ t('visualConfirm.requestFix.foldedHint') }}
382
407
  </span>
383
408
  <UButton
@@ -399,16 +424,16 @@ async function onFilePicked(e: Event) {
399
424
  v-if="vc.rounds && vc.rounds.length"
400
425
  class="rounded-lg border border-default bg-default/60 p-3"
401
426
  >
402
- <h3 class="mb-2 text-[11px] font-semibold uppercase tracking-wide text-dimmed">
427
+ <SectionLabel as="h3" class="mb-2">
403
428
  {{ t('visualConfirm.history.heading', { count: vc.attempts }, vc.attempts) }}
404
- </h3>
429
+ </SectionLabel>
405
430
  <ol class="space-y-2">
406
- <li v-for="(r, i) in vc.rounds" :key="i" class="flex items-start gap-2 text-[12px]">
431
+ <li v-for="(r, i) in vc.rounds" :key="i" class="flex items-start gap-2 text-xs">
407
432
  <UIcon name="i-lucide-wrench" class="mt-0.5 h-3.5 w-3.5 shrink-0 text-muted" />
408
433
  <div class="min-w-0 flex-1">
409
434
  <span class="text-default">{{ t('visualConfirm.history.fixRequested') }}</span>
410
435
  <span
411
- class="ms-1.5 rounded px-1 text-[10px] uppercase"
436
+ class="ms-1.5 rounded-sm px-1 text-3xs uppercase"
412
437
  :class="
413
438
  r.outcome === 'completed'
414
439
  ? 'bg-app-success-500/15 text-app-success-300'
@@ -445,13 +470,13 @@ async function onFilePicked(e: Event) {
445
470
  :failure-at="instance?.failure?.occurredAt"
446
471
  />
447
472
  <div class="flex items-center gap-2">
448
- <label
473
+ <UCheckbox
449
474
  v-if="awaitingHuman && needsAck"
450
- class="flex items-center gap-1.5 text-[11px] text-app-warning-300/90"
451
- >
452
- <input v-model="ackDegraded" type="checkbox" class="accent-app-warning-500" />
453
- {{ t('visualConfirm.reviewedManually') }}
454
- </label>
475
+ v-model="ackDegraded"
476
+ size="xs"
477
+ color="warning"
478
+ :label="t('visualConfirm.reviewedManually')"
479
+ />
455
480
  <UButton
456
481
  size="sm"
457
482
  variant="soft"
@@ -1,4 +1,4 @@
1
- import type { ThemeDoc } from '~/utils/theme/doc'
1
+ import { THEME_DEFAULTS, type ThemeDoc } from '~/utils/theme/doc'
2
2
  import { presets } from '~/utils/theme/presets'
3
3
 
4
4
  /**
@@ -24,12 +24,18 @@ export const DEFAULT_THEME_ID = 'cat-factory'
24
24
  * Status hues are the app's long-standing choices (amber for warning, rose for error, emerald
25
25
  * for success, sky for info, violet for the secondary accent), named here as aliases so a theme
26
26
  * that recolours `warning` recolours every warning surface.
27
+ *
28
+ * `radius` is stated even though it equals `THEME_DEFAULTS.radius`, so the value every surface in
29
+ * the app derives from has one visible home. It writes no CSS at that value (`css.ts` skips a
30
+ * default), which is the point: changing the number here is the whole edit, and Nuxt UI's
31
+ * `--radius-*` scale carries it to every `rounded-*` step (issue #2251).
27
32
  */
28
33
  export const CAT_FACTORY_THEME: NamedTheme = {
29
34
  id: DEFAULT_THEME_ID,
30
35
  name: 'Cat Factory',
31
36
  doc: {
32
37
  version: 1,
38
+ radius: THEME_DEFAULTS.radius,
33
39
  colors: {
34
40
  primary: 'indigo',
35
41
  secondary: 'violet',
@@ -3455,7 +3455,8 @@
3455
3455
  "pastedLink": {
3456
3456
  "offer": "Diese Beschreibung verlinkt eine {source}-Seite. Als Kontext anhängen?",
3457
3457
  "attach": "Anhängen"
3458
- }
3458
+ },
3459
+ "removePending": "{name} entfernen"
3459
3460
  },
3460
3461
  "providers": {
3461
3462
  "presetMismatch": {
@@ -4939,7 +4940,8 @@
4939
4940
  "releaseInteractive": "Nicht mehr Standard in der App",
4940
4941
  "claimUnattended": "Als Standard ohne Aufsicht festlegen",
4941
4942
  "releaseUnattended": "Nicht mehr Standard ohne Aufsicht"
4942
- }
4943
+ },
4944
+ "removeLabel": "Label {label} entfernen"
4943
4945
  },
4944
4946
  "progress": {
4945
4947
  "status": {
@@ -7122,7 +7124,8 @@
7122
7124
  "heading": "Ein Referenzdesign hochladen",
7123
7125
  "viewPlaceholder": "Ansichtsname (z. B. login)",
7124
7126
  "tipReady": "Tipp: Ziehe ein Bild direkt auf ein Paar oben, um dessen Referenz festzulegen.",
7125
- "tipNeedView": "Gib zuerst einen Ansichtsnamen ein und wähle dann eine Datei. Oder ziehe ein Bild direkt auf ein Paar oben."
7127
+ "tipNeedView": "Gib zuerst einen Ansichtsnamen ein und wähle dann eine Datei. Oder ziehe ein Bild direkt auf ein Paar oben.",
7128
+ "choose": "Datei auswählen"
7126
7129
  },
7127
7130
  "requestFix": {
7128
7131
  "heading": "Eine Korrektur anfordern",
@@ -8522,6 +8525,7 @@
8522
8525
  "title": "Erzeugte Kandidaten",
8523
8526
  "titleWithBlock": "Erzeugte Kandidaten: {title}",
8524
8527
  "subtitle": "Vergleiche, was jede Integration erzeugt hat, und behalte, was du willst",
8528
+ "pickOne": "Wähle einen aus. Die Auswahl eines Kandidaten hebt die vorherige auf.",
8525
8529
  "automatic": "Es wurde nur ein Kandidat erzeugt, daher wurde er automatisch behalten. Niemand hat ihn geprüft.",
8526
8530
  "unlabelledSubject": "Kein Motiv angegeben",
8527
8531
  "noPreview": "Keine Vorschau verfügbar",
@@ -671,7 +671,8 @@
671
671
  "pastedLink": {
672
672
  "offer": "This description links a {source} page. Attach it as context?",
673
673
  "attach": "Attach"
674
- }
674
+ },
675
+ "removePending": "Remove {name}"
675
676
  },
676
677
  "errors": {
677
678
  "generic": {
@@ -5671,7 +5672,8 @@
5671
5672
  "releaseInteractive": "Stop being the in-app default",
5672
5673
  "claimUnattended": "Make the unattended default",
5673
5674
  "releaseUnattended": "Stop being the unattended default"
5674
- }
5675
+ },
5676
+ "removeLabel": "Remove the {label} label"
5675
5677
  },
5676
5678
  "progress": {
5677
5679
  "status": {
@@ -6723,7 +6725,8 @@
6723
6725
  "heading": "Upload a reference design",
6724
6726
  "viewPlaceholder": "View name (e.g. login)",
6725
6727
  "tipReady": "Tip: drop an image straight onto a pair above to set its reference.",
6726
- "tipNeedView": "Enter a view name first, then choose a file. Or drop an image straight onto a pair above."
6728
+ "tipNeedView": "Enter a view name first, then choose a file. Or drop an image straight onto a pair above.",
6729
+ "choose": "Choose a file"
6727
6730
  },
6728
6731
  "requestFix": {
6729
6732
  "heading": "Request a fix",
@@ -8844,6 +8847,7 @@
8844
8847
  "title": "Generated candidates",
8845
8848
  "titleWithBlock": "Generated candidates: {title}",
8846
8849
  "subtitle": "Compare what each integration produced, and keep what you want",
8850
+ "pickOne": "Pick one. Choosing a candidate clears the one picked before.",
8847
8851
  "automatic": "Only one candidate was generated, so it was kept automatically. Nobody reviewed it.",
8848
8852
  "unlabelledSubject": "No subject declared",
8849
8853
  "noPreview": "No preview available",
@@ -608,7 +608,8 @@
608
608
  "pastedLink": {
609
609
  "offer": "Esta descripción enlaza una página de {source}. ¿Adjuntarla como contexto?",
610
610
  "attach": "Adjuntar"
611
- }
611
+ },
612
+ "removePending": "Quitar {name}"
612
613
  },
613
614
  "errors": {
614
615
  "generic": {
@@ -5468,7 +5469,8 @@
5468
5469
  "releaseInteractive": "Dejar de ser la predeterminada en la app",
5469
5470
  "claimUnattended": "Hacer predeterminada sin supervisión",
5470
5471
  "releaseUnattended": "Dejar de ser la predeterminada sin supervisión"
5471
- }
5472
+ },
5473
+ "removeLabel": "Quitar la etiqueta {label}"
5472
5474
  },
5473
5475
  "progress": {
5474
5476
  "status": {
@@ -6392,7 +6394,8 @@
6392
6394
  "heading": "Subir un diseño de referencia",
6393
6395
  "viewPlaceholder": "Nombre de la vista (p. ej. login)",
6394
6396
  "tipReady": "Consejo: arrastra una imagen directamente sobre un par de arriba para establecer su referencia.",
6395
- "tipNeedView": "Introduce primero un nombre de vista y luego elige un archivo. O arrastra una imagen directamente sobre un par de arriba."
6397
+ "tipNeedView": "Introduce primero un nombre de vista y luego elige un archivo. O arrastra una imagen directamente sobre un par de arriba.",
6398
+ "choose": "Elegir un archivo"
6396
6399
  },
6397
6400
  "requestFix": {
6398
6401
  "heading": "Solicitar una corrección",
@@ -8522,6 +8525,7 @@
8522
8525
  "title": "Candidatos generados",
8523
8526
  "titleWithBlock": "Candidatos generados: {title}",
8524
8527
  "subtitle": "Compara lo que produjo cada integración y conserva lo que quieras",
8528
+ "pickOne": "Elige uno. Al elegir un candidato se quita el que elegiste antes.",
8525
8529
  "automatic": "Solo se generó un candidato, así que se conservó automáticamente. Nadie lo revisó.",
8526
8530
  "unlabelledSubject": "Sin sujeto declarado",
8527
8531
  "noPreview": "Sin vista previa disponible",
@@ -608,7 +608,8 @@
608
608
  "pastedLink": {
609
609
  "offer": "Cette description renvoie à une page {source}. L’attacher comme contexte ?",
610
610
  "attach": "Attacher"
611
- }
611
+ },
612
+ "removePending": "Retirer {name}"
612
613
  },
613
614
  "errors": {
614
615
  "generic": {
@@ -5468,7 +5469,8 @@
5468
5469
  "releaseInteractive": "Ne plus être le défaut dans l'application",
5469
5470
  "claimUnattended": "Définir comme défaut sans surveillance",
5470
5471
  "releaseUnattended": "Ne plus être le défaut sans surveillance"
5471
- }
5472
+ },
5473
+ "removeLabel": "Retirer le libellé {label}"
5472
5474
  },
5473
5475
  "progress": {
5474
5476
  "status": {
@@ -6392,7 +6394,8 @@
6392
6394
  "heading": "Importer une maquette de référence",
6393
6395
  "viewPlaceholder": "Nom de la vue (ex. login)",
6394
6396
  "tipReady": "Astuce : déposez une image directement sur une paire ci-dessus pour définir sa référence.",
6395
- "tipNeedView": "Saisissez d'abord un nom de vue, puis choisissez un fichier. Ou déposez une image directement sur une paire ci-dessus."
6397
+ "tipNeedView": "Saisissez d'abord un nom de vue, puis choisissez un fichier. Ou déposez une image directement sur une paire ci-dessus.",
6398
+ "choose": "Choisir un fichier"
6396
6399
  },
6397
6400
  "requestFix": {
6398
6401
  "heading": "Demander une correction",
@@ -8522,6 +8525,7 @@
8522
8525
  "title": "Candidats générés",
8523
8526
  "titleWithBlock": "Candidats générés : {title}",
8524
8527
  "subtitle": "Comparez ce que chaque intégration a produit et conservez ce que vous voulez",
8528
+ "pickOne": "Choisissez-en un. Choisir un candidat retire le choix précédent.",
8525
8529
  "automatic": "Un seul candidat a été généré, il a donc été conservé automatiquement. Personne ne l’a examiné.",
8526
8530
  "unlabelledSubject": "Aucun sujet déclaré",
8527
8531
  "noPreview": "Aucun aperçu disponible",
@@ -608,7 +608,8 @@
608
608
  "pastedLink": {
609
609
  "offer": "התיאור הזה מקשר לדף {source}. לצרף אותו כהקשר?",
610
610
  "attach": "צרף"
611
- }
611
+ },
612
+ "removePending": "הסר את {name}"
612
613
  },
613
614
  "errors": {
614
615
  "generic": {
@@ -5468,7 +5469,8 @@
5468
5469
  "releaseInteractive": "בטל כברירת מחדל באפליקציה",
5469
5470
  "claimUnattended": "הפוך לברירת המחדל ללא השגחה",
5470
5471
  "releaseUnattended": "בטל כברירת מחדל ללא השגחה"
5471
- }
5472
+ },
5473
+ "removeLabel": "הסר את התווית {label}"
5472
5474
  },
5473
5475
  "progress": {
5474
5476
  "status": {
@@ -6392,7 +6394,8 @@
6392
6394
  "heading": "העלה עיצוב ייחוס",
6393
6395
  "viewPlaceholder": "שם מסך (למשל login)",
6394
6396
  "tipReady": "טיפ: גרור תמונה ישירות על זוג למעלה כדי להגדיר את הייחוס שלו.",
6395
- "tipNeedView": "הזן תחילה שם מסך, ואז בחר קובץ. או גרור תמונה ישירות על זוג למעלה."
6397
+ "tipNeedView": "הזן תחילה שם מסך, ואז בחר קובץ. או גרור תמונה ישירות על זוג למעלה.",
6398
+ "choose": "בחירת קובץ"
6396
6399
  },
6397
6400
  "requestFix": {
6398
6401
  "heading": "בקש תיקון",
@@ -8522,6 +8525,7 @@
8522
8525
  "title": "מועמדים שנוצרו",
8523
8526
  "titleWithBlock": "מועמדים שנוצרו: {title}",
8524
8527
  "subtitle": "השוו מה כל אינטגרציה יצרה ושמרו את מה שאתם רוצים",
8528
+ "pickOne": "בחרו אחד. בחירת מועמד מבטלת את הבחירה הקודמת.",
8525
8529
  "automatic": "נוצר מועמד אחד בלבד, ולכן הוא נשמר אוטומטית. אף אחד לא בדק אותו.",
8526
8530
  "unlabelledSubject": "לא הוצהר נושא",
8527
8531
  "noPreview": "אין תצוגה מקדימה",
@@ -3455,7 +3455,8 @@
3455
3455
  "pastedLink": {
3456
3456
  "offer": "Questa descrizione rimanda a una pagina {source}. Allegarla come contesto?",
3457
3457
  "attach": "Allega"
3458
- }
3458
+ },
3459
+ "removePending": "Rimuovi {name}"
3459
3460
  },
3460
3461
  "providers": {
3461
3462
  "presetMismatch": {
@@ -4939,7 +4940,8 @@
4939
4940
  "releaseInteractive": "Non più predefinita nell'app",
4940
4941
  "claimUnattended": "Rendi predefinita non presidiata",
4941
4942
  "releaseUnattended": "Non più predefinita non presidiata"
4942
- }
4943
+ },
4944
+ "removeLabel": "Rimuovi l'etichetta {label}"
4943
4945
  },
4944
4946
  "progress": {
4945
4947
  "status": {
@@ -7122,7 +7124,8 @@
7122
7124
  "heading": "Carica un design di riferimento",
7123
7125
  "viewPlaceholder": "Nome della vista (es. login)",
7124
7126
  "tipReady": "Suggerimento: trascina un'immagine direttamente su una coppia sopra per impostarne il riferimento.",
7125
- "tipNeedView": "Inserisci prima un nome per la vista, poi scegli un file. Oppure trascina un'immagine direttamente su una coppia sopra."
7127
+ "tipNeedView": "Inserisci prima un nome per la vista, poi scegli un file. Oppure trascina un'immagine direttamente su una coppia sopra.",
7128
+ "choose": "Scegli un file"
7126
7129
  },
7127
7130
  "requestFix": {
7128
7131
  "heading": "Richiedi una correzione",
@@ -8522,6 +8525,7 @@
8522
8525
  "title": "Candidati generati",
8523
8526
  "titleWithBlock": "Candidati generati: {title}",
8524
8527
  "subtitle": "Confronta ciò che ogni integrazione ha prodotto e tieni quello che vuoi",
8528
+ "pickOne": "Scegline uno. Scegliere un candidato annulla la scelta precedente.",
8525
8529
  "automatic": "È stato generato un solo candidato, quindi è stato tenuto automaticamente. Nessuno lo ha esaminato.",
8526
8530
  "unlabelledSubject": "Nessun soggetto dichiarato",
8527
8531
  "noPreview": "Nessuna anteprima disponibile",
@@ -608,7 +608,8 @@
608
608
  "pastedLink": {
609
609
  "offer": "この説明は {source} のページにリンクしています。コンテキストとして添付しますか?",
610
610
  "attach": "添付"
611
- }
611
+ },
612
+ "removePending": "{name} を削除"
612
613
  },
613
614
  "errors": {
614
615
  "generic": {
@@ -5468,7 +5469,8 @@
5468
5469
  "releaseInteractive": "アプリ内の既定を解除",
5469
5470
  "claimUnattended": "無人実行の既定にする",
5470
5471
  "releaseUnattended": "無人実行の既定を解除"
5471
- }
5472
+ },
5473
+ "removeLabel": "ラベル {label} を削除"
5472
5474
  },
5473
5475
  "progress": {
5474
5476
  "status": {
@@ -6392,7 +6394,8 @@
6392
6394
  "heading": "リファレンスデザインをアップロード",
6393
6395
  "viewPlaceholder": "ビュー名(例: login)",
6394
6396
  "tipReady": "ヒント: 上のペアに画像を直接ドロップするとリファレンスに設定できます。",
6395
- "tipNeedView": "まずビュー名を入力してからファイルを選択してください。または上のペアに画像を直接ドロップしてください。"
6397
+ "tipNeedView": "まずビュー名を入力してからファイルを選択してください。または上のペアに画像を直接ドロップしてください。",
6398
+ "choose": "ファイルを選択"
6396
6399
  },
6397
6400
  "requestFix": {
6398
6401
  "heading": "修正をリクエスト",
@@ -8522,6 +8525,7 @@
8522
8525
  "title": "生成された候補",
8523
8526
  "titleWithBlock": "生成された候補: {title}",
8524
8527
  "subtitle": "各連携が生成したものを比較し、残すものを選びます",
8528
+ "pickOne": "1つ選びます。候補を選ぶと、前に選んだものは解除されます。",
8525
8529
  "automatic": "候補が1つしか生成されなかったため、自動的に採用されました。誰も確認していません。",
8526
8530
  "unlabelledSubject": "対象の申告なし",
8527
8531
  "noPreview": "プレビューはありません",
@@ -608,7 +608,8 @@
608
608
  "pastedLink": {
609
609
  "offer": "Ten opis zawiera odnośnik do strony {source}. Dołączyć ją jako kontekst?",
610
610
  "attach": "Dołącz"
611
- }
611
+ },
612
+ "removePending": "Usuń {name}"
612
613
  },
613
614
  "errors": {
614
615
  "generic": {
@@ -5468,7 +5469,8 @@
5468
5469
  "releaseInteractive": "Przestań być domyślnym w aplikacji",
5469
5470
  "claimUnattended": "Ustaw jako domyślny bez nadzoru",
5470
5471
  "releaseUnattended": "Przestań być domyślnym bez nadzoru"
5471
- }
5472
+ },
5473
+ "removeLabel": "Usuń etykietę {label}"
5472
5474
  },
5473
5475
  "progress": {
5474
5476
  "status": {
@@ -6392,7 +6394,8 @@
6392
6394
  "heading": "Prześlij projekt referencyjny",
6393
6395
  "viewPlaceholder": "Nazwa widoku (np. login)",
6394
6396
  "tipReady": "Wskazówka: przeciągnij obraz bezpośrednio na parę powyżej, aby ustawić jej referencję.",
6395
- "tipNeedView": "Najpierw wpisz nazwę widoku, a potem wybierz plik. Albo przeciągnij obraz bezpośrednio na parę powyżej."
6397
+ "tipNeedView": "Najpierw wpisz nazwę widoku, a potem wybierz plik. Albo przeciągnij obraz bezpośrednio na parę powyżej.",
6398
+ "choose": "Wybierz plik"
6396
6399
  },
6397
6400
  "requestFix": {
6398
6401
  "heading": "Poproś o poprawkę",
@@ -8522,6 +8525,7 @@
8522
8525
  "title": "Wygenerowani kandydaci",
8523
8526
  "titleWithBlock": "Wygenerowani kandydaci: {title}",
8524
8527
  "subtitle": "Porównaj, co wytworzyła każda integracja, i zachowaj to, co chcesz",
8528
+ "pickOne": "Wybierz jeden. Wybranie kandydata usuwa poprzedni wybór.",
8525
8529
  "automatic": "Wygenerowano tylko jednego kandydata, więc zachowano go automatycznie. Nikt go nie przejrzał.",
8526
8530
  "unlabelledSubject": "Nie zadeklarowano tematu",
8527
8531
  "noPreview": "Brak podglądu",
@@ -608,7 +608,8 @@
608
608
  "pastedLink": {
609
609
  "offer": "Bu açıklama bir {source} sayfasına bağlantı veriyor. Bağlam olarak eklensin mi?",
610
610
  "attach": "Ekle"
611
- }
611
+ },
612
+ "removePending": "{name} öğesini kaldır"
612
613
  },
613
614
  "errors": {
614
615
  "generic": {
@@ -5468,7 +5469,8 @@
5468
5469
  "releaseInteractive": "Uygulama içi varsayılan olmaktan çıkar",
5469
5470
  "claimUnattended": "Gözetimsiz varsayılan yap",
5470
5471
  "releaseUnattended": "Gözetimsiz varsayılan olmaktan çıkar"
5471
- }
5472
+ },
5473
+ "removeLabel": "{label} etiketini kaldır"
5472
5474
  },
5473
5475
  "progress": {
5474
5476
  "status": {
@@ -6392,7 +6394,8 @@
6392
6394
  "heading": "Referans tasarım yükle",
6393
6395
  "viewPlaceholder": "Görünüm adı (örn. login)",
6394
6396
  "tipReady": "İpucu: referansını ayarlamak için bir görseli doğrudan yukarıdaki bir çiftin üzerine bırakın.",
6395
- "tipNeedView": "Önce bir görünüm adı girin, ardından bir dosya seçin. Veya bir görseli doğrudan yukarıdaki bir çiftin üzerine bırakın."
6397
+ "tipNeedView": "Önce bir görünüm adı girin, ardından bir dosya seçin. Veya bir görseli doğrudan yukarıdaki bir çiftin üzerine bırakın.",
6398
+ "choose": "Dosya seç"
6396
6399
  },
6397
6400
  "requestFix": {
6398
6401
  "heading": "Düzeltme iste",
@@ -8522,6 +8525,7 @@
8522
8525
  "title": "Üretilen adaylar",
8523
8526
  "titleWithBlock": "Üretilen adaylar: {title}",
8524
8527
  "subtitle": "Her entegrasyonun ürettiğini karşılaştırın ve istediğinizi tutun",
8528
+ "pickOne": "Birini seçin. Bir aday seçmek önceki seçimi kaldırır.",
8525
8529
  "automatic": "Yalnızca bir aday üretildi, bu yüzden otomatik olarak tutuldu. Kimse incelemedi.",
8526
8530
  "unlabelledSubject": "Konu bildirilmedi",
8527
8531
  "noPreview": "Önizleme yok",