@struq/skill 0.3.0 → 0.4.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/README.md +22 -36
- package/package.json +4 -2
- package/skills/struq/SKILL.md +139 -307
- package/skills/struq/blocks/CATALOG.md +426 -0
- package/skills/struq/blocks/backgrounds/background-aurora.tsx +818 -0
- package/skills/struq/blocks/backgrounds/background-facets.tsx +1283 -0
- package/skills/struq/blocks/backgrounds/background-silk.tsx +906 -0
- package/skills/struq/blocks/catalog.json +1302 -0
- package/skills/struq/blocks/footers/footer-contact.tsx +789 -0
- package/skills/struq/blocks/footers/footer-reveal.tsx +313 -0
- package/skills/struq/blocks/headers/header-bar.tsx +652 -0
- package/skills/struq/blocks/headers/menu-curtain.tsx +790 -0
- package/skills/struq/blocks/heroes/hero-framed.tsx +627 -0
- package/skills/struq/blocks/heroes/hero-index.tsx +855 -0
- package/skills/struq/blocks/heroes/hero-poster.tsx +1086 -0
- package/skills/struq/blocks/heroes/hero-split.tsx +685 -0
- package/skills/struq/blocks/heroes/hero-still.tsx +862 -0
- package/skills/struq/{recipes/components/struq → blocks/kit}/Cursor.tsx +1 -1
- package/skills/struq/{recipes/components/struq → blocks/kit}/HeroCanvas.tsx +4 -4
- package/skills/struq/{recipes/components/struq → blocks/kit}/HorizontalGallery.tsx +2 -2
- package/skills/struq/{recipes/components/struq → blocks/kit}/MagneticButton.tsx +1 -1
- package/skills/struq/{recipes/components/struq → blocks/kit}/MediaFrame.tsx +2 -2
- package/skills/struq/{recipes/components/struq → blocks/kit}/PinnedZoom.tsx +14 -4
- package/skills/struq/{recipes/components/struq → blocks/kit}/Reveal.tsx +1 -1
- package/skills/struq/{recipes/components/struq → blocks/kit}/SmoothScroll.tsx +1 -1
- package/skills/struq/{recipes/components/struq → blocks/kit}/SplitHeadline.tsx +1 -1
- package/skills/struq/blocks/kit/blocks.css +2102 -0
- package/skills/struq/blocks/kit/images.ts +17 -0
- package/skills/struq/blocks/kit/photo-read.ts +102 -0
- package/skills/struq/blocks/page-transitions/page-transition-gate.tsx +706 -0
- package/skills/struq/blocks/page-transitions/page-transition-slices.tsx +469 -0
- package/skills/struq/blocks/page-transitions/page-transition-stack.tsx +583 -0
- package/skills/struq/blocks/preloaders/preloader-gate.tsx +358 -0
- package/skills/struq/blocks/preloaders/preloader-slices-uncovered.ts +50 -0
- package/skills/struq/blocks/preloaders/preloader-slices.tsx +289 -0
- package/skills/struq/blocks/preloaders/preloader-stack.tsx +367 -0
- package/skills/struq/blocks/preloaders/preloader-wordmark.tsx +568 -0
- package/skills/struq/blocks/sections/about-studio.tsx +436 -0
- package/skills/struq/blocks/sections/approach.tsx +661 -0
- package/skills/struq/blocks/sections/contact-form.tsx +664 -0
- package/skills/struq/blocks/sections/cta-closing.tsx +763 -0
- package/skills/struq/blocks/sections/fanned-cards.tsx +547 -0
- package/skills/struq/blocks/sections/film-strip.tsx +385 -0
- package/skills/struq/blocks/sections/grid-assembly.tsx +616 -0
- package/skills/struq/blocks/sections/hover-list.tsx +467 -0
- package/skills/struq/blocks/sections/image-trail.tsx +432 -0
- package/skills/struq/blocks/sections/manifesto.tsx +691 -0
- package/skills/struq/blocks/sections/panel-accordion.tsx +380 -0
- package/skills/struq/blocks/sections/reveals.tsx +416 -0
- package/skills/struq/blocks/sections/split-pair.tsx +670 -0
- package/skills/struq/blocks/sections/sticky-chapters.tsx +256 -0
- package/skills/struq/blocks/sections/velocity-type.tsx +269 -0
- package/skills/struq/{cinematic/showpieces/toonstuk-fill-rows.tsx → blocks/showpieces/fill-rows.tsx} +1 -1
- package/skills/struq/{cinematic/showpieces/toonstuk-hero-opener.tsx → blocks/showpieces/hero-opener.tsx} +5 -5
- package/skills/struq/{cinematic/showpieces/toonstuk-image-to-fullbleed.tsx → blocks/showpieces/image-to-fullbleed.tsx} +16 -5
- package/skills/struq/blocks/showpieces/manifesto-scrub.tsx +48 -0
- package/skills/struq/{cinematic/showpieces/toonstuk-panel-wipe.tsx → blocks/showpieces/panel-wipe.tsx} +2 -2
- package/skills/struq/{cinematic/showpieces/toonstuk-pixel-resolve.tsx → blocks/showpieces/pixel-resolve.tsx} +1 -1
- package/skills/struq/{cinematic/showpieces/toonstuk-project-stack.tsx → blocks/showpieces/project-stack.tsx} +2 -2
- package/skills/struq/blocks/showpieces/scrub-connector.tsx +307 -0
- package/skills/struq/{cinematic/showpieces/toonstuk-wordmark-finale.tsx → blocks/showpieces/wordmark-finale.tsx} +1 -1
- package/skills/struq/blocks/transitions/zoom-through.tsx +613 -0
- package/skills/struq/canon/canon.json +627 -0
- package/skills/struq/cinematic/README.md +7 -18
- package/skills/struq/cinematic/examples/code/nextjs/app/components/LenisRoot.tsx +1 -1
- package/skills/struq/cinematic/examples/code/shared/styles.css +1 -1
- package/skills/struq/cinematic/examples/code/vite/src/LenisRoot.tsx +1 -1
- package/skills/struq/cinematic/references/01-core-mental-model.md +1 -1
- package/skills/struq/cinematic/references/02-vocabulary.md +1 -1
- package/skills/struq/cinematic/references/07-stack-integration.md +2 -2
- package/skills/struq/recipes/app/fonts.ts +12 -22
- package/skills/struq/recipes/app/globals.css +34 -177
- package/skills/struq/recipes/app/layout.tsx +13 -11
- package/skills/struq/references/craft.md +77 -0
- package/skills/struq/references/iconography.md +28 -230
- package/skills/struq/references/stack-targets.md +23 -74
- package/skills/struq/references/tells.md +52 -0
- package/skills/struq/references/triage.md +6 -7
- package/skills/struq/scripts/blocks.mjs +156 -0
- package/skills/struq/scripts/canon.mjs +106 -281
- package/skills/struq/scripts/check.mjs +92 -126
- package/skills/struq/scripts/images.mjs +2 -2
- package/skills/struq/scripts/log.mjs +6 -23
- package/skills/struq/scripts/tokens.mjs +222 -0
- package/skills/struq/cinematic/showpieces/README.md +0 -18
- package/skills/struq/cinematic/showpieces/toonstuk-manifesto-scrub.tsx +0 -81
- package/skills/struq/cinematic/showpieces/toonstuk-scrub-connector.tsx +0 -78
- package/skills/struq/references/anti-patterns.md +0 -330
- package/skills/struq/references/baseline-prompt.md +0 -122
- package/skills/struq/references/brand.md +0 -143
- package/skills/struq/references/brief-router.md +0 -218
- package/skills/struq/references/composition.md +0 -190
- package/skills/struq/references/depth-parallax.md +0 -235
- package/skills/struq/references/direction.md +0 -188
- package/skills/struq/references/feel-layer.md +0 -107
- package/skills/struq/references/gsap-api.md +0 -293
- package/skills/struq/references/hero-scenes.md +0 -107
- package/skills/struq/references/imagery.md +0 -125
- package/skills/struq/references/loaders.md +0 -287
- package/skills/struq/references/micro-interactions.md +0 -270
- package/skills/struq/references/mobile-composition.md +0 -70
- package/skills/struq/references/nav-header.md +0 -296
- package/skills/struq/references/niche-packets.md +0 -338
- package/skills/struq/references/page-architecture.md +0 -134
- package/skills/struq/references/page-entrances.md +0 -198
- package/skills/struq/references/performance.md +0 -235
- package/skills/struq/references/pinning-scrub.md +0 -340
- package/skills/struq/references/pitfalls.md +0 -290
- package/skills/struq/references/route-transitions.md +0 -281
- package/skills/struq/references/scaling.md +0 -151
- package/skills/struq/references/scroll-reveals.md +0 -279
- package/skills/struq/references/sections.md +0 -141
- package/skills/struq/references/seo.md +0 -219
- package/skills/struq/references/setup.md +0 -397
- package/skills/struq/references/showcase.md +0 -87
- package/skills/struq/references/struq-imagery.md +0 -107
- package/skills/struq/references/svg-motion.md +0 -390
- package/skills/struq/references/transitions.md +0 -160
- package/skills/struq/references/typography.md +0 -720
- package/skills/struq/references/vibe-presets.md +0 -287
- package/skills/struq/references/webgl-r3f.md +0 -274
- package/skills/struq/references/webgl-scenes.md +0 -593
- package/skills/struq/scripts/font-names.mjs +0 -40
- package/skills/struq/scripts/recipes.mjs +0 -135
- /package/skills/struq/{recipes/lib → blocks/kit}/gsap.ts +0 -0
- /package/skills/struq/{recipes/components/struq → blocks/kit}/scenes/contours.ts +0 -0
- /package/skills/struq/{recipes/components/struq → blocks/kit}/scenes/dots.ts +0 -0
- /package/skills/struq/{recipes/components/struq → blocks/kit}/scenes/ripple.ts +0 -0
- /package/skills/struq/{recipes/components/struq → blocks/kit}/scenes/types.ts +0 -0
|
@@ -0,0 +1,1302 @@
|
|
|
1
|
+
{
|
|
2
|
+
"source": {
|
|
3
|
+
"repo": "Struq blocks/",
|
|
4
|
+
"ref": "origin/main",
|
|
5
|
+
"commit": "a2b7d56"
|
|
6
|
+
},
|
|
7
|
+
"blocks": [
|
|
8
|
+
{
|
|
9
|
+
"slug": "preloader-wordmark",
|
|
10
|
+
"kind": "preloader",
|
|
11
|
+
"title": "Preloader: the wordmark",
|
|
12
|
+
"does": "The first paint is the page's ground with the studio's name set huge across the screen in the display face at a light weight, fitted to the width with the loaded face; each letter fills through a rising mask, a faint tone first and the ink rising inside it, driven by real progress between a floor and a cap; then the name opens as a curtain onto the hero (split along its middle, dropped letter by letter, or settled into the header's wordmark) within 2.4 seconds of the first paint, once per session (helper: preloaders/preloader-slices-uncovered.ts).",
|
|
13
|
+
"reference": "Kinetic Studio's preloader (v4vision/projects/kinetic-studio/index.html: light 300 display type, slices lifting on power4.inOut) and Lowlight's gate opening on its middle line (Opus55/build/template.html), handing over through preloader-stack's whenUncovered.",
|
|
14
|
+
"variants": [
|
|
15
|
+
{
|
|
16
|
+
"id": "split",
|
|
17
|
+
"title": "Gespleten",
|
|
18
|
+
"does": "The filled name splits on a line through the middle of its caps; the top half rises and the bottom half falls, each carrying its half of the cover."
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
"id": "drop",
|
|
22
|
+
"title": "Letter voor letter",
|
|
23
|
+
"does": "One column per letter; the letters fall left to right, each taking its column, so the hero arrives letter by letter."
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
"id": "settle",
|
|
27
|
+
"title": "In de kop",
|
|
28
|
+
"does": "The cover lifts while the name shrinks and travels into the header's wordmark, which takes over in the same frame."
|
|
29
|
+
}
|
|
30
|
+
],
|
|
31
|
+
"packages": [
|
|
32
|
+
"@gsap/react",
|
|
33
|
+
"gsap"
|
|
34
|
+
],
|
|
35
|
+
"exports": [
|
|
36
|
+
"PreloaderWordmark"
|
|
37
|
+
],
|
|
38
|
+
"file": "preloaders/preloader-wordmark.tsx",
|
|
39
|
+
"files": [
|
|
40
|
+
"kit/blocks.css",
|
|
41
|
+
"kit/gsap.ts",
|
|
42
|
+
"preloaders/preloader-slices-uncovered.ts",
|
|
43
|
+
"preloaders/preloader-wordmark.tsx"
|
|
44
|
+
]
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
"slug": "preloader-stack",
|
|
48
|
+
"kind": "preloader",
|
|
49
|
+
"title": "Preloader: the stack",
|
|
50
|
+
"does": "The first paint is the page's ground with the client's name, a quiet count and the first print in a small portrait frame; five or six prints cut inside that frame, each held shorter than the last, ending on the hero's own photo, and the frame then grows to the hero image's exact place and crop (the page marks it data-stack-target) so the cover becomes the hero with no seam, within 2.4 seconds of the first paint, once per session (helper: preloaders/preloader-slices-uncovered.ts).",
|
|
51
|
+
"reference": "Kinetic Studio and Lowlight for pacing and the counter (v4vision/projects/kinetic-studio/index.html, Opus55/build/template.html); the grow follows image-to-fullbleed's numeric clip.",
|
|
52
|
+
"variants": [],
|
|
53
|
+
"packages": [
|
|
54
|
+
"@gsap/react",
|
|
55
|
+
"gsap"
|
|
56
|
+
],
|
|
57
|
+
"exports": [
|
|
58
|
+
"PreloaderStack"
|
|
59
|
+
],
|
|
60
|
+
"file": "preloaders/preloader-stack.tsx",
|
|
61
|
+
"files": [
|
|
62
|
+
"kit/blocks.css",
|
|
63
|
+
"kit/gsap.ts",
|
|
64
|
+
"kit/images.ts",
|
|
65
|
+
"preloaders/preloader-slices-uncovered.ts",
|
|
66
|
+
"preloaders/preloader-stack.tsx"
|
|
67
|
+
]
|
|
68
|
+
},
|
|
69
|
+
{
|
|
70
|
+
"slug": "preloader-slices",
|
|
71
|
+
"kind": "preloader",
|
|
72
|
+
"title": "Preloader: the slices",
|
|
73
|
+
"does": "The first paint is a dark cover cut into four vertical slices (three on phones), already composed: the client's name large, a caption, a hairline and the count at 000; the count runs to 100 in one move, then the slices drop away left to right, each carrying its strip of the name and count down and off behind a 5px accent edge, uncovering the page from the top onto its own entrance, within 2.4 seconds of the first paint, once per session (helper: preloaders/preloader-slices-uncovered.ts).",
|
|
74
|
+
"reference": "Kinetic Studio, the counter preloader whose four slices lift away (v4vision/projects/kinetic-studio/index.html, script near line 879).",
|
|
75
|
+
"variants": [],
|
|
76
|
+
"packages": [
|
|
77
|
+
"@gsap/react",
|
|
78
|
+
"gsap"
|
|
79
|
+
],
|
|
80
|
+
"exports": [
|
|
81
|
+
"PreloaderSlices"
|
|
82
|
+
],
|
|
83
|
+
"file": "preloaders/preloader-slices.tsx",
|
|
84
|
+
"files": [
|
|
85
|
+
"kit/blocks.css",
|
|
86
|
+
"kit/gsap.ts",
|
|
87
|
+
"preloaders/preloader-slices-uncovered.ts",
|
|
88
|
+
"preloaders/preloader-slices.tsx"
|
|
89
|
+
]
|
|
90
|
+
},
|
|
91
|
+
{
|
|
92
|
+
"slug": "preloader-gate",
|
|
93
|
+
"kind": "preloader",
|
|
94
|
+
"title": "Preloader: the gate",
|
|
95
|
+
"does": "The first paint is a shut gate with a whole film-leader dial and one figure; only the sweep moves, counting 3, 2, 1 on an eased count that waits for the fonts and the hero image, then the line through the middle lights and the two bars open top and bottom onto the hero, by 2.4 seconds from the first paint, once per session.",
|
|
96
|
+
"reference": "Lowlight (Opus55/build/template.html): the leader countdown and the bars that open as a gate onto the hero (CSS line 143, markup line 600, initLoader line 1024).",
|
|
97
|
+
"variants": [],
|
|
98
|
+
"packages": [
|
|
99
|
+
"@gsap/react",
|
|
100
|
+
"gsap"
|
|
101
|
+
],
|
|
102
|
+
"exports": [
|
|
103
|
+
"PreloaderGate"
|
|
104
|
+
],
|
|
105
|
+
"file": "preloaders/preloader-gate.tsx",
|
|
106
|
+
"files": [
|
|
107
|
+
"kit/blocks.css",
|
|
108
|
+
"kit/gsap.ts",
|
|
109
|
+
"preloaders/preloader-gate.tsx"
|
|
110
|
+
]
|
|
111
|
+
},
|
|
112
|
+
{
|
|
113
|
+
"slug": "page-transition-stack",
|
|
114
|
+
"kind": "page-transition",
|
|
115
|
+
"title": "Page transition: the stack",
|
|
116
|
+
"does": "On every link click and on back and forward, a small portrait print of the destination's own hero photo appears where the pointer is (centred for keys and history) and grows to fill the screen while the route loads under it, then settles into the new page's hero at its exact place and crop, so arriving is the preloader's own landing, under 0.9 seconds door to door; a print not decoded in time becomes the destination's name on the page ground and the cover lifts away instead (helper: preloaders/preloader-slices-uncovered.ts).",
|
|
117
|
+
"reference": "preloader-stack's grow-into-the-hero, run per navigation; the navigation engine is page-transition-slices' (click hold, popstate hold-and-replay, scroll, hash, focus).",
|
|
118
|
+
"variants": [],
|
|
119
|
+
"packages": [
|
|
120
|
+
"@gsap/react",
|
|
121
|
+
"gsap",
|
|
122
|
+
"lenis"
|
|
123
|
+
],
|
|
124
|
+
"exports": [
|
|
125
|
+
"PageTransitionStack"
|
|
126
|
+
],
|
|
127
|
+
"file": "page-transitions/page-transition-stack.tsx",
|
|
128
|
+
"files": [
|
|
129
|
+
"kit/SmoothScroll.tsx",
|
|
130
|
+
"kit/blocks.css",
|
|
131
|
+
"kit/gsap.ts",
|
|
132
|
+
"page-transitions/page-transition-stack.tsx",
|
|
133
|
+
"preloaders/preloader-slices-uncovered.ts"
|
|
134
|
+
]
|
|
135
|
+
},
|
|
136
|
+
{
|
|
137
|
+
"slug": "page-transition-slices",
|
|
138
|
+
"kind": "page-transition",
|
|
139
|
+
"title": "Page transition: the slices",
|
|
140
|
+
"does": "On every link click and on back and forward, the slices of preloader-slices come in from above and close over the page with the destination's name and a running hairline, the route loads under them, and they carry on down and off, uncovering the new page from the top onto its entrance, about 0.65 seconds door to door, with focus, hashes and scroll restored (helper: preloaders/preloader-slices-uncovered.ts).",
|
|
141
|
+
"reference": "Kinetic Studio's slice lift (v4vision/projects/kinetic-studio/index.html, script near line 879), run on navigation.",
|
|
142
|
+
"variants": [],
|
|
143
|
+
"packages": [
|
|
144
|
+
"@gsap/react",
|
|
145
|
+
"gsap",
|
|
146
|
+
"lenis"
|
|
147
|
+
],
|
|
148
|
+
"exports": [
|
|
149
|
+
"PageTransitionSlices"
|
|
150
|
+
],
|
|
151
|
+
"file": "page-transitions/page-transition-slices.tsx",
|
|
152
|
+
"files": [
|
|
153
|
+
"kit/SmoothScroll.tsx",
|
|
154
|
+
"kit/blocks.css",
|
|
155
|
+
"kit/gsap.ts",
|
|
156
|
+
"page-transitions/page-transition-slices.tsx",
|
|
157
|
+
"preloaders/preloader-slices-uncovered.ts"
|
|
158
|
+
]
|
|
159
|
+
},
|
|
160
|
+
{
|
|
161
|
+
"slug": "page-transition-gate",
|
|
162
|
+
"kind": "page-transition",
|
|
163
|
+
"title": "Page transition: the gate",
|
|
164
|
+
"does": "On every navigation, back button included, the preloader's bars close carrying the two halves of a slate (the dial and the destination's name), lock into one frame as the line and the dial light, hold while the route changes, then split the name and open onto the finished page, 0.9 seconds door to door.",
|
|
165
|
+
"reference": "Lowlight (Opus55/build/template.html): the gate of its loader, carried over to navigation so the site arrives and moves in one voice.",
|
|
166
|
+
"variants": [],
|
|
167
|
+
"packages": [
|
|
168
|
+
"@gsap/react",
|
|
169
|
+
"gsap",
|
|
170
|
+
"lenis"
|
|
171
|
+
],
|
|
172
|
+
"exports": [
|
|
173
|
+
"GateLink",
|
|
174
|
+
"GateStage",
|
|
175
|
+
"PageTransitionGate"
|
|
176
|
+
],
|
|
177
|
+
"file": "page-transitions/page-transition-gate.tsx",
|
|
178
|
+
"files": [
|
|
179
|
+
"kit/SmoothScroll.tsx",
|
|
180
|
+
"kit/blocks.css",
|
|
181
|
+
"kit/gsap.ts",
|
|
182
|
+
"page-transitions/page-transition-gate.tsx"
|
|
183
|
+
]
|
|
184
|
+
},
|
|
185
|
+
{
|
|
186
|
+
"slug": "header-bar",
|
|
187
|
+
"kind": "header",
|
|
188
|
+
"title": "Header: the bar",
|
|
189
|
+
"does": "A fixed bar with the wordmark Noord, four links and one quiet text action, its ink changing per pixel at the edges of the sections under it, taking the ground once the page scrolls and keeping the hero's type clear; it hides and returns with the scroll and rolls each label, lands a large hero wordmark in the bar, or carries centred links, Rotterdam's live time and a progress rule; on phones it collapses to the wordmark and one Menu link.",
|
|
190
|
+
"reference": "Lowlight's header (Opus55/build/template.html: the three-part header grid with its time near line 170, the roll mask near line 131), Kinetic Studio's nav-link underline (kinetic-studio/index.html near line 95), and the menu curtain's ink split on data-bar-tone.",
|
|
191
|
+
"variants": [
|
|
192
|
+
{
|
|
193
|
+
"id": "quiet",
|
|
194
|
+
"title": "De stille balk",
|
|
195
|
+
"does": "Wordmark left, links right, each label rolling letter by letter on hover; the bar hides as the page scrolls down and returns on scroll up, a hairline under it once scrolled."
|
|
196
|
+
},
|
|
197
|
+
{
|
|
198
|
+
"id": "settle",
|
|
199
|
+
"title": "Het landende woordmerk",
|
|
200
|
+
"does": "The wordmark is set large across the hero and shrinks into its place in the bar as the page scrolls, the links fading in as it lands."
|
|
201
|
+
},
|
|
202
|
+
{
|
|
203
|
+
"id": "split",
|
|
204
|
+
"title": "De gedeelde balk",
|
|
205
|
+
"does": "Wordmark left, links centred with a line gliding under the hovered one, Rotterdam's live time and the action right, and a thin rule filling with the page's progress."
|
|
206
|
+
}
|
|
207
|
+
],
|
|
208
|
+
"packages": [
|
|
209
|
+
"@gsap/react",
|
|
210
|
+
"gsap"
|
|
211
|
+
],
|
|
212
|
+
"exports": [
|
|
213
|
+
"HeaderBar"
|
|
214
|
+
],
|
|
215
|
+
"file": "headers/header-bar.tsx",
|
|
216
|
+
"files": [
|
|
217
|
+
"headers/header-bar.tsx",
|
|
218
|
+
"kit/blocks.css",
|
|
219
|
+
"kit/gsap.ts"
|
|
220
|
+
]
|
|
221
|
+
},
|
|
222
|
+
{
|
|
223
|
+
"slug": "menu-curtain",
|
|
224
|
+
"kind": "header",
|
|
225
|
+
"title": "Menu: the curtain",
|
|
226
|
+
"does": "A minimal bar (wordmark Noord, one button that rolls Menu to Sluiten) whose ink changes exactly at the edge of the section under it, opening a full-screen menu as a curtain in the gate, slices or stack language: five large links rise through masks, the hovered or focused link shows its decoded photo on the calm side, and a foot line carries the contact address and Rotterdam local time; it closes the same way reversed, a close overtaken by an open turns round, and the page under it is held still and inert while it is open.",
|
|
227
|
+
"reference": "Lowlight's menu curtain (Opus55/build/template.html: .menu CSS near line 210, initMenu near line 1606), carried into the gate, slices and stack page transitions, with the bar's ink split exactly at section edges.",
|
|
228
|
+
"variants": [
|
|
229
|
+
{
|
|
230
|
+
"id": "gate",
|
|
231
|
+
"title": "De poort",
|
|
232
|
+
"does": "An accent line draws from the middle of the screen and the menu opens from it as two edges part; the photo opens from its own middle line on hover."
|
|
233
|
+
},
|
|
234
|
+
{
|
|
235
|
+
"id": "slices",
|
|
236
|
+
"title": "De repen",
|
|
237
|
+
"does": "The menu falls in four vertical slices, left to right, each led by an accent edge; the photo stands in the last slice as a tall print and a new one falls over it on hover."
|
|
238
|
+
},
|
|
239
|
+
{
|
|
240
|
+
"id": "stack",
|
|
241
|
+
"title": "De stapel",
|
|
242
|
+
"does": "Three panels grow one after another from the button; a small portrait frame flips through a few prints, then cuts to the hovered link's photo."
|
|
243
|
+
}
|
|
244
|
+
],
|
|
245
|
+
"packages": [
|
|
246
|
+
"@gsap/react",
|
|
247
|
+
"gsap",
|
|
248
|
+
"lenis"
|
|
249
|
+
],
|
|
250
|
+
"exports": [
|
|
251
|
+
"MenuCurtain"
|
|
252
|
+
],
|
|
253
|
+
"file": "headers/menu-curtain.tsx",
|
|
254
|
+
"files": [
|
|
255
|
+
"headers/menu-curtain.tsx",
|
|
256
|
+
"kit/SmoothScroll.tsx",
|
|
257
|
+
"kit/blocks.css",
|
|
258
|
+
"kit/gsap.ts",
|
|
259
|
+
"kit/images.ts"
|
|
260
|
+
]
|
|
261
|
+
},
|
|
262
|
+
{
|
|
263
|
+
"slug": "hero-framed",
|
|
264
|
+
"kind": "hero",
|
|
265
|
+
"title": "Hero: the frame",
|
|
266
|
+
"does": "One photograph hung on the page ground like a framed print, with four registration marks, a museum label and a caption, in three hangs: a small print at the centre you walk up to on the first scroll, the name set large on the wall with a tall print at the edge that opens over it, or a print that nearly fills the screen in a thin mat and steps back to a small portrait with the line beside it; pin 150%, the line on the photo's measured calm side or on the wall.",
|
|
267
|
+
"reference": "Lowlight's gate registration and corner marks (Opus55/build/template.html: hero frame CSS near line 252, gateShift near line 1233), turned from a hero image into a print on a gallery wall that you walk up to.",
|
|
268
|
+
"variants": [
|
|
269
|
+
{
|
|
270
|
+
"id": "wand",
|
|
271
|
+
"title": "Wand",
|
|
272
|
+
"does": "A small landscape print at the centre of the wall with its museum label; the first scroll walks up to it until it fills the screen."
|
|
273
|
+
},
|
|
274
|
+
{
|
|
275
|
+
"id": "portret",
|
|
276
|
+
"title": "Portret",
|
|
277
|
+
"does": "The studio name set large on the wall with a tall print hung high at the edge; the first scroll opens the print over the name to the whole screen and the line rises on its calm side."
|
|
278
|
+
},
|
|
279
|
+
{
|
|
280
|
+
"id": "passe",
|
|
281
|
+
"title": "Passe-partout",
|
|
282
|
+
"does": "A print that nearly fills the screen inside a thin mat; the first scroll steps back to a small portrait at the left with the line on the wall beside it."
|
|
283
|
+
}
|
|
284
|
+
],
|
|
285
|
+
"packages": [
|
|
286
|
+
"@gsap/react",
|
|
287
|
+
"gsap"
|
|
288
|
+
],
|
|
289
|
+
"exports": [
|
|
290
|
+
"HeroFramed"
|
|
291
|
+
],
|
|
292
|
+
"file": "heroes/hero-framed.tsx",
|
|
293
|
+
"files": [
|
|
294
|
+
"heroes/hero-framed.tsx",
|
|
295
|
+
"kit/blocks.css",
|
|
296
|
+
"kit/gsap.ts",
|
|
297
|
+
"kit/images.ts",
|
|
298
|
+
"kit/photo-read.ts",
|
|
299
|
+
"preloaders/preloader-slices-uncovered.ts"
|
|
300
|
+
]
|
|
301
|
+
},
|
|
302
|
+
{
|
|
303
|
+
"slug": "hero-split",
|
|
304
|
+
"kind": "hero",
|
|
305
|
+
"title": "Hero: split",
|
|
306
|
+
"does": "One headline set twice across a seam, in the ground's ink and the photo's ink, with a cycling discipline and its photograph: the seam stands upright, lies flat with the word rising through it, or opens with the first scroll from a strip at the edge to the split.",
|
|
307
|
+
"reference": "The award sheets' split-screen pair and image changes by mask and clip (struq-assets/references/award-tier-2026-11/README.md), with Lowlight's caption calm for the type side (Opus55/build/template.html).",
|
|
308
|
+
"variants": [
|
|
309
|
+
{
|
|
310
|
+
"id": "naad",
|
|
311
|
+
"title": "Staande naad",
|
|
312
|
+
"does": "The headline beside a tall photograph, the seam upright, the last word cycling through the disciplines with their photos."
|
|
313
|
+
},
|
|
314
|
+
{
|
|
315
|
+
"id": "liggend",
|
|
316
|
+
"title": "Liggende naad",
|
|
317
|
+
"does": "The photograph runs across the top and the ground below; the headline stands on the seam and each new word rises out of the ground ink into the photo ink."
|
|
318
|
+
},
|
|
319
|
+
{
|
|
320
|
+
"id": "opening",
|
|
321
|
+
"title": "Opening",
|
|
322
|
+
"does": "At rest the ground fills the screen and the photo is a strip at the edge; the first scroll opens it to the split while the headline turns to the photo ink as the edge passes."
|
|
323
|
+
}
|
|
324
|
+
],
|
|
325
|
+
"packages": [
|
|
326
|
+
"@gsap/react",
|
|
327
|
+
"gsap"
|
|
328
|
+
],
|
|
329
|
+
"exports": [
|
|
330
|
+
"HeroSplit"
|
|
331
|
+
],
|
|
332
|
+
"file": "heroes/hero-split.tsx",
|
|
333
|
+
"files": [
|
|
334
|
+
"heroes/hero-split.tsx",
|
|
335
|
+
"kit/blocks.css",
|
|
336
|
+
"kit/gsap.ts",
|
|
337
|
+
"kit/images.ts",
|
|
338
|
+
"kit/photo-read.ts",
|
|
339
|
+
"preloaders/preloader-slices-uncovered.ts"
|
|
340
|
+
]
|
|
341
|
+
},
|
|
342
|
+
{
|
|
343
|
+
"slug": "hero-index",
|
|
344
|
+
"kind": "hero",
|
|
345
|
+
"title": "Hero: the index",
|
|
346
|
+
"does": "The studio's list of work as the first screen, each name calling up its project's photograph: full screen behind the list on hover, in a window beside the list on the ground, or walked one by one by the first scroll while the hero holds.",
|
|
347
|
+
"reference": "The hover list's engine at hero scale (blocks/sections/hover-list.tsx), with the restraint of Lowlight's photo-led first screen (Opus55/build/template.html).",
|
|
348
|
+
"variants": [
|
|
349
|
+
{
|
|
350
|
+
"id": "lijst",
|
|
351
|
+
"title": "Lijst over de foto",
|
|
352
|
+
"does": "The list of work over a full-screen photograph that each name wipes in on hover or focus."
|
|
353
|
+
},
|
|
354
|
+
{
|
|
355
|
+
"id": "venster",
|
|
356
|
+
"title": "Venster",
|
|
357
|
+
"does": "The list stands on the page ground and each name wipes its photograph into a tall window beside it."
|
|
358
|
+
},
|
|
359
|
+
{
|
|
360
|
+
"id": "doorlopen",
|
|
361
|
+
"title": "Doorlopen",
|
|
362
|
+
"does": "The list centred over the photograph while the hero holds; each stretch of the first scroll raises the next project and steps its name forward."
|
|
363
|
+
}
|
|
364
|
+
],
|
|
365
|
+
"packages": [
|
|
366
|
+
"@gsap/react",
|
|
367
|
+
"gsap"
|
|
368
|
+
],
|
|
369
|
+
"exports": [
|
|
370
|
+
"HeroIndex"
|
|
371
|
+
],
|
|
372
|
+
"file": "heroes/hero-index.tsx",
|
|
373
|
+
"files": [
|
|
374
|
+
"heroes/hero-index.tsx",
|
|
375
|
+
"kit/blocks.css",
|
|
376
|
+
"kit/gsap.ts",
|
|
377
|
+
"kit/images.ts",
|
|
378
|
+
"kit/photo-read.ts",
|
|
379
|
+
"preloaders/preloader-slices-uncovered.ts"
|
|
380
|
+
]
|
|
381
|
+
},
|
|
382
|
+
{
|
|
383
|
+
"slug": "hero-still",
|
|
384
|
+
"kind": "hero",
|
|
385
|
+
"title": "Hero: full-bleed still",
|
|
386
|
+
"does": "One photograph with a title in three compositions: full bleed with a slow push-in and the headline on its measured calm side, held in a frame of page ground opening to full bleed by registration on the first scroll, or the headline split across the photo's horizon; the caption strip with place, live time and one link under all three, and preloaders land on its photo box.",
|
|
387
|
+
"reference": "Lowlight's hero (Opus55/build/template.html, the hero frame and content near lines 240 to 290): a film still with a title and a caption line.",
|
|
388
|
+
"variants": [
|
|
389
|
+
{
|
|
390
|
+
"id": "still",
|
|
391
|
+
"title": "Still",
|
|
392
|
+
"does": "Full bleed with a slow push-in and the headline on the photo's measured calm side."
|
|
393
|
+
},
|
|
394
|
+
{
|
|
395
|
+
"id": "frame",
|
|
396
|
+
"title": "Kader",
|
|
397
|
+
"does": "The photo held in margins of page ground with the headline beside it, opening to full bleed by registration on the first scroll."
|
|
398
|
+
},
|
|
399
|
+
{
|
|
400
|
+
"id": "horizon",
|
|
401
|
+
"title": "Horizon",
|
|
402
|
+
"does": "The headline split at the photo's horizon, each half in the ink its side measures for, the halves closing on the horizon."
|
|
403
|
+
}
|
|
404
|
+
],
|
|
405
|
+
"packages": [
|
|
406
|
+
"@gsap/react",
|
|
407
|
+
"gsap"
|
|
408
|
+
],
|
|
409
|
+
"exports": [
|
|
410
|
+
"HeroStill"
|
|
411
|
+
],
|
|
412
|
+
"file": "heroes/hero-still.tsx",
|
|
413
|
+
"files": [
|
|
414
|
+
"heroes/hero-still.tsx",
|
|
415
|
+
"kit/blocks.css",
|
|
416
|
+
"kit/gsap.ts",
|
|
417
|
+
"kit/images.ts",
|
|
418
|
+
"kit/photo-read.ts",
|
|
419
|
+
"preloaders/preloader-slices-uncovered.ts"
|
|
420
|
+
]
|
|
421
|
+
},
|
|
422
|
+
{
|
|
423
|
+
"slug": "hero-poster",
|
|
424
|
+
"kind": "hero",
|
|
425
|
+
"title": "Hero: poster type",
|
|
426
|
+
"does": "The first screen as a poster in three compositions: two fitted lines with a letterbox window between them, a narrow slit cutting through the type in the photo's measured ink, or one word per row with a window of a different crop between each pair; on the first scroll (pin 150%) the type parts while the windows open by registration into the full-bleed photo; phones keep the composition with the entrance only.",
|
|
427
|
+
"reference": "The award sheets' oversized type moves (struq-assets/references/award-tier-2026-11/README.md: \"Display type is the composition\", 12 to 20vw) and Kinetic Studio's oversized wordmark (v4vision/projects/kinetic-studio/index.html), with the registration open from Lowlight's gate (Opus55/build/template.html, gateShift near line 1233).",
|
|
428
|
+
"variants": [
|
|
429
|
+
{
|
|
430
|
+
"id": "window",
|
|
431
|
+
"title": "Venster",
|
|
432
|
+
"does": "Two fitted lines with a letterbox window onto the photo between them that opens to full bleed on the first scroll."
|
|
433
|
+
},
|
|
434
|
+
{
|
|
435
|
+
"id": "column",
|
|
436
|
+
"title": "Spleet",
|
|
437
|
+
"does": "A tall narrow slit cuts through the fitted lines in the ink the photo measures for, and opens sideways into the full photo on the first scroll."
|
|
438
|
+
},
|
|
439
|
+
{
|
|
440
|
+
"id": "stack",
|
|
441
|
+
"title": "Stapel",
|
|
442
|
+
"does": "One word per row with a window of a different crop between each pair; on scroll the rows part and the crops slide into one photograph."
|
|
443
|
+
}
|
|
444
|
+
],
|
|
445
|
+
"packages": [
|
|
446
|
+
"@gsap/react",
|
|
447
|
+
"gsap"
|
|
448
|
+
],
|
|
449
|
+
"exports": [
|
|
450
|
+
"HeroPoster"
|
|
451
|
+
],
|
|
452
|
+
"file": "heroes/hero-poster.tsx",
|
|
453
|
+
"files": [
|
|
454
|
+
"heroes/hero-poster.tsx",
|
|
455
|
+
"heroes/hero-still.tsx",
|
|
456
|
+
"kit/blocks.css",
|
|
457
|
+
"kit/gsap.ts",
|
|
458
|
+
"kit/images.ts",
|
|
459
|
+
"kit/photo-read.ts",
|
|
460
|
+
"preloaders/preloader-slices-uncovered.ts"
|
|
461
|
+
]
|
|
462
|
+
},
|
|
463
|
+
{
|
|
464
|
+
"slug": "background-aurora",
|
|
465
|
+
"kind": "background",
|
|
466
|
+
"title": "Background: Noorderlicht",
|
|
467
|
+
"does": "A full-screen hero on a live field of northern light: slow curtains hang from folding hems with long drifting rays, in the palette's accent over its ground, so it is soft ink on paper in light palettes and real light in dark ones.",
|
|
468
|
+
"reference": "Vapor's Noorderlicht (Vapor lib/ambient/backdrops/aurora.ts: drifting ribbons with a brighter core under a curtain shimmer, and the soft ceiling behind text from led.ts), rebuilt as hanging curtains with folding hems.",
|
|
469
|
+
"variants": [
|
|
470
|
+
{
|
|
471
|
+
"id": "veil",
|
|
472
|
+
"title": "Gordijn",
|
|
473
|
+
"does": "One tall curtain of light standing in the right third, two pleats swaying across each other, the type on the calm left."
|
|
474
|
+
},
|
|
475
|
+
{
|
|
476
|
+
"id": "horizon",
|
|
477
|
+
"title": "Horizon",
|
|
478
|
+
"does": "A low band of light along the foot of the screen under the type, stronger to the right, rising a little as the hero scrolls away."
|
|
479
|
+
},
|
|
480
|
+
{
|
|
481
|
+
"id": "drift",
|
|
482
|
+
"title": "Drift",
|
|
483
|
+
"does": "Curtains across the upper half, drifting slowly sideways and bending away from the pointer."
|
|
484
|
+
}
|
|
485
|
+
],
|
|
486
|
+
"packages": [
|
|
487
|
+
"@gsap/react",
|
|
488
|
+
"gsap"
|
|
489
|
+
],
|
|
490
|
+
"exports": [
|
|
491
|
+
"BackgroundAurora"
|
|
492
|
+
],
|
|
493
|
+
"file": "backgrounds/background-aurora.tsx",
|
|
494
|
+
"files": [
|
|
495
|
+
"backgrounds/background-aurora.tsx",
|
|
496
|
+
"kit/blocks.css",
|
|
497
|
+
"kit/gsap.ts"
|
|
498
|
+
]
|
|
499
|
+
},
|
|
500
|
+
{
|
|
501
|
+
"slug": "background-silk",
|
|
502
|
+
"kind": "background",
|
|
503
|
+
"title": "Background: Zijde",
|
|
504
|
+
"does": "A sheet of silk in raking light behind the headline: long soft folds, the cloth one step off the page ground, and a sheen in the accent that travels slowly over the crests.",
|
|
505
|
+
"reference": "Vapor's Zijde (Vapor lib/ambient/backdrops/silk.ts): diagonal satin folds bent by slow noise, the light catching each crest; here a continuous surface with real normals and a low wandering light instead of a halftone grid.",
|
|
506
|
+
"variants": [
|
|
507
|
+
{
|
|
508
|
+
"id": "fold",
|
|
509
|
+
"title": "Plooi",
|
|
510
|
+
"does": "One large diagonal fold with a lesser one beside it through the right half, the type on the calm left; the pointer turns the light so the sheen slides along the fold."
|
|
511
|
+
},
|
|
512
|
+
{
|
|
513
|
+
"id": "ripple",
|
|
514
|
+
"title": "Rimpeling",
|
|
515
|
+
"does": "Long low folds over the whole screen, fuller toward the upper right; the pointer sends a slow band across the folds that lifts and shifts them."
|
|
516
|
+
},
|
|
517
|
+
{
|
|
518
|
+
"id": "drape",
|
|
519
|
+
"title": "Draperie",
|
|
520
|
+
"does": "The cloth hangs from the top edge in rounded pleats down to a wavy hem; scrolling the hero away draws the hem down and stretches the pleats."
|
|
521
|
+
}
|
|
522
|
+
],
|
|
523
|
+
"packages": [
|
|
524
|
+
"@gsap/react",
|
|
525
|
+
"gsap"
|
|
526
|
+
],
|
|
527
|
+
"exports": [
|
|
528
|
+
"BackgroundSilk"
|
|
529
|
+
],
|
|
530
|
+
"file": "backgrounds/background-silk.tsx",
|
|
531
|
+
"files": [
|
|
532
|
+
"backgrounds/background-silk.tsx",
|
|
533
|
+
"kit/blocks.css",
|
|
534
|
+
"kit/gsap.ts"
|
|
535
|
+
]
|
|
536
|
+
},
|
|
537
|
+
{
|
|
538
|
+
"slug": "background-facets",
|
|
539
|
+
"kind": "background",
|
|
540
|
+
"title": "Background: Facetten",
|
|
541
|
+
"does": "A full-screen surface of cut planes on a triangle lattice, every crease a crisp hairline where two planes really fold, each plane catching a slow travelling light in the palette's accent, with the type on the flat ground of the calm side.",
|
|
542
|
+
"reference": "Vapor's Facetten (Vapor lib/ambient/backdrops/facets.ts): the same lattice idea in new compositions.",
|
|
543
|
+
"variants": [
|
|
544
|
+
{
|
|
545
|
+
"id": "shard",
|
|
546
|
+
"title": "Kristal",
|
|
547
|
+
"does": "A few cut shards stand apart in the right third, each a pyramid of unequal planes, while a light circles them and each plane and ridge catches it in turn; the type on the flat ground to the left."
|
|
548
|
+
},
|
|
549
|
+
{
|
|
550
|
+
"id": "relief",
|
|
551
|
+
"title": "Reliëf",
|
|
552
|
+
"does": "The whole screen a very low relief of large, slowly tilting planes with a broad band of light sweeping across, lowest under the type."
|
|
553
|
+
},
|
|
554
|
+
{
|
|
555
|
+
"id": "turn",
|
|
556
|
+
"title": "Draai",
|
|
557
|
+
"does": "Diagonal pleats in the upper left cut into planes; the light turns across them as the hero scrolls away and leans toward the pointer."
|
|
558
|
+
}
|
|
559
|
+
],
|
|
560
|
+
"packages": [
|
|
561
|
+
"@gsap/react",
|
|
562
|
+
"gsap"
|
|
563
|
+
],
|
|
564
|
+
"exports": [
|
|
565
|
+
"BackgroundFacets"
|
|
566
|
+
],
|
|
567
|
+
"file": "backgrounds/background-facets.tsx",
|
|
568
|
+
"files": [
|
|
569
|
+
"backgrounds/background-facets.tsx",
|
|
570
|
+
"kit/blocks.css",
|
|
571
|
+
"kit/gsap.ts",
|
|
572
|
+
"preloaders/preloader-slices-uncovered.ts"
|
|
573
|
+
]
|
|
574
|
+
},
|
|
575
|
+
{
|
|
576
|
+
"slug": "hero-opener",
|
|
577
|
+
"kind": "showpiece",
|
|
578
|
+
"title": "Hero opener",
|
|
579
|
+
"does": "A full-bleed photo (or the WebGL scene over it) with the display line at 14 to 20vw across it; on scroll it pins, scales down and darkens while the next section slides over.",
|
|
580
|
+
"reference": null,
|
|
581
|
+
"variants": [],
|
|
582
|
+
"packages": [
|
|
583
|
+
"@gsap/react",
|
|
584
|
+
"@types/three",
|
|
585
|
+
"gsap",
|
|
586
|
+
"three"
|
|
587
|
+
],
|
|
588
|
+
"exports": [
|
|
589
|
+
"HeroOpener"
|
|
590
|
+
],
|
|
591
|
+
"file": "showpieces/hero-opener.tsx",
|
|
592
|
+
"files": [
|
|
593
|
+
"kit/HeroCanvas.tsx",
|
|
594
|
+
"kit/MagneticButton.tsx",
|
|
595
|
+
"kit/SplitHeadline.tsx",
|
|
596
|
+
"kit/blocks.css",
|
|
597
|
+
"kit/gsap.ts",
|
|
598
|
+
"kit/images.ts",
|
|
599
|
+
"kit/scenes/contours.ts",
|
|
600
|
+
"kit/scenes/dots.ts",
|
|
601
|
+
"kit/scenes/ripple.ts",
|
|
602
|
+
"kit/scenes/types.ts",
|
|
603
|
+
"showpieces/hero-opener.tsx"
|
|
604
|
+
]
|
|
605
|
+
},
|
|
606
|
+
{
|
|
607
|
+
"slug": "image-to-fullbleed",
|
|
608
|
+
"kind": "showpiece",
|
|
609
|
+
"title": "Image to full bleed",
|
|
610
|
+
"does": "A small image between the two halves of a name unclips to the full screen as the words travel off the edges.",
|
|
611
|
+
"reference": null,
|
|
612
|
+
"variants": [],
|
|
613
|
+
"packages": [
|
|
614
|
+
"@gsap/react",
|
|
615
|
+
"gsap"
|
|
616
|
+
],
|
|
617
|
+
"exports": [
|
|
618
|
+
"ImageToFullbleed"
|
|
619
|
+
],
|
|
620
|
+
"file": "showpieces/image-to-fullbleed.tsx",
|
|
621
|
+
"files": [
|
|
622
|
+
"kit/blocks.css",
|
|
623
|
+
"kit/gsap.ts",
|
|
624
|
+
"kit/images.ts",
|
|
625
|
+
"showpieces/image-to-fullbleed.tsx"
|
|
626
|
+
]
|
|
627
|
+
},
|
|
628
|
+
{
|
|
629
|
+
"slug": "panel-wipe",
|
|
630
|
+
"kind": "showpiece",
|
|
631
|
+
"title": "Panel wipe",
|
|
632
|
+
"does": "Two panels carrying one word each slide apart to reveal a photo, and close again.",
|
|
633
|
+
"reference": null,
|
|
634
|
+
"variants": [],
|
|
635
|
+
"packages": [
|
|
636
|
+
"@gsap/react",
|
|
637
|
+
"gsap"
|
|
638
|
+
],
|
|
639
|
+
"exports": [
|
|
640
|
+
"PanelWipe"
|
|
641
|
+
],
|
|
642
|
+
"file": "showpieces/panel-wipe.tsx",
|
|
643
|
+
"files": [
|
|
644
|
+
"kit/blocks.css",
|
|
645
|
+
"kit/gsap.ts",
|
|
646
|
+
"kit/images.ts",
|
|
647
|
+
"showpieces/panel-wipe.tsx"
|
|
648
|
+
]
|
|
649
|
+
},
|
|
650
|
+
{
|
|
651
|
+
"slug": "scrub-connector",
|
|
652
|
+
"kind": "showpiece",
|
|
653
|
+
"title": "Scrub connector",
|
|
654
|
+
"does": "Two words far apart with a tall slab of ink between them; the slab swings into one thick slash through both words (their letters knocked out where it crosses), then carries the words in on its two ends, turning to the accent as it travels, and seats long and rising between them; the joined pair holds and scrolls away whole.",
|
|
655
|
+
"reference": null,
|
|
656
|
+
"variants": [],
|
|
657
|
+
"packages": [
|
|
658
|
+
"@gsap/react",
|
|
659
|
+
"gsap"
|
|
660
|
+
],
|
|
661
|
+
"exports": [
|
|
662
|
+
"ScrubConnector"
|
|
663
|
+
],
|
|
664
|
+
"file": "showpieces/scrub-connector.tsx",
|
|
665
|
+
"files": [
|
|
666
|
+
"kit/blocks.css",
|
|
667
|
+
"kit/gsap.ts",
|
|
668
|
+
"showpieces/scrub-connector.tsx"
|
|
669
|
+
]
|
|
670
|
+
},
|
|
671
|
+
{
|
|
672
|
+
"slug": "project-stack",
|
|
673
|
+
"kind": "showpiece",
|
|
674
|
+
"title": "Project stack",
|
|
675
|
+
"does": "One project per screen; each slides up full bleed over the last while the one beneath recedes.",
|
|
676
|
+
"reference": null,
|
|
677
|
+
"variants": [],
|
|
678
|
+
"packages": [
|
|
679
|
+
"@gsap/react",
|
|
680
|
+
"gsap"
|
|
681
|
+
],
|
|
682
|
+
"exports": [
|
|
683
|
+
"ProjectStack"
|
|
684
|
+
],
|
|
685
|
+
"file": "showpieces/project-stack.tsx",
|
|
686
|
+
"files": [
|
|
687
|
+
"kit/blocks.css",
|
|
688
|
+
"kit/gsap.ts",
|
|
689
|
+
"kit/images.ts",
|
|
690
|
+
"showpieces/project-stack.tsx"
|
|
691
|
+
]
|
|
692
|
+
},
|
|
693
|
+
{
|
|
694
|
+
"slug": "manifesto-scrub",
|
|
695
|
+
"kind": "showpiece",
|
|
696
|
+
"title": "Manifesto scrub",
|
|
697
|
+
"does": "One large statement that fills word by word, from a faint ink to full ink, as it scrolls through the screen.",
|
|
698
|
+
"reference": null,
|
|
699
|
+
"variants": [],
|
|
700
|
+
"packages": [
|
|
701
|
+
"@gsap/react",
|
|
702
|
+
"gsap"
|
|
703
|
+
],
|
|
704
|
+
"exports": [
|
|
705
|
+
"ManifestoScrub"
|
|
706
|
+
],
|
|
707
|
+
"file": "showpieces/manifesto-scrub.tsx",
|
|
708
|
+
"files": [
|
|
709
|
+
"kit/blocks.css",
|
|
710
|
+
"kit/gsap.ts",
|
|
711
|
+
"showpieces/manifesto-scrub.tsx"
|
|
712
|
+
]
|
|
713
|
+
},
|
|
714
|
+
{
|
|
715
|
+
"slug": "fill-rows",
|
|
716
|
+
"kind": "showpiece",
|
|
717
|
+
"title": "Fill rows",
|
|
718
|
+
"does": "Large hairline rows; on hover or focus a row floods with the accent from below and its detail slides in.",
|
|
719
|
+
"reference": null,
|
|
720
|
+
"variants": [],
|
|
721
|
+
"packages": [
|
|
722
|
+
"@gsap/react",
|
|
723
|
+
"gsap"
|
|
724
|
+
],
|
|
725
|
+
"exports": [
|
|
726
|
+
"FillRows"
|
|
727
|
+
],
|
|
728
|
+
"file": "showpieces/fill-rows.tsx",
|
|
729
|
+
"files": [
|
|
730
|
+
"kit/blocks.css",
|
|
731
|
+
"kit/gsap.ts",
|
|
732
|
+
"showpieces/fill-rows.tsx"
|
|
733
|
+
]
|
|
734
|
+
},
|
|
735
|
+
{
|
|
736
|
+
"slug": "pixel-resolve",
|
|
737
|
+
"kind": "showpiece",
|
|
738
|
+
"title": "Pixel resolve",
|
|
739
|
+
"does": "A photo that arrives as coarse pixels and resolves to full sharpness.",
|
|
740
|
+
"reference": null,
|
|
741
|
+
"variants": [],
|
|
742
|
+
"packages": [
|
|
743
|
+
"@gsap/react",
|
|
744
|
+
"gsap"
|
|
745
|
+
],
|
|
746
|
+
"exports": [
|
|
747
|
+
"PixelResolve"
|
|
748
|
+
],
|
|
749
|
+
"file": "showpieces/pixel-resolve.tsx",
|
|
750
|
+
"files": [
|
|
751
|
+
"kit/blocks.css",
|
|
752
|
+
"kit/images.ts",
|
|
753
|
+
"showpieces/pixel-resolve.tsx"
|
|
754
|
+
]
|
|
755
|
+
},
|
|
756
|
+
{
|
|
757
|
+
"slug": "wordmark-finale",
|
|
758
|
+
"kind": "showpiece",
|
|
759
|
+
"title": "Wordmark finale",
|
|
760
|
+
"does": "The footer as a finale: the name fitted edge to edge, rising out of a mask, with a closing line and a live local clock.",
|
|
761
|
+
"reference": null,
|
|
762
|
+
"variants": [],
|
|
763
|
+
"packages": [
|
|
764
|
+
"@gsap/react",
|
|
765
|
+
"gsap"
|
|
766
|
+
],
|
|
767
|
+
"exports": [
|
|
768
|
+
"WordmarkFinale"
|
|
769
|
+
],
|
|
770
|
+
"file": "showpieces/wordmark-finale.tsx",
|
|
771
|
+
"files": [
|
|
772
|
+
"kit/blocks.css",
|
|
773
|
+
"kit/gsap.ts",
|
|
774
|
+
"showpieces/wordmark-finale.tsx"
|
|
775
|
+
]
|
|
776
|
+
},
|
|
777
|
+
{
|
|
778
|
+
"slug": "zoom-through",
|
|
779
|
+
"kind": "transition",
|
|
780
|
+
"title": "Zoom-through",
|
|
781
|
+
"does": "A pinned composed frame (the display line and a lead on the ground, the photo in an upright window with its caption and corner marks) holds; then the camera pushes into the window: the type, nearer the lens, scales away past the edges, the window opens until all four edges leave the screen together, and the photo, deeper than the window, settles out of its push-in to full bleed with its subject held in place; a strip of the ground rises from the bottom edge with the line and caption, and the next section's heading, at the display size of the frame it left, rises out of masks in the photo where its pixels allow a light or dark ink at 4.5:1 (the calm side first, then the window's side), or on bands of ground stepped up from the strip where they do not (or cannot be read), holds, and the pin lets go with the photo drifting slower than the page.",
|
|
782
|
+
"reference": "The award sheets' zoom-through (struq-assets/references/award-tier-2026-11/README.md, \"Motion\": the camera pushes into an image until it becomes the next section's background), with Lowlight's gate registration and corner marks (Opus55/build/template.html, gateShift line 1233, hero frame CSS line 252).",
|
|
783
|
+
"variants": [],
|
|
784
|
+
"packages": [
|
|
785
|
+
"@gsap/react",
|
|
786
|
+
"gsap"
|
|
787
|
+
],
|
|
788
|
+
"exports": [
|
|
789
|
+
"ZoomThrough"
|
|
790
|
+
],
|
|
791
|
+
"file": "transitions/zoom-through.tsx",
|
|
792
|
+
"files": [
|
|
793
|
+
"kit/blocks.css",
|
|
794
|
+
"kit/gsap.ts",
|
|
795
|
+
"kit/images.ts",
|
|
796
|
+
"kit/photo-read.ts",
|
|
797
|
+
"transitions/zoom-through.tsx"
|
|
798
|
+
]
|
|
799
|
+
},
|
|
800
|
+
{
|
|
801
|
+
"slug": "about-studio",
|
|
802
|
+
"kind": "section",
|
|
803
|
+
"title": "About the studio",
|
|
804
|
+
"does": "Who the studio is (a statement, a paragraph, honest facts and the place given real space), as a plate that opens out of the margins, a walk past two columns of photographs beside sticky type, or a slit of photograph that opens and pushes the statement's halves apart.",
|
|
805
|
+
"reference": "Lowlight's studio section (Opus55/build/template.html line 841, the wide plate over its facts list), without its eyebrows, numeral or marquee.",
|
|
806
|
+
"variants": [
|
|
807
|
+
{
|
|
808
|
+
"id": "plaat",
|
|
809
|
+
"title": "Plaat",
|
|
810
|
+
"does": "A full-bleed plate of the place opens out of the page margins and drifts in its frame, the statement large under it and the facts with rules that draw in."
|
|
811
|
+
},
|
|
812
|
+
{
|
|
813
|
+
"id": "wandeling",
|
|
814
|
+
"title": "Wandeling",
|
|
815
|
+
"does": "The statement and facts stay put while two columns of upright photographs pass beside them at different speeds; on phones a swipe row."
|
|
816
|
+
},
|
|
817
|
+
{
|
|
818
|
+
"id": "doorkijk",
|
|
819
|
+
"title": "Doorkijk",
|
|
820
|
+
"does": "On a short pin a slit of photograph between the statement's two halves opens into a window and pushes them apart."
|
|
821
|
+
}
|
|
822
|
+
],
|
|
823
|
+
"packages": [
|
|
824
|
+
"@gsap/react",
|
|
825
|
+
"gsap"
|
|
826
|
+
],
|
|
827
|
+
"exports": [
|
|
828
|
+
"AboutStudio"
|
|
829
|
+
],
|
|
830
|
+
"file": "sections/about-studio.tsx",
|
|
831
|
+
"files": [
|
|
832
|
+
"kit/blocks.css",
|
|
833
|
+
"kit/gsap.ts",
|
|
834
|
+
"kit/images.ts",
|
|
835
|
+
"sections/about-studio.tsx"
|
|
836
|
+
]
|
|
837
|
+
},
|
|
838
|
+
{
|
|
839
|
+
"slug": "approach",
|
|
840
|
+
"kind": "section",
|
|
841
|
+
"title": "Approach",
|
|
842
|
+
"does": "How the studio works from first conversation to handover, told without numbers: a line that draws down the page with the stages hanging off it, one pinned sentence whose clauses come to ink in turn, or an index you scrub by drag, click or arrow keys while the photographs wipe across in register.",
|
|
843
|
+
"reference": "Lowlight's process section (Opus55/build/template.html line 781, phases beside a scrubbed aperture), with the numbered kickers replaced by sequence in layout, scroll and hand.",
|
|
844
|
+
"variants": [
|
|
845
|
+
{
|
|
846
|
+
"id": "draad",
|
|
847
|
+
"title": "Draad",
|
|
848
|
+
"does": "One line draws down the page as you read, the stages hanging off it left and right, each tick drawing out and each name rising as the line reaches it."
|
|
849
|
+
},
|
|
850
|
+
{
|
|
851
|
+
"id": "zin",
|
|
852
|
+
"title": "Zin",
|
|
853
|
+
"does": "The whole process as one pinned sentence whose clauses come to ink in turn while the current stage's note swaps beneath it."
|
|
854
|
+
},
|
|
855
|
+
{
|
|
856
|
+
"id": "schuif",
|
|
857
|
+
"title": "Schuif",
|
|
858
|
+
"does": "An index you scrub by dragging the rule, clicking a stage or using the arrow keys, the photographs wiping across in register while the copy swaps beside them."
|
|
859
|
+
}
|
|
860
|
+
],
|
|
861
|
+
"packages": [
|
|
862
|
+
"@gsap/react",
|
|
863
|
+
"gsap"
|
|
864
|
+
],
|
|
865
|
+
"exports": [
|
|
866
|
+
"Approach"
|
|
867
|
+
],
|
|
868
|
+
"file": "sections/approach.tsx",
|
|
869
|
+
"files": [
|
|
870
|
+
"kit/blocks.css",
|
|
871
|
+
"kit/gsap.ts",
|
|
872
|
+
"kit/images.ts",
|
|
873
|
+
"sections/approach.tsx"
|
|
874
|
+
]
|
|
875
|
+
},
|
|
876
|
+
{
|
|
877
|
+
"slug": "manifesto",
|
|
878
|
+
"kind": "section",
|
|
879
|
+
"title": "Manifesto",
|
|
880
|
+
"does": "The studio's statement as the page's moment of conviction: written in line by line behind a caret, set as a pull quote over a drifting photograph on its measured calm side, or split across a short pin where the second half arrives sentence by sentence until the whole statement stands.",
|
|
881
|
+
"reference": "Deliberately avoids Lowlight's manifesto treatment (Opus55/build/template.html, initTreatment) and manifesto-scrub's word fill; the line masks and scrubbed rises follow the admitted reveals, the calm side and veil cap follow hero-still.",
|
|
882
|
+
"variants": [
|
|
883
|
+
{
|
|
884
|
+
"id": "writes",
|
|
885
|
+
"title": "Schrift",
|
|
886
|
+
"does": "The section pins and the statement writes itself in line by line behind a thin accent caret, then holds while a signature rises."
|
|
887
|
+
},
|
|
888
|
+
{
|
|
889
|
+
"id": "quote",
|
|
890
|
+
"title": "Citaat",
|
|
891
|
+
"does": "One sentence as a pull quote over a full-bleed photograph on its measured calm side, the photo drifting slowly inside its frame."
|
|
892
|
+
},
|
|
893
|
+
{
|
|
894
|
+
"id": "split",
|
|
895
|
+
"title": "Tweeluik",
|
|
896
|
+
"does": "A short pin: the first half stands large on the left while the second half arrives on the right one sentence at a time, each rising under the one before, ending on the whole statement in two columns."
|
|
897
|
+
}
|
|
898
|
+
],
|
|
899
|
+
"packages": [
|
|
900
|
+
"@gsap/react",
|
|
901
|
+
"gsap"
|
|
902
|
+
],
|
|
903
|
+
"exports": [
|
|
904
|
+
"Manifesto"
|
|
905
|
+
],
|
|
906
|
+
"file": "sections/manifesto.tsx",
|
|
907
|
+
"files": [
|
|
908
|
+
"kit/blocks.css",
|
|
909
|
+
"kit/gsap.ts",
|
|
910
|
+
"kit/images.ts",
|
|
911
|
+
"kit/photo-read.ts",
|
|
912
|
+
"sections/manifesto.tsx"
|
|
913
|
+
]
|
|
914
|
+
},
|
|
915
|
+
{
|
|
916
|
+
"slug": "contact-form",
|
|
917
|
+
"kind": "section",
|
|
918
|
+
"title": "Contact form",
|
|
919
|
+
"does": "The one place the site asks for input: name, e-mail, a short subject and an optional choice, as fields that are only a drawing rule with lifting labels, as a sentence the reader completes inline at display size, or one question at a time, with every state designed from invalid to a travelling-arrow send, a thank-you in the form's own place and a kept-text retry.",
|
|
920
|
+
"reference": "Neither Lowlight nor Kinetic has a form; the send link and drawing underline come from cta-closing's action, the light display type from the heroes, and the field states are new.",
|
|
921
|
+
"variants": [
|
|
922
|
+
{
|
|
923
|
+
"id": "lines",
|
|
924
|
+
"title": "Lijnen",
|
|
925
|
+
"does": "A display line and a note on the left, the fields on the right; each label rests inside its field and lifts as it is focused or filled, the baseline rule drawing in the accent from the left."
|
|
926
|
+
},
|
|
927
|
+
{
|
|
928
|
+
"id": "sentence",
|
|
929
|
+
"title": "Zin",
|
|
930
|
+
"does": "The form is a sentence the reader completes, the blanks inline at display size in a light weight and growing with the text; on phones each clause stacks above its field."
|
|
931
|
+
},
|
|
932
|
+
{
|
|
933
|
+
"id": "steps",
|
|
934
|
+
"title": "Stappen",
|
|
935
|
+
"does": "One question at a time at display size; Enter or Volgende moves on, Terug goes back, the answers so far stay small above, and a thin rule fills."
|
|
936
|
+
}
|
|
937
|
+
],
|
|
938
|
+
"packages": [],
|
|
939
|
+
"exports": [
|
|
940
|
+
"ContactForm"
|
|
941
|
+
],
|
|
942
|
+
"file": "sections/contact-form.tsx",
|
|
943
|
+
"files": [
|
|
944
|
+
"kit/blocks.css",
|
|
945
|
+
"sections/contact-form.tsx"
|
|
946
|
+
]
|
|
947
|
+
},
|
|
948
|
+
{
|
|
949
|
+
"slug": "cta-closing",
|
|
950
|
+
"kind": "section",
|
|
951
|
+
"title": "Closing call to action",
|
|
952
|
+
"does": "The page's last screen before the footer, one light display line and one large text link with an arrow and a drawing line, arriving on a short scroll-scrubbed stretch that runs backwards on the way back: a photograph opening by registration behind the line on its measured calm side, the line as a slow scroll-nudged band behind a still link, or a still line whose link brings a project frame that follows the pointer.",
|
|
953
|
+
"reference": "Lowlight's closing contact screen and Kinetic Studio's marquee and hover-preview links, rebuilt with the registration clip from image-to-fullbleed, the shared photo read (blocks/kit/photo-read.ts) and a velocity band that differs from velocity-type.",
|
|
954
|
+
"variants": [
|
|
955
|
+
{
|
|
956
|
+
"id": "photo",
|
|
957
|
+
"title": "Foto",
|
|
958
|
+
"does": "A photograph opens behind the line from a centred window to full bleed; line and link stand on its measured calm side over a light veil."
|
|
959
|
+
},
|
|
960
|
+
{
|
|
961
|
+
"id": "marquee",
|
|
962
|
+
"title": "Band",
|
|
963
|
+
"does": "The line runs as one slow band in a stepped-back ink, nudged by the scroll's speed; the link stands still at the centre in front of it."
|
|
964
|
+
},
|
|
965
|
+
{
|
|
966
|
+
"id": "pointer",
|
|
967
|
+
"title": "Aanwijzer",
|
|
968
|
+
"does": "Plain ground, the line large and still; hovering the link brings a small project frame that follows the pointer while the link's line draws."
|
|
969
|
+
}
|
|
970
|
+
],
|
|
971
|
+
"packages": [
|
|
972
|
+
"@gsap/react",
|
|
973
|
+
"gsap"
|
|
974
|
+
],
|
|
975
|
+
"exports": [
|
|
976
|
+
"CtaClosing"
|
|
977
|
+
],
|
|
978
|
+
"file": "sections/cta-closing.tsx",
|
|
979
|
+
"files": [
|
|
980
|
+
"kit/blocks.css",
|
|
981
|
+
"kit/gsap.ts",
|
|
982
|
+
"kit/images.ts",
|
|
983
|
+
"kit/photo-read.ts",
|
|
984
|
+
"sections/cta-closing.tsx"
|
|
985
|
+
]
|
|
986
|
+
},
|
|
987
|
+
{
|
|
988
|
+
"slug": "reveals",
|
|
989
|
+
"kind": "section",
|
|
990
|
+
"title": "Reveals",
|
|
991
|
+
"does": "A plain editorial section (statement, paragraph, one photo, one text link) that enters on a short scroll-scrubbed stretch in one of three ways: lines rising through masks with the photo opening from its bottom edge, the photo opening from a thin slit with the type rising beside it, or the whole section laid over the previous one like a card, which dims and falls behind; scrolling back runs every entrance backwards.",
|
|
992
|
+
"reference": "Lowlight's mask-line and block reveals (Opus55/build/template.html, initReveals), rebuilt as scroll-scrubbed entrances with the registration clip from image-to-fullbleed and a card-over-table hand-over.",
|
|
993
|
+
"variants": [
|
|
994
|
+
{
|
|
995
|
+
"id": "lines",
|
|
996
|
+
"title": "Regels",
|
|
997
|
+
"does": "The statement's lines rise through masks one after another, the paragraph and link follow softly, then the photo opens from its bottom edge."
|
|
998
|
+
},
|
|
999
|
+
{
|
|
1000
|
+
"id": "clip",
|
|
1001
|
+
"title": "Spleet",
|
|
1002
|
+
"does": "The photo leads, opening from a thin horizontal slit inside its final frame to full size; the type rises beside it once the slit is half open."
|
|
1003
|
+
},
|
|
1004
|
+
{
|
|
1005
|
+
"id": "card",
|
|
1006
|
+
"title": "Kaart",
|
|
1007
|
+
"does": "The whole section slides up over the previous one with a hairline shadow on its top edge; the covered section dims and falls behind as the content settles."
|
|
1008
|
+
}
|
|
1009
|
+
],
|
|
1010
|
+
"packages": [
|
|
1011
|
+
"@gsap/react",
|
|
1012
|
+
"gsap"
|
|
1013
|
+
],
|
|
1014
|
+
"exports": [
|
|
1015
|
+
"Reveals"
|
|
1016
|
+
],
|
|
1017
|
+
"file": "sections/reveals.tsx",
|
|
1018
|
+
"files": [
|
|
1019
|
+
"kit/blocks.css",
|
|
1020
|
+
"kit/gsap.ts",
|
|
1021
|
+
"kit/images.ts",
|
|
1022
|
+
"sections/reveals.tsx"
|
|
1023
|
+
]
|
|
1024
|
+
},
|
|
1025
|
+
{
|
|
1026
|
+
"slug": "image-trail",
|
|
1027
|
+
"kind": "section",
|
|
1028
|
+
"title": "Image trail",
|
|
1029
|
+
"does": "A list of work at display size; moving the pointer over a row deals that project's photograph at the pointer each time it has travelled a set distance, turned a little with the hand and settling as it lands, while older prints hold, shrink and fade behind it, six at most; a fast hand leaves a longer, wider trail and a still one leaves nothing new; keyboard focus and reduced motion show one print beside the row, and touch and phones show each photograph inline.",
|
|
1030
|
+
"reference": "The award sheets' image trail (struq-assets/references/award-tier-2026-11/README.md), with the restraint of Lowlight's pointer-led still over its rows (Opus55/build/template.html, .make__preview near line 394).",
|
|
1031
|
+
"variants": [],
|
|
1032
|
+
"packages": [
|
|
1033
|
+
"@gsap/react",
|
|
1034
|
+
"gsap"
|
|
1035
|
+
],
|
|
1036
|
+
"exports": [
|
|
1037
|
+
"ImageTrail"
|
|
1038
|
+
],
|
|
1039
|
+
"file": "sections/image-trail.tsx",
|
|
1040
|
+
"files": [
|
|
1041
|
+
"kit/blocks.css",
|
|
1042
|
+
"kit/gsap.ts",
|
|
1043
|
+
"kit/images.ts",
|
|
1044
|
+
"sections/image-trail.tsx"
|
|
1045
|
+
]
|
|
1046
|
+
},
|
|
1047
|
+
{
|
|
1048
|
+
"slug": "panel-accordion",
|
|
1049
|
+
"kind": "section",
|
|
1050
|
+
"title": "Panel accordion",
|
|
1051
|
+
"does": "A full-height row of five tall photo panels like gallery shutters: hover or focus opens one wide while the others narrow, the photograph already full size behind a widening window, its name rising in through a mask; on scroll into view the panels rise from their bottom edge one after another and the first opens on its own; phones stack them as rows that open on tap.",
|
|
1052
|
+
"reference": "The award sheets' panel and shutter moves (struq-assets/references/award-tier-2026-11/README.md) and Kinetic Studio's capabilities rhythm (v4vision/projects/kinetic-studio/index.html, near line 447).",
|
|
1053
|
+
"variants": [],
|
|
1054
|
+
"packages": [
|
|
1055
|
+
"@gsap/react",
|
|
1056
|
+
"gsap"
|
|
1057
|
+
],
|
|
1058
|
+
"exports": [
|
|
1059
|
+
"PanelAccordion"
|
|
1060
|
+
],
|
|
1061
|
+
"file": "sections/panel-accordion.tsx",
|
|
1062
|
+
"files": [
|
|
1063
|
+
"kit/blocks.css",
|
|
1064
|
+
"kit/gsap.ts",
|
|
1065
|
+
"kit/images.ts",
|
|
1066
|
+
"sections/panel-accordion.tsx"
|
|
1067
|
+
]
|
|
1068
|
+
},
|
|
1069
|
+
{
|
|
1070
|
+
"slug": "grid-assembly",
|
|
1071
|
+
"kind": "section",
|
|
1072
|
+
"title": "Grid assembly",
|
|
1073
|
+
"does": "A pinned section (250%) opens on nine photos lying at angles in a composed pile, a few past the screen edges, that travel one after another into an editorial grid with exact gaps as the section's line rises in its type cell; the grid holds, then the hero print, a window onto its photo at full size, opens to the full screen while the others are pushed out, the photo never changing scale, and the next line rises on the photo's calmer side, holds, and the photo drifts slower than the page as the pin lets go. Phones open the grid tile by tile; reduced motion and pages without scripts show the grid, then the full-bleed photo with its line.",
|
|
1074
|
+
"reference": "The award sheets' \"grid assembly\" and \"image grows to full bleed\" moves (struq-assets/references/award-tier-2026-11/README.md, showpieces 1 and Motion), with Lowlight's restraint (Opus55/build/template.html): one grade, holds as long as the moves, a hand-over into the next scene.",
|
|
1075
|
+
"variants": [],
|
|
1076
|
+
"packages": [
|
|
1077
|
+
"@gsap/react",
|
|
1078
|
+
"gsap"
|
|
1079
|
+
],
|
|
1080
|
+
"exports": [
|
|
1081
|
+
"GridAssembly"
|
|
1082
|
+
],
|
|
1083
|
+
"file": "sections/grid-assembly.tsx",
|
|
1084
|
+
"files": [
|
|
1085
|
+
"kit/blocks.css",
|
|
1086
|
+
"kit/gsap.ts",
|
|
1087
|
+
"kit/images.ts",
|
|
1088
|
+
"kit/photo-read.ts",
|
|
1089
|
+
"sections/grid-assembly.tsx"
|
|
1090
|
+
]
|
|
1091
|
+
},
|
|
1092
|
+
{
|
|
1093
|
+
"slug": "velocity-type",
|
|
1094
|
+
"kind": "section",
|
|
1095
|
+
"title": "Velocity type",
|
|
1096
|
+
"does": "Two lines of display type at 15vw run sideways in opposite directions as you scroll, run ahead with its speed, lean back and stretch slightly as if dragged, and settle upright within about 0.4 seconds of stopping, with small photographs sitting between the phrases as their own frames; the belt loops without a seam, and reduced motion and pages without scripts leave the lines at rest.",
|
|
1097
|
+
"reference": "The award sheets' velocity type (struq-assets/references/award-tier-2026-11/README.md, \"Motion\"), with the feel of Kinetic Studio's marquee (v4vision/projects/kinetic-studio/index.html).",
|
|
1098
|
+
"variants": [],
|
|
1099
|
+
"packages": [
|
|
1100
|
+
"@gsap/react",
|
|
1101
|
+
"gsap"
|
|
1102
|
+
],
|
|
1103
|
+
"exports": [
|
|
1104
|
+
"VelocityType"
|
|
1105
|
+
],
|
|
1106
|
+
"file": "sections/velocity-type.tsx",
|
|
1107
|
+
"files": [
|
|
1108
|
+
"kit/blocks.css",
|
|
1109
|
+
"kit/gsap.ts",
|
|
1110
|
+
"kit/images.ts",
|
|
1111
|
+
"sections/velocity-type.tsx"
|
|
1112
|
+
]
|
|
1113
|
+
},
|
|
1114
|
+
{
|
|
1115
|
+
"slug": "sticky-chapters",
|
|
1116
|
+
"kind": "section",
|
|
1117
|
+
"title": "Sticky chapters",
|
|
1118
|
+
"does": "A process or story in chapters: one large photograph holds still on the left (plain position sticky) while the chapters scroll past on the right; as each reaches the middle its photograph rises over the last from the bottom edge (from the top when scrolling back) out of a push-in, that chapter comes forward while the others step back, and a hairline beside the frame fills as you read; phones and pages without scripts show each photograph inline, reduced motion keeps the frame with hard cuts.",
|
|
1119
|
+
"reference": "Lowlight's pinned process (Opus55/build/template.html, .process CSS near line 401): copy that holds while a photograph changes beside it.",
|
|
1120
|
+
"variants": [],
|
|
1121
|
+
"packages": [
|
|
1122
|
+
"@gsap/react",
|
|
1123
|
+
"gsap"
|
|
1124
|
+
],
|
|
1125
|
+
"exports": [
|
|
1126
|
+
"StickyChapters"
|
|
1127
|
+
],
|
|
1128
|
+
"file": "sections/sticky-chapters.tsx",
|
|
1129
|
+
"files": [
|
|
1130
|
+
"kit/blocks.css",
|
|
1131
|
+
"kit/gsap.ts",
|
|
1132
|
+
"kit/images.ts",
|
|
1133
|
+
"sections/sticky-chapters.tsx"
|
|
1134
|
+
]
|
|
1135
|
+
},
|
|
1136
|
+
{
|
|
1137
|
+
"slug": "film-strip",
|
|
1138
|
+
"kind": "section",
|
|
1139
|
+
"title": "Film strip",
|
|
1140
|
+
"does": "A pinned reel between two rows of sprocket holes opens on the section's display line beside the first project in the gate; the scroll advances it one frame at a time, portrait frames high and landscape low, each seating at the gate as its photo settles out of a push-in while the title swaps through its mask and a hairline progress line fills; the last stop is the closing frame with the call to action, and on release the strip runs on to the left. Phones swipe a snap row between sprocket rows with titles under the frames; reduced motion and pages without scripts get the same still row.",
|
|
1141
|
+
"reference": "Lowlight's pinned reel (Opus55/build/template.html: reel CSS lines 312 to 372 with the sprocket rows and progress line, initReel near line 1320), turned from a 1:1 glide into frame-by-frame advances with a title mask.",
|
|
1142
|
+
"variants": [],
|
|
1143
|
+
"packages": [
|
|
1144
|
+
"@gsap/react",
|
|
1145
|
+
"gsap"
|
|
1146
|
+
],
|
|
1147
|
+
"exports": [
|
|
1148
|
+
"FilmStrip"
|
|
1149
|
+
],
|
|
1150
|
+
"file": "sections/film-strip.tsx",
|
|
1151
|
+
"files": [
|
|
1152
|
+
"kit/blocks.css",
|
|
1153
|
+
"kit/gsap.ts",
|
|
1154
|
+
"kit/images.ts",
|
|
1155
|
+
"sections/film-strip.tsx"
|
|
1156
|
+
]
|
|
1157
|
+
},
|
|
1158
|
+
{
|
|
1159
|
+
"slug": "hover-list",
|
|
1160
|
+
"kind": "section",
|
|
1161
|
+
"title": "Hover reveal list",
|
|
1162
|
+
"does": "A list of work at display size, each name with a quiet line of place and year; hovering a row shows its photograph in an upright frame that follows the pointer closely and leans with its speed while the other rows step back, row to row the photograph wipes in the way the pointer travels, and leaving the list folds the frame shut; keyboard focus and reduced motion stand the frame beside the row, and touch and phones show each photograph inline.",
|
|
1163
|
+
"reference": "Lowlight's still that follows the pointer over the \"What we make\" rows (Opus55/build/template.html, .make__preview CSS near line 394, initMake near line 1371), with Kinetic Studio's pointer-speed tilt (v4vision/projects/kinetic-studio/index.html, tilt near line 859).",
|
|
1164
|
+
"variants": [],
|
|
1165
|
+
"packages": [
|
|
1166
|
+
"@gsap/react",
|
|
1167
|
+
"gsap"
|
|
1168
|
+
],
|
|
1169
|
+
"exports": [
|
|
1170
|
+
"HoverList"
|
|
1171
|
+
],
|
|
1172
|
+
"file": "sections/hover-list.tsx",
|
|
1173
|
+
"files": [
|
|
1174
|
+
"kit/blocks.css",
|
|
1175
|
+
"kit/gsap.ts",
|
|
1176
|
+
"kit/images.ts",
|
|
1177
|
+
"sections/hover-list.tsx"
|
|
1178
|
+
]
|
|
1179
|
+
},
|
|
1180
|
+
{
|
|
1181
|
+
"slug": "split-pair",
|
|
1182
|
+
"kind": "section",
|
|
1183
|
+
"title": "Split pair",
|
|
1184
|
+
"does": "A pinned pair of tall photos that meet at a hard seam: the word stands whole in ink on the ground with the seam through it; the first photo rises in on the left, turning its half of the letters to the photo's own ink, and holds half and half; the second comes down on the right against it and the pair holds whole, the two photos running against each other at different speeds the whole time, and on release the halves leave at their own speeds so the word shears along the seam.",
|
|
1185
|
+
"reference": "Voyeur Verite's split-screen pair (\"The Symphony of Dance / Stand Up\", struq-assets/references/award-tier-2026-11/voyeur-verite-sheet.png, rows 3 to 5): two photos arriving from opposite directions, oversized serif words across both.",
|
|
1186
|
+
"variants": [],
|
|
1187
|
+
"packages": [
|
|
1188
|
+
"@gsap/react",
|
|
1189
|
+
"gsap"
|
|
1190
|
+
],
|
|
1191
|
+
"exports": [
|
|
1192
|
+
"SplitPair"
|
|
1193
|
+
],
|
|
1194
|
+
"file": "sections/split-pair.tsx",
|
|
1195
|
+
"files": [
|
|
1196
|
+
"kit/blocks.css",
|
|
1197
|
+
"kit/gsap.ts",
|
|
1198
|
+
"kit/images.ts",
|
|
1199
|
+
"kit/photo-read.ts",
|
|
1200
|
+
"sections/split-pair.tsx"
|
|
1201
|
+
]
|
|
1202
|
+
},
|
|
1203
|
+
{
|
|
1204
|
+
"slug": "fanned-cards",
|
|
1205
|
+
"kind": "section",
|
|
1206
|
+
"title": "Fanned cards",
|
|
1207
|
+
"does": "Services or cases as a hand of photographs played onto the table: a poster heading set on the diagonal, the hand rising into the frame and fanning open large in 3D between its two lines; it holds, then the hand is played from the back, each card flying along an arc toward the lens and turning as it goes, and laid down at its own scale into a spread (the lead card large in front, each card behind it smaller and partly under the one before, all crossing the first line), each title rising from its mask as its card lands; the spread holds, and on release the cards are picked up off the table at their own speeds. Phones get the hand as a still fan; reduced motion gets the spread. Cards lift slightly on hover.",
|
|
1208
|
+
"reference": "VANTA/LOOP, \"Your flexible creative department\": the offers fanned in 3D beside the heading (struq-assets/references/award-tier-2026-11/vanta-loop-sheet.png, row 4), with Kinetic Studio's staggered card rhythm and pointer tilt (v4vision/projects/kinetic-studio/index.html, capabilities near line 447, tilt near line 859).",
|
|
1209
|
+
"variants": [],
|
|
1210
|
+
"packages": [
|
|
1211
|
+
"@gsap/react",
|
|
1212
|
+
"gsap"
|
|
1213
|
+
],
|
|
1214
|
+
"exports": [
|
|
1215
|
+
"FannedCards"
|
|
1216
|
+
],
|
|
1217
|
+
"file": "sections/fanned-cards.tsx",
|
|
1218
|
+
"files": [
|
|
1219
|
+
"kit/blocks.css",
|
|
1220
|
+
"kit/gsap.ts",
|
|
1221
|
+
"kit/images.ts",
|
|
1222
|
+
"sections/fanned-cards.tsx"
|
|
1223
|
+
]
|
|
1224
|
+
},
|
|
1225
|
+
{
|
|
1226
|
+
"slug": "footer-reveal",
|
|
1227
|
+
"kind": "footer",
|
|
1228
|
+
"title": "Footer: revealed from under the page",
|
|
1229
|
+
"does": "The page's last section lifts away like a sheet and uncovers the footer already waiting beneath it (the name large at a light weight, a closing line, the contact address, a few plain links), scrubbed to the scroll and laid down again on the way back.",
|
|
1230
|
+
"reference": "Lowlight's footer (the page lifts away to uncover the light leak; Opus55/build/template.html), rebuilt with position sticky instead of a fixed layer and a margin.",
|
|
1231
|
+
"variants": [
|
|
1232
|
+
{
|
|
1233
|
+
"id": "lift",
|
|
1234
|
+
"title": "Optillen",
|
|
1235
|
+
"does": "The last section rises off the footer, which stands still beneath it; its leaving edge carries a hairline and a short soft shadow."
|
|
1236
|
+
},
|
|
1237
|
+
{
|
|
1238
|
+
"id": "fold",
|
|
1239
|
+
"title": "Omslaan",
|
|
1240
|
+
"does": "The last section tilts back a few degrees as it lifts, like a page turned up, and the footer brightens from under a shade as it is uncovered."
|
|
1241
|
+
},
|
|
1242
|
+
{
|
|
1243
|
+
"id": "iris",
|
|
1244
|
+
"title": "Opening",
|
|
1245
|
+
"does": "The footer is uncovered through an opening that grows from a thin slit at the bottom of the screen to full, the name rising inside it."
|
|
1246
|
+
}
|
|
1247
|
+
],
|
|
1248
|
+
"packages": [
|
|
1249
|
+
"@gsap/react",
|
|
1250
|
+
"gsap",
|
|
1251
|
+
"lenis"
|
|
1252
|
+
],
|
|
1253
|
+
"exports": [
|
|
1254
|
+
"FooterReveal"
|
|
1255
|
+
],
|
|
1256
|
+
"file": "footers/footer-reveal.tsx",
|
|
1257
|
+
"files": [
|
|
1258
|
+
"footers/footer-reveal.tsx",
|
|
1259
|
+
"kit/SmoothScroll.tsx",
|
|
1260
|
+
"kit/blocks.css",
|
|
1261
|
+
"kit/gsap.ts"
|
|
1262
|
+
]
|
|
1263
|
+
},
|
|
1264
|
+
{
|
|
1265
|
+
"slug": "footer-contact",
|
|
1266
|
+
"kind": "footer",
|
|
1267
|
+
"title": "Footer: contact",
|
|
1268
|
+
"does": "The page ends on the way to reach the studio: the mail address as a real link at display size (or a live clock, or a quiet three-column grid), the city's local time with an honest open marker computed from it, a phone line, the address and a few plain links, entering scrubbed to the scroll.",
|
|
1269
|
+
"reference": "Lowlight's contact footer and roll-host labels (Opus55/build/template.html), Kinetic Studio's footer mailto, and the slot-text roll from the FWA studio footers.",
|
|
1270
|
+
"variants": [
|
|
1271
|
+
{
|
|
1272
|
+
"id": "address",
|
|
1273
|
+
"title": "Adres",
|
|
1274
|
+
"does": "The mail address heads the footer as a fitted headline whose characters roll up into their slots from blank as you scroll in, then roll again from the pointer's side on hover; the details close it under a ruled line."
|
|
1275
|
+
},
|
|
1276
|
+
{
|
|
1277
|
+
"id": "clock",
|
|
1278
|
+
"title": "Klok",
|
|
1279
|
+
"does": "A live Rotterdam clock at display size is the centre, its colon breathing once a second; mail, phone, address and hours stand around it like a timetable."
|
|
1280
|
+
},
|
|
1281
|
+
{
|
|
1282
|
+
"id": "columns",
|
|
1283
|
+
"title": "Kolommen",
|
|
1284
|
+
"does": "A closing line at display size, then three columns (Contact, Studio, Volg ons) with links whose underline draws from the pointer's side."
|
|
1285
|
+
}
|
|
1286
|
+
],
|
|
1287
|
+
"packages": [
|
|
1288
|
+
"@gsap/react",
|
|
1289
|
+
"gsap"
|
|
1290
|
+
],
|
|
1291
|
+
"exports": [
|
|
1292
|
+
"FooterContact"
|
|
1293
|
+
],
|
|
1294
|
+
"file": "footers/footer-contact.tsx",
|
|
1295
|
+
"files": [
|
|
1296
|
+
"footers/footer-contact.tsx",
|
|
1297
|
+
"kit/blocks.css",
|
|
1298
|
+
"kit/gsap.ts"
|
|
1299
|
+
]
|
|
1300
|
+
}
|
|
1301
|
+
]
|
|
1302
|
+
}
|