@polymorphism-tech/morph-spec 8.27.0 → 8.29.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (55) hide show
  1. package/CLAUDE.md +1 -0
  2. package/README.md +2 -2
  3. package/bin/morph-spec.js +9 -4
  4. package/claude-plugin.json +1 -1
  5. package/docs/CHEATSHEET.md +3 -2
  6. package/docs/QUICKSTART.md +1 -1
  7. package/framework/MORPH.md +8 -8
  8. package/framework/agents.json +14 -3
  9. package/framework/commands/create-umbraco-lp.md +1 -1
  10. package/framework/docs/CLI.md +6 -5
  11. package/framework/mcp/registry.json +59 -8
  12. package/framework/skills/core/create-umbraco-lp/SKILL.md +13 -2
  13. package/framework/skills/core/create-umbraco-lp/references/umbraco-lp-patterns.md +598 -0
  14. package/framework/skills/core/migrate-lp-to-umbraco/SKILL.md +92 -7
  15. package/framework/skills/core/morph-apply/SKILL.md +1 -1
  16. package/framework/skills/core/morph-brainstorming/SKILL.md +1 -1
  17. package/framework/skills/core/morph-eval/SKILL.md +1 -1
  18. package/framework/skills/core/morph-hotfix/SKILL.md +1 -1
  19. package/framework/skills/core/morph-implement/SKILL.md +1 -1
  20. package/framework/skills/core/morph-plan/SKILL.md +1 -1
  21. package/framework/skills/core/morph-proposal/SKILL.md +1 -1
  22. package/framework/skills/core/morph-review/SKILL.md +1 -1
  23. package/framework/skills/core/morph-stack-scan/SKILL.md +1 -1
  24. package/framework/skills/core/morph-standards/SKILL.md +1 -1
  25. package/framework/skills/core/morph-uiux/SKILL.md +1 -1
  26. package/framework/standards/PROVENANCE.json +41 -0
  27. package/framework/standards/STANDARDS.json +218 -7
  28. package/framework/standards/frontend/design-system/ai-image-generation.md +43 -0
  29. package/framework/standards/frontend/design-system/ai-video-generation.md +113 -0
  30. package/framework/standards/frontend/design-system/premium-finish.md +160 -0
  31. package/framework/standards/frontend/gsap/gsap-core.md +1 -1
  32. package/framework/standards/frontend/gsap/gsap-plugins.md +1 -1
  33. package/framework/standards/frontend/gsap/gsap-scrolltrigger.md +3 -1
  34. package/framework/standards/frontend/nextjs/motion-patterns.md +3 -1
  35. package/framework/standards/frontend/scroll-driven/frame-scrub.md +287 -0
  36. package/framework/standards/frontend/scroll-driven/scroll-components.md +256 -0
  37. package/framework/standards/frontend/scroll-driven/smooth-scroll.md +148 -0
  38. package/framework/standards/frontend/seo/meta-schema-audit.md +134 -0
  39. package/package.json +1 -1
  40. package/src/commands/project/doctor.js +9 -4
  41. package/src/commands/project/worktree.js +45 -3
  42. package/src/commands/state/advance.js +12 -0
  43. package/src/commands/state/approve.js +20 -0
  44. package/src/commands/state/create.js +4 -1
  45. package/src/commands/state/delete.js +63 -4
  46. package/src/commands/state/finish.js +20 -2
  47. package/src/commands/state/gate-check.js +13 -0
  48. package/src/commands/state/gate-decision.js +9 -0
  49. package/src/commands/state/handoff.js +48 -6
  50. package/src/commands/state/list.js +124 -10
  51. package/src/commands/state/score.js +9 -0
  52. package/src/lib/generators/handoff-generator.js +11 -4
  53. package/src/lib/worktree/feature-truth.js +248 -0
  54. package/src/lib/worktree/fleet-scanner.js +1 -65
  55. package/src/lib/worktree/worktree-audit.js +103 -17
@@ -20,6 +20,25 @@
20
20
 
