@bestagentkits/render 0.1.1-next.1 → 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 (635) hide show
  1. package/CHANGELOG.md +209 -1
  2. package/README.md +324 -44
  3. package/assets/fonts/bricolage-grotesque/OFL.txt +93 -0
  4. package/assets/fonts/fraunces/OFL.txt +93 -0
  5. package/assets/fonts/geist/OFL.txt +93 -0
  6. package/assets/fonts/inter-tight/OFL.txt +93 -0
  7. package/assets/fonts/jetbrains-mono/OFL.txt +93 -0
  8. package/assets/fonts/plus-jakarta-sans/OFL.txt +93 -0
  9. package/dist/blocks/chart/chart-check-kind-rules.d.ts +10 -0
  10. package/dist/blocks/chart/chart-check-kind-rules.d.ts.map +1 -0
  11. package/dist/blocks/chart/chart-check-kind-rules.js +151 -0
  12. package/dist/blocks/chart/chart-check-kind-rules.js.map +1 -0
  13. package/dist/blocks/chart/chart-check.d.ts +15 -0
  14. package/dist/blocks/chart/chart-check.d.ts.map +1 -0
  15. package/dist/blocks/chart/chart-check.js +196 -0
  16. package/dist/blocks/chart/chart-check.js.map +1 -0
  17. package/dist/blocks/chart/chart-encoding-schema.d.ts +7 -0
  18. package/dist/blocks/chart/chart-encoding-schema.d.ts.map +1 -0
  19. package/dist/blocks/chart/chart-encoding-schema.js +39 -0
  20. package/dist/blocks/chart/chart-encoding-schema.js.map +1 -0
  21. package/dist/blocks/chart/chart-encodings.d.ts +29 -0
  22. package/dist/blocks/chart/chart-encodings.d.ts.map +1 -0
  23. package/dist/blocks/chart/chart-encodings.js +59 -0
  24. package/dist/blocks/chart/chart-encodings.js.map +1 -0
  25. package/dist/blocks/chart/chart-kinds.d.ts +18 -0
  26. package/dist/blocks/chart/chart-kinds.d.ts.map +1 -0
  27. package/dist/blocks/chart/chart-kinds.js +60 -0
  28. package/dist/blocks/chart/chart-kinds.js.map +1 -0
  29. package/dist/blocks/chart/chart-model-rows.d.ts +23 -0
  30. package/dist/blocks/chart/chart-model-rows.d.ts.map +1 -0
  31. package/dist/blocks/chart/chart-model-rows.js +153 -0
  32. package/dist/blocks/chart/chart-model-rows.js.map +1 -0
  33. package/dist/blocks/chart/chart-model.d.ts +17 -0
  34. package/dist/blocks/chart/chart-model.d.ts.map +1 -0
  35. package/dist/blocks/chart/chart-model.js +131 -0
  36. package/dist/blocks/chart/chart-model.js.map +1 -0
  37. package/dist/blocks/chart/chart-styles.d.ts +3 -0
  38. package/dist/blocks/chart/chart-styles.d.ts.map +1 -0
  39. package/dist/blocks/chart/chart-styles.js +76 -0
  40. package/dist/blocks/chart/chart-styles.js.map +1 -0
  41. package/dist/blocks/chart/chart.d.ts +12 -0
  42. package/dist/blocks/chart/chart.d.ts.map +1 -0
  43. package/dist/blocks/chart/chart.js +73 -0
  44. package/dist/blocks/chart/chart.js.map +1 -0
  45. package/dist/blocks/chart/index.d.ts +4 -0
  46. package/dist/blocks/chart/index.d.ts.map +1 -0
  47. package/dist/blocks/chart/index.js +8 -0
  48. package/dist/blocks/chart/index.js.map +1 -0
  49. package/dist/blocks/composition/accordion.d.ts +4 -0
  50. package/dist/blocks/composition/accordion.d.ts.map +1 -0
  51. package/dist/blocks/composition/accordion.js +45 -0
  52. package/dist/blocks/composition/accordion.js.map +1 -0
  53. package/dist/blocks/composition/bento.d.ts +4 -0
  54. package/dist/blocks/composition/bento.d.ts.map +1 -0
  55. package/dist/blocks/composition/bento.js +91 -0
  56. package/dist/blocks/composition/bento.js.map +1 -0
  57. package/dist/blocks/composition/carousel.d.ts +4 -0
  58. package/dist/blocks/composition/carousel.d.ts.map +1 -0
  59. package/dist/blocks/composition/carousel.js +51 -0
  60. package/dist/blocks/composition/carousel.js.map +1 -0
  61. package/dist/blocks/composition/composition-runtime.d.ts +14 -0
  62. package/dist/blocks/composition/composition-runtime.d.ts.map +1 -0
  63. package/dist/blocks/composition/composition-runtime.js +136 -0
  64. package/dist/blocks/composition/composition-runtime.js.map +1 -0
  65. package/dist/blocks/composition/composition-styles.d.ts +10 -0
  66. package/dist/blocks/composition/composition-styles.d.ts.map +1 -0
  67. package/dist/blocks/composition/composition-styles.js +80 -0
  68. package/dist/blocks/composition/composition-styles.js.map +1 -0
  69. package/dist/blocks/composition/index.d.ts +4 -0
  70. package/dist/blocks/composition/index.d.ts.map +1 -0
  71. package/dist/blocks/composition/index.js +11 -0
  72. package/dist/blocks/composition/index.js.map +1 -0
  73. package/dist/blocks/composition/nestable-blocks.d.ts +37 -0
  74. package/dist/blocks/composition/nestable-blocks.d.ts.map +1 -0
  75. package/dist/blocks/composition/nestable-blocks.js +92 -0
  76. package/dist/blocks/composition/nestable-blocks.js.map +1 -0
  77. package/dist/blocks/composition/tabs.d.ts +4 -0
  78. package/dist/blocks/composition/tabs.d.ts.map +1 -0
  79. package/dist/blocks/composition/tabs.js +48 -0
  80. package/dist/blocks/composition/tabs.js.map +1 -0
  81. package/dist/blocks/controls/checkbox.d.ts +12 -0
  82. package/dist/blocks/controls/checkbox.d.ts.map +1 -0
  83. package/dist/blocks/controls/checkbox.js +43 -0
  84. package/dist/blocks/controls/checkbox.js.map +1 -0
  85. package/dist/blocks/controls/choice-options.d.ts +24 -0
  86. package/dist/blocks/controls/choice-options.d.ts.map +1 -0
  87. package/dist/blocks/controls/choice-options.js +117 -0
  88. package/dist/blocks/controls/choice-options.js.map +1 -0
  89. package/dist/blocks/controls/control-shared.d.ts +66 -0
  90. package/dist/blocks/controls/control-shared.d.ts.map +1 -0
  91. package/dist/blocks/controls/control-shared.js +241 -0
  92. package/dist/blocks/controls/control-shared.js.map +1 -0
  93. package/dist/blocks/controls/controls-runtime.d.ts +17 -0
  94. package/dist/blocks/controls/controls-runtime.d.ts.map +1 -0
  95. package/dist/blocks/controls/controls-runtime.js +180 -0
  96. package/dist/blocks/controls/controls-runtime.js.map +1 -0
  97. package/dist/blocks/controls/controls-styles.d.ts +14 -0
  98. package/dist/blocks/controls/controls-styles.d.ts.map +1 -0
  99. package/dist/blocks/controls/controls-styles.js +54 -0
  100. package/dist/blocks/controls/controls-styles.js.map +1 -0
  101. package/dist/blocks/controls/date-input.d.ts +6 -0
  102. package/dist/blocks/controls/date-input.d.ts.map +1 -0
  103. package/dist/blocks/controls/date-input.js +58 -0
  104. package/dist/blocks/controls/date-input.js.map +1 -0
  105. package/dist/blocks/controls/field-input.d.ts +10 -0
  106. package/dist/blocks/controls/field-input.d.ts.map +1 -0
  107. package/dist/blocks/controls/field-input.js +20 -0
  108. package/dist/blocks/controls/field-input.js.map +1 -0
  109. package/dist/blocks/controls/filter-bar.d.ts +11 -0
  110. package/dist/blocks/controls/filter-bar.d.ts.map +1 -0
  111. package/dist/blocks/controls/filter-bar.js +115 -0
  112. package/dist/blocks/controls/filter-bar.js.map +1 -0
  113. package/dist/blocks/controls/index.d.ts +4 -0
  114. package/dist/blocks/controls/index.d.ts.map +1 -0
  115. package/dist/blocks/controls/index.js +41 -0
  116. package/dist/blocks/controls/index.js.map +1 -0
  117. package/dist/blocks/controls/number-input.d.ts +4 -0
  118. package/dist/blocks/controls/number-input.d.ts.map +1 -0
  119. package/dist/blocks/controls/number-input.js +62 -0
  120. package/dist/blocks/controls/number-input.js.map +1 -0
  121. package/dist/blocks/controls/radio-group.d.ts +4 -0
  122. package/dist/blocks/controls/radio-group.d.ts.map +1 -0
  123. package/dist/blocks/controls/radio-group.js +56 -0
  124. package/dist/blocks/controls/radio-group.js.map +1 -0
  125. package/dist/blocks/controls/select.d.ts +4 -0
  126. package/dist/blocks/controls/select.d.ts.map +1 -0
  127. package/dist/blocks/controls/select.js +49 -0
  128. package/dist/blocks/controls/select.js.map +1 -0
  129. package/dist/blocks/controls/switch.d.ts +4 -0
  130. package/dist/blocks/controls/switch.d.ts.map +1 -0
  131. package/dist/blocks/controls/switch.js +22 -0
  132. package/dist/blocks/controls/switch.js.map +1 -0
  133. package/dist/blocks/controls/text-input.d.ts +4 -0
  134. package/dist/blocks/controls/text-input.d.ts.map +1 -0
  135. package/dist/blocks/controls/text-input.js +42 -0
  136. package/dist/blocks/controls/text-input.js.map +1 -0
  137. package/dist/blocks/data-table/data-table-cells.d.ts +26 -0
  138. package/dist/blocks/data-table/data-table-cells.d.ts.map +1 -0
  139. package/dist/blocks/data-table/data-table-cells.js +154 -0
  140. package/dist/blocks/data-table/data-table-cells.js.map +1 -0
  141. package/dist/blocks/data-table/data-table-check.d.ts +10 -0
  142. package/dist/blocks/data-table/data-table-check.d.ts.map +1 -0
  143. package/dist/blocks/data-table/data-table-check.js +99 -0
  144. package/dist/blocks/data-table/data-table-check.js.map +1 -0
  145. package/dist/blocks/data-table/data-table-columns.d.ts +41 -0
  146. package/dist/blocks/data-table/data-table-columns.d.ts.map +1 -0
  147. package/dist/blocks/data-table/data-table-columns.js +155 -0
  148. package/dist/blocks/data-table/data-table-columns.js.map +1 -0
  149. package/dist/blocks/data-table/data-table-runtime.d.ts +15 -0
  150. package/dist/blocks/data-table/data-table-runtime.d.ts.map +1 -0
  151. package/dist/blocks/data-table/data-table-runtime.js +106 -0
  152. package/dist/blocks/data-table/data-table-runtime.js.map +1 -0
  153. package/dist/blocks/data-table/data-table-styles.d.ts +11 -0
  154. package/dist/blocks/data-table/data-table-styles.d.ts.map +1 -0
  155. package/dist/blocks/data-table/data-table-styles.js +74 -0
  156. package/dist/blocks/data-table/data-table-styles.js.map +1 -0
  157. package/dist/blocks/data-table/data-table.d.ts +17 -0
  158. package/dist/blocks/data-table/data-table.d.ts.map +1 -0
  159. package/dist/blocks/data-table/data-table.js +159 -0
  160. package/dist/blocks/data-table/data-table.js.map +1 -0
  161. package/dist/blocks/data-table/index.d.ts +4 -0
  162. package/dist/blocks/data-table/index.d.ts.map +1 -0
  163. package/dist/blocks/data-table/index.js +18 -0
  164. package/dist/blocks/data-table/index.js.map +1 -0
  165. package/dist/blocks/engineering/api-endpoint.d.ts +12 -0
  166. package/dist/blocks/engineering/api-endpoint.d.ts.map +1 -0
  167. package/dist/blocks/engineering/api-endpoint.js +174 -0
  168. package/dist/blocks/engineering/api-endpoint.js.map +1 -0
  169. package/dist/blocks/engineering/engineering-helpers.d.ts +49 -0
  170. package/dist/blocks/engineering/engineering-helpers.d.ts.map +1 -0
  171. package/dist/blocks/engineering/engineering-helpers.js +156 -0
  172. package/dist/blocks/engineering/engineering-helpers.js.map +1 -0
  173. package/dist/blocks/engineering/engineering-styles.d.ts +12 -0
  174. package/dist/blocks/engineering/engineering-styles.d.ts.map +1 -0
  175. package/dist/blocks/engineering/engineering-styles.js +174 -0
  176. package/dist/blocks/engineering/engineering-styles.js.map +1 -0
  177. package/dist/blocks/engineering/index.d.ts +4 -0
  178. package/dist/blocks/engineering/index.d.ts.map +1 -0
  179. package/dist/blocks/engineering/index.js +30 -0
  180. package/dist/blocks/engineering/index.js.map +1 -0
  181. package/dist/blocks/engineering/kanban.d.ts +11 -0
  182. package/dist/blocks/engineering/kanban.d.ts.map +1 -0
  183. package/dist/blocks/engineering/kanban.js +162 -0
  184. package/dist/blocks/engineering/kanban.js.map +1 -0
  185. package/dist/blocks/engineering/log-viewer.d.ts +14 -0
  186. package/dist/blocks/engineering/log-viewer.d.ts.map +1 -0
  187. package/dist/blocks/engineering/log-viewer.js +158 -0
  188. package/dist/blocks/engineering/log-viewer.js.map +1 -0
  189. package/dist/blocks/engineering/roadmap.d.ts +13 -0
  190. package/dist/blocks/engineering/roadmap.d.ts.map +1 -0
  191. package/dist/blocks/engineering/roadmap.js +197 -0
  192. package/dist/blocks/engineering/roadmap.js.map +1 -0
  193. package/dist/blocks/engineering/schema-viewer.d.ts +25 -0
  194. package/dist/blocks/engineering/schema-viewer.d.ts.map +1 -0
  195. package/dist/blocks/engineering/schema-viewer.js +124 -0
  196. package/dist/blocks/engineering/schema-viewer.js.map +1 -0
  197. package/dist/blocks/engineering/test-results.d.ts +12 -0
  198. package/dist/blocks/engineering/test-results.d.ts.map +1 -0
  199. package/dist/blocks/engineering/test-results.js +180 -0
  200. package/dist/blocks/engineering/test-results.js.map +1 -0
  201. package/dist/blocks/evidence/annotated-image.d.ts +15 -0
  202. package/dist/blocks/evidence/annotated-image.d.ts.map +1 -0
  203. package/dist/blocks/evidence/annotated-image.js +99 -0
  204. package/dist/blocks/evidence/annotated-image.js.map +1 -0
  205. package/dist/blocks/evidence/benchmark-comparison.d.ts +11 -0
  206. package/dist/blocks/evidence/benchmark-comparison.d.ts.map +1 -0
  207. package/dist/blocks/evidence/benchmark-comparison.js +262 -0
  208. package/dist/blocks/evidence/benchmark-comparison.js.map +1 -0
  209. package/dist/blocks/evidence/benchmark-verdict.d.ts +26 -0
  210. package/dist/blocks/evidence/benchmark-verdict.d.ts.map +1 -0
  211. package/dist/blocks/evidence/benchmark-verdict.js +31 -0
  212. package/dist/blocks/evidence/benchmark-verdict.js.map +1 -0
  213. package/dist/blocks/evidence/evidence-helpers.d.ts +39 -0
  214. package/dist/blocks/evidence/evidence-helpers.d.ts.map +1 -0
  215. package/dist/blocks/evidence/evidence-helpers.js +87 -0
  216. package/dist/blocks/evidence/evidence-helpers.js.map +1 -0
  217. package/dist/blocks/evidence/evidence-styles.d.ts +12 -0
  218. package/dist/blocks/evidence/evidence-styles.d.ts.map +1 -0
  219. package/dist/blocks/evidence/evidence-styles.js +88 -0
  220. package/dist/blocks/evidence/evidence-styles.js.map +1 -0
  221. package/dist/blocks/evidence/index.d.ts +4 -0
  222. package/dist/blocks/evidence/index.d.ts.map +1 -0
  223. package/dist/blocks/evidence/index.js +15 -0
  224. package/dist/blocks/evidence/index.js.map +1 -0
  225. package/dist/blocks/evidence/metric-breakdown.d.ts +22 -0
  226. package/dist/blocks/evidence/metric-breakdown.d.ts.map +1 -0
  227. package/dist/blocks/evidence/metric-breakdown.js +203 -0
  228. package/dist/blocks/evidence/metric-breakdown.js.map +1 -0
  229. package/dist/blocks/evidence/references.d.ts +13 -0
  230. package/dist/blocks/evidence/references.d.ts.map +1 -0
  231. package/dist/blocks/evidence/references.js +103 -0
  232. package/dist/blocks/evidence/references.js.map +1 -0
  233. package/dist/blocks/index.d.ts +8 -0
  234. package/dist/blocks/index.d.ts.map +1 -0
  235. package/dist/blocks/index.js +24 -0
  236. package/dist/blocks/index.js.map +1 -0
  237. package/dist/blocks/layout/grid-item.d.ts +4 -0
  238. package/dist/blocks/layout/grid-item.d.ts.map +1 -0
  239. package/dist/blocks/layout/grid-item.js +65 -0
  240. package/dist/blocks/layout/grid-item.js.map +1 -0
  241. package/dist/blocks/layout/grid.d.ts +9 -0
  242. package/dist/blocks/layout/grid.d.ts.map +1 -0
  243. package/dist/blocks/layout/grid.js +99 -0
  244. package/dist/blocks/layout/grid.js.map +1 -0
  245. package/dist/blocks/layout/index.d.ts +4 -0
  246. package/dist/blocks/layout/index.d.ts.map +1 -0
  247. package/dist/blocks/layout/index.js +23 -0
  248. package/dist/blocks/layout/index.js.map +1 -0
  249. package/dist/blocks/layout/layout-styles.d.ts +40 -0
  250. package/dist/blocks/layout/layout-styles.d.ts.map +1 -0
  251. package/dist/blocks/layout/layout-styles.js +110 -0
  252. package/dist/blocks/layout/layout-styles.js.map +1 -0
  253. package/dist/blocks/layout/main-aside.d.ts +4 -0
  254. package/dist/blocks/layout/main-aside.d.ts.map +1 -0
  255. package/dist/blocks/layout/main-aside.js +21 -0
  256. package/dist/blocks/layout/main-aside.js.map +1 -0
  257. package/dist/blocks/layout/rail-layout.d.ts +4 -0
  258. package/dist/blocks/layout/rail-layout.d.ts.map +1 -0
  259. package/dist/blocks/layout/rail-layout.js +33 -0
  260. package/dist/blocks/layout/rail-layout.js.map +1 -0
  261. package/dist/blocks/layout/semantic-layout-parts.d.ts +14 -0
  262. package/dist/blocks/layout/semantic-layout-parts.d.ts.map +1 -0
  263. package/dist/blocks/layout/semantic-layout-parts.js +9 -0
  264. package/dist/blocks/layout/semantic-layout-parts.js.map +1 -0
  265. package/dist/blocks/layout/sidebar-layout.d.ts +4 -0
  266. package/dist/blocks/layout/sidebar-layout.d.ts.map +1 -0
  267. package/dist/blocks/layout/sidebar-layout.js +30 -0
  268. package/dist/blocks/layout/sidebar-layout.js.map +1 -0
  269. package/dist/blocks/layout/split.d.ts +4 -0
  270. package/dist/blocks/layout/split.d.ts.map +1 -0
  271. package/dist/blocks/layout/split.js +23 -0
  272. package/dist/blocks/layout/split.js.map +1 -0
  273. package/dist/blocks/layout/stack.d.ts +4 -0
  274. package/dist/blocks/layout/stack.d.ts.map +1 -0
  275. package/dist/blocks/layout/stack.js +36 -0
  276. package/dist/blocks/layout/stack.js.map +1 -0
  277. package/dist/blocks/product/calendar-dates.d.ts +59 -0
  278. package/dist/blocks/product/calendar-dates.d.ts.map +1 -0
  279. package/dist/blocks/product/calendar-dates.js +100 -0
  280. package/dist/blocks/product/calendar-dates.js.map +1 -0
  281. package/dist/blocks/product/calendar.d.ts +12 -0
  282. package/dist/blocks/product/calendar.d.ts.map +1 -0
  283. package/dist/blocks/product/calendar.js +125 -0
  284. package/dist/blocks/product/calendar.js.map +1 -0
  285. package/dist/blocks/product/feature-matrix.d.ts +4 -0
  286. package/dist/blocks/product/feature-matrix.d.ts.map +1 -0
  287. package/dist/blocks/product/feature-matrix.js +72 -0
  288. package/dist/blocks/product/feature-matrix.js.map +1 -0
  289. package/dist/blocks/product/gallery.d.ts +14 -0
  290. package/dist/blocks/product/gallery.d.ts.map +1 -0
  291. package/dist/blocks/product/gallery.js +86 -0
  292. package/dist/blocks/product/gallery.js.map +1 -0
  293. package/dist/blocks/product/index.d.ts +4 -0
  294. package/dist/blocks/product/index.d.ts.map +1 -0
  295. package/dist/blocks/product/index.js +40 -0
  296. package/dist/blocks/product/index.js.map +1 -0
  297. package/dist/blocks/product/logo-cloud.d.ts +4 -0
  298. package/dist/blocks/product/logo-cloud.d.ts.map +1 -0
  299. package/dist/blocks/product/logo-cloud.js +42 -0
  300. package/dist/blocks/product/logo-cloud.js.map +1 -0
  301. package/dist/blocks/product/people.d.ts +4 -0
  302. package/dist/blocks/product/people.d.ts.map +1 -0
  303. package/dist/blocks/product/people.js +53 -0
  304. package/dist/blocks/product/people.js.map +1 -0
  305. package/dist/blocks/product/pricing.d.ts +4 -0
  306. package/dist/blocks/product/pricing.d.ts.map +1 -0
  307. package/dist/blocks/product/pricing.js +86 -0
  308. package/dist/blocks/product/pricing.js.map +1 -0
  309. package/dist/blocks/product/product-helpers.d.ts +22 -0
  310. package/dist/blocks/product/product-helpers.d.ts.map +1 -0
  311. package/dist/blocks/product/product-helpers.js +48 -0
  312. package/dist/blocks/product/product-helpers.js.map +1 -0
  313. package/dist/blocks/product/product-runtime.d.ts +15 -0
  314. package/dist/blocks/product/product-runtime.d.ts.map +1 -0
  315. package/dist/blocks/product/product-runtime.js +97 -0
  316. package/dist/blocks/product/product-runtime.js.map +1 -0
  317. package/dist/blocks/product/product-styles.d.ts +14 -0
  318. package/dist/blocks/product/product-styles.d.ts.map +1 -0
  319. package/dist/blocks/product/product-styles.js +120 -0
  320. package/dist/blocks/product/product-styles.js.map +1 -0
  321. package/dist/blocks/product/testimonial.d.ts +8 -0
  322. package/dist/blocks/product/testimonial.d.ts.map +1 -0
  323. package/dist/blocks/product/testimonial.js +67 -0
  324. package/dist/blocks/product/testimonial.js.map +1 -0
  325. package/dist/cli.d.ts +2 -0
  326. package/dist/cli.d.ts.map +1 -1
  327. package/dist/cli.js +193 -39
  328. package/dist/cli.js.map +1 -1
  329. package/dist/data/data-json-schema.d.ts +9 -0
  330. package/dist/data/data-json-schema.d.ts.map +1 -0
  331. package/dist/data/data-json-schema.js +48 -0
  332. package/dist/data/data-json-schema.js.map +1 -0
  333. package/dist/data/dataset-types.d.ts +47 -0
  334. package/dist/data/dataset-types.d.ts.map +1 -0
  335. package/dist/data/dataset-types.js +49 -0
  336. package/dist/data/dataset-types.js.map +1 -0
  337. package/dist/data/format-value.d.ts +39 -0
  338. package/dist/data/format-value.d.ts.map +1 -0
  339. package/dist/data/format-value.js +214 -0
  340. package/dist/data/format-value.js.map +1 -0
  341. package/dist/data/resolve-block-data.d.ts +24 -0
  342. package/dist/data/resolve-block-data.d.ts.map +1 -0
  343. package/dist/data/resolve-block-data.js +190 -0
  344. package/dist/data/resolve-block-data.js.map +1 -0
  345. package/dist/data/transform-pipeline.d.ts +65 -0
  346. package/dist/data/transform-pipeline.d.ts.map +1 -0
  347. package/dist/data/transform-pipeline.js +234 -0
  348. package/dist/data/transform-pipeline.js.map +1 -0
  349. package/dist/data/validate-datasets.d.ts +22 -0
  350. package/dist/data/validate-datasets.d.ts.map +1 -0
  351. package/dist/data/validate-datasets.js +137 -0
  352. package/dist/data/validate-datasets.js.map +1 -0
  353. package/dist/diagram/adapter-markup-fit.d.ts +44 -0
  354. package/dist/diagram/adapter-markup-fit.d.ts.map +1 -0
  355. package/dist/diagram/adapter-markup-fit.js +292 -0
  356. package/dist/diagram/adapter-markup-fit.js.map +1 -0
  357. package/dist/diagram/adapter-stylesheet-filter.d.ts +56 -0
  358. package/dist/diagram/adapter-stylesheet-filter.d.ts.map +1 -0
  359. package/dist/diagram/adapter-stylesheet-filter.js +245 -0
  360. package/dist/diagram/adapter-stylesheet-filter.js.map +1 -0
  361. package/dist/diagram/adapter.d.ts +17 -0
  362. package/dist/diagram/adapter.d.ts.map +1 -1
  363. package/dist/diagram/adapter.js +43 -2
  364. package/dist/diagram/adapter.js.map +1 -1
  365. package/dist/index.d.ts +14 -1
  366. package/dist/index.d.ts.map +1 -1
  367. package/dist/index.js +6 -0
  368. package/dist/index.js.map +1 -1
  369. package/dist/ir.d.ts +18 -0
  370. package/dist/ir.d.ts.map +1 -1
  371. package/dist/ir.js.map +1 -1
  372. package/dist/mcp/mcp-http-transport.d.ts +68 -0
  373. package/dist/mcp/mcp-http-transport.d.ts.map +1 -0
  374. package/dist/mcp/mcp-http-transport.js +140 -0
  375. package/dist/mcp/mcp-http-transport.js.map +1 -0
  376. package/dist/mcp/mcp-json-rpc-dispatch.d.ts +38 -0
  377. package/dist/mcp/mcp-json-rpc-dispatch.d.ts.map +1 -0
  378. package/dist/mcp/mcp-json-rpc-dispatch.js +98 -0
  379. package/dist/mcp/mcp-json-rpc-dispatch.js.map +1 -0
  380. package/dist/mcp/mcp-local-tools.d.ts +20 -0
  381. package/dist/mcp/mcp-local-tools.d.ts.map +1 -0
  382. package/dist/mcp/mcp-local-tools.js +58 -0
  383. package/dist/mcp/mcp-local-tools.js.map +1 -0
  384. package/dist/mcp/mcp-protocol.d.ts +79 -0
  385. package/dist/mcp/mcp-protocol.d.ts.map +1 -0
  386. package/dist/mcp/mcp-protocol.js +83 -0
  387. package/dist/mcp/mcp-protocol.js.map +1 -0
  388. package/dist/mcp/mcp-stdio-transport.d.ts +28 -0
  389. package/dist/mcp/mcp-stdio-transport.d.ts.map +1 -0
  390. package/dist/mcp/mcp-stdio-transport.js +73 -0
  391. package/dist/mcp/mcp-stdio-transport.js.map +1 -0
  392. package/dist/mcp/mcp-tool-definitions.d.ts +66 -0
  393. package/dist/mcp/mcp-tool-definitions.d.ts.map +1 -0
  394. package/dist/mcp/mcp-tool-definitions.js +246 -0
  395. package/dist/mcp/mcp-tool-definitions.js.map +1 -0
  396. package/dist/mcp-server.d.ts +10 -0
  397. package/dist/mcp-server.d.ts.map +1 -0
  398. package/dist/mcp-server.js +9 -0
  399. package/dist/mcp-server.js.map +1 -0
  400. package/dist/recipes/index.d.ts +27 -0
  401. package/dist/recipes/index.d.ts.map +1 -0
  402. package/dist/recipes/index.js +30 -0
  403. package/dist/recipes/index.js.map +1 -0
  404. package/dist/recipes/recipes.generated.d.ts +8 -0
  405. package/dist/recipes/recipes.generated.d.ts.map +1 -0
  406. package/dist/recipes/recipes.generated.js +704 -0
  407. package/dist/recipes/recipes.generated.js.map +1 -0
  408. package/dist/registry/actions.d.ts +2 -0
  409. package/dist/registry/actions.d.ts.map +1 -1
  410. package/dist/registry/actions.js +3 -1
  411. package/dist/registry/actions.js.map +1 -1
  412. package/dist/registry/block-module.d.ts +65 -0
  413. package/dist/registry/block-module.d.ts.map +1 -0
  414. package/dist/registry/block-module.js +19 -0
  415. package/dist/registry/block-module.js.map +1 -0
  416. package/dist/registry/catalog-search.d.ts +32 -0
  417. package/dist/registry/catalog-search.d.ts.map +1 -0
  418. package/dist/registry/catalog-search.js +122 -0
  419. package/dist/registry/catalog-search.js.map +1 -0
  420. package/dist/registry/define-helpers.d.ts +89 -0
  421. package/dist/registry/define-helpers.d.ts.map +1 -0
  422. package/dist/registry/define-helpers.js +87 -0
  423. package/dist/registry/define-helpers.js.map +1 -0
  424. package/dist/registry/describe-many.d.ts +58 -0
  425. package/dist/registry/describe-many.d.ts.map +1 -0
  426. package/dist/registry/describe-many.js +156 -0
  427. package/dist/registry/describe-many.js.map +1 -0
  428. package/dist/registry/prop-schema.d.ts +32 -1
  429. package/dist/registry/prop-schema.d.ts.map +1 -1
  430. package/dist/registry/prop-schema.js +108 -2
  431. package/dist/registry/prop-schema.js.map +1 -1
  432. package/dist/registry/registry-builder.d.ts +17 -0
  433. package/dist/registry/registry-builder.d.ts.map +1 -0
  434. package/dist/registry/registry-builder.js +158 -0
  435. package/dist/registry/registry-builder.js.map +1 -0
  436. package/dist/registry/registry.d.ts +32 -5
  437. package/dist/registry/registry.d.ts.map +1 -1
  438. package/dist/registry/registry.js +67 -14
  439. package/dist/registry/registry.js.map +1 -1
  440. package/dist/registry/roster.d.ts +34 -5
  441. package/dist/registry/roster.d.ts.map +1 -1
  442. package/dist/registry/roster.js +360 -184
  443. package/dist/registry/roster.js.map +1 -1
  444. package/dist/render/block-helpers.d.ts +45 -0
  445. package/dist/render/block-helpers.d.ts.map +1 -0
  446. package/dist/render/block-helpers.js +83 -0
  447. package/dist/render/block-helpers.js.map +1 -0
  448. package/dist/render/blocks.d.ts +10 -35
  449. package/dist/render/blocks.d.ts.map +1 -1
  450. package/dist/render/blocks.js +144 -263
  451. package/dist/render/blocks.js.map +1 -1
  452. package/dist/render/chart-figure-encoded.d.ts +11 -0
  453. package/dist/render/chart-figure-encoded.d.ts.map +1 -0
  454. package/dist/render/chart-figure-encoded.js +81 -0
  455. package/dist/render/chart-figure-encoded.js.map +1 -0
  456. package/dist/render/chart-kinds-cartesian.d.ts +14 -0
  457. package/dist/render/chart-kinds-cartesian.d.ts.map +1 -0
  458. package/dist/render/chart-kinds-cartesian.js +122 -0
  459. package/dist/render/chart-kinds-cartesian.js.map +1 -0
  460. package/dist/render/chart-kinds-composite.d.ts +16 -0
  461. package/dist/render/chart-kinds-composite.d.ts.map +1 -0
  462. package/dist/render/chart-kinds-composite.js +144 -0
  463. package/dist/render/chart-kinds-composite.js.map +1 -0
  464. package/dist/render/chart-kinds-gauge-treemap.d.ts +8 -0
  465. package/dist/render/chart-kinds-gauge-treemap.d.ts.map +1 -0
  466. package/dist/render/chart-kinds-gauge-treemap.js +101 -0
  467. package/dist/render/chart-kinds-gauge-treemap.js.map +1 -0
  468. package/dist/render/chart-kinds-histogram-waterfall.d.ts +17 -0
  469. package/dist/render/chart-kinds-histogram-waterfall.d.ts.map +1 -0
  470. package/dist/render/chart-kinds-histogram-waterfall.js +172 -0
  471. package/dist/render/chart-kinds-histogram-waterfall.js.map +1 -0
  472. package/dist/render/chart-overlays.d.ts +18 -0
  473. package/dist/render/chart-overlays.d.ts.map +1 -0
  474. package/dist/render/chart-overlays.js +58 -0
  475. package/dist/render/chart-overlays.js.map +1 -0
  476. package/dist/render/chart-scales.d.ts +83 -0
  477. package/dist/render/chart-scales.d.ts.map +1 -0
  478. package/dist/render/chart-scales.js +166 -0
  479. package/dist/render/chart-scales.js.map +1 -0
  480. package/dist/render/chart-svg-parts.d.ts +50 -0
  481. package/dist/render/chart-svg-parts.d.ts.map +1 -0
  482. package/dist/render/chart-svg-parts.js +125 -0
  483. package/dist/render/chart-svg-parts.js.map +1 -0
  484. package/dist/render/chart-text.d.ts +18 -0
  485. package/dist/render/chart-text.d.ts.map +1 -0
  486. package/dist/render/chart-text.js +69 -0
  487. package/dist/render/chart-text.js.map +1 -0
  488. package/dist/render/chart-treemap-layout.d.ts +17 -0
  489. package/dist/render/chart-treemap-layout.d.ts.map +1 -0
  490. package/dist/render/chart-treemap-layout.js +74 -0
  491. package/dist/render/chart-treemap-layout.js.map +1 -0
  492. package/dist/render/chart-types.d.ts +107 -0
  493. package/dist/render/chart-types.d.ts.map +1 -0
  494. package/dist/render/chart-types.js +11 -0
  495. package/dist/render/chart-types.js.map +1 -0
  496. package/dist/render/charts.d.ts +33 -11
  497. package/dist/render/charts.d.ts.map +1 -1
  498. package/dist/render/charts.js +145 -109
  499. package/dist/render/charts.js.map +1 -1
  500. package/dist/render/derived-variables.d.ts +37 -0
  501. package/dist/render/derived-variables.d.ts.map +1 -0
  502. package/dist/render/derived-variables.js +40 -0
  503. package/dist/render/derived-variables.js.map +1 -0
  504. package/dist/render/diagram-fallback.d.ts +25 -0
  505. package/dist/render/diagram-fallback.d.ts.map +1 -0
  506. package/dist/render/diagram-fallback.js +86 -0
  507. package/dist/render/diagram-fallback.js.map +1 -0
  508. package/dist/render/document.d.ts +15 -0
  509. package/dist/render/document.d.ts.map +1 -1
  510. package/dist/render/document.js +53 -8
  511. package/dist/render/document.js.map +1 -1
  512. package/dist/render/effects-styles.d.ts +14 -0
  513. package/dist/render/effects-styles.d.ts.map +1 -0
  514. package/dist/render/effects-styles.js +39 -0
  515. package/dist/render/effects-styles.js.map +1 -0
  516. package/dist/render/embedded-fonts.generated.d.ts +22 -0
  517. package/dist/render/embedded-fonts.generated.d.ts.map +1 -0
  518. package/dist/render/embedded-fonts.generated.js +59 -0
  519. package/dist/render/embedded-fonts.generated.js.map +1 -0
  520. package/dist/render/escape.d.ts +10 -0
  521. package/dist/render/escape.d.ts.map +1 -1
  522. package/dist/render/escape.js +28 -0
  523. package/dist/render/escape.js.map +1 -1
  524. package/dist/render/feature-styles.d.ts +14 -0
  525. package/dist/render/feature-styles.d.ts.map +1 -0
  526. package/dist/render/feature-styles.js +123 -0
  527. package/dist/render/feature-styles.js.map +1 -0
  528. package/dist/render/font-faces.d.ts +22 -0
  529. package/dist/render/font-faces.d.ts.map +1 -0
  530. package/dist/render/font-faces.js +60 -0
  531. package/dist/render/font-faces.js.map +1 -0
  532. package/dist/render/outline.d.ts +21 -0
  533. package/dist/render/outline.d.ts.map +1 -0
  534. package/dist/render/outline.js +47 -0
  535. package/dist/render/outline.js.map +1 -0
  536. package/dist/render/recipe-styles.d.ts +26 -0
  537. package/dist/render/recipe-styles.d.ts.map +1 -0
  538. package/dist/render/recipe-styles.js +218 -0
  539. package/dist/render/recipe-styles.js.map +1 -0
  540. package/dist/render/render-context.d.ts +40 -0
  541. package/dist/render/render-context.d.ts.map +1 -0
  542. package/dist/render/render-context.js +16 -0
  543. package/dist/render/render-context.js.map +1 -0
  544. package/dist/render/render.d.ts +7 -0
  545. package/dist/render/render.d.ts.map +1 -1
  546. package/dist/render/render.js +108 -41
  547. package/dist/render/render.js.map +1 -1
  548. package/dist/render/runtime.d.ts +4 -1
  549. package/dist/render/runtime.d.ts.map +1 -1
  550. package/dist/render/runtime.js +275 -128
  551. package/dist/render/runtime.js.map +1 -1
  552. package/dist/render/showcase-blocks.d.ts +52 -0
  553. package/dist/render/showcase-blocks.d.ts.map +1 -0
  554. package/dist/render/showcase-blocks.js +329 -0
  555. package/dist/render/showcase-blocks.js.map +1 -0
  556. package/dist/render/showcase-styles.d.ts +15 -0
  557. package/dist/render/showcase-styles.d.ts.map +1 -0
  558. package/dist/render/showcase-styles.js +201 -0
  559. package/dist/render/showcase-styles.js.map +1 -0
  560. package/dist/render/signature-styles.d.ts +18 -0
  561. package/dist/render/signature-styles.d.ts.map +1 -0
  562. package/dist/render/signature-styles.js +41 -0
  563. package/dist/render/signature-styles.js.map +1 -0
  564. package/dist/render/style-units.d.ts +17 -0
  565. package/dist/render/style-units.d.ts.map +1 -0
  566. package/dist/render/style-units.js +24 -0
  567. package/dist/render/style-units.js.map +1 -0
  568. package/dist/render/styles.d.ts +18 -9
  569. package/dist/render/styles.d.ts.map +1 -1
  570. package/dist/render/styles.js +228 -129
  571. package/dist/render/styles.js.map +1 -1
  572. package/dist/render/surface-styles.d.ts +24 -0
  573. package/dist/render/surface-styles.d.ts.map +1 -0
  574. package/dist/render/surface-styles.js +41 -0
  575. package/dist/render/surface-styles.js.map +1 -0
  576. package/dist/render/tone.d.ts +14 -0
  577. package/dist/render/tone.d.ts.map +1 -0
  578. package/dist/render/tone.js +40 -0
  579. package/dist/render/tone.js.map +1 -0
  580. package/dist/render/verify.d.ts +3 -0
  581. package/dist/render/verify.d.ts.map +1 -1
  582. package/dist/render/verify.js +45 -2
  583. package/dist/render/verify.js.map +1 -1
  584. package/dist/spec/asset-references.d.ts +35 -0
  585. package/dist/spec/asset-references.d.ts.map +1 -0
  586. package/dist/spec/asset-references.js +93 -0
  587. package/dist/spec/asset-references.js.map +1 -0
  588. package/dist/spec/bounds.d.ts +6 -0
  589. package/dist/spec/bounds.d.ts.map +1 -1
  590. package/dist/spec/bounds.js +7 -0
  591. package/dist/spec/bounds.js.map +1 -1
  592. package/dist/spec/conditions.d.ts +43 -0
  593. package/dist/spec/conditions.d.ts.map +1 -0
  594. package/dist/spec/conditions.js +179 -0
  595. package/dist/spec/conditions.js.map +1 -0
  596. package/dist/spec/network-policy.d.ts +33 -0
  597. package/dist/spec/network-policy.d.ts.map +1 -0
  598. package/dist/spec/network-policy.js +57 -0
  599. package/dist/spec/network-policy.js.map +1 -0
  600. package/dist/spec/normalize.d.ts +7 -2
  601. package/dist/spec/normalize.d.ts.map +1 -1
  602. package/dist/spec/normalize.js +219 -41
  603. package/dist/spec/normalize.js.map +1 -1
  604. package/dist/theme/dialect-presets.d.ts +12 -0
  605. package/dist/theme/dialect-presets.d.ts.map +1 -0
  606. package/dist/theme/dialect-presets.js +214 -0
  607. package/dist/theme/dialect-presets.js.map +1 -0
  608. package/dist/theme/load-theme.d.ts +11 -3
  609. package/dist/theme/load-theme.d.ts.map +1 -1
  610. package/dist/theme/load-theme.js +71 -12
  611. package/dist/theme/load-theme.js.map +1 -1
  612. package/dist/theme/preset-builder.d.ts +36 -0
  613. package/dist/theme/preset-builder.d.ts.map +1 -0
  614. package/dist/theme/preset-builder.js +51 -0
  615. package/dist/theme/preset-builder.js.map +1 -0
  616. package/dist/theme/presets.d.ts +8 -10
  617. package/dist/theme/presets.d.ts.map +1 -1
  618. package/dist/theme/presets.js +40 -56
  619. package/dist/theme/presets.js.map +1 -1
  620. package/dist/theme/recipes.d.ts +38 -0
  621. package/dist/theme/recipes.d.ts.map +1 -0
  622. package/dist/theme/recipes.js +96 -0
  623. package/dist/theme/recipes.js.map +1 -0
  624. package/dist/theme/theme-catalog.d.ts.map +1 -1
  625. package/dist/theme/theme-catalog.js +16 -0
  626. package/dist/theme/theme-catalog.js.map +1 -1
  627. package/dist/theme/tokens.d.ts.map +1 -1
  628. package/dist/theme/tokens.js +4 -4
  629. package/dist/theme/tokens.js.map +1 -1
  630. package/dist/version.d.ts +1 -1
  631. package/dist/version.d.ts.map +1 -1
  632. package/dist/version.js +1 -1
  633. package/dist/version.js.map +1 -1
  634. package/llms.txt +29 -0
  635. package/package.json +13 -3
