@struq/skill 0.2.2 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (122) hide show
  1. package/README.md +23 -35
  2. package/package.json +3 -2
  3. package/skills/struq/SKILL.md +148 -212
  4. package/skills/struq/blocks/CATALOG.md +426 -0
  5. package/skills/struq/blocks/backgrounds/background-aurora.tsx +818 -0
  6. package/skills/struq/blocks/backgrounds/background-facets.tsx +1283 -0
  7. package/skills/struq/blocks/backgrounds/background-silk.tsx +906 -0
  8. package/skills/struq/blocks/catalog.json +1302 -0
  9. package/skills/struq/blocks/footers/footer-contact.tsx +789 -0
  10. package/skills/struq/blocks/footers/footer-reveal.tsx +313 -0
  11. package/skills/struq/blocks/headers/header-bar.tsx +652 -0
  12. package/skills/struq/blocks/headers/menu-curtain.tsx +790 -0
  13. package/skills/struq/blocks/heroes/hero-framed.tsx +627 -0
  14. package/skills/struq/blocks/heroes/hero-index.tsx +855 -0
  15. package/skills/struq/blocks/heroes/hero-poster.tsx +1086 -0
  16. package/skills/struq/blocks/heroes/hero-split.tsx +685 -0
  17. package/skills/struq/blocks/heroes/hero-still.tsx +862 -0
  18. package/skills/struq/blocks/kit/Cursor.tsx +117 -0
  19. package/skills/struq/blocks/kit/HeroCanvas.tsx +278 -0
  20. package/skills/struq/blocks/kit/HorizontalGallery.tsx +106 -0
  21. package/skills/struq/blocks/kit/MagneticButton.tsx +92 -0
  22. package/skills/struq/blocks/kit/MediaFrame.tsx +96 -0
  23. package/skills/struq/blocks/kit/PinnedZoom.tsx +89 -0
  24. package/skills/struq/blocks/kit/Reveal.tsx +64 -0
  25. package/skills/struq/blocks/kit/SmoothScroll.tsx +57 -0
  26. package/skills/struq/blocks/kit/SplitHeadline.tsx +68 -0
  27. package/skills/struq/blocks/kit/blocks.css +2102 -0
  28. package/skills/struq/blocks/kit/gsap.ts +21 -0
  29. package/skills/struq/blocks/kit/images.ts +17 -0
  30. package/skills/struq/blocks/kit/photo-read.ts +102 -0
  31. package/skills/struq/blocks/kit/scenes/contours.ts +161 -0
  32. package/skills/struq/blocks/kit/scenes/dots.ts +110 -0
  33. package/skills/struq/blocks/kit/scenes/ripple.ts +99 -0
  34. package/skills/struq/blocks/kit/scenes/types.ts +114 -0
  35. package/skills/struq/blocks/page-transitions/page-transition-gate.tsx +706 -0
  36. package/skills/struq/blocks/page-transitions/page-transition-slices.tsx +469 -0
  37. package/skills/struq/blocks/page-transitions/page-transition-stack.tsx +583 -0
  38. package/skills/struq/blocks/preloaders/preloader-gate.tsx +358 -0
  39. package/skills/struq/blocks/preloaders/preloader-slices-uncovered.ts +50 -0
  40. package/skills/struq/blocks/preloaders/preloader-slices.tsx +289 -0
  41. package/skills/struq/blocks/preloaders/preloader-stack.tsx +367 -0
  42. package/skills/struq/blocks/preloaders/preloader-wordmark.tsx +568 -0
  43. package/skills/struq/blocks/sections/about-studio.tsx +436 -0
  44. package/skills/struq/blocks/sections/approach.tsx +661 -0
  45. package/skills/struq/blocks/sections/contact-form.tsx +664 -0
  46. package/skills/struq/blocks/sections/cta-closing.tsx +763 -0
  47. package/skills/struq/blocks/sections/fanned-cards.tsx +547 -0
  48. package/skills/struq/blocks/sections/film-strip.tsx +385 -0
  49. package/skills/struq/blocks/sections/grid-assembly.tsx +616 -0
  50. package/skills/struq/blocks/sections/hover-list.tsx +467 -0
  51. package/skills/struq/blocks/sections/image-trail.tsx +432 -0
  52. package/skills/struq/blocks/sections/manifesto.tsx +691 -0
  53. package/skills/struq/blocks/sections/panel-accordion.tsx +380 -0
  54. package/skills/struq/blocks/sections/reveals.tsx +416 -0
  55. package/skills/struq/blocks/sections/split-pair.tsx +670 -0
  56. package/skills/struq/blocks/sections/sticky-chapters.tsx +256 -0
  57. package/skills/struq/blocks/sections/velocity-type.tsx +269 -0
  58. package/skills/struq/blocks/showpieces/fill-rows.tsx +74 -0
  59. package/skills/struq/blocks/showpieces/hero-opener.tsx +128 -0
  60. package/skills/struq/blocks/showpieces/image-to-fullbleed.tsx +89 -0
  61. package/skills/struq/blocks/showpieces/manifesto-scrub.tsx +48 -0
  62. package/skills/struq/blocks/showpieces/panel-wipe.tsx +89 -0
  63. package/skills/struq/blocks/showpieces/pixel-resolve.tsx +107 -0
  64. package/skills/struq/blocks/showpieces/project-stack.tsx +86 -0
  65. package/skills/struq/blocks/showpieces/scrub-connector.tsx +307 -0
  66. package/skills/struq/blocks/showpieces/wordmark-finale.tsx +105 -0
  67. package/skills/struq/blocks/transitions/zoom-through.tsx +613 -0
  68. package/skills/struq/canon/canon.json +627 -0
  69. package/skills/struq/cinematic/README.md +7 -18
  70. package/skills/struq/cinematic/examples/code/nextjs/app/components/LenisRoot.tsx +1 -1
  71. package/skills/struq/cinematic/examples/code/shared/styles.css +1 -1
  72. package/skills/struq/cinematic/examples/code/vite/src/LenisRoot.tsx +1 -1
  73. package/skills/struq/cinematic/references/01-core-mental-model.md +1 -1
  74. package/skills/struq/cinematic/references/02-vocabulary.md +1 -1
  75. package/skills/struq/cinematic/references/07-stack-integration.md +2 -2
  76. package/skills/struq/recipes/app/fonts.ts +12 -0
  77. package/skills/struq/recipes/app/globals.css +42 -0
  78. package/skills/struq/recipes/app/layout.tsx +30 -0
  79. package/skills/struq/references/craft.md +77 -0
  80. package/skills/struq/references/iconography.md +28 -230
  81. package/skills/struq/references/stack-targets.md +23 -74
  82. package/skills/struq/references/tells.md +52 -0
  83. package/skills/struq/references/triage.md +6 -7
  84. package/skills/struq/scripts/blocks.mjs +156 -0
  85. package/skills/struq/scripts/canon.mjs +134 -0
  86. package/skills/struq/scripts/check.mjs +513 -0
  87. package/skills/struq/scripts/images.mjs +360 -0
  88. package/skills/struq/scripts/log.mjs +75 -0
  89. package/skills/struq/scripts/packs.mjs +156 -0
  90. package/skills/struq/scripts/tokens.mjs +222 -0
  91. package/skills/struq/references/anti-patterns.md +0 -265
  92. package/skills/struq/references/baseline-prompt.md +0 -118
  93. package/skills/struq/references/brand.md +0 -143
  94. package/skills/struq/references/brief-router.md +0 -219
  95. package/skills/struq/references/composition.md +0 -191
  96. package/skills/struq/references/depth-parallax.md +0 -235
  97. package/skills/struq/references/direction.md +0 -188
  98. package/skills/struq/references/feel-layer.md +0 -107
  99. package/skills/struq/references/gsap-api.md +0 -293
  100. package/skills/struq/references/imagery.md +0 -144
  101. package/skills/struq/references/loaders.md +0 -287
  102. package/skills/struq/references/micro-interactions.md +0 -270
  103. package/skills/struq/references/mobile-composition.md +0 -70
  104. package/skills/struq/references/nav-header.md +0 -296
  105. package/skills/struq/references/page-architecture.md +0 -134
  106. package/skills/struq/references/page-entrances.md +0 -198
  107. package/skills/struq/references/performance.md +0 -235
  108. package/skills/struq/references/pinning-scrub.md +0 -341
  109. package/skills/struq/references/pitfalls.md +0 -290
  110. package/skills/struq/references/route-transitions.md +0 -281
  111. package/skills/struq/references/scaling.md +0 -151
  112. package/skills/struq/references/scroll-reveals.md +0 -280
  113. package/skills/struq/references/seo.md +0 -219
  114. package/skills/struq/references/setup.md +0 -397
  115. package/skills/struq/references/showcase.md +0 -87
  116. package/skills/struq/references/struq-imagery.md +0 -107
  117. package/skills/struq/references/svg-motion.md +0 -390
  118. package/skills/struq/references/transitions.md +0 -160
  119. package/skills/struq/references/typography.md +0 -720
  120. package/skills/struq/references/vibe-presets.md +0 -287
  121. package/skills/struq/references/webgl-r3f.md +0 -274
  122. package/skills/struq/references/webgl-scenes.md +0 -593
