@yojahny/wp-design-library 0.3.0 → 0.5.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.
Files changed (186) hide show
  1. package/.env.example +7 -0
  2. package/README.md +52 -9
  3. package/bin/library.mjs +11 -0
  4. package/entries/ada/entry.md +55 -0
  5. package/entries/ada/strip.webp +0 -0
  6. package/entries/air/captures/2/measure.json +325 -0
  7. package/entries/air/captures/2/strip.webp +0 -0
  8. package/entries/air/entry.md +62 -0
  9. package/entries/air/strip.webp +0 -0
  10. package/entries/ais-community-dark-depth/strip.webp +0 -0
  11. package/entries/apple-home/captures/2/measure.json +91 -0
  12. package/entries/apple-home/captures/2/strip.webp +0 -0
  13. package/entries/apple-home/entry.md +64 -0
  14. package/entries/apple-home/strip.webp +0 -0
  15. package/entries/apple-macbook-neo/captures/2/measure.json +570 -0
  16. package/entries/apple-macbook-neo/captures/2/strip.webp +0 -0
  17. package/entries/apple-macbook-neo/entry.md +62 -0
  18. package/entries/apple-macbook-neo/strip.webp +0 -0
  19. package/entries/apple-watch-ultra-4/entry.md +63 -0
  20. package/entries/apple-watch-ultra-4/measure.json +481 -0
  21. package/entries/apple-watch-ultra-4/strip.webp +0 -0
  22. package/entries/bpco/captures/2/strip.webp +0 -0
  23. package/entries/bpco/captures/3/strip.webp +0 -0
  24. package/entries/bpco/entry.md +81 -0
  25. package/entries/bpco/strip.webp +0 -0
  26. package/entries/column/captures/2/measure.json +996 -0
  27. package/entries/column/captures/2/strip.webp +0 -0
  28. package/entries/column/entry.md +82 -0
  29. package/entries/column/strip.webp +0 -0
  30. package/entries/cthdrl/captures/2/measure.json +251 -0
  31. package/entries/cthdrl/captures/2/strip.webp +0 -0
  32. package/entries/cthdrl/entry.md +86 -0
  33. package/entries/cthdrl/strip.webp +0 -0
  34. package/entries/dala-craftedbygc/entry.md +69 -0
  35. package/entries/dala-craftedbygc/strip.webp +0 -0
  36. package/entries/dock/captures/2/measure.json +206 -0
  37. package/entries/dock/captures/2/strip.webp +0 -0
  38. package/entries/dock/entry.md +62 -0
  39. package/entries/dock/strip.webp +0 -0
  40. package/entries/dub/captures/2/measure.json +37 -0
  41. package/entries/dub/captures/2/strip.webp +0 -0
  42. package/entries/dub/entry.md +61 -0
  43. package/entries/dub/strip.webp +0 -0
  44. package/entries/duolingo/captures/2/measure.json +138 -0
  45. package/entries/duolingo/captures/2/strip.webp +0 -0
  46. package/entries/duolingo/entry.md +65 -0
  47. package/entries/duolingo/strip.webp +0 -0
  48. package/entries/elevenlabs/captures/2/measure.json +160 -0
  49. package/entries/elevenlabs/captures/2/strip.webp +0 -0
  50. package/entries/elevenlabs/entry.md +62 -0
  51. package/entries/elevenlabs/strip.webp +0 -0
  52. package/entries/flying-papers/captures/2/measure.json +291 -0
  53. package/entries/flying-papers/captures/2/strip.webp +0 -0
  54. package/entries/flying-papers/entry.md +61 -0
  55. package/entries/flying-papers/strip.webp +0 -0
  56. package/entries/gsap/captures/2/measure.json +120 -0
  57. package/entries/gsap/captures/2/strip.webp +0 -0
  58. package/entries/gsap/entry.md +62 -0
  59. package/entries/gsap/strip.webp +0 -0
  60. package/entries/letters/captures/2/measure.json +20 -0
  61. package/entries/letters/captures/2/strip.webp +0 -0
  62. package/entries/letters/entry.md +62 -0
  63. package/entries/letters/strip.webp +0 -0
  64. package/entries/micro/captures/2/measure.json +852 -0
  65. package/entries/micro/captures/2/strip.webp +0 -0
  66. package/entries/micro/entry.md +61 -0
  67. package/entries/micro/strip.webp +0 -0
  68. package/entries/monopo-saigon/captures/2/measure.json +145 -0
  69. package/entries/monopo-saigon/captures/2/strip.webp +0 -0
  70. package/entries/monopo-saigon/entry.md +64 -0
  71. package/entries/monopo-saigon/strip.webp +0 -0
  72. package/entries/notion/captures/2/measure.json +338 -0
  73. package/entries/notion/captures/2/strip.webp +0 -0
  74. package/entries/notion/entry.md +66 -0
  75. package/entries/notion/strip.webp +0 -0
  76. package/entries/origin-financial/captures/2/measure.json +169 -0
  77. package/entries/origin-financial/captures/2/strip.webp +0 -0
  78. package/entries/origin-financial/entry.md +65 -0
  79. package/entries/origin-financial/strip.webp +0 -0
  80. package/entries/oryzo-ai/captures/2/measure.json +39 -0
  81. package/entries/oryzo-ai/captures/2/strip.webp +0 -0
  82. package/entries/oryzo-ai/entry.md +76 -0
  83. package/entries/oryzo-ai/strip.webp +0 -0
  84. package/entries/silencio/captures/2/strip.webp +0 -0
  85. package/entries/silencio/entry.md +114 -0
  86. package/entries/silencio/motion/product-story/frame-0.webp +0 -0
  87. package/entries/silencio/motion/product-story/frame-1.webp +0 -0
  88. package/entries/silencio/motion/product-story/frame-2.webp +0 -0
  89. package/entries/silencio/motion/product-story/frame-3.webp +0 -0
  90. package/entries/silencio/motion/product-story/frame-4.webp +0 -0
  91. package/entries/silencio/motion/product-story/frame-5.webp +0 -0
  92. package/entries/silencio/motion/product-story/frame-6.webp +0 -0
  93. package/entries/silencio/motion/product-story/frame-7.webp +0 -0
  94. package/entries/silencio/strip.webp +0 -0
  95. package/entries/steep/captures/2/measure.json +20 -0
  96. package/entries/steep/captures/2/strip.webp +0 -0
  97. package/entries/steep/entry.md +63 -0
  98. package/entries/steep/strip.webp +0 -0
  99. package/entries/stripe/captures/2/measure.json +892 -0
  100. package/entries/stripe/captures/2/strip.webp +0 -0
  101. package/entries/stripe/entry.md +61 -0
  102. package/entries/stripe/strip.webp +0 -0
  103. package/entries/superpower/captures/2/measure.json +179 -0
  104. package/entries/superpower/captures/2/strip.webp +0 -0
  105. package/entries/superpower/entry.md +64 -0
  106. package/entries/superpower/strip.webp +0 -0
  107. package/entries/superr/entry.md +54 -0
  108. package/entries/superr/strip.webp +0 -0
  109. package/entries/svz-weare/captures/2/measure.json +129 -0
  110. package/entries/svz-weare/captures/2/strip.webp +0 -0
  111. package/entries/svz-weare/entry.md +147 -0
  112. package/entries/svz-weare/motion/hero-transition/frame-0.webp +0 -0
  113. package/entries/svz-weare/motion/hero-transition/frame-1.webp +0 -0
  114. package/entries/svz-weare/motion/hero-transition/frame-2.webp +0 -0
  115. package/entries/svz-weare/motion/hero-transition/frame-3.webp +0 -0
  116. package/entries/svz-weare/motion/hero-transition/frame-4.webp +0 -0
  117. package/entries/svz-weare/motion/hero-transition/frame-5.webp +0 -0
  118. package/entries/svz-weare/motion/hero-transition/frame-6.webp +0 -0
  119. package/entries/svz-weare/motion/hero-transition/frame-7.webp +0 -0
  120. package/entries/svz-weare/strip.webp +0 -0
  121. package/entries/thoughtlab/captures/2/measure.json +93 -0
  122. package/entries/thoughtlab/captures/2/strip.webp +0 -0
  123. package/entries/thoughtlab/entry.md +62 -0
  124. package/entries/thoughtlab/strip.webp +0 -0
  125. package/entries/ventriloc/entry.md +54 -0
  126. package/entries/ventriloc/strip.webp +0 -0
  127. package/entries/vivid-and-co/entry.md +58 -0
  128. package/entries/vivid-and-co/strip.webp +0 -0
  129. package/package.json +24 -5
  130. package/src/cli/add.mjs +100 -24
  131. package/src/cli/motion.mjs +168 -0
  132. package/src/cli/refresh.mjs +6 -0
  133. package/src/cli/ui.mjs +2 -1
  134. package/src/entry.mjs +14 -1
  135. package/src/index/build.mjs +9 -3
  136. package/src/index/embed.mjs +1 -1
  137. package/src/ingest/agreement.mjs +33 -0
  138. package/src/ingest/attach.mjs +67 -0
  139. package/src/ingest/draft.mjs +5 -2
  140. package/src/ingest/frames.mjs +20 -6
  141. package/src/ingest/measure.mjs +34 -1
  142. package/src/ingest/observed.mjs +29 -0
  143. package/src/mcp/http.mjs +1 -1
  144. package/src/mcp/instructions.mjs +2 -1
  145. package/src/mcp/prompts.mjs +12 -1
  146. package/src/mcp/resources.mjs +14 -0
  147. package/src/mcp/tools.mjs +48 -5
  148. package/src/motion.mjs +94 -0
  149. package/src/ui/build.mjs +83 -7
  150. package/src/ui/serve.mjs +29 -4
  151. package/src/ui/templates/entry.html +9 -1
  152. package/entries/ais-community-dark-depth/strip.png +0 -0
  153. package/tests/README.md +0 -33
  154. package/tests/checks/cli-check.sh +0 -13
  155. package/tests/checks/docker.sh +0 -10
  156. package/tests/checks/entry-detail.sh +0 -52
  157. package/tests/checks/entry.sh +0 -55
  158. package/tests/checks/export.sh +0 -16
  159. package/tests/checks/fetch-on-start.sh +0 -26
  160. package/tests/checks/frames-dense.sh +0 -27
  161. package/tests/checks/http.sh +0 -22
  162. package/tests/checks/hygiene.sh +0 -29
  163. package/tests/checks/inbox.sh +0 -27
  164. package/tests/checks/index-degrade.sh +0 -32
  165. package/tests/checks/index.sh +0 -36
  166. package/tests/checks/ingest-mp4.sh +0 -47
  167. package/tests/checks/ingest.sh +0 -39
  168. package/tests/checks/instructions.sh +0 -31
  169. package/tests/checks/licence-gate.sh +0 -24
  170. package/tests/checks/mcp-stdout.sh +0 -31
  171. package/tests/checks/measure.sh +0 -79
  172. package/tests/checks/minors.sh +0 -84
  173. package/tests/checks/optional-deps.sh +0 -55
  174. package/tests/checks/prompt-add-entry.sh +0 -28
  175. package/tests/checks/recommend.sh +0 -107
  176. package/tests/checks/resources.sh +0 -47
  177. package/tests/checks/rrf.sh +0 -120
  178. package/tests/checks/seed-sync.sh +0 -22
  179. package/tests/checks/similar.sh +0 -62
  180. package/tests/checks/ui-build.sh +0 -59
  181. package/tests/checks/vocab.sh +0 -30
  182. package/tests/fixtures/entry-ok/entry.md +0 -41
  183. package/tests/fixtures/entry-ok/strip.png +0 -0
  184. package/tests/fixtures/page/index.html +0 -47
  185. package/tests/fixtures/three-frame.webp +0 -0
  186. package/tests/run.sh +0 -16