@@ -12,82 +12,49 @@
12
12
  * cannot drift apart.
13
13
  */
14
14
  import { EMBED_PROVIDER_NAMES } from '../spec/providers.js';
15
- const DEFAULT_MIGRATION = 'Props are additive; removed props are reported as diagnostics, never silently dropped.';
16
- const DEFAULT_SERIALIZER = 'Serializes back to the same Page Spec shape; child blocks keep their order and slots.';
17
- const DEFAULT_SIZING = {
18
- sizes: ['medium', 'large'],
19
- default: 'medium',
20
- responsive: 'Fills its parent slot and reflows its content; never clips or scales by transform.',
21
- };
22
- const str = (o = {}) => ({
23
- kind: 'string',
24
- ...o,
25
- });
26
- const txt = (o = {}) => ({
27
- kind: 'text',
28
- ...o,
29
- });
30
- const num = (o = {}) => ({ kind: 'number', ...o });
31
- const urlProp = (o = {}) => ({
32
- kind: 'url',
33
- ...o,
34
- });
35
- const list = (of, o = {}) => ({ kind: 'list', of, ...o });
36
- const obj = (fields, o = {}) => ({ kind: 'object', fields, ...o });
37
- const oneOf = (options, o = {}) => ({ kind: 'oneOf', options, ...o });
38
- const enumStr = (values, o = {}) => ({
39
- kind: 'string',
40
- enum: values,
41
- ...o,
42
- });
43
- const idProp = (description) => ({ kind: 'string', id: true, description });
44
- const actionMap = (description) => ({
45
- kind: 'json',
46
- description,
47
- maxBytes: 8_000,
48
- schemaRef: '#/$defs/actionMap',
49
- });
50
- /** Reusable prop fragments. */
51
- const onProp = (description = 'Declarative action bindings for this block.') => actionMap(description);
52
- const anchorProps = {
53
- id: idProp('Stable node id. Author-provided ids are used verbatim and must be unique.'),
54
- };
55
- const itemsOf = (fields, o = {}) => list(obj(fields), { required: true, minItems: o.minItems ?? 1, maxItems: o.maxItems ?? 200 });
56
- const TITLE = str({ required: true, maxLength: 200 });
57
- const OPTIONAL_TITLE = str({ maxLength: 200 });
58
- const LABEL = str({ required: true, maxLength: 200 });
59
- /** Chart kinds, SVG-first and deterministic. */
60
- export const CHART_KINDS = [
61
- 'bar',
62
- 'line',
63
- 'area',
64
- 'pie',
65
- 'donut',
66
- 'sparkline',
67
- 'progress',
15
+ import { anchorProps, bool, define, enumStr, idProp, itemsOf, LABEL, list, num, OPTIONAL_TITLE, obj, oneOf, onProp, semantic, str, TITLE, txt, urlProp, VERBATIM_DESCRIPTION, } from './define-helpers.js';
16
+ export { CHART_KINDS } from '../blocks/chart/chart-kinds.js';
17
+ export * from './define-helpers.js';
18
+ /**
19
+ * Features the core compiler emits. Block groups may add their own features
20
+ * (see `FeatureModule`); the registry rejects any name outside both lists.
21
+ */
22
+ export const CORE_RUNTIME_FEATURES = [
23
+ 'tabs',
24
+ 'accordion',
25
+ 'carousel',
26
+ 'slider',
27
+ 'copy',
28
+ 'filter',
29
+ 'theme',
30
+ 'dialog',
31
+ 'chart',
32
+ 'diagram',
33
+ 'media',
34
+ 'outline',
35
+ 'bento',
36
+ 'marquee',
37
+ 'terminal',
38
+ 'tree',
39
+ 'before-after',
40
+ 'kpi',
41
+ 'showcase',
42
+ 'cta',
43
+ 'frame',
44
+ 'checklist',
45
+ 'state',
68
46
  ];
69
- function define(specification) {
70
- return {
71
- version: 1,
72
- kind: 'primitive',
73
- sizing: DEFAULT_SIZING,
74
- a11y: 'Renders semantic markup; text alternatives come from the authored content.',
75
- actions: [],
76
- runtimeFeatures: [],
77
- assets: [],
78
- network: 'none',
79
- migration: DEFAULT_MIGRATION,
80
- serializer: DEFAULT_SERIALIZER,
81
- ...specification,
82
- };
83
- }
84
- function semantic(specification) {
85
- return define({ kind: 'semantic', ...specification });
86
- }
87
- export const BLOCK_DEFINITIONS = [
47
+ /**
48
+ * Core blocks: the roster entries that have not moved into a block module
49
+ * under `src/blocks/`. The registry appends every module's definition.
50
+ */
51
+ export const CORE_BLOCK_DEFINITIONS = [
88
52
  // --- root ---------------------------------------------------------------
89
53
  define({
90
54
  type: 'page',
55
+ category: 'layout',
56
+ tags: ['root', 'document'],
57
+ useCases: ['page shell'],
91
58
  kind: 'semantic',
92
59
  purpose: 'The document root. Synthesized by the normalizer from the spec envelope.',
93
60
  summary: 'Page root: title, description, locale, and top-level blocks.',
@@ -102,40 +69,26 @@ export const BLOCK_DEFINITIONS = [
102
69
  // --- layout primitives --------------------------------------------------
103
70
  define({
104
71
  type: 'section',
72
+ category: 'layout',
73
+ tags: ['container', 'heading', 'band'],
74
+ useCases: ['group related blocks', 'dark feature band'],
105
75
  purpose: 'A titled group of blocks.',
106
- summary: 'Section with an optional heading wrapping child blocks.',
107
- props: { title: OPTIONAL_TITLE, ...anchorProps },
108
- slots: { children: { accepts: '*', min: 1, max: 200 } },
109
- }),
110
- define({
111
- type: 'stack',
112
- purpose: 'Vertical flow container.',
113
- summary: 'Stack: children flow vertically with a controlled gap.',
114
- props: { gap: enumStr(['tight', 'normal', 'loose'], { default: 'normal' }), ...anchorProps },
115
- slots: { children: { accepts: '*', min: 1, max: 200 } },
116
- }),
117
- define({
118
- type: 'grid',
119
- purpose: 'Responsive grid container.',
120
- summary: 'Grid: children in N columns that collapse on narrow viewports.',
76
+ summary: 'Section with an optional heading wrapping child blocks; an inverse surface sets it on a night band.',
121
77
  props: {
122
- columns: num({ integer: true, min: 1, max: 6, default: 3 }),
78
+ title: OPTIONAL_TITLE,
79
+ surface: enumStr(['plain', 'inverse'], {
80
+ default: 'plain',
81
+ description: 'inverse renders the section on a dark band using the theme dark palette, in both schemes.',
82
+ }),
123
83
  ...anchorProps,
124
84
  },
125
85
  slots: { children: { accepts: '*', min: 1, max: 200 } },
126
86
  }),
127
- define({
128
- type: 'split',
129
- purpose: 'Two-column split container.',
130
- summary: 'Split: two child groups side by side, stacking when narrow.',
131
- props: {
132
- ratio: enumStr(['even', 'wide-left', 'wide-right'], { default: 'even' }),
133
- ...anchorProps,
134
- },
135
- slots: { children: { accepts: '*', min: 2, max: 2 } },
136
- }),
137
87
  define({
138
88
  type: 'spacer',
89
+ category: 'layout',
90
+ tags: ['spacing'],
91
+ useCases: ['vertical breathing room'],
139
92
  purpose: 'Vertical rhythm spacer.',
140
93
  summary: 'Spacer: vertical space without content.',
141
94
  props: { size: enumStr(['small', 'medium', 'large'], { default: 'medium' }), ...anchorProps },
@@ -143,6 +96,9 @@ export const BLOCK_DEFINITIONS = [
143
96
  }),
144
97
  define({
145
98
  type: 'divider',
99
+ category: 'layout',
100
+ tags: ['rule', 'separator'],
101
+ useCases: ['separate sections'],
146
102
  purpose: 'Horizontal rule with an optional label.',
147
103
  summary: 'Divider: semantic separator with an optional label.',
148
104
  props: { label: str({ maxLength: 120 }), ...anchorProps },
@@ -151,6 +107,9 @@ export const BLOCK_DEFINITIONS = [
151
107
  // --- typography and content --------------------------------------------
152
108
  define({
153
109
  type: 'heading',
110
+ category: 'content',
111
+ tags: ['title', 'outline'],
112
+ useCases: ['section title'],
154
113
  purpose: 'Section heading at a chosen level.',
155
114
  summary: 'Heading: h1–h6 with the author-chosen level.',
156
115
  props: {
@@ -162,6 +121,9 @@ export const BLOCK_DEFINITIONS = [
162
121
  }),
163
122
  define({
164
123
  type: 'text',
124
+ category: 'content',
125
+ tags: ['prose', 'paragraph'],
126
+ useCases: ['body copy'],
165
127
  purpose: 'A paragraph, lead sentence, or caption.',
166
128
  summary: 'Text: single paragraph with body, lead, or caption treatment.',
167
129
  props: {
@@ -172,32 +134,45 @@ export const BLOCK_DEFINITIONS = [
172
134
  }),
173
135
  define({
174
136
  type: 'rich-text',
137
+ category: 'content',
138
+ tags: ['prose', 'inline-marks'],
139
+ useCases: ['formatted paragraphs'],
175
140
  purpose: 'Multi-paragraph prose.',
176
141
  summary: 'RichText: multiple paragraphs from line breaks.',
177
142
  props: { text: txt({ required: true }), ...anchorProps },
178
143
  }),
179
144
  define({
180
145
  type: 'quote',
146
+ category: 'content',
147
+ tags: ['testimonial', 'citation'],
148
+ useCases: ['customer quote', 'pull quote'],
181
149
  purpose: 'Pulled quotation.',
182
150
  summary: 'Quote: blockquote with an optional attribution.',
183
151
  props: { text: txt({ required: true }), cite: str({ maxLength: 200 }), ...anchorProps },
184
152
  }),
185
153
  define({
186
154
  type: 'code',
155
+ category: 'content',
156
+ tags: ['source', 'snippet', 'copy'],
157
+ useCases: ['code sample', 'command to copy'],
187
158
  purpose: 'Code or configuration sample.',
188
159
  summary: 'Code: preformatted block with optional language and copy target.',
189
160
  props: {
190
161
  language: str({ maxLength: 32, default: 'text' }),
191
162
  title: OPTIONAL_TITLE,
192
- text: txt({ required: true, maxLength: 100_000 }),
163
+ text: txt({ required: true, maxLength: 100_000, description: VERBATIM_DESCRIPTION }),
193
164
  ...anchorProps,
194
165
  },
195
166
  assets: ['code'],
196
- a11y: 'Renders <pre><code> with the authored text; no syntax highlighting requires network access.',
167
+ runtimeFeatures: ['copy'],
168
+ a11y: 'Renders <pre><code> with the authored text and a labelled Copy button; no syntax highlighting requires network access.',
197
169
  serializer: 'Emits the code text verbatim inside the fenced block when serialized back to Markdown.',
198
170
  }),
199
171
  define({
200
172
  type: 'badge',
173
+ category: 'content',
174
+ tags: ['label', 'status'],
175
+ useCases: ['status label'],
201
176
  purpose: 'Short status or category label.',
202
177
  summary: 'Badge: inline status chip.',
203
178
  props: {
@@ -208,6 +183,9 @@ export const BLOCK_DEFINITIONS = [
208
183
  }),
209
184
  define({
210
185
  type: 'kbd',
186
+ category: 'content',
187
+ tags: ['keyboard', 'shortcut'],
188
+ useCases: ['keyboard shortcut'],
211
189
  purpose: 'Keyboard key sequence.',
212
190
  summary: 'Kbd: one or more keys rendered as <kbd> elements.',
213
191
  props: {
@@ -218,6 +196,9 @@ export const BLOCK_DEFINITIONS = [
218
196
  }),
219
197
  define({
220
198
  type: 'key-value',
199
+ category: 'content',
200
+ tags: ['metadata', 'pairs'],
201
+ useCases: ['spec sheet', 'document metadata'],
221
202
  purpose: 'Compact definition list.',
222
203
  summary: 'KeyValue: label/value pairs rendered as a description list.',
223
204
  props: {
@@ -230,6 +211,9 @@ export const BLOCK_DEFINITIONS = [
230
211
  // --- information --------------------------------------------------------
231
212
  define({
232
213
  type: 'card',
214
+ category: 'layout',
215
+ tags: ['surface', 'container'],
216
+ useCases: ['boxed summary', 'feature card'],
233
217
  purpose: 'Bounded content container.',
234
218
  summary: 'Card: titled container that holds child blocks.',
235
219
  props: { title: OPTIONAL_TITLE, text: txt(), ...anchorProps },
@@ -237,6 +221,9 @@ export const BLOCK_DEFINITIONS = [
237
221
  }),
238
222
  define({
239
223
  type: 'alert',
224
+ category: 'content',
225
+ tags: ['notice', 'status'],
226
+ useCases: ['warning banner', 'status notice'],
240
227
  purpose: 'Inline notice.',
241
228
  summary: 'Alert: notice with tone and title.',
242
229
  props: {
@@ -249,6 +236,9 @@ export const BLOCK_DEFINITIONS = [
249
236
  }),
250
237
  semantic({
251
238
  type: 'callout',
239
+ category: 'content',
240
+ tags: ['note', 'aside'],
241
+ useCases: ['tip or note', 'highlighted aside'],
252
242
  purpose: 'Emphasized aside for a key point or risk.',
253
243
  summary: 'Callout: highlighted aside with tone, title, and body.',
254
244
  props: {
@@ -260,23 +250,40 @@ export const BLOCK_DEFINITIONS = [
260
250
  }),
261
251
  semantic({
262
252
  type: 'hero',
253
+ category: 'content',
254
+ tags: ['landing', 'headline', 'intro'],
255
+ useCases: ['landing page header', 'report title'],
263
256
  purpose: 'Page opener that states the artifact subject.',
264
- summary: 'Hero: eyebrow, title, and one-line description.',
257
+ summary: 'Hero: eyebrow, title, and one-line description, optionally over a framed product shot.',
265
258
  props: {
266
259
  eyebrow: str({ maxLength: 80 }),
267
260
  title: TITLE,
268
261
  description: txt(),
262
+ align: enumStr(['start', 'center'], { default: 'start' }),
263
+ src: urlProp({
264
+ asset: 'images',
265
+ description: 'Optional product shot shown in a browser frame below the copy.',
266
+ }),
267
+ alt: str({ maxLength: 300, description: 'Required when src is set.' }),
268
+ address: str({
269
+ maxLength: 120,
270
+ description: 'Text shown in the frame address bar; not a link.',
271
+ }),
269
272
  ...anchorProps,
270
273
  },
274
+ network: 'optional',
271
275
  sizing: {
272
276
  sizes: ['medium', 'large'],
273
277
  default: 'large',
274
- responsive: 'Full width; text reflows.',
278
+ responsive: 'Full width; text reflows and the product shot scales to the column without cropping.',
275
279
  },
276
- a11y: 'The hero title is an <h1>; the eyebrow is supporting text, not a heading.',
280
+ a11y: 'The hero title is an <h1>; the eyebrow is supporting text, not a heading. The shot keeps its alt text and its frame is decorative.',
277
281
  }),
278
282
  semantic({
279
283
  type: 'stats',
284
+ category: 'data',
285
+ tags: ['numbers', 'summary'],
286
+ useCases: ['headline numbers', 'report summary'],
280
287
  purpose: 'KPI or summary figures.',
281
288
  summary: 'Stats: labeled values as a figure list.',
282
289
  props: {
@@ -288,6 +295,9 @@ export const BLOCK_DEFINITIONS = [
288
295
  }),
289
296
  define({
290
297
  type: 'progress',
298
+ category: 'data',
299
+ tags: ['completion', 'bars'],
300
+ useCases: ['completion status', 'goal tracking'],
291
301
  purpose: 'Single progress or completeness value.',
292
302
  summary: 'Progress: single bar with an accessible value range.',
293
303
  props: {
@@ -301,6 +311,9 @@ export const BLOCK_DEFINITIONS = [
301
311
  }),
302
312
  semantic({
303
313
  type: 'steps',
314
+ category: 'content',
315
+ tags: ['process', 'ordered'],
316
+ useCases: ['how-to steps', 'onboarding flow'],
304
317
  purpose: 'Ordered procedure.',
305
318
  summary: 'Steps: numbered sequence of titled steps.',
306
319
  props: {
@@ -313,6 +326,9 @@ export const BLOCK_DEFINITIONS = [
313
326
  }),
314
327
  semantic({
315
328
  type: 'timeline',
329
+ category: 'content',
330
+ tags: ['chronology', 'history'],
331
+ useCases: ['release history', 'project milestones'],
316
332
  purpose: 'Chronological or staged events.',
317
333
  summary: 'Timeline: ordered entries with a when/title/body shape.',
318
334
  props: {
@@ -325,6 +341,9 @@ export const BLOCK_DEFINITIONS = [
325
341
  // --- collections --------------------------------------------------------
326
342
  define({
327
343
  type: 'list',
344
+ category: 'content',
345
+ tags: ['bullets', 'items'],
346
+ useCases: ['bullet list', 'checklist of points'],
328
347
  purpose: 'Short item list with optional badges.',
329
348
  summary: 'List: bulleted items with optional status badges.',
330
349
  props: {
@@ -338,6 +357,9 @@ export const BLOCK_DEFINITIONS = [
338
357
  }),
339
358
  semantic({
340
359
  type: 'card-grid',
360
+ category: 'content',
361
+ tags: ['cards', 'overview'],
362
+ useCases: ['feature overview', 'link directory'],
341
363
  purpose: 'Grid of short cards.',
342
364
  summary: 'CardGrid: titled cards in a responsive grid.',
343
365
  props: {
@@ -348,6 +370,9 @@ export const BLOCK_DEFINITIONS = [
348
370
  }),
349
371
  define({
350
372
  type: 'table',
373
+ category: 'data',
374
+ tags: ['tabular', 'rows', 'columns'],
375
+ useCases: ['tabular data', 'comparison rows'],
351
376
  purpose: 'Tabular data with a header row.',
352
377
  summary: 'Table: columns and rows with a real header row.',
353
378
  props: {
@@ -361,6 +386,9 @@ export const BLOCK_DEFINITIONS = [
361
386
  }),
362
387
  semantic({
363
388
  type: 'comparison',
389
+ category: 'data',
390
+ tags: ['versus', 'options'],
391
+ useCases: ['compare options', 'plan comparison'],
364
392
  purpose: 'Side-by-side comparison of two alternatives.',
365
393
  summary: 'Comparison: two labeled columns of points.',
366
394
  props: {
@@ -373,6 +401,9 @@ export const BLOCK_DEFINITIONS = [
373
401
  }),
374
402
  semantic({
375
403
  type: 'risk-matrix',
404
+ category: 'data',
405
+ tags: ['risk', 'impact', 'likelihood'],
406
+ useCases: ['risk register', 'threat assessment'],
376
407
  purpose: 'Impact/likelihood risk table.',
377
408
  summary: 'RiskMatrix: risks rated by impact and likelihood.',
378
409
  props: {
@@ -389,50 +420,11 @@ export const BLOCK_DEFINITIONS = [
389
420
  a11y: 'Ratings are text values in table cells, never colour-only.',
390
421
  }),
391
422
  // --- interactive collections -------------------------------------------
392
- define({
393
- type: 'tabs',
394
- purpose: 'Tabbed groups of related content.',
395
- summary: 'Tabs: roving-tabindex tablist with tabpanels.',
396
- props: {
397
- title: OPTIONAL_TITLE,
398
- items: itemsOf({ id: idProp('Tab id.'), title: LABEL, text: txt({ required: true }) }, { minItems: 2 }),
399
- on: onProp('Optional state binding fired when a tab is selected.'),
400
- ...anchorProps,
401
- },
402
- runtimeFeatures: ['tabs'],
403
- actions: ['select-tab'],
404
- a11y: 'role="tablist" with arrow-key roving focus, aria-selected, aria-controls, and labelled tabpanels.',
405
- }),
406
- define({
407
- type: 'accordion',
408
- purpose: 'Collapsible sections.',
409
- summary: 'Accordion: disclosure sections that expand and collapse.',
410
- props: {
411
- title: OPTIONAL_TITLE,
412
- items: itemsOf({ title: LABEL, text: txt({ required: true }) }),
413
- on: onProp('Optional state binding fired when a section toggles.'),
414
- ...anchorProps,
415
- },
416
- runtimeFeatures: ['accordion'],
417
- actions: ['toggle', 'expand', 'collapse'],
418
- a11y: 'Native <details>/<summary> where possible; otherwise button + region with aria-expanded.',
419
- }),
420
- define({
421
- type: 'carousel',
422
- purpose: 'Sequenced slides with manual navigation.',
423
- summary: 'Carousel: prev/next, keyboard, and swipe across slides.',
424
- props: {
425
- ariaLabel: str({ required: true, maxLength: 120 }),
426
- items: itemsOf({ title: LABEL, text: txt({ required: true }) }, { minItems: 1 }),
427
- on: onProp('Optional state binding fired when the active slide changes.'),
428
- ...anchorProps,
429
- },
430
- runtimeFeatures: ['carousel'],
431
- actions: ['next', 'previous'],
432
- a11y: 'Labeled region with prev/next buttons, arrow-key support, a slide counter, and no autoplay.',
433
- }),
434
423
  semantic({
435
424
  type: 'toolbar',
425
+ category: 'interaction',
426
+ tags: ['controls', 'actions'],
427
+ useCases: ['page actions', 'quick links'],
436
428
  purpose: 'Row of controls or chips.',
437
429
  summary: 'Toolbar: buttons, badges, and links in one accessible row.',
438
430
  props: {
@@ -466,26 +458,12 @@ export const BLOCK_DEFINITIONS = [
466
458
  a11y: 'role="toolbar" with roving focus order; every control is a real button or link.',
467
459
  }),
468
460
  // --- data visualization -------------------------------------------------
469
- define({
470
- type: 'chart',
471
- purpose: 'Deterministic SVG chart with a text summary.',
472
- summary: 'Chart: bar, line, area, pie, donut, sparkline, or progress from labeled series.',
473
- props: {
474
- kind: enumStr(CHART_KINDS, { required: true }),
475
- title: OPTIONAL_TITLE,
476
- description: txt(),
477
- labels: list(str({ maxLength: 80 }), { required: true, minItems: 1, maxItems: 200 }),
478
- series: itemsOf({ label: LABEL, values: list(num(), { required: true, minItems: 1, maxItems: 200 }) }, { minItems: 1 }),
479
- ...anchorProps,
480
- },
481
- runtimeFeatures: ['chart'],
482
- assets: ['chart'],
483
- a11y: 'SVG carries role="img" plus a generated text summary; the same values are available as a table for assistive technology.',
484
- serializer: 'Serializes to the labels/series data, never to rendered SVG.',
485
- }),
486
461
  // --- diagrams (adapter) -------------------------------------------------
487
462
  semantic({
488
463
  type: 'diagram-panel',
464
+ category: 'engineering',
465
+ tags: ['diagram', 'architecture'],
466
+ useCases: ['architecture diagram', 'flow chart'],
489
467
  purpose: 'Typed diagram rendered through an adapter.',
490
468
  summary: 'DiagramPanel: embeds trusted output from a diagram adapter (ak:diagram when installed).',
491
469
  props: {
@@ -506,47 +484,222 @@ export const BLOCK_DEFINITIONS = [
506
484
  a11y: 'Requires a textual fallback summary when the adapter cannot render; the fallback is always emitted.',
507
485
  migration: 'Adapter contract is versioned separately; a spec that no longer compiles degrades to the fallback.',
508
486
  }),
509
- // --- media --------------------------------------------------------------
487
+ // --- showcase -----------------------------------------------------------
510
488
  define({
511
- type: 'image',
512
- purpose: 'Single image or picture.',
513
- summary: 'Image: local asset or allowlisted URL with required alt text.',
489
+ type: 'marquee',
490
+ category: 'showcase',
491
+ tags: ['ticker', 'logos'],
492
+ useCases: ['customer logos', 'highlight ticker'],
493
+ purpose: 'Continuously scrolling strip of short highlights.',
494
+ summary: 'Marquee: looping ticker of short items that pauses on hover and stops under reduced motion.',
514
495
  props: {
515
- src: urlProp({ required: true }),
516
- alt: str({ required: true, maxLength: 300 }),
496
+ label: str({ maxLength: 120, default: 'Highlights' }),
497
+ items: list(str({ required: true, maxLength: 80 }), {
498
+ required: true,
499
+ minItems: 1,
500
+ maxItems: 30,
501
+ }),
502
+ speed: enumStr(['slow', 'normal', 'fast'], { default: 'normal' }),
503
+ ...anchorProps,
504
+ },
505
+ runtimeFeatures: ['marquee'],
506
+ a11y: 'Screen readers get one static list; the duplicated scrolling track is aria-hidden, and motion stops under prefers-reduced-motion.',
507
+ }),
508
+ define({
509
+ type: 'terminal',
510
+ category: 'engineering',
511
+ tags: ['shell', 'commands', 'output'],
512
+ useCases: ['install steps', 'cli session'],
513
+ purpose: 'A command-line session: commands with their output.',
514
+ summary: 'Terminal: window-framed session that types in on load; commands, output and errors are styled apart.',
515
+ props: {
516
+ title: str({ maxLength: 120, default: 'Terminal' }),
517
+ lines: itemsOf({
518
+ kind: enumStr(['command', 'output', 'comment', 'success', 'error'], {
519
+ default: 'output',
520
+ }),
521
+ text: txt({ required: true, maxLength: 2_000, description: VERBATIM_DESCRIPTION }),
522
+ }, { minItems: 1, maxItems: 60 }),
523
+ ...anchorProps,
524
+ },
525
+ runtimeFeatures: ['terminal', 'copy'],
526
+ a11y: 'Renders <pre> text; the prompt glyph is decorative, and the line reveal is skipped under reduced motion.',
527
+ }),
528
+ semantic({
529
+ type: 'file-tree',
530
+ category: 'engineering',
531
+ tags: ['files', 'paths', 'repository'],
532
+ useCases: ['project layout', 'changed files'],
533
+ purpose: 'Files and folders, optionally with change status, derived from flat paths.',
534
+ summary: 'File tree: nested folders built from slash-separated paths, with per-file status and notes.',
535
+ props: {
536
+ title: OPTIONAL_TITLE,
537
+ items: itemsOf({
538
+ path: str({ required: true, maxLength: 300 }),
539
+ status: enumStr(['added', 'modified', 'deleted', 'renamed', 'unchanged'], {
540
+ default: 'unchanged',
541
+ }),
542
+ note: str({ maxLength: 200 }),
543
+ }, { minItems: 1, maxItems: 200 }),
544
+ ...anchorProps,
545
+ },
546
+ runtimeFeatures: ['tree'],
547
+ a11y: 'Nested lists mirror the folder structure; status is written as text, not only color.',
548
+ }),
549
+ semantic({
550
+ type: 'before-after',
551
+ category: 'media',
552
+ tags: ['comparison', 'slider', 'images'],
553
+ useCases: ['redesign comparison', 'visual diff'],
554
+ purpose: 'Before and after: two images of the same frame, revealed by a draggable divider.',
555
+ summary: 'Compare: before/after image slider driven by a native range input; without script both images stay visible.',
556
+ props: {
557
+ title: OPTIONAL_TITLE,
558
+ before: obj({
559
+ src: urlProp({ required: true, asset: 'images' }),
560
+ alt: str({ required: true, maxLength: 300 }),
561
+ label: str({ maxLength: 40, default: 'Before' }),
562
+ }, { required: true }),
563
+ after: obj({
564
+ src: urlProp({ required: true, asset: 'images' }),
565
+ alt: str({ required: true, maxLength: 300 }),
566
+ label: str({ maxLength: 40, default: 'After' }),
567
+ }, { required: true }),
568
+ start: num({ min: 0, max: 100, default: 50 }),
517
569
  caption: txt(),
518
570
  ...anchorProps,
519
571
  },
572
+ runtimeFeatures: ['before-after'],
520
573
  network: 'optional',
521
- assets: ['media'],
522
- a11y: 'Alt text is required; decorative images must use an empty alt explicitly.',
574
+ a11y: 'The divider is a labelled <input type="range">: keyboard, pointer, and touch all move it, and both images keep their alt text.',
523
575
  }),
524
576
  semantic({
525
- type: 'gallery',
526
- purpose: 'Image grid.',
527
- summary: 'Gallery: responsive image grid with captions.',
577
+ type: 'kpi',
578
+ category: 'data',
579
+ tags: ['metrics', 'sparkline', 'trend'],
580
+ useCases: ['dashboard metrics', 'performance summary'],
581
+ purpose: 'Headline metrics with direction of change and a small trend line.',
582
+ summary: 'KPI: metric cards with value, signed delta, good/bad direction, and an optional sparkline series.',
528
583
  props: {
529
584
  title: OPTIONAL_TITLE,
530
- columns: num({ integer: true, min: 1, max: 6, default: 3 }),
531
585
  items: itemsOf({
532
- src: urlProp({ required: true }),
533
- alt: str({ required: true, maxLength: 300 }),
534
- caption: txt(),
586
+ label: LABEL,
587
+ value: str({ required: true, maxLength: 40 }),
588
+ delta: str({ maxLength: 24 }),
589
+ trend: enumStr(['up', 'down', 'flat'], { default: 'flat' }),
590
+ good: enumStr(['up', 'down'], {
591
+ default: 'up',
592
+ description: 'Which direction counts as an improvement for this metric.',
593
+ }),
594
+ series: list(num({ required: true, min: -1e12, max: 1e12 }), { maxItems: 60 }),
595
+ caption: str({ maxLength: 120 }),
596
+ }, { minItems: 1, maxItems: 8 }),
597
+ ...anchorProps,
598
+ },
599
+ runtimeFeatures: ['kpi'],
600
+ a11y: 'Value, delta, and direction are text; the sparkline is decorative and aria-hidden.',
601
+ }),
602
+ semantic({
603
+ type: 'showcase',
604
+ category: 'showcase',
605
+ tags: ['spotlight', 'screenshot'],
606
+ useCases: ['feature spotlight', 'product tour'],
607
+ purpose: 'Feature spotlight: copy beside a framed screenshot.',
608
+ summary: 'Showcase: eyebrow, title, text, and bullets beside an image in a browser frame; the image side can flip.',
609
+ props: {
610
+ eyebrow: str({ maxLength: 60 }),
611
+ title: TITLE,
612
+ text: txt(),
613
+ bullets: list(str({ required: true, maxLength: 200 }), { maxItems: 8 }),
614
+ src: urlProp({ required: true, asset: 'images' }),
615
+ alt: str({ required: true, maxLength: 300 }),
616
+ frame: enumStr(['browser', 'plain'], { default: 'browser' }),
617
+ address: str({
618
+ maxLength: 120,
619
+ description: 'Text shown in the browser frame address bar; not a link.',
535
620
  }),
621
+ align: enumStr(['media-right', 'media-left'], { default: 'media-right' }),
622
+ ...anchorProps,
623
+ },
624
+ runtimeFeatures: ['showcase'],
625
+ network: 'optional',
626
+ sizing: {
627
+ sizes: ['large'],
628
+ default: 'large',
629
+ responsive: 'Copy and media sit side by side on wide screens and stack, media last, on narrow ones.',
630
+ },
631
+ a11y: 'The title is a heading; the frame chrome is decorative and the image keeps its alt text.',
632
+ }),
633
+ define({
634
+ type: 'checklist',
635
+ category: 'data',
636
+ tags: ['tasks', 'status'],
637
+ useCases: ['launch checklist', 'review checklist'],
638
+ purpose: 'Task list with done and open items and a completion count.',
639
+ summary: 'Checklist: items marked done or open, with a visible completion count.',
640
+ props: {
641
+ title: OPTIONAL_TITLE,
642
+ items: itemsOf({ text: LABEL, done: bool({ default: false }) }, { maxItems: 100 }),
643
+ ...anchorProps,
644
+ },
645
+ a11y: 'Each item states "done" or "open" in text; the check glyph is decorative.',
646
+ runtimeFeatures: ['checklist'],
647
+ }),
648
+ semantic({
649
+ type: 'cta',
650
+ category: 'showcase',
651
+ tags: ['conversion', 'action'],
652
+ useCases: ['sign-up prompt', 'closing call to action'],
653
+ purpose: 'Closing call to action that sends the reader somewhere next.',
654
+ summary: 'CTA: eyebrow, oversized title, text, and up to three link actions on a night band.',
655
+ props: {
656
+ eyebrow: str({ maxLength: 60 }),
657
+ title: TITLE,
658
+ text: txt(),
659
+ actions: list(obj({
660
+ label: LABEL,
661
+ href: urlProp({ required: true }),
662
+ variant: enumStr(['primary', 'secondary'], { default: 'secondary' }),
663
+ }), { maxItems: 3 }),
664
+ ...anchorProps,
665
+ },
666
+ runtimeFeatures: ['cta'],
667
+ sizing: {
668
+ sizes: ['large'],
669
+ default: 'large',
670
+ responsive: 'Full width; the title scales with the viewport and the actions wrap.',
671
+ },
672
+ a11y: 'The title is an <h2>; every action is a real link with its own text.',
673
+ }),
674
+ // --- media --------------------------------------------------------------
675
+ define({
676
+ type: 'image',
677
+ category: 'media',
678
+ tags: ['picture', 'figure'],
679
+ useCases: ['screenshot', 'illustration'],
680
+ purpose: 'Single image or picture.',
681
+ summary: 'Image: local asset or allowlisted URL with required alt text.',
682
+ props: {
683
+ src: urlProp({ required: true, asset: 'images' }),
684
+ alt: str({ required: true, maxLength: 300 }),
685
+ caption: txt(),
536
686
  ...anchorProps,
537
687
  },
538
688
  network: 'optional',
539
689
  assets: ['media'],
540
- a11y: 'Every image keeps its alt text; captions are visible text, not tooltips.',
690
+ a11y: 'Alt text is required; decorative images must use an empty alt explicitly.',
541
691
  }),
542
692
  define({
543
693
  type: 'video',
694
+ category: 'media',
695
+ tags: ['player', 'poster'],
696
+ useCases: ['product demo', 'recorded talk'],
544
697
  purpose: 'Local video or a network-denied fallback.',
545
- summary: 'Video: plays local sources; a provider reference becomes a poster plus link; network sources degrade to poster plus link.',
698
+ summary: 'Video: plays local sources; a provider or network source degrades to a poster plus link.',
546
699
  props: {
547
700
  title: LABEL,
548
- src: urlProp({ required: true }),
549
- poster: urlProp(),
701
+ src: urlProp({ required: true, asset: 'media' }),
702
+ poster: urlProp({ asset: 'images', rejectBlocked: true }),
550
703
  provider: enumStr(EMBED_PROVIDER_NAMES, {
551
704
  description: 'Network media provider. Requires the media capability and this provider in the page provider allowlist; the page still links out instead of embedding.',
552
705
  }),
@@ -565,11 +718,14 @@ export const BLOCK_DEFINITIONS = [
565
718
  }),
566
719
  define({
567
720
  type: 'audio',
721
+ category: 'media',
722
+ tags: ['player', 'sound'],
723
+ useCases: ['podcast clip', 'voice note'],
568
724
  purpose: 'Local audio or a network-denied fallback.',
569
- summary: 'Audio: plays local sources; a provider reference becomes metadata plus link; network sources degrade to metadata plus link.',
725
+ summary: 'Audio: plays local sources; a provider or network source degrades to metadata plus link.',
570
726
  props: {
571
727
  title: LABEL,
572
- src: urlProp({ required: true }),
728
+ src: urlProp({ required: true, asset: 'media' }),
573
729
  provider: enumStr(EMBED_PROVIDER_NAMES, {
574
730
  description: 'Network media provider. Requires the media capability and this provider in the page provider allowlist; the page still links out instead of embedding.',
575
731
  }),
@@ -589,6 +745,9 @@ export const BLOCK_DEFINITIONS = [
589
745
  // --- controls -----------------------------------------------------------
590
746
  define({
591
747
  type: 'button',
748
+ category: 'interaction',
749
+ tags: ['action', 'control'],
750
+ useCases: ['trigger an action', 'primary call'],
592
751
  purpose: 'Single actionable control.',
593
752
  summary: 'Button: clickable control with declarative action bindings.',
594
753
  props: {
@@ -603,6 +762,9 @@ export const BLOCK_DEFINITIONS = [
603
762
  }),
604
763
  define({
605
764
  type: 'link',
765
+ category: 'interaction',
766
+ tags: ['navigation', 'anchor'],
767
+ useCases: ['external link', 'related page'],
606
768
  purpose: 'Navigational link.',
607
769
  summary: 'Link: allowlisted URL with descriptive text.',
608
770
  props: { label: LABEL, href: urlProp({ required: true }), ...anchorProps },
@@ -611,6 +773,9 @@ export const BLOCK_DEFINITIONS = [
611
773
  }),
612
774
  define({
613
775
  type: 'slider',
776
+ category: 'interaction',
777
+ tags: ['range', 'input', 'state'],
778
+ useCases: ['adjust a value', 'what-if input'],
614
779
  purpose: 'Bounded numeric input.',
615
780
  summary: 'Slider: range input with pointer drag and full keyboard support.',
616
781
  props: {
@@ -628,6 +793,9 @@ export const BLOCK_DEFINITIONS = [
628
793
  }),
629
794
  define({
630
795
  type: 'search',
796
+ category: 'interaction',
797
+ tags: ['filter', 'input'],
798
+ useCases: ['filter a list', 'find an item'],
631
799
  purpose: 'Filter input for a collection.',
632
800
  summary: 'Search: labeled filter input bound to a collection.',
633
801
  props: {
@@ -642,6 +810,9 @@ export const BLOCK_DEFINITIONS = [
642
810
  }),
643
811
  define({
644
812
  type: 'dialog',
813
+ category: 'interaction',
814
+ tags: ['modal', 'overlay'],
815
+ useCases: ['confirmation', 'detail popup'],
645
816
  purpose: 'Modal detail surface.',
646
817
  summary: 'Dialog: native <dialog> with labeled title and close controls.',
647
818
  props: {
@@ -658,6 +829,9 @@ export const BLOCK_DEFINITIONS = [
658
829
  // --- review-specific semantic blocks ------------------------------------
659
830
  semantic({
660
831
  type: 'diff-summary',
832
+ category: 'engineering',
833
+ tags: ['diff', 'changes'],
834
+ useCases: ['change summary', 'pull request files'],
661
835
  purpose: 'Changed-file summary from a diff.',
662
836
  summary: 'DiffSummary: file paths with change status and line counts.',
663
837
  props: {
@@ -674,6 +848,9 @@ export const BLOCK_DEFINITIONS = [
674
848
  }),
675
849
  semantic({
676
850
  type: 'code-review',
851
+ category: 'engineering',
852
+ tags: ['review', 'findings'],
853
+ useCases: ['review findings', 'audit notes'],
677
854
  purpose: 'Structured review findings.',
678
855
  summary: 'CodeReview: good/bad/ugly/concern/question findings.',
679
856
  props: {
@@ -688,5 +865,4 @@ export const BLOCK_DEFINITIONS = [
688
865
  a11y: 'The finding kind is written as text; tone colour is decorative.',
689
866
  }),
690
867
  ];
691
- export const BLOCKS_BY_TYPE = new Map(BLOCK_DEFINITIONS.map((definition) => [definition.type, definition]));
692
868
  //# sourceMappingURL=roster.js.map