@bestagentkits/render 0.2.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (596) hide show
  1. package/CHANGELOG.md +100 -1
  2. package/README.md +157 -32
  3. package/dist/blocks/chart/chart-check-kind-rules.d.ts +10 -0
  4. package/dist/blocks/chart/chart-check-kind-rules.d.ts.map +1 -0
  5. package/dist/blocks/chart/chart-check-kind-rules.js +151 -0
  6. package/dist/blocks/chart/chart-check-kind-rules.js.map +1 -0
  7. package/dist/blocks/chart/chart-check.d.ts +15 -0
  8. package/dist/blocks/chart/chart-check.d.ts.map +1 -0
  9. package/dist/blocks/chart/chart-check.js +196 -0
  10. package/dist/blocks/chart/chart-check.js.map +1 -0
  11. package/dist/blocks/chart/chart-encoding-schema.d.ts +7 -0
  12. package/dist/blocks/chart/chart-encoding-schema.d.ts.map +1 -0
  13. package/dist/blocks/chart/chart-encoding-schema.js +39 -0
  14. package/dist/blocks/chart/chart-encoding-schema.js.map +1 -0
  15. package/dist/blocks/chart/chart-encodings.d.ts +29 -0
  16. package/dist/blocks/chart/chart-encodings.d.ts.map +1 -0
  17. package/dist/blocks/chart/chart-encodings.js +59 -0
  18. package/dist/blocks/chart/chart-encodings.js.map +1 -0
  19. package/dist/blocks/chart/chart-kinds.d.ts +18 -0
  20. package/dist/blocks/chart/chart-kinds.d.ts.map +1 -0
  21. package/dist/blocks/chart/chart-kinds.js +60 -0
  22. package/dist/blocks/chart/chart-kinds.js.map +1 -0
  23. package/dist/blocks/chart/chart-model-rows.d.ts +23 -0
  24. package/dist/blocks/chart/chart-model-rows.d.ts.map +1 -0
  25. package/dist/blocks/chart/chart-model-rows.js +153 -0
  26. package/dist/blocks/chart/chart-model-rows.js.map +1 -0
  27. package/dist/blocks/chart/chart-model.d.ts +17 -0
  28. package/dist/blocks/chart/chart-model.d.ts.map +1 -0
  29. package/dist/blocks/chart/chart-model.js +131 -0
  30. package/dist/blocks/chart/chart-model.js.map +1 -0
  31. package/dist/blocks/chart/chart-styles.d.ts +3 -0
  32. package/dist/blocks/chart/chart-styles.d.ts.map +1 -0
  33. package/dist/blocks/chart/chart-styles.js +76 -0
  34. package/dist/blocks/chart/chart-styles.js.map +1 -0
  35. package/dist/blocks/chart/chart.d.ts +12 -0
  36. package/dist/blocks/chart/chart.d.ts.map +1 -0
  37. package/dist/blocks/chart/chart.js +73 -0
  38. package/dist/blocks/chart/chart.js.map +1 -0
  39. package/dist/blocks/chart/index.d.ts +4 -0
  40. package/dist/blocks/chart/index.d.ts.map +1 -0
  41. package/dist/blocks/chart/index.js +8 -0
  42. package/dist/blocks/chart/index.js.map +1 -0
  43. package/dist/blocks/composition/accordion.d.ts +4 -0
  44. package/dist/blocks/composition/accordion.d.ts.map +1 -0
  45. package/dist/blocks/composition/accordion.js +45 -0
  46. package/dist/blocks/composition/accordion.js.map +1 -0
  47. package/dist/blocks/composition/bento.d.ts +4 -0
  48. package/dist/blocks/composition/bento.d.ts.map +1 -0
  49. package/dist/blocks/composition/bento.js +91 -0
  50. package/dist/blocks/composition/bento.js.map +1 -0
  51. package/dist/blocks/composition/carousel.d.ts +4 -0
  52. package/dist/blocks/composition/carousel.d.ts.map +1 -0
  53. package/dist/blocks/composition/carousel.js +51 -0
  54. package/dist/blocks/composition/carousel.js.map +1 -0
  55. package/dist/blocks/composition/composition-runtime.d.ts +14 -0
  56. package/dist/blocks/composition/composition-runtime.d.ts.map +1 -0
  57. package/dist/blocks/composition/composition-runtime.js +136 -0
  58. package/dist/blocks/composition/composition-runtime.js.map +1 -0
  59. package/dist/blocks/composition/composition-styles.d.ts +10 -0
  60. package/dist/blocks/composition/composition-styles.d.ts.map +1 -0
  61. package/dist/blocks/composition/composition-styles.js +80 -0
  62. package/dist/blocks/composition/composition-styles.js.map +1 -0
  63. package/dist/blocks/composition/index.d.ts +4 -0
  64. package/dist/blocks/composition/index.d.ts.map +1 -0
  65. package/dist/blocks/composition/index.js +11 -0
  66. package/dist/blocks/composition/index.js.map +1 -0
  67. package/dist/blocks/composition/nestable-blocks.d.ts +37 -0
  68. package/dist/blocks/composition/nestable-blocks.d.ts.map +1 -0
  69. package/dist/blocks/composition/nestable-blocks.js +92 -0
  70. package/dist/blocks/composition/nestable-blocks.js.map +1 -0
  71. package/dist/blocks/composition/tabs.d.ts +4 -0
  72. package/dist/blocks/composition/tabs.d.ts.map +1 -0
  73. package/dist/blocks/composition/tabs.js +48 -0
  74. package/dist/blocks/composition/tabs.js.map +1 -0
  75. package/dist/blocks/controls/checkbox.d.ts +12 -0
  76. package/dist/blocks/controls/checkbox.d.ts.map +1 -0
  77. package/dist/blocks/controls/checkbox.js +43 -0
  78. package/dist/blocks/controls/checkbox.js.map +1 -0
  79. package/dist/blocks/controls/choice-options.d.ts +24 -0
  80. package/dist/blocks/controls/choice-options.d.ts.map +1 -0
  81. package/dist/blocks/controls/choice-options.js +117 -0
  82. package/dist/blocks/controls/choice-options.js.map +1 -0
  83. package/dist/blocks/controls/control-shared.d.ts +66 -0
  84. package/dist/blocks/controls/control-shared.d.ts.map +1 -0
  85. package/dist/blocks/controls/control-shared.js +241 -0
  86. package/dist/blocks/controls/control-shared.js.map +1 -0
  87. package/dist/blocks/controls/controls-runtime.d.ts +17 -0
  88. package/dist/blocks/controls/controls-runtime.d.ts.map +1 -0
  89. package/dist/blocks/controls/controls-runtime.js +180 -0
  90. package/dist/blocks/controls/controls-runtime.js.map +1 -0
  91. package/dist/blocks/controls/controls-styles.d.ts +14 -0
  92. package/dist/blocks/controls/controls-styles.d.ts.map +1 -0
  93. package/dist/blocks/controls/controls-styles.js +54 -0
  94. package/dist/blocks/controls/controls-styles.js.map +1 -0
  95. package/dist/blocks/controls/date-input.d.ts +6 -0
  96. package/dist/blocks/controls/date-input.d.ts.map +1 -0
  97. package/dist/blocks/controls/date-input.js +58 -0
  98. package/dist/blocks/controls/date-input.js.map +1 -0
  99. package/dist/blocks/controls/field-input.d.ts +10 -0
  100. package/dist/blocks/controls/field-input.d.ts.map +1 -0
  101. package/dist/blocks/controls/field-input.js +20 -0
  102. package/dist/blocks/controls/field-input.js.map +1 -0
  103. package/dist/blocks/controls/filter-bar.d.ts +11 -0
  104. package/dist/blocks/controls/filter-bar.d.ts.map +1 -0
  105. package/dist/blocks/controls/filter-bar.js +115 -0
  106. package/dist/blocks/controls/filter-bar.js.map +1 -0
  107. package/dist/blocks/controls/index.d.ts +4 -0
  108. package/dist/blocks/controls/index.d.ts.map +1 -0
  109. package/dist/blocks/controls/index.js +41 -0
  110. package/dist/blocks/controls/index.js.map +1 -0
  111. package/dist/blocks/controls/number-input.d.ts +4 -0
  112. package/dist/blocks/controls/number-input.d.ts.map +1 -0
  113. package/dist/blocks/controls/number-input.js +62 -0
  114. package/dist/blocks/controls/number-input.js.map +1 -0
  115. package/dist/blocks/controls/radio-group.d.ts +4 -0
  116. package/dist/blocks/controls/radio-group.d.ts.map +1 -0
  117. package/dist/blocks/controls/radio-group.js +56 -0
  118. package/dist/blocks/controls/radio-group.js.map +1 -0
  119. package/dist/blocks/controls/select.d.ts +4 -0
  120. package/dist/blocks/controls/select.d.ts.map +1 -0
  121. package/dist/blocks/controls/select.js +49 -0
  122. package/dist/blocks/controls/select.js.map +1 -0
  123. package/dist/blocks/controls/switch.d.ts +4 -0
  124. package/dist/blocks/controls/switch.d.ts.map +1 -0
  125. package/dist/blocks/controls/switch.js +22 -0
  126. package/dist/blocks/controls/switch.js.map +1 -0
  127. package/dist/blocks/controls/text-input.d.ts +4 -0
  128. package/dist/blocks/controls/text-input.d.ts.map +1 -0
  129. package/dist/blocks/controls/text-input.js +42 -0
  130. package/dist/blocks/controls/text-input.js.map +1 -0
  131. package/dist/blocks/data-table/data-table-cells.d.ts +26 -0
  132. package/dist/blocks/data-table/data-table-cells.d.ts.map +1 -0
  133. package/dist/blocks/data-table/data-table-cells.js +154 -0
  134. package/dist/blocks/data-table/data-table-cells.js.map +1 -0
  135. package/dist/blocks/data-table/data-table-check.d.ts +10 -0
  136. package/dist/blocks/data-table/data-table-check.d.ts.map +1 -0
  137. package/dist/blocks/data-table/data-table-check.js +99 -0
  138. package/dist/blocks/data-table/data-table-check.js.map +1 -0
  139. package/dist/blocks/data-table/data-table-columns.d.ts +41 -0
  140. package/dist/blocks/data-table/data-table-columns.d.ts.map +1 -0
  141. package/dist/blocks/data-table/data-table-columns.js +155 -0
  142. package/dist/blocks/data-table/data-table-columns.js.map +1 -0
  143. package/dist/blocks/data-table/data-table-runtime.d.ts +15 -0
  144. package/dist/blocks/data-table/data-table-runtime.d.ts.map +1 -0
  145. package/dist/blocks/data-table/data-table-runtime.js +106 -0
  146. package/dist/blocks/data-table/data-table-runtime.js.map +1 -0
  147. package/dist/blocks/data-table/data-table-styles.d.ts +11 -0
  148. package/dist/blocks/data-table/data-table-styles.d.ts.map +1 -0
  149. package/dist/blocks/data-table/data-table-styles.js +74 -0
  150. package/dist/blocks/data-table/data-table-styles.js.map +1 -0
  151. package/dist/blocks/data-table/data-table.d.ts +17 -0
  152. package/dist/blocks/data-table/data-table.d.ts.map +1 -0
  153. package/dist/blocks/data-table/data-table.js +159 -0
  154. package/dist/blocks/data-table/data-table.js.map +1 -0
  155. package/dist/blocks/data-table/index.d.ts +4 -0
  156. package/dist/blocks/data-table/index.d.ts.map +1 -0
  157. package/dist/blocks/data-table/index.js +18 -0
  158. package/dist/blocks/data-table/index.js.map +1 -0
  159. package/dist/blocks/engineering/api-endpoint.d.ts +12 -0
  160. package/dist/blocks/engineering/api-endpoint.d.ts.map +1 -0
  161. package/dist/blocks/engineering/api-endpoint.js +174 -0
  162. package/dist/blocks/engineering/api-endpoint.js.map +1 -0
  163. package/dist/blocks/engineering/engineering-helpers.d.ts +49 -0
  164. package/dist/blocks/engineering/engineering-helpers.d.ts.map +1 -0
  165. package/dist/blocks/engineering/engineering-helpers.js +156 -0
  166. package/dist/blocks/engineering/engineering-helpers.js.map +1 -0
  167. package/dist/blocks/engineering/engineering-styles.d.ts +12 -0
  168. package/dist/blocks/engineering/engineering-styles.d.ts.map +1 -0
  169. package/dist/blocks/engineering/engineering-styles.js +174 -0
  170. package/dist/blocks/engineering/engineering-styles.js.map +1 -0
  171. package/dist/blocks/engineering/index.d.ts +4 -0
  172. package/dist/blocks/engineering/index.d.ts.map +1 -0
  173. package/dist/blocks/engineering/index.js +30 -0
  174. package/dist/blocks/engineering/index.js.map +1 -0
  175. package/dist/blocks/engineering/kanban.d.ts +11 -0
  176. package/dist/blocks/engineering/kanban.d.ts.map +1 -0
  177. package/dist/blocks/engineering/kanban.js +162 -0
  178. package/dist/blocks/engineering/kanban.js.map +1 -0
  179. package/dist/blocks/engineering/log-viewer.d.ts +14 -0
  180. package/dist/blocks/engineering/log-viewer.d.ts.map +1 -0
  181. package/dist/blocks/engineering/log-viewer.js +158 -0
  182. package/dist/blocks/engineering/log-viewer.js.map +1 -0
  183. package/dist/blocks/engineering/roadmap.d.ts +13 -0
  184. package/dist/blocks/engineering/roadmap.d.ts.map +1 -0
  185. package/dist/blocks/engineering/roadmap.js +197 -0
  186. package/dist/blocks/engineering/roadmap.js.map +1 -0
  187. package/dist/blocks/engineering/schema-viewer.d.ts +25 -0
  188. package/dist/blocks/engineering/schema-viewer.d.ts.map +1 -0
  189. package/dist/blocks/engineering/schema-viewer.js +124 -0
  190. package/dist/blocks/engineering/schema-viewer.js.map +1 -0
  191. package/dist/blocks/engineering/test-results.d.ts +12 -0
  192. package/dist/blocks/engineering/test-results.d.ts.map +1 -0
  193. package/dist/blocks/engineering/test-results.js +180 -0
  194. package/dist/blocks/engineering/test-results.js.map +1 -0
  195. package/dist/blocks/evidence/annotated-image.d.ts +15 -0
  196. package/dist/blocks/evidence/annotated-image.d.ts.map +1 -0
  197. package/dist/blocks/evidence/annotated-image.js +99 -0
  198. package/dist/blocks/evidence/annotated-image.js.map +1 -0
  199. package/dist/blocks/evidence/benchmark-comparison.d.ts +11 -0
  200. package/dist/blocks/evidence/benchmark-comparison.d.ts.map +1 -0
  201. package/dist/blocks/evidence/benchmark-comparison.js +262 -0
  202. package/dist/blocks/evidence/benchmark-comparison.js.map +1 -0
  203. package/dist/blocks/evidence/benchmark-verdict.d.ts +26 -0
  204. package/dist/blocks/evidence/benchmark-verdict.d.ts.map +1 -0
  205. package/dist/blocks/evidence/benchmark-verdict.js +31 -0
  206. package/dist/blocks/evidence/benchmark-verdict.js.map +1 -0
  207. package/dist/blocks/evidence/evidence-helpers.d.ts +39 -0
  208. package/dist/blocks/evidence/evidence-helpers.d.ts.map +1 -0
  209. package/dist/blocks/evidence/evidence-helpers.js +87 -0
  210. package/dist/blocks/evidence/evidence-helpers.js.map +1 -0
  211. package/dist/blocks/evidence/evidence-styles.d.ts +12 -0
  212. package/dist/blocks/evidence/evidence-styles.d.ts.map +1 -0
  213. package/dist/blocks/evidence/evidence-styles.js +88 -0
  214. package/dist/blocks/evidence/evidence-styles.js.map +1 -0
  215. package/dist/blocks/evidence/index.d.ts +4 -0
  216. package/dist/blocks/evidence/index.d.ts.map +1 -0
  217. package/dist/blocks/evidence/index.js +15 -0
  218. package/dist/blocks/evidence/index.js.map +1 -0
  219. package/dist/blocks/evidence/metric-breakdown.d.ts +22 -0
  220. package/dist/blocks/evidence/metric-breakdown.d.ts.map +1 -0
  221. package/dist/blocks/evidence/metric-breakdown.js +203 -0
  222. package/dist/blocks/evidence/metric-breakdown.js.map +1 -0
  223. package/dist/blocks/evidence/references.d.ts +13 -0
  224. package/dist/blocks/evidence/references.d.ts.map +1 -0
  225. package/dist/blocks/evidence/references.js +103 -0
  226. package/dist/blocks/evidence/references.js.map +1 -0
  227. package/dist/blocks/index.d.ts +8 -0
  228. package/dist/blocks/index.d.ts.map +1 -0
  229. package/dist/blocks/index.js +24 -0
  230. package/dist/blocks/index.js.map +1 -0
  231. package/dist/blocks/layout/grid-item.d.ts +4 -0
  232. package/dist/blocks/layout/grid-item.d.ts.map +1 -0
  233. package/dist/blocks/layout/grid-item.js +65 -0
  234. package/dist/blocks/layout/grid-item.js.map +1 -0
  235. package/dist/blocks/layout/grid.d.ts +9 -0
  236. package/dist/blocks/layout/grid.d.ts.map +1 -0
  237. package/dist/blocks/layout/grid.js +99 -0
  238. package/dist/blocks/layout/grid.js.map +1 -0
  239. package/dist/blocks/layout/index.d.ts +4 -0
  240. package/dist/blocks/layout/index.d.ts.map +1 -0
  241. package/dist/blocks/layout/index.js +23 -0
  242. package/dist/blocks/layout/index.js.map +1 -0
  243. package/dist/blocks/layout/layout-styles.d.ts +40 -0
  244. package/dist/blocks/layout/layout-styles.d.ts.map +1 -0
  245. package/dist/blocks/layout/layout-styles.js +110 -0
  246. package/dist/blocks/layout/layout-styles.js.map +1 -0
  247. package/dist/blocks/layout/main-aside.d.ts +4 -0
  248. package/dist/blocks/layout/main-aside.d.ts.map +1 -0
  249. package/dist/blocks/layout/main-aside.js +21 -0
  250. package/dist/blocks/layout/main-aside.js.map +1 -0
  251. package/dist/blocks/layout/rail-layout.d.ts +4 -0
  252. package/dist/blocks/layout/rail-layout.d.ts.map +1 -0
  253. package/dist/blocks/layout/rail-layout.js +33 -0
  254. package/dist/blocks/layout/rail-layout.js.map +1 -0
  255. package/dist/blocks/layout/semantic-layout-parts.d.ts +14 -0
  256. package/dist/blocks/layout/semantic-layout-parts.d.ts.map +1 -0
  257. package/dist/blocks/layout/semantic-layout-parts.js +9 -0
  258. package/dist/blocks/layout/semantic-layout-parts.js.map +1 -0
  259. package/dist/blocks/layout/sidebar-layout.d.ts +4 -0
  260. package/dist/blocks/layout/sidebar-layout.d.ts.map +1 -0
  261. package/dist/blocks/layout/sidebar-layout.js +30 -0
  262. package/dist/blocks/layout/sidebar-layout.js.map +1 -0
  263. package/dist/blocks/layout/split.d.ts +4 -0
  264. package/dist/blocks/layout/split.d.ts.map +1 -0
  265. package/dist/blocks/layout/split.js +23 -0
  266. package/dist/blocks/layout/split.js.map +1 -0
  267. package/dist/blocks/layout/stack.d.ts +4 -0
  268. package/dist/blocks/layout/stack.d.ts.map +1 -0
  269. package/dist/blocks/layout/stack.js +36 -0
  270. package/dist/blocks/layout/stack.js.map +1 -0
  271. package/dist/blocks/product/calendar-dates.d.ts +59 -0
  272. package/dist/blocks/product/calendar-dates.d.ts.map +1 -0
  273. package/dist/blocks/product/calendar-dates.js +100 -0
  274. package/dist/blocks/product/calendar-dates.js.map +1 -0
  275. package/dist/blocks/product/calendar.d.ts +12 -0
  276. package/dist/blocks/product/calendar.d.ts.map +1 -0
  277. package/dist/blocks/product/calendar.js +125 -0
  278. package/dist/blocks/product/calendar.js.map +1 -0
  279. package/dist/blocks/product/feature-matrix.d.ts +4 -0
  280. package/dist/blocks/product/feature-matrix.d.ts.map +1 -0
  281. package/dist/blocks/product/feature-matrix.js +72 -0
  282. package/dist/blocks/product/feature-matrix.js.map +1 -0
  283. package/dist/blocks/product/gallery.d.ts +14 -0
  284. package/dist/blocks/product/gallery.d.ts.map +1 -0
  285. package/dist/blocks/product/gallery.js +86 -0
  286. package/dist/blocks/product/gallery.js.map +1 -0
  287. package/dist/blocks/product/index.d.ts +4 -0
  288. package/dist/blocks/product/index.d.ts.map +1 -0
  289. package/dist/blocks/product/index.js +40 -0
  290. package/dist/blocks/product/index.js.map +1 -0
  291. package/dist/blocks/product/logo-cloud.d.ts +4 -0
  292. package/dist/blocks/product/logo-cloud.d.ts.map +1 -0
  293. package/dist/blocks/product/logo-cloud.js +42 -0
  294. package/dist/blocks/product/logo-cloud.js.map +1 -0
  295. package/dist/blocks/product/people.d.ts +4 -0
  296. package/dist/blocks/product/people.d.ts.map +1 -0
  297. package/dist/blocks/product/people.js +53 -0
  298. package/dist/blocks/product/people.js.map +1 -0
  299. package/dist/blocks/product/pricing.d.ts +4 -0
  300. package/dist/blocks/product/pricing.d.ts.map +1 -0
  301. package/dist/blocks/product/pricing.js +86 -0
  302. package/dist/blocks/product/pricing.js.map +1 -0
  303. package/dist/blocks/product/product-helpers.d.ts +22 -0
  304. package/dist/blocks/product/product-helpers.d.ts.map +1 -0
  305. package/dist/blocks/product/product-helpers.js +48 -0
  306. package/dist/blocks/product/product-helpers.js.map +1 -0
  307. package/dist/blocks/product/product-runtime.d.ts +15 -0
  308. package/dist/blocks/product/product-runtime.d.ts.map +1 -0
  309. package/dist/blocks/product/product-runtime.js +97 -0
  310. package/dist/blocks/product/product-runtime.js.map +1 -0
  311. package/dist/blocks/product/product-styles.d.ts +14 -0
  312. package/dist/blocks/product/product-styles.d.ts.map +1 -0
  313. package/dist/blocks/product/product-styles.js +120 -0
  314. package/dist/blocks/product/product-styles.js.map +1 -0
  315. package/dist/blocks/product/testimonial.d.ts +8 -0
  316. package/dist/blocks/product/testimonial.d.ts.map +1 -0
  317. package/dist/blocks/product/testimonial.js +67 -0
  318. package/dist/blocks/product/testimonial.js.map +1 -0
  319. package/dist/cli.d.ts.map +1 -1
  320. package/dist/cli.js +143 -30
  321. package/dist/cli.js.map +1 -1
  322. package/dist/data/data-json-schema.d.ts +9 -0
  323. package/dist/data/data-json-schema.d.ts.map +1 -0
  324. package/dist/data/data-json-schema.js +48 -0
  325. package/dist/data/data-json-schema.js.map +1 -0
  326. package/dist/data/dataset-types.d.ts +47 -0
  327. package/dist/data/dataset-types.d.ts.map +1 -0
  328. package/dist/data/dataset-types.js +49 -0
  329. package/dist/data/dataset-types.js.map +1 -0
  330. package/dist/data/format-value.d.ts +39 -0
  331. package/dist/data/format-value.d.ts.map +1 -0
  332. package/dist/data/format-value.js +214 -0
  333. package/dist/data/format-value.js.map +1 -0
  334. package/dist/data/resolve-block-data.d.ts +24 -0
  335. package/dist/data/resolve-block-data.d.ts.map +1 -0
  336. package/dist/data/resolve-block-data.js +190 -0
  337. package/dist/data/resolve-block-data.js.map +1 -0
  338. package/dist/data/transform-pipeline.d.ts +65 -0
  339. package/dist/data/transform-pipeline.d.ts.map +1 -0
  340. package/dist/data/transform-pipeline.js +234 -0
  341. package/dist/data/transform-pipeline.js.map +1 -0
  342. package/dist/data/validate-datasets.d.ts +22 -0
  343. package/dist/data/validate-datasets.d.ts.map +1 -0
  344. package/dist/data/validate-datasets.js +137 -0
  345. package/dist/data/validate-datasets.js.map +1 -0
  346. package/dist/diagram/adapter-markup-fit.d.ts +44 -0
  347. package/dist/diagram/adapter-markup-fit.d.ts.map +1 -0
  348. package/dist/diagram/adapter-markup-fit.js +292 -0
  349. package/dist/diagram/adapter-markup-fit.js.map +1 -0
  350. package/dist/diagram/adapter-stylesheet-filter.d.ts +56 -0
  351. package/dist/diagram/adapter-stylesheet-filter.d.ts.map +1 -0
  352. package/dist/diagram/adapter-stylesheet-filter.js +245 -0
  353. package/dist/diagram/adapter-stylesheet-filter.js.map +1 -0
  354. package/dist/diagram/adapter.d.ts +17 -0
  355. package/dist/diagram/adapter.d.ts.map +1 -1
  356. package/dist/diagram/adapter.js +43 -2
  357. package/dist/diagram/adapter.js.map +1 -1
  358. package/dist/index.d.ts +14 -1
  359. package/dist/index.d.ts.map +1 -1
  360. package/dist/index.js +6 -0
  361. package/dist/index.js.map +1 -1
  362. package/dist/ir.d.ts +18 -0
  363. package/dist/ir.d.ts.map +1 -1
  364. package/dist/ir.js.map +1 -1
  365. package/dist/mcp/mcp-http-transport.d.ts +68 -0
  366. package/dist/mcp/mcp-http-transport.d.ts.map +1 -0
  367. package/dist/mcp/mcp-http-transport.js +140 -0
  368. package/dist/mcp/mcp-http-transport.js.map +1 -0
  369. package/dist/mcp/mcp-json-rpc-dispatch.d.ts +38 -0
  370. package/dist/mcp/mcp-json-rpc-dispatch.d.ts.map +1 -0
  371. package/dist/mcp/mcp-json-rpc-dispatch.js +98 -0
  372. package/dist/mcp/mcp-json-rpc-dispatch.js.map +1 -0
  373. package/dist/mcp/mcp-local-tools.d.ts +20 -0
  374. package/dist/mcp/mcp-local-tools.d.ts.map +1 -0
  375. package/dist/mcp/mcp-local-tools.js +58 -0
  376. package/dist/mcp/mcp-local-tools.js.map +1 -0
  377. package/dist/mcp/mcp-protocol.d.ts +79 -0
  378. package/dist/mcp/mcp-protocol.d.ts.map +1 -0
  379. package/dist/mcp/mcp-protocol.js +83 -0
  380. package/dist/mcp/mcp-protocol.js.map +1 -0
  381. package/dist/mcp/mcp-stdio-transport.d.ts +28 -0
  382. package/dist/mcp/mcp-stdio-transport.d.ts.map +1 -0
  383. package/dist/mcp/mcp-stdio-transport.js +73 -0
  384. package/dist/mcp/mcp-stdio-transport.js.map +1 -0
  385. package/dist/mcp/mcp-tool-definitions.d.ts +66 -0
  386. package/dist/mcp/mcp-tool-definitions.d.ts.map +1 -0
  387. package/dist/mcp/mcp-tool-definitions.js +246 -0
  388. package/dist/mcp/mcp-tool-definitions.js.map +1 -0
  389. package/dist/mcp-server.d.ts +6 -33
  390. package/dist/mcp-server.d.ts.map +1 -1
  391. package/dist/mcp-server.js +5 -270
  392. package/dist/mcp-server.js.map +1 -1
  393. package/dist/recipes/index.d.ts +27 -0
  394. package/dist/recipes/index.d.ts.map +1 -0
  395. package/dist/recipes/index.js +30 -0
  396. package/dist/recipes/index.js.map +1 -0
  397. package/dist/recipes/recipes.generated.d.ts +8 -0
  398. package/dist/recipes/recipes.generated.d.ts.map +1 -0
  399. package/dist/recipes/recipes.generated.js +704 -0
  400. package/dist/recipes/recipes.generated.js.map +1 -0
  401. package/dist/registry/actions.d.ts +2 -0
  402. package/dist/registry/actions.d.ts.map +1 -1
  403. package/dist/registry/actions.js +3 -1
  404. package/dist/registry/actions.js.map +1 -1
  405. package/dist/registry/block-module.d.ts +65 -0
  406. package/dist/registry/block-module.d.ts.map +1 -0
  407. package/dist/registry/block-module.js +19 -0
  408. package/dist/registry/block-module.js.map +1 -0
  409. package/dist/registry/catalog-search.d.ts +32 -0
  410. package/dist/registry/catalog-search.d.ts.map +1 -0
  411. package/dist/registry/catalog-search.js +122 -0
  412. package/dist/registry/catalog-search.js.map +1 -0
  413. package/dist/registry/define-helpers.d.ts +89 -0
  414. package/dist/registry/define-helpers.d.ts.map +1 -0
  415. package/dist/registry/define-helpers.js +87 -0
  416. package/dist/registry/define-helpers.js.map +1 -0
  417. package/dist/registry/describe-many.d.ts +58 -0
  418. package/dist/registry/describe-many.d.ts.map +1 -0
  419. package/dist/registry/describe-many.js +156 -0
  420. package/dist/registry/describe-many.js.map +1 -0
  421. package/dist/registry/prop-schema.d.ts +32 -1
  422. package/dist/registry/prop-schema.d.ts.map +1 -1
  423. package/dist/registry/prop-schema.js +108 -2
  424. package/dist/registry/prop-schema.js.map +1 -1
  425. package/dist/registry/registry-builder.d.ts +17 -0
  426. package/dist/registry/registry-builder.d.ts.map +1 -0
  427. package/dist/registry/registry-builder.js +158 -0
  428. package/dist/registry/registry-builder.js.map +1 -0
  429. package/dist/registry/registry.d.ts +32 -5
  430. package/dist/registry/registry.d.ts.map +1 -1
  431. package/dist/registry/registry.js +67 -14
  432. package/dist/registry/registry.js.map +1 -1
  433. package/dist/registry/roster.d.ts +34 -5
  434. package/dist/registry/roster.d.ts.map +1 -1
  435. package/dist/registry/roster.js +184 -224
  436. package/dist/registry/roster.js.map +1 -1
  437. package/dist/render/block-helpers.d.ts +11 -18
  438. package/dist/render/block-helpers.d.ts.map +1 -1
  439. package/dist/render/block-helpers.js +14 -44
  440. package/dist/render/block-helpers.js.map +1 -1
  441. package/dist/render/blocks.d.ts +9 -33
  442. package/dist/render/blocks.d.ts.map +1 -1
  443. package/dist/render/blocks.js +56 -180
  444. package/dist/render/blocks.js.map +1 -1
  445. package/dist/render/chart-figure-encoded.d.ts +11 -0
  446. package/dist/render/chart-figure-encoded.d.ts.map +1 -0
  447. package/dist/render/chart-figure-encoded.js +81 -0
  448. package/dist/render/chart-figure-encoded.js.map +1 -0
  449. package/dist/render/chart-kinds-cartesian.d.ts +14 -0
  450. package/dist/render/chart-kinds-cartesian.d.ts.map +1 -0
  451. package/dist/render/chart-kinds-cartesian.js +122 -0
  452. package/dist/render/chart-kinds-cartesian.js.map +1 -0
  453. package/dist/render/chart-kinds-composite.d.ts +16 -0
  454. package/dist/render/chart-kinds-composite.d.ts.map +1 -0
  455. package/dist/render/chart-kinds-composite.js +144 -0
  456. package/dist/render/chart-kinds-composite.js.map +1 -0
  457. package/dist/render/chart-kinds-gauge-treemap.d.ts +8 -0
  458. package/dist/render/chart-kinds-gauge-treemap.d.ts.map +1 -0
  459. package/dist/render/chart-kinds-gauge-treemap.js +101 -0
  460. package/dist/render/chart-kinds-gauge-treemap.js.map +1 -0
  461. package/dist/render/chart-kinds-histogram-waterfall.d.ts +17 -0
  462. package/dist/render/chart-kinds-histogram-waterfall.d.ts.map +1 -0
  463. package/dist/render/chart-kinds-histogram-waterfall.js +172 -0
  464. package/dist/render/chart-kinds-histogram-waterfall.js.map +1 -0
  465. package/dist/render/chart-overlays.d.ts +18 -0
  466. package/dist/render/chart-overlays.d.ts.map +1 -0
  467. package/dist/render/chart-overlays.js +58 -0
  468. package/dist/render/chart-overlays.js.map +1 -0
  469. package/dist/render/chart-scales.d.ts +83 -0
  470. package/dist/render/chart-scales.d.ts.map +1 -0
  471. package/dist/render/chart-scales.js +166 -0
  472. package/dist/render/chart-scales.js.map +1 -0
  473. package/dist/render/chart-svg-parts.d.ts +50 -0
  474. package/dist/render/chart-svg-parts.d.ts.map +1 -0
  475. package/dist/render/chart-svg-parts.js +125 -0
  476. package/dist/render/chart-svg-parts.js.map +1 -0
  477. package/dist/render/chart-text.d.ts +18 -0
  478. package/dist/render/chart-text.d.ts.map +1 -0
  479. package/dist/render/chart-text.js +69 -0
  480. package/dist/render/chart-text.js.map +1 -0
  481. package/dist/render/chart-treemap-layout.d.ts +17 -0
  482. package/dist/render/chart-treemap-layout.d.ts.map +1 -0
  483. package/dist/render/chart-treemap-layout.js +74 -0
  484. package/dist/render/chart-treemap-layout.js.map +1 -0
  485. package/dist/render/chart-types.d.ts +107 -0
  486. package/dist/render/chart-types.d.ts.map +1 -0
  487. package/dist/render/chart-types.js +11 -0
  488. package/dist/render/chart-types.js.map +1 -0
  489. package/dist/render/charts.d.ts +28 -11
  490. package/dist/render/charts.d.ts.map +1 -1
  491. package/dist/render/charts.js +38 -117
  492. package/dist/render/charts.js.map +1 -1
  493. package/dist/render/derived-variables.d.ts +20 -0
  494. package/dist/render/derived-variables.d.ts.map +1 -1
  495. package/dist/render/derived-variables.js +23 -0
  496. package/dist/render/derived-variables.js.map +1 -1
  497. package/dist/render/document.d.ts +11 -0
  498. package/dist/render/document.d.ts.map +1 -1
  499. package/dist/render/document.js +20 -3
  500. package/dist/render/document.js.map +1 -1
  501. package/dist/render/escape.d.ts +10 -0
  502. package/dist/render/escape.d.ts.map +1 -1
  503. package/dist/render/escape.js +28 -0
  504. package/dist/render/escape.js.map +1 -1
  505. package/dist/render/feature-styles.d.ts.map +1 -1
  506. package/dist/render/feature-styles.js +42 -80
  507. package/dist/render/feature-styles.js.map +1 -1
  508. package/dist/render/outline.d.ts +1 -1
  509. package/dist/render/outline.d.ts.map +1 -1
  510. package/dist/render/outline.js +4 -1
  511. package/dist/render/outline.js.map +1 -1
  512. package/dist/render/recipe-styles.d.ts +26 -0
  513. package/dist/render/recipe-styles.d.ts.map +1 -0
  514. package/dist/render/recipe-styles.js +218 -0
  515. package/dist/render/recipe-styles.js.map +1 -0
  516. package/dist/render/render-context.d.ts +40 -0
  517. package/dist/render/render-context.d.ts.map +1 -0
  518. package/dist/render/render-context.js +16 -0
  519. package/dist/render/render-context.js.map +1 -0
  520. package/dist/render/render.d.ts +7 -0
  521. package/dist/render/render.d.ts.map +1 -1
  522. package/dist/render/render.js +68 -44
  523. package/dist/render/render.js.map +1 -1
  524. package/dist/render/runtime.d.ts +4 -1
  525. package/dist/render/runtime.d.ts.map +1 -1
  526. package/dist/render/runtime.js +91 -118
  527. package/dist/render/runtime.js.map +1 -1
  528. package/dist/render/showcase-blocks.d.ts +5 -0
  529. package/dist/render/showcase-blocks.d.ts.map +1 -1
  530. package/dist/render/showcase-blocks.js +8 -28
  531. package/dist/render/showcase-blocks.js.map +1 -1
  532. package/dist/render/showcase-styles.d.ts.map +1 -1
  533. package/dist/render/showcase-styles.js +15 -31
  534. package/dist/render/showcase-styles.js.map +1 -1
  535. package/dist/render/style-units.d.ts +17 -0
  536. package/dist/render/style-units.d.ts.map +1 -0
  537. package/dist/render/style-units.js +24 -0
  538. package/dist/render/style-units.js.map +1 -0
  539. package/dist/render/styles.d.ts.map +1 -1
  540. package/dist/render/styles.js +8 -5
  541. package/dist/render/styles.js.map +1 -1
  542. package/dist/render/tone.d.ts +14 -0
  543. package/dist/render/tone.d.ts.map +1 -0
  544. package/dist/render/tone.js +40 -0
  545. package/dist/render/tone.js.map +1 -0
  546. package/dist/render/verify.d.ts +3 -0
  547. package/dist/render/verify.d.ts.map +1 -1
  548. package/dist/render/verify.js +15 -2
  549. package/dist/render/verify.js.map +1 -1
  550. package/dist/spec/asset-references.d.ts +35 -0
  551. package/dist/spec/asset-references.d.ts.map +1 -0
  552. package/dist/spec/asset-references.js +93 -0
  553. package/dist/spec/asset-references.js.map +1 -0
  554. package/dist/spec/bounds.d.ts +6 -0
  555. package/dist/spec/bounds.d.ts.map +1 -1
  556. package/dist/spec/bounds.js +7 -0
  557. package/dist/spec/bounds.js.map +1 -1
  558. package/dist/spec/conditions.d.ts +43 -0
  559. package/dist/spec/conditions.d.ts.map +1 -0
  560. package/dist/spec/conditions.js +179 -0
  561. package/dist/spec/conditions.js.map +1 -0
  562. package/dist/spec/network-policy.d.ts +33 -0
  563. package/dist/spec/network-policy.d.ts.map +1 -0
  564. package/dist/spec/network-policy.js +57 -0
  565. package/dist/spec/network-policy.js.map +1 -0
  566. package/dist/spec/normalize.d.ts +7 -2
  567. package/dist/spec/normalize.d.ts.map +1 -1
  568. package/dist/spec/normalize.js +203 -57
  569. package/dist/spec/normalize.js.map +1 -1
  570. package/dist/theme/dialect-presets.d.ts +12 -0
  571. package/dist/theme/dialect-presets.d.ts.map +1 -0
  572. package/dist/theme/dialect-presets.js +214 -0
  573. package/dist/theme/dialect-presets.js.map +1 -0
  574. package/dist/theme/load-theme.d.ts +9 -1
  575. package/dist/theme/load-theme.d.ts.map +1 -1
  576. package/dist/theme/load-theme.js +25 -2
  577. package/dist/theme/load-theme.js.map +1 -1
  578. package/dist/theme/preset-builder.d.ts +36 -0
  579. package/dist/theme/preset-builder.d.ts.map +1 -0
  580. package/dist/theme/preset-builder.js +51 -0
  581. package/dist/theme/preset-builder.js.map +1 -0
  582. package/dist/theme/presets.d.ts +4 -7
  583. package/dist/theme/presets.d.ts.map +1 -1
  584. package/dist/theme/presets.js +7 -40
  585. package/dist/theme/presets.js.map +1 -1
  586. package/dist/theme/recipes.d.ts +38 -0
  587. package/dist/theme/recipes.d.ts.map +1 -0
  588. package/dist/theme/recipes.js +96 -0
  589. package/dist/theme/recipes.js.map +1 -0
  590. package/dist/theme/theme-catalog.d.ts.map +1 -1
  591. package/dist/theme/theme-catalog.js +16 -0
  592. package/dist/theme/theme-catalog.js.map +1 -1
  593. package/dist/version.d.ts +1 -1
  594. package/dist/version.js +1 -1
  595. package/llms.txt +9 -5
  596. package/package.json +6 -2
