@supersoniks/concorde 5.0.5 → 5.1.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 (282) hide show
  1. package/.claude/launch.json +15 -0
  2. package/.claude/vite.http.config.mjs +7 -0
  3. package/.taste-skill/after/desktop-fold.jpg +0 -0
  4. package/.taste-skill/after/desktop-page-01.jpg +0 -0
  5. package/.taste-skill/after/desktop-page-02.jpg +0 -0
  6. package/.taste-skill/after/desktop-page-03.jpg +0 -0
  7. package/.taste-skill/after/mobile-fold.jpg +0 -0
  8. package/.taste-skill/after/mobile-page-01.jpg +0 -0
  9. package/.taste-skill/after/report.json +4103 -0
  10. package/.taste-skill/after/tablet-fold.jpg +0 -0
  11. package/.taste-skill/after/tablet-page-01.jpg +0 -0
  12. package/.taste-skill/after/tablet-page-02.jpg +0 -0
  13. package/.taste-skill/before/desktop-fold.jpg +0 -0
  14. package/.taste-skill/before/desktop-page-01.jpg +0 -0
  15. package/.taste-skill/before/desktop-page-02.jpg +0 -0
  16. package/.taste-skill/before/mobile-fold.jpg +0 -0
  17. package/.taste-skill/before/mobile-page-01.jpg +0 -0
  18. package/.taste-skill/before/report.json +2556 -0
  19. package/.taste-skill/before/tablet-fold.jpg +0 -0
  20. package/.taste-skill/before/tablet-page-01.jpg +0 -0
  21. package/.taste-skill/direction.json +510 -0
  22. package/.taste-skill/notes.md +84 -0
  23. package/.taste-skill/prod/desktop-fold.jpg +0 -0
  24. package/.taste-skill/prod/desktop-page-01.jpg +0 -0
  25. package/.taste-skill/prod/desktop-page-02.jpg +0 -0
  26. package/.taste-skill/prod/desktop-page-03.jpg +0 -0
  27. package/.taste-skill/prod/mobile-fold.jpg +0 -0
  28. package/.taste-skill/prod/mobile-page-01.jpg +0 -0
  29. package/.taste-skill/prod/mobile-page-02.jpg +0 -0
  30. package/.taste-skill/prod/report.json +1973 -0
  31. package/.taste-skill/prod/tablet-fold.jpg +0 -0
  32. package/.taste-skill/prod/tablet-page-01.jpg +0 -0
  33. package/.taste-skill/prod/tablet-page-02.jpg +0 -0
  34. package/.tmp-cem/custom-elements.json +13705 -0
  35. package/AUDIT.md +228 -0
  36. package/PLAN-AMELIORATION.md +220 -0
  37. package/build-infos.json +1 -1
  38. package/concorde-core.bundle.js +196 -196
  39. package/concorde-core.es.js +3854 -3572
  40. package/custom-elements-manifest.config.mjs +14 -0
  41. package/dist/concorde-core.bundle.js +196 -196
  42. package/dist/concorde-core.es.js +3854 -3572
  43. package/dist/img/archive/concorde-001-2cv.webp +0 -0
  44. package/dist/img/archive/concorde-red-arrows-2002-poster.jpg +0 -0
  45. package/dist/img/archive/concorde-red-arrows-2002.webm +0 -0
  46. package/dist/img/archive/credits.json +28 -0
  47. package/docs/assets/index-Bb-_LRyY.js +12280 -0
  48. package/docs/index.html +1 -1
  49. package/index.html +27 -63
  50. package/package.json +44 -3
  51. package/public/img/archive/concorde-001-2cv.webp +0 -0
  52. package/public/img/archive/concorde-red-arrows-2002-poster.jpg +0 -0
  53. package/public/img/archive/concorde-red-arrows-2002.webm +0 -0
  54. package/public/img/archive/credits.json +28 -0
  55. package/scripts/generate-sdui-catalog.mjs +250 -0
  56. package/scripts/generate-sdui-catalog.spec.ts +91 -0
  57. package/scripts/pre-build.mjs +15 -0
  58. package/src/core/components/functional/fetch/fetch.md +2 -2
  59. package/src/core/components/functional/sdui/SDUIDescriptorTransformer.ts +5 -5
  60. package/src/core/components/functional/sdui/__fixtures__/descriptors.ts +251 -0
  61. package/src/core/components/functional/sdui/__snapshots__/sdui-action.spec.ts.snap +73 -0
  62. package/src/core/components/functional/sdui/__snapshots__/sdui-incremental.spec.ts.snap +50 -0
  63. package/src/core/components/functional/sdui/__snapshots__/sdui-partial.spec.ts.snap +50 -0
  64. package/src/core/components/functional/sdui/__snapshots__/sdui.regression.spec.ts.snap +461 -0
  65. package/src/core/components/functional/sdui/component-catalog.gaps.json +511 -0
  66. package/src/core/components/functional/sdui/component-catalog.json +3103 -0
  67. package/src/core/components/functional/sdui/component-catalog.spec.ts +23 -0
  68. package/src/core/components/functional/sdui/sdui-action.spec.ts +99 -0
  69. package/src/core/components/functional/sdui/sdui-dom-snapshot.ts +61 -0
  70. package/src/core/components/functional/sdui/sdui-extension-points.md +94 -0
  71. package/src/core/components/functional/sdui/sdui-incremental.spec.ts +137 -0
  72. package/src/core/components/functional/sdui/sdui-partial.spec.ts +83 -0
  73. package/src/core/components/functional/sdui/sdui-partial.ts +19 -0
  74. package/src/core/components/functional/sdui/sdui-safe.spec.ts +188 -0
  75. package/src/core/components/functional/sdui/sdui-safe.ts +100 -0
  76. package/src/core/components/functional/sdui/sdui.md +122 -0
  77. package/src/core/components/functional/sdui/sdui.regression.spec.ts +64 -0
  78. package/src/core/components/functional/sdui/sdui.ts +442 -34
  79. package/src/core/components/functional/sdui/types.ts +49 -0
  80. package/src/core/components/ui/modal/modal.ts +14 -11
  81. package/src/docs/_getting-started/components.md +5 -0
  82. package/src/docs/_getting-started/theming.md +2 -2
  83. package/src/docs/code.ts +88 -75
  84. package/src/docs/components/docs-demo-sources.ts +16 -8
  85. package/src/docs/components/docs-lit-demo.ts +19 -37
  86. package/src/docs/docs.ts +5 -0
  87. package/src/docs/example/docs-boarding-pass-demo.ts +134 -0
  88. package/src/docs/example/docs-provider-keys.ts +12 -0
  89. package/src/docs/header/header.ts +233 -69
  90. package/src/docs/home/catalog.ts +44 -0
  91. package/src/docs/home/home.ts +513 -0
  92. package/src/docs/home/mach-stage.ts +389 -0
  93. package/src/docs/layout.ts +3 -1
  94. package/src/docs/navigation/components-index.ts +56 -0
  95. package/src/docs/navigation/navigation.ts +240 -232
  96. package/src/docs/navigation/pager.ts +67 -0
  97. package/src/docs/navigation/toc.ts +98 -0
  98. package/src/docs/search/docs-search.json +330 -20
  99. package/src/docs/search/markdown-renderer.ts +11 -3
  100. package/src/docs/shiki/index.ts +109 -0
  101. package/src/docs/tailwind/css/base/scrollbar.css +22 -0
  102. package/src/docs/tailwind/css/base/theme.css +96 -0
  103. package/src/docs/tailwind/css/base/typography.css +4 -0
  104. package/src/docs/tailwind/css/docs/boarding-pass.css +65 -0
  105. package/src/docs/tailwind/css/docs/content.css +32 -0
  106. package/src/docs/tailwind/css/docs/page.css +10 -0
  107. package/src/docs/tailwind/css/docs.css +9 -0
  108. package/src/docs/tailwind/css/home/hero.css +210 -0
  109. package/src/docs/tailwind/css/home/motion.css +84 -0
  110. package/src/docs/tailwind/css/home/sections.css +416 -0
  111. package/src/docs/tailwind/css/tailwind.css +7 -185
  112. package/src/tsconfig.json +113 -2
  113. package/src/tsconfig.tsbuildinfo +1 -1
  114. package/tailwind.config.js +8 -4
  115. package/docs/assets/index-wVZpLVYW.js +0 -12122
  116. package/docs/crawl/core/components/functional/date/date.html +0 -190
  117. package/docs/crawl/core/components/functional/fetch/fetch.html +0 -109
  118. package/docs/crawl/core/components/functional/if/if.html +0 -27
  119. package/docs/crawl/core/components/functional/jsonata/jsonata.html +0 -79
  120. package/docs/crawl/core/components/functional/list/list.html +0 -70
  121. package/docs/crawl/core/components/functional/mix/mix.html +0 -45
  122. package/docs/crawl/core/components/functional/queue/queue.html +0 -96
  123. package/docs/crawl/core/components/functional/router/router.html +0 -106
  124. package/docs/crawl/core/components/functional/sdui/sdui.html +0 -269
  125. package/docs/crawl/core/components/functional/states/states.html +0 -66
  126. package/docs/crawl/core/components/functional/submit/submit.html +0 -160
  127. package/docs/crawl/core/components/functional/subscriber/subscriber.html +0 -67
  128. package/docs/crawl/core/components/functional/value/value.html +0 -51
  129. package/docs/crawl/core/components/ui/alert/alert.html +0 -211
  130. package/docs/crawl/core/components/ui/alert-messages/alert-messages.html +0 -131
  131. package/docs/crawl/core/components/ui/badge/badge.html +0 -197
  132. package/docs/crawl/core/components/ui/button/button.html +0 -150
  133. package/docs/crawl/core/components/ui/captcha/captcha.html +0 -112
  134. package/docs/crawl/core/components/ui/card/card.html +0 -253
  135. package/docs/crawl/core/components/ui/divider/divider.html +0 -144
  136. package/docs/crawl/core/components/ui/form/checkbox/checkbox.html +0 -73
  137. package/docs/crawl/core/components/ui/form/fieldset/fieldset.html +0 -266
  138. package/docs/crawl/core/components/ui/form/form-actions/form-actions.html +0 -122
  139. package/docs/crawl/core/components/ui/form/form-layout/form-layout.html +0 -121
  140. package/docs/crawl/core/components/ui/form/input/input.html +0 -109
  141. package/docs/crawl/core/components/ui/form/input-autocomplete/input-autocomplete.html +0 -38
  142. package/docs/crawl/core/components/ui/form/radio/radio.html +0 -56
  143. package/docs/crawl/core/components/ui/form/select/select.html +0 -73
  144. package/docs/crawl/core/components/ui/form/switch/switch.html +0 -56
  145. package/docs/crawl/core/components/ui/form/textarea/textarea.html +0 -59
  146. package/docs/crawl/core/components/ui/group/group.html +0 -104
  147. package/docs/crawl/core/components/ui/icon/icon.html +0 -222
  148. package/docs/crawl/core/components/ui/image/image.html +0 -298
  149. package/docs/crawl/core/components/ui/link/link.html +0 -100
  150. package/docs/crawl/core/components/ui/loader/loader.html +0 -124
  151. package/docs/crawl/core/components/ui/menu/menu.html +0 -394
  152. package/docs/crawl/core/components/ui/modal/modal.html +0 -342
  153. package/docs/crawl/core/components/ui/pop/pop.html +0 -296
  154. package/docs/crawl/core/components/ui/progress/progress.html +0 -131
  155. package/docs/crawl/core/components/ui/table/table.html +0 -545
  156. package/docs/crawl/core/components/ui/theme/theme.html +0 -131
  157. package/docs/crawl/core/components/ui/toast/toast.html +0 -233
  158. package/docs/crawl/core/components/ui/tooltip/tooltip.html +0 -140
  159. package/docs/crawl/docs/_core-concept/dataFlow.html +0 -177
  160. package/docs/crawl/docs/_core-concept/overview.html +0 -66
  161. package/docs/crawl/docs/_core-concept/subscriber.html +0 -75
  162. package/docs/crawl/docs/_decorators/ancestor-attribute.html +0 -117
  163. package/docs/crawl/docs/_decorators/auto-subscribe.html +0 -202
  164. package/docs/crawl/docs/_decorators/bind.html +0 -141
  165. package/docs/crawl/docs/_decorators/get.html +0 -149
  166. package/docs/crawl/docs/_decorators/handle.html +0 -165
  167. package/docs/crawl/docs/_decorators/on-assign.html +0 -355
  168. package/docs/crawl/docs/_decorators/patch.html +0 -78
  169. package/docs/crawl/docs/_decorators/post.html +0 -139
  170. package/docs/crawl/docs/_decorators/publish.html +0 -61
  171. package/docs/crawl/docs/_decorators/put.html +0 -78
  172. package/docs/crawl/docs/_decorators/subscribe.html +0 -109
  173. package/docs/crawl/docs/_decorators/wait-for-ancestors.html +0 -137
  174. package/docs/crawl/docs/_directives/sub.html +0 -93
  175. package/docs/crawl/docs/_getting-started/ai-agents.html +0 -173
  176. package/docs/crawl/docs/_getting-started/concorde-manual-install.html +0 -100
  177. package/docs/crawl/docs/_getting-started/concorde-outside.html +0 -58
  178. package/docs/crawl/docs/_getting-started/create-a-component.html +0 -111
  179. package/docs/crawl/docs/_getting-started/my-first-component.html +0 -189
  180. package/docs/crawl/docs/_getting-started/my-first-subscriber.html +0 -110
  181. package/docs/crawl/docs/_getting-started/pubsub.html +0 -62
  182. package/docs/crawl/docs/_getting-started/start.html +0 -76
  183. package/docs/crawl/docs/_getting-started/theming.html +0 -333
  184. package/docs/crawl/docs/_misc/api-configuration.html +0 -149
  185. package/docs/crawl/docs/_misc/dataProviderKey.html +0 -135
  186. package/docs/crawl/docs/_misc/docs-mock-api.html +0 -158
  187. package/docs/crawl/docs/_misc/dynamic-path.html +0 -180
  188. package/docs/crawl/docs/_misc/endpoint.html +0 -50
  189. package/docs/crawl/docs/_misc/formelement-subscriber-removal.html +0 -138
  190. package/docs/crawl/docs/_misc/html-integration.html +0 -48
  191. package/docs/crawl/hubs/decorators.html +0 -547
  192. package/docs/crawl/hubs/form-components.html +0 -381
  193. package/docs/crawl/hubs/remote-data.html +0 -452
  194. package/docs/crawl/index.html +0 -102
  195. package/docs/llms-full.txt +0 -7008
  196. package/docs/llms.txt +0 -97
  197. package/docs/sitemap.xml +0 -240
  198. package/docs/src/core/components/functional/date/date.md +0 -290
  199. package/docs/src/core/components/functional/fetch/fetch.md +0 -125
  200. package/docs/src/core/components/functional/if/if.md +0 -9
  201. package/docs/src/core/components/functional/jsonata/jsonata.md +0 -56
  202. package/docs/src/core/components/functional/list/list.md +0 -65
  203. package/docs/src/core/components/functional/mix/mix.md +0 -41
  204. package/docs/src/core/components/functional/queue/queue.md +0 -72
  205. package/docs/src/core/components/functional/router/router.md +0 -94
  206. package/docs/src/core/components/functional/sdui/default-library.json +0 -108
  207. package/docs/src/core/components/functional/sdui/example.json +0 -99
  208. package/docs/src/core/components/functional/sdui/sdui.md +0 -356
  209. package/docs/src/core/components/functional/states/states.md +0 -87
  210. package/docs/src/core/components/functional/submit/submit.md +0 -114
  211. package/docs/src/core/components/functional/subscriber/subscriber.md +0 -91
  212. package/docs/src/core/components/functional/value/value.md +0 -35
  213. package/docs/src/core/components/ui/alert/alert.md +0 -196
  214. package/docs/src/core/components/ui/alert-messages/alert-messages.md +0 -85
  215. package/docs/src/core/components/ui/badge/badge.md +0 -188
  216. package/docs/src/core/components/ui/button/button.md +0 -183
  217. package/docs/src/core/components/ui/captcha/captcha.md +0 -71
  218. package/docs/src/core/components/ui/card/card.md +0 -215
  219. package/docs/src/core/components/ui/divider/divider.md +0 -129
  220. package/docs/src/core/components/ui/form/checkbox/checkbox.md +0 -77
  221. package/docs/src/core/components/ui/form/fieldset/fieldset.md +0 -205
  222. package/docs/src/core/components/ui/form/form-actions/form-actions.md +0 -100
  223. package/docs/src/core/components/ui/form/form-layout/form-layout.md +0 -119
  224. package/docs/src/core/components/ui/form/input/input.md +0 -142
  225. package/docs/src/core/components/ui/form/input-autocomplete/input-autocomplete.md +0 -29
  226. package/docs/src/core/components/ui/form/radio/radio.md +0 -57
  227. package/docs/src/core/components/ui/form/select/select.md +0 -71
  228. package/docs/src/core/components/ui/form/switch/switch.md +0 -57
  229. package/docs/src/core/components/ui/form/textarea/textarea.md +0 -65
  230. package/docs/src/core/components/ui/group/group.md +0 -75
  231. package/docs/src/core/components/ui/icon/icon.md +0 -214
  232. package/docs/src/core/components/ui/icon/icons.json +0 -1
  233. package/docs/src/core/components/ui/image/image.md +0 -233
  234. package/docs/src/core/components/ui/link/link.md +0 -81
  235. package/docs/src/core/components/ui/loader/loader.md +0 -112
  236. package/docs/src/core/components/ui/menu/menu.md +0 -370
  237. package/docs/src/core/components/ui/modal/modal.md +0 -235
  238. package/docs/src/core/components/ui/pop/pop.md +0 -294
  239. package/docs/src/core/components/ui/progress/progress.md +0 -109
  240. package/docs/src/core/components/ui/table/table.md +0 -431
  241. package/docs/src/core/components/ui/theme/theme.md +0 -122
  242. package/docs/src/core/components/ui/toast/toast.md +0 -216
  243. package/docs/src/core/components/ui/tooltip/tooltip.md +0 -124
  244. package/docs/src/docs/_core-concept/dataFlow.md +0 -88
  245. package/docs/src/docs/_core-concept/overview.md +0 -57
  246. package/docs/src/docs/_core-concept/subscriber.md +0 -75
  247. package/docs/src/docs/_decorators/ancestor-attribute.md +0 -128
  248. package/docs/src/docs/_decorators/auto-subscribe.md +0 -202
  249. package/docs/src/docs/_decorators/bind.md +0 -167
  250. package/docs/src/docs/_decorators/get.md +0 -162
  251. package/docs/src/docs/_decorators/handle.md +0 -175
  252. package/docs/src/docs/_decorators/on-assign.md +0 -390
  253. package/docs/src/docs/_decorators/patch.md +0 -70
  254. package/docs/src/docs/_decorators/post.md +0 -146
  255. package/docs/src/docs/_decorators/publish.md +0 -55
  256. package/docs/src/docs/_decorators/put.md +0 -70
  257. package/docs/src/docs/_decorators/subscribe.md +0 -100
  258. package/docs/src/docs/_decorators/wait-for-ancestors.md +0 -163
  259. package/docs/src/docs/_directives/sub.md +0 -91
  260. package/docs/src/docs/_getting-started/ai-agents.md +0 -76
  261. package/docs/src/docs/_getting-started/concorde-manual-install.md +0 -133
  262. package/docs/src/docs/_getting-started/concorde-outside.md +0 -33
  263. package/docs/src/docs/_getting-started/create-a-component.md +0 -139
  264. package/docs/src/docs/_getting-started/my-first-component.md +0 -236
  265. package/docs/src/docs/_getting-started/my-first-subscriber.md +0 -120
  266. package/docs/src/docs/_getting-started/pubsub.md +0 -37
  267. package/docs/src/docs/_getting-started/start.md +0 -47
  268. package/docs/src/docs/_getting-started/theming.md +0 -253
  269. package/docs/src/docs/_misc/api-configuration.md +0 -81
  270. package/docs/src/docs/_misc/dataProviderKey.md +0 -168
  271. package/docs/src/docs/_misc/docs-mock-api.md +0 -63
  272. package/docs/src/docs/_misc/dynamic-path.md +0 -71
  273. package/docs/src/docs/_misc/endpoint.md +0 -45
  274. package/docs/src/docs/_misc/formelement-subscriber-removal.md +0 -115
  275. package/docs/src/docs/_misc/html-integration.md +0 -15
  276. package/docs/src/docs/search/docs-search.json +0 -12242
  277. package/docs/src/tag-list.json +0 -1
  278. package/docs/src/tsconfig-model.json +0 -23
  279. package/docs/src/tsconfig.json +0 -1242
  280. package/src/docs/prism/index.ts +0 -6
  281. package/src/docs/prism/prism.css +0 -158
  282. package/src/docs/prism/prism.js +0 -1022
