@cat-factory/app 0.308.0 → 0.309.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +21 -0
- package/app/assets/css/main.css +22 -0
- package/app/assets/css/prose.css +4 -4
- package/app/assets/css/type.css +24 -0
- package/app/components/assistant/AssistantModal.vue +3 -2
- package/app/components/auth/UserMenu.vue +1 -1
- package/app/components/binaryCandidates/BinaryCandidatesWindow.vue +15 -15
- package/app/components/binaryOutput/BinaryOutputReport.vue +10 -14
- package/app/components/binaryOutput/StoredAssetView.vue +5 -5
- package/app/components/board/AddTaskModal.vue +16 -14
- package/app/components/board/AgentFailureCard.vue +9 -9
- package/app/components/board/AgentFailureHistory.vue +1 -1
- package/app/components/board/CreateInitiativeModal.vue +2 -2
- package/app/components/board/FailureDetail.vue +1 -1
- package/app/components/board/FailureHistoryList.vue +5 -5
- package/app/components/board/RecurringPipelineModal.vue +12 -11
- package/app/components/board/ReviewFrictionDialog.vue +4 -3
- package/app/components/board/StepExecutionHistory.vue +8 -8
- package/app/components/board/nodes/AgentChip.vue +1 -1
- package/app/components/board/nodes/BlockNode.vue +8 -9
- package/app/components/board/nodes/EpicNode.vue +4 -4
- package/app/components/board/nodes/FrameSwimlanes.vue +4 -7
- package/app/components/board/nodes/InitiativeCard.vue +4 -4
- package/app/components/board/nodes/LaneGroup.vue +3 -5
- package/app/components/board/nodes/TaskCard.vue +8 -8
- package/app/components/board/nodes/TaskLane.vue +3 -3
- package/app/components/board/nodes/TaskPipelineMini.vue +13 -12
- package/app/components/bootstrap/AdoptionReviewModal.vue +7 -6
- package/app/components/bootstrap/BootstrapModal.vue +11 -10
- package/app/components/bootstrap/BootstrapRunSteps.vue +1 -1
- package/app/components/brainstorm/BrainstormWindow.vue +8 -7
- package/app/components/bugFishing/BugFishingWindow.vue +37 -36
- package/app/components/clarity/ClarityReviewWindow.vue +8 -7
- package/app/components/common/AsyncViewError.vue +1 -1
- package/app/components/common/ClarificationItem.vue +6 -6
- package/app/components/common/DescriptorFields.vue +1 -1
- package/app/components/common/EmptyState.vue +1 -1
- package/app/components/common/InterviewGateNotice.vue +4 -4
- package/app/components/common/MarkdownProse.vue +8 -2
- package/app/components/common/SectionLabel.vue +38 -0
- package/app/components/consensus/ConsensusSessionWindow.vue +10 -9
- package/app/components/context/ContextAttachmentFields.vue +9 -8
- package/app/components/docs/DocInterviewWindow.vue +10 -9
- package/app/components/documents/ContextDocumentPicker.vue +10 -12
- package/app/components/documents/DocumentImportModal.vue +3 -2
- package/app/components/documents/DocumentSourceConnectModal.vue +2 -2
- package/app/components/documents/DocumentSyncState.vue +1 -1
- package/app/components/documents/DocumentTemplatesModal.vue +5 -4
- package/app/components/documents/RepoContextDocPicker.vue +3 -6
- package/app/components/documents/StartFromDesignModal.vue +4 -4
- package/app/components/documents/TaskContextDocs.vue +1 -1
- package/app/components/environments/EnvSetupStepper.vue +3 -3
- package/app/components/environments/EnvironmentStatusPanel.vue +11 -10
- package/app/components/environments/steps/EnvPreflightStep.vue +8 -8
- package/app/components/environments/steps/EnvReviewStep.vue +23 -22
- package/app/components/environments/steps/EnvSaveStep.vue +5 -5
- package/app/components/focus/BlockFocusView.vue +11 -10
- package/app/components/followUp/FollowUpWindow.vue +10 -10
- package/app/components/forkDecision/ForkDecisionWindow.vue +23 -26
- package/app/components/foundational/FoundationalContractSummary.vue +2 -2
- package/app/components/foundational/FoundationalServiceCatalogList.vue +3 -3
- package/app/components/foundational/FoundationalServiceRegistry.vue +3 -3
- package/app/components/foundational/FoundationalSuppressions.vue +2 -2
- package/app/components/fragments/FragmentLibraryManager.vue +3 -3
- package/app/components/fragments/FragmentSelector.vue +10 -11
- package/app/components/gates/GateFailingCheckList.vue +3 -3
- package/app/components/gates/GateResultView.vue +39 -38
- package/app/components/github/AddServiceFromRepoModal.vue +5 -4
- package/app/components/github/BranchProtectionPreflight.vue +5 -5
- package/app/components/github/GitHubConnect.vue +5 -3
- package/app/components/github/GitHubPanel.vue +14 -13
- package/app/components/github/RepoTreeBrowser.vue +1 -1
- package/app/components/humanTest/HumanTestWindow.vue +18 -17
- package/app/components/initiative/InitiativePlanNotice.vue +3 -3
- package/app/components/initiative/InitiativePlanReview.vue +19 -21
- package/app/components/initiative/InitiativePlanningWindow.vue +5 -5
- package/app/components/initiative/InitiativeTrackerWindow.vue +54 -53
- package/app/components/judge/JudgeResultView.vue +24 -25
- package/app/components/kaizen/KaizenPanel.vue +4 -4
- package/app/components/kaizen/KaizenStepStatus.vue +7 -6
- package/app/components/layout/AccountAuditLog.vue +1 -1
- package/app/components/layout/AccountDeploymentSettings.vue +10 -10
- package/app/components/layout/AccountFailureKindRules.vue +13 -13
- package/app/components/layout/AccountFoundationalSettings.vue +1 -1
- package/app/components/layout/AccountFragmentSettings.vue +1 -1
- package/app/components/layout/AccountModelPolicySettings.vue +7 -7
- package/app/components/layout/AccountPlatformAlertSettings.vue +8 -8
- package/app/components/layout/AccountRiskPolicySettings.vue +2 -2
- package/app/components/layout/AccountRunCredentialSettings.vue +3 -3
- package/app/components/layout/AccountSkillSettings.vue +1 -1
- package/app/components/layout/AccountTeamSettings.vue +4 -0
- package/app/components/layout/AiProvidersBanner.vue +1 -1
- package/app/components/layout/AppearanceSwitcher.vue +1 -1
- package/app/components/layout/BoardSwitcher.vue +3 -2
- package/app/components/layout/BoardToolbar.vue +6 -2
- package/app/components/layout/CommandBar.vue +4 -2
- package/app/components/layout/DefaultTestEnvBanner.vue +2 -2
- package/app/components/layout/IntegrationsHub.vue +4 -3
- package/app/components/layout/LanguageSwitcher.vue +1 -1
- package/app/components/layout/ModelProvidersHub.vue +6 -4
- package/app/components/layout/NotificationsInbox.vue +8 -7
- package/app/components/layout/PersonalSetupModal.vue +5 -3
- package/app/components/layout/RolePrompt.vue +1 -1
- package/app/components/layout/SideBar.vue +3 -5
- package/app/components/layout/SpendWarningBanner.vue +3 -3
- package/app/components/layout/TranslationWarningBanner.vue +1 -1
- package/app/components/layout/UiModeSwitcher.vue +7 -6
- package/app/components/layout/UiRoleSwitcher.vue +2 -2
- package/app/components/media/ArtifactLightbox.vue +6 -6
- package/app/components/media/ImageCompare.vue +16 -16
- package/app/components/merge/MergeEffortChips.vue +4 -6
- package/app/components/notifications/NotificationSettingsPanel.vue +6 -5
- package/app/components/observability/OutcomeFilterChips.vue +1 -1
- package/app/components/observability/RunFailureSummary.vue +14 -17
- package/app/components/observability/StepMetricsBar.vue +9 -8
- package/app/components/observability/StepModelActivity.vue +4 -3
- package/app/components/observability/ToolCallList.vue +15 -18
- package/app/components/outcome/OutcomeSummaryWindow.vue +43 -42
- package/app/components/palettes/AgentPalette.vue +7 -5
- package/app/components/palettes/AgentTierSelect.vue +1 -1
- package/app/components/palettes/PipelinePurposeSelect.vue +1 -1
- package/app/components/panels/AgentStepDetail.vue +27 -30
- package/app/components/panels/AttemptEntryHeader.vue +2 -2
- package/app/components/panels/DecisionModal.vue +1 -1
- package/app/components/panels/GenericStructuredResultView.vue +6 -5
- package/app/components/panels/InspectorPanel.vue +15 -13
- package/app/components/panels/MergerResultView.vue +10 -9
- package/app/components/panels/ObservabilityPanel.vue +66 -76
- package/app/components/panels/OperatorDashboardPanel.vue +27 -26
- package/app/components/panels/ReportsPanel.vue +26 -25
- package/app/components/panels/ReportsSpendBreakdown.vue +2 -2
- package/app/components/panels/ResultWindowShell.vue +19 -18
- package/app/components/panels/RunDetailLoadState.vue +1 -1
- package/app/components/panels/StepContainerStatus.vue +8 -7
- package/app/components/panels/StepDelegatedStatus.vue +13 -12
- package/app/components/panels/StepEffortReport.vue +12 -17
- package/app/components/panels/StepFragmentAdherence.vue +9 -10
- package/app/components/panels/StepMetadataCard.vue +41 -43
- package/app/components/panels/StepReproductionReport.vue +18 -20
- package/app/components/panels/StepRunMeta.vue +27 -26
- package/app/components/panels/StepTestReport.vue +16 -15
- package/app/components/panels/StepToolServers.vue +7 -8
- package/app/components/panels/StepValidationReport.vue +5 -5
- package/app/components/panels/inspector/ContainerSummary.vue +4 -4
- package/app/components/panels/inspector/DocReferenceRepos.vue +5 -4
- package/app/components/panels/inspector/EnvProbeReport.vue +16 -13
- package/app/components/panels/inspector/EpicChildren.vue +8 -7
- package/app/components/panels/inspector/FrontendBindingsResolved.vue +5 -4
- package/app/components/panels/inspector/FrontendConfig.vue +26 -34
- package/app/components/panels/inspector/InitiativeInspector.vue +3 -3
- package/app/components/panels/inspector/InspectorSection.vue +7 -4
- package/app/components/panels/inspector/RecurringScheduleSettings.vue +9 -8
- package/app/components/panels/inspector/ServiceConnections.vue +2 -2
- package/app/components/panels/inspector/ServiceReleaseHealthConfig.vue +2 -2
- package/app/components/panels/inspector/ServiceSelfTests.vue +9 -13
- package/app/components/panels/inspector/ServiceTestConfig.vue +41 -45
- package/app/components/panels/inspector/ServiceTestSecrets.vue +3 -3
- package/app/components/panels/inspector/ServiceTestingContext.vue +2 -2
- package/app/components/panels/inspector/ServiceValidationConfig.vue +2 -2
- package/app/components/panels/inspector/TaskAgentConfig.vue +2 -2
- package/app/components/panels/inspector/TaskAprioriBranches.vue +6 -5
- package/app/components/panels/inspector/TaskDependencies.vue +1 -1
- package/app/components/panels/inspector/TaskEstimateBadge.vue +3 -7
- package/app/components/panels/inspector/TaskExecution.vue +13 -12
- package/app/components/panels/inspector/TaskRunSettings.vue +35 -38
- package/app/components/panels/inspector/TaskStructure.vue +5 -4
- package/app/components/pipeline/AgentPromptEditor.vue +15 -14
- package/app/components/pipeline/BinaryOutputStepPicker.vue +42 -52
- package/app/components/pipeline/EstimateThresholdFields.vue +2 -2
- package/app/components/pipeline/GateConfigFields.vue +6 -6
- package/app/components/pipeline/IterationCapPrompt.vue +1 -1
- package/app/components/pipeline/PipelineBuilder.vue +28 -27
- package/app/components/pipeline/PipelineHealthModal.vue +7 -7
- package/app/components/pipeline/PipelinePicker.vue +3 -3
- package/app/components/pipeline/PipelinePreview.vue +6 -7
- package/app/components/pipeline/PipelineProgress.vue +23 -24
- package/app/components/prReview/PrReviewWindow.vue +42 -41
- package/app/components/providers/AiPresetMismatchDialog.vue +4 -3
- package/app/components/providers/AiProviderOnboardingModal.vue +2 -2
- package/app/components/providers/ApiKeysSection.vue +7 -6
- package/app/components/providers/PersonalSubscriptionSection.vue +4 -3
- package/app/components/providers/VendorCredentialsModal.vue +5 -4
- package/app/components/provisioning/ProvisioningLogsDrawer.vue +10 -9
- package/app/components/ralph/RalphLoopResultView.vue +25 -26
- package/app/components/requirements/RequirementsReviewWindow.vue +13 -12
- package/app/components/riskPolicy/RiskPolicyPicker.vue +5 -5
- package/app/components/riskPolicy/RiskPolicyPreview.vue +16 -15
- package/app/components/sandbox/SandboxPanel.vue +21 -20
- package/app/components/settings/ApiTokensPanel.vue +1 -1
- package/app/components/settings/BudgetSettings.vue +18 -17
- package/app/components/settings/CapabilityCredentialsPanel.vue +5 -5
- package/app/components/settings/CloudflareHandlerSection.vue +16 -16
- package/app/components/settings/ComposeEnvironmentSetupSection.vue +14 -12
- package/app/components/settings/ConnectionTestVerdict.vue +1 -1
- package/app/components/settings/ConsensusGroupsSection.vue +21 -20
- package/app/components/settings/CustomManifestTypeEditor.vue +8 -7
- package/app/components/settings/DefaultProvisionTypeSection.vue +5 -5
- package/app/components/settings/InfraHandlersConfigurator.vue +14 -15
- package/app/components/settings/InfrastructureBackendPicker.vue +2 -2
- package/app/components/settings/IssueTrackerPanel.vue +9 -15
- package/app/components/settings/KubernetesEngineForm.vue +9 -8
- package/app/components/settings/KubernetesEnvironmentForm.vue +4 -3
- package/app/components/settings/LocalContainerPoolSettings.vue +2 -2
- package/app/components/settings/LocalModelEndpointsPanel.vue +10 -9
- package/app/components/settings/MergeClassRulesEditor.vue +6 -5
- package/app/components/settings/MergeRolePolicyEditor.vue +13 -12
- package/app/components/settings/ModelConfigurationPanel.vue +8 -11
- package/app/components/settings/ModelPresetHealthModal.vue +3 -3
- package/app/components/settings/ObservabilityConnectionPanel.vue +1 -1
- package/app/components/settings/OpenRouterCatalogPanel.vue +6 -5
- package/app/components/settings/PackageRegistriesPanel.vue +4 -4
- package/app/components/settings/ProviderConnectionTab.vue +5 -4
- package/app/components/settings/ProviderManifestEditor.vue +9 -8
- package/app/components/settings/ProviderPreferenceEditor.vue +8 -7
- package/app/components/settings/RiskPolicyCreateForm.vue +40 -26
- package/app/components/settings/RiskPolicyEditorRow.vue +18 -17
- package/app/components/settings/RiskPolicyHealthModal.vue +3 -3
- package/app/components/settings/RiskPolicyPanel.vue +11 -13
- package/app/components/settings/ServiceFragmentDefaultsPanel.vue +5 -4
- package/app/components/settings/SharedStacksPanel.vue +5 -5
- package/app/components/settings/TaskSourceCard.vue +2 -2
- package/app/components/settings/TaskTypeSuppressionsPanel.vue +4 -4
- package/app/components/settings/ToolServerChecklist.vue +22 -22
- package/app/components/settings/UsageSettings.vue +13 -13
- package/app/components/settings/UserSecretsSection.vue +4 -3
- package/app/components/settings/WorkspaceMetadataSettings.vue +6 -5
- package/app/components/settings/WorkspaceSettingsPanel.vue +72 -58
- package/app/components/skills/ReviewSkillQueue.vue +8 -7
- package/app/components/skills/SkillLibraryManager.vue +2 -2
- package/app/components/slack/SlackPanel.vue +8 -7
- package/app/components/spec/ServiceSpecWindow.vue +15 -16
- package/app/components/tasks/BugHuntModal.vue +1 -1
- package/app/components/tasks/ContextIssuePicker.vue +4 -6
- package/app/components/tasks/TaskContextIssues.vue +1 -1
- package/app/components/tasks/TaskImportModal.vue +3 -2
- package/app/components/tasks/TaskSourceConnectModal.vue +5 -5
- package/app/components/testing/TestReportWindow.vue +54 -53
- package/app/components/tutorial/TutorialNudge.vue +3 -2
- package/app/components/tutorial/TutorialOverlay.vue +3 -2
- package/app/components/vcs/GitLabConnect.vue +1 -1
- package/app/components/visualConfirm/VisualConfirmationWindow.vue +23 -25
- package/app/utils/theme/builtins.ts +7 -1
- package/package.json +1 -1
|
@@ -22,6 +22,7 @@ import type { ProviderConnectionKind } from '~/types/providerConnections'
|
|
|
22
22
|
import ConnectionWarnings from '~/components/settings/ConnectionWarnings.vue'
|
|
23
23
|
import ConnectionTestVerdict from '~/components/settings/ConnectionTestVerdict.vue'
|
|
24
24
|
import SecretInput from '~/components/common/SecretInput.vue'
|
|
25
|
+
import SectionLabel from '~/components/common/SectionLabel.vue'
|
|
25
26
|
|
|
26
27
|
const props = defineProps<{
|
|
27
28
|
kind: ProviderConnectionKind
|
|
@@ -197,9 +198,9 @@ function onSave() {
|
|
|
197
198
|
|
|
198
199
|
<template>
|
|
199
200
|
<div class="space-y-3 rounded-lg border border-dashed border-muted p-3">
|
|
200
|
-
<
|
|
201
|
+
<SectionLabel as="p">
|
|
201
202
|
{{ t('settings.providerConnection.manifestEditor.title') }}
|
|
202
|
-
</
|
|
203
|
+
</SectionLabel>
|
|
203
204
|
|
|
204
205
|
<UFormField
|
|
205
206
|
:label="t('settings.providerConnection.manifestEditor.jsonLabel')"
|
|
@@ -214,7 +215,7 @@ function onSave() {
|
|
|
214
215
|
/>
|
|
215
216
|
</UFormField>
|
|
216
217
|
|
|
217
|
-
<p v-if="!savedManifest && !jsonError && !schemaError" class="text-
|
|
218
|
+
<p v-if="!savedManifest && !jsonError && !schemaError" class="text-2xs text-dimmed">
|
|
218
219
|
{{ t('settings.providerConnection.manifestEditor.starterHint') }}
|
|
219
220
|
</p>
|
|
220
221
|
|
|
@@ -236,16 +237,16 @@ function onSave() {
|
|
|
236
237
|
|
|
237
238
|
<!-- Secret sub-form: one write-only input per secret key the manifest references. -->
|
|
238
239
|
<div class="space-y-2">
|
|
239
|
-
<
|
|
240
|
+
<SectionLabel as="p">
|
|
240
241
|
{{ t('settings.providerConnection.manifestEditor.secretsLabel') }}
|
|
241
|
-
</
|
|
242
|
-
<p v-if="!secretKeys.length" class="text-
|
|
242
|
+
</SectionLabel>
|
|
243
|
+
<p v-if="!secretKeys.length" class="text-2xs text-dimmed">
|
|
243
244
|
{{ t('settings.providerConnection.manifestEditor.noSecrets') }}
|
|
244
245
|
</p>
|
|
245
246
|
<template v-else-if="connected">
|
|
246
247
|
<p
|
|
247
248
|
v-if="storedSecretKeys && storedSecretKeys.length"
|
|
248
|
-
class="text-
|
|
249
|
+
class="text-2xs text-muted"
|
|
249
250
|
data-testid="manifest-editor-stored"
|
|
250
251
|
>
|
|
251
252
|
{{
|
|
@@ -254,7 +255,7 @@ function onSave() {
|
|
|
254
255
|
})
|
|
255
256
|
}}
|
|
256
257
|
</p>
|
|
257
|
-
<p class="text-
|
|
258
|
+
<p class="text-2xs text-app-warning-300/80">
|
|
258
259
|
{{ t('settings.providerConnection.manifestEditor.reenterSecrets') }}
|
|
259
260
|
</p>
|
|
260
261
|
</template>
|
|
@@ -26,6 +26,7 @@ import {
|
|
|
26
26
|
moveFlavor,
|
|
27
27
|
subscriptionOverridesOrder,
|
|
28
28
|
} from '~/components/settings/ProviderPreferenceEditor.logic'
|
|
29
|
+
import SectionLabel from '~/components/common/SectionLabel.vue'
|
|
29
30
|
|
|
30
31
|
const props = defineProps<{
|
|
31
32
|
/** The preset's stored order; empty/absent ⇒ the deployment's default order. */
|
|
@@ -90,9 +91,9 @@ function reset() {
|
|
|
90
91
|
<template>
|
|
91
92
|
<div>
|
|
92
93
|
<div class="mb-1 flex items-start justify-between gap-3">
|
|
93
|
-
<
|
|
94
|
+
<SectionLabel as="span">
|
|
94
95
|
{{ t('settings.modelConfiguration.routeOrder.label') }}
|
|
95
|
-
</
|
|
96
|
+
</SectionLabel>
|
|
96
97
|
<UButton
|
|
97
98
|
v-if="isCustom"
|
|
98
99
|
size="xs"
|
|
@@ -105,7 +106,7 @@ function reset() {
|
|
|
105
106
|
{{ t('settings.modelConfiguration.routeOrder.reset') }}
|
|
106
107
|
</UButton>
|
|
107
108
|
</div>
|
|
108
|
-
<p class="mb-2 text-
|
|
109
|
+
<p class="mb-2 text-2xs leading-relaxed text-dimmed">
|
|
109
110
|
{{
|
|
110
111
|
isCustom
|
|
111
112
|
? t('settings.modelConfiguration.routeOrder.customHint')
|
|
@@ -118,7 +119,7 @@ function reset() {
|
|
|
118
119
|
route a connected plan quietly overrules is the one thing this control must not do. -->
|
|
119
120
|
<p
|
|
120
121
|
v-if="subscriptionWins"
|
|
121
|
-
class="mb-2 text-
|
|
122
|
+
class="mb-2 text-2xs leading-relaxed text-app-warning-400/90"
|
|
122
123
|
data-testid="preset-route-order-subscription-warning"
|
|
123
124
|
>
|
|
124
125
|
{{ t('settings.modelConfiguration.routeOrder.subscriptionOverrideHint') }}
|
|
@@ -128,7 +129,7 @@ function reset() {
|
|
|
128
129
|
answering a different question than this order asks. -->
|
|
129
130
|
<p
|
|
130
131
|
v-if="badgesShowAnotherOrder"
|
|
131
|
-
class="mb-2 text-
|
|
132
|
+
class="mb-2 text-2xs leading-relaxed text-dimmed"
|
|
132
133
|
data-testid="preset-route-order-badge-hint"
|
|
133
134
|
>
|
|
134
135
|
{{ t('settings.modelConfiguration.routeOrder.badgesUseDefaultPresetHint') }}
|
|
@@ -144,13 +145,13 @@ function reset() {
|
|
|
144
145
|
:data-testid="`preset-route-${flavor}`"
|
|
145
146
|
>
|
|
146
147
|
<span
|
|
147
|
-
class="flex h-5 w-5 shrink-0 items-center justify-center rounded bg-elevated text-
|
|
148
|
+
class="flex h-5 w-5 shrink-0 items-center justify-center rounded-sm bg-elevated text-3xs font-semibold text-muted"
|
|
148
149
|
>
|
|
149
150
|
{{ index + 1 }}
|
|
150
151
|
</span>
|
|
151
152
|
<div class="min-w-0 flex-1">
|
|
152
153
|
<p class="truncate text-sm text-default">{{ t(ROUTE_LABELS[flavor]) }}</p>
|
|
153
|
-
<p class="truncate text-
|
|
154
|
+
<p class="truncate text-2xs text-dimmed">{{ t(ROUTE_HINTS[flavor]) }}</p>
|
|
154
155
|
</div>
|
|
155
156
|
<div class="flex shrink-0 items-center gap-1">
|
|
156
157
|
<UButton
|
|
@@ -10,6 +10,7 @@ import {
|
|
|
10
10
|
blankRiskPolicyDraft,
|
|
11
11
|
forkGatingFromDraft,
|
|
12
12
|
} from '~/utils/riskPolicyDraft'
|
|
13
|
+
import SectionLabel from '~/components/common/SectionLabel.vue'
|
|
13
14
|
|
|
14
15
|
const props = defineProps<{ busy: boolean }>()
|
|
15
16
|
|
|
@@ -56,14 +57,14 @@ function submit() {
|
|
|
56
57
|
|
|
57
58
|
<template>
|
|
58
59
|
<div class="rounded-lg border border-dashed border-muted p-3">
|
|
59
|
-
<p class="mb-2
|
|
60
|
+
<SectionLabel as="p" class="mb-2">
|
|
60
61
|
{{ t('settings.riskPolicy.newPreset') }}
|
|
61
|
-
</
|
|
62
|
+
</SectionLabel>
|
|
62
63
|
<div class="flex flex-wrap items-end gap-3">
|
|
63
64
|
<label class="block min-w-40 flex-1">
|
|
64
|
-
<span class="mb-1 block
|
|
65
|
+
<SectionLabel as="span" class="mb-1 block">
|
|
65
66
|
{{ t('settings.riskPolicy.create.name') }}
|
|
66
|
-
</
|
|
67
|
+
</SectionLabel>
|
|
67
68
|
<UInput
|
|
68
69
|
v-model="draft.name"
|
|
69
70
|
size="sm"
|
|
@@ -71,11 +72,12 @@ function submit() {
|
|
|
71
72
|
data-testid="risk-policy-create-name"
|
|
72
73
|
/>
|
|
73
74
|
</label>
|
|
74
|
-
<label class="block
|
|
75
|
-
<span class="mb-1 block
|
|
75
|
+
<label class="block">
|
|
76
|
+
<SectionLabel as="span" class="mb-1 block">
|
|
76
77
|
{{ t('settings.riskPolicy.create.complexity') }}
|
|
77
|
-
</
|
|
78
|
+
</SectionLabel>
|
|
78
79
|
<UInput
|
|
80
|
+
class="w-20"
|
|
79
81
|
v-model.number="draft.maxComplexity"
|
|
80
82
|
type="number"
|
|
81
83
|
:min="0"
|
|
@@ -84,11 +86,12 @@ function submit() {
|
|
|
84
86
|
data-testid="risk-policy-create-complexity"
|
|
85
87
|
/>
|
|
86
88
|
</label>
|
|
87
|
-
<label class="block
|
|
88
|
-
<span class="mb-1 block
|
|
89
|
+
<label class="block">
|
|
90
|
+
<SectionLabel as="span" class="mb-1 block">
|
|
89
91
|
{{ t('settings.riskPolicy.create.risk') }}
|
|
90
|
-
</
|
|
92
|
+
</SectionLabel>
|
|
91
93
|
<UInput
|
|
94
|
+
class="w-20"
|
|
92
95
|
v-model.number="draft.maxRisk"
|
|
93
96
|
type="number"
|
|
94
97
|
:min="0"
|
|
@@ -97,11 +100,12 @@ function submit() {
|
|
|
97
100
|
data-testid="risk-policy-create-risk"
|
|
98
101
|
/>
|
|
99
102
|
</label>
|
|
100
|
-
<label class="block
|
|
101
|
-
<span class="mb-1 block
|
|
103
|
+
<label class="block">
|
|
104
|
+
<SectionLabel as="span" class="mb-1 block">
|
|
102
105
|
{{ t('settings.riskPolicy.create.impact') }}
|
|
103
|
-
</
|
|
106
|
+
</SectionLabel>
|
|
104
107
|
<UInput
|
|
108
|
+
class="w-20"
|
|
105
109
|
v-model.number="draft.maxImpact"
|
|
106
110
|
type="number"
|
|
107
111
|
:min="0"
|
|
@@ -110,17 +114,25 @@ function submit() {
|
|
|
110
114
|
data-testid="risk-policy-create-impact"
|
|
111
115
|
/>
|
|
112
116
|
</label>
|
|
113
|
-
<label class="block
|
|
114
|
-
<span class="mb-1 block
|
|
117
|
+
<label class="block">
|
|
118
|
+
<SectionLabel as="span" class="mb-1 block">
|
|
115
119
|
{{ t('settings.riskPolicy.create.ciFix') }}
|
|
116
|
-
</
|
|
117
|
-
<UInput
|
|
120
|
+
</SectionLabel>
|
|
121
|
+
<UInput
|
|
122
|
+
class="w-20"
|
|
123
|
+
v-model.number="draft.ciMaxAttempts"
|
|
124
|
+
type="number"
|
|
125
|
+
:min="0"
|
|
126
|
+
:max="50"
|
|
127
|
+
size="sm"
|
|
128
|
+
/>
|
|
118
129
|
</label>
|
|
119
|
-
<label class="block
|
|
120
|
-
<span class="mb-1 block
|
|
130
|
+
<label class="block">
|
|
131
|
+
<SectionLabel as="span" class="mb-1 block">
|
|
121
132
|
{{ t('settings.riskPolicy.create.reqIter') }}
|
|
122
|
-
</
|
|
133
|
+
</SectionLabel>
|
|
123
134
|
<UInput
|
|
135
|
+
class="w-20"
|
|
124
136
|
v-model.number="draft.maxRequirementIterations"
|
|
125
137
|
type="number"
|
|
126
138
|
:min="1"
|
|
@@ -128,11 +140,12 @@ function submit() {
|
|
|
128
140
|
size="sm"
|
|
129
141
|
/>
|
|
130
142
|
</label>
|
|
131
|
-
<label class="block
|
|
132
|
-
<span class="mb-1 block
|
|
143
|
+
<label class="block">
|
|
144
|
+
<SectionLabel as="span" class="mb-1 block">
|
|
133
145
|
{{ t('settings.riskPolicy.create.companionRework') }}
|
|
134
|
-
</
|
|
146
|
+
</SectionLabel>
|
|
135
147
|
<UInput
|
|
148
|
+
class="w-20"
|
|
136
149
|
v-model.number="draft.companionMaxReworks"
|
|
137
150
|
type="number"
|
|
138
151
|
:min="0"
|
|
@@ -140,11 +153,12 @@ function submit() {
|
|
|
140
153
|
size="sm"
|
|
141
154
|
/>
|
|
142
155
|
</label>
|
|
143
|
-
<label class="block
|
|
144
|
-
<span class="mb-1 block
|
|
156
|
+
<label class="block">
|
|
157
|
+
<SectionLabel as="span" class="mb-1 block">
|
|
145
158
|
{{ t('settings.riskPolicy.create.autoPass') }}
|
|
146
|
-
</
|
|
159
|
+
</SectionLabel>
|
|
147
160
|
<USelect
|
|
161
|
+
class="w-32"
|
|
148
162
|
v-model="draft.maxRequirementConcernAllowed"
|
|
149
163
|
:items="concernOptions"
|
|
150
164
|
value-key="value"
|
|
@@ -23,6 +23,7 @@ import {
|
|
|
23
23
|
import { RISK_POLICY_AXES, RISK_POLICY_CEILING_FIELD } from '~/utils/riskPolicy'
|
|
24
24
|
import MergeClassRulesEditor from '~/components/settings/MergeClassRulesEditor.vue'
|
|
25
25
|
import MergeRolePolicyEditor from '~/components/settings/MergeRolePolicyEditor.vue'
|
|
26
|
+
import SectionLabel from '~/components/common/SectionLabel.vue'
|
|
26
27
|
|
|
27
28
|
const props = defineProps<{
|
|
28
29
|
policy: RiskPolicyLibraryEntry
|
|
@@ -156,9 +157,9 @@ const deleteBlocked = computed(
|
|
|
156
157
|
|
|
157
158
|
<div class="grid grid-cols-1 gap-3 sm:grid-cols-4">
|
|
158
159
|
<label v-for="axis in RISK_POLICY_AXES" :key="axis" class="block">
|
|
159
|
-
<span class="mb-1 block
|
|
160
|
+
<SectionLabel as="span" class="mb-1 block">
|
|
160
161
|
{{ t(CEILING_LABEL_KEYS[axis]) }}
|
|
161
|
-
</
|
|
162
|
+
</SectionLabel>
|
|
162
163
|
<UInput
|
|
163
164
|
v-model.number="draft[RISK_POLICY_CEILING_FIELD[axis]]"
|
|
164
165
|
type="number"
|
|
@@ -168,15 +169,15 @@ const deleteBlocked = computed(
|
|
|
168
169
|
/>
|
|
169
170
|
</label>
|
|
170
171
|
<label class="block">
|
|
171
|
-
<span class="mb-1 block
|
|
172
|
+
<SectionLabel as="span" class="mb-1 block">
|
|
172
173
|
{{ t('settings.riskPolicy.field.ciMaxAttempts') }}
|
|
173
|
-
</
|
|
174
|
+
</SectionLabel>
|
|
174
175
|
<UInput v-model.number="draft.ciMaxAttempts" type="number" :min="0" :max="50" size="sm" />
|
|
175
176
|
</label>
|
|
176
177
|
<label class="block">
|
|
177
|
-
<span class="mb-1 block
|
|
178
|
+
<SectionLabel as="span" class="mb-1 block">
|
|
178
179
|
{{ t('settings.riskPolicy.field.maxRequirementIterations') }}
|
|
179
|
-
</
|
|
180
|
+
</SectionLabel>
|
|
180
181
|
<UInput
|
|
181
182
|
v-model.number="draft.maxRequirementIterations"
|
|
182
183
|
type="number"
|
|
@@ -186,9 +187,9 @@ const deleteBlocked = computed(
|
|
|
186
187
|
/>
|
|
187
188
|
</label>
|
|
188
189
|
<label class="block">
|
|
189
|
-
<span class="mb-1 block
|
|
190
|
+
<SectionLabel as="span" class="mb-1 block">
|
|
190
191
|
{{ t('settings.riskPolicy.field.companionMaxReworks') }}
|
|
191
|
-
</
|
|
192
|
+
</SectionLabel>
|
|
192
193
|
<UInput
|
|
193
194
|
v-model.number="draft.companionMaxReworks"
|
|
194
195
|
type="number"
|
|
@@ -198,9 +199,9 @@ const deleteBlocked = computed(
|
|
|
198
199
|
/>
|
|
199
200
|
</label>
|
|
200
201
|
<label class="block">
|
|
201
|
-
<span class="mb-1 block
|
|
202
|
+
<SectionLabel as="span" class="mb-1 block">
|
|
202
203
|
{{ t('settings.riskPolicy.field.maxRequirementConcernAllowed') }}
|
|
203
|
-
</
|
|
204
|
+
</SectionLabel>
|
|
204
205
|
<USelect
|
|
205
206
|
v-model="draft.maxRequirementConcernAllowed"
|
|
206
207
|
:items="concernOptions"
|
|
@@ -245,9 +246,9 @@ const deleteBlocked = computed(
|
|
|
245
246
|
/>
|
|
246
247
|
<div v-if="draft.forkEnabled" class="mt-3 grid grid-cols-1 gap-3 sm:grid-cols-4">
|
|
247
248
|
<label v-for="axis in RISK_POLICY_AXES" :key="axis" class="block">
|
|
248
|
-
<span class="mb-1 block
|
|
249
|
+
<SectionLabel as="span" class="mb-1 block">
|
|
249
250
|
{{ t(FORK_FLOOR_LABEL_KEYS[axis]) }}
|
|
250
|
-
</
|
|
251
|
+
</SectionLabel>
|
|
251
252
|
<UInput
|
|
252
253
|
v-model.number="draft[FORK_FLOOR_FIELD[axis]]"
|
|
253
254
|
type="number"
|
|
@@ -257,9 +258,9 @@ const deleteBlocked = computed(
|
|
|
257
258
|
/>
|
|
258
259
|
</label>
|
|
259
260
|
<label class="block">
|
|
260
|
-
<span class="mb-1 block
|
|
261
|
+
<SectionLabel as="span" class="mb-1 block">
|
|
261
262
|
{{ t('settings.riskPolicy.forkDecision.onMissingLabel') }}
|
|
262
|
-
</
|
|
263
|
+
</SectionLabel>
|
|
263
264
|
<USelect v-model="draft.forkOnMissing" :items="onMissingOptions" size="sm" />
|
|
264
265
|
</label>
|
|
265
266
|
</div>
|
|
@@ -283,9 +284,9 @@ const deleteBlocked = computed(
|
|
|
283
284
|
on an attended policy would be a control over a decision this policy never makes. It is
|
|
284
285
|
not hidden as an "advanced override" — it is inert, which is a different thing. -->
|
|
285
286
|
<label v-if="draft.unattended" class="mt-3 block">
|
|
286
|
-
<span class="mb-1 block
|
|
287
|
+
<SectionLabel as="span" class="mb-1 block">
|
|
287
288
|
{{ t('settings.riskPolicy.autoAnswer.label') }}
|
|
288
|
-
</
|
|
289
|
+
</SectionLabel>
|
|
289
290
|
<UInput
|
|
290
291
|
v-model.number="draft.minAutoAnswerConfidence"
|
|
291
292
|
type="number"
|
|
@@ -294,7 +295,7 @@ const deleteBlocked = computed(
|
|
|
294
295
|
size="sm"
|
|
295
296
|
data-testid="risk-policy-auto-answer-floor"
|
|
296
297
|
/>
|
|
297
|
-
<span class="mt-1 block text-
|
|
298
|
+
<span class="mt-1 block text-2xs text-dimmed">
|
|
298
299
|
{{ t('settings.riskPolicy.autoAnswer.hint') }}
|
|
299
300
|
</span>
|
|
300
301
|
</label>
|
|
@@ -64,7 +64,7 @@ const reseedableCount = computed(
|
|
|
64
64
|
{{ t('riskPolicy.health.newHeading') }}
|
|
65
65
|
</h3>
|
|
66
66
|
</div>
|
|
67
|
-
<p class="text-
|
|
67
|
+
<p class="text-2xs text-dimmed">{{ t('riskPolicy.health.newDescription') }}</p>
|
|
68
68
|
<ul class="space-y-2">
|
|
69
69
|
<li
|
|
70
70
|
v-for="i in newPresets"
|
|
@@ -99,7 +99,7 @@ const reseedableCount = computed(
|
|
|
99
99
|
{{ t('riskPolicy.health.updatesHeading') }}
|
|
100
100
|
</h3>
|
|
101
101
|
</div>
|
|
102
|
-
<p class="text-
|
|
102
|
+
<p class="text-2xs text-dimmed">
|
|
103
103
|
{{ t('riskPolicy.health.updatesDescription') }}
|
|
104
104
|
</p>
|
|
105
105
|
<ul class="space-y-2">
|
|
@@ -110,7 +110,7 @@ const reseedableCount = computed(
|
|
|
110
110
|
>
|
|
111
111
|
<div class="min-w-0">
|
|
112
112
|
<span class="truncate text-sm font-medium text-app-100">{{ i.name }}</span>
|
|
113
|
-
<p class="text-
|
|
113
|
+
<p class="text-2xs text-app-warning-400/80">
|
|
114
114
|
{{
|
|
115
115
|
t('riskPolicy.health.versionAvailable', {
|
|
116
116
|
from: i.fromVersion ?? 0,
|
|
@@ -13,6 +13,7 @@ import { riskPolicyCopyName } from '~/utils/riskPolicy'
|
|
|
13
13
|
import RiskPolicyCreateForm from '~/components/settings/RiskPolicyCreateForm.vue'
|
|
14
14
|
import RiskPolicyEditorRow from '~/components/settings/RiskPolicyEditorRow.vue'
|
|
15
15
|
import RiskPolicyInheritedRow from '~/components/settings/RiskPolicyInheritedRow.vue'
|
|
16
|
+
import SectionLabel from '~/components/common/SectionLabel.vue'
|
|
16
17
|
|
|
17
18
|
const { t } = useI18n()
|
|
18
19
|
|
|
@@ -179,10 +180,10 @@ function unhide(presetId: string) {
|
|
|
179
180
|
<!-- Inherited FIRST: they are the org's posture, and a board reading its own list wants to see
|
|
180
181
|
what it is working from before what it has changed. -->
|
|
181
182
|
<section v-if="inherited.length > 0" class="space-y-2">
|
|
182
|
-
<
|
|
183
|
+
<SectionLabel as="p">
|
|
183
184
|
{{ t('settings.riskPolicy.inherited.heading') }}
|
|
184
|
-
</
|
|
185
|
-
<p class="text-
|
|
185
|
+
</SectionLabel>
|
|
186
|
+
<p class="text-2xs text-dimmed">{{ t('settings.riskPolicy.inherited.hint') }}</p>
|
|
186
187
|
<RiskPolicyInheritedRow
|
|
187
188
|
v-for="policy in inherited"
|
|
188
189
|
:key="policy.id"
|
|
@@ -194,12 +195,9 @@ function unhide(presetId: string) {
|
|
|
194
195
|
</section>
|
|
195
196
|
|
|
196
197
|
<section class="space-y-4">
|
|
197
|
-
<p
|
|
198
|
-
v-if="inherited.length > 0"
|
|
199
|
-
class="text-[11px] font-semibold uppercase tracking-wide text-muted"
|
|
200
|
-
>
|
|
198
|
+
<SectionLabel v-if="inherited.length > 0" as="p">
|
|
201
199
|
{{ t('settings.riskPolicy.own.heading') }}
|
|
202
|
-
</
|
|
200
|
+
</SectionLabel>
|
|
203
201
|
<RiskPolicyEditorRow
|
|
204
202
|
v-for="policy in own"
|
|
205
203
|
:key="policy.id"
|
|
@@ -217,10 +215,10 @@ function unhide(presetId: string) {
|
|
|
217
215
|
whether it still shadows an account policy: one whose policy the account has since withdrawn
|
|
218
216
|
withholds nothing, and reading it as a live opt-out would misstate what the board is doing. -->
|
|
219
217
|
<section v-if="store.suppressions.length > 0 || suppressionsFailed" class="space-y-2">
|
|
220
|
-
<
|
|
218
|
+
<SectionLabel as="p">
|
|
221
219
|
{{ t('settings.riskPolicy.hidden.heading') }}
|
|
222
|
-
</
|
|
223
|
-
<p v-if="suppressionsFailed" class="text-
|
|
220
|
+
</SectionLabel>
|
|
221
|
+
<p v-if="suppressionsFailed" class="text-2xs text-app-warning-400">
|
|
224
222
|
{{ t('settings.riskPolicy.hidden.loadFailed') }}
|
|
225
223
|
</p>
|
|
226
224
|
<div
|
|
@@ -230,8 +228,8 @@ function unhide(presetId: string) {
|
|
|
230
228
|
data-testid="risk-policy-hidden-row"
|
|
231
229
|
:data-policy-id="entry.id"
|
|
232
230
|
>
|
|
233
|
-
<span class="flex-1 truncate text-
|
|
234
|
-
<span v-if="!entry.inherited" class="text-
|
|
231
|
+
<span class="flex-1 truncate text-xs text-toned">{{ entry.name }}</span>
|
|
232
|
+
<span v-if="!entry.inherited" class="text-2xs text-dimmed">
|
|
235
233
|
{{ t('settings.riskPolicy.hidden.withdrawn') }}
|
|
236
234
|
</span>
|
|
237
235
|
<UButton
|
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
// serviceFragmentDefaults store (the backend replaces the whole list on each change).
|
|
8
8
|
import { onMounted, ref } from 'vue'
|
|
9
9
|
import { buildFragmentPickerGroups } from '~/utils/fragmentPicker'
|
|
10
|
+
import SectionLabel from '~/components/common/SectionLabel.vue'
|
|
10
11
|
|
|
11
12
|
const { t } = useI18n()
|
|
12
13
|
const fragments = useFragmentsStore()
|
|
@@ -59,9 +60,9 @@ function remove(id: string) {
|
|
|
59
60
|
</p>
|
|
60
61
|
|
|
61
62
|
<div class="flex items-center justify-between">
|
|
62
|
-
<
|
|
63
|
+
<SectionLabel as="span">
|
|
63
64
|
{{ t('settings.serviceFragmentDefaults.defaultFragments') }}
|
|
64
|
-
</
|
|
65
|
+
</SectionLabel>
|
|
65
66
|
<UDropdownMenu v-if="menu.length" :items="menu" :ui="{ content: 'max-h-72 overflow-y-auto' }">
|
|
66
67
|
<UButton
|
|
67
68
|
size="xs"
|
|
@@ -90,11 +91,11 @@ function remove(id: string) {
|
|
|
90
91
|
{{ f.title }}<UIcon name="i-lucide-x" class="ms-0.5 h-3 w-3" />
|
|
91
92
|
</UBadge>
|
|
92
93
|
</div>
|
|
93
|
-
<p v-else class="text-
|
|
94
|
+
<p v-else class="text-2xs text-dimmed">
|
|
94
95
|
{{ t('settings.serviceFragmentDefaults.empty') }}
|
|
95
96
|
</p>
|
|
96
97
|
|
|
97
|
-
<div class="flex flex-wrap gap-x-4 gap-y-1 border-t border-default pt-3 text-
|
|
98
|
+
<div class="flex flex-wrap gap-x-4 gap-y-1 border-t border-default pt-3 text-2xs">
|
|
98
99
|
<span class="text-dimmed">
|
|
99
100
|
{{ t('settings.serviceFragmentDefaults.footer.question') }}
|
|
100
101
|
</span>
|
|
@@ -288,7 +288,7 @@ async function remove(stack: SharedStack) {
|
|
|
288
288
|
{{ statusLabel(stack.status) }}
|
|
289
289
|
</UBadge>
|
|
290
290
|
</div>
|
|
291
|
-
<p class="truncate text-
|
|
291
|
+
<p class="truncate text-2xs text-dimmed">{{ stack.cloneUrl }}</p>
|
|
292
292
|
<div v-if="stack.managedNetworks.length" class="flex flex-wrap gap-1">
|
|
293
293
|
<UBadge
|
|
294
294
|
v-for="net in stack.managedNetworks"
|
|
@@ -347,7 +347,7 @@ async function remove(stack: SharedStack) {
|
|
|
347
347
|
/>
|
|
348
348
|
</div>
|
|
349
349
|
</div>
|
|
350
|
-
<p v-if="stack.lastError" class="text-
|
|
350
|
+
<p v-if="stack.lastError" class="text-2xs text-app-error-400">{{ stack.lastError }}</p>
|
|
351
351
|
</div>
|
|
352
352
|
</section>
|
|
353
353
|
|
|
@@ -407,12 +407,12 @@ async function remove(stack: SharedStack) {
|
|
|
407
407
|
>
|
|
408
408
|
{{ t('settings.sharedStacks.detect.button') }}
|
|
409
409
|
</UButton>
|
|
410
|
-
<span class="text-
|
|
410
|
+
<span class="text-2xs text-dimmed">{{ t('settings.sharedStacks.detect.hint') }}</span>
|
|
411
411
|
</div>
|
|
412
412
|
|
|
413
413
|
<p
|
|
414
414
|
v-if="detectedEnvFiles.length"
|
|
415
|
-
class="text-
|
|
415
|
+
class="text-2xs text-dimmed"
|
|
416
416
|
data-testid="shared-stack-env-files"
|
|
417
417
|
>
|
|
418
418
|
{{ t('settings.sharedStacks.detect.envFiles') }}
|
|
@@ -428,7 +428,7 @@ async function remove(stack: SharedStack) {
|
|
|
428
428
|
<li
|
|
429
429
|
v-for="(label, index) in layerLabels"
|
|
430
430
|
:key="index"
|
|
431
|
-
class="font-mono text-
|
|
431
|
+
class="font-mono text-2xs text-dimmed"
|
|
432
432
|
>
|
|
433
433
|
{{ label }}
|
|
434
434
|
</li>
|
|
@@ -95,7 +95,7 @@ const STATUS_UI: Record<
|
|
|
95
95
|
<UIcon :name="state.icon" class="h-5 w-5 shrink-0 text-toned" />
|
|
96
96
|
<div class="min-w-0">
|
|
97
97
|
<div class="text-sm font-medium text-default">{{ state.label }}</div>
|
|
98
|
-
<div class="text-
|
|
98
|
+
<div class="text-2xs text-dimmed">{{ subtitle }}</div>
|
|
99
99
|
</div>
|
|
100
100
|
</div>
|
|
101
101
|
<div class="flex shrink-0 items-center gap-2">
|
|
@@ -139,7 +139,7 @@ const STATUS_UI: Record<
|
|
|
139
139
|
variant="subtle"
|
|
140
140
|
:icon="STATUS_UI[diagnostic.status].icon"
|
|
141
141
|
:description="diagnostic.message + (diagnostic.detail ? ` ${diagnostic.detail}` : '')"
|
|
142
|
-
:ui="{ description: 'text-
|
|
142
|
+
:ui="{ description: 'text-2xs' }"
|
|
143
143
|
/>
|
|
144
144
|
</div>
|
|
145
145
|
</template>
|
|
@@ -65,17 +65,17 @@ async function toggle(row: TaskTypeSuppression, offered: boolean) {
|
|
|
65
65
|
{{ t('settings.taskTypeSuppressions.intro') }}
|
|
66
66
|
</p>
|
|
67
67
|
|
|
68
|
-
<p v-if="loading" class="text-
|
|
68
|
+
<p v-if="loading" class="text-2xs text-dimmed">
|
|
69
69
|
{{ t('settings.taskTypeSuppressions.loading') }}
|
|
70
70
|
</p>
|
|
71
|
-
<p v-else-if="!rows.length" class="text-
|
|
71
|
+
<p v-else-if="!rows.length" class="text-2xs text-dimmed">
|
|
72
72
|
{{ t('settings.taskTypeSuppressions.empty') }}
|
|
73
73
|
</p>
|
|
74
74
|
<ul v-else class="space-y-2" data-testid="task-type-suppressions">
|
|
75
75
|
<li
|
|
76
76
|
v-for="row in rows"
|
|
77
77
|
:key="row.taskType.taskType"
|
|
78
|
-
class="flex items-start justify-between gap-3 rounded border border-default px-3 py-2"
|
|
78
|
+
class="flex items-start justify-between gap-3 rounded-sm border border-default px-3 py-2"
|
|
79
79
|
data-testid="task-type-suppression"
|
|
80
80
|
:data-task-type="row.taskType.taskType"
|
|
81
81
|
>
|
|
@@ -94,7 +94,7 @@ async function toggle(row: TaskTypeSuppression, offered: boolean) {
|
|
|
94
94
|
{{ row.taskType.presentation.category }}
|
|
95
95
|
</UBadge>
|
|
96
96
|
</div>
|
|
97
|
-
<p class="mt-0.5 text-
|
|
97
|
+
<p class="mt-0.5 text-2xs text-dimmed">
|
|
98
98
|
{{ row.taskType.presentation.description }}
|
|
99
99
|
</p>
|
|
100
100
|
</div>
|