Cut the provenance and the regeneration appendix. Here it is:
---
# Build this page
Single-screen landing page. Vanilla HTML/CSS/JS — no frameworks, no build step, no external fonts or scripts. Every number below is final; don't improvise or substitute.
Files:
```
index.html
styles.css
app.js
assets/hero.webp 2560×1429 RGB
assets/hero-cutout.webp 2560×1429 RGBA
assets/card-ridge.jpg 480×360
assets/card-baths.jpg 400×500
```
Serve with `python3 -m http.server 4173`.
## 1. Assets
Download:
- **HERO** 5504×3072 — `https://d8j0ntlcm91z4.cloudfront.net/user_38xzZboKViGWJOttwIXH07lWA1P/hf_20260814_032321_ca06c649-15e1-4bdd-b0e1-d99eb2efb06d.png`
- **CUTOUT** 2048×1143 RGBA — `https://d8j0ntlcm91z4.cloudfront.net/user_38xzZboKViGWJOttwIXH07lWA1P/hf_20260814_032749_d6e6ac55-933e-4474-ad35-7e283b8becc9.png`
- **RIDGE** 4800×3584 — `https://d8j0ntlcm91z4.cloudfront.net/user_38xzZboKViGWJOttwIXH07lWA1P/hf_20260814_032325_e46e72c6-5c04-4915-a9a0-d063acb30385.png`
- **BATHS** 3712×4608 — `https://d8j0ntlcm91z4.cloudfront.net/user_38xzZboKViGWJOttwIXH07lWA1P/hf_20260814_032328_c50d9711-69b3-4f5b-9b7e-2980447b7af3.png`
Process with PIL exactly:
```python
from PIL import Image
W, H = 2560, 1429
hero = Image.open('HERO.png').convert('RGB').resize((W, H), Image.LANCZOS)
hero.save('assets/hero.webp', quality=84, method=6)
# Cutout = ORIGINAL hero RGB + remover's ALPHA. Never the remover's own RGB
# (its matte fringe glows when composited over the identical backdrop).
cut = Image.open('CUTOUT.png').convert('RGBA')
alpha = cut.split()[3].resize((W, H), Image.LANCZOS)
out = hero.copy(); out.putalpha(alpha)
out.save('assets/hero-cutout.webp', quality=88, method=6)
Image.open('RIDGE.png').convert('RGB').resize((480, 360), Image.LANCZOS).save('assets/card-ridge.jpg', quality=90)
Image.open('BATHS.png').convert('RGB').resize((400, 500), Image.LANCZOS).save('assets/card-baths.jpg', quality=90)
```
## 2. Font
```
"Helvetica Neue", "HelveticaNeue", Helvetica, "Inter Tight", "Segoe UI", Arial, sans-serif
```
Weights: **700** H1 only; **500** nav pills, intro head, card `h3`, mobile menu links; **400** everything else; *italic 400* for `{ 2026 }`. Add `-webkit-font-smoothing:antialiased; -moz-osx-font-smoothing:grayscale`.
## 3. Sizing system
Design frame **1200 × 675**. `--u` is one design pixel:
```css
:root{ --u: 0.08333333vw; } /* 1200 design px === 100vw */
```
Every size below is in design px → write as `calc(N * var(--u))`. Vertical anchors are `top: calc(Y / 675 * 100%)`. At ≤1000px `--u` rebases to `1px` (§8).
Tokens: `--ink:#ffffff` · `--ink-dim:rgba(255,255,255,.78)` · `--glass:rgba(22,20,18,.28)` · `--glass-line:rgba(255,255,255,.30)` · `--e:cubic-bezier(.16,1,.3,1)`. Body `background:#0d0f10; overflow-x:hidden`, universal `box-sizing:border-box`.
## 4. Layer stack
`section.hero`: `position:relative; height:100svh; min-height:430px; overflow:hidden; isolation:isolate`.
```
z1 img.hero__bg assets/hero.webp
z2 div.hero__scrim
z3 h1.hero__title
z4 img.hero__cutout assets/hero-cutout.webp
z5 .nav .intro .pins .scroll
```
The headline sits between the two plates, so the cabin, deck, tub and chimney occlude it.
Both plates get identical geometry — `position:absolute; inset:0; width:100%; height:100%; object-fit:cover; object-position:center center; pointer-events:none; user-select:none; -webkit-user-drag:none` — **and the same animation** `plate-in 2s var(--e) both`, which keeps them pixel-registered through the zoom.
Scrim:
```css
background:
linear-gradient(to bottom, rgba(0,0,0,.30) 0%, rgba(0,0,0,0) 26%),
linear-gradient(to top, rgba(0,0,0,.34) 0%, rgba(0,0,0,0) 34%),
radial-gradient(120% 90% at 50% 45%, rgba(0,0,0,0) 42%, rgba(0,0,0,.30) 100%);
```
## 5. Markup — verbatim
Head: `
Norvik Slowhouse`; meta description `A slow house in the northern woods — open-sky pools, unbroken quiet.`; viewport `width=device-width, initial-scale=1, viewport-fit=cover`; ``; stylesheet. Body ends with ``.
```html
NorvikSlowhouse
We shaped a stillnessamong the pines thatrenews
Each stay is a quiet exchange
of distance and warmth, arranged
to bring you back to yourself.
For those who value their
own pace and choose
to keep it unhurried.
{ 2026 }
Vinterfjellet Ridge
Pines beyond the window hold the quiet. And the stream below is not loud, but steady.
Open-sky pools
Just arrive. And rest. Two of you. Or one. In unbroken quiet.