Archilyzer · Source

archilyzer

Archilyzer
git clone https://archilyzer.pages.dev/source/archilyzer.git
Log | Files | Refs | README | LICENSE

commit 9384b1a043ea50af087c9681bcb4f5704b156624
parent df66fa359e1f3c532e0f6beb688c8fc6d6302300
Author: I Mean I'm Just Saying <imeanimjustsaying@kiwifarms.st>
Date:   Fri, 25 Sep 2026 23:00:31 -0400

plans: brand + themes — S2 review fixes, the merge of main, and the post-merge gates

The S2 record gains a "Review fixes" paragraph:
- the review-fix shas: sepia status on soft fills, the growth chart's stack
  order, server-rendered dark for the hub and homepage, brand-strong on the
  soft tint, the raw-HTML data-accent check, tone.ts, the glyph-gap cause
  (FreeType hinting; geometricPrecision, form controls included) and the
  ready-marker race;
- the pre-merge gates;
- the merge acd24a18 and S1's leftovers ported (78ed7a71);
- the post-merge gates: common 1,907, editor unit 79, scripts 162+1, mcp 219;
  editor, export site and hub, and homepage builds with icon magic; export 203+1
  (the race, fixed; 39/39 repeated), hub 19, 2origin 3, homepage 27,
  editor 23;
- the post-merge shots.

"Found and left" notes which items the review accepted or fixed. The editor,
export and homepage changelog bullets say the hub and homepage are dark
without JavaScript.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

Diffstat:
Meditor/CHANGELOG.md | 2+-
Mexport/CHANGELOG.md | 2+-
Mhomepage/CHANGELOG.md | 2+-
Mplans/brand-and-themes.md | 64+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++---
4 files changed, 64 insertions(+), 6 deletions(-)

