@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
@@ -1,52 +1,16 @@
1
- /**
2
- * Block renderers.
3
- *
4
- * One renderer per registry type. Renderers are pure functions of a node, the
5
- * IR, and the resolved theme: no clock, no randomness, no module-level mutable
6
- * state, because the emitted bytes must be reproducible.
7
- *
8
- * Two conventions apply to every renderer:
9
- * 1. Exactly one element in the emitted markup carries `data-ak-id`, so a
10
- * `copy`/`download`/`toggle` target resolves to the content a reader means.
11
- * 2. Action bindings become `data-ak-on-*` attributes; the runtime owns what
12
- * they do. No renderer emits a handler, a style attribute, or a script.
13
- */
14
1
  import { runDiagramAdapter } from '../diagram/adapter.js';
15
2
  import { isPlainObject } from '../json.js';
16
- import { EMBED_PROVIDERS, hostMatchesAnyProvider, hostMatchesProvider } from '../spec/providers.js';
17
- import { renderChart } from './charts.js';
18
- import { escapeAttribute, escapeText, escapeUrl, renderAttributes, } from './escape.js';
3
+ import { DEFAULT_REGISTRY } from '../registry/registry.js';
4
+ import { EMBED_PROVIDERS } from '../spec/providers.js';
5
+ import { blockedReason, element, figureCaption, heading, imageReferenceAllowed, listProp, nodeAttributes, numberProp, numProp, objectListProp, resolveMedia, str, stringProp, titleHeader, } from './block-helpers.js';
6
+ import { renderDiagramFallback } from './diagram-fallback.js';
7
+ import { escapeAttribute, escapeInlineText, escapeText, escapeUrl, renderAttributes, } from './escape.js';
8
+ import { browserShot, SHOWCASE_RENDERERS } from './showcase-blocks.js';
9
+ import { toneBadge, valueTone } from './tone.js';
19
10
  const NO_OP_RENDERER = () => '';
