diff --git a/.changeset/tooltip-viewport-clamp.md b/.changeset/tooltip-viewport-clamp.md new file mode 100644 index 000000000..32190580a --- /dev/null +++ b/.changeset/tooltip-viewport-clamp.md @@ -0,0 +1,9 @@ +--- +"nostream-website": patch +--- + +Info-tip bubbles no longer clip at the viewport edge: the tooltip is centered on its (i) toggle, so near an edge it overflowed. On open (hover, tap or keyboard) the bubble now shifts horizontally to stay inside the viewport, and re-clamps on resize. + +Tooltip behavior is delegated at the document level, so every tip is covered even when its per-element listeners would have silently failed to attach. + +Site polish from an external review: the community participate cards have their own section heading, the hero headline is real DOM text with a pause control on the film, the console screenshots are labeled as real first-run console data, the honest-advertising copy matches what its warning shows, the nav's active-path comparison strips the deploy base, the get-started phase list explains the skipped numbers, and single-column grids no longer let nowrap content push the page wider than a phone viewport. The hero film is re-rendered at 1080p for the current 25-NIP list. diff --git a/.github/workflows/deploy-website-preview.yml b/.github/workflows/deploy-website-preview.yml index f1fe09030..8ea72e33c 100644 --- a/.github/workflows/deploy-website-preview.yml +++ b/.github/workflows/deploy-website-preview.yml @@ -82,6 +82,15 @@ jobs: run: | pnpm run build node scripts/apply-base.mjs + # The assets manifest is keyed by file path: the worker serves dist/ + # at the root of its URL, but the preview is requested under + # /preview//... — so the built tree must also EXIST at that path + # or every asset request falls through to the SPA-fallback + # index.html (text/html for .css/.mp4 requests — the broken preview). + # Copy the build into dist/preview// (excluding the copy itself). + n="${{ github.event.pull_request.number }}" + mkdir -p "dist/preview/$n" + find dist -mindepth 1 -maxdepth 1 ! -name preview -exec cp -r {} "dist/preview/$n/" \; - name: Mark the preview comment as rendering if: steps.guard.outputs.skip == 'false' && github.event.action != 'closed' diff --git a/website/site/public/media/hero-low.mp4 b/website/site/public/media/hero-low.mp4 index 4253b25d1..766906aec 100644 Binary files a/website/site/public/media/hero-low.mp4 and b/website/site/public/media/hero-low.mp4 differ diff --git a/website/site/public/media/hero-poster.webp b/website/site/public/media/hero-poster.webp index 64f58ccc5..72fcf986f 100644 Binary files a/website/site/public/media/hero-poster.webp and b/website/site/public/media/hero-poster.webp differ diff --git a/website/site/public/media/hero.meta.json b/website/site/public/media/hero.meta.json index 2281c6acc..176d5bf00 100644 --- a/website/site/public/media/hero.meta.json +++ b/website/site/public/media/hero.meta.json @@ -1,4 +1,6 @@ { - "nipCount": 24, - "generatedAt": "2026-10-15T07:03:58.735Z" + "nipCount": 25, + "generatedAt": "2026-10-16T21:15:11.228Z", + "sourceVideo": "output/nostream-hero.mp4", + "sourceLowVideo": "output/nostream-hero-low.mp4" } diff --git a/website/site/public/media/hero.mp4 b/website/site/public/media/hero.mp4 index 80d656bd2..126a78898 100644 Binary files a/website/site/public/media/hero.mp4 and b/website/site/public/media/hero.mp4 differ diff --git a/website/site/public/media/planet.webp b/website/site/public/media/planet.webp index fe8ef9f14..0e9ab9a1f 100644 Binary files a/website/site/public/media/planet.webp and b/website/site/public/media/planet.webp differ diff --git a/website/site/src/components/InfoTip.astro b/website/site/src/components/InfoTip.astro index a088e93f9..066bdd0d3 100644 --- a/website/site/src/components/InfoTip.astro +++ b/website/site/src/components/InfoTip.astro @@ -108,13 +108,63 @@ const id = `tip-${Astro.props['detail'] ? '' : ''}${Math.random().toString(36).s diff --git a/website/site/src/components/Nav.astro b/website/site/src/components/Nav.astro index 6c3faf1fd..8888e3b18 100644 --- a/website/site/src/components/Nav.astro +++ b/website/site/src/components/Nav.astro @@ -2,7 +2,12 @@ import Logo from './Logo.astro' import { NAV, REPO, VERSION } from '../data/site' -const current = Astro.url.pathname.replace(/\/$/, '') || '/' +// Astro.url.pathname carries the configured base (preview deploys), so strip +// it before comparing against the base-relative NAV hrefs. +const base = import.meta.env.BASE_URL.replace(/\/$/, '') +const current = base && (Astro.url.pathname.replace(/\/$/, '') || '/').startsWith(base) + ? (Astro.url.pathname.replace(/\/$/, '') || '/').slice(base.length) || '/' + : Astro.url.pathname.replace(/\/$/, '') || '/' const isActive = (href: string) => current === href || current.startsWith(`${href}/`) --- @@ -22,7 +27,7 @@ const isActive = (href: string) => current === href || current.startsWith(`${hre @@ -58,6 +63,16 @@ const isActive = (href: string) => current === href || current.startsWith(`${hre menu.setAttribute('aria-expanded', String(open)) menu.setAttribute('aria-label', open ? 'Close menu' : 'Open menu') }) + + // Same-page hash links from the mobile drawer (the Get-started CTA on + // /get-started) scroll under the still-open drawer — close it first. + document.querySelectorAll('.drawer a[href^="#"]').forEach((a) => { + a.addEventListener('click', () => { + nav?.classList.remove('open') + menu?.setAttribute('aria-expanded', 'false') + menu?.setAttribute('aria-label', 'Open menu') + }) + }) + + diff --git a/website/site/src/components/home/Pillars.astro b/website/site/src/components/home/Pillars.astro index 9c67c475b..c136a4f93 100644 --- a/website/site/src/components/home/Pillars.astro +++ b/website/site/src/components/home/Pillars.astro @@ -89,6 +89,10 @@ const pillars = [ .bento { display: grid; gap: 16px; + /* Grid tracks default to min-width:auto, so the nowrap .cmd in the I/O + cell forces the track (and the page) wider than the viewport on + mobile. Floor the track at 0 and let the cmd scroll inside itself. */ + grid-template-columns: minmax(0, 1fr); } @media (min-width: 900px) { diff --git a/website/site/src/pages/community.astro b/website/site/src/pages/community.astro index 47bf9c532..fb6614b7b 100644 --- a/website/site/src/pages/community.astro +++ b/website/site/src/pages/community.astro @@ -133,10 +133,7 @@ const external = (href: string) => href.startsWith('http')

