@cat-factory/app 0.302.2 → 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 +9 -8
|
@@ -153,12 +153,12 @@ function stage() {
|
|
|
153
153
|
<UModal v-model:open="open" :title="t('documents.startFromDesign.title')">
|
|
154
154
|
<template #body>
|
|
155
155
|
<div class="space-y-4">
|
|
156
|
-
<p class="text-sm text-
|
|
156
|
+
<p class="text-sm text-muted">{{ t('documents.startFromDesign.intro') }}</p>
|
|
157
157
|
|
|
158
158
|
<!-- No connected design source: the flow cannot run, and saying which step is missing
|
|
159
159
|
beats an input that refuses every paste. The connect route is withheld from a member
|
|
160
160
|
for the same reason the picker's add tier is: connecting stores a credential. -->
|
|
161
|
-
<p v-if="sources.length === 0" class="text-sm text-
|
|
161
|
+
<p v-if="sources.length === 0" class="text-sm text-app-warning-300">
|
|
162
162
|
{{ t('documents.startFromDesign.noSource') }}
|
|
163
163
|
</p>
|
|
164
164
|
|
|
@@ -176,7 +176,7 @@ function stage() {
|
|
|
176
176
|
|
|
177
177
|
<div
|
|
178
178
|
v-if="state.status === 'checking'"
|
|
179
|
-
class="flex items-center gap-2 text-sm text-
|
|
179
|
+
class="flex items-center gap-2 text-sm text-muted"
|
|
180
180
|
>
|
|
181
181
|
<UIcon name="i-lucide-loader" class="h-4 w-4 animate-spin" />
|
|
182
182
|
{{ t('documents.startFromDesign.checking') }}
|
|
@@ -184,32 +184,32 @@ function stage() {
|
|
|
184
184
|
|
|
185
185
|
<div
|
|
186
186
|
v-else-if="row"
|
|
187
|
-
class="space-y-1 rounded-lg border border-
|
|
187
|
+
class="space-y-1 rounded-lg border border-default bg-default/60 p-3"
|
|
188
188
|
data-testid="start-from-design-resolved"
|
|
189
189
|
>
|
|
190
|
-
<div class="flex items-center gap-2 text-sm text-
|
|
191
|
-
<UIcon name="i-lucide-frame" class="h-4 w-4 text-
|
|
190
|
+
<div class="flex items-center gap-2 text-sm text-highlighted">
|
|
191
|
+
<UIcon name="i-lucide-frame" class="h-4 w-4 text-primary" />
|
|
192
192
|
<span class="truncate">{{ row.label }}</span>
|
|
193
193
|
</div>
|
|
194
|
-
<p v-if="row.trimmed" class="text-[11px] text-
|
|
194
|
+
<p v-if="row.trimmed" class="text-[11px] text-muted">
|
|
195
195
|
{{ t('documents.startFromDesign.trimmed') }}
|
|
196
196
|
</p>
|
|
197
197
|
<!-- Its own line, in amber: a trim resolves the same page, a drop widens ONE frame to
|
|
198
198
|
the whole design file, and the second is what a designer needs to see. -->
|
|
199
|
-
<p v-if="row.droppedScope" class="text-[11px] text-
|
|
199
|
+
<p v-if="row.droppedScope" class="text-[11px] text-app-warning-300">
|
|
200
200
|
{{ t('documents.startFromDesign.widened', { scope: row.droppedScope }) }}
|
|
201
201
|
</p>
|
|
202
|
-
<p v-if="row.unchecked && target" class="text-[11px] text-
|
|
202
|
+
<p v-if="row.unchecked && target" class="text-[11px] text-muted">
|
|
203
203
|
{{ t('documents.startFromDesign.unchecked') }}
|
|
204
204
|
</p>
|
|
205
|
-
<p v-else-if="row.unchecked" class="text-[11px] text-
|
|
205
|
+
<p v-else-if="row.unchecked" class="text-[11px] text-app-warning-300">
|
|
206
206
|
{{ t('documents.startFromDesign.uncheckedAmbiguous') }}
|
|
207
207
|
</p>
|
|
208
208
|
</div>
|
|
209
209
|
|
|
210
210
|
<p
|
|
211
211
|
v-else-if="state.status === 'rejected'"
|
|
212
|
-
class="text-sm text-
|
|
212
|
+
class="text-sm text-app-warning-300"
|
|
213
213
|
data-testid="start-from-design-rejected"
|
|
214
214
|
>
|
|
215
215
|
{{ t('documents.startFromDesign.rejected') }}
|
|
@@ -149,23 +149,23 @@ async function attach(item: PendingContext) {
|
|
|
149
149
|
<div
|
|
150
150
|
v-for="doc in linked"
|
|
151
151
|
:key="`${doc.source}:${doc.externalId}`"
|
|
152
|
-
class="rounded-md border border-
|
|
152
|
+
class="rounded-md border border-default bg-default/60 px-2 py-1.5"
|
|
153
153
|
>
|
|
154
154
|
<DocumentOriginLink
|
|
155
155
|
:url="doc.url"
|
|
156
|
-
class="flex items-center gap-1.5 text-xs text-
|
|
157
|
-
hover-class="hover:text-
|
|
156
|
+
class="flex items-center gap-1.5 text-xs text-toned"
|
|
157
|
+
hover-class="hover:text-highlighted"
|
|
158
158
|
>
|
|
159
159
|
<UIcon
|
|
160
160
|
:name="documents.descriptorForOrigin(doc.source)?.icon ?? 'i-lucide-file-text'"
|
|
161
|
-
class="h-3.5 w-3.5 shrink-0 text-
|
|
161
|
+
class="h-3.5 w-3.5 shrink-0 text-primary"
|
|
162
162
|
/>
|
|
163
163
|
<span class="truncate">{{ doc.title }}</span>
|
|
164
164
|
</DocumentOriginLink>
|
|
165
165
|
<DocumentSyncState :doc="doc" class="mt-1" />
|
|
166
166
|
</div>
|
|
167
167
|
</div>
|
|
168
|
-
<p v-else class="text-[11px] text-
|
|
168
|
+
<p v-else class="text-[11px] text-dimmed">
|
|
169
169
|
{{ emptyHint }}
|
|
170
170
|
</p>
|
|
171
171
|
</InspectorSection>
|
|
@@ -37,7 +37,7 @@ function stepLabel(key: string | undefined): string {
|
|
|
37
37
|
|
|
38
38
|
<template>
|
|
39
39
|
<div class="space-y-2" data-testid="env-setup-stepper">
|
|
40
|
-
<p v-if="total" class="text-[11px] font-medium text-
|
|
40
|
+
<p v-if="total" class="text-[11px] font-medium text-muted" data-testid="env-setup-progress">
|
|
41
41
|
{{ t('environmentWizard.progress', { index: index + 1, total }) }}
|
|
42
42
|
</p>
|
|
43
43
|
<ol class="flex items-center gap-2 text-[11px]">
|
|
@@ -50,19 +50,19 @@ function stepLabel(key: string | undefined): string {
|
|
|
50
50
|
<span
|
|
51
51
|
class="flex h-5 w-5 items-center justify-center rounded-full text-[10px] font-semibold"
|
|
52
52
|
:class="{
|
|
53
|
-
'bg-primary
|
|
54
|
-
'bg-
|
|
55
|
-
'bg-
|
|
53
|
+
'bg-primary text-inverted': i === index,
|
|
54
|
+
'bg-app-success-600/70 text-highlighted': i < index,
|
|
55
|
+
'bg-accented text-toned': i > index,
|
|
56
56
|
}"
|
|
57
57
|
>{{ i + 1 }}</span
|
|
58
58
|
>
|
|
59
|
-
<span :class="i === index ? 'text-
|
|
59
|
+
<span :class="i === index ? 'text-app-100' : 'text-dimmed'">
|
|
60
60
|
{{ stepLabel(step.progressLabel) }}
|
|
61
61
|
</span>
|
|
62
62
|
<UIcon
|
|
63
63
|
v-if="i < steps.length - 1"
|
|
64
64
|
name="i-lucide-chevron-right"
|
|
65
|
-
class="h-3 w-3 text-
|
|
65
|
+
class="h-3 w-3 text-app-600"
|
|
66
66
|
/>
|
|
67
67
|
</li>
|
|
68
68
|
</ol>
|
|
@@ -60,32 +60,32 @@ const ENV_STATUS_META = computed<
|
|
|
60
60
|
>(() => ({
|
|
61
61
|
provisioning: {
|
|
62
62
|
label: t('environments.status.provisioning'),
|
|
63
|
-
color: 'text-
|
|
63
|
+
color: 'text-app-warning-300',
|
|
64
64
|
icon: 'i-lucide-loader-circle',
|
|
65
65
|
},
|
|
66
66
|
ready: {
|
|
67
67
|
label: t('environments.status.ready'),
|
|
68
|
-
color: 'text-
|
|
68
|
+
color: 'text-app-success-300',
|
|
69
69
|
icon: 'i-lucide-circle-dot',
|
|
70
70
|
},
|
|
71
71
|
failed: {
|
|
72
72
|
label: t('environments.status.failed'),
|
|
73
|
-
color: 'text-
|
|
73
|
+
color: 'text-app-error-300',
|
|
74
74
|
icon: 'i-lucide-circle-alert',
|
|
75
75
|
},
|
|
76
76
|
expired: {
|
|
77
77
|
label: t('environments.status.expired'),
|
|
78
|
-
color: 'text-
|
|
78
|
+
color: 'text-muted',
|
|
79
79
|
icon: 'i-lucide-circle-off',
|
|
80
80
|
},
|
|
81
81
|
tearing_down: {
|
|
82
82
|
label: t('environments.status.tearing_down'),
|
|
83
|
-
color: 'text-
|
|
83
|
+
color: 'text-muted',
|
|
84
84
|
icon: 'i-lucide-loader-circle',
|
|
85
85
|
},
|
|
86
86
|
torn_down: {
|
|
87
87
|
label: t('environments.status.torn_down'),
|
|
88
|
-
color: 'text-
|
|
88
|
+
color: 'text-muted',
|
|
89
89
|
icon: 'i-lucide-circle-off',
|
|
90
90
|
},
|
|
91
91
|
}))
|
|
@@ -105,8 +105,8 @@ const envInTransition = computed(
|
|
|
105
105
|
</script>
|
|
106
106
|
|
|
107
107
|
<template>
|
|
108
|
-
<section class="rounded-lg border border-
|
|
109
|
-
<h3 class="mb-2 text-[11px] font-semibold uppercase tracking-wide text-
|
|
108
|
+
<section class="rounded-lg border border-default bg-default/60 p-3">
|
|
109
|
+
<h3 class="mb-2 text-[11px] font-semibold uppercase tracking-wide text-dimmed">
|
|
110
110
|
{{ t('environments.title') }}
|
|
111
111
|
</h3>
|
|
112
112
|
<div v-if="environment" class="space-y-2">
|
|
@@ -128,30 +128,30 @@ const envInTransition = computed(
|
|
|
128
128
|
:href="environment.url"
|
|
129
129
|
target="_blank"
|
|
130
130
|
rel="noopener"
|
|
131
|
-
class="inline-flex items-center gap-1.5 break-all text-[13px] text-
|
|
131
|
+
class="inline-flex items-center gap-1.5 break-all text-[13px] text-app-info-300 hover:underline"
|
|
132
132
|
>
|
|
133
133
|
<UIcon name="i-lucide-external-link" class="h-3.5 w-3.5 shrink-0" />
|
|
134
134
|
{{ environment.url }}
|
|
135
135
|
</a>
|
|
136
|
-
<p v-if="environment.expiresAt" class="text-[11px] text-
|
|
136
|
+
<p v-if="environment.expiresAt" class="text-[11px] text-dimmed">
|
|
137
137
|
{{ t('environments.expires', { date: d(new Date(environment.expiresAt), 'long') }) }}
|
|
138
138
|
</p>
|
|
139
139
|
<!-- The resolved provision type + engine recorded at provision time, so a run states
|
|
140
140
|
exactly what was provisioned and how (the what/where ÷ how split). -->
|
|
141
141
|
<dl v-if="provisionTypeLabel || engineLabel" class="flex flex-wrap gap-x-4 gap-y-0.5">
|
|
142
142
|
<div v-if="provisionTypeLabel" class="flex items-center gap-1 text-[11px]">
|
|
143
|
-
<dt class="text-
|
|
144
|
-
<dd class="text-
|
|
143
|
+
<dt class="text-dimmed">{{ t('environments.provisionTypeLabel') }}</dt>
|
|
144
|
+
<dd class="text-toned">{{ provisionTypeLabel }}</dd>
|
|
145
145
|
</div>
|
|
146
146
|
<div v-if="engineLabel" class="flex items-center gap-1 text-[11px]">
|
|
147
|
-
<dt class="text-
|
|
148
|
-
<dd class="text-
|
|
147
|
+
<dt class="text-dimmed">{{ t('environments.engineLabel') }}</dt>
|
|
148
|
+
<dd class="text-toned">{{ engineLabel }}</dd>
|
|
149
149
|
</div>
|
|
150
150
|
</dl>
|
|
151
151
|
<!-- The verbatim provider error when the environment failed/expired. -->
|
|
152
152
|
<pre
|
|
153
153
|
v-if="failureShown"
|
|
154
|
-
class="mt-1 max-h-32 overflow-auto whitespace-pre-wrap rounded border border-
|
|
154
|
+
class="mt-1 max-h-32 overflow-auto whitespace-pre-wrap rounded border border-app-error-900/60 bg-app-error-950/40 p-1.5 text-[11px] text-app-error-200/90"
|
|
155
155
|
>{{ environment.lastError }}</pre>
|
|
156
156
|
<!-- What the provider says it is still waiting on. Muted rather than alarming: an
|
|
157
157
|
environment mid-rollout is healthy, and styling this like the error above would report
|
|
@@ -159,12 +159,12 @@ const envInTransition = computed(
|
|
|
159
159
|
prose. -->
|
|
160
160
|
<p
|
|
161
161
|
v-if="statusNote"
|
|
162
|
-
class="mt-1 max-h-32 overflow-auto whitespace-pre-wrap break-words text-[11px] text-
|
|
162
|
+
class="mt-1 max-h-32 overflow-auto whitespace-pre-wrap break-words text-[11px] text-muted"
|
|
163
163
|
>
|
|
164
164
|
{{ t('environments.statusNote', { note: statusNote }) }}
|
|
165
165
|
</p>
|
|
166
166
|
</div>
|
|
167
|
-
<p v-else class="text-[12px] text-
|
|
167
|
+
<p v-else class="text-[12px] text-dimmed">
|
|
168
168
|
{{ degradedReason ?? t('environments.empty') }}
|
|
169
169
|
</p>
|
|
170
170
|
</section>
|
|
@@ -17,11 +17,11 @@ const { t } = useI18n()
|
|
|
17
17
|
|
|
18
18
|
<template>
|
|
19
19
|
<section class="space-y-3" data-testid="env-setup-step-pick">
|
|
20
|
-
<p class="text-sm text-
|
|
20
|
+
<p class="text-sm text-muted">{{ t('environmentWizard.pick.intro') }}</p>
|
|
21
21
|
<!-- The one-service scope caveat, stated on the step that asks for the service: nothing
|
|
22
22
|
here changes any other service, and running it twice just re-edits this one's recipe. -->
|
|
23
|
-
<p class="text-xs leading-relaxed text-
|
|
24
|
-
<p v-if="!store.serviceFrames.length" class="text-sm text-
|
|
23
|
+
<p class="text-xs leading-relaxed text-dimmed">{{ t('environmentWizard.pick.scope') }}</p>
|
|
24
|
+
<p v-if="!store.serviceFrames.length" class="text-sm text-dimmed">
|
|
25
25
|
{{ t('environmentWizard.pick.empty') }}
|
|
26
26
|
</p>
|
|
27
27
|
<div v-else class="space-y-1.5">
|
|
@@ -35,7 +35,7 @@ const PREFLIGHT_COLOR: Record<'pass' | 'warn' | 'fail', 'success' | 'warning' |
|
|
|
35
35
|
<template>
|
|
36
36
|
<section class="space-y-3" data-testid="env-setup-step-preflight">
|
|
37
37
|
<div class="flex items-center justify-between gap-2">
|
|
38
|
-
<p class="text-sm text-
|
|
38
|
+
<p class="text-sm text-muted">{{ t('environmentWizard.preflight.intro') }}</p>
|
|
39
39
|
<UButton
|
|
40
40
|
size="xs"
|
|
41
41
|
variant="soft"
|
|
@@ -51,21 +51,21 @@ const PREFLIGHT_COLOR: Record<'pass' | 'warn' | 'fail', 'success' | 'warning' |
|
|
|
51
51
|
|
|
52
52
|
<p
|
|
53
53
|
v-if="!store.recipe.prerequisites?.length"
|
|
54
|
-
class="text-[12px] text-
|
|
54
|
+
class="text-[12px] text-dimmed"
|
|
55
55
|
data-testid="env-setup-preflight-none"
|
|
56
56
|
>
|
|
57
57
|
{{ t('environmentWizard.preflight.none') }}
|
|
58
58
|
</p>
|
|
59
59
|
<p
|
|
60
60
|
v-else-if="preflightsUnavailable"
|
|
61
|
-
class="text-[12px] text-
|
|
61
|
+
class="text-[12px] text-app-warning-300/80"
|
|
62
62
|
data-testid="env-setup-preflight-unavailable"
|
|
63
63
|
>
|
|
64
64
|
{{ t('environmentWizard.preflight.unavailable') }}
|
|
65
65
|
</p>
|
|
66
66
|
<p
|
|
67
67
|
v-if="store.preflightError"
|
|
68
|
-
class="text-[12px] text-
|
|
68
|
+
class="text-[12px] text-app-error-300/80"
|
|
69
69
|
data-testid="env-setup-preflight-error"
|
|
70
70
|
>
|
|
71
71
|
{{ store.preflightError }}
|
|
@@ -79,21 +79,21 @@ const PREFLIGHT_COLOR: Record<'pass' | 'warn' | 'fail', 'success' | 'warning' |
|
|
|
79
79
|
<li
|
|
80
80
|
v-for="r in store.preflightResults"
|
|
81
81
|
:key="r.title"
|
|
82
|
-
class="rounded border border-
|
|
82
|
+
class="rounded border border-default bg-default/40 p-2"
|
|
83
83
|
>
|
|
84
84
|
<div class="flex items-center gap-2">
|
|
85
85
|
<UBadge :color="PREFLIGHT_COLOR[r.status]" variant="subtle" size="sm">
|
|
86
86
|
{{ r.status }}
|
|
87
87
|
</UBadge>
|
|
88
|
-
<span class="text-[12px] text-
|
|
89
|
-
<span v-if="!r.required" class="ms-auto text-[10px] text-
|
|
88
|
+
<span class="text-[12px] text-default">{{ r.title }}</span>
|
|
89
|
+
<span v-if="!r.required" class="ms-auto text-[10px] text-dimmed">
|
|
90
90
|
{{ t('environmentWizard.preflight.optional') }}
|
|
91
91
|
</span>
|
|
92
92
|
</div>
|
|
93
|
-
<p v-if="r.detail" class="mt-1 text-[11px] text-
|
|
93
|
+
<p v-if="r.detail" class="mt-1 text-[11px] text-muted">{{ r.detail }}</p>
|
|
94
94
|
<pre
|
|
95
95
|
v-if="r.status !== 'pass' && r.remediation"
|
|
96
|
-
class="mt-1 max-h-40 overflow-auto whitespace-pre-wrap rounded border border-
|
|
96
|
+
class="mt-1 max-h-40 overflow-auto whitespace-pre-wrap rounded border border-app-warning-900/40 bg-app-warning-950/20 p-1.5 text-[11px] text-app-warning-200/90"
|
|
97
97
|
>{{ r.remediation }}</pre>
|
|
98
98
|
</li>
|
|
99
99
|
</ul>
|
|
@@ -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>
|