package/CHANGELOG.md CHANGED
@@ -7,7 +7,106 @@ this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.htm
7
7
  Release mechanics and the compatibility contract live in
8
8
  [docs/release-policy.md](./docs/release-policy.md).
9
9
 
10
- ## [Unreleased]
10
+ ## [0.3.0] - 2026-10-06
11
+
12
+ The Page Spec stays `version: 1`, and every spec that was valid in 0.2.0 stays
13
+ valid. These changes alter existing behaviour or output on purpose:
14
+
15
+ - `--theme` (and the `theme` render option) now replaces the spec's
16
+ `theme.recipes` as well as its tokens. Before, spec recipes applied
17
+ regardless.
18
+ - Every `gallery` thumbnail opens a full-size lightbox. There is no author
19
+ flag, so every page with a gallery emits new markup, CSS and runtime.
20
+ - Tabs no longer fire `select` for the initial tab when the page loads, so page
21
+ state keeps its declared initial values.
22
+ - A remote video `poster` that the network policy blocks is a `validate` error
23
+ (`POLICY_VIOLATION` at the `poster` path), not a compile failure at `$`.
24
+ - Pages with tabs or a carousel change markup and CSS so every panel and slide
25
+ reads without scripts and in print.
26
+ - `catalog` text is grouped by category, and `catalog --json` prints one block
27
+ per line with new `category` and `tags` fields.
28
+ - The Claude Code and Codex plugin manifests link to https://render.agentkit.best, and the Codex plugin shows an icon, a logo and the brand colour in the plugin directory.
29
+ - The benchmarks are measured against AgentKit `9e322f928`. The legacy baseline no longer counts the slide guide for document tasks (AgentKit loads it for `--slides` only), so its per-task mean is ~25.0k tokens, not ~33.7k. `render-benchmark.mjs` measures the `ak-render` skill route per task: the AgentKit shared HTML contract, the skill, `catalog`, and `describe --json` for each block type the task's fixture compiles to. It fails when the AgentKit checkout is missing. Presentation context now drops 64–68% (previously reported as 87–88%). The typical-task estimate is 54% with full contracts and 66% with `describe --compact`, which counts the shared contract too (previously 65% and 75%). `agent-token-cost.mjs --reuse-legacy` reruns that estimate from recorded corpus measurements. The README and landing page use the new figures.
30
+ - The landing page shows what the compiler saves an agent (measured and estimated token figures, kept apart), each component crop beside the fixture YAML that produced it, and a gallery of every demo page. The README gains a token cost section.
31
+
32
+ ### Added
33
+
34
+ - Rich composition: a tab panel, an accordion section, a carousel slide and a bento tile hold child blocks in `items[i].blocks` (up to 12, or 6 in a bento tile). Any block may nest except `page`, `section` and `hero`, and tabs may nest in tabs. An item's `text`, and a bento tile's `title`, are optional when the item has blocks; an item with neither is an error at its path.
35
+ - Nested slots with `accepts` and `parents` rules. Diagnostics carry the nested JSON path, and nested blocks count toward the block limit.
36
+ - `grid-item` places blocks on a 12-track grid with `span`, `tabletSpan`, `mobileSpan`, `rowSpan`, `start` and `align`. `grid.columns` takes 1–12 or `auto` (with `minItemWidth`), grids take `gap` and `align`, and `stack` takes `align`.
37
+ - Semantic page layouts: `sidebar-layout` (a `sidebar` beside the main `blocks`, on either `side`), `main-aside` (an `aside` that stays in view on wide screens) and `rail-layout` (a compact `rail`, a labelled `<nav>` when it holds only links or toolbars).
38
+ - Datasets: top-level `datasets`, and `dataRef`, inline `data` and a bounded `transform` (filter, groupBy, sort, select, limit) on blocks that take data. Values format through one locale-free formatter (`number`, `integer`, `compact`, `percent`, `currency`, `duration`, `bytes`, `date`); `percent` takes `87` for "87%". See [docs/data-and-state.md](./docs/data-and-state.md).
39
+ - `visibleWhen` shows a block only while a state value matches (`equals`, `notEquals`, `in`, `notIn`, `truthy`, `falsy`). The compiler emits the initial view, so the page reads correctly without scripts and in print.
40
+ - Native input controls `select`, `radio-group`, `checkbox`, `switch`, `text-input`, `number-input` and `date-input`. Each has a visible label, writes one value to `state.<key>` through `bind`, and fires `change` with its value.
41
+ - `filter-bar` filters a `data-table`, `kanban` or `log-viewer` with 1–8 controls, each naming a row `field` and a `match`. It adds an announced result count and a Reset button; `select` and `radio-group` can list the target's values with `optionsFrom`. A `data-table` that a filter-bar targets renders no search box, row count or "no match" note of its own, so two filters never fight over the same rows; put free-text search in the bar as a `search` child.
42
+ - `data-table`: a typed, sortable table bound to a dataset. Column types `text`, `number`, `percent` (alias `percentage`), `currency`, `date`, `badge`, `link`, `progress` and `sparkline`; search past 10 rows (unless a filter-bar targets the table), a sticky header past 12, labelled cards on phones, and the full table in authored order without scripts or in print.
43
+ - Chart kinds `scatter`, `histogram`, `stacked-bar`, `stacked-bar-100`, `heatmap`, `waterfall`, `funnel`, `gauge` and `treemap`. A chart can bind rows and read them through the `x`, `y`, `series: { field }` and `value` encodings, and takes `markers`, `annotations`, `sort` and a gauge `target`. A bound chart's fallback table comes from the bound rows. Charts that use `labels` and `series` render the same markup as before.
44
+ - Engineering widgets: `kanban`, `roadmap`, `test-results`, `log-viewer`, `api-endpoint` and `schema-viewer`.
45
+ - Evidence widgets: `benchmark-comparison` (computed delta, change and verdict; `currency` is set once for the whole block, not per metric), `metric-breakdown`, `annotated-image` and `references` (stable `#ref-<id>` anchors).
46
+ - Product widgets: `pricing`, `feature-matrix`, `testimonial` (two or more quotes form a grid), `logo-cloud`, `people` and `calendar` (weeks start on Monday; `weekStart: sunday` changes that).
47
+ - Theme recipes restyle components through closed enums for cards, sections, tables, charts, hero, metrics, media and callouts. A preset, a preset file or the spec's `theme.recipes` selects them. See [docs/themes.md](./docs/themes.md#recipes).
48
+ - Four built-in presets: `data-console`, `executive-report`, `product-studio` and `research-notebook`. They reuse the bundled faces. Every built-in preset is tested for WCAG 2.2 contrast in both schemes.
49
+ - An inline spec theme accepts `theme.dark`, dark-scheme token overrides.
50
+ - Catalog discovery: every block has a category and tags. `ak-render catalog --category <c>` lists one category, `ak-render search-catalog <terms...>` ranks block types by intent words, and `ak-render describe <type...> --compact` returns up to 12 contracts with one line per prop; a shape repeated within a contract reads `like <field>` and a repeated long enum `enum as <field>`. Row-filtering words rank `filter-bar` first. MCP gains `search-catalog`, `catalog{category}` and `describe{types, compact}`, on the stdio and the remote server; the remote `search-catalog` needs no token. The library exports `searchCatalog` and `describeMany`.
51
+ - Page recipes: `ak-render recipes [--json]` lists ten starter specs (`architecture-review`, `benchmark-report`, `case-study`, `dashboard`, `decision-memo`, `implementation-plan`, `incident-report`, `product-showcase`, `release-recap`, `research-report`), and `ak-render recipe <name>` prints one as YAML, or the full record with `--json`. An unknown name exits 1 and lists the allowed names; a missing name exits 2. Each recipe validates with no errors or warnings, compiles deterministically, stays within 3,000 bytes of YAML and loads nothing remote. MCP serves them as `recipes` and `recipe{name}` on the stdio and the remote server, and the library as `recipes()`, `recipe(name)` and the `PageRecipe` and `PageRecipeSummary` types; an unknown name throws `SPEC_VALIDATION_ERROR` at path `name` with `details.allowed`.
52
+ - `pnpm recipes:generate` embeds the recipe YAML in `src/recipes/recipes.generated.ts`, and `pnpm recipes:check`, part of `pnpm verify`, fails when that module is stale.
53
+ - The library exports `BLOCK_CATEGORIES`, `THEME_RECIPE_SPECS`, `VALUE_FORMATS` and the `MaterializedData`, `DataRow` and `DataScalar` types.
54
+ - Remote MCP over Streamable HTTP at `https://render.agentkit.best/mcp`, served by the cloud Worker. It lists the same tools as `ak-render mcp`: `catalog`, `search-catalog`, `describe`, `recipes`, `recipe`, `validate`, `render` and `themes`. A remote `render` takes no `out`: it compiles through the same path as `POST /v1/render` (byte-identical HTML), stores the page and returns the summary plus `artifactUrl` and `expiresAt`, never the HTML. The artifact lives one hour, or becomes an expiring share with `share: true` (needs the share scope). `catalog`, `search-catalog`, `describe`, `recipes`, `recipe` and `themes` answer without a token; `validate` and `render` need an AgentKit bearer and count against the same per-subject rate limits as REST.
55
+ - The MCP server is split into transport-independent modules under `src/mcp/`: protocol vocabulary, one set of tool contracts, JSON-RPC routing, the stdio transport, and a Fetch-API Streamable HTTP transport the Worker imports. `ak-render mcp` answers byte for byte as before.
56
+ - `GET /v1/artifact/:id` serves the short-lived artifact a remote MCP render stored.
57
+ - `scripts/cloud-smoke.mjs` smoke-tests a deployed renderer (MCP and REST, share lifecycle, exports) with `BASE_URL` and an optional `TOKEN`; the manual cloud deploy workflow runs it after deploying.
58
+ - `benchmarks/agent-token-cost.mjs` estimates the tokens of a page task end to end: guidance read, output written and what returns into context, against a corpus of hand-written HTML passed with `--legacy-html`. Results are in `docs/artifacts/agent-token-cost.md`, with the corpus recorded by anonymous label. `--legacy-from <artifact.json>` refreshes the artifact from the recorded legacy rows without the private corpus, and a second typical-task row measures the compact workflow (`describe <types...> --compact`). Block types are read from the compiler IR.
59
+ - `pnpm bench:spec` (`benchmarks/spec-compression.mjs`) records, per composition fixture, the spec bytes, the bytes with every `dataRef` inlined, the HTML bytes, and the catalog and compact-describe bytes an agent reads, in `docs/artifacts/spec-compression.{json,md}`. The output is deterministic.
60
+ - Six composition fixtures: `complex-dashboard`, `benchmark-report`, `research-report`, `product-case-study`, `interactive-data-explorer` and `incident-report`. Each validates with no warnings and compiles to identical bytes three times. `fixtures/rejected/validation/` holds well-formed but wrong specs that must fail validation at a located path, optionally pinned by a first line `# expect: CODE $.path`.
61
+ - `tests/browser/composition-matrix.spec.ts` checks every fixture page for horizontal overflow at 320, 375, 768 and 1440 in light and dark, running animation under reduced motion, script-off readability, print, keyboard focus, network requests and critical axe violations. `@axe-core/playwright` is a new devDependency.
62
+ - `scripts/capture-demo-media.mjs` captures five more page shots and four component crops (KPI, terminal, checklist, file tree), and `--only <names>` recaptures a subset without the walkthrough video.
63
+ - A pair of backticks in prose text renders as inline code, so `` `ak-render catalog` `` in a `text`, a step, a list item, a description or a caption reads as a command. The text is escaped before the span is wrapped, nothing else is parsed as markup, and an unpaired backtick stays literal. Titles, `code` blocks, `terminal` lines and the chart summary are unchanged, and `describe` and the JSON Schema say which props do this.
64
+
65
+ ### Changed
66
+
67
+ - `catalog` text is grouped by category under `## <category>` headers, one `type — summary` line per block, without the kind column. `catalog --json` and the MCP `catalog` add `category` and `tags` to each entry and print one block and one action per line; the parsed value is otherwise unchanged. A single-type `describe <type>` is byte-identical.
68
+ - The MCP `describe` input no longer requires `type`: pass `type` or `types`, plus optional `compact`. Every local tool description is at most 200 characters.
69
+ - URL props declare the network capability of the asset they load, so the CSP origins and the validation gate come from one schema walk at any depth.
70
+ - When a `oneOf` value fails, diagnostics come from the option the author meant, chosen by JSON shape and then by `type`.
71
+ - A tab's `select` event passes the tab id as its value, so `set-value` without its own `value` stores the selected tab.
72
+ - Chart `labels` is optional in the schema; a chart without bound data still requires it, with the same message and path.
73
+ - The cloud Worker is routed at `render.agentkit.best/mcp` and `render.agentkit.best/v1/*`, beside the site's Custom Domain on the same hostname.
74
+ - The Claude Code and Codex plugin manifests link to https://render.agentkit.best, and the Codex plugin shows an icon, a logo and the brand colour in the plugin directory.
75
+ - The landing page shows what the compiler saves an agent (measured and estimated token figures, kept apart), each component crop beside the fixture YAML that produced it, and a gallery of every demo page. The README gains a token cost section.
76
+
77
+ ### Fixed
78
+
79
+ - Tab panels and carousel slides are readable without scripts and in print: every panel ships visible with its title until the runtime marks the container ready.
80
+ - Accordion sections print open, nested blocks included.
81
+ - Accordion and carousel styles apply only to their own sections and slides, so a nested block keeps its own look.
82
+ - The runtime escapes embedded state, so a value such as `</script>` cannot close the script element.
83
+ - An event stops at the nearest block, so it no longer reaches an enclosing block's bindings.
84
+ - A `set-value` action without `value` takes the event's value, for example a slider's. With no event value it does nothing; before, it set `undefined`.
85
+ - The cloud Worker validates bearers against the canonical AgentKit endpoint, `GET https://agentkit.best/api/agentkit/entitlements`, instead of an unreachable host, so authenticated render, share and export can succeed. It fails closed on a rejected token (401), an inactive account (403), and an upstream error, redirect, timeout or malformed body (502). An active app or kit entitlement grants the `render` and `share` scopes, which stay separate checks.
86
+ - Screenshot and PDF export call the Browser Run binding's Quick Actions with the compiled HTML inline and caching off, and `wrangler.jsonc` attaches the `BROWSER` binding.
87
+ - Remote MCP bounds its anonymous surface: a JSON-RPC batch carries at most 16 members, never `initialize`, and is refused (400) under protocol revision 2025-06-18 or later, which removed batching. `catalog`, `search-catalog`, `describe`, `recipes`, `recipe` and `themes` stay anonymous but count per client IP (`anon-ip`, 120/min).
88
+ - A remote MCP request that presents a rejected bearer answers HTTP 401 with `WWW-Authenticate: Bearer`, whatever the method, instead of a tool error; REST 401s carry the same challenge. A request without a bearer is still served, and `validate`/`render` still answer a tool error with `UNAUTHENTICATED`.
89
+ - Cloud rate limits use the Workers Rate Limiting binding, one per route class, instead of KV counters that could fail on rapid writes; a limiter fault refuses the call with `RATE_LIMITED`. An MCP `render` with `share: true` counts against `share` only, as `POST /v1/share` does, and a call refused by authorization consumes nothing.
90
+ - The cloud Worker caches entitlements answers in memory under a SHA-256 digest of the bearer (60 s accepted, 10 s rejected), and limits uncached bearer checks per client IP (30/min) before contacting the entitlements endpoint.
91
+ - Remote MCP reports a storage or runtime fault as a generic `INTERNAL_ERROR` tool error, and the REST routes answer such a fault with a generic 500, so no internal message reaches a caller.
92
+ - Hosted shares and artifacts are served with `content-security-policy: sandbox …; frame-ancestors 'none'`: they run in an opaque origin and cannot be framed.
93
+ - The expiry sweep pages through every listed object with the cursor, reads expiry from listing metadata instead of downloading bodies, and deletes in batches; R2 lifecycle rules (`apps/cloud/r2-lifecycle.json`, applied on deploy) delete artifacts after 1 day and shares after the retention period plus a day.
94
+ - A remote video `poster` that the network policy blocks now fails `validate` with a `POLICY_VIOLATION` at the block's `poster` path, naming the reason. Before, validate passed and compile failed at `$` with "emitted a remote resource reference". A poster is gated by the `images` capability, an allowed remote poster's origin joins the CSP, and the renderer drops a blocked poster even for an IR that skipped validation.
95
+ - Diagram adapter `<style>` elements now receive the page style nonce, so styled adapter SVG renders as drawn instead of in default black. The policy stays nonce-only: inline `style` attributes are removed from adapter output with a warning. Adapter CSS is scoped with `@scope` to its own diagram canvas, so it cannot restyle the page, and it cannot load anything: escapes, character references, `url()` other than a fragment reference such as `url(#grad)`, `image-set()`, every at-rule except `@media`, `@keyframes` and `@supports`, and `@keyframes` that redefine the page's own reject the output to the structured fallback. Comments and `!important` are removed. Adapter markup that writes a `nonce` or any `data-ak-*` attribute, or an `href`, `xlink:href`, `src`, `srcset`, `poster`, `action`, `formaction`, `background`, `data`, `codebase` or `ping` that is not a same-document `#fragment`, or SVG animation whose `attributeName` is one of those, is rejected too, and so is markup that is not a self-contained fragment: a stray or missing end tag, a raw-text element such as `plaintext` or `textarea`, an element that merges into the page document such as `body` or `meta`, an HTML element inside SVG, or a comment. Output from the `ak:diagram` compiler passes these checks. Adapter animation stops under reduced motion, `motion-policy: none` and print. `docs/diagram-adapter.md` lists what adapter CSS may use.
96
+ - Checking adapter markup is linear in its size. An unterminated tag repeated to the 256 KB bound took minutes; it now takes milliseconds.
97
+ - A long unbroken token, such as a path or an env var list, no longer widens the page on a phone. Key-value values, list items, text and callouts break the token inside their own line, so the reported key-value page no longer scrolls sideways at 375px.
98
+ - A `diagram-panel` shows adapter SVG at its natural size. A wide diagram scrolls sideways inside its panel, a named region that scrolls from the keyboard, instead of shrinking its labels until they are unreadable. In print it is scaled to the page width.
99
+ - A `diagram-panel` whose adapter rendered no longer shows the structured description beside the drawing. The description stays in the document behind a closed "Text description" disclosure, which opens in print, with or without script.
100
+ - A long `terminal` session no longer leaves its last lines blank in a capture. Lines now stagger 80ms apart instead of 340ms, lines past the twelfth share its delay, and the whole session is drawn about 1.4s after it arrives.
101
+ - A wide `table` or adapter diagram now shows a soft shade on each edge that has more content beyond it, so a frame that scrolls sideways no longer looks clipped. A frame that fits shows none.
102
+ - A `data-table` row that a filter hides stays hidden at phone widths, where rows become cards.
103
+ - Blocks inside or after a `visibleWhen` view keep the normal block gap and the section-break gaps.
104
+ - A thinned category axis always labels the last category, so a series never reads as ending early.
105
+ - Chart ticks finer than 0.01 keep the decimals the step needs instead of all printing the same value, and only floating-point noise is removed before a value is formatted.
106
+ - A histogram over huge, close values (such as 1e16 and 1e16 + 4) keeps finite, increasing bin edges: when clean steps cannot separate the values it draws one bin.
107
+ - The page outline skips a section behind `visibleWhen`, so it never links to a hidden section.
108
+ - Dataset field names `__proto__`, `constructor` and `prototype` are refused at validation, and a `log-viewer` level named like an object property gets the neutral tone.
109
+ - `date-input` accepts ISO dates in the years 0001–0099.
11
110
 
12
111
  ## [0.2.0] - 2026-10-05
13
112
 
package/README.md CHANGED
@@ -67,19 +67,50 @@ Requires Node.js >= 20.11.
67
67
 
68
68
  ### Find the blocks you need
69
69
 
70
- There are 54 block types, from primitives (`section`, `grid`, `split`, `text`)
71
- to semantic blocks that carry the design for you (`hero`, `steps`, `timeline`,
72
- `comparison`, `kpi`, `chart`, `terminal`, `bento`, `cta`). List them, then read
73
- the full contract of the ones you use:
70
+ There are 83 block types in eight categories (layout, content, data,
71
+ interaction, media, showcase, engineering, product), from primitives (`section`,
72
+ `grid`, `split`, `text`) to semantic blocks that carry the design for you
73
+ (`hero`, `steps`, `timeline`, `kpi`, `data-table`, `chart`, `kanban`,
74
+ `pricing`, `cta`). Find the ones you need, then read only their contracts:
74
75
 
75
76
  ```bash
76
- ak-render catalog # every block and action, one line each
77
- ak-render describe timeline # props, defaults, bounds, slots, a11y notes
78
- ak-render describe kpi --json # the same, machine-readable
77
+ ak-render catalog # every block by category, and every action
78
+ ak-render catalog --category data # one category
79
+ ak-render search-catalog sortable table # rank block types by intent words
80
+ ak-render describe kpi chart --compact # one line per prop, for several types
81
+ ak-render describe timeline --json # one full contract: defaults, bounds, a11y notes
79
82
  ```
