Para-ti

Para-ti — animaciones florales

Cuatro páginas de regalo, una por persona. Cada persona solo conoce su propia ruta. No existe un índice en la raíz que las enlace: es a propósito.


Rutas y URLs

Persona Archivo URL pública Estado
emil /emil/index.html https://tommyrg04.github.io/Para-ti/emil/ ✅ lista
emil (corazón) /emil/corazon/index.html https://tommyrg04.github.io/Para-ti/emil/corazon/ ✅ lista
emil (reset) /emil/reset/index.html https://tommyrg04.github.io/Para-ti/emil/reset/ ✅ lista
emil (nota) /emil/nota/index.html https://tommyrg04.github.io/Para-ti/emil/nota/ ✅ lista
emil (nosotros) /emil/nosotros/index.html https://tommyrg04.github.io/Para-ti/emil/nosotros/ ✅ lista · QR en /emil/nosotros/qr-emil.png
emil (el día) /emil/el-dia/index.html https://tommyrg04.github.io/Para-ti/emil/el-dia/ ✅ lista, con música
emil (capítulo uno) /emil/capitulo-uno/index.html https://tommyrg04.github.io/Para-ti/emil/capitulo-uno/ ✅ lista, con música
emil (flores amarillas) /emil/flores-amarillas/index.html https://tommyrg04.github.io/Para-ti/emil/flores-amarillas/ ✅ lista, con música
emil (90 días) /emil/90-dias/index.html https://tommyrg04.github.io/Para-ti/emil/90-dias/ ✅ lista, sin sonido
imanol /imanol/index.html https://tommyrg04.github.io/Para-ti/imanol/ ⛔ pendiente (archivo aún no está en el repo)
clarett /clarett/index.html https://tommyrg04.github.io/Para-ti/clarett/ ⛔ pendiente (archivo aún no está en el repo)
mama /mama/index.html https://tommyrg04.github.io/Para-ti/mama/ ⛔ pendiente (archivo aún no está en el repo)
evianny /evianny/index.html https://tommyrg04.github.io/Para-ti/evianny/ ✅ lista

Como cada carpeta tiene index.html, la URL funciona sin escribir el nombre del archivo.

El repo se renombró de plantillas a Para-ti. Eso cambia la URL pública: ahora es https://tommyrg04.github.io/Para-ti/.... El remoto de git local sigue apuntando al nombre viejo a propósito: GitHub redirige los renombres indefinidamente y ese remoto es el que tiene permitido esta sesión.

Activar GitHub Pages (una sola vez)

  1. El repo tiene que ser público. En repos privados, Pages exige plan de pago (GitHub Pro/Team) y muestra un aviso de cobro. Settings → General → abajo del todo, Danger Zone → Change repository visibility → Change to public.
  2. Repo → Settings → Pages (menú izquierdo).
  3. Source: Deploy from a branch.
  4. Branch: main — Folder: / (root) → Save.
  5. Esperar 1–2 min. La primera publicación tarda; las siguientes son casi inmediatas (30–60 s tras cada push).

No hace falta Vercel ni ningún build: son archivos estáticos puros.

Consecuencia de ser público: cualquiera que llegue al repo ve las cuatro carpetas y sus mensajes. La regla de “cada persona solo conoce su ruta” aplica a los links que repartes, no al repo. Nadie va a tropezarse con él por casualidad, pero no es secreto.


Qué contiene cada página

emil — vertical (iPhone)

Jardín nocturno azul. Fondo radial-gradient en tonos petróleo.

emil / corazón — vertical (iPhone), interactiva

Corazón de polvo de luz, en la misma paleta que el jardín para que las dos páginas de Emil se lean como una pareja: mismo degradado azul petróleo con el resplandor abajo, luciérnagas, misma tipografía cursiva y misma firma.

emil / reset — «Emil’s Reset», vertical (iPhone), interactiva

Un rincón para un día pesado. Rompe con la estética de las otras dos a propósito: aquí es luz de día — crema, azul muy suave, gris cálido y detalles rosados, con mucho aire. Registro Apple/Aesop, no nocturno.

evianny — «EVIANNY.EXE», amistad, mobile-first

Único directorio con varios archivos: index.html, estilos.css, guion.js. Sigue sin build ni dependencias — abriendo el HTML directo funciona igual.

Por qué no React/Vite/Tailwind: se pidió «si el proyecto ya tiene estructura, respétala». Este repo es estático sobre GitHub Pages y su regla nº 1 es sin build. Meter Vite obligaría a compilar en cada ajuste y a publicar un dist/. Se conservó el espíritu del encargo con archivos separados y todo el contenido repetitivo en arrays al principio de guion.js (PALABRAS, ENCANTAN, HITOS, MEDIDORES, SALIDAS_EXE, KIT, RECUERDOS) — para cambiar textos se tocan solo esos arrays.

emil / nota — tarjeta de florería con ramo, una sola pantalla

La más corta de todas: no tiene scroll, cabe entera en la pantalla.