@@ -0,0 +1,82 @@
1
+ ---
2
+ slug: column
3
+ title: 'Column: modern financial-infrastructure landing'
4
+ tier: inspiration
5
+ source:
6
+ kind: public-site
7
+ url: https://column.com/
8
+ license: Captured from a Refero-hosted recording and the live site; description only, no redistribution of the source.
9
+ captured:
10
+ method: both
11
+ at: '2026-09-16'
12
+ tool: wp-design-library@0.4.0
13
+ captures:
14
+ - method: frames
15
+ input: /tmp/column-refero.mp4
16
+ artifacts:
17
+ - strip.webp
18
+ frames: 36
19
+ duration_ms: 32417
20
+ - method: both
21
+ input: https://column.com/
22
+ artifacts:
23
+ - captures/2/strip.webp
24
+ - captures/2/measure.json
25
+ - captures/2/screen-1440.png
26
+ - captures/2/screen-390.png
27
+ media:
28
+ frames: 36
29
+ duration_ms: 32417
30
+ roles:
31
+ - hero
32
+ - proof
33
+ - capability
34
+ - feature
35
+ - offer
36
+ - closing
37
+ - footer
38
+ feel:
39
+ - light
40
+ - premium
41
+ - editorial
42
+ - minimal
43
+ - cold
44
+ palette:
45
+ canvas: '#f7f7f8'
46
+ ink: '#172357'
47
+ accent: '#ff6a21'
48
+ type:
49
+ display: clean geometric sans-serif
50
+ body: clean geometric sans-serif
51
+ motion:
52
+ devices:
53
+ - reveal
54
+ - pan
55
+ - drift
56
+ - stagger
57
+ notes: >-
58
+ Eyeballed from the 36 sampled video frames, not measured. The recording moves from a dotted world map and floating
59
+ account card into layered orange chart panels, code/interface blocks, and a dark system diagram. Each chapter
60
+ reveals cards in small groups; the contact-sheet capture cannot establish interaction triggers.
61
+ ported_from: null
62
+ ---
63
+
64
+ ## What it does
65
+
66
+ Column presents banking infrastructure as a modular building-block system: global reach, customer proof, developer primitives, and configurable financial products.
67
+
68
+ ## Section roster
69
+
70
+ 1. World-map hero and product promise.
71
+ 2. Customer proof and orange metric cards.
72
+ 3. Developer/API capability sequence.
73
+ 4. Dark modular-system diagram and product blocks.
74
+ 5. Industry proof, financial-product matrix, documentation links, and closing/footer.
75
+
76
+ ## Why it works
77
+
78
+ The soft near-white canvas makes the dark-blue type and rare orange data panels easy to read. It shifts between editorial story sections and structured product surfaces without losing the same precise grid.
79
+
80
+ ## Sources
81
+
82
+ The Refero MP4 at https://images.refero.design/styles/refero.design/video/3d47cb0a-492f-4fa3-82e6-d59ebb5cf128.mp4 provides the full 32.42-second page sequence. A live Chrome capture of https://column.com/ returned no artifacts, so its URL is retained as the public source but the visual and motion notes rely on the supplied recording.
Binary file
@@ -0,0 +1,251 @@
1
+ {
2
+ "url": "https://cthdrl.co/",
3
+ "at": "2026-09-16",
4
+ "viewport": [
5
+ 1440,
6
+ 390
7
+ ],
8
+ "tokens": {
9
+ "canvas": "#000000",
10
+ "ink": "#e7ded1",
11
+ "accent": "",
12
+ "fontDisplay": "\"NB Akademie\", sans-serif",
13
+ "fontBody": "\"NB Akademie Mono\", sans-serif"
14
+ },
15
+ "sections": [
16
+ {
17
+ "index": 0,
18
+ "tag": "header",
19
+ "id": "",
20
+ "class": "site-header",
21
+ "top": 0,
22
+ "height": 47,
23
+ "animations": [
24
+ {
25
+ "target": "div.marquee-text-text",
26
+ "timeline": "document",
27
+ "range": null,
28
+ "duration": 15000
29
+ },
30
+ {
31
+ "target": "div.marquee-text-text",
32
+ "timeline": "document",
33
+ "range": null,
34
+ "duration": 15000
35
+ }
36
+ ]
37
+ },
38
+ {
39
+ "index": 1,
40
+ "tag": "section",
41
+ "id": "",
42
+ "class": "work-slideshow current-0",
43
+ "top": 0,
44
+ "height": 901,
45
+ "animations": [
46
+ {
47
+ "target": "circle.[object SVGAnimatedString]",
48
+ "timeline": "document",
49
+ "range": null,
50
+ "duration": 2500
51
+ },
52
+ {
53
+ "target": "circle.[object SVGAnimatedString]",
54
+ "timeline": "document",
55
+ "range": null,
56
+ "duration": 2500
57
+ },
58
+ {
59
+ "target": "span.text-slideup-slider",
60
+ "timeline": "document",
61
+ "range": null,
62
+ "duration": 1000
63
+ },
64
+ {
65
+ "target": "span.text-slideup-slider",
66
+ "timeline": "document",
67
+ "range": null,
68
+ "duration": 1000
69
+ },
70
+ {
71
+ "target": "span.text-slideup-slider",
72
+ "timeline": "document",
73
+ "range": null,
74
+ "duration": 1000
75
+ },
76
+ {
77
+ "target": "circle.[object SVGAnimatedString]",
78
+ "timeline": "document",
79
+ "range": null,
80
+ "duration": 2500
81
+ },
82
+ {
83
+ "target": "circle.[object SVGAnimatedString]",
84
+ "timeline": "document",
85
+ "range": null,
86
+ "duration": 2500
87
+ },
88
+ {
89
+ "target": "circle.[object SVGAnimatedString]",
90
+ "timeline": "document",
91
+ "range": null,
92
+ "duration": 2500
93
+ },
94
+ {
95
+ "target": "circle.[object SVGAnimatedString]",
96
+ "timeline": "document",
97
+ "range": null,
98
+ "duration": 2500
99
+ },
100
+ {
101
+ "target": "circle.[object SVGAnimatedString]",
102
+ "timeline": "document",
103
+ "range": null,
104
+ "duration": 2500
105
+ },
106
+ {
107
+ "target": "circle.[object SVGAnimatedString]",
108
+ "timeline": "document",
109
+ "range": null,
110
+ "duration": 2500
111
+ },
112
+ {
113
+ "target": "circle.[object SVGAnimatedString]",
114
+ "timeline": "document",
115
+ "range": null,
116
+ "duration": 2500
117
+ },
118
+ {
119
+ "target": "circle.[object SVGAnimatedString]",
120
+ "timeline": "document",
121
+ "range": null,
122
+ "duration": 2500
123
+ },
124
+ {
125
+ "target": "circle.[object SVGAnimatedString]",
126
+ "timeline": "document",
127
+ "range": null,
128
+ "duration": 2500
129
+ },
130
+ {
131
+ "target": "circle.[object SVGAnimatedString]",
132
+ "timeline": "document",
133
+ "range": null,
134
+ "duration": 2500
135
+ },
136
+ {
137
+ "target": "circle.[object SVGAnimatedString]",
138
+ "timeline": "document",
139
+ "range": null,
140
+ "duration": 2500
141
+ },
142
+ {
143
+ "target": "circle.[object SVGAnimatedString]",
144
+ "timeline": "document",
145
+ "range": null,
146
+ "duration": 2500
147
+ },
148
+ {
149
+ "target": "circle.[object SVGAnimatedString]",
150
+ "timeline": "document",
151
+ "range": null,
152
+ "duration": 2500
153
+ },
154
+ {
155
+ "target": "circle.[object SVGAnimatedString]",
156
+ "timeline": "document",
157
+ "range": null,
158
+ "duration": 2500
159
+ },
160
+ {
161
+ "target": "circle.[object SVGAnimatedString]",
162
+ "timeline": "document",
163
+ "range": null,
164
+ "duration": 2500
165
+ },
166
+ {
167
+ "target": "circle.[object SVGAnimatedString]",
168
+ "timeline": "document",
169
+ "range": null,
170
+ "duration": 2500
171
+ },
172
+ {
173
+ "target": "circle.[object SVGAnimatedString]",
174
+ "timeline": "document",
175
+ "range": null,
176
+ "duration": 2500
177
+ },
178
+ {
179
+ "target": "circle.[object SVGAnimatedString]",
180
+ "timeline": "document",
181
+ "range": null,
182
+ "duration": 2500
183
+ },
184
+ {
185
+ "target": "circle.[object SVGAnimatedString]",
186
+ "timeline": "document",
187
+ "range": null,
188
+ "duration": 2500
189
+ },
190
+ {
191
+ "target": "circle.[object SVGAnimatedString]",
192
+ "timeline": "document",
193
+ "range": null,
194
+ "duration": 2500
195
+ },
196
+ {
197
+ "target": "circle.[object SVGAnimatedString]",
198
+ "timeline": "document",
199
+ "range": null,
200
+ "duration": 2500
201
+ },
202
+ {
203
+ "target": "circle.[object SVGAnimatedString]",
204
+ "timeline": "document",
205
+ "range": null,
206
+ "duration": 2500
207
+ },
208
+ {
209
+ "target": "circle.[object SVGAnimatedString]",
210
+ "timeline": "document",
211
+ "range": null,
212
+ "duration": 2500
213
+ },
214
+ {
215
+ "target": "circle.[object SVGAnimatedString]",
216
+ "timeline": "document",
217
+ "range": null,
218
+ "duration": 2500
219
+ },
220
+ {
221
+ "target": "circle.[object SVGAnimatedString]",
222
+ "timeline": "document",
223
+ "range": null,
224
+ "duration": 2500
225
+ },
226
+ {
227
+ "target": "circle.[object SVGAnimatedString]",
228
+ "timeline": "document",
229
+ "range": null,
230
+ "duration": 2500
231
+ },
232
+ {
233
+ "target": "circle.[object SVGAnimatedString]",
234
+ "timeline": "document",
235
+ "range": null,
236
+ "duration": 2500
237
+ },
238
+ {
239
+ "target": "circle.[object SVGAnimatedString]",
240
+ "timeline": "document",
241
+ "range": null,
242
+ "duration": 2500
243
+ }
244
+ ]
245
+ }
246
+ ],
247
+ "screenshots": {
248
+ "390": "screen-390.png",
249
+ "1440": "screen-1440.png"
250
+ }
251
+ }
@@ -0,0 +1,86 @@
1
+ ---
2
+ slug: cthdrl
3
+ title: 'CTHDRL: dark circular-mask creative-studio landing'
4
+ tier: inspiration
5
+ source:
6
+ kind: public-site
7
+ url: https://cthdrl.co/
8
+ license: Captured from the live site; description only, no redistribution of the source.
9
+ captured:
10
+ method: both
11
+ at: '2026-09-16'
12
+ tool: wp-design-library@0.4.0
13
+ captures:
14
+ - method: frames
15
+ input: /home/yojahny/Videos/Screencasts/Screencast_20260916_145447.webm
16
+ artifacts:
17
+ - strip.webp
18
+ frames: 30
19
+ duration_ms: 14968
20
+ - method: both
21
+ input: https://cthdrl.co/
22
+ artifacts:
23
+ - captures/2/strip.webp
24
+ - captures/2/measure.json
25
+ - captures/2/screen-1440.png
26
+ - captures/2/screen-390.png
27
+ media:
28
+ frames: 30
29
+ duration_ms: 14968
30
+ roles: [hero, feature, proof, footer]
31
+ feel: [dark, premium, editorial, minimal, depth, cold]
32
+ palette:
33
+ canvas: '#000000'
34
+ ink: '#e7ded1'
35
+ accent: '#9d3d2e'
36
+ type:
37
+ display: '"NB Akademie", sans-serif'
38
+ body: '"NB Akademie Mono", sans-serif'
39
+ motion:
40
+ devices: [marquee, wipe, pan, reveal, tabs]
41
+ notes: >-
42
+ Eyeballed from 30 sampled recording frames plus a live measurement, not
43
+ measured frame by frame. A small all-caps line in the header moves
44
+ continuously as a marquee. The full-screen work sequence is organised by a
45
+ 0/14-style project counter: thin concentric circles sweep and enlarge across
46
+ the screen as the Terminal project gives way to its interior image, then to
47
+ Jeen-Yuhs and its film frames. The circle is a mask/wipe rather than a
48
+ background decoration, revealing a new image and title beneath it. Project
49
+ labels and "VIEW" cues slide or cut into place, while the media itself pans
50
+ within its crop; the numbered work states behave as a tabbed/slideshow
51
+ sequence. The samples do not establish whether wheel input, clicks, or an
52
+ autoplay timer advances every state.
53
+ ported_from: null
54
+ ---
55
+
56
+ ## What it does
57
+
58
+ CTHDRL frames its work as a compact, full-screen cultural index. An almost-black,
59
+ grainy surface, warm off-white grotesk type and fine circular construction lines
60
+ hold the page together while large project names, film stills and retail imagery
61
+ replace one another inside the same stage. A small 0/14 counter treats the work
62
+ portfolio as a sequence to navigate instead of a feed to browse.
63
+
64
+ ## Section roster
65
+
66
+ hero ("Navigating cultural currents in a digital world" with header marquee and
67
+ project counter), feature (the full-screen work slideshow: Terminal, Jeen-Yuhs
68
+ and further indexed projects), proof (named work and its image/film evidence),
69
+ footer (CTHDRL/Studio mark, Work and Contact routes, and the closing credits).
70
+
71
+ ## Why it works
72
+
73
+ The circular mask turns the project switch into the page's signature device:
74
+ each new case study feels uncovered rather than merely replaced. Restrained type
75
+ and a nearly monochrome palette keep the archival imagery legible, and the small
76
+ counter gives the oversized stage a clear navigation model. Cost to weigh: the
77
+ approach puts every project inside one prescribed rhythm, so weaker imagery or
78
+ too many similar transitions can make the sequence feel uniform.
79
+
80
+ ## Sources
81
+
82
+ - Recording capture (`Screencast_20260916_145447.webm`, 15.0 seconds, 30
83
+ sampled frames): establishes the circular-mask project hand-offs, media pan
84
+ and title/counter changes.
85
+ - Live capture (https://cthdrl.co/): confirms the full-screen 14-work structure,
86
+ the header marquee, and measured canvas, ink and font tokens.
Binary file
@@ -0,0 +1,69 @@
1
+ ---
2
+ slug: dala-craftedbygc
3
+ title: 'Dala: dark particle-field AI-search landing'
4
+ tier: inspiration
5
+ source:
6
+ kind: public-site
7
+ url: https://dala.craftedbygc.com/
8
+ license: Captured from the live site; description only, no redistribution of the source.
9
+ captured:
10
+ method: frames
11
+ at: '2026-09-16'
12
+ tool: wp-design-library@0.3.0
13
+ media:
14
+ frames: 36
15
+ duration_ms: 42533
16
+ roles: [hero, explainer, feature, capability, proof, closing, footer]
17
+ feel: [dark, premium, playful, depth, saas, cold]
18
+ palette:
19
+ canvas: '#000000'
20
+ ink: '#ffffff'
21
+ accent: '#9a9a9a'
22
+ type:
23
+ display: >-
24
+ PPNeueMontreal, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif
25
+ body: >-
26
+ PPNeueMontreal, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif
27
+ motion:
28
+ devices: [reveal, pin, parallax, drift, tabs]
29
+ notes: >-
30
+ Eyeballed from 36 sampled frames, not measured. The hero's dense, colourful
31
+ particle form remains on the dark stage while the opening copy changes, then
32
+ enlarges and resolves into a field of scattered outlined symbols; this reads
33
+ as a pinned hero hand-off with the form and its loose particles moving at
34
+ different apparent depths. The information field continues behind the
35
+ problem copy as small triangles and diamonds drift, while the next large
36
+ form gradually resolves at the right of the "Spark lightbulb moments" story.
37
+ Copy and the objects enter as separate reveals rather than one full-page
38
+ fade. The team panel's paired purple pagination dots and previous/next
39
+ controls indicate tabbed or carousel content. The samples do not establish
40
+ the exact easing or whether the particle system is mouse-reactive.
41
+ ported_from: null
42
+ ---
43
+
44
+ ## What it does
45
+
46
+ Dala presents a workplace-knowledge product as a field of collective signals.
47
+ Instead of product UI, the page uses one black stage filled with floating,
48
+ outlined geometric marks and a changing point-cloud object in yellow, violet,
49
+ teal and white. Large, spare headlines and a compact purple request-access
50
+ button give the dense particle art room to carry the story.
51
+
52
+ ## Section roster
53
+
54
+ hero ("Unlock collective wisdom" and the large particle form), explainer
55
+ (decision-making promise and the workplace-information problem), feature
56
+ (scattered knowledge field and the "Spark lightbulb moments" form), capability
57
+ ("Build a better world of work" narrative), proof (team profile carousel and
58
+ investor logos), closing (answer-led request-access prompt with the small final
59
+ form), footer (Seedcamp mark, legal links and social navigation).
60
+
61
+ ## Why it works
62
+
63
+ One visual language turns an abstract idea—knowledge spread across people and
64
+ systems—into something physical: fragments disperse, gather and become useful
65
+ shape. The narrow palette keeps the animated field from reading as decoration,
66
+ and repeated black space makes each text hand-off feel deliberate. Proof appears
67
+ late, after the product story has created the premise for it. Cost to weigh: the
68
+ particle treatment needs strong art direction and careful performance work; a
69
+ cheap or noisy version would overwhelm the concise copy.