Compare commits

..
Author SHA1 Message Date
devops b6b2f15c12 docs(adr-0010): cerrar bug de overflow mobile 320px, actualizar estado de imagenes 2026-09-20 19:17:55 +00:00
devops 7658b9879a chore: promote v1.0.273 to production [skip ci] 2026-09-20 19:10:43 +00:00
devops a1dc145528 chore: release v1.0.273 [skip ci] 2026-09-20 19:10:41 +00:00
devops 4f5a715812 Merge branch 'fix/navbar-departamentos-overflow-320-2026-09-20'
Build and Push Frontend / Escaneo de Secretos (Gitleaks) (push) Successful in 31s
Build and Push Frontend / Construir y Subir Imagen (push) Successful in 11m57s
2026-09-20 18:58:13 +00:00
devops 5ce9c07829 fix(ecommerce): ocultar texto de Departamentos en mobile, 3 shrink-0 desbordaban 320px 2026-09-20 18:57:54 +00:00
4 changed files with 59 additions and 29 deletions

No files matched your search

@@ -425,27 +425,49 @@ Resultados reales, uno por uno (código de cada prueba en
un dispositivo real. un dispositivo real.
21b. **Accesibilidad del checkout completo** por teclado (no solo el 21b. **Accesibilidad del checkout completo** por teclado (no solo el
buscador) — tab order y foco visible en los 3 pasos. buscador) — tab order y foco visible en los 3 pasos.
22. **Importación manual de imágenes no se refleja en el storefront** 22. **Importación manual de imágenes no se reflejaba en el storefront**
(reportado por el usuario 2026-09-20): subir/editar imágenes de un (reportado por el usuario 2026-09-20) — **causa raíz encontrada y
producto a mano (vs. importación por CSV, que sí funciona) no arreglada en código (2026-09-20), pendiente confirmar con una
aparece del lado del storefront. Falta reproducir contra el flujo edición real.** `medusaFetch()` en `lib/headless/providers/medusa.ts`
real de importación manual del admin de Medusa (ver usaba `next:{revalidate:60,tags:["medusa-products"]}`, caché en
`temp-admin`/`ari-shopping-tienda` en memoria) y confirmar si es memoria por-pod que sobrevivía a `force-dynamic`. Con
caché (ISR de Next, `force-dynamic` ya está en la página de `frontend-deploy` en 2 réplicas sin cacheHandler compartido, el POST
producto — ver más arriba), staleness de Meilisearch (ver memoria de `/api/revalidate` del subscriber de Medusa solo llegaba a uno de
`search-inventory-staleness`, mismo síntoma de "el catálogo directo los dos pods — el otro seguía sirviendo datos viejos hasta que el
sí, la búsqueda no") o algo específico del pipeline de importación TTL expirara solo. Una edición puntual + revisar al toque tenía
en `commerce-backend`. ~50% de chance de pegarle al pod stale; una importación CSV (mucho
23. **En mobile, la visualización de imágenes de producto se corta y más lenta) le daba tiempo de sobra al TTL para expirar en ambos.
obliga a scrollear** (reportado por el usuario 2026-09-20, con **Fix:** se sacó el `next.revalidate`/`tags` del fetch — ya en
captura real de `shop.cruzcloud.net` en un producto con múltiples producción. Falta la prueba con una edición manual real (vía
fotos). Toda la clase de bug de overflow por falta de `min-w-0` ya `temp-admin`/`ari-shopping-tienda` en memoria) para confirmar que
se revisó en vivo en esta sesión y sigue presente en el síntoma original desapareció, no solo que la causa técnica tiene
`product-gallery.tsx` y `app/product/[slug]/page.tsx` — sospecha sentido.
sin confirmar: el modal "Zoom interactivo" 23. **En mobile (viewport real de 320px), la página se cortaba y
(`ProductGallery`/`DialogContent`, `min-h-[70vh]` + obligaba a scrollear horizontalmente — RESUELTO 2026-09-20.**
`overflow-hidden`) en viewport móvil real, donde la barra de Reportado por el usuario con captura real de `shop.cruzcloud.net`.
direcciones de Chrome/Safari hace que `100vh` mida más que el área **No era la galería de imágenes** (esa clase de bug con `min-w-0`
visible real. Pendiente reproducir con un dispositivo real o ya estaba corregida desde la sesión anterior, confirmado en vivo
emulación de `visualViewport` (Playwright con viewport móvil no que seguía sana). Dos causas reales encontradas por separado,
replica el comportamiento dinámico de la barra de direcciones). reproducidas con Playwright contra un viewport de 320×480 real:
- **Footer, bloque "Newsletter"** (`components/layout/footer.tsx`):
el párrafo de texto, sin `min-w-0`, le pedía al grid item su
ancho de una sola línea sin wrappear (~335px, medido en vivo)
en vez de dejarse achicar — forzaba la única columna del grid
(`sm:grid-cols-2 lg:grid-cols-4`, sin `grid-cols-1` propio pero
con auto-stacking correcto por debajo de `sm`) a 335px de ancho,
arrastrando la página entera. Mismo bug de fondo que el ya
documentado en la galería, en un grid en vez de un
`overflow-x-auto`.
- **Navbar, fila de "Departamentos"/"Todo"** (`components/layout/navbar.tsx`):
los 3 items de esa fila (botón de menú, "Departamentos", "Todo")
tenían los tres `shrink-0` — ninguno podía achicarse, así que si
los tres no entraban en 320px, desbordaban sí o sí (`min-w-0` no
aplica cuando el ítem no está pensado para achicarse). Fix:
ocultar el texto "Departamentos" en mobile (queda ícono + flecha,
con `aria-label` agregado para no perder accesibilidad), libera
espacio suficiente para que quepan los tres.
Verificado en vivo con Playwright (viewport 320×480 real, no
emulación de dispositivo con DPR) contra staging y producción
después del deploy: `document.documentElement.scrollWidth ===
clientWidth` en home y en página de producto, en ambos ambientes —
sin overflow.
@@ -26,11 +26,11 @@ spec:
runAsUser: 1001 runAsUser: 1001
containers: containers:
- name: app - name: app
image: gitea.cruzcloud.net/devops/ecommerce-frontend:v1.0.272 image: gitea.cruzcloud.net/devops/ecommerce-frontend:v1.0.273
env: env:
# Ver comentario en workloads/ecommerce/frontend/patches/deployment.yaml # Ver comentario en workloads/ecommerce/frontend/patches/deployment.yaml
- name: APP_VERSION - name: APP_VERSION
value: v1.0.272 value: v1.0.273
- name: HEADLESS_PROVIDER - name: HEADLESS_PROVIDER
value: medusa value: medusa
# Backend COMPARTIDO con Producción a propósito (decisión del # Backend COMPARTIDO con Producción a propósito (decisión del
@@ -261,10 +261,18 @@ function DepartmentsMegaMenu({ tree, isActive }: { tree: CategoryNode[]; isActiv
onClick={() => setOpen((value) => !value)} onClick={() => setOpen((value) => !value)}
aria-expanded={open} aria-expanded={open}
aria-haspopup="true" aria-haspopup="true"
aria-label="Departamentos"
className={`flex items-center gap-1.5 ${pillClass(open)}`} className={`flex items-center gap-1.5 ${pillClass(open)}`}
> >
<LayoutGrid className="size-4" /> <LayoutGrid className="size-4" />
Departamentos {/* Texto oculto en mobile: los 3 items de esta fila (menu, este
boton, "Todo") tienen shrink-0 -- ninguno se achica, asi que si
los tres no entran, desbordan la pagina entera (confirmado en
vivo 2026-09-20 contra 320px real: 14px de overflow horizontal
con el texto visible). No es un caso de min-w-0 faltante (ese
fix asume que el item PUEDE achicarse) -- ocultar la palabra
mas larga de la fila es lo que de verdad libera espacio. */}
<span className="hidden sm:inline">Departamentos</span>
<ChevronDown className={`size-3.5 opacity-70 transition-transform ${open ? "rotate-180" : ""}`} /> <ChevronDown className={`size-3.5 opacity-70 transition-transform ${open ? "rotate-180" : ""}`} />
</button> </button>
@@ -25,14 +25,14 @@ spec:
runAsUser: 1001 runAsUser: 1001
containers: containers:
- name: app - name: app
image: gitea.cruzcloud.net/devops/ecommerce-frontend:v1.0.272 image: gitea.cruzcloud.net/devops/ecommerce-frontend:v1.0.273
env: env:
# La actualiza el mismo paso del CD (.gitea/workflows/build.yaml) # La actualiza el mismo paso del CD (.gitea/workflows/build.yaml)
# que bumpea el tag de la imagen -- el footer la lee # que bumpea el tag de la imagen -- el footer la lee
# (process.env.APP_VERSION) para mostrar la versión real # (process.env.APP_VERSION) para mostrar la versión real
# desplegada en vez de un "v4.1" fijo. # desplegada en vez de un "v4.1" fijo.
- name: APP_VERSION - name: APP_VERSION
value: v1.0.272 value: v1.0.273
- name: HEADLESS_PROVIDER - name: HEADLESS_PROVIDER
value: medusa value: medusa
- name: MEDUSA_BACKEND_URL - name: MEDUSA_BACKEND_URL