@mthanh/vespercli 2.2.1 → 2.3.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 (157) hide show
  1. package/README.md +3 -2
  2. package/assets/CATALOG.md +9 -2
  3. package/assets/claude/.claude-plugin/marketplace.json +9 -9
  4. package/assets/claude/.claude-plugin/plugin.json +1 -1
  5. package/assets/claude/agents/code-planner.md +1 -1
  6. package/assets/claude/agents/code-reviewer.md +1 -1
  7. package/assets/claude/agents/code-tester.md +1 -1
  8. package/assets/claude/agents/copywriter.md +1 -1
  9. package/assets/claude/agents/feature-wrap-document.md +1 -1
  10. package/assets/claude/agents/janitor.md +1 -1
  11. package/assets/claude/agents/modernization.md +1 -1
  12. package/assets/claude/agents/principal-software-engineer.md +1 -1
  13. package/assets/claude/agents/refine-issue.md +1 -1
  14. package/assets/claude/agents/se-system-architecture-reviewer.md +1 -1
  15. package/assets/claude/agents/se-technical-writer.md +1 -1
  16. package/assets/claude/agents/skill-creator.md +1 -1
  17. package/assets/claude/agents/task-researcher.md +1 -1
  18. package/assets/claude/agents/technical-product-manager.md +1 -1
  19. package/assets/claude/agents/vision-analyst.md +1 -1
  20. package/assets/claude/agents/vitest.md +1 -1
  21. package/assets/claude/agents/workspace-learner.md +2 -2
  22. package/assets/claude/packs/backend/.claude-plugin/plugin.json +1 -1
  23. package/assets/claude/packs/backend/agents/firebase-developer.md +1 -1
  24. package/assets/claude/packs/backend/agents/nodejs-express-developer.md +1 -1
  25. package/assets/claude/packs/docs/.claude-plugin/plugin.json +1 -1
  26. package/assets/claude/packs/frontend/.claude-plugin/plugin.json +1 -1
  27. package/assets/claude/packs/frontend/agents/expert-nextjs-developer.md +1 -1
  28. package/assets/claude/packs/frontend/agents/expert-react-frontend-engineer.md +1 -1
  29. package/assets/claude/packs/frontend/agents/jest-react-component-analyzer.md +1 -1
  30. package/assets/claude/packs/frontend/agents/jest-react-scenario-scanner.md +1 -1
  31. package/assets/claude/packs/frontend/agents/jest-react-test-generator.md +1 -1
  32. package/assets/claude/packs/frontend/agents/jest-react-test-planner.md +1 -1
  33. package/assets/claude/packs/frontend/skills/design-taste-frontend/LICENSE +21 -0
  34. package/assets/claude/packs/frontend/skills/design-taste-frontend/SKILL.md +529 -0
  35. package/assets/claude/packs/frontend/skills/design-taste-frontend/UPSTREAM.json +7 -0
  36. package/assets/claude/packs/frontend/skills/design-taste-frontend/assets/app.css +216 -0
  37. package/assets/claude/packs/frontend/skills/design-taste-frontend/assets/base.css +105 -0
  38. package/assets/claude/packs/frontend/skills/design-taste-frontend/assets/base.js +37 -0
  39. package/assets/claude/packs/frontend/skills/design-taste-frontend/assets/charts.js +617 -0
  40. package/assets/claude/packs/frontend/skills/design-taste-frontend/assets/scenes/stage.css +28 -0
  41. package/assets/claude/packs/frontend/skills/design-taste-frontend/assets/scenes/stage.js +133 -0
  42. package/assets/claude/packs/frontend/skills/design-taste-frontend/evals/evals.json +76 -0
  43. package/assets/claude/packs/frontend/skills/design-taste-frontend/library/app.json +1327 -0
  44. package/assets/claude/packs/frontend/skills/design-taste-frontend/library/directions.json +1078 -0
  45. package/assets/claude/packs/frontend/skills/design-taste-frontend/library/heroes.json +1086 -0
  46. package/assets/claude/packs/frontend/skills/design-taste-frontend/library/motions.json +92 -0
  47. package/assets/claude/packs/frontend/skills/design-taste-frontend/library/palettes.json +1485 -0
  48. package/assets/claude/packs/frontend/skills/design-taste-frontend/library/photos.json +7240 -0
  49. package/assets/claude/packs/frontend/skills/design-taste-frontend/library/sections.json +4429 -0
  50. package/assets/claude/packs/frontend/skills/design-taste-frontend/library/sites.json +8350 -0
  51. package/assets/claude/packs/frontend/skills/design-taste-frontend/library/type.json +2024 -0
  52. package/assets/claude/packs/frontend/skills/design-taste-frontend/references/app-screens.md +1199 -0
  53. package/assets/claude/packs/frontend/skills/design-taste-frontend/references/colour.md +141 -0
  54. package/assets/claude/packs/frontend/skills/design-taste-frontend/references/copy.md +177 -0
  55. package/assets/claude/packs/frontend/skills/design-taste-frontend/references/critique.md +182 -0
  56. package/assets/claude/packs/frontend/skills/design-taste-frontend/references/imagery.md +791 -0
  57. package/assets/claude/packs/frontend/skills/design-taste-frontend/references/layout.md +292 -0
  58. package/assets/claude/packs/frontend/skills/design-taste-frontend/references/motion.md +980 -0
  59. package/assets/claude/packs/frontend/skills/design-taste-frontend/references/research.md +356 -0
  60. package/assets/claude/packs/frontend/skills/design-taste-frontend/references/scenes.md +174 -0
  61. package/assets/claude/packs/frontend/skills/design-taste-frontend/references/tells.md +115 -0
  62. package/assets/claude/packs/frontend/skills/design-taste-frontend/references/type.md +170 -0
  63. package/assets/claude/packs/frontend/skills/design-taste-frontend/scripts/assets.mjs +865 -0
  64. package/assets/claude/packs/frontend/skills/design-taste-frontend/scripts/draw.mjs +584 -0
  65. package/assets/claude/packs/frontend/skills/design-taste-frontend/scripts/inspect.mjs +303 -0
  66. package/assets/claude/packs/frontend/skills/design-taste-frontend/scripts/lib/app-draw.mjs +203 -0
  67. package/assets/claude/packs/frontend/skills/design-taste-frontend/scripts/lib/cdp.mjs +248 -0
  68. package/assets/claude/packs/frontend/skills/design-taste-frontend/scripts/lib/probe.mjs +909 -0
  69. package/assets/claude/packs/frontend/skills/design-taste-frontend/scripts/lib/rules.mjs +243 -0
  70. package/assets/claude/packs/frontend/skills/design-taste-frontend/scripts/lint.mjs +119 -0
  71. package/assets/claude/packs/frontend/skills/design-taste-frontend/scripts/scenes.mjs +124 -0
  72. package/assets/claude/packs/graphify/.claude-plugin/plugin.json +1 -1
  73. package/assets/claude/packs/integrations/.claude-plugin/plugin.json +1 -1
  74. package/assets/claude/packs/playwright/.claude-plugin/plugin.json +1 -1
  75. package/assets/claude/packs/playwright/agents/playwright-component-analyzer.md +1 -1
  76. package/assets/claude/packs/playwright/agents/playwright-scenario-scanner.md +1 -1
  77. package/assets/claude/packs/playwright/agents/playwright-test-generator.md +1 -1
  78. package/assets/claude/packs/playwright/agents/playwright-test-planner.md +1 -1
  79. package/assets/claude/packs/playwright/agents/playwright-tester.md +1 -1
  80. package/assets/claude/packs/polyglot/.claude-plugin/plugin.json +1 -1
  81. package/assets/claude/packs/styles/.claude-plugin/plugin.json +1 -1
  82. package/assets/copilot/agents/code-planner.agent.md +1 -1
  83. package/assets/copilot/agents/code-reviewer.agent.md +1 -1
  84. package/assets/copilot/agents/code-tester.agent.md +1 -1
  85. package/assets/copilot/agents/copywriter.agent.md +1 -1
  86. package/assets/copilot/agents/feature-wrap-document.agent.md +1 -1
  87. package/assets/copilot/agents/janitor.agent.md +1 -1
  88. package/assets/copilot/agents/modernization.agent.md +1 -1
  89. package/assets/copilot/agents/principal-software-engineer.agent.md +1 -1
  90. package/assets/copilot/agents/refine-issue.agent.md +1 -1
  91. package/assets/copilot/agents/se-system-architecture-reviewer.agent.md +1 -1
  92. package/assets/copilot/agents/se-technical-writer.agent.md +1 -1
  93. package/assets/copilot/agents/skill-creator.agent.md +1 -1
  94. package/assets/copilot/agents/task-researcher.agent.md +1 -1
  95. package/assets/copilot/agents/technical-product-manager.agent.md +1 -1
  96. package/assets/copilot/agents/vision-analyst.agent.md +1 -1
  97. package/assets/copilot/agents/vitest.agent.md +1 -1
  98. package/assets/copilot/agents/workspace-learner.agent.md +2 -2
  99. package/assets/copilot/packs/backend/agents/firebase-developer.agent.md +1 -1
  100. package/assets/copilot/packs/backend/agents/nodejs-express-developer.agent.md +1 -1
  101. package/assets/copilot/packs/frontend/agents/expert-nextjs-developer.agent.md +1 -1
  102. package/assets/copilot/packs/frontend/agents/expert-react-frontend-engineer.agent.md +1 -1
  103. package/assets/copilot/packs/frontend/agents/jest-react-component-analyzer.agent.md +1 -1
  104. package/assets/copilot/packs/frontend/agents/jest-react-scenario-scanner.agent.md +1 -1
  105. package/assets/copilot/packs/frontend/agents/jest-react-test-generator.agent.md +1 -1
  106. package/assets/copilot/packs/frontend/agents/jest-react-test-planner.agent.md +1 -1
  107. package/assets/copilot/packs/frontend/skills/design-taste-frontend/LICENSE +21 -0
  108. package/assets/copilot/packs/frontend/skills/design-taste-frontend/SKILL.md +529 -0
  109. package/assets/copilot/packs/frontend/skills/design-taste-frontend/UPSTREAM.json +7 -0
  110. package/assets/copilot/packs/frontend/skills/design-taste-frontend/assets/app.css +216 -0
  111. package/assets/copilot/packs/frontend/skills/design-taste-frontend/assets/base.css +105 -0
  112. package/assets/copilot/packs/frontend/skills/design-taste-frontend/assets/base.js +37 -0
  113. package/assets/copilot/packs/frontend/skills/design-taste-frontend/assets/charts.js +617 -0
  114. package/assets/copilot/packs/frontend/skills/design-taste-frontend/assets/scenes/stage.css +28 -0
  115. package/assets/copilot/packs/frontend/skills/design-taste-frontend/assets/scenes/stage.js +133 -0
  116. package/assets/copilot/packs/frontend/skills/design-taste-frontend/evals/evals.json +76 -0
  117. package/assets/copilot/packs/frontend/skills/design-taste-frontend/library/app.json +1327 -0
  118. package/assets/copilot/packs/frontend/skills/design-taste-frontend/library/directions.json +1078 -0
  119. package/assets/copilot/packs/frontend/skills/design-taste-frontend/library/heroes.json +1086 -0
  120. package/assets/copilot/packs/frontend/skills/design-taste-frontend/library/motions.json +92 -0
  121. package/assets/copilot/packs/frontend/skills/design-taste-frontend/library/palettes.json +1485 -0
  122. package/assets/copilot/packs/frontend/skills/design-taste-frontend/library/photos.json +7240 -0
  123. package/assets/copilot/packs/frontend/skills/design-taste-frontend/library/sections.json +4429 -0
  124. package/assets/copilot/packs/frontend/skills/design-taste-frontend/library/sites.json +8350 -0
  125. package/assets/copilot/packs/frontend/skills/design-taste-frontend/library/type.json +2024 -0
  126. package/assets/copilot/packs/frontend/skills/design-taste-frontend/references/app-screens.md +1199 -0
  127. package/assets/copilot/packs/frontend/skills/design-taste-frontend/references/colour.md +141 -0
  128. package/assets/copilot/packs/frontend/skills/design-taste-frontend/references/copy.md +177 -0
  129. package/assets/copilot/packs/frontend/skills/design-taste-frontend/references/critique.md +182 -0
  130. package/assets/copilot/packs/frontend/skills/design-taste-frontend/references/imagery.md +791 -0
  131. package/assets/copilot/packs/frontend/skills/design-taste-frontend/references/layout.md +292 -0
  132. package/assets/copilot/packs/frontend/skills/design-taste-frontend/references/motion.md +980 -0
  133. package/assets/copilot/packs/frontend/skills/design-taste-frontend/references/research.md +356 -0
  134. package/assets/copilot/packs/frontend/skills/design-taste-frontend/references/scenes.md +174 -0
  135. package/assets/copilot/packs/frontend/skills/design-taste-frontend/references/tells.md +115 -0
  136. package/assets/copilot/packs/frontend/skills/design-taste-frontend/references/type.md +170 -0
  137. package/assets/copilot/packs/frontend/skills/design-taste-frontend/scripts/assets.mjs +865 -0
  138. package/assets/copilot/packs/frontend/skills/design-taste-frontend/scripts/draw.mjs +584 -0
  139. package/assets/copilot/packs/frontend/skills/design-taste-frontend/scripts/inspect.mjs +303 -0
  140. package/assets/copilot/packs/frontend/skills/design-taste-frontend/scripts/lib/app-draw.mjs +203 -0
  141. package/assets/copilot/packs/frontend/skills/design-taste-frontend/scripts/lib/cdp.mjs +248 -0
  142. package/assets/copilot/packs/frontend/skills/design-taste-frontend/scripts/lib/probe.mjs +909 -0
  143. package/assets/copilot/packs/frontend/skills/design-taste-frontend/scripts/lib/rules.mjs +243 -0
  144. package/assets/copilot/packs/frontend/skills/design-taste-frontend/scripts/lint.mjs +119 -0
  145. package/assets/copilot/packs/frontend/skills/design-taste-frontend/scripts/scenes.mjs +124 -0
  146. package/assets/copilot/packs/playwright/agents/playwright-component-analyzer.agent.md +1 -1
  147. package/assets/copilot/packs/playwright/agents/playwright-scenario-scanner.agent.md +1 -1
  148. package/assets/copilot/packs/playwright/agents/playwright-test-generator.agent.md +1 -1
  149. package/assets/copilot/packs/playwright/agents/playwright-test-planner.agent.md +1 -1
  150. package/assets/copilot/packs/playwright/agents/playwright-tester.agent.md +1 -1
  151. package/assets/manifest.json +2 -0
  152. package/dist/cli.min.js +102 -102
  153. package/package.json +1 -1
  154. package/scripts/__snapshots__/generate-claude-assets.test.js.snap +1 -1
  155. package/scripts/generate-claude-assets.strict.test.js +1 -1
  156. package/scripts/generate-claude-assets.test.js +6 -6
  157. package/scripts/packs-layout.test.js +2 -1
