Skip to content

feat(site): add a hero to the browse page - #62487

Merged
thdxr merged 1 commit into
devfrom
site-browse-hero
Nov 7, 2026
Merged

thdxr merged 1 commit into
devfrom
site-browse-hero

Conversation

@thdxr

@thdxr thdxr commented Nov 7, 2026

Copy link
Copy Markdown
Member

The Browse page (/product/browse) had a plain black hero. It now has a still in the same style as the other product heroes: OpenCode in the terminal driving an agent tab in an "Agent · localhost" tab group, on the usual flat backdrop (#1e1e1e dark, #161616 light).

  • product-hero.tsx: the hero markup, poster preload, theme script and HeroVideo moved out of product-page.tsx so both pages share them. src is optional now, so a poster-only hero works. The /desktop hero renders the same markup as before (diffed after hydration).
  • extension-data.ts gets hero: true on browse, and extension-page.tsx renders ProductHero with heroStills() from videos.ts.
  • Stills at public/product-videos/heroes/browse-landscape-{dark,light}.webp (1920×1200), with AVIF and WebP copies at 1280 and 1920 in public/media/heroes listed in media-manifest.json and media-sources.json. No video, so nothing goes to the files bucket.
  • The browse hero is squeezed wider than the others by its longer intro (about 2.75:1 at 1440×900), so the windows sit within that crop.

The scene is HTML rendered with Playwright. Tab group names, the RUN badge colour and the MCP tool names match browse and OpenCode. Sites in it are made up.

No flag: it's a static image on a marketing page.

Visual

<svg xmlns="http://www.w3.org/2000/svg" width="240" height="72" viewBox="0 0 240 72" fill="none">
  <style>
    .c{animation:blink 1.6s steps(1) infinite}
    .t{animation:fill 3.2s ease-in-out infinite}
    @keyframes blink{50%{opacity:0}}
    @keyframes fill{0%,15%{width:0}55%,100%{width:46px}}
    @media (prefers-reduced-motion:reduce){.c,.t{animation:none}}
  </style>
  <rect x="20" y="10" width="76" height="52" rx="4" stroke="currentColor" stroke-opacity=".4"/>
  <rect x="28" y="20" width="44" height="4" rx="2" fill="currentColor" fill-opacity=".6"/>
  <rect x="28" y="30" width="34" height="3" rx="1.5" fill="currentColor" fill-opacity=".3"/>
  <rect x="28" y="37" width="38" height="3" rx="1.5" fill="currentColor" fill-opacity=".3"/>
  <rect class="c" x="28" y="46" width="5" height="6" fill="currentColor" fill-opacity=".7"/>
  <rect x="104" y="10" width="116" height="52" rx="4" stroke="currentColor" stroke-opacity=".4"/>
  <rect x="112" y="16" width="30" height="7" rx="2" fill="currentColor" fill-opacity=".55"/>
  <rect x="146" y="17" width="28" height="5" rx="1.5" fill="currentColor" fill-opacity=".25"/>
  <line x1="104" y1="27" x2="220" y2="27" stroke="currentColor" stroke-opacity=".25"/>
  <rect x="114" y="35" width="56" height="6" rx="2" stroke="currentColor" stroke-opacity=".35"/>
  <rect class="t" x="116" y="37" width="46" height="2" rx="1" fill="currentColor" fill-opacity=".5"/>
  <rect x="180" y="35" width="30" height="16" rx="3" fill="currentColor" fill-opacity=".7"/>
</svg>

@thdxr
thdxr merged commit b2d68b3 into dev Nov 7, 2026
12 checks passed
@thdxr
thdxr deleted the site-browse-hero branch November 7, 2026 02:02

@opencodejr opencodejr Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks good. I ran the site's dev server on this branch:

  • /product/browse now server-renders the themed still, with light and dark AVIF and WebP sources from media/heroes, the prefers-color-scheme preloads and the theme script.
  • /desktop still renders its video hero. Moving the markup into product-hero.tsx reads as a straight extraction, and making src optional in HeroVideo is handled correctly.

The site's media, manifest, browse and preload tests pass, and tsc --noEmit in services/site is clean.

Public API: unchanged. This is only a marketing page and its static assets.

No concerns.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant