Commit fee3545
feat(website): the stage on the homepage — one real run, scrubbed by scroll (live-stage plan 3 of 3) (#1032)
* docs: plan 3 — the stage on the homepage (live-stage plan 3 of 3)
Eleven tasks: extend the frame's ready message with the hold and reload
boundary; vendor the scroll-craft engine hash-pinned at 0b81622; the beat
map (shares, the 35–70% hold, the threshold, the render tail, cue windows);
rail copy in positioning.ts; the stills fallback; a DOM-only publisher;
the pinned act with engine mount and analytics; the page swap; e2e; the
scroll-craft harness in CI; verification and PR.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
* feat(examples/chat): stage ready message carries the hold and the reload boundary
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
* chore(website): vendor the scroll-craft engine, pinned at 0b81622
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
* test(examples/chat): anchor the ready-message reload assertion to the fixture's reload run
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
* feat(website): stage beat map — shares, the hold, the threshold, cue windows
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
* docs(website): vendored engine README names the real selectors the act re-authors
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
* feat(website): stage rail copy single-sourced in positioning.ts
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
* refactor(website): stage beat map hoists its windows table and degrades forward on a missing beat
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
* feat(website): stage stills — the section's server-rendered form
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
* refactor(website): stage rail copy keys off the beat map's StageBeat and is deeply readonly
The rail's beat union is now the beat map's own type, so renaming a beat in
stage-beats.ts breaks the rail at compile time instead of drifting. Tests
assert the eyebrow matches the beat, every string is present, and the three
hold lines in full. The verbatim-vs-page.tsx cross-check was deliberately not
written: Task 8 deletes the page's FeatureBlocks and positioning.ts becomes
the only source.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
* feat(website): stage publisher — scroll to recorded time, verify attributes, milestones
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
* fix(website): even stage stills keep the wide track when they mirror
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
* feat(website): the pinned stage act — engine mount, frame, rail cues, analytics
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
* fix(website): stage publisher ignores a malformed ready message and survives a throwing tick
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
* feat(website): the stage replaces the four capability blocks on the homepage
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
* fix(website): stage act mounts the engine on a container, mounts once, and is keyboard-skippable
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
* test(website): homepage stage e2e — upgrade, scroll-driven cues, the hold, the stills
Four tests for the pinned act, the first time the vendored engine runs
end to end in a real browser: the desktop upgrade (span 6, the /stage
iframe, sticky .stage-pin, inline height = 6 viewports), scroll-driven
--sc-p with the stream and render cues and the declared verify hold, the
live-frame verify-state test (skipped unless STAGE_LIVE_FRAME=true until
the demo /stage redeploys with hold/reloadEndMs), and the stills on
phones and under reduced motion.
The plan's hold position was 0.55 with a miscomputed window: with the
authored shares (approve 2.4 of 6) the hold is 0.5567..0.6967, so 0.55
sits just outside it. The test scrolls to 0.68, inside the hold and on
the last hold line's plateau. No component change was needed.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
* test(website): scroll-craft verification of the homepage stage in CI
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
* test(website): stage e2e settles on a frame, not a sleep, and samples the hold where it is
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
* ci(website): stage verification serve skips the Nx cache so the content symlink survives
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
* docs: plan 3 records the harness's desktop-only CI pass and the nx serve substitution
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
* fix(stage): the ready handshake survives an empty referrer, and the CI harness step builds once
Ready handshake: with a strict Referrer-Policy the frame had nowhere to
post `ready` and the publisher posted nothing before `ready`, so neither
side ever spoke. The bridge now remembers the last `ready` and re-posts
it the moment an allowlisted message teaches it the parent origin; the
stage component subscribes to seeks before posting `ready` so that
listener exists. The publisher says hello (`{ type, t: 0 }`) at most
once per 500 ms until `ready` arrives. Specs cover both sides.
CI harness step: the stage scroll verification built the website twice
(a standalone build, then the serve's own build dependency) and the
second run dropped the content symlink. The standalone build is gone;
the symlink is added after the readiness curl succeeds. The scroll-craft
README's local commands mirror the same ordering.
Minor: StageAct drops the unused `stage-frame-chrome` and
`stage-rail-heading` class names and gains `stage-rail-beat` /
`stage-rail-hold` test ids, which home-stage.spec.ts now locates by.
`StageMilestone` lives in stage-beats.ts (re-exported from the
publisher) and analytics/events.ts types `stage_event` and `beat` from
it instead of duplicating the unions.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
---------
Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com>1 parent 98b202a commit fee3545
36 files changed
Lines changed: 5666 additions & 190 deletions
File tree
- .github/workflows
- apps/website
- e2e
- scroll-craft
- src
- app
- components/landing
- lib
- analytics
- styles
- vendor/scrollcraft
- docs/superpowers/plans
- examples/chat/angular/src/app/stage
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
672 | 672 | | |
673 | 673 | | |
674 | 674 | | |
| 675 | + | |
| 676 | + | |
| 677 | + | |
| 678 | + | |
| 679 | + | |
| 680 | + | |
| 681 | + | |
| 682 | + | |
| 683 | + | |
| 684 | + | |
| 685 | + | |
| 686 | + | |
| 687 | + | |
| 688 | + | |
| 689 | + | |
| 690 | + | |
| 691 | + | |
| 692 | + | |
| 693 | + | |
| 694 | + | |
| 695 | + | |
| 696 | + | |
| 697 | + | |
| 698 | + | |
| 699 | + | |
| 700 | + | |
| 701 | + | |
| 702 | + | |
675 | 703 | | |
676 | 704 | | |
677 | 705 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
| 46 | + | |
| 47 | + | |
| 48 | + | |
| 49 | + | |
| 50 | + | |
| 51 | + | |
| 52 | + | |
| 53 | + | |
| 54 | + | |
| 55 | + | |
| 56 | + | |
| 57 | + | |
| 58 | + | |
| 59 | + | |
| 60 | + | |
| 61 | + | |
| 62 | + | |
| 63 | + | |
| 64 | + | |
| 65 | + | |
| 66 | + | |
| 67 | + | |
| 68 | + | |
| 69 | + | |
| 70 | + | |
| 71 | + | |
| 72 | + | |
| 73 | + | |
| 74 | + | |
| 75 | + | |
| 76 | + | |
| 77 | + | |
| 78 | + | |
| 79 | + | |
| 80 | + | |
| 81 | + | |
| 82 | + | |
| 83 | + | |
| 84 | + | |
| 85 | + | |
| 86 | + | |
| 87 | + | |
| 88 | + | |
| 89 | + | |
| 90 | + | |
| 91 | + | |
| 92 | + | |
| 93 | + | |
| 94 | + | |
| 95 | + | |
| 96 | + | |
| 97 | + | |
| 98 | + | |
| 99 | + | |
| 100 | + | |
| 101 | + | |
| 102 | + | |
| 103 | + | |
| 104 | + | |
| 105 | + | |
| 106 | + | |
| 107 | + | |
| 108 | + | |
| 109 | + | |
| 110 | + | |
| 111 | + | |
| 112 | + | |
| 113 | + | |
| 114 | + | |
| 115 | + | |
| 116 | + | |
| 117 | + | |
| 118 | + | |
| 119 | + | |
| 120 | + | |
| 121 | + | |
| 122 | + | |
| 123 | + | |
| 124 | + | |
| 125 | + | |
| 126 | + | |
| 127 | + | |
| 128 | + | |
| 129 | + | |
| 130 | + | |
| 131 | + | |
| 132 | + | |
| 133 | + | |
| 134 | + | |
| 135 | + | |
| 136 | + | |
| 137 | + | |
| 138 | + | |
| 139 | + | |
| 140 | + | |
| 141 | + | |
| 142 | + | |
| 143 | + | |
| 144 | + | |
| 145 | + | |
| 146 | + | |
| 147 | + | |
| 148 | + | |
| 149 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
| 46 | + | |
| 47 | + | |
| 48 | + | |
| 49 | + | |
| 50 | + | |
| 51 | + | |
| 52 | + | |
| 53 | + | |
| 54 | + | |
| 55 | + | |
| 56 | + | |
| 57 | + | |
| 58 | + | |
| 59 | + | |
| 60 | + | |
| 61 | + | |
| 62 | + | |
| 63 | + | |
| 64 | + | |
| 65 | + | |
| 66 | + | |
| 67 | + | |
| 68 | + | |
| 69 | + | |
| 70 | + | |
| 71 | + | |
| 72 | + | |
| 73 | + | |
| 74 | + | |
| 75 | + | |
| 76 | + | |
| 77 | + | |
| 78 | + | |
| 79 | + | |
| 80 | + | |
| 81 | + | |
| 82 | + | |
| 83 | + | |
| 84 | + | |
| 85 | + | |
| 86 | + | |
| 87 | + | |
0 commit comments