From 142b0963e014b7b0b839e64e272dc97663a96322 Mon Sep 17 00:00:00 2001 From: Francisco Solla Date: Thu, 30 Jul 2026 18:45:44 -0300 Subject: [PATCH] =?UTF-8?q?B54=20=E2=80=94=20Busca=20global:=20layout=20re?= =?UTF-8?q?sponsivo=20dos=20resultados=20(#60)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat(campanha): responsive grid and viewport cap for home search results (B54) Adds HomeSearchResultsLayout with 1/2/3-column breakpoints and allocateHitBudget so Municípios keep priority while total hits stay within per-viewport limits. Closes #8 * fix(campanha): un-export knip-unused home search budget helpers --- docs/plans/busca-global-layout-resultados.md | 4 +- src/app/(campaign)/campanha/(app)/page.tsx | 15 +- .../dashboard/HomeSearchActivityGroup.tsx | 7 +- .../dashboard/HomeSearchAdvisorGroup.tsx | 8 +- .../dashboard/HomeSearchDemandGroup.tsx | 7 +- .../dashboard/HomeSearchHitBudgetContext.tsx | 77 +++++++++ .../dashboard/HomeSearchLeadershipGroup.tsx | 8 +- .../dashboard/HomeSearchMunicipalityGroup.tsx | 15 +- .../dashboard/HomeSearchResultsLayout.tsx | 46 +++++ .../dashboard/HomeSearchStateDeputyGroup.tsx | 8 +- src/lib/homeSearchHitBudget.ts | 105 ++++++++++++ tests/unit/homeSearchHitBudget.unit.spec.ts | 162 ++++++++++++++++++ .../homeSearchResultsLayout.unit.spec.tsx | 49 ++++++ 13 files changed, 495 insertions(+), 16 deletions(-) create mode 100644 src/components/campaign/dashboard/HomeSearchHitBudgetContext.tsx create mode 100644 src/components/campaign/dashboard/HomeSearchResultsLayout.tsx create mode 100644 src/lib/homeSearchHitBudget.ts create mode 100644 tests/unit/homeSearchHitBudget.unit.spec.ts create mode 100644 tests/unit/homeSearchResultsLayout.unit.spec.tsx diff --git a/docs/plans/busca-global-layout-resultados.md b/docs/plans/busca-global-layout-resultados.md index 96a8a3fc..13d68d69 100644 --- a/docs/plans/busca-global-layout-resultados.md +++ b/docs/plans/busca-global-layout-resultados.md @@ -1,7 +1,7 @@ # Busca global — layout dos resultados (grid + cap de viewport) -Status: rascunho -Atualizado em: 2026-07-29 +Status: entregue (2026-07-30) +Atualizado em: 2026-07-30 — as-built: `HomeSearchResultsLayout` (grid 1/2/3 col + `HomeSearchHitBudgetContext`); cap v1 constante por breakpoint (`HOME_SEARCH_HIT_BUDGET` 8/12/15) via `allocateHitBudget` com prioridade Municípios; grupos B48–B53 fatiam via `useHomeSearchHitLimit`. Item do roadmap: [docs/roadmap.md](../roadmap.md) (Trilha B, item B54 — busca global) Impeccable: B — layout responsivo da região de resultados B47 Appetite: ~0,5–0,75 dia eng; CSS grid + política de cap; sem provider novo diff --git a/src/app/(campaign)/campanha/(app)/page.tsx b/src/app/(campaign)/campanha/(app)/page.tsx index 40f8e953..58b5e968 100644 --- a/src/app/(campaign)/campanha/(app)/page.tsx +++ b/src/app/(campaign)/campanha/(app)/page.tsx @@ -11,6 +11,7 @@ import { HomeSearchAdvisorGroup } from '@/components/campaign/dashboard/HomeSear import { HomeSearchDemandGroup } from '@/components/campaign/dashboard/HomeSearchDemandGroup' import { HomeSearchLeadershipGroup } from '@/components/campaign/dashboard/HomeSearchLeadershipGroup' import { HomeSearchMunicipalityGroup } from '@/components/campaign/dashboard/HomeSearchMunicipalityGroup' +import { HomeSearchResultsLayout } from '@/components/campaign/dashboard/HomeSearchResultsLayout' import { HomeSearchResultsShell } from '@/components/campaign/dashboard/HomeSearchResultsShell' import { HomeSearchStateDeputyGroup } from '@/components/campaign/dashboard/HomeSearchStateDeputyGroup' import { CampaignPageShell } from '@/components/campaign/shell/CampaignPageShell' @@ -50,12 +51,14 @@ export default async function CampaignHomePage() { actions={actions} searchResults={ - - - - - - + + + + + + + + } summarySlot={summarySlot} diff --git a/src/components/campaign/dashboard/HomeSearchActivityGroup.tsx b/src/components/campaign/dashboard/HomeSearchActivityGroup.tsx index c5534039..4c37c456 100644 --- a/src/components/campaign/dashboard/HomeSearchActivityGroup.tsx +++ b/src/components/campaign/dashboard/HomeSearchActivityGroup.tsx @@ -1,23 +1,28 @@ 'use client' +import { useHomeSearchHitLimit } from '@/components/campaign/dashboard/HomeSearchHitBudgetContext' import { HomeSearchHitRow } from '@/components/campaign/dashboard/HomeSearchHitRow' import { useHomeSearchResults } from '@/components/campaign/dashboard/HomeSearchResultsContext' import { homeSearchActivityGroupHasHits } from '@/lib/campaignHomeSearchHits' +import { sliceHomeSearchHits } from '@/lib/homeSearchHitBudget' import { HOME_SEARCH_GROUP_HEADING_CLASS, HOME_SEARCH_GROUP_LIST_CLASS } from '@/lib/homeSearchUi' export const HomeSearchActivityGroup = () => { const { results } = useHomeSearchResults() + const hitLimit = useHomeSearchHitLimit('activities') if (results.status !== 'success') return null if (!homeSearchActivityGroupHasHits(results.data)) return null const { activities } = results.data + const visibleActivities = sliceHomeSearchHits(activities, hitLimit) + if (visibleActivities.length === 0) return null return (

Atividades