Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
17 commits
Select commit Hold shift + click to select a range
0ac7391
feat(marketing): camera story scroll hero on the homepage
claude Sep 26, 2026
bba7b51
feat(marketing): rework hero into the live conduit story
claude Sep 27, 2026
f1c29ac
feat(marketing): circuit-board hero, Next button, highlighted server …
claude Sep 27, 2026
553affa
feat(marketing): snap the hero story between steps, add the pywire chip
claude Sep 27, 2026
58460d9
feat(marketing): faster, interruptible snap scrolling in the hero story
claude Sep 27, 2026
cf1bcda
feat(marketing): add the stateless edge step to the hero story
claude Sep 27, 2026
d5d7224
feat(marketing): drop the coming soon tag from the edge step
claude Sep 27, 2026
0b526ef
feat(marketing): show edge as a network of nodes, pad the hero logo
claude Sep 27, 2026
5386d13
feat(hero): world map edge beat and a responsive pass
claude Sep 27, 2026
9a03101
feat(hero): cursor clicks in the edge beat, clear Safari's floating t…
claude Sep 27, 2026
62b4ed5
fix(hero): keep the story's bottom in view when the browser shows les…
claude Sep 27, 2026
509a8d1
fix(hero): count Safari's toolbar once, add a ?viewport readout
claude Sep 27, 2026
c17b2c3
fix(hero): clear Safari's toolbar in CSS, calm the edge beat
claude Sep 27, 2026
1d7494a
feat(hero): one step per swipe, ordered patch beat, less flashing
claude Sep 28, 2026
62c2442
fix(hero): hold the old-stack labels, then ease them out; quicker han…
claude Sep 28, 2026
323ae89
feat(site): shorter lockout between story steps
claude Sep 28, 2026
0bc39b9
feat(site): scroll-to-top button and header that returns near the top
claude Sep 28, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
54 changes: 54 additions & 0 deletions site/src/components/Header.astro
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,61 @@ import { Icon } from 'astro-icon/components'
</Navigation>
</header>

<script>
// Once the header has scrolled away, bring it back when the mouse nears the
// top of the screen (or focus lands in it), and tuck it away again when the
// mouse moves on.
const NEAR = 48
let shown = false
const header = () => document.querySelector('body > header') as HTMLElement | null
const place = () => {
const el = header()
if (!el) return
el.style.top = `${-el.offsetHeight}px`
el.style.translate = shown ? `0 ${Math.min(scrollY, el.offsetHeight)}px` : ''
el.toggleAttribute('data-revealed', shown && scrollY > 0)
}
const show = (on: boolean) => {
const el = header()
if (!el || on === shown) return
if (!on && (el.matches(':focus-within') || el.querySelector('[aria-expanded="true"]'))) return
shown = on
place()
}
addEventListener('pointermove', (e) => {
if (e.pointerType !== 'mouse') return
const el = header()
if (!el) return
if (e.clientY < NEAR) show(true)
else if (e.clientY > el.offsetHeight + NEAR) show(false)
})
addEventListener('scroll', place, { passive: true })
addEventListener('focusin', (e) => {
if (header()?.contains(e.target as Node)) show(true)
})
document.addEventListener('astro:page-load', () => {
shown = false
place()
})
</script>

<style lang="scss" is:global>
body > header {
// Sticks just above the screen once scrolled away, so it can slide back in.
position: sticky;
top: -57px;
z-index: 100;
transition: translate 0.28s cubic-bezier(0.2, 0.7, 0.2, 1);

&[data-revealed] #main-navigation {
box-shadow: 0 4px 16px rgba(0, 0, 0, 0.06);
}

@media (prefers-reduced-motion: reduce) {
transition: none;
}
}

header {
.type-icon {
display: block;
Expand Down
Loading
Loading