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.
| 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
plantillasaPara-ti. Eso cambia la URL pública: ahora eshttps://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.
Deploy from a branch.main — Folder: / (root) → Save.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.
Jardín nocturno azul. Fondo radial-gradient en tonos petróleo.
stroke-dasharray.path con Bézier):
viewBox="0 0 400 560", preserveAspectRatio="xMidYMax slice" (el suelo siempre pegado abajo).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.
<button> a pantalla completa, así también funciona con teclado).getPointAtLength sobre una guía invisible que después se borra).requestAnimationFrame,
+1.400–4.200 por frame, no se detiene nunca).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.
ui-serif (New York en iPhone) para las frases
que pesan y -apple-system (SF Pro) para el resto. En regular, nunca negrita: la
serif en bold rompía el tono.IntersectionObserver (umbral 0.16). Al reiniciar se
vuelve a observar todo, así que la segunda vuelta se anima igual que la primera.:focus-visible en todos los botones.Ú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 deguion.js(PALABRAS,ENCANTAN,HITOS,MEDIDORES,SALIDAS_EXE,KIT,RECUERDOS) — para cambiar textos se tocan solo esos arrays.
file:// el navegador bloquea los import por CORS,
así que guion.js es un IIFE cargado con <script src>.#FCFAFA, gris claro, negro suave #141214, carbón y
acento rosa cálido #C0798F — el toque para ella. El azul frío #7E96AC queda
reducido al marco del panel .exe, que es lo que mantiene el conjunto sobrio.
Tipografía del sistema (SF Pro en iPhone) + monoespaciada para la parte de
«sistema operativo».scaleY), en vez de la barra horizontal superior — así indica avanzar
hacia abajo, que es lo que hay que hacer.scrollHeight real en vez de un max-height
inventado, así la animación acaba exacta y se recalcula al girar el teléfono..exe nunca repite el mensaje anterior seguido y guarda 4 líneas como tope.<audio>, ni CSS ni JS.requestAnimationFrame.La más corta de todas: no tiene scroll, cabe entera en la pantalla.
panel(ángulo, largo, ancho) desde
el punto del atado. Va corto y tenue, como un cuello por detrás.Intentos descartados, para no repetirlos:
/emil/nota/, no seguir refinando el SVG.Página traída ya hecha desde fuera y subida tal cual: no se tocó ni un texto.
Espacio / Enter / →) pasa al siguiente. Hay un
candado de 650 ms para que un toque doble no salte dos.florece al body.<style>, un <script> sin src y el fondo como
data:image/jpeg;base64 (~214 KB). Cero peticiones de red — se abre con doble clic
desde el disco igual que desde Pages.100svh y safe-area-inset para iPhone.prefers-reduced-motion: reduce los números salen directo en su valor final.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.
carino.mp3, al lado del index.html: 75 s recortados de la
canción (del segundo 3 al 78, que es donde arranca de verdad y antes del cambio
de sección), 128 kb/s estéreo, 1,2 MB, con un fundido de 2,5 s al final para que
el bucle no dé un corte seco. Es el único archivo externo; lo demás va dentro del
HTML. Si se borra, la página sigue funcionando: el botón de sonido no aparece y
ya está.transform).
El grano es un mosaico PNG de 64 px repetido, no un feTurbulence a pantalla
completa, que al rasterizar pesa muchísimo.100svh, safe-area-inset y prefers-reduced-motion: reduce.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.
transform:scaleY y el punto con translateY, los dos con
transición; nada de animar alto ni top.<script>, marcada con un comentario.backdrop-filter) solo en dos tarjetas pequeñas, la carta y el
contador — a pantalla completa sería caro. Lleva respaldo con @supports para
el navegador que no lo tenga./emil/el-dia/ (carino.mp3, copia local), con el mismo botón
de sonido y el mismo aviso del silencio del iPhone.100svh, safe-area-inset y prefers-reduced-motion: reduce.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.
x=16·sen³t, y=13·cos t−5·cos2t−2·cos3t−cos4t, recorridos a paso constante —
repartiendo por el parámetro se amontonaban en la punta de abajo. Cada flor sale
con un retraso proporcional a su sitio en el recorrido: por eso se ve cómo se
traza la silueta y luego se rellena. El relleno lleva distancia mínima entre
flores. No hay ningún corazón dibujado de antemano.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».
fondo.mp3: 90 s recortados del segundo 2 al 92 de la canción
que eligió Tom, que es donde está la entrada suave, con fundido de entrada de
1,5 s y de salida de 3,5 s para que el bucle no dé un corte. 112 kb/s, 1,2 MB.
Arranca con el mismo clic que abre la pieza —el navegador exige un gesto del
usuario— y sube de 0 a 0,42 en cinco segundos. El ♪ solo sirve para callarla.
Si el mp3 faltara, la pieza funciona igual y el botón no aparece.
Antes llevaba una pieza propia generada con la Web Audio API; está en el
historial por si se quiere volver a ella.lnum.
Con la del sistema el problema desaparece solo./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.
/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.
Pendientes de subir. clarett será horizontal (PC), las otras dos verticales.
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):
+0 · tépalos externos +0 / +0.1 / +0.2 (2.1 s) ·
tépalos internos +0.35 / +0.46 / +0.57 · garganta +1.1 ·
6 estambres +1.25 … +1.5 · pistilo +1.35.+0 · capa de fondo +0 … +0.9 · capa media +0.25 … +1.15 ·
capa frontal +0.5 … +1.4 (dentro de cada capa el retraso crece con el radio:
abren del centro hacia afuera) · volumen/domo +1.2.d + 1.8 + rnd(0–4), bucle de 4.5 s.Bucles permanentes: mecer 8–10 s (tallos), respirar 6 s (auras),
titilar 5 s, flotar 13 s, subirChispa 4.5 s.
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 |
/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.
createElementNS);
las animaciones son CSS (@keyframes), nunca requestAnimationFrame por frame.feGaussianBlur, feDropShadow) sobre grupos
grandes: matan el rendimiento. La profundidad se logra con opacidad y escala.will-change:transform en todo lo que anima en bucle.
Animar solo transform y opacity (nada de left/top/width/filter).@media (prefers-reduced-motion: reduce) que congela
la escena en su estado final.100svh,
env(safe-area-inset-*), <meta viewport ... viewport-fit=cover>.
clarett es horizontal para PC.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.
Cada ajuste: cambio → commit en español → push a main → GitHub Pages republica solo.