@@ -0,0 +1,2556 @@
1
+ {
2
+ "url": "http://localhost:3010/",
3
+ "at": "2026-10-25T15:52:24.371Z",
4
+ "allow": [],
5
+ "viewports": [
6
+ {
7
+ "width": 1440,
8
+ "height": 900,
9
+ "load": "load",
10
+ "screens": 5,
11
+ "filled": [
12
+ 0.38,
13
+ 0.13,
14
+ 0.11,
15
+ 0.13,
16
+ 0.04
17
+ ],
18
+ "motion": {
19
+ "elements": 33,
20
+ "css": 19,
21
+ "transitions": 14,
22
+ "scripted": 0,
23
+ "videos": 0,
24
+ "playingVideos": 0
25
+ },
26
+ "metrics": {
27
+ "viewport": {
28
+ "w": 1440,
29
+ "h": 900
30
+ },
31
+ "page": {
32
+ "height": 4570,
33
+ "screens": 5.1,
34
+ "words": 366,
35
+ "img": 0,
36
+ "video": 0,
37
+ "canvas": 0,
38
+ "svg": 0,
39
+ "sections": 6,
40
+ "horizontalOverflow": 0,
41
+ "overflowCulprits": [],
42
+ "uiFragments": 0,
43
+ "uiAbuse": false,
44
+ "realPictures": 0,
45
+ "videoCount": 0,
46
+ "uiPictures": 0,
47
+ "pictureSamples": [],
48
+ "blendText": 0,
49
+ "sideScrollers": 0,
50
+ "brokenImages": [],
51
+ "emoji": [
52
+ "✓"
53
+ ],
54
+ "videosNoPoster": 0
55
+ },
56
+ "hero": {
57
+ "text": "2.04",
58
+ "words": 1,
59
+ "chars": 4,
60
+ "lines": 1,
61
+ "size": 120,
62
+ "vw": 8.3,
63
+ "font": "ClashGrotesk-Variable",
64
+ "weight": 500,
65
+ "tracking": -0.04,
66
+ "leading": 0.8,
67
+ "upper": false,
68
+ "italic": false,
69
+ "mono": false,
70
+ "align": "left",
71
+ "position": "right",
72
+ "widthRatio": 0.16,
73
+ "top": 607,
74
+ "tag": "div",
75
+ "kind": "heading"
76
+ },
77
+ "h1": {
78
+ "text": "webcomponents for scoped consistent shareable user interfaces",
79
+ "words": 7,
80
+ "lines": 3,
81
+ "size": 72,
82
+ "font": "ClashGrotesk-Variable"
83
+ },
84
+ "headings": [
85
+ {
86
+ "text": "webcomponents for scoped consistent shareable user interfaces",
87
+ "words": 7,
88
+ "chars": 61,
89
+ "lines": 3,
90
+ "size": 72,
91
+ "vw": 5,
92
+ "font": "ClashGrotesk-Variable",
93
+ "weight": 400,
94
+ "tracking": 0,
95
+ "leading": 1.02,
96
+ "upper": false,
97
+ "italic": false,
98
+ "mono": false,
99
+ "align": "left",
100
+ "position": "left",
101
+ "widthRatio": 0.49,
102
+ "top": 208,
103
+ "tag": "h1",
104
+ "kind": "heading"
105
+ },
106
+ {
107
+ "text": "2.04",
108
+ "words": 1,
109
+ "chars": 4,
110
+ "lines": 1,
111
+ "size": 120,
112
+ "vw": 8.3,
113
+ "font": "ClashGrotesk-Variable",
114
+ "weight": 500,
115
+ "tracking": -0.04,
116
+ "leading": 0.8,
117
+ "upper": false,
118
+ "italic": false,
119
+ "mono": false,
120
+ "align": "left",
121
+ "position": "right",
122
+ "widthRatio": 0.16,
123
+ "top": 607,
124
+ "tag": "div",
125
+ "kind": "heading"
126
+ },
127
+ {
128
+ "text": "Write HTML. Get an app.",
129
+ "words": 5,
130
+ "chars": 23,
131
+ "lines": 1,
132
+ "size": 60,
133
+ "vw": 4.2,
134
+ "font": "ClashGrotesk-Variable",
135
+ "weight": 400,
136
+ "tracking": 0,
137
+ "leading": 1,
138
+ "upper": false,
139
+ "italic": false,
140
+ "mono": false,
141
+ "align": "left",
142
+ "position": "left",
143
+ "widthRatio": 0.53,
144
+ "top": 1026,
145
+ "tag": "h2",
146
+ "kind": "heading"
147
+ },
148
+ {
149
+ "text": "State that flows through markup",
150
+ "words": 5,
151
+ "chars": 31,
152
+ "lines": 2,
153
+ "size": 48,
154
+ "vw": 3.3,
155
+ "font": "ClashGrotesk-Variable",
156
+ "weight": 400,
157
+ "tracking": 0,
158
+ "leading": 1,
159
+ "upper": false,
160
+ "italic": false,
161
+ "mono": false,
162
+ "align": "left",
163
+ "position": "left",
164
+ "widthRatio": 0.4,
165
+ "top": 2570,
166
+ "tag": "h2",
167
+ "kind": "heading"
168
+ },
169
+ {
170
+ "text": "Built for 100 ticketing sites at once",
171
+ "words": 7,
172
+ "chars": 37,
173
+ "lines": 2,
174
+ "size": 48,
175
+ "vw": 3.3,
176
+ "font": "ClashGrotesk-Variable",
177
+ "weight": 400,
178
+ "tracking": 0,
179
+ "leading": 1,
180
+ "upper": false,
181
+ "italic": false,
182
+ "mono": false,
183
+ "align": "left",
184
+ "position": "left",
185
+ "widthRatio": 0.46,
186
+ "top": 3266,
187
+ "tag": "h2",
188
+ "kind": "heading"
189
+ },
190
+ {
191
+ "text": "100",
192
+ "words": 1,
193
+ "chars": 3,
194
+ "lines": 1,
195
+ "size": 60,
196
+ "vw": 4.2,
197
+ "font": "ClashGrotesk-Variable",
198
+ "weight": 400,
199
+ "tracking": 0,
200
+ "leading": 1,
201
+ "upper": false,
202
+ "italic": false,
203
+ "mono": false,
204
+ "align": "center",
205
+ "position": "right",
206
+ "widthRatio": 0.11,
207
+ "top": 3318,
208
+ "tag": "div",
209
+ "kind": "heading"
210
+ },
211
+ {
212
+ "text": "35+",
213
+ "words": 1,
214
+ "chars": 3,
215
+ "lines": 1,
216
+ "size": 60,
217
+ "vw": 4.2,
218
+ "font": "ClashGrotesk-Variable",
219
+ "weight": 400,
220
+ "tracking": 0,
221
+ "leading": 1,
222
+ "upper": false,
223
+ "italic": false,
224
+ "mono": false,
225
+ "align": "center",
226
+ "position": "right",
227
+ "widthRatio": 0.11,
228
+ "top": 3318,
229
+ "tag": "div",
230
+ "kind": "heading"
231
+ },
232
+ {
233
+ "text": "0",
234
+ "words": 1,
235
+ "chars": 1,
236
+ "lines": 1,
237
+ "size": 60,
238
+ "vw": 4.2,
239
+ "font": "ClashGrotesk-Variable",
240
+ "weight": 400,
241
+ "tracking": 0,
242
+ "leading": 1,
243
+ "upper": false,
244
+ "italic": false,
245
+ "mono": false,
246
+ "align": "center",
247
+ "position": "right",
248
+ "widthRatio": 0.11,
249
+ "top": 3318,
250
+ "tag": "div",
251
+ "kind": "heading"
252
+ },
253
+ {
254
+ "text": "Ready for take-off?",
255
+ "words": 3,
256
+ "chars": 19,
257
+ "lines": 1,
258
+ "size": 60,
259
+ "vw": 4.2,
260
+ "font": "ClashGrotesk-Variable",
261
+ "weight": 400,
262
+ "tracking": 0,
263
+ "leading": 1,
264
+ "upper": false,
265
+ "italic": false,
266
+ "mono": false,
267
+ "align": "center",
268
+ "position": "center",
269
+ "widthRatio": 0.94,
270
+ "top": 3628,
271
+ "tag": "h2",
272
+ "kind": "heading"
273
+ }
274
+ ],
275
+ "headingSummary": {
276
+ "count": 9,
277
+ "maxLines": 3,
278
+ "over2Lines": 1,
279
+ "statements": 0,
280
+ "centered": 4,
281
+ "medianWords": 5,
282
+ "mixedFontHeadings": 0
283
+ },
284
+ "type": {
285
+ "families": [
286
+ {
287
+ "family": "Arial",
288
+ "share": 0.48,
289
+ "mono": false
290
+ },
291
+ {
292
+ "family": "ClashGrotesk-Variable",
293
+ "share": 0.43,
294
+ "mono": false
295
+ },
296
+ {
297
+ "family": "ui-monospace",
298
+ "share": 0.09,
299
+ "mono": false
300
+ }
301
+ ],
302
+ "familyCount": 3,
303
+ "sizes": [
304
+ 11,
305
+ 13,
306
+ 14,
307
+ 16,
308
+ 18,
309
+ 20,
310
+ 24,
311
+ 48,
312
+ 60,
313
+ 72,
314
+ 120
315
+ ],
316
+ "sizeCount": 11,
317
+ "notLoaded": [],
318
+ "body": {
319
+ "font": "Arial",
320
+ "size": 18,
321
+ "leading": 1.5,
322
+ "weight": 400,
323
+ "tracking": 0,
324
+ "contrast": 6.8
325
+ },
326
+ "measureChars": 71,
327
+ "max": {
328
+ "size": 120,
329
+ "vw": 8.3,
330
+ "font": "ClashGrotesk-Variable",
331
+ "text": "2.04"
332
+ },
333
+ "monoShare": 0.09,
334
+ "monoProseShare": 0.09,
335
+ "monoFamilies": [
336
+ "ui-monospace"
337
+ ],
338
+ "monoSamples": [
339
+ "Mach",
340
+ "CDG — JFK",
341
+ "FL 600",
342
+ "3 h 30",
343
+ "> add a newsletter signup",
344
+ "+ <div formDataProvider=\"newsletter\">"
345
+ ],
346
+ "microLabels": 4,
347
+ "microLabelShare": 0.011,
348
+ "microSamples": [
349
+ "Mach",
350
+ "CDG — JFK",
351
+ "FL 600",
352
+ "3 h 30"
353
+ ],
354
+ "upperShare": 0.02,
355
+ "centerShare": 0.06,
356
+ "smallText": 5
357
+ },
358
+ "eyebrows": [
359
+ {
360
+ "text": "v5.1",
361
+ "above": "webcomponents for scoped consistent shar",
362
+ "upper": false,
363
+ "tracked": false,
364
+ "mono": false,
365
+ "pill": true,
366
+ "size": 14,
367
+ "top": 156
368
+ },
369
+ {
370
+ "text": "FL 600",
371
+ "above": "2.04",
372
+ "upper": true,
373
+ "tracked": true,
374
+ "mono": true,
375
+ "pill": false,
376
+ "size": 11.2,
377
+ "top": 528
378
+ }
379
+ ],
380
+ "numbered": [],
381
+ "color": {
382
+ "bodyBg": "#fffcf0",
383
+ "bodyBgHsl": {
384
+ "h": 48,
385
+ "s": 1,
386
+ "l": 0.97
387
+ },
388
+ "dark": false,
389
+ "sectionBgs": [],
390
+ "textColors": [
391
+ {
392
+ "color": "#111111",
393
+ "share": 0.49
394
+ },
395
+ {
396
+ "color": "#fffcf0",
397
+ "share": 0.28
398
+ },
399
+ {
400
+ "color": "#5a5956",
401
+ "share": 0.21
402
+ },
403
+ {
404
+ "color": "#10b981",
405
+ "share": 0.01
406
+ },
407
+ {
408
+ "color": "#ffffff",
409
+ "share": 0
410
+ }
411
+ ],
412
+ "button": null,
413
+ "lowContrast": [
414
+ {
415
+ "text": "AI-agent ready",
416
+ "ratio": 1,
417
+ "need": 3,
418
+ "size": 24,
419
+ "fg": "#fffcf0",
420
+ "bg": "#fffcf0"
421
+ },
422
+ {
423
+ "text": "Skills and AGENTS.md teach coding agents",
424
+ "ratio": 1,
425
+ "need": 4.5,
426
+ "size": 16,
427
+ "fg": "#fffcf0",
428
+ "bg": "#fffcf0"
429
+ },
430
+ {
431
+ "text": "> add a newsletter signup",
432
+ "ratio": 1,
433
+ "need": 4.5,
434
+ "size": 12.8,
435
+ "fg": "#fffcf0",
436
+ "bg": "#fffcf0"
437
+ },
438
+ {
439
+ "text": "+ <div formDataProvider=\"newsletter\">",
440
+ "ratio": 1,
441
+ "need": 4.5,
442
+ "size": 12.8,
443
+ "fg": "#fffcf0",
444
+ "bg": "#fffcf0"
445
+ },
446
+ {
447
+ "text": "+ <sonic-input name=\"email\" type=\"email\"",
448
+ "ratio": 1,
449
+ "need": 4.5,
450
+ "size": 12.8,
451
+ "fg": "#fffcf0",
452
+ "bg": "#fffcf0"
453
+ },
454
+ {
455
+ "text": "+ <sonic-submit endPoint=\"newsletter\">",
456
+ "ratio": 1,
457
+ "need": 4.5,
458
+ "size": 12.8,
459
+ "fg": "#fffcf0",
460
+ "bg": "#fffcf0"
461
+ }
462
+ ]
463
+ },
464
+ "buttons": {
465
+ "count": 0,
466
+ "inHero": 0,
467
+ "withShadow": 0,
468
+ "withGradient": 0,
469
+ "mono": 0,
470
+ "upper": 0,
471
+ "heroLabels": []
472
+ },
473
+ "surfaces": {
474
+ "shadowStatic": 0,
475
+ "shadowOverlay": 0,
476
+ "shadowSamples": [],
477
+ "gradients": 1,
478
+ "scrims": 2,
479
+ "gradientSamples": [
480
+ "div.hero-glow → radial-gradient(closest-side, rgb(251, 146, 60), rgba(0, 0, 0, 0)), radial-gradient(closest-side, rgb(59, 130,"
481
+ ],
482
+ "gradientText": 0,
483
+ "hairlines": 0,
484
+ "hairlineSamples": [],
485
+ "outlinedBoxes": 1,
486
+ "dashed": 0,
487
+ "blurred": 0,
488
+ "roundedBoxes": 2,
489
+ "boxRadius": 50,
490
+ "squareMedia": 0,
491
+ "roundedMedia": 0,
492
+ "mediaRadius": 0,
493
+ "textShadow": 0,
494
+ "cardRows": []
495
+ },
496
+ "heroMedia": [],
497
+ "nav": null,
498
+ "fontsLoaded": [
499
+ "clashgrotesk-variable"
500
+ ]
501
+ },
502
+ "layout": {
503
+ "viewport": {
504
+ "w": 1440,
505
+ "h": 900
506
+ },
507
+ "pageH": 4570,
508
+ "margins": {
509
+ "left": 40,
510
+ "right": 91
511
+ },
512
+ "sections": [
513
+ {
514
+ "sel": "section.relative.grid",
515
+ "tag": "section",
516
+ "top": 66,
517
+ "height": 760,
518
+ "words": 52,
519
+ "media": 0,
520
+ "middle": 217,
521
+ "heading": {
522
+ "text": "webcomponents for",
523
+ "size": 72,
524
+ "tag": "h1"
525
+ },
526
+ "left": 40,
527
+ "right": 132,
528
+ "textLeft": 40,
529
+ "textRight": 132,
530
+ "fullBleed": false,
531
+ "footer": false,
532
+ "hero": true,
533
+ "continues": false,
534
+ "pinned": false
535
+ },
536
+ {
537
+ "sel": "section.py-20.md:py-28",
538
+ "tag": "section",
539
+ "top": 914,
540
+ "height": 1540,
541
+ "words": 158,
542
+ "media": 0,
543
+ "middle": 0,
544
+ "heading": {
545
+ "text": "Write HTML. Get an app.",
546
+ "size": 60,
547
+ "tag": "h2"
548
+ },
549
+ "left": 40,
550
+ "right": 86,
551
+ "textLeft": 40,
552
+ "textRight": 86,
553
+ "fullBleed": false,
554
+ "footer": false,
555
+ "hero": false,
556
+ "continues": false,
557
+ "pinned": false
558
+ },
559
+ {
560
+ "sel": "section.py-16.md:py-24",
561
+ "tag": "section",
562
+ "top": 2454,
563
+ "height": 682,
564
+ "words": 36,
565
+ "media": 0,
566
+ "middle": 0,
567
+ "heading": {
568
+ "text": "State that flows through markup",
569
+ "size": 48,
570
+ "tag": "h2"
571
+ },
572
+ "left": 40,
573
+ "right": 818,
574
+ "textLeft": 40,
575
+ "textRight": 818,
576
+ "fullBleed": false,
577
+ "footer": false,
578
+ "hero": false,
579
+ "continues": false,
580
+ "pinned": false
581
+ },
582
+ {
583
+ "sel": "section.py-12.md:py-20",
584
+ "tag": "section",
585
+ "top": 3137,
586
+ "height": 451,
587
+ "words": 47,
588
+ "media": 0,
589
+ "middle": 106,
590
+ "heading": {
591
+ "text": "100",
592
+ "size": 60,
593
+ "tag": "span"
594
+ },
595
+ "left": 89,
596
+ "right": 114,
597
+ "textLeft": 89,
598
+ "textRight": 114,
599
+ "fullBleed": false,
600
+ "footer": false,
601
+ "hero": false,
602
+ "continues": false,
603
+ "pinned": false
604
+ },
605
+ {
606
+ "sel": "section.relative.pt-10",
607
+ "tag": "section",
608
+ "top": 3588,
609
+ "height": 982,
610
+ "words": 11,
611
+ "media": 0,
612
+ "middle": 0,
613
+ "heading": {
614
+ "text": "Ready for take-off?",
615
+ "size": 60,
616
+ "tag": "h2"
617
+ },
618
+ "left": 479,
619
+ "right": 479,
620
+ "textLeft": 479,
621
+ "textRight": 479,
622
+ "fullBleed": false,
623
+ "footer": true,
624
+ "hero": false,
625
+ "continues": false,
626
+ "pinned": false
627
+ }
628
+ ],
629
+ "gaps": [],
630
+ "h1s": [
631
+ {
632
+ "text": "webcomponents for scoped consistent shareable user interfaces",
633
+ "size": 72,
634
+ "top": 208,
635
+ "firstScreen": true
636
+ }
637
+ ],
638
+ "edgeText": [],
639
+ "edges": [
640
+ {
641
+ "x": 40,
642
+ "n": 8
643
+ },
644
+ {
645
+ "x": 67,
646
+ "n": 6
647
+ },
648
+ {
649
+ "x": 89,
650
+ "n": 2
651
+ },
652
+ {
653
+ "x": 520,
654
+ "n": 2
655
+ },
656
+ {
657
+ "x": 746,
658
+ "n": 1
659
+ },
660
+ {
661
+ "x": 972,
662
+ "n": 1
663
+ }
664
+ ],
665
+ "leftBlocks": 20,
666
+ "bodySize": 18,
667
+ "stage": false,
668
+ "explains": true,
669
+ "slivers": [],
670
+ "voidShare": 0.17,
671
+ "voidBox": {
672
+ "x": 720,
673
+ "y": 180,
674
+ "w": 720,
675
+ "h": 300
676
+ }
677
+ },
678
+ "app": null,
679
+ "consoleErrors": []
680
+ },
681
+ {
682
+ "width": 768,
683
+ "height": 1024,
684
+ "load": "load",
685
+ "screens": 6,
686
+ "filled": [
687
+ 0.38,
688
+ 0.21,
689
+ 0.21,
690
+ 0.18,
691
+ 0.24,
692
+ 0.14
693
+ ],
694
+ "motion": {
695
+ "elements": 33,
696
+ "css": 19,
697
+ "transitions": 14,
698
+ "scripted": 0,
699
+ "videos": 0,
700
+ "playingVideos": 0
701
+ },
702
+ "metrics": {
703
+ "viewport": {
704
+ "w": 768,
705
+ "h": 1024
706
+ },
707
+ "page": {
708
+ "height": 5720,
709
+ "screens": 5.6,
710
+ "words": 366,
711
+ "img": 0,
712
+ "video": 0,
713
+ "canvas": 0,
714
+ "svg": 0,
715
+ "sections": 6,
716
+ "horizontalOverflow": 0,
717
+ "overflowCulprits": [],
718
+ "uiFragments": 0,
719
+ "uiAbuse": false,
720
+ "realPictures": 0,
721
+ "videoCount": 0,
722
+ "uiPictures": 0,
723
+ "pictureSamples": [],
724
+ "blendText": 0,
725
+ "sideScrollers": 0,
726
+ "brokenImages": [],
727
+ "emoji": [
728
+ "✓"
729
+ ],
730
+ "videosNoPoster": 0
731
+ },
732
+ "hero": {
733
+ "text": "webcomponents for scoped consistent shareable user interfaces",
734
+ "words": 7,
735
+ "chars": 61,
736
+ "lines": 3,
737
+ "size": 60,
738
+ "vw": 7.8,
739
+ "font": "ClashGrotesk-Variable",
740
+ "weight": 400,
741
+ "tracking": 0,
742
+ "leading": 1.02,
743
+ "upper": false,
744
+ "italic": false,
745
+ "mono": false,
746
+ "align": "left",
747
+ "position": "center",
748
+ "widthRatio": 0.94,
749
+ "top": 182,
750
+ "tag": "h1",
751
+ "kind": "heading"
752
+ },
753
+ "h1": {
754
+ "text": "webcomponents for scoped consistent shareable user interfaces",
755
+ "words": 7,
756
+ "lines": 3,
757
+ "size": 60,
758
+ "font": "ClashGrotesk-Variable"
759
+ },
760
+ "headings": [
761
+ {
762
+ "text": "webcomponents for scoped consistent shareable user interfaces",
763
+ "words": 7,
764
+ "chars": 61,
765
+ "lines": 3,
766
+ "size": 60,
767
+ "vw": 7.8,
768
+ "font": "ClashGrotesk-Variable",
769
+ "weight": 400,
770
+ "tracking": 0,
771
+ "leading": 1.02,
772
+ "upper": false,
773
+ "italic": false,
774
+ "mono": false,
775
+ "align": "left",
776
+ "position": "center",
777
+ "widthRatio": 0.94,
778
+ "top": 182,
779
+ "tag": "h1",
780
+ "kind": "heading"
781
+ },
782
+ {
783
+ "text": "2.04",
784
+ "words": 1,
785
+ "chars": 4,
786
+ "lines": 1,
787
+ "size": 84.5,
788
+ "vw": 11,
789
+ "font": "ClashGrotesk-Variable",
790
+ "weight": 500,
791
+ "tracking": -0.04,
792
+ "leading": 0.8,
793
+ "upper": false,
794
+ "italic": false,
795
+ "mono": false,
796
+ "align": "left",
797
+ "position": "left",
798
+ "widthRatio": 0.22,
799
+ "top": 1194,
800
+ "tag": "div",
801
+ "kind": "heading"
802
+ },
803
+ {
804
+ "text": "Write HTML. Get an app.",
805
+ "words": 5,
806
+ "chars": 23,
807
+ "lines": 1,
808
+ "size": 48,
809
+ "vw": 6.3,
810
+ "font": "ClashGrotesk-Variable",
811
+ "weight": 400,
812
+ "tracking": 0,
813
+ "leading": 1,
814
+ "upper": false,
815
+ "italic": false,
816
+ "mono": false,
817
+ "align": "left",
818
+ "position": "center",
819
+ "widthRatio": 0.94,
820
+ "top": 1553,
821
+ "tag": "h2",
822
+ "kind": "heading"
823
+ },
824
+ {
825
+ "text": "State that flows through markup",
826
+ "words": 5,
827
+ "chars": 31,
828
+ "lines": 1,
829
+ "size": 48,
830
+ "vw": 6.3,
831
+ "font": "ClashGrotesk-Variable",
832
+ "weight": 400,
833
+ "tracking": 0,
834
+ "leading": 1,
835
+ "upper": false,
836
+ "italic": false,
837
+ "mono": false,
838
+ "align": "left",
839
+ "position": "center",
840
+ "widthRatio": 0.94,
841
+ "top": 3431,
842
+ "tag": "h2",
843
+ "kind": "heading"
844
+ },
845
+ {
846
+ "text": "Built for 100 ticketing sites at once",
847
+ "words": 7,
848
+ "chars": 37,
849
+ "lines": 2,
850
+ "size": 48,
851
+ "vw": 6.3,
852
+ "font": "ClashGrotesk-Variable",
853
+ "weight": 400,
854
+ "tracking": 0,
855
+ "leading": 1,
856
+ "upper": false,
857
+ "italic": false,
858
+ "mono": false,
859
+ "align": "left",
860
+ "position": "center",
861
+ "widthRatio": 0.81,
862
+ "top": 4561,
863
+ "tag": "h2",
864
+ "kind": "heading"
865
+ },
866
+ {
867
+ "text": "100",
868
+ "words": 1,
869
+ "chars": 3,
870
+ "lines": 1,
871
+ "size": 60,
872
+ "vw": 7.8,
873
+ "font": "ClashGrotesk-Variable",
874
+ "weight": 400,
875
+ "tracking": 0,
876
+ "leading": 1,
877
+ "upper": false,
878
+ "italic": false,
879
+ "mono": false,
880
+ "align": "center",
881
+ "position": "left",
882
+ "widthRatio": 0.24,
883
+ "top": 4794,
884
+ "tag": "div",
885
+ "kind": "heading"
886
+ },
887
+ {
888
+ "text": "35+",
889
+ "words": 1,
890
+ "chars": 3,
891
+ "lines": 1,
892
+ "size": 60,
893
+ "vw": 7.8,
894
+ "font": "ClashGrotesk-Variable",
895
+ "weight": 400,
896
+ "tracking": 0,
897
+ "leading": 1,
898
+ "upper": false,
899
+ "italic": false,
900
+ "mono": false,
901
+ "align": "center",
902
+ "position": "center",
903
+ "widthRatio": 0.24,
904
+ "top": 4794,
905
+ "tag": "div",
906
+ "kind": "heading"
907
+ },
908
+ {
909
+ "text": "0",
910
+ "words": 1,
911
+ "chars": 1,
912
+ "lines": 1,
913
+ "size": 60,
914
+ "vw": 7.8,
915
+ "font": "ClashGrotesk-Variable",
916
+ "weight": 400,
917
+ "tracking": 0,
918
+ "leading": 1,
919
+ "upper": false,
920
+ "italic": false,
921
+ "mono": false,
922
+ "align": "center",
923
+ "position": "right",
924
+ "widthRatio": 0.24,
925
+ "top": 4794,
926
+ "tag": "div",
927
+ "kind": "heading"
928
+ },
929
+ {
930
+ "text": "Ready for take-off?",
931
+ "words": 3,
932
+ "chars": 19,
933
+ "lines": 1,
934
+ "size": 60,
935
+ "vw": 7.8,
936
+ "font": "ClashGrotesk-Variable",
937
+ "weight": 400,
938
+ "tracking": 0,
939
+ "leading": 1,
940
+ "upper": false,
941
+ "italic": false,
942
+ "mono": false,
943
+ "align": "center",
944
+ "position": "center",
945
+ "widthRatio": 0.94,
946
+ "top": 5052,
947
+ "tag": "h2",
948
+ "kind": "heading"
949
+ }
950
+ ],
951
+ "headingSummary": {
952
+ "count": 9,
953
+ "maxLines": 3,
954
+ "over2Lines": 1,
955
+ "statements": 0,
956
+ "centered": 4,
957
+ "medianWords": 3,
958
+ "mixedFontHeadings": 0
959
+ },
960
+ "type": {
961
+ "families": [
962
+ {
963
+ "family": "Arial",
964
+ "share": 0.48,
965
+ "mono": false
966
+ },
967
+ {
968
+ "family": "ClashGrotesk-Variable",
969
+ "share": 0.43,
970
+ "mono": false
971
+ },
972
+ {
973
+ "family": "ui-monospace",
974
+ "share": 0.09,
975
+ "mono": false
976
+ }
977
+ ],
978
+ "familyCount": 3,
979
+ "sizes": [
980
+ 11,
981
+ 13,
982
+ 14,
983
+ 16,
984
+ 18,
985
+ 20,
986
+ 24,
987
+ 48,
988
+ 60,
989
+ 85
990
+ ],
991
+ "sizeCount": 10,
992
+ "notLoaded": [],
993
+ "body": {
994
+ "font": "Arial",
995
+ "size": 18,
996
+ "leading": 1.5,
997
+ "weight": 400,
998
+ "tracking": 0,
999
+ "contrast": 6.8
1000
+ },
1001
+ "measureChars": 69,
1002
+ "max": {
1003
+ "size": 84.5,
1004
+ "vw": 11,
1005
+ "font": "ClashGrotesk-Variable",
1006
+ "text": "2.04"
1007
+ },
1008
+ "monoShare": 0.09,
1009
+ "monoProseShare": 0.09,
1010
+ "monoFamilies": [
1011
+ "ui-monospace"
1012
+ ],
1013
+ "monoSamples": [
1014
+ "Mach",
1015
+ "CDG — JFK",
1016
+ "FL 600",
1017
+ "3 h 30",
1018
+ "> add a newsletter signup",
1019
+ "+ <div formDataProvider=\"newsletter\">"
1020
+ ],
1021
+ "microLabels": 4,
1022
+ "microLabelShare": 0.011,
1023
+ "microSamples": [
1024
+ "Mach",
1025
+ "CDG — JFK",
1026
+ "FL 600",
1027
+ "3 h 30"
1028
+ ],
1029
+ "upperShare": 0.02,
1030
+ "centerShare": 0.06,
1031
+ "smallText": 5
1032
+ },
1033
+ "eyebrows": [
1034
+ {
1035
+ "text": "v5.1",
1036
+ "above": "webcomponents for scoped consistent shar",
1037
+ "upper": false,
1038
+ "tracked": false,
1039
+ "mono": false,
1040
+ "pill": true,
1041
+ "size": 14,
1042
+ "top": 130
1043
+ },
1044
+ {
1045
+ "text": "FL 600",
1046
+ "above": "2.04",
1047
+ "upper": true,
1048
+ "tracked": true,
1049
+ "mono": true,
1050
+ "pill": false,
1051
+ "size": 11.2,
1052
+ "top": 1086
1053
+ }
1054
+ ],
1055
+ "numbered": [],
1056
+ "color": {
1057
+ "bodyBg": "#fffcf0",
1058
+ "bodyBgHsl": {
1059
+ "h": 48,
1060
+ "s": 1,
1061
+ "l": 0.97
1062
+ },
1063
+ "dark": false,
1064
+ "sectionBgs": [
1065
+ {
1066
+ "color": "#fffcf0",
1067
+ "top": 689,
1068
+ "hsl": {
1069
+ "h": 48,
1070
+ "s": 1,
1071
+ "l": 0.97
1072
+ }
1073
+ }
1074
+ ],
1075
+ "textColors": [
1076
+ {
1077
+ "color": "#111111",
1078
+ "share": 0.49
1079
+ },
1080
+ {
1081
+ "color": "#fffcf0",
1082
+ "share": 0.28
1083
+ },
1084
+ {
1085
+ "color": "#5a5956",
1086
+ "share": 0.21
1087
+ },
1088
+ {
1089
+ "color": "#10b981",
1090
+ "share": 0.01
1091
+ },
1092
+ {
1093
+ "color": "#ffffff",
1094
+ "share": 0
1095
+ }
1096
+ ],
1097
+ "button": null,
1098
+ "lowContrast": [
1099
+ {
1100
+ "text": "AI-agent ready",
1101
+ "ratio": 1,
1102
+ "need": 3,
1103
+ "size": 24,
1104
+ "fg": "#fffcf0",
1105
+ "bg": "#fffcf0"
1106
+ },
1107
+ {
1108
+ "text": "Skills and AGENTS.md teach coding agents",
1109
+ "ratio": 1,
1110
+ "need": 4.5,
1111
+ "size": 16,
1112
+ "fg": "#fffcf0",
1113
+ "bg": "#fffcf0"
1114
+ },
1115
+ {
1116
+ "text": "> add a newsletter signup",
1117
+ "ratio": 1,
1118
+ "need": 4.5,
1119
+ "size": 12.8,
1120
+ "fg": "#fffcf0",
1121
+ "bg": "#fffcf0"
1122
+ },
1123
+ {
1124
+ "text": "+ <div formDataProvider=\"newsletter\">",
1125
+ "ratio": 1,
1126
+ "need": 4.5,
1127
+ "size": 12.8,
1128
+ "fg": "#fffcf0",
1129
+ "bg": "#fffcf0"
1130
+ },
1131
+ {
1132
+ "text": "+ <sonic-input name=\"email\" type=\"email\"",
1133
+ "ratio": 1,
1134
+ "need": 4.5,
1135
+ "size": 12.8,
1136
+ "fg": "#fffcf0",
1137
+ "bg": "#fffcf0"
1138
+ },
1139
+ {
1140
+ "text": "+ <sonic-submit endPoint=\"newsletter\">",
1141
+ "ratio": 1,
1142
+ "need": 4.5,
1143
+ "size": 12.8,
1144
+ "fg": "#fffcf0",
1145
+ "bg": "#fffcf0"
1146
+ }
1147
+ ]
1148
+ },
1149
+ "buttons": {
1150
+ "count": 0,
1151
+ "inHero": 0,
1152
+ "withShadow": 0,
1153
+ "withGradient": 0,
1154
+ "mono": 0,
1155
+ "upper": 0,
1156
+ "heroLabels": []
1157
+ },
1158
+ "surfaces": {
1159
+ "shadowStatic": 0,
1160
+ "shadowOverlay": 0,
1161
+ "shadowSamples": [],
1162
+ "gradients": 1,
1163
+ "scrims": 2,
1164
+ "gradientSamples": [
1165
+ "div.hero-glow → radial-gradient(closest-side, rgb(251, 146, 60), rgba(0, 0, 0, 0)), radial-gradient(closest-side, rgb(59, 130,"
1166
+ ],
1167
+ "gradientText": 0,
1168
+ "hairlines": 0,
1169
+ "hairlineSamples": [],
1170
+ "outlinedBoxes": 1,
1171
+ "dashed": 0,
1172
+ "blurred": 0,
1173
+ "roundedBoxes": 2,
1174
+ "boxRadius": 50,
1175
+ "squareMedia": 0,
1176
+ "roundedMedia": 0,
1177
+ "mediaRadius": 0,
1178
+ "textShadow": 0,
1179
+ "cardRows": []
1180
+ },
1181
+ "heroMedia": [],
1182
+ "nav": null,
1183
+ "fontsLoaded": [
1184
+ "clashgrotesk-variable"
1185
+ ]
1186
+ },
1187
+ "layout": {
1188
+ "viewport": {
1189
+ "w": 768,
1190
+ "h": 1024
1191
+ },
1192
+ "pageH": 5720,
1193
+ "margins": {
1194
+ "left": 24,
1195
+ "right": 34
1196
+ },
1197
+ "sections": [
1198
+ {
1199
+ "sel": "section.relative.grid",
1200
+ "tag": "section",
1201
+ "top": 66,
1202
+ "height": 1287,
1203
+ "words": 52,
1204
+ "media": 0,
1205
+ "middle": 0,
1206
+ "heading": {
1207
+ "text": "webcomponents for",
1208
+ "size": 60,
1209
+ "tag": "h1"
1210
+ },
1211
+ "left": 24,
1212
+ "right": 147,
1213
+ "textLeft": 24,
1214
+ "textRight": 147,
1215
+ "fullBleed": false,
1216
+ "footer": false,
1217
+ "hero": true,
1218
+ "continues": false,
1219
+ "pinned": false
1220
+ },
1221
+ {
1222
+ "sel": "section.py-20.md:py-28",
1223
+ "tag": "section",
1224
+ "top": 1441,
1225
+ "height": 1894,
1226
+ "words": 158,
1227
+ "media": 0,
1228
+ "middle": 0,
1229
+ "heading": {
1230
+ "text": "Write HTML. Get an app.",
1231
+ "size": 48,
1232
+ "tag": "h2"
1233
+ },
1234
+ "left": 24,
1235
+ "right": 51,
1236
+ "textLeft": 24,
1237
+ "textRight": 51,
1238
+ "fullBleed": false,
1239
+ "footer": false,
1240
+ "hero": false,
1241
+ "continues": false,
1242
+ "pinned": false
1243
+ },
1244
+ {
1245
+ "sel": "section.py-16.md:py-24",
1246
+ "tag": "section",
1247
+ "top": 3335,
1248
+ "height": 1097,
1249
+ "words": 36,
1250
+ "media": 0,
1251
+ "middle": 0,
1252
+ "heading": {
1253
+ "text": "State that flows through markup",
1254
+ "size": 48,
1255
+ "tag": "h2"
1256
+ },
1257
+ "left": 24,
1258
+ "right": 26,
1259
+ "textLeft": 24,
1260
+ "textRight": 26,
1261
+ "fullBleed": false,
1262
+ "footer": false,
1263
+ "hero": false,
1264
+ "continues": false,
1265
+ "pinned": false
1266
+ },
1267
+ {
1268
+ "sel": "section.py-12.md:py-20",
1269
+ "tag": "section",
1270
+ "top": 4432,
1271
+ "height": 580,
1272
+ "words": 47,
1273
+ "media": 0,
1274
+ "middle": 0,
1275
+ "heading": {
1276
+ "text": "100",
1277
+ "size": 60,
1278
+ "tag": "span"
1279
+ },
1280
+ "left": 73,
1281
+ "right": 108,
1282
+ "textLeft": 73,
1283
+ "textRight": 108,
1284
+ "fullBleed": false,
1285
+ "footer": false,
1286
+ "hero": false,
1287
+ "continues": false,
1288
+ "pinned": false
1289
+ },
1290
+ {
1291
+ "sel": "section.relative.pt-10",
1292
+ "tag": "section",
1293
+ "top": 5012,
1294
+ "height": 707,
1295
+ "words": 11,
1296
+ "media": 0,
1297
+ "middle": 0,
1298
+ "heading": {
1299
+ "text": "Ready for take-off?",
1300
+ "size": 60,
1301
+ "tag": "h2"
1302
+ },
1303
+ "left": 143,
1304
+ "right": 143,
1305
+ "textLeft": 143,
1306
+ "textRight": 143,
1307
+ "fullBleed": false,
1308
+ "footer": true,
1309
+ "hero": false,
1310
+ "continues": false,
1311
+ "pinned": false
1312
+ }
1313
+ ],
1314
+ "gaps": [
1315
+ {
1316
+ "top": 732,
1317
+ "height": 352
1318
+ },
1319
+ {
1320
+ "top": 3796,
1321
+ "height": 760
1322
+ }
1323
+ ],
1324
+ "h1s": [
1325
+ {
1326
+ "text": "webcomponents for scoped consistent shareable user interfaces",
1327
+ "size": 60,
1328
+ "top": 182,
1329
+ "firstScreen": true
1330
+ }
1331
+ ],
1332
+ "edgeText": [],
1333
+ "edges": [
1334
+ {
1335
+ "x": 24,
1336
+ "n": 8
1337
+ },
1338
+ {
1339
+ "x": 51,
1340
+ "n": 7
1341
+ },
1342
+ {
1343
+ "x": 410,
1344
+ "n": 3
1345
+ },
1346
+ {
1347
+ "x": 73,
1348
+ "n": 2
1349
+ }
1350
+ ],
1351
+ "leftBlocks": 20,
1352
+ "bodySize": 18,
1353
+ "stage": false,
1354
+ "explains": true,
1355
+ "slivers": [],
1356
+ "voidShare": 0,
1357
+ "voidBox": null
1358
+ },
1359
+ "app": null,
1360
+ "consoleErrors": []
1361
+ },
1362
+ {
1363
+ "width": 390,
1364
+ "height": 844,
1365
+ "load": "load",
1366
+ "screens": 8,
1367
+ "filled": [
1368
+ 0.4,
1369
+ 0.48,
1370
+ 0.19,
1371
+ 0.2,
1372
+ 0.16,
1373
+ 0.19,
1374
+ 0.21,
1375
+ 0.26
1376
+ ],
1377
+ "motion": {
1378
+ "elements": 35,
1379
+ "css": 20,
1380
+ "transitions": 15,
1381
+ "scripted": 0,
1382
+ "videos": 0,
1383
+ "playingVideos": 0
1384
+ },
1385
+ "metrics": {
1386
+ "viewport": {
1387
+ "w": 390,
1388
+ "h": 844
1389
+ },
1390
+ "page": {
1391
+ "height": 6435,
1392
+ "screens": 7.6,
1393
+ "words": 366,
1394
+ "img": 0,
1395
+ "video": 0,
1396
+ "canvas": 0,
1397
+ "svg": 0,
1398
+ "sections": 6,
1399
+ "horizontalOverflow": 0,
1400
+ "overflowCulprits": [],
1401
+ "uiFragments": 0,
1402
+ "uiAbuse": false,
1403
+ "realPictures": 0,
1404
+ "videoCount": 0,
1405
+ "uiPictures": 0,
1406
+ "pictureSamples": [],
1407
+ "blendText": 0,
1408
+ "sideScrollers": 0,
1409
+ "brokenImages": [],
1410
+ "emoji": [
1411
+ "✓"
1412
+ ],
1413
+ "videosNoPoster": 0
1414
+ },
1415
+ "hero": {
1416
+ "text": "webcomponents for scoped consistent shareable user interfaces",
1417
+ "words": 7,
1418
+ "chars": 61,
1419
+ "lines": 4,
1420
+ "size": 41.6,
1421
+ "vw": 10.7,
1422
+ "font": "ClashGrotesk-Variable",
1423
+ "weight": 400,
1424
+ "tracking": 0,
1425
+ "leading": 1.02,
1426
+ "upper": false,
1427
+ "italic": false,
1428
+ "mono": false,
1429
+ "align": "left",
1430
+ "position": "center",
1431
+ "widthRatio": 0.92,
1432
+ "top": 158,
1433
+ "tag": "h1",
1434
+ "kind": "heading"
1435
+ },
1436
+ "h1": {
1437
+ "text": "webcomponents for scoped consistent shareable user interfaces",
1438
+ "words": 7,
1439
+ "lines": 4,
1440
+ "size": 41.6,
1441
+ "font": "ClashGrotesk-Variable"
1442
+ },
1443
+ "headings": [
1444
+ {
1445
+ "text": "webcomponents for scoped consistent shareable user interfaces",
1446
+ "words": 7,
1447
+ "chars": 61,
1448
+ "lines": 4,
1449
+ "size": 41.6,
1450
+ "vw": 10.7,
1451
+ "font": "ClashGrotesk-Variable",
1452
+ "weight": 400,
1453
+ "tracking": 0,
1454
+ "leading": 1.02,
1455
+ "upper": false,
1456
+ "italic": false,
1457
+ "mono": false,
1458
+ "align": "left",
1459
+ "position": "center",
1460
+ "widthRatio": 0.92,
1461
+ "top": 158,
1462
+ "tag": "h1",
1463
+ "kind": "heading"
1464
+ },
1465
+ {
1466
+ "text": "2.04",
1467
+ "words": 1,
1468
+ "chars": 4,
1469
+ "lines": 1,
1470
+ "size": 56,
1471
+ "vw": 14.4,
1472
+ "font": "ClashGrotesk-Variable",
1473
+ "weight": 500,
1474
+ "tracking": -0.04,
1475
+ "leading": 0.8,
1476
+ "upper": false,
1477
+ "italic": false,
1478
+ "mono": false,
1479
+ "align": "left",
1480
+ "position": "left",
1481
+ "widthRatio": 0.28,
1482
+ "top": 1113,
1483
+ "tag": "div",
1484
+ "kind": "heading"
1485
+ },
1486
+ {
1487
+ "text": "Write HTML. Get an app.",
1488
+ "words": 5,
1489
+ "chars": 23,
1490
+ "lines": 2,
1491
+ "size": 36,
1492
+ "vw": 9.2,
1493
+ "font": "ClashGrotesk-Variable",
1494
+ "weight": 400,
1495
+ "tracking": 0,
1496
+ "leading": 1,
1497
+ "upper": false,
1498
+ "italic": false,
1499
+ "mono": false,
1500
+ "align": "left",
1501
+ "position": "center",
1502
+ "widthRatio": 0.92,
1503
+ "top": 1410,
1504
+ "tag": "h2",
1505
+ "kind": "heading"
1506
+ },
1507
+ {
1508
+ "text": "Data binding, zero glue",
1509
+ "words": 4,
1510
+ "chars": 23,
1511
+ "lines": 1,
1512
+ "size": 24,
1513
+ "vw": 6.2,
1514
+ "font": "ClashGrotesk-Variable",
1515
+ "weight": 400,
1516
+ "tracking": 0,
1517
+ "leading": 1.1,
1518
+ "upper": false,
1519
+ "italic": false,
1520
+ "mono": false,
1521
+ "align": "left",
1522
+ "position": "center",
1523
+ "widthRatio": 0.78,
1524
+ "top": 1681,
1525
+ "tag": "h3",
1526
+ "kind": "heading"
1527
+ },
1528
+ {
1529
+ "text": "Framework-agnostic",
1530
+ "words": 1,
1531
+ "chars": 18,
1532
+ "lines": 1,
1533
+ "size": 24,
1534
+ "vw": 6.2,
1535
+ "font": "ClashGrotesk-Variable",
1536
+ "weight": 400,
1537
+ "tracking": 0,
1538
+ "leading": 1.1,
1539
+ "upper": false,
1540
+ "italic": false,
1541
+ "mono": false,
1542
+ "align": "left",
1543
+ "position": "center",
1544
+ "widthRatio": 0.78,
1545
+ "top": 2000,
1546
+ "tag": "h3",
1547
+ "kind": "heading"
1548
+ },
1549
+ {
1550
+ "text": "Themed by a few variables",
1551
+ "words": 5,
1552
+ "chars": 25,
1553
+ "lines": 1,
1554
+ "size": 24,
1555
+ "vw": 6.2,
1556
+ "font": "ClashGrotesk-Variable",
1557
+ "weight": 400,
1558
+ "tracking": 0,
1559
+ "leading": 1.1,
1560
+ "upper": false,
1561
+ "italic": false,
1562
+ "mono": false,
1563
+ "align": "left",
1564
+ "position": "center",
1565
+ "widthRatio": 0.78,
1566
+ "top": 2462,
1567
+ "tag": "h3",
1568
+ "kind": "heading"
1569
+ },
1570
+ {
1571
+ "text": "Server-driven UI",
1572
+ "words": 2,
1573
+ "chars": 16,
1574
+ "lines": 1,
1575
+ "size": 24,
1576
+ "vw": 6.2,
1577
+ "font": "ClashGrotesk-Variable",
1578
+ "weight": 400,
1579
+ "tracking": 0,
1580
+ "leading": 1.1,
1581
+ "upper": false,
1582
+ "italic": false,
1583
+ "mono": false,
1584
+ "align": "left",
1585
+ "position": "center",
1586
+ "widthRatio": 0.78,
1587
+ "top": 2923,
1588
+ "tag": "h3",
1589
+ "kind": "heading"
1590
+ },
1591
+ {
1592
+ "text": "Declarative APIs",
1593
+ "words": 2,
1594
+ "chars": 16,
1595
+ "lines": 1,
1596
+ "size": 24,
1597
+ "vw": 6.2,
1598
+ "font": "ClashGrotesk-Variable",
1599
+ "weight": 400,
1600
+ "tracking": 0,
1601
+ "leading": 1.1,
1602
+ "upper": false,
1603
+ "italic": false,
1604
+ "mono": false,
1605
+ "align": "left",
1606
+ "position": "center",
1607
+ "widthRatio": 0.78,
1608
+ "top": 3513,
1609
+ "tag": "h3",
1610
+ "kind": "heading"
1611
+ },
1612
+ {
1613
+ "text": "AI-agent ready",
1614
+ "words": 2,
1615
+ "chars": 14,
1616
+ "lines": 1,
1617
+ "size": 24,
1618
+ "vw": 6.2,
1619
+ "font": "ClashGrotesk-Variable",
1620
+ "weight": 400,
1621
+ "tracking": 0,
1622
+ "leading": 1.1,
1623
+ "upper": false,
1624
+ "italic": false,
1625
+ "mono": false,
1626
+ "align": "left",
1627
+ "position": "center",
1628
+ "widthRatio": 0.78,
1629
+ "top": 3793,
1630
+ "tag": "h3",
1631
+ "kind": "heading"
1632
+ },
1633
+ {
1634
+ "text": "State that flows through markup",
1635
+ "words": 5,
1636
+ "chars": 31,
1637
+ "lines": 2,
1638
+ "size": 36,
1639
+ "vw": 9.2,
1640
+ "font": "ClashGrotesk-Variable",
1641
+ "weight": 400,
1642
+ "tracking": 0,
1643
+ "leading": 1,
1644
+ "upper": false,
1645
+ "italic": false,
1646
+ "mono": false,
1647
+ "align": "left",
1648
+ "position": "center",
1649
+ "widthRatio": 0.92,
1650
+ "top": 4212,
1651
+ "tag": "h2",
1652
+ "kind": "heading"
1653
+ },
1654
+ {
1655
+ "text": "Built for 100 ticketing sites at once",
1656
+ "words": 7,
1657
+ "chars": 37,
1658
+ "lines": 2,
1659
+ "size": 30,
1660
+ "vw": 7.7,
1661
+ "font": "ClashGrotesk-Variable",
1662
+ "weight": 400,
1663
+ "tracking": 0,
1664
+ "leading": 1,
1665
+ "upper": false,
1666
+ "italic": false,
1667
+ "mono": false,
1668
+ "align": "left",
1669
+ "position": "center",
1670
+ "widthRatio": 0.75,
1671
+ "top": 5455,
1672
+ "tag": "h2",
1673
+ "kind": "heading"
1674
+ },
1675
+ {
1676
+ "text": "100",
1677
+ "words": 1,
1678
+ "chars": 3,
1679
+ "lines": 1,
1680
+ "size": 36,
1681
+ "vw": 9.2,
1682
+ "font": "ClashGrotesk-Variable",
1683
+ "weight": 400,
1684
+ "tracking": 0,
1685
+ "leading": 1,
1686
+ "upper": false,
1687
+ "italic": false,
1688
+ "mono": false,
1689
+ "align": "center",
1690
+ "position": "left",
1691
+ "widthRatio": 0.21,
1692
+ "top": 5733,
1693
+ "tag": "div",
1694
+ "kind": "heading"
1695
+ },
1696
+ {
1697
+ "text": "35+",
1698
+ "words": 1,
1699
+ "chars": 3,
1700
+ "lines": 1,
1701
+ "size": 36,
1702
+ "vw": 9.2,
1703
+ "font": "ClashGrotesk-Variable",
1704
+ "weight": 400,
1705
+ "tracking": 0,
1706
+ "leading": 1,
1707
+ "upper": false,
1708
+ "italic": false,
1709
+ "mono": false,
1710
+ "align": "center",
1711
+ "position": "center",
1712
+ "widthRatio": 0.21,
1713
+ "top": 5733,
1714
+ "tag": "div",
1715
+ "kind": "heading"
1716
+ },
1717
+ {
1718
+ "text": "0",
1719
+ "words": 1,
1720
+ "chars": 1,
1721
+ "lines": 1,
1722
+ "size": 36,
1723
+ "vw": 9.2,
1724
+ "font": "ClashGrotesk-Variable",
1725
+ "weight": 400,
1726
+ "tracking": 0,
1727
+ "leading": 1,
1728
+ "upper": false,
1729
+ "italic": false,
1730
+ "mono": false,
1731
+ "align": "center",
1732
+ "position": "right",
1733
+ "widthRatio": 0.21,
1734
+ "top": 5733,
1735
+ "tag": "div",
1736
+ "kind": "heading"
1737
+ },
1738
+ {
1739
+ "text": "Ready for take-off?",
1740
+ "words": 3,
1741
+ "chars": 19,
1742
+ "lines": 1,
1743
+ "size": 36,
1744
+ "vw": 9.2,
1745
+ "font": "ClashGrotesk-Variable",
1746
+ "weight": 400,
1747
+ "tracking": 0,
1748
+ "leading": 1,
1749
+ "upper": false,
1750
+ "italic": false,
1751
+ "mono": false,
1752
+ "align": "center",
1753
+ "position": "center",
1754
+ "widthRatio": 0.92,
1755
+ "top": 5934,
1756
+ "tag": "h2",
1757
+ "kind": "heading"
1758
+ }
1759
+ ],
1760
+ "headingSummary": {
1761
+ "count": 15,
1762
+ "maxLines": 4,
1763
+ "over2Lines": 1,
1764
+ "statements": 0,
1765
+ "centered": 4,
1766
+ "medianWords": 2,
1767
+ "mixedFontHeadings": 0
1768
+ },
1769
+ "type": {
1770
+ "families": [
1771
+ {
1772
+ "family": "Arial",
1773
+ "share": 0.48,
1774
+ "mono": false
1775
+ },
1776
+ {
1777
+ "family": "ClashGrotesk-Variable",
1778
+ "share": 0.43,
1779
+ "mono": false
1780
+ },
1781
+ {
1782
+ "family": "ui-monospace",
1783
+ "share": 0.09,
1784
+ "mono": false
1785
+ }
1786
+ ],
1787
+ "familyCount": 3,
1788
+ "sizes": [
1789
+ 11,
1790
+ 12,
1791
+ 13,
1792
+ 14,
1793
+ 16,
1794
+ 18,
1795
+ 20,
1796
+ 24,
1797
+ 30,
1798
+ 36,
1799
+ 42,
1800
+ 56
1801
+ ],
1802
+ "sizeCount": 12,
1803
+ "notLoaded": [],
1804
+ "body": {
1805
+ "font": "Arial",
1806
+ "size": 18,
1807
+ "leading": 1.5,
1808
+ "weight": 400,
1809
+ "tracking": 0,
1810
+ "contrast": 6.8
1811
+ },
1812
+ "measureChars": 32,
1813
+ "max": {
1814
+ "size": 56,
1815
+ "vw": 14.4,
1816
+ "font": "ClashGrotesk-Variable",
1817
+ "text": "2.04"
1818
+ },
1819
+ "monoShare": 0.09,
1820
+ "monoProseShare": 0.09,
1821
+ "monoFamilies": [
1822
+ "ui-monospace"
1823
+ ],
1824
+ "monoSamples": [
1825
+ "Mach",
1826
+ "CDG — JFK",
1827
+ "FL 600",
1828
+ "3 h 30",
1829
+ "> add a newsletter signup",
1830
+ "+ <div formDataProvider=\"newsletter\">"
1831
+ ],
1832
+ "microLabels": 4,
1833
+ "microLabelShare": 0.011,
1834
+ "microSamples": [
1835
+ "Mach",
1836
+ "CDG — JFK",
1837
+ "FL 600",
1838
+ "3 h 30"
1839
+ ],
1840
+ "upperShare": 0.02,
1841
+ "centerShare": 0.06,
1842
+ "smallText": 8
1843
+ },
1844
+ "eyebrows": [
1845
+ {
1846
+ "text": "v5.1",
1847
+ "above": "webcomponents for scoped consistent shar",
1848
+ "upper": false,
1849
+ "tracked": false,
1850
+ "mono": false,
1851
+ "pill": true,
1852
+ "size": 14,
1853
+ "top": 106
1854
+ },
1855
+ {
1856
+ "text": "FL 600",
1857
+ "above": "2.04",
1858
+ "upper": true,
1859
+ "tracked": true,
1860
+ "mono": true,
1861
+ "pill": false,
1862
+ "size": 11.2,
1863
+ "top": 1031
1864
+ }
1865
+ ],
1866
+ "numbered": [],
1867
+ "color": {
1868
+ "bodyBg": "#fffcf0",
1869
+ "bodyBgHsl": {
1870
+ "h": 48,
1871
+ "s": 1,
1872
+ "l": 0.97
1873
+ },
1874
+ "dark": false,
1875
+ "sectionBgs": [
1876
+ {
1877
+ "color": "#fffcf0",
1878
+ "top": 731,
1879
+ "hsl": {
1880
+ "h": 48,
1881
+ "s": 1,
1882
+ "l": 0.97
1883
+ }
1884
+ }
1885
+ ],
1886
+ "textColors": [
1887
+ {
1888
+ "color": "#111111",
1889
+ "share": 0.49
1890
+ },
1891
+ {
1892
+ "color": "#fffcf0",
1893
+ "share": 0.28
1894
+ },
1895
+ {
1896
+ "color": "#5a5956",
1897
+ "share": 0.21
1898
+ },
1899
+ {
1900
+ "color": "#10b981",
1901
+ "share": 0.01
1902
+ },
1903
+ {
1904
+ "color": "#ffffff",
1905
+ "share": 0
1906
+ }
1907
+ ],
1908
+ "button": null,
1909
+ "lowContrast": [
1910
+ {
1911
+ "text": "AI-agent ready",
1912
+ "ratio": 1,
1913
+ "need": 3,
1914
+ "size": 24,
1915
+ "fg": "#fffcf0",
1916
+ "bg": "#fffcf0"
1917
+ },
1918
+ {
1919
+ "text": "Skills and AGENTS.md teach coding agents",
1920
+ "ratio": 1,
1921
+ "need": 4.5,
1922
+ "size": 16,
1923
+ "fg": "#fffcf0",
1924
+ "bg": "#fffcf0"
1925
+ },
1926
+ {
1927
+ "text": "> add a newsletter signup",
1928
+ "ratio": 1,
1929
+ "need": 4.5,
1930
+ "size": 12.8,
1931
+ "fg": "#fffcf0",
1932
+ "bg": "#fffcf0"
1933
+ },
1934
+ {
1935
+ "text": "+ <div formDataProvider=\"newsletter\">",
1936
+ "ratio": 1,
1937
+ "need": 4.5,
1938
+ "size": 12.8,
1939
+ "fg": "#fffcf0",
1940
+ "bg": "#fffcf0"
1941
+ },
1942
+ {
1943
+ "text": "+ <sonic-input name=\"email\" type=\"email\"",
1944
+ "ratio": 1,
1945
+ "need": 4.5,
1946
+ "size": 12.8,
1947
+ "fg": "#fffcf0",
1948
+ "bg": "#fffcf0"
1949
+ },
1950
+ {
1951
+ "text": "+ <sonic-submit endPoint=\"newsletter\">",
1952
+ "ratio": 1,
1953
+ "need": 4.5,
1954
+ "size": 12.8,
1955
+ "fg": "#fffcf0",
1956
+ "bg": "#fffcf0"
1957
+ }
1958
+ ]
1959
+ },
1960
+ "buttons": {
1961
+ "count": 0,
1962
+ "inHero": 0,
1963
+ "withShadow": 0,
1964
+ "withGradient": 0,
1965
+ "mono": 0,
1966
+ "upper": 0,
1967
+ "heroLabels": []
1968
+ },
1969
+ "surfaces": {
1970
+ "shadowStatic": 0,
1971
+ "shadowOverlay": 0,
1972
+ "shadowSamples": [],
1973
+ "gradients": 1,
1974
+ "scrims": 2,
1975
+ "gradientSamples": [
1976
+ "div.hero-glow → radial-gradient(closest-side, rgb(251, 146, 60), rgba(0, 0, 0, 0)), radial-gradient(closest-side, rgb(59, 130,"
1977
+ ],
1978
+ "gradientText": 0,
1979
+ "hairlines": 0,
1980
+ "hairlineSamples": [],
1981
+ "outlinedBoxes": 1,
1982
+ "dashed": 0,
1983
+ "blurred": 0,
1984
+ "roundedBoxes": 2,
1985
+ "boxRadius": 50,
1986
+ "squareMedia": 0,
1987
+ "roundedMedia": 0,
1988
+ "mediaRadius": 0,
1989
+ "textShadow": 0,
1990
+ "cardRows": []
1991
+ },
1992
+ "heroMedia": [],
1993
+ "nav": null,
1994
+ "fontsLoaded": [
1995
+ "clashgrotesk-variable"
1996
+ ]
1997
+ },
1998
+ "layout": {
1999
+ "viewport": {
2000
+ "w": 390,
2001
+ "h": 844
2002
+ },
2003
+ "pageH": 6435,
2004
+ "margins": {
2005
+ "left": 16,
2006
+ "right": 16
2007
+ },
2008
+ "sections": [
2009
+ {
2010
+ "sel": "section.relative.grid",
2011
+ "tag": "section",
2012
+ "top": 66,
2013
+ "height": 1176,
2014
+ "words": 52,
2015
+ "media": 0,
2016
+ "middle": 0,
2017
+ "heading": {
2018
+ "text": "webcomponents for",
2019
+ "size": 42,
2020
+ "tag": "h1"
2021
+ },
2022
+ "left": 16,
2023
+ "right": 24,
2024
+ "textLeft": 16,
2025
+ "textRight": 24,
2026
+ "fullBleed": false,
2027
+ "footer": false,
2028
+ "hero": true,
2029
+ "continues": false,
2030
+ "pinned": false
2031
+ },
2032
+ {
2033
+ "sel": "div.max-w-3xl.mb-12",
2034
+ "tag": "div",
2035
+ "top": 1410,
2036
+ "height": 196,
2037
+ "words": 26,
2038
+ "media": 0,
2039
+ "middle": 0,
2040
+ "heading": null,
2041
+ "left": 16,
2042
+ "right": 18,
2043
+ "textLeft": 16,
2044
+ "textRight": 18,
2045
+ "fullBleed": false,
2046
+ "footer": false,
2047
+ "hero": false,
2048
+ "continues": true,
2049
+ "pinned": false
2050
+ },
2051
+ {
2052
+ "sel": "sonic-card.grid.bento-a",
2053
+ "tag": "sonic-card",
2054
+ "top": 1656,
2055
+ "height": 318,
2056
+ "words": 16,
2057
+ "media": 0,
2058
+ "middle": 0,
2059
+ "heading": {
2060
+ "text": "Data binding, zero glue",
2061
+ "size": 24,
2062
+ "tag": "h3"
2063
+ },
2064
+ "left": 43,
2065
+ "right": 67,
2066
+ "textLeft": 43,
2067
+ "textRight": 67,
2068
+ "fullBleed": false,
2069
+ "footer": false,
2070
+ "hero": false,
2071
+ "continues": true,
2072
+ "pinned": false
2073
+ },
2074
+ {
2075
+ "sel": "sonic-card.grid.bento-b",
2076
+ "tag": "sonic-card",
2077
+ "top": 1975,
2078
+ "height": 463,
2079
+ "words": 18,
2080
+ "media": 0,
2081
+ "middle": 0,
2082
+ "heading": {
2083
+ "text": "Framework-agnostic",
2084
+ "size": 24,
2085
+ "tag": "h3"
2086
+ },
2087
+ "left": 43,
2088
+ "right": 62,
2089
+ "textLeft": 43,
2090
+ "textRight": 62,
2091
+ "fullBleed": false,
2092
+ "footer": false,
2093
+ "hero": false,
2094
+ "continues": true,
2095
+ "pinned": false
2096
+ },
2097
+ {
2098
+ "sel": "sonic-card.grid.bento-c",
2099
+ "tag": "sonic-card",
2100
+ "top": 2437,
2101
+ "height": 460,
2102
+ "words": 26,
2103
+ "media": 0,
2104
+ "middle": 0,
2105
+ "heading": {
2106
+ "text": "Themed by a few variables",
2107
+ "size": 24,
2108
+ "tag": "h3"
2109
+ },
2110
+ "left": 43,
2111
+ "right": 71,
2112
+ "textLeft": 43,
2113
+ "textRight": 71,
2114
+ "fullBleed": false,
2115
+ "footer": false,
2116
+ "hero": false,
2117
+ "continues": true,
2118
+ "pinned": false
2119
+ },
2120
+ {
2121
+ "sel": "sonic-card.grid.bento-d",
2122
+ "tag": "sonic-card",
2123
+ "top": 2898,
2124
+ "height": 590,
2125
+ "words": 21,
2126
+ "media": 0,
2127
+ "middle": 0,
2128
+ "heading": {
2129
+ "text": "Server-driven UI",
2130
+ "size": 24,
2131
+ "tag": "h3"
2132
+ },
2133
+ "left": 43,
2134
+ "right": 48,
2135
+ "textLeft": 43,
2136
+ "textRight": 48,
2137
+ "fullBleed": false,
2138
+ "footer": false,
2139
+ "hero": false,
2140
+ "continues": true,
2141
+ "pinned": false
2142
+ },
2143
+ {
2144
+ "sel": "sonic-card.grid.bento-e",
2145
+ "tag": "sonic-card",
2146
+ "top": 3488,
2147
+ "height": 280,
2148
+ "words": 15,
2149
+ "media": 0,
2150
+ "middle": 0,
2151
+ "heading": {
2152
+ "text": "Declarative APIs",
2153
+ "size": 24,
2154
+ "tag": "h3"
2155
+ },
2156
+ "left": 43,
2157
+ "right": 89,
2158
+ "textLeft": 43,
2159
+ "textRight": 89,
2160
+ "fullBleed": false,
2161
+ "footer": false,
2162
+ "hero": false,
2163
+ "continues": true,
2164
+ "pinned": false
2165
+ },
2166
+ {
2167
+ "sel": "sonic-card.grid.bento-f",
2168
+ "tag": "sonic-card",
2169
+ "top": 3768,
2170
+ "height": 300,
2171
+ "words": 31,
2172
+ "media": 0,
2173
+ "middle": 0,
2174
+ "heading": {
2175
+ "text": "AI-agent ready",
2176
+ "size": 24,
2177
+ "tag": "h3"
2178
+ },
2179
+ "left": 43,
2180
+ "right": 43,
2181
+ "textLeft": 43,
2182
+ "textRight": 43,
2183
+ "fullBleed": false,
2184
+ "footer": false,
2185
+ "hero": false,
2186
+ "continues": true,
2187
+ "pinned": false
2188
+ },
2189
+ {
2190
+ "sel": "section.py-16.md:py-24",
2191
+ "tag": "section",
2192
+ "top": 4148,
2193
+ "height": 1225,
2194
+ "words": 36,
2195
+ "media": 0,
2196
+ "middle": 0,
2197
+ "heading": {
2198
+ "text": "State that flows through markup",
2199
+ "size": 36,
2200
+ "tag": "h2"
2201
+ },
2202
+ "left": 16,
2203
+ "right": 16,
2204
+ "textLeft": 16,
2205
+ "textRight": 16,
2206
+ "fullBleed": false,
2207
+ "footer": false,
2208
+ "hero": false,
2209
+ "continues": false,
2210
+ "pinned": false
2211
+ },
2212
+ {
2213
+ "sel": "section.py-12.md:py-20",
2214
+ "tag": "section",
2215
+ "top": 5374,
2216
+ "height": 520,
2217
+ "words": 47,
2218
+ "media": 0,
2219
+ "middle": 0,
2220
+ "heading": {
2221
+ "text": "100",
2222
+ "size": 36,
2223
+ "tag": "span"
2224
+ },
2225
+ "left": 49,
2226
+ "right": 58,
2227
+ "textLeft": 49,
2228
+ "textRight": 58,
2229
+ "fullBleed": false,
2230
+ "footer": false,
2231
+ "hero": false,
2232
+ "continues": false,
2233
+ "pinned": false
2234
+ },
2235
+ {
2236
+ "sel": "section.relative.pt-10",
2237
+ "tag": "section",
2238
+ "top": 5894,
2239
+ "height": 542,
2240
+ "words": 11,
2241
+ "media": 0,
2242
+ "middle": 0,
2243
+ "heading": {
2244
+ "text": "Ready for take-off?",
2245
+ "size": 36,
2246
+ "tag": "h2"
2247
+ },
2248
+ "left": 50,
2249
+ "right": 50,
2250
+ "textLeft": 50,
2251
+ "textRight": 50,
2252
+ "fullBleed": false,
2253
+ "footer": true,
2254
+ "hero": false,
2255
+ "continues": false,
2256
+ "pinned": false
2257
+ }
2258
+ ],
2259
+ "gaps": [
2260
+ {
2261
+ "top": 768,
2262
+ "height": 260
2263
+ },
2264
+ {
2265
+ "top": 3060,
2266
+ "height": 372
2267
+ },
2268
+ {
2269
+ "top": 4656,
2270
+ "height": 792
2271
+ }
2272
+ ],
2273
+ "h1s": [
2274
+ {
2275
+ "text": "webcomponents for scoped consistent shareable user interfaces",
2276
+ "size": 42,
2277
+ "top": 158,
2278
+ "firstScreen": true
2279
+ }
2280
+ ],
2281
+ "edgeText": [],
2282
+ "edges": [
2283
+ {
2284
+ "x": 43,
2285
+ "n": 12
2286
+ },
2287
+ {
2288
+ "x": 16,
2289
+ "n": 8
2290
+ }
2291
+ ],
2292
+ "leftBlocks": 20,
2293
+ "bodySize": 18,
2294
+ "stage": false,
2295
+ "explains": true,
2296
+ "slivers": [],
2297
+ "voidShare": 0,
2298
+ "voidBox": null
2299
+ },
2300
+ "app": null,
2301
+ "consoleErrors": []
2302
+ }
2303
+ ],
2304
+ "findings": [
2305
+ {
2306
+ "level": "FAIL",
2307
+ "id": "headline-lines",
2308
+ "width": 1440,
2309
+ "message": "1 headline(s) wrap past two lines at 1440px: \"webcomponents for scoped consistent shareable us\" → 3 lines (7 words, 72px)",
2310
+ "fix": "Cut words first (a headline is a title, not a sentence). Then give it a wider measure. Lower the size only as a last resort and never below the scale you chose. A real statement paragraph belongs in a <p> or <blockquote> at 36px or less."
2311
+ },
2312
+ {
2313
+ "level": "FAIL",
2314
+ "id": "eyebrow",
2315
+ "width": 1440,
2316
+ "message": "2 eyebrow/kicker label(s) above headings: \"v5.1\" (pill) above \"webcomponents for scoped consistent shar\"; \"FL 600\" above \"2.04\"",
2317
+ "fix": "Delete them. If the label carried real information, fold it into the headline or the supporting sentence.",
2318
+ "alsoAt": [
2319
+ 768,
2320
+ 390
2321
+ ]
2322
+ },
2323
+ {
2324
+ "level": "FAIL",
2325
+ "id": "mono",
2326
+ "width": 1440,
2327
+ "message": "Monospace type outside code: ui-monospace — e.g. \"Mach\", \"CDG — JFK\", \"FL 600\", \"3 h 30\"",
2328
+ "fix": "Set it in the text face. Monospace is for literal code inside <pre>/<code> only.",
2329
+ "alsoAt": [
2330
+ 768,
2331
+ 390
2332
+ ]
2333
+ },
2334
+ {
2335
+ "level": "FAIL",
2336
+ "id": "micro-label",
2337
+ "width": 1440,
2338
+ "message": "4 tiny uppercase letter-spaced labels (e.g. \"Mach\", \"CDG — JFK\", \"FL 600\", \"3 h 30\").",
2339
+ "fix": "Use sentence-case text at a readable size, or delete the label.",
2340
+ "alsoAt": [
2341
+ 768,
2342
+ 390
2343
+ ]
2344
+ },
2345
+ {
2346
+ "level": "FAIL",
2347
+ "id": "emoji",
2348
+ "width": 1440,
2349
+ "message": "Emoji in the page: ✓",
2350
+ "fix": "Remove. Use words or real imagery.",
2351
+ "alsoAt": [
2352
+ 768,
2353
+ 390
2354
+ ]
2355
+ },
2356
+ {
2357
+ "level": "FAIL",
2358
+ "id": "gradient",
2359
+ "width": 1440,
2360
+ "message": "1 gradient fill(s): div.hero-glow → radial-gradient(closest-side, rgb(251, 146, 60), rgba(0, 0, 0, 0)), radial-gradient(closest-side, rgb(59, 130,",
2361
+ "fix": "Use a flat colour or a real image. The only gradient allowed by default is a neutral scrim over a photo for legibility.",
2362
+ "alsoAt": [
2363
+ 768,
2364
+ 390
2365
+ ]
2366
+ },
2367
+ {
2368
+ "level": "WARN",
2369
+ "id": "outlined-box",
2370
+ "width": 1440,
2371
+ "message": "1 box(es) drawn with a 1px outline.",
2372
+ "fix": "Prefer a filled surface or no box.",
2373
+ "alsoAt": [
2374
+ 768,
2375
+ 390
2376
+ ]
2377
+ },
2378
+ {
2379
+ "level": "WARN",
2380
+ "id": "palette-cream",
2381
+ "width": 1440,
2382
+ "message": "Yellow-cream background (page background #fffcf0, text #fffcf0).",
2383
+ "fix": "Use the drawn palette. If you want warmth, take a low-chroma stone or bone, not a yellow cream.",
2384
+ "alsoAt": [
2385
+ 768,
2386
+ 390
2387
+ ]
2388
+ },
2389
+ {
2390
+ "level": "FAIL",
2391
+ "id": "contrast",
2392
+ "width": 1440,
2393
+ "message": "Unreadable text: \"AI-agent ready\" 1:1 (#fffcf0 on #fffcf0); \"Skills and AGENTS.md teach coding agents\" 1:1 (#fffcf0 on #fffcf0); \"> add a newsletter signup\" 1:1 (#fffcf0 on #fffcf0); \"+ <div formDataProvider=\"newsletter\">\" 1:1 (#fffcf0 on #fffcf0)",
2394
+ "fix": "Raise contrast to at least 4.5:1 for text, 3:1 for large display.",
2395
+ "alsoAt": [
2396
+ 768,
2397
+ 390
2398
+ ]
2399
+ },
2400
+ {
2401
+ "level": "WARN",
2402
+ "id": "font-count",
2403
+ "width": 1440,
2404
+ "message": "3 typefaces in use (Arial, ClashGrotesk-Variable, ui-monospace).",
2405
+ "fix": "Two at most.",
2406
+ "alsoAt": [
2407
+ 768,
2408
+ 390
2409
+ ]
2410
+ },
2411
+ {
2412
+ "level": "WARN",
2413
+ "id": "size-count",
2414
+ "width": 1440,
2415
+ "message": "11 different font sizes (11, 13, 14, 16, 18, 20, 24, 48, 60, 72, 120).",
2416
+ "fix": "A page needs about five: display, heading, lead, body, small.",
2417
+ "alsoAt": [
2418
+ 768,
2419
+ 390
2420
+ ]
2421
+ },
2422
+ {
2423
+ "level": "WARN",
2424
+ "id": "grey-body",
2425
+ "width": 1440,
2426
+ "message": "The running text is a soft grey on its ground (6.8:1).",
2427
+ "fix": "Set body copy in the full ink (7:1 or more). Keep the muted ink for secondary notes; pages read thin and unfinished when everything is grey.",
2428
+ "alsoAt": [
2429
+ 768,
2430
+ 390
2431
+ ]
2432
+ },
2433
+ {
2434
+ "level": "WARN",
2435
+ "id": "first-action",
2436
+ "width": 1440,
2437
+ "message": "No visible button in the first screen.",
2438
+ "fix": "Give the one primary action a real button in the first screen (a filled or solid-bordered control, 44px or taller), not only a link in the navigation.",
2439
+ "alsoAt": [
2440
+ 768,
2441
+ 390
2442
+ ]
2443
+ },
2444
+ {
2445
+ "level": "FAIL",
2446
+ "id": "few-pictures",
2447
+ "width": 1440,
2448
+ "message": "Only 0 picture(s) on the page (0 photographs, footage or raster images, 0 interface fragments). Drawings in SVG do not count.",
2449
+ "fix": "Find real pictures of the subject's world with scripts/assets.mjs (photographs, archival images, maps, engravings, footage), download them to assets/ and give them room: a hero picture, one per section that has a subject, a full-width band. At least four, usually six to twelve."
2450
+ },
2451
+ {
2452
+ "level": "WARN",
2453
+ "id": "no-footage",
2454
+ "width": 1440,
2455
+ "message": "No video anywhere on the page.",
2456
+ "fix": "Look for one honest clip with scripts/assets.mjs --video (the place, the material, the process) and use it as a muted loop with a poster frame. Defend its absence only if no clip fits the subject."
2457
+ },
2458
+ {
2459
+ "level": "FAIL",
2460
+ "id": "small-text",
2461
+ "width": 1440,
2462
+ "message": "5 text blocks under 13px.",
2463
+ "fix": "Nothing meant to be read goes below 13px.",
2464
+ "alsoAt": [
2465
+ 768,
2466
+ 390
2467
+ ]
2468
+ },
2469
+ {
2470
+ "level": "WARN",
2471
+ "id": "dev-server",
2472
+ "width": 1440,
2473
+ "message": "This page is served by a development server (Vite, webpack or Next in dev mode).",
2474
+ "fix": "Run the last gate on the production build too (vite build && vite preview, next build && next start, or the built index.html): minifiers and bundlers change the CSS a visitor receives.",
2475
+ "alsoAt": [
2476
+ 768,
2477
+ 390
2478
+ ]
2479
+ },
2480
+ {
2481
+ "level": "WARN",
2482
+ "id": "off-centre",
2483
+ "width": 1440,
2484
+ "message": "The margins differ: 40px on the left, 91px on the right, at 1440px.",
2485
+ "fix": "Put the navigation and the content on one pair of margins; check for padding on one side only, a scrollbar gutter, or a header on another inset than the page."
2486
+ },
2487
+ {
2488
+ "level": "WARN",
2489
+ "id": "lopsided",
2490
+ "width": 1440,
2491
+ "message": "A section keeps its content on one side and leaves 818px of the width empty: \"State that flows through markup\".",
2492
+ "fix": "Fill the other side with what the section has (its picture, a second column, the figure), or defend the void in one sentence."
2493
+ },
2494
+ {
2495
+ "level": "FAIL",
2496
+ "id": "empty-screens",
2497
+ "width": 1440,
2498
+ "message": "4 of 5 desktop screens are almost empty ground (under 20% of the screen holds text, a picture or a colour field): screens 2, 3, 4, 5.",
2499
+ "fix": "An empty screen is a rest only once per page. Elsewhere it means the section is underbuilt: set its content larger, give it the full information, put it on a colour field, or cut it."
2500
+ },
2501
+ {
2502
+ "level": "FAIL",
2503
+ "id": "headline-lines",
2504
+ "width": 768,
2505
+ "message": "1 headline(s) wrap past two lines at 768px: \"webcomponents for scoped consistent shareable us\" → 3 lines (7 words, 60px)",
2506
+ "fix": "Cut words first (a headline is a title, not a sentence). Then give it a wider measure. Lower the size only as a last resort and never below the scale you chose. A real statement paragraph belongs in a <p> or <blockquote> at 32px or less."
2507
+ },
2508
+ {
2509
+ "level": "FAIL",
2510
+ "id": "blank-gap",
2511
+ "width": 768,
2512
+ "message": "1 stretch(es) of the page hold nothing at all: 760px at 3796px (the screen is 1024px tall).",
2513
+ "fix": "Close the gap: a section gap is 120–240px on desktop and 72–112px on a phone. Look for a min-height: 100vh on a short section, an empty grid row, a hidden element still holding its space, or a reveal that never fired. A deliberate rest is a placed picture or colour field, not nothing.",
2514
+ "alsoAt": [
2515
+ 390
2516
+ ]
2517
+ },
2518
+ {
2519
+ "level": "FAIL",
2520
+ "id": "headline-lines",
2521
+ "width": 390,
2522
+ "message": "1 headline(s) wrap past two lines at 390px: \"webcomponents for scoped consistent shareable us\" → 4 lines (7 words, 41.6px)",
2523
+ "fix": "Cut words first (a headline is a title, not a sentence). Then give it a wider measure. Lower the size only as a last resort and never below the scale you chose. A real statement paragraph belongs in a <p> or <blockquote> at 24px or less."
2524
+ }
2525
+ ],
2526
+ "images": [
2527
+ {
2528
+ "viewport": "desktop",
2529
+ "width": 1440,
2530
+ "fold": "/usr2/sites/concorde/.taste-skill/before/desktop-fold.jpg",
2531
+ "pages": [
2532
+ "/usr2/sites/concorde/.taste-skill/before/desktop-page-01.jpg",
2533
+ "/usr2/sites/concorde/.taste-skill/before/desktop-page-02.jpg"
2534
+ ],
2535
+ "film": []
2536
+ },
2537
+ {
2538
+ "viewport": "tablet",
2539
+ "width": 768,
2540
+ "fold": "/usr2/sites/concorde/.taste-skill/before/tablet-fold.jpg",
2541
+ "pages": [
2542
+ "/usr2/sites/concorde/.taste-skill/before/tablet-page-01.jpg"
2543
+ ],
2544
+ "film": []
2545
+ },
2546
+ {
2547
+ "viewport": "mobile",
2548
+ "width": 390,
2549
+ "fold": "/usr2/sites/concorde/.taste-skill/before/mobile-fold.jpg",
2550
+ "pages": [
2551
+ "/usr2/sites/concorde/.taste-skill/before/mobile-page-01.jpg"
2552
+ ],
2553
+ "film": []
2554
+ }
2555
+ ]
2556
+ }