@cat-factory/app 0.302.1 → 0.303.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +16 -0
- package/app/app.config.ts +19 -10
- package/app/assets/css/main.css +13 -13
- package/app/assets/css/prose.css +22 -22
- package/app/assets/css/tokens.css +298 -0
- package/app/components/assistant/AssistantModal.vue +22 -22
- package/app/components/auth/AuthGate.vue +1 -1
- package/app/components/auth/BackendMisconfiguredScreen.vue +10 -10
- package/app/components/auth/LoginScreen.vue +34 -36
- package/app/components/auth/ResetPasswordScreen.vue +12 -12
- package/app/components/auth/UserMenu.vue +4 -4
- package/app/components/binaryCandidates/BinaryCandidatesWindow.vue +27 -25
- package/app/components/binaryOutput/BinaryOutputReport.vue +15 -15
- package/app/components/binaryOutput/StoredAssetView.vue +5 -5
- package/app/components/board/AddTaskModal.vue +17 -20
- package/app/components/board/AgentFailureCard.vue +11 -11
- package/app/components/board/AgentFailureHistory.vue +2 -2
- package/app/components/board/BoardCanvas.vue +6 -5
- package/app/components/board/CreateInitiativeModal.vue +8 -10
- package/app/components/board/DependencyConnectOverlay.vue +1 -1
- package/app/components/board/FailureHistoryList.vue +7 -7
- package/app/components/board/RecurringPipelineModal.vue +17 -17
- package/app/components/board/ReviewFrictionDialog.vue +6 -6
- package/app/components/board/StepExecutionHistory.vue +13 -13
- package/app/components/board/TaskDependencyEdges.vue +8 -8
- package/app/components/board/nodes/AgentChip.vue +10 -10
- package/app/components/board/nodes/BlockNode.vue +29 -29
- package/app/components/board/nodes/DecisionBadge.vue +2 -2
- package/app/components/board/nodes/EpicNode.vue +14 -10
- package/app/components/board/nodes/FrameSwimlanes.vue +7 -9
- package/app/components/board/nodes/InitiativeCard.vue +8 -8
- package/app/components/board/nodes/LaneGroup.vue +1 -1
- package/app/components/board/nodes/LaneTask.vue +2 -2
- package/app/components/board/nodes/ResizeGrips.vue +4 -4
- package/app/components/board/nodes/TaskCard.vue +18 -18
- package/app/components/board/nodes/TaskLane.vue +5 -5
- package/app/components/board/nodes/TaskPipelineMini.vue +18 -18
- package/app/components/bootstrap/AdoptionReviewModal.vue +29 -26
- package/app/components/bootstrap/BootstrapModal.vue +21 -23
- package/app/components/bootstrap/BootstrapRunSteps.vue +1 -1
- package/app/components/brainstorm/BrainstormWindow.vue +30 -33
- package/app/components/bugFishing/BugFishingWindow.vue +49 -49
- package/app/components/clarity/ClarityReviewWindow.vue +30 -30
- package/app/components/common/AsyncViewError.vue +5 -5
- package/app/components/common/ClarificationItem.vue +8 -13
- package/app/components/common/ConfirmDialog.vue +4 -2
- package/app/components/common/DescriptorFields.vue +1 -1
- package/app/components/common/EmptyState.vue +3 -3
- package/app/components/common/InterviewGateNotice.vue +7 -7
- package/app/components/common/KeyboardShortcutsHelp.vue +1 -1
- package/app/components/common/MarkdownProse.vue +14 -13
- package/app/components/consensus/ConsensusSessionWindow.vue +26 -26
- package/app/components/context/ContextAttachmentFields.vue +17 -17
- package/app/components/docs/DocInterviewWindow.vue +14 -14
- package/app/components/documents/ContextDocumentPicker.vue +17 -17
- package/app/components/documents/DocumentImportModal.vue +7 -7
- package/app/components/documents/DocumentSourceConnectModal.vue +3 -3
- package/app/components/documents/DocumentSyncState.vue +5 -5
- package/app/components/documents/DocumentTemplatesModal.vue +15 -15
- package/app/components/documents/RepoContextDocPicker.vue +5 -5
- package/app/components/documents/SpawnPreviewModal.vue +12 -12
- package/app/components/documents/StartFromDesignModal.vue +11 -11
- package/app/components/documents/TaskContextDocs.vue +5 -5
- package/app/components/environments/EnvSetupStepper.vue +6 -6
- package/app/components/environments/EnvironmentStatusPanel.vue +17 -17
- package/app/components/environments/steps/EnvPickStep.vue +3 -3
- package/app/components/environments/steps/EnvPreflightStep.vue +9 -9
- package/app/components/environments/steps/EnvReviewStep.vue +25 -22
- package/app/components/environments/steps/EnvSaveStep.vue +7 -5
- package/app/components/environments/steps/JourneyStepNav.vue +1 -1
- package/app/components/focus/BlockFocusView.vue +17 -19
- package/app/components/followUp/FollowUpWindow.vue +23 -23
- package/app/components/forkDecision/ForkDecisionWindow.vue +37 -39
- package/app/components/foundational/FoundationalContractSummary.vue +7 -7
- package/app/components/foundational/FoundationalServiceCatalogList.vue +11 -11
- package/app/components/foundational/FoundationalServiceManager.vue +1 -1
- package/app/components/foundational/FoundationalServiceRegistry.vue +13 -13
- package/app/components/foundational/FoundationalServiceSources.vue +13 -13
- package/app/components/foundational/FoundationalSuppressions.vue +7 -7
- package/app/components/foundational/ServiceCatalogConnection.vue +10 -10
- package/app/components/fragments/FragmentLibraryManager.vue +41 -44
- package/app/components/fragments/FragmentSelector.vue +13 -13
- package/app/components/fragments/GitHubDocUrlImport.vue +1 -1
- package/app/components/gates/GateFailingCheckList.vue +5 -5
- package/app/components/gates/GateResultView.vue +50 -47
- package/app/components/github/AddServiceFromRepoModal.vue +14 -14
- package/app/components/github/BranchProtectionPreflight.vue +13 -13
- package/app/components/github/GitHubConnect.vue +7 -7
- package/app/components/github/GitHubOnboarding.vue +7 -7
- package/app/components/github/GitHubPanel.vue +37 -40
- package/app/components/github/RepoTreeBrowser.vue +18 -18
- package/app/components/humanTest/HumanTestWindow.vue +30 -33
- package/app/components/initiative/InitiativePlanNotice.vue +5 -5
- package/app/components/initiative/InitiativePlanReview.vue +27 -29
- package/app/components/initiative/InitiativePlanningWindow.vue +10 -10
- package/app/components/initiative/InitiativeTrackerWindow.vue +71 -65
- package/app/components/inputGate/InputGateNotice.vue +2 -4
- package/app/components/judge/JudgeResultView.vue +30 -32
- package/app/components/kaizen/KaizenPanel.vue +40 -36
- package/app/components/kaizen/KaizenStepStatus.vue +21 -21
- package/app/components/layout/AccountAuditLog.vue +10 -10
- package/app/components/layout/AccountDeploymentSettings.vue +20 -20
- package/app/components/layout/AccountFailureKindRules.vue +13 -13
- package/app/components/layout/AccountFoundationalSettings.vue +1 -1
- package/app/components/layout/AccountFragmentSettings.vue +1 -1
- package/app/components/layout/AccountModelPolicySettings.vue +9 -9
- package/app/components/layout/AccountPlatformAlertSettings.vue +11 -11
- package/app/components/layout/AccountRiskPolicySettings.vue +2 -2
- package/app/components/layout/AccountRunCredentialSettings.vue +5 -5
- package/app/components/layout/AccountSkillSettings.vue +1 -1
- package/app/components/layout/AccountTeamSettings.vue +23 -15
- package/app/components/layout/AiProvidersBanner.vue +11 -8
- package/app/components/layout/AppearanceSwitcher.vue +108 -0
- package/app/components/layout/BoardSwitcher.vue +8 -11
- package/app/components/layout/BoardToolbar.vue +3 -3
- package/app/components/layout/CommandBar.vue +7 -9
- package/app/components/layout/ConnectionStatusBanner.vue +2 -2
- package/app/components/layout/DefaultTestEnvBanner.vue +5 -5
- package/app/components/layout/GitHubPatBanner.vue +5 -5
- package/app/components/layout/GitHubPatPermissionsBanner.vue +16 -10
- package/app/components/layout/InfraSetupBanner.vue +6 -6
- package/app/components/layout/IntegrationsHub.vue +15 -15
- package/app/components/layout/LanguageSwitcher.vue +5 -5
- package/app/components/layout/ModelProvidersHub.vue +13 -16
- package/app/components/layout/NotificationsInbox.vue +10 -10
- package/app/components/layout/PersonalSetupModal.vue +8 -8
- package/app/components/layout/ProviderConfigBanner.vue +4 -4
- package/app/components/layout/RolePrompt.vue +7 -7
- package/app/components/layout/SideBar.vue +6 -4
- package/app/components/layout/SpendWarningBanner.vue +17 -14
- package/app/components/layout/TranslationWarningBanner.vue +4 -4
- package/app/components/layout/UiModeSwitcher.vue +13 -13
- package/app/components/layout/UiRoleSwitcher.vue +8 -8
- package/app/components/layout/WorkspaceMembersSettings.vue +15 -11
- package/app/components/media/ArtifactLightbox.vue +13 -13
- package/app/components/media/ImageCompare.vue +31 -24
- package/app/components/merge/MergeEffortChips.vue +2 -2
- package/app/components/notifications/NotificationSettingsPanel.vue +14 -12
- package/app/components/observability/OutcomeFilterChips.vue +6 -6
- package/app/components/observability/RunFailureSummary.vue +28 -25
- package/app/components/observability/StepMetricsBar.vue +26 -28
- package/app/components/observability/StepModelActivity.vue +2 -2
- package/app/components/observability/ToolCallList.vue +24 -24
- package/app/components/outcome/OutcomeSummaryWindow.vue +47 -47
- package/app/components/palettes/AgentPalette.vue +8 -8
- package/app/components/palettes/AgentTierSelect.vue +1 -1
- package/app/components/palettes/PipelinePurposeSelect.vue +1 -1
- package/app/components/panels/AgentStepDetail.vue +52 -51
- package/app/components/panels/AttemptEntryHeader.vue +4 -6
- package/app/components/panels/DecisionModal.vue +7 -7
- package/app/components/panels/GenericStructuredResultView.vue +7 -7
- package/app/components/panels/InspectorPanel.vue +17 -17
- package/app/components/panels/MergerResultView.vue +19 -19
- package/app/components/panels/ObservabilityPanel.vue +115 -123
- package/app/components/panels/OperatorDashboardPanel.vue +89 -97
- package/app/components/panels/ReportsPanel.vue +69 -66
- package/app/components/panels/ReportsSpendBreakdown.vue +9 -9
- package/app/components/panels/ResultWindowShell.vue +38 -38
- package/app/components/panels/RunDetailLoadState.vue +2 -2
- package/app/components/panels/StepContainerStatus.vue +9 -9
- package/app/components/panels/StepDelegatedStatus.logic.spec.ts +135 -0
- package/app/components/panels/StepDelegatedStatus.logic.ts +160 -0
- package/app/components/panels/StepDelegatedStatus.vue +181 -0
- package/app/components/panels/StepEffortReport.vue +16 -15
- package/app/components/panels/StepFragmentAdherence.vue +14 -10
- package/app/components/panels/StepMetadataCard.vue +74 -45
- package/app/components/panels/StepReproductionReport.vue +25 -21
- package/app/components/panels/StepRunMeta.vue +20 -20
- package/app/components/panels/StepTestReport.logic.spec.ts +8 -3
- package/app/components/panels/StepTestReport.logic.ts +4 -4
- package/app/components/panels/StepTestReport.vue +28 -28
- package/app/components/panels/StepToolServers.vue +14 -11
- package/app/components/panels/StepValidationReport.vue +7 -7
- package/app/components/panels/inspector/ContainerSummary.vue +9 -9
- package/app/components/panels/inspector/DocReferenceRepos.vue +3 -3
- package/app/components/panels/inspector/EnvProbeReport.vue +24 -27
- package/app/components/panels/inspector/EpicChildren.vue +8 -12
- package/app/components/panels/inspector/FrontendBindingsResolved.vue +11 -11
- package/app/components/panels/inspector/FrontendConfig.vue +37 -41
- package/app/components/panels/inspector/InitiativeInspector.vue +3 -3
- package/app/components/panels/inspector/InspectorSection.vue +6 -6
- package/app/components/panels/inspector/RecurringScheduleSettings.vue +16 -19
- package/app/components/panels/inspector/ServiceConnections.vue +2 -2
- package/app/components/panels/inspector/ServiceReleaseHealthConfig.vue +2 -2
- package/app/components/panels/inspector/ServiceSelfTests.vue +21 -17
- package/app/components/panels/inspector/ServiceTestConfig.vue +51 -59
- package/app/components/panels/inspector/ServiceTestSecrets.vue +5 -5
- package/app/components/panels/inspector/ServiceTestingContext.vue +3 -3
- package/app/components/panels/inspector/ServiceValidationConfig.vue +2 -2
- package/app/components/panels/inspector/TaskAgentConfig.vue +3 -3
- package/app/components/panels/inspector/TaskAprioriBranches.vue +8 -5
- package/app/components/panels/inspector/TaskDependencies.vue +1 -1
- package/app/components/panels/inspector/TaskEstimateBadge.vue +11 -11
- package/app/components/panels/inspector/TaskExecution.vue +17 -17
- package/app/components/panels/inspector/TaskReviewTarget.vue +2 -2
- package/app/components/panels/inspector/TaskRunSettings.vue +35 -37
- package/app/components/panels/inspector/TaskStructure.vue +3 -3
- package/app/components/pipeline/AgentKindIcon.vue +1 -1
- package/app/components/pipeline/AgentPromptEditor.vue +17 -17
- package/app/components/pipeline/BinaryOutputStepPicker.vue +42 -56
- package/app/components/pipeline/EstimateThresholdFields.vue +4 -4
- package/app/components/pipeline/GateConfigFields.vue +13 -10
- package/app/components/pipeline/IterationCapPrompt.vue +4 -2
- package/app/components/pipeline/PipelineBuilder.vue +47 -55
- package/app/components/pipeline/PipelineHealthModal.vue +27 -29
- package/app/components/pipeline/PipelinePicker.vue +10 -10
- package/app/components/pipeline/PipelinePreview.vue +10 -10
- package/app/components/pipeline/PipelineProgress.vue +64 -67
- package/app/components/prReview/PrReviewPhaseBadge.vue +7 -7
- package/app/components/prReview/PrReviewWindow.vue +75 -77
- package/app/components/providers/AiPresetMismatchDialog.vue +5 -5
- package/app/components/providers/AiProviderOnboardingModal.vue +9 -9
- package/app/components/providers/ApiKeysSection.vue +13 -13
- package/app/components/providers/PersonalCredentialModal.vue +2 -2
- package/app/components/providers/PersonalSubscriptionSection.vue +10 -10
- package/app/components/providers/SignInRequiredNotice.vue +1 -1
- package/app/components/providers/VendorCredentialsModal.vue +10 -10
- package/app/components/provisioning/ProvisioningLogsDrawer.vue +13 -13
- package/app/components/ralph/RalphLoopResultView.vue +28 -30
- package/app/components/recurring/RecurrenceEditor.vue +2 -2
- package/app/components/requirements/RequirementsReviewWindow.vue +51 -58
- package/app/components/riskPolicy/RiskPolicyPicker.vue +12 -15
- package/app/components/riskPolicy/RiskPolicyPreview.vue +14 -14
- package/app/components/sandbox/SandboxPanel.vue +58 -59
- package/app/components/settings/AccountSettingsPanel.vue +1 -1
- package/app/components/settings/ApiTokensPanel.vue +10 -10
- package/app/components/settings/BudgetSettings.vue +18 -22
- package/app/components/settings/CapabilityCredentialsPanel.vue +15 -15
- package/app/components/settings/CloudflareHandlerSection.vue +20 -20
- package/app/components/settings/ComposeEnvironmentSetupSection.vue +13 -13
- package/app/components/settings/ConnectionTestVerdict.vue +3 -3
- package/app/components/settings/ConnectionWarnings.vue +1 -1
- package/app/components/settings/ConsensusGroupsSection.vue +27 -35
- package/app/components/settings/CustomManifestTypeEditor.vue +10 -10
- package/app/components/settings/DefaultProvisionTypeSection.vue +6 -6
- package/app/components/settings/InfraHandlersConfigurator.vue +24 -22
- package/app/components/settings/InfrastructureBackendPicker.vue +6 -6
- package/app/components/settings/InfrastructureWindow.vue +5 -5
- package/app/components/settings/IssueTrackerPanel.vue +29 -23
- package/app/components/settings/KubernetesEngineForm.vue +11 -11
- package/app/components/settings/KubernetesEnvironmentForm.vue +4 -4
- package/app/components/settings/LocalContainerPoolSettings.vue +6 -11
- package/app/components/settings/LocalModelEndpointsPanel.vue +20 -18
- package/app/components/settings/McpAuthorizeScreen.vue +13 -15
- package/app/components/settings/McpOAuthCallbackScreen.vue +16 -10
- package/app/components/settings/MergeClassRulesEditor.vue +6 -9
- package/app/components/settings/MergeRolePolicyEditor.vue +16 -16
- package/app/components/settings/ModelConfigurationPanel.vue +23 -30
- package/app/components/settings/ModelPresetHealthModal.vue +15 -13
- package/app/components/settings/ObservabilityConnectionPanel.vue +4 -4
- package/app/components/settings/OpenRouterCatalogPanel.vue +23 -19
- package/app/components/settings/PackageRegistriesPanel.vue +8 -8
- package/app/components/settings/ProviderConnectionTab.vue +8 -11
- package/app/components/settings/ProviderManifestEditor.vue +9 -9
- package/app/components/settings/ProviderPreferenceEditor.vue +8 -8
- package/app/components/settings/RiskPolicyCreateForm.vue +10 -10
- package/app/components/settings/RiskPolicyEditorRow.vue +14 -14
- package/app/components/settings/RiskPolicyHealthModal.vue +15 -13
- package/app/components/settings/RiskPolicyInheritedRow.vue +1 -1
- package/app/components/settings/RiskPolicyPanel.vue +10 -15
- package/app/components/settings/ServiceFragmentDefaultsPanel.vue +7 -7
- package/app/components/settings/SharedStacksPanel.vue +9 -12
- package/app/components/settings/TaskSourceCard.vue +4 -4
- package/app/components/settings/TaskTypeSuppressionsPanel.vue +6 -6
- package/app/components/settings/ToolServerChecklist.vue +36 -29
- package/app/components/settings/UsageSettings.vue +15 -15
- package/app/components/settings/UserSecretsSection.vue +9 -12
- package/app/components/settings/WorkspaceMetadataSettings.vue +5 -5
- package/app/components/settings/WorkspaceSettingsPanel.vue +47 -47
- package/app/components/skills/ReviewSkillQueue.vue +10 -10
- package/app/components/skills/SkillLibraryManager.vue +23 -20
- package/app/components/slack/SlackPanel.vue +13 -17
- package/app/components/spec/ServiceSpecWindow.vue +45 -42
- package/app/components/tasks/BugHuntModal.vue +24 -27
- package/app/components/tasks/ContextIssuePicker.vue +11 -11
- package/app/components/tasks/TaskContextIssues.vue +3 -3
- package/app/components/tasks/TaskImportModal.vue +7 -7
- package/app/components/tasks/TaskSourceConnectModal.vue +10 -8
- package/app/components/testing/TestReportWindow.vue +99 -82
- package/app/components/theme/ThemeImportModal.vue +115 -0
- package/app/components/tutorial/TutorialCatalogue.vue +9 -9
- package/app/components/tutorial/TutorialNudge.vue +5 -5
- package/app/components/tutorial/TutorialOverlay.vue +12 -12
- package/app/components/tutorial/TutorialPrompt.vue +6 -9
- package/app/components/vcs/GitLabConnect.vue +4 -4
- package/app/components/vcs/VcsConnectSurfaces.vue +2 -2
- package/app/components/visualConfirm/VisualConfirmationWindow.vue +36 -36
- package/app/composables/api/client.ts +6 -1
- package/app/composables/usePipelineErrorToast.ts +17 -0
- package/app/modular/agent-kinds.ts +24 -0
- package/app/pages/index.vue +5 -5
- package/app/plugins/theme.client.ts +125 -0
- package/app/spa-loading-template.html +52 -14
- package/app/stores/agents.ts +1 -1
- package/app/stores/theme.spec.ts +56 -0
- package/app/stores/theme.ts +87 -0
- package/app/types/domain.ts +19 -0
- package/app/types/execution.ts +4 -0
- package/app/utils/agentOutput.ts +1 -1
- package/app/utils/binaryOutput.ts +6 -6
- package/app/utils/bootstrapSteps.ts +14 -14
- package/app/utils/catalog.ts +87 -83
- package/app/utils/colorTint.ts +10 -0
- package/app/utils/failureKinds.ts +1 -0
- package/app/utils/observability.ts +3 -3
- package/app/utils/pipelineRender.ts +13 -17
- package/app/utils/swimlanes.ts +4 -4
- package/app/utils/theme/bootPalette.spec.ts +54 -0
- package/app/utils/theme/bootPalette.ts +108 -0
- package/app/utils/theme/builtins.spec.ts +38 -0
- package/app/utils/theme/builtins.ts +55 -0
- package/app/utils/theme/css.ts +162 -0
- package/app/utils/theme/doc.ts +353 -0
- package/app/utils/theme/link.ts +93 -0
- package/app/utils/theme/presets.ts +509 -0
- package/app/utils/theme/theme.spec.ts +224 -0
- package/i18n/locales/de.json +61 -4
- package/i18n/locales/en.json +70 -4
- package/i18n/locales/es.json +61 -4
- package/i18n/locales/fr.json +61 -4
- package/i18n/locales/he.json +61 -4
- package/i18n/locales/it.json +61 -4
- package/i18n/locales/ja.json +61 -4
- package/i18n/locales/pl.json +61 -4
- package/i18n/locales/tr.json +61 -4
- package/i18n/locales/uk.json +61 -4
- package/nuxt.config.ts +37 -11
- package/package.json +10 -9
|
@@ -154,16 +154,16 @@ function reveal(blockId: string): void {
|
|
|
154
154
|
<UModal v-model:open="open" :title="t('assistant.title')" :ui="{ content: 'max-w-2xl' }">
|
|
155
155
|
<template #body>
|
|
156
156
|
<div class="space-y-4">
|
|
157
|
-
<p class="text-sm text-
|
|
157
|
+
<p class="text-sm text-muted">{{ t('assistant.intro') }}</p>
|
|
158
158
|
|
|
159
159
|
<!-- The read FAILED: this deployment may well have a model, and nobody can tell from here.
|
|
160
160
|
So it offers the read again instead of explaining a configuration that may be fine. -->
|
|
161
161
|
<div
|
|
162
162
|
v-if="surface === 'unreadable'"
|
|
163
|
-
class="flex items-start gap-2 rounded-md bg-
|
|
163
|
+
class="flex items-start gap-2 rounded-md bg-elevated/60 p-3 text-sm text-toned"
|
|
164
164
|
data-testid="assistant-unreadable"
|
|
165
165
|
>
|
|
166
|
-
<UIcon name="i-lucide-unplug" class="mt-0.5 h-4 w-4 shrink-0 text-
|
|
166
|
+
<UIcon name="i-lucide-unplug" class="mt-0.5 h-4 w-4 shrink-0 text-app-warning-400" />
|
|
167
167
|
<div class="space-y-2">
|
|
168
168
|
<p>{{ t('assistant.unreadable') }}</p>
|
|
169
169
|
<UButton
|
|
@@ -181,10 +181,10 @@ function reveal(blockId: string): void {
|
|
|
181
181
|
<!-- No model wired: say so, rather than offering a box whose every submit would 503. -->
|
|
182
182
|
<div
|
|
183
183
|
v-else-if="surface === 'unwired'"
|
|
184
|
-
class="flex items-start gap-2 rounded-md bg-
|
|
184
|
+
class="flex items-start gap-2 rounded-md bg-elevated/60 p-3 text-sm text-toned"
|
|
185
185
|
data-testid="assistant-unwired"
|
|
186
186
|
>
|
|
187
|
-
<UIcon name="i-lucide-plug" class="mt-0.5 h-4 w-4 shrink-0 text-
|
|
187
|
+
<UIcon name="i-lucide-plug" class="mt-0.5 h-4 w-4 shrink-0 text-dimmed" />
|
|
188
188
|
<span>{{ t('assistant.unavailable') }}</span>
|
|
189
189
|
</div>
|
|
190
190
|
|
|
@@ -192,10 +192,10 @@ function reveal(blockId: string): void {
|
|
|
192
192
|
and every submit against it would be refused with `assistant_no_actions`. -->
|
|
193
193
|
<div
|
|
194
194
|
v-else-if="surface === 'no_actions'"
|
|
195
|
-
class="flex items-start gap-2 rounded-md bg-
|
|
195
|
+
class="flex items-start gap-2 rounded-md bg-elevated/60 p-3 text-sm text-toned"
|
|
196
196
|
data-testid="assistant-no-actions"
|
|
197
197
|
>
|
|
198
|
-
<UIcon name="i-lucide-list-x" class="mt-0.5 h-4 w-4 shrink-0 text-
|
|
198
|
+
<UIcon name="i-lucide-list-x" class="mt-0.5 h-4 w-4 shrink-0 text-dimmed" />
|
|
199
199
|
<span>{{ t('assistant.noActions') }}</span>
|
|
200
200
|
</div>
|
|
201
201
|
|
|
@@ -240,7 +240,7 @@ function reveal(blockId: string): void {
|
|
|
240
240
|
role="status"
|
|
241
241
|
:aria-live="submitReason ? 'polite' : 'off'"
|
|
242
242
|
class="flex items-center gap-1 text-xs"
|
|
243
|
-
:class="submitReason ? 'text-
|
|
243
|
+
:class="submitReason ? 'text-app-warning-400' : 'text-dimmed'"
|
|
244
244
|
data-testid="assistant-submit-status"
|
|
245
245
|
>
|
|
246
246
|
<UIcon
|
|
@@ -254,7 +254,7 @@ function reveal(blockId: string): void {
|
|
|
254
254
|
|
|
255
255
|
<!-- What it can do, always visible: the catalog is the affordance. -->
|
|
256
256
|
<div v-if="examples.length" class="space-y-2">
|
|
257
|
-
<p class="text-xs font-medium uppercase tracking-wide text-
|
|
257
|
+
<p class="text-xs font-medium uppercase tracking-wide text-dimmed">
|
|
258
258
|
{{ t('assistant.examplesTitle') }}
|
|
259
259
|
</p>
|
|
260
260
|
<div class="flex flex-col gap-1">
|
|
@@ -262,11 +262,11 @@ function reveal(blockId: string): void {
|
|
|
262
262
|
v-for="entry in examples"
|
|
263
263
|
:key="entry.actionId"
|
|
264
264
|
type="button"
|
|
265
|
-
class="rounded-md px-2 py-1 text-left text-sm text-
|
|
265
|
+
class="rounded-md px-2 py-1 text-left text-sm text-toned hover:bg-elevated"
|
|
266
266
|
@click="useExample(entry.example)"
|
|
267
267
|
>
|
|
268
|
-
<span class="text-
|
|
269
|
-
<span class="block text-xs text-
|
|
268
|
+
<span class="text-muted">{{ entry.label }}</span>
|
|
269
|
+
<span class="block text-xs text-dimmed">“{{ entry.example }}”</span>
|
|
270
270
|
</button>
|
|
271
271
|
</div>
|
|
272
272
|
</div>
|
|
@@ -274,12 +274,12 @@ function reveal(blockId: string): void {
|
|
|
274
274
|
<!-- The outcome. Rendered from the turn's data; no model prose reaches this. -->
|
|
275
275
|
<div
|
|
276
276
|
v-if="outcome"
|
|
277
|
-
class="rounded-md border border-
|
|
277
|
+
class="rounded-md border border-muted p-3 text-sm"
|
|
278
278
|
data-testid="assistant-outcome"
|
|
279
279
|
>
|
|
280
280
|
<template v-if="outcome.status === 'performed'">
|
|
281
|
-
<div class="flex items-start gap-2 text-
|
|
282
|
-
<UIcon name="i-lucide-check" class="mt-0.5 h-4 w-4 shrink-0 text-
|
|
281
|
+
<div class="flex items-start gap-2 text-default">
|
|
282
|
+
<UIcon name="i-lucide-check" class="mt-0.5 h-4 w-4 shrink-0 text-app-success-400" />
|
|
283
283
|
<div class="space-y-2">
|
|
284
284
|
<p v-if="outcome.result.actionId === 'declare-service-dependency'">
|
|
285
285
|
{{
|
|
@@ -329,8 +329,11 @@ function reveal(blockId: string): void {
|
|
|
329
329
|
</template>
|
|
330
330
|
|
|
331
331
|
<template v-else-if="outcome.status === 'needs_input'">
|
|
332
|
-
<div class="flex items-start gap-2 text-
|
|
333
|
-
<UIcon
|
|
332
|
+
<div class="flex items-start gap-2 text-default">
|
|
333
|
+
<UIcon
|
|
334
|
+
name="i-lucide-help-circle"
|
|
335
|
+
class="mt-0.5 h-4 w-4 shrink-0 text-app-warning-400"
|
|
336
|
+
/>
|
|
334
337
|
<div class="space-y-2">
|
|
335
338
|
<p>{{ t(`assistant.needsInput.${outcome.reason}`) }}</p>
|
|
336
339
|
<div v-if="outcome.candidates.length" class="flex flex-wrap gap-1">
|
|
@@ -351,11 +354,8 @@ function reveal(blockId: string): void {
|
|
|
351
354
|
</template>
|
|
352
355
|
|
|
353
356
|
<template v-else>
|
|
354
|
-
<div class="flex items-start gap-2 text-
|
|
355
|
-
<UIcon
|
|
356
|
-
name="i-lucide-circle-slash"
|
|
357
|
-
class="mt-0.5 h-4 w-4 shrink-0 text-slate-500"
|
|
358
|
-
/>
|
|
357
|
+
<div class="flex items-start gap-2 text-default">
|
|
358
|
+
<UIcon name="i-lucide-circle-slash" class="mt-0.5 h-4 w-4 shrink-0 text-dimmed" />
|
|
359
359
|
<p>{{ t('assistant.declined') }}</p>
|
|
360
360
|
</div>
|
|
361
361
|
</template>
|
|
@@ -22,7 +22,7 @@ onMounted(() => void auth.bootstrap().finally(() => markBoot('auth-ready')))
|
|
|
22
22
|
<template>
|
|
23
23
|
<div
|
|
24
24
|
v-if="!auth.ready"
|
|
25
|
-
class="flex h-screen w-screen flex-col items-center justify-center gap-3 bg-
|
|
25
|
+
class="flex h-screen w-screen flex-col items-center justify-center gap-3 bg-app-950 text-muted"
|
|
26
26
|
>
|
|
27
27
|
<UIcon name="i-lucide-loader" class="h-8 w-8 animate-spin" />
|
|
28
28
|
<span class="text-sm">{{ t('auth.gate.loading') }}</span>
|
|
@@ -18,13 +18,13 @@ function reload() {
|
|
|
18
18
|
|
|
19
19
|
<template>
|
|
20
20
|
<div
|
|
21
|
-
class="flex h-screen w-screen flex-col items-center justify-center bg-
|
|
21
|
+
class="flex h-screen w-screen flex-col items-center justify-center bg-app-950 p-6 text-default"
|
|
22
22
|
>
|
|
23
23
|
<div class="w-full max-w-2xl">
|
|
24
24
|
<div class="mb-6 text-center">
|
|
25
|
-
<UIcon name="i-lucide-server-cog" class="mx-auto mb-3 h-10 w-10 text-
|
|
25
|
+
<UIcon name="i-lucide-server-cog" class="mx-auto mb-3 h-10 w-10 text-app-warning-400" />
|
|
26
26
|
<h1 class="text-lg font-semibold">{{ t('app.misconfigured.title') }}</h1>
|
|
27
|
-
<p class="mx-auto mt-2 max-w-lg text-sm text-
|
|
27
|
+
<p class="mx-auto mt-2 max-w-lg text-sm text-muted">
|
|
28
28
|
{{ t('app.misconfigured.intro') }}
|
|
29
29
|
</p>
|
|
30
30
|
</div>
|
|
@@ -33,12 +33,12 @@ function reload() {
|
|
|
33
33
|
<li
|
|
34
34
|
v-for="problem in problems"
|
|
35
35
|
:key="problem.key"
|
|
36
|
-
class="rounded-lg border border-
|
|
36
|
+
class="rounded-lg border border-default bg-default/60 p-4"
|
|
37
37
|
>
|
|
38
|
-
<code class="text-sm font-semibold text-
|
|
39
|
-
<p class="mt-1 text-sm text-
|
|
40
|
-
<p class="mt-2 text-sm text-
|
|
41
|
-
<span class="font-medium text-
|
|
38
|
+
<code class="text-sm font-semibold text-app-warning-300">{{ problem.key }}</code>
|
|
39
|
+
<p class="mt-1 text-sm text-toned">{{ problem.summary }}</p>
|
|
40
|
+
<p class="mt-2 text-sm text-muted">
|
|
41
|
+
<span class="font-medium text-toned">{{ t('app.misconfigured.howToFix') }}</span>
|
|
42
42
|
{{ problem.remedy }}
|
|
43
43
|
</p>
|
|
44
44
|
<a
|
|
@@ -46,7 +46,7 @@ function reload() {
|
|
|
46
46
|
:href="problem.docsUrl"
|
|
47
47
|
target="_blank"
|
|
48
48
|
rel="noopener noreferrer"
|
|
49
|
-
class="mt-2 inline-flex items-center gap-1 text-sm text-
|
|
49
|
+
class="mt-2 inline-flex items-center gap-1 text-sm text-app-warning-300 hover:text-app-warning-200"
|
|
50
50
|
>
|
|
51
51
|
<UIcon name="i-lucide-book-open" class="h-4 w-4" />
|
|
52
52
|
{{ t('app.misconfigured.viewDocs') }}
|
|
@@ -59,7 +59,7 @@ function reload() {
|
|
|
59
59
|
{{ t('app.misconfigured.reload') }}
|
|
60
60
|
</UButton>
|
|
61
61
|
</div>
|
|
62
|
-
<p class="mt-4 text-center text-xs text-
|
|
62
|
+
<p class="mt-4 text-center text-xs text-dimmed">{{ t('app.misconfigured.hint') }}</p>
|
|
63
63
|
</div>
|
|
64
64
|
</div>
|
|
65
65
|
</template>
|
|
@@ -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" />
|