Files
runicgateway.com/src/pages/index.astro
wtclaude 556dee7355
All checks were successful
PR checks / checks (pull_request) Successful in 49s
feat(home): phase 3 — the homepage
Replaces phase 1's scaffold with the real homepage: hero, the data path as
inline SVG, the self-hosted argument, all five capability groups, and the
get-started CTA. Three decisions the org lead took first are recorded in
PLAN.md as D17-D19.

The data path is drawn generically and captioned specifically (D17): the nodes
say "your game server" and "sidecar", the sub-labels and caption name ServUO and
uo-link. The SVG is aria-hidden because the four numbered steps beside it carry
the same path in prose — one telling, not two.

The capability list is data with a check behind it (D18). Every Game-intelligence
item names the module-uo capability slug it comes from, and the build fails if
the page and platform.json disagree either way. That needed a fifteenth fact in
checkFacts.mjs: §12 named the capability list as an externally-sourced fact and
nothing re-read it, so the chain rested on someone remembering. It also found
that the site was omitting two of the module's eight capabilities — guilds and
city governors are now listed, in the page and in §10.

The hero leads with the emblem (D19), derived from whichever logo.png is in
force so one file still changes the hero, header, tab icon and app icon
together.

Also here, both found by standing the build up rather than by review:

  - checkBrand.mjs now enforces the demo slot's markup contract. applyBrand.mjs
    reveals the demo link by replacing an exact pair of empty attributes; an
    attribute inserted between them produces a build where the mount sets a demo
    URL, the boot log says nothing and the link never appears. Both halves are
    checked and the literal is derived from the expression applyBrand.mjs uses,
    so they cannot drift.

  - The header nav overflowed at 390px — four links plus the lockup measured
    433px against a 390px viewport, so every phone got a horizontally scrolling
    page. Phase 1 left this to phase 3 expecting a disclosure control; it got a
    wrap instead, because with four links there is nothing to disclose and a
    hamburger costs state, script and duplicate markup.

Verified on a clean checkout of this commit: all four checks, astro check, a
production build, a live /brand/* smoke, and a demo URL mounted and reverted.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-20 00:03:04 -05:00

35 lines
1.3 KiB
Plaintext

---
import Base from '../layouts/Base.astro';
import { brand } from '../lib/brand.mjs';
import Hero from '../components/home/Hero.astro';
import DataPath from '../components/home/DataPath.astro';
import SelfHosted from '../components/home/SelfHosted.astro';
import Capabilities from '../components/home/Capabilities.astro';
import GetStarted from '../components/home/GetStarted.astro';
/**
* The homepage — PLAN.md §13 phase 3.
*
* Ordered as an argument rather than as a brochure: what it is (hero), how the hard part
* works (the data path), why you would want it on your own hardware, what you actually get,
* and how to start. The data path comes second on purpose — it is the claim in the tagline,
* and a visitor who does not believe it has no reason to read the feature list.
*
* The page itself holds no copy and no facts. Each section reads versions from
* `platform.json` and brand text from `brand.mjs`, so nothing on this route can go stale
* without a check going red first (§12).
*
* `bareTitle` because the hero's own <h1> is the tagline: the default suffix would render
* "Runic Gateway — Put your … — Runic Gateway".
*/
---
<Base title={`${brand.siteName} — ${brand.tagline}`} description={brand.tagline} bareTitle>
<Hero />
<DataPath />
<SelfHosted />
<Capabilities />
<GetStarted />
</Base>