Re-enable the hero pulse and add gutter curtains #18

Merged
forgejo-admin merged 2 commits from hero-pulse-and-side-curtains into main 2026-08-05 15:07:53 +00:00

Unblocked

@celilo/visualizer@0.3.0 is published, and this branch now depends on ^0.3.0. That release carries the glow rework (batched alpha rings instead of a shadowBlur per pulse) and the empty-text fix the gutter curtains need, so the pulse is affordable and this is safe to merge.

Built against the real published package, not the local link — node_modules was wiped first so resolution is a plain npm install, and the built bundle contains the ring path with zero occurrences of the old shadowBlur = 1 + 10 * inten.

What's in it

The pulse is retuned. speed 0.18 → 1.8 — the old value moved a pulse about 11px/second, which is why they read as stationary flecks rather than travelling light. intensity 0.45 → 0.38, density 0.18 → 0.12.

SideCurtains renders two bare curtain strips in the page gutters, wide viewports only (≥80rem), fading in once the hero scrolls away — the hero is already a full-width curtain and overlapping it muddies both. The right strip is mirrored and both are masked so they fade toward the centre instead of ending in a hard seam.

Two constraints I'd keep if this gets refactored

Both exist so we don't re-lose the performance fight:

  • The strips are fixed to the viewport, not as tall as the document. A full-page-height canvas would be megapixels of one-shot generation.
  • They paint once and then cost nothing. Travelling pulses in the gutters were the literal ask and I took them out: a position: fixed element never leaves the viewport, so pauseWhenOffscreen can never pause it — two more canvases would repaint forever, including while sitting invisible behind the hero. The "chase" is the paint-in animation instead.

Verified

astro check 0 errors, lint:css clean, build green. The tuning numbers were chosen by eye against a locally linked build of the same code that is now published.

🤖 Generated with Claude Code

## ✅ Unblocked `@celilo/visualizer@0.3.0` is published, and this branch now depends on `^0.3.0`. That release carries the glow rework (batched alpha rings instead of a `shadowBlur` per pulse) and the empty-text fix the gutter curtains need, so the pulse is affordable and this is safe to merge. Built against the **real published package**, not the local link — `node_modules` was wiped first so resolution is a plain `npm install`, and the built bundle contains the ring path with **zero** occurrences of the old `shadowBlur = 1 + 10 * inten`. ## What's in it **The pulse is retuned.** `speed` 0.18 → 1.8 — the old value moved a pulse about 11px/second, which is why they read as stationary flecks rather than travelling light. `intensity` 0.45 → 0.38, `density` 0.18 → 0.12. **`SideCurtains`** renders two bare curtain strips in the page gutters, wide viewports only (≥80rem), fading in once the hero scrolls away — the hero is already a full-width curtain and overlapping it muddies both. The right strip is mirrored and both are masked so they fade toward the centre instead of ending in a hard seam. ## Two constraints I'd keep if this gets refactored Both exist so we don't re-lose the performance fight: - **The strips are fixed to the viewport, not as tall as the document.** A full-page-height canvas would be megapixels of one-shot generation. - **They paint once and then cost nothing.** Travelling pulses in the gutters were the literal ask and I took them out: a `position: fixed` element never leaves the viewport, so `pauseWhenOffscreen` can never pause it — two more canvases would repaint forever, including while sitting invisible behind the hero. The "chase" is the paint-in animation instead. ## Verified `astro check` 0 errors, `lint:css` clean, build green. The tuning numbers were chosen by eye against a locally linked build of the same code that is now published. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
DO NOT MERGE until @celilo/visualizer publishes the glow fix and
package.json here is bumped to it. This branch turns the pulse ON while
the dependency still resolves to ^0.2.0, whose glow is a shadowBlur per
pulse — merging as-is would build against the published package and ship
the janky version that had to be reverted.

The pulse itself is retuned: speed 0.18 -> 1.8 (the old value moved a
pulse ~11px/s, so they read as stationary flecks), intensity 0.45 ->
0.38, density 0.18 -> 0.12.

SideCurtains renders two bare curtain strips in the page gutters, wide
viewports only (>= 80rem), fading in once the hero scrolls away — the
hero is already a full-width curtain and overlapping it muddies both.

Two deliberate constraints, both about not re-losing the performance
fight:

- the strips are fixed to the viewport, not as tall as the document. A
  full-page-height canvas would be megapixels of one-shot generation.
- they paint once and then cost nothing. Travelling pulses were the
  literal ask, but a fixed element never leaves the viewport, so
  pauseWhenOffscreen can never pause it — two more canvases would
  repaint forever, including while invisible behind the hero. The
  "chase" is the paint-in.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
0.3.0 carries the glow rework (batched alpha rings instead of a
shadowBlur per pulse) and the empty-text fix the gutter curtains need.
This is what made the pulse affordable, so with the bump landed this
branch is no longer blocked.

Built against the real published package, not the local link: node_modules
was wiped first so the resolution is a plain npm install, and the built
bundle contains the ring path with zero occurrences of the old
`shadowBlur = 1 + 10 * inten`.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
forgejo-admin changed title from WIP: Re-enable the hero pulse and add gutter curtains — BLOCKED on @celilo/visualizer to Re-enable the hero pulse and add gutter curtains 2026-08-05 14:58:16 +00:00
forgejo-admin deleted branch hero-pulse-and-side-curtains 2026-08-05 15:07:53 +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!18
No description provided.