commit a1e278aab30dbea579de10cd833a07e50dfed5f1
parent 0671eb8c2c5628d22d39af4bc76090906f327725
Author: I Mean I'm Just Saying <imeanimjustsaying@kiwifarms.st>
Date: Mon, 28 Sep 2026 00:28:28 -0400
plans: slice MR as shipped — a 1px ring outside the mark's tile on dark, in the palette's dim (#6b5d47 3.09:1, #586977 3.48:1 on ink); full dim chosen over 60% and an inside ring; brand-and-themes' mark section notes it, dated
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Diffstat:
2 files changed, 81 insertions(+), 0 deletions(-)
diff --git a/plans/brand-and-themes.md b/plans/brand-and-themes.md
@@ -62,6 +62,13 @@ saturation and sit just over 3:1 (3.09, 3.06), because the two rules multiply to
the darkest lit values leave little room: Vermilion is 2.28:1 over the child dim, and Signal on
the Media slate 2.05:1.
+**On the dark base the in-page mark's tile has a 1px ring** (2026-09-28, release 10, slice MR;
+`release-10.md`): the operator asked for "a thin outline to the tile on dark", because the child's
+ink tile is the dark page itself and the slate is 1.14:1 on it. `BrandMark` draws it outside the
+tile, following its corner (`border-radius` 21.875% = rx 112 of 512), in the palette's own dim
+(`#6b5d47`, `#586977`: 3.09:1 and 3.48:1 on the ink page), as a box-shadow under `.dark` only, so no
+layout moves and light and sepia are unchanged. The icon files carry no ring.
+
Icon variants:
- `any`: `rx=112`.
- `maskable`: full-bleed ground, the mark scaled 0.8 about (256,256).
diff --git a/plans/release-10.md b/plans/release-10.md
@@ -2076,6 +2076,80 @@ also had adjacent in the other order. No chart change is owed.
rebuilt for the swap. The regenerated YouTube picture, watermark and banner are the operator's to
upload in Studio (`INDEX.html` has the steps).
+### Slice MR, as shipped — mark ring on dark (2026-09-28)
+
+The operator's ask (2026-09-28): **"Add a thin outline to the tile on dark."** Slice MC left it as
+found: on the dark base a site's ink tile is the ink page itself (`#0c0a08` on `#0c0a08`) and the
+parent's slate `#151b20` is 1.14:1 on it, so the mark read as four lines with no tile. Branch
+`r10/mark-ring` off `main` `6db8fcda`, worktree `/home/user/Projects/r10-mark-ring`, one Opus
+implementer. Scratch files `mr-*` in the job's `tmp/brand`.
+
+**What shipped.** `BrandMark` (`common/components/BrandMark.tsx`) draws a **1 CSS px ring outside
+the tile, only when `.dark` is on `<html>`** (tokens.css's `@custom-variant dark`), in the palette's
+own **dim**: `--mark-ring` is set from `palette.dim` in the svg's `style`, so a site mark rings in
+`#6b5d47` and the parent mark in `#586977`, and the ring reads as part of the mark. The classes are
+one literal, `BRAND_MARK_RING_CLASS`: `rounded-[21.875%] overflow-visible
+dark:shadow-[0_0_0_1px_var(--mark-ring)]`.
+- A **box-shadow**, so it takes no layout: the mark is 28 × 28 (16 × 16 in a footer) on every base,
+ and the header does not move.
+- `rounded-[21.875%]` is the ground's `rx` (112 of 512; the unit test holds the two equal), so the
+ ring follows the tile's corner. **`overflow-visible` is needed**: an `<svg>` clips its content by
+ default, and with a radius that clip is a second anti-aliased edge over the ground's own corner
+ (at 2×, 70 px of the site header and 84 px of the homepage's differed from main by up to 7 levels;
+ without the clip, 2 px by ≤ 2).
+- Light and sepia render **pixel-identical to main** (0 px differ, site Brass and Blue, hub and
+ homepage, on both).
+- Every `BrandMark` use draws the tile, so all five get the ring: the export header, the footer
+ credit, the hub header (and its footer), the homepage header, the editor sidebar. The icon files
+ (`markSvg`: favicons, app icons, the OG image, the YouTube assets) are untouched.
+
+**The variant, and why.** Screenshotted at 2× on dark from this branch's builds, the site (Brass) and
+parent marks (`mr-variants-header.png`, `mr-variants-zoom.png`): the full dim outside (chosen); the
+same at 60 % (`#453c2e` on ink, **1.82:1**, and `#3a434b` 1.96:1): it reads as a smudge rather than
+an edge at 1 px; and a ring 1 px inside the edge (an `outline` at offset −1px): it eats a pixel of the
+tile, so the tile looks smaller on dark than on light and the ring crowds the lines. The full dim is
+**3.09:1** on the ink page (child) and **3.48:1** (parent; 3.06 on its own slate), the same WCAG
+1.4.11 floor the dims meet, and at 1 px against the lines' ~2.4 px it reads as the tile's edge
+without competing with them; the lit line stays the found line. Crisp at DPR 1, 2 and 3
+(`mr-dpr.png`: the straight edges are one, two and three full device pixels).
+
+| sha | what |
+|---|---|
+| `c5fc5bb3` | `common:` the ring — `BRAND_MARK_RING_CLASS`, `--mark-ring` from `palette.dim`; `BrandMark.test.ts` (4 tests) |
+| `eb680a9c` | `e2e:` the export, hub and homepage `brand.spec`s and the editor's `branding.spec` read the computed box-shadow on dark, light and sepia |
+| `14fd9f62` | `changelogs:` a new `[Unreleased]` above `[0.9.3]` in export and editor; a bullet in the homepage's |
+| _this_ | `plans:` this record; a dated note in `brand-and-themes.md`'s mark section |
+
+**Gates** (logs `mr-*.log`):
+- **tsc** clean (64 s) on the code tree of `eb680a9c`; the later commits are Markdown only.
+- **common 2,038/2,038** (2,034 + 4), editor unit **85/85**, `test:scripts` **174 + 1 skipped**, mcp
+ **269/269**, homepage unit **2/2**.
+- **They bite:** with the shadow class removed, 1 of the 4 unit tests fails, the export `brand.spec`
+ 1 failed / 5 passed and the homepage's 1 failed / 2 passed (`ring: []` where the dim was expected).
+- **Builds:** editor ok (43 s), export site ok (29 s), export hub ok (26 s; `out/ask` present),
+ homepage ok (14 s). Each built stylesheet carries
+ `.dark\:shadow-\[0_0_0_1px_var\(--mark-ring\)\]:where(.dark,.dark *)` and
+ `.rounded-\[21\.875\%\]`; the site's `index.html` sets `--mark-ring:#6b5d47` (header) and
+ `#586977` (footer), the hub's `#586977` twice, the homepage's once. The primary's `export/public`
+ byte-identical before and after the builds and the e2e.
+- **e2e** (no queue wait, nothing failed, so no re-runs): export `brand` + `site-branding` + `theme` +
+ `theme-accent` **20 passed** (55 s); `e2e:hub` **26 passed** (63 s); homepage full **21 passed, 8
+ skipped** (39 s; no summary on disk in a fresh worktree, see below), then with the primary's
+ `homepage/public` data copied in **29 passed** (49 s); editor `branding.spec` **4 passed** (31 s).
+- **Visual** (`mr-compare.png`): the site header in Brass and Blue, the hub and the homepage, on dark
+ and light at 2×, before (main's `<svg>` re-created: no radius, the default clip, no shadow) and
+ after; the footer credit on dark (site and hub); the two marks on dark at 3×.
+
+**Found and left**
+- **A fresh worktree's homepage e2e skips 8 specs** (`stats.spec` ×7, `instance-colours.spec`) unless
+ `homepage/public`'s gitignored data (`homepage-summary.json`, `channel-sites.json`, `stats/`,
+ `downloads/`) is copied from the primary: the specs skip on "no summary on disk", so the run is
+ green but short. Copied here (not linked, so nothing can write through).
+- **The ring is a box-shadow, which forced-colours mode (Windows High Contrast) removes**; the mark
+ then looks as it does on `main`. Not asked, not tested.
+- **The live sites carry none of this until rebuilt:** every export site and the hub, the homepage,
+ and the editor on its next restart.
+
## Rollout
Nothing is rolled out, except that **Jeralyzer is already on the brand, in Signal** (a build-deploy