diff --git a/src/app/(campaign)/campanha/(app)/layout.tsx b/src/app/(campaign)/campanha/(app)/layout.tsx
index d9270482..724f8b04 100644
--- a/src/app/(campaign)/campanha/(app)/layout.tsx
+++ b/src/app/(campaign)/campanha/(app)/layout.tsx
@@ -4,6 +4,7 @@ import { redirect } from 'next/navigation'
import { getPayload } from 'payload'
import React from 'react'
+import { CampaignListPendingBoundary } from '@/components/campaign/shared/CampaignListPending'
import {
BiometricEnrollmentToast,
type BiometricEnrollmentOffer,
@@ -71,19 +72,21 @@ export default async function CampaignAppLayout({ children }: { children: React.
-
-
-
- {children}
-
-
-
- {biometricEnrollment ? : null}
+
+
+
+
+ {children}
+
+
+
+ {biometricEnrollment ? : null}
+
diff --git a/src/components/campaign/dashboard/HomeSearchHitRow.tsx b/src/components/campaign/dashboard/HomeSearchHitRow.tsx
index 4e41d7ee..a160fe67 100644
--- a/src/components/campaign/dashboard/HomeSearchHitRow.tsx
+++ b/src/components/campaign/dashboard/HomeSearchHitRow.tsx
@@ -1,9 +1,10 @@
'use client'
import Link from 'next/link'
-import type { ReactNode } from 'react'
+import type { MouseEvent, ReactNode } from 'react'
import { MunicipalityPriorityIndicator } from '@/components/campaign/municipality/MunicipalityPriorityIndicator'
+import { CampaignWizardNavLink } from '@/components/campaign/shared/CampaignWizardNavLink'
import { HOME_SEARCH_HIT_ROW_WRAPPER_CLASS } from '@/lib/homeSearchUi'
import { cn } from '@/lib/utils'
@@ -16,6 +17,7 @@ export const HomeSearchHitRow = ({
trailing,
trailingAction,
showPriority = false,
+ wizardNavigation = false,
}: {
href: string
primary: string
@@ -23,36 +25,58 @@ export const HomeSearchHitRow = ({
trailing?: ReactNode
trailingAction?: ReactNode
showPriority?: boolean
-}) => (
-
-
{
- // Combobox/list precedent: RelationChipCell — keep input focused until navigation (B66).
- event.preventDefault()
- }}
+ /** Wizard route picks participate in the shared layout transition. */
+ wizardNavigation?: boolean
+}) => {
+ const rowLinkClass = cn(
+ 'flex min-h-11 items-center gap-3 py-2.5 text-left text-foreground',
+ 'outline-none focus-visible:ring-2 focus-visible:ring-ring',
+ trailingAction ? 'min-w-0 flex-1' : 'w-full',
+ )
+
+ const rowLinkProps = {
+ href,
+ onMouseDown: (event: MouseEvent
) => {
+ event.preventDefault()
+ },
+ className: rowLinkClass,
+ }
+
+ return (
+
-
- {showPriority ? : null}
-
-
- {primary}
- {secondary ? (
- {secondary}
- ) : null}
-
- {trailing ? {trailing} : null}
-
- {trailingAction ? {trailingAction} : null}
-
-)
+ {wizardNavigation ? (
+
+
+ {showPriority ? : null}
+
+
+ {primary}
+ {secondary ? (
+ {secondary}
+ ) : null}
+
+ {trailing ? {trailing} : null}
+
+ ) : (
+
+
+ {showPriority ? : null}
+
+
+ {primary}
+ {secondary ? (
+ {secondary}
+ ) : null}
+
+ {trailing ? {trailing} : null}
+
+ )}
+ {trailingAction ? {trailingAction} : null}
+
+ )
+}
diff --git a/src/components/campaign/leadership/WizardLeadershipStep.tsx b/src/components/campaign/leadership/WizardLeadershipStep.tsx
index c350c722..f2ec5dc4 100644
--- a/src/components/campaign/leadership/WizardLeadershipStep.tsx
+++ b/src/components/campaign/leadership/WizardLeadershipStep.tsx
@@ -1,13 +1,13 @@
'use client'
import { InfoIcon, PlusIcon } from 'lucide-react'
-import Link from 'next/link'
import { useRouter } from 'next/navigation'
import { useCallback, useState, useTransition } from 'react'
import { toast } from 'sonner'
import { SupportStatusBadge } from '@/components/campaign/leadership/SupportStatusBadge'
import { WizardLeadershipForm } from '@/components/campaign/leadership/WizardLeadershipForm'
+import { CampaignWizardNavLink } from '@/components/campaign/shared/CampaignWizardNavLink'
import { CampaignWizardShell } from '@/components/campaign/shared/CampaignWizardShell'
import { Badge } from '@/components/ui/Badge'
import { Button } from '@/components/ui/button'
@@ -89,7 +89,7 @@ export const WizardLeadershipStep = ({
const trailingAction = skipConfig ? (
) : undefined
diff --git a/src/components/campaign/municipality/WizardSignalSkipTrailing.tsx b/src/components/campaign/municipality/WizardSignalSkipTrailing.tsx
index 6752058f..92b9d9c5 100644
--- a/src/components/campaign/municipality/WizardSignalSkipTrailing.tsx
+++ b/src/components/campaign/municipality/WizardSignalSkipTrailing.tsx
@@ -1,5 +1,4 @@
-import Link from 'next/link'
-
+import { CampaignWizardNavLink } from '@/components/campaign/shared/CampaignWizardNavLink'
import { Button } from '@/components/ui/button'
import type { WizardSignalSkipAction } from '@/lib/wizardSignalUi'
@@ -9,6 +8,6 @@ type WizardSignalSkipTrailingProps = {
export const WizardSignalSkipTrailing = ({ skip }: WizardSignalSkipTrailingProps) => (
)
diff --git a/src/components/campaign/municipality/WizardSignalTypeStep.tsx b/src/components/campaign/municipality/WizardSignalTypeStep.tsx
index a1272c29..258acafa 100644
--- a/src/components/campaign/municipality/WizardSignalTypeStep.tsx
+++ b/src/components/campaign/municipality/WizardSignalTypeStep.tsx
@@ -1,10 +1,10 @@
'use client'
import { Info } from 'lucide-react'
-import Link from 'next/link'
import { useState } from 'react'
import { WizardSignalSkipTrailing } from '@/components/campaign/municipality/WizardSignalSkipTrailing'
+import { CampaignWizardNavLink } from '@/components/campaign/shared/CampaignWizardNavLink'
import { CampaignWizardShell } from '@/components/campaign/shared/CampaignWizardShell'
import { Button } from '@/components/ui/button'
import {
@@ -61,7 +61,7 @@ export const WizardSignalTypeStep = ({
const Icon = entry.icon
return (
-
-
+