Motion and design refresh for the homepage - #1
Merged
Conversation
Introduce two dependency-free TypeScript modules bundled by Astro: motion.ts (scroll reveals, condensed masthead with progress line, active nav, pointer highlights, magnetic buttons, metric counters, self-drawing signal map) and signal-board.ts (the hero canvas: procedurally routed traces with travelling pulses, pointer spotlight, off-screen and hidden-tab pausing, static frame under reduced motion). Load Google Fonts through preconnect and link tags instead of a CSS @import, and add the inline html.js gate that scopes every hidden-until-animated rule so the page stays fully readable without JavaScript.
Hero: masked line-rise headline with a mint gradient on the second line, staged entrance for eyebrow, lede, buttons and index cells, and the signal board layered behind the copy. Masthead condenses on scroll with backdrop blur, a scroll-progress hairline, animated nav underlines and a Deck link. Sections: scroll reveals with staggered children; a six-column work grid (two featured plus three) with product marks and status pills on every card; pointer-follow highlight and border glow on cards; the operating-model map draws itself with sequenced nodes and a travelling packet; unique sigils and live dots for the five operators; a metrics strip above the proof tiles using the figures already published in the deck; a monogram and pill links on the founder card; a deck call to action in the contact section; an outlined ARCA watermark in the footer. Replace the blanket reduced-motion reset with a policy: transforms, blur, delays, counters and the packet are dropped while short opacity fades stay.
Add tests covering the progressive-enhancement gate, font loading, the reduced-motion policy, the deck links, and that the homepage metrics match the deck figures exactly. Walk the page in the Playwright QA before the screenshot and axe run so scroll-triggered reveals have fired. Document the motion layer in the README.
Move /deck from a static HTML file to src/pages/deck.astro so it renders through BaseLayout and reuses motion.ts and signal-board.ts. The cover gets the signal board, a masked line-rise title, staged entrance, and a cover diagram that draws itself with sequenced nodes and a travelling packet. Every slide reveals its content on arrival; launchpad, product, range, metric, and system cards carry the pointer glow; the proof metrics count up. Extract the shared engine styles into public/motion.css (tokens, board host, reveal system, glow cards, drawing transitions, reduced-motion policy, and print overrides that force every reveal visible and hide the canvas so the deck still exports cleanly to PDF). The homepage stylesheet keeps only its page-specific rules and its cards use the shared .glow class. BaseLayout takes a stylesheet prop and always loads motion.css. Because /deck is now a real route, the sitemap lists it on its own with trailingSlash set to never so the URL matches the canonical. The QA script covers both pages, check-build requires motion.css, and the deck content contracts read the Astro page. The old static deck HTML and rail script are removed.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Motion and design refresh for the homepage. The page keeps its editorial identity (Manrope + DM Mono, hairline grids, bronze labels, teal signal) and gains a living hero, choreographed entrances, scroll reveals, pointer-aware cards, a self-drawing operating-model diagram, and a public metrics strip. Zero runtime dependencies: 4.4 KB of gzipped TypeScript bundled by Astro plus CSS.
What changed
src/scripts/signal-board.ts): a Canvas 2D board of procedurally routed PCB-like traces with teal pulses travelling along them, pads that flash as pulses pass, and a pointer spotlight that tints nearby traces. Pauses off-screen and when the tab is hidden; renders one static frame underprefers-reduced-motion. Runs at the display refresh rate with a 14 ms worst frame at 1440×900.src/scripts/motion.ts):IntersectionObserverreveals with batch stagger; elements hand control back to their own transitions once revealed.public/deck/index.html.preconnect+<link>instead of a render-blocking CSS@import.html.js; every hidden-until-animated rule is scoped to it and toprefers-reduced-motion: no-preference, so the page is fully readable without JavaScript and for reduced-motion users. The blanket reduced-motion reset is replaced with a policy (short opacity fades stay; transforms, blur, delays, counters and the packet are dropped).Verification
npm run checkgreen:astro check(0 errors), 9 contract tests, build, built-site contract, wrangler dry run.npm run qaagainstwrangler dev --local-protocol httpsat 1440×1000 and 390×844: HTTP 200, zero console errors, zero axe-core violations, no horizontal overflow, contact link on one line. The QA walk now scrolls the page (instantly, bypassingscroll-behavior: smooth) before the screenshot and axe run so reveals have fired.prefers-reduced-motion: reduce(all content visible immediately, board static)./deckuntouched;/404unaffected.Not in this PR
Production deploy (
npm run deploy) is still a manual step after merge.Deck (
/deck) gets the same treatment/deckmoves from a static HTML file tosrc/pages/deck.astro, rendered throughBaseLayout(newstylesheetprop) and sharingmotion.tsandsignal-board.ts. Same URL, same content, same deck stylesheet.public/motion.css(tokens, board host, reveal system,.glowcards, drawing transitions, reduced-motion policy, print overrides). Print forces every reveal visible and hides the canvas, so PDF export of the deck still works. The homepage stylesheet keeps only page-specific rules./deckis now a real route, the sitemap lists it automatically;trailingSlash: 'never'keeps the URL identical to the canonical. The oldpublic/deck/index.htmlanddeck.jsare removed;public/deck/styles.cssand assets stay./and/deckat both viewports (all four runs: 200, zero console errors, zero axe violations, no overflow). Contract tests read the Astro page, keep the deck content assertions, and add checks for the shared motion layer and print safety.