80
83
 
81
- Containers (`section`, `grid`, `split`, `stack`) take their children under
82
- `blocks:`.
84
+ Containers (`section`, `grid`, `split`, `stack` and the page layouts
85
+ `sidebar-layout`, `main-aside`, `rail-layout`) take their children under
86
+ `blocks:`. Tabs, accordion sections, carousel slides and bento tiles hold
87
+ blocks too, under `items[i].blocks`.
88
+
89
+ Text is plain text, with one exception: in prose props such as `text`, a step's
90
+ or list item's `text`, a `description` or a `caption`, a pair of backticks
91
+ renders as inline code, so `` `ak-render catalog` `` reads as a command. Nothing
92
+ else is parsed as markup, an unpaired backtick stays literal, and titles, code
93
+ and terminal lines are never changed. `describe` marks each prop that does this.
94
+
95
+ ### Start from a page recipe
96
+
97
+ A recipe is a complete, valid starter spec for a common page: a dashboard, a
98
+ benchmark report, an architecture review, an incident report, a product
99
+ showcase, a case study, a release recap, an implementation plan, a research
100
+ report or a decision memo. Replace its placeholder text and data, then validate.
101
+
102
+ ```bash
103
+ ak-render recipes # names, summaries and the blocks each uses
104
+ ak-render recipe dashboard > page.yaml # the starter spec as YAML
105
+ ```
106
+
107
+ ### Datasets and state
108
+
109
+ Declare a table once under `datasets` and bind charts, tables and widgets to it
110
+ with `dataRef`, reshaped by a bounded `transform`. Native controls write page
111
+ `state`, `visibleWhen` switches views from it, and `filter-bar` filters a table,
112
+ board or log. All of it is data, and every page still reads completely with
113
+ scripts off. See [docs/data-and-state.md](./docs/data-and-state.md).
83
114
 