diff --git a/editor/CHANGELOG.md b/editor/CHANGELOG.md @@ -1,7 +1,7 @@ # Changelog ## [Unreleased] -- **Every page now has a ground and an accent to choose, and the five theme families are gone.** The theme menu (the palette button beside the quick toggle, in the editor's sidebar and in the header of every published site, the hub and the homepage) has two groups. **Base** is System, Light, Sepia or Dark; Sepia is new, a warm paper ground for long reading. **Accent** is Signal, Brass, Vermilion, Violet, Sakura, Blue or Green, with the site's own tagged *default*; a site with a custom hex offers it first as *Site colour*. The quick toggle cycles System → Light → Sepia → Dark. A published site opens on the reader's system setting, in the accent its site form sets. The hub and the homepage open on Dark, in Signal, and the editor follows the system, in Signal. Each accent has a value for each ground that reads at 4.5:1, and a custom hex is darkened or lightened per ground to match. A reader's accent is remembered only while it differs from the site's: picking the site's own again forgets it, so the reader follows the site if its accent changes later. Base, Archive, Selenized, Swiss and Archilyzer are gone. A choice made before this update carries over once: light stays light (Archive light becomes Sepia), dark stays dark and system stays system; the family itself is dropped. Headings are Archivo, text is IBM Plex Sans and figures are IBM Plex Mono everywhere, with one corner radius. Chart colours are fixed per ground and never follow the accent; the third is a violet, well clear of the red that marks a recording as gone. The phone's browser bar takes the page's ground, not the accent. Needs a rebuild and deploy of every site, the hub and the homepage. +- **Every page now has a ground and an accent to choose, and the five theme families are gone.** The theme menu (the palette button beside the quick toggle, in the editor's sidebar and in the header of every published site, the hub and the homepage) has two groups. **Base** is System, Light, Sepia or Dark; Sepia is new, a warm paper ground for long reading. **Accent** is Signal, Brass, Vermilion, Violet, Sakura, Blue or Green, with the site's own tagged *default*; a site with a custom hex offers it first as *Site colour*. The quick toggle cycles System → Light → Sepia → Dark. A published site opens on the reader's system setting, in the accent its site form sets. The hub and the homepage open on Dark, in Signal, even with JavaScript off, and the editor follows the system, in Signal. Each accent has a value for each ground that reads at 4.5:1, and a custom hex is darkened or lightened per ground to match. A reader's accent is remembered only while it differs from the site's: picking the site's own again forgets it, so the reader follows the site if its accent changes later. Base, Archive, Selenized, Swiss and Archilyzer are gone. A choice made before this update carries over once: light stays light (Archive light becomes Sepia), dark stays dark and system stays system; the family itself is dropped. Headings are Archivo, text is IBM Plex Sans and figures are IBM Plex Mono everywhere, with one corner radius. Chart colours are fixed per ground and never follow the accent; the third is a violet, well clear of the red that marks a recording as gone. The phone's browser bar takes the page's ground, not the accent. Needs a rebuild and deploy of every site, the hub and the homepage. - **Every site, the hub, the homepage and the editor wear the new Found-line mark, and a site's header splits its wordmark.** The mark is four transcript lines on a rounded square, the second lit and carrying a play head. The favicon, app icons and touch icon are no longer committed files: each build draws them from the mark and writes `/icons/icon.svg`, `maskable.svg`, `icon-32.png`, `icon-192.png`, `icon-512.png`, `maskable-512.png`, `apple-touch-icon.png` and `/favicon.ico` (16, 32 and 48 px). A site's icons are an ink tile lit with its own accent (Signal when it sets none; a custom colour is lightened until it reads on the tile). The hub, the homepage and the editor use the parent mark, bone on slate. The site header shows the mark and the header title split at the site's **Wordmark lead**, the lead heavy and the rest light (Jer|alyzer); with no lead the whole title is heavy. The header mark's lit line will follow the reader's accent once the theme picker lands; the favicon keeps the site's. The footer's "Built with Archilyzer" has the small parent mark in front of it, outside the link. The homepage header shows the parent mark and "Archi|lyzer", no longer in spaced capitals. An installed site's title bar is the dark theme's ground (`#0c0a08`) and its splash the icon's tile, where it used to fall back to blue for a site with a named accent. The service workers' shell cache is renamed to `shell-v2`, so an installed app drops the old icons; readers' offline channel downloads are kept. The editor's sidebar shows the parent mark beside the admin title, and the editor now has a favicon. Needs a rebuild and deploy of every site, the hub and the homepage. - **A site's accent is one of seven named colours or a custom one, and a site can split its wordmark.** The site form's **Brand accent** is now a row of swatches: Signal (the family default), Brass, Vermilion, Violet, Sakura, Blue and Green, plus **Custom**, whose colour goes in the **Custom hex** field (typing there picks Custom). `site.json` stores the accent's id (`"accent": "brass"`) or the hex. Picking Signal stores no key, because no key means Signal. A custom colour is darkened or lightened for each reading theme until it reads at 4.5:1; the seven named colours already do. A new **Wordmark lead** field names the heavy first part of the header wordmark, e.g. `Jer` for Jeralyzer. The form refuses a lead that is not how the header title starts, and `site.json` keeps `wordmarkLead` only when it is. What other hubs read does not change: `/site.json`, the hub's `hub-sites.json` and the homepage summary still carry a hex, and an id goes out as its colour on dark. `SITE.md` lists both keys. The header, icons and theme picker that use them come with the rest of the brand work; until then a site with a named accent is tinted with that colour, as a custom hex is today. - **The hub's search shows each archive's state, lets you choose which archives to search, and no longer waits for the slowest.** Under the line "Searching N archives …" is a row of chips, one per archive on the hub (official and added). Each says whether that archive is loading, how many videos it has in the search once it is in, or that it failed, with a Retry beside it. Pressing a chip takes that archive out of the search: nothing more is fetched from it and its results disappear. The choice is kept in this browser, and an archive it has never seen is searched. The search now runs as soon as one archive has loaded and runs again as each further one arrives, where it used to wait for all of them. When an archive does not answer, a line above the results says so once the others have loaded ("4 of 5 archives answered. Hasanalyzer did not, so its videos are not in these results.") with a Retry, and the other archives' results show as usual. None of that archive's videos, posts or live chat are searched until a Retry succeeds; before, it dropped out silently or in part. Each result names its archive in text before the channel ("Jeralyzer · TheQuartering · 2026-09-25"). The hub now loads at most six summaries pages at a time from each archive, so a large archive does not hold up the small ones. The line under the archives now counts "videos", as the chips do. `/ask` on the hub is unchanged: it searches every archive and waits for all of them. Published sites are unchanged. Needs a rebuild and deploy of the hub. diff --git a/export/CHANGELOG.md b/export/CHANGELOG.md @@ -1,7 +1,7 @@ # Changelog ## [Unreleased] -- **A reader picks a ground and an accent; the five theme families are gone.** The header's theme menu has **Base** (System, Light, Sepia, Dark) and **Accent** (Signal, Brass, Vermilion, Violet, Sakura, Blue, Green, with the site's own tagged *default*, and *Site colour* first on a site with a custom hex). The toggle beside it cycles System → Light → Sepia → Dark; on a phone both lists are in the menu sheet. A site opens on the reader's system setting in the accent from its `site.json`, rendered as `<html data-accent>` so it is right before any script runs; the hub opens on Dark in Signal. A reader's accent is stored only while it differs from the site's. A stored theme from before carries over once (Archive light becomes Sepia) and the old keys are deleted. Type is Archivo, IBM Plex Sans and IBM Plex Mono; charts have fixed colours per ground; the browser bar follows the ground (a light/dark pair for a site, dark for the hub). +- **A reader picks a ground and an accent; the five theme families are gone.** The header's theme menu has **Base** (System, Light, Sepia, Dark) and **Accent** (Signal, Brass, Vermilion, Violet, Sakura, Blue, Green, with the site's own tagged *default*, and *Site colour* first on a site with a custom hex). The toggle beside it cycles System → Light → Sepia → Dark; on a phone both lists are in the menu sheet. A site opens on the reader's system setting in the accent from its `site.json`, rendered as `<html data-accent>` so it is right before any script runs; the hub opens on Dark in Signal, already in the server markup. A reader's accent is stored only while it differs from the site's. A stored theme from before carries over once (Archive light becomes Sepia) and the old keys are deleted. Type is Archivo, IBM Plex Sans and IBM Plex Mono; charts have fixed colours per ground; the browser bar follows the ground (a light/dark pair for a site, dark for the hub). - **The Found-line mark, and a split wordmark.** The site header's rotated square is now the family mark — four transcript lines on an ink tile, the second lit with the site's accent and carrying a play head — and the header title splits at the site's `wordmarkLead` (heavy lead, light rest: Jer|alyzer). The hub wears the parent mark, bone on slate, and splits as Archi|lyzer. The footer credit has the small parent mark before "Built with"; the link's name is still exactly "Archilyzer". The icons are no longer committed: `app/icons/[file]/route.ts` and `app/favicon.ico/route.ts` render them from `common/lib/brand.ts` at build (static export writes `out/icons/*` and `out/favicon.ico`), lit with the site's accent. `<head>` links `icon.svg` first, then `icon-32.png`, 192, 512 and the touch icon. The manifest lists `icon.svg` (sizes "any"); its `theme_color` is the dark base's ground `#0c0a08` and its `background_color` the icon's tile. Both service workers rename only their shell cache (`shell-v2`) so installed apps drop the old icons; the data caches, and readers' offline downloads, are kept. ## [0.8.7] - 2026-08-12 diff --git a/homepage/CHANGELOG.md b/homepage/CHANGELOG.md @@ -2,7 +2,7 @@ ## [Unreleased] -- **The homepage opens on the Dark ground in Signal, and a reader can pick another ground or accent.** +- **The homepage opens on the Dark ground in Signal, even with JavaScript off, and a reader can pick another ground or accent.** The theme menu has **Base** (System, Light, Sepia, Dark) and **Accent** (the seven named accents, Signal tagged *default*); the toggle cycles System → Light → Sepia → Dark. The old Archilyzer theme family is gone, and so are the other four: the dark ground is now the warm ink diff --git a/plans/brand-and-themes.md b/plans/brand-and-themes.md @@ -963,10 +963,11 @@ describes the committed icons, which is S1's, so it was left. - **chart-4 (amber) and chart-5 (magenta) sit near the gone red.** Normal ΔE to `--state-gone` is 11.8–14.5 on the three bases, below the validator's floor of 15 for a pair. The gate the plan asked for is chart-3, and it clears widely. Every warm hue flanks red, and gone never draws inside a chart. The homepage's five - official instances do reach slots 4 and 5. + official instances do reach slots 4 and 5. **The review accepted this:** gone is drawn only as labelled + text. - **No-JS readers get the light block.** The server renders no `data-base`, so a page no script has run on - shows the light base, as the old base family's light look did before. The hub and the homepage are - therefore light without JS. + shows the light base, as the old base family's light look did before. **Fixed in review for the hub and + the homepage**, which now render dark on the server; a site's "system" base still cannot be. - **theme-color after client navigation is not asserted.** Next may re-render its head metas on client navigation; the provider re-asserts theme-color only on a theme change. - **Two changelogs gained an `[Unreleased]` section:** `export/CHANGELOG.md` and `homepage/CHANGELOG.md` @@ -975,6 +976,63 @@ describes the committed icons, which is S1's, so it was left. - **`export/out` holds the brass shot build**, not a gate build, and this worktree's `homepage/public` holds copied data (gitignored). +**Review fixes** (review verdict SHIP AFTER FIXES: `$T/s2-review.md`; no must-fix). + +| sha | fix | +|---|---| +| `4c78c16a` | Sepia status text now reads at 4.5:1 on its own soft fill over the ground and a card: warning `#8c4c00` (4.65 / 4.96), info `#1858bc` (4.74 / 5.07), and success `#256829` (4.73 / 5.05; the new test found it at 4.49). Dark gone-soft alpha drops to 0.12 (4.94 / 4.60; it was 4.37 over a card). `themeTokens.test` checks text-on-soft for five pairs on sepia and dark. Light's success and warning (4.18 / 3.89) predate S2 and are left. | +| `712257e0` | The homepage growth chart stacks in palette order, `STACK_ORDER = [0,1,2,3,4]`. The old interleave put green against magenta in the CVD floor band (6.3 / 7.2 / 6.9). In stack order every touching pair passes on all three bases (worst CVD 13.1 / 13.5 / 15.5; `$T/s2-dataviz-stack.log`). | +| `e80af0b8` | The homepage and the hub (export with `defaultBase === "dark"` only) server-render `class="… dark"` and `data-base="dark"`. A new homepage spec runs with `javaScriptEnabled: false` and checks `data-base`, `.dark`, `data-accent`, that there is no ready marker, `--background` `#0c0a08` and the body's background. The Light reader's reload is re-checked after load. | +| `38b03890` | Accent text on its soft tint is `text-brand-strong` (≥ 6.48:1 on every base; plain `text-brand` went as low as 3.96). Six places use it: the Badge `brand` variant, the editor's SidebarBadges, export ContextPanel, OfflineManager ×2, HubOfflineManager and `downloads/page.tsx`. None of C2's files had one. | +| `1c72eda1` | `site-branding` reads the raw HTML of `/` and finds `<html … data-accent="custom">` and the inline `--accent-custom-light`. `tone.ts`'s header names the three bases. | +| `86a8dfa7`, `16e3d2c1` | Glyph gaps at 390 px. They persisted after `document.fonts.ready`, appear at DPR 2 and 3 with or without mobile emulation, and are absent at DPR 1. **The cause is font hinting**, not letter-spacing, font-stretch or justification. IBM Plex Sans ships TrueType hinting, and Chromium on Linux (FreeType) rounds each hinted advance to a whole CSS pixel: at 14px the `g` of "Light" measured 9px against a 7.41px design width. `text-rendering: geometricPrecision` fixes it, on `html` and on `button, input, select, textarea`, because the UA sheet resets form controls to `auto` ("Res ults"). `themeTokens.test` pins the rule. | +| `e3e3fb26` | The no-flash specs' ready-marker wait is `document.documentElement?.…`. Right after a `commit` reload the new document can have no root, and one post-merge run failed on exactly that (`theme.spec.ts:96`). | + +- **Pre-merge gates:** + - tsc clean (two runs); + - common 1,894, editor unit 78; + - export build ok (24 s), homepage build ok (17 s); the homepage's `<html>` is + `antialiased dark" data-base="dark" data-accent="signal"`; + - e2e: export `theme`, `theme-accent` and `site-branding`, **13 passed** (37 s); homepage full, + **25 passed** (39 s); hub, **12 passed** (29 s). +- **Merge of `main` (`575ae1d4`, S0 + S1 + release 9 C2/C3), `6456ac6c`.** Conflicts were the export + layout's import block (both sides kept), the three `[Unreleased]` changelogs (every bullet) and this file + (records in slice order). `accent.ts` merged cleanly. `33344d66` ports S1's leftovers: + - Wordmark's font is `var(--font-display)`; `--font-grotesk` is gone; + - the header mark's comment no longer says `--brand-mark` is undefined. Its + `var(--brand-mark, var(--brand))` picks up the token. + - Nothing else of S1's or C2's reads the old theme API. `manifest.ts` and the icon routes compile + against the new `accent.ts`. +- **Post-merge gates:** + - tsc clean before each commit; + - common **1,907**, editor unit **79**, `test:scripts` **162 + 1 skip**, mcp **219**. + - Builds: + - editor ok (38 s); + - export site ok (23 s), and hub mode (`INSTANCE_MODE=hub`) ok (25 s); + - homepage ok (14 s). + - Each export/homepage build has the seven `out/icons` files with PNG magic and IHDR + 180/192/32/512/512, and `favicon.ico` starts `00 00 01 00 03 00`. The site icon is lit Signal + `#5fa8a0`; the hub and homepage icons are the parent mark `#151b20 / #3f4c56 / #e7edf1`. The hub + and homepage `<html>` carry `dark` and `data-base="dark"`; the site's carries neither. + - e2e: + - export full, **203 passed, 1 failed**, 7.0 min. The failure is the ready-marker race above; after + `e3e3fb26`, `theme`, `theme-accent` and `site-branding` `--repeat-each 3` gave **39 passed** + (1.4 min). + - `e2e:hub` **19 passed** (38 s). + - `e2e:2origin` (`TWO_ORIGIN_REBUILD=1`) **3 passed** (37 s). The composed entries in + `export/public` were swapped for copies first, then relinked. + - homepage full **27 passed** (39 s). + - editor `theme`, `branding` and `sites-crud` **23 passed** (53 s). + - The primary checkout's `export/public` was never written: `sw.js` is 10,027 B, mtime 20:47:37, and + the seven composed files kept their mtimes. + - `16e3d2c1` (the CSS rule extended to form controls) came after the e2e runs. It was gated by tsc, + common 1,907, the token test and a rebuild. +- **Post-merge shots** (`$T/s2-merged-*.png`, served `out/` on localhost, all looked at): + - the site on light + brass, sepia + violet and dark + brass at 1280. S1's mark sits on its ink tile, + lit by `--brand-mark`: `#e3b15c` for brass, `#b49cf2` for violet. The wordmark is Archivo; + - the hub on its dark default: the parent mark, and `data-accent="signal"`; + - the 390 px phone menus on sepia and dark at DPR 2, after `fonts.ready`: no glyph gaps. + ## Operator rollout (after merge) 1. Restart the live :3001 editor on the new `main`; it needs S0's form.