@cat-factory/app 0.302.1 → 0.303.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.
- package/README.md +16 -0
- package/app/app.config.ts +19 -10
- package/app/assets/css/main.css +13 -13
- package/app/assets/css/prose.css +22 -22
- package/app/assets/css/tokens.css +298 -0
- package/app/components/assistant/AssistantModal.vue +22 -22
- package/app/components/auth/AuthGate.vue +1 -1
- package/app/components/auth/BackendMisconfiguredScreen.vue +10 -10
- package/app/components/auth/LoginScreen.vue +34 -36
- package/app/components/auth/ResetPasswordScreen.vue +12 -12
- package/app/components/auth/UserMenu.vue +4 -4
- package/app/components/binaryCandidates/BinaryCandidatesWindow.vue +27 -25
- package/app/components/binaryOutput/BinaryOutputReport.vue +15 -15
- package/app/components/binaryOutput/StoredAssetView.vue +5 -5
- package/app/components/board/AddTaskModal.vue +17 -20
- package/app/components/board/AgentFailureCard.vue +11 -11
- package/app/components/board/AgentFailureHistory.vue +2 -2
- package/app/components/board/BoardCanvas.vue +6 -5
- package/app/components/board/CreateInitiativeModal.vue +8 -10
- package/app/components/board/DependencyConnectOverlay.vue +1 -1
- package/app/components/board/FailureHistoryList.vue +7 -7
- package/app/components/board/RecurringPipelineModal.vue +17 -17
- package/app/components/board/ReviewFrictionDialog.vue +6 -6
- package/app/components/board/StepExecutionHistory.vue +13 -13
- package/app/components/board/TaskDependencyEdges.vue +8 -8
- package/app/components/board/nodes/AgentChip.vue +10 -10
- package/app/components/board/nodes/BlockNode.vue +29 -29
- package/app/components/board/nodes/DecisionBadge.vue +2 -2
- package/app/components/board/nodes/EpicNode.vue +14 -10
- package/app/components/board/nodes/FrameSwimlanes.vue +7 -9
- package/app/components/board/nodes/InitiativeCard.vue +8 -8
- package/app/components/board/nodes/LaneGroup.vue +1 -1
- package/app/components/board/nodes/LaneTask.vue +2 -2
- package/app/components/board/nodes/ResizeGrips.vue +4 -4
- package/app/components/board/nodes/TaskCard.vue +18 -18
- package/app/components/board/nodes/TaskLane.vue +5 -5
- package/app/components/board/nodes/TaskPipelineMini.vue +18 -18
- package/app/components/bootstrap/AdoptionReviewModal.vue +29 -26
- package/app/components/bootstrap/BootstrapModal.vue +21 -23
- package/app/components/bootstrap/BootstrapRunSteps.vue +1 -1
- package/app/components/brainstorm/BrainstormWindow.vue +30 -33
- package/app/components/bugFishing/BugFishingWindow.vue +49 -49
- package/app/components/clarity/ClarityReviewWindow.vue +30 -30
- package/app/components/common/AsyncViewError.vue +5 -5
- package/app/components/common/ClarificationItem.vue +8 -13
- package/app/components/common/ConfirmDialog.vue +4 -2
- package/app/components/common/DescriptorFields.vue +1 -1
- package/app/components/common/EmptyState.vue +3 -3
- package/app/components/common/InterviewGateNotice.vue +7 -7
- package/app/components/common/KeyboardShortcutsHelp.vue +1 -1
- package/app/components/common/MarkdownProse.vue +14 -13
- package/app/components/consensus/ConsensusSessionWindow.vue +26 -26
- package/app/components/context/ContextAttachmentFields.vue +17 -17
- package/app/components/docs/DocInterviewWindow.vue +14 -14
- package/app/components/documents/ContextDocumentPicker.vue +17 -17
- package/app/components/documents/DocumentImportModal.vue +7 -7
- package/app/components/documents/DocumentSourceConnectModal.vue +3 -3
- package/app/components/documents/DocumentSyncState.vue +5 -5
- package/app/components/documents/DocumentTemplatesModal.vue +15 -15
- package/app/components/documents/RepoContextDocPicker.vue +5 -5
- package/app/components/documents/SpawnPreviewModal.vue +12 -12
- package/app/components/documents/StartFromDesignModal.vue +11 -11
- package/app/components/documents/TaskContextDocs.vue +5 -5
- package/app/components/environments/EnvSetupStepper.vue +6 -6
- package/app/components/environments/EnvironmentStatusPanel.vue +17 -17
- package/app/components/environments/steps/EnvPickStep.vue +3 -3
- package/app/components/environments/steps/EnvPreflightStep.vue +9 -9
- package/app/components/environments/steps/EnvReviewStep.vue +25 -22
- package/app/components/environments/steps/EnvSaveStep.vue +7 -5
- package/app/components/environments/steps/JourneyStepNav.vue +1 -1
- package/app/components/focus/BlockFocusView.vue +17 -19
- package/app/components/followUp/FollowUpWindow.vue +23 -23
- package/app/components/forkDecision/ForkDecisionWindow.vue +37 -39
- package/app/components/foundational/FoundationalContractSummary.vue +7 -7
- package/app/components/foundational/FoundationalServiceCatalogList.vue +11 -11
- package/app/components/foundational/FoundationalServiceManager.vue +1 -1
- package/app/components/foundational/FoundationalServiceRegistry.vue +13 -13
- package/app/components/foundational/FoundationalServiceSources.vue +13 -13
- package/app/components/foundational/FoundationalSuppressions.vue +7 -7
- package/app/components/foundational/ServiceCatalogConnection.vue +10 -10
- package/app/components/fragments/FragmentLibraryManager.vue +41 -44
- package/app/components/fragments/FragmentSelector.vue +13 -13
- package/app/components/fragments/GitHubDocUrlImport.vue +1 -1
- package/app/components/gates/GateFailingCheckList.vue +5 -5
- package/app/components/gates/GateResultView.vue +50 -47
- package/app/components/github/AddServiceFromRepoModal.vue +14 -14
- package/app/components/github/BranchProtectionPreflight.vue +13 -13
- package/app/components/github/GitHubConnect.vue +7 -7
- package/app/components/github/GitHubOnboarding.vue +7 -7
- package/app/components/github/GitHubPanel.vue +37 -40
- package/app/components/github/RepoTreeBrowser.vue +18 -18
- package/app/components/humanTest/HumanTestWindow.vue +30 -33
- package/app/components/initiative/InitiativePlanNotice.vue +5 -5
- package/app/components/initiative/InitiativePlanReview.vue +27 -29
- package/app/components/initiative/InitiativePlanningWindow.vue +10 -10
- package/app/components/initiative/InitiativeTrackerWindow.vue +71 -65
- package/app/components/inputGate/InputGateNotice.vue +2 -4
- package/app/components/judge/JudgeResultView.vue +30 -32
- package/app/components/kaizen/KaizenPanel.vue +40 -36
- package/app/components/kaizen/KaizenStepStatus.vue +21 -21
- package/app/components/layout/AccountAuditLog.vue +10 -10
- package/app/components/layout/AccountDeploymentSettings.vue +20 -20
- package/app/components/layout/AccountFailureKindRules.vue +13 -13
- package/app/components/layout/AccountFoundationalSettings.vue +1 -1
- package/app/components/layout/AccountFragmentSettings.vue +1 -1
- package/app/components/layout/AccountModelPolicySettings.vue +9 -9
- package/app/components/layout/AccountPlatformAlertSettings.vue +11 -11
- package/app/components/layout/AccountRiskPolicySettings.vue +2 -2
- package/app/components/layout/AccountRunCredentialSettings.vue +5 -5
- package/app/components/layout/AccountSkillSettings.vue +1 -1
- package/app/components/layout/AccountTeamSettings.vue +23 -15
- package/app/components/layout/AiProvidersBanner.vue +11 -8
- package/app/components/layout/AppearanceSwitcher.vue +108 -0
- package/app/components/layout/BoardSwitcher.vue +8 -11
- package/app/components/layout/BoardToolbar.vue +3 -3
- package/app/components/layout/CommandBar.vue +7 -9
- package/app/components/layout/ConnectionStatusBanner.vue +2 -2
- package/app/components/layout/DefaultTestEnvBanner.vue +5 -5
- package/app/components/layout/GitHubPatBanner.vue +5 -5
- package/app/components/layout/GitHubPatPermissionsBanner.vue +16 -10
- package/app/components/layout/InfraSetupBanner.vue +6 -6
- package/app/components/layout/IntegrationsHub.vue +15 -15
- package/app/components/layout/LanguageSwitcher.vue +5 -5
- package/app/components/layout/ModelProvidersHub.vue +13 -16
- package/app/components/layout/NotificationsInbox.vue +10 -10
- package/app/components/layout/PersonalSetupModal.vue +8 -8
- package/app/components/layout/ProviderConfigBanner.vue +4 -4
- package/app/components/layout/RolePrompt.vue +7 -7
- package/app/components/layout/SideBar.vue +6 -4
- package/app/components/layout/SpendWarningBanner.vue +17 -14
- package/app/components/layout/TranslationWarningBanner.vue +4 -4
- package/app/components/layout/UiModeSwitcher.vue +13 -13
- package/app/components/layout/UiRoleSwitcher.vue +8 -8
- package/app/components/layout/WorkspaceMembersSettings.vue +15 -11
- package/app/components/media/ArtifactLightbox.vue +13 -13
- package/app/components/media/ImageCompare.vue +31 -24
- package/app/components/merge/MergeEffortChips.vue +2 -2
- package/app/components/notifications/NotificationSettingsPanel.vue +14 -12
- package/app/components/observability/OutcomeFilterChips.vue +6 -6
- package/app/components/observability/RunFailureSummary.vue +28 -25
- package/app/components/observability/StepMetricsBar.vue +26 -28
- package/app/components/observability/StepModelActivity.vue +2 -2
- package/app/components/observability/ToolCallList.vue +24 -24
- package/app/components/outcome/OutcomeSummaryWindow.vue +47 -47
- package/app/components/palettes/AgentPalette.vue +8 -8
- package/app/components/palettes/AgentTierSelect.vue +1 -1
- package/app/components/palettes/PipelinePurposeSelect.vue +1 -1
- package/app/components/panels/AgentStepDetail.vue +52 -51
- package/app/components/panels/AttemptEntryHeader.vue +4 -6
- package/app/components/panels/DecisionModal.vue +7 -7
- package/app/components/panels/GenericStructuredResultView.vue +7 -7
- package/app/components/panels/InspectorPanel.vue +17 -17
- package/app/components/panels/MergerResultView.vue +19 -19
- package/app/components/panels/ObservabilityPanel.vue +115 -123
- package/app/components/panels/OperatorDashboardPanel.vue +89 -97
- package/app/components/panels/ReportsPanel.vue +69 -66
- package/app/components/panels/ReportsSpendBreakdown.vue +9 -9
- package/app/components/panels/ResultWindowShell.vue +38 -38
- package/app/components/panels/RunDetailLoadState.vue +2 -2
- package/app/components/panels/StepContainerStatus.vue +9 -9
- package/app/components/panels/StepDelegatedStatus.logic.spec.ts +135 -0
- package/app/components/panels/StepDelegatedStatus.logic.ts +160 -0
- package/app/components/panels/StepDelegatedStatus.vue +181 -0
- package/app/components/panels/StepEffortReport.vue +16 -15
- package/app/components/panels/StepFragmentAdherence.vue +14 -10
- package/app/components/panels/StepMetadataCard.vue +74 -45
- package/app/components/panels/StepReproductionReport.vue +25 -21
- package/app/components/panels/StepRunMeta.vue +20 -20
- package/app/components/panels/StepTestReport.logic.spec.ts +8 -3
- package/app/components/panels/StepTestReport.logic.ts +4 -4
- package/app/components/panels/StepTestReport.vue +28 -28
- package/app/components/panels/StepToolServers.vue +14 -11
- package/app/components/panels/StepValidationReport.vue +7 -7
- package/app/components/panels/inspector/ContainerSummary.vue +9 -9
- package/app/components/panels/inspector/DocReferenceRepos.vue +3 -3
- package/app/components/panels/inspector/EnvProbeReport.vue +24 -27
- package/app/components/panels/inspector/EpicChildren.vue +8 -12
- package/app/components/panels/inspector/FrontendBindingsResolved.vue +11 -11
- package/app/components/panels/inspector/FrontendConfig.vue +37 -41
- package/app/components/panels/inspector/InitiativeInspector.vue +3 -3
- package/app/components/panels/inspector/InspectorSection.vue +6 -6
- package/app/components/panels/inspector/RecurringScheduleSettings.vue +16 -19
- package/app/components/panels/inspector/ServiceConnections.vue +2 -2
- package/app/components/panels/inspector/ServiceReleaseHealthConfig.vue +2 -2
- package/app/components/panels/inspector/ServiceSelfTests.vue +21 -17
- package/app/components/panels/inspector/ServiceTestConfig.vue +51 -59
- package/app/components/panels/inspector/ServiceTestSecrets.vue +5 -5
- package/app/components/panels/inspector/ServiceTestingContext.vue +3 -3
- package/app/components/panels/inspector/ServiceValidationConfig.vue +2 -2
- package/app/components/panels/inspector/TaskAgentConfig.vue +3 -3
- package/app/components/panels/inspector/TaskAprioriBranches.vue +8 -5
- package/app/components/panels/inspector/TaskDependencies.vue +1 -1
- package/app/components/panels/inspector/TaskEstimateBadge.vue +11 -11
- package/app/components/panels/inspector/TaskExecution.vue +17 -17
- package/app/components/panels/inspector/TaskReviewTarget.vue +2 -2
- package/app/components/panels/inspector/TaskRunSettings.vue +35 -37
- package/app/components/panels/inspector/TaskStructure.vue +3 -3
- package/app/components/pipeline/AgentKindIcon.vue +1 -1
- package/app/components/pipeline/AgentPromptEditor.vue +17 -17
- package/app/components/pipeline/BinaryOutputStepPicker.vue +42 -56
- package/app/components/pipeline/EstimateThresholdFields.vue +4 -4
- package/app/components/pipeline/GateConfigFields.vue +13 -10
- package/app/components/pipeline/IterationCapPrompt.vue +4 -2
- package/app/components/pipeline/PipelineBuilder.vue +47 -55
- package/app/components/pipeline/PipelineHealthModal.vue +27 -29
- package/app/components/pipeline/PipelinePicker.vue +10 -10
- package/app/components/pipeline/PipelinePreview.vue +10 -10
- package/app/components/pipeline/PipelineProgress.vue +64 -67
- package/app/components/prReview/PrReviewPhaseBadge.vue +7 -7
- package/app/components/prReview/PrReviewWindow.vue +75 -77
- package/app/components/providers/AiPresetMismatchDialog.vue +5 -5
- package/app/components/providers/AiProviderOnboardingModal.vue +9 -9
- package/app/components/providers/ApiKeysSection.vue +13 -13
- package/app/components/providers/PersonalCredentialModal.vue +2 -2
- package/app/components/providers/PersonalSubscriptionSection.vue +10 -10
- package/app/components/providers/SignInRequiredNotice.vue +1 -1
- package/app/components/providers/VendorCredentialsModal.vue +10 -10
- package/app/components/provisioning/ProvisioningLogsDrawer.vue +13 -13
- package/app/components/ralph/RalphLoopResultView.vue +28 -30
- package/app/components/recurring/RecurrenceEditor.vue +2 -2
- package/app/components/requirements/RequirementsReviewWindow.vue +51 -58
- package/app/components/riskPolicy/RiskPolicyPicker.vue +12 -15
- package/app/components/riskPolicy/RiskPolicyPreview.vue +14 -14
- package/app/components/sandbox/SandboxPanel.vue +58 -59
- package/app/components/settings/AccountSettingsPanel.vue +1 -1
- package/app/components/settings/ApiTokensPanel.vue +10 -10
- package/app/components/settings/BudgetSettings.vue +18 -22
- package/app/components/settings/CapabilityCredentialsPanel.vue +15 -15
- package/app/components/settings/CloudflareHandlerSection.vue +20 -20
- package/app/components/settings/ComposeEnvironmentSetupSection.vue +13 -13
- package/app/components/settings/ConnectionTestVerdict.vue +3 -3
- package/app/components/settings/ConnectionWarnings.vue +1 -1
- package/app/components/settings/ConsensusGroupsSection.vue +27 -35
- package/app/components/settings/CustomManifestTypeEditor.vue +10 -10
- package/app/components/settings/DefaultProvisionTypeSection.vue +6 -6
- package/app/components/settings/InfraHandlersConfigurator.vue +24 -22
- package/app/components/settings/InfrastructureBackendPicker.vue +6 -6
- package/app/components/settings/InfrastructureWindow.vue +5 -5
- package/app/components/settings/IssueTrackerPanel.vue +29 -23
- package/app/components/settings/KubernetesEngineForm.vue +11 -11
- package/app/components/settings/KubernetesEnvironmentForm.vue +4 -4
- package/app/components/settings/LocalContainerPoolSettings.vue +6 -11
- package/app/components/settings/LocalModelEndpointsPanel.vue +20 -18
- package/app/components/settings/McpAuthorizeScreen.vue +13 -15
- package/app/components/settings/McpOAuthCallbackScreen.vue +16 -10
- package/app/components/settings/MergeClassRulesEditor.vue +6 -9
- package/app/components/settings/MergeRolePolicyEditor.vue +16 -16
- package/app/components/settings/ModelConfigurationPanel.vue +23 -30
- package/app/components/settings/ModelPresetHealthModal.vue +15 -13
- package/app/components/settings/ObservabilityConnectionPanel.vue +4 -4
- package/app/components/settings/OpenRouterCatalogPanel.vue +23 -19
- package/app/components/settings/PackageRegistriesPanel.vue +8 -8
- package/app/components/settings/ProviderConnectionTab.vue +8 -11
- package/app/components/settings/ProviderManifestEditor.vue +9 -9
- package/app/components/settings/ProviderPreferenceEditor.vue +8 -8
- package/app/components/settings/RiskPolicyCreateForm.vue +10 -10
- package/app/components/settings/RiskPolicyEditorRow.vue +14 -14
- package/app/components/settings/RiskPolicyHealthModal.vue +15 -13
- package/app/components/settings/RiskPolicyInheritedRow.vue +1 -1
- package/app/components/settings/RiskPolicyPanel.vue +10 -15
- package/app/components/settings/ServiceFragmentDefaultsPanel.vue +7 -7
- package/app/components/settings/SharedStacksPanel.vue +9 -12
- package/app/components/settings/TaskSourceCard.vue +4 -4
- package/app/components/settings/TaskTypeSuppressionsPanel.vue +6 -6
- package/app/components/settings/ToolServerChecklist.vue +36 -29
- package/app/components/settings/UsageSettings.vue +15 -15
- package/app/components/settings/UserSecretsSection.vue +9 -12
- package/app/components/settings/WorkspaceMetadataSettings.vue +5 -5
- package/app/components/settings/WorkspaceSettingsPanel.vue +47 -47
- package/app/components/skills/ReviewSkillQueue.vue +10 -10
- package/app/components/skills/SkillLibraryManager.vue +23 -20
- package/app/components/slack/SlackPanel.vue +13 -17
- package/app/components/spec/ServiceSpecWindow.vue +45 -42
- package/app/components/tasks/BugHuntModal.vue +24 -27
- package/app/components/tasks/ContextIssuePicker.vue +11 -11
- package/app/components/tasks/TaskContextIssues.vue +3 -3
- package/app/components/tasks/TaskImportModal.vue +7 -7
- package/app/components/tasks/TaskSourceConnectModal.vue +10 -8
- package/app/components/testing/TestReportWindow.vue +99 -82
- package/app/components/theme/ThemeImportModal.vue +115 -0
- package/app/components/tutorial/TutorialCatalogue.vue +9 -9
- package/app/components/tutorial/TutorialNudge.vue +5 -5
- package/app/components/tutorial/TutorialOverlay.vue +12 -12
- package/app/components/tutorial/TutorialPrompt.vue +6 -9
- package/app/components/vcs/GitLabConnect.vue +4 -4
- package/app/components/vcs/VcsConnectSurfaces.vue +2 -2
- package/app/components/visualConfirm/VisualConfirmationWindow.vue +36 -36
- package/app/composables/api/client.ts +6 -1
- package/app/composables/usePipelineErrorToast.ts +17 -0
- package/app/modular/agent-kinds.ts +24 -0
- package/app/pages/index.vue +5 -5
- package/app/plugins/theme.client.ts +125 -0
- package/app/spa-loading-template.html +52 -14
- package/app/stores/agents.ts +1 -1
- package/app/stores/theme.spec.ts +56 -0
- package/app/stores/theme.ts +87 -0
- package/app/types/domain.ts +19 -0
- package/app/types/execution.ts +4 -0
- package/app/utils/agentOutput.ts +1 -1
- package/app/utils/binaryOutput.ts +6 -6
- package/app/utils/bootstrapSteps.ts +14 -14
- package/app/utils/catalog.ts +87 -83
- package/app/utils/colorTint.ts +10 -0
- package/app/utils/failureKinds.ts +1 -0
- package/app/utils/observability.ts +3 -3
- package/app/utils/pipelineRender.ts +13 -17
- package/app/utils/swimlanes.ts +4 -4
- package/app/utils/theme/bootPalette.spec.ts +54 -0
- package/app/utils/theme/bootPalette.ts +108 -0
- package/app/utils/theme/builtins.spec.ts +38 -0
- package/app/utils/theme/builtins.ts +55 -0
- package/app/utils/theme/css.ts +162 -0
- package/app/utils/theme/doc.ts +353 -0
- package/app/utils/theme/link.ts +93 -0
- package/app/utils/theme/presets.ts +509 -0
- package/app/utils/theme/theme.spec.ts +224 -0
- package/i18n/locales/de.json +61 -4
- package/i18n/locales/en.json +70 -4
- package/i18n/locales/es.json +61 -4
- package/i18n/locales/fr.json +61 -4
- package/i18n/locales/he.json +61 -4
- package/i18n/locales/it.json +61 -4
- package/i18n/locales/ja.json +61 -4
- package/i18n/locales/pl.json +61 -4
- package/i18n/locales/tr.json +61 -4
- package/i18n/locales/uk.json +61 -4
- package/nuxt.config.ts +37 -11
- package/package.json +10 -9
|
@@ -194,9 +194,9 @@ const SPEC_JOIN_KEYS: Record<Exclude<OutcomeSpecJoin, 'joined'>, string> = {
|
|
|
194
194
|
}
|
|
195
195
|
|
|
196
196
|
const VERDICT_META: Record<RequirementVerdictStatus, { color: string; key: string }> = {
|
|
197
|
-
met: { color: '
|
|
198
|
-
not_met: { color: '
|
|
199
|
-
not_covered: { color: '
|
|
197
|
+
met: { color: 'var(--ui-success)', key: 'outcome.requirements.verdict.met' },
|
|
198
|
+
not_met: { color: 'var(--ui-error)', key: 'outcome.requirements.verdict.not_met' },
|
|
199
|
+
not_covered: { color: 'var(--ui-text-muted)', key: 'outcome.requirements.verdict.not_covered' },
|
|
200
200
|
}
|
|
201
201
|
const SEVERITY_KEYS: Record<TestConcernSeverity, string> = {
|
|
202
202
|
low: 'outcome.tests.severity.low',
|
|
@@ -412,7 +412,7 @@ function openTestReport() {
|
|
|
412
412
|
<ResultWindowShell
|
|
413
413
|
:open="open"
|
|
414
414
|
icon="i-lucide-clipboard-check"
|
|
415
|
-
icon-class="bg-
|
|
415
|
+
icon-class="bg-app-info-500/15 text-app-info-300"
|
|
416
416
|
:title="headerTitle"
|
|
417
417
|
:subtitle="t('outcome.subtitle')"
|
|
418
418
|
width="3xl"
|
|
@@ -458,16 +458,16 @@ function openTestReport() {
|
|
|
458
458
|
|
|
459
459
|
<!-- What was asked, in the requester's own words. -->
|
|
460
460
|
<section class="mb-5">
|
|
461
|
-
<h3 class="mb-1.5 text-[11px] font-semibold uppercase tracking-wide text-
|
|
461
|
+
<h3 class="mb-1.5 text-[11px] font-semibold uppercase tracking-wide text-dimmed">
|
|
462
462
|
{{ t('outcome.ask.title') }}
|
|
463
463
|
</h3>
|
|
464
464
|
<MarkdownProse
|
|
465
465
|
v-if="outcome.ask"
|
|
466
466
|
:text="outcome.ask"
|
|
467
|
-
class="text-[13px] leading-relaxed text-
|
|
467
|
+
class="text-[13px] leading-relaxed text-toned"
|
|
468
468
|
data-testid="outcome-ask"
|
|
469
469
|
/>
|
|
470
|
-
<p v-else class="text-[13px] italic leading-relaxed text-
|
|
470
|
+
<p v-else class="text-[13px] italic leading-relaxed text-dimmed">
|
|
471
471
|
{{ t('outcome.ask.none') }}
|
|
472
472
|
</p>
|
|
473
473
|
</section>
|
|
@@ -477,25 +477,25 @@ function openTestReport() {
|
|
|
477
477
|
agents actually read, and every section below is a statement about work done against
|
|
478
478
|
it. A design that moved mid-run is the reading that changes all of them. -->
|
|
479
479
|
<section class="mb-5" data-testid="outcome-sources">
|
|
480
|
-
<h3 class="mb-1.5 text-[11px] font-semibold uppercase tracking-wide text-
|
|
480
|
+
<h3 class="mb-1.5 text-[11px] font-semibold uppercase tracking-wide text-dimmed">
|
|
481
481
|
{{ t('outcome.sources.title') }}
|
|
482
482
|
</h3>
|
|
483
483
|
<div v-if="outcome.sources.status === 'reported'" class="space-y-1">
|
|
484
484
|
<div
|
|
485
485
|
v-for="source in sourceRows"
|
|
486
486
|
:key="`${source.origin}:${source.url || source.title}`"
|
|
487
|
-
class="rounded-md border border-
|
|
487
|
+
class="rounded-md border border-default bg-default/60 px-2 py-1.5"
|
|
488
488
|
data-testid="outcome-source"
|
|
489
489
|
>
|
|
490
490
|
<DocumentOriginLink
|
|
491
491
|
:url="source.url ?? ''"
|
|
492
|
-
class="flex items-center gap-1.5 text-xs text-
|
|
493
|
-
hover-class="hover:text-
|
|
492
|
+
class="flex items-center gap-1.5 text-xs text-toned"
|
|
493
|
+
hover-class="hover:text-highlighted"
|
|
494
494
|
>
|
|
495
|
-
<UIcon :name="source.icon" class="h-3.5 w-3.5 shrink-0 text-
|
|
495
|
+
<UIcon :name="source.icon" class="h-3.5 w-3.5 shrink-0 text-primary" />
|
|
496
496
|
<span class="truncate">{{ source.title }}</span>
|
|
497
497
|
</DocumentOriginLink>
|
|
498
|
-
<p class="mt-0.5 text-[11px] text-
|
|
498
|
+
<p class="mt-0.5 text-[11px] text-dimmed" data-testid="outcome-source-revision">
|
|
499
499
|
{{ source.revision }}
|
|
500
500
|
</p>
|
|
501
501
|
<!-- Stated separately from the revision above: the last revision alone says the run
|
|
@@ -503,21 +503,21 @@ function openTestReport() {
|
|
|
503
503
|
changed under it. -->
|
|
504
504
|
<p
|
|
505
505
|
v-if="source.movedDuringRun"
|
|
506
|
-
class="mt-0.5 text-[11px] text-
|
|
506
|
+
class="mt-0.5 text-[11px] text-app-warning-300"
|
|
507
507
|
data-testid="outcome-source-moved"
|
|
508
508
|
>
|
|
509
509
|
{{ t('outcome.sources.moved') }}
|
|
510
510
|
</p>
|
|
511
511
|
</div>
|
|
512
512
|
</div>
|
|
513
|
-
<p v-else class="text-[13px] italic leading-relaxed text-
|
|
513
|
+
<p v-else class="text-[13px] italic leading-relaxed text-dimmed">
|
|
514
514
|
{{ t(SOURCES_GAP_KEYS[outcome.sources.gap]) }}
|
|
515
515
|
</p>
|
|
516
516
|
</section>
|
|
517
517
|
|
|
518
518
|
<!-- Requirement coverage: which required behaviours were checked, and what was seen. -->
|
|
519
519
|
<section class="mb-5" data-testid="outcome-requirements">
|
|
520
|
-
<h3 class="mb-1.5 text-[11px] font-semibold uppercase tracking-wide text-
|
|
520
|
+
<h3 class="mb-1.5 text-[11px] font-semibold uppercase tracking-wide text-dimmed">
|
|
521
521
|
{{ t('outcome.requirements.title') }}
|
|
522
522
|
</h3>
|
|
523
523
|
<template v-if="outcome.requirements.status === 'reported'">
|
|
@@ -550,7 +550,7 @@ function openTestReport() {
|
|
|
550
550
|
and do not cover rather than letting them read as the whole picture. -->
|
|
551
551
|
<p
|
|
552
552
|
v-if="specNote"
|
|
553
|
-
class="mb-2 text-[11px] leading-relaxed text-
|
|
553
|
+
class="mb-2 text-[11px] leading-relaxed text-app-warning-300/90"
|
|
554
554
|
data-testid="outcome-spec-note"
|
|
555
555
|
>
|
|
556
556
|
{{ specNote }}
|
|
@@ -560,7 +560,7 @@ function openTestReport() {
|
|
|
560
560
|
deciding which of the two numbers to distrust. -->
|
|
561
561
|
<p
|
|
562
562
|
v-if="unmatchedVerdicts > 0"
|
|
563
|
-
class="mb-2 text-[11px] leading-relaxed text-
|
|
563
|
+
class="mb-2 text-[11px] leading-relaxed text-app-warning-300/90"
|
|
564
564
|
data-testid="outcome-unmatched-verdicts"
|
|
565
565
|
>
|
|
566
566
|
{{ t('outcome.requirements.unmatchedVerdicts', { count: unmatchedVerdicts }) }}
|
|
@@ -569,7 +569,7 @@ function openTestReport() {
|
|
|
569
569
|
<li
|
|
570
570
|
v-for="req in requirementRows"
|
|
571
571
|
:key="req.id"
|
|
572
|
-
class="flex items-start gap-2 rounded-md border border-
|
|
572
|
+
class="flex items-start gap-2 rounded-md border border-default bg-app-950/40 p-2"
|
|
573
573
|
data-testid="outcome-requirement"
|
|
574
574
|
>
|
|
575
575
|
<span
|
|
@@ -578,7 +578,7 @@ function openTestReport() {
|
|
|
578
578
|
/>
|
|
579
579
|
<div class="min-w-0">
|
|
580
580
|
<div class="flex flex-wrap items-center gap-1.5">
|
|
581
|
-
<span class="text-[13px] text-
|
|
581
|
+
<span class="text-[13px] text-default">{{ req.title ?? req.id }}</span>
|
|
582
582
|
<UBadge
|
|
583
583
|
v-if="req.regression"
|
|
584
584
|
color="error"
|
|
@@ -588,18 +588,18 @@ function openTestReport() {
|
|
|
588
588
|
>
|
|
589
589
|
{{ t('outcome.requirements.regressionTag') }}
|
|
590
590
|
</UBadge>
|
|
591
|
-
<span class="text-[10px] uppercase tracking-wide text-
|
|
591
|
+
<span class="text-[10px] uppercase tracking-wide text-dimmed">
|
|
592
592
|
{{ t(VERDICT_META[req.verdict].key) }}
|
|
593
593
|
</span>
|
|
594
594
|
</div>
|
|
595
|
-
<p v-if="req.detail" class="mt-0.5 text-[12px] leading-relaxed text-
|
|
595
|
+
<p v-if="req.detail" class="mt-0.5 text-[12px] leading-relaxed text-muted">
|
|
596
596
|
{{ req.detail }}
|
|
597
597
|
</p>
|
|
598
598
|
</div>
|
|
599
599
|
</li>
|
|
600
600
|
</ul>
|
|
601
601
|
</template>
|
|
602
|
-
<p v-else class="text-[13px] italic leading-relaxed text-
|
|
602
|
+
<p v-else class="text-[13px] italic leading-relaxed text-dimmed">
|
|
603
603
|
{{ t(REQUIREMENTS_GAP_KEYS[outcome.requirements.gap]) }}
|
|
604
604
|
</p>
|
|
605
605
|
</section>
|
|
@@ -607,7 +607,7 @@ function openTestReport() {
|
|
|
607
607
|
<!-- How it was tested: the tester's own verdict and prose, attributed as its account. -->
|
|
608
608
|
<section class="mb-5" data-testid="outcome-tests">
|
|
609
609
|
<div class="mb-1.5 flex flex-wrap items-center gap-2">
|
|
610
|
-
<h3 class="text-[11px] font-semibold uppercase tracking-wide text-
|
|
610
|
+
<h3 class="text-[11px] font-semibold uppercase tracking-wide text-dimmed">
|
|
611
611
|
{{ t('outcome.tests.title') }}
|
|
612
612
|
</h3>
|
|
613
613
|
<UBadge
|
|
@@ -642,15 +642,15 @@ function openTestReport() {
|
|
|
642
642
|
<template v-if="outcome.tests.status === 'reported'">
|
|
643
643
|
<p
|
|
644
644
|
v-if="outcome.tests.abortReason"
|
|
645
|
-
class="mb-2 rounded-md border border-
|
|
645
|
+
class="mb-2 rounded-md border border-app-error-900/70 bg-app-error-500/10 p-2 text-[13px] leading-relaxed text-app-error-200"
|
|
646
646
|
data-testid="outcome-tests-abort"
|
|
647
647
|
>
|
|
648
648
|
{{ t('outcome.tests.abort', { reason: outcome.tests.abortReason }) }}
|
|
649
649
|
</p>
|
|
650
|
-
<p v-if="outcome.tests.summary" class="text-[13px] leading-relaxed text-
|
|
650
|
+
<p v-if="outcome.tests.summary" class="text-[13px] leading-relaxed text-toned">
|
|
651
651
|
{{ t('outcome.tests.summary', { summary: outcome.tests.summary }) }}
|
|
652
652
|
</p>
|
|
653
|
-
<p class="mt-1.5 text-[12px] text-
|
|
653
|
+
<p class="mt-1.5 text-[12px] text-muted">
|
|
654
654
|
{{
|
|
655
655
|
t('outcome.tests.counts', {
|
|
656
656
|
passed: outcome.tests.passed,
|
|
@@ -663,7 +663,7 @@ function openTestReport() {
|
|
|
663
663
|
<li
|
|
664
664
|
v-for="(concern, i) in outcome.tests.concerns"
|
|
665
665
|
:key="i"
|
|
666
|
-
class="flex items-start gap-2 text-[12px] text-
|
|
666
|
+
class="flex items-start gap-2 text-[12px] text-toned"
|
|
667
667
|
data-testid="outcome-concern"
|
|
668
668
|
>
|
|
669
669
|
<UBadge :color="SEVERITY_COLOR[concern.severity]" variant="subtle" size="sm">
|
|
@@ -673,18 +673,18 @@ function openTestReport() {
|
|
|
673
673
|
</li>
|
|
674
674
|
</ul>
|
|
675
675
|
</template>
|
|
676
|
-
<p v-else class="text-[13px] italic leading-relaxed text-
|
|
676
|
+
<p v-else class="text-[13px] italic leading-relaxed text-dimmed">
|
|
677
677
|
{{ t(TESTS_GAP_KEYS[outcome.tests.gap]) }}
|
|
678
678
|
</p>
|
|
679
679
|
</section>
|
|
680
680
|
|
|
681
681
|
<!-- What it looks like: the captured views, and whether a human was asked about them. -->
|
|
682
682
|
<section class="mb-5" data-testid="outcome-visuals">
|
|
683
|
-
<h3 class="mb-1.5 text-[11px] font-semibold uppercase tracking-wide text-
|
|
683
|
+
<h3 class="mb-1.5 text-[11px] font-semibold uppercase tracking-wide text-dimmed">
|
|
684
684
|
{{ t('outcome.visuals.title') }}
|
|
685
685
|
</h3>
|
|
686
686
|
<template v-if="outcome.visuals.status === 'reported'">
|
|
687
|
-
<p class="mb-2 text-[12px] leading-relaxed text-
|
|
687
|
+
<p class="mb-2 text-[12px] leading-relaxed text-muted">
|
|
688
688
|
{{
|
|
689
689
|
outcome.visuals.source === 'visual_confirm'
|
|
690
690
|
? t('outcome.visuals.source.visual_confirm')
|
|
@@ -696,7 +696,7 @@ function openTestReport() {
|
|
|
696
696
|
v-for="(view, position) in outcome.visuals.views"
|
|
697
697
|
:key="`${position}:${view.view}`"
|
|
698
698
|
type="button"
|
|
699
|
-
class="group overflow-hidden rounded-md border border-
|
|
699
|
+
class="group overflow-hidden rounded-md border border-default bg-app-950/60 text-start transition hover:border-app-600"
|
|
700
700
|
:disabled="!view.artifactId"
|
|
701
701
|
data-testid="outcome-shot"
|
|
702
702
|
@click="openShot(view, position)"
|
|
@@ -707,7 +707,7 @@ function openTestReport() {
|
|
|
707
707
|
:alt="t('outcome.visuals.shotAlt', { view: view.view })"
|
|
708
708
|
class="h-24 w-full object-cover object-top"
|
|
709
709
|
/>
|
|
710
|
-
<div v-else class="flex h-24 w-full items-center justify-center text-
|
|
710
|
+
<div v-else class="flex h-24 w-full items-center justify-center text-app-600">
|
|
711
711
|
<UIcon
|
|
712
712
|
:name="
|
|
713
713
|
view.artifactId && blobs.statusFor(view.artifactId) === 'error'
|
|
@@ -718,13 +718,13 @@ function openTestReport() {
|
|
|
718
718
|
/>
|
|
719
719
|
</div>
|
|
720
720
|
<span
|
|
721
|
-
class="flex items-center gap-1 truncate px-1.5 py-1 text-[11px] text-
|
|
721
|
+
class="flex items-center gap-1 truncate px-1.5 py-1 text-[11px] text-toned"
|
|
722
722
|
:title="view.view"
|
|
723
723
|
>
|
|
724
724
|
<UIcon
|
|
725
725
|
v-if="view.referenceArtifactId"
|
|
726
726
|
name="i-lucide-images"
|
|
727
|
-
class="h-3 w-3 shrink-0 text-
|
|
727
|
+
class="h-3 w-3 shrink-0 text-app-info-300"
|
|
728
728
|
:title="t('outcome.visuals.hasReference')"
|
|
729
729
|
/>
|
|
730
730
|
{{ view.view }}
|
|
@@ -733,12 +733,12 @@ function openTestReport() {
|
|
|
733
733
|
</div>
|
|
734
734
|
</template>
|
|
735
735
|
<template v-else>
|
|
736
|
-
<p class="text-[13px] italic leading-relaxed text-
|
|
736
|
+
<p class="text-[13px] italic leading-relaxed text-dimmed">
|
|
737
737
|
{{ t(VISUALS_GAP_KEYS[outcome.visuals.gap]) }}
|
|
738
738
|
</p>
|
|
739
739
|
<p
|
|
740
740
|
v-if="outcome.visuals.detail"
|
|
741
|
-
class="mt-1 text-[12px] leading-relaxed text-
|
|
741
|
+
class="mt-1 text-[12px] leading-relaxed text-dimmed"
|
|
742
742
|
data-testid="outcome-visuals-detail"
|
|
743
743
|
>
|
|
744
744
|
{{ outcome.visuals.detail }}
|
|
@@ -750,14 +750,14 @@ function openTestReport() {
|
|
|
750
750
|
not read diffs starts from. Beside the captured views on purpose: the shots are what
|
|
751
751
|
this run saw, this is the thing itself. -->
|
|
752
752
|
<section class="mb-5" data-testid="outcome-environments">
|
|
753
|
-
<h3 class="mb-1.5 text-[11px] font-semibold uppercase tracking-wide text-
|
|
753
|
+
<h3 class="mb-1.5 text-[11px] font-semibold uppercase tracking-wide text-dimmed">
|
|
754
754
|
{{ t('outcome.environments.title') }}
|
|
755
755
|
</h3>
|
|
756
756
|
<template v-if="outcome.environments.status === 'reported'">
|
|
757
757
|
<div
|
|
758
758
|
v-for="row in environmentRows"
|
|
759
759
|
:key="row.key"
|
|
760
|
-
class="mb-2 rounded-md border border-
|
|
760
|
+
class="mb-2 rounded-md border border-default bg-app-950/40 px-2.5 py-2 last:mb-0"
|
|
761
761
|
data-testid="outcome-environment"
|
|
762
762
|
:data-state="row.state"
|
|
763
763
|
>
|
|
@@ -765,10 +765,10 @@ function openTestReport() {
|
|
|
765
765
|
<UBadge :color="ENVIRONMENT_STATE_COLOR[row.state]" variant="subtle" size="sm">
|
|
766
766
|
{{ t(ENVIRONMENT_STATE_KEYS[row.state]) }}
|
|
767
767
|
</UBadge>
|
|
768
|
-
<span v-if="row.service" class="truncate text-[12px] text-
|
|
768
|
+
<span v-if="row.service" class="truncate text-[12px] text-toned">
|
|
769
769
|
{{ row.service }}
|
|
770
770
|
</span>
|
|
771
|
-
<span class="text-[11px] text-
|
|
771
|
+
<span class="text-[11px] text-dimmed">
|
|
772
772
|
{{ t(ENVIRONMENT_ORIGIN_KEYS[row.origin]) }}
|
|
773
773
|
</span>
|
|
774
774
|
</div>
|
|
@@ -789,15 +789,15 @@ function openTestReport() {
|
|
|
789
789
|
</UButton>
|
|
790
790
|
<p
|
|
791
791
|
v-else-if="row.url"
|
|
792
|
-
class="mt-1.5 break-all text-[12px] text-
|
|
792
|
+
class="mt-1.5 break-all text-[12px] text-dimmed"
|
|
793
793
|
data-testid="outcome-environment-url"
|
|
794
794
|
>
|
|
795
795
|
{{ row.url }}
|
|
796
796
|
</p>
|
|
797
|
-
<p v-if="row.retained" class="mt-1 text-[11px] text-
|
|
797
|
+
<p v-if="row.retained" class="mt-1 text-[11px] text-muted">
|
|
798
798
|
{{ t('outcome.environments.retained') }}
|
|
799
799
|
</p>
|
|
800
|
-
<p v-if="row.expiresAt" class="mt-1 text-[11px] text-
|
|
800
|
+
<p v-if="row.expiresAt" class="mt-1 text-[11px] text-dimmed">
|
|
801
801
|
{{
|
|
802
802
|
row.lapsed
|
|
803
803
|
? t('outcome.environments.expired', { date: d(new Date(row.expiresAt), 'long') })
|
|
@@ -810,7 +810,7 @@ function openTestReport() {
|
|
|
810
810
|
otherwise holds "quota exceeded" reports a fault the environment does not have. -->
|
|
811
811
|
<p
|
|
812
812
|
v-if="row.detail"
|
|
813
|
-
class="mt-1 break-words text-[12px] leading-relaxed text-
|
|
813
|
+
class="mt-1 break-words text-[12px] leading-relaxed text-dimmed"
|
|
814
814
|
data-testid="outcome-environment-detail"
|
|
815
815
|
:data-detail-kind="row.detailKind"
|
|
816
816
|
>
|
|
@@ -822,14 +822,14 @@ function openTestReport() {
|
|
|
822
822
|
</p>
|
|
823
823
|
</div>
|
|
824
824
|
</template>
|
|
825
|
-
<p v-else class="text-[13px] italic leading-relaxed text-
|
|
825
|
+
<p v-else class="text-[13px] italic leading-relaxed text-dimmed">
|
|
826
826
|
{{ t(ENVIRONMENTS_GAP_KEYS[outcome.environments.gap]) }}
|
|
827
827
|
</p>
|
|
828
828
|
</section>
|
|
829
829
|
|
|
830
830
|
<!-- The machine checks, listed only where one actually recorded a verdict. -->
|
|
831
831
|
<section v-if="checkRows.length" data-testid="outcome-checks">
|
|
832
|
-
<h3 class="mb-1.5 text-[11px] font-semibold uppercase tracking-wide text-
|
|
832
|
+
<h3 class="mb-1.5 text-[11px] font-semibold uppercase tracking-wide text-dimmed">
|
|
833
833
|
{{ t('outcome.checks.title') }}
|
|
834
834
|
</h3>
|
|
835
835
|
<div class="flex flex-wrap items-center gap-1.5">
|
|
@@ -57,7 +57,7 @@ function toggle(id: string) {
|
|
|
57
57
|
|
|
58
58
|
<template>
|
|
59
59
|
<div class="space-y-2">
|
|
60
|
-
<p class="px-1 text-[11px] text-
|
|
60
|
+
<p class="px-1 text-[11px] text-dimmed">{{ t('palette.hint') }}</p>
|
|
61
61
|
<!-- The two catalog dials, one above the other: what this pipeline is for, and how deep into
|
|
62
62
|
the agent catalog to look. Both narrow the sections below, and each states its own count.
|
|
63
63
|
Stacked rather than side by side because the palette column is a third of the slideover:
|
|
@@ -75,7 +75,7 @@ function toggle(id: string) {
|
|
|
75
75
|
<section v-for="g in groups" :key="g.id">
|
|
76
76
|
<button
|
|
77
77
|
type="button"
|
|
78
|
-
class="flex w-full items-center gap-1.5 rounded px-1 py-1 text-start text-[11px] font-semibold uppercase tracking-wide text-
|
|
78
|
+
class="flex w-full items-center gap-1.5 rounded px-1 py-1 text-start text-[11px] font-semibold uppercase tracking-wide text-muted transition hover:text-default"
|
|
79
79
|
@click="toggle(g.id)"
|
|
80
80
|
>
|
|
81
81
|
<UIcon
|
|
@@ -83,29 +83,29 @@ function toggle(id: string) {
|
|
|
83
83
|
class="h-3.5 w-3.5 shrink-0"
|
|
84
84
|
/>
|
|
85
85
|
<span>{{ g.label }}</span>
|
|
86
|
-
<span class="ms-auto text-
|
|
86
|
+
<span class="ms-auto text-app-600">{{ g.agents.length }}</span>
|
|
87
87
|
</button>
|
|
88
88
|
<div v-if="!isCollapsed(g.id)" class="mt-1 space-y-1.5">
|
|
89
89
|
<button
|
|
90
90
|
v-for="a in g.agents"
|
|
91
91
|
:key="a.kind"
|
|
92
92
|
type="button"
|
|
93
|
-
class="flex w-full items-center gap-2.5 rounded-lg border border-
|
|
93
|
+
class="flex w-full items-center gap-2.5 rounded-lg border border-muted bg-elevated/60 p-2 text-start transition hover:border-app-500 hover:bg-elevated"
|
|
94
94
|
:title="a.description"
|
|
95
95
|
:data-testid="`palette-agent-${a.kind}`"
|
|
96
96
|
@click="$emit('add', a.kind)"
|
|
97
97
|
>
|
|
98
98
|
<div
|
|
99
99
|
class="flex h-8 w-8 shrink-0 items-center justify-center rounded-lg"
|
|
100
|
-
:style="{ backgroundColor: a.color
|
|
100
|
+
:style="{ backgroundColor: tint(a.color) }"
|
|
101
101
|
>
|
|
102
102
|
<UIcon :name="a.icon" class="h-4 w-4" :style="{ color: a.color }" />
|
|
103
103
|
</div>
|
|
104
104
|
<div class="min-w-0">
|
|
105
|
-
<div class="text-xs font-semibold text-
|
|
106
|
-
<div class="truncate text-[10px] text-
|
|
105
|
+
<div class="text-xs font-semibold text-app-100">{{ a.label }}</div>
|
|
106
|
+
<div class="truncate text-[10px] text-muted">{{ a.description }}</div>
|
|
107
107
|
</div>
|
|
108
|
-
<UIcon name="i-lucide-plus" class="ms-auto h-4 w-4 shrink-0 text-
|
|
108
|
+
<UIcon name="i-lucide-plus" class="ms-auto h-4 w-4 shrink-0 text-dimmed" />
|
|
109
109
|
</button>
|
|
110
110
|
</div>
|
|
111
111
|
</section>
|
|
@@ -60,7 +60,7 @@ const items = computed(() => [
|
|
|
60
60
|
</span>
|
|
61
61
|
</UButton>
|
|
62
62
|
</UDropdownMenu>
|
|
63
|
-
<p v-if="props.hiddenCount" class="px-1 text-[10px] text-
|
|
63
|
+
<p v-if="props.hiddenCount" class="px-1 text-[10px] text-dimmed">
|
|
64
64
|
{{ t('agentTier.hidden', { count: props.hiddenCount }, props.hiddenCount) }}
|
|
65
65
|
</p>
|
|
66
66
|
</div>
|
|
@@ -71,7 +71,7 @@ const items = computed(() => [
|
|
|
71
71
|
<span class="truncate"> {{ t('pipeline.builder.purposeLabel') }}: {{ current }} </span>
|
|
72
72
|
</UButton>
|
|
73
73
|
</UDropdownMenu>
|
|
74
|
-
<p v-if="props.hiddenCount" class="px-1 text-[10px] text-
|
|
74
|
+
<p v-if="props.hiddenCount" class="px-1 text-[10px] text-dimmed">
|
|
75
75
|
{{ t('palette.purposeHidden', { count: props.hiddenCount }, props.hiddenCount) }}
|
|
76
76
|
</p>
|
|
77
77
|
</div>
|