21
21
  **Decision rule:** If the image is unique to the project's brand/aesthetic and doesn't exist as stock, use AI generation. If it's generic and widely available, use stock. If it's geometric or icon-based, use SVG/CSS.
22
22
 
23
+ ## Brand Fidelity: Reference, Don't Invent
24
+
25
+ The advantage of an image MCP over generating from scratch is staying consistent with the client's **real** assets. Pass them as reference (`edit_image` with `referenceImages`) rather than generating in a vacuum. A generated look-alike is a different product, and the client sees it immediately.
26
+
27
+ Two cases where this is a hard rule:
28
+
29
+ - **Property developers and architecture:** the building is the client's **real architectural render**. Never AI-recreate it. AI only animates it (see `frontend/design-system/ai-video-generation.md`) or composes a scene around the real render.
30
+ - **Physical products:** pass the real product photo as reference and generate angle or setting variations of the **same** product.
31
+
32
+ ### Chain from an approved hero
33
+
34
+ Generate the **hero first**. Once approved, use it as the reference for every derived image (detail shots, cards, scene variants), so the whole set shares light, palette and identity instead of looking like separate photo shoots.
35
+
36
+ ```
37
+ hero -> [approved] -> derivatives with the approved hero as referenceImages -> [approved per image]
38
+ ```
39
+
40
+ Skipping this chain is the most common cause of a page whose images do not feel like one set.
41
+
23
42
  ## Gemini Image MCP API
24
43
 
25
44
  ```javascript
@@ -233,6 +252,25 @@ The `assets.md` file is created during the UI/UX phase (Step 4.5) and consumed b
233
252
  - **Priority:** high
234
253
  ```
235
254
 
255
+ ## Downstream: Images That Become Video
256
+
257
+ Static images with faces usually pass image moderation. **Video generation is stricter**: face-bearing img2vid trips moderation (error E005).
258
+
259
+ So if an image is destined to become video footage, frame it without a face from the start (neck down, hands, the product). For tailoring, craft and manufacturing subjects this usually improves the shot anyway, because the product becomes the subject. See `frontend/design-system/ai-video-generation.md`.
260
+
261
+ For a frame that will drive a scroll scrub, also generate at the exact ratio the video will output, and place the subject on the side **opposite** the copy. See `frontend/design-system/premium-finish.md`.
262
+
263
+ ## The Two Assets Everyone Forgets
264
+
265
+ - **Favicon / monogram.** Derive a simple mark (one or two letters, or the existing symbol) that reads at 32x32. Use `edit_image` from the real logo so it stays on-brand. Export PNG at 512x512 and let the browser downscale. **Never invent a new logo**, simplify the existing one.
266
+ - **OG / share image (1200x630).** The image that appears when the link is pasted into a chat or a feed. Use the strongest shot on the page, with breathing room for a possible brand overlay. Generate or crop at that exact ratio. See `frontend/seo/meta-schema-audit.md`.
267
+
268
+ ## Variations and Cost
269
+
270
+ Generate **two or three variations per image**, varying angle, light or composition, **not just the seed**. Seed-only variation produces near-identical options and wastes the review.
271
+
272
+ If none are good, regenerate at the same step with the prompt adjusted by the feedback. **Do not advance with a weak image**: every derivative, any footage built from it, and the final page all inherit its quality.
273
+
236
274
  ## Quality Checklist
237
275
 
238
276
  - [ ] Colors match design system tokens (no random colors in prompts)
@@ -244,5 +282,10 @@ The `assets.md` file is created during the UI/UX phase (Step 4.5) and consumed b
244
282
  - [ ] `priority` prop set for above-the-fold images
245
283
  - [ ] Build compiles after integration (`npm run build`)
246
284
  - [ ] Image visible in dev server at correct route
285
+ - [ ] Client assets passed as `referenceImages`; nothing generated in a vacuum
286
+ - [ ] Real renders and real product photos used as-is, never AI-recreated
287
+ - [ ] Hero approved first, then used as reference for derivatives
288
+ - [ ] Images headed for video framed without faces
289
+ - [ ] Favicon and 1200x630 OG image produced
247
290
 
248
291
  *MORPH-SPEC by Polymorphism Tech*
@@ -0,0 +1,113 @@
1
+ # AI Video Generation — Directional Footage for Scroll Scrub
2
+
3
+ > **Scope:** frontend-design-system
4
+ > **Layer:** 3
5
+ > **Keywords:** video generation, seedance, img2vid, endImage, directional footage, loop video, E005 moderation, cost ladder
6
+ > **Load When:** producing footage for a scroll-driven page or animating a client render
7
+
8
+ **Verified against:** seedance MCP (generate_video, generate_loop_video, get_video, list_videos) over Replicate. Last-verified: 2026-08-21.
9
+
10
+ ---
11
+
12
+ How to generate footage that actually works under scroll control. The single most expensive mistake here is generating a perfect loop for a scrub section, which produces a page that feels frozen while the user scrolls. Covers the loop-versus-directional distinction, how to build directional footage, the face moderation workaround, and the cost ladder.
13
+
14
+ This is the knowledge layer. The approval gates that stop generation from burning credit belong to the calling workflow, not to this standard.
15
+
16
+ ---
17
+
18
+ ## Section 1: The Distinction That Decides Everything
19
+
20
+ A **perfect loop** has a last frame identical to its first: the camera and everything in it return to the start. That is exactly right for a video that plays itself on repeat, and exactly wrong for scrubbing. With start and end nearly identical, dragging the scroll appears to change nothing, and the page reads as static while the user scrolls.
21
+
22
+ Scrubbing needs the opposite: **directional movement**, with the end clearly different from the start. The scroll becomes the control for a camera traveling from one point to another.
23
+
24
+ | Use | Tool | Start vs end | Why |
25
+ |---|---|---|---|
26
+ | Hero or section driven by scroll | `generate_video` + `endImage` | **different** (push-in, dolly, reveal) | scroll must feel progression |
27
+ | Ambient background that plays itself | `generate_loop_video` | **identical** (loop seal) | seamless repeat |
28
+ | Animating a real client render | `generate_video` (img2vid) | per the desired movement | the building comes from the client, AI only animates |
29
+
30
+ **Directional is the default.** A seamless loop is the special case, reserved for a secondary ambient plane.
31
+
32
+ ---
33
+
34
+ ## Section 2: Building Directional Footage
35
+
36
+ Give a start image and an end image, and let the model interpolate a camera traveling between them.
37
+
38
+ 1. Pick or generate the **start frame**: the wide shot, the resting state.
39
+ 2. Pick or generate the **end frame** (`endImage`): the destination of the movement (a detail in close-up, a revealed facade).
40
+ 3. Call `generate_video { prompt, image: start, endImage: end }`. The prompt describes the camera movement between the two.
41
+
42
+ **Movements that scrub well:**
43
+
44
+ - **Push-in / dolly-in**: wide to detail. The most reliable by a wide margin.
45
+ - **Reveal**: camera rises or translates, uncovering more of the subject.
46
+ - **Pull-back**: detail to context, the inverse of push-in.
47
+ - **Slow tilt or pan** anchored on a subject.
48
+
49
+ **Avoid for scrub:** full orbits and any movement that returns to its origin. They become loops and kill the sense of progress.
50
+
51
+ ---
52
+
53
+ ## Section 3: Faces Trip Moderation
54
+
55
+ Img2vid with a **human face** repeatedly fails moderation (error E005). The workaround that works is to **crop the face out of frame** before generating.
56
+
57
+ - Frame from the neck down (garment, hands, fabric) rather than the whole person. For tailoring, craft and manufacturing this usually improves the shot, because the product becomes the subject.
58
+ - Hands working (at a cuff, a button, the material) pass reliably and carry the craft story.
59
+ - If the client insists on a face, generate the **static image** with it (image generation is more permissive) and reserve video for the face-free shots.
60
+
61
+ ---
62
+
63
+ ## Section 4: The Cost Ladder
64
+
65
+ Every generation costs money and you rarely nail the movement on the first attempt.
66
+
67
+ 1. **Draft:** fast model, 480p, 4s. Enough to judge framing and movement.
68
+ 2. **Final:** only after the draft is approved, regenerate at 1080p. Then re-extract frames and swap them into the build **with a cache-bust** (`?v=N`), or the browser serves the old ones. See `frontend/scroll-driven/frame-scrub.md`.
69
+
70
+ Never open at 1080p.
71
+
72
+ ---
73
+
74
+ ## Section 5: Prompt Skeleton
75
+
76
+ A directional prompt does not need a loop seal. It needs to be specific about camera, start, end and legibility:
77
+
78
+ ```
79
+ SCENE: [subject without a face: material, color, detail]. [environment]. Mood reference: [1-2 real refs]. Palette: [tones].
80
+ CAMERA: [directional movement] from the start frame to the end frame. Speed [slow, cinematic].
81
+ Start = [start image], end = [endImage]. Does NOT return to the start.
82
+ ACTION ARC: opens on [initial state], camera [pushes / reveals] until [final state or detail].
83
+ No elements that return to their starting position.
84
+ LIGHTING: [source, temperature]. Stable from start to finish, no flicker or color shift.
85
+ LEGIBILITY: leave a calm, dark region on one side of the frame for the page copy to sit over.
86
+ The subject stays on the side OPPOSITE the copy; if it comes out on the wrong side,
87
+ mirror it at extraction time (hflip).
88
+ TECHNICAL: img2vid with image (start) + endImage (end). No audio. No watermark.
89
+ Draft 480p/4s; 1080p only after approval.
90
+ ```
91
+
92
+ **Tone:** direct and technical, like director's notes. No hype words ("stunning", "breathtaking"). Describe what happens on screen, not editing software.
93
+
94
+ ---
95
+
96
+ ## Section 6: Async Contract
97
+
98
+ `generate_video` and `generate_loop_video` return a `request_id` rather than a file. Poll with `get_video { requestId, outputPath? }`, which downloads the `.mp4` once the job reports COMPLETED. `list_videos { limit? }` reads local job history and spends no credits, which also makes it the safe health check for the MCP.
99
+
100
+ ---
101
+
102
+ ## Checklist
103
+
104
+ - [ ] Directional footage (start differs from end) for anything scroll-driven
105
+ - [ ] Seamless loop used only for a self-playing ambient plane
106
+ - [ ] Client renders animated, never AI-recreated
107
+ - [ ] Faces cropped out of frame before img2vid
108
+ - [ ] Movement chosen from the scrub-friendly list, no orbits or returns
109
+ - [ ] Prompt reserves a calm region for copy, subject opposite the text
110
+ - [ ] Draft at 480p/4s approved before any 1080p render
111
+ - [ ] Frames re-extracted with a bumped cache-bust after the final render
112
+
113
+ *MORPH-SPEC by Polymorphism Tech*
@@ -0,0 +1,160 @@
1
+ # Premium Finish — The Layer That Separates Good From Expensive
2
+
3
+ > **Scope:** frontend-design-system
4
+ > **Layer:** 3
5
+ > **Keywords:** premium, polish, typography, film grain, atmosphere, load-in, scrim, legibility over video, accent
6
+ > **Load When:** ui-designer active, or the brief asks for a premium or high-end feel
7
+
8
+ **Verified against:** Production landing pages, CSS-only techniques, no runtime dependency. Last-verified: 2026-08-21.
9
+
10
+ ---
11
+
12
+ A build that runs, is responsive and has scroll animation can still look like a template. The gap between that and something a client reads as expensive is a finish layer applied on purpose. This is that checklist and the reasoning behind each item.
13
+
14
+ **Read these as principles, not as a recipe.** The goal is to hit the quality *level* for any brand, not to reproduce one project's aesthetic choices. Each item states the principle, which always holds, and then an illustrative answer in italics, which is one option among many.
15
+
16
+ **Never converge on the same choices across projects.** Same font, same palette, same gradient across clients is the failure mode. Each page should look designed for that business.
17
+
18
+ ---
19
+
20
+ ## Section 1: Typography With Character
21
+
22
+ Stack default fonts (Inter, Roboto, Arial, system) and the fonts that have become AI-generation tells (Space Grotesk, Playfair) announce "made by a machine". Commit to a display face with real personality, chosen from the brand: what it sells, to whom, at what temperature. Pair a distinctive display with a sober, legible body.
23
+
24
+ - Enable `font-optical-sizing: auto`.
25
+ - Tighten `letter-spacing` slightly on large headings (`-0.012em` to `-0.015em`) for an editorial set.
26
+
27
+ *One project (menswear tailoring) used Cormorant for headings and Jost for body. For a property developer or a SaaS the answer is different. Cormorant is not the rule, it was one answer.*
28
+
29
+ ---
30
+
31
+ ## Section 2: Atmosphere, Never Flat Color
32
+
33
+ Solid backgrounds flatten. Depth and texture make the eye read material. All of these generalize: film grain, subtle radial gradients (a brand glow), vignette, gradient meshes, dramatic shadows, layered transparency.
34
+
35
+ Film grain is cheap and universal, via an inline SVG `feTurbulence`:
36
+
37
+ ```css
38
+ body::after {
39
+ content: ''; position: fixed; inset: 0; z-index: 200; pointer-events: none;
40
+ opacity: 0.055; mix-blend-mode: overlay;
41
+ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='160' height='160'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.82' numOctaves='2' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='160' height='160' filter='url(%23n)'/%3E%3C/svg%3E");
42
+ }
43
+ ```
44
+
45
+ The correct opacity is low: texture you feel, not texture you see. Calibrate per brand and per how dark the theme is.
46
+
47
+ ---
48
+
49
+ ## Section 3: One Orchestrated Load-In Beats Ten Micro-Interactions
50
+
51
+ A single well-choreographed page load (hero elements rising in stagger) delivers more impact than effects scattered across the page. Concentrate the effort on first contact.
52
+
53
+ Animate the children of the first hero block with one keyframe and increasing `animation-delay`: kicker, then H1, then subtitle, then CTA.
54
+
55
+ ```css
56
+ @keyframes heroRise {
57
+ from { opacity: 0; transform: translateY(28px); }
58
+ to { opacity: 1; transform: none; }
59
+ }
60
+ .hero-beat--1 .kicker,
61
+ .hero-beat--1 h1,
62
+ .hero-beat--1 .sub,
63
+ .hero-beat--1 .actions {
64
+ opacity: 0; animation: heroRise 1.1s cubic-bezier(.2,.7,.2,1) forwards;
65
+ }
66
+ .hero-beat--1 .kicker { animation-delay: .30s }
67
+ .hero-beat--1 h1 { animation-delay: .46s }
68
+ .hero-beat--1 .sub { animation-delay: .68s }
69
+ .hero-beat--1 .actions { animation-delay: .84s }
70
+ ```
71
+
72
+ The exact delays are an example rhythm. The principle is stagger on first impact.
73
+
74
+ ---
75
+
76
+ ## Section 4: Legibility Over Video (Close To a Hard Rule)
77
+
78
+ Text over video or photography is where a premium hero most often breaks. Solve it with a **directional scrim plus text-shadow**, every time.
79
+
80
+ The scrim darkens exactly the side where the copy lives and stays clear over the subject. A uniform veil is the wrong tool: it dims the whole image and kills the footage.
81
+
82
+ ```css
83
+ .scrub__scrim {
84
+ position: absolute; inset: 0;
85
+ background: linear-gradient(90deg,
86
+ rgba(14,11,12,.86) 0%, rgba(14,11,12,.5) 38%, rgba(14,11,12,0) 70%);
87
+ }
88
+ .scrub__copy {
89
+ text-shadow: 0 1px 3px rgba(0,0,0,.5), 0 4px 34px rgba(0,0,0,.5);
90
+ }
91
+ ```
92
+
93
+ The text-shadow is the insurance policy: it keeps the copy readable if a bright frame passes behind it.
94
+
95
+ If the subject collides with the copy, mirror the footage at extraction time (`hflip`) to throw the subject to the opposite side. See `frontend/scroll-driven/frame-scrub.md`.
96
+
97
+ ---
98
+
99
+ ## Section 5: One Precious Accent, Used Sparingly
100
+
101
+ A jewel-like detail in very few places (primary CTA, a proof number, one heading highlight) raises perceived value. Sparing and precise: if everything shines, nothing does.
102
+
103
+ ```css
104
+ /* light sweep on the CTA */
105
+ .btn-accent { position: relative; overflow: hidden; }
106
+ .btn-accent::before {
107
+ content: ''; position: absolute; top: 0; left: -130%; width: 55%; height: 100%;
108
+ transform: skewX(-22deg); pointer-events: none;
109
+ background: linear-gradient(90deg, transparent, rgba(255,255,255,.6), transparent);
110
+ transition: left .6s cubic-bezier(.2,.7,.2,1);
111
+ }
112
+ .btn-accent:hover::before { left: 150%; }
113
+
114
+ /* metallic gradient text */
115
+ .metallic {
116
+ background: linear-gradient(180deg, #fff3cf 0%, #ffecb4 28%, #c9a24b 62%, #9a7b35 100%);
117
+ -webkit-background-clip: text; background-clip: text;
118
+ -webkit-text-fill-color: transparent;
119
+ filter: drop-shadow(0 2px 16px rgba(201,162,75,.25));
120
+ }
121
+ ```
122
+
123
+ *The gold above is one answer. For another brand the accent could be chrome, copper, a brand neon, or a single stroke of color. The principle is "one precious accent, used sparingly", not "use gold".*
124
+
125
+ ---
126
+
127
+ ## Section 6: The Details That Add Up
128
+
129
+ - Scrollbar styled in brand color, not browser gray.
130
+ - `::selection` in the accent color.
131
+ - Hairlines (1px) as gradients that fade at the ends, instead of solid borders.
132
+ - Hover states with a micro-transition (a gap that grows, an arrow that advances), never binary on/off.
133
+ - Consistent radii and a spacing system, not loose numbers.
134
+
135
+ ---
136
+
137
+ ## Section 7: Order of Application
138
+
139
+ Apply this from the start of the build, not as a final polish pass. The client judges in two seconds.
140
+
141
+ 1. Define brand tokens first (colors, fonts, radii, shadows) as CSS variables. Everything inherits from there.
142
+ 2. Apply atmosphere globally (grain plus glow).
143
+ 3. Work the hero until the load-in and legibility are flawless.
144
+ 4. Place the accent in two or three spots, maximum.
145
+ 5. Sweep the details (scrollbar, selection, hovers, hairlines).
146
+
147
+ Finish with fresh eyes: open the page as if you were the client. Whatever looks like a template is the next thing to raise.
148
+
149
+ ---
150
+
151
+ ## Checklist
152
+
153
+ - [ ] Display font chosen from the brand, not from stack defaults or the AI-tell list
154
+ - [ ] Brand tokens defined as CSS variables before any component styling
155
+ - [ ] Atmosphere layer applied (grain, glow, or equivalent) at low opacity
156
+ - [ ] Hero load-in staggered with a single keyframe and increasing delays
157
+ - [ ] Directional scrim plus text-shadow on every text-over-media block
158
+ - [ ] Accent used in three places or fewer
159
+ - [ ] Details swept: scrollbar, selection, hairlines, hover micro-transitions
160
+ - [ ] Fresh-eyes pass done, and it does not read as a template
@@ -3,7 +3,7 @@
3
3
  > **Scope:** frontend-nextjs-ui
4
4
  > **Layer:** 3
5
5
  > **Keywords:** gsap, animation, timeline, tween, useGSAP, greensock, transform
6
- > **Load When:** gsap-animator active
6
+ > **Load When:** ui-designer active, or the project animates with GSAP
7
7
 
8
8
  **Verified against:** GSAP 3.13 + @gsap/react. Last-verified: 2026-05-20.
9
9
 
@@ -3,7 +3,7 @@
3
3
  > **Scope:** frontend-nextjs-gsap
4
4
  > **Layer:** 3
5
5
  > **Keywords:** flip, splittext, morphsvg, drawsvg, motionpath, draggable, observer, scrollto, gsap-plugins
6
- > **Load When:** gsap-animator active
6
+ > **Load When:** ui-designer active, or the project animates with GSAP
7
7
 
8
8
  **Verified against:** GSAP 3.13 + @gsap/react. Last-verified: 2026-05-20.
9
9
 
@@ -3,7 +3,7 @@
3
3
  > **Scope:** frontend-nextjs-gsap
4
4
  > **Layer:** 3
5
5
  > **Keywords:** scrolltrigger, scroll-animation, pinning, scrubbing, parallax, scroll-driven, gsap
6
- > **Load When:** gsap-animator active
6
+ > **Load When:** ui-designer active, or the project animates with GSAP
7
7
 
8
8
  **Verified against:** GSAP 3.13 ScrollTrigger + @gsap/react. Last-verified: 2026-05-20.
9
9
 
@@ -11,6 +11,8 @@
11
11
 
12
12
  Reference guide for implementing scroll-driven animations in Next.js projects using GSAP ScrollTrigger. Covers plugin setup, scrubbing, pinning, batch processing, responsive breakpoints, SSR considerations, and mandatory cleanup patterns.
13
13
 
14
+ **Pair this with a smooth scroller before shipping a cinematic page.** ScrollTrigger reads native scroll on its own, which is correct for app UI. A landing page whose scroll drives a scene wants Lenis handing scroll to ScrollTrigger through the GSAP ticker, plus the instance exposed on `window` so overlays and automated verification can drive it. That wiring, and the traps that come with it, live in `frontend/scroll-driven/smooth-scroll.md`.
15
+
14
16
  ---
15
17
 
16
18
  ## Section 1: Plugin Registration
@@ -9,7 +9,9 @@
9
9
 
10
10
  ---
11
11
 
12
- Reference guide for implementing animations and transitions in Next.js projects using **Motion for React** — the library formerly published as `framer-motion`. The package is now `motion` and components import from `motion/react`; the `framer-motion` name only survives inside the Framer design tool. Covers the canonical variants library, design token bridge, scroll and gesture patterns, loading states, and mandatory WCAG accessibility compliance.
12
+ Reference guide for implementing animations and transitions in Next.js projects using **Motion for React**, the library formerly published as `framer-motion`. The package is now `motion` and components import from `motion/react`; the `framer-motion` name only survives inside the Framer design tool. Covers the canonical variants library, design token bridge, scroll and gesture patterns, loading states, and mandatory WCAG accessibility compliance.
13
+
14
+ **Scope, and where the other motion stack starts.** This standard governs component-level motion: enter and exit, gestures, mount and unmount transitions, short scroll reveals in an app or product UI. When the scroll position itself drives the scene (frame scrubs, pinned sequences, parallax, a cinematic landing page), that is GSAP plus ScrollTrigger plus Lenis: see `frontend/scroll-driven/smooth-scroll.md` and `frontend/gsap/gsap-core.md`. The two stacks may share a page but never the same element, because both write inline styles and will fight for control. On a page that runs Lenis, use the `useReveal` recipe in `frontend/scroll-driven/scroll-components.md` rather than `whileInView`, so a single library owns the answer to when an element is visible.
13
15
 
14
16
  ---
15
17