@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,206 @@
1
+ {
2
+ "url": "https://dock.us/",
3
+ "at": "2026-09-16",
4
+ "viewport": [
5
+ 1440,
6
+ 390
7
+ ],
8
+ "tokens": {
9
+ "canvas": "#ffffff",
10
+ "ink": "#121722",
11
+ "accent": "#0068f9",
12
+ "fontDisplay": "Roobert, sans-serif",
13
+ "fontBody": "Roobert, sans-serif"
14
+ },
15
+ "sections": [
16
+ {
17
+ "index": 0,
18
+ "tag": "header",
19
+ "id": "",
20
+ "class": "nav--bound",
21
+ "top": 70,
22
+ "height": 0,
23
+ "animations": []
24
+ },
25
+ {
26
+ "index": 1,
27
+ "tag": "section",
28
+ "id": "",
29
+ "class": "section-10",
30
+ "top": 70,
31
+ "height": 850,
32
+ "animations": [
33
+ {
34
+ "target": "span.deal-cur deal-cur--cfo is-click",
35
+ "timeline": "document",
36
+ "range": null,
37
+ "duration": 650
38
+ },
39
+ {
40
+ "target": "span.deal-cur deal-cur--cfo is-click",
41
+ "timeline": "document",
42
+ "range": null,
43
+ "duration": 650
44
+ },
45
+ {
46
+ "target": "span.deal-cur deal-cur--ceo is-on",
47
+ "timeline": "document",
48
+ "range": null,
49
+ "duration": 720
50
+ },
51
+ {
52
+ "target": "div.slack-note slack-in",
53
+ "timeline": "document",
54
+ "range": null,
55
+ "duration": 320
56
+ }
57
+ ]
58
+ },
59
+ {
60
+ "index": 2,
61
+ "tag": "section",
62
+ "id": "",
63
+ "class": "_w-full header--bg hide",
64
+ "top": 0,
65
+ "height": 0,
66
+ "animations": []
67
+ },
68
+ {
69
+ "index": 3,
70
+ "tag": "section",
71
+ "id": "",
72
+ "class": "_w-container s-cs--wrapper",
73
+ "top": 960,
74
+ "height": 589,
75
+ "animations": []
76
+ },
77
+ {
78
+ "index": 4,
79
+ "tag": "section",
80
+ "id": "",
81
+ "class": "_w-container",
82
+ "top": 1629,
83
+ "height": 3266,
84
+ "animations": [
85
+ {
86
+ "target": "div.tabs--tab",
87
+ "timeline": "document",
88
+ "range": null,
89
+ "duration": 300
90
+ },
91
+ {
92
+ "target": "div.tabs--tab is--active",
93
+ "timeline": "document",
94
+ "range": null,
95
+ "duration": 300
96
+ },
97
+ {
98
+ "target": "div.feature--documents--sidebar--item",
99
+ "timeline": "document",
100
+ "range": null,
101
+ "duration": 300
102
+ },
103
+ {
104
+ "target": "div.feature--documents--sidebar--item is--active",
105
+ "timeline": "document",
106
+ "range": null,
107
+ "duration": 300
108
+ },
109
+ {
110
+ "target": "svg.[object SVGAnimatedString]",
111
+ "timeline": "document",
112
+ "range": null,
113
+ "duration": 2500
114
+ },
115
+ {
116
+ "target": "div.flicker",
117
+ "timeline": "document",
118
+ "range": null,
119
+ "duration": 1000
120
+ },
121
+ {
122
+ "target": "div.progress--bar--indicator",
123
+ "timeline": "document",
124
+ "range": null,
125
+ "duration": 5000
126
+ }
127
+ ]
128
+ },
129
+ {
130
+ "index": 5,
131
+ "tag": "section",
132
+ "id": "",
133
+ "class": "_w-container s-playbook--wrapper",
134
+ "top": 4965,
135
+ "height": 829,
136
+ "animations": []
137
+ },
138
+ {
139
+ "index": 6,
140
+ "tag": "section",
141
+ "id": "",
142
+ "class": "_w-container s-playbook--wrapper",
143
+ "top": 5944,
144
+ "height": 700,
145
+ "animations": []
146
+ },
147
+ {
148
+ "index": 7,
149
+ "tag": "section",
150
+ "id": "",
151
+ "class": "_w-container s-pipeline--wrapper",
152
+ "top": 6724,
153
+ "height": 885,
154
+ "animations": []
155
+ },
156
+ {
157
+ "index": 8,
158
+ "tag": "section",
159
+ "id": "",
160
+ "class": "_w-container s-integrations--wrapper",
161
+ "top": 9920,
162
+ "height": 793,
163
+ "animations": []
164
+ },
165
+ {
166
+ "index": 9,
167
+ "tag": "section",
168
+ "id": "",
169
+ "class": "_w-container s-security--wrapper",
170
+ "top": 10863,
171
+ "height": 740,
172
+ "animations": []
173
+ },
174
+ {
175
+ "index": 10,
176
+ "tag": "section",
177
+ "id": "",
178
+ "class": "_w-container s-get_started--wrapper",
179
+ "top": 11683,
180
+ "height": 553,
181
+ "animations": []
182
+ },
183
+ {
184
+ "index": 11,
185
+ "tag": "section",
186
+ "id": "",
187
+ "class": "_w-container c-call_to_action",
188
+ "top": 12316,
189
+ "height": 482,
190
+ "animations": []
191
+ },
192
+ {
193
+ "index": 12,
194
+ "tag": "section",
195
+ "id": "",
196
+ "class": "_w-container c-footer",
197
+ "top": 12878,
198
+ "height": 334,
199
+ "animations": []
200
+ }
201
+ ],
202
+ "screenshots": {
203
+ "390": "screen-390.png",
204
+ "1440": "screen-1440.png"
205
+ }
206
+ }
@@ -0,0 +1,62 @@
1
+ ---
2
+ slug: dock
3
+ title: 'Dock: revenue enablement platform'
4
+ tier: inspiration
5
+ source:
6
+ kind: public-site
7
+ url: https://dock.us/
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/dock-refero.mp4
16
+ artifacts:
17
+ - strip.webp
18
+ frames: 36
19
+ duration_ms: 21750
20
+ - method: both
21
+ input: https://dock.us/
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: 21750
30
+ roles: [hero, capability, proof, feature]
31
+ feel: [light, saas, premium, depth, cold]
32
+ palette:
33
+ canvas: '#ffffff'
34
+ ink: '#121722'
35
+ accent: '#0068f9'
36
+ type:
37
+ display: Roobert, sans-serif
38
+ body: Roobert, sans-serif
39
+ motion:
40
+ devices: [reveal, pan]
41
+ notes: Eyeballed from 36 sampled frames, not measured. The hero introduces a deal-room interface, then the recording pans through success criteria, next steps, and collaborative message states. Individual interactions are not visible.
42
+ ported_from: null
43
+ ---
44
+
45
+ ## What it does
46
+
47
+ Dock presents a revenue-enablement workspace for buyers and sellers to collaborate around a deal.
48
+
49
+ ## Section roster
50
+
51
+ 1. Hero with the revenue-enablement promise and an active deal room.
52
+ 2. Success criteria and next-step interface view.
53
+ 3. Customer outcomes and proof metrics.
54
+ 4. Collaborative message and content views.
55
+
56
+ ## Why it works
57
+
58
+ The page moves from a simple value statement into a specific shared workspace, so the product is understandable before the proof metrics appear. The very light visual system makes the blue edge treatment do much of the brand work.
59
+
60
+ ## Sources
61
+
62
+ The Refero MP4 supplies the sampled motion sequence. The live capture at https://dock.us/ supplies the current site URL and layout reference.
Binary file
@@ -0,0 +1,37 @@
1
+ {
2
+ "url": "https://dub.co/",
3
+ "at": "2026-09-16",
4
+ "viewport": [
5
+ 1440,
6
+ 390
7
+ ],
8
+ "tokens": {
9
+ "canvas": "#fafafa",
10
+ "ink": "#0a0a0a",
11
+ "accent": "#737373",
12
+ "fontDisplay": "satoshi, \"satoshi Fallback\", system-ui, sans-serif",
13
+ "fontBody": "Inter, \"Inter Fallback\", system-ui, sans-serif"
14
+ },
15
+ "sections": [
16
+ {
17
+ "index": 0,
18
+ "tag": "footer",
19
+ "id": "",
20
+ "class": "",
21
+ "top": 11719,
22
+ "height": 402,
23
+ "animations": [
24
+ {
25
+ "target": "div.absolute inset-0 m-auto size-2 animate-ping items-center justify-center rounded-full group-hover:animate-none bg-green-500",
26
+ "timeline": "document",
27
+ "range": null,
28
+ "duration": 1000
29
+ }
30
+ ]
31
+ }
32
+ ],
33
+ "screenshots": {
34
+ "390": "screen-390.png",
35
+ "1440": "screen-1440.png"
36
+ }
37
+ }
@@ -0,0 +1,61 @@
1
+ ---
2
+ slug: dub
3
+ title: 'Dub: affiliate management platform'
4
+ tier: inspiration
5
+ source:
6
+ kind: public-site
7
+ url: https://dub.co/
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/dub-refero.mp4
16
+ artifacts:
17
+ - strip.webp
18
+ frames: 36
19
+ duration_ms: 40983
20
+ - method: both
21
+ input: https://dub.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: 36
29
+ duration_ms: 40983
30
+ roles: [hero, feature, proof]
31
+ feel: [light, saas, minimal, cold, depth]
32
+ palette:
33
+ canvas: '#fafafa'
34
+ ink: '#0a0a0a'
35
+ accent: '#737373'
36
+ type:
37
+ display: satoshi, "satoshi Fallback", system-ui, sans-serif
38
+ body: Inter, "Inter Fallback", system-ui, sans-serif
39
+ motion:
40
+ devices: [reveal, pan]
41
+ notes: Eyeballed from 36 sampled frames, not measured. The partner-program dashboard enters as a central product scene, then the recording changes through overview and payout states while the surrounding hero stays sparse; individual interface triggers are not visible.
42
+ ported_from: null
43
+ ---
44
+
45
+ ## What it does
46
+
47
+ Dub presents a platform for affiliate programs, conversion analytics, and short links.
48
+
49
+ ## Section roster
50
+
51
+ 1. Product-led hero with a central partner-program dashboard.
52
+ 2. Overview and payout interface states.
53
+ 3. Customer-logo proof field.
54
+
55
+ ## Why it works
56
+
57
+ The generous near-white surface puts all attention on the product screen, making a complex administrative interface feel calm and credible. Its sparse composition offers little narrative context until the interface changes.
58
+
59
+ ## Sources
60
+
61
+ The Refero MP4 supplies the sampled motion sequence. The live capture at https://dub.co/ supplies the current site URL and layout reference.
Binary file
@@ -0,0 +1,138 @@
1
+ {
2
+ "url": "https://duolingo.com/",
3
+ "at": "2026-09-16",
4
+ "viewport": [
5
+ 1440,
6
+ 390
7
+ ],
8
+ "tokens": {
9
+ "canvas": "#ffffff",
10
+ "ink": "#3c3c3c",
11
+ "accent": "#a5ed6e",
12
+ "fontDisplay": "duolingo-sans, sans-serif",
13
+ "fontBody": "duolingo-sans, sans-serif"
14
+ },
15
+ "sections": [
16
+ {
17
+ "index": 0,
18
+ "tag": "header",
19
+ "id": "",
20
+ "class": "_39290",
21
+ "top": 0,
22
+ "height": 900,
23
+ "animations": []
24
+ },
25
+ {
26
+ "index": 1,
27
+ "tag": "div",
28
+ "id": "",
29
+ "class": "_2huhH",
30
+ "top": 900,
31
+ "height": 3601,
32
+ "animations": []
33
+ },
34
+ {
35
+ "index": 2,
36
+ "tag": "section",
37
+ "id": "",
38
+ "class": "uU0-M",
39
+ "top": 900,
40
+ "height": 2312,
41
+ "animations": []
42
+ },
43
+ {
44
+ "index": 3,
45
+ "tag": "section",
46
+ "id": "",
47
+ "class": "_3k9io",
48
+ "top": 996,
49
+ "height": 530,
50
+ "animations": []
51
+ },
52
+ {
53
+ "index": 4,
54
+ "tag": "section",
55
+ "id": "",
56
+ "class": "_36L7f _3k9io",
57
+ "top": 1526,
58
+ "height": 530,
59
+ "animations": []
60
+ },
61
+ {
62
+ "index": 5,
63
+ "tag": "section",
64
+ "id": "",
65
+ "class": "_3k9io",
66
+ "top": 2056,
67
+ "height": 530,
68
+ "animations": []
69
+ },
70
+ {
71
+ "index": 6,
72
+ "tag": "section",
73
+ "id": "",
74
+ "class": "_36L7f _3k9io",
75
+ "top": 2586,
76
+ "height": 530,
77
+ "animations": []
78
+ },
79
+ {
80
+ "index": 7,
81
+ "tag": "section",
82
+ "id": "",
83
+ "class": "Gijhh",
84
+ "top": 3212,
85
+ "height": 1289,
86
+ "animations": []
87
+ },
88
+ {
89
+ "index": 8,
90
+ "tag": "section",
91
+ "id": "",
92
+ "class": "LlPOq",
93
+ "top": 4501,
94
+ "height": 900,
95
+ "animations": []
96
+ },
97
+ {
98
+ "index": 9,
99
+ "tag": "section",
100
+ "id": "",
101
+ "class": "_3dG3I",
102
+ "top": 5401,
103
+ "height": 722,
104
+ "animations": []
105
+ },
106
+ {
107
+ "index": 10,
108
+ "tag": "section",
109
+ "id": "",
110
+ "class": "_3k9io",
111
+ "top": 5497,
112
+ "height": 530,
113
+ "animations": []
114
+ },
115
+ {
116
+ "index": 11,
117
+ "tag": "section",
118
+ "id": "",
119
+ "class": "F71XF",
120
+ "top": 6123,
121
+ "height": 853,
122
+ "animations": []
123
+ },
124
+ {
125
+ "index": 12,
126
+ "tag": "footer",
127
+ "id": "",
128
+ "class": "_1nNuk",
129
+ "top": 6976,
130
+ "height": 827,
131
+ "animations": []
132
+ }
133
+ ],
134
+ "screenshots": {
135
+ "390": "screen-390.png",
136
+ "1440": "screen-1440.png"
137
+ }
138
+ }
@@ -0,0 +1,65 @@
1
+ ---
2
+ slug: duolingo
3
+ title: 'Duolingo: playful language-learning landing'
4
+ tier: inspiration
5
+ source:
6
+ kind: public-site
7
+ url: https://duolingo.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/duolingo-refero.mp4
16
+ artifacts:
17
+ - strip.webp
18
+ frames: 36
19
+ duration_ms: 37617
20
+ - method: both
21
+ input: https://duolingo.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: 37617
30
+ roles: [hero, explainer, capability, feature, offer, closing, footer]
31
+ feel: [light, playful, minimal, warm]
32
+ palette:
33
+ canvas: '#ffffff'
34
+ ink: '#3c3c3c'
35
+ accent: '#a5ed6e'
36
+ type:
37
+ display: duolingo-sans, sans-serif
38
+ body: duolingo-sans, sans-serif
39
+ motion:
40
+ devices: [reveal, pan, drift, stagger]
41
+ notes: 'The Refero recording moves in distinct illustrated chapters: character groups and phones enter as a composition, the light-blue app chapter expands around floating icons and devices, and the deep-indigo Super Duolingo panel resets the pace before the closing offer. Objects appear to drift at different speeds while copy and illustration arrive as staged groups. The live capture confirms the same chapter sequence and composition, but no CSS animation inventory or interaction trigger was exposed.'
42
+ ported_from: null
43
+ ---
44
+
45
+ ## What it does
46
+
47
+ Duolingo introduces language learning through a bright, illustration-led product story. It pairs simple benefits with expressive characters, small device scenes, a premium-plan interruption, test and school offers, then a large green conversion close.
48
+
49
+ ## Section roster
50
+
51
+ 1. Minimal header, language selector, and a hero with a character cluster, short promise, and two actions.
52
+ 2. “Free. fun. effective.” overview with a phone and progress illustration.
53
+ 3. Science, motivation, and personalized-learning chapters, each paired with a distinct character vignette.
54
+ 4. Pale-blue “learn anytime, anywhere” app/download scene with phones and floating icons.
55
+ 5. Deep-indigo Super Duolingo offer break.
56
+ 6. English-test, schools, and ABC product offers.
57
+ 7. Large green language-learning close and an extensive multi-column footer.
58
+
59
+ ## Why it works
60
+
61
+ The page makes an education product feel low-pressure by keeping each idea to a short, friendly headline and one memorable illustration. White space gives the saturated green room to work as the action color, while the pale-blue and indigo chapters make the long page easy to navigate. The repeated mascot world gives many product offers one coherent voice.
62
+
63
+ ## Sources
64
+
65
+ The Refero Styles page supplied the 37.62-second MP4 at https://images.refero.design/styles/refero.design/video/b8a0d888-eae3-45f1-9ef1-dc4e56c66aef.mp4. It provides the longer illustrated sequence, chapter hand-offs, and Super Duolingo treatment. The live capture at https://duolingo.com/ records the current desktop and mobile layouts, measured Duolingo Sans stack and color tokens, plus the current navigation and footer. Both sources show the same core marketing structure.
Binary file