Link-preview card, schedule rework, purple Nx favicon #7

Merged
forgejo-admin merged 6 commits from og-preview-image into main 2026-08-04 20:39:43 +00:00

Three things, two commits.

1. Shares stop showing a barn

The page had no og:image, so Messenger and other scrapers fell back to the first <img> in the DOM — the white barn with an American flag that Ciao Felicia are photographed in front of. Not the vibe.

The preview is now the NEXUS wordmark. Scrapers never run the hero canvas, so it is baked to a static 1200×630 JPEG (140 KB) rendered through /play?sync=1 — that flag exists precisely because a hidden tab fires no rAF, which is the same reason headless Chrome could never screenshot the painted mark all session. Composed onto the site background and centred on the canvas midpoint.

og:image is ignored unless absolute, so astro.config.mjs gains site. That is a build-time constant that must track the module's domain config, the same wart CELILO_ROUTE already carries. Verified the emitted tags resolve correctly under the real route:

og:image   https://tangonexus.com/nexus/og.jpg
og:url     https://tangonexus.com/nexus/
canonical  https://tangonexus.com/nexus/

2. Schedule grouped by day, performers linked to bios

The five sessions read as equal-weight blocks, which hid the shape of the weekend — Saturday runs three of them back to back. They now sit under big day headings (Friday / Saturday / Sunday), each session's times in their own column so an evening is scannable, credits on one line, blurb below.

Every performer credit links to their bio card and smooth-scrolls there (the global scroll-behavior: smooth already covers it). Both sides derive the anchor from a single bioId() helper over a shared roster in src/lib/people.ts, so an id cannot drift out from under a link — and Schedule throws at build time if it credits a name with no bio, so a dead anchor fails the build rather than scrolling nowhere. Bio cards got the same sticky-nav scroll clearance the sections have.

Verified in the built HTML that all nine href="#bio-…" values have exactly matching ids.

Sandy Ninh and Steve Carruthers stay unlinked — they teach the classes but have no bio card yet. Worth adding if you have copy for them.

3. Favicon

Replaces what was still the stock Astro logo with a purple Nx on a dark tile. Checked at 128, 32 and 16px; it holds up at favicon size.

Verified

astro check 0 errors, lint:css clean, build green, and the rendered schedule and bios reviewed at 1100px.

Note

Once this deploys, Facebook/Messenger will still show the barn from cache — their scraper caches aggressively. Re-scrape via the Sharing Debugger to force it.

🤖 Generated with Claude Code

Three things, two commits. ## 1. Shares stop showing a barn The page had **no `og:image`**, so Messenger and other scrapers fell back to the first `<img>` in the DOM — the white barn with an American flag that Ciao Felicia are photographed in front of. Not the vibe. The preview is now the NEXUS wordmark. Scrapers never run the hero canvas, so it is baked to a static 1200×630 JPEG (140 KB) rendered through `/play?sync=1` — that flag exists precisely because a hidden tab fires no `rAF`, which is the same reason headless Chrome could never screenshot the painted mark all session. Composed onto the site background and centred on the canvas midpoint. `og:image` is ignored unless absolute, so `astro.config.mjs` gains `site`. That is a **build-time constant that must track the module's `domain` config**, the same wart `CELILO_ROUTE` already carries. Verified the emitted tags resolve correctly under the real route: ``` og:image https://tangonexus.com/nexus/og.jpg og:url https://tangonexus.com/nexus/ canonical https://tangonexus.com/nexus/ ``` ## 2. Schedule grouped by day, performers linked to bios The five sessions read as equal-weight blocks, which hid the shape of the weekend — Saturday runs three of them back to back. They now sit under big day headings (Friday / Saturday / Sunday), each session's times in their own column so an evening is scannable, credits on one line, blurb below. Every performer credit links to their bio card and smooth-scrolls there (the global `scroll-behavior: smooth` already covers it). Both sides derive the anchor from a single `bioId()` helper over a shared roster in `src/lib/people.ts`, so an id cannot drift out from under a link — and `Schedule` **throws at build time** if it credits a name with no bio, so a dead anchor fails the build rather than scrolling nowhere. Bio cards got the same sticky-nav scroll clearance the sections have. Verified in the built HTML that all nine `href="#bio-…"` values have exactly matching `id`s. Sandy Ninh and Steve Carruthers stay unlinked — they teach the classes but have no bio card yet. Worth adding if you have copy for them. ## 3. Favicon Replaces what was still the **stock Astro logo** with a purple `Nx` on a dark tile. Checked at 128, 32 and 16px; it holds up at favicon size. ## Verified `astro check` 0 errors, `lint:css` clean, build green, and the rendered schedule and bios reviewed at 1100px. ## Note Once this deploys, Facebook/Messenger will still show the barn from cache — their scraper caches aggressively. Re-scrape via the [Sharing Debugger](https://developers.facebook.com/tools/debug/) to force it. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
The page had no og:image, so Messenger and other scrapers fell back to
the first <img> in the DOM — the white barn with an American flag that
Ciao Felicia are photographed in front of.

