@cat-factory/app 0.302.2 → 0.303.1
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 +99 -14
- 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 +26 -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
|
@@ -113,8 +113,8 @@ const canLeaveReview = computed(
|
|
|
113
113
|
<!-- detection status -->
|
|
114
114
|
<div class="flex items-center justify-between gap-2">
|
|
115
115
|
<div class="min-w-0">
|
|
116
|
-
<p class="text-sm font-medium text-
|
|
117
|
-
<p class="text-[11px] text-
|
|
116
|
+
<p class="text-sm font-medium text-default">{{ store.targetFrame?.title }}</p>
|
|
117
|
+
<p class="text-[11px] text-dimmed">{{ t('environmentWizard.review.detectHint') }}</p>
|
|
118
118
|
</div>
|
|
119
119
|
<UButton
|
|
120
120
|
size="xs"
|
|
@@ -130,12 +130,12 @@ const canLeaveReview = computed(
|
|
|
130
130
|
</UButton>
|
|
131
131
|
</div>
|
|
132
132
|
|
|
133
|
-
<p v-if="!store.hasRepo" class="text-[12px] text-
|
|
133
|
+
<p v-if="!store.hasRepo" class="text-[12px] text-app-warning-300/80">
|
|
134
134
|
{{ t('environmentWizard.review.noRepo') }}
|
|
135
135
|
</p>
|
|
136
136
|
<p
|
|
137
137
|
v-else-if="store.detectError"
|
|
138
|
-
class="text-[12px] text-
|
|
138
|
+
class="text-[12px] text-app-error-300/80"
|
|
139
139
|
data-testid="env-setup-detect-error"
|
|
140
140
|
>
|
|
141
141
|
{{ t('environmentWizard.review.detectError') }}
|
|
@@ -145,15 +145,11 @@ const canLeaveReview = computed(
|
|
|
145
145
|
<!-- deep analysis (opt-in; elevated to a prominent nudge when the repo ships its own CLI) -->
|
|
146
146
|
<div
|
|
147
147
|
class="rounded-md border p-3"
|
|
148
|
-
:class="
|
|
149
|
-
repoCliHint
|
|
150
|
-
? 'border-primary-700/60 bg-primary-950/30'
|
|
151
|
-
: 'border-slate-800 bg-slate-900/40'
|
|
152
|
-
"
|
|
148
|
+
:class="repoCliHint ? 'border-primary/60 bg-primary/10' : 'border-default bg-default/40'"
|
|
153
149
|
>
|
|
154
150
|
<p
|
|
155
151
|
v-if="repoCliHint"
|
|
156
|
-
class="mb-2 flex items-start gap-1.5 text-[11px] text-primary
|
|
152
|
+
class="mb-2 flex items-start gap-1.5 text-[11px] text-primary"
|
|
157
153
|
data-testid="env-setup-cli-nudge"
|
|
158
154
|
>
|
|
159
155
|
<UIcon name="i-lucide-lightbulb" class="mt-0.5 h-3.5 w-3.5 shrink-0" />
|
|
@@ -161,10 +157,10 @@ const canLeaveReview = computed(
|
|
|
161
157
|
</p>
|
|
162
158
|
<div class="flex items-center justify-between gap-2">
|
|
163
159
|
<div class="min-w-0">
|
|
164
|
-
<p class="text-[12px] font-medium text-
|
|
160
|
+
<p class="text-[12px] font-medium text-toned">
|
|
165
161
|
{{ t('environmentWizard.analysis.title') }}
|
|
166
162
|
</p>
|
|
167
|
-
<p class="text-[11px] text-
|
|
163
|
+
<p class="text-[11px] text-dimmed">{{ t('environmentWizard.analysis.hint') }}</p>
|
|
168
164
|
</div>
|
|
169
165
|
<UButton
|
|
170
166
|
size="xs"
|
|
@@ -181,12 +177,15 @@ const canLeaveReview = computed(
|
|
|
181
177
|
</div>
|
|
182
178
|
<p
|
|
183
179
|
v-if="!store.canAnalyze"
|
|
184
|
-
class="mt-2 text-[11px] text-
|
|
180
|
+
class="mt-2 text-[11px] text-dimmed"
|
|
185
181
|
data-testid="env-setup-analysis-unavailable"
|
|
186
182
|
>
|
|
187
183
|
{{ t('environmentWizard.analysis.unavailable') }}
|
|
188
184
|
</p>
|
|
189
|
-
<p
|
|
185
|
+
<p
|
|
186
|
+
v-else-if="store.analysisStatus === 'failed'"
|
|
187
|
+
class="mt-2 text-[11px] text-app-error-300/80"
|
|
188
|
+
>
|
|
190
189
|
{{ t('environmentWizard.analysis.failed') }}
|
|
191
190
|
</p>
|
|
192
191
|
<div
|
|
@@ -194,7 +193,7 @@ const canLeaveReview = computed(
|
|
|
194
193
|
class="mt-2 space-y-2"
|
|
195
194
|
data-testid="env-setup-analysis-ready"
|
|
196
195
|
>
|
|
197
|
-
<p v-if="store.merged?.summary" class="text-[11px] leading-snug text-
|
|
196
|
+
<p v-if="store.merged?.summary" class="text-[11px] leading-snug text-muted">
|
|
198
197
|
{{ store.merged.summary }}
|
|
199
198
|
</p>
|
|
200
199
|
<UButton
|
|
@@ -212,7 +211,7 @@ const canLeaveReview = computed(
|
|
|
212
211
|
|
|
213
212
|
<!-- per-field provenance -->
|
|
214
213
|
<div v-if="store.merged?.fields.length" class="space-y-1.5">
|
|
215
|
-
<p class="text-[11px] font-semibold uppercase tracking-wide text-
|
|
214
|
+
<p class="text-[11px] font-semibold uppercase tracking-wide text-muted">
|
|
216
215
|
{{ t('environmentWizard.review.provenanceTitle') }}
|
|
217
216
|
</p>
|
|
218
217
|
<div class="flex flex-wrap gap-1.5">
|
|
@@ -262,7 +261,7 @@ const canLeaveReview = computed(
|
|
|
262
261
|
|
|
263
262
|
<!-- compose file layering -->
|
|
264
263
|
<div v-if="composeFileCandidates.length" class="space-y-1.5">
|
|
265
|
-
<p class="text-[11px] font-semibold uppercase tracking-wide text-
|
|
264
|
+
<p class="text-[11px] font-semibold uppercase tracking-wide text-muted">
|
|
266
265
|
{{ t('environmentWizard.review.composeFiles') }}
|
|
267
266
|
</p>
|
|
268
267
|
<div class="flex flex-wrap gap-1.5">
|
|
@@ -283,7 +282,7 @@ const canLeaveReview = computed(
|
|
|
283
282
|
|
|
284
283
|
<!-- compose profiles -->
|
|
285
284
|
<div v-if="profileCandidates.length" class="space-y-1.5">
|
|
286
|
-
<p class="text-[11px] font-semibold uppercase tracking-wide text-
|
|
285
|
+
<p class="text-[11px] font-semibold uppercase tracking-wide text-muted">
|
|
287
286
|
{{ t('environmentWizard.review.profiles') }}
|
|
288
287
|
</p>
|
|
289
288
|
<div class="flex flex-wrap gap-1.5">
|
|
@@ -304,16 +303,16 @@ const canLeaveReview = computed(
|
|
|
304
303
|
|
|
305
304
|
<!-- seed dumps -->
|
|
306
305
|
<div v-if="seedDumpCandidates.length" class="space-y-1.5">
|
|
307
|
-
<p class="text-[11px] font-semibold uppercase tracking-wide text-
|
|
306
|
+
<p class="text-[11px] font-semibold uppercase tracking-wide text-muted">
|
|
308
307
|
{{ t('environmentWizard.review.seedDumps') }}
|
|
309
308
|
</p>
|
|
310
309
|
<div class="space-y-1">
|
|
311
310
|
<div
|
|
312
311
|
v-for="c in seedDumpCandidates"
|
|
313
312
|
:key="c.path"
|
|
314
|
-
class="flex items-center justify-between gap-2 rounded border border-
|
|
313
|
+
class="flex items-center justify-between gap-2 rounded border border-default bg-default/40 px-2 py-1"
|
|
315
314
|
>
|
|
316
|
-
<span class="truncate text-[11px] text-
|
|
315
|
+
<span class="truncate text-[11px] text-toned">{{ c.path }}</span>
|
|
317
316
|
<UButton
|
|
318
317
|
size="xs"
|
|
319
318
|
:color="seedAdded(c.path) ? 'success' : 'neutral'"
|
|
@@ -352,7 +351,11 @@ const canLeaveReview = computed(
|
|
|
352
351
|
class="w-full font-mono text-[11px]"
|
|
353
352
|
data-testid="env-setup-raw-text"
|
|
354
353
|
/>
|
|
355
|
-
<p
|
|
354
|
+
<p
|
|
355
|
+
v-if="rawError"
|
|
356
|
+
class="text-[11px] text-app-error-300/80"
|
|
357
|
+
data-testid="env-setup-raw-error"
|
|
358
|
+
>
|
|
356
359
|
{{ rawError }}
|
|
357
360
|
</p>
|
|
358
361
|
<div class="flex justify-end">
|
|
@@ -31,7 +31,7 @@ useEnvironmentWizardTarget(() => props.input.frameId)
|
|
|
31
31
|
<UInput v-model="store.handlerLabel" class="w-full" data-testid="env-setup-handler-label" />
|
|
32
32
|
</UFormField>
|
|
33
33
|
|
|
34
|
-
<div class="rounded-md border border-
|
|
34
|
+
<div class="rounded-md border border-default bg-default/40 p-3 text-[12px] text-toned">
|
|
35
35
|
<p>
|
|
36
36
|
{{
|
|
37
37
|
t('environmentWizard.save.summary', {
|
|
@@ -44,7 +44,7 @@ useEnvironmentWizardTarget(() => props.input.frameId)
|
|
|
44
44
|
|
|
45
45
|
<p
|
|
46
46
|
v-if="store.saveError"
|
|
47
|
-
class="text-[12px] text-
|
|
47
|
+
class="text-[12px] text-app-error-300/80"
|
|
48
48
|
data-testid="env-setup-save-error"
|
|
49
49
|
>
|
|
50
50
|
{{ store.saveError }}
|
|
@@ -66,7 +66,7 @@ useEnvironmentWizardTarget(() => props.input.frameId)
|
|
|
66
66
|
<!-- saved: confirmation + optional trial provision -->
|
|
67
67
|
<template v-else>
|
|
68
68
|
<div
|
|
69
|
-
class="flex items-center gap-2 rounded-md border border-
|
|
69
|
+
class="flex items-center gap-2 rounded-md border border-app-success-800/50 bg-app-success-950/30 p-2 text-[12px] text-app-success-200"
|
|
70
70
|
data-testid="env-setup-saved"
|
|
71
71
|
>
|
|
72
72
|
<UIcon name="i-lucide-check-circle" class="h-4 w-4" />
|
|
@@ -74,7 +74,7 @@ useEnvironmentWizardTarget(() => props.input.frameId)
|
|
|
74
74
|
</div>
|
|
75
75
|
|
|
76
76
|
<div class="flex items-center justify-between gap-2">
|
|
77
|
-
<p class="text-[11px] text-
|
|
77
|
+
<p class="text-[11px] text-dimmed">{{ t('environmentWizard.trial.hint') }}</p>
|
|
78
78
|
<UButton
|
|
79
79
|
size="xs"
|
|
80
80
|
variant="soft"
|
|
@@ -88,7 +88,9 @@ useEnvironmentWizardTarget(() => props.input.frameId)
|
|
|
88
88
|
{{ t('environmentWizard.trial.run') }}
|
|
89
89
|
</UButton>
|
|
90
90
|
</div>
|
|
91
|
-
<p v-if="store.trialError" class="text-[11px] text-
|
|
91
|
+
<p v-if="store.trialError" class="text-[11px] text-app-error-300/80">
|
|
92
|
+
{{ store.trialError }}
|
|
93
|
+
</p>
|
|
92
94
|
<ProvisioningLogsDrawer v-if="store.trialStarted" subsystem="environment" />
|
|
93
95
|
</template>
|
|
94
96
|
|
|
@@ -14,7 +14,7 @@ const { t } = useI18n()
|
|
|
14
14
|
</script>
|
|
15
15
|
|
|
16
16
|
<template>
|
|
17
|
-
<div class="flex items-center justify-between border-t border-
|
|
17
|
+
<div class="flex items-center justify-between border-t border-default pt-3">
|
|
18
18
|
<UButton
|
|
19
19
|
color="neutral"
|
|
20
20
|
variant="ghost"
|
|
@@ -95,14 +95,14 @@ function openApprovalFor(approvalId: string) {
|
|
|
95
95
|
leave animation survives this component being unmounted by its v-if gate. -->
|
|
96
96
|
<div
|
|
97
97
|
v-if="block && statusMeta && typeMeta"
|
|
98
|
-
class="absolute inset-0 z-30 flex flex-col bg-
|
|
98
|
+
class="absolute inset-0 z-30 flex flex-col bg-app-950/95 backdrop-blur"
|
|
99
99
|
role="dialog"
|
|
100
100
|
aria-modal="true"
|
|
101
101
|
data-testid="block-focus-view"
|
|
102
102
|
:data-focus-block="block.id"
|
|
103
103
|
>
|
|
104
104
|
<!-- header / breadcrumb -->
|
|
105
|
-
<header class="flex items-center gap-3 border-b border-
|
|
105
|
+
<header class="flex items-center gap-3 border-b border-default px-6 py-4">
|
|
106
106
|
<UButton
|
|
107
107
|
icon="i-lucide-arrow-left"
|
|
108
108
|
:ui="{ leadingIcon: 'rtl:-scale-x-100', trailingIcon: 'rtl:-scale-x-100' }"
|
|
@@ -113,16 +113,16 @@ function openApprovalFor(approvalId: string) {
|
|
|
113
113
|
>
|
|
114
114
|
{{ t('focus.board') }}
|
|
115
115
|
</UButton>
|
|
116
|
-
<UIcon name="i-lucide-chevron-right" class="h-4 w-4 text-
|
|
116
|
+
<UIcon name="i-lucide-chevron-right" class="h-4 w-4 text-app-600 rtl:-scale-x-100" />
|
|
117
117
|
<div
|
|
118
118
|
class="flex h-9 w-9 items-center justify-center rounded-lg"
|
|
119
|
-
:style="{ backgroundColor: typeMeta.accent
|
|
119
|
+
:style="{ backgroundColor: tint(typeMeta.accent) }"
|
|
120
120
|
>
|
|
121
121
|
<UIcon :name="typeMeta.icon" class="h-5 w-5" :style="{ color: typeMeta.accent }" />
|
|
122
122
|
</div>
|
|
123
123
|
<div>
|
|
124
|
-
<h1 class="text-lg font-semibold text-
|
|
125
|
-
<div class="text-xs text-
|
|
124
|
+
<h1 class="text-lg font-semibold text-highlighted">{{ block.title }}</h1>
|
|
125
|
+
<div class="text-xs text-dimmed">
|
|
126
126
|
{{ t('focus.typeSubtitle', { type: typeMeta.label }) }}
|
|
127
127
|
</div>
|
|
128
128
|
</div>
|
|
@@ -199,11 +199,11 @@ function openApprovalFor(approvalId: string) {
|
|
|
199
199
|
<div class="grid flex-1 grid-cols-[1fr_300px] gap-6 overflow-hidden p-6">
|
|
200
200
|
<!-- main: pipeline flow -->
|
|
201
201
|
<section
|
|
202
|
-
class="flex flex-col overflow-auto rounded-2xl border border-
|
|
202
|
+
class="flex flex-col overflow-auto rounded-2xl border border-default bg-default/60 p-6"
|
|
203
203
|
>
|
|
204
204
|
<div class="mb-4 flex items-center gap-2">
|
|
205
|
-
<UIcon name="i-lucide-workflow" class="h-4 w-4 text-
|
|
206
|
-
<h2 class="text-sm font-semibold uppercase tracking-wide text-
|
|
205
|
+
<UIcon name="i-lucide-workflow" class="h-4 w-4 text-dimmed" />
|
|
206
|
+
<h2 class="text-sm font-semibold uppercase tracking-wide text-muted">
|
|
207
207
|
{{ instance ? instance.pipelineName : t('focus.noPipelineRunning') }}
|
|
208
208
|
</h2>
|
|
209
209
|
</div>
|
|
@@ -217,33 +217,31 @@ function openApprovalFor(approvalId: string) {
|
|
|
217
217
|
|
|
218
218
|
<div
|
|
219
219
|
v-else
|
|
220
|
-
class="flex flex-1 items-center justify-center rounded-xl border border-dashed border-
|
|
220
|
+
class="flex flex-1 items-center justify-center rounded-xl border border-dashed border-muted text-sm text-dimmed"
|
|
221
221
|
>
|
|
222
222
|
{{ t('focus.emptyPipelineHint') }}
|
|
223
223
|
</div>
|
|
224
224
|
</section>
|
|
225
225
|
|
|
226
226
|
<!-- side: details -->
|
|
227
|
-
<aside
|
|
228
|
-
class="space-y-4 overflow-auto rounded-2xl border border-slate-800 bg-slate-900/60 p-5"
|
|
229
|
-
>
|
|
227
|
+
<aside class="space-y-4 overflow-auto rounded-2xl border border-default bg-default/60 p-5">
|
|
230
228
|
<div>
|
|
231
|
-
<div class="mb-1 text-[11px] font-semibold uppercase tracking-wide text-
|
|
229
|
+
<div class="mb-1 text-[11px] font-semibold uppercase tracking-wide text-muted">
|
|
232
230
|
{{ t('focus.description') }}
|
|
233
231
|
</div>
|
|
234
|
-
<p class="text-sm text-
|
|
232
|
+
<p class="text-sm text-toned">{{ block.description }}</p>
|
|
235
233
|
</div>
|
|
236
234
|
<div v-if="instance">
|
|
237
|
-
<div class="mb-1 text-[11px] font-semibold uppercase tracking-wide text-
|
|
235
|
+
<div class="mb-1 text-[11px] font-semibold uppercase tracking-wide text-muted">
|
|
238
236
|
{{ t('focus.overallProgress') }}
|
|
239
237
|
</div>
|
|
240
238
|
<UProgress :model-value="Math.round(block.progress * 100)" />
|
|
241
|
-
<div class="mt-1 text-[11px] text-
|
|
239
|
+
<div class="mt-1 text-[11px] text-muted">
|
|
242
240
|
{{ n(block.progress, 'percent') }}
|
|
243
241
|
</div>
|
|
244
242
|
</div>
|
|
245
243
|
<div>
|
|
246
|
-
<div class="mb-1 text-[11px] font-semibold uppercase tracking-wide text-
|
|
244
|
+
<div class="mb-1 text-[11px] font-semibold uppercase tracking-wide text-muted">
|
|
247
245
|
{{ t('focus.dependencies') }}
|
|
248
246
|
</div>
|
|
249
247
|
<div v-if="deps.length" class="flex flex-wrap gap-1">
|
|
@@ -251,7 +249,7 @@ function openApprovalFor(approvalId: string) {
|
|
|
251
249
|
{{ d.title }}
|
|
252
250
|
</UBadge>
|
|
253
251
|
</div>
|
|
254
|
-
<div v-else class="text-[11px] text-
|
|
252
|
+
<div v-else class="text-[11px] text-dimmed">{{ t('focus.noDependencies') }}</div>
|
|
255
253
|
</div>
|
|
256
254
|
</aside>
|
|
257
255
|
</div>
|
|
@@ -120,12 +120,12 @@ const STATUS_META: Record<
|
|
|
120
120
|
FollowUpItem['status'],
|
|
121
121
|
{ badge: 'neutral' | 'info' | 'success' | 'warning'; text: string }
|
|
122
122
|
> = {
|
|
123
|
-
pending: { badge: 'warning', text: 'text-
|
|
124
|
-
filed: { badge: 'success', text: 'text-
|
|
125
|
-
queued: { badge: 'info', text: 'text-
|
|
126
|
-
answered: { badge: 'info', text: 'text-
|
|
127
|
-
closed: { badge: 'neutral', text: 'text-
|
|
128
|
-
dismissed: { badge: 'neutral', text: 'text-
|
|
123
|
+
pending: { badge: 'warning', text: 'text-app-warning-300' },
|
|
124
|
+
filed: { badge: 'success', text: 'text-app-success-300' },
|
|
125
|
+
queued: { badge: 'info', text: 'text-app-info-300' },
|
|
126
|
+
answered: { badge: 'info', text: 'text-app-info-300' },
|
|
127
|
+
closed: { badge: 'neutral', text: 'text-toned' },
|
|
128
|
+
dismissed: { badge: 'neutral', text: 'text-muted' },
|
|
129
129
|
}
|
|
130
130
|
|
|
131
131
|
/** Whether a decided item carries a recorded reply to show ('answered' or 'closed'). */
|
|
@@ -138,7 +138,7 @@ function hasRecordedAnswer(item: FollowUpItem): boolean {
|
|
|
138
138
|
<ResultWindowShell
|
|
139
139
|
:open="open"
|
|
140
140
|
:icon="FOLLOW_UP_COMPANION_META.icon"
|
|
141
|
-
icon-class="bg-pink
|
|
141
|
+
icon-class="bg-app-hue-pink/15 text-app-hue-pink"
|
|
142
142
|
:title="headerTitle"
|
|
143
143
|
:subtitle="t('followUp.subtitle')"
|
|
144
144
|
width="3xl"
|
|
@@ -158,11 +158,11 @@ function hasRecordedAnswer(item: FollowUpItem): boolean {
|
|
|
158
158
|
<!-- Empty -->
|
|
159
159
|
<div
|
|
160
160
|
v-if="items.length === 0"
|
|
161
|
-
class="flex h-full flex-col items-center justify-center gap-2 py-10 text-center text-
|
|
161
|
+
class="flex h-full flex-col items-center justify-center gap-2 py-10 text-center text-muted"
|
|
162
162
|
>
|
|
163
163
|
<UIcon :name="FOLLOW_UP_COMPANION_META.icon" class="h-8 w-8 opacity-40" />
|
|
164
164
|
<p class="text-sm">{{ t('followUp.empty.title') }}</p>
|
|
165
|
-
<p class="max-w-sm text-[11px] text-
|
|
165
|
+
<p class="max-w-sm text-[11px] text-dimmed">
|
|
166
166
|
{{ t('followUp.empty.hint') }}
|
|
167
167
|
</p>
|
|
168
168
|
</div>
|
|
@@ -170,7 +170,7 @@ function hasRecordedAnswer(item: FollowUpItem): boolean {
|
|
|
170
170
|
<div v-else class="space-y-3">
|
|
171
171
|
<p
|
|
172
172
|
v-if="followUps.error"
|
|
173
|
-
class="rounded-md bg-
|
|
173
|
+
class="rounded-md bg-app-error-500/10 px-3 py-2 text-[12px] text-app-error-300"
|
|
174
174
|
>
|
|
175
175
|
{{ followUps.error }}
|
|
176
176
|
</p>
|
|
@@ -178,29 +178,29 @@ function hasRecordedAnswer(item: FollowUpItem): boolean {
|
|
|
178
178
|
<article
|
|
179
179
|
v-for="item in items"
|
|
180
180
|
:key="item.id"
|
|
181
|
-
class="rounded-xl border border-
|
|
182
|
-
:class="item.status === 'pending' ? 'border-
|
|
181
|
+
class="rounded-xl border border-default bg-default/60 px-4 py-3"
|
|
182
|
+
:class="item.status === 'pending' ? 'border-app-warning-500/40' : ''"
|
|
183
183
|
>
|
|
184
184
|
<div class="flex items-start gap-2">
|
|
185
185
|
<UIcon
|
|
186
186
|
:name="item.kind === 'question' ? 'i-lucide-circle-help' : 'i-lucide-compass'"
|
|
187
187
|
class="mt-0.5 h-4 w-4 shrink-0"
|
|
188
|
-
:class="item.kind === 'question' ? 'text-
|
|
188
|
+
:class="item.kind === 'question' ? 'text-app-info-300' : 'text-app-hue-pink'"
|
|
189
189
|
/>
|
|
190
190
|
<div class="min-w-0 flex-1">
|
|
191
191
|
<div class="flex items-center gap-2">
|
|
192
|
-
<h3 class="min-w-0 flex-1 truncate text-[13px] font-medium text-
|
|
192
|
+
<h3 class="min-w-0 flex-1 truncate text-[13px] font-medium text-app-100">
|
|
193
193
|
{{ item.title }}
|
|
194
194
|
</h3>
|
|
195
195
|
<UBadge :color="STATUS_META[item.status].badge" variant="subtle" size="sm">
|
|
196
196
|
{{ t(STATUS_LABEL_KEYS[item.status]) }}
|
|
197
197
|
</UBadge>
|
|
198
198
|
</div>
|
|
199
|
-
<p v-if="item.detail" class="mt-1 whitespace-pre-wrap text-[12px] text-
|
|
199
|
+
<p v-if="item.detail" class="mt-1 whitespace-pre-wrap text-[12px] text-toned">
|
|
200
200
|
{{ item.detail }}
|
|
201
201
|
</p>
|
|
202
|
-
<p v-if="item.suggestedAction" class="mt-1 text-[11px] text-
|
|
203
|
-
<span class="text-
|
|
202
|
+
<p v-if="item.suggestedAction" class="mt-1 text-[11px] text-muted">
|
|
203
|
+
<span class="text-dimmed">{{ t('followUp.suggested') }}</span>
|
|
204
204
|
{{ item.suggestedAction }}
|
|
205
205
|
</p>
|
|
206
206
|
<p v-if="item.status === 'filed' && item.ticketUrl" class="mt-1 text-[11px]">
|
|
@@ -208,13 +208,13 @@ function hasRecordedAnswer(item: FollowUpItem): boolean {
|
|
|
208
208
|
:href="item.ticketUrl"
|
|
209
209
|
target="_blank"
|
|
210
210
|
rel="noopener"
|
|
211
|
-
class="text-
|
|
211
|
+
class="text-app-success-300 hover:underline"
|
|
212
212
|
>
|
|
213
213
|
{{ item.ticketExternalId ?? t('followUp.viewIssue') }}
|
|
214
214
|
</a>
|
|
215
215
|
</p>
|
|
216
|
-
<p v-if="hasRecordedAnswer(item)" class="mt-1 text-[11px] text-
|
|
217
|
-
<span class="text-
|
|
216
|
+
<p v-if="hasRecordedAnswer(item)" class="mt-1 text-[11px] text-toned">
|
|
217
|
+
<span class="text-dimmed">
|
|
218
218
|
{{
|
|
219
219
|
item.status === 'closed' ? t('followUp.yourRuling') : t('followUp.yourAnswer')
|
|
220
220
|
}}
|
|
@@ -223,7 +223,7 @@ function hasRecordedAnswer(item: FollowUpItem): boolean {
|
|
|
223
223
|
</p>
|
|
224
224
|
<!-- A decision that was made and then thrown away when the budget ran out. It must
|
|
225
225
|
not read like one the Coder acted on. -->
|
|
226
|
-
<p v-if="item.sendBackDropped" class="mt-1 text-[11px] text-
|
|
226
|
+
<p v-if="item.sendBackDropped" class="mt-1 text-[11px] text-app-warning-300">
|
|
227
227
|
{{ t('followUp.sendBackDropped') }}
|
|
228
228
|
</p>
|
|
229
229
|
|
|
@@ -235,7 +235,7 @@ function hasRecordedAnswer(item: FollowUpItem): boolean {
|
|
|
235
235
|
v-model="drafts[item.id]"
|
|
236
236
|
rows="2"
|
|
237
237
|
:placeholder="t('followUp.answerPlaceholder')"
|
|
238
|
-
class="w-full resize-y rounded-md border border-
|
|
238
|
+
class="w-full resize-y rounded-md border border-muted bg-app-950/60 px-2.5 py-1.5 text-[12px] text-app-100 placeholder:text-app-600 focus:border-app-info-500 focus:outline-none focus-visible:ring-2 focus-visible:ring-app-info-500/60"
|
|
239
239
|
/>
|
|
240
240
|
<!-- Wraps, like the follow-up row below: three buttons whose labels are two
|
|
241
241
|
words each in English are one long line in most of the other locales, and
|
|
@@ -323,7 +323,7 @@ function hasRecordedAnswer(item: FollowUpItem): boolean {
|
|
|
323
323
|
</div>
|
|
324
324
|
|
|
325
325
|
<footer
|
|
326
|
-
class="flex items-center justify-between border-t border-
|
|
326
|
+
class="flex items-center justify-between border-t border-default px-5 py-2.5 text-[11px] text-muted"
|
|
327
327
|
>
|
|
328
328
|
<span>
|
|
329
329
|
{{
|