84
115
  ### Validate and fix
85
116
 
@@ -103,10 +134,12 @@ ak-render plan.yaml --theme blueprint # override the spec's theme
103
134
 
104
135
  ### Themes
105
136
 
106
- Six built-in presets, each with a light and a dark scheme and an embedded
107
- display face: `blueprint`, `editorial`, `paper-ink`, `swiss-clean`,
108
- `terminal-mono` and `warm-signal`. Pick one under `theme.preset`, or extend one
109
- with validated tokens:
137
+ Ten built-in presets, each with a light and a dark scheme and an embedded
138
+ display face: `blueprint`, `data-console`, `editorial`, `executive-report`,
139
+ `paper-ink`, `product-studio`, `research-notebook`, `swiss-clean`,
140
+ `terminal-mono` and `warm-signal`. Presets also choose component recipes, such
141
+ as ledger tables or outlined cards, from closed lists. Pick one under
142
+ `theme.preset`, or extend one with validated tokens:
110
143
 
111
144
  ```yaml
112
145
  theme:
@@ -122,8 +155,9 @@ presets. See [docs/themes.md](./docs/themes.md).
122
155
 
123
156
  ### Interaction
124
157
 
125
- Tabs, accordions, carousels, sliders, dialogs, filters, copy buttons and the
126
- theme toggle come from a small trusted runtime. A spec wires them with a closed
158
+ Tabs, accordions, carousels, native form controls, filter bars, sortable
159
+ tables, dialogs, copy buttons and the theme toggle come from a small trusted
160
+ runtime. A spec wires them with a closed
127
161
  set of declarative actions (`ak-render catalog` lists them); there is no
128
162
  JavaScript field. Every page reads completely with scripts off, with motion
129
163
  reduced, in print and in a screenshot.
@@ -131,7 +165,9 @@ reduced, in print and in a screenshot.
131
165
  ### Images, video and the network
132
166
 
133
167
  Local paths (`assets/shot.png`) always work. A remote URL renders as a labelled
134
- fallback with a link unless the spec opts in:
168
+ fallback with a link unless the spec opts in. A remote video `poster` is the
169
+ exception: it has no fallback, so `validate` rejects it at its own path until
170
+ the page allows remote `images`:
135
171
 
136
172
  ```yaml