Ricardo started nostream and still leads it, reviewing changes, cutting releases and steering the roadmap for relay operators. He also created{' '} - - agentic schematics - - , the catalog behind our Get started build spec. + agentic schematics, the catalog behind our Get started build spec.

) } @@ -163,6 +160,10 @@ const external = (href: string) => href.startsWith('http')
+
+

02 Participate

+

Ways in. Pick yours.

+
{ channels.map((c, i) => ( @@ -186,7 +187,7 @@ const external = (href: string) => href.startsWith('http')
-

02 Guides from the community

+

03 Guides from the community

Written by people who run relays.

    diff --git a/website/site/src/pages/get-started.astro b/website/site/src/pages/get-started.astro index 789433987..1d3b3e59b 100644 --- a/website/site/src/pages/get-started.astro +++ b/website/site/src/pages/get-started.astro @@ -33,7 +33,7 @@ const agents = ['Claude Code', 'Cursor', 'Codex', 'OpenCode', 'Pi'] Your relay, built by your agent. -
    +
    @@ -70,6 +70,10 @@ const agents = ['Claude Code', 'Cursor', 'Codex', 'OpenCode', 'Pi']

    01 What the schematic builds

    The upstream deploy path, phase by phase.

    +

    + Numbered as in the schematic: it also runs P1 (image discovery), P3 (optional settings overrides) and P6 + (optional WebSocket smoke test) — checks and choices your agent makes on its own. +

      { @@ -205,6 +209,13 @@ const agents = ['Claude Code', 'Cursor', 'Codex', 'OpenCode', 'Pi'] font-size: 14px; } + .phase-note { + max-width: 640px; + margin: 0; + color: var(--fg-2); + font-size: 14px; + } + .more { margin-top: 28px; font-size: 15px; diff --git a/website/site/src/styles/global.css b/website/site/src/styles/global.css index 28a0dbf5b..1b5cd64cc 100644 --- a/website/site/src/styles/global.css +++ b/website/site/src/styles/global.css @@ -168,7 +168,7 @@ video { .section { position: relative; - padding: clamp(80px, 11vw, 140px) 0; + padding: clamp(56px, 7vw, 96px) 0; } .section-head {