Files
2026-08-03 15:02:57 -07:00

102 lines
3.9 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
name: example-com-intro
source: https://example.com (live capture, 2026-08-03)
format: 1920x1080
colors:
canvas: "#E9E9E7" # the page's #EEEEEE stepped down ~3% so the plate lifts off it
surface: "#EEEEEE" # the captured page's own background — the plate
ink: "#1B1B1B" # the page's #000 at .8 opacity, resolved
ink_muted: "#5A5C63" # supporting copy
accent: "#334488" # the page's own link colour
hairline: "#D6D6D6" # plate edge
caption_bg: "#1B1B1B"
caption_idle: "#9A9A9A"
caption_active: "#FFFFFF"
fonts:
display: "Inter" # 900 only
body: "Inter" # 400 only
mono: "IBM Plex Mono" # 400 only
type_ramp:
title: "132px / 1.02 / -0.035em / 900"
address: "42px / 1 / 0 / 400 mono"
support: "38px / 1.45 / -0.005em / 400"
caption: "42px / 1.2 / -0.005em / 700"
radius: "10px"
motion:
ease: "power4.out for reveals, power3.out for copy, expo.out for rules"
reveal: "cued to the narration's measured word timings — never front-loaded"
idle: "none; the film holds still rather than drifting"
---
# frame.md — example.com intro
## Where the palette comes from
Nothing here is chosen by taste. `capture/extracted/tokens.json` reports three colours
on the live page — `#EEEEEE`, `#000000`, `#334488` — and its CSS resolves them:
```css
body {
background: #eee;
font-family: system-ui, sans-serif;
}
div {
opacity: 0.8;
} /* so #000 ink actually reads as ~#333 */
a {
color: #348;
} /* → #334488 */
```
One value is **derived, not read**: the composition canvas. If the frame were also
`#EEEEEE`, the captured plate would have the same fill as the ground and only its
border would separate them. Stepping the canvas down to `#E9E9E7` gives the plate
somewhere to lift from, which is why its shadow reads at all.
## Type
Only weights the renderer actually embeds:
| Role | Family | Weight | Why |
| ------- | ------------- | ------ | ---------------------------------------------------- |
| Title | Inter | 900 | bundled; the lockup's whole job is mass |
| Body | Inter | 400 | bundled |
| Address | IBM Plex Mono | 400 | bundled; mono says "this is a literal string" |
| Caption | Inter | 700 | bundled; the heaviest weight that is not the title's |
Weights 500 and 600 are **not** in the embedded bundle. Asking for them means the
render machine synthesises or substitutes, and preview stops matching output. Snap to
400 / 700 / 900.
## The one graphic device
A single accent family, three instances, each with a job:
1. **Top rule** — 6px, full bleed. The frame asserting itself at t=0.1.
2. **Brand bar** — 200×8px under the title. Separates the name from the address.
3. **Page marker** — 5px vertical, inside the plate, beside the page's own content block.
This is the film's argument: _those are the page's words, not ours._
Anything that is not one of those three is not in this composition. No sheen, no
ambient bloom, no grid or paper texture, no gradient mesh, no drifting camera.
## The plate rule
The capture is a 1x, 1920×1080 screenshot. It is displayed through a 1000×400 window
with `object-fit: none`, so the page renders at exactly 1:1 and its real 16px body
text is as crisp as it is in a browser.
Consequences, and they are hard rules:
- **Never scale the plate.** Any zoom past 1:1 resamples a 1x capture into mush.
- **Never rotate the plate.** A 3D tilt does the same thing more expensively.
- Entrance is `x` translate + opacity only.
## Caption skin
Fixed lower band, `184px` tall (17% of the canvas), reserved structurally — the stage
ends where the band begins, so nothing can ever collide with it. Dark pill, centred,
one phrase group visible at a time, per-word emphasis by luminance only
(`#9A9A9A → #FFFFFF`). No colour flashing, no scale popping, no scatter exits, no
random placement.