@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
|
@@ -213,16 +213,14 @@ const noSignInMethod = computed(
|
|
|
213
213
|
|
|
214
214
|
<template>
|
|
215
215
|
<div
|
|
216
|
-
class="flex h-screen w-screen items-center justify-center bg-
|
|
216
|
+
class="flex h-screen w-screen items-center justify-center bg-app-950 text-app-100"
|
|
217
217
|
data-testid="login-screen"
|
|
218
218
|
>
|
|
219
|
-
<div
|
|
220
|
-
class="w-full max-w-sm rounded-xl border border-slate-800 bg-slate-900/80 p-8 backdrop-blur"
|
|
221
|
-
>
|
|
219
|
+
<div class="w-full max-w-sm rounded-xl border border-default bg-default/80 p-8 backdrop-blur">
|
|
222
220
|
<div class="mb-6 text-center">
|
|
223
|
-
<UIcon name="i-lucide-layout-dashboard" class="mx-auto mb-3 h-10 w-10 text-
|
|
224
|
-
<h1 class="mb-1 text-lg font-semibold text-
|
|
225
|
-
<p class="text-sm text-
|
|
221
|
+
<UIcon name="i-lucide-layout-dashboard" class="mx-auto mb-3 h-10 w-10 text-primary" />
|
|
222
|
+
<h1 class="mb-1 text-lg font-semibold text-highlighted">{{ t('auth.login.appTitle') }}</h1>
|
|
223
|
+
<p class="text-sm text-muted">
|
|
226
224
|
<template v-if="mode === 'forgot'">{{ t('auth.login.forgotSubtitle') }}</template>
|
|
227
225
|
<template v-else>{{
|
|
228
226
|
invite ? t('auth.login.inviteSubtitle') : t('auth.login.subtitle')
|
|
@@ -243,10 +241,10 @@ const noSignInMethod = computed(
|
|
|
243
241
|
>
|
|
244
242
|
{{ t('auth.mothership.signIn') }}
|
|
245
243
|
</UButton>
|
|
246
|
-
<p class="px-1 text-xs text-
|
|
244
|
+
<p class="px-1 text-xs text-muted">{{ t('auth.mothership.hint') }}</p>
|
|
247
245
|
<p
|
|
248
246
|
v-if="auth.mothershipError"
|
|
249
|
-
class="px-1 text-xs text-
|
|
247
|
+
class="px-1 text-xs text-app-error-400"
|
|
250
248
|
data-testid="mothership-error"
|
|
251
249
|
>
|
|
252
250
|
{{ t('auth.mothership.error') }}
|
|
@@ -294,22 +292,22 @@ const noSignInMethod = computed(
|
|
|
294
292
|
:href="tokenCreateUrl(p)"
|
|
295
293
|
target="_blank"
|
|
296
294
|
rel="noopener noreferrer"
|
|
297
|
-
class="text-xs text-
|
|
295
|
+
class="text-xs text-primary hover:underline"
|
|
298
296
|
>
|
|
299
297
|
{{ t('auth.localMode.createToken', { provider: PROVIDER_LABELS[p] }) }}
|
|
300
298
|
</a>
|
|
301
299
|
</div>
|
|
302
300
|
</template>
|
|
303
301
|
|
|
304
|
-
<p v-if="patError" class="text-sm text-
|
|
302
|
+
<p v-if="patError" class="text-sm text-app-error-400">{{ patError }}</p>
|
|
305
303
|
</div>
|
|
306
304
|
|
|
307
305
|
<div
|
|
308
306
|
v-if="isLocalMode && auth.providers.password && mode !== 'forgot'"
|
|
309
|
-
class="my-4 flex items-center gap-3 text-xs text-
|
|
307
|
+
class="my-4 flex items-center gap-3 text-xs text-dimmed"
|
|
310
308
|
>
|
|
311
|
-
<span class="h-px flex-1 bg-
|
|
312
|
-
<span class="h-px flex-1 bg-
|
|
309
|
+
<span class="h-px flex-1 bg-elevated" /> {{ t('auth.localMode.orDivider') }}
|
|
310
|
+
<span class="h-px flex-1 bg-elevated" />
|
|
313
311
|
</div>
|
|
314
312
|
|
|
315
313
|
<!-- A refused SSO round-trip: name the rule that refused, don't return the user to an
|
|
@@ -341,10 +339,10 @@ const noSignInMethod = computed(
|
|
|
341
339
|
|
|
342
340
|
<div
|
|
343
341
|
v-if="showSsoDivider && mode !== 'forgot'"
|
|
344
|
-
class="my-4 flex items-center gap-3 text-xs text-
|
|
342
|
+
class="my-4 flex items-center gap-3 text-xs text-dimmed"
|
|
345
343
|
>
|
|
346
|
-
<span class="h-px flex-1 bg-
|
|
347
|
-
<span class="h-px flex-1 bg-
|
|
344
|
+
<span class="h-px flex-1 bg-elevated" /> {{ t('auth.login.or') }}
|
|
345
|
+
<span class="h-px flex-1 bg-elevated" />
|
|
348
346
|
</div>
|
|
349
347
|
|
|
350
348
|
<!-- OAuth providers -->
|
|
@@ -374,10 +372,10 @@ const noSignInMethod = computed(
|
|
|
374
372
|
|
|
375
373
|
<div
|
|
376
374
|
v-if="showOAuthDivider && mode !== 'forgot'"
|
|
377
|
-
class="my-4 flex items-center gap-3 text-xs text-
|
|
375
|
+
class="my-4 flex items-center gap-3 text-xs text-dimmed"
|
|
378
376
|
>
|
|
379
|
-
<span class="h-px flex-1 bg-
|
|
380
|
-
<span class="h-px flex-1 bg-
|
|
377
|
+
<span class="h-px flex-1 bg-elevated" /> {{ t('auth.login.or') }}
|
|
378
|
+
<span class="h-px flex-1 bg-elevated" />
|
|
381
379
|
</div>
|
|
382
380
|
|
|
383
381
|
<!-- Email / password -->
|
|
@@ -413,7 +411,7 @@ const noSignInMethod = computed(
|
|
|
413
411
|
class="w-full"
|
|
414
412
|
data-testid="login-password"
|
|
415
413
|
/>
|
|
416
|
-
<p v-if="error" class="text-sm text-
|
|
414
|
+
<p v-if="error" class="text-sm text-app-error-400" data-testid="login-error">{{ error }}</p>
|
|
417
415
|
<UButton
|
|
418
416
|
block
|
|
419
417
|
size="lg"
|
|
@@ -424,13 +422,13 @@ const noSignInMethod = computed(
|
|
|
424
422
|
>
|
|
425
423
|
{{ mode === 'signup' ? t('auth.login.createAccount') : t('auth.login.signIn') }}
|
|
426
424
|
</UButton>
|
|
427
|
-
<p class="text-center text-xs text-
|
|
425
|
+
<p class="text-center text-xs text-muted">
|
|
428
426
|
<template v-if="mode === 'login'">
|
|
429
427
|
<i18n-t keypath="auth.login.needAccount" tag="span" scope="global">
|
|
430
428
|
<template #signUp>
|
|
431
429
|
<button
|
|
432
430
|
type="button"
|
|
433
|
-
class="text-
|
|
431
|
+
class="text-primary hover:underline"
|
|
434
432
|
@click="setMode('signup')"
|
|
435
433
|
>
|
|
436
434
|
{{ t('auth.login.signUp') }}
|
|
@@ -443,7 +441,7 @@ const noSignInMethod = computed(
|
|
|
443
441
|
<template #signIn>
|
|
444
442
|
<button
|
|
445
443
|
type="button"
|
|
446
|
-
class="text-
|
|
444
|
+
class="text-primary hover:underline"
|
|
447
445
|
@click="setMode('login')"
|
|
448
446
|
>
|
|
449
447
|
{{ t('auth.login.signIn') }}
|
|
@@ -452,8 +450,8 @@ const noSignInMethod = computed(
|
|
|
452
450
|
</i18n-t>
|
|
453
451
|
</template>
|
|
454
452
|
</p>
|
|
455
|
-
<p v-if="mode === 'login'" class="text-center text-xs text-
|
|
456
|
-
<button type="button" class="text-
|
|
453
|
+
<p v-if="mode === 'login'" class="text-center text-xs text-muted">
|
|
454
|
+
<button type="button" class="text-primary hover:underline" @click="setMode('forgot')">
|
|
457
455
|
{{ t('auth.login.forgotPassword') }}
|
|
458
456
|
</button>
|
|
459
457
|
</p>
|
|
@@ -469,10 +467,10 @@ const noSignInMethod = computed(
|
|
|
469
467
|
auth.providers.password ||
|
|
470
468
|
hasConfiguredPat
|
|
471
469
|
"
|
|
472
|
-
class="my-4 flex items-center gap-3 text-xs text-
|
|
470
|
+
class="my-4 flex items-center gap-3 text-xs text-dimmed"
|
|
473
471
|
>
|
|
474
|
-
<span class="h-px flex-1 bg-
|
|
475
|
-
<span class="h-px flex-1 bg-
|
|
472
|
+
<span class="h-px flex-1 bg-elevated" /> {{ t('auth.login.or') }}
|
|
473
|
+
<span class="h-px flex-1 bg-elevated" />
|
|
476
474
|
</div>
|
|
477
475
|
<form class="space-y-3" @submit.prevent="submitRemotePat">
|
|
478
476
|
<div v-if="remotePatProviders.length > 1" class="flex gap-2">
|
|
@@ -502,7 +500,7 @@ const noSignInMethod = computed(
|
|
|
502
500
|
size="lg"
|
|
503
501
|
class="w-full"
|
|
504
502
|
/>
|
|
505
|
-
<p v-if="remotePatError" class="text-sm text-
|
|
503
|
+
<p v-if="remotePatError" class="text-sm text-app-error-400">{{ remotePatError }}</p>
|
|
506
504
|
<UButton
|
|
507
505
|
block
|
|
508
506
|
size="lg"
|
|
@@ -515,7 +513,7 @@ const noSignInMethod = computed(
|
|
|
515
513
|
</UButton>
|
|
516
514
|
<!-- Local mode only: say what else the token is for BEFORE it is handed over, since it
|
|
517
515
|
becomes the credential every agent step on this machine clones and pushes with. -->
|
|
518
|
-
<p v-if="isLocalMode" class="px-1 text-xs text-
|
|
516
|
+
<p v-if="isLocalMode" class="px-1 text-xs text-muted">
|
|
519
517
|
{{ t('auth.localMode.tokenBecomesCredential') }}
|
|
520
518
|
</p>
|
|
521
519
|
<p class="px-1 text-center">
|
|
@@ -523,7 +521,7 @@ const noSignInMethod = computed(
|
|
|
523
521
|
:href="tokenCreateUrl(remotePatProvider)"
|
|
524
522
|
target="_blank"
|
|
525
523
|
rel="noopener noreferrer"
|
|
526
|
-
class="text-xs text-
|
|
524
|
+
class="text-xs text-primary hover:underline"
|
|
527
525
|
>
|
|
528
526
|
{{
|
|
529
527
|
t('auth.localMode.createToken', { provider: PROVIDER_LABELS[remotePatProvider] })
|
|
@@ -550,7 +548,7 @@ const noSignInMethod = computed(
|
|
|
550
548
|
@submit.prevent="submitForgot"
|
|
551
549
|
>
|
|
552
550
|
<template v-if="forgotSent">
|
|
553
|
-
<p class="text-sm text-
|
|
551
|
+
<p class="text-sm text-toned">
|
|
554
552
|
{{ t('auth.login.forgotSent') }}
|
|
555
553
|
</p>
|
|
556
554
|
</template>
|
|
@@ -564,13 +562,13 @@ const noSignInMethod = computed(
|
|
|
564
562
|
size="lg"
|
|
565
563
|
class="w-full"
|
|
566
564
|
/>
|
|
567
|
-
<p v-if="error" class="text-sm text-
|
|
565
|
+
<p v-if="error" class="text-sm text-app-error-400">{{ error }}</p>
|
|
568
566
|
<UButton block size="lg" color="primary" type="submit" :loading="busy">
|
|
569
567
|
{{ t('auth.login.sendResetLink') }}
|
|
570
568
|
</UButton>
|
|
571
569
|
</template>
|
|
572
|
-
<p class="text-center text-xs text-
|
|
573
|
-
<button type="button" class="text-
|
|
570
|
+
<p class="text-center text-xs text-muted">
|
|
571
|
+
<button type="button" class="text-primary hover:underline" @click="setMode('login')">
|
|
574
572
|
{{ t('auth.login.backToSignIn') }}
|
|
575
573
|
</button>
|
|
576
574
|
</p>
|
|
@@ -48,18 +48,18 @@ function goToLogin() {
|
|
|
48
48
|
</script>
|
|
49
49
|
|
|
50
50
|
<template>
|
|
51
|
-
<div class="flex h-screen w-screen items-center justify-center bg-
|
|
52
|
-
<div
|
|
53
|
-
class="w-full max-w-sm rounded-xl border border-slate-800 bg-slate-900/80 p-8 backdrop-blur"
|
|
54
|
-
>
|
|
51
|
+
<div class="flex h-screen w-screen items-center justify-center bg-app-950 text-app-100">
|
|
52
|
+
<div class="w-full max-w-sm rounded-xl border border-default bg-default/80 p-8 backdrop-blur">
|
|
55
53
|
<div class="mb-6 text-center">
|
|
56
|
-
<UIcon name="i-lucide-key-round" class="mx-auto mb-3 h-10 w-10 text-
|
|
57
|
-
<h1 class="mb-1 text-lg font-semibold text-
|
|
58
|
-
|
|
54
|
+
<UIcon name="i-lucide-key-round" class="mx-auto mb-3 h-10 w-10 text-primary" />
|
|
55
|
+
<h1 class="mb-1 text-lg font-semibold text-highlighted">
|
|
56
|
+
{{ t('auth.resetPassword.title') }}
|
|
57
|
+
</h1>
|
|
58
|
+
<p class="text-sm text-muted">{{ t('auth.resetPassword.subtitle') }}</p>
|
|
59
59
|
</div>
|
|
60
60
|
|
|
61
61
|
<template v-if="done">
|
|
62
|
-
<p class="mb-4 text-sm text-
|
|
62
|
+
<p class="mb-4 text-sm text-toned">
|
|
63
63
|
{{ t('auth.resetPassword.doneBody') }}
|
|
64
64
|
</p>
|
|
65
65
|
<UButton block size="lg" color="primary" @click="goToLogin">{{
|
|
@@ -68,7 +68,7 @@ function goToLogin() {
|
|
|
68
68
|
</template>
|
|
69
69
|
|
|
70
70
|
<template v-else-if="!token">
|
|
71
|
-
<p class="mb-4 text-sm text-
|
|
71
|
+
<p class="mb-4 text-sm text-app-error-400">
|
|
72
72
|
{{ t('auth.resetPassword.missingToken') }}
|
|
73
73
|
</p>
|
|
74
74
|
<UButton block size="lg" color="neutral" variant="subtle" @click="goToLogin">
|
|
@@ -93,12 +93,12 @@ function goToLogin() {
|
|
|
93
93
|
size="lg"
|
|
94
94
|
class="w-full"
|
|
95
95
|
/>
|
|
96
|
-
<p v-if="error" class="text-sm text-
|
|
96
|
+
<p v-if="error" class="text-sm text-app-error-400">{{ error }}</p>
|
|
97
97
|
<UButton block size="lg" color="primary" type="submit" :loading="busy">
|
|
98
98
|
{{ t('auth.resetPassword.submit') }}
|
|
99
99
|
</UButton>
|
|
100
|
-
<p class="text-center text-xs text-
|
|
101
|
-
<button type="button" class="text-
|
|
100
|
+
<p class="text-center text-xs text-muted">
|
|
101
|
+
<button type="button" class="text-primary hover:underline" @click="goToLogin">
|
|
102
102
|
{{ t('auth.resetPassword.backToSignIn') }}
|
|
103
103
|
</button>
|
|
104
104
|
</p>
|
|
@@ -37,7 +37,7 @@ const items = computed<DropdownMenuItem[][]>(() => [
|
|
|
37
37
|
type="button"
|
|
38
38
|
data-testid="user-menu"
|
|
39
39
|
:title="collapsed ? auth.user.name || auth.user.login : undefined"
|
|
40
|
-
class="flex w-full items-center gap-2 rounded-lg border border-
|
|
40
|
+
class="flex w-full items-center gap-2 rounded-lg border border-default bg-default/60 p-2 text-start transition hover:bg-elevated/60"
|
|
41
41
|
:class="collapsed ? 'justify-center' : ''"
|
|
42
42
|
>
|
|
43
43
|
<UAvatar
|
|
@@ -47,12 +47,12 @@ const items = computed<DropdownMenuItem[][]>(() => [
|
|
|
47
47
|
icon="i-lucide-user"
|
|
48
48
|
/>
|
|
49
49
|
<div v-if="!collapsed" class="min-w-0 flex-1">
|
|
50
|
-
<div class="truncate text-xs font-medium text-
|
|
50
|
+
<div class="truncate text-xs font-medium text-highlighted">
|
|
51
51
|
{{ auth.user.name || auth.user.login }}
|
|
52
52
|
</div>
|
|
53
|
-
<div class="truncate text-[10px] text-
|
|
53
|
+
<div class="truncate text-[10px] text-dimmed">@{{ auth.user.login }}</div>
|
|
54
54
|
</div>
|
|
55
|
-
<UIcon v-if="!collapsed" name="i-lucide-chevron-up" class="h-4 w-4 shrink-0 text-
|
|
55
|
+
<UIcon v-if="!collapsed" name="i-lucide-chevron-up" class="h-4 w-4 shrink-0 text-dimmed" />
|
|
56
56
|
</button>
|
|
57
57
|
</UDropdownMenu>
|
|
58
58
|
</template>
|
|
@@ -190,7 +190,7 @@ const { requestClose } = useUnsavedGuard({
|
|
|
190
190
|
<ResultWindowShell
|
|
191
191
|
:open="open"
|
|
192
192
|
icon="i-lucide-images"
|
|
193
|
-
icon-class="bg-
|
|
193
|
+
icon-class="bg-app-info-500/15 text-app-info-300"
|
|
194
194
|
:title="headerTitle"
|
|
195
195
|
:subtitle="t('binaryCandidates.subtitle')"
|
|
196
196
|
width="5xl"
|
|
@@ -202,7 +202,7 @@ const { requestClose } = useUnsavedGuard({
|
|
|
202
202
|
declared its candidates and one whose block was unreadable need different fixes. -->
|
|
203
203
|
<p
|
|
204
204
|
v-if="noChoiceKey"
|
|
205
|
-
class="mb-3 rounded border border-
|
|
205
|
+
class="mb-3 rounded border border-app-warning-500/30 bg-app-warning-500/5 px-3 py-2 text-xs text-app-warning-200"
|
|
206
206
|
data-testid="binary-candidates-no-choice"
|
|
207
207
|
>
|
|
208
208
|
{{ t(noChoiceKey) }}
|
|
@@ -211,7 +211,7 @@ const { requestClose } = useUnsavedGuard({
|
|
|
211
211
|
<!-- An automatic keep is NOT a review, and must never render as one. -->
|
|
212
212
|
<p
|
|
213
213
|
v-if="view.automatic"
|
|
214
|
-
class="mb-3 rounded border border-
|
|
214
|
+
class="mb-3 rounded border border-app-600/40 bg-elevated/40 px-3 py-2 text-xs text-toned"
|
|
215
215
|
data-testid="binary-candidates-automatic"
|
|
216
216
|
>
|
|
217
217
|
{{ t('binaryCandidates.automatic') }}
|
|
@@ -221,7 +221,7 @@ const { requestClose } = useUnsavedGuard({
|
|
|
221
221
|
over all five. -->
|
|
222
222
|
<p
|
|
223
223
|
v-if="warnings"
|
|
224
|
-
class="mb-3 text-xs text-
|
|
224
|
+
class="mb-3 text-xs text-app-warning-300"
|
|
225
225
|
data-testid="binary-candidates-warnings"
|
|
226
226
|
>
|
|
227
227
|
<span v-if="view.state.omitted">{{
|
|
@@ -236,7 +236,7 @@ const { requestClose } = useUnsavedGuard({
|
|
|
236
236
|
</p>
|
|
237
237
|
|
|
238
238
|
<div v-for="group in view.groups" :key="group.subject ?? '·'" class="mb-6">
|
|
239
|
-
<h3 class="mb-2 text-xs font-medium text-
|
|
239
|
+
<h3 class="mb-2 text-xs font-medium text-muted">
|
|
240
240
|
{{ group.subject ?? t('binaryCandidates.unlabelledSubject') }}
|
|
241
241
|
</h3>
|
|
242
242
|
<div class="grid grid-cols-1 gap-3 sm:grid-cols-2 lg:grid-cols-3">
|
|
@@ -246,8 +246,8 @@ const { requestClose } = useUnsavedGuard({
|
|
|
246
246
|
class="rounded border p-2 transition"
|
|
247
247
|
:class="[
|
|
248
248
|
selected.includes(row.id) || row.kept
|
|
249
|
-
? 'border-
|
|
250
|
-
: 'border-
|
|
249
|
+
? 'border-app-info-400/60 bg-app-info-500/5'
|
|
250
|
+
: 'border-muted/60',
|
|
251
251
|
view.awaiting ? 'cursor-pointer' : '',
|
|
252
252
|
]"
|
|
253
253
|
data-testid="binary-candidate-card"
|
|
@@ -268,13 +268,13 @@ const { requestClose } = useUnsavedGuard({
|
|
|
268
268
|
that is no longer selected. -->
|
|
269
269
|
<label
|
|
270
270
|
v-if="view.awaiting"
|
|
271
|
-
class="mb-1.5 flex cursor-pointer items-center gap-2 text-[11px] text-
|
|
271
|
+
class="mb-1.5 flex cursor-pointer items-center gap-2 text-[11px] text-muted"
|
|
272
272
|
@click.stop
|
|
273
273
|
>
|
|
274
274
|
<input
|
|
275
275
|
:type="view.multiSelect ? 'checkbox' : 'radio'"
|
|
276
276
|
name="binary-candidate"
|
|
277
|
-
class="accent-
|
|
277
|
+
class="accent-app-info-500"
|
|
278
278
|
:checked="selected.includes(row.id)"
|
|
279
279
|
:aria-label="candidateLabel(row)"
|
|
280
280
|
data-testid="binary-candidate-select"
|
|
@@ -304,22 +304,22 @@ const { requestClose } = useUnsavedGuard({
|
|
|
304
304
|
rather than left as an empty frame the reader reads as a failed generation. -->
|
|
305
305
|
<p
|
|
306
306
|
v-else
|
|
307
|
-
class="mb-2 flex h-24 items-center justify-center rounded bg-
|
|
307
|
+
class="mb-2 flex h-24 items-center justify-center rounded bg-elevated/60 px-2 text-center text-[10px] text-muted"
|
|
308
308
|
data-testid="binary-candidate-no-preview"
|
|
309
309
|
>
|
|
310
310
|
{{ t('binaryCandidates.noPreview') }}
|
|
311
311
|
</p>
|
|
312
|
-
<p class="text-xs text-
|
|
312
|
+
<p class="text-xs text-default">
|
|
313
313
|
{{
|
|
314
314
|
row.generator
|
|
315
315
|
? t('binaryCandidates.fromGenerator', { generator: row.generator })
|
|
316
316
|
: t('binaryCandidates.unattributed')
|
|
317
317
|
}}
|
|
318
318
|
</p>
|
|
319
|
-
<p v-if="row.note" class="mt-1 text-[11px] text-
|
|
320
|
-
<p class="mt-1 break-all text-[10px] text-
|
|
321
|
-
<p v-if="row.contentType" class="text-[10px] text-
|
|
322
|
-
<p v-if="row.kept" class="mt-1 text-[11px] text-
|
|
319
|
+
<p v-if="row.note" class="mt-1 text-[11px] text-muted">{{ row.note }}</p>
|
|
320
|
+
<p class="mt-1 break-all text-[10px] text-dimmed">{{ row.location }}</p>
|
|
321
|
+
<p v-if="row.contentType" class="text-[10px] text-dimmed">{{ row.contentType }}</p>
|
|
322
|
+
<p v-if="row.kept" class="mt-1 text-[11px] text-app-success-300">
|
|
323
323
|
{{
|
|
324
324
|
row.storeAs
|
|
325
325
|
? t('binaryCandidates.keptAs', { id: row.storeAs })
|
|
@@ -352,19 +352,21 @@ const { requestClose } = useUnsavedGuard({
|
|
|
352
352
|
/>
|
|
353
353
|
<p
|
|
354
354
|
v-if="missingAliases.length"
|
|
355
|
-
class="mt-1 text-[11px] text-
|
|
355
|
+
class="mt-1 text-[11px] text-app-warning-300"
|
|
356
356
|
data-testid="binary-candidates-missing-alias"
|
|
357
357
|
>
|
|
358
358
|
{{ t('binaryCandidates.missingAlias') }}
|
|
359
359
|
</p>
|
|
360
360
|
<p
|
|
361
361
|
v-else-if="duplicateAliases"
|
|
362
|
-
class="mt-1 text-[11px] text-
|
|
362
|
+
class="mt-1 text-[11px] text-app-warning-300"
|
|
363
363
|
data-testid="binary-candidates-duplicate-alias"
|
|
364
364
|
>
|
|
365
365
|
{{ t('binaryCandidates.duplicateAlias') }}
|
|
366
366
|
</p>
|
|
367
|
-
<p v-if="candidates.error" class="mt-1 text-[11px] text-
|
|
367
|
+
<p v-if="candidates.error" class="mt-1 text-[11px] text-app-error-300">
|
|
368
|
+
{{ candidates.error }}
|
|
369
|
+
</p>
|
|
368
370
|
<div class="mt-2 flex justify-end">
|
|
369
371
|
<UButton
|
|
370
372
|
size="xs"
|
|
@@ -388,28 +390,28 @@ const { requestClose } = useUnsavedGuard({
|
|
|
388
390
|
simply not fetched. -->
|
|
389
391
|
<div
|
|
390
392
|
v-else-if="absence === 'no_run'"
|
|
391
|
-
class="flex min-h-0 flex-1 flex-col items-center justify-center gap-2 px-5 py-10 text-center text-
|
|
393
|
+
class="flex min-h-0 flex-1 flex-col items-center justify-center gap-2 px-5 py-10 text-center text-muted"
|
|
392
394
|
data-testid="binary-candidates-no-run"
|
|
393
395
|
>
|
|
394
396
|
<UIcon name="i-lucide-unlink" class="h-8 w-8 opacity-40" />
|
|
395
397
|
<p class="text-sm">{{ t('binaryCandidates.noRun.title') }}</p>
|
|
396
|
-
<p class="max-w-md text-[11px] text-
|
|
398
|
+
<p class="max-w-md text-[11px] text-dimmed">{{ t('binaryCandidates.noRun.hint') }}</p>
|
|
397
399
|
</div>
|
|
398
400
|
<div
|
|
399
401
|
v-else-if="absence === 'loading'"
|
|
400
|
-
class="flex min-h-0 flex-1 flex-col items-center justify-center gap-2 px-5 py-10 text-center text-
|
|
402
|
+
class="flex min-h-0 flex-1 flex-col items-center justify-center gap-2 px-5 py-10 text-center text-muted"
|
|
401
403
|
data-testid="binary-candidates-loading"
|
|
402
404
|
>
|
|
403
405
|
<UIcon name="i-lucide-loader-circle" class="h-8 w-8 animate-spin opacity-60" />
|
|
404
406
|
</div>
|
|
405
407
|
<div
|
|
406
408
|
v-else-if="absence === 'load_failed'"
|
|
407
|
-
class="flex min-h-0 flex-1 flex-col items-center justify-center gap-2 px-5 py-10 text-center text-
|
|
409
|
+
class="flex min-h-0 flex-1 flex-col items-center justify-center gap-2 px-5 py-10 text-center text-muted"
|
|
408
410
|
data-testid="binary-candidates-load-error"
|
|
409
411
|
>
|
|
410
|
-
<UIcon name="i-lucide-triangle-alert" class="h-8 w-8 text-
|
|
412
|
+
<UIcon name="i-lucide-triangle-alert" class="h-8 w-8 text-app-warning-400/70" />
|
|
411
413
|
<p class="text-sm">{{ t('binaryCandidates.loadFailed') }}</p>
|
|
412
|
-
<p class="max-w-md break-words text-[11px] text-
|
|
414
|
+
<p class="max-w-md break-words text-[11px] text-dimmed">{{ candidates.error }}</p>
|
|
413
415
|
<UButton
|
|
414
416
|
size="xs"
|
|
415
417
|
color="neutral"
|
|
@@ -423,7 +425,7 @@ const { requestClose } = useUnsavedGuard({
|
|
|
423
425
|
</div>
|
|
424
426
|
<div
|
|
425
427
|
v-else
|
|
426
|
-
class="flex min-h-0 flex-1 flex-col items-center justify-center gap-2 px-5 py-10 text-center text-
|
|
428
|
+
class="flex min-h-0 flex-1 flex-col items-center justify-center gap-2 px-5 py-10 text-center text-muted"
|
|
427
429
|
data-testid="binary-candidates-empty"
|
|
428
430
|
>
|
|
429
431
|
<UIcon name="i-lucide-images" class="h-8 w-8 opacity-40" />
|
|
@@ -55,13 +55,13 @@ const state = computed(() => {
|
|
|
55
55
|
v-if="view"
|
|
56
56
|
class="space-y-3"
|
|
57
57
|
:class="
|
|
58
|
-
variant === 'card' ? 'scroll-mt-4 rounded-xl border border-
|
|
58
|
+
variant === 'card' ? 'scroll-mt-4 rounded-xl border border-default bg-default/50 p-4' : ''
|
|
59
59
|
"
|
|
60
60
|
data-testid="binary-output-report"
|
|
61
61
|
>
|
|
62
62
|
<div
|
|
63
63
|
v-if="variant === 'card'"
|
|
64
|
-
class="flex items-center gap-1.5 text-[11px] font-semibold uppercase tracking-wide text-
|
|
64
|
+
class="flex items-center gap-1.5 text-[11px] font-semibold uppercase tracking-wide text-muted"
|
|
65
65
|
>
|
|
66
66
|
<UIcon name="i-lucide-image" class="h-3.5 w-3.5" />
|
|
67
67
|
<span>{{ t('binaryOutput.heading') }}</span>
|
|
@@ -72,7 +72,7 @@ const state = computed(() => {
|
|
|
72
72
|
question the artifacts below cannot answer. An AUTOMATIC keep says so: nobody looked. -->
|
|
73
73
|
<p
|
|
74
74
|
v-if="candidates && candidates.state.candidates.length > 0"
|
|
75
|
-
class="text-[12px] leading-relaxed text-
|
|
75
|
+
class="text-[12px] leading-relaxed text-toned"
|
|
76
76
|
data-testid="binary-output-candidate-decision"
|
|
77
77
|
>
|
|
78
78
|
{{
|
|
@@ -107,28 +107,28 @@ const state = computed(() => {
|
|
|
107
107
|
records a declaration against a step that never held one), and rendering a blank
|
|
108
108
|
would read as a missing value rather than an absent comparison. -->
|
|
109
109
|
<dl class="grid grid-cols-[auto_1fr] gap-x-3 gap-y-1 text-[11px]">
|
|
110
|
-
<dt class="text-
|
|
110
|
+
<dt class="text-dimmed">{{ t('binaryOutput.target') }}</dt>
|
|
111
111
|
<dd
|
|
112
112
|
v-if="view.target"
|
|
113
|
-
class="min-w-0 font-mono text-
|
|
113
|
+
class="min-w-0 font-mono text-toned"
|
|
114
114
|
data-testid="binary-output-target"
|
|
115
115
|
>
|
|
116
116
|
{{ view.target }}
|
|
117
117
|
</dd>
|
|
118
|
-
<dd v-else class="min-w-0 text-
|
|
118
|
+
<dd v-else class="min-w-0 text-muted" data-testid="binary-output-target">
|
|
119
119
|
{{ t('binaryOutput.targetNone') }}
|
|
120
120
|
</dd>
|
|
121
121
|
<template v-if="view.contextServices.length">
|
|
122
|
-
<dt class="text-
|
|
123
|
-
<dd class="min-w-0 font-mono text-
|
|
122
|
+
<dt class="text-dimmed">{{ t('binaryOutput.contextServices') }}</dt>
|
|
123
|
+
<dd class="min-w-0 font-mono text-muted">{{ view.contextServices.join(', ') }}</dd>
|
|
124
124
|
</template>
|
|
125
125
|
<!-- The formats the step REQUIRED, beside where they were meant to go. Rendered whenever
|
|
126
126
|
the step stated any, including on a run that delivered them: the requirement is what
|
|
127
127
|
makes the content types below it readable, and a reader checking whether a mesh will
|
|
128
128
|
load needs to see what was asked for even when nothing went wrong. -->
|
|
129
129
|
<template v-if="view.mediaTypes.length">
|
|
130
|
-
<dt class="text-
|
|
131
|
-
<dd class="min-w-0 font-mono text-
|
|
130
|
+
<dt class="text-dimmed">{{ t('binaryOutput.mediaTypes') }}</dt>
|
|
131
|
+
<dd class="min-w-0 font-mono text-muted" data-testid="binary-output-media-types">
|
|
132
132
|
{{ view.mediaTypes.join(', ') }}
|
|
133
133
|
</dd>
|
|
134
134
|
</template>
|
|
@@ -147,7 +147,7 @@ const state = computed(() => {
|
|
|
147
147
|
<li
|
|
148
148
|
v-for="(row, i) in view.rows"
|
|
149
149
|
:key="`${row.service}:${row.location}:${i}`"
|
|
150
|
-
class="relative rounded-md border border-
|
|
150
|
+
class="relative rounded-md border border-default bg-app-950/40 px-2.5 py-2"
|
|
151
151
|
data-testid="binary-output-artifact"
|
|
152
152
|
>
|
|
153
153
|
<CopyButton :text="row.location" class="absolute end-1 top-1" />
|
|
@@ -158,10 +158,10 @@ const state = computed(() => {
|
|
|
158
158
|
:label="row.entity ?? row.description"
|
|
159
159
|
class="mb-2 pe-8"
|
|
160
160
|
/>
|
|
161
|
-
<code class="block break-all pe-8 font-mono text-[11px] text-
|
|
161
|
+
<code class="block break-all pe-8 font-mono text-[11px] text-default">{{
|
|
162
162
|
row.location
|
|
163
163
|
}}</code>
|
|
164
|
-
<div class="mt-1 flex flex-wrap items-center gap-x-2 gap-y-1 text-[10px] text-
|
|
164
|
+
<div class="mt-1 flex flex-wrap items-center gap-x-2 gap-y-1 text-[10px] text-dimmed">
|
|
165
165
|
<span class="font-mono">{{ row.service }}</span>
|
|
166
166
|
<!-- The join the report cannot make on its own, and the question a human opens this
|
|
167
167
|
for: did it go where the step pointed it? -->
|
|
@@ -225,7 +225,7 @@ const state = computed(() => {
|
|
|
225
225
|
{{ t('binaryOutput.missizedBadge') }}
|
|
226
226
|
</UBadge>
|
|
227
227
|
</div>
|
|
228
|
-
<p v-if="row.description" class="mt-1 text-[11px] leading-relaxed text-
|
|
228
|
+
<p v-if="row.description" class="mt-1 text-[11px] leading-relaxed text-muted">
|
|
229
229
|
{{ row.description }}
|
|
230
230
|
</p>
|
|
231
231
|
</li>
|
|
@@ -234,7 +234,7 @@ const state = computed(() => {
|
|
|
234
234
|
<!-- Every qualification the report counted, each naming its own number. Never folded into
|
|
235
235
|
one "some entries were dropped": the fix for an unknown service id is not the fix for
|
|
236
236
|
a malformed entry, and neither is the fix for a list that stops short of the tail. -->
|
|
237
|
-
<ul class="space-y-1 text-[11px] text-
|
|
237
|
+
<ul class="space-y-1 text-[11px] text-app-warning-400">
|
|
238
238
|
<!-- The step's OWN target went missing from the catalog, and an id the AGENT invented,
|
|
239
239
|
are two different failures with two different fixes (re-register it, versus correct
|
|
240
240
|
the declaration). `binaryOutputView` returns them as DISJOINT fields precisely so
|
|
@@ -89,7 +89,7 @@ const filename = computed(() => {
|
|
|
89
89
|
frame. -->
|
|
90
90
|
<p
|
|
91
91
|
v-else-if="!isImage && url"
|
|
92
|
-
class="flex items-center gap-1.5 rounded bg-
|
|
92
|
+
class="flex items-center gap-1.5 rounded bg-elevated/60 px-2 py-1.5 text-[11px] text-toned"
|
|
93
93
|
data-testid="stored-asset-file"
|
|
94
94
|
>
|
|
95
95
|
<UIcon name="i-lucide-file" class="h-3.5 w-3.5 shrink-0" />
|
|
@@ -97,7 +97,7 @@ const filename = computed(() => {
|
|
|
97
97
|
</p>
|
|
98
98
|
<p
|
|
99
99
|
v-else-if="status === 'error'"
|
|
100
|
-
class="flex items-center gap-1.5 text-[11px] text-
|
|
100
|
+
class="flex items-center gap-1.5 text-[11px] text-app-warning-300"
|
|
101
101
|
data-testid="stored-asset-error"
|
|
102
102
|
>
|
|
103
103
|
<span>{{ t('binaryOutput.asset.loadFailed') }}</span>
|
|
@@ -105,7 +105,7 @@ const filename = computed(() => {
|
|
|
105
105
|
{{ t('binaryOutput.asset.retry') }}
|
|
106
106
|
</UButton>
|
|
107
107
|
</p>
|
|
108
|
-
<p v-else class="text-[11px] text-
|
|
108
|
+
<p v-else class="text-[11px] text-dimmed" data-testid="stored-asset-loading">
|
|
109
109
|
{{ t('binaryOutput.asset.loading') }}
|
|
110
110
|
</p>
|
|
111
111
|
|
|
@@ -116,7 +116,7 @@ const filename = computed(() => {
|
|
|
116
116
|
:href="url"
|
|
117
117
|
target="_blank"
|
|
118
118
|
rel="noopener"
|
|
119
|
-
class="text-
|
|
119
|
+
class="text-app-info-300 hover:underline"
|
|
120
120
|
data-testid="stored-asset-open"
|
|
121
121
|
@click.stop
|
|
122
122
|
>{{ t('binaryOutput.asset.open') }}</a
|
|
@@ -124,7 +124,7 @@ const filename = computed(() => {
|
|
|
124
124
|
<a
|
|
125
125
|
:href="url"
|
|
126
126
|
:download="filename"
|
|
127
|
-
class="text-
|
|
127
|
+
class="text-app-info-300 hover:underline"
|
|
128
128
|
data-testid="stored-asset-download"
|
|
129
129
|
@click.stop
|
|
130
130
|
>{{ t('binaryOutput.asset.download') }}</a
|