@supersoniks/concorde 5.1.0 → 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 (312) 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 +1939 -1939
  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 +16 -16
  39. package/concorde-core.es.js +235 -233
  40. package/dist/concorde-core.bundle.js +16 -16
  41. package/dist/concorde-core.es.js +235 -233
  42. package/dist/img/archive/concorde-001-2cv.webp +0 -0
  43. package/dist/img/archive/concorde-red-arrows-2002-poster.jpg +0 -0
  44. package/dist/img/archive/concorde-red-arrows-2002.webm +0 -0
  45. package/dist/img/archive/credits.json +28 -0
  46. package/docs/assets/index-Bb-_LRyY.js +12280 -0
  47. package/docs/assets/index-CD4WyL6o.css +1 -0
  48. package/docs/docs-mock-api-sw.js +2 -0
  49. package/docs/docs-mock-api-sw.js.map +2 -2
  50. package/docs/index.html +9 -7
  51. package/index.html +27 -63
  52. package/package.json +11 -4
  53. package/public/img/archive/concorde-001-2cv.webp +0 -0
  54. package/public/img/archive/concorde-red-arrows-2002-poster.jpg +0 -0
  55. package/public/img/archive/concorde-red-arrows-2002.webm +0 -0
  56. package/public/img/archive/credits.json +28 -0
  57. package/scripts/post-build-docs.js +0 -0
  58. package/scripts/post-build.mjs +0 -0
  59. package/src/core/components/functional/fetch/fetch.md +2 -2
  60. package/src/core/components/functional/if/if.md +0 -0
  61. package/src/core/components/functional/if/if.ts +0 -0
  62. package/src/core/components/functional/list/list.demo.ts +0 -0
  63. package/src/core/components/functional/list/list.md +0 -0
  64. package/src/core/components/functional/router/router.md +0 -0
  65. package/src/core/components/functional/router/router.ts +0 -0
  66. package/src/core/components/functional/sdui/SDUIDescriptorTransformer.ts +0 -0
  67. package/src/core/components/functional/sdui/component-catalog.gaps.json +1 -1
  68. package/src/core/components/functional/sdui/component-catalog.json +1 -1
  69. package/src/core/components/functional/sdui/types.ts +0 -0
  70. package/src/core/components/functional/states/states.md +0 -0
  71. package/src/core/components/functional/submit/submit.md +0 -0
  72. package/src/core/components/functional/subscriber/subscriber.ts +0 -0
  73. package/src/core/components/functional/value/value.ts +0 -0
  74. package/src/core/components/ui/_css/size.ts +0 -0
  75. package/src/core/components/ui/captcha/altchaStyles.ts +0 -0
  76. package/src/core/components/ui/form/radio/radio.md +0 -0
  77. package/src/core/components/ui/form/select/select.md +0 -0
  78. package/src/core/components/ui/form/switch/switch.md +0 -0
  79. package/src/core/components/ui/modal/modal.ts +14 -11
  80. package/src/core/mixins/Subscriber.ts +0 -0
  81. package/src/core/utils/DataBindObserver.ts +0 -0
  82. package/src/core/utils/Objects.ts +0 -0
  83. package/src/core/utils/route.ts +0 -0
  84. package/src/docs/_core-concept/subscriber.md +0 -0
  85. package/src/docs/_getting-started/components.md +5 -0
  86. package/src/docs/_getting-started/my-first-subscriber.md +0 -0
  87. package/src/docs/_getting-started/pubsub.md +0 -0
  88. package/src/docs/_getting-started/theming.md +2 -2
  89. package/src/docs/code.ts +88 -75
  90. package/src/docs/components/docs-demo-sources.ts +16 -8
  91. package/src/docs/components/docs-lit-demo.ts +19 -37
  92. package/src/docs/docs.ts +5 -0
  93. package/src/docs/example/docs-boarding-pass-demo.ts +134 -0
  94. package/src/docs/example/docs-provider-keys.ts +12 -0
  95. package/src/docs/example/users.ts +0 -0
  96. package/src/docs/header/header.ts +233 -69
  97. package/src/docs/home/catalog.ts +44 -0
  98. package/src/docs/home/home.ts +513 -0
  99. package/src/docs/home/mach-stage.ts +389 -0
  100. package/src/docs/layout.ts +3 -1
  101. package/src/docs/navigation/components-index.ts +56 -0
  102. package/src/docs/navigation/navigation.ts +240 -232
  103. package/src/docs/navigation/pager.ts +67 -0
  104. package/src/docs/navigation/toc.ts +98 -0
  105. package/src/docs/search/docs-search.json +330 -20
  106. package/src/docs/search/markdown-renderer.ts +11 -3
  107. package/src/docs/search/page.ts +0 -0
  108. package/src/docs/shiki/index.ts +109 -0
  109. package/src/docs/tailwind/css/base/scrollbar.css +22 -0
  110. package/src/docs/tailwind/css/base/theme.css +96 -0
  111. package/src/docs/tailwind/css/base/typography.css +4 -0
  112. package/src/docs/tailwind/css/docs/boarding-pass.css +65 -0
  113. package/src/docs/tailwind/css/docs/content.css +32 -0
  114. package/src/docs/tailwind/css/docs/page.css +10 -0
  115. package/src/docs/tailwind/css/docs.css +9 -0
  116. package/src/docs/tailwind/css/home/hero.css +210 -0
  117. package/src/docs/tailwind/css/home/motion.css +84 -0
  118. package/src/docs/tailwind/css/home/sections.css +416 -0
  119. package/src/docs/tailwind/css/tailwind.css +7 -185
  120. package/src/tsconfig.json +23 -2
  121. package/src/tsconfig.tsbuildinfo +1 -1
  122. package/tailwind.config.js +8 -4
  123. package/.github/workflows/ci.yml +0 -21
  124. package/.github-export-ignore +0 -30
  125. package/CONTRIBUTING.md +0 -59
  126. package/DEV.md +0 -54
  127. package/LICENSE +0 -21
  128. package/OPEN_SOURCE_CHECKPOINT.md +0 -133
  129. package/concorde-3d.bundle.js +0 -3960
  130. package/concorde-3d.es.js +0 -33433
  131. package/concorde-hugging-face-infer.bundle.js +0 -32
  132. package/concorde-hugging-face-infer.es.js +0 -2952
  133. package/concorde-interactive.bundle.js +0 -1157
  134. package/concorde-interactive.es.js +0 -10734
  135. package/concorde-shader.bundle.js +0 -116
  136. package/concorde-shader.es.js +0 -8353
  137. package/concorde-webgpu.bundle.js +0 -307
  138. package/concorde-webgpu.es.js +0 -8627
  139. package/docs/assets/index-D8MVWqY6.js +0 -12251
  140. package/docs/assets/index-DiD0qYvE.css +0 -1
  141. package/docs/crawl/core/components/functional/date/date.html +0 -190
  142. package/docs/crawl/core/components/functional/fetch/fetch.html +0 -109
  143. package/docs/crawl/core/components/functional/if/if.html +0 -27
  144. package/docs/crawl/core/components/functional/jsonata/jsonata.html +0 -79
  145. package/docs/crawl/core/components/functional/list/list.html +0 -70
  146. package/docs/crawl/core/components/functional/mix/mix.html +0 -45
  147. package/docs/crawl/core/components/functional/queue/queue.html +0 -96
  148. package/docs/crawl/core/components/functional/router/router.html +0 -106
  149. package/docs/crawl/core/components/functional/sdui/sdui.html +0 -269
  150. package/docs/crawl/core/components/functional/states/states.html +0 -66
  151. package/docs/crawl/core/components/functional/submit/submit.html +0 -160
  152. package/docs/crawl/core/components/functional/subscriber/subscriber.html +0 -67
  153. package/docs/crawl/core/components/functional/value/value.html +0 -51
  154. package/docs/crawl/core/components/ui/alert/alert.html +0 -110
  155. package/docs/crawl/core/components/ui/alert-messages/alert-messages.html +0 -23
  156. package/docs/crawl/core/components/ui/badge/badge.html +0 -119
  157. package/docs/crawl/core/components/ui/button/button.html +0 -149
  158. package/docs/crawl/core/components/ui/captcha/captcha.html +0 -30
  159. package/docs/crawl/core/components/ui/card/card.html +0 -99
  160. package/docs/crawl/core/components/ui/divider/divider.html +0 -58
  161. package/docs/crawl/core/components/ui/form/checkbox/checkbox.html +0 -73
  162. package/docs/crawl/core/components/ui/form/fieldset/fieldset.html +0 -135
  163. package/docs/crawl/core/components/ui/form/form-actions/form-actions.html +0 -79
  164. package/docs/crawl/core/components/ui/form/form-layout/form-layout.html +0 -62
  165. package/docs/crawl/core/components/ui/form/input/input.html +0 -109
  166. package/docs/crawl/core/components/ui/form/input-autocomplete/input-autocomplete.html +0 -38
  167. package/docs/crawl/core/components/ui/form/radio/radio.html +0 -56
  168. package/docs/crawl/core/components/ui/form/select/select.html +0 -73
  169. package/docs/crawl/core/components/ui/form/switch/switch.html +0 -56
  170. package/docs/crawl/core/components/ui/form/textarea/textarea.html +0 -59
  171. package/docs/crawl/core/components/ui/group/group.html +0 -82
  172. package/docs/crawl/core/components/ui/icon/icon.html +0 -133
  173. package/docs/crawl/core/components/ui/image/image.html +0 -110
  174. package/docs/crawl/core/components/ui/link/link.html +0 -42
  175. package/docs/crawl/core/components/ui/loader/loader.html +0 -50
  176. package/docs/crawl/core/components/ui/menu/menu.html +0 -322
  177. package/docs/crawl/core/components/ui/modal/modal.html +0 -117
  178. package/docs/crawl/core/components/ui/pop/pop.html +0 -102
  179. package/docs/crawl/core/components/ui/progress/progress.html +0 -58
  180. package/docs/crawl/core/components/ui/table/table.html +0 -413
  181. package/docs/crawl/core/components/ui/toast/toast.html +0 -122
  182. package/docs/crawl/core/components/ui/tooltip/tooltip.html +0 -79
  183. package/docs/crawl/docs/_core-concept/dataFlow.html +0 -177
  184. package/docs/crawl/docs/_core-concept/overview.html +0 -66
  185. package/docs/crawl/docs/_core-concept/subscriber.html +0 -75
  186. package/docs/crawl/docs/_decorators/ancestor-attribute.html +0 -116
  187. package/docs/crawl/docs/_decorators/auto-subscribe.html +0 -202
  188. package/docs/crawl/docs/_decorators/bind.html +0 -141
  189. package/docs/crawl/docs/_decorators/get.html +0 -149
  190. package/docs/crawl/docs/_decorators/handle.html +0 -165
  191. package/docs/crawl/docs/_decorators/on-assign.html +0 -355
  192. package/docs/crawl/docs/_decorators/patch.html +0 -78
  193. package/docs/crawl/docs/_decorators/post.html +0 -139
  194. package/docs/crawl/docs/_decorators/publish.html +0 -61
  195. package/docs/crawl/docs/_decorators/put.html +0 -78
  196. package/docs/crawl/docs/_decorators/subscribe.html +0 -109
  197. package/docs/crawl/docs/_decorators/wait-for-ancestors.html +0 -137
  198. package/docs/crawl/docs/_directives/sub.html +0 -93
  199. package/docs/crawl/docs/_getting-started/ai-agents.html +0 -173
  200. package/docs/crawl/docs/_getting-started/concorde-manual-install.html +0 -100
  201. package/docs/crawl/docs/_getting-started/concorde-outside.html +0 -58
  202. package/docs/crawl/docs/_getting-started/create-a-component.html +0 -111
  203. package/docs/crawl/docs/_getting-started/my-first-component.html +0 -189
  204. package/docs/crawl/docs/_getting-started/my-first-subscriber.html +0 -110
  205. package/docs/crawl/docs/_getting-started/pubsub.html +0 -62
  206. package/docs/crawl/docs/_getting-started/start.html +0 -76
  207. package/docs/crawl/docs/_getting-started/theming.html +0 -85
  208. package/docs/crawl/docs/_misc/api-configuration.html +0 -149
  209. package/docs/crawl/docs/_misc/dataProviderKey.html +0 -135
  210. package/docs/crawl/docs/_misc/docs-mock-api.html +0 -158
  211. package/docs/crawl/docs/_misc/dynamic-path.html +0 -180
  212. package/docs/crawl/docs/_misc/endpoint.html +0 -50
  213. package/docs/crawl/docs/_misc/formelement-subscriber-removal.html +0 -138
  214. package/docs/crawl/docs/_misc/html-integration.html +0 -48
  215. package/docs/crawl/hubs/decorators.html +0 -547
  216. package/docs/crawl/hubs/form-components.html +0 -359
  217. package/docs/crawl/hubs/remote-data.html +0 -452
  218. package/docs/crawl/index.html +0 -101
  219. package/docs/llms-full.txt +0 -5761
  220. package/docs/llms.txt +0 -104
  221. package/docs/sitemap.xml +0 -237
  222. package/docs/src/core/components/functional/date/date.md +0 -290
  223. package/docs/src/core/components/functional/fetch/fetch.md +0 -125
  224. package/docs/src/core/components/functional/if/if.md +0 -9
  225. package/docs/src/core/components/functional/jsonata/jsonata.md +0 -56
  226. package/docs/src/core/components/functional/list/list.md +0 -65
  227. package/docs/src/core/components/functional/mix/mix.md +0 -41
  228. package/docs/src/core/components/functional/queue/queue.md +0 -72
  229. package/docs/src/core/components/functional/router/router.md +0 -94
  230. package/docs/src/core/components/functional/sdui/default-library.json +0 -108
  231. package/docs/src/core/components/functional/sdui/example.json +0 -99
  232. package/docs/src/core/components/functional/sdui/sdui.md +0 -356
  233. package/docs/src/core/components/functional/states/states.md +0 -87
  234. package/docs/src/core/components/functional/submit/submit.md +0 -114
  235. package/docs/src/core/components/functional/subscriber/subscriber.md +0 -91
  236. package/docs/src/core/components/functional/value/value.md +0 -35
  237. package/docs/src/core/components/ui/alert/alert.md +0 -121
  238. package/docs/src/core/components/ui/alert-messages/alert-messages.md +0 -0
  239. package/docs/src/core/components/ui/badge/badge.md +0 -127
  240. package/docs/src/core/components/ui/button/button.md +0 -182
  241. package/docs/src/core/components/ui/captcha/captcha.md +0 -12
  242. package/docs/src/core/components/ui/card/card.md +0 -97
  243. package/docs/src/core/components/ui/divider/divider.md +0 -35
  244. package/docs/src/core/components/ui/form/checkbox/checkbox.md +0 -77
  245. package/docs/src/core/components/ui/form/fieldset/fieldset.md +0 -129
  246. package/docs/src/core/components/ui/form/form-actions/form-actions.md +0 -77
  247. package/docs/src/core/components/ui/form/form-layout/form-layout.md +0 -44
  248. package/docs/src/core/components/ui/form/input/input.md +0 -142
  249. package/docs/src/core/components/ui/form/input-autocomplete/input-autocomplete.md +0 -29
  250. package/docs/src/core/components/ui/form/radio/radio.md +0 -57
  251. package/docs/src/core/components/ui/form/select/select.md +0 -71
  252. package/docs/src/core/components/ui/form/switch/switch.md +0 -57
  253. package/docs/src/core/components/ui/form/textarea/textarea.md +0 -65
  254. package/docs/src/core/components/ui/group/group.md +0 -75
  255. package/docs/src/core/components/ui/icon/icon.md +0 -125
  256. package/docs/src/core/components/ui/icon/icons.json +0 -1
  257. package/docs/src/core/components/ui/image/image.md +0 -107
  258. package/docs/src/core/components/ui/link/link.md +0 -43
  259. package/docs/src/core/components/ui/loader/loader.md +0 -55
  260. package/docs/src/core/components/ui/menu/menu.md +0 -329
  261. package/docs/src/core/components/ui/modal/modal.md +0 -119
  262. package/docs/src/core/components/ui/pop/pop.md +0 -96
  263. package/docs/src/core/components/ui/progress/progress.md +0 -63
  264. package/docs/src/core/components/ui/table/table.md +0 -455
  265. package/docs/src/core/components/ui/toast/toast.md +0 -166
  266. package/docs/src/core/components/ui/tooltip/tooltip.md +0 -82
  267. package/docs/src/docs/_core-concept/dataFlow.md +0 -88
  268. package/docs/src/docs/_core-concept/overview.md +0 -57
  269. package/docs/src/docs/_core-concept/subscriber.md +0 -75
  270. package/docs/src/docs/_decorators/ancestor-attribute.md +0 -127
  271. package/docs/src/docs/_decorators/auto-subscribe.md +0 -202
  272. package/docs/src/docs/_decorators/bind.md +0 -167
  273. package/docs/src/docs/_decorators/get.md +0 -162
  274. package/docs/src/docs/_decorators/handle.md +0 -175
  275. package/docs/src/docs/_decorators/on-assign.md +0 -390
  276. package/docs/src/docs/_decorators/patch.md +0 -70
  277. package/docs/src/docs/_decorators/post.md +0 -146
  278. package/docs/src/docs/_decorators/publish.md +0 -55
  279. package/docs/src/docs/_decorators/put.md +0 -70
  280. package/docs/src/docs/_decorators/subscribe.md +0 -100
  281. package/docs/src/docs/_decorators/wait-for-ancestors.md +0 -163
  282. package/docs/src/docs/_directives/sub.md +0 -91
  283. package/docs/src/docs/_getting-started/ai-agents.md +0 -76
  284. package/docs/src/docs/_getting-started/concorde-manual-install.md +0 -133
  285. package/docs/src/docs/_getting-started/concorde-outside.md +0 -33
  286. package/docs/src/docs/_getting-started/create-a-component.md +0 -139
  287. package/docs/src/docs/_getting-started/my-first-component.md +0 -236
  288. package/docs/src/docs/_getting-started/my-first-subscriber.md +0 -120
  289. package/docs/src/docs/_getting-started/pubsub.md +0 -37
  290. package/docs/src/docs/_getting-started/start.md +0 -47
  291. package/docs/src/docs/_getting-started/theming.md +0 -91
  292. package/docs/src/docs/_misc/api-configuration.md +0 -81
  293. package/docs/src/docs/_misc/dataProviderKey.md +0 -168
  294. package/docs/src/docs/_misc/docs-mock-api.md +0 -63
  295. package/docs/src/docs/_misc/dynamic-path.md +0 -71
  296. package/docs/src/docs/_misc/endpoint.md +0 -45
  297. package/docs/src/docs/_misc/formelement-subscriber-removal.md +0 -115
  298. package/docs/src/docs/_misc/html-integration.md +0 -15
  299. package/docs/src/docs/search/docs-search.json +0 -9507
  300. package/docs/src/tag-list.json +0 -1
  301. package/docs/src/tsconfig-model.json +0 -23
  302. package/docs/src/tsconfig.declarations.json +0 -22
  303. package/docs/src/tsconfig.emit.json +0 -23
  304. package/docs/src/tsconfig.json +0 -1182
  305. package/gitlab/job_github_mirror.sh +0 -39
  306. package/scripts/github-export.mjs +0 -150
  307. package/src/css.d.ts +0 -19
  308. package/src/docs/prism/index.ts +0 -6
  309. package/src/docs/prism/prism.css +0 -158
  310. package/src/docs/prism/prism.js +0 -1022
  311. package/src/tsconfig.declarations.json +0 -22
  312. package/src/tsconfig.emit.json +0 -23
@@ -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
+ }