Archilyzer · Source

archilyzer

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

commit 7481dfe475140a6239342d065b5c7b755ae0e2d9
parent ae7d4004e129891cfe0c551f3a84fe36e5a185b3
Author: I Mean I'm Just Saying <imeanimjustsaying@kiwifarms.st>
Date:   Tue, 29 Sep 2026 00:47:33 -0400

plans: the narrow header re-measured after the gap ruling (every real title in full at 360 px under touch); the re-review's findings to their commits; N4 ruled as built; the Rollout marks the link before any build (N3); STATE; the plan; the changelogs

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>

Diffstat:
Mexport/CHANGELOG.md | 2+-
Mhomepage/CHANGELOG.md | 2+-
Mplans/STATE.md | 17+++++++++++------
Mplans/export-header-first-search.md | 4++++
Mplans/release-14.md | 127+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--------------------
5 files changed, 112 insertions(+), 40 deletions(-)

diff --git a/export/CHANGELOG.md b/export/CHANGELOG.md @@ -5,7 +5,7 @@ - **A social icon that fails the check is shown as its label, and every icon paints inside its box.** The footer inlines a social link's SVG only if it passes the same check a save runs (what an icon may contain is in `SITE.md`); otherwise the link shows its label as text, at most 10rem with an ellipsis. Each icon is clipped to its own box. Needs a rebuild and deploy of each site. - **A chart's stacked bars are separated by a 2 px gap in the chart card's colour.** A stacked bar's segments were drawn touching; they now have a 2 px gap in the card's colour between them, and in high-contrast mode the system's background colour. Stacked areas keep their line in each series' colour along the top, charts of one series, line charts and side-by-side bars are unchanged. Needs a rebuild and deploy of each site. - **Two grounds, Light and Dark, and each site in its own accent.** The third ground, the warm paper one, is gone: the header's toggle cycles System, Light and Dark. A reader who had chosen it gets Light, before the page first paints and with no other ground on the way, and the stored choice becomes Light (the old paper theme's `archive` + `light` too). The theme menu's accent picker is gone from the header and the slide-out menu: every page wears the site's own accent (`site.json` `accent`), and a reader's stored pick from before is not read and is left in storage. Needs a rebuild and deploy of each site. -- **The header carries the operator's social links and one theme toggle, keeps the site's name on a small screen, and links to the Archilyzer home in place of the sites menu.** Every site's header and the hub's end with the social icons (the site's `socialLinks`, else `settings.json`'s) followed by the theme toggle, all 36 px keys (44 px on a touch screen) with a focus ring. From 520 px wide the header shows every link, up to four (with more, the ones marked **Keep in header on small screens** first, then the last of the rest); below 520 px it shows only the marked ones (none marked → none) and keeps the site's name beside them. The footer keeps every link, in the same keys (its icons were 20 px and turned the accent on hover; they now turn the text colour), and wraps them rather than widen the page. The **Sites** dropdown and the **Hub** link are gone from the header and the slide-out menu: in their place a link, **Archilyzer**, goes to the Archilyzer home's Official Instances, in the same tab (not on the hub, which lists them itself). **Changelog** moved from the header and the menu to the footer, after Use with AI. The nav and the Archilyzer link are inline from 1024 px wide; below that they are in the slide-out menu, which now holds only them. Only as last resorts, for a very long name on a phone, does the name drop (its mark stays; the same before and after the page's font has loaded) and do the icons scroll sideways in their own box. A site's `hubUrl` still loads and is no longer shown. Needs a rebuild and deploy of each site. +- **The header carries the operator's social links and one theme toggle, keeps the site's name on a small screen, and links to the Archilyzer home in place of the sites menu.** Every site's header and the hub's end with the social icons (the site's `socialLinks`, else `settings.json`'s) followed by the theme toggle, all 36 px keys (44 px on a touch screen) with a focus ring. From 520 px wide the header shows every link, up to four (with more, the ones marked **Keep in header on small screens** first, then the last of the rest); below 520 px it shows only the marked ones (none marked → none) and keeps the site's name beside them. The switch is 32.5rem, so at a larger text size it comes later. With one marked link, every current site's name shows in full from 360 px wide on a touch screen. The footer keeps every link, in the same keys (its icons were 20 px and turned the accent on hover; they now turn the text colour), and wraps them rather than widen the page. The **Sites** dropdown and the **Hub** link are gone from the header and the slide-out menu: in their place a link, **Archilyzer**, goes to the Archilyzer home's Official Instances, in the same tab (not on the hub, which lists them itself). **Changelog** moved from the header and the menu to the footer, after Use with AI. The nav and the Archilyzer link are inline from 1024 px wide; below that they are in the slide-out menu, which now holds only them. Only as last resorts, for a very long name on a phone, does the name drop (its mark stays; the same before and after the page's font has loaded, and never with its last letter cut off) and do the icons scroll sideways in their own box. A site's `hubUrl` still loads and is no longer shown. Needs a rebuild and deploy of each site. ## [0.10.0] - 2026-09-28 - **A video whose recheck failed shows as possibly missing rather than available.** When a video drops out of its channel's listing it is marked "Missing?" until a recheck says why. A recheck that could not reach the video — a blocked request or a network error — used to clear the mark as if the video had been found. It now leaves "Missing?" in place until a recheck actually reaches the video. Needs a rebuild and deploy of every export site. diff --git a/homepage/CHANGELOG.md b/homepage/CHANGELOG.md @@ -3,7 +3,7 @@ ## [Unreleased] - **`/#instances` goes straight to Official Instances.** The section carries `id="instances"`, clear of the sticky header, and every archive's header now links there (`INSTANCES_URL` in `common/lib/project.ts`). With no sites the link lands on the top of the page. -- **The social links are in the header beside the theme toggle, and on a small screen the header keeps the name.** The operator's social icons (`homepage.json`'s, else `settings.json`'s) sit in the header's bar as well as in the footer's Elsewhere column, followed by the theme toggle, all spaced alike. From 768 px wide the bar is wordmark, nav, icons, toggle; below 768 px it is wordmark, icons, toggle, and the nav has the rule below to itself, where its four links fit. From 520 px wide the header shows every link, up to four (with more, the ones marked **Keep in header on small screens** first, then the last of the rest); below 520 px it shows only the marked ones (none marked → none), and the wordmark keeps its full name: "Archilyzer" shows from 292 px wide on a touch screen with one marked link. The footer always shows every link. Only as last resorts, on a screen narrower still or at a much larger text size, does the wordmark's text drop (its mark stays) and do the icons scroll sideways in their own box, the last one in view first. Each is an icon named by its label, with no text beside it. +- **The social links are in the header beside the theme toggle, and on a small screen the header keeps the name.** The operator's social icons (`homepage.json`'s, else `settings.json`'s) sit in the header's bar as well as in the footer's Elsewhere column, followed by the theme toggle, all spaced alike. From 768 px wide the bar is wordmark, nav, icons, toggle; below 768 px it is wordmark, icons, toggle, and the nav has the rule below to itself, where its four links fit. From 520 px wide the header shows every link, up to four (with more, the ones marked **Keep in header on small screens** first, then the last of the rest); below 520 px it shows only the marked ones (none marked → none; the switch is 32.5rem, so at a larger text size it comes later), and the wordmark keeps its full name: "Archilyzer" shows from 292 px wide on a touch screen with one marked link. The footer always shows every link. Only as last resorts, on a screen narrower still or at a much larger text size, does the wordmark's text drop (its mark stays) and do the icons scroll sideways in their own box, the last one in view first. Each is an icon named by its label, with no text beside it. - **One theme toggle in place of the two theme buttons.** The header's theme menu (Base and Accent) and its base toggle are one toggle, the last of the header's icons, that cycles the ground (System, Light, Dark) and is named for the next one. There is no accent to pick: the homepage's is its own, Signal, and an accent stored by an earlier build is ignored here, with no flash. - **Two grounds, Light and Dark.** The third ground, the warm paper one, is gone: the toggle cycles System, Light and Dark. A reader who had chosen it gets Light, before the page first paints and with no other ground on the way, and the stored choice becomes Light. - **Changelog is in the footer only.** The header's nav is Docs, Source, Downloads and Stats; the footer's Sections list and the 404 page keep Changelog. diff --git a/plans/STATE.md b/plans/STATE.md @@ -202,12 +202,17 @@ changed at integration. Nothing was deployed, cut, pushed or restarted; :3001 st then the homepage (with `#instances`) before any site, then the hub, then the six sites. - **The narrow header, as ruled after the review, is built** (`447ded9a`). Below 520 px every header shows the name and only the links marked **Keep in header on small screens** (none - marked → none); from 520 px it shows every link, up to four. At 360 px under touch with one - marked link every real title shows in full except Hasanalyzer (7 px short) and Rekietalyzer - (8 px short). The fix is the operator's to pick: the bar's gap from 12 to 8 px below 520 px - would do it (`release-14.md`). - - **The operator's settings:** mark the link to keep in the header; the parent does this when - the branch lands. + marked → none); from 520 px it shows every link, up to four. + - **Re-reviewed SHIP; its findings are in** (`1a2e3342`, `4ea1c495`, `11a33f7a`): + - below the switch the export bar's two gaps are 8 px (ruled 2026-09-29): every real title + shows in full at 360 px under touch with one marked link (Rekietalyzer at exactly 360); + - the wordmark's reservation is a minimum width, so wider-rendering text is never clipped; + - the switch is `32.5rem`, so it moves with the reader's text size, and the homepage's + wordmark fit is keyed by the wide row's count from it; + - a marked link keeps its configured place (ruled as built). + - **The operator's settings:** the link to keep in the header is marked in Settings BEFORE any + build; the parent does this when the branch lands (`release-14.md`, "## Rollout", + precondition 5). - **Next candidates:** one-core Phase 5 (projects join the core, `plans/one-core.md`); the Diagnostics cards keeping their retry log (O3's found-and-left); `ChartView.tsx`'s five-slot cycle reaching `--chart-6` (O2); O5's two wording lows in `svg-faces.mjs` / the README (kerning is not diff --git a/plans/export-header-first-search.md b/plans/export-header-first-search.md @@ -53,6 +53,10 @@ main...<branch>` is empty for the search and header components on all five). and shows only the link(s) marked for the header; the other social links are in the footer. `featured` now means "keep in the header on small screens" (below 520 px only those; from 520 px every link up to four, those kept first). Built on `r14/two-grounds-headers`. +- 2026-09-29 (after the re-review): below the switch the header bar's two gaps go from 12 to 8 px; + type, the mark–name gap and the reserved width's margin stay as they are. The switch is written + in rem (32.5rem), so it moves with the reader's text size, and the wordmark's reserved width is a + minimum. A marked link keeps its configured place in the wide row (as built). - Standing: **no copy** beside any social link: icons with accessible names only. ## Decisions and assumptions diff --git a/plans/release-14.md b/plans/release-14.md @@ -882,8 +882,9 @@ the link(s) marked for the header; the other social links are in the footer. in the footer." `SETTINGS.md` and `SITE.md` are regenerated. **Layout** (the homepage, every site and the hub, one behaviour): -- Both rows are rendered. CSS shows the narrow one below **520 px** and the wide one from 520 px; - the other is `display: none`, so exactly one is focusable and in the accessibility tree. +- Both rows are rendered. CSS shows the narrow one below **32.5rem** and the wide one from + 32.5rem: 520 px at the default text size, 1040 px at a 32 px browser text size (`11a33f7a`, N5). + The other is `display: none`, so exactly one is focusable and in the accessibility tree. - Each copy scopes its icons' ids. - The narrow bar is mark + name · the marked link(s) · toggle, then the menu button on the export. - The wordmark's text drop (the export's reserved-width wrap, the homepage's container @@ -895,38 +896,44 @@ touch. At 519 px the narrow row shows and at 520 px the wide one, and the name s (measured on Rekietalyzer and Hasanalyzer, both pointers, 519–1280 px). The homepage's bar needs about 424 px. -**The smallest viewport width at which the full name shows** (a dev server, four links -configured): +**The gap ruling (2026-09-29):** below the switch the export bar's two gaps (name → row, toggle → +menu) are **8 px**, not 12 (`1a2e3342`, N1). Type, the mark–name gap and the reserved width's +3 % margin are unchanged. It is one header, so every site and the hub. The homepage's bar has one +gap and keeps 12 px. + +**The smallest viewport width at which the full name shows** (a dev server at `11a33f7a`, four +links configured, re-measured after the gap ruling; before it, each site's and the hub's widths +were 8 px more): | Title | One marked link: mouse / touch | None marked: mouse / touch | |---|---|---| -| Jeralyzer | 310 / 326 | 274 / 282 | -| Anilyzer | 296 / 312 | 260 / 268 | -| Bonnellyzer | 344 / **360** | 308 / 316 | -| Hasanalyzer | 351 / **367** | 315 / 323 | -| Rekietalyzer | 352 / **368** | 316 / 324 | -| Jasolyzer | 316 / 332 | 280 / 288 | -| Archilyzer (homepage) | 276 / 292 | 240 / 248 | -| Archilyzer (hub) | 321 / 337 | 285 / 293 | - -**The target** (every title in full at 360 px, one marked link, touch) is met by all but two: -- **Hasanalyzer misses by 7 px.** -- **Rekietalyzer misses by 8 px.** - -Not changed; the fixes, for the operator to pick: -1. **The bar's gap from 12 to 8 px below 520 px.** There are two gaps (name → row, toggle → - menu), so it saves 8 px and both titles meet 360. Type is untouched. -2. **The mark–name gap from 10 to 6 px** saves 4 px. Alone it is not enough. -3. **The wordmark from 1.35 to 1.25 rem below 520 px** saves 10–11 px on these titles. This - shrinks the type, so it is listed, not taken. -4. **The reserved width's margin from 3 % to 1 %** saves 3 px. This is risky: the served font - renders up to 1.7 % wider. +| Jeralyzer | 302 / 318 | 266 / 274 | +| Anilyzer | 288 / 304 | 252 / 260 | +| Bonnellyzer | 336 / 352 | 300 / 308 | +| Hasanalyzer | 343 / 359 | 307 / 315 | +| Rekietalyzer | 344 / **360** | 308 / 316 | +| Jasolyzer | 308 / 324 | 272 / 280 | +| Archilyzer (homepage) | 276 / 292 | ≤ 240 / 248 | +| Archilyzer (hub) | 313 / 329 | 277 / 285 | + +**The target** (every title in full at 360 px, one marked link, touch) is **met by every title**. +Rekietalyzer meets it at exactly 360 px. + +**The wordmark's reservation is a minimum width** (`4ea1c495`, N2). The header sets +`wordmarkWidthEm` as `min-width`. Where the text renders wider than the reservation, its box grows +with it and the text drops sooner; its last letter is never clipped. The re-review measured 0.6 to +0.8 % spare in Chromium. The table above is unchanged by it. + +**`featured` keeps its configured place** (N4, ruled as built). With more than four links, a +marked link is guaranteed a place in the wide row, and the row keeps configured order: `[A★, B, +C, D★, E, F]` shows `A D E F`. **Tests:** - `socialLinks.test.ts` covers both widths: none marked, one, several, more than four with and without marks, and order kept. -- The homepage (`social.spec`), a site with a short title and "Bonnellyzer" (`header.spec`), and - the hub (`official-instances.spec`) are checked at 360 and 390 px, both pointers: +- The homepage (`social.spec`), a site (`header.spec`: a short title, Bonnellyzer, Hasanalyzer and + Rekietalyzer) and the hub (`official-instances.spec`) are checked at 360 and 390 px, both + pointers: - the full name shows; - only the marked link is in the header, in the accessibility tree too; - with none marked, the header has no row and the name shows; @@ -934,11 +941,62 @@ Not changed; the fixes, for the operator to pick: - the footer has every link at every width; - nothing scrolls the page sideways from 280 to 1400 px; - focus goes brand → marked link → toggle, then menu on a site. +- `header.spec` checks **all six real titles at 360 px under touch with one marked link**: the + full name, the link, no scrolling row, no overflow. Hasanalyzer and Rekietalyzer fail it with + 12 px gaps. +- `header.spec` forces the wordmark 8 % wider (letter-spacing) and sweeps 519 to 280 px: + wherever the name shows, it does not overflow its box or the clip box. With a fixed width it + is clipped from 519 to 344 px. +- **At 200 % text**, both pointers: + - **The browser's text size** (32 px, set through CDP `Page.setFontSizes`; Chromium): + - the narrow row shows until 1040 px, and the wide one from there; + - the row never scrolls while the name shows, and the header never overflows; + - the name shows with one marked link from 720 px on the homepage and from 767 px on + Rekietalyzer. + - **The page's root at 200 %** (which moves the page's rem but not a media query's): + - on the homepage from 520 to 767 px, the wide row never scrolls while the name shows; + - on a site the switch stays at 520 px and the row never scrolls while the name shows. - The e2e fixtures mark their last link. -**Screenshots:** `~/reports/release-14/shots/h2/{jeralyzer,anilyzer,bonnellyzer,hasanalyzer,rekietalyzer,jasolyzer,homepage}-{320,360,390,768,1280}-{light,dark}.png`. -These use four synthetic icons, the last marked, with a mouse pointer. At 360 px under touch, -Hasanalyzer and Rekietalyzer drop their text (see the table). +**Screenshots:** `~/reports/release-14/shots/h2/`, four synthetic icons, the last marked: +- `{jeralyzer,anilyzer,bonnellyzer,hasanalyzer,rekietalyzer,jasolyzer,homepage}-{320,360,390}-{light,dark}.png` + (a mouse) and `…-{320,360,390}-touch-{light,dark}.png` (touch), re-taken at `11a33f7a`; +- `…-{768,1280}-{light,dark}.png` from `447ded9a` (the header is unchanged at those widths). + +At 360 px every title shows in full under touch. At 320 px Bonnellyzer, Hasanalyzer and +Rekietalyzer drop their text under both pointers, and Jasolyzer does under touch. + +#### Re-review (verdict SHIP; `$T/h-review2.md`) + +| Finding | Fix | +|---|---| +| N1: at 360 px under touch, with one marked link, Hasanalyzer and Rekietalyzer lost the name | `1a2e3342`: the gap ruling (above). All six titles, the homepage and the hub re-measured; the e2e checks all six | +| N2: the reserved wordmark width had 0.6–0.8 % spare in Chromium | `4ea1c495`: the reservation is a `min-width` (above) | +| N3: the Rollout had no step for marking the link, and a live check expected every icon at 390 px | this commit: a precondition before any build, and the 390 px check reads "the marked link" (## Rollout) | +| N4: "kept first" is priority, not position | ruled as built: a marked link keeps its configured place (above) | +| N5: on the homepage at 150–200 % text, from 520 to 767 px, the wide row scrolled while the name showed | `11a33f7a`: the switch is `32.5rem` in every header; the homepage's wordmark fit is keyed by the narrow row's count below the switch and by the wide row's from it | + +| sha | what | +|---|---| +| `1a2e3342` | `export:` the bar's two gaps are 8 px below the switch; `header.spec` all six real titles; the hub's name test under both pointers (N1) | +| `4ea1c495` | `export, common:` the wordmark's reservation is a `min-width`; the wider-text e2e (N2) | +| `11a33f7a` | `homepage, export:` the switch in rem; the homepage's fit by the wide row's count from the switch; the 200 % text e2e (N5) | +| _this_ | `plans:` the ruling's record re-measured, the re-review, the Rollout's marked-link precondition (N3), STATE, the plan; the changelogs | + +**Gates** at `11a33f7a` (logs `$T/t-g4*.log`): +- **tsc** was clean before every commit, and at the tip (32 s). +- **Unit:** common 2,210/2,210; homepage 12/12. +- **e2e**, the header specs only, detached and queued: + + | Suite | Specs | Passed | Failed | + |---|---|---|---| + | homepage | `social`, `toggle`, `svg-vectors`, `brand` | 50 | 0 | + | export | `header`, `responsive`, `site-branding` | 50 | 0 | + | hub | `official-instances` | 8 | 0 | + +- **Builds**, capped at 5 GB with no swap, one at a time: the homepage (13 s, 824 MB) and the + export site (21 s, 1,029 MB). Both builds' CSS carry the `32.5rem` switch, and the homepage's + carries both fit sets. ## Rollout @@ -954,6 +1012,10 @@ merge). Every command below is typed **from the primary checkout's root**. There 3. **No other index, stats or site build is running.** `/jobs` shows none running or queued. 4. **If the stats-cache-key rollout has not run yet, run it first.** Its steps 5–7 build the homepage, the hub and the sites in the same order as below, and then cover this release's too. +5. **The link to keep in the header on small screens is marked, before any build.** The parent + marks it in the editor's Settings (**Keep in header on small screens**) and saves. The builds + are static: a link marked after them shows only after another build. With none marked, no + header shows a social link below 520 px. **The order, and why.** The homepage goes first, because every site's header links to `https://archilyzer.pages.dev/#instances` and that anchor exists only in the new homepage. The @@ -977,9 +1039,10 @@ hub goes before the sites, because in basic mode they share `export/out`. The si **Live checks.** - `https://archilyzer.pages.dev/#instances` lands on Official Instances, below the header. - One site at 390 px wide: - - the header shows the mark, the social icons and the theme toggle as one group, then the menu - button; + - the header shows the mark and the site's name, then the marked link and the theme toggle as + one group, then the menu button; - the menu holds the nav and "Archilyzer". +- The same site at 520 px wide and more: every social link, up to four. - At 1280 px wide, the header's **Archilyzer** link goes to the homepage's Official Instances, in the same tab. There is no Sites menu and no Hub link. - **Changelog** is in the footer, after Use with AI, and not in the header.