Intentos descartados, para no repetirlos:

  1. Rosas de elipses sueltas y planas: se leían como margaritas de clipart. Se arregló dando a cada flor una masa de fondo y coronas de pétalos superpuestos con degradado.
  2. Un óvalo de sombra colocado antes que las flores: se veía como un disco pálido rodeando el ramo.
  3. Papel como embudo de lados rectos: parecía papiroflexia.
  4. Lóbulos de papel frontales y largos: formaban un corazón rosa en mitad del ramo.
  5. Un óvalo verde oscuro sólido detrás: con las rosas funcionaba porque lo tapaban, pero los lirios dejan huecos entre tépalos y se veía un manchón negro.
    • Techo conocido: esto es una ilustración, no una foto. Si en algún momento se quiere el aspecto literal de la fotografía, el camino es incrustar una imagen propia en /emil/nota/, no seguir refinando el SVG.
    • Formato de nota de florista: papel crema, serif del sistema (New York en iPhone) para el mensaje y sans letterspaced para los rótulos.
    • Al tocar «toca para abrir la nota», las dos caras se cruzan y las tres líneas entran escalonadas (0.3 / 1.05 / 1.8 s), luego el filete y la firma (2.9 s).
    • Un solo archivo. Sin scroll, sin reinicio: se lee y ya.

emil / nosotros — cifras que suben, vertical (iPhone)

Página traída ya hecha desde fuera y subida tal cual: no se tocó ni un texto.

emil / el día — «Ayer», vertical (iPhone), con música

La del día que se vieron por primera vez. Misma mecánica que /emil/nosotros/: seis beats y cada toque pasa al siguiente. Paleta cálida, al revés que la otra, que era noche azul.

emil / capítulo uno — la del noviazgo, vertical (iPhone), con música

La del día que se hicieron novios. Once pantallas, un toque para avanzar.

El concepto: un hilo de luz en el margen izquierdo que se va dibujando con cada toque, y tres zonas — ANTES (se estaban conociendo), HOY (se vieron y dejaron de ser «algo»), DESPUÉS (lo que falta). El hilo va tenue en el antes, encendido en el hoy y, al final, sigue bajando sin terminar. No es adorno: es lo que cuenta la página.

emil / flores amarillas — la lluvia, el árbol y el corazón

Una sola escena continua sobre un <canvas>: la lluvia, el árbol y el corazón son las mismas flores moviéndose, nunca hay un cambio de pantalla.

Las flores están dibujadas con código, no recortadas de fotos. Se intentó con recortes de las fotos reales y se descartó: por mucho que se afine la máscara, en una foto de ramo las flores se tocan entre sí y siempre queda algún canto recto. Ahora cada flor se pinta una sola vez en su propio lienzo al arrancar — pétalo a pétalo, con degradado de la base a la punta, nervio de luz y estambres — y la escena solo las estampa. Diez variantes: lirios de seis tépalos, flores de cinco pétalos, hortensias de cuatro, un capullo y un pétalo suelto.

Por qué canvas y no SVG ni divs. Hay hasta 200 flores a la vez, cada una con posición, giro, escala y opacidad propias. Con nodos del DOM eso no va a 60 fps en un teléfono; con drawImage sí. El desenfoque de las que pasan pegadas a la cámara se calcula una vez al cargar, en un lienzo aparte: un filter por fotograma se come la mitad de los cuadros.

Las frases pasan al tocar, no por reloj: Emil las lee a su ritmo, con un «toca para seguir» discreto abajo. Lo único que corre solo es la parte de cine —la lluvia del principio, el árbol y el corazón—, donde no hay nada que leer.

El orden de la película: la lluvia es solo la entrada —cinco segundos, la pantalla entera llena de flores, hasta 300 en el teléfono—; después se para, queda suspendido un puñado lejos del sitio del texto y el resto se retira, para poder leer las cinco frases con calma; y el árbol y el corazón llegan al final, como desenlace. Con las trescientas quietas no había quien leyera nada.

emil / 90 días — la conversación entera, dibujada

59.344 mensajes en 90 días, un punto por mensaje, repartidos en 90 columnas —una por día—. El resultado es el perfil real de esos tres meses: se ve julio desbordado, se ven los días flojos y se ve la noche que llegó a las 5:27.

Las cifras salen del export del chat, contadas de verdad. El export no está en el repo y en la página no hay ni una frase de la conversación salvo el primer mensaje de todos, «Hola lindo».

Fuera del sitio: /qr-emil/

La tarjeta de 55×80 mm con el QR que lleva a /emil/nosotros/, con tulipanes, para imprimir y meter en una carta. Hay PDF al tamaño exacto, PNG a 300 ppp y una A4 con 9 para recortar. Dos reglas que no se pueden romper: nada dibujado encima del QR ni de su margen blanco, y el QR va en bitmap y no en vectores (a 0,85 mm por módulo el rasterizador los deja desiguales). Detalles en qr-emil/README.md.

Fuera del sitio: /carpetas/

No es una página de regalo — son las cuatro portadas A4 para imprimir de la unidad de legalizaciones (portadas.html + los PNG y el PDF ya exportados). Está en el repo para no perderlas, no para servirlas por Pages. Detalles en carpetas/README.md.

imanol, clarett, mama

