# 0047. Nothing above the fold waits for JavaScript

- **Status:** Accepted
- **Date:** 2026-09-24

## Context

Two rules made the largest element of a page invisible until the bundles had run — later still once they were
deferred: lazy images sat at `opacity: 0` until `LazyImage.js` added `-loaded`, and every Swiper slide was
transparent until Swiper marked the visible one. The first hero slide and the first card image were also lazy.

## Decision

The fade is a CSS animation on `img[loading=lazy]`; `LazyImage.js` is gone. The first slide is visible while
the swiper is not initialised. The first slide, the first news tile, the article's photo and the storage page's
photo are eager with `fetchpriority="high"`. Floor plan labels stay hidden until positioned against the loaded
image, so their move is not a layout shift.

## Consequences

- Exactly one image per page should carry `priority`; two compete.
