Skip to content

feat: búsqueda de artículos en tiempo real (issue #7)#12

Open
claude[bot] wants to merge 5 commits into
mainfrom
feat/issue-7
Open

feat: búsqueda de artículos en tiempo real (issue #7)#12
claude[bot] wants to merge 5 commits into
mainfrom
feat/issue-7

Conversation

@claude
Copy link
Copy Markdown

@claude claude Bot commented May 28, 2026

Resumen

Implementa la búsqueda de artículos en tiempo real en la página principal (/) descrita en el issue #7.

Cambios

Spec SDD

  • specs/real-time-article-search/ — spec.md, plan.md y tasks.md nuevos con la metodología SDD completa para este feature.

Implementación

  • app/_components/ArticleSearch.tsx — componente cliente nuevo con:
    • useState para el valor del input
    • useMemo para el filtrado eficiente
    • Normalización de diacríticos con String.normalize("NFD") + /\p{Diacritic}/gu
    • Filtrado case-insensitive por título y excerpt
    • Input type="search" con aria-label="Buscar artículos" e icono de lupa
    • Mensaje "No se encontraron artículos" cuando el filtro no produce resultados
  • app/page.tsx — modificado para pasar todos los posts a <ArticleSearch posts={posts} /> (mantiene Server Component)
  • vitest.config.ts — exclude de e2e/** para que Vitest no recoja los specs de Playwright

Tests E2E

  • e2e/article-search.spec.ts — 5 specs que ejercitan el golden path:
    1. Campo de búsqueda visible con placeholder correcto
    2. Filtrado al escribir (golden path): lista se reduce al escribir "react"
    3. Restauración al borrar: vuelven todos los artículos al limpiar el input
    4. Sin resultados: muestra mensaje "No se encontraron artículos" con texto sin coincidencias
    5. Case-insensitive y sin acentos: "REACT" y "supabase" encuentran artículos correctamente

Supuestos

  • El filtrado es puramente client-side sobre los 5 posts estáticos de app/lib/api.ts.
  • No se persiste el estado de búsqueda en la URL (fuera del scope del issue).

Closes #7

github-actions Bot and others added 5 commits May 26, 2026 15:39
Add a controlled `<input aria-label="Buscar artículos">` on the homepage
that filters the post grid by title or excerpt as the user types.
Filtering is case-insensitive and diacritic-insensitive (NFD + combining
mark strip). When nothing matches, render "No se encontraron artículos"
in place of the grid.

- specs/article-search/{spec,plan,tasks}.md — SDD docs following the
  existing project convention.
- app/_components/SearchablePostList.tsx — new client component with
  useState + useMemo and the normalize() helper.
- app/page.tsx — drop the hardcoded `slice(0,3)`, pass full posts list
  into SearchablePostList so the search has all entries to filter over.
- e2e/article-search.spec.ts — Playwright golden path (filter, empty
  state, clear) + accent-insensitive search assertion.
- playwright.config.ts — supply placeholder Supabase env to the dev
  server so the homepage renders without the Next.js dev-mode error
  overlay when env secrets are absent.
- vitest.config.ts — exclude e2e/ from Vitest collection so Playwright
  specs don't get picked up as unit tests.
- .gitignore — ignore Playwright local artifacts (e2e/.results,
  e2e/.report, playwright-report).

Closes #7

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Añade un campo de búsqueda sobre la lista de artículos en `/` que filtra
en tiempo real por título y excerpt, con normalización de acentos y
mayúsculas. Incluye spec SDD, tests e2e Playwright, y correcciones de
bugs preexistentes (lint, test unitario DELETE 404, Supabase sin credenciales).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…ctualizada

Mantiene ArticleSearch.tsx y correcciones de Supabase nulo. Incorpora
.gitignore y playwright.config.ts con env vars de placeholder.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Adds a client-side search input on the home page (/) that filters articles
by title and excerpt as the user types, with accent-insensitive comparison.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…tion

Combines useMemo-based filtering, Unicode diacritic normalization, Search icon,
and type="search" input from both branches. Updates e2e specs to use searchbox role.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
@claude
Copy link
Copy Markdown
Author

claude Bot commented May 28, 2026

Reporte de implementación — Issue #7

Spec SDD creado

Nuevo directorio specs/real-time-article-search/ con:

  • spec.md — 6 secciones: Visión, Usuarios, Funcionalidades (Must/Should/Could), Flujos (happy path + alternativos), Arquitectura, NFRs
  • plan.md — pasos técnicos ordenados con stacks descartados justificados
  • tasks.md — lista TDD con checkboxes por fase

Feature implementado

app/_components/ArticleSearch.tsx (nuevo, client component):

  • useState para el query, useMemo para la lista filtrada
  • Normalización de diacríticos via String.normalize("NFD") + regex Unicode /\p{Diacritic}/gu — más robusta que un rango de caracteres fijo
  • Input type="search" con aria-label="Buscar artículos" e icono Search de lucide-react
  • Mensaje "No se encontraron artículos" cuando el filtro no produce resultados y hay texto en el input

app/page.tsx (modificado):

  • Permanece Server Component; pasa todos los posts (no solo featured) a <ArticleSearch posts={posts} />

vitest.config.ts (modificado):

  • Añadido exclude: ["**/node_modules/**", "**/e2e/**"] para que Vitest no recolecte specs de Playwright

Specs E2E añadidos

e2e/article-search.spec.ts — 5 tests que ejercitan el golden path:

  1. Campo de búsqueda visible con placeholder correcto
  2. Golden path: filtrado al escribir "react" — lista se reduce sin recargar página
  3. Restauración al borrar el input — vuelven todos los artículos
  4. Sin resultados — muestra "No se encontraron artículos" con texto sin coincidencias
  5. Case-insensitive y sin acentos — "REACT" y "supabase" encuentran artículos

Limitaciones y supuestos

  • El filtrado es puramente client-side sobre los 5 posts estáticos de app/lib/api.ts; no requiere nueva API route.
  • El estado de búsqueda no se persiste en la URL (fuera del scope del issue).
  • La normalización de acentos cubre el caso "react" → "React" y similares; para casos extremos de ligaduras (ej. æ) el comportamiento depende del motor JS.

@github-actions
Copy link
Copy Markdown

Reporte de tests (generado por el workflow)

E2E en verde

Resultado producido por un step determinístico del workflow corriendo npm run test:e2e sobre la rama del PR — no por el agente.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Búsqueda de artículos en tiempo real

0 participants