137
173
  policy:
@@ -144,7 +180,8 @@ The page's Content Security Policy is derived from that policy. See
144
180
 
145
181
  ## Use it from an agent
146
182
 
147
- Agents follow one loop: `catalog` once, `describe` the blocks they use,
183
+ Agents follow one loop: find blocks with `catalog` or `search-catalog`, start
184
+ from a `recipe` when one fits, `describe --compact` the blocks they use,
148
185
  `validate` and fix diagnostics by JSON path, then compile. The
149
186
  [agent guide](./docs/agent-guide.md) has the details and [llms.txt](./llms.txt)
150
187
  is the LLM-facing index.
@@ -174,11 +211,26 @@ codex plugin marketplace add bestagentkits/ak-render
174
211
  codex plugin add ak-render@ak-render
175
212
  ```
176
213
 
177
- ### MCP server
214
+ ### Three ways to run it
215
+
216
+ All three serve the same tools with the same contracts, backed by the same
217
+ compiler, so a spec renders to the same bytes whichever an agent picks.
218
+
219
+ | Mode | Needs | `render` returns | Network |
220
+ | --- | --- | --- | --- |
221
+ | Local CLI | Node 20.11+ | writes `--out`, prints a summary with `--json` | none |
222
+ | Local MCP (stdio) | Node 20.11+ | writes `out`, returns a summary | none |
223
+ | Remote MCP (Streamable HTTP) | an AgentKit token | stores the page, returns a summary and `artifactUrl` | yes |
224
+
225
+ Local is canonical and needs no account. The remote server exists for agents
226
+ that cannot install Node or need a URL to hand someone.
178
227
 
179
- `ak-render mcp` serves `catalog`, `describe`, `validate`, `render` and `themes`
180
- as MCP tools over stdio. `render` writes the HTML to disk and returns only a
181
- summary, so the page never enters the agent's context.
228
+ **Local CLI.** The loop above, with `ak-render` on the path or through `npx`.
229
+
230
+ **Local MCP over stdio.** `ak-render mcp` serves `catalog`, `search-catalog`,
231
+ `describe`, `recipes`, `recipe`, `validate`, `render` and `themes` as MCP
232
+ tools. `render` writes the HTML to disk
233
+ and returns only a summary, so the page never enters the agent's context.
182
234
 
183
235
  ```json