@@ -0,0 +1,356 @@
1
+ # The study
2
+
3
+ Everything numeric in this skill comes from here. Cite these figures; do not round them up or invent
4
+ others.
5
+
6
+ ## Contents
7
+
8
+ 1. Method and its limits
9
+ 2. Scores
10
+ 3. Where the idea comes from
11
+ 4. Headlines
12
+ 5. Type
13
+ 6. Devices: what separates strong from weak, and what does not
14
+ 7. Colour and shape
15
+ 8. Imagery and page structure
16
+ 9. What the inspector says about the gallery itself
17
+ 10. The 25 highest-scored sites and their ideas
18
+ 11. How the skill was tested
19
+ 12. The October 2026 study: 100 Sites of the Day
20
+ 13. The app-screen study
21
+
22
+ ## 1. Method and its limits
23
+
24
+ - **Sample.** 248 sites collected on 5 October 2026: 156 from One Page Love (the latest gallery pages
25
+ and the category listings) and 92 Awwwards Sites of the Day (the three most recent listing pages).
26
+ 247 loaded; 246 were re-measured with the final probe.
27
+ - **Capture.** Headless Chrome at 1440×900 and 390×844. For each site: the first viewport, five more
28
+ frames while scrolling with real wheel input, the mobile first viewport, and a measurement pass in
29
+ the page (computed styles, text geometry, colours, fonts actually loaded).
30
+ - **Panel.** 21 model reviewers each studied about 12 sites from the screenshots and the measurements,
31
+ described them (idea, hero, type, colour, imagery, layout, sections) and scored them the Awwwards
32
+ way: design 40%, usability 30%, creativity 20%, content 10%. These are model judgements from still
33
+ frames, not human jurors and not the real Awwwards scores. Batches mixed both sources so each
34
+ reviewer saw a spread.
35
+ - **Usable sets.** 235 sites were usable for the panel (12 showed only a preloader, an entry gate or a
36
+ bot wall). 202 were measurable for typography (a page with at least 25 words and a detectable
37
+ headline). "Top" below means panel score 7.5 or higher (82 measurable sites); "weak" means under 6.5
38
+ (23 measurable sites).
39
+ - **Limits.** One capture per site on one day. Some heroes were caught mid-animation or behind a cookie
40
+ notice. WebGL-heavy sites are under-described by text measurements. The eyebrow detector counts any
41
+ small short label directly above a large heading, so it over-counts against the panel's stricter
42
+ reading (60% measured against 35% observed). Motion was inferred from frames, not watched. The sample
43
+ is whatever the two galleries had recently featured; it is fashion as much as quality.
44
+
45
+ ## 2. Scores
46
+
47
+ | | All 235 | One Page Love (151) | Awwwards (84) |
48
+ | --- | --- | --- | --- |
49
+ | Median overall | 7.2 | 7.1 | 7.5 |
50
+ | Middle half | 6.8–7.6 | | |
51
+ | 8.0 or higher | 25 sites (11%) | | |
52
+ | 7.5 or higher | 90 sites (38%) | | |
53
+ | Under 6.5 | 29 sites | | |
54
+
55
+ Median by criterion: design 8, usability 7, creativity 7, content 7. Among the top 25: design 9,
56
+ usability 7, creativity 8, content 8. Usability is the one line that does not rise with the rest: the
57
+ best sites are no easier to use than the average one. Do not copy their gates, preloaders, tiny text
58
+ or hidden navigation.
59
+
60
+ ## 3. Where the idea comes from
61
+
62
+ The clearest pattern in the panel's notes: high scores go with a concept taken from the subject, and
63
+ low scores go with its absence. The weakest entries' ideas were recorded in words like "none beyond the
64
+ standard dark SaaS launch formula", "no visual idea beyond clarity", "no strong idea". The strongest
65
+ were sentences only that subject could own (section 10).
66
+
67
+ Recurring engines among the 7.3+ sites, each the basis of a direction in the library:
68
+
69
+ - **The product demonstrates itself.** A colour picker's loupe reads the page's own background; a list
70
+ tool is sold with tiny working lists; a photo app's page is a wall of its own output.
71
+ - **The page is an artefact from the subject's world.** A wedding site that is the invitation; an
72
+ archive as tabbed folders; a coupon with a cut line; a portfolio as a contact sheet.
73
+ - **The name is the hero.** Wordmarks as wide as the screen, a photograph set inside the name like a
74
+ letter, a name split to opposite corners with the page between.
75
+ - **One motif from the subject drives everything.** A tool's octagonal section as button, mask and
76
+ loader; two circles for two accounts; a café's stripes.
77
+ - **Dressed as another category.** A money app as a streetwear drop; an industrial roaster as a design
78
+ object; a parcel service as a fairground.
79
+ - **The place carries it.** One full-bleed view and a name along the bottom edge.
80
+ - **A fixed stage.** A title or object stays put while content swaps beneath it.
81
+ - **One section, one colour.** Flat fields as chapters.
82
+ - **Radical understatement.** A 27px headline and tiny live demonstrations, carried through completely.
83
+
84
+ Hero types, by the panel's classification (top sites against weak sites): full-bleed media with type
85
+ over it 16% / 10%; giant wordmark 14% / 0%; typographic poster 13% / 7%; text beside media 10% / 3%;
86
+ **centred statement with media below 7% / 24%**. The centred headline over a screenshot is the weak
87
+ sites' signature layout.
88
+
89
+ ## 4. Headlines
90
+
91
+ | Hero headline | All | Top | Weak |
92
+ | --- | --- | --- | --- |
93
+ | Words, median | 5 | 5 | 5 |
94
+ | Words, middle half | 3–9 | 2–8 | 3–8 |
95
+ | Characters, median | 32 | | |
96
+ | One line at 1440 | 47% | | |
97
+ | Two lines or fewer at 1440 | 70% | 71% | 83% |
98
+ | Two lines or fewer at 390 | 57% | | |
99
+ | Three lines or fewer at 390 | 82% | | |
100
+
101
+ Awwwards heroes are shorter (median 4 words, 76% within two lines) than One Page Love's (6 words, 66%).
102
+ Section headings have a median of 3 words. Length does not separate strong from weak; nearly everyone
103
+ in the gallery writes short headlines. The two-line limit in this skill is a house rule that most of
104
+ the gallery already meets on desktop and that takes care to meet on a phone.
105
+
106
+ ## 5. Type
107
+
108
+ | | All | Top | Weak |
109
+ | --- | --- | --- | --- |
110
+ | Hero size, median | 72px (5.0vw) | 6.0vw | 4.7vw |
111
+ | Hero size, middle half | 3.0–7.6vw | 2.5–9.7vw | 2.7–6.1vw |
112
+ | Largest text on the page, median | 6.4vw | 8.4vw | 5.0vw |
113
+ | Largest text, upper quarter starts at | 10.4vw | 12.5vw | 6.7vw |
114
+ | Hero on a phone, median | 40px | | |
115
+ | Hero tracking, median (middle half) | -0.01em (-0.03 to 0) | | |
116
+ | Hero leading, median (middle half) | 1.0 (0.95–1.1) | | |
117
+ | Body size, median (middle half) | 16px (14–18) | | |
118
+ | Headline ÷ body, median | 4.3 | 4.7 | 4.0 |
119
+ | Typefaces carrying 3%+ of text | one 31%, two 45%, three 22% | | |
120
+ | Distinct font sizes, median | 8 | | |
121
+
122
+ Hero weight: regular 48%, medium 18%, semibold 6%, bold or heavier 22%, light 6%. Capitals 24%.
123
+ Centred 39% overall, 52% on weak sites. Display classes by the panel: neo-grotesk 48%, transitional
124
+ serif 11%, geometric sans 10%, condensed 6%, extended 6%, old-style serif 4%, custom lettering 4%.
125
+
126
+ Strong sites push the extremes: their biggest type is bigger and their range is wider. Weak sites
127
+ cluster in the middle.
128
+
129
+ ## 6. Devices: what separates strong from weak, and what does not
130
+
131
+ Measured in the page unless marked (panel).
132
+
133
+ **More common on weak sites (the data supports avoiding them):**
134
+
135
+ | Device | Top | Weak |
136
+ | --- | --- | --- |
137
+ | Icon-topped feature cards (panel) | 1% | 28% |
138
+ | Rows of identical cards with a small icon (measured) | 7% | 26% |
139
+ | Pill badges (panel) | 14% | 34% |
140
+ | Pill-shaped label above a heading (measured) | 5% | 26% |
141
+ | Tiny uppercase letter-spaced labels, any | 16% | 57% |
142
+ | Tiny uppercase letter-spaced labels, three or more | 6% | 43% |
143
+ | Gradient fills (not counting scrims) | 22% | 52% |
144
+ | Gradient text | 2% | 13% |
145
+ | Shadows on resting elements, any | 24% | 48% |
146
+ | Shadows, five or more | 10% | 30% |
147
+ | Emoji in the page | 10% | 26% |
148
+ | Eyebrow labels (panel) | 32% | 45% |
149
+
150
+ **No real difference:**
151
+
152
+ | Device | Top | Weak |
153
+ | --- | --- | --- |
154
+ | Backdrop blur anywhere | 32% | 39% |
155
+ | Italic-serif accent word (panel) | 4% | 7% |
156
+ | Thin rules, any | 61% | 52% |
157
+
158
+ **More common on strong sites (banned here anyway, as house style):**
159
+
160
+ | Device | Top | Weak |
161
+ | --- | --- | --- |
162
+ | Monospace labels (panel) | 44% | 24% |
163
+ | Monospace anywhere outside code (measured) | 45% | 26% |
164
+ | Index numbering (panel) | 38% | 21% |
165
+
166
+ Monospace captions, index numbers and ruled grids are the present fashion of award sites. They are
167
+ excluded from this skill by the owner's choice, not by the data: they are the devices generators copy
168
+ first, and a page that cannot lean on them has to find structure in space, tone and scale.
169
+
170
+ ## 7. Colour and shape
171
+
172
+ - Dark page ground 41%; pure white 25%; pure black 12%; a warm off-white 13%.
173
+ - Scheme (panel): monochrome plus one accent 23%, light neutral 22%, dark neutral 14%, several flat
174
+ colours 13%, two-tone 12%, photographic 9%, one colour field 6%.
175
+ - Primary buttons are neutral (black, white, grey) on 52% of sites. One site in 246 has a terracotta
176
+ button; none has a violet one.
177
+ - Median number of distinct section grounds: 2 on top sites, 1 on weak sites.
178
+ - Button shape: top sites square (0–2px) 52%, fully round 23%, small radius 19%, medium (9–16px) 6%.
179
+ Weak sites fully round 59%, medium 24%, square 18%.
180
+ - Media corners are square on 73% of sites; where rounded, the median radius is 12px.
181
+ - Buttons in the first viewport: none on 55% of top sites and 39% of weak ones.
182
+
183
+ ## 8. Imagery and page structure
184
+
185
+ - Hero media covers at least half the first viewport on 60% of sites (top 68%, weak 48%) and nearly
186
+ all of it on 50% (top 56%, weak 39%). No hero media: 15%.
187
+ - Video is present on 49% of sites and a canvas element on 49% (top 62%, weak 35%).
188
+ - Images per page, median: 24 overall, 37 on top sites, 5 on weak ones.
189
+ - Imagery kind (panel): mixed 32%, photography 14%, generative or WebGL 13%, product interface 12%,
190
+ 3D render 11%, illustration 9%, video 6%, type only 3%. Median panel score is lowest for
191
+ illustration-led (6.9) and product-interface-led (7.1) pages and highest for video and type-only
192
+ (7.5).
193
+ - Page length, median: 8.7 screens and 575 words (middle half 1.6–14.4 screens, 250–956 words). A
194
+ quarter of the sites are a single screen or two.
195
+ - Navigation: a median of 3 links; fixed or sticky on 66%.
196
+ - Density (panel): airy 46%, balanced 45%, dense 9%. Alignment: centred 33%, mixed 31%, left-anchored
197
+ 17%, modular grid 13%, free 6%.
198
+ - Asked to describe each site's most interesting sections, the panel picked a pricing, testimonial or
199
+ FAQ section only 7, 12 and 9 times across 235 sites. Where strong sites have them at all, they are
200
+ not where the design effort goes, and they avoid the stock form.
201
+
202
+ **From the panel's written notes on the 114 sites scoring 7.3 or more** (hand tallies, approximate;
203
+ `layout.md` turns these into practice):
204
+
205
+ - Outer margins of 32px or less on about 45; 80px or more on about 8. A centred 700–1300px container
206
+ on about 15, several of them the pages the panel called stock.
207
+ - Text anchored to a fixed off-centre line on about 22. Text docked in corners or at opposite ends of
208
+ a baseline on about 25 and 15.
209
+ - Two or three type sizes with nothing between on about 30; no note describes a graded five-step
210
+ scale.
211
+ - One thing per screen on about 20. A full background colour per section on about 20; alternating
212
+ light and dark on about 12.
213
+ - Every section recomposed on about 14; one planned exception to the page's own system on about 14.
214
+ - No conventional top navigation bar on about 45; small corner links on about 22; a single link or
215
+ button on about 10.
216
+ - Endings: the name at full width about 18, the hero repeated inverted about 12, a closing scene of
217
+ its own about 14, no footer or a single line about 22. Link-column footers are mentioned only as
218
+ criticism.
219
+ - Motion (inferred from frames): autoplaying video about 50; pinned or fixed stages about 40; text
220
+ reveals about 30 (blur-in 10, masked line rises 8, scroll-tied word colouring 7); horizontal strips
221
+ about 27; marquees about 26; media swapped behind a fixed element about 15; scroll-linked scaling
222
+ about 12. Rare: hover effects (4 mentions), parallax (6), accordions (5), bounce or spring motion
223
+ (none). About 10 strong sites show little or no motion at all.
224
+ - How weak sites fail (54 sites under 6.8): the category's stock template about 20; centred headline,
225
+ pill badge, two buttons and a screenshot about 9; stock modules after a distinctive hero about 8,
226
+ plus about 17 in the middle band; a characterless default typeface about 13; text too small or too
227
+ faint about 13; never saying what the thing is about 12.
228
+ - Faults of the best sites (90 at 7.5 or more), not to be copied: text at 9–13px about 24;
229
+ information hidden behind the concept about 20; the idea running out mid-page about 15; text over
230
+ footage with no scrim about 12; gates, preloaders and blank first paints about 12.
231
+
232
+ ## 9. What the inspector says about the gallery itself
233
+
234
+ Running this skill's own `inspect.mjs` rules over the 202 measurable gallery sites: the median site
235
+ has 4 `FAIL`s and only 4% have none. The rules that fire most: headline over two lines somewhere on
236
+ the page 60%, eyebrow-like label 60%, thin rules 50%, monospace 37%, shadows 32%, gradients 29%, index
237
+ numbering 29%.
238
+
239
+ So the house style is deliberately stricter than the gallery. It is not a description of award sites;
240
+ it is a narrower target inside what they do: their scale, their ideas, their imagery and restraint,
241
+ without the ornaments that have since become a uniform.
242
+
243
+ ## 10. The 25 highest-scored sites and their ideas
244
+
245
+ The panel's one-sentence reading of each. Notice that every one names something only that subject
246
+ could own. (Several use devices this skill bans; take the idea, not the ornament.)
247
+
248
+ | Site | Source | Score | Idea |
249
+ | --- | --- | --- | --- |
250
+ | PP Neue Montreal | Awwwards | 8.6 | A typeface specimen dressed as a vintage city travel guide: the font named after Montreal is sold through guidebook titling, postcards and old tourist footage. |
251
+ | Seasats | Awwwards | 8.4 | Calm, dusk-lit seascapes sell autonomous boats as serene instruments, and the navigation is a column of stacked colour swatches taken from that sea-and-sand palette. |
252
+ | AI in Design Report 2026 | Awwwards | 8.4 | A research report laid out like a colour-blocked print annual: a video collage on top, an oversized tight grotesk title, and flat orange, lilac, sage and black blocks carrying stats, quotes and chapters. |
253
+ | House of Honey | Awwwards | 8.4 | A block-heavy wordmark pierced by a fine script: the bold-against-delicate contrast is repeated at every scale, with giant pink script behind quiet serif statements. |
254
+ | White Desert | Awwwards | 8.4 | One word, the destination, set a third of the screen tall over footage like a film title card; sheer scale stands in for remoteness. |
255
+ | Applied Imagination | One Page Love | 8.3 | An essay conceived on a flight is read as a descent: an altimeter ticks from 30,000 ft to zero while you scroll down through clouds to mountains at ground level. |
256
+ | Cursor Compile | One Page Love | 8.3 | The event name drawn as seven looping one-line curves in seven colours, more signature than logotype, on an otherwise whisper-quiet off-white page. |
257
+ | The New Industrials | One Page Love | 8.3 | A long-read essay laid out inside a drafting grid, where colour fields shift as you read and machine parts drift through the margins and finally assemble into the publisher's initials. |
258
+ | Wild | One Page Love | 8.3 | A studio essay in which everything decorative is drawn on one square-pixel grid: the hero heatmap, the icons, the diagrams, the lettering and the footer. |
259
+ | Hildén & Kaira | Awwwards | 8.3 | The agency name is cast in liquid chrome across the full width, and the same chrome becomes the objects that float through the page, tying the pitch to one material. |
260
+ | PX Push | Awwwards | 8.2 | A design subscription presented as a retro broadcast: the entire site is seen through a CRT screen, with a chrome logo token as its mascot. |
261
+ | Illoca | Awwwards | 8.2 | Software for architects sold as a drafting table: a two-colour illustrated studio on graph paper that the scroll pushes into until the drawing fills the screen. |
262
+ | Aspen Search | Awwwards | 8.2 | The page is a tile system with no margins: the two-word name is split across cells that alternate type, dithered image, black and one mint green. |
263
+ | Dragonfly Redux | Awwwards | 8.2 | A crypto fund presented as a terminal artefact: every picture is rendered in characters, framed by four letters of the name pinned to the viewport corners. |
264
+ | Monolog | Awwwards | 8.2 | A studio pitch run as an asymmetric sheet: a narrow left column carries the sales talk while a wide right column stacks a very heavy headline and the proof. |
265
+ | The Queue | One Page Love | 8.1 | An essay on queueing where the queue is the ornament: a line of drawn figures stands along the bottom of the hero and returns between chapters in changing period dress. |
266
+ | Paul Kalkbrenner | Awwwards | 8.1 | Swiss poster typography for a techno artist: the name as one black line with a photo set inside it like a glyph, then every chapter gets its own flat colour. |
267
+ | Vero New York | Awwwards | 8.1 | A keepsake treated like couture: a slow close-up film opens, then a white sculpture of a dress stays pinned at centre while one sentence passes over it. |
268
+ | Depo Luxe | Awwwards | 8.1 | A film production roster shown as a full-screen reel in which every step is one film with only a title, a director and a client, set like credits at body size. |
269
+ | Longbow | Awwwards | 8.1 | The page is built on a visible four-column construction grid, and cars, cards and a giant condensed marquee are slotted into its cells like objects on an artboard. |
270
+ | Mosby's Files | Awwwards | 8.0 | An archive of architects presented as a physical stack of coloured index-tab file folders that you flip through. |
271
+ | Sarah & Matt Wedding | One Page Love | 8.0 | The site is the invitation: a letterpress-style card opens the page, and its ornaments and small typographic parts become the components for everything after it. |
272
+ | Zara Webb | One Page Love | 8.0 | A one-woman newborn-care practice presented like a hand-made keepsake: a mascot rabbit, scalloped and flower-shaped cut-outs, candid film photographs. |
273
+ | Noho | Awwwards | 8.0 | Furniture sold through people misusing it (wearing, balancing on, hiding behind chairs on flat colour backdrops) while the interface stays quiet. |
274
+ | Juggle | One Page Love | 8.0 | The headline literally drowns: a flat blue field rises to half height and the lines below the waterline change colour. |
275
+
276
+ Full notes on any studied site: `node scripts/draw.mjs --site <id>` (ids appear on direction sheets).
277
+
278
+ ## 11. How the skill was tested
279
+
280
+ Six client briefs (an invoicing tool, a restaurant, a designer's portfolio, a ceramic product, a
281
+ guesthouse, a design conference), each with no photographs. For every brief a fresh agent built the
282
+ page three ways: with no skill (baseline), with another published design skill (atelier, three briefs)
283
+ and with this skill. Every build was photographed by `inspect.mjs` in the same way and judged blind
284
+ by a separate agent with the juror brief (Awwwards weights, anonymous A/B/C folders, screenshots
285
+ only). The skill was revised after each round from the jurors' reasons and the builders' notes.
286
+
287
+ | Round | Briefs | This skill | Baseline | Atelier | Wins |
288
+ | --- | --- | --- | --- | --- | --- |
289
+ | 1 | 4 | 6.6 | 7.7 | 6.8 | 1 of 4 |
290
+ | 2 | 3 | 7.1 | 8.0 | | 0 of 3 |
291
+ | 3 | 3 | 7.5 | 7.5 | | 1 of 3 |
292
+ | 4 (unseen briefs) | 3 | 6.9 | 7.9 | 7.5 | 0 of 3 |
293
+ | 5 (same three) | 3 | 7.7 | 7.8 | 7.2 | 2 of 3 |
294
+
295
+ Under the inspector, the final builds measured 0 FAIL each; the baselines measured 8 to 13 FAIL each
296
+ (eyebrows, monospace labels, 01/02/03 numbering, hairlines, gradients, shadows, three-line headlines,
297
+ text under 13px).
298
+
299
+ What the jurors rewarded, in the order they named it: an idea that belongs to this client and not to
300
+ the category (the competitor test); one live thing on the page; full content at a readable size; a
301
+ first screen with one dominant element and a real button; drawings of the subject with detail. What
302
+ they punished: a quiet page that read as empty, a small headline, text sliding over pictures or cut
303
+ at the top, a page recoloured mid-section, rows cut at the right edge, a large sentence over three or
304
+ more lines (read as a long headline whatever its markup), navigation that took over the first screen.
305
+ Each of these is now a rule in SKILL.md or a check in the inspector.
306
+
307
+ Limits: one juror per brief per round, so single scores carry about half a point of noise; the round-5
308
+ briefs had been seen in round 4; jurors are models, not people.
309
+
310
+ ## 12. The October 2026 study: 100 Sites of the Day
311
+
312
+ A second study, made for v2.1, of the latest 100 Awwwards Sites of the Day (10 July to 17 October
313
+ 2026), with a different aim from the first: where the pictures and footage sit, how pages move, and
314
+ the frame (margins, balance, empty space, titles). About three in four of these sites were also in
315
+ the first study.
316
+
317
+ - **Capture.** Headless Chrome at 1440×900 and 390×844 on 18 October 2026: four frames of the first
318
+ 4.5 seconds after load, every screen while scrolling with real wheel input (one frame at rest per
319
+ step; the mid-step frames were cut from the top of the document instead of the viewport, so they
320
+ were not used), five phone screens, and a measurement pass in the page: every picture and
321
+ clip with its box, ratio, fit and corners; every section's content edges and pictures; blank runs;
322
+ the CSS that loaded (curves, durations, keyframes, breakpoints, feature counts); the animations,
323
+ transitions and script-driven moves that actually ran; GSAP tweens and scroll triggers where the
324
+ page exposed them. Nothing a site owns (code, copy, pictures) is reproduced in the skill; only
325
+ measurements and descriptions in our own words.
326
+ - **Panel.** One model reader per site studied its frames and measurements, described the idea, the
327
+ first screen, the frame, every section, where each picture sits, the motion and what not to copy,
328
+ and scored it the Awwwards way. 91 of 99 captures were usable (the rest showed a gate, a bot wall or
329
+ a firewall page). Scores ran 6.7 to 7.9 (median 7.45); "top" means 7.5 or more (36 sites), "lowest"
330
+ under 7.3 (16).
331
+ - **What it changed.** Where pictures and footage go: `imagery.md` §12. What strong pages do with
332
+ motion, new tokens, recipes and the gimmicks to avoid: `motion.md` §2, §4–6 and §9–10. Empty space
333
+ and the frame: `layout.md` §4–5. New compositions in `library/heroes.json` and `sections.json` and
334
+ notes on media and motion in `library/sites.json` (`draw.mjs --site <id>`).
335
+ - **Headline numbers.** Pictures fill a median 16% of a scrolled screen, but in whole screens: 42% of
336
+ screens hold none and 19% are 90% picture or more. The median page carries 7 pictures (top 8,
337
+ lowest 2) and 42% carry footage (half of the top sites, one of the 16 lowest). 94% of pictures have
338
+ square corners. Strong ease-outs are the curves that ran (expo and quint out); the median of all
339
+ that ran on a site is 420ms. 60 of 99 open on a loading screen, and a third of the usable pages were
340
+ still unreadable 4.5 seconds after load, with no gain in the design marks. About 1 text section in
341
+ 100 leaves half the width empty; the outer margins of strong pages match to a few pixels; 82% of
342
+ text sections open with a heading; 15 of 97 first screens never say what the thing is, and those
343
+ lose usability points.
344
+ - **Limits.** One capture per site on one day; a WebGL scene can render blank in a headless browser;
345
+ the scroll-linked frames are partly an artefact of smooth-scroll libraries; one reader per site, so
346
+ single scores carry about half a point of noise.
347
+
348
+ ## 13. The app-screen study
349
+
350
+ For dashboards and app screens (v2.1), a separate study of 23 real product screens chosen by the
351
+ owner (17 products, 17 light and 6 dark, at 1440–1512px): each screen measured from its pixels by a
352
+ reader with full-resolution crops, six cross-cutting reports (shell, data and charts, tables and
353
+ forms, visual language, taste, styles), and a synthesis into `references/app-screens.md` and
354
+ `library/app.json` (seven styles, five shells, screen patterns). The screenshots stay private; the
355
+ skill carries only the measurements and the rules. Blind test rounds of app screens built with and
356
+ without the skill then shaped the warnings at the top of that file.
@@ -0,0 +1,174 @@
1
+ # Scroll scenes
2
+
3
+ The big moments of a page: stretches of scroll where the page stops being a column of sections and
4
+ becomes a scene. A camera flies through a field of pictures, a picture grows from a window to the whole
5
+ screen, a word buckles under the scroll, a set of photographs orbits and lands in a grid. These are what
6
+ visitors remember from award sites, and what a page built from tidy sections alone never has.
7
+
8
+ The scene library is taken apart from recent Awwwards Sites of the Day (October 2026: 43 sites recorded
9
+ frame by frame while scrolling, 261 scenes described, 30 types), rebuilt from scratch in our own code,
10
+ tested frame by frame at desktop and phone width and under reduced motion, and reviewed against the
11
+ scenes it came from. Nothing a site owns is in them. Until `library/scenes.json` ships the draw deals
12
+ none; a page that needs a scene builds one on the stage (section 8), with every rule here.
13
+
14
+ ## Contents
15
+
16
+ 1. What a scene is
17
+ 2. Putting a scene on a page
18
+ 3. Filling it
19
+ 4. Fitting it to the page
20
+ 5. The phone, reduced motion, no script
21
+ 6. Checking it
22
+ 7. Rules for scenes
23
+ 8. When no scene in the library fits
24
+ 9. The catalogue
25
+
26
+ ## 1. What a scene is
27
+
28
+ A tall section whose stage holds still while the page scrolls past it. The stage is
29
+ `position: sticky`; the section is (hold + 1) screens tall, so the stage is held for `hold` screens;
30
+ a GSAP timeline is scrubbed from 0 to 1 by that scroll. Nothing captures the wheel: the scrollbar always
31
+ tells the truth, the keyboard and the trackpad work as everywhere else, and the scene ends.
32
+
33
+ What a scene is not: a fade-up, a small parallax, a sticky footer, a marquee. Those are the quiet layer
34
+ (`references/motion.md`). A scene changes the whole screen.
35
+
36
+ The direction sheet deals two or three (section 9 of the sheet), from different families, each placed
37
+ on the section of the argument it can carry. Build them in step 6, with that section: a scene is
38
+ composition, not decoration added at the end.
39
+
40
+ ## 2. Putting a scene on a page
41
+
42
+ Copy the shared stage and the dealt scene's files into the project (`assets/scenes/stage.css`,
43
+ `stage.js`, `<id>.css`, `<id>.js`). Each scene file's header comment lists the markup it expects and
44
+ its options; `assets/scenes/demo/<id>.html` is a complete working page to read beside it.
45
+
46
+ ```html
47
+ <head>
48
+ <script>document.documentElement.classList.add('js')</script>
49
+ <link rel="stylesheet" href="scenes/stage.css">
50
+ <link rel="stylesheet" href="scenes/<id>.css">
51
+ </head>
52
+ <body>
53
+ …
54
+ <section class="scene" data-scene="<id>" data-options='{"hold": 3}' aria-label="…">
55
+ <div class="scene-stage">
56
+ <!-- the markup from the scene file's header, filled with this page's content -->
57
+ </div>
58
+ </section>
59
+ …
60
+ <script src="https://cdn.jsdelivr.net/npm/gsap@3.15.0/dist/gsap.min.js"></script>
61
+ <script src="https://cdn.jsdelivr.net/npm/gsap@3.15.0/dist/ScrollTrigger.min.js"></script>
62
+ <script src="https://cdn.jsdelivr.net/npm/lenis@1.3.26/dist/lenis.min.js"></script>
63
+ <script src="scenes/stage.js"></script>
64
+ <script src="scenes/<id>.js"></script>
65
+ <script>Stage.smooth(); Stage.init();</script>
66
+ </body>
67
+ ```
68
+
69
+ - Load SplitText (`gsap@3.15.0/dist/SplitText.min.js`) only when a scene file says it needs it.
70
+ - `Stage.smooth()` adds weighted wheel scrolling (Lenis at lerp 0.12). It stays off for touch and for
71
+ reduced motion. Leave it out on a quiet page; the scenes work either way.
72
+ - `Stage.init()` starts every `[data-scene]` on the page. A page with two scenes loads both files.
73
+ - The versions are pinned. Do not change them to `@latest` or an unpinned major.
74
+
75
+ ## 3. Filling it
76
+
77
+ A scene is only as strong as what goes in it. The scene file's header and the sheet's "Content" line
78
+ say how many pictures and words it takes; these hold for all of them:
79
+
80
+ - **Pictures of one family.** Same light, same grade, same kind of subject: a field of mismatched stock
81
+ photographs breaks the illusion of one space faster than any timing error. Real pictures of the
82
+ subject's world (`assets.mjs`), the project's own, or the dealt photographs, in that order
83
+ (`references/imagery.md`). Size each to its largest display size, set `width` and `height`.
84
+ - **Words that read in a breath.** A held statement is 4 to 12 words; captions are one to four words in
85
+ the text face, sentence case. One statement on screen at a time.
86
+ - **The scene says something about the subject.** A fly-through of the studio's work, the route a
87
+ shipment really takes, the four rooms of the house, the product's change of state. A scene filled
88
+ with unrelated pictures is a gimmick and reads as one.
89
+ - **Real content only.** If the scene needs eight pictures of the subject and there are three, take the
90
+ `--redraw scenes`, never pad it with stand-ins.
91
+
92
+ ## 4. Fitting it to the page
93
+
94
+ - The scene files read the page's tokens: `--ground`, `--ink`, `--muted`, `--accent`,
95
+ `--font-display`, `--font-text` (with fallbacks). Set them on `:root` from the sheet and the scene
96
+ takes the page's colour and type. Check the demo against your page, not the other way round.
97
+ - Display type in a scene uses the dealt display face and the two-line headline rule; statements stay
98
+ at statement size.
99
+ - Leave a quiet section between two scenes (a text section, a list, a plain picture) so each one lands.
100
+ Two scenes back to back read as one long ride and the second loses.
101
+ - A scene on the first screen must be readable at progress 0: the title, the sentence and the action are
102
+ there on the first frame (motion rule 1), and the scene starts moving only when the visitor scrolls.
103
+ - Give the section a heading. If the design has no visible heading in the scene, the section still
104
+ carries one (`aria-label` on the section and a real heading in the finished composition).
105
+
106
+ ## 5. The phone, reduced motion, no script
107
+
108
+ - **The phone.** Each scene has a phone plan in its file: the same scene with changed numbers, a
109
+ simpler version, or `phone: 'rest'`, where the phone shows the finished composition. Touch scrolling
110
+ is never smoothed. Look at the phone sheet as carefully as the desktop one.
111
+ - **Reduced motion and no script.** The section is an ordinary section showing the finished
112
+ composition: the same content, laid out to read without motion. Nothing is hidden waiting for a
113
+ script. The inspector's `reduced-hidden` check and the reduced sheet of `scenes.mjs` show it.
114
+ - **A failed CDN** falls back to the finished composition too (the stage adds `.is-rest`). The
115
+ inspector fails a scene that rests on desktop (`scene-not-live`), so a broken script cannot pass.
116
+
117
+ ## 6. Checking it
118
+
119
+ ```bash
120
+ node <skill>/scripts/scenes.mjs <page> # every scene at 0, 10 … 100%, desktop and phone, and reduced motion
121
+ node <skill>/scripts/inspect.mjs <page> # the gate; with scenes on the sheet it also films the scroll
122
+ ```
123
+
124
+ `scenes.mjs` writes one contact sheet per scene and width to `.taste-skill/scenes/`. Read every one.
125
+ At every frame ask: is there one clear thing to look at; can the statement on screen be read; is
126
+ anything popping, blank, cut off or crossing the words; is it as bold as it should be? The inspector's
127
+ `desktop-film-NN.jpg` shows the whole page's scroll a third of a screen at a time: check that the
128
+ scenes and the quiet sections between them make a rhythm, and that nothing between them is empty.
129
+
130
+ ## 7. Rules for scenes
131
+
132
+ 1. **Two or three per page,** from different families, a quiet section between them. The inspector
133
+ warns over four (`many-scenes`) and when scenes hold more than 60% of the page (`scene-heavy`).
134
+ 2. **Each holds one to four screens:** about one screen per beat of the story; a hold with nothing new
135
+ to show is cut, not padded.
136
+ 3. **Native scroll only.** No wheel capture, no locking the page, no scenes that only run on a click.
137
+ Smoothing only through `Stage.smooth()`.
138
+ 4. **Readable at its rest points.** The statement on screen reads whole; nothing passes over text while
139
+ it is being read; text on a picture has a flat scrim or a calm area under it.
140
+ 5. **Inside a scene the scene's numbers apply** (motion rule 7): a picture may grow from a window to the
141
+ whole screen, type may cross the stage, a camera may fly through pictures. Outside scenes, the quiet
142
+ limits of `references/motion.md` hold.
143
+ 6. **Transform, opacity, clip-path.** Nothing that forces layout on every frame. Pictures decoded before
144
+ they move.
145
+ 7. **The house rules hold inside scenes:** no monospace captions, no 01/07 counters (a plain "3 of 7" if
146
+ a count is needed), no gradients (flat scrims), no shadows or glows, no hairline decoration, no
147
+ decorative particles, no violet.
148
+ 8. **The finished composition is designed,** not an afterthought: it is what reduced motion, a failed
149
+ script and some phones see.
150
+
151
+ ## 8. When no scene in the library fits
152
+
153
+ Redraw first (`--redraw scenes`). If the brief really needs a scene the library does not have, build it
154
+ on the same stage so it inherits the guards:
155
+
156
+ ```js
157
+ Scenes['my-scene'] = (root, opts = {}) => Stage.scene(root, {
158
+ hold: opts.hold ?? 2, // screens the stage is held for
159
+ scrub: opts.scrub ?? true, // true when Lenis runs; 0.4-0.8 without it reads as weight
160
+ phone: 'same', // or 'rest', or { hold, build } for a phone plan
161
+ build(tl, { q, phone }) { // positions are fractions of the scene, 0-1
162
+ tl.fromTo(q('.picture'), { clipPath: 'inset(30% 30% 30% 30%)' }, { clipPath: 'inset(0% 0% 0% 0%)', duration: 0.6 }, 0)
163
+ .to(q('.title'), { yPercent: -40, autoAlpha: 0, duration: 0.25 }, 0.7);
164
+ },
165
+ });
166
+ ```
167
+
168
+ and write its CSS finished composition first, then the live layout under `.scene.is-live`. Check it
169
+ with `scenes.mjs` like any other.
170
+
171
+ ## 9. The catalogue
172
+
173
+ (Generated from `library/scenes.json`; the draw deals from it. `node <skill>/scripts/draw.mjs --list
174
+ scenes` prints it.)
@@ -0,0 +1,115 @@
1
+ # Tells — the dated registry
2
+
3
+ A tell is a device that makes a page read as generated. Tells are not bad design in themselves; most
4
+ began as good ideas on good sites. They became tells by being produced by default, everywhere, without
5
+ a reason. That is why this registry is dated, and why it never names a replacement font, colour or
6
+ component: every published "use this instead" list has become the next wave of tells within months.
7
+ Replacements here are procedures (draw from the library, derive from the subject), not products.
8
+
9
+ `scripts/inspect.mjs` and `scripts/lint.mjs` detect most entries. Status: **banned** means the
10
+ inspector fails the page; **warned** means it flags it and you need a reason.
11
+
12
+ ## Contents
13
+
14
+ 1. First wave (2023–2024)
15
+ 2. Second wave (2025)
16
+ 3. Third wave (2025–2026): the "fix" that became the look
17
+ 4. Gallery fashion, banned as house style
18
+ 5. Structural tells
19
+ 6. Copy tells
20
+ 7. Motion tells
21
+ 8. Why removal is not enough
22
+
23
+ ## 1. First wave (2023–2024)
24
+
25
+ | Tell | Status | Do instead |
26
+ | --- | --- | --- |
27
+ | Violet / indigo gradients on hero, buttons and glows | banned | The dealt palette; flat colour |
28
+ | Gradient-filled headline text | banned | Solid ink |
29
+ | Glass panels: backdrop blur, translucent cards | warned (2 or more) | Opaque surfaces one tone step from the ground |
30
+ | Glowing or gradient "Get started" button | banned | Flat button named for its action |
31
+ | Soft grey drop shadow under every card | banned | Tone step, or no box |
32
+ | Three identical feature cards, each with an icon in a rounded square | banned | The dealt section blueprint |
33
+ | Emoji as icons or bullets | banned | Words, or a real picture |
34
+ | Centred headline, subtitle, two buttons, screenshot below | no rule; the draw avoids it | The dealt hero |
35
+ | The same typeface on every generated page | warned (lint: default-font) | The dealt type system |
36
+
37
+ ## 2. Second wave (2025)
38
+
39
+ | Tell | Status | Do instead |
40
+ | --- | --- | --- |
41
+ | Eyebrow / kicker: tiny tracked uppercase label above every heading | banned | Fold it into the heading, or delete |
42
+ | Pill badge above the hero headline ("New", "Beta", "Introducing") | banned | Say it in the supporting sentence |
43
+ | One word of the headline in italic serif, colour or underline | warned | One face, one colour |
44
+ | Bento grid of rounded tiles as the feature section | warned as card rows | A composed section; tiles only in the dense-tiles direction, filled, strict sizes |
45
+ | Near-black ground with one neon accent and a glow | banned via shadow, gradient | A dealt dark palette, no glow |
46
+ | Floating rounded pill navigation with blur | warned | A plain bar |
47
+ | Fake dashboard hero built from grey bars and donut charts | no rule; see imagery.md §7 | A real interface fragment, or no image |
48
+ | Decorative status dot ("Available for work", pulsing "live") | lint: bounce | Remove |
49
+ | Fade-and-rise on every section | no rule; see motion.md | One signature move |
50
+
51
+ ## 3. Third wave (2025–2026): the "fix" that became the look
52
+
53
+ The remedy published for the first two waves was "warm it up and make it editorial". Models adopted
54
+ the remedy wholesale and it is now the most recognisable generated look of all.
55
+
56
+ | Tell | Status | Do instead |
57
+ | --- | --- | --- |
58
+ | Yellow-cream ground + terracotta / rust / clay accent | banned together; terracotta banned alone; cream warned | The dealt palette. Warmth from a low-chroma stone, a deep ink, a photograph, or a full warm field |
59
+ | High-contrast or soft serif display as the shortcut to "premium" | no rule | The dealt type system, whatever class it is |
60
+ | Oversized italic serif headline | no rule | As dealt |
61
+ | Broadsheet cosplay: hairline rules everywhere, zero radius, dense columns | banned via hairline | Structure from space and tone |
62
+ | "Field notes", "Quietly trusted by", "On our desks": performative labels | lint: copy | Plain section names |
63
+
64
+ ## 4. Gallery fashion, banned as house style
65
+
66
+ These are common on award sites right now. In the study they appear *more* often on the top-scored
67
+ sites than on the weak ones (panel observations: monospace labels 44% against 24%, index numbering 38%
68
+ against 21%; measured thin rules 61% against 52%). They are banned here regardless, by the owner's
69
+ decision: they are the first things a generator copies from the gallery, they carry no information,
70
+ and a page built without them has to find real structure.
71
+
72
+ | Tell | Status | Do instead |
73
+ | --- | --- | --- |
74
+ | Monospace micro-labels, mono as a "technical" voice, mono captions | banned | The text face; tabular figures for data |
75
+ | Index numbering: 01 / 02 / 03, (001), "Step 02", numbered section markers | banned | Order by position, scale, or the words; `<ol>` when it is truly a list |
76
+ | Thin rules: hairline dividers, ruled grids, 1px outlined boxes and tiles | banned (boxes: 3 or more) | Space, tone steps, filled shapes, a thick bar if a bar is the idea |
77
+ | Design-tool chrome as ornament: crosshairs, crop marks, selection handles, dashed guides, rulers | banned via hairline, dashed | Remove |
78
+ | Agency micro-meta: local time, coordinates, weather, version stamps, "©2026 — Scroll", middle-dot strings | lint: copy; micro-label | Remove |
79
+ | Tiny uppercase letter-spaced captions scattered around the viewport | banned (3 or more) | Sentence case at readable size, placed with the content it describes |
80
+
81
+ Tiny tracked capitals are the one item in this group the data condemns as well: 16% of top sites
82
+ against 57% of weak ones.
83
+
84
+ ## 5. Structural tells
85
+
86
+ | Tell | Status | Do instead |
87
+ | --- | --- | --- |
88
+ | Headline as a full sentence at display size, three or four lines | banned (over two lines) | A title of about five words; the rest goes below |
89
+ | Stock section order: hero, logos, features, testimonial, pricing, CTA | no rule; see copy.md §1 | The order of the argument |
90
+ | Every section the same layout family | critique.md pass 9 | Different composition per section, from the sheet |
91
+ | Everything centred | warned over 72% | Left-anchored, one centred moment |
92
+ | One medium border radius (12–16px) on everything | none | Square or fully round, chosen once |
93
+ | Nine nearly equal font sizes | warned over 9 | Five sizes, far apart |
94
+ | Invented social proof: logos, quotes, star rows, "10,000+ teams" | copy.md §5 | Real proof, or none |
95
+ | Text or a CSS box where a picture belongs | critique.md cap | A real picture, or a design that needs none |
96
+
97
+ ## 6. Copy tells
98
+
99
+ Flagged by `lint.mjs`: the genre's verbs and adjectives (unlock, supercharge, seamless, elevate,
100
+ effortless, cutting-edge, all-in-one …); the correction ("not just X, it's Y"); tricolon headlines;
101
+ "Get started" and "Learn more" as labels; more than a handful of em dashes; lorem ipsum. See
102
+ `copy.md` §6.
103
+
104
+ ## 7. Motion tells
105
+
106
+ Identical fade-up on every block; a dozen staggered hero entrances; hover lift on every card; bounce
107
+ easing; infinite loops that mean nothing; reveals that fail and leave a blank band. See `motion.md` §9.
108
+
109
+ ## 8. Why removal is not enough
110
+
111
+ A page with every tell removed and nothing put in their place is an empty page with good manners, and
112
+ that is a tell too (the "avoidance aesthetic": anyone could guess it from the category plus the list of
113
+ things to avoid). The tells were filling a gap where an idea should have been. The order of work in
114
+ `SKILL.md` exists to fill that gap first: the idea from the subject, the dealt composition, real
115
+ pictures or committed type, and only then the checks.