- Add project-4 (Posidonia) and project-5 (Cases Tancades) cards and modals in all 3 locales (ES/CA/EN)
- Reorder Block A: Operativo projects first, Posidonia at top
- Align Posidonia modal style to match Eivissa Watch / Cases Tancades (bg-background-light, max-w-2xl, rounded-3xl, glass)
- Add external "Visitar sitio" link button to Eivissa Watch modal
- Refresh Eivissa Watch thumbnail (was just a green block, now real content)
- Generate Cases Tancades thumbnail from OG image
- Update Cases Tancades card tech stack from Next.js to Astro (matches actual site)
- Add "Ver detalles" button to Cases Tancades card
fix: persist modal layout stability CSS to source.css (was dropped on every build:css)
The .icon CSS rule had display:inline-block, which had higher source-order
priority than Tailwind's .hidden (display:none). Both have the same
specificity, but .icon was declared later in the compiled CSS, so it
overrode .hidden.
Result: both moon and sun SVGs in the theme toggle were always visible,
making them appear side-by-side (flex) or stacked (grid) instead of
swapping cleanly between light and dark mode.
Fix: remove display:inline-block from .icon. SVGs default to inline and
still respect width:1em / height:1em correctly. Now .hidden and
.dark\:block work as intended, and only one icon is visible at a time,
perfectly centered in the button.
- Fix malformed class attribute on tab buttons container (was breaking
pb-4 mb-8 dark:border-slate-800 classes; tab buttons sat glued to
content with no spacing)
- Move 'Trabajo Anterior' details back inside #tab-proyectos where it
belongs (had been orphaned into #tab-contents after earlier balance
fixes, causing it to render on every tab)
- Close tab-proyectos correctly so Proyectos and Notes panes show their
own content instead of inheriting display:none from Infraestructura
- initTabs() now scrolls smoothly to the tab buttons container on switch
to prevent the 'jump' caused by varying content height
- Remove fonts/material-symbols-outlined.woff2 (4MB external font eliminated)
- Inline 38 Material Symbols as SVG paths (extracted to icon-paths.json)
- Convert 5 Google-hosted images to self-hosted WebP
- Add favicon.svg (adaptive auto_awesome icon, light + dark)
- Add scrollbar-gutter: stable + body.modal-open to prevent modal jumps
- Clean up preload links to fonts no longer used
Net reduction: ~3.9MB external dependencies, zero CLS on icon swap
The Trace JSON showed the two external images from
lh3.googleusercontent.com (~3-4 MB each) being downloaded
during initial load even though they live inside hidden modals.
Adding loading=lazy and decoding=async defers them until the
modal is opened, eliminating the main-thread blocking that
caused the TBT regression.
- Drop Instrument Serif italic preload (Lighthouse flags ~700 ms savings)
- Remove backdrop-filter from .glass; use solid translucent background
to avoid repaints triggered when hero image loads
- Add defer to main.js
- Convert hero background to <img> with width/height/fetchpriority=high
so Lighthouse detects it as the LCP element
- Defer Umami analytics via requestIdleCallback to reduce TBT
- Drop non-critical font preloads (Material Symbols, Space Grotesk 400);
keep only Instrument Serif italic which is visible above the fold
- Remove unused font weights (300/500/600) from Space Grotesk
- Add package.json, tailwind.config.js and css/source.css with @tailwind directives
- Generate css/styles.css (24 KB) via Tailwind CLI v3.4
- Remove cdn.tailwindcss.com and inline tailwind.config from all HTML pages
- Add preload of css/styles.css
- Add cross-language hreflang alternates in HTML and sitemap.xml
- Update project cards with honest statuses: Navidrome and n8n+Ollama
moved to 'On the roadmap', Open Source marked 'Not started',
Visualización Datos Baleares marked 'Migration pending (on Vercel)'.
- Remove past-dated Notes post (2 de Junio, 2026 / Próximamente) with
never-written content.
- Add Cases Tancades as 5th project: open housing diagnostic for
Balears crossing INE, Airbnb and Govern Balear HUT registries.
- Add self-hosted Umami analytics tracker to all 4 pages with
data-domains='www.itziarzameza.dev' to exclude localhost/file://
visits from analytics.
- Add RGPD-compliant privacy policy in ES/CA/EN
(privacidad.html, privacidad-ca.html, privacidad-en.html) covering
controller, data collected, purpose, legal basis, retention,
user rights, and explicit no-cookies statement.
- Link to privacy policy from footer of all 4 pages.