The preview is now the NEXUS wordmark itself. Scrapers never run the
hero canvas, so it is baked to a static 1200x630 JPEG, rendered via
/play?sync=1 (which paints in one synchronous burst precisely because a
hidden tab fires no rAF) and composed onto the site background.

og:image must be absolute or it is ignored, so astro.config gains `site`
— a build-time constant that has to track the module's `domain`, the
same wart CELILO_ROUTE already carries.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
The five sessions read as equal-weight blocks, which hid the shape of
the weekend — Saturday runs three of them back to back. They now sit
under big day headings, with each session's times in their own column so
an evening can be scanned down the page.

Every performer credit is a link to that person's bio card. Both sides
derive the anchor from one bioId() helper over a shared roster, so an id
cannot drift out from under a link, and Schedule throws at build time if
it credits a name with no bio — a dead anchor fails the build instead of
scrolling nowhere. Bio cards carry the same sticky-nav scroll clearance
the sections do.

Sandy Ninh and Steve Carruthers stay unlinked: they teach the classes
but have no bio card yet.

Also replaces the stock Astro favicon with a purple Nx tile.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
The day headings were carrying the grouping on their own at up to
3.5rem, which read as shouting. Cards do that job structurally, so the
type comes down to ~1.75rem and the heavy accent underline softens to a
hairline.

Each day and each bio now sits on its own card: a low-alpha blue →
purple → pink diagonal over --panel, a violet-tinted hairline border,
and an inset top highlight so the edge catches like glass rather than
looking like a flat box. Same treatment both places, so the schedule and
the bios read as one system.

No changeset — this restyles work that has not shipped yet.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Three asks from review:

- A lone portrait now floats left so the bio wraps around it instead of
  sitting in a block underneath. Only when there IS one: floating Ciao
  Felicia's three tiles (or Eric's two) would leave a column too narrow
  to read in a 44rem card, so those stay a row on top. data-count on
  photo-row carries the distinction. The card is display:flow-root so
  the float can't escape its gradient border, and the float is dropped
  below 34rem where it would squeeze text into ~150px.

- "Live Music" and "DJs" grew from 1rem captions to real section
  headings with a trailing rule — they are nav destinations now.

- The nav's single "Bios" stop became "Live Music" and "DJs", landing on
  those headings via new ids on <bio-group>. Verified both resolve in
  the built HTML.

No changeset — still refining unreleased work.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Below 40rem everything except Tickets folds into a hamburger; Tickets
stays right-flushed as its own button. Below 34rem a bio shows only its
first photo.

The toggle is a checkbox, not <details>. <details> was the first attempt
and it broke the wide layout: a closed <details> hides its content via
::details-content, which author CSS cannot reliably un-hide, so
display:contents on the details box left the wide nav showing Tickets
alone. Measured, not guessed. A checkbox keeps the state in CSS we
control, needs no JS, and the input stays focusable so the menu opens
from the keyboard.

Wide layout needed one repair: with nav-menu dissolved by
display:contents, nav has three flex children and space-between
stranded Partiful in the middle, so the first group takes the slack via
margin-right:auto (scoped min-width — in the narrow menu link-group is a
grid item, where an auto margin would stop the buttons filling it).

Ciao Felicia's photos are reordered to lead with the band mid-
performance. Only the first survives on a phone, and the barn exterior
was the shot that made the site look like a farm listing.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
forgejo-admin deleted branch og-preview-image 2026-08-04 20:39:43 +00:00
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
celilo/tango-nexus!7
No description provided.