20
- function stringProp(node, key, fallback = '') {
21
- const value = node.props[key];
22
- return typeof value === 'string' ? value : fallback;
23
- }
24
- function numberProp(node, key, fallback = 0) {
25
- const value = node.props[key];
26
- return typeof value === 'number' ? value : fallback;
27
- }
28
- function listProp(node, key) {
29
- const value = node.props[key];
30
- return Array.isArray(value) ? value : [];
31
- }
32
- function objectListProp(node, key) {
33
- return listProp(node, key).filter(isPlainObject);
34
- }
35
- function str(value, fallback = '') {
36
- return typeof value === 'string' ? value : fallback;
37
- }
38
- function numProp(value, fallback = 0) {
39
- return typeof value === 'number' ? value : fallback;
40
- }
41
- /** `data-ak-id` plus every non-click binding on the node. */
42
- function nodeAttributes(node, extra = {}) {
43
- const attributes = { 'data-ak-id': node.id, ...extra };
44
- for (const [event, actions] of Object.entries(node.bindings)) {
45
- if (event === 'click')
46
- continue;
47
- attributes[`data-ak-on-${event}`] = JSON.stringify(actions);
48
- }
49
- return attributes;
11
+ /** Fragment id of a section, shared by the section renderer and the page outline. */
12
+ export function sectionAnchor(nodeId) {
13
+ return `ak-sec-${nodeId}`;
50
14
  }
51
15
  /** `data-ak-on-click` for a control, when the node binds a click action. */
52
16
  function clickAttribute(bindings) {
@@ -55,71 +19,48 @@ function clickAttribute(bindings) {
55
19
  return {};
56
20
  return { 'data-ak-on-click': JSON.stringify(actions) };
57
21
  }
58
- function element(tag, attributes, inner) {
59
- const rendered = renderAttributes(attributes);
60
- return inner === '' ? `<${tag}${rendered}></${tag}>` : `<${tag}${rendered}>${inner}</${tag}>`;
61
- }
62
- function heading(level, text, className = 'ak-section-head') {
63
- return `<header class="${className}"><h${level}>${escapeText(text)}</h${level}></header>`;
64
- }
65
- /** A section heading for blocks whose `title` is optional. */
66
- function titleHeader(node, level = 2) {
67
- const title = stringProp(node, 'title');
68
- return title === '' ? '' : heading(level, title);
69
- }
70
- function figureCaption(value) {
71
- return value === '' ? '' : `<figcaption>${escapeText(value)}</figcaption>`;
72
- }
73
22
  function toneAttribute(node, fallback = 'info') {
74
23
  return { 'data-tone': stringProp(node, 'tone', fallback) };
75
24
  }
76
- function isRemote(reference) {
77
- return /^[a-zA-Z][a-zA-Z0-9+.-]*:/.test(reference);
25
+ /** A cell reads as a number when it is digits with optional sign, grouping, decimals, percent or a short unit. */
26
+ const NUMERIC_CELL = /^[-+−]?[$€£]?\d[\d,]*(?:\.\d+)?\s?(?:%|[A-Za-z]{1,3})?$/u;
27
+ /** Column indexes whose every non-empty cell is numeric, so they can align on the right. */
28
+ function numericColumns(rows, width) {
29
+ const numeric = new Set();
30
+ for (let column = 0; column < width; column += 1) {
31
+ const cells = rows
32
+ .map((row) => (Array.isArray(row) ? str(row[column]).trim() : ''))
33
+ .filter((cell) => cell !== '');
34
+ if (cells.length > 0 && cells.every((cell) => NUMERIC_CELL.test(cell)))
35
+ numeric.add(column);
36
+ }
37
+ return numeric;
78
38
  }
79
- function capabilityAllowed(policy, capability) {
80
- if (policy === 'deny')
81
- return false;
82
- return policy.allow.includes(capability);
39
+ /** A diff line count; zero stays neutral so only real change is coloured. */
40
+ function lineCountCell(value, kind) {
41
+ const sign = kind === 'add' ? '+' : '\u2212';
42
+ const tone = value === 0 ? 'ak-zero' : `ak-${kind}`;
43
+ return `<td class="ak-num ${tone}">${sign}${escapeText(String(value))}</td>`;
83
44
  }
84
- /**
85
- * Decide whether a remote reference may be loaded.
86
- *
87
- * Two gates apply. The capability must be opted into, and when the page declares
88
- * a provider allowlist the reference's host must belong to one of those
89
- * providers. A block that names a provider itself requires that provider to be
90
- * allowlisted, so a spec cannot promote an arbitrary host to trusted by
91
- * labelling it "youtube".
92
- */
93
- function networkAllows(policy, capability, reference, provider) {
94
- if (!capabilityAllowed(policy, capability))
95
- return false;
96
- if (policy === 'deny')
97
- return false;
98
- const declared = policy.providers ?? [];
99
- if (provider !== '') {
100
- return declared.includes(provider) && hostMatchesProvider(provider, reference);
101
- }
102
- if (declared.length === 0)
103
- return true;
104
- return hostMatchesAnyProvider(declared, reference);
45
+ /** Split code into one span per line so the stylesheet can number lines; newlines stay in the text. */
46
+ function codeLines(text) {
47
+ const lines = text.replace(/\n$/u, '').split('\n');
48
+ return lines.map((line) => `<span class="ak-line">${escapeText(line)}</span>`).join('\n');
105
49
  }
106
50
  /**
107
- * Resolve a media reference against the network policy.
108
- *
109
- * A relative path is local and always allowed; a remote reference needs the
110
- * matching capability and, when a provider allowlist exists, an allowlisted
111
- * host. Nothing here can produce an embed the spec did not ask for in a way the
112
- * policy did not allow.
51
+ * Wrap each word of the hero title so it can rise into view on its own beat.
52
+ * The spaces stay as text between the wrappers, so the heading's text content
53
+ * and its line wrapping are unchanged.
113
54
  */
114
- function resolveMedia(reference, policy, capability, provider = '') {
115
- if (!isRemote(reference))
116
- return { allowed: true, src: escapeUrl(reference) };
117
- return {
118
- allowed: networkAllows(policy, capability, reference, provider),
119
- src: escapeUrl(reference),
120
- };
55
+ function heroWords(title) {
56
+ return title
57
+ .split(/(\s+)/u)
58
+ .map((part) => part === '' || /^\s+$/u.test(part)
59
+ ? part
60
+ : `<span class="ak-word"><span>${escapeText(part)}</span></span>`)
61
+ .join('');
121
62
  }
122
- function mediaFallbackBody(title, description, url, poster, linkText, note = 'Remote media is not embedded because the page denies network access.') {
63
+ function mediaFallbackBody(title, description, url, poster, linkText, note) {
123
64
  const posterMarkup = poster === '' ? '' : `<img src="${escapeAttribute(escapeUrl(poster))}" alt="" />`;
124
65
  const link = url === ''
125
66
  ? ''
@@ -127,7 +68,7 @@ function mediaFallbackBody(title, description, url, poster, linkText, note = 'Re
127
68
  return [
128
69
  posterMarkup,
129
70
  title === '' ? '' : `<p><strong>${escapeText(title)}</strong></p>`,
130
- `<p class="ak-muted">${escapeText(description)}</p>`,
71
+ `<p class="ak-muted">${escapeInlineText(description)}</p>`,
131
72
  `<p class="ak-caption">${escapeText(note)}</p>`,
132
73
  link,
133
74
  ]
@@ -135,6 +76,7 @@ function mediaFallbackBody(title, description, url, poster, linkText, note = 'Re
135
76
  .join('');
136
77
  }
137
78
  const RENDERERS = {
79
+ ...SHOWCASE_RENDERERS,
138
80
  page: (node, context) => {
139
81
  // Every page needs exactly one h1. A hero (or an explicit level-1 heading)
140
82
  // provides it; otherwise the document title does, so a page without a hero
@@ -146,19 +88,13 @@ const RENDERERS = {
146
88
  : `<h1 class="ak-page-title">${escapeText(context.ir.meta.title)}</h1>`;
147
89
  return element('main', { class: 'ak-main', id: 'ak-main-content', 'aria-label': context.ir.meta.title }, `${title}${context.renderChildren(node)}`);
148
90
  },
149
- section: (node, context) => element('section', nodeAttributes(node, { class: 'ak-block ak-section' }), `${titleHeader(node)}${context.renderChildren(node)}`),
150
- stack: (node, context) => element('div', nodeAttributes(node, {
151
- class: 'ak-block ak-stack',
152
- 'data-gap': stringProp(node, 'gap', 'normal'),
153
- }), context.renderChildren(node)),
154
- grid: (node, context) => element('div', nodeAttributes(node, {
155
- class: 'ak-block ak-grid',
156
- 'data-ak-columns': String(Math.min(Math.max(numberProp(node, 'columns', 3), 1), 6)),
157
- }), context.renderChildren(node)),
158
- split: (node, context) => element('div', nodeAttributes(node, {
159
- class: 'ak-block ak-split',
160
- 'data-ratio': stringProp(node, 'ratio', 'even'),
161
- }), context.renderChildren(node)),
91
+ section: (node, context) => element('section',
92
+ // The id is the outline's link target; node ids are unique, so it is too.
93
+ nodeAttributes(node, {
94
+ class: 'ak-block ak-section',
95
+ id: sectionAnchor(node.id),
96
+ 'data-surface': stringProp(node, 'surface') === 'inverse' ? 'inverse' : undefined,
97
+ }), `${titleHeader(node)}${context.renderChildren(node)}`),
162
98
  spacer: (node) => element('div', {
163
99
  class: 'ak-spacer',
164
100
  'data-size': stringProp(node, 'size', 'medium'),
@@ -179,30 +115,38 @@ const RENDERERS = {
179
115
  : variant === 'caption'
180
116
  ? 'ak-block ak-caption'
181
117
  : 'ak-block';
182
- return `<p${renderAttributes(nodeAttributes(node, { class: className }))}>${escapeText(stringProp(node, 'text'))}</p>`;
118
+ return `<p${renderAttributes(nodeAttributes(node, { class: className }))}>${escapeInlineText(stringProp(node, 'text'))}</p>`;
183
119
  },
184
120
  'rich-text': (node) => {
185
121
  const paragraphs = stringProp(node, 'text')
186
122
  .split(/\n{2,}/u)
187
123
  .map((part) => part.trim())
188
124
  .filter((part) => part !== '');
189
- return element('div', nodeAttributes(node, { class: 'ak-block ak-prose' }), paragraphs.map((part) => `<p>${escapeText(part.replace(/\n/gu, ' '))}</p>`).join(''));
125
+ return element('div', nodeAttributes(node, { class: 'ak-block ak-prose' }), paragraphs.map((part) => `<p>${escapeInlineText(part.replace(/\n/gu, ' '))}</p>`).join(''));
190
126
  },
191
127
  quote: (node) => {
192
128
  const cite = stringProp(node, 'cite');
193
- return element('blockquote', nodeAttributes(node, { class: 'ak-block ak-quote' }), `<p>${escapeText(stringProp(node, 'text'))}</p>${cite === '' ? '' : `<cite>${escapeText(cite)}</cite>`}`);
129
+ return element('blockquote', nodeAttributes(node, { class: 'ak-block ak-quote' }), `<p>${escapeInlineText(stringProp(node, 'text'))}</p>${cite === '' ? '' : `<cite>${escapeText(cite)}</cite>`}`);
194
130
  },
195
131
  code: (node) => {
196
132
  const title = stringProp(node, 'title');
197
133
  const language = stringProp(node, 'language', 'text');
134
+ const copy = renderAttributes({
135
+ 'data-ak-on-click': JSON.stringify([{ action: 'copy', target: node.id }]),
136
+ 'aria-label': title === '' ? 'Copy code' : `Copy ${title}`,
137
+ });
198
138
  return [
199
139
  `<div class="ak-block ak-code">`,
200
- title === '' && language === ''
140
+ '<div class="ak-code-head">',
141
+ `<span class="ak-label">${escapeText(title === '' ? language : title)}</span>`,
142
+ title === '' || language === ''
201
143
  ? ''
202
- : `<div class="ak-code-head"><span class="ak-label">${escapeText(title === '' ? language : title)}</span></div>`,
144
+ : `<span class="ak-code-lang">${escapeText(language)}</span>`,
145
+ `<button type="button" class="ak-code-copy"${copy}>Copy</button>`,
146
+ '</div>',
203
147
  `<pre${renderAttributes({ 'data-ak-id': node.id })}><code${renderAttributes({
204
148
  class: `language-${language}`,
205
- })}>${escapeText(stringProp(node, 'text'))}</code></pre>`,
149
+ })}>${codeLines(stringProp(node, 'text'))}</code></pre>`,
206
150
  '</div>',
207
151
  ]
208
152
  .filter((part) => part !== '')
@@ -221,7 +165,7 @@ const RENDERERS = {
221
165
  stringProp(node, 'title') === ''
222
166
  ? ''
223
167
  : heading(3, stringProp(node, 'title'), 'ak-card-title'),
224
- text === '' ? '' : `<p>${escapeText(text)}</p>`,
168
+ text === '' ? '' : `<p>${escapeInlineText(text)}</p>`,
225
169
  context.renderChildren(node),
226
170
  ].join(''));
227
171
  },
@@ -231,7 +175,7 @@ const RENDERERS = {
231
175
  return [
232
176
  `<div${renderAttributes(nodeAttributes(node, { class: 'ak-block ak-alert', ...toneAttribute(node) }))}${role}>`,
233
177
  `<p><strong>${escapeText(stringProp(node, 'title'))}</strong></p>`,
234
- `<p>${escapeText(stringProp(node, 'text'))}</p>`,
178
+ `<p>${escapeInlineText(stringProp(node, 'text'))}</p>`,
235
179
  '</div>',
236
180
  ].join('');
237
181
  },
@@ -248,18 +192,27 @@ const RENDERERS = {
248
192
  `<aside${renderAttributes(nodeAttributes(node, { class: 'ak-block ak-callout', ...toneAttribute(node) }))}>`,
249
193
  `<p class="ak-label">${escapeText(icon)}</p>`,
250
194
  `<p><strong>${escapeText(stringProp(node, 'title'))}</strong></p>`,
251
- `<p>${escapeText(stringProp(node, 'text'))}</p>`,
195
+ `<p>${escapeInlineText(stringProp(node, 'text'))}</p>`,
252
196
  '</aside>',
253
197
  ].join('');
254
198
  },
255
- hero: (node) => {
199
+ hero: (node, context) => {
256
200
  const eyebrow = stringProp(node, 'eyebrow');
257
201
  const description = stringProp(node, 'description');
202
+ const source = stringProp(node, 'src');
258
203
  return [
259
- `<div${renderAttributes(nodeAttributes(node, { class: 'ak-block ak-hero' }))}>`,
204
+ `<div${renderAttributes(nodeAttributes(node, {
205
+ class: 'ak-block ak-hero',
206
+ 'data-align': stringProp(node, 'align') === 'center' ? 'center' : undefined,
207
+ 'data-media': source === '' ? undefined : 'true',
208
+ }))}>`,
260
209
  eyebrow === '' ? '' : `<p class="ak-eyebrow">${escapeText(eyebrow)}</p>`,
261
- `<h1>${escapeText(stringProp(node, 'title'))}</h1>`,
262
- description === '' ? '' : `<p>${escapeText(description)}</p>`,
210
+ `<h1>${heroWords(stringProp(node, 'title'))}</h1>`,
211
+ description === '' ? '' : `<p>${escapeInlineText(description)}</p>`,
212
+ // The shot is the first thing on screen, so it loads eagerly.
213
+ source === ''
214
+ ? ''
215
+ : `<figure class="ak-hero-media"><div class="ak-hero-stage">${browserShot(source, stringProp(node, 'alt'), stringProp(node, 'address'), context.ir.policy.network, 'eager')}</div></figure>`,
263
216
  '</div>',
264
217
  ].join('');
265
218
  },
@@ -292,7 +245,7 @@ const RENDERERS = {
292
245
  `<ol class="ak-steps">${items
293
246
  .map((item) => {
294
247
  const text = str(item.text);
295
- return `<li><p><strong>${escapeText(str(item.title))}</strong></p>${text === '' ? '' : `<p>${escapeText(text)}</p>`}</li>`;
248
+ return `<li><p><strong>${escapeText(str(item.title))}</strong></p>${text === '' ? '' : `<p>${escapeInlineText(text)}</p>`}</li>`;
296
249
  })
297
250
  .join('')}</ol>`,
298
251
  ].join(''));
@@ -304,7 +257,7 @@ const RENDERERS = {
304
257
  `<ol class="ak-timeline">${items
305
258
  .map((item) => {
306
259
  const text = str(item.text);
307
- return `<li><time>${escapeText(str(item.when))}</time><p><strong>${escapeText(str(item.title))}</strong></p>${text === '' ? '' : `<p>${escapeText(text)}</p>`}</li>`;
260
+ return `<li><time>${escapeText(str(item.when))}</time><p><strong>${escapeText(str(item.title))}</strong></p>${text === '' ? '' : `<p>${escapeInlineText(text)}</p>`}</li>`;
308
261
  })
309
262
  .join('')}</ol>`,
310
263
  ].join(''));
@@ -316,7 +269,7 @@ const RENDERERS = {
316
269
  `<ul class="ak-list">${items
317
270
  .map((item) => {
318
271
  const badge = str(item.badge);
319
- return `<li data-ak-filter-item data-ak-label="${escapeAttribute(str(item.text))}"><span>${escapeText(str(item.text))}</span>${badge === '' ? '' : `<span class="ak-badge">${escapeText(badge)}</span>`}</li>`;
272
+ return `<li data-ak-filter-item data-ak-label="${escapeAttribute(str(item.text))}"><span>${escapeInlineText(str(item.text))}</span>${badge === '' ? '' : `<span class="ak-badge">${escapeText(badge)}</span>`}</li>`;
320
273
  })
321
274
  .join('')}</ul>`,
322
275
  ].join(''));
@@ -328,7 +281,7 @@ const RENDERERS = {
328
281
  `<ul class="ak-grid" data-ak-columns="3">${items
329
282
  .map((item) => {
330
283
  const text = str(item.text);
331
- return `<li class="ak-card ak-card--elevated"><p><strong>${escapeText(str(item.title))}</strong></p>${text === '' ? '' : `<p>${escapeText(text)}</p>`}</li>`;
284
+ return `<li class="ak-card ak-card--elevated"><p><strong>${escapeText(str(item.title))}</strong></p>${text === '' ? '' : `<p>${escapeInlineText(text)}</p>`}</li>`;
332
285
  })
333
286
  .join('')}</ul>`,
334
287
  ].join(''));
@@ -337,20 +290,24 @@ const RENDERERS = {
337
290
  const columns = listProp(node, 'columns');
338
291
  const rows = listProp(node, 'rows');
339
292
  const title = stringProp(node, 'title');
293
+ const numeric = numericColumns(rows, columns.length);
294
+ const align = (index) => (numeric.has(index) ? ' class="ak-num"' : '');
340
295
  const head = columns
341
- .map((column) => `<th scope="col">${escapeText(str(column))}</th>`)
296
+ .map((column, index) => `<th scope="col"${align(index)}>${escapeText(str(column))}</th>`)
342
297
  .join('');
343
298
  const body = rows
344
299
  .map((row) => {
345
300
  const cells = (Array.isArray(row) ? row : [])
346
- .map((cell) => `<td>${escapeText(str(cell))}</td>`)
301
+ .map((cell, index) => `<td${align(index)}>${escapeText(str(cell))}</td>`)
347
302
  .join('');
348
303
  return `<tr>${cells}</tr>`;
349
304
  })
350
305
  .join('');
351
306
  return element('section', nodeAttributes(node, { class: 'ak-block' }), [
352
307
  title === '' ? '' : heading(2, title),
353
- `<div class="ak-table-wrap"><table>${title === '' ? '' : `<caption>${escapeText(title)}</caption>`}<thead><tr>${head}</tr></thead><tbody>${body}</tbody></table></div>`,
308
+ // The visible heading already names the table, so the caption stays for
309
+ // assistive technology only instead of printing the title twice.
310
+ `<div class="ak-table-wrap"><table>${title === '' ? '' : `<caption class="ak-sr">${escapeText(title)}</caption>`}<thead><tr>${head}</tr></thead><tbody>${body}</tbody></table></div>`,
354
311
  ].join(''));
355
312
  },
356
313
  comparison: (node) => {
@@ -368,16 +325,19 @@ const RENDERERS = {
368
325
  return element('section', nodeAttributes(node, { class: 'ak-block' }), [
369
326
  titleHeader(node),
370
327
  `<div class="ak-table-wrap"><table><caption>Risk by impact and likelihood</caption><thead><tr><th scope="col">Area</th><th scope="col">Impact</th><th scope="col">Likelihood</th><th scope="col">Note</th></tr></thead><tbody>${items
371
- .map((item) => `<tr><th scope="row">${escapeText(str(item.area))}</th><td>${escapeText(str(item.impact))}</td><td>${escapeText(str(item.likelihood))}</td><td>${escapeText(str(item.note))}</td></tr>`)
328
+ .map((item) => `<tr><th scope="row">${escapeText(str(item.area))}</th><td>${toneBadge(str(item.impact))}</td><td>${toneBadge(str(item.likelihood))}</td><td>${escapeInlineText(str(item.note))}</td></tr>`)
372
329
  .join('')}</tbody></table></div>`,
373
330
  ].join(''));
374
331
  },
375
332
  'diff-summary': (node) => {
376
333
  const items = objectListProp(node, 'items');
334
+ const header = titleHeader(node);
335
+ // A visible block title already names the table; the caption then stays for screen readers only.
336
+ const caption = header === '' ? '<caption>' : '<caption class="ak-sr">';
377
337
  return element('section', nodeAttributes(node, { class: 'ak-block' }), [
378
- titleHeader(node),
379
- `<div class="ak-table-wrap"><table><caption>Changed files</caption><thead><tr><th scope="col">Path</th><th scope="col">Status</th><th scope="col">Additions</th><th scope="col">Deletions</th></tr></thead><tbody>${items
380
- .map((item) => `<tr><th scope="row"><code>${escapeText(str(item.path))}</code></th><td>${escapeText(str(item.status))}</td><td>${escapeText(String(numProp(item.additions, 0)))}</td><td>${escapeText(String(numProp(item.deletions, 0)))}</td></tr>`)
338
+ header,
339
+ `<div class="ak-table-wrap"><table>${caption}Changed files</caption><thead><tr><th scope="col">Path</th><th scope="col">Status</th><th scope="col" class="ak-num">Additions</th><th scope="col" class="ak-num">Deletions</th></tr></thead><tbody>${items
340
+ .map((item) => `<tr><th scope="row"><code>${escapeText(str(item.path))}</code></th><td>${toneBadge(str(item.status))}</td>${lineCountCell(numProp(item.additions, 0), 'add')}${lineCountCell(numProp(item.deletions, 0), 'del')}</tr>`)
381
341
  .join('')}</tbody></table></div>`,
382
342
  ].join(''));
383
343
  },
@@ -386,63 +346,10 @@ const RENDERERS = {
386
346
  return element('section', nodeAttributes(node, { class: 'ak-block' }), [
387
347
  titleHeader(node),
388
348
  `<ul class="ak-grid" data-ak-columns="2">${items
389
- .map((item) => `<li class="ak-card ak-surface"><p class="ak-label">${escapeText(str(item.kind))}</p><p><strong>${escapeText(str(item.title))}</strong></p><p>${escapeText(str(item.text))}</p></li>`)
349
+ .map((item) => `<li class="ak-card ak-surface" data-tone="${valueTone(str(item.kind))}"><p class="ak-label">${escapeText(str(item.kind))}</p><p><strong>${escapeText(str(item.title))}</strong></p><p>${escapeInlineText(str(item.text))}</p></li>`)
390
350
  .join('')}</ul>`,
391
351
  ].join(''));
392
352
  },
393
- tabs: (node) => {
394
- const items = objectListProp(node, 'items');
395
- const base = node.id;
396
- const tabs = items
397
- .map((item, index) => {
398
- const tabId = str(item.id, `${base}-tab-${index}`);
399
- return `<button type="button" role="tab" id="${escapeAttribute(tabId)}" data-ak-tab-id="${escapeAttribute(tabId)}" aria-controls="${escapeAttribute(`${base}-panel-${index}`)}" aria-selected="${index === 0 ? 'true' : 'false'}" tabindex="${index === 0 ? '0' : '-1'}">${escapeText(str(item.title))}</button>`;
400
- })
401
- .join('');
402
- const panels = items
403
- .map((item, index) => `<div role="tabpanel" id="${escapeAttribute(`${base}-panel-${index}`)}" aria-labelledby="${escapeAttribute(str(item.id, `${base}-tab-${index}`))}" tabindex="${index === 0 ? '0' : '-1'}"${index === 0 ? '' : ' hidden'}>${escapeText(str(item.text))}</div>`)
404
- .join('');
405
- return element('section', nodeAttributes(node, { class: 'ak-block ak-tabs', 'data-ak-tabs': 'true' }), [
406
- titleHeader(node),
407
- `<div role="tablist" aria-label="${escapeAttribute(stringProp(node, 'title', 'Tabs'))}">${tabs}</div>${panels}`,
408
- ].join(''));
409
- },
410
- accordion: (node) => {
411
- const items = objectListProp(node, 'items');
412
- return element('section', nodeAttributes(node, { class: 'ak-block ak-accordion' }), [
413
- titleHeader(node),
414
- items
415
- .map((item, index) =>
416
- // Each disclosure carries its own id so a declarative expand or
417
- // collapse action can address one section. Native <details> remains
418
- // the behavior; the action only drives it.
419
- `<details${index === 0 ? ' open' : ''}${renderAttributes({
420
- 'data-ak-id': `${node.id}-item-${index}`,
421
- })}><summary>${escapeText(str(item.title))}</summary><p>${escapeText(str(item.text))}</p></details>`)
422
- .join(''),
423
- ].join(''));
424
- },
425
- carousel: (node) => {
426
- const items = objectListProp(node, 'items');
427
- const label = stringProp(node, 'ariaLabel', 'Carousel');
428
- const slides = items
429
- .map((item, index) => `<div class="ak-carousel-slide" data-ak-slide tabindex="-1" aria-hidden="${index === 0 ? 'false' : 'true'}"${index === 0 ? '' : ' hidden'}><h3>${escapeText(str(item.title))}</h3><p>${escapeText(str(item.text))}</p></div>`)
430
- .join('');
431
- return element('section', nodeAttributes(node, {
432
- class: 'ak-block ak-carousel',
433
- 'data-ak-carousel-root': 'true',
434
- role: 'group',
435
- 'aria-roledescription': 'carousel',
436
- 'aria-label': label,
437
- }), [
438
- `<div class="ak-carousel-slides">${slides}</div>`,
439
- `<div class="ak-carousel-controls">
440
- <button type="button" class="ak-btn" data-ak-carousel="prev" aria-label="Previous slide">Previous</button>
441
- <button type="button" class="ak-btn" data-ak-carousel="next" aria-label="Next slide">Next</button>
442
- <span class="ak-carousel-status" data-ak-carousel-status aria-live="polite">1 / ${Math.max(items.length, 1)}</span>
443
- </div>`,
444
- ].join(''));
445
- },
446
353
  toolbar: (node) => {
447
354
  const items = objectListProp(node, 'items');
448
355
  return element('div', nodeAttributes(node, { class: 'ak-block ak-toolbar', role: 'toolbar' }), [
@@ -472,22 +379,6 @@ const RENDERERS = {
472
379
  }),
473
380
  ].join(''));
474
381
  },
475
- chart: (node) => {
476
- const series = objectListProp(node, 'series').map((entry) => ({
477
- label: str(entry.label),
478
- values: (Array.isArray(entry.values) ? entry.values : []).map((value) => numProp(value, 0)),
479
- }));
480
- const description = stringProp(node, 'description');
481
- const title = stringProp(node, 'title');
482
- return `<div${renderAttributes(nodeAttributes(node, { class: 'ak-block' }))}>${renderChart({
483
- kind: stringProp(node, 'kind', 'bar'),
484
- id: node.id,
485
- labels: listProp(node, 'labels').map((label) => str(label)),
486
- series,
487
- ...(title === '' ? {} : { title }),
488
- ...(description === '' ? {} : { description }),
489
- })}</div>`;
490
- },
491
382
  'diagram-panel': (node, context) => {
492
383
  const spec = isPlainObject(node.props.spec) ? node.props.spec : {};
493
384
  const asObjects = (value) => (Array.isArray(value) ? value.filter(isPlainObject) : []);
@@ -499,20 +390,7 @@ const RENDERERS = {
499
390
  // The semantic fallback is always available: it is the only rendering when
500
391
  // no adapter is installed, and it stays in the document as the accessible
501
392
  // description when one is.
502
- const fallbackBody = [
503
- described.length === 0
504
- ? ''
505
- : `<ul class="ak-list">${described
506
- .map((component) => `<li><code>${escapeText(str(component.id))}</code><span>${escapeText(str(component.label))}</span></li>`)
507
- .join('')}</ul>`,
508
- edges.length === 0
509
- ? ''
510
- : `<ul class="ak-list">${edges
511
- .map((edge) => `<li><code>${escapeText(str(edge.from))} → ${escapeText(str(edge.to))}</code><span>${escapeText(str(edge.label))}</span></li>`)
512
- .join('')}</ul>`,
513
- ]
514
- .filter((part) => part !== '')
515
- .join('');
393
+ const fallbackBody = renderDiagramFallback(described, edges);
516
394
  const adapterResult = runDiagramAdapter(context.diagramAdapter, {
517
395
  spec: (node.props.spec ?? null),
518
396
  title: diagramTitle,
@@ -526,22 +404,30 @@ const RENDERERS = {
526
404
  message: `diagram adapter "${adapterResult.adapter}" output was rejected (${adapterResult.rejected}); the structured fallback is used`,
527
405
  });
528
406
  }
407
+ if (adapterResult?.removedInlineStyles !== undefined) {
408
+ context.warnings?.push({
409
+ code: 'POLICY_VIOLATION',
410
+ severity: 'warning',
411
+ path: `$.blocks.${node.id}`,
412
+ message: `diagram adapter "${adapterResult.adapter}" output had ${adapterResult.removedInlineStyles} inline style attribute(s), which the page Content Security Policy refuses; they were removed. Move those styles into a <style> element.`,
413
+ });
414
+ }
529
415
  const accepted = adapterResult !== undefined &&
530
416
  adapterResult.rejected === undefined &&
531
417
  adapterResult.markup !== '';
418
+ const description = `<p class="ak-diagram-title">${escapeText(diagramTitle)}</p>${fallbackBody}`;
532
419
  return [
533
420
  `<figure${renderAttributes(nodeAttributes(node, { class: 'ak-block ak-diagram' }))}>`,
534
421
  titleHeader(node, 2),
422
+ // Adapter output keeps its natural size: a wide diagram scrolls sideways
423
+ // inside a keyboard-focusable region instead of shrinking its labels. The
424
+ // text description then folds away behind a disclosure, so it does not
425
+ // repeat the drawing; it stays in the document, prints open, and the
426
+ // static SVG reads without script and in print. The inner canvas is the
427
+ // root the adapter's stylesheets are scoped to.
535
428
  accepted
536
- ? `<div class="ak-diagram-rendered" data-ak-diagram-adapter="${escapeAttribute(adapterResult.adapter)}">${adapterResult.markup}</div>`
537
- : '',
538
- `<div class="ak-diagram-fallback" data-ak-diagram-fallback>`,
539
- `<p><strong>${escapeText(diagramTitle)}</strong></p>`,
540
- fallbackBody,
541
- accepted
542
- ? '<p class="ak-caption">Rendered by a diagram adapter. The structured description below is the accessible equivalent.</p>'
543
- : '<p class="ak-caption">Rendered as a structured fallback because no diagram adapter is configured.</p>',
544
- '</div>',
429
+ ? `<div class="ak-diagram-rendered" data-ak-diagram-adapter="${escapeAttribute(adapterResult.adapter)}" role="region" aria-label="${escapeAttribute(diagramTitle)}" tabindex="0"><div class="ak-diagram-canvas" data-ak-diagram-scope="${escapeAttribute(adapterResult.scope ?? '')}">${adapterResult.markup}</div></div><details class="ak-diagram-details" data-ak-diagram-fallback><summary>Text description</summary><div class="ak-diagram-fallback">${description}</div></details>`
430
+ : `<div class="ak-diagram-fallback" data-ak-diagram-fallback>${description}<p class="ak-caption">Rendered as a structured fallback because no diagram adapter is configured.</p></div>`,
545
431
  figureCaption(caption),
546
432
  '</figure>',
547
433
  ]
@@ -555,7 +441,7 @@ const RENDERERS = {
555
441
  if (!resolved.allowed) {
556
442
  return [
557
443
  `<figure${renderAttributes(nodeAttributes(node, { class: 'ak-block ak-media' }))}>`,
558
- `<div class="ak-media-fallback"><p><strong>${escapeText(alt)}</strong></p><p class="ak-caption">Remote image not loaded: the page denies network access.</p><a href="${escapeAttribute(resolved.src)}" rel="noreferrer noopener">Open image</a></div>`,
444
+ `<div class="ak-media-fallback"><p><strong>${escapeText(alt)}</strong></p><p class="ak-caption">Remote image not loaded: ${blockedReason(context.ir.policy.network, 'images')}.</p><a href="${escapeAttribute(resolved.src)}" rel="noreferrer noopener">Open image</a></div>`,
559
445
  figureCaption(captionText),
560
446
  '</figure>',
561
447
  ].join('');
@@ -567,29 +453,19 @@ const RENDERERS = {
567
453
  '</figure>',
568
454
  ].join('');
569
455
  },
570
- gallery: (node, context) => {
571
- const columns = Math.min(Math.max(numberProp(node, 'columns', 3), 1), 6);
572
- const items = objectListProp(node, 'items');
573
- return element('section', nodeAttributes(node, { class: 'ak-block' }), [
574
- titleHeader(node),
575
- `<ul class="ak-gallery" data-ak-columns="${columns}">${items
576
- .map((item) => {
577
- const resolved = resolveMedia(str(item.src), context.ir.policy.network, 'images');
578
- const captionText = str(item.caption);
579
- const body = resolved.allowed
580
- ? `<img src="${escapeAttribute(resolved.src)}" alt="${escapeAttribute(str(item.alt))}" loading="lazy" decoding="async" />`
581
- : `<a href="${escapeAttribute(resolved.src)}" rel="noreferrer noopener">${escapeText(str(item.alt))}</a>`;
582
- return `<li><figure>${body}${captionText === '' ? '' : `<figcaption>${escapeText(captionText)}</figcaption>`}</figure></li>`;
583
- })
584
- .join('')}</ul>`,
585
- ].join(''));
586
- },
587
456
  video: (node, context) => {
588
457
  const source = stringProp(node, 'src');
589
458
  const provider = stringProp(node, 'provider');
590
459
  const resolved = resolveMedia(source, context.ir.policy.network, 'media', provider);
591
460
  const fallback = isPlainObject(node.props.fallback) ? node.props.fallback : {};
592
461
  const captionText = stringProp(node, 'caption');
462
+ // A poster is a still image, so it passes the same `images` gate as an image
463
+ // block. Validation rejects a blocked remote poster; dropping it here keeps
464
+ // the renderer safe for an IR that did not come through validation.
465
+ const requestedPoster = stringProp(node, 'poster');
466
+ const poster = imageReferenceAllowed(context.ir.policy.network, requestedPoster)
467
+ ? requestedPoster
468
+ : '';
593
469
  // A provider reference never becomes a frame, whether or not it is allowed:
594
470
  // the page links to the provider and keeps the poster, so the artifact stays
595
471
  // frame-free. Only the explanation differs between allowed and denied.
@@ -597,9 +473,9 @@ const RENDERERS = {
597
473
  const label = EMBED_PROVIDERS[provider]?.label ?? provider;
598
474
  return [
599
475
  `<figure${renderAttributes(nodeAttributes(node, { class: 'ak-block ak-media' }))}>`,
600
- `<div class="ak-media-fallback">${mediaFallbackBody(stringProp(node, 'title'), str(fallback.description, `${label} content`), source, stringProp(node, 'poster'), str(fallback.linkText, `Open on ${label}`), resolved.allowed
476
+ `<div class="ak-media-fallback">${mediaFallbackBody(stringProp(node, 'title'), str(fallback.description, `${label} content`), source, poster, str(fallback.linkText, `Open on ${label}`), resolved.allowed
601
477
  ? `Embedded players are not emitted; this page links to ${label} instead.`
602
- : `Embedded players are not emitted and the page denies network access; this page links to ${label} instead.`)}</div>`,
478
+ : `Embedded players are not emitted and ${blockedReason(context.ir.policy.network, 'media')}; this page links to ${label} instead.`)}</div>`,
603
479
  figureCaption(captionText),
604
480
  '</figure>',
605
481
  ].join('');
@@ -607,15 +483,14 @@ const RENDERERS = {
607
483
  if (!resolved.allowed) {
608
484
  return [
609
485
  `<figure${renderAttributes(nodeAttributes(node, { class: 'ak-block ak-media' }))}>`,
610
- `<div class="ak-media-fallback">${mediaFallbackBody(stringProp(node, 'title'), str(fallback.description, 'Remote video is unavailable without network access.'), str(fallback.url, source), stringProp(node, 'poster'), str(fallback.linkText, 'Open video'))}</div>`,
486
+ `<div class="ak-media-fallback">${mediaFallbackBody(stringProp(node, 'title'), str(fallback.description, 'Remote video is not available on this page.'), str(fallback.url, source), poster, str(fallback.linkText, 'Open video'), `Remote media is not embedded because ${blockedReason(context.ir.policy.network, 'media')}.`)}</div>`,
611
487
  figureCaption(captionText),
612
488
  '</figure>',
613
489
  ].join('');
614
490
  }
615
- const poster = stringProp(node, 'poster');
616
491
  return [
617
492
  `<figure${renderAttributes(nodeAttributes(node, { class: 'ak-block ak-media' }))}>`,
618
- `<video controls preload="metadata"${poster === '' ? '' : ` poster="${escapeAttribute(poster)}"`}><source src="${escapeAttribute(resolved.src)}" />${escapeText(str(fallback.description, 'Video content'))}</video>`,
493
+ `<video controls preload="metadata"${poster === '' ? '' : ` poster="${escapeAttribute(escapeUrl(poster))}"`}><source src="${escapeAttribute(resolved.src)}" />${escapeInlineText(str(fallback.description, 'Video content'))}</video>`,
619
494
  figureCaption(captionText),
620
495
  '</figure>',
621
496
  ].join('');
@@ -634,7 +509,7 @@ const RENDERERS = {
634
509
  `<figure${renderAttributes(nodeAttributes(node, { class: 'ak-block ak-media' }))}>`,
635
510
  `<div class="ak-media-fallback">${mediaFallbackBody(stringProp(node, 'title'), str(fallback.description, `${label} audio`), source, '', str(fallback.linkText, `Open on ${label}`), resolved.allowed
636
511
  ? `Embedded players are not emitted; this page links to ${label} instead.`
637
- : `Embedded players are not emitted and the page denies network access; this page links to ${label} instead.`)}</div>`,
512
+ : `Embedded players are not emitted and ${blockedReason(context.ir.policy.network, 'media')}; this page links to ${label} instead.`)}</div>`,
638
513
  figureCaption(captionText),
639
514
  '</figure>',
640
515
  ].join('');
@@ -642,14 +517,14 @@ const RENDERERS = {
642
517
  if (!resolved.allowed) {
643
518
  return [
644
519
  `<figure${renderAttributes(nodeAttributes(node, { class: 'ak-block ak-media' }))}>`,
645
- `<div class="ak-media-fallback">${mediaFallbackBody(stringProp(node, 'title'), str(fallback.description, 'Remote audio is unavailable without network access.'), str(fallback.url, source), '', str(fallback.linkText, 'Open audio'))}</div>`,
520
+ `<div class="ak-media-fallback">${mediaFallbackBody(stringProp(node, 'title'), str(fallback.description, 'Remote audio is not available on this page.'), str(fallback.url, source), '', str(fallback.linkText, 'Open audio'), `Remote media is not embedded because ${blockedReason(context.ir.policy.network, 'media')}.`)}</div>`,
646
521
  figureCaption(captionText),
647
522
  '</figure>',
648
523
  ].join('');
649
524
  }
650
525
  return [
651
526
  `<figure${renderAttributes(nodeAttributes(node, { class: 'ak-block ak-media' }))}>`,
652
- `<audio controls preload="metadata" src="${escapeAttribute(resolved.src)}">${escapeText(str(fallback.description, 'Audio content'))}</audio>`,
527
+ `<audio controls preload="metadata" src="${escapeAttribute(resolved.src)}">${escapeInlineText(str(fallback.description, 'Audio content'))}</audio>`,
653
528
  figureCaption(captionText),
654
529
  '</figure>',
655
530
  ].join('');
@@ -704,7 +579,7 @@ const RENDERERS = {
704
579
  'aria-label': stringProp(node, 'ariaLabel', stringProp(node, 'title')),
705
580
  }))}>`,
706
581
  heading(2, stringProp(node, 'title'), 'ak-dialog-title'),
707
- text === '' ? '' : `<p>${escapeText(text)}</p>`,
582
+ text === '' ? '' : `<p>${escapeInlineText(text)}</p>`,
708
583
  `<div class="ak-dialog-actions">${actions
709
584
  .map((action) => {
710
585
  const on = isPlainObject(action.on) ? action.on : {};
@@ -736,14 +611,20 @@ function searchMatch(node) {
736
611
  }
737
612
  return 'text';
738
613
  }
739
- /** Render one node, falling back to an empty string for an unregistered type. */
614
+ /**
615
+ * Render one node: a block module's renderer first, then the core renderer,
616
+ * falling back to an empty string for an unregistered type.
617
+ */
740
618
  export function renderNode(node, context) {
619
+ const module = context.registry.modules.get(node.type);
620
+ if (module !== undefined)
621
+ return module.render(node, context);
741
622
  const renderer = RENDERERS[node.type] ?? NO_OP_RENDERER;
742
623
  return renderer(node, context);
743
624
  }
744
625
  /** True when a renderer exists for the type. */
745
- export function hasRenderer(type) {
746
- return RENDERERS[type] !== undefined;
626
+ export function hasRenderer(type, registry = DEFAULT_REGISTRY) {
627
+ return registry.modules.has(type) || RENDERERS[type] !== undefined;
747
628
  }
748
629
  export { element, nodeAttributes };
749
630
  //# sourceMappingURL=blocks.js.map