@@ -0,0 +1,627 @@
1
+ {
2
+ "source": {
3
+ "repo": "Struq lib/canon",
4
+ "ref": "staging",
5
+ "commit": "3680053"
6
+ },
7
+ "palettes": [
8
+ {
9
+ "id": "graphite-ivory",
10
+ "mood": "editorial premium",
11
+ "colors": {
12
+ "background": "#F3F0E8",
13
+ "surface": "#E8E1D5",
14
+ "text": "#272826",
15
+ "accent": "#995029",
16
+ "accentAlt": "#2B4A56"
17
+ }
18
+ },
19
+ {
20
+ "id": "midnight-brass",
21
+ "mood": "executive authority",
22
+ "colors": {
23
+ "background": "#101218",
24
+ "surface": "#191C24",
25
+ "text": "#F7F3EA",
26
+ "accent": "#C69B5D",
27
+ "accentAlt": "#8E9AA8"
28
+ }
29
+ },
30
+ {
31
+ "id": "stone-forest",
32
+ "mood": "quiet confidence",
33
+ "colors": {
34
+ "background": "#EEF0EA",
35
+ "surface": "#D8DDD3",
36
+ "text": "#162017",
37
+ "accent": "#2B5C45",
38
+ "accentAlt": "#7B6A58"
39
+ }
40
+ },
41
+ {
42
+ "id": "terracotta-sand",
43
+ "mood": "warm earthy premium",
44
+ "colors": {
45
+ "background": "#F9F6F0",
46
+ "surface": "#EFE9DF",
47
+ "text": "#402218",
48
+ "accent": "#A74E2C",
49
+ "accentAlt": "#5C6B62"
50
+ }
51
+ },
52
+ {
53
+ "id": "ocean-breeze",
54
+ "mood": "clean professional depth",
55
+ "autoPick": false,
56
+ "colors": {
57
+ "background": "#EDF2F4",
58
+ "surface": "#D9E2EC",
59
+ "text": "#0D2740",
60
+ "accent": "#0A6C74",
61
+ "accentAlt": "#486581"
62
+ }
63
+ },
64
+ {
65
+ "id": "frontier-aperture-technical-dark",
66
+ "mood": "high-velocity technical dark",
67
+ "colors": {
68
+ "background": "oklch(0.16 0.012 248)",
69
+ "surface": "oklch(0.205 0.014 248)",
70
+ "text": "oklch(0.96 0.004 248)",
71
+ "accent": "oklch(0.87 0.21 128)",
72
+ "accentAlt": "oklch(0.30 0.018 248)"
73
+ }
74
+ },
75
+ {
76
+ "id": "frontier-ferro-forge-dark",
77
+ "mood": "cinematic forge dark",
78
+ "colors": {
79
+ "background": "oklch(0.15 0.012 55)",
80
+ "surface": "oklch(0.19 0.014 55)",
81
+ "text": "oklch(0.95 0.008 75)",
82
+ "accent": "oklch(0.67 0.19 45)",
83
+ "accentAlt": "oklch(0.29 0.018 55)"
84
+ }
85
+ },
86
+ {
87
+ "id": "frontier-field-cream-madder",
88
+ "mood": "restrained editorial paper",
89
+ "colors": {
90
+ "background": "oklch(0.965 0.012 85)",
91
+ "surface": "oklch(0.94 0.014 85)",
92
+ "text": "oklch(0.25 0.02 60)",
93
+ "accent": "oklch(0.49 0.13 30)",
94
+ "accentAlt": "oklch(0.86 0.02 85)"
95
+ }
96
+ },
97
+ {
98
+ "id": "frontier-halo-saturated-blush",
99
+ "mood": "bold kinetic beauty",
100
+ "colors": {
101
+ "background": "oklch(0.965 0.018 38)",
102
+ "surface": "oklch(0.99 0.01 38)",
103
+ "text": "oklch(0.24 0.04 20)",
104
+ "accent": "oklch(0.565 0.21 22)",
105
+ "accentAlt": "oklch(0.22 0.04 18)"
106
+ }
107
+ },
108
+ {
109
+ "id": "frontier-hollow-acid-tide",
110
+ "mood": "atmospheric near-black",
111
+ "autoPick": false,
112
+ "colors": {
113
+ "background": "oklch(0.13 0.012 230)",
114
+ "surface": "oklch(0.17 0.014 230)",
115
+ "text": "oklch(0.93 0.01 210)",
116
+ "accent": "oklch(0.82 0.16 195)",
117
+ "accentAlt": "oklch(0.28 0.018 230)"
118
+ }
119
+ },
120
+ {
121
+ "id": "frontier-kinetic-lime-cobalt",
122
+ "mood": "aggressive athletic duotone",
123
+ "colors": {
124
+ "background": "oklch(0.18 0.005 250)",
125
+ "surface": "oklch(0.22 0.006 250)",
126
+ "text": "oklch(0.96 0.008 95)",
127
+ "accent": "oklch(0.86 0.22 130)",
128
+ "accentAlt": "oklch(0.55 0.20 260)"
129
+ }
130
+ },
131
+ {
132
+ "id": "frontier-lumen-firelit-flour",
133
+ "mood": "warm firelit editorial",
134
+ "colors": {
135
+ "background": "oklch(0.972 0.012 75)",
136
+ "surface": "oklch(0.995 0.006 75)",
137
+ "text": "oklch(0.24 0.02 55)",
138
+ "accent": "oklch(0.555 0.15 48)",
139
+ "accentAlt": "oklch(0.19 0.02 45)"
140
+ }
141
+ },
142
+ {
143
+ "id": "frontier-marrow-bone-blood-orange",
144
+ "mood": "studio theatrical warm bone",
145
+ "colors": {
146
+ "background": "oklch(0.955 0.01 85)",
147
+ "surface": "oklch(0.975 0.008 85)",
148
+ "text": "oklch(0.17 0.008 85)",
149
+ "accent": "oklch(0.555 0.19 35)",
150
+ "accentAlt": "oklch(0.16 0.01 85)"
151
+ }
152
+ },
153
+ {
154
+ "id": "frontier-meridian-signal-graphite",
155
+ "mood": "cool operational clarity",
156
+ "colors": {
157
+ "background": "oklch(0.965 0.005 250)",
158
+ "surface": "oklch(0.995 0.001 250)",
159
+ "text": "oklch(0.22 0.015 255)",
160
+ "accent": "oklch(0.525 0.138 152)",
161
+ "accentAlt": "oklch(0.2 0.015 255)"
162
+ }
163
+ },
164
+ {
165
+ "id": "frontier-mizu-greige-bronze",
166
+ "mood": "slow ceramic restraint",
167
+ "colors": {
168
+ "background": "oklch(0.945 0.006 80)",
169
+ "surface": "oklch(0.92 0.008 80)",
170
+ "text": "oklch(0.27 0.012 80)",
171
+ "accent": "oklch(0.51 0.07 70)",
172
+ "accentAlt": "oklch(0.85 0.012 80)"
173
+ }
174
+ },
175
+ {
176
+ "id": "frontier-numen-paper-cobalt",
177
+ "mood": "confident portfolio editorial",
178
+ "autoPick": false,
179
+ "colors": {
180
+ "background": "oklch(0.949 0.012 92)",
181
+ "surface": "oklch(0.986 0.006 92)",
182
+ "text": "oklch(0.205 0.014 70)",
183
+ "accent": "oklch(0.50 0.20 250)",
184
+ "accentAlt": "oklch(0.64 0.17 250)"
185
+ }
186
+ },
187
+ {
188
+ "id": "frontier-objet-gallery-brass",
189
+ "mood": "dark editorial commerce",
190
+ "colors": {
191
+ "background": "oklch(0.19 0.008 62)",
192
+ "surface": "oklch(0.235 0.009 62)",
193
+ "text": "oklch(0.93 0.012 82)",
194
+ "accent": "oklch(0.74 0.11 74)",
195
+ "accentAlt": "oklch(0.34 0.011 62)"
196
+ }
197
+ },
198
+ {
199
+ "id": "frontier-olea-flour-terracotta",
200
+ "mood": "wood-fire neighborhood warmth",
201
+ "colors": {
202
+ "background": "oklch(0.96 0.014 75)",
203
+ "surface": "oklch(0.985 0.01 80)",
204
+ "text": "oklch(0.28 0.03 55)",
205
+ "accent": "oklch(0.55 0.16 40)",
206
+ "accentAlt": "oklch(0.27 0.03 50)"
207
+ }
208
+ },
209
+ {
210
+ "id": "frontier-otterbrook-river-amber",
211
+ "mood": "deep charity data story",
212
+ "colors": {
213
+ "background": "oklch(0.23 0.045 195)",
214
+ "surface": "oklch(0.28 0.05 193)",
215
+ "text": "oklch(0.95 0.018 90)",
216
+ "accent": "oklch(0.78 0.14 75)",
217
+ "accentAlt": "oklch(0.41 0.05 189)"
218
+ }
219
+ },
220
+ {
221
+ "id": "frontier-relay-brutalist-blue",
222
+ "mood": "brutalist conference energy",
223
+ "autoPick": false,
224
+ "colors": {
225
+ "background": "oklch(0.96 0.005 110)",
226
+ "surface": "oklch(1 0 0)",
227
+ "text": "oklch(0.2 0.012 110)",
228
+ "accent": "oklch(0.47 0.25 262)",
229
+ "accentAlt": "oklch(0.22 0.01 110)"
230
+ }
231
+ },
232
+ {
233
+ "id": "frontier-seve-bone-oxblood",
234
+ "mood": "restrained fashion editorial",
235
+ "colors": {
236
+ "background": "oklch(0.965 0.008 70)",
237
+ "surface": "oklch(0.995 0.004 70)",
238
+ "text": "oklch(0.18 0.012 40)",
239
+ "accent": "oklch(0.45 0.16 28)",
240
+ "accentAlt": "oklch(0.16 0.012 40)"
241
+ }
242
+ },
243
+ {
244
+ "id": "frontier-solene-coastal-coral",
245
+ "mood": "sunlit coastal hospitality",
246
+ "autoPick": false,
247
+ "colors": {
248
+ "background": "oklch(0.96 0.012 190)",
249
+ "surface": "oklch(0.99 0.006 190)",
250
+ "text": "oklch(0.28 0.045 200)",
251
+ "accent": "oklch(0.70 0.16 25)",
252
+ "accentAlt": "oklch(0.30 0.05 195)"
253
+ }
254
+ },
255
+ {
256
+ "id": "frontier-stillwater-oat-sage",
257
+ "mood": "large-radius calming care",
258
+ "colors": {
259
+ "background": "oklch(0.96 0.014 110)",
260
+ "surface": "oklch(0.99 0.008 110)",
261
+ "text": "oklch(0.32 0.03 150)",
262
+ "accent": "oklch(0.545 0.1 50)",
263
+ "accentAlt": "oklch(0.3 0.03 150)"
264
+ }
265
+ },
266
+ {
267
+ "id": "frontier-substrate-industrial-ice",
268
+ "mood": "industrial material dark",
269
+ "autoPick": false,
270
+ "colors": {
271
+ "background": "oklch(0.17 0.009 64)",
272
+ "surface": "oklch(0.215 0.011 64)",
273
+ "text": "oklch(0.95 0.005 72)",
274
+ "accent": "oklch(0.78 0.12 235)",
275
+ "accentAlt": "oklch(0.31 0.015 64)"
276
+ }
277
+ },
278
+ {
279
+ "id": "frontier-tessellate-mint-graphite",
280
+ "mood": "technical turquoise dark",
281
+ "autoPick": false,
282
+ "colors": {
283
+ "background": "oklch(0.16 0.012 190)",
284
+ "surface": "oklch(0.21 0.016 190)",
285
+ "text": "oklch(0.97 0.01 185)",
286
+ "accent": "oklch(0.82 0.15 178)",
287
+ "accentAlt": "oklch(0.31 0.022 190)"
288
+ }
289
+ },
290
+ {
291
+ "id": "frontier-thuispost-oat-petrol",
292
+ "mood": "warm human care",
293
+ "colors": {
294
+ "background": "oklch(0.975 0.012 75)",
295
+ "surface": "oklch(0.955 0.016 72)",
296
+ "text": "oklch(0.29 0.028 60)",
297
+ "accent": "oklch(0.55 0.15 32)",
298
+ "accentAlt": "oklch(0.78 0.13 60)"
299
+ }
300
+ },
301
+ {
302
+ "id": "frontier-velar-graphite-scarlet",
303
+ "mood": "mechanical performance dark",
304
+ "colors": {
305
+ "background": "oklch(0.16 0.005 40)",
306
+ "surface": "oklch(0.205 0.006 40)",
307
+ "text": "oklch(0.96 0.004 60)",
308
+ "accent": "oklch(0.63 0.225 25)",
309
+ "accentAlt": "oklch(0.305 0.008 40)"
310
+ }
311
+ },
312
+ {
313
+ "id": "frontier-velden-linen-forest",
314
+ "mood": "credentialed editorial care",
315
+ "colors": {
316
+ "background": "oklch(0.967 0.012 95)",
317
+ "surface": "oklch(0.985 0.008 95)",
318
+ "text": "oklch(0.30 0.025 150)",
319
+ "accent": "oklch(0.55 0.12 45)",
320
+ "accentAlt": "oklch(0.27 0.03 152)"
321
+ }
322
+ },
323
+ {
324
+ "id": "frontier-voss-limestone-blueprint",
325
+ "mood": "structural architectural restraint",
326
+ "autoPick": false,
327
+ "colors": {
328
+ "background": "oklch(0.955 0.003 250)",
329
+ "surface": "oklch(0.99 0.002 250)",
330
+ "text": "oklch(0.23 0.008 255)",
331
+ "accent": "oklch(0.53 0.13 245)",
332
+ "accentAlt": "oklch(0.21 0.012 255)"
333
+ }
334
+ },
335
+ {
336
+ "id": "field-deep-red",
337
+ "mood": "cinematic deep red field",
338
+ "colors": {
339
+ "background": "oklch(0.955 0.012 80)",
340
+ "surface": "oklch(0.925 0.016 78)",
341
+ "text": "oklch(0.17 0.012 30)",
342
+ "accent": "oklch(0.5 0.2 27)",
343
+ "accentAlt": "oklch(0.32 0.11 25)"
344
+ },
345
+ "roles": {
346
+ "field": "oklch(0.44 0.18 27)",
347
+ "fieldInk": "oklch(0.955 0.012 80)",
348
+ "inverse": "oklch(0.17 0.012 30)",
349
+ "inverseInk": "oklch(0.955 0.012 80)"
350
+ }
351
+ },
352
+ {
353
+ "id": "field-ink-green",
354
+ "mood": "ink green field, botanical and literary",
355
+ "colors": {
356
+ "background": "oklch(0.96 0.012 100)",
357
+ "surface": "oklch(0.93 0.016 105)",
358
+ "text": "oklch(0.22 0.03 160)",
359
+ "accent": "oklch(0.42 0.08 160)",
360
+ "accentAlt": "oklch(0.68 0.12 80)"
361
+ },
362
+ "roles": {
363
+ "field": "oklch(0.3 0.055 162)",
364
+ "fieldInk": "oklch(0.95 0.015 95)",
365
+ "inverse": "oklch(0.22 0.03 160)",
366
+ "inverseInk": "oklch(0.96 0.012 100)"
367
+ }
368
+ },
369
+ {
370
+ "id": "field-ultramarine",
371
+ "mood": "deliberate ultramarine field for water and maritime themes",
372
+ "autoPick": false,
373
+ "colors": {
374
+ "background": "oklch(0.965 0.008 85)",
375
+ "surface": "oklch(0.935 0.012 85)",
376
+ "text": "oklch(0.2 0.03 260)",
377
+ "accent": "oklch(0.42 0.2 264)",
378
+ "accentAlt": "oklch(0.78 0.12 80)"
379
+ },
380
+ "roles": {
381
+ "field": "oklch(0.38 0.19 264)",
382
+ "fieldInk": "oklch(0.965 0.008 85)",
383
+ "inverse": "oklch(0.2 0.03 260)",
384
+ "inverseInk": "oklch(0.965 0.008 85)"
385
+ }
386
+ },
387
+ {
388
+ "id": "field-saturated-ochre",
389
+ "mood": "saturated ochre field, warm and graphic",
390
+ "colors": {
391
+ "background": "oklch(0.965 0.014 85)",
392
+ "surface": "oklch(0.935 0.02 82)",
393
+ "text": "oklch(0.2 0.02 60)",
394
+ "accent": "oklch(0.525 0.11 75)",
395
+ "accentAlt": "oklch(0.3 0.05 40)"
396
+ },
397
+ "roles": {
398
+ "field": "oklch(0.76 0.15 78)",
399
+ "fieldInk": "oklch(0.2 0.02 60)",
400
+ "inverse": "oklch(0.2 0.02 60)",
401
+ "inverseInk": "oklch(0.965 0.014 85)"
402
+ }
403
+ }
404
+ ],
405
+ "pairings": [
406
+ {
407
+ "id": "editorial-sans-precision",
408
+ "name": "Editorial Sans Precision",
409
+ "mood": "quiet architectural",
410
+ "notes": "Quiet architectural sans display with readable neutral body copy and a restrained editorial accent.",
411
+ "display": "\"Sora\", ui-sans-serif, system-ui, sans-serif",
412
+ "body": "\"Public Sans\", ui-sans-serif, system-ui, sans-serif",
413
+ "accentItalic": "\"Newsreader\", Georgia, serif",
414
+ "displayScale": {
415
+ "size": "clamp(3rem, 12vw, 16rem)",
416
+ "weight": 300,
417
+ "leading": 0.95,
418
+ "tracking": "-0.03em"
419
+ }
420
+ },
421
+ {
422
+ "id": "grotesk-workhorse",
423
+ "name": "Grotesk Workhorse",
424
+ "mood": "clean product",
425
+ "notes": "A characterful grotesk display over a dependable sans body, versatile for product and SaaS surfaces.",
426
+ "display": "\"Schibsted Grotesk\", ui-sans-serif, system-ui, sans-serif",
427
+ "body": "\"Hanken Grotesk\", ui-sans-serif, system-ui, sans-serif",
428
+ "accentItalic": "\"Instrument Serif\", Georgia, serif",
429
+ "displayScale": {
430
+ "size": "clamp(3rem, 12vw, 16rem)",
431
+ "weight": 400,
432
+ "leading": 0.92,
433
+ "tracking": "-0.03em"
434
+ }
435
+ },
436
+ {
437
+ "id": "serif-editorial",
438
+ "name": "Serif Editorial",
439
+ "mood": "luxury restraint",
440
+ "notes": "Light serif display over a soft geometric sans body: premium, quiet, fashion-led interfaces.",
441
+ "display": "\"Fraunces\", Georgia, serif",
442
+ "body": "\"Urbanist\", ui-sans-serif, system-ui, sans-serif",
443
+ "accentItalic": "\"Fraunces\", Georgia, serif",
444
+ "displayScale": {
445
+ "size": "clamp(3rem, 12vw, 17rem)",
446
+ "weight": 300,
447
+ "leading": 0.92,
448
+ "tracking": "-0.02em"
449
+ }
450
+ },
451
+ {
452
+ "id": "display-drama",
453
+ "name": "Display Drama",
454
+ "mood": "expressive campaign",
455
+ "notes": "Larger jumps and tighter display leading for expressive landing and campaign pages.",
456
+ "display": "\"Syne\", ui-sans-serif, system-ui, sans-serif",
457
+ "body": "\"Hanken Grotesk\", ui-sans-serif, system-ui, sans-serif",
458
+ "accentItalic": "\"Instrument Serif\", Georgia, serif",
459
+ "displayScale": {
460
+ "size": "clamp(3rem, 12vw, 16rem)",
461
+ "weight": 700,
462
+ "leading": 0.9,
463
+ "tracking": "-0.02em"
464
+ },
465
+ "autoPick": false
466
+ },
467
+ {
468
+ "id": "newsreader-classic",
469
+ "name": "Newsreader Classic",
470
+ "mood": "editorial warmth",
471
+ "notes": "A warm reading serif paired with a clean sans, for long-form and editorial directions.",
472
+ "display": "\"Newsreader\", Georgia, serif",
473
+ "body": "\"Public Sans\", ui-sans-serif, system-ui, sans-serif",
474
+ "accentItalic": "\"Newsreader\", Georgia, serif",
475
+ "displayScale": {
476
+ "size": "clamp(3rem, 11vw, 15rem)",
477
+ "weight": 300,
478
+ "leading": 0.95,
479
+ "tracking": "-0.02em"
480
+ }
481
+ },
482
+ {
483
+ "id": "geometric-modern",
484
+ "name": "Geometric Modern",
485
+ "mood": "confident modern",
486
+ "notes": "A soft geometric display over an even, humanist body: confident, contemporary product brands.",
487
+ "display": "\"Urbanist\", ui-sans-serif, system-ui, sans-serif",
488
+ "body": "\"Figtree\", ui-sans-serif, system-ui, sans-serif",
489
+ "accentItalic": "\"Instrument Serif\", Georgia, serif",
490
+ "displayScale": {
491
+ "size": "clamp(3.5rem, 14vw, 20rem)",
492
+ "weight": 300,
493
+ "leading": 0.92,
494
+ "tracking": "-0.035em"
495
+ }
496
+ },
497
+ {
498
+ "id": "condensed-poster",
499
+ "name": "Condensed Poster",
500
+ "mood": "loud poster campaign",
501
+ "notes": "A heavy condensed grotesk for display lines at 12 to 20vw over a plain humanist body: the poster scale of a film or campaign site.",
502
+ "display": "\"Big Shoulders Display\", ui-sans-serif, system-ui, sans-serif",
503
+ "body": "\"Figtree\", ui-sans-serif, system-ui, sans-serif",
504
+ "accentItalic": "\"Instrument Serif\", Georgia, serif",
505
+ "displayScale": {
506
+ "size": "clamp(4rem, 16vw, 22rem)",
507
+ "weight": 800,
508
+ "leading": 0.82,
509
+ "tracking": "-0.01em"
510
+ }
511
+ },
512
+ {
513
+ "id": "fashion-contrast",
514
+ "name": "Fashion Contrast",
515
+ "mood": "high-contrast fashion editorial",
516
+ "notes": "A high-contrast display serif with hairline strokes and a true italic, over a soft geometric sans: fashion, beauty and editorial luxury.",
517
+ "display": "\"Bodoni Moda\", Georgia, serif",
518
+ "body": "\"Urbanist\", ui-sans-serif, system-ui, sans-serif",
519
+ "accentItalic": "\"Bodoni Moda\", Georgia, serif",
520
+ "displayScale": {
521
+ "size": "clamp(3.5rem, 13vw, 18rem)",
522
+ "weight": 400,
523
+ "leading": 0.9,
524
+ "tracking": "-0.02em"
525
+ }
526
+ },
527
+ {
528
+ "id": "wide-agency",
529
+ "name": "Wide Agency",
530
+ "mood": "wide confident agency",
531
+ "notes": "A wide geometric grotesk that fills the line at display size, over a neutral reading sans: creative agencies and brand studios.",
532
+ "display": "\"Unbounded\", ui-sans-serif, system-ui, sans-serif",
533
+ "body": "\"Public Sans\", ui-sans-serif, system-ui, sans-serif",
534
+ "accentItalic": "\"Instrument Serif\", Georgia, serif",
535
+ "displayScale": {
536
+ "size": "clamp(2.75rem, 11vw, 14rem)",
537
+ "weight": 400,
538
+ "leading": 0.95,
539
+ "tracking": "-0.03em"
540
+ }
541
+ },
542
+ {
543
+ "id": "italic-accent",
544
+ "name": "Italic Accent",
545
+ "mood": "soft geometric with a serif italic",
546
+ "notes": "Light Urbanist display with one word set in a true serif italic, over Hanken Grotesk: the soft geometric against refined serif contrast.",
547
+ "display": "\"Urbanist\", ui-sans-serif, system-ui, sans-serif",
548
+ "body": "\"Hanken Grotesk\", ui-sans-serif, system-ui, sans-serif",
549
+ "accentItalic": "\"Instrument Serif\", Georgia, serif",
550
+ "displayScale": {
551
+ "size": "clamp(3.5rem, 14vw, 20rem)",
552
+ "weight": 300,
553
+ "leading": 0.92,
554
+ "tracking": "-0.035em"
555
+ }
556
+ }
557
+ ],
558
+ "fontWeights": {
559
+ "Sora": [
560
+ 100,
561
+ 800
562
+ ],
563
+ "Public Sans": [
564
+ 100,
565
+ 900
566
+ ],
567
+ "Newsreader": [
568
+ 200,
569
+ 800
570
+ ],
571
+ "Schibsted Grotesk": [
572
+ 400,
573
+ 900
574
+ ],
575
+ "Hanken Grotesk": [
576
+ 100,
577
+ 900
578
+ ],
579
+ "Fraunces": [
580
+ 100,
581
+ 900
582
+ ],
583
+ "Urbanist": [
584
+ 100,
585
+ 900
586
+ ],
587
+ "Syne": [
588
+ 400,
589
+ 800
590
+ ],
591
+ "Figtree": [
592
+ 300,
593
+ 900
594
+ ],
595
+ "Big Shoulders Display": [
596
+ 100,
597
+ 900
598
+ ],
599
+ "Bodoni Moda": [
600
+ 400,
601
+ 900
602
+ ],
603
+ "Unbounded": [
604
+ 200,
605
+ 900
606
+ ],
607
+ "Instrument Serif": [
608
+ 400,
609
+ 400
610
+ ]
611
+ },
612
+ "fontProviders": {
613
+ "Big Shoulders Display": "google",
614
+ "Bodoni Moda": "google",
615
+ "Figtree": "google",
616
+ "Fraunces": "google",
617
+ "Hanken Grotesk": "google",
618
+ "Instrument Serif": "google",
619
+ "Newsreader": "google",
620
+ "Public Sans": "google",
621
+ "Schibsted Grotesk": "google",
622
+ "Sora": "google",
623
+ "Syne": "google",
624
+ "Unbounded": "google",
625
+ "Urbanist": "google"
626
+ }
627
+ }
@@ -14,30 +14,19 @@ Enter directed mode only when at least one of these is true:
14
14
 
15
15
  If none of these is true, stay in the normal Struq flow at [`../SKILL.md`](../SKILL.md). A marketing site with type, palette, Lenis plus GSAP reveals, a pinned showpiece or a route transition does not need directed mode, and the ceremony below would slow it down.
16
16
 
17
- A page that only has a decorative WebGL hero (one scene, no chapters) also stays in the normal flow. Use [`../references/webgl-r3f.md`](../references/webgl-r3f.md) and [`../references/webgl-scenes.md`](../references/webgl-scenes.md) for that.
17
+ A page that only has a decorative WebGL hero (one scene, no chapters) also stays in the normal flow: use a background block (`blocks/CATALOG.md`, Backgrounds).
18
18
 
19
- Directed mode extends the main skill, it does not replace it:
19
+ Directed mode extends the main skill, it does not replace it. The direction (palette, pairing, pack), the tell list, the craft lessons and the check are the main skill's ([`../SKILL.md`](../SKILL.md), [`../references/craft.md`](../references/craft.md), [`../references/tells.md`](../references/tells.md)). This folder adds what those do not cover: experience state, property ownership, chapters, camera blocking, semantic timelines, handoff contracts, tuning and audit criteria.
20
20
 
21
- | Concern | Where it is decided |
22
- |---|---|
23
- | Type system | [`../references/typography.md`](../references/typography.md) |
24
- | Palette and mood | [`../references/vibe-presets.md`](../references/vibe-presets.md) |
25
- | Single clock (Lenis driven by `gsap.ticker`, R3F driven from it) | [`../references/setup.md`](../references/setup.md) and [`../references/webgl-r3f.md`](../references/webgl-r3f.md) |
26
- | Drei helpers, postprocessing, interactive scenes | [`../references/webgl-scenes.md`](../references/webgl-scenes.md) |
27
- | What awards-level work looks like | [`../references/showcase.md`](../references/showcase.md) |
28
- | What to avoid | [`../references/anti-patterns.md`](../references/anti-patterns.md) |
29
-
30
- This folder adds what those files do not cover: experience state, property ownership, chapters, camera blocking, semantic timelines, handoff contracts, tuning and audit criteria.
31
-
32
- **Order of work.** `/struq direct` first runs [`../references/direction.md`](../references/direction.md) phases 0 to 3 (Intake, Brand, Concept, System) into `STRUQ.md`, with `Mode: directed`. Only then do the phases below start, and their lean outputs are appended to the same `STRUQ.md` under a `## DIRECTION` section (see Project artifacts). The direction.md gate still applies: one "Veto anything?" message, after the DIRECTION section is written and before code.
21
+ **Order of work.** `/struq direct` first sets the direction and stops once for approval as the main skill does, with `Mode: directed` in `STRUQ.md`. Then the phases below start, and their lean outputs are appended to the same `STRUQ.md` under a `## DIRECTION` section (see Project artifacts).
33
22
 
34
23
  ## Stack rules inherited from the main skill
35
24
 
36
25
  Three rules from the main skill are binding in directed mode. Nothing in this folder overrides them.
37
26
 
38
27
  1. **One clock.** Lenis is created with `autoRaf: false` and advanced from `gsap.ticker`. ScrollTrigger reads from Lenis. The R3F canvas is mounted with `frameloop="never"` and advanced from the same ticker (a reactive-only scene with no ambient animation may use `frameloop="demand"` with `invalidate()`, never the default `always`). No other `requestAnimationFrame` loop runs. Scroll progress, elapsed time and pointer input are separate signals, not separate clocks.
39
- 2. **GSAP owns scroll.** Every scroll-linked behavior (pinned stage, scrubbed chapter timelines, activation, velocity and direction signals) is GSAP and ScrollTrigger. Motion never reads scroll progress for the narrative, and `lenis.scrollTo()` is the only scroll command path. High-frequency pointer work on DOM elements runs on the same ticker through `gsap.quickTo`, not through a Motion spring loop. Lenis lerp and scrub smoothing are paired as in [`../references/feel-layer.md`](../references/feel-layer.md).
40
- 3. **The GSAP vs Motion split is the one in [`../SKILL.md`](../SKILL.md) (GSAP vs Motion: the decision rule).** That table decides who animates menus, overlays, hover and press; this folder does not restate it. If a Motion component takes part in a GSAP sequence, one library owns the outer wrapper and the other owns an inner element. Never animate the same transform from both.
28
+ 2. **GSAP owns scroll.** Every scroll-linked behavior (pinned stage, scrubbed chapter timelines, activation, velocity and direction signals) is GSAP and ScrollTrigger. Motion never reads scroll progress for the narrative, and `lenis.scrollTo()` is the only scroll command path. High-frequency pointer work on DOM elements runs on the same ticker through `gsap.quickTo`, not through a Motion spring loop.
29
+ 3. **GSAP and Motion never share a transform.** If a Motion component takes part in a GSAP sequence, one library owns the outer wrapper and the other owns an inner element. Never animate the same transform from both.
41
30
 
42
31
  ## Principles
43
32
 
@@ -82,7 +71,7 @@ Do not start with a library checklist. Start with the experience, then assign li
82
71
 
83
72
  Write a one-paragraph **experience thesis** containing what the viewer is doing, what the visual world is doing, how the emotional intensity changes, what makes the experience continuous, and what the final resolution should feel like.
84
73
 
85
- Then define a compact **experience contract**: persistent stage strategy, chapter count and purpose, primary transition language, input ownership, camera character, typography behavior (decided with [`../references/typography.md`](../references/typography.md)), performance class, reduced-motion strategy and prohibited generic patterns.
74
+ Then define a compact **experience contract**: persistent stage strategy, chapter count and purpose, primary transition language, input ownership, camera character, typography behavior (the pairing's faces and display weight), performance class, reduced-motion strategy and prohibited generic patterns.
86
75
 
87
76
  ### Phase 2: Map chapters
88
77
 
@@ -223,7 +212,7 @@ Use these defaults unless the project requires another allocation.
223
212
  | Observer | Gesture normalization for wheel, touch, pointer and intent-driven state changes. |
224
213
  | CustomEase, CustomWiggle, CustomBounce | Project-specific motion character where standard eases are not enough. |
225
214
 
226
- Do not let GSAP and Motion control the same property on the same element at the same time. Drei helpers, postprocessing and interactive scene patterns are covered in [`../references/webgl-scenes.md`](../references/webgl-scenes.md). Integration detail is in [`references/07-stack-integration.md`](references/07-stack-integration.md).
215
+ Do not let GSAP and Motion control the same property on the same element at the same time. Integration detail is in [`references/07-stack-integration.md`](references/07-stack-integration.md).
227
216
 
228
217
  ## Response behavior
229
218