MILWEB®
MILWEB®
MW/031RJS LATICÍNIOSESTUDIO

RJS Laticínios

RJS Laticínios — pantalla inicial
ESTUDIO
MILWEB
TIPO
PRODUCTO DIGITAL
ESTADO
EN LÍNEA

02 / LA IDEA

Vitrina de lácteos artesanales · pedido en WhatsApp

Los productores de lácteos artesanales venden de boca en boca y por WhatsApp, sin una vitrina propia que muestre los productos con profesionalismo.

03 / EXPERIENCIA
  1. 01 / 01

    Paleta y tipografía centralizadas en _tokens.scss. Cambiar el color de la marca es una línea, no un grep en el JSX.

    RJS Laticínios — 01
  2. 02 / 02

    Panda en SVG puro que sigue el cursor con throttling por requestAnimationFrame y se adormece tras 8s quieto.

    RJS Laticínios — 02
  3. 03 / 03

    Un único loop de animación (el raf de Lenis alimenta el ticker de GSAP) evita jank entre scroll suave y parallax.

    RJS Laticínios — 03
  4. 04 / 04

    data-flavor en el <html> cambia CSS custom properties, persiste en localStorage y evita flash antes de la hidratación.

    RJS Laticínios — 04
Hero con escena de granja en SVG y el panda Pandito

04 / BAJO EL CAPÓ

  • 01La stack se aparta del combo estándar Next + Tailwind a propósito: SCSS Modules con un archivo _tokens.scss central (paleta, tipografía, eas…+

    La stack se aparta del combo estándar Next + Tailwind a propósito: SCSS Modules con un archivo _tokens.scss central (paleta, tipografía, easings, breakpoints como variables Sass) y mixins compartidos. En una marca con identidad visual tan fuerte, con azul como color madre en proporción 60-30-10 y amarillo, verde y naranja solo como acento puntual, nunca fondo plano, las utility classes de Tailwind tienden a esparcir decisiones de diseño en className por todo el JSX. Con SCSS Modules cada sección carga su propio .module.scss con alcance local, y la paleta vive en un único lugar: cambiar el tono del azul de la marca es una línea en _tokens.scss, no un grep por bg-blue-500 en decenas de archivos.

  • 02La mascota Pandito no es una imagen. Es un componente SVG (Panda.tsx) dibujado en código, con gradientes radiales para dar volumen al pelaje…+

    La mascota Pandito no es una imagen. Es un componente SVG (Panda.tsx) dibujado en código, con gradientes radiales para dar volumen al pelaje blanco y negro, rubor en las mejillas y un sistema de props (look, item, sleepy) que redibuja los ojos y la cabeza en tiempo real. El componente InteractivePanda captura mousemove en la página entera, pero limita la lectura con requestAnimationFrame y solo dispara setState cuando el delta de posición supera un umbral. Eso evita re-render en cada píxel de movimiento del mouse, lo que importa mucho para el INP. Después de 8s sin movimiento el panda se adormece (cierra los ojos, respira más lento, aparece un Zzz animado), y un IntersectionObserver pausa todo ese procesamiento cuando la sección sale del viewport, para no gastar CPU en una mascota que nadie está viendo.

  • 03El scroll suave es Lenis sincronizado con GSAP ScrollTrigger: el raf de Lenis alimenta el ticker de GSAP (gsap.ticker.add) en vez de correr …+

    El scroll suave es Lenis sincronizado con GSAP ScrollTrigger: el raf de Lenis alimenta el ticker de GSAP (gsap.ticker.add) en vez de correr dos loops de animación en paralelo, lo que evita jank cuando parallax y smooth-scroll compiten por el mismo frame. El fondo del Hero es una escena de granja entera en SVG puro (cielo con gradiente, sol, nubes, colinas en capas, granero y silo), sin ninguna imagen raster, y se mueve con scrollTrigger.scrub con leve yPercent y scale, dando profundidad sin pesar en la carga. Es interesante notar que el parallax del propio panda usa MotionValue de Framer Motion en vez de GSAP, y el código documenta explícitamente por qué: animar y con animate y con un MotionValue de style en el mismo div genera conflicto y traba el elemento en opacity:0. Por eso la entrada (fade y scale) y el parallax de mouse quedan en wrappers motion.div separados.

  • 04Un detalle que pasa desapercibido: el sitio tiene un selector de "Sabor" en la navbar que cambia la paleta entera (7 opciones: leche, chocol…+

    Un detalle que pasa desapercibido: el sitio tiene un selector de "Sabor" en la navbar que cambia la paleta entera (7 opciones: leche, chocolate, fresa, uva, banana, coco y ensalada de frutas) vía data-flavor en el <html>, con cada variante sobrescribiendo las CSS custom properties en globals.scss. La elección persiste en localStorage y se aplica antes de la hidratación por un script inline en el <head> del layout.tsx, lo que evita el flash de la paleta por defecto antes de reaplicar el color guardado. Cambiar de sabor dispara una ola de tinta (FlavorPicker) que nace del propio botón y cubre la pantalla con el color nuevo antes de desaparecer. Es puramente decorativo, pero refuerza la identidad lúdica de la marca sin costar rendimiento, ya que es todo CSS y SVG, sin imágenes.

CONSTRUIDO CONNext.js · TypeScript · Tailwind · VercelCÓDIGO

06 / RESULTADO

Catálogo · pedido en WhatsApp

PROYECTO PROPIO · DEMO

[ QUIERO ALGO PARECIDO ]

07 / PANTALLAS SELECCIONADAS
Hero con escena de granja en SVG y el panda Pandito
PANTALLA 01Hero con escena de granja en SVG y el panda Pandito
Panda interactivo siguiendo el cursor
PANTALLA 02Panda interactivo siguiendo el cursor
Catálogo de productos lácteos
PANTALLA 03Catálogo de productos lácteos
SIGUIENTE EXPERIENCIA25 / IMPÉRIO DO CAFÉ

Império do Café

Império do Café

TODOS LOS PROYECTOS

TODOS LOS PROYECTOS