184
236
  {
@@ -188,6 +240,65 @@ summary, so the page never enters the agent's context.
188
240
  }
189
241
  ```
190
242
 
243
+ **Remote MCP over Streamable HTTP.** `https://render.agentkit.best/mcp` serves
244
+ `catalog`, `search-catalog`, `describe`, `recipes`, `recipe`, `validate`,
245
+ `render` and `themes` with the same contracts. A remote server cannot write into your filesystem, so
246
+ `render` takes no `out`: it stores the page and returns the same summary plus an
247
+ `artifactUrl` that lives for one hour, or a share link that lives for 30 days
248
+ with `share: true`. The HTML still never enters the agent's context.
249
+ `catalog`, `search-catalog`, `describe`, `recipes`, `recipe` and `themes`
250
+ answer without a token; `validate` and `render` need an AgentKit bearer token.
251
+
252
+ ```json
253
+ {
254
+ "mcpServers": {
255
+ "ak-render": {
256
+ "type": "http",
257
+ "url": "https://render.agentkit.best/mcp",
258
+ "headers": { "Authorization": "Bearer ${AGENTKIT_TOKEN}" }
259
+ }
260
+ }
261
+ }
262
+ ```
263
+
264
+ Details, limits and the REST routes are in
265
+ [apps/cloud/README.md](./apps/cloud/README.md).
266
+
267
+ ## Token cost
268
+
269
+ The compiled page goes to disk, never through the model. What the agent pays
270
+ is guidance it reads, the spec it writes, and a one-line summary it reads back.
271
+
272
+ | Part of a page task | Hand-written HTML | AK Render |
273
+ | --- | ---: | ---: |
274
+ | Presentation guidance read | 25.0k (baseline mean) | 10.6k (shared contract, skill, catalog, `describe --json`) |
275
+ | Written by the agent | 13.9k (median legacy page) | 7.2k (projected spec) |
276
+ | Returned into context | the written page is already there | 0.1k (render summary) |
277
+ | **Total, estimated** | **38.9k** | **17.9k (−54%)** |
278
+
279
+ With the compact workflow the agent guide recommends,
280
+ `describe <types...> --compact`, the guidance read is 5.7k and the total
281
+ 13.1k (−66%). The spec written and the summary returned are the same.
282
+
283
+ - **Benchmarked:** presentation context drops 64–68%, from 23.7k–26.6k tokens
284
+ of AgentKit's legacy HTML guidance to 7.9k–8.5k on the `ak-render` skill
285
+ route: the shared AgentKit contract, the skill, `catalog`, and the
286
+ `describe --json` output of the blocks a task uses
287
+ ([render benchmark](./docs/artifacts/benchmark-render.md)). The `ak:preview`
288
+ diff task (68%) follows AgentKit's reference-loading table directly; the
289
+ explain, brainstorm and plan rows use the `ak-preview` reference set as a
290
+ proxy for their hand-written HTML route.
291
+ - **Measured on 12 HTML pages agents wrote in real projects:** a median of 26%
292
+ of each page is visible text; the rest is markup, CSS and script. The
293
+ projected median output saving is 52%. A page that is mostly prose saves
294
+ little or nothing: one of the twelve grew by 35%.
295
+ - **Not measured yet:** live model token counts, repair loops, wall time and
296
+ output quality.
297
+
298
+ Characters are measured; tokens are estimated at 4 characters per token. Method
299
+ and per-page data: [agent token cost](./docs/artifacts/agent-token-cost.md),
300
+ produced by `benchmarks/agent-token-cost.mjs`.
301
+
191
302
  ## Design in one screen
192
303
 
193
304
  ```text
@@ -210,15 +321,17 @@ Six decisions define the boundary, argued in
210
321
  model-friendly spec normalizes into a flat node graph with stable IDs for
211
322
  rendering, future diff/patch/editor tooling, and MCP surfaces.
212
323
  2. **Catalog and registry are separate.** `catalog()` is compact and cheap;
213
- `describe(type)` carries the full contract. Discovery stays out of the token
324
+ `describe(type)` carries the full contract, and `--compact` one line per
325
+ prop. Discovery stays out of the token
214
326
  budget until a block is actually selected.
215
327
  3. **The interaction runtime is trusted and declarative.** A closed action
216
328
  vocabulary, one small event-delegation script, native HTML controls first,
217
329
  and only the feature modules a page uses.
218
330
  4. **Themes are typed data, never CSS.** Built-in presets plus user presets that
219
331
  `extends` them. No CSS escape hatch, no CDN fonts.
220
- 5. **Local is canonical; cloud is opt-in.** The hosted renderer reuses the same
221
- compiler and is never the source of truth.
332
+ 5. **Local is canonical; cloud is opt-in.** The hosted renderer and the remote
333
+ MCP server reuse the same compiler and tool contracts and are never the
334
+ source of truth.
222
335
  6. **Optional capabilities arrive as adapters.** Diagrams can delegate to an
223
336
  installed diagram compiler; without one, a structured fallback renders.
224
337
 
@@ -248,8 +361,11 @@ import {
248
361
  | `render(spec, options)` | Compile a spec to a standalone HTML artifact | Available |
249
362
  | `validate(spec)` | Report spec diagnostics without rendering | Available |
250
363
  | `normalize(spec)` | Produce the flat internal IR | Available |
251
- | `catalog()` | Compact list of available blocks and actions | Available |
364
+ | `catalog(options)` | Compact list of blocks and actions, optionally one `category` | Available |
365
+ | `searchCatalog(query)` | Block types ranked by intent words | Available |
252
366
  | `describe(type)` | Full machine-readable contract for one entry | Available |
367
+ | `describeMany(types, options)` | Up to 12 contracts, full or `compact` | Available |
368
+ | `recipes()`, `recipe(name)` | Page recipe list, and one recipe's starter spec | Available |
253
369
  | `loadTheme(input)` | Validate and resolve a theme preset | Available |
254
370
  | `buildThemeCatalog(options)` | Discover built-in, user, project, and explicit presets | Available |
255
371
 
@@ -259,8 +375,11 @@ import {
259
375
  ak-render page.yaml --out page.html
260
376
  ak-render - --out page.html < page.yaml # read the spec from stdin
261
377
  ak-render validate page.json
262
- ak-render catalog
263
- ak-render describe carousel
378
+ ak-render catalog [--category <c>]
379
+ ak-render search-catalog <terms...>
380
+ ak-render describe <type...> [--compact]
381
+ ak-render recipes
382
+ ak-render recipe <name> # YAML by default
264
383
  ak-render themes
265
384
  ak-render mcp # MCP server over stdio
266
385
 
@@ -273,8 +392,10 @@ Every command accepts `--json` and never prompts.
273
392
  ## Fixtures and snapshots
274
393
 
275
394
  `fixtures/pages/` holds the representative corpus the compiler is built
276
- against: plan, explain, recap, diff, dashboard, media, interactive, and theme
277
- showcase pages. `fixtures/snapshots/` holds one committed artifact per built-in
395
+ against: plan, explain, recap, diff, dashboard, media, interactive and theme
396
+ showcase pages, one page per widget family, layout, data and theme feature,
397
+ and six composition pages (a dashboard, a benchmark report, a research report,
398
+ a product case study, a data explorer and an incident report). `fixtures/snapshots/` holds one committed artifact per built-in
278
399
  preset. See [fixtures/README.md](./fixtures/README.md) and
279
400
  [docs/themes.md](./docs/themes.md). Fixtures are the specification: a new
280
401
  capability is not done until a fixture exercises it.
@@ -290,18 +411,22 @@ capability is not done until a fixture exercises it.
290
411
  | `benchmarks/` | Reproducible measurement harnesses |
291
412
  | `docs/adr/` | Architecture decision records |
292
413
  | `docs/artifacts/` | Captured measurements and evidence |
293
- | `skills/`, `.claude-plugin/`, `.agents/plugins/` | Agent skill and plugin manifests |
414
+ | `skills/`, `.claude-plugin/`, `.agents/plugins/`, `plugin.json`, `mcp.json` | Agent skill and plugin manifests |
415
+ | `assets/` | Embedded font licences and the plugin icon (`icon.svg` is the source of `logo.png` and `composer-icon.png`) |
294
416
  | `site/` | Landing page spec, build script output and Cloudflare config |
295
- | `apps/cloud/` | Opt-in Cloudflare renderer (cloud milestone) |
417
+ | `src/mcp/` | MCP protocol, shared tool contracts, stdio and Streamable HTTP transports |
418
+ | `apps/cloud/` | Opt-in Cloudflare renderer: REST routes and the remote MCP endpoint |
296
419
 
297
420
  ## Development
298
421
 
299
422
  ```bash
