Design — one public chrome for motir.co: the landing, /explore, /docs and /legal under a single header, nav and footer
Type: design · Executor: coding_agent · Ships the three-file asset in motir-core at design/public-site/: design-notes.md + public-site.mock.html + public-site.png.
The surface
motir.co will serve four surfaces that today wear two different chromes on two different hosts, and neither knows about the other:
| surface | chrome today | where |
|---|---|---|
| the landing | SiteHeader / SiteFooter | motir-marketing/app/_components/ |
/explore, /explore/topic/* | ExploreTopBar / ExploreFooter | motir-core/app/(public)/explore/_components/ |
/docs | ExploreTopBar with current="docs" | same |
/legal | ExploreTopBar with current="legal" | same |
This card draws one header, nav and footer for all four, and the states each surface puts it in.
What the move makes newly drawable — and this is the point of the card
ExploreTopBar renders Product and Pricing as non-interactive <span> labels, with a comment explaining why: "Product / Pricing are future marketing pages, so they render as non-interactive LABELS rather than dead links a crawler would 404 on." Its brand mark links to /, which on the application host is app/page.tsx — a redirect to /sign-in. On motir.co that link reaches the landing, so the brand lockup becomes a real home link and the nav gains its first genuine sibling set. SiteFooter likewise omits Product, Pricing, Blog and About because they do not exist.
The asset decides what the nav holds when the pages that exist are /, /explore, /docs, /legal — and how a label that is still a placeholder is drawn, since some remain.
⚠️ The ACCESS PATH this asset must draw
Every surface's entrance, in the parent surface, at the pixel:
- How
/exploreis reached from the landing — the nav item, and any in-page entrance the landing's own body offers. - How
/docsand/legalare reached —/docsfrom the nav (it already has a treatment, perExploreTopBar'scurrentprop);/legalfrom the footer, which is where it is reached from today and where the asset must keep it, because marking Explore asaria-currenton a legal page "would tell a screen reader the wrong thing" — that reasoning is in the shipped component and is not to be undone. - The application doors — Sign in / Start free, which remain the only deliberate cross-host links, and must read as leaving.
- The route back from
/exploreinto a public project — a cross-host link once/p/*moves, so the asset draws it as a normal link and does not assume same-origin.
Composition, not redrawing
It composes shipped assets rather than re-specifying them:
motir-marketing/design/marketing/design-notes.md+landing.mock.html— the landing's own layout and its three doors. This asset does NOT redraw the landing body; it draws the chrome around it and states so.motir-core/design/brand/design-notes.md§7c — theBrandMarklockup at 26px and its rhythm in apy-3bar.@motir/design-systemprimitives +--el-*element tokens and the element-semantic shape tokens; no Tier-0--color-*, no rawrounded-*/p-*.
Acceptance criteria
- The three-file set exists at
design/public-site/—design-notes.md, the mock, and a rendered.png— and the notes carry the surface table plus the panel index the convention expects. - One header and one footer are DRAWN IN THE ASSET, with the per-surface states: landing (no current item),
/explore(current), a topic page,/docs(current),/legal(current on neither, by the shipped reasoning above). - The access path for each of the four entrances above is VISUALISED IN THE ASSET, in its parent surface, not described in prose.
- Placeholder nav items are drawn with a treatment that is visibly not a link, and the notes name which items are placeholders as of the asset's date, with the rule for promoting one.
- Every colour is an
--el-*token and every shape an element-semantic token; the notes list the primitives composed and cite@motir/design-systemrather than re-specifying them. - Measured at 1280 and 390 CSS px, with the fold stated for each.
- The notes'
## ⚠️ Planning flagssection names anything the asset found that no card owns, with a key for each — a flag naming no card is not a flag. - The GIVES / TAKES sweep is run and recorded:
grepthe asset for everyMOTIR-<n>, and for each say whether it gives or takes an element, a structure or a premise — and amend that card's acceptance criteria in the same pass. The landing-port card and the 301 card are both in scope of that sweep.
Advisory dispositions
shape · likely-self-blocking-design (criteria 1 and 2) — NOT REAL, and here is the check that settles it. The detector fires when a childless card is its own design blocker: one criterion PRODUCES a design and another CONSUMES it by building the surface. Criterion 1 produces the asset; criterion 2 was read as consuming it.
It does not apply because no criterion on this card builds anything. Every verb in the list resolves inside design/public-site/: criterion 2's drawn, criterion 3's visualised, criterion 4's drawn. Nothing here renders a component, edits a route or touches app/. The surfaces that CONSUME this asset are separate cards — the landing port and the redirect card — and both are blocked_by this one, which is the correct shape rather than the self-blocking one.
The two words that most likely tripped it (drawn, visualised in its parent surface) have been qualified in place — IN THE ASSET — so a later reader reaches the same verdict without re-deriving it. That is the whole action taken; the criteria's substance is unchanged, because the substance was never the problem.
Context refs
motir-core/app/(public)/explore/_components/ExploreTopBar.tsx·ExploreFooter.tsx— the shipped chrome and the reasoning in its commentsmotir-core/app/(public)/_components/PublicTopBar.tsx— the OTHER public chrome, which this asset does NOT unify (it belongs to/p/*)motir-marketing/app/_components/SiteHeader.tsx·SiteFooter.tsx·design/marketing/motir-core/design/brand/design-notes.md·motir-core/app/tokens/- The ADR this is
blocked_by— the host table it draws to
Comments (0)
No comments yet — be the first to weigh in.