@react-x11/components 0.8.0 → 0.10.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 (721) hide show
  1. package/README.md +105 -38
  2. package/dist/charts/node.d.ts +12 -2
  3. package/dist/charts/node.d.ts.map +1 -1
  4. package/dist/charts/node.js +50 -16
  5. package/dist/charts/node.js.map +1 -1
  6. package/dist/charts/render.d.ts +12 -3
  7. package/dist/charts/render.d.ts.map +1 -1
  8. package/dist/charts/render.js +94 -25
  9. package/dist/charts/render.js.map +1 -1
  10. package/dist/code/index.d.ts.map +1 -1
  11. package/dist/code/index.js +3 -1
  12. package/dist/code/index.js.map +1 -1
  13. package/dist/code-editor/completion.d.ts.map +1 -1
  14. package/dist/code-editor/completion.js +3 -2
  15. package/dist/code-editor/completion.js.map +1 -1
  16. package/dist/code-editor/index.d.ts.map +1 -1
  17. package/dist/code-editor/index.js +19 -0
  18. package/dist/code-editor/index.js.map +1 -1
  19. package/dist/code-editor/node.d.ts +177 -7
  20. package/dist/code-editor/node.d.ts.map +1 -1
  21. package/dist/code-editor/node.js +1329 -164
  22. package/dist/code-editor/node.js.map +1 -1
  23. package/dist/code-language/languages/glsl.d.ts.map +1 -1
  24. package/dist/code-language/languages/glsl.js +10 -2
  25. package/dist/code-language/languages/glsl.js.map +1 -1
  26. package/dist/code-language/languages/javascript.d.ts.map +1 -1
  27. package/dist/code-language/languages/javascript.js +18 -3
  28. package/dist/code-language/languages/javascript.js.map +1 -1
  29. package/dist/code-language/languages/json.d.ts.map +1 -1
  30. package/dist/code-language/languages/json.js +10 -2
  31. package/dist/code-language/languages/json.js.map +1 -1
  32. package/dist/code-language/languages/shell.d.ts.map +1 -1
  33. package/dist/code-language/languages/shell.js +10 -2
  34. package/dist/code-language/languages/shell.js.map +1 -1
  35. package/dist/code-language/languages/sql.d.ts.map +1 -1
  36. package/dist/code-language/languages/sql.js +20 -2
  37. package/dist/code-language/languages/sql.js.map +1 -1
  38. package/dist/code-language/stream.d.ts +22 -0
  39. package/dist/code-language/stream.d.ts.map +1 -1
  40. package/dist/code-language/stream.js +259 -9
  41. package/dist/code-language/stream.js.map +1 -1
  42. package/dist/code-language/types.d.ts +5 -4
  43. package/dist/code-language/types.d.ts.map +1 -1
  44. package/dist/codeblock/index.d.ts +13 -2
  45. package/dist/codeblock/index.d.ts.map +1 -1
  46. package/dist/codeblock/index.js +20 -3
  47. package/dist/codeblock/index.js.map +1 -1
  48. package/dist/embed/client.d.ts +48 -3
  49. package/dist/embed/client.d.ts.map +1 -1
  50. package/dist/embed/client.js +79 -5
  51. package/dist/embed/client.js.map +1 -1
  52. package/dist/embed/index.d.ts +1 -1
  53. package/dist/embed/index.d.ts.map +1 -1
  54. package/dist/embed/index.js +1 -1
  55. package/dist/embed/index.js.map +1 -1
  56. package/dist/flow/draw.d.ts +50 -0
  57. package/dist/flow/draw.d.ts.map +1 -1
  58. package/dist/flow/draw.js +132 -33
  59. package/dist/flow/draw.js.map +1 -1
  60. package/dist/flow/gl/color.d.ts +13 -0
  61. package/dist/flow/gl/color.d.ts.map +1 -0
  62. package/dist/flow/gl/color.js +82 -0
  63. package/dist/flow/gl/color.js.map +1 -0
  64. package/dist/flow/gl/index.d.ts +60 -0
  65. package/dist/flow/gl/index.d.ts.map +1 -0
  66. package/dist/flow/gl/index.js +283 -0
  67. package/dist/flow/gl/index.js.map +1 -0
  68. package/dist/flow/gl/pack.d.ts +133 -0
  69. package/dist/flow/gl/pack.d.ts.map +1 -0
  70. package/dist/flow/gl/pack.js +408 -0
  71. package/dist/flow/gl/pack.js.map +1 -0
  72. package/dist/flow/gl/renderer.d.ts +95 -0
  73. package/dist/flow/gl/renderer.d.ts.map +1 -0
  74. package/dist/flow/gl/renderer.js +459 -0
  75. package/dist/flow/gl/renderer.js.map +1 -0
  76. package/dist/flow/gl/shaders.d.ts +79 -0
  77. package/dist/flow/gl/shaders.d.ts.map +1 -0
  78. package/dist/flow/gl/shaders.js +346 -0
  79. package/dist/flow/gl/shaders.js.map +1 -0
  80. package/dist/flow/gl/text.d.ts +318 -0
  81. package/dist/flow/gl/text.d.ts.map +1 -0
  82. package/dist/flow/gl/text.js +1103 -0
  83. package/dist/flow/gl/text.js.map +1 -0
  84. package/dist/flow/index.d.ts +1 -1
  85. package/dist/flow/index.d.ts.map +1 -1
  86. package/dist/flow/index.js +619 -64
  87. package/dist/flow/index.js.map +1 -1
  88. package/dist/flow/node.d.ts +621 -72
  89. package/dist/flow/node.d.ts.map +1 -1
  90. package/dist/flow/node.js +2253 -1018
  91. package/dist/flow/node.js.map +1 -1
  92. package/dist/flow/paint.d.ts +35 -0
  93. package/dist/flow/paint.d.ts.map +1 -0
  94. package/dist/flow/paint.js +393 -0
  95. package/dist/flow/paint.js.map +1 -0
  96. package/dist/flow/paths.d.ts +14 -0
  97. package/dist/flow/paths.d.ts.map +1 -1
  98. package/dist/flow/paths.js +45 -19
  99. package/dist/flow/paths.js.map +1 -1
  100. package/dist/flow/scene.d.ts +584 -0
  101. package/dist/flow/scene.d.ts.map +1 -0
  102. package/dist/flow/scene.js +1453 -0
  103. package/dist/flow/scene.js.map +1 -0
  104. package/dist/flow/types.d.ts +111 -1
  105. package/dist/flow/types.d.ts.map +1 -1
  106. package/dist/html/controls.d.ts +28 -0
  107. package/dist/html/controls.d.ts.map +1 -1
  108. package/dist/html/controls.js +52 -2
  109. package/dist/html/controls.js.map +1 -1
  110. package/dist/html/css/calc.d.ts +14 -0
  111. package/dist/html/css/calc.d.ts.map +1 -0
  112. package/dist/html/css/calc.js +344 -0
  113. package/dist/html/css/calc.js.map +1 -0
  114. package/dist/html/css/cascade.d.ts +240 -6
  115. package/dist/html/css/cascade.d.ts.map +1 -1
  116. package/dist/html/css/cascade.js +1327 -66
  117. package/dist/html/css/cascade.js.map +1 -1
  118. package/dist/html/css/color.d.ts +23 -0
  119. package/dist/html/css/color.d.ts.map +1 -0
  120. package/dist/html/css/color.js +740 -0
  121. package/dist/html/css/color.js.map +1 -0
  122. package/dist/html/css/content.d.ts +92 -0
  123. package/dist/html/css/content.d.ts.map +1 -0
  124. package/dist/html/css/content.js +388 -0
  125. package/dist/html/css/content.js.map +1 -0
  126. package/dist/html/css/counter-styles.d.ts +76 -0
  127. package/dist/html/css/counter-styles.d.ts.map +1 -0
  128. package/dist/html/css/counter-styles.js +893 -0
  129. package/dist/html/css/counter-styles.js.map +1 -0
  130. package/dist/html/css/decode.d.ts +12 -0
  131. package/dist/html/css/decode.d.ts.map +1 -0
  132. package/dist/html/css/decode.js +116 -0
  133. package/dist/html/css/decode.js.map +1 -0
  134. package/dist/html/css/parse.d.ts +110 -10
  135. package/dist/html/css/parse.d.ts.map +1 -1
  136. package/dist/html/css/parse.js +1473 -180
  137. package/dist/html/css/parse.js.map +1 -1
  138. package/dist/html/css/style.d.ts +498 -15
  139. package/dist/html/css/style.d.ts.map +1 -1
  140. package/dist/html/css/style.js +3698 -206
  141. package/dist/html/css/style.js.map +1 -1
  142. package/dist/html/css/ua.d.ts.map +1 -1
  143. package/dist/html/css/ua.js +57 -11
  144. package/dist/html/css/ua.js.map +1 -1
  145. package/dist/html/css/values.d.ts +37 -3
  146. package/dist/html/css/values.d.ts.map +1 -1
  147. package/dist/html/css/values.js +122 -48
  148. package/dist/html/css/values.js.map +1 -1
  149. package/dist/html/css/vars.d.ts +52 -0
  150. package/dist/html/css/vars.d.ts.map +1 -0
  151. package/dist/html/css/vars.js +358 -0
  152. package/dist/html/css/vars.js.map +1 -0
  153. package/dist/html/dom.d.ts +30 -4
  154. package/dist/html/dom.d.ts.map +1 -1
  155. package/dist/html/dom.js +278 -17
  156. package/dist/html/dom.js.map +1 -1
  157. package/dist/html/fonts.d.ts +106 -0
  158. package/dist/html/fonts.d.ts.map +1 -0
  159. package/dist/html/fonts.js +565 -0
  160. package/dist/html/fonts.js.map +1 -0
  161. package/dist/html/gif.d.ts +15 -0
  162. package/dist/html/gif.d.ts.map +1 -0
  163. package/dist/html/gif.js +229 -0
  164. package/dist/html/gif.js.map +1 -0
  165. package/dist/html/index.d.ts +50 -11
  166. package/dist/html/index.d.ts.map +1 -1
  167. package/dist/html/index.js +115 -9
  168. package/dist/html/index.js.map +1 -1
  169. package/dist/html/layout/block.d.ts +226 -3
  170. package/dist/html/layout/block.d.ts.map +1 -1
  171. package/dist/html/layout/block.js +2937 -197
  172. package/dist/html/layout/block.js.map +1 -1
  173. package/dist/html/layout/boxes.d.ts +340 -17
  174. package/dist/html/layout/boxes.d.ts.map +1 -1
  175. package/dist/html/layout/boxes.js +1714 -182
  176. package/dist/html/layout/boxes.js.map +1 -1
  177. package/dist/html/layout/cache.d.ts +58 -0
  178. package/dist/html/layout/cache.d.ts.map +1 -0
  179. package/dist/html/layout/cache.js +224 -0
  180. package/dist/html/layout/cache.js.map +1 -0
  181. package/dist/html/layout/collapse.d.ts +45 -0
  182. package/dist/html/layout/collapse.d.ts.map +1 -0
  183. package/dist/html/layout/collapse.js +246 -0
  184. package/dist/html/layout/collapse.js.map +1 -0
  185. package/dist/html/layout/css-grid.d.ts +7 -0
  186. package/dist/html/layout/css-grid.d.ts.map +1 -0
  187. package/dist/html/layout/css-grid.js +900 -0
  188. package/dist/html/layout/css-grid.js.map +1 -0
  189. package/dist/html/layout/flex.d.ts.map +1 -1
  190. package/dist/html/layout/flex.js +1025 -89
  191. package/dist/html/layout/flex.js.map +1 -1
  192. package/dist/html/layout/floats.d.ts +45 -6
  193. package/dist/html/layout/floats.d.ts.map +1 -1
  194. package/dist/html/layout/floats.js +113 -14
  195. package/dist/html/layout/floats.js.map +1 -1
  196. package/dist/html/layout/grid-lines.d.ts +39 -0
  197. package/dist/html/layout/grid-lines.d.ts.map +1 -0
  198. package/dist/html/layout/grid-lines.js +119 -0
  199. package/dist/html/layout/grid-lines.js.map +1 -0
  200. package/dist/html/layout/grid.d.ts +53 -0
  201. package/dist/html/layout/grid.d.ts.map +1 -0
  202. package/dist/html/layout/grid.js +153 -0
  203. package/dist/html/layout/grid.js.map +1 -0
  204. package/dist/html/layout/inline.d.ts +151 -1
  205. package/dist/html/layout/inline.d.ts.map +1 -1
  206. package/dist/html/layout/inline.js +3375 -174
  207. package/dist/html/layout/inline.js.map +1 -1
  208. package/dist/html/layout/shaping.d.ts +6 -0
  209. package/dist/html/layout/shaping.d.ts.map +1 -0
  210. package/dist/html/layout/shaping.js +100 -0
  211. package/dist/html/layout/shaping.js.map +1 -0
  212. package/dist/html/layout/table.d.ts +3 -0
  213. package/dist/html/layout/table.d.ts.map +1 -1
  214. package/dist/html/layout/table.js +681 -175
  215. package/dist/html/layout/table.js.map +1 -1
  216. package/dist/html/layout/tracks.d.ts +44 -0
  217. package/dist/html/layout/tracks.d.ts.map +1 -0
  218. package/dist/html/layout/tracks.js +349 -0
  219. package/dist/html/layout/tracks.js.map +1 -0
  220. package/dist/html/node.d.ts +172 -5
  221. package/dist/html/node.d.ts.map +1 -1
  222. package/dist/html/node.js +1336 -103
  223. package/dist/html/node.js.map +1 -1
  224. package/dist/html/paint.d.ts +92 -3
  225. package/dist/html/paint.d.ts.map +1 -1
  226. package/dist/html/paint.js +3503 -141
  227. package/dist/html/paint.js.map +1 -1
  228. package/dist/html/resources.d.ts +60 -14
  229. package/dist/html/resources.d.ts.map +1 -1
  230. package/dist/html/resources.js +122 -36
  231. package/dist/html/resources.js.map +1 -1
  232. package/dist/html/surfaces.d.ts +23 -0
  233. package/dist/html/surfaces.d.ts.map +1 -0
  234. package/dist/html/surfaces.js +68 -0
  235. package/dist/html/surfaces.js.map +1 -0
  236. package/dist/html/svg.d.ts +80 -0
  237. package/dist/html/svg.d.ts.map +1 -0
  238. package/dist/html/svg.js +435 -0
  239. package/dist/html/svg.js.map +1 -0
  240. package/dist/html/url.d.ts +23 -0
  241. package/dist/html/url.d.ts.map +1 -0
  242. package/dist/html/url.js +80 -0
  243. package/dist/html/url.js.map +1 -0
  244. package/dist/index.d.ts +2 -2
  245. package/dist/index.d.ts.map +1 -1
  246. package/dist/index.js +1 -1
  247. package/dist/index.js.map +1 -1
  248. package/dist/internal/collate.d.ts +3 -0
  249. package/dist/internal/collate.d.ts.map +1 -0
  250. package/dist/internal/collate.js +11 -0
  251. package/dist/internal/collate.js.map +1 -0
  252. package/dist/{markdown → internal/markdown}/ast.d.ts +23 -0
  253. package/dist/internal/markdown/ast.d.ts.map +1 -0
  254. package/dist/internal/markdown/ast.js +22 -0
  255. package/dist/internal/markdown/ast.js.map +1 -0
  256. package/dist/internal/markdown/parse.d.ts.map +1 -0
  257. package/dist/{markdown → internal/markdown}/parse.js +221 -30
  258. package/dist/internal/markdown/parse.js.map +1 -0
  259. package/dist/internal/markdown/stringify.d.ts +4 -0
  260. package/dist/internal/markdown/stringify.d.ts.map +1 -0
  261. package/dist/internal/markdown/stringify.js +684 -0
  262. package/dist/internal/markdown/stringify.js.map +1 -0
  263. package/dist/internal/markdown/tags.d.ts.map +1 -0
  264. package/dist/internal/markdown/tags.js.map +1 -0
  265. package/dist/internal/prewarm.d.ts +18 -0
  266. package/dist/internal/prewarm.d.ts.map +1 -0
  267. package/dist/internal/prewarm.js +42 -0
  268. package/dist/internal/prewarm.js.map +1 -0
  269. package/dist/internal/scroll.d.ts +3 -2
  270. package/dist/internal/scroll.d.ts.map +1 -1
  271. package/dist/internal/scroll.js +1 -0
  272. package/dist/internal/scroll.js.map +1 -1
  273. package/dist/internal/sdf.d.ts +20 -0
  274. package/dist/internal/sdf.d.ts.map +1 -0
  275. package/dist/internal/sdf.js +216 -0
  276. package/dist/internal/sdf.js.map +1 -0
  277. package/dist/internal/splice.d.ts +12 -0
  278. package/dist/internal/splice.d.ts.map +1 -0
  279. package/dist/internal/splice.js +23 -0
  280. package/dist/internal/splice.js.map +1 -0
  281. package/dist/internal/window.d.ts +12 -0
  282. package/dist/internal/window.d.ts.map +1 -1
  283. package/dist/internal/window.js +23 -6
  284. package/dist/internal/window.js.map +1 -1
  285. package/dist/maps/anchors.d.ts +103 -0
  286. package/dist/maps/anchors.d.ts.map +1 -0
  287. package/dist/maps/anchors.js +790 -0
  288. package/dist/maps/anchors.js.map +1 -0
  289. package/dist/maps/controller.d.ts +340 -0
  290. package/dist/maps/controller.d.ts.map +1 -0
  291. package/dist/maps/controller.js +822 -0
  292. package/dist/maps/controller.js.map +1 -0
  293. package/dist/maps/gl/buckets.d.ts +99 -0
  294. package/dist/maps/gl/buckets.d.ts.map +1 -0
  295. package/dist/maps/gl/buckets.js +365 -0
  296. package/dist/maps/gl/buckets.js.map +1 -0
  297. package/dist/maps/gl/build-worker.d.ts +15 -0
  298. package/dist/maps/gl/build-worker.d.ts.map +1 -0
  299. package/dist/maps/gl/build-worker.js +44 -0
  300. package/dist/maps/gl/build-worker.js.map +1 -0
  301. package/dist/maps/gl/color.d.ts +8 -0
  302. package/dist/maps/gl/color.d.ts.map +1 -0
  303. package/dist/maps/gl/color.js +57 -0
  304. package/dist/maps/gl/color.js.map +1 -0
  305. package/dist/maps/gl/cover.d.ts +70 -0
  306. package/dist/maps/gl/cover.d.ts.map +1 -0
  307. package/dist/maps/gl/cover.js +137 -0
  308. package/dist/maps/gl/cover.js.map +1 -0
  309. package/dist/maps/gl/index.d.ts +3 -0
  310. package/dist/maps/gl/index.d.ts.map +1 -0
  311. package/dist/maps/gl/index.js +20 -0
  312. package/dist/maps/gl/index.js.map +1 -0
  313. package/dist/maps/gl/markers.d.ts +28 -0
  314. package/dist/maps/gl/markers.d.ts.map +1 -0
  315. package/dist/maps/gl/markers.js +60 -0
  316. package/dist/maps/gl/markers.js.map +1 -0
  317. package/dist/maps/gl/overlays.d.ts +68 -0
  318. package/dist/maps/gl/overlays.d.ts.map +1 -0
  319. package/dist/maps/gl/overlays.js +300 -0
  320. package/dist/maps/gl/overlays.js.map +1 -0
  321. package/dist/maps/gl/pane.d.ts +12 -0
  322. package/dist/maps/gl/pane.d.ts.map +1 -0
  323. package/dist/maps/gl/pane.js +37 -0
  324. package/dist/maps/gl/pane.js.map +1 -0
  325. package/dist/maps/gl/placement.d.ts +124 -0
  326. package/dist/maps/gl/placement.d.ts.map +1 -0
  327. package/dist/maps/gl/placement.js +642 -0
  328. package/dist/maps/gl/placement.js.map +1 -0
  329. package/dist/maps/gl/renderer.d.ts +384 -0
  330. package/dist/maps/gl/renderer.d.ts.map +1 -0
  331. package/dist/maps/gl/renderer.js +1184 -0
  332. package/dist/maps/gl/renderer.js.map +1 -0
  333. package/dist/maps/gl/shaders.d.ts +121 -0
  334. package/dist/maps/gl/shaders.d.ts.map +1 -0
  335. package/dist/maps/gl/shaders.js +453 -0
  336. package/dist/maps/gl/shaders.js.map +1 -0
  337. package/dist/maps/gl/store.d.ts +125 -0
  338. package/dist/maps/gl/store.d.ts.map +1 -0
  339. package/dist/maps/gl/store.js +512 -0
  340. package/dist/maps/gl/store.js.map +1 -0
  341. package/dist/maps/gl/text.d.ts +283 -0
  342. package/dist/maps/gl/text.d.ts.map +1 -0
  343. package/dist/maps/gl/text.js +698 -0
  344. package/dist/maps/gl/text.js.map +1 -0
  345. package/dist/maps/gl/view.d.ts +345 -0
  346. package/dist/maps/gl/view.d.ts.map +1 -0
  347. package/dist/maps/gl/view.js +1209 -0
  348. package/dist/maps/gl/view.js.map +1 -0
  349. package/dist/maps/icons.d.ts +32 -0
  350. package/dist/maps/icons.d.ts.map +1 -0
  351. package/dist/maps/icons.js +151 -0
  352. package/dist/maps/icons.js.map +1 -0
  353. package/dist/maps/index.d.ts +3 -1
  354. package/dist/maps/index.d.ts.map +1 -1
  355. package/dist/maps/index.js +218 -52
  356. package/dist/maps/index.js.map +1 -1
  357. package/dist/maps/labels.d.ts +91 -18
  358. package/dist/maps/labels.d.ts.map +1 -1
  359. package/dist/maps/labels.js +376 -140
  360. package/dist/maps/labels.js.map +1 -1
  361. package/dist/maps/node.d.ts +179 -56
  362. package/dist/maps/node.d.ts.map +1 -1
  363. package/dist/maps/node.js +663 -537
  364. package/dist/maps/node.js.map +1 -1
  365. package/dist/maps/overlay.d.ts +72 -9
  366. package/dist/maps/overlay.d.ts.map +1 -1
  367. package/dist/maps/overlay.js +108 -28
  368. package/dist/maps/overlay.js.map +1 -1
  369. package/dist/maps/paint.d.ts +3 -0
  370. package/dist/maps/paint.d.ts.map +1 -1
  371. package/dist/maps/paint.js.map +1 -1
  372. package/dist/maps/proj.d.ts +62 -0
  373. package/dist/maps/proj.d.ts.map +1 -1
  374. package/dist/maps/proj.js +101 -0
  375. package/dist/maps/proj.js.map +1 -1
  376. package/dist/maps/renderer.d.ts +69 -0
  377. package/dist/maps/renderer.d.ts.map +1 -0
  378. package/dist/maps/renderer.js +66 -0
  379. package/dist/maps/renderer.js.map +1 -0
  380. package/dist/maps/sources.d.ts +30 -6
  381. package/dist/maps/sources.d.ts.map +1 -1
  382. package/dist/maps/sources.js +22 -3
  383. package/dist/maps/sources.js.map +1 -1
  384. package/dist/maps/style.d.ts +35 -0
  385. package/dist/maps/style.d.ts.map +1 -1
  386. package/dist/maps/style.js.map +1 -1
  387. package/dist/maps/styles.d.ts +12 -0
  388. package/dist/maps/styles.d.ts.map +1 -1
  389. package/dist/maps/styles.js +120 -6
  390. package/dist/maps/styles.js.map +1 -1
  391. package/dist/maps/theme.d.ts +19 -0
  392. package/dist/maps/theme.d.ts.map +1 -0
  393. package/dist/maps/theme.js +44 -0
  394. package/dist/maps/theme.js.map +1 -0
  395. package/dist/maps/tiles.d.ts +147 -27
  396. package/dist/maps/tiles.d.ts.map +1 -1
  397. package/dist/maps/tiles.js +221 -54
  398. package/dist/maps/tiles.js.map +1 -1
  399. package/dist/maps/types.d.ts +213 -21
  400. package/dist/maps/types.d.ts.map +1 -1
  401. package/dist/markdown/expressions.d.ts +1 -1
  402. package/dist/markdown/expressions.d.ts.map +1 -1
  403. package/dist/markdown/expressions.js.map +1 -1
  404. package/dist/markdown/index.d.ts +7 -6
  405. package/dist/markdown/index.d.ts.map +1 -1
  406. package/dist/markdown/index.js +121 -50
  407. package/dist/markdown/index.js.map +1 -1
  408. package/dist/markdown/spans.d.ts +1 -1
  409. package/dist/markdown/spans.d.ts.map +1 -1
  410. package/dist/markdown/spans.js +6 -0
  411. package/dist/markdown/spans.js.map +1 -1
  412. package/dist/media-player/index.d.ts +11 -3
  413. package/dist/media-player/index.d.ts.map +1 -1
  414. package/dist/media-player/index.js +13 -2
  415. package/dist/media-player/index.js.map +1 -1
  416. package/dist/qml/containers.d.ts.map +1 -1
  417. package/dist/qml/containers.js +6 -1
  418. package/dist/qml/containers.js.map +1 -1
  419. package/dist/qml/interaction.d.ts.map +1 -1
  420. package/dist/qml/interaction.js +38 -5
  421. package/dist/qml/interaction.js.map +1 -1
  422. package/dist/qml/layouts.d.ts.map +1 -1
  423. package/dist/qml/layouts.js +21 -6
  424. package/dist/qml/layouts.js.map +1 -1
  425. package/dist/qml/qtquick.d.ts.map +1 -1
  426. package/dist/qml/qtquick.js +9 -2
  427. package/dist/qml/qtquick.js.map +1 -1
  428. package/dist/qml/react.d.ts.map +1 -1
  429. package/dist/qml/react.js +9 -7
  430. package/dist/qml/react.js.map +1 -1
  431. package/dist/reorder/clock.d.ts +7 -0
  432. package/dist/reorder/clock.d.ts.map +1 -0
  433. package/dist/reorder/clock.js +26 -0
  434. package/dist/reorder/clock.js.map +1 -0
  435. package/dist/reorder/index.d.ts +25 -3
  436. package/dist/reorder/index.d.ts.map +1 -1
  437. package/dist/reorder/index.js +64 -19
  438. package/dist/reorder/index.js.map +1 -1
  439. package/dist/rich-text-editor/clipboard.d.ts +23 -0
  440. package/dist/rich-text-editor/clipboard.d.ts.map +1 -0
  441. package/dist/rich-text-editor/clipboard.js +307 -0
  442. package/dist/rich-text-editor/clipboard.js.map +1 -0
  443. package/dist/rich-text-editor/collab.d.ts +32 -0
  444. package/dist/rich-text-editor/collab.d.ts.map +1 -0
  445. package/dist/rich-text-editor/collab.js +55 -0
  446. package/dist/rich-text-editor/collab.js.map +1 -0
  447. package/dist/rich-text-editor/commands.d.ts +50 -0
  448. package/dist/rich-text-editor/commands.d.ts.map +1 -0
  449. package/dist/rich-text-editor/commands.js +376 -0
  450. package/dist/rich-text-editor/commands.js.map +1 -0
  451. package/dist/rich-text-editor/drag.d.ts +68 -0
  452. package/dist/rich-text-editor/drag.d.ts.map +1 -0
  453. package/dist/rich-text-editor/drag.js +148 -0
  454. package/dist/rich-text-editor/drag.js.map +1 -0
  455. package/dist/rich-text-editor/html.d.ts +145 -0
  456. package/dist/rich-text-editor/html.d.ts.map +1 -0
  457. package/dist/rich-text-editor/html.js +516 -0
  458. package/dist/rich-text-editor/html.js.map +1 -0
  459. package/dist/rich-text-editor/index.d.ts +252 -0
  460. package/dist/rich-text-editor/index.d.ts.map +1 -0
  461. package/dist/rich-text-editor/index.js +856 -0
  462. package/dist/rich-text-editor/index.js.map +1 -0
  463. package/dist/rich-text-editor/inline.d.ts +94 -0
  464. package/dist/rich-text-editor/inline.d.ts.map +1 -0
  465. package/dist/rich-text-editor/inline.js +252 -0
  466. package/dist/rich-text-editor/inline.js.map +1 -0
  467. package/dist/rich-text-editor/keymap.d.ts +71 -0
  468. package/dist/rich-text-editor/keymap.d.ts.map +1 -0
  469. package/dist/rich-text-editor/keymap.js +394 -0
  470. package/dist/rich-text-editor/keymap.js.map +1 -0
  471. package/dist/rich-text-editor/keys.d.ts +40 -0
  472. package/dist/rich-text-editor/keys.d.ts.map +1 -0
  473. package/dist/rich-text-editor/keys.js +202 -0
  474. package/dist/rich-text-editor/keys.js.map +1 -0
  475. package/dist/rich-text-editor/look.d.ts +71 -0
  476. package/dist/rich-text-editor/look.d.ts.map +1 -0
  477. package/dist/rich-text-editor/look.js +342 -0
  478. package/dist/rich-text-editor/look.js.map +1 -0
  479. package/dist/rich-text-editor/markdown.d.ts +18 -0
  480. package/dist/rich-text-editor/markdown.d.ts.map +1 -0
  481. package/dist/rich-text-editor/markdown.js +496 -0
  482. package/dist/rich-text-editor/markdown.js.map +1 -0
  483. package/dist/rich-text-editor/marks.d.ts +9 -0
  484. package/dist/rich-text-editor/marks.d.ts.map +1 -0
  485. package/dist/rich-text-editor/marks.js +83 -0
  486. package/dist/rich-text-editor/marks.js.map +1 -0
  487. package/dist/rich-text-editor/nodes.d.ts +135 -0
  488. package/dist/rich-text-editor/nodes.d.ts.map +1 -0
  489. package/dist/rich-text-editor/nodes.js +397 -0
  490. package/dist/rich-text-editor/nodes.js.map +1 -0
  491. package/dist/rich-text-editor/render.d.ts +68 -0
  492. package/dist/rich-text-editor/render.d.ts.map +1 -0
  493. package/dist/rich-text-editor/render.js +518 -0
  494. package/dist/rich-text-editor/render.js.map +1 -0
  495. package/dist/rich-text-editor/schema.d.ts +16 -0
  496. package/dist/rich-text-editor/schema.d.ts.map +1 -0
  497. package/dist/rich-text-editor/schema.js +386 -0
  498. package/dist/rich-text-editor/schema.js.map +1 -0
  499. package/dist/rich-text-editor/store.d.ts +11 -0
  500. package/dist/rich-text-editor/store.d.ts.map +1 -0
  501. package/dist/rich-text-editor/store.js +43 -0
  502. package/dist/rich-text-editor/store.js.map +1 -0
  503. package/dist/rich-text-editor/suggest.d.ts +127 -0
  504. package/dist/rich-text-editor/suggest.d.ts.map +1 -0
  505. package/dist/rich-text-editor/suggest.js +0 -0
  506. package/dist/rich-text-editor/suggest.js.map +1 -0
  507. package/dist/rich-text-editor/tables.d.ts +41 -0
  508. package/dist/rich-text-editor/tables.d.ts.map +1 -0
  509. package/dist/rich-text-editor/tables.js +204 -0
  510. package/dist/rich-text-editor/tables.js.map +1 -0
  511. package/dist/rich-text-editor/toolbar.d.ts +58 -0
  512. package/dist/rich-text-editor/toolbar.d.ts.map +1 -0
  513. package/dist/rich-text-editor/toolbar.js +548 -0
  514. package/dist/rich-text-editor/toolbar.js.map +1 -0
  515. package/dist/rich-text-editor/view.d.ts +368 -0
  516. package/dist/rich-text-editor/view.d.ts.map +1 -0
  517. package/dist/rich-text-editor/view.js +1968 -0
  518. package/dist/rich-text-editor/view.js.map +1 -0
  519. package/dist/rich-text-editor/virtual.d.ts +54 -0
  520. package/dist/rich-text-editor/virtual.d.ts.map +1 -0
  521. package/dist/rich-text-editor/virtual.js +279 -0
  522. package/dist/rich-text-editor/virtual.js.map +1 -0
  523. package/dist/richtext/node.d.ts +71 -4
  524. package/dist/richtext/node.d.ts.map +1 -1
  525. package/dist/richtext/node.js +233 -28
  526. package/dist/richtext/node.js.map +1 -1
  527. package/dist/richtext/runs.d.ts +13 -8
  528. package/dist/richtext/runs.d.ts.map +1 -1
  529. package/dist/richtext/runs.js +18 -8
  530. package/dist/richtext/runs.js.map +1 -1
  531. package/dist/table/index.d.ts.map +1 -1
  532. package/dist/table/index.js +23 -0
  533. package/dist/table/index.js.map +1 -1
  534. package/dist/table/rows.d.ts +3 -2
  535. package/dist/table/rows.d.ts.map +1 -1
  536. package/dist/table/rows.js +20 -6
  537. package/dist/table/rows.js.map +1 -1
  538. package/dist/terminal/backends.d.ts +4 -1
  539. package/dist/terminal/backends.d.ts.map +1 -1
  540. package/dist/terminal/backends.js.map +1 -1
  541. package/dist/terminal/index.d.ts +18 -7
  542. package/dist/terminal/index.d.ts.map +1 -1
  543. package/dist/terminal/index.js +32 -11
  544. package/dist/terminal/index.js.map +1 -1
  545. package/dist/terminal/vt/pty.d.ts +13 -2
  546. package/dist/terminal/vt/pty.d.ts.map +1 -1
  547. package/dist/terminal/vt/pty.js +18 -3
  548. package/dist/terminal/vt/pty.js.map +1 -1
  549. package/dist/terminal-output/index.d.ts.map +1 -1
  550. package/dist/terminal-output/index.js +6 -1
  551. package/dist/terminal-output/index.js.map +1 -1
  552. package/dist/three/canvas.d.ts.map +1 -1
  553. package/dist/three/canvas.js +85 -7
  554. package/dist/three/canvas.js.map +1 -1
  555. package/dist/three/events.d.ts +22 -4
  556. package/dist/three/events.d.ts.map +1 -1
  557. package/dist/three/events.js +34 -4
  558. package/dist/three/events.js.map +1 -1
  559. package/dist/tree/index.d.ts.map +1 -1
  560. package/dist/tree/index.js +17 -0
  561. package/dist/tree/index.js.map +1 -1
  562. package/package.json +59 -31
  563. package/src/charts/node.ts +68 -28
  564. package/src/charts/render.ts +120 -30
  565. package/src/code/index.ts +3 -1
  566. package/src/code-editor/completion.ts +3 -2
  567. package/src/code-editor/index.ts +19 -0
  568. package/src/code-editor/node.ts +1574 -184
  569. package/src/code-language/languages/glsl.ts +12 -2
  570. package/src/code-language/languages/javascript.ts +21 -4
  571. package/src/code-language/languages/json.ts +12 -2
  572. package/src/code-language/languages/shell.ts +12 -2
  573. package/src/code-language/languages/sql.ts +22 -2
  574. package/src/code-language/stream.ts +257 -17
  575. package/src/code-language/types.ts +5 -4
  576. package/src/codeblock/index.ts +20 -3
  577. package/src/embed/client.ts +102 -8
  578. package/src/embed/index.ts +2 -0
  579. package/src/flow/draw.ts +167 -41
  580. package/src/flow/gl/color.ts +85 -0
  581. package/src/flow/gl/index.ts +342 -0
  582. package/src/flow/gl/pack.ts +585 -0
  583. package/src/flow/gl/renderer.ts +679 -0
  584. package/src/flow/gl/shaders.ts +371 -0
  585. package/src/flow/gl/text.ts +1295 -0
  586. package/src/flow/index.ts +794 -67
  587. package/src/flow/node.ts +2496 -1256
  588. package/src/flow/paint.ts +511 -0
  589. package/src/flow/paths.ts +80 -15
  590. package/src/flow/scene.ts +2199 -0
  591. package/src/flow/types.ts +113 -1
  592. package/src/html/controls.ts +73 -2
  593. package/src/html/css/calc.ts +385 -0
  594. package/src/html/css/cascade.ts +1403 -62
  595. package/src/html/css/color.ts +755 -0
  596. package/src/html/css/content.ts +417 -0
  597. package/src/html/css/counter-styles.ts +973 -0
  598. package/src/html/css/decode.ts +130 -0
  599. package/src/html/css/parse.ts +1514 -160
  600. package/src/html/css/style.ts +4102 -222
  601. package/src/html/css/ua.ts +58 -12
  602. package/src/html/css/values.ts +150 -50
  603. package/src/html/css/vars.ts +348 -0
  604. package/src/html/dom.ts +284 -17
  605. package/src/html/fonts.ts +641 -0
  606. package/src/html/gif.ts +233 -0
  607. package/src/html/index.ts +180 -20
  608. package/src/html/layout/block.ts +3456 -230
  609. package/src/html/layout/boxes.ts +2100 -190
  610. package/src/html/layout/cache.ts +289 -0
  611. package/src/html/layout/collapse.ts +317 -0
  612. package/src/html/layout/css-grid.ts +1063 -0
  613. package/src/html/layout/flex.ts +1115 -106
  614. package/src/html/layout/floats.ts +128 -14
  615. package/src/html/layout/grid-lines.ts +141 -0
  616. package/src/html/layout/grid.ts +181 -0
  617. package/src/html/layout/inline.ts +3943 -192
  618. package/src/html/layout/shaping.ts +140 -0
  619. package/src/html/layout/table.ts +696 -186
  620. package/src/html/layout/tracks.ts +437 -0
  621. package/src/html/node.ts +1486 -121
  622. package/src/html/paint.ts +4293 -169
  623. package/src/html/resources.ts +161 -50
  624. package/src/html/surfaces.ts +81 -0
  625. package/src/html/svg.ts +493 -0
  626. package/src/html/url.ts +86 -0
  627. package/src/index.ts +4 -0
  628. package/src/internal/collate.ts +12 -0
  629. package/src/{markdown → internal/markdown}/ast.ts +35 -7
  630. package/src/{markdown → internal/markdown}/parse.ts +288 -35
  631. package/src/internal/markdown/stringify.ts +772 -0
  632. package/src/internal/prewarm.ts +45 -0
  633. package/src/internal/scroll.ts +5 -3
  634. package/src/internal/sdf.ts +227 -0
  635. package/src/internal/splice.ts +25 -0
  636. package/src/internal/window.ts +36 -5
  637. package/src/maps/anchors.ts +913 -0
  638. package/src/maps/controller.ts +1084 -0
  639. package/src/maps/gl/buckets.ts +461 -0
  640. package/src/maps/gl/build-worker.ts +66 -0
  641. package/src/maps/gl/color.ts +62 -0
  642. package/src/maps/gl/cover.ts +205 -0
  643. package/src/maps/gl/index.ts +23 -0
  644. package/src/maps/gl/markers.ts +83 -0
  645. package/src/maps/gl/overlays.ts +379 -0
  646. package/src/maps/gl/pane.ts +42 -0
  647. package/src/maps/gl/placement.ts +968 -0
  648. package/src/maps/gl/renderer.ts +1660 -0
  649. package/src/maps/gl/shaders.ts +489 -0
  650. package/src/maps/gl/store.ts +615 -0
  651. package/src/maps/gl/text.ts +868 -0
  652. package/src/maps/gl/view.ts +1489 -0
  653. package/src/maps/icons.ts +183 -0
  654. package/src/maps/index.ts +274 -81
  655. package/src/maps/labels.ts +457 -144
  656. package/src/maps/node.ts +832 -665
  657. package/src/maps/overlay.ts +148 -43
  658. package/src/maps/paint.ts +3 -0
  659. package/src/maps/proj.ts +118 -0
  660. package/src/maps/renderer.ts +155 -0
  661. package/src/maps/sources.ts +43 -6
  662. package/src/maps/style.ts +32 -0
  663. package/src/maps/styles.ts +215 -4
  664. package/src/maps/theme.ts +51 -0
  665. package/src/maps/tiles.ts +253 -62
  666. package/src/maps/types.ts +213 -21
  667. package/src/markdown/expressions.ts +5 -1
  668. package/src/markdown/index.ts +163 -78
  669. package/src/markdown/spans.ts +6 -1
  670. package/src/media-player/index.ts +18 -4
  671. package/src/qml/containers.tsx +6 -1
  672. package/src/qml/interaction.tsx +42 -5
  673. package/src/qml/layouts.tsx +21 -6
  674. package/src/qml/qtquick.tsx +9 -2
  675. package/src/qml/react.tsx +7 -5
  676. package/src/reorder/clock.ts +27 -0
  677. package/src/reorder/index.ts +100 -27
  678. package/src/rich-text-editor/clipboard.ts +439 -0
  679. package/src/rich-text-editor/collab.ts +91 -0
  680. package/src/rich-text-editor/commands.ts +448 -0
  681. package/src/rich-text-editor/dom-globals.d.ts +23 -0
  682. package/src/rich-text-editor/drag.ts +211 -0
  683. package/src/rich-text-editor/html.ts +619 -0
  684. package/src/rich-text-editor/index.ts +1364 -0
  685. package/src/rich-text-editor/inline.ts +345 -0
  686. package/src/rich-text-editor/keymap.ts +510 -0
  687. package/src/rich-text-editor/keys.ts +228 -0
  688. package/src/rich-text-editor/look.ts +427 -0
  689. package/src/rich-text-editor/markdown.ts +653 -0
  690. package/src/rich-text-editor/marks.ts +101 -0
  691. package/src/rich-text-editor/nodes.ts +497 -0
  692. package/src/rich-text-editor/render.ts +837 -0
  693. package/src/rich-text-editor/schema.ts +431 -0
  694. package/src/rich-text-editor/store.ts +39 -0
  695. package/src/rich-text-editor/suggest.ts +597 -0
  696. package/src/rich-text-editor/tables.ts +272 -0
  697. package/src/rich-text-editor/toolbar.ts +724 -0
  698. package/src/rich-text-editor/view.ts +2287 -0
  699. package/src/rich-text-editor/virtual.ts +372 -0
  700. package/src/richtext/node.ts +294 -44
  701. package/src/richtext/runs.ts +23 -12
  702. package/src/table/index.ts +29 -0
  703. package/src/table/rows.ts +18 -8
  704. package/src/terminal/backends.ts +4 -1
  705. package/src/terminal/index.ts +47 -15
  706. package/src/terminal/vt/pty.ts +16 -2
  707. package/src/terminal-output/index.ts +6 -1
  708. package/src/three/canvas.ts +102 -8
  709. package/src/three/events.ts +49 -9
  710. package/src/tree/index.ts +19 -0
  711. package/dist/markdown/ast.d.ts.map +0 -1
  712. package/dist/markdown/ast.js +0 -17
  713. package/dist/markdown/ast.js.map +0 -1
  714. package/dist/markdown/parse.d.ts.map +0 -1
  715. package/dist/markdown/parse.js.map +0 -1
  716. package/dist/markdown/tags.d.ts.map +0 -1
  717. package/dist/markdown/tags.js.map +0 -1
  718. /package/dist/{markdown → internal/markdown}/parse.d.ts +0 -0
  719. /package/dist/{markdown → internal/markdown}/tags.d.ts +0 -0
  720. /package/dist/{markdown → internal/markdown}/tags.js +0 -0
  721. /package/src/{markdown → internal/markdown}/tags.ts +0 -0
@@ -0,0 +1,837 @@
1
+ // The document, rendered: one React element per block, keyed by the view's
2
+ // block keys, composed from `<box>` and the editor's own text element.
3
+ //
4
+ // **Composition, not a drawn document**, by the rule AGENTS.md sets for the
5
+ // question: the viewport is a scroll rather than a transform, and a
6
+ // document's block flow — paragraphs, lists, quotes, a table's rows — is
7
+ // what flexbox already lays out, which is how `<Markdown>` draws the same
8
+ // content. What composition buys an editor in particular is the extension
9
+ // seam: a node view is a React component in the flow, not a picture of one.
10
+ //
11
+ // **What re-renders, and why nothing else does.** A block is a memoized
12
+ // component keyed by its node's *identity* — ProseMirror shares every node
13
+ // an edit did not touch, so typing in one paragraph re-renders that
14
+ // paragraph and the chain of containers above it, and nothing else. A block
15
+ // never receives its position: positions shift on every keystroke before
16
+ // them, so a block asks the view for its position when it needs one
17
+ // (`getPos`). Decorations and a node selection reach a block through its own
18
+ // subscription (`./store.ts`), so neither re-renders the document.
19
+ import React, { useCallback, useMemo, useSyncExternalStore } from 'react';
20
+ import type { ComponentType, ReactElement, ReactNode } from 'react';
21
+ import { Icon } from 'react-x11';
22
+ import type { DrawnNode, MouseEvent as X11MouseEvent } from 'react-x11';
23
+ import type { Style } from 'react-x11/style';
24
+ import type { Node as PMNode } from 'prosemirror-model';
25
+
26
+ import { codeBlockStyle, codeTextStyle } from '../codeblock/index.js';
27
+ import { hx } from '../internal/hx.js';
28
+ import { setTaskChecked } from './commands.js';
29
+ import { buildInline } from './inline.js';
30
+ import type { InlineDecoration, InlineWidget } from './inline.js';
31
+ import { domTagOf } from './look.js';
32
+ import type { BlockContext, EditorLook } from './look.js';
33
+ import { TEXT_ELEMENT } from './nodes.js';
34
+ import type { KeyedStore } from './store.js';
35
+ import type { BlockDecorations, RichEditorView } from './view.js';
36
+
37
+ const h = React.createElement;
38
+
39
+ /** What an image standing alone in a paragraph is handed to render — the
40
+ * editor draws no remote bitmap, the same line `<Markdown>` holds. */
41
+ export interface ImageInfo {
42
+ src: string;
43
+ alt: string | null;
44
+ title: string | null;
45
+ }
46
+
47
+ /** What a node view is given. */
48
+ export interface NodeViewProps {
49
+ node: PMNode;
50
+ /** Where the node is now. A function, because a node's position moves
51
+ * with every edit before it and its view is not re-rendered for that. */
52
+ getPos(): number | undefined;
53
+ /** A node selection has selected this node. */
54
+ selected: boolean;
55
+ /** The node's content, rendered — editable text for a textblock, blocks
56
+ * for a container — for the view to place where it goes. Absent for a
57
+ * leaf, which has none. */
58
+ children?: ReactNode;
59
+ /** Merge attributes into the node — a checkbox's state, an embed's size. */
60
+ updateAttributes(attrs: Record<string, unknown>): void;
61
+ editable: boolean;
62
+ view: RichEditorView;
63
+ }
64
+
65
+ /** What a table measures its cells with: the app's font manager, whose
66
+ * `layout` takes runs in the logical sizes styles are written in and
67
+ * answers in the same units. Null on the mock backend, which has none. */
68
+ export interface CellFonts {
69
+ layout(
70
+ runs: readonly object[],
71
+ style: { family?: string; size?: number },
72
+ ): { width: number };
73
+ }
74
+
75
+ /** Everything a block renders with. One object per look and seam set, so a
76
+ * memoized block compares it by identity. */
77
+ export interface RenderContext {
78
+ view: RichEditorView;
79
+ look: EditorLook;
80
+ editable: boolean;
81
+ fonts?: CellFonts | null;
82
+ nodeViews?: Readonly<Record<string, ComponentType<NodeViewProps>>>;
83
+ renderImage?: (image: ImageInfo) => ReactNode;
84
+ }
85
+
86
+ const PLAIN: BlockContext = { quote: false, header: false };
87
+ const QUOTED: BlockContext = { quote: true, header: false };
88
+ const HEADER: BlockContext = { quote: false, header: true };
89
+ const QUOTED_HEADER: BlockContext = { quote: true, header: true };
90
+
91
+ const NO_DECORATIONS: readonly InlineDecoration[] = [];
92
+ const NO_WIDGETS: readonly InlineWidget[] = [];
93
+
94
+ function useKeyed<T>(store: KeyedStore<T>, key: string): T | undefined {
95
+ const subscribe = useCallback(
96
+ (fn: () => void) => store.subscribe(key, fn),
97
+ [store, key],
98
+ );
99
+ const get = useCallback(() => store.get(key), [store, key]);
100
+ return useSyncExternalStore(subscribe, get, get);
101
+ }
102
+
103
+ type Role =
104
+ | 'textblock'
105
+ | 'quote'
106
+ | 'list'
107
+ | 'table'
108
+ | 'rule'
109
+ | 'image'
110
+ | 'atom'
111
+ | 'container';
112
+
113
+ /** What a block is, for drawing: by name (the reference schema's, then
114
+ * TipTap's), then by what its own `toDOM` says it is. */
115
+ function roleOf(node: PMNode): Role {
116
+ if (node.isTextblock) return 'textblock';
117
+ const name = node.type.name;
118
+ const table = node.type.spec.tableRole;
119
+ if (table === 'table') return 'table';
120
+ switch (name) {
121
+ case 'blockquote':
122
+ return 'quote';
123
+ case 'bullet_list':
124
+ case 'ordered_list':
125
+ case 'bulletList':
126
+ case 'orderedList':
127
+ case 'taskList':
128
+ return 'list';
129
+ case 'horizontal_rule':
130
+ case 'horizontalRule':
131
+ return 'rule';
132
+ case 'image':
133
+ return 'image';
134
+ }
135
+ const tag = domTagOf(node.type.spec, node)?.tag;
136
+ if (tag === 'blockquote') return 'quote';
137
+ if (tag === 'ul' || tag === 'ol') return 'list';
138
+ if (tag === 'hr') return 'rule';
139
+ if (tag === 'img') return 'image';
140
+ if (tag === 'table') return 'table';
141
+ return node.isLeaf ? 'atom' : 'container';
142
+ }
143
+
144
+ function isOrdered(list: PMNode): boolean {
145
+ const name = list.type.name;
146
+ if (name === 'ordered_list' || name === 'orderedList') return true;
147
+ return domTagOf(list.type.spec, list)?.tag === 'ol';
148
+ }
149
+
150
+ /**
151
+ * The element last made for a block, by its node. A block whose node, key
152
+ * and surroundings are what they were gets that element back, and React
153
+ * bails out of an element it has rendered before without so much as
154
+ * comparing its props — so a keystroke reconciles the block it changed,
155
+ * where it made and compared an element for every block in view: a hundred
156
+ * of them in a long document's window. Weak, so a node nobody draws any
157
+ * more takes its element with it.
158
+ */
159
+ const madeFor = new WeakMap<
160
+ PMNode,
161
+ {
162
+ key: string;
163
+ ctx: RenderContext;
164
+ bctx: BlockContext;
165
+ at: number;
166
+ register: RowProps['register'] | null;
167
+ element: ReactElement;
168
+ }
169
+ >();
170
+
171
+ function blockElement(
172
+ node: PMNode,
173
+ key: string,
174
+ ctx: RenderContext,
175
+ bctx: BlockContext,
176
+ at: number,
177
+ register: RowProps['register'] | null,
178
+ ): ReactElement {
179
+ const made = madeFor.get(node);
180
+ if (
181
+ made &&
182
+ made.key === key &&
183
+ made.ctx === ctx &&
184
+ made.bctx === bctx &&
185
+ made.at === at &&
186
+ made.register === register
187
+ ) {
188
+ return made.element;
189
+ }
190
+ const element = register
191
+ ? h(BlockRow, { key, blockKey: key, node, ctx, bctx, at, register })
192
+ : h(BlockView, { key, blockKey: key, node, ctx, bctx });
193
+ madeFor.set(node, { key, ctx, bctx, at, register, element });
194
+ return element;
195
+ }
196
+
197
+ /** The blocks inside `parent`, whose content starts at `contentStart`. */
198
+ export function renderBlocks(
199
+ parent: PMNode,
200
+ contentStart: number,
201
+ ctx: RenderContext,
202
+ bctx: BlockContext = PLAIN,
203
+ ): ReactNode[] {
204
+ const out: ReactNode[] = [];
205
+ parent.forEach((child, offset) => {
206
+ const pos = contentStart + offset;
207
+ const key = ctx.view.keys.keyAt(pos) ?? `p${pos}`;
208
+ out.push(blockElement(child, key, ctx, bctx, -1, null));
209
+ });
210
+ return out;
211
+ }
212
+
213
+ interface BlockProps {
214
+ blockKey: string;
215
+ node: PMNode;
216
+ ctx: RenderContext;
217
+ bctx: BlockContext;
218
+ }
219
+
220
+ function sameBlock(a: BlockProps, b: BlockProps): boolean {
221
+ return (
222
+ a.node === b.node &&
223
+ a.ctx === b.ctx &&
224
+ a.blockKey === b.blockKey &&
225
+ a.bctx === b.bctx
226
+ );
227
+ }
228
+
229
+ /** A block, of any kind. */
230
+ const BlockView = React.memo(function BlockView(
231
+ props: BlockProps,
232
+ ): ReactElement | null {
233
+ const { node, blockKey, ctx, bctx } = props;
234
+ const selected = useKeyed(ctx.view.selectedBlocks, blockKey) === true;
235
+ const custom = ctx.nodeViews?.[node.type.name];
236
+ if (custom) return h(NodeViewHost, { ...props, selected, component: custom });
237
+ switch (roleOf(node)) {
238
+ case 'textblock':
239
+ return h(TextblockView, props);
240
+ case 'quote':
241
+ return hx(
242
+ 'box',
243
+ {
244
+ style: {
245
+ flexDirection: 'column',
246
+ gap: ctx.look.blockGap,
247
+ borderLeftWidth: 3,
248
+ borderLeftColor: ctx.look.border,
249
+ paddingLeft: 10,
250
+ },
251
+ },
252
+ ...renderBlocks(
253
+ node,
254
+ startOf(ctx, blockKey),
255
+ ctx,
256
+ bctx.header ? QUOTED_HEADER : QUOTED,
257
+ ),
258
+ );
259
+ case 'list':
260
+ return h(ListView, props);
261
+ case 'table':
262
+ return h(TableView, props);
263
+ case 'rule':
264
+ return h(
265
+ AtomBox,
266
+ { blockKey, ctx, selected, style: { paddingTop: 6, paddingBottom: 6 } },
267
+ hx('box', { style: { height: 1, backgroundColor: ctx.look.border } }),
268
+ );
269
+ case 'image':
270
+ return h(AtomBox, { blockKey, ctx, selected }, imageContent(node, ctx));
271
+ case 'atom':
272
+ return h(
273
+ AtomBox,
274
+ { blockKey, ctx, selected },
275
+ hx(
276
+ 'text',
277
+ { style: { color: ctx.look.muted, fontSize: ctx.look.size } },
278
+ node.type.spec.leafText?.(node) || node.type.name,
279
+ ),
280
+ );
281
+ default:
282
+ return hx(
283
+ 'box',
284
+ { style: { flexDirection: 'column', gap: ctx.look.blockGap } },
285
+ ...renderBlocks(node, startOf(ctx, blockKey), ctx, bctx),
286
+ );
287
+ }
288
+ }, sameBlock);
289
+
290
+ /** Where a block's content starts, now. */
291
+ function startOf(ctx: RenderContext, key: string): number {
292
+ return (ctx.view.keys.posOf(key) ?? -1) + 1;
293
+ }
294
+
295
+ /** A top-level block of a long document, in the box its height is measured
296
+ * by (./virtual.ts). */
297
+ interface RowProps extends BlockProps {
298
+ at: number;
299
+ register: (key: string, at: number, node: unknown) => void;
300
+ }
301
+
302
+ const ROW_STYLE = { flexDirection: 'column', flexShrink: 0 } as const;
303
+
304
+ const BlockRow = React.memo(
305
+ function BlockRow(props: RowProps): ReactElement {
306
+ const { blockKey, at, register } = props;
307
+ const ref = useCallback(
308
+ (node: unknown) => register(blockKey, at, node),
309
+ [register, blockKey, at],
310
+ );
311
+ return hx(
312
+ 'box',
313
+ { ref, style: ROW_STYLE },
314
+ h(BlockView, {
315
+ blockKey,
316
+ node: props.node,
317
+ ctx: props.ctx,
318
+ bctx: props.bctx,
319
+ }),
320
+ );
321
+ },
322
+ (a, b) => sameBlock(a, b) && a.at === b.at && a.register === b.register,
323
+ );
324
+
325
+ /** The top-level blocks `first` to `last` (exclusive) of a long document —
326
+ * the window ./virtual.ts keeps — each in a box of its own to measure. */
327
+ export function renderBlockRange(
328
+ doc: PMNode,
329
+ first: number,
330
+ last: number,
331
+ ctx: RenderContext,
332
+ register: RowProps['register'],
333
+ ): ReactNode[] {
334
+ const out: ReactNode[] = [];
335
+ doc.forEach((child, offset, index) => {
336
+ if (index < first || index >= last) return;
337
+ const key = ctx.view.keys.keyAt(offset) ?? `p${offset}`;
338
+ out.push(blockElement(child, key, ctx, PLAIN, index, register));
339
+ });
340
+ return out;
341
+ }
342
+
343
+ function imageContent(node: PMNode, ctx: RenderContext): ReactNode {
344
+ const info: ImageInfo = {
345
+ src: String(node.attrs.src ?? ''),
346
+ alt: typeof node.attrs.alt === 'string' ? node.attrs.alt : null,
347
+ title: typeof node.attrs.title === 'string' ? node.attrs.title : null,
348
+ };
349
+ const drawn = ctx.renderImage?.(info);
350
+ if (drawn != null) return drawn;
351
+ return hx(
352
+ 'box',
353
+ {
354
+ style: {
355
+ borderWidth: 1,
356
+ borderColor: ctx.look.border,
357
+ borderRadius: 4,
358
+ padding: 8,
359
+ alignSelf: 'flex-start',
360
+ },
361
+ },
362
+ hx(
363
+ 'text',
364
+ { style: { color: ctx.look.muted, fontSize: ctx.look.size } },
365
+ info.alt || info.src || 'image',
366
+ ),
367
+ );
368
+ }
369
+
370
+ interface AtomBoxProps {
371
+ blockKey: string;
372
+ ctx: RenderContext;
373
+ selected: boolean;
374
+ style?: Style;
375
+ children?: ReactNode;
376
+ }
377
+
378
+ /** A block atom: registered with the view, so a press on it selects it, and
379
+ * outlined while it is selected. */
380
+ function AtomBox({
381
+ blockKey,
382
+ ctx,
383
+ selected,
384
+ style,
385
+ children,
386
+ }: AtomBoxProps): ReactElement {
387
+ const ref = useCallback(
388
+ (node: unknown) =>
389
+ ctx.view.attachBox(blockKey, (node as DrawnNode | null) ?? null),
390
+ [ctx.view, blockKey],
391
+ );
392
+ return hx(
393
+ 'box',
394
+ {
395
+ ref,
396
+ style: {
397
+ flexDirection: 'column',
398
+ borderWidth: 2,
399
+ borderRadius: 4,
400
+ borderColor: selected ? ctx.look.accent : 'transparent',
401
+ ...style,
402
+ },
403
+ },
404
+ children,
405
+ );
406
+ }
407
+
408
+ /** A textblock: the editor's text element, and what its kind wraps it in. */
409
+ function TextblockView({
410
+ node,
411
+ blockKey,
412
+ ctx,
413
+ bctx,
414
+ }: BlockProps): ReactElement {
415
+ const decorations = useKeyed(ctx.view.decorations, blockKey);
416
+ const look = ctx.look.inline(node, bctx);
417
+ const built = useMemo(
418
+ () =>
419
+ buildInline(
420
+ node,
421
+ look,
422
+ decorations?.inline ?? NO_DECORATIONS,
423
+ decorations?.widgets ?? NO_WIDGETS,
424
+ ),
425
+ [node, look, decorations],
426
+ );
427
+ const code = !!look.code;
428
+ const align = node.attrs.align;
429
+ const text = h(TEXT_ELEMENT, {
430
+ runs: built.runs,
431
+ map: built.map,
432
+ node,
433
+ blockKey,
434
+ host: ctx.view,
435
+ style: {
436
+ ...(code ? codeTextStyle(ctx.look.code) : null),
437
+ ...(align === 'left' || align === 'center' || align === 'right'
438
+ ? { textAlign: align }
439
+ : null),
440
+ flexShrink: 1,
441
+ },
442
+ });
443
+ const box = decorations?.box;
444
+ let out: ReactElement = text;
445
+ if (code) {
446
+ out = hx(
447
+ 'box',
448
+ { style: { ...codeBlockStyle(ctx.look.code), flexDirection: 'column' } },
449
+ text,
450
+ );
451
+ } else if (
452
+ node.type.name === 'heading' ||
453
+ /^h[1-6]$/.test(domTagOf(node.type.spec, node)?.tag ?? '')
454
+ ) {
455
+ out = hx(
456
+ 'box',
457
+ {
458
+ style: {
459
+ flexDirection: 'column',
460
+ paddingTop: Math.round(ctx.look.blockGap * 0.4),
461
+ },
462
+ },
463
+ text,
464
+ );
465
+ }
466
+ // an image alone in its paragraph is shown, when the app says how
467
+ const only = node.childCount === 1 ? node.firstChild : null;
468
+ if (only?.type.name === 'image' && ctx.renderImage) {
469
+ const drawn = ctx.renderImage({
470
+ src: String(only.attrs.src ?? ''),
471
+ alt: typeof only.attrs.alt === 'string' ? only.attrs.alt : null,
472
+ title: typeof only.attrs.title === 'string' ? only.attrs.title : null,
473
+ });
474
+ if (drawn != null) {
475
+ out = hx(
476
+ 'box',
477
+ { style: { flexDirection: 'column', gap: 4 } },
478
+ drawn,
479
+ out,
480
+ );
481
+ }
482
+ }
483
+ if (box?.background) {
484
+ out = hx(
485
+ 'box',
486
+ {
487
+ style: {
488
+ flexDirection: 'column',
489
+ backgroundColor: box.background,
490
+ borderRadius: 3,
491
+ },
492
+ },
493
+ out,
494
+ );
495
+ }
496
+ return out;
497
+ }
498
+
499
+ /** A list: its items, each a marker and its blocks. The marker is chrome —
500
+ * a number, a bullet, or a task's box, which toggles. */
501
+ function ListView({ node, blockKey, ctx, bctx }: BlockProps): ReactElement {
502
+ const view = ctx.view;
503
+ const look = ctx.look;
504
+ const ordered = isOrdered(node);
505
+ const start = Number(node.attrs.order ?? node.attrs.start ?? 1);
506
+ const tight = node.attrs.tight !== false;
507
+ const contentStart = startOf(ctx, blockKey);
508
+ const last = start + node.childCount - 1;
509
+ const markerWidth = ordered
510
+ ? Math.max(String(last).length, 1) * Math.ceil(look.size * 0.62) + 10
511
+ : Math.round(look.size * 1.15);
512
+ const items: ReactNode[] = [];
513
+ node.forEach((item, offset, index) => {
514
+ const pos = contentStart + offset;
515
+ const key = view.keys.keyAt(pos) ?? `i${pos}`;
516
+ items.push(
517
+ h(ItemView, {
518
+ key,
519
+ blockKey: key,
520
+ node: item,
521
+ ctx,
522
+ bctx,
523
+ marker: ordered ? `${start + index}.` : '•',
524
+ markerWidth,
525
+ }),
526
+ );
527
+ });
528
+ return hx(
529
+ 'box',
530
+ {
531
+ style: {
532
+ flexDirection: 'column',
533
+ gap: tight ? Math.round(look.blockGap * 0.25) : look.blockGap,
534
+ },
535
+ },
536
+ ...items,
537
+ );
538
+ }
539
+
540
+ interface ItemProps extends BlockProps {
541
+ marker: string;
542
+ markerWidth: number;
543
+ }
544
+
545
+ const ItemView = React.memo(
546
+ function ItemView({
547
+ node,
548
+ blockKey,
549
+ ctx,
550
+ bctx,
551
+ marker,
552
+ markerWidth,
553
+ }: ItemProps): ReactElement {
554
+ const look = ctx.look;
555
+ const checked = node.attrs.checked;
556
+ const toggle = useCallback(
557
+ (ev: X11MouseEvent) => {
558
+ // the box is the item's own control: the press is not a caret's
559
+ ev.preventDefault();
560
+ ev.stopPropagation();
561
+ if (!ctx.editable) return;
562
+ const pos = ctx.view.keys.posOf(blockKey);
563
+ const current = ctx.view.keys.nodeOf(blockKey);
564
+ if (pos !== undefined && current)
565
+ ctx.view.run(setTaskChecked(pos, !current.attrs.checked));
566
+ },
567
+ [ctx, blockKey],
568
+ );
569
+ const markerBox =
570
+ typeof checked === 'boolean'
571
+ ? hx(
572
+ 'box',
573
+ {
574
+ style: {
575
+ width: markerWidth,
576
+ flexShrink: 0,
577
+ flexDirection: 'row',
578
+ },
579
+ onMouseDown: toggle,
580
+ role: 'checkbox',
581
+ 'aria-checked': checked,
582
+ },
583
+ hx(
584
+ 'box',
585
+ {
586
+ style: {
587
+ width: 12,
588
+ height: 12,
589
+ borderWidth: 1,
590
+ borderColor: checked ? look.accent : look.border,
591
+ borderRadius: 3,
592
+ backgroundColor: checked ? look.accent : undefined,
593
+ alignItems: 'center',
594
+ justifyContent: 'center',
595
+ marginTop: Math.round(look.size * 0.25),
596
+ cursor: 'default',
597
+ },
598
+ },
599
+ checked
600
+ ? h(Icon, { name: 'check', size: 10, color: look.accentText })
601
+ : null,
602
+ ),
603
+ )
604
+ : hx(
605
+ 'box',
606
+ {
607
+ style: {
608
+ width: markerWidth,
609
+ flexShrink: 0,
610
+ flexDirection: 'row',
611
+ },
612
+ },
613
+ hx(
614
+ 'text',
615
+ {
616
+ style: {
617
+ color: look.muted,
618
+ fontSize: look.size,
619
+ fontFamily: look.family,
620
+ },
621
+ },
622
+ marker,
623
+ ),
624
+ );
625
+ return hx(
626
+ 'box',
627
+ { style: { flexDirection: 'row' } },
628
+ markerBox,
629
+ hx(
630
+ 'box',
631
+ {
632
+ style: {
633
+ flexDirection: 'column',
634
+ gap: Math.round(look.blockGap * 0.4),
635
+ flexGrow: 1,
636
+ flexShrink: 1,
637
+ },
638
+ },
639
+ ...renderBlocks(node, startOf(ctx, blockKey), ctx, bctx),
640
+ ),
641
+ );
642
+ },
643
+ (a, b) =>
644
+ sameBlock(a, b) && a.marker === b.marker && a.markerWidth === b.markerWidth,
645
+ );
646
+
647
+ /** What a cell's text measures, kept by the cell node and the look it was
648
+ * measured in. ProseMirror shares every node an edit did not touch, so
649
+ * typing in a cell measures that cell again and no other. */
650
+ const cellWidths = new WeakMap<PMNode, { key: string; width: number }>();
651
+
652
+ /** A textblock's text, laid out on one line, in logical pixels. */
653
+ function lineWidth(
654
+ block: PMNode,
655
+ ctx: RenderContext,
656
+ bctx: BlockContext,
657
+ ): number {
658
+ if (!ctx.fonts) return block.textContent.length * ctx.look.size * 0.55;
659
+ const inline = ctx.look.inline(block, bctx);
660
+ const { runs } = buildInline(block, inline);
661
+ return ctx.fonts.layout(runs, {
662
+ family: inline.base.family,
663
+ size: inline.base.size,
664
+ }).width;
665
+ }
666
+
667
+ function cellWidth(
668
+ cell: PMNode,
669
+ ctx: RenderContext,
670
+ bctx: BlockContext,
671
+ ): number {
672
+ const key = `${ctx.look.key}|${bctx.header ? 'h' : ''}${bctx.quote ? 'q' : ''}|${ctx.fonts ? 'f' : ''}`;
673
+ const hit = cellWidths.get(cell);
674
+ if (hit && hit.key === key) return hit.width;
675
+ let width = 0;
676
+ if (cell.isTextblock) width = lineWidth(cell, ctx, bctx);
677
+ else {
678
+ // a schema whose cells hold blocks: the widest of them
679
+ cell.descendants((node) => {
680
+ if (!node.isTextblock) return true;
681
+ width = Math.max(width, lineWidth(node, ctx, bctx));
682
+ return false;
683
+ });
684
+ }
685
+ cellWidths.set(cell, { key, width });
686
+ return width;
687
+ }
688
+
689
+ /**
690
+ * A table: rows of cells, each column as wide as its widest cell — capped,
691
+ * so one long cell cannot starve the rest; `<Markdown>`'s rule, so a table
692
+ * looks alike in both. When the table is wider than the document, every
693
+ * column gives up the same share and its text wraps. The rows are separate
694
+ * boxes and still line up, because every row's cells get the same basis and
695
+ * shrink alike.
696
+ */
697
+ function TableView({ node, blockKey, ctx, bctx }: BlockProps): ReactElement {
698
+ const look = ctx.look;
699
+ const view = ctx.view;
700
+ const contentStart = startOf(ctx, blockKey);
701
+ const size = look.size;
702
+ const padX = Math.round(size * 0.6);
703
+ const least = Math.round(size * 2.5);
704
+ const headerCtx = bctx.quote ? QUOTED_HEADER : HEADER;
705
+ const isHeader = (cell: PMNode): boolean =>
706
+ cell.type.spec.tableRole === 'header_cell';
707
+ const widths: number[] = [];
708
+ node.forEach((row) => {
709
+ row.forEach((cell, _offset, col) => {
710
+ const w = cellWidth(cell, ctx, isHeader(cell) ? headerCtx : bctx);
711
+ widths[col] = Math.max(
712
+ widths[col] ?? 0,
713
+ Math.min(Math.ceil(w), size * 26),
714
+ );
715
+ });
716
+ });
717
+ const basis = widths.map((w) => Math.max(w + padX * 2 + 2, least));
718
+ const rows: ReactNode[] = [];
719
+ node.forEach((row, rowOffset, rowIndex) => {
720
+ const rowPos = contentStart + rowOffset;
721
+ const rowKey = view.keys.keyAt(rowPos) ?? `r${rowPos}`;
722
+ const cells: ReactNode[] = [];
723
+ row.forEach((cell, cellOffset, col) => {
724
+ const cellPos = rowPos + 1 + cellOffset;
725
+ const cellKey = view.keys.keyAt(cellPos) ?? `c${cellPos}`;
726
+ const header = isHeader(cell);
727
+ cells.push(
728
+ hx(
729
+ 'box',
730
+ {
731
+ key: cellKey,
732
+ style: {
733
+ flexBasis: basis[col] ?? least,
734
+ flexGrow: 0,
735
+ flexShrink: 1,
736
+ minWidth: least,
737
+ paddingLeft: padX,
738
+ paddingRight: padX,
739
+ paddingTop: Math.round(size * 0.35),
740
+ paddingBottom: Math.round(size * 0.35),
741
+ borderLeftWidth: cellOffset === 0 ? 0 : 1,
742
+ borderLeftColor: look.border,
743
+ flexDirection: 'column',
744
+ backgroundColor: header ? look.headerBg : undefined,
745
+ },
746
+ },
747
+ cell.isTextblock
748
+ ? h(BlockView, {
749
+ blockKey: cellKey,
750
+ node: cell,
751
+ ctx,
752
+ bctx: header ? headerCtx : bctx,
753
+ })
754
+ : renderBlocks(cell, cellPos + 1, ctx, header ? headerCtx : bctx),
755
+ ),
756
+ );
757
+ });
758
+ rows.push(
759
+ hx(
760
+ 'box',
761
+ {
762
+ key: rowKey,
763
+ style: {
764
+ flexDirection: 'row',
765
+ borderTopWidth: rowIndex === 0 ? 0 : 1,
766
+ borderTopColor: look.border,
767
+ },
768
+ },
769
+ ...cells,
770
+ ),
771
+ );
772
+ });
773
+ return hx(
774
+ 'box',
775
+ {
776
+ style: {
777
+ flexDirection: 'column',
778
+ alignSelf: 'flex-start',
779
+ maxWidth: '100%',
780
+ borderWidth: 1,
781
+ borderColor: look.border,
782
+ borderRadius: 6,
783
+ },
784
+ },
785
+ ...rows,
786
+ );
787
+ }
788
+
789
+ interface NodeViewHostProps extends BlockProps {
790
+ selected: boolean;
791
+ component: ComponentType<NodeViewProps>;
792
+ }
793
+
794
+ /** An app's node view, handed what it needs and nothing positional. */
795
+ function NodeViewHost({
796
+ node,
797
+ blockKey,
798
+ ctx,
799
+ bctx,
800
+ selected,
801
+ component,
802
+ }: NodeViewHostProps): ReactElement {
803
+ const view = ctx.view;
804
+ const getPos = useCallback(() => view.keys.posOf(blockKey), [view, blockKey]);
805
+ const updateAttributes = useCallback(
806
+ (attrs: Record<string, unknown>) => {
807
+ const pos = view.keys.posOf(blockKey);
808
+ const current = view.keys.nodeOf(blockKey);
809
+ if (pos === undefined || !current) return;
810
+ view.dispatch(
811
+ view.state.tr.setNodeMarkup(pos, undefined, {
812
+ ...current.attrs,
813
+ ...attrs,
814
+ }),
815
+ );
816
+ },
817
+ [view, blockKey],
818
+ );
819
+ let children: ReactNode;
820
+ if (node.isTextblock)
821
+ children = h(TextblockView, { node, blockKey, ctx, bctx });
822
+ else if (!node.isLeaf)
823
+ children = renderBlocks(node, startOf(ctx, blockKey), ctx, bctx);
824
+ const inner = h(component, {
825
+ node,
826
+ getPos,
827
+ selected,
828
+ children,
829
+ updateAttributes,
830
+ editable: ctx.editable,
831
+ view,
832
+ });
833
+ // a leaf is something a press selects, so the view has to know its box
834
+ return node.isLeaf ? h(AtomBox, { blockKey, ctx, selected }, inner) : inner;
835
+ }
836
+
837
+ export type { BlockDecorations };