@struq/skill 0.0.0-stage → 0.2.1
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 +133 -2
- package/bin/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,264 @@
|
|
|
1
|
+
# Timeline Choreography
|
|
2
|
+
|
|
3
|
+
## Choreography is authored attention
|
|
4
|
+
|
|
5
|
+
A timeline is not merely a list of property changes. It is a system for controlling attention, expectation, energy, and comprehension.
|
|
6
|
+
|
|
7
|
+
At every meaningful interval answer:
|
|
8
|
+
|
|
9
|
+
- What should the viewer notice first?
|
|
10
|
+
- What should remain stable while that happens?
|
|
11
|
+
- What anticipates the next action?
|
|
12
|
+
- Where is the visual apex?
|
|
13
|
+
- When is there enough stillness to read or understand?
|
|
14
|
+
- What motion prepares the handoff?
|
|
15
|
+
|
|
16
|
+
## The chapter phase grammar
|
|
17
|
+
|
|
18
|
+
Use this grammar as a starting point:
|
|
19
|
+
|
|
20
|
+
```text
|
|
21
|
+
pre-roll
|
|
22
|
+
→ entrance
|
|
23
|
+
→ establish
|
|
24
|
+
→ development
|
|
25
|
+
→ transformation
|
|
26
|
+
→ handoff preparation
|
|
27
|
+
→ handoff
|
|
28
|
+
→ resolution
|
|
29
|
+
→ post-roll
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
### Pre-roll
|
|
33
|
+
Prepare hidden state, load assets, place off-screen objects, or start incoming light before the viewer consciously enters.
|
|
34
|
+
|
|
35
|
+
### Entrance
|
|
36
|
+
Introduce the primary subject or compositional idea. Avoid introducing every layer simultaneously.
|
|
37
|
+
|
|
38
|
+
### Establish
|
|
39
|
+
Give the viewer a stable enough composition to understand what has arrived.
|
|
40
|
+
|
|
41
|
+
### Development
|
|
42
|
+
Reveal supporting copy, details, interactions, or secondary geometry.
|
|
43
|
+
|
|
44
|
+
### Transformation
|
|
45
|
+
Perform the chapter's principal visual idea.
|
|
46
|
+
|
|
47
|
+
### Handoff preparation
|
|
48
|
+
Move shared elements into positions and states that can validly begin the next chapter.
|
|
49
|
+
|
|
50
|
+
### Handoff
|
|
51
|
+
Transfer state ownership while preserving continuity.
|
|
52
|
+
|
|
53
|
+
### Resolution
|
|
54
|
+
Settle into the incoming chapter's stable composition.
|
|
55
|
+
|
|
56
|
+
### Post-roll
|
|
57
|
+
Park, hide, recycle, or release outgoing resources after they are no longer needed.
|
|
58
|
+
|
|
59
|
+
## Normalize scroll-driven timelines
|
|
60
|
+
|
|
61
|
+
A scroll-driven timeline is easier to reason about when its logical duration is `1`.
|
|
62
|
+
|
|
63
|
+
```js
|
|
64
|
+
const tl = gsap.timeline({ paused: true, defaults: { ease: 'none' } });
|
|
65
|
+
|
|
66
|
+
tl.addLabel('chapter:enter', 0.00)
|
|
67
|
+
.addLabel('entrance:complete', 0.18)
|
|
68
|
+
.addLabel('establish:complete', 0.32)
|
|
69
|
+
.addLabel('transformation:start', 0.55)
|
|
70
|
+
.addLabel('transformation:apex', 0.76)
|
|
71
|
+
.addLabel('handoff:armed', 0.82)
|
|
72
|
+
.addLabel('handoff:occluded', 0.93)
|
|
73
|
+
.addLabel('chapter:resolved', 1.00);
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
Durations can then correspond directly to progress ranges. This does not mean every tween should use `ease: none`. The timeline is scrubbed linearly, while individual beats may still use shaped eases.
|
|
77
|
+
|
|
78
|
+
## Timing hierarchy
|
|
79
|
+
|
|
80
|
+
Think at four scales:
|
|
81
|
+
|
|
82
|
+
### Experience rhythm
|
|
83
|
+
The alternation of dense and quiet chapters across the whole route.
|
|
84
|
+
|
|
85
|
+
### Chapter rhythm
|
|
86
|
+
The pattern of entrance, hold, development, apex, and resolution.
|
|
87
|
+
|
|
88
|
+
### Beat timing
|
|
89
|
+
The relationship between camera, subject, copy, light, sound, and effects around one event.
|
|
90
|
+
|
|
91
|
+
### Microtiming
|
|
92
|
+
Small offsets that create causality and material feel.
|
|
93
|
+
|
|
94
|
+
Example microtiming around a title reveal:
|
|
95
|
+
|
|
96
|
+
```text
|
|
97
|
+
0 ms key light begins increasing
|
|
98
|
+
40 ms camera begins final 4% settle
|
|
99
|
+
90 ms first title line begins
|
|
100
|
+
170 ms second title line begins
|
|
101
|
+
240 ms camera stops
|
|
102
|
+
280 ms title reaches full contrast
|
|
103
|
+
340 ms metadata becomes interactive
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
The camera stopping before the title fully resolves can make the type feel anchored. Reversing that order can make the type feel like it is chasing the composition.
|
|
107
|
+
|
|
108
|
+
## Motion relationships
|
|
109
|
+
|
|
110
|
+
### Simultaneous
|
|
111
|
+
Use when elements behave as one physical or conceptual unit.
|
|
112
|
+
|
|
113
|
+
### Sequential
|
|
114
|
+
Use when reading order or cause-and-effect matters.
|
|
115
|
+
|
|
116
|
+
### Overlapping
|
|
117
|
+
Use to maintain flow and avoid stop-start chapter boundaries.
|
|
118
|
+
|
|
119
|
+
### Counter-motion
|
|
120
|
+
Move foreground and background in opposing directions to create depth or tension.
|
|
121
|
+
|
|
122
|
+
### Follow-through
|
|
123
|
+
Allow secondary motion to continue after the primary action resolves.
|
|
124
|
+
|
|
125
|
+
### Anticipation and release
|
|
126
|
+
Pull away, compress, darken, or pause before a stronger movement.
|
|
127
|
+
|
|
128
|
+
### Echo
|
|
129
|
+
Repeat a motion motif at a different scale or in another medium. A camera arc can be echoed by a curved SVG line or letter stagger.
|
|
130
|
+
|
|
131
|
+
## Easing by physical and emotional character
|
|
132
|
+
|
|
133
|
+
Choose easing based on the intended material and beat.
|
|
134
|
+
|
|
135
|
+
- `power2` or `power3`: controlled general-purpose movement.
|
|
136
|
+
- `expo`: decisive arrivals and strong acceleration contrast.
|
|
137
|
+
- `sine`: soft environmental drift.
|
|
138
|
+
- `circ`: rounded, orbital movement.
|
|
139
|
+
- custom ease: branded motion signatures and carefully controlled camera moves.
|
|
140
|
+
- elastic or bounce: only when material and tone justify visible spring or impact.
|
|
141
|
+
|
|
142
|
+
For scrubbed cinematic camera moves, excessively expressive easing can feel unstable because the user controls the playhead. Use ease to shape perception, but keep spatial paths readable in both directions.
|
|
143
|
+
|
|
144
|
+
## Camera and target must be choreographed together
|
|
145
|
+
|
|
146
|
+
Animating camera position alone often creates unwanted arcs or aim changes. Author:
|
|
147
|
+
|
|
148
|
+
- camera rig position,
|
|
149
|
+
- target rig position,
|
|
150
|
+
- field of view,
|
|
151
|
+
- roll,
|
|
152
|
+
- focus distance,
|
|
153
|
+
- exposure when required.
|
|
154
|
+
|
|
155
|
+
A useful pattern is to animate the target slightly before the camera so attention begins shifting before the body of the move.
|
|
156
|
+
|
|
157
|
+
```text
|
|
158
|
+
target begins at 0.42
|
|
159
|
+
camera begins at 0.46
|
|
160
|
+
FOV tightens at 0.52
|
|
161
|
+
focus reaches detail at 0.61
|
|
162
|
+
camera settles at 0.66
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
## Holds are active design
|
|
166
|
+
|
|
167
|
+
A hold does not require a completely static screen. During a hold:
|
|
168
|
+
|
|
169
|
+
- major narrative transforms pause,
|
|
170
|
+
- ambient motion continues,
|
|
171
|
+
- pointer response may increase slightly,
|
|
172
|
+
- copy becomes readable,
|
|
173
|
+
- a minor detail may develop,
|
|
174
|
+
- sound or shader texture may sustain tension.
|
|
175
|
+
|
|
176
|
+
Avoid constant major motion. Without contrast, no beat feels important.
|
|
177
|
+
|
|
178
|
+
## Staggers require direction
|
|
179
|
+
|
|
180
|
+
Do not apply the same line or character stagger everywhere.
|
|
181
|
+
|
|
182
|
+
Specify:
|
|
183
|
+
|
|
184
|
+
- split type: lines, words, characters,
|
|
185
|
+
- visual origin: top, bottom, pointer, center, path direction,
|
|
186
|
+
- order: document, reverse, center-out, edges-in, random with seed,
|
|
187
|
+
- temporal spacing,
|
|
188
|
+
- transform axis,
|
|
189
|
+
- clipping strategy,
|
|
190
|
+
- re-split behavior,
|
|
191
|
+
- relationship to camera and subject.
|
|
192
|
+
|
|
193
|
+
Example:
|
|
194
|
+
|
|
195
|
+
> Split the heading by lines. Reveal bottom-to-top through overflow masks with a 70 ms line stagger. Start the first line after the camera has completed 65% of its push-in. Let the final line finish 120 ms after the subject light settles.
|
|
196
|
+
|
|
197
|
+
## Critical intervals and interaction attenuation
|
|
198
|
+
|
|
199
|
+
Define a narrative criticality curve:
|
|
200
|
+
|
|
201
|
+
```ts
|
|
202
|
+
function criticality(progress: number): number {
|
|
203
|
+
// Example only: strongest during the pass-through.
|
|
204
|
+
return smoothRange(progress, 0.72, 0.90);
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
pointerStrength = basePointerStrength * (1 - criticality(progress) * 0.85);
|
|
208
|
+
```
|
|
209
|
+
|
|
210
|
+
This preserves the authored move while keeping the experience responsive elsewhere.
|
|
211
|
+
|
|
212
|
+
## Scroll velocity as an effect signal
|
|
213
|
+
|
|
214
|
+
Never map raw velocity directly to a strong effect.
|
|
215
|
+
|
|
216
|
+
Use:
|
|
217
|
+
|
|
218
|
+
1. signed input,
|
|
219
|
+
2. clamp,
|
|
220
|
+
3. normalize,
|
|
221
|
+
4. ease or shape,
|
|
222
|
+
5. smooth attack,
|
|
223
|
+
6. slower decay,
|
|
224
|
+
7. effect-specific maximum.
|
|
225
|
+
|
|
226
|
+
```ts
|
|
227
|
+
const normalized = clamp(scrollVelocity / 1800, -1, 1);
|
|
228
|
+
const shaped = Math.sign(normalized) * Math.pow(Math.abs(normalized), 0.65);
|
|
229
|
+
velocityTarget = shaped;
|
|
230
|
+
velocityVisual = damp(velocityVisual, velocityTarget, 8, deltaTime);
|
|
231
|
+
```
|
|
232
|
+
|
|
233
|
+
Map velocity differently by channel. Directional smear may preserve sign; bloom intensity usually uses absolute magnitude.
|
|
234
|
+
|
|
235
|
+
## Reverse-scroll choreography
|
|
236
|
+
|
|
237
|
+
Scrubbing backward must be designed, not assumed.
|
|
238
|
+
|
|
239
|
+
Check:
|
|
240
|
+
|
|
241
|
+
- visibility states reverse cleanly,
|
|
242
|
+
- paths and morphs remain valid,
|
|
243
|
+
- incoming interactions disable at the right threshold,
|
|
244
|
+
- scene changes are reversible or covered,
|
|
245
|
+
- asset unloading does not occur too early,
|
|
246
|
+
- callbacks do not create irreversible side effects,
|
|
247
|
+
- labels and ownership return correctly.
|
|
248
|
+
|
|
249
|
+
Avoid using timeline callbacks for state mutations that cannot be reconstructed from progress. Prefer deriving visual state from progress or using idempotent transitions.
|
|
250
|
+
|
|
251
|
+
## Timeline review questions
|
|
252
|
+
|
|
253
|
+
For each chapter ask:
|
|
254
|
+
|
|
255
|
+
- Can I describe the chapter's main action in one sentence?
|
|
256
|
+
- Is there a stable hero pose?
|
|
257
|
+
- Is there a hold?
|
|
258
|
+
- Is there one clear apex rather than several equal accents?
|
|
259
|
+
- Does the next chapter begin preparing before this one ends?
|
|
260
|
+
- Are type and camera choreographed relationally?
|
|
261
|
+
- Does every motion have an owner?
|
|
262
|
+
- Can the sequence reverse without a jump?
|
|
263
|
+
- Does the mobile version preserve the same intention?
|
|
264
|
+
- Can I tune the phase boundaries from one location?
|
|
@@ -0,0 +1,241 @@
|
|
|
1
|
+
# Handoff Contracts
|
|
2
|
+
|
|
3
|
+
## Why handoffs determine quality
|
|
4
|
+
|
|
5
|
+
Most animated sites feel like separate sections because chapter transitions are treated as decorative effects after each section has already been designed. A cinematic experience treats the boundary itself as a designed state interval.
|
|
6
|
+
|
|
7
|
+
A handoff must answer:
|
|
8
|
+
|
|
9
|
+
- what continues,
|
|
10
|
+
- what changes,
|
|
11
|
+
- what hides the change,
|
|
12
|
+
- who owns each shared property,
|
|
13
|
+
- when the incoming world becomes authoritative,
|
|
14
|
+
- how the transition behaves in reverse.
|
|
15
|
+
|
|
16
|
+
## Contract schema
|
|
17
|
+
|
|
18
|
+
```ts
|
|
19
|
+
export type HandoffContract = {
|
|
20
|
+
id: string;
|
|
21
|
+
fromChapter: string;
|
|
22
|
+
toChapter: string;
|
|
23
|
+
progressWindow: [number, number];
|
|
24
|
+
bridgeElements: string[];
|
|
25
|
+
outgoingState: Record<string, unknown>;
|
|
26
|
+
incomingState: Record<string, unknown>;
|
|
27
|
+
ownershipTransfer: Array<{
|
|
28
|
+
property: string;
|
|
29
|
+
outgoingOwner: string;
|
|
30
|
+
transferCue: string;
|
|
31
|
+
incomingOwner: string;
|
|
32
|
+
}>;
|
|
33
|
+
cameraContinuity: string;
|
|
34
|
+
occlusionStrategy: string;
|
|
35
|
+
lightingContinuity: string;
|
|
36
|
+
typographyContinuity: string;
|
|
37
|
+
interactionGating: string;
|
|
38
|
+
reverseBehavior: string;
|
|
39
|
+
readinessRequirements: string[];
|
|
40
|
+
completionCondition: string;
|
|
41
|
+
};
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
## State equality
|
|
45
|
+
|
|
46
|
+
For every shared property:
|
|
47
|
+
|
|
48
|
+
```text
|
|
49
|
+
outgoing final value = incoming initial value
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
This equality may exist in world space, local space, or screen space. Specify which one.
|
|
53
|
+
|
|
54
|
+
Example:
|
|
55
|
+
|
|
56
|
+
```text
|
|
57
|
+
The ring's world position changes because it is reparented, but its screen-space center and apparent scale must remain unchanged during the transfer.
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
Reparenting may require preserving world transforms before attaching an object to a new parent.
|
|
61
|
+
|
|
62
|
+
## Ownership transfer
|
|
63
|
+
|
|
64
|
+
A handoff often has three ownership phases:
|
|
65
|
+
|
|
66
|
+
```text
|
|
67
|
+
outgoing owner
|
|
68
|
+
→ shared transition owner
|
|
69
|
+
→ incoming owner
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
Example:
|
|
73
|
+
|
|
74
|
+
```text
|
|
75
|
+
Chapter 2 controls the product placement rig until `handoff:armed`.
|
|
76
|
+
The handoff timeline controls the placement rig from `handoff:armed` to `handoff:resolved`.
|
|
77
|
+
Chapter 3 controls the rig after `handoff:resolved`.
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
Do not let the outgoing chapter and incoming chapter animate the same property during the overlap unless their values are explicitly blended through a transition channel.
|
|
81
|
+
|
|
82
|
+
## Bridge strategies
|
|
83
|
+
|
|
84
|
+
### Object bridge
|
|
85
|
+
A persistent 3D object changes role while remaining visible.
|
|
86
|
+
|
|
87
|
+
Use when the product or central symbol should unify the story.
|
|
88
|
+
|
|
89
|
+
### Aperture or portal bridge
|
|
90
|
+
A hole, screen, lens, door, or surface reveals the next state.
|
|
91
|
+
|
|
92
|
+
Use when the transition should feel spatial and the incoming scene can be rendered behind or inside a mask.
|
|
93
|
+
|
|
94
|
+
### Occluder bridge
|
|
95
|
+
A near-camera object fills the frame and hides a swap.
|
|
96
|
+
|
|
97
|
+
Use when assets or scene topology must change discontinuously.
|
|
98
|
+
|
|
99
|
+
### Typography bridge
|
|
100
|
+
A glyph or phrase changes scale, depth, mask, or position to become the next composition.
|
|
101
|
+
|
|
102
|
+
Use when editorial direction is central.
|
|
103
|
+
|
|
104
|
+
### Vector bridge
|
|
105
|
+
An SVG line, path, or shape draws, bends, and morphs into an incoming visual structure.
|
|
106
|
+
|
|
107
|
+
Use with DrawSVGPlugin, MorphSVGPlugin, MotionPathPlugin, masks, and clip paths.
|
|
108
|
+
|
|
109
|
+
### Light bridge
|
|
110
|
+
Incoming color temperature, direction, or contrast appears before incoming geometry.
|
|
111
|
+
|
|
112
|
+
Use for subtle continuity and mood shifts.
|
|
113
|
+
|
|
114
|
+
### Render-target bridge
|
|
115
|
+
The outgoing or incoming world is rendered into a texture for portals, crossfades, displacement, feedback, or material transitions.
|
|
116
|
+
|
|
117
|
+
Use when simple DOM masking cannot produce the required spatial relationship.
|
|
118
|
+
|
|
119
|
+
### Motion bridge
|
|
120
|
+
The direction, velocity, or rhythm of an outgoing movement continues through the incoming state.
|
|
121
|
+
|
|
122
|
+
Use when no physical object persists but the kinetic logic should.
|
|
123
|
+
|
|
124
|
+
## Handoff progress design
|
|
125
|
+
|
|
126
|
+
A useful pattern:
|
|
127
|
+
|
|
128
|
+
```text
|
|
129
|
+
0.00-0.25 outgoing chapter begins preparation
|
|
130
|
+
0.25-0.50 bridge becomes visually dominant
|
|
131
|
+
0.50-0.75 incoming state appears under cover
|
|
132
|
+
0.75-0.90 ownership transfers
|
|
133
|
+
0.90-1.00 incoming state resolves and interactions enable
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
The exact proportions depend on the concept. Always reserve enough time for the viewer to understand the bridge.
|
|
137
|
+
|
|
138
|
+
## Occlusion conditions
|
|
139
|
+
|
|
140
|
+
Do not say only “swap when covered.” Define measurable coverage:
|
|
141
|
+
|
|
142
|
+
- bridge bounding box covers at least 95% of the viewport,
|
|
143
|
+
- depth buffer confirms the transition surface is nearest across the central safe area,
|
|
144
|
+
- opacity or mask coverage reaches a threshold,
|
|
145
|
+
- camera crosses a named portal plane,
|
|
146
|
+
- shader transition progress exceeds a defined value.
|
|
147
|
+
|
|
148
|
+
For responsive variants, the coverage condition may require different scale or path values.
|
|
149
|
+
|
|
150
|
+
## Camera continuity patterns
|
|
151
|
+
|
|
152
|
+
### Continuous path
|
|
153
|
+
The same camera rig moves through the boundary.
|
|
154
|
+
|
|
155
|
+
### Match-pose transfer
|
|
156
|
+
The outgoing and incoming cameras have matching position, target, FOV, and framing before the scene source changes.
|
|
157
|
+
|
|
158
|
+
### Virtual cut under cover
|
|
159
|
+
The camera changes discontinuously while the viewport is fully occluded.
|
|
160
|
+
|
|
161
|
+
### Render blend
|
|
162
|
+
Two camera outputs are blended or distorted through render targets.
|
|
163
|
+
|
|
164
|
+
### Subject-relative continuity
|
|
165
|
+
The camera's world position changes, but its relationship to the bridge subject remains stable.
|
|
166
|
+
|
|
167
|
+
## Reverse behavior
|
|
168
|
+
|
|
169
|
+
Specify one of:
|
|
170
|
+
|
|
171
|
+
- fully reversible scrub,
|
|
172
|
+
- reversible until a commit threshold,
|
|
173
|
+
- snap-backed state transition,
|
|
174
|
+
- replayed inverse timeline,
|
|
175
|
+
- route transition with no reverse scroll.
|
|
176
|
+
|
|
177
|
+
For scroll-driven experiences, fully reversible behavior is the default expectation. Avoid destroying outgoing assets before the reverse threshold can no longer be crossed.
|
|
178
|
+
|
|
179
|
+
## Complete example
|
|
180
|
+
|
|
181
|
+
```md
|
|
182
|
+
### Handoff: Material → Interior
|
|
183
|
+
|
|
184
|
+
**Window:** global progress 0.48 to 0.58
|
|
185
|
+
|
|
186
|
+
**Bridge:** circular lens opening on the product shell
|
|
187
|
+
|
|
188
|
+
**Outgoing state:**
|
|
189
|
+
- product placement rig at `[0.25, -0.10, 1.40]`
|
|
190
|
+
- product yaw `-18deg`
|
|
191
|
+
- camera shot `materialMacro`
|
|
192
|
+
- environment brightness `0.35`
|
|
193
|
+
- title reduced to one persistent word: “Inside”
|
|
194
|
+
|
|
195
|
+
**Incoming state:**
|
|
196
|
+
- tunnel root begins at the lens plane
|
|
197
|
+
- camera shot begins at the exact `materialMacro` pose
|
|
198
|
+
- interior light color already present at 15%
|
|
199
|
+
- “Inside” is screen-space aligned with the tunnel axis
|
|
200
|
+
|
|
201
|
+
**Ownership:**
|
|
202
|
+
- chapter `material` owns product transforms until `handoff:armed`
|
|
203
|
+
- handoff timeline owns product and camera from `handoff:armed` to `handoff:resolved`
|
|
204
|
+
- chapter `interior` owns the camera target and tunnel progression after resolution
|
|
205
|
+
|
|
206
|
+
**Sequence:**
|
|
207
|
+
1. Reduce pointer influence from 0.06 to 0.01.
|
|
208
|
+
2. Rotate the product to align the lens normal with the camera axis.
|
|
209
|
+
3. Dolly forward while tightening FOV from 34 to 29.
|
|
210
|
+
4. Begin rendering the tunnel behind the lens at handoff progress 0.32.
|
|
211
|
+
5. Reach 96% aperture coverage at 0.68.
|
|
212
|
+
6. Disable the outer shell and release the interior depth fog at 0.72.
|
|
213
|
+
7. Transfer camera target ownership at 0.78.
|
|
214
|
+
8. Restore pointer influence to 0.035 by 1.00.
|
|
215
|
+
|
|
216
|
+
**Reverse:**
|
|
217
|
+
- keep outer shell and material environment loaded until global progress exceeds 0.64
|
|
218
|
+
- reverse all visibility through progress-derived values
|
|
219
|
+
- restore outgoing chapter interactions below handoff progress 0.18
|
|
220
|
+
|
|
221
|
+
**Completion:**
|
|
222
|
+
- camera is inside the tunnel,
|
|
223
|
+
- the lens edge is no longer visible,
|
|
224
|
+
- interior lighting is authoritative,
|
|
225
|
+
- chapter `interior` local progress is 0,
|
|
226
|
+
- no transform changes at the ownership transfer frame.
|
|
227
|
+
```
|
|
228
|
+
|
|
229
|
+
## Handoff review checklist
|
|
230
|
+
|
|
231
|
+
- Is there a bridge the viewer can understand?
|
|
232
|
+
- Is the outgoing state prepared for the incoming state?
|
|
233
|
+
- Are shared values equal at transfer?
|
|
234
|
+
- Is the coordinate space specified?
|
|
235
|
+
- Is the camera continuous or covered?
|
|
236
|
+
- Is incoming content visible before outgoing content is discarded?
|
|
237
|
+
- Are interactions attenuated during the critical interval?
|
|
238
|
+
- Is the transition reversible?
|
|
239
|
+
- Are assets retained long enough?
|
|
240
|
+
- Is the mobile coverage condition valid?
|
|
241
|
+
- Is the completion condition measurable?
|