@struq/skill 0.5.2 → 0.5.3
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 +27 -27
- package/package.json +2 -2
- package/skills/struq/SKILL.md +168 -165
- package/skills/struq/blocks/CATALOG.md +49 -46
- package/skills/struq/blocks/backgrounds/background-aurora.tsx +2 -1
- package/skills/struq/blocks/backgrounds/background-facets.tsx +5 -3
- package/skills/struq/blocks/backgrounds/background-silk.tsx +6 -2
- package/skills/struq/blocks/catalog.json +50 -5
- package/skills/struq/blocks/film.json +11 -7
- package/skills/struq/blocks/footers/footer-contact.tsx +8 -78
- package/skills/struq/blocks/headers/header-bar.tsx +144 -29
- package/skills/struq/blocks/headers/menu-curtain.tsx +36 -19
- package/skills/struq/blocks/heroes/hero-poster.tsx +36 -10
- package/skills/struq/blocks/kit/HeroCanvas.tsx +6 -2
- package/skills/struq/blocks/kit/SplitHeadline.tsx +2 -1
- package/skills/struq/blocks/kit/accent.ts +29 -3
- package/skills/struq/blocks/kit/blocks.css +530 -6
- package/skills/struq/blocks/kit/feel.ts +183 -0
- package/skills/struq/blocks/kit/gsap.ts +9 -6
- package/skills/struq/blocks/kit/middle/PlaceHours.tsx +254 -0
- package/skills/struq/blocks/kit/middle/ProcessStrip.tsx +428 -0
- package/skills/struq/blocks/kit/middle/ServicesList.tsx +496 -0
- package/skills/struq/blocks/kit/middle/entrance.ts +98 -0
- package/skills/struq/blocks/kit/middle/hours.ts +154 -0
- package/skills/struq/blocks/kit/middle/index.ts +14 -0
- package/skills/struq/blocks/kit/motion/HoverLink.tsx +33 -0
- package/skills/struq/blocks/kit/motion/ImageCurtain.tsx +79 -0
- package/skills/struq/blocks/kit/motion/MaskWipe.tsx +91 -0
- package/skills/struq/blocks/kit/motion/Pressable.tsx +58 -0
- package/skills/struq/blocks/kit/motion/RevealText.tsx +103 -0
- package/skills/struq/blocks/kit/motion/Rise.tsx +77 -0
- package/skills/struq/blocks/kit/motion/ScrubLine.tsx +108 -0
- package/skills/struq/blocks/kit/motion/index.ts +11 -0
- package/skills/struq/blocks/kit/quiet/Close.tsx +178 -52
- package/skills/struq/blocks/kit/quiet/Statement.tsx +3 -2
- package/skills/struq/blocks/kit/subject/AppScreen.tsx +388 -0
- package/skills/struq/blocks/kit/subject/Document.tsx +742 -0
- package/skills/struq/blocks/kit/subject/Mark.tsx +44 -0
- package/skills/struq/blocks/kit/subject/PatternPaper.tsx +410 -0
- package/skills/struq/blocks/kit/subject/SectionDrawing.tsx +349 -0
- package/skills/struq/blocks/kit/subject/Ticket.tsx +354 -0
- package/skills/struq/blocks/kit/subject/build.ts +66 -0
- package/skills/struq/blocks/kit/subject/draw.ts +196 -0
- package/skills/struq/blocks/kit/subject/drawings.ts +373 -0
- package/skills/struq/blocks/kit/subject/format.ts +122 -0
- package/skills/struq/blocks/kit/subject/index.ts +11 -0
- package/skills/struq/blocks/kit/subject/patterns.ts +204 -0
- package/skills/struq/blocks/preloaders/preloader-stack.tsx +75 -22
- package/skills/struq/blocks/showpieces/hero-opener.tsx +55 -7
- package/skills/struq/blocks/showpieces/image-to-fullbleed.tsx +64 -6
- package/skills/struq/blocks/showpieces/manifesto-scrub.tsx +56 -3
- package/skills/struq/blocks/showpieces/panel-wipe.tsx +93 -11
- package/skills/struq/blocks/showpieces/wordmark-finale.tsx +38 -5
- package/skills/struq/canon/canon.json +1 -1
- package/skills/struq/references/art-direction.md +51 -0
- package/skills/struq/scripts/blocks.mjs +56 -20
- package/skills/struq/scripts/canon.mjs +36 -7
- package/skills/struq/scripts/check.mjs +417 -11
- package/skills/struq/scripts/draw.mjs +49 -0
- package/skills/struq/scripts/film-check.mjs +28 -4
- package/skills/struq/scripts/gate.mjs +13 -3
- package/skills/struq/scripts/hand.mjs +222 -0
- package/skills/struq/scripts/images.mjs +12 -3
- package/skills/struq/scripts/look.mjs +1184 -0
- package/skills/struq/scripts/stamp.mjs +47 -0
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"source": {
|
|
3
3
|
"repo": "Struq blocks/",
|
|
4
4
|
"ref": "origin/main",
|
|
5
|
-
"commit": "
|
|
5
|
+
"commit": "f98bd198"
|
|
6
6
|
},
|
|
7
7
|
"blocks": [
|
|
8
8
|
{
|
|
@@ -56,6 +56,7 @@
|
|
|
56
56
|
"file": "preloaders/preloader-wordmark.tsx",
|
|
57
57
|
"files": [
|
|
58
58
|
"kit/blocks.css",
|
|
59
|
+
"kit/feel.ts",
|
|
59
60
|
"kit/gsap.ts",
|
|
60
61
|
"preloaders/preloader-slices-uncovered.ts",
|
|
61
62
|
"preloaders/preloader-wordmark.tsx"
|
|
@@ -65,7 +66,7 @@
|
|
|
65
66
|
"slug": "preloader-stack",
|
|
66
67
|
"kind": "preloader",
|
|
67
68
|
"title": "Preloader: the stack",
|
|
68
|
-
"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.",
|
|
69
|
+
"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. Before an opening with no photo (opening=\"photoless\", or no hero) it flips palette panels with the name's first letter instead and lands on the opening's own ground.",
|
|
69
70
|
"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.",
|
|
70
71
|
"variants": [],
|
|
71
72
|
"role": "frame",
|
|
@@ -91,6 +92,7 @@
|
|
|
91
92
|
"file": "preloaders/preloader-stack.tsx",
|
|
92
93
|
"files": [
|
|
93
94
|
"kit/blocks.css",
|
|
95
|
+
"kit/feel.ts",
|
|
94
96
|
"kit/gsap.ts",
|
|
95
97
|
"kit/images.ts",
|
|
96
98
|
"preloaders/preloader-slices-uncovered.ts",
|
|
@@ -127,6 +129,7 @@
|
|
|
127
129
|
"file": "preloaders/preloader-slices.tsx",
|
|
128
130
|
"files": [
|
|
129
131
|
"kit/blocks.css",
|
|
132
|
+
"kit/feel.ts",
|
|
130
133
|
"kit/gsap.ts",
|
|
131
134
|
"preloaders/preloader-slices-uncovered.ts",
|
|
132
135
|
"preloaders/preloader-slices.tsx"
|
|
@@ -162,6 +165,7 @@
|
|
|
162
165
|
"file": "preloaders/preloader-gate.tsx",
|
|
163
166
|
"files": [
|
|
164
167
|
"kit/blocks.css",
|
|
168
|
+
"kit/feel.ts",
|
|
165
169
|
"kit/gsap.ts",
|
|
166
170
|
"preloaders/preloader-gate.tsx",
|
|
167
171
|
"preloaders/preloader-slices-uncovered.ts"
|
|
@@ -197,6 +201,7 @@
|
|
|
197
201
|
"files": [
|
|
198
202
|
"kit/SmoothScroll.tsx",
|
|
199
203
|
"kit/blocks.css",
|
|
204
|
+
"kit/feel.ts",
|
|
200
205
|
"kit/gsap.ts",
|
|
201
206
|
"page-transitions/page-transition-stack.tsx",
|
|
202
207
|
"preloaders/preloader-slices-uncovered.ts"
|
|
@@ -232,6 +237,7 @@
|
|
|
232
237
|
"files": [
|
|
233
238
|
"kit/SmoothScroll.tsx",
|
|
234
239
|
"kit/blocks.css",
|
|
240
|
+
"kit/feel.ts",
|
|
235
241
|
"kit/gsap.ts",
|
|
236
242
|
"page-transitions/page-transition-slices.tsx",
|
|
237
243
|
"preloaders/preloader-slices-uncovered.ts"
|
|
@@ -269,6 +275,7 @@
|
|
|
269
275
|
"files": [
|
|
270
276
|
"kit/SmoothScroll.tsx",
|
|
271
277
|
"kit/blocks.css",
|
|
278
|
+
"kit/feel.ts",
|
|
272
279
|
"kit/gsap.ts",
|
|
273
280
|
"page-transitions/page-transition-gate.tsx",
|
|
274
281
|
"preloaders/preloader-slices-uncovered.ts"
|
|
@@ -333,7 +340,9 @@
|
|
|
333
340
|
"files": [
|
|
334
341
|
"headers/header-bar.tsx",
|
|
335
342
|
"kit/blocks.css",
|
|
336
|
-
"kit/
|
|
343
|
+
"kit/feel.ts",
|
|
344
|
+
"kit/gsap.ts",
|
|
345
|
+
"kit/photo-read.ts"
|
|
337
346
|
]
|
|
338
347
|
},
|
|
339
348
|
{
|
|
@@ -395,6 +404,7 @@
|
|
|
395
404
|
"headers/menu-curtain.tsx",
|
|
396
405
|
"kit/SmoothScroll.tsx",
|
|
397
406
|
"kit/blocks.css",
|
|
407
|
+
"kit/feel.ts",
|
|
398
408
|
"kit/gsap.ts",
|
|
399
409
|
"kit/images.ts"
|
|
400
410
|
]
|
|
@@ -449,6 +459,7 @@
|
|
|
449
459
|
"heroes/hero-framed.tsx",
|
|
450
460
|
"kit/accent.ts",
|
|
451
461
|
"kit/blocks.css",
|
|
462
|
+
"kit/feel.ts",
|
|
452
463
|
"kit/gsap.ts",
|
|
453
464
|
"kit/images.ts",
|
|
454
465
|
"kit/photo-read.ts",
|
|
@@ -507,6 +518,7 @@
|
|
|
507
518
|
"heroes/hero-split.tsx",
|
|
508
519
|
"kit/accent.ts",
|
|
509
520
|
"kit/blocks.css",
|
|
521
|
+
"kit/feel.ts",
|
|
510
522
|
"kit/gsap.ts",
|
|
511
523
|
"kit/images.ts",
|
|
512
524
|
"kit/photo-read.ts",
|
|
@@ -568,6 +580,7 @@
|
|
|
568
580
|
"heroes/hero-index.tsx",
|
|
569
581
|
"kit/accent.ts",
|
|
570
582
|
"kit/blocks.css",
|
|
583
|
+
"kit/feel.ts",
|
|
571
584
|
"kit/gsap.ts",
|
|
572
585
|
"kit/images.ts",
|
|
573
586
|
"kit/photo-read.ts",
|
|
@@ -633,6 +646,7 @@
|
|
|
633
646
|
"heroes/hero-still.tsx",
|
|
634
647
|
"kit/accent.ts",
|
|
635
648
|
"kit/blocks.css",
|
|
649
|
+
"kit/feel.ts",
|
|
636
650
|
"kit/gsap.ts",
|
|
637
651
|
"kit/images.ts",
|
|
638
652
|
"kit/photo-read.ts",
|
|
@@ -686,6 +700,7 @@
|
|
|
686
700
|
"heroes/hero-still.tsx",
|
|
687
701
|
"kit/accent.ts",
|
|
688
702
|
"kit/blocks.css",
|
|
703
|
+
"kit/feel.ts",
|
|
689
704
|
"kit/gsap.ts",
|
|
690
705
|
"kit/images.ts",
|
|
691
706
|
"kit/photo-read.ts",
|
|
@@ -744,6 +759,7 @@
|
|
|
744
759
|
"backgrounds/background-aurora.tsx",
|
|
745
760
|
"kit/accent.ts",
|
|
746
761
|
"kit/blocks.css",
|
|
762
|
+
"kit/feel.ts",
|
|
747
763
|
"kit/gsap.ts",
|
|
748
764
|
"preloaders/preloader-slices-uncovered.ts"
|
|
749
765
|
]
|
|
@@ -800,6 +816,7 @@
|
|
|
800
816
|
"backgrounds/background-silk.tsx",
|
|
801
817
|
"kit/accent.ts",
|
|
802
818
|
"kit/blocks.css",
|
|
819
|
+
"kit/feel.ts",
|
|
803
820
|
"kit/gsap.ts",
|
|
804
821
|
"preloaders/preloader-slices-uncovered.ts"
|
|
805
822
|
]
|
|
@@ -856,6 +873,7 @@
|
|
|
856
873
|
"backgrounds/background-facets.tsx",
|
|
857
874
|
"kit/accent.ts",
|
|
858
875
|
"kit/blocks.css",
|
|
876
|
+
"kit/feel.ts",
|
|
859
877
|
"kit/gsap.ts",
|
|
860
878
|
"preloaders/preloader-slices-uncovered.ts"
|
|
861
879
|
]
|
|
@@ -864,7 +882,7 @@
|
|
|
864
882
|
"slug": "hero-opener",
|
|
865
883
|
"kind": "showpiece",
|
|
866
884
|
"title": "Hero opener",
|
|
867
|
-
"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.",
|
|
885
|
+
"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. Without a photo it is type on the inverse ground over the builder's own motif (`backdrop`, an SVG or small canvas from the site's world) or a stock field (`scene`: \"dots\", \"contours\" or \"none\"); the dots default is a fallback, not a choice.",
|
|
868
886
|
"reference": null,
|
|
869
887
|
"variants": [],
|
|
870
888
|
"role": "opening",
|
|
@@ -895,6 +913,7 @@
|
|
|
895
913
|
"kit/MagneticButton.tsx",
|
|
896
914
|
"kit/accent.ts",
|
|
897
915
|
"kit/blocks.css",
|
|
916
|
+
"kit/feel.ts",
|
|
898
917
|
"kit/gsap.ts",
|
|
899
918
|
"kit/images.ts",
|
|
900
919
|
"kit/scenes/contours.ts",
|
|
@@ -933,6 +952,7 @@
|
|
|
933
952
|
"file": "showpieces/image-to-fullbleed.tsx",
|
|
934
953
|
"files": [
|
|
935
954
|
"kit/blocks.css",
|
|
955
|
+
"kit/feel.ts",
|
|
936
956
|
"kit/gsap.ts",
|
|
937
957
|
"kit/images.ts",
|
|
938
958
|
"showpieces/image-to-fullbleed.tsx"
|
|
@@ -966,6 +986,7 @@
|
|
|
966
986
|
"file": "showpieces/panel-wipe.tsx",
|
|
967
987
|
"files": [
|
|
968
988
|
"kit/blocks.css",
|
|
989
|
+
"kit/feel.ts",
|
|
969
990
|
"kit/gsap.ts",
|
|
970
991
|
"kit/images.ts",
|
|
971
992
|
"showpieces/panel-wipe.tsx"
|
|
@@ -999,6 +1020,7 @@
|
|
|
999
1020
|
"file": "showpieces/scrub-connector.tsx",
|
|
1000
1021
|
"files": [
|
|
1001
1022
|
"kit/blocks.css",
|
|
1023
|
+
"kit/feel.ts",
|
|
1002
1024
|
"kit/gsap.ts",
|
|
1003
1025
|
"showpieces/scrub-connector.tsx"
|
|
1004
1026
|
]
|
|
@@ -1031,6 +1053,7 @@
|
|
|
1031
1053
|
"file": "showpieces/project-stack.tsx",
|
|
1032
1054
|
"files": [
|
|
1033
1055
|
"kit/blocks.css",
|
|
1056
|
+
"kit/feel.ts",
|
|
1034
1057
|
"kit/gsap.ts",
|
|
1035
1058
|
"kit/images.ts",
|
|
1036
1059
|
"showpieces/project-stack.tsx"
|
|
@@ -1064,6 +1087,7 @@
|
|
|
1064
1087
|
"file": "showpieces/manifesto-scrub.tsx",
|
|
1065
1088
|
"files": [
|
|
1066
1089
|
"kit/blocks.css",
|
|
1090
|
+
"kit/feel.ts",
|
|
1067
1091
|
"kit/gsap.ts",
|
|
1068
1092
|
"showpieces/manifesto-scrub.tsx"
|
|
1069
1093
|
]
|
|
@@ -1098,6 +1122,7 @@
|
|
|
1098
1122
|
"file": "showpieces/fill-rows.tsx",
|
|
1099
1123
|
"files": [
|
|
1100
1124
|
"kit/blocks.css",
|
|
1125
|
+
"kit/feel.ts",
|
|
1101
1126
|
"kit/gsap.ts",
|
|
1102
1127
|
"showpieces/fill-rows.tsx"
|
|
1103
1128
|
]
|
|
@@ -1164,6 +1189,7 @@
|
|
|
1164
1189
|
"file": "showpieces/wordmark-finale.tsx",
|
|
1165
1190
|
"files": [
|
|
1166
1191
|
"kit/blocks.css",
|
|
1192
|
+
"kit/feel.ts",
|
|
1167
1193
|
"kit/gsap.ts",
|
|
1168
1194
|
"showpieces/wordmark-finale.tsx"
|
|
1169
1195
|
]
|
|
@@ -1196,6 +1222,7 @@
|
|
|
1196
1222
|
"file": "transitions/zoom-through.tsx",
|
|
1197
1223
|
"files": [
|
|
1198
1224
|
"kit/blocks.css",
|
|
1225
|
+
"kit/feel.ts",
|
|
1199
1226
|
"kit/gsap.ts",
|
|
1200
1227
|
"kit/images.ts",
|
|
1201
1228
|
"kit/photo-read.ts",
|
|
@@ -1258,6 +1285,7 @@
|
|
|
1258
1285
|
"file": "sections/about-studio.tsx",
|
|
1259
1286
|
"files": [
|
|
1260
1287
|
"kit/blocks.css",
|
|
1288
|
+
"kit/feel.ts",
|
|
1261
1289
|
"kit/gsap.ts",
|
|
1262
1290
|
"kit/images.ts",
|
|
1263
1291
|
"sections/about-studio.tsx"
|
|
@@ -1320,6 +1348,7 @@
|
|
|
1320
1348
|
"file": "sections/approach.tsx",
|
|
1321
1349
|
"files": [
|
|
1322
1350
|
"kit/blocks.css",
|
|
1351
|
+
"kit/feel.ts",
|
|
1323
1352
|
"kit/gsap.ts",
|
|
1324
1353
|
"kit/images.ts",
|
|
1325
1354
|
"sections/approach.tsx"
|
|
@@ -1382,6 +1411,7 @@
|
|
|
1382
1411
|
"file": "sections/manifesto.tsx",
|
|
1383
1412
|
"files": [
|
|
1384
1413
|
"kit/blocks.css",
|
|
1414
|
+
"kit/feel.ts",
|
|
1385
1415
|
"kit/gsap.ts",
|
|
1386
1416
|
"kit/images.ts",
|
|
1387
1417
|
"kit/photo-read.ts",
|
|
@@ -1500,6 +1530,7 @@
|
|
|
1500
1530
|
"file": "sections/cta-closing.tsx",
|
|
1501
1531
|
"files": [
|
|
1502
1532
|
"kit/blocks.css",
|
|
1533
|
+
"kit/feel.ts",
|
|
1503
1534
|
"kit/gsap.ts",
|
|
1504
1535
|
"kit/images.ts",
|
|
1505
1536
|
"kit/photo-read.ts",
|
|
@@ -1554,6 +1585,7 @@
|
|
|
1554
1585
|
"file": "sections/reveals.tsx",
|
|
1555
1586
|
"files": [
|
|
1556
1587
|
"kit/blocks.css",
|
|
1588
|
+
"kit/feel.ts",
|
|
1557
1589
|
"kit/gsap.ts",
|
|
1558
1590
|
"kit/images.ts",
|
|
1559
1591
|
"sections/reveals.tsx"
|
|
@@ -1590,6 +1622,7 @@
|
|
|
1590
1622
|
"file": "sections/image-trail.tsx",
|
|
1591
1623
|
"files": [
|
|
1592
1624
|
"kit/blocks.css",
|
|
1625
|
+
"kit/feel.ts",
|
|
1593
1626
|
"kit/gsap.ts",
|
|
1594
1627
|
"kit/images.ts",
|
|
1595
1628
|
"sections/image-trail.tsx"
|
|
@@ -1625,6 +1658,7 @@
|
|
|
1625
1658
|
"file": "sections/panel-accordion.tsx",
|
|
1626
1659
|
"files": [
|
|
1627
1660
|
"kit/blocks.css",
|
|
1661
|
+
"kit/feel.ts",
|
|
1628
1662
|
"kit/gsap.ts",
|
|
1629
1663
|
"kit/images.ts",
|
|
1630
1664
|
"sections/panel-accordion.tsx"
|
|
@@ -1658,6 +1692,7 @@
|
|
|
1658
1692
|
"file": "sections/grid-assembly.tsx",
|
|
1659
1693
|
"files": [
|
|
1660
1694
|
"kit/blocks.css",
|
|
1695
|
+
"kit/feel.ts",
|
|
1661
1696
|
"kit/gsap.ts",
|
|
1662
1697
|
"kit/images.ts",
|
|
1663
1698
|
"kit/photo-read.ts",
|
|
@@ -1694,6 +1729,7 @@
|
|
|
1694
1729
|
"file": "sections/velocity-type.tsx",
|
|
1695
1730
|
"files": [
|
|
1696
1731
|
"kit/blocks.css",
|
|
1732
|
+
"kit/feel.ts",
|
|
1697
1733
|
"kit/gsap.ts",
|
|
1698
1734
|
"kit/images.ts",
|
|
1699
1735
|
"sections/velocity-type.tsx"
|
|
@@ -1727,6 +1763,7 @@
|
|
|
1727
1763
|
"file": "sections/sticky-chapters.tsx",
|
|
1728
1764
|
"files": [
|
|
1729
1765
|
"kit/blocks.css",
|
|
1766
|
+
"kit/feel.ts",
|
|
1730
1767
|
"kit/gsap.ts",
|
|
1731
1768
|
"kit/images.ts",
|
|
1732
1769
|
"sections/sticky-chapters.tsx"
|
|
@@ -1760,6 +1797,7 @@
|
|
|
1760
1797
|
"file": "sections/film-strip.tsx",
|
|
1761
1798
|
"files": [
|
|
1762
1799
|
"kit/blocks.css",
|
|
1800
|
+
"kit/feel.ts",
|
|
1763
1801
|
"kit/gsap.ts",
|
|
1764
1802
|
"kit/images.ts",
|
|
1765
1803
|
"sections/film-strip.tsx"
|
|
@@ -1796,6 +1834,7 @@
|
|
|
1796
1834
|
"file": "sections/hover-list.tsx",
|
|
1797
1835
|
"files": [
|
|
1798
1836
|
"kit/blocks.css",
|
|
1837
|
+
"kit/feel.ts",
|
|
1799
1838
|
"kit/gsap.ts",
|
|
1800
1839
|
"kit/images.ts",
|
|
1801
1840
|
"sections/hover-list.tsx"
|
|
@@ -1829,6 +1868,7 @@
|
|
|
1829
1868
|
"file": "sections/split-pair.tsx",
|
|
1830
1869
|
"files": [
|
|
1831
1870
|
"kit/blocks.css",
|
|
1871
|
+
"kit/feel.ts",
|
|
1832
1872
|
"kit/gsap.ts",
|
|
1833
1873
|
"kit/images.ts",
|
|
1834
1874
|
"kit/photo-read.ts",
|
|
@@ -1865,6 +1905,7 @@
|
|
|
1865
1905
|
"file": "sections/fanned-cards.tsx",
|
|
1866
1906
|
"files": [
|
|
1867
1907
|
"kit/blocks.css",
|
|
1908
|
+
"kit/feel.ts",
|
|
1868
1909
|
"kit/gsap.ts",
|
|
1869
1910
|
"kit/images.ts",
|
|
1870
1911
|
"sections/fanned-cards.tsx"
|
|
@@ -1921,6 +1962,7 @@
|
|
|
1921
1962
|
"footers/footer-reveal.tsx",
|
|
1922
1963
|
"kit/SmoothScroll.tsx",
|
|
1923
1964
|
"kit/blocks.css",
|
|
1965
|
+
"kit/feel.ts",
|
|
1924
1966
|
"kit/gsap.ts"
|
|
1925
1967
|
]
|
|
1926
1968
|
},
|
|
@@ -1966,6 +2008,7 @@
|
|
|
1966
2008
|
}
|
|
1967
2009
|
},
|
|
1968
2010
|
"packages": [
|
|
2011
|
+
",\n },\n nl: {\n days: [",
|
|
1969
2012
|
"@gsap/react",
|
|
1970
2013
|
"gsap"
|
|
1971
2014
|
],
|
|
@@ -1976,7 +2019,9 @@
|
|
|
1976
2019
|
"files": [
|
|
1977
2020
|
"footers/footer-contact.tsx",
|
|
1978
2021
|
"kit/blocks.css",
|
|
1979
|
-
"kit/
|
|
2022
|
+
"kit/feel.ts",
|
|
2023
|
+
"kit/gsap.ts",
|
|
2024
|
+
"kit/middle/hours.ts"
|
|
1980
2025
|
]
|
|
1981
2026
|
}
|
|
1982
2027
|
]
|
|
@@ -2,15 +2,16 @@
|
|
|
2
2
|
"source": {
|
|
3
3
|
"repo": "Struq blocks/film/arcs.ts",
|
|
4
4
|
"ref": "origin/main",
|
|
5
|
-
"commit": "
|
|
5
|
+
"commit": "f98bd198"
|
|
6
6
|
},
|
|
7
7
|
"ARC_RULES": [
|
|
8
|
-
"A loud scene moves with the scroll (a pin, a scrub, a reveal to full bleed); a quiet scene
|
|
9
|
-
"Pick the language by the
|
|
8
|
+
"A loud scene moves with the scroll (a pin, a scrub, a reveal to full bleed); a quiet scene enters once and sits still. Tag a scene (loud) when the block's energy is 2 or more, (quiet) at 1 or less or for an own scene.",
|
|
9
|
+
"Pick the language from the hand by the tempo the idea needs, never by trade; calm and the held reveal are both reflexes. The Language line says why not the other. The idea may pick any motif of the six.",
|
|
10
|
+
"Cast every slot from the Idea, the Motif and the Unlike line, never from the order of the options: each option is a different first screen or moment. The Opening and the Centerpiece come from the hand's five each; choose the pair that could only be this client's.",
|
|
11
|
+
"The middle of the page is composed for this client, never the kit's four quiet scenes by default. Each middle scene is a block, a kit quiet scene (Statement, PhotoText, Rows or Close, each at most once) or an own scene built from SplitHeadline, MediaFrame and Reveal, whichever this idea needs there. Invent own scenes wherever the idea wants a moment no block gives.",
|
|
12
|
+
"Loud only at the opening, the centerpiece and at most one gentle scene, with a quiet scene on each side. Change, add or drop middle scenes as the idea needs, 7 to 9 scenes in all; a block the client named goes in, marked (named).",
|
|
10
13
|
"preloader-gate is neutral by default (a hairline ring an accent arc fills once, or the client's own marks); its leader dial (dial=\"leader\" with marks 3, 2, 1) is for a film client only.",
|
|
11
|
-
"The header is header-bar:quiet or :settle; sections say their ground with data-bar-tone."
|
|
12
|
-
"Each arc is loud only at the opening, the centerpiece and at most one gentle scene with a quiet scene on each side. Swap at most one scene; a block the user names goes in first.",
|
|
13
|
-
"The Statement is the first type moment: an own scene, one sentence at 12 to 16vw with SplitHeadline, still. Only the Statement and the Close are type alone: every other own scene sets a photo (MediaFrame) beside its type on the 12 column grid, so a quiet scene is composed, never empty."
|
|
14
|
+
"The header is header-bar:quiet or :settle; sections say their ground with data-bar-tone."
|
|
14
15
|
],
|
|
15
16
|
"FILM_ARCS": [
|
|
16
17
|
{
|
|
@@ -346,7 +347,7 @@
|
|
|
346
347
|
"Every frame from the site's language. A page transition only when the site has more than one route.",
|
|
347
348
|
"Install only what the storyboard names, plus the header and the language's menu.",
|
|
348
349
|
"One motif on the page. At most two full-bleed photo reveals, built the same way.",
|
|
349
|
-
"At most one marquee (cta-closing:marquee, velocity-type) and one custom cursor.
|
|
350
|
+
"At most one marquee (cta-closing:marquee, velocity-type) and one custom cursor. One accent device on the page: an italic word, a weight shift, a coloured word, a jump in scale, or none.",
|
|
350
351
|
"A block with a live clock goes without it unless the lexicon is about time: wordmark-finale without timeZone, header-bar:quiet or :settle, never :split. hero-still, footer-contact and menu-curtain always tick: at most one of them on the page, and it is the one clock.",
|
|
351
352
|
"Two or three type moments at poster scale (12 to 20vw) on the page; everything else from the scale.",
|
|
352
353
|
"Labels: no eyebrows above headings, no mono, no uppercase labels, no numbered steps. A small sentence-case label in the body face may sit beside a headline in the margin column or under a photo, in words from the lexicon."
|
|
@@ -358,6 +359,7 @@
|
|
|
358
359
|
"FILM_LANGUAGES": [
|
|
359
360
|
{
|
|
360
361
|
"id": "weight",
|
|
362
|
+
"temperament": "weighted",
|
|
361
363
|
"for": [
|
|
362
364
|
"architecture",
|
|
363
365
|
"hotels",
|
|
@@ -377,6 +379,7 @@
|
|
|
377
379
|
},
|
|
378
380
|
{
|
|
379
381
|
"id": "cut",
|
|
382
|
+
"temperament": "crisp",
|
|
380
383
|
"for": [
|
|
381
384
|
"fashion",
|
|
382
385
|
"agencies",
|
|
@@ -397,6 +400,7 @@
|
|
|
397
400
|
},
|
|
398
401
|
{
|
|
399
402
|
"id": "curtain",
|
|
403
|
+
"temperament": "slow",
|
|
400
404
|
"for": [
|
|
401
405
|
"campaigns",
|
|
402
406
|
"launches",
|
|
@@ -38,6 +38,8 @@
|
|
|
38
38
|
// Reduced motion: the composed footer, no travel; the colon holds and the digits cut; hovers show a plain underline.
|
|
39
39
|
import { useEffect, useMemo, useRef, useState, type CSSProperties, type PointerEvent, type ReactNode } from "react";
|
|
40
40
|
import { gsap, ScrollTrigger, SplitText, useGSAP } from "../kit/gsap";
|
|
41
|
+
// The hours as words, the wall clock and the open marker's logic: one copy, shared with kit/middle/PlaceHours.
|
|
42
|
+
import { hoursText as rowText, openStatus, useNow, wallClock } from "../kit/middle/hours";
|
|
41
43
|
|
|
42
44
|
export const FOOTER_CONTACT_VARIANTS = [
|
|
43
45
|
{ id: "address", title: "Adres" },
|
|
@@ -91,13 +93,7 @@ const ROLL_SPAN = 0.36;
|
|
|
91
93
|
/** The soft rise of the details, in px. */
|
|
92
94
|
const SOFT = 24;
|
|
93
95
|
|
|
94
|
-
const DAYS = ["maandag", "dinsdag", "woensdag", "donderdag", "vrijdag", "zaterdag", "zondag"];
|
|
95
|
-
const WEEKDAY: Record<string, number> = { Mon: 1, Tue: 2, Wed: 3, Thu: 4, Fri: 5, Sat: 6, Sun: 7 };
|
|
96
96
|
const cap = (s: string) => s.charAt(0).toUpperCase() + s.slice(1);
|
|
97
|
-
const toMinutes = (s: string) => {
|
|
98
|
-
const [h, m] = s.split(":").map(Number);
|
|
99
|
-
return (h || 0) * 60 + (m || 0);
|
|
100
|
-
};
|
|
101
97
|
|
|
102
98
|
const clamp01 = (v: number) => Math.min(1, Math.max(0, v));
|
|
103
99
|
const within = (p: number, from: number, to: number) => clamp01((p - from) / (to - from));
|
|
@@ -152,87 +148,21 @@ function faceReady() {
|
|
|
152
148
|
return Promise.race([fonts ?? Promise.resolve(), new Promise((res) => window.setTimeout(res, FONT_CAP))]);
|
|
153
149
|
}
|
|
154
150
|
|
|
155
|
-
/** The time now, only when `on` and only after mount (null on the server and the first paint), ticking on the minute. */
|
|
156
|
-
function useNow(on: boolean) {
|
|
157
|
-
const [now, setNow] = useState<Date | null>(null);
|
|
158
|
-
useEffect(() => {
|
|
159
|
-
if (!on) return;
|
|
160
|
-
let timer = 0;
|
|
161
|
-
const tick = () => {
|
|
162
|
-
const d = new Date();
|
|
163
|
-
setNow(d);
|
|
164
|
-
window.clearTimeout(timer);
|
|
165
|
-
timer = window.setTimeout(tick, 60_000 - (d.getSeconds() * 1000 + d.getMilliseconds()) + 30);
|
|
166
|
-
};
|
|
167
|
-
tick();
|
|
168
|
-
// A background tab's timers are held back; on return the clock catches up at once.
|
|
169
|
-
const onShow = () => {
|
|
170
|
-
if (document.visibilityState === "visible") tick();
|
|
171
|
-
};
|
|
172
|
-
document.addEventListener("visibilitychange", onShow);
|
|
173
|
-
return () => {
|
|
174
|
-
window.clearTimeout(timer);
|
|
175
|
-
document.removeEventListener("visibilitychange", onShow);
|
|
176
|
-
};
|
|
177
|
-
}, [on]);
|
|
178
|
-
return on ? now : null;
|
|
179
|
-
}
|
|
180
|
-
|
|
181
151
|
type Wall = { dow: number; h: number; m: number; hh: string; mm: string; date: string };
|
|
182
152
|
|
|
183
|
-
/** The studio's wall clock and whether it is open, from the real time and the given hours. */
|
|
153
|
+
/** The studio's wall clock and whether it is open, from the real time and the given hours (../kit/middle/hours). */
|
|
184
154
|
function useWall(now: Date | null, timeZone: string, hours: Props["hours"]) {
|
|
185
|
-
const
|
|
186
|
-
() => ({
|
|
187
|
-
parts: new Intl.DateTimeFormat("en-GB", { timeZone, weekday: "short", hour: "2-digit", minute: "2-digit", hourCycle: "h23" }),
|
|
188
|
-
date: new Intl.DateTimeFormat("nl-NL", { timeZone, weekday: "long", day: "numeric", month: "long" }),
|
|
189
|
-
}),
|
|
190
|
-
[timeZone],
|
|
191
|
-
);
|
|
155
|
+
const date = useMemo(() => new Intl.DateTimeFormat("nl-NL", { timeZone, weekday: "long", day: "numeric", month: "long" }), [timeZone]);
|
|
192
156
|
return useMemo(() => {
|
|
193
157
|
if (!now) return { wall: null, status: null };
|
|
194
|
-
const
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
const m = Number(get("minute"));
|
|
198
|
-
const wall: Wall = {
|
|
199
|
-
dow: WEEKDAY[get("weekday")] ?? 1,
|
|
200
|
-
h,
|
|
201
|
-
m,
|
|
202
|
-
hh: String(h).padStart(2, "0"),
|
|
203
|
-
mm: String(m).padStart(2, "0"),
|
|
204
|
-
date: fmt.date.format(now),
|
|
205
|
-
};
|
|
206
|
-
const mins = h * 60 + m;
|
|
207
|
-
const from = toMinutes(hours.from);
|
|
208
|
-
const to = toMinutes(hours.to);
|
|
209
|
-
const openDay = (d: number) => hours.days.includes(d);
|
|
210
|
-
let status: { open: boolean; text: string };
|
|
211
|
-
if (openDay(wall.dow) && mins >= from && mins < to) status = { open: true, text: `Nu open, tot ${hours.to}` };
|
|
212
|
-
else if (openDay(wall.dow) && mins < from) status = { open: false, text: `Vandaag vanaf ${hours.from}` };
|
|
213
|
-
else {
|
|
214
|
-
let text = "";
|
|
215
|
-
for (let k = 1; k <= 7; k += 1) {
|
|
216
|
-
const d = ((wall.dow - 1 + k) % 7) + 1;
|
|
217
|
-
if (openDay(d)) {
|
|
218
|
-
text = k === 1 ? `Morgen vanaf ${hours.from}` : `${cap(DAYS[d - 1])} vanaf ${hours.from}`;
|
|
219
|
-
break;
|
|
220
|
-
}
|
|
221
|
-
}
|
|
222
|
-
status = { open: false, text };
|
|
223
|
-
}
|
|
224
|
-
return { wall, status };
|
|
225
|
-
}, [now, fmt, hours]);
|
|
158
|
+
const wall: Wall = { ...wallClock(now, timeZone), date: date.format(now) };
|
|
159
|
+
return { wall, status: openStatus([hours], wall, "nl") };
|
|
160
|
+
}, [now, date, timeZone, hours]);
|
|
226
161
|
}
|
|
227
162
|
|
|
228
163
|
/** "Maandag tot en met vrijdag, 9:00 tot 18:00" from the hours. */
|
|
229
164
|
function hoursText(hours: Props["hours"]) {
|
|
230
|
-
|
|
231
|
-
if (!days.length) return "";
|
|
232
|
-
const first = DAYS[days[0] - 1];
|
|
233
|
-
const last = DAYS[days[days.length - 1] - 1];
|
|
234
|
-
const run = days.length === 1 ? cap(first) : `${cap(first)} tot en met ${last}`;
|
|
235
|
-
return `${run}, ${hours.from} tot ${hours.to}`;
|
|
165
|
+
return rowText(hours, "nl");
|
|
236
166
|
}
|
|
237
167
|
|
|
238
168
|
/** The open marker: a small ring, filled while the studio is open, and the words. Empty until the time is known. */
|