@struq/skill 0.0.0-stage → 0.2.2
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.
- package/LICENSE +21 -0
- package/README.md +141 -2
- package/cli/struq.mjs +132 -0
- package/package.json +41 -4
- package/skills/struq/SKILL.md +237 -0
- package/skills/struq/cinematic/README.md +409 -0
- package/skills/struq/cinematic/checklists/01-preproduction.md +15 -0
- package/skills/struq/cinematic/checklists/02-implementation.md +17 -0
- package/skills/struq/cinematic/checklists/03-polish.md +17 -0
- package/skills/struq/cinematic/examples/code/nextjs/README.md +13 -0
- package/skills/struq/cinematic/examples/code/nextjs/app/cinematic-experience.tsx +13 -0
- package/skills/struq/cinematic/examples/code/nextjs/app/components/LenisRoot.tsx +42 -0
- package/skills/struq/cinematic/examples/code/nextjs/app/page.tsx +6 -0
- package/skills/struq/cinematic/examples/code/shared/CameraRig.tsx +65 -0
- package/skills/struq/cinematic/examples/code/shared/ExperienceCanvas.tsx +20 -0
- package/skills/struq/cinematic/examples/code/shared/ExperienceDirector.tsx +57 -0
- package/skills/struq/cinematic/examples/code/shared/ExperienceOverlay.tsx +37 -0
- package/skills/struq/cinematic/examples/code/shared/ExperiencePage.tsx +52 -0
- package/skills/struq/cinematic/examples/code/shared/GsapFrameLoop.tsx +32 -0
- package/skills/struq/cinematic/examples/code/shared/InteriorRoot.tsx +30 -0
- package/skills/struq/cinematic/examples/code/shared/README.md +20 -0
- package/skills/struq/cinematic/examples/code/shared/SubjectRig.tsx +58 -0
- package/skills/struq/cinematic/examples/code/shared/build-experience-timeline.ts +237 -0
- package/skills/struq/cinematic/examples/code/shared/direction.ts +52 -0
- package/skills/struq/cinematic/examples/code/shared/gsap-client.ts +32 -0
- package/skills/struq/cinematic/examples/code/shared/math.ts +12 -0
- package/skills/struq/cinematic/examples/code/shared/registry.ts +58 -0
- package/skills/struq/cinematic/examples/code/shared/runtime.ts +52 -0
- package/skills/struq/cinematic/examples/code/shared/styles.css +127 -0
- package/skills/struq/cinematic/examples/code/shared/useExperienceInput.ts +42 -0
- package/skills/struq/cinematic/examples/code/vite/README.md +14 -0
- package/skills/struq/cinematic/examples/code/vite/src/App.tsx +11 -0
- package/skills/struq/cinematic/examples/code/vite/src/LenisRoot.tsx +37 -0
- package/skills/struq/cinematic/examples/code/vite/src/main.tsx +9 -0
- package/skills/struq/cinematic/examples/concise/01-chapter-spec-example.md +42 -0
- package/skills/struq/cinematic/examples/concise/02-handoff-example.md +25 -0
- package/skills/struq/cinematic/examples/concise/03-audit-finding-example.md +13 -0
- package/skills/struq/cinematic/examples/verbose/01-full-experience-direction.md +687 -0
- package/skills/struq/cinematic/examples/verbose/02-full-audit-example.md +362 -0
- package/skills/struq/cinematic/references/01-core-mental-model.md +221 -0
- package/skills/struq/cinematic/references/02-vocabulary.md +384 -0
- package/skills/struq/cinematic/references/03-experience-architecture.md +302 -0
- package/skills/struq/cinematic/references/04-timeline-choreography.md +264 -0
- package/skills/struq/cinematic/references/05-handoff-contracts.md +241 -0
- package/skills/struq/cinematic/references/06-three-rig-architecture.md +286 -0
- package/skills/struq/cinematic/references/07-stack-integration.md +228 -0
- package/skills/struq/cinematic/references/08-gsap-plugin-patterns.md +218 -0
- package/skills/struq/cinematic/references/09-tuning-harness.md +202 -0
- package/skills/struq/cinematic/references/10-quality-systems.md +206 -0
- package/skills/struq/cinematic/references/11-agent-workflows.md +246 -0
- package/skills/struq/cinematic/references/12-audit-rubric.md +176 -0
- package/skills/struq/cinematic/references/13-official-docs.md +53 -0
- package/skills/struq/cinematic/templates/01-experience-brief.md +105 -0
- package/skills/struq/cinematic/templates/02-experience-contract.md +80 -0
- package/skills/struq/cinematic/templates/03-chapter-spec.md +103 -0
- package/skills/struq/cinematic/templates/04-handoff-contract.md +102 -0
- package/skills/struq/cinematic/templates/05-ownership-matrix.md +29 -0
- package/skills/struq/cinematic/templates/06-shot-presets.md +59 -0
- package/skills/struq/cinematic/templates/07-implementation-slice.md +66 -0
- package/skills/struq/cinematic/templates/08-tuning-register.md +36 -0
- package/skills/struq/cinematic/templates/09-acceptance-tests.md +57 -0
- package/skills/struq/references/anti-patterns.md +265 -0
- package/skills/struq/references/baseline-prompt.md +118 -0
- package/skills/struq/references/brand.md +143 -0
- package/skills/struq/references/brief-router.md +219 -0
- package/skills/struq/references/composition.md +191 -0
- package/skills/struq/references/depth-parallax.md +235 -0
- package/skills/struq/references/direction.md +188 -0
- package/skills/struq/references/feel-layer.md +107 -0
- package/skills/struq/references/gsap-api.md +293 -0
- package/skills/struq/references/iconography.md +255 -0
- package/skills/struq/references/imagery.md +144 -0
- package/skills/struq/references/loaders.md +287 -0
- package/skills/struq/references/micro-interactions.md +270 -0
- package/skills/struq/references/mobile-composition.md +70 -0
- package/skills/struq/references/nav-header.md +296 -0
- package/skills/struq/references/page-architecture.md +134 -0
- package/skills/struq/references/page-entrances.md +198 -0
- package/skills/struq/references/performance.md +235 -0
- package/skills/struq/references/pinning-scrub.md +341 -0
- package/skills/struq/references/pitfalls.md +290 -0
- package/skills/struq/references/route-transitions.md +281 -0
- package/skills/struq/references/scaling.md +151 -0
- package/skills/struq/references/scroll-reveals.md +280 -0
- package/skills/struq/references/seo.md +219 -0
- package/skills/struq/references/setup.md +397 -0
- package/skills/struq/references/showcase.md +87 -0
- package/skills/struq/references/stack-targets.md +78 -0
- package/skills/struq/references/struq-imagery.md +107 -0
- package/skills/struq/references/svg-motion.md +390 -0
- package/skills/struq/references/transitions.md +160 -0
- package/skills/struq/references/triage.md +71 -0
- package/skills/struq/references/typography.md +720 -0
- package/skills/struq/references/vibe-presets.md +287 -0
- package/skills/struq/references/webgl-r3f.md +274 -0
- package/skills/struq/references/webgl-scenes.md +593 -0
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
# Chapter Specification
|
|
2
|
+
|
|
3
|
+
## Identity
|
|
4
|
+
|
|
5
|
+
**Chapter ID:**
|
|
6
|
+
|
|
7
|
+
**Name:**
|
|
8
|
+
|
|
9
|
+
**Narrative purpose:**
|
|
10
|
+
|
|
11
|
+
**Local progress source:**
|
|
12
|
+
|
|
13
|
+
**Scroll-distance budget:**
|
|
14
|
+
|
|
15
|
+
## State transformation
|
|
16
|
+
|
|
17
|
+
**Incoming state:**
|
|
18
|
+
|
|
19
|
+
**Hero state:**
|
|
20
|
+
|
|
21
|
+
**Outgoing state:**
|
|
22
|
+
|
|
23
|
+
**Primary subject:**
|
|
24
|
+
|
|
25
|
+
**Bridge to next:**
|
|
26
|
+
|
|
27
|
+
## Phase windows
|
|
28
|
+
|
|
29
|
+
| Phase | Start | End | Viewer sees | Camera | Subject | DOM/SVG | Light/effects |
|
|
30
|
+
|---|---:|---:|---|---|---|---|---|
|
|
31
|
+
| Pre-roll | | | | | | | |
|
|
32
|
+
| Entrance | | | | | | | |
|
|
33
|
+
| Establish | | | | | | | |
|
|
34
|
+
| Development | | | | | | | |
|
|
35
|
+
| Transformation | | | | | | | |
|
|
36
|
+
| Handoff prep | | | | | | | |
|
|
37
|
+
| Handoff | | | | | | | |
|
|
38
|
+
| Resolution | | | | | | | |
|
|
39
|
+
|
|
40
|
+
## Semantic cues
|
|
41
|
+
|
|
42
|
+
| Label | Progress | Meaning | Systems responding |
|
|
43
|
+
|---|---:|---|---|
|
|
44
|
+
| `chapter:enter` | | | |
|
|
45
|
+
| `subject:established` | | | |
|
|
46
|
+
| `copy:available` | | | |
|
|
47
|
+
| `transformation:apex` | | | |
|
|
48
|
+
| `handoff:armed` | | | |
|
|
49
|
+
| `chapter:resolved` | | | |
|
|
50
|
+
|
|
51
|
+
## Shot sequence
|
|
52
|
+
|
|
53
|
+
| Shot | Progress range | Camera move | Target behavior | FOV/focus | Composition purpose |
|
|
54
|
+
|---|---|---|---|---|---|
|
|
55
|
+
|
|
56
|
+
## Property ownership
|
|
57
|
+
|
|
58
|
+
| Property | Authoritative owner | Additive channel | Active range |
|
|
59
|
+
|---|---|---|---|
|
|
60
|
+
|
|
61
|
+
## Interaction envelope
|
|
62
|
+
|
|
63
|
+
**Available interactions:**
|
|
64
|
+
|
|
65
|
+
**Enable range:**
|
|
66
|
+
|
|
67
|
+
**Critical interval:**
|
|
68
|
+
|
|
69
|
+
**Attenuation rule:**
|
|
70
|
+
|
|
71
|
+
**Touch behavior:**
|
|
72
|
+
|
|
73
|
+
**Keyboard behavior:**
|
|
74
|
+
|
|
75
|
+
## Reverse behavior
|
|
76
|
+
|
|
77
|
+
[Describe what reverses, what remains loaded, which state thresholds change, and how interactions return.]
|
|
78
|
+
|
|
79
|
+
## Responsive variants
|
|
80
|
+
|
|
81
|
+
### Desktop
|
|
82
|
+
|
|
83
|
+
### Tablet
|
|
84
|
+
|
|
85
|
+
### Mobile
|
|
86
|
+
|
|
87
|
+
### Reduced motion
|
|
88
|
+
|
|
89
|
+
## Tuning values
|
|
90
|
+
|
|
91
|
+
-
|
|
92
|
+
-
|
|
93
|
+
-
|
|
94
|
+
|
|
95
|
+
## Validation
|
|
96
|
+
|
|
97
|
+
- [ ] Forward scrub is continuous.
|
|
98
|
+
- [ ] Reverse scrub is continuous.
|
|
99
|
+
- [ ] Key poses preserve composition.
|
|
100
|
+
- [ ] Copy has sufficient reading time.
|
|
101
|
+
- [ ] Interaction does not fight critical camera motion.
|
|
102
|
+
- [ ] Handoff starts from the documented outgoing state.
|
|
103
|
+
- [ ] Mobile composition is separately authored.
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
# Handoff Contract
|
|
2
|
+
|
|
3
|
+
## Identity
|
|
4
|
+
|
|
5
|
+
**ID:**
|
|
6
|
+
|
|
7
|
+
**From:**
|
|
8
|
+
|
|
9
|
+
**To:**
|
|
10
|
+
|
|
11
|
+
**Global or local progress window:**
|
|
12
|
+
|
|
13
|
+
## Bridge
|
|
14
|
+
|
|
15
|
+
**Bridge element(s):**
|
|
16
|
+
|
|
17
|
+
**Continuity type:** object / screen-space / world-space / typography / vector / light / texture / motion
|
|
18
|
+
|
|
19
|
+
**Why the viewer understands the bridge:**
|
|
20
|
+
|
|
21
|
+
## Outgoing state
|
|
22
|
+
|
|
23
|
+
| Property | Value | Coordinate space | Owner |
|
|
24
|
+
|---|---|---|---|
|
|
25
|
+
|
|
26
|
+
## Incoming state
|
|
27
|
+
|
|
28
|
+
| Property | Value | Coordinate space | Owner |
|
|
29
|
+
|---|---|---|---|
|
|
30
|
+
|
|
31
|
+
## State equality requirements
|
|
32
|
+
|
|
33
|
+
| Shared property | Outgoing final | Incoming initial | Tolerance |
|
|
34
|
+
|---|---|---|---|
|
|
35
|
+
|
|
36
|
+
## Ownership transfer
|
|
37
|
+
|
|
38
|
+
| Property | Outgoing owner | Transfer cue | Transition owner | Incoming cue | Incoming owner |
|
|
39
|
+
|---|---|---|---|---|---|
|
|
40
|
+
|
|
41
|
+
## Choreography
|
|
42
|
+
|
|
43
|
+
| Handoff progress | Action | Visual purpose | Owner |
|
|
44
|
+
|---:|---|---|---|
|
|
45
|
+
| 0.00 | | | |
|
|
46
|
+
| 0.25 | | | |
|
|
47
|
+
| 0.50 | | | |
|
|
48
|
+
| 0.75 | | | |
|
|
49
|
+
| 1.00 | | | |
|
|
50
|
+
|
|
51
|
+
## Camera continuity
|
|
52
|
+
|
|
53
|
+
**Method:** continuous path / match pose / cut under cover / render blend / subject-relative
|
|
54
|
+
|
|
55
|
+
**Position and target behavior:**
|
|
56
|
+
|
|
57
|
+
**FOV and focus behavior:**
|
|
58
|
+
|
|
59
|
+
## Cover or compositing
|
|
60
|
+
|
|
61
|
+
**Occlusion strategy:**
|
|
62
|
+
|
|
63
|
+
**Coverage condition:**
|
|
64
|
+
|
|
65
|
+
**Scene or asset swap condition:**
|
|
66
|
+
|
|
67
|
+
## Lighting and typography
|
|
68
|
+
|
|
69
|
+
**Lighting continuity:**
|
|
70
|
+
|
|
71
|
+
**Typography continuity:**
|
|
72
|
+
|
|
73
|
+
## Interaction gating
|
|
74
|
+
|
|
75
|
+
**Pointer:**
|
|
76
|
+
|
|
77
|
+
**Scroll velocity effects:**
|
|
78
|
+
|
|
79
|
+
**Click or hover:**
|
|
80
|
+
|
|
81
|
+
## Readiness
|
|
82
|
+
|
|
83
|
+
- Required assets:
|
|
84
|
+
- Prefetch cue:
|
|
85
|
+
- Fallback if unavailable:
|
|
86
|
+
|
|
87
|
+
## Reverse behavior
|
|
88
|
+
|
|
89
|
+
[Describe exact reverse thresholds, retained assets, and owner restoration.]
|
|
90
|
+
|
|
91
|
+
## Completion condition
|
|
92
|
+
|
|
93
|
+
[Measurable state proving that the incoming chapter is authoritative.]
|
|
94
|
+
|
|
95
|
+
## Validation
|
|
96
|
+
|
|
97
|
+
- [ ] Shared values match.
|
|
98
|
+
- [ ] Cover condition works on all viewport classes.
|
|
99
|
+
- [ ] No frame exposes an invalid mixed state.
|
|
100
|
+
- [ ] Reverse behavior reconstructs the outgoing chapter.
|
|
101
|
+
- [ ] Interaction ownership transfers cleanly.
|
|
102
|
+
- [ ] Assets remain alive for reversal.
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
# Property Ownership Matrix
|
|
2
|
+
|
|
3
|
+
## Rules
|
|
4
|
+
|
|
5
|
+
- Every mutable visual property has one authoritative writer at a time.
|
|
6
|
+
- Additive behavior uses separate rigs or named channels.
|
|
7
|
+
- Ownership changes occur only at semantic cues.
|
|
8
|
+
- Route-level transitions can temporarily take ownership only through a documented handoff.
|
|
9
|
+
|
|
10
|
+
## Matrix
|
|
11
|
+
|
|
12
|
+
| Target | Property | Narrative owner | Reactive channel | Ambient channel | Discrete owner | Transfer cue | Final resolution |
|
|
13
|
+
|---|---|---|---|---|---|---|---|
|
|
14
|
+
| Camera | position | | | | | | |
|
|
15
|
+
| Camera | target | | | | | | |
|
|
16
|
+
| Camera | FOV | | | | | | |
|
|
17
|
+
| Subject | position | | | | | | |
|
|
18
|
+
| Subject | rotation | | | | | | |
|
|
19
|
+
| Subject | scale | | | | | | |
|
|
20
|
+
| Material | transition progress | | | | | | |
|
|
21
|
+
| Shader | distortion | | | | | | |
|
|
22
|
+
| DOM title wrapper | transform | | | | | | |
|
|
23
|
+
| SVG bridge | path/morph | | | | | | |
|
|
24
|
+
| Post FX | bloom | | | | | | |
|
|
25
|
+
|
|
26
|
+
## Conflict findings
|
|
27
|
+
|
|
28
|
+
| Property | Current writers | Symptom | Correction |
|
|
29
|
+
|---|---|---|---|
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
# Camera and Composition Shot Presets
|
|
2
|
+
|
|
3
|
+
## Shot schema
|
|
4
|
+
|
|
5
|
+
```ts
|
|
6
|
+
type ShotPreset = {
|
|
7
|
+
id: string;
|
|
8
|
+
camera: {
|
|
9
|
+
position: [number, number, number];
|
|
10
|
+
target: [number, number, number];
|
|
11
|
+
fov: number;
|
|
12
|
+
roll: number;
|
|
13
|
+
};
|
|
14
|
+
focus?: {
|
|
15
|
+
distance: number;
|
|
16
|
+
aperture: number;
|
|
17
|
+
};
|
|
18
|
+
subject?: {
|
|
19
|
+
position: [number, number, number];
|
|
20
|
+
rotation: [number, number, number];
|
|
21
|
+
scale: number | [number, number, number];
|
|
22
|
+
};
|
|
23
|
+
exposure?: number;
|
|
24
|
+
composition: string;
|
|
25
|
+
safeArea: string;
|
|
26
|
+
};
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
## Presets
|
|
30
|
+
|
|
31
|
+
### `shot-name`
|
|
32
|
+
|
|
33
|
+
**Purpose:**
|
|
34
|
+
|
|
35
|
+
**Camera position:** `[x, y, z]`
|
|
36
|
+
|
|
37
|
+
**Target:** `[x, y, z]`
|
|
38
|
+
|
|
39
|
+
**FOV:**
|
|
40
|
+
|
|
41
|
+
**Roll:**
|
|
42
|
+
|
|
43
|
+
**Focus distance:**
|
|
44
|
+
|
|
45
|
+
**Aperture:**
|
|
46
|
+
|
|
47
|
+
**Subject transform:**
|
|
48
|
+
|
|
49
|
+
**Exposure:**
|
|
50
|
+
|
|
51
|
+
**Composition:**
|
|
52
|
+
|
|
53
|
+
**Typography safe area:**
|
|
54
|
+
|
|
55
|
+
**Desktop notes:**
|
|
56
|
+
|
|
57
|
+
**Mobile variant:**
|
|
58
|
+
|
|
59
|
+
**Transition compatibility:**
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
# Implementation Vertical Slice
|
|
2
|
+
|
|
3
|
+
## Target behavior
|
|
4
|
+
|
|
5
|
+
**Chapter:**
|
|
6
|
+
|
|
7
|
+
**Handoff:**
|
|
8
|
+
|
|
9
|
+
**Starting state:**
|
|
10
|
+
|
|
11
|
+
**Ending state:**
|
|
12
|
+
|
|
13
|
+
**Acceptance behavior:**
|
|
14
|
+
|
|
15
|
+
## Files and responsibilities
|
|
16
|
+
|
|
17
|
+
| File | Responsibility | Change |
|
|
18
|
+
|---|---|---|
|
|
19
|
+
|
|
20
|
+
## Required targets
|
|
21
|
+
|
|
22
|
+
| Registry key | Component owner | Readiness condition |
|
|
23
|
+
|---|---|---|
|
|
24
|
+
|
|
25
|
+
## Timeline plan
|
|
26
|
+
|
|
27
|
+
| Label | Progress/time | Action |
|
|
28
|
+
|---|---:|---|
|
|
29
|
+
|
|
30
|
+
## State and ownership changes
|
|
31
|
+
|
|
32
|
+
| Property | Before | During | After |
|
|
33
|
+
|---|---|---|---|
|
|
34
|
+
|
|
35
|
+
## Responsive behavior
|
|
36
|
+
|
|
37
|
+
**Desktop:**
|
|
38
|
+
|
|
39
|
+
**Mobile:**
|
|
40
|
+
|
|
41
|
+
**Reduced motion:**
|
|
42
|
+
|
|
43
|
+
## Cleanup
|
|
44
|
+
|
|
45
|
+
- timelines:
|
|
46
|
+
- ScrollTriggers:
|
|
47
|
+
- ticker callbacks:
|
|
48
|
+
- listeners:
|
|
49
|
+
- WebGL resources:
|
|
50
|
+
- document styles/classes:
|
|
51
|
+
|
|
52
|
+
## Tuning values exposed
|
|
53
|
+
|
|
54
|
+
-
|
|
55
|
+
-
|
|
56
|
+
|
|
57
|
+
## Validation
|
|
58
|
+
|
|
59
|
+
- [ ] forward
|
|
60
|
+
- [ ] reverse
|
|
61
|
+
- [ ] fast scroll
|
|
62
|
+
- [ ] resize
|
|
63
|
+
- [ ] route leave
|
|
64
|
+
- [ ] touch
|
|
65
|
+
- [ ] reduced motion
|
|
66
|
+
- [ ] low-performance tier
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
# Tuning Register
|
|
2
|
+
|
|
3
|
+
## Current build
|
|
4
|
+
|
|
5
|
+
**Commit or version:**
|
|
6
|
+
|
|
7
|
+
**Viewport:**
|
|
8
|
+
|
|
9
|
+
**Device:**
|
|
10
|
+
|
|
11
|
+
**Performance tier:**
|
|
12
|
+
|
|
13
|
+
## Values
|
|
14
|
+
|
|
15
|
+
| ID | System | Value | Unit/range | Purpose | Last change | Evidence |
|
|
16
|
+
|---|---|---:|---|---|---|---|
|
|
17
|
+
|
|
18
|
+
## Shot captures
|
|
19
|
+
|
|
20
|
+
| Shot | Camera | Target | FOV | Subject | Notes |
|
|
21
|
+
|---|---|---:|---:|---|---|
|
|
22
|
+
|
|
23
|
+
## Timing decisions
|
|
24
|
+
|
|
25
|
+
| Chapter | Cue or phase | Previous | New | Reason | Recording/reference |
|
|
26
|
+
|---|---|---:|---:|---|---|
|
|
27
|
+
|
|
28
|
+
## Open visual questions
|
|
29
|
+
|
|
30
|
+
-
|
|
31
|
+
-
|
|
32
|
+
|
|
33
|
+
## Rejected values
|
|
34
|
+
|
|
35
|
+
| Value | Rejected because | Replacement |
|
|
36
|
+
|---|---|---|
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
# Experience Acceptance Tests
|
|
2
|
+
|
|
3
|
+
## Narrative and continuity
|
|
4
|
+
|
|
5
|
+
- [ ] The experience can be described as one coherent transformation.
|
|
6
|
+
- [ ] Every chapter performs a distinct narrative action.
|
|
7
|
+
- [ ] Every boundary has a visible or conceptual bridge.
|
|
8
|
+
- [ ] Shared end and start states match.
|
|
9
|
+
- [ ] No transition relies solely on hiding a jump with opacity.
|
|
10
|
+
|
|
11
|
+
## Timeline and ownership
|
|
12
|
+
|
|
13
|
+
- [ ] Every important property has one authoritative writer.
|
|
14
|
+
- [ ] Chapter and handoff timelines are separated.
|
|
15
|
+
- [ ] Semantic labels coordinate DOM and WebGL.
|
|
16
|
+
- [ ] Reverse scrub reconstructs valid states.
|
|
17
|
+
- [ ] Critical intervals attenuate reactive effects.
|
|
18
|
+
|
|
19
|
+
## Camera and composition
|
|
20
|
+
|
|
21
|
+
- [ ] Every chapter has named key shots.
|
|
22
|
+
- [ ] Camera position and target are authored together.
|
|
23
|
+
- [ ] Holds provide comprehension and reading time.
|
|
24
|
+
- [ ] Mobile shots preserve the intended focal hierarchy.
|
|
25
|
+
- [ ] FOV and focus changes are deliberate.
|
|
26
|
+
|
|
27
|
+
## Interaction
|
|
28
|
+
|
|
29
|
+
- [ ] Scroll owns macro progression.
|
|
30
|
+
- [ ] Pointer and hover remain additive.
|
|
31
|
+
- [ ] Touch has equivalent behavior.
|
|
32
|
+
- [ ] Keyboard navigation is available where required.
|
|
33
|
+
- [ ] Gesture modes provide a clear exit.
|
|
34
|
+
|
|
35
|
+
## Responsive and reduced motion
|
|
36
|
+
|
|
37
|
+
- [ ] Desktop, tablet, and mobile choreography are tested.
|
|
38
|
+
- [ ] Reduced motion preserves story and visibility.
|
|
39
|
+
- [ ] Transition covers work at all aspect ratios.
|
|
40
|
+
- [ ] Typography re-splits or rebuilds safely.
|
|
41
|
+
|
|
42
|
+
## Performance
|
|
43
|
+
|
|
44
|
+
- [ ] Target frame-rate behavior is documented.
|
|
45
|
+
- [ ] DPR and effects scale by tier.
|
|
46
|
+
- [ ] Next-chapter assets are ready before the handoff.
|
|
47
|
+
- [ ] No recurring allocations or React state updates occur in the frame loop.
|
|
48
|
+
- [ ] Transparent overdraw and render targets are controlled.
|
|
49
|
+
|
|
50
|
+
## Lifecycle
|
|
51
|
+
|
|
52
|
+
- [ ] ScrollTriggers are killed on unmount.
|
|
53
|
+
- [ ] GSAP ticker callbacks are removed.
|
|
54
|
+
- [ ] Lenis state is restored.
|
|
55
|
+
- [ ] Event listeners are removed.
|
|
56
|
+
- [ ] custom WebGL resources are disposed.
|
|
57
|
+
- [ ] route back/forward behavior is valid.
|