diff --git a/apps/web/src/lib/styles/letterhead.css b/apps/web/src/lib/styles/letterhead.css index 54eebd0..15da1b5 100644 --- a/apps/web/src/lib/styles/letterhead.css +++ b/apps/web/src/lib/styles/letterhead.css @@ -3,6 +3,23 @@ layout stays with each page; this file owns the look of the paper and everything written on it. */ +/* Painted at the root, as in SiteLayout: the default body margin would frame + the page in the root background, and overscroll shows the root color. */ +body:has(.letterhead) { + margin: 0; +} + +html:has(.letterhead) { + background: #f7f3ea; + color-scheme: light dark; +} + +@media (prefers-color-scheme: dark) { + html:has(.letterhead) { + background: #101520; + } +} + .letterhead { --paper: #f7f3ea; --paper-sunk: #efe9dc; diff --git a/docs/NEXT.md b/docs/NEXT.md index 14b17f8..554e455 100644 --- a/docs/NEXT.md +++ b/docs/NEXT.md @@ -2,7 +2,7 @@ The flight plan. Each item carries enough context to start cold; update this file whenever an item lands (move it to "Done") or a new one is queued. Decisions made while working an item still go through `decisions/` as usual. -_Last updated: 2026-08-26 (**PRs #27, #28 and #31 are all merged and deployed.** mooring.page now serves the demo-first landing page (PD-10) — verified live: the apex carries the Open Graph card, `/s/jzweifel.dev` renders with the claim banner and `noindex`, and the domain lock, sign-off band and republished `signOff` lexicon from the earlier PRs are all in place. **PR #33 is merged and deployed too** — the postmark cut-off fix and the landing footer's attribution row (both below), smoke-tested live. **In flight: draft PR #35** dresses the /admin pages and the login page in the site letterhead — palette and control skin extracted to `lib/styles/letterhead.css` (class-scoped, both color schemes), a new `admin/+layout.svelte` with masthead nav on top, replacing the bare system-ui defaults; verified in-browser both schemes at desktop and 375px. The queue below is otherwise current. Critique trends, two separate targets: the rendered **theme** ran 25 → 31 → 29 → 32, and the **landing page** has one run at 21/40 — snapshots in `.impeccable/critique/`)._ +_Last updated: 2026-08-27 (**PRs #27, #28 and #31 are all merged and deployed.** mooring.page now serves the demo-first landing page (PD-10) — verified live: the apex carries the Open Graph card, `/s/jzweifel.dev` renders with the claim banner and `noindex`, and the domain lock, sign-off band and republished `signOff` lexicon from the earlier PRs are all in place. **PR #33 is merged and deployed too** — the postmark cut-off fix and the landing footer's attribution row (both below), smoke-tested live. **PR #35 is merged and deployed** — the admin and login pages wear the site letterhead (details below). **In flight: a draft PR** fixes the white frame it shipped with: the `body { margin: 0 }` reset lived only in SiteLayout's `:global` styles, so routes that never bundle SiteLayout kept the default body margin; `letterhead.css` now resets body margin and paints `html` (background + `color-scheme`) via `:has(.letterhead)`, mirroring SiteLayout's own root treatment. The queue below is otherwise current. Critique trends, two separate targets: the rendered **theme** ran 25 → 31 → 29 → 32, and the **landing page** has one run at 21/40 — snapshots in `.impeccable/critique/`)._ ## Where things stand @@ -34,6 +34,7 @@ Done so far: OAuth login (loopback dev client; hosted-client path ready pending ## Done +- 2026-08-27 — **The admin and login pages wear the site letterhead** (PR #35, merged and deployed 2026-08-27). The /admin routes and the sign-in page were bare system-ui defaults next to a landing page with a committed identity. The palette and control skin now live once in `apps/web/src/lib/styles/letterhead.css`, class-scoped under `.letterhead` (airmail stripe, paper/ink/terracotta tokens in both color schemes, serif body with the mono-uppercase system voice, one skin for inputs/buttons/links/notices/`code`), imported by a new `admin/+layout.svelte` — masthead nav (Overview / Pages / Hosting, current section marked), container sizing, valediction footer — and by the login page. The admin pages shed their ad-hoc styles and hardcoded colors; per-page "← Admin" back-links gave way to the persistent nav; destructive actions (Delete, Remove, Release, Sign out) wear a quiet outline that warms to `--warn` on hover; the hosting page's paused notice traded its side-stripe for a sunk paper panel. Verified in-browser (login at the real route, admin via a temporary unauthenticated preview route, deleted before commit) in both schemes at desktop and 375px. Shipped with one bug — the white body-margin frame — fixed in the follow-up noted above. - 2026-08-26 — **The landing footer names a human and points at the source** (PR #33, **merged and deployed 2026-08-26**; verified live on mooring.page — both links present and resolving). Jacob's call: the page asked visitors to trust it with their handle while offering no way to find out who wrote it or read the code. The footer row now reads "Made for the Atmosphere by **Jacob Zweifel**" (→ `jzweifel.dev`, itself a Mooring site, so the byline doubles as a second example) and "**Source on Tangled (AGPL-3.0)**" (→ `tangled.org/jzweifel.dev/fahrenheit`, the canonical URL for the `sh.tangled.repo` record in Jacob's PDS; the GitHub mirror is deliberately not linked — the Atmosphere-native forge is the one that fits the pitch). Link styling and the negative-margin tap padding are lifted from the site theme's own footer, and the connecting rule now hides below 40rem the way the theme's does, so the wrapped three-line stack on a phone has no squeezed rule in it. No new colors: the links inherit `--muted`, which clears 4.5:1 on paper in both schemes (5.05 light, 5.41 dark) and stays underlined. **This closes the "substantiate the ownership claim" clause of the queued landing-critique item** ("you've built a rendering engine and put a text ad in front of it" and the rest still stand). Verified at desktop and 375px. - 2026-08-26 — **The sign-off postmark stopped cutting off long handles** (PR #33, **merged and deployed 2026-08-26**; verified live at `mooring.page/s/timheffley.xyz` — the handle sits whole inside the ring, server-rendered `--handle-chars:14`, and no `text-overflow` remains in the served CSS). A new user's site — `timheffley.xyz`, 14 characters — rendered as "TIMHEFFLEY.X…" in the postmark ring. The ring's type was fixed at 0.62rem with `white-space: nowrap` + `text-overflow: ellipsis`, so every handle wider than the ring was guaranteed to truncate; `timheffley.xyz` was simply the first one to cross the line. The handle span now carries `--handle-chars` from `site.handle.length` and sizes itself: `clamp(0.45rem, calc(5.9rem / (0.74 * var(--handle-chars))), 0.62rem)` — the design's size for short handles, shrinking through the middle, floored where the mono type stops being readable, and past the floor `overflow-wrap: anywhere` wraps to a second line instead of truncating. The ellipsis is gone rather than layered over. The arithmetic only works because the ring is monospace (character count *is* text width at ~0.74em per character including tracking); the usable 5.9rem is the 7.5rem diameter less the 2px ring, which `box-sizing: border-box` folds in, and the 0.5rem padding — a first pass at 6.3rem overflowed by 1.4px and wrapped. Verified in a browser against the live render of `/s/timheffley.xyz`: 14 characters on one line inside the ring, `jacobzweifel.bsky.social` (24) and a 31-character DID fallback wrapping to two, none clipped. The landing page's postmark reads a hardcoded `mooring.page` and the OG card is a static PNG, so neither shares the fault. - 2026-08-25 — **The demo-first landing page landed** (PD-10). The apex asks for a handle ("Your site is already written.") and redirects to `/s/[handle]`, resolving the handle server-side so a typo fails inline instead of 404ing; input is normalized (trim, lowercase, leading `@` dropped) by a helper shared with the login action. Every `/s/` preview now renders a claim banner — "This is me — claim it" links to `/login?handle=…` prefilled (deliberately one click, never straight to `authorize()` on GET: prefetchers and crawlers would fire real OAuth flows) — and always carries `noindex`, since the preview path is never the canonical address and unclaimed handles shouldn't rank. The landing page finally wears the site theme (airmail band, warm paper, postmark "par avion"). Found and fixed in verification: the banner needed `color-scheme: dark` so auto-darkening browsers (Chrome's force-dark, default on many Androids) don't invert its hardcoded navy. Banner shows unconditionally on `/s/`, owner or not — revisit if it grates. **Merged as PR #31 and deployed 2026-08-26**, with the critique fixes below in the same deploy; smoke-tested live (apex OG tags, `/s/` preview + banner + `noindex`).