Pendientes de subir. clarett será horizontal (PC), las otras dos verticales.


Secuencia de tiempos — emil

Entrada completa: ≈0 → 10 s. Después todo queda en bucle.

t (s) Qué pasa
0.0 Estrellas empiezan a titilar (bucle 5 s, delay aleatorio 0–5 s)
0.0 Luciérnagas (bucle 13 s, delay aleatorio 0–13 s)
0.0 – 1.0 La hierba se dibuja (cada brizna 1.4–2.2 s, delay aleatorio)
0.0 – 0.7 Los 6 tallos se dibujan (2.4 s c/u, delay idx × 0.14)
1.2 – 2.8 Hojas se despliegan (f.d − 0.9 y f.d − 0.6, duración 1.2 s)
2.1 Abre el lirio blanco central (el primero)
2.5 Abre el lirio azul izquierdo
2.75 Abre el lirio blanco derecho
2.9 Abre el lirio azul derecho
3.1 Abre la hortensia izquierda
3.4 Abre la hortensia derecha
3.6 Aparece el mensaje (fade 3 s)
5.6 Emerge “te quiero” (2.6 s, sube 18 px)
7.6 Aparece la firma (2.4 s) → termina ≈10 s

Desglose interno de cada flor, relativo a su d (delay base de la tabla):

Bucles permanentes: mecer 8–10 s (tallos), respirar 6 s (auras), titilar 5 s, flotar 13 s, subirChispa 4.5 s.

Secuencia de tiempos — emil / corazón

Todo cuenta desde el toque, no desde la carga.

t (s) Qué pasa
0.0 Estalla la luz: 54 chispas salen disparadas (1.1 s)
0.35 – 2.45 Llegan volando las partículas del contorno, de la punta de abajo hacia arriba por las dos mitades a la vez (1.5 s cada una en aterrizar)
1.2 – 3.1 Llegan las del relleno, del centro hacia afuera
2.6 – 5.1 Entra el polvo desenfocado de primer plano
4.0 Empiezan a escaparse motas hacia arriba (bucles de 6–11 s)
4.3 Arranca la onda de luz que sube por el corazón (bucle 4.2 s)
4.6 / 5.7 / 7.0 Las tres líneas del mensaje
8.4 Aparece «Como crece mi amor por ti»
8.6 El contador se dispara y ya no para
9.8 Firma

Comprobado en Chromium

/evianny/ — 390×844, además de 1280×900 y 412×915. Sin errores de consola. Se generan los 9+8+5+5+4+9 elementos desde los arrays; «Entrar», «sigue ↓», las tarjetas (abrir/cerrar/reabrir), los 4 botones del kit, «Ejecutar Evianny.exe» (6 pulsaciones → tope de 4 líneas y un solo cursor), «Guardar esta amistad» y «Volver a empezar» funcionan. Cero desbordamiento horizontal en los tres anchos y ningún elemento se sale de la pantalla. Segunda vuelta completa verificada. También pasada con prefers-reduced-motion: reduce.

/emil/reset/ — 390×844

La página del reset se verificó con Playwright pulsando todos los botones: sin errores JS, sin desbordamiento horizontal, las 9 secciones revelan, el abrazo aparece, el reinicio deja los cuatro estados limpios (portada visible, scroll arriba, botón de abrazo repuesto, entradas rebobinadas) y la segunda vuelta funciona igual. También pasada con prefers-reduced-motion: reduce.


Reglas técnicas (respetar en TODO cambio)

  1. HTML + CSS + SVG puro. Sin frameworks, sin build, sin dependencias, sin CDN. Cada archivo debe funcionar abriéndolo directo con doble clic.
  2. Las flores e insectos se generan por JS creando nodos SVG (createElementNS); las animaciones son CSS (@keyframes), nunca requestAnimationFrame por frame.
  3. Nada de filtros SVG pesados (feGaussianBlur, feDropShadow) sobre grupos grandes: matan el rendimiento. La profundidad se logra con opacidad y escala.
  4. will-change:transform en todo lo que anima en bucle. Animar solo transform y opacity (nada de left/top/width/filter).
  5. Incluir siempre el bloque @media (prefers-reduced-motion: reduce) que congela la escena en su estado final.
  6. emil, imanol y mama son verticales para iPhone: 100svh, env(safe-area-inset-*), <meta viewport ... viewport-fit=cover>. clarett es horizontal para PC.
  7. Objetivo 60 fps en iPhone. Si algo se arrastra: reducir cantidad de nodos antes que quitar detalle visual de las flores del primer plano.
  8. No cambiar los textos de los mensajes ni las firmas sin preguntar antes.

Deuda técnica conocida (emil)

La página aún usa filter:url(#glow) / url(#glowSuave) en el grupo de tépalos internos del lirio, en la capa de fondo de la hortensia (22 nodos), en cada antera y en las 30 chispas en bucle. Va contra la regla 3 y es el primer sospechoso si en el iPhone no llega a 60 fps. Sustituible por halo con radialGradient + opacidad.


Flujo de trabajo

Cada ajuste: cambio → commit en español → push a main → GitHub Pages republica solo.