300
423
  pnpm install
301
- pnpm verify # lint + typecheck + unit tests + build
424
+ pnpm verify # lint, typecheck, font and recipe checks, unit tests, build
302
425
  pnpm test:browser # Playwright, after: pnpm exec playwright install chromium
303
426
  pnpm test:package # pack, install into a temp project, exercise API and bin
304
427
  pnpm bench:baseline # re-run the legacy presentation-context measurement
428
+ pnpm bench:spec # spec compression for the composition fixtures
429
+ pnpm build && pnpm bench:render --agentkit ../agentkit --repeat 9 # committed render artifact
305
430
  pnpm site:build # compile the landing page and gallery into site/dist
306
431
  pnpm site:deploy # build, then deploy site/dist with wrangler
307
432
  ```
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Chart rules that run on the same resolved input the renderer draws: gauge
3
+ * range, funnel order, treemap size, stacked shares, clipped values, pivot
4
+ * gaps and overlay positions.
5
+ */
6
+ import type { IrNode } from '../../ir.js';
7
+ import type { Report } from './chart-check.js';
8
+ /** Rules that run on the resolved chart, once its shape and fields are valid. */
9
+ export declare function checkKindRules(node: IrNode, kind: string, report: Report): void;
10
+ //# sourceMappingURL=chart-check-kind-rules.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chart-check-kind-rules.d.ts","sourceRoot":"","sources":["../../../src/blocks/chart/chart-check-kind-rules.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAG1C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAkC/C,iFAAiF;AACjF,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAyF/E"}
@@ -0,0 +1,151 @@
1
+ /**
2
+ * Chart rules that run on the same resolved input the renderer draws: gauge
3
+ * range, funnel order, treemap size, stacked shares, clipped values, pivot
4
+ * gaps and overlay positions.
5
+ */
6
+ import { fieldValue } from '../../data/dataset-types.js';
7
+ import { pathIndex, pathKey } from '../../diagnostics.js';
8
+ import { objectListProp, stringProp } from '../../render/block-helpers.js';
9
+ import { encodingProp, magnitudeEncoding, seriesField } from './chart-encodings.js';
10
+ import { CARTESIAN_KINDS, MAX_TREEMAP_CELLS, NUMERIC_X_KINDS, SINGLE_SERIES_KINDS, } from './chart-kinds.js';
11
+ import { buildChartInput } from './chart-model.js';
12
+ /** Overlay x positions must land on the axis: a category name, or a number on a numeric axis. */
13
+ function checkOverlays(node, kind, input, report) {
14
+ if (!CARTESIAN_KINDS.includes(kind))
15
+ return;
16
+ const numericAxis = NUMERIC_X_KINDS.includes(kind);
17
+ const known = kind === 'waterfall' ? [...input.labels, 'Total'] : input.labels;
18
+ for (const key of ['markers', 'annotations']) {
19
+ const items = objectListProp(node, key);
20
+ const placed = key === 'markers' ? input.encoded?.markers : input.encoded?.annotations;
21
+ items.forEach((_, index) => {
22
+ const x = placed?.[index]?.x;
23
+ const fits = numericAxis ? typeof x === 'number' : known.includes(String(x));
24
+ if (fits)
25
+ return;
26
+ report({
27
+ path: pathKey(pathIndex(pathKey(node.path, key), index), 'x'),
28
+ severity: 'warning',
29
+ message: numericAxis
30
+ ? `a ${kind} chart places overlays by number; "${String(x)}" is not drawn`
31
+ : `"${String(x)}" is not a category of this chart and is not drawn`,
32
+ details: { allowed: [...known] },
33
+ });
34
+ });
35
+ }
36
+ }
37
+ /** Rules that run on the resolved chart, once its shape and fields are valid. */
38
+ export function checkKindRules(node, kind, report) {
39
+ const input = buildChartInput(node);
40
+ const encoded = input.encoded;
41
+ const values = input.series[0]?.values ?? [];
42
+ const valuesPath = node.data === undefined
43
+ ? pathKey(pathIndex(pathKey(node.path, 'series'), 0), 'values')
44
+ : pathKey(pathKey(node.path, magnitudeEncoding(node).key), 'field');
45
+ if (SINGLE_SERIES_KINDS.includes(kind) && node.data === undefined && input.series.length > 1) {
46
+ report({
47
+ path: pathKey(node.path, 'series'),
48
+ severity: 'warning',
49
+ message: `a ${kind} chart draws only the first series`,
50
+ });
51
+ }
52
+ if (kind === 'gauge' && encoded !== undefined) {
53
+ const min = encoded.value.min ?? 0;
54
+ const max = encoded.value.max ?? 100;
55
+ const count = node.data === undefined ? values.length : node.data.rows.length;
56
+ if (count !== 1 || (node.data === undefined && input.labels.length !== 1)) {
57
+ report({ path: valuesPath, message: `a gauge shows exactly one value; found ${count}` });
58
+ }
59
+ else if ((values[0] ?? 0) < min || (values[0] ?? 0) > max) {
60
+ report({
61
+ path: valuesPath,
62
+ message: `the gauge value ${values[0]} is outside ${min}–${max}; set value.min or value.max`,
63
+ });
64
+ }
65
+ if (encoded.target !== undefined && (encoded.target < min || encoded.target > max)) {
66
+ report({
67
+ path: pathKey(node.path, 'target'),
68
+ severity: 'warning',
69
+ message: `target ${encoded.target} is outside ${min}–${max} and is drawn at the edge`,
70
+ });
71
+ }
72
+ }
73
+ if (kind === 'funnel') {
74
+ const rises = values.findIndex((value, index) => index > 0 && value > (values[index - 1] ?? 0));
75
+ if (rises > 0) {
76
+ report({
77
+ path: valuesPath,
78
+ severity: 'warning',
79
+ message: `funnel stage "${input.labels[rises]}" is larger than the stage before it`,
80
+ });
81
+ }
82
+ }
83
+ if (kind === 'treemap') {
84
+ if (input.labels.length > MAX_TREEMAP_CELLS) {
85
+ report({
86
+ path: valuesPath,
87
+ code: 'SPEC_BOUNDS_ERROR',
88
+ message: `a treemap holds at most ${MAX_TREEMAP_CELLS} cells; found ${input.labels.length}`,
89
+ });
90
+ }
91
+ if (values.some((value) => value < 0)) {
92
+ report({ path: valuesPath, message: 'treemap values must not be negative' });
93
+ }
94
+ }
95
+ if (kind === 'stacked-bar-100' &&
96
+ input.series.some((series) => series.values.some((v) => v < 0))) {
97
+ report({ path: valuesPath, message: 'stacked-bar-100 values must not be negative' });
98
+ }
99
+ if (CARTESIAN_KINDS.includes(kind) && encoded !== undefined && kind !== 'stacked-bar-100') {
100
+ const { min, max } = encoded.y;
101
+ const plotted = kind === 'scatter'
102
+ ? encoded.points.map((point) => point.y)
103
+ : input.series.flatMap((s) => s.values);
104
+ const outside = plotted.filter((value) => (min !== undefined && value < min) || (max !== undefined && value > max)).length;
105
+ if (outside > 0 && kind !== 'histogram' && kind !== 'waterfall') {
106
+ report({
107
+ path: pathKey(node.path, 'y'),
108
+ severity: 'warning',
109
+ message: `${outside} values fall outside y.min/y.max and are clipped at the edge`,
110
+ });
111
+ }
112
+ }
113
+ if (node.data !== undefined &&
114
+ seriesField(node) !== undefined &&
115
+ !SINGLE_SERIES_KINDS.includes(kind)) {
116
+ checkPivotGaps(node, input.labels.length, report);
117
+ }
118
+ checkOverlays(node, kind, input, report);
119
+ }
120
+ /** Warn when a pivoted series misses a category (drawn as 0) or repeats one (summed). */
121
+ function checkPivotGaps(node, categories, report) {
122
+ if (stringProp(node, 'kind') === 'scatter' || stringProp(node, 'kind') === 'heatmap')
123
+ return;
124
+ const x = encodingProp(node, 'x')?.field;
125
+ const group = seriesField(node);
126
+ if (x === undefined || group === undefined || node.data === undefined)
127
+ return;
128
+ const seen = new Map();
129
+ const groups = new Set();
130
+ for (const row of node.data.rows) {
131
+ const key = JSON.stringify([fieldValue(row, group), fieldValue(row, x)]);
132
+ groups.add(JSON.stringify(fieldValue(row, group)));
133
+ seen.set(key, (seen.get(key) ?? 0) + 1);
134
+ }
135
+ const path = pathKey(pathKey(node.path, 'series'), 'field');
136
+ if ([...seen.values()].some((count) => count > 1)) {
137
+ report({
138
+ path,
139
+ severity: 'warning',
140
+ message: 'some series repeat an x value; their values are summed (use transform.groupBy to aggregate explicitly)',
141
+ });
142
+ }
143
+ if (seen.size < groups.size * categories) {
144
+ report({
145
+ path,
146
+ severity: 'warning',
147
+ message: 'some series have no row for an x value; those points are drawn as 0',
148
+ });
149
+ }
150
+ }
151
+ //# sourceMappingURL=chart-check-kind-rules.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chart-check-kind-rules.js","sourceRoot":"","sources":["../../../src/blocks/chart/chart-check-kind-rules.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Cross-field chart checks: what the prop schema cannot express.
3
+ *
4
+ * Inline charts need labels and series; bound charts must not repeat them and
5
+ * must name existing, numeric fields for each kind's encodings. Kind rules
6
+ * (gauge range, funnel order, treemap size, stacked shares) run on the same
7
+ * resolved input the renderer draws.
8
+ */
9
+ import { type DiagnosticBag, type DiagnosticInput } from '../../diagnostics.js';
10
+ import type { IrNode } from '../../ir.js';
11
+ export type Report = (input: Omit<DiagnosticInput, 'code'> & {
12
+ code?: DiagnosticInput['code'];
13
+ }) => void;
14
+ export declare function checkChart(node: IrNode, bag: DiagnosticBag): void;
15
+ //# sourceMappingURL=chart-check.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chart-check.d.ts","sourceRoot":"","sources":["../../../src/blocks/chart/chart-check.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,EAAE,KAAK,aAAa,EAAE,KAAK,eAAe,EAAW,MAAM,sBAAsB,CAAC;AACzF,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAiB1C,MAAM,MAAM,MAAM,GAAG,CACnB,KAAK,EAAE,IAAI,CAAC,eAAe,EAAE,MAAM,CAAC,GAAG;IAAE,IAAI,CAAC,EAAE,eAAe,CAAC,MAAM,CAAC,CAAA;CAAE,KACtE,IAAI,CAAC;AAiLV,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,aAAa,GAAG,IAAI,CAcjE"}