@cat-factory/app 0.307.1 → 0.309.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +21 -0
- package/app/assets/css/main.css +22 -0
- package/app/assets/css/prose.css +4 -4
- package/app/assets/css/type.css +24 -0
- package/app/components/assistant/AssistantModal.vue +3 -2
- package/app/components/auth/UserMenu.vue +1 -1
- package/app/components/binaryCandidates/BinaryCandidatesWindow.vue +15 -15
- package/app/components/binaryOutput/BinaryOutputReport.vue +10 -14
- package/app/components/binaryOutput/StoredAssetView.vue +5 -5
- package/app/components/board/AddTaskModal.vue +16 -14
- package/app/components/board/AgentFailureCard.vue +9 -9
- package/app/components/board/AgentFailureHistory.vue +1 -1
- package/app/components/board/CreateInitiativeModal.vue +2 -2
- package/app/components/board/FailureDetail.vue +1 -1
- package/app/components/board/FailureHistoryList.vue +5 -5
- package/app/components/board/RecurringPipelineModal.vue +12 -11
- package/app/components/board/ReviewFrictionDialog.vue +4 -3
- package/app/components/board/StepExecutionHistory.vue +8 -8
- package/app/components/board/nodes/AgentChip.vue +1 -1
- package/app/components/board/nodes/BlockNode.vue +8 -9
- package/app/components/board/nodes/EpicNode.vue +4 -4
- package/app/components/board/nodes/FrameSwimlanes.vue +4 -7
- package/app/components/board/nodes/InitiativeCard.vue +4 -4
- package/app/components/board/nodes/LaneGroup.vue +3 -5
- package/app/components/board/nodes/TaskCard.vue +8 -8
- package/app/components/board/nodes/TaskLane.vue +3 -3
- package/app/components/board/nodes/TaskPipelineMini.vue +13 -12
- package/app/components/bootstrap/AdoptionReviewModal.vue +7 -6
- package/app/components/bootstrap/BootstrapModal.vue +11 -10
- package/app/components/bootstrap/BootstrapRunSteps.vue +1 -1
- package/app/components/brainstorm/BrainstormWindow.vue +8 -7
- package/app/components/bugFishing/BugFishingWindow.vue +37 -36
- package/app/components/clarity/ClarityReviewWindow.vue +8 -7
- package/app/components/common/AsyncViewError.vue +1 -1
- package/app/components/common/ClarificationItem.vue +6 -6
- package/app/components/common/DescriptorFields.vue +1 -1
- package/app/components/common/EmptyState.vue +1 -1
- package/app/components/common/InterviewGateNotice.vue +4 -4
- package/app/components/common/MarkdownProse.vue +8 -2
- package/app/components/common/SectionLabel.vue +38 -0
- package/app/components/consensus/ConsensusSessionWindow.vue +10 -9
- package/app/components/context/ContextAttachmentFields.vue +9 -8
- package/app/components/docs/DocInterviewWindow.vue +10 -9
- package/app/components/documents/ContextDocumentPicker.vue +10 -12
- package/app/components/documents/DocumentImportModal.vue +3 -2
- package/app/components/documents/DocumentSourceConnectModal.vue +2 -2
- package/app/components/documents/DocumentSyncState.vue +1 -1
- package/app/components/documents/DocumentTemplatesModal.vue +5 -4
- package/app/components/documents/RepoContextDocPicker.vue +3 -6
- package/app/components/documents/StartFromDesignModal.vue +4 -4
- package/app/components/documents/TaskContextDocs.vue +1 -1
- package/app/components/environments/EnvSetupStepper.vue +3 -3
- package/app/components/environments/EnvironmentStatusPanel.vue +11 -10
- package/app/components/environments/steps/EnvPreflightStep.vue +8 -8
- package/app/components/environments/steps/EnvReviewStep.vue +23 -22
- package/app/components/environments/steps/EnvSaveStep.vue +5 -5
- package/app/components/focus/BlockFocusView.vue +11 -10
- package/app/components/followUp/FollowUpWindow.vue +10 -10
- package/app/components/forkDecision/ForkDecisionWindow.vue +23 -26
- package/app/components/foundational/FoundationalContractSummary.vue +2 -2
- package/app/components/foundational/FoundationalServiceCatalogList.vue +3 -3
- package/app/components/foundational/FoundationalServiceRegistry.vue +3 -3
- package/app/components/foundational/FoundationalSuppressions.vue +2 -2
- package/app/components/fragments/FragmentLibraryManager.vue +3 -3
- package/app/components/fragments/FragmentSelector.vue +10 -11
- package/app/components/gates/GateFailingCheckList.vue +3 -3
- package/app/components/gates/GateResultView.vue +39 -38
- package/app/components/github/AddServiceFromRepoModal.vue +5 -4
- package/app/components/github/BranchProtectionPreflight.vue +5 -5
- package/app/components/github/GitHubConnect.vue +5 -3
- package/app/components/github/GitHubPanel.vue +14 -13
- package/app/components/github/RepoTreeBrowser.vue +1 -1
- package/app/components/humanTest/HumanTestWindow.vue +18 -17
- package/app/components/initiative/InitiativePlanNotice.vue +3 -3
- package/app/components/initiative/InitiativePlanReview.vue +19 -21
- package/app/components/initiative/InitiativePlanningWindow.vue +5 -5
- package/app/components/initiative/InitiativeTrackerWindow.vue +54 -53
- package/app/components/judge/JudgeResultView.vue +24 -25
- package/app/components/kaizen/KaizenPanel.vue +4 -4
- package/app/components/kaizen/KaizenStepStatus.vue +7 -6
- package/app/components/layout/AccountAuditLog.vue +1 -1
- package/app/components/layout/AccountDeploymentSettings.vue +10 -10
- 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 +7 -7
- package/app/components/layout/AccountPlatformAlertSettings.vue +8 -8
- package/app/components/layout/AccountRiskPolicySettings.vue +2 -2
- package/app/components/layout/AccountRunCredentialSettings.vue +3 -3
- package/app/components/layout/AccountSkillSettings.vue +1 -1
- package/app/components/layout/AccountTeamSettings.vue +4 -0
- package/app/components/layout/AiProvidersBanner.vue +1 -1
- package/app/components/layout/AppearanceSwitcher.vue +1 -1
- package/app/components/layout/BoardSwitcher.vue +3 -2
- package/app/components/layout/BoardToolbar.vue +6 -2
- package/app/components/layout/CommandBar.vue +4 -2
- package/app/components/layout/DefaultTestEnvBanner.vue +2 -2
- package/app/components/layout/IntegrationsHub.vue +4 -3
- package/app/components/layout/LanguageSwitcher.vue +1 -1
- package/app/components/layout/ModelProvidersHub.vue +6 -4
- package/app/components/layout/NotificationsInbox.vue +8 -7
- package/app/components/layout/PersonalSetupModal.vue +5 -3
- package/app/components/layout/RolePrompt.vue +1 -1
- package/app/components/layout/SideBar.vue +3 -5
- package/app/components/layout/SpendWarningBanner.vue +3 -3
- package/app/components/layout/TranslationWarningBanner.vue +1 -1
- package/app/components/layout/UiModeSwitcher.vue +7 -6
- package/app/components/layout/UiRoleSwitcher.vue +2 -2
- package/app/components/media/ArtifactLightbox.vue +6 -6
- package/app/components/media/ImageCompare.vue +16 -16
- package/app/components/merge/MergeEffortChips.vue +4 -6
- package/app/components/notifications/NotificationSettingsPanel.vue +6 -5
- package/app/components/observability/OutcomeFilterChips.vue +1 -1
- package/app/components/observability/RunFailureSummary.vue +14 -17
- package/app/components/observability/StepMetricsBar.vue +9 -8
- package/app/components/observability/StepModelActivity.vue +4 -3
- package/app/components/observability/ToolCallList.vue +15 -18
- package/app/components/outcome/OutcomeSummaryWindow.vue +43 -42
- package/app/components/palettes/AgentPalette.vue +7 -5
- package/app/components/palettes/AgentTierSelect.vue +1 -1
- package/app/components/palettes/PipelinePurposeSelect.vue +2 -1
- package/app/components/panels/AgentStepDetail.vue +27 -30
- package/app/components/panels/AttemptEntryHeader.vue +2 -2
- package/app/components/panels/DecisionModal.vue +1 -1
- package/app/components/panels/GenericStructuredResultView.vue +6 -5
- package/app/components/panels/InspectorPanel.vue +15 -13
- package/app/components/panels/MergerResultView.vue +10 -9
- package/app/components/panels/ObservabilityPanel.vue +66 -76
- package/app/components/panels/OperatorDashboardPanel.vue +27 -26
- package/app/components/panels/ReportsPanel.vue +26 -25
- package/app/components/panels/ReportsSpendBreakdown.vue +2 -2
- package/app/components/panels/ResultWindowShell.vue +19 -18
- package/app/components/panels/RunDetailLoadState.vue +1 -1
- package/app/components/panels/StepContainerStatus.vue +8 -7
- package/app/components/panels/StepDelegatedStatus.vue +13 -12
- package/app/components/panels/StepEffortReport.vue +12 -17
- package/app/components/panels/StepFragmentAdherence.vue +9 -10
- package/app/components/panels/StepMetadataCard.vue +41 -43
- package/app/components/panels/StepReproductionReport.vue +18 -20
- package/app/components/panels/StepRunMeta.vue +27 -26
- package/app/components/panels/StepTestReport.vue +16 -15
- package/app/components/panels/StepToolServers.vue +7 -8
- package/app/components/panels/StepValidationReport.vue +5 -5
- package/app/components/panels/inspector/ContainerSummary.vue +4 -4
- package/app/components/panels/inspector/DocReferenceRepos.vue +5 -4
- package/app/components/panels/inspector/EnvProbeReport.vue +16 -13
- package/app/components/panels/inspector/EpicChildren.vue +8 -7
- package/app/components/panels/inspector/FrontendBindingsResolved.vue +5 -4
- package/app/components/panels/inspector/FrontendConfig.vue +26 -34
- package/app/components/panels/inspector/InitiativeInspector.vue +3 -3
- package/app/components/panels/inspector/InspectorSection.vue +7 -4
- package/app/components/panels/inspector/RecurringScheduleSettings.vue +9 -8
- 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 +9 -13
- package/app/components/panels/inspector/ServiceTestConfig.vue +41 -45
- package/app/components/panels/inspector/ServiceTestSecrets.vue +3 -3
- package/app/components/panels/inspector/ServiceTestingContext.vue +2 -2
- package/app/components/panels/inspector/ServiceValidationConfig.vue +2 -2
- package/app/components/panels/inspector/TaskAgentConfig.vue +2 -2
- package/app/components/panels/inspector/TaskAprioriBranches.vue +6 -5
- package/app/components/panels/inspector/TaskDependencies.vue +1 -1
- package/app/components/panels/inspector/TaskEstimateBadge.vue +3 -7
- package/app/components/panels/inspector/TaskExecution.vue +13 -12
- package/app/components/panels/inspector/TaskRunSettings.vue +35 -38
- package/app/components/panels/inspector/TaskStructure.vue +5 -4
- package/app/components/pipeline/AgentPromptEditor.vue +15 -14
- package/app/components/pipeline/BinaryOutputStepPicker.vue +42 -52
- package/app/components/pipeline/EstimateThresholdFields.vue +2 -2
- package/app/components/pipeline/GateConfigFields.vue +6 -6
- package/app/components/pipeline/IterationCapPrompt.vue +1 -1
- package/app/components/pipeline/PipelineBuilder.vue +28 -27
- package/app/components/pipeline/PipelineHealthModal.vue +7 -7
- package/app/components/pipeline/PipelinePicker.vue +3 -3
- package/app/components/pipeline/PipelinePreview.vue +6 -7
- package/app/components/pipeline/PipelineProgress.vue +23 -24
- package/app/components/prReview/PrReviewWindow.vue +42 -41
- package/app/components/providers/AiPresetMismatchDialog.vue +4 -3
- package/app/components/providers/AiProviderOnboardingModal.vue +2 -2
- package/app/components/providers/ApiKeysSection.vue +7 -6
- package/app/components/providers/PersonalSubscriptionSection.vue +4 -3
- package/app/components/providers/VendorCredentialsModal.vue +5 -4
- package/app/components/provisioning/ProvisioningLogsDrawer.vue +10 -9
- package/app/components/ralph/RalphLoopResultView.vue +25 -26
- package/app/components/requirements/RequirementsReviewWindow.vue +13 -12
- package/app/components/riskPolicy/RiskPolicyPicker.vue +5 -5
- package/app/components/riskPolicy/RiskPolicyPreview.vue +16 -15
- package/app/components/sandbox/SandboxPanel.vue +21 -20
- package/app/components/settings/ApiTokensPanel.vue +1 -1
- package/app/components/settings/BudgetSettings.vue +18 -17
- package/app/components/settings/CapabilityCredentialsPanel.vue +5 -5
- package/app/components/settings/CloudflareHandlerSection.vue +16 -16
- package/app/components/settings/ComposeEnvironmentSetupSection.vue +14 -12
- package/app/components/settings/ConnectionTestVerdict.vue +1 -1
- package/app/components/settings/ConsensusGroupsSection.vue +21 -20
- package/app/components/settings/CustomManifestTypeEditor.vue +8 -7
- package/app/components/settings/DefaultProvisionTypeSection.vue +5 -5
- package/app/components/settings/InfraHandlersConfigurator.vue +14 -15
- package/app/components/settings/InfrastructureBackendPicker.vue +2 -2
- package/app/components/settings/IssueTrackerPanel.vue +9 -15
- package/app/components/settings/KubernetesEngineForm.vue +9 -8
- package/app/components/settings/KubernetesEnvironmentForm.vue +4 -3
- package/app/components/settings/LocalContainerPoolSettings.vue +2 -2
- package/app/components/settings/LocalModelEndpointsPanel.vue +10 -9
- package/app/components/settings/MergeClassRulesEditor.vue +6 -5
- package/app/components/settings/MergeRolePolicyEditor.vue +13 -12
- package/app/components/settings/ModelConfigurationPanel.vue +8 -11
- package/app/components/settings/ModelPresetHealthModal.vue +3 -3
- package/app/components/settings/ObservabilityConnectionPanel.vue +1 -1
- package/app/components/settings/OpenRouterCatalogPanel.vue +6 -5
- package/app/components/settings/PackageRegistriesPanel.vue +4 -4
- package/app/components/settings/ProviderConnectionTab.vue +5 -4
- package/app/components/settings/ProviderManifestEditor.vue +9 -8
- package/app/components/settings/ProviderPreferenceEditor.vue +8 -7
- package/app/components/settings/RiskPolicyCreateForm.vue +40 -26
- package/app/components/settings/RiskPolicyEditorRow.vue +18 -17
- package/app/components/settings/RiskPolicyHealthModal.vue +3 -3
- package/app/components/settings/RiskPolicyPanel.vue +11 -13
- package/app/components/settings/ServiceFragmentDefaultsPanel.vue +5 -4
- package/app/components/settings/SharedStacksPanel.vue +5 -5
- package/app/components/settings/TaskSourceCard.vue +2 -2
- package/app/components/settings/TaskTypeSuppressionsPanel.vue +4 -4
- package/app/components/settings/ToolServerChecklist.vue +22 -22
- package/app/components/settings/UsageSettings.vue +13 -13
- package/app/components/settings/UserSecretsSection.vue +4 -3
- package/app/components/settings/WorkspaceMetadataSettings.vue +6 -5
- package/app/components/settings/WorkspaceSettingsPanel.vue +72 -58
- package/app/components/skills/ReviewSkillQueue.vue +8 -7
- package/app/components/skills/SkillLibraryManager.vue +2 -2
- package/app/components/slack/SlackPanel.vue +8 -7
- package/app/components/spec/ServiceSpecWindow.vue +15 -16
- package/app/components/tasks/BugHuntModal.vue +1 -1
- package/app/components/tasks/ContextIssuePicker.vue +4 -6
- package/app/components/tasks/TaskContextIssues.vue +1 -1
- package/app/components/tasks/TaskImportModal.vue +3 -2
- package/app/components/tasks/TaskSourceConnectModal.vue +5 -5
- package/app/components/testing/TestReportWindow.vue +54 -53
- package/app/components/tutorial/TutorialNudge.vue +3 -2
- package/app/components/tutorial/TutorialOverlay.vue +3 -2
- package/app/components/vcs/GitLabConnect.vue +1 -1
- package/app/components/visualConfirm/VisualConfirmationWindow.vue +23 -25
- package/app/composables/usePipelineErrorToast.ts +2 -0
- package/app/utils/catalog.ts +8 -0
- package/app/utils/theme/builtins.ts +7 -1
- package/i18n/locales/de.json +6 -3
- package/i18n/locales/en.json +6 -3
- package/i18n/locales/es.json +6 -3
- package/i18n/locales/fr.json +6 -3
- package/i18n/locales/he.json +6 -3
- package/i18n/locales/it.json +6 -3
- package/i18n/locales/ja.json +6 -3
- package/i18n/locales/pl.json +6 -3
- package/i18n/locales/tr.json +6 -3
- package/i18n/locales/uk.json +6 -3
- package/package.json +2 -2
|
@@ -21,6 +21,7 @@ import {
|
|
|
21
21
|
import RepoTreeBrowser from '~/components/github/RepoTreeBrowser.vue'
|
|
22
22
|
import VcsConnectSurfaces from '~/components/vcs/VcsConnectSurfaces.vue'
|
|
23
23
|
import { appInstallationManageUrl, newRepoUrl, VCS_PROVIDER_LABELS } from '~/utils/vcs'
|
|
24
|
+
import SectionLabel from '~/components/common/SectionLabel.vue'
|
|
24
25
|
|
|
25
26
|
const ui = useUiStore()
|
|
26
27
|
const bootstrap = useBootstrapStore()
|
|
@@ -648,9 +649,9 @@ const statusLabel = computed<Record<BootstrapStatus, string>>(() => ({
|
|
|
648
649
|
|
|
649
650
|
<!-- launch -->
|
|
650
651
|
<section class="space-y-4">
|
|
651
|
-
<
|
|
652
|
+
<SectionLabel as="h3">
|
|
652
653
|
{{ t('bootstrap.section.newRepo') }}
|
|
653
|
-
</
|
|
654
|
+
</SectionLabel>
|
|
654
655
|
|
|
655
656
|
<UFormField :label="t('bootstrap.target.label')" required>
|
|
656
657
|
<URadioGroup v-model="target" :items="targetItems" />
|
|
@@ -912,9 +913,9 @@ const statusLabel = computed<Record<BootstrapStatus, string>>(() => ({
|
|
|
912
913
|
|
|
913
914
|
<!-- recent jobs -->
|
|
914
915
|
<section v-if="agentRuns.bootstrapJobs.length" class="space-y-2">
|
|
915
|
-
<
|
|
916
|
+
<SectionLabel as="h3">
|
|
916
917
|
{{ t('bootstrap.recent.title') }}
|
|
917
|
-
</
|
|
918
|
+
</SectionLabel>
|
|
918
919
|
<div
|
|
919
920
|
v-for="job in agentRuns.bootstrapJobs.slice(0, 5)"
|
|
920
921
|
:key="job.id"
|
|
@@ -922,7 +923,7 @@ const statusLabel = computed<Record<BootstrapStatus, string>>(() => ({
|
|
|
922
923
|
>
|
|
923
924
|
<div class="min-w-0">
|
|
924
925
|
<div class="truncate text-default">{{ job.repoName }}</div>
|
|
925
|
-
<div class="truncate text-
|
|
926
|
+
<div class="truncate text-2xs text-dimmed">
|
|
926
927
|
{{
|
|
927
928
|
job.referenceArchitectureName
|
|
928
929
|
? t('bootstrap.recent.fromArch', { name: job.referenceArchitectureName })
|
|
@@ -935,7 +936,7 @@ const statusLabel = computed<Record<BootstrapStatus, string>>(() => ({
|
|
|
935
936
|
v-if="job.repoUrl"
|
|
936
937
|
:to="job.repoUrl"
|
|
937
938
|
target="_blank"
|
|
938
|
-
class="text-
|
|
939
|
+
class="text-2xs text-primary hover:underline"
|
|
939
940
|
>
|
|
940
941
|
{{ t('bootstrap.recent.open') }}
|
|
941
942
|
</ULink>
|
|
@@ -947,7 +948,7 @@ const statusLabel = computed<Record<BootstrapStatus, string>>(() => ({
|
|
|
947
948
|
v-if="job.prUrl"
|
|
948
949
|
:to="job.prUrl"
|
|
949
950
|
target="_blank"
|
|
950
|
-
class="text-
|
|
951
|
+
class="text-2xs text-primary hover:underline"
|
|
951
952
|
>
|
|
952
953
|
{{ t('bootstrap.recent.openPr') }}
|
|
953
954
|
</ULink>
|
|
@@ -963,9 +964,9 @@ const statusLabel = computed<Record<BootstrapStatus, string>>(() => ({
|
|
|
963
964
|
<!-- reference architecture management -->
|
|
964
965
|
<section class="space-y-3">
|
|
965
966
|
<div class="flex items-center justify-between">
|
|
966
|
-
<
|
|
967
|
+
<SectionLabel as="h3">
|
|
967
968
|
{{ t('bootstrap.arch.title') }}
|
|
968
|
-
</
|
|
969
|
+
</SectionLabel>
|
|
969
970
|
<UButton
|
|
970
971
|
size="xs"
|
|
971
972
|
color="neutral"
|
|
@@ -984,7 +985,7 @@ const statusLabel = computed<Record<BootstrapStatus, string>>(() => ({
|
|
|
984
985
|
>
|
|
985
986
|
<div class="min-w-0">
|
|
986
987
|
<div class="truncate text-sm text-default">{{ a.name }}</div>
|
|
987
|
-
<div class="truncate text-
|
|
988
|
+
<div class="truncate text-2xs text-dimmed">{{ a.repoOwner }}/{{ a.repoName }}</div>
|
|
988
989
|
</div>
|
|
989
990
|
<div class="flex items-center gap-1">
|
|
990
991
|
<UButton
|
|
@@ -19,6 +19,7 @@ import type {
|
|
|
19
19
|
ReviewItemSeverity,
|
|
20
20
|
ReviewItemStatus,
|
|
21
21
|
} from '~/types/brainstorm'
|
|
22
|
+
import SectionLabel from '~/components/common/SectionLabel.vue'
|
|
22
23
|
|
|
23
24
|
const board = useBoardStore()
|
|
24
25
|
const brainstorm = useBrainstormStore()
|
|
@@ -384,9 +385,9 @@ async function resolveExceeded(choice: 'extra-round' | 'proceed' | 'stop-reset')
|
|
|
384
385
|
v-if="item.reply"
|
|
385
386
|
class="mt-2 max-w-3xl rounded-md border-s-2 border-muted bg-app-950/40 px-3 py-1.5 text-sm text-toned"
|
|
386
387
|
>
|
|
387
|
-
<
|
|
388
|
+
<SectionLabel as="span">
|
|
388
389
|
{{ t('brainstorm.yourChoice') }}
|
|
389
|
-
</
|
|
390
|
+
</SectionLabel>
|
|
390
391
|
<p class="whitespace-pre-line">{{ item.reply }}</p>
|
|
391
392
|
</div>
|
|
392
393
|
|
|
@@ -454,7 +455,7 @@ async function resolveExceeded(choice: 'extra-round' | 'proceed' | 'stop-reset')
|
|
|
454
455
|
|
|
455
456
|
<!-- converged document: the standard-format direction -->
|
|
456
457
|
<section v-if="outline" class="mt-6 border-t border-default pt-5">
|
|
457
|
-
<div class="mb-3 flex items-center gap-1.5 text-
|
|
458
|
+
<div class="mb-3 flex items-center gap-1.5 text-2xs text-app-success-400">
|
|
458
459
|
<UIcon name="i-lucide-file-check-2" class="h-3.5 w-3.5" />
|
|
459
460
|
<span class="font-semibold uppercase tracking-wide">
|
|
460
461
|
{{ incorporated ? docNoun : t('brainstorm.docDraft', { doc: docNoun }) }}
|
|
@@ -482,7 +483,7 @@ async function resolveExceeded(choice: 'extra-round' | 'proceed' | 'stop-reset')
|
|
|
482
483
|
</button>
|
|
483
484
|
<div
|
|
484
485
|
v-show="!s.title || !collapsed[s.id]"
|
|
485
|
-
class="reader-prose mt-1 ps-5.5 text-
|
|
486
|
+
class="reader-prose mt-1 ps-5.5 text-sm leading-relaxed text-toned"
|
|
486
487
|
v-html="s.bodyHtml"
|
|
487
488
|
/>
|
|
488
489
|
</div>
|
|
@@ -541,7 +542,7 @@ async function resolveExceeded(choice: 'extra-round' | 'proceed' | 'stop-reset')
|
|
|
541
542
|
>
|
|
542
543
|
{{ t('brainstorm.incorporateChoices') }}
|
|
543
544
|
</UButton>
|
|
544
|
-
<p class="text-
|
|
545
|
+
<p class="text-2xs leading-relaxed text-dimmed">
|
|
545
546
|
<template v-if="canProceed">
|
|
546
547
|
{{ t('brainstorm.hint.allDismissed') }}
|
|
547
548
|
</template>
|
|
@@ -603,14 +604,14 @@ async function resolveExceeded(choice: 'extra-round' | 'proceed' | 'stop-reset')
|
|
|
603
604
|
{{ t('brainstorm.redoWithDirection') }}
|
|
604
605
|
</UButton>
|
|
605
606
|
</div>
|
|
606
|
-
<p class="text-
|
|
607
|
+
<p class="text-2xs leading-relaxed text-dimmed">
|
|
607
608
|
{{ t('brainstorm.mergedHint') }}
|
|
608
609
|
</p>
|
|
609
610
|
</div>
|
|
610
611
|
|
|
611
612
|
<div
|
|
612
613
|
v-if="session && incorporated"
|
|
613
|
-
class="border-t border-default pt-4 text-
|
|
614
|
+
class="border-t border-default pt-4 text-2xs leading-relaxed text-dimmed"
|
|
614
615
|
>
|
|
615
616
|
{{ t('brainstorm.incorporatedFooter') }}
|
|
616
617
|
</div>
|
|
@@ -28,6 +28,7 @@ import type { BugFishingFinding, BugFishingSeverity, BugFishingStepState } from
|
|
|
28
28
|
import ResultWindowShell from '~/components/panels/ResultWindowShell.vue'
|
|
29
29
|
import StepRunMeta from '~/components/panels/StepRunMeta.vue'
|
|
30
30
|
import MarkdownProse from '~/components/common/MarkdownProse.vue'
|
|
31
|
+
import SectionLabel from '~/components/common/SectionLabel.vue'
|
|
31
32
|
|
|
32
33
|
const execution = useExecutionStore()
|
|
33
34
|
const board = useBoardStore()
|
|
@@ -263,12 +264,12 @@ const PHASE_ICON: Record<string, string> = {
|
|
|
263
264
|
data-testid="bug-fishing-phases"
|
|
264
265
|
class="w-60 shrink-0 overflow-y-auto border-r border-default px-3 py-4"
|
|
265
266
|
>
|
|
266
|
-
<p class="mb-2 px-1
|
|
267
|
+
<SectionLabel as="p" class="mb-2 px-1">
|
|
267
268
|
{{ t('bugFishing.phases.heading') }}
|
|
268
|
-
</
|
|
269
|
+
</SectionLabel>
|
|
269
270
|
<button
|
|
270
271
|
type="button"
|
|
271
|
-
class="mb-1 w-full rounded-md px-2 py-1.5 text-left text-
|
|
272
|
+
class="mb-1 w-full rounded-md px-2 py-1.5 text-left text-xs"
|
|
272
273
|
:class="
|
|
273
274
|
selectedPassKey === null
|
|
274
275
|
? 'bg-elevated text-app-100'
|
|
@@ -283,7 +284,7 @@ const PHASE_ICON: Record<string, string> = {
|
|
|
283
284
|
<div v-for="group in territoryGroups" :key="group.id ?? 'whole'" class="mb-2">
|
|
284
285
|
<p
|
|
285
286
|
v-if="group.label"
|
|
286
|
-
class="mb-1 mt-2 truncate px-1 text-
|
|
287
|
+
class="mb-1 mt-2 truncate px-1 text-3xs font-semibold uppercase tracking-wide text-app-info-400/80"
|
|
287
288
|
:title="group.label"
|
|
288
289
|
>
|
|
289
290
|
{{ group.label }}
|
|
@@ -312,8 +313,8 @@ const PHASE_ICON: Record<string, string> = {
|
|
|
312
313
|
}"
|
|
313
314
|
/>
|
|
314
315
|
<span class="min-w-0 flex-1">
|
|
315
|
-
<span class="block truncate text-
|
|
316
|
-
<span class="block text-
|
|
316
|
+
<span class="block truncate text-xs">{{ phase.title }}</span>
|
|
317
|
+
<span class="block text-3xs text-dimmed">
|
|
317
318
|
{{
|
|
318
319
|
phase.status === 'completed' || phase.status === 'failed'
|
|
319
320
|
? t('bugFishing.phases.found', { count: phaseFindingCount(phase) })
|
|
@@ -335,7 +336,7 @@ const PHASE_ICON: Record<string, string> = {
|
|
|
335
336
|
:style="{ width: `${coverageShare(phase)}%` }"
|
|
336
337
|
/>
|
|
337
338
|
</span>
|
|
338
|
-
<span class="mt-0.5 block text-
|
|
339
|
+
<span class="mt-0.5 block text-3xs text-app-600">
|
|
339
340
|
{{ t('bugFishing.coverage.share', { percent: coverageShare(phase) }) }}
|
|
340
341
|
</span>
|
|
341
342
|
</span>
|
|
@@ -354,18 +355,18 @@ const PHASE_ICON: Record<string, string> = {
|
|
|
354
355
|
v-if="selectedPhase"
|
|
355
356
|
class="mb-4 rounded-lg border border-default bg-default/40 px-3 py-2.5"
|
|
356
357
|
>
|
|
357
|
-
<p class="text-
|
|
358
|
+
<p class="text-2xs text-muted">{{ selectedPhase.goal }}</p>
|
|
358
359
|
<p
|
|
359
360
|
v-if="selectedPhase.status === 'failed'"
|
|
360
361
|
data-testid="bug-fishing-phase-failed"
|
|
361
|
-
class="mt-2 text-
|
|
362
|
+
class="mt-2 text-xs text-app-warning-300"
|
|
362
363
|
>
|
|
363
364
|
{{ t('bugFishing.phases.failedNote', { reason: selectedPhase.failureReason ?? '' }) }}
|
|
364
365
|
</p>
|
|
365
366
|
<MarkdownProse
|
|
366
367
|
v-else-if="selectedPhase.summary"
|
|
367
368
|
:text="selectedPhase.summary"
|
|
368
|
-
class="mt-2 max-w-3xl text-
|
|
369
|
+
class="mt-2 max-w-3xl text-xs"
|
|
369
370
|
/>
|
|
370
371
|
</div>
|
|
371
372
|
|
|
@@ -374,7 +375,7 @@ const PHASE_ICON: Record<string, string> = {
|
|
|
374
375
|
<div
|
|
375
376
|
v-if="fishing"
|
|
376
377
|
data-testid="bug-fishing-in-progress"
|
|
377
|
-
class="mb-4 flex items-center gap-2 rounded-lg border border-app-info-500/25 bg-app-info-500/5 px-3 py-2 text-
|
|
378
|
+
class="mb-4 flex items-center gap-2 rounded-lg border border-app-info-500/25 bg-app-info-500/5 px-3 py-2 text-xs text-app-info-200"
|
|
378
379
|
>
|
|
379
380
|
<UIcon name="i-lucide-loader-circle" class="h-4 w-4 shrink-0 animate-spin" />
|
|
380
381
|
<span>
|
|
@@ -395,7 +396,7 @@ const PHASE_ICON: Record<string, string> = {
|
|
|
395
396
|
<div
|
|
396
397
|
v-if="plan && (unfished.length > 0 || plan.treeTruncated || plan.surveyUnavailableReason)"
|
|
397
398
|
data-testid="bug-fishing-plan"
|
|
398
|
-
class="mb-4 rounded-lg border border-app-warning-500/25 bg-app-warning-500/5 px-3 py-2 text-
|
|
399
|
+
class="mb-4 rounded-lg border border-app-warning-500/25 bg-app-warning-500/5 px-3 py-2 text-xs text-app-warning-200"
|
|
399
400
|
>
|
|
400
401
|
<p v-if="plan.surveyUnavailableReason" data-testid="bug-fishing-survey-unavailable">
|
|
401
402
|
{{ t('bugFishing.plan.surveyUnavailable', { reason: plan.surveyUnavailableReason }) }}
|
|
@@ -412,7 +413,7 @@ const PHASE_ICON: Record<string, string> = {
|
|
|
412
413
|
})
|
|
413
414
|
}}
|
|
414
415
|
</p>
|
|
415
|
-
<ul class="mt-1 space-y-0.5 text-
|
|
416
|
+
<ul class="mt-1 space-y-0.5 text-2xs text-app-warning-200/80">
|
|
416
417
|
<li v-for="cell in unfished" :key="`${cell.territoryId}::${cell.phaseId}`">
|
|
417
418
|
{{
|
|
418
419
|
t('bugFishing.plan.unfishedCell', {
|
|
@@ -432,7 +433,7 @@ const PHASE_ICON: Record<string, string> = {
|
|
|
432
433
|
data-testid="bug-fishing-pipeline"
|
|
433
434
|
class="mb-4 flex flex-wrap items-center gap-2 rounded-lg border border-default bg-default/40 px-3 py-2"
|
|
434
435
|
>
|
|
435
|
-
<span class="text-
|
|
436
|
+
<span class="text-2xs text-muted">{{ t('bugFishing.fixPipeline.label') }}</span>
|
|
436
437
|
<USelectMenu
|
|
437
438
|
v-model="pipelineOverride"
|
|
438
439
|
:items="pipelineOptions"
|
|
@@ -440,22 +441,22 @@ const PHASE_ICON: Record<string, string> = {
|
|
|
440
441
|
size="xs"
|
|
441
442
|
class="min-w-52"
|
|
442
443
|
/>
|
|
443
|
-
<span class="text-
|
|
444
|
+
<span class="text-2xs text-dimmed">
|
|
444
445
|
{{ t('bugFishing.fixPipeline.hint', { pipeline: effectivePipelineName ?? '—' }) }}
|
|
445
446
|
</span>
|
|
446
447
|
</div>
|
|
447
448
|
|
|
448
449
|
<div class="mb-2 flex items-center justify-between">
|
|
449
|
-
<p class="text-
|
|
450
|
+
<p class="text-2xs text-muted">
|
|
450
451
|
{{ t('bugFishing.counts', { untriaged: untriagedCount, spawned: spawnedCount }) }}
|
|
451
452
|
</p>
|
|
452
|
-
<label class="flex items-center gap-1.5 text-
|
|
453
|
+
<label class="flex items-center gap-1.5 text-2xs text-muted">
|
|
453
454
|
<input v-model="showTriaged" type="checkbox" class="accent-app-info-500" />
|
|
454
455
|
{{ t('bugFishing.showTriaged') }}
|
|
455
456
|
</label>
|
|
456
457
|
</div>
|
|
457
458
|
|
|
458
|
-
<p v-if="bugFishing.error" class="mb-3 text-
|
|
459
|
+
<p v-if="bugFishing.error" class="mb-3 text-xs text-app-error-300">
|
|
459
460
|
{{ bugFishing.error }}
|
|
460
461
|
</p>
|
|
461
462
|
|
|
@@ -465,7 +466,7 @@ const PHASE_ICON: Record<string, string> = {
|
|
|
465
466
|
<div
|
|
466
467
|
v-if="visibleFindings.length === 0"
|
|
467
468
|
data-testid="bug-fishing-empty"
|
|
468
|
-
class="rounded-lg border border-default bg-default/40 px-4 py-8 text-center text-
|
|
469
|
+
class="rounded-lg border border-default bg-default/40 px-4 py-8 text-center text-xs text-muted"
|
|
469
470
|
>
|
|
470
471
|
{{
|
|
471
472
|
findings.length === 0
|
|
@@ -484,35 +485,35 @@ const PHASE_ICON: Record<string, string> = {
|
|
|
484
485
|
>
|
|
485
486
|
<div class="flex flex-wrap items-center gap-2">
|
|
486
487
|
<span
|
|
487
|
-
class="rounded border px-1.5 py-0.5 text-
|
|
488
|
+
class="rounded-sm border px-1.5 py-0.5 text-3xs font-semibold uppercase"
|
|
488
489
|
:class="SEVERITY_CLASS[finding.severity]"
|
|
489
490
|
>
|
|
490
491
|
{{ t(`bugFishing.severity.${finding.severity}`) }}
|
|
491
492
|
</span>
|
|
492
|
-
<span class="rounded bg-elevated px-1.5 py-0.5 text-
|
|
493
|
+
<span class="rounded-sm bg-elevated px-1.5 py-0.5 text-3xs text-toned">
|
|
493
494
|
{{ t(`bugFishing.kind.${finding.kind}`) }}
|
|
494
495
|
</span>
|
|
495
|
-
<span class="text-
|
|
496
|
+
<span class="text-3xs text-dimmed">
|
|
496
497
|
{{ t(`bugFishing.confidence.${finding.confidence}`) }}
|
|
497
498
|
</span>
|
|
498
499
|
<span
|
|
499
|
-
class="min-w-0 flex-1 text-
|
|
500
|
+
class="min-w-0 flex-1 text-sm text-app-100"
|
|
500
501
|
:class="{ 'line-through': finding.dismissed }"
|
|
501
502
|
>
|
|
502
503
|
{{ finding.title }}
|
|
503
504
|
</span>
|
|
504
505
|
</div>
|
|
505
506
|
|
|
506
|
-
<p v-if="finding.path" class="mt-1 font-mono text-
|
|
507
|
+
<p v-if="finding.path" class="mt-1 font-mono text-2xs text-dimmed">
|
|
507
508
|
{{ finding.path }}<span v-if="finding.line">:{{ finding.line }}</span>
|
|
508
509
|
</p>
|
|
509
510
|
|
|
510
|
-
<MarkdownProse :text="finding.detail" class="mt-2 max-w-3xl text-
|
|
511
|
+
<MarkdownProse :text="finding.detail" class="mt-2 max-w-3xl text-xs" />
|
|
511
512
|
|
|
512
|
-
<div v-if="finding.failureScenario" class="mt-2 text-
|
|
513
|
-
<
|
|
513
|
+
<div v-if="finding.failureScenario" class="mt-2 text-xs text-toned">
|
|
514
|
+
<SectionLabel as="span">
|
|
514
515
|
{{ t('bugFishing.finding.failureScenario') }}
|
|
515
|
-
</
|
|
516
|
+
</SectionLabel>
|
|
516
517
|
<MarkdownProse :text="finding.failureScenario" class="mt-0.5 max-w-3xl" />
|
|
517
518
|
</div>
|
|
518
519
|
|
|
@@ -520,17 +521,17 @@ const PHASE_ICON: Record<string, string> = {
|
|
|
520
521
|
apart: a finding that cannot point at the code it describes is speculating, and
|
|
521
522
|
that should be visible without reading the prose for it. -->
|
|
522
523
|
<details v-if="finding.evidence" class="mt-2">
|
|
523
|
-
<summary class="cursor-pointer text-
|
|
524
|
+
<summary class="cursor-pointer text-2xs text-muted hover:text-default">
|
|
524
525
|
{{ t('bugFishing.finding.evidence') }}
|
|
525
526
|
</summary>
|
|
526
|
-
<MarkdownProse :text="finding.evidence" class="mt-1 max-w-3xl text-
|
|
527
|
+
<MarkdownProse :text="finding.evidence" class="mt-1 max-w-3xl text-xs" />
|
|
527
528
|
</details>
|
|
528
529
|
|
|
529
530
|
<details v-if="finding.suggestedFix" class="mt-1">
|
|
530
|
-
<summary class="cursor-pointer text-
|
|
531
|
+
<summary class="cursor-pointer text-2xs text-muted hover:text-default">
|
|
531
532
|
{{ t('bugFishing.finding.suggestedFix') }}
|
|
532
533
|
</summary>
|
|
533
|
-
<MarkdownProse :text="finding.suggestedFix" class="mt-1 max-w-3xl text-
|
|
534
|
+
<MarkdownProse :text="finding.suggestedFix" class="mt-1 max-w-3xl text-xs" />
|
|
534
535
|
</details>
|
|
535
536
|
|
|
536
537
|
<!-- Already marked: say what was created and let the reader follow it. The three
|
|
@@ -540,7 +541,7 @@ const PHASE_ICON: Record<string, string> = {
|
|
|
540
541
|
<div
|
|
541
542
|
v-if="finding.spawn?.status === 'spawned'"
|
|
542
543
|
data-testid="bug-fishing-finding-spawned"
|
|
543
|
-
class="mt-2 flex flex-wrap items-center gap-2 text-
|
|
544
|
+
class="mt-2 flex flex-wrap items-center gap-2 text-2xs text-app-success-300"
|
|
544
545
|
>
|
|
545
546
|
<UIcon name="i-lucide-check-circle-2" class="h-3.5 w-3.5" />
|
|
546
547
|
<span>
|
|
@@ -566,7 +567,7 @@ const PHASE_ICON: Record<string, string> = {
|
|
|
566
567
|
<div
|
|
567
568
|
v-else-if="finding.spawn?.status === 'pending'"
|
|
568
569
|
data-testid="bug-fishing-finding-spawning"
|
|
569
|
-
class="mt-2 flex flex-wrap items-center gap-2 text-
|
|
570
|
+
class="mt-2 flex flex-wrap items-center gap-2 text-2xs text-muted"
|
|
570
571
|
>
|
|
571
572
|
<UIcon name="i-lucide-loader-circle" class="h-3.5 w-3.5 animate-spin" />
|
|
572
573
|
<span>{{ t('bugFishing.finding.spawning') }}</span>
|
|
@@ -577,7 +578,7 @@ const PHASE_ICON: Record<string, string> = {
|
|
|
577
578
|
<p
|
|
578
579
|
v-else-if="finding.spawn?.status === 'failed'"
|
|
579
580
|
data-testid="bug-fishing-finding-spawn-failed"
|
|
580
|
-
class="mt-2 max-w-3xl text-
|
|
581
|
+
class="mt-2 max-w-3xl text-2xs text-app-warning-300"
|
|
581
582
|
>
|
|
582
583
|
{{
|
|
583
584
|
t('bugFishing.finding.spawnFailed', {
|
|
@@ -623,7 +624,7 @@ const PHASE_ICON: Record<string, string> = {
|
|
|
623
624
|
v-if="awaiting"
|
|
624
625
|
class="flex items-center justify-between gap-3 border-t border-default px-5 py-3"
|
|
625
626
|
>
|
|
626
|
-
<p class="text-
|
|
627
|
+
<p class="text-2xs text-dimmed">
|
|
627
628
|
{{
|
|
628
629
|
untriagedCount > 0
|
|
629
630
|
? t('bugFishing.footer.parkedWithUntriaged', { count: untriagedCount })
|
|
@@ -19,6 +19,7 @@ import type {
|
|
|
19
19
|
ReviewItemSeverity,
|
|
20
20
|
ReviewItemStatus,
|
|
21
21
|
} from '~/types/clarity'
|
|
22
|
+
import SectionLabel from '~/components/common/SectionLabel.vue'
|
|
22
23
|
|
|
23
24
|
const board = useBoardStore()
|
|
24
25
|
const clarity = useClarityStore()
|
|
@@ -424,9 +425,9 @@ async function resolveExceeded(choice: 'extra-round' | 'proceed' | 'stop-reset')
|
|
|
424
425
|
v-if="item.reply && item.status !== 'open' && item.status !== 'answered'"
|
|
425
426
|
class="mt-2 max-w-3xl rounded-md border-s-2 border-muted bg-app-950/40 px-3 py-1.5 text-sm text-toned"
|
|
426
427
|
>
|
|
427
|
-
<
|
|
428
|
+
<SectionLabel as="span">
|
|
428
429
|
{{ t('clarity.answerLabel') }}
|
|
429
|
-
</
|
|
430
|
+
</SectionLabel>
|
|
430
431
|
<p class="whitespace-pre-line">{{ item.reply }}</p>
|
|
431
432
|
</div>
|
|
432
433
|
|
|
@@ -480,7 +481,7 @@ async function resolveExceeded(choice: 'extra-round' | 'proceed' | 'stop-reset')
|
|
|
480
481
|
|
|
481
482
|
<!-- clarified document: the standard-format bug report -->
|
|
482
483
|
<section v-if="outline" class="mt-6 border-t border-default pt-5">
|
|
483
|
-
<div class="mb-3 flex items-center gap-1.5 text-
|
|
484
|
+
<div class="mb-3 flex items-center gap-1.5 text-2xs text-app-success-400">
|
|
484
485
|
<UIcon name="i-lucide-file-check-2" class="h-3.5 w-3.5" />
|
|
485
486
|
<span class="font-semibold uppercase tracking-wide">
|
|
486
487
|
{{ incorporated ? t('clarity.docHeading') : t('clarity.docHeadingDraft') }}
|
|
@@ -508,7 +509,7 @@ async function resolveExceeded(choice: 'extra-round' | 'proceed' | 'stop-reset')
|
|
|
508
509
|
</button>
|
|
509
510
|
<div
|
|
510
511
|
v-show="!s.title || !collapsed[s.id]"
|
|
511
|
-
class="reader-prose mt-1 ps-5.5 text-
|
|
512
|
+
class="reader-prose mt-1 ps-5.5 text-sm leading-relaxed text-toned"
|
|
512
513
|
v-html="s.bodyHtml"
|
|
513
514
|
/>
|
|
514
515
|
</div>
|
|
@@ -574,7 +575,7 @@ async function resolveExceeded(choice: 'extra-round' | 'proceed' | 'stop-reset')
|
|
|
574
575
|
>
|
|
575
576
|
{{ t('clarity.incorporateAnswers') }}
|
|
576
577
|
</UButton>
|
|
577
|
-
<p class="text-
|
|
578
|
+
<p class="text-2xs leading-relaxed text-dimmed">
|
|
578
579
|
<template v-if="canProceed">
|
|
579
580
|
{{ t('clarity.hint.proceed') }}
|
|
580
581
|
</template>
|
|
@@ -636,14 +637,14 @@ async function resolveExceeded(choice: 'extra-round' | 'proceed' | 'stop-reset')
|
|
|
636
637
|
{{ t('clarity.redoWithDirection') }}
|
|
637
638
|
</UButton>
|
|
638
639
|
</div>
|
|
639
|
-
<p class="text-
|
|
640
|
+
<p class="text-2xs leading-relaxed text-dimmed">
|
|
640
641
|
{{ t('clarity.redoHint') }}
|
|
641
642
|
</p>
|
|
642
643
|
</div>
|
|
643
644
|
|
|
644
645
|
<div
|
|
645
646
|
v-if="review && incorporated"
|
|
646
|
-
class="border-t border-default pt-4 text-
|
|
647
|
+
class="border-t border-default pt-4 text-2xs leading-relaxed text-dimmed"
|
|
647
648
|
>
|
|
648
649
|
{{ t('clarity.incorporatedFooter') }}
|
|
649
650
|
</div>
|
|
@@ -19,7 +19,7 @@ function reload() {
|
|
|
19
19
|
<UIcon name="i-lucide-unplug" class="h-4 w-4 shrink-0 text-app-warning-400" />
|
|
20
20
|
{{ t('errors.asyncView.title') }}
|
|
21
21
|
</div>
|
|
22
|
-
<p class="mt-2 text-
|
|
22
|
+
<p class="mt-2 text-xs leading-relaxed text-muted">
|
|
23
23
|
{{ t('errors.asyncView.body') }}
|
|
24
24
|
</p>
|
|
25
25
|
<UButton class="mt-4" color="primary" variant="soft" size="xs" @click="reload">
|
|
@@ -51,16 +51,16 @@ const draft = computed({
|
|
|
51
51
|
<template>
|
|
52
52
|
<div class="rounded-lg border border-default bg-app-950/40 p-3" data-testid="clarification-item">
|
|
53
53
|
<div class="flex items-start justify-between gap-2">
|
|
54
|
-
<p class="text-
|
|
54
|
+
<p class="text-sm font-medium text-default">{{ prompt }}</p>
|
|
55
55
|
<slot name="badges" />
|
|
56
56
|
</div>
|
|
57
|
-
<p v-if="detail" class="mt-1 whitespace-pre-wrap text-
|
|
57
|
+
<p v-if="detail" class="mt-1 whitespace-pre-wrap text-xs leading-relaxed text-muted">
|
|
58
58
|
{{ detail }}
|
|
59
59
|
</p>
|
|
60
60
|
|
|
61
61
|
<!-- dismissed: a "not relevant" chip + reopen -->
|
|
62
62
|
<div v-if="dismissed" class="mt-2 flex items-center justify-between gap-2">
|
|
63
|
-
<span class="inline-flex items-center gap-1 text-
|
|
63
|
+
<span class="inline-flex items-center gap-1 text-2xs text-dimmed">
|
|
64
64
|
<UIcon name="i-lucide-x" class="h-3.5 w-3.5" />{{ t('clarification.dismissed') }}
|
|
65
65
|
</span>
|
|
66
66
|
<UButton
|
|
@@ -79,7 +79,7 @@ const draft = computed({
|
|
|
79
79
|
<!-- a recommendation is being requested/generated: a working chip, no answer box -->
|
|
80
80
|
<div
|
|
81
81
|
v-else-if="requested"
|
|
82
|
-
class="mt-2 inline-flex items-center gap-1 text-
|
|
82
|
+
class="mt-2 inline-flex items-center gap-1 text-2xs text-primary"
|
|
83
83
|
data-testid="clarification-requested"
|
|
84
84
|
>
|
|
85
85
|
<UIcon name="i-lucide-loader-circle" class="h-3.5 w-3.5 animate-spin" />
|
|
@@ -131,10 +131,10 @@ const draft = computed({
|
|
|
131
131
|
class="mt-2 rounded-md border border-primary/50 bg-primary/10 p-2"
|
|
132
132
|
data-testid="clarification-recommendation"
|
|
133
133
|
>
|
|
134
|
-
<div class="mb-1 flex items-center gap-1 text-
|
|
134
|
+
<div class="mb-1 flex items-center gap-1 text-3xs uppercase tracking-wide text-primary">
|
|
135
135
|
<UIcon name="i-lucide-wand-2" class="h-3 w-3" />{{ t('clarification.suggestion') }}
|
|
136
136
|
</div>
|
|
137
|
-
<p class="whitespace-pre-wrap text-
|
|
137
|
+
<p class="whitespace-pre-wrap text-xs text-default">{{ recommendation }}</p>
|
|
138
138
|
<UButton
|
|
139
139
|
class="mt-1.5"
|
|
140
140
|
size="xs"
|
|
@@ -112,7 +112,7 @@ function selectItems(field: DescriptorField) {
|
|
|
112
112
|
testid that would have to be slugified to be selectable. -->
|
|
113
113
|
<p
|
|
114
114
|
v-if="caption"
|
|
115
|
-
class="-mb-1 text-
|
|
115
|
+
class="-mb-1 text-2xs font-semibold uppercase tracking-wide text-muted"
|
|
116
116
|
:class="{ 'pt-2': startsGroup }"
|
|
117
117
|
:data-testid="`${testidPrefix}-section`"
|
|
118
118
|
>
|
|
@@ -25,7 +25,7 @@ withDefaults(
|
|
|
25
25
|
<p :class="compact ? 'text-xs' : 'text-sm'" class="font-medium text-muted">
|
|
26
26
|
{{ title }}
|
|
27
27
|
</p>
|
|
28
|
-
<p v-if="description" :class="compact ? 'text-
|
|
28
|
+
<p v-if="description" :class="compact ? 'text-2xs' : 'text-xs'" class="max-w-xs">
|
|
29
29
|
{{ description }}
|
|
30
30
|
</p>
|
|
31
31
|
<div v-if="$slots.default" :class="compact ? 'mt-1' : 'mt-2'">
|
|
@@ -25,15 +25,15 @@ defineProps<{
|
|
|
25
25
|
:data-testid="testid"
|
|
26
26
|
>
|
|
27
27
|
<UIcon name="i-lucide-loader-circle" class="h-5 w-5 animate-spin text-primary" />
|
|
28
|
-
<p class="text-
|
|
29
|
-
<p class="text-
|
|
28
|
+
<p class="text-sm text-default">{{ title }}</p>
|
|
29
|
+
<p class="text-xs text-muted">{{ hint }}</p>
|
|
30
30
|
</div>
|
|
31
31
|
<div
|
|
32
32
|
v-else
|
|
33
33
|
class="rounded-lg border border-app-error-900/60 bg-app-error-950/20 p-4 text-center"
|
|
34
34
|
:data-testid="testid"
|
|
35
35
|
>
|
|
36
|
-
<p class="text-
|
|
37
|
-
<p class="mt-1 text-
|
|
36
|
+
<p class="text-sm text-app-error-200">{{ title }}</p>
|
|
37
|
+
<p class="mt-1 text-xs text-muted">{{ hint }}</p>
|
|
38
38
|
</div>
|
|
39
39
|
</template>
|
|
@@ -55,7 +55,11 @@ const html = computed(() => renderMarkdown(props.text))
|
|
|
55
55
|
font-style: italic;
|
|
56
56
|
}
|
|
57
57
|
.cf-prose :deep(code) {
|
|
58
|
-
|
|
58
|
+
/* `--ui-radius` rather than `--radius-sm`: Nuxt UI declares the `--radius-*` scale in a
|
|
59
|
+
* `@theme default inline` block, so Tailwind emits those only when the COMPILED stylesheet
|
|
60
|
+
* graph references them. This scoped block is not part of that compile, and `--ui-radius` is
|
|
61
|
+
* an ordinary custom property on `:root`. `--radius-sm` is `var(--ui-radius)` (prose.css). */
|
|
62
|
+
border-radius: var(--ui-radius);
|
|
59
63
|
background: var(--ui-bg-elevated);
|
|
60
64
|
padding: 0.1rem 0.3rem;
|
|
61
65
|
font-family: var(--font-mono);
|
|
@@ -65,7 +69,9 @@ const html = computed(() => renderMarkdown(props.text))
|
|
|
65
69
|
.cf-prose :deep(pre) {
|
|
66
70
|
margin: 0.6rem 0;
|
|
67
71
|
overflow: auto;
|
|
68
|
-
|
|
72
|
+
/* `--radius-lg` is `calc(var(--ui-radius) * 2)`; see the note on `code` above for why this
|
|
73
|
+
* block cannot name the scale variable. */
|
|
74
|
+
border-radius: calc(var(--ui-radius) * 2);
|
|
69
75
|
background: var(--app-bg-canvas);
|
|
70
76
|
padding: 0.75rem 0.9rem;
|
|
71
77
|
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
<script setup lang="ts">
|
|
2
|
+
// The one section "eyebrow": the small uppercase label that titles a group inside a panel, a
|
|
3
|
+
// result window, an inspector section or a dropdown (issue #2248).
|
|
4
|
+
//
|
|
5
|
+
// The recipe:
|
|
6
|
+
//
|
|
7
|
+
// text-2xs font-semibold uppercase tracking-wide text-muted
|
|
8
|
+
//
|
|
9
|
+
// Those five are the whole component and are NOT overridable. A caller that wants a different
|
|
10
|
+
// size or colour wants a different thing, not a variant of this one.
|
|
11
|
+
//
|
|
12
|
+
// The colour is `text-muted`, not `text-dimmed`, for contrast: at this size `text-dimmed` is 2.63:1
|
|
13
|
+
// on a light surface, under WCAG AA's 4.5:1 and under the 3:1 large-text floor. `text-muted` is
|
|
14
|
+
// 4.76:1. Do not "correct" it to the fainter token.
|
|
15
|
+
//
|
|
16
|
+
// A label that merely SHARES the uppercase styling is not this component: a pill or chip carrying
|
|
17
|
+
// a fill and a radius, an accent-coloured label signalling state or category, or a metadata row
|
|
18
|
+
// (`board/nodes/BlockNode.vue`'s composition line) that states counts rather than titling the
|
|
19
|
+
// block after it. Nor is a caption INSIDE a control: a switcher trigger's "Language" line above its
|
|
20
|
+
// value, a slider's end labels. A caption names part of the control and titles nothing after it.
|
|
21
|
+
// Those keep their own classes on a named step.
|
|
22
|
+
//
|
|
23
|
+
// What a caller DOES control:
|
|
24
|
+
// - `as`, the element. The default `div` suits a label that titles a region without being a
|
|
25
|
+
// document heading; pass `h3` / `h4` when the section is a real heading, `label` with an `:id`
|
|
26
|
+
// when it names a field. A collapsing section is a `UButton` around `as="span"`: the button
|
|
27
|
+
// owns the focus ring and the disabled state, which a raw `as="button"` would not have.
|
|
28
|
+
// - Layout, through the ordinary `class` attribute (`mb-2`, `px-2 pt-2`), which Vue merges onto
|
|
29
|
+
// the root. Spacing is the caller's business because it belongs to the surrounding block.
|
|
30
|
+
// - Every other attribute and listener, which fall through to the root element.
|
|
31
|
+
withDefaults(defineProps<{ as?: string }>(), { as: 'div' })
|
|
32
|
+
</script>
|
|
33
|
+
|
|
34
|
+
<template>
|
|
35
|
+
<component :is="as" class="text-2xs font-semibold uppercase tracking-wide text-muted">
|
|
36
|
+
<slot />
|
|
37
|
+
</component>
|
|
38
|
+
</template>
|