@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,856 @@
1
+ // <RichTextEditor> — a WYSIWYG editor: ProseMirror's document model and
2
+ // plugin system, drawn and driven by react-x11.
3
+ //
4
+ // The ladder, one element all the way up (docs/prd-rich-text-editor.md):
5
+ //
6
+ // 1. `defaultValue` / `value` + `onChange` — markdown in and out, and a
7
+ // caller never meets ProseMirror;
8
+ // 2. `toolbar`, `placeholder`, `readOnly`, `onSubmit`, `suggestions` — the
9
+ // chrome and the behaviours an app would otherwise wire by hand;
10
+ // 3. `format="html" | "text"`, `markStyles`, `renderImage`, `nodeViews` —
11
+ // what the document is written in, and how its parts look;
12
+ // 4. `plugins`, `editorProps`, `schema` — ProseMirror's own seams, so the
13
+ // ecosystem's plugins and schemas plug in as they are;
14
+ // 5. `state` + `dispatchTransaction` — the app owns the EditorState outright.
15
+ //
16
+ // **Registration happens when this module is evaluated** — the editor's two
17
+ // elements, and `<richtext>` for the toolbar's labels — which is the one side
18
+ // effect the package's tree-shaking contract allows (AGENTS.md).
19
+ //
20
+ // **Not in the barrel.** `src/index.ts` re-exports every other component;
21
+ // this one is imported from `@react-x11/components/rich-text-editor`.
22
+ // ProseMirror's declarations name DOM globals (`dom-globals.d.ts` has the
23
+ // four this repository supplies for itself), and an app importing *anything*
24
+ // from the barrel loads every re-exported module's declarations — so every
25
+ // app would inherit that requirement to use a calendar. The subpath keeps it
26
+ // with the apps that use the editor.
27
+ import React, { useCallback, useEffect, useImperativeHandle, useLayoutEffect, useMemo, useRef, useState, useSyncExternalStore, } from 'react';
28
+ import { useApp, useClipboard, useTheme } from 'react-x11';
29
+ import { XK_ESCAPE, XK_KP_ENTER, XK_RETURN } from 'react-x11/keysyms';
30
+ import { tint } from 'react-x11/style';
31
+ import { redo, undo } from 'prosemirror-history';
32
+ import { Fragment, Slice } from 'prosemirror-model';
33
+ import { EditorState, Selection } from 'prosemirror-state';
34
+ import { hx } from '../internal/hx.js';
35
+ import { registerRichText } from '../richtext/index.js';
36
+ import { isBlockActive, isMarkActive, markAttrs, setLink, toggleBlockType, toggleList, toggleWrap, } from './commands.js';
37
+ import { DROP_TYPES, SLICE_TYPE } from './drag.js';
38
+ import { docFromHTML, htmlFromContent } from './html.js';
39
+ import { defaultPlugins } from './keymap.js';
40
+ import { deriveLook } from './look.js';
41
+ import { toggleMark } from './marks.js';
42
+ import { docFromText, markdownCodec, textFromDoc } from './markdown.js';
43
+ import { registerEditorElements, ROOT_ELEMENT, TEXT_ELEMENT } from './nodes.js';
44
+ import { renderBlockRange, renderBlocks } from './render.js';
45
+ import { schema as defaultSchema } from './schema.js';
46
+ import { acceptSuggestion, SUGGESTION_PAGE, suggesterFor, suggestionState, suggestions as suggestionPlugin, } from './suggest.js';
47
+ import { DEFAULT_TOOLBAR, resolveToolbar, Toolbar, toolbarItems, } from './toolbar.js';
48
+ import { RichEditorView } from './view.js';
49
+ import { useBlockWindow } from './virtual.js';
50
+ import { useFontPrewarm } from '../internal/prewarm.js';
51
+ registerRichText();
52
+ registerEditorElements();
53
+ const h = React.createElement;
54
+ /** What a drag out of the editor offers to do: an editable one moves or
55
+ * copies, a read-only one only copies. */
56
+ const MOVE_OR_COPY = ['move', 'copy'];
57
+ const COPY_ONLY = ['copy'];
58
+ function codecFor(schema, format, markdown) {
59
+ switch (format) {
60
+ case 'html':
61
+ return {
62
+ parse: (source) => docFromHTML(schema, source),
63
+ serialize: (doc) => htmlFromContent(schema, doc),
64
+ };
65
+ case 'text':
66
+ return {
67
+ parse: (source) => docFromText(schema, source),
68
+ serialize: textFromDoc,
69
+ };
70
+ default:
71
+ return markdown ?? markdownCodec(schema);
72
+ }
73
+ }
74
+ function replaceDocument(view, doc, addToHistory) {
75
+ const { state } = view;
76
+ const tr = state.tr.replaceWith(0, state.doc.content.size, doc.content);
77
+ // keep the caret about where it was, inside what is there now
78
+ tr.setSelection(Selection.near(tr.doc.resolve(Math.min(state.selection.head, tr.doc.content.size))));
79
+ if (!addToHistory)
80
+ tr.setMeta('addToHistory', false);
81
+ view.dispatch(tr);
82
+ }
83
+ function inListOrCode(state) {
84
+ const { $from } = state.selection;
85
+ if ($from.parent.type.spec.code)
86
+ return true;
87
+ for (let d = $from.depth; d > 0; d--) {
88
+ if (/item$/i.test($from.node(d).type.name))
89
+ return true;
90
+ }
91
+ return false;
92
+ }
93
+ function linkAt(state, pos) {
94
+ const $pos = state.doc.resolve(pos);
95
+ const node = $pos.parent.childAfter($pos.parentOffset).node ?? $pos.nodeBefore;
96
+ const link = node?.marks.find((m) => m.type.name === 'link');
97
+ return link && typeof link.attrs.href === 'string' ? link.attrs.href : null;
98
+ }
99
+ /**
100
+ * ```tsx
101
+ * <RichTextEditor
102
+ * defaultValue={note.body}
103
+ * onChange={(ev) => save(ev.value)}
104
+ * placeholder="Write something…"
105
+ * toolbar
106
+ * style={{ flexGrow: 1 }}
107
+ * />
108
+ * ```
109
+ */
110
+ /**
111
+ * Whether the document an editor mounts with has code in it: a code span or
112
+ * block as markdown spells one, as HTML does, or as a node's schema says.
113
+ */
114
+ function hasCode(props, format) {
115
+ const content = props.state?.doc ?? props.value ?? props.defaultValue;
116
+ if (content == null)
117
+ return false;
118
+ if (typeof content === 'string') {
119
+ if (format === 'markdown') {
120
+ return content.includes('`') || content.includes('~~~');
121
+ }
122
+ if (format === 'html') {
123
+ return content.includes('<code') || content.includes('<pre');
124
+ }
125
+ return false;
126
+ }
127
+ let found = false;
128
+ content.descendants((node) => {
129
+ if (found)
130
+ return false;
131
+ if (node.type.spec.code || node.marks.some((m) => m.type.spec.code)) {
132
+ found = true;
133
+ }
134
+ return !found;
135
+ });
136
+ return found;
137
+ }
138
+ export function RichTextEditor(props) {
139
+ const theme = useTheme();
140
+ const clipboard = useClipboard();
141
+ const { placeholder, readOnly = false, disabled = false, autoFocus, toolbar, style, styles, } = props;
142
+ const format = props.format ?? 'markdown';
143
+ const schema = props.state?.schema ?? props.schema ?? defaultSchema;
144
+ const codec = useMemo(() => codecFor(schema, format, props.markdown), [schema, format, props.markdown]);
145
+ // The latest props, for the callbacks the view holds on to.
146
+ const latest = useRef(props);
147
+ latest.current = props;
148
+ const codecRef = useRef(codec);
149
+ codecRef.current = codec;
150
+ const look = useMemo(() => deriveLook(theme, {
151
+ fontSize: props.fontSize,
152
+ fontFamily: props.fontFamily,
153
+ monoFamily: props.monoFamily,
154
+ markStyles: props.markStyles,
155
+ resolveLanguage: props.resolveLanguage,
156
+ highlight: props.highlight,
157
+ dim: disabled,
158
+ }), [
159
+ theme,
160
+ props.fontSize,
161
+ props.fontFamily,
162
+ props.monoFamily,
163
+ props.markStyles,
164
+ props.resolveLanguage,
165
+ props.highlight,
166
+ disabled,
167
+ ]);
168
+ // A document that mounts with code in it sets that code in the mono
169
+ // family on its first frame: warmed while the editor renders, asked of
170
+ // the content it mounts with, once.
171
+ const [mountsWithCode] = useState(() => hasCode(props, format));
172
+ useFontPrewarm(mountsWithCode ? look.mono : null);
173
+ // The editor's own plugins, made once per schema and option set — a
174
+ // plugin instance carries its state across a reconfigure, so the undo
175
+ // history survives an app swapping its own plugins.
176
+ const defaults = useMemo(() => defaultPlugins(schema, {
177
+ history: props.history,
178
+ inputRules: props.inputRules,
179
+ keymap: props.keymap,
180
+ typography: props.typography,
181
+ }), [schema, props.history, props.inputRules, props.keymap, props.typography]);
182
+ // The suggestion plugin, made once while there are suggesters: it reads
183
+ // the latest prop through `latest`, so an inline array is not a rebuild —
184
+ // a rebuild would drop the list that is open.
185
+ const suggesting = !!props.suggestions?.length;
186
+ const suggest = useMemo(() => suggesting
187
+ ? suggestionPlugin(() => latest.current.suggestions ?? [])
188
+ : null, [suggesting]);
189
+ const plugins = useMemo(() => [
190
+ ...(props.plugins ?? []),
191
+ // ahead of the defaults, so a row takes Enter before the keymap does
192
+ ...(suggest ? [suggest] : []),
193
+ ...defaults,
194
+ ], [props.plugins, suggest, defaults]);
195
+ const listeners = useRef(new Set());
196
+ /** The value last reported through `onChange`, or accepted from `value`. */
197
+ const reported = useRef(null);
198
+ const handleRef = useRef(null);
199
+ const rootRef = useRef(null);
200
+ const [linkEdit, setLinkEdit] = useState(null);
201
+ // A suggestion list shows only while the editor has focus.
202
+ const [focused, setFocused] = useState(false);
203
+ // The trigger being typed is drawn in the accent colour, unless the app
204
+ // says what the `suggestion` class looks like. Memoized: a new object
205
+ // redraws every block's decorations (`configure`).
206
+ const decorationClasses = useMemo(() => ({ suggestion: { color: look.accent }, ...props.decorationClasses }), [look.accent, props.decorationClasses]);
207
+ const config = {
208
+ onRender: () => { },
209
+ onUpdate: (prev, trs) => onUpdate(prev, trs),
210
+ onFocusChange: setFocused,
211
+ clipboard,
212
+ ...(placeholder ? { placeholder } : null),
213
+ colors: {
214
+ selection: look.selection,
215
+ selectionBlurred: look.selectionBlurred,
216
+ caret: look.caret,
217
+ placeholder: look.muted,
218
+ preedit: look.text,
219
+ },
220
+ decorationClasses,
221
+ };
222
+ const viewRef = useRef(null);
223
+ if (!viewRef.current) {
224
+ let state = props.state;
225
+ if (!state) {
226
+ const initial = props.value ?? props.defaultValue;
227
+ if (typeof initial === 'string')
228
+ reported.current = initial;
229
+ const doc = initial === undefined
230
+ ? undefined
231
+ : typeof initial === 'string'
232
+ ? codec.parse(initial)
233
+ : initial;
234
+ state = EditorState.create({ schema, doc, plugins });
235
+ }
236
+ const viewProps = {
237
+ ...props.editorProps,
238
+ editable: () => !latest.current.readOnly && !latest.current.disabled,
239
+ handleClick: (view, pos, event) => {
240
+ const own = latest.current.editorProps?.handleClick;
241
+ if (own?.call(undefined, view, pos, event))
242
+ return true;
243
+ return openLinkAt(pos, event);
244
+ },
245
+ ...(props.dispatchTransaction
246
+ ? {
247
+ dispatchTransaction: (tr) => latest.current.dispatchTransaction?.(tr),
248
+ }
249
+ : null),
250
+ };
251
+ viewRef.current = new RichEditorView(state, viewProps, config);
252
+ }
253
+ const view = viewRef.current;
254
+ // Every state change re-renders this component; the document itself only
255
+ // re-renders the blocks whose nodes changed (./render.ts).
256
+ const subscribe = useCallback((fn) => {
257
+ listeners.current.add(fn);
258
+ return () => {
259
+ listeners.current.delete(fn);
260
+ };
261
+ }, []);
262
+ const state = useSyncExternalStore(subscribe, () => view.state, () => view.state);
263
+ function event(type) {
264
+ const at = view.state;
265
+ let cached = null;
266
+ return {
267
+ type,
268
+ get value() {
269
+ return (cached ??= codecRef.current.serialize(at.doc));
270
+ },
271
+ state: at,
272
+ name: latest.current.name,
273
+ target: handleRef.current,
274
+ };
275
+ }
276
+ function onUpdate(prev, trs) {
277
+ for (const fn of [...listeners.current])
278
+ fn();
279
+ const now = view.state;
280
+ const p = latest.current;
281
+ if (prev.doc !== now.doc && p.onChange) {
282
+ let cached = null;
283
+ p.onChange({
284
+ type: 'change',
285
+ get value() {
286
+ if (cached === null) {
287
+ cached = codecRef.current.serialize(now.doc);
288
+ reported.current = cached;
289
+ }
290
+ return cached;
291
+ },
292
+ doc: now.doc,
293
+ state: now,
294
+ transactions: trs,
295
+ name: p.name,
296
+ target: handleRef.current,
297
+ });
298
+ }
299
+ if (!prev.selection.eq(now.selection))
300
+ p.onSelectionChange?.(event('selectionchange'));
301
+ }
302
+ function openLinkAt(pos, ev) {
303
+ const p = latest.current;
304
+ if (!p.onLink)
305
+ return false;
306
+ const editing = !p.readOnly && !p.disabled;
307
+ // editing, a plain click places the caret; Mod-click follows
308
+ if (editing && !(ev.ctrlKey || ev.metaKey))
309
+ return false;
310
+ const href = linkAt(view.state, pos);
311
+ if (!href)
312
+ return false;
313
+ p.onLink(href, ev);
314
+ return true;
315
+ }
316
+ const editLink = useCallback(() => {
317
+ const root = rootRef.current;
318
+ const frame = root?.getClientRects()[0];
319
+ if (!root || !frame || !view.state.schema.marks.link)
320
+ return;
321
+ const { from, to } = view.state.selection;
322
+ const a = view.coordsAtPos(from);
323
+ const b = view.coordsAtPos(to);
324
+ const attrs = markAttrs(view.state, view.state.schema.marks.link);
325
+ setLinkEdit({
326
+ at: {
327
+ x: a.left - frame.x,
328
+ y: Math.min(a.top, b.top) - frame.y,
329
+ width: Math.max(1, (a.top === b.top ? b.right : a.left) - a.left),
330
+ height: Math.max(a.bottom, b.bottom) - Math.min(a.top, b.top),
331
+ },
332
+ draft: typeof attrs?.href === 'string' ? attrs.href : '',
333
+ });
334
+ }, [view]);
335
+ const handle = useMemo(() => {
336
+ const nodeType = (name) => view.state.schema.nodes[name];
337
+ const markType = (name) => view.state.schema.marks[name];
338
+ const itemType = () => view.state.schema.nodes.list_item ?? view.state.schema.nodes.listItem;
339
+ return {
340
+ get view() {
341
+ return view;
342
+ },
343
+ get state() {
344
+ return view.state;
345
+ },
346
+ get schema() {
347
+ return view.state.schema;
348
+ },
349
+ getValue(fmt) {
350
+ const c = fmt
351
+ ? codecFor(view.state.schema, fmt, latest.current.markdown)
352
+ : codecRef.current;
353
+ return c.serialize(view.state.doc);
354
+ },
355
+ setValue(value, options = {}) {
356
+ const c = options.format
357
+ ? codecFor(view.state.schema, options.format, latest.current.markdown)
358
+ : codecRef.current;
359
+ const doc = typeof value === 'string' ? c.parse(value) : value;
360
+ if (typeof value === 'string' && !options.format)
361
+ reported.current = value;
362
+ replaceDocument(view, doc, options.addToHistory ?? false);
363
+ },
364
+ insertContent(value, fmt) {
365
+ const doc = typeof value === 'string'
366
+ ? (fmt
367
+ ? codecFor(view.state.schema, fmt, latest.current.markdown)
368
+ : codecRef.current).parse(value)
369
+ : value;
370
+ // a whole document goes in as its blocks, open at both ends so a
371
+ // single paragraph joins the one the caret is in
372
+ const content = doc.type === view.state.schema.topNodeType
373
+ ? doc.content
374
+ : Fragment.from(doc);
375
+ view.dispatch(view.state.tr
376
+ .replaceSelection(Slice.maxOpen(content))
377
+ .scrollIntoView());
378
+ },
379
+ run: (command) => view.run(command),
380
+ can: (command) => command(view.state, undefined, view.asEditorView),
381
+ isActive(name, attrs) {
382
+ const mark = markType(name);
383
+ if (mark)
384
+ return isMarkActive(view.state, mark);
385
+ const node = nodeType(name);
386
+ return node ? isBlockActive(view.state, node, attrs) : false;
387
+ },
388
+ toggleMark(name, attrs) {
389
+ const type = markType(name);
390
+ return !!type && view.run(toggleMark(type, attrs));
391
+ },
392
+ setBlock(name, attrs) {
393
+ const type = nodeType(name);
394
+ return !!type && view.run(toggleBlockType(type, attrs));
395
+ },
396
+ toggleList(name) {
397
+ const type = nodeType(name);
398
+ const item = itemType();
399
+ return !!type && !!item && view.run(toggleList(type, item));
400
+ },
401
+ toggleWrap(name) {
402
+ const type = nodeType(name);
403
+ return !!type && view.run(toggleWrap(type));
404
+ },
405
+ undo: () => view.run(undo),
406
+ redo: () => view.run(redo),
407
+ editLink,
408
+ focus: () => view.focus(),
409
+ blur: () => {
410
+ view.dom?.blur?.();
411
+ },
412
+ };
413
+ }, [view, editLink]);
414
+ handleRef.current = handle;
415
+ useImperativeHandle(props.ref, () => handle, [handle]);
416
+ // The component's half of the view, refreshed every render; the view
417
+ // acts only on what changed.
418
+ useLayoutEffect(() => {
419
+ view.configure(config);
420
+ });
421
+ // An app-owned state, handed back after each transaction.
422
+ useLayoutEffect(() => {
423
+ if (props.state && props.state !== view.state)
424
+ view.updateState(props.state);
425
+ }, [props.state, view]);
426
+ // A controlled value: anything but what the editor last reported replaces
427
+ // the document.
428
+ useLayoutEffect(() => {
429
+ const value = props.value;
430
+ if (value === undefined || props.state || value === reported.current)
431
+ return;
432
+ reported.current = value;
433
+ replaceDocument(view, codec.parse(value), false);
434
+ }, [props.value, props.state, codec, view]);
435
+ // New plugins (the app's, or the defaults' options): reconfigure, keeping
436
+ // every plugin instance that is still there — and its state.
437
+ const configured = useRef(plugins);
438
+ useLayoutEffect(() => {
439
+ if (props.state || plugins === configured.current)
440
+ return;
441
+ configured.current = plugins;
442
+ view.updateState(view.state.reconfigure({ plugins }));
443
+ }, [plugins, props.state, view]);
444
+ const editorProps = props.editorProps;
445
+ const firstProps = useRef(editorProps);
446
+ useLayoutEffect(() => {
447
+ if (editorProps === firstProps.current)
448
+ return;
449
+ firstProps.current = editorProps;
450
+ view.setProps({
451
+ ...editorProps,
452
+ editable: view.props.editable,
453
+ handleClick: view.props.handleClick,
454
+ });
455
+ }, [editorProps, view]);
456
+ // the plugins' views, now that the root element exists for them to find
457
+ useLayoutEffect(() => {
458
+ view.mountPluginViews();
459
+ }, [view]);
460
+ useEffect(() => () => view.destroy(), [view]);
461
+ const editable = !readOnly && !disabled;
462
+ // what a table measures its columns with; none on the mock backend
463
+ const fonts = useApp()?.fonts ?? null;
464
+ const ctx = useMemo(() => ({
465
+ view,
466
+ look,
467
+ editable,
468
+ fonts,
469
+ ...(props.nodeViews ? { nodeViews: props.nodeViews } : null),
470
+ ...(props.renderImage ? { renderImage: props.renderImage } : null),
471
+ }), [view, look, editable, fonts, props.nodeViews, props.renderImage]);
472
+ // A long document draws only the blocks near the viewport, in a window
473
+ // the view asks about when what it needs is not drawn (./virtual.ts).
474
+ const windowed = useBlockWindow({
475
+ doc: state.doc,
476
+ keys: view.keys,
477
+ virtual: props.virtual ?? 'auto',
478
+ estimate: Math.round(look.size * 1.5) + look.blockGap,
479
+ gap: look.blockGap,
480
+ });
481
+ const { virtualizing, first, last, register } = windowed;
482
+ const blocks = useMemo(() => virtualizing
483
+ ? renderBlockRange(state.doc, first, last, ctx, register)
484
+ : renderBlocks(state.doc, 0, ctx), [state.doc, ctx, virtualizing, first, last, register]);
485
+ useLayoutEffect(() => {
486
+ view.attachWindow(virtualizing ? windowed.window : null);
487
+ }, [view, virtualizing, windowed.window]);
488
+ // --- input ---------------------------------------------------------------
489
+ const onKeyDown = (ev) => {
490
+ const p = latest.current;
491
+ p.onKeyDown?.(ev);
492
+ if (ev.defaultPrevented || p.disabled)
493
+ return;
494
+ const mac = view.primaryModifier === 'meta';
495
+ const primary = mac ? ev.metaKey : ev.ctrlKey;
496
+ const k = ev.keysym;
497
+ if ((k === XK_RETURN || k === XK_KP_ENTER) && p.onSubmit) {
498
+ const plain = !ev.shiftKey && !primary && !ev.altKey;
499
+ // a plain Enter while a suggestion list shows rows takes a row: it is
500
+ // the list's plugin's, a step further on
501
+ const listing = plain && editable && !!suggestionState(view.state)?.items?.length;
502
+ const submit = !listing &&
503
+ (p.submitOnEnter
504
+ ? plain && !inListOrCode(view.state)
505
+ : primary && !ev.shiftKey);
506
+ if (submit) {
507
+ ev.preventDefault();
508
+ p.onSubmit(event('submit'));
509
+ return;
510
+ }
511
+ }
512
+ if (primary &&
513
+ !ev.altKey &&
514
+ !ev.shiftKey &&
515
+ k === 0x6b /* k */ &&
516
+ editable) {
517
+ ev.preventDefault();
518
+ editLink();
519
+ return;
520
+ }
521
+ if (k === XK_ESCAPE && linkEdit)
522
+ setLinkEdit(null);
523
+ };
524
+ const onMouseDown = (ev) => {
525
+ latest.current.onMouseDown?.(ev);
526
+ if (ev.defaultPrevented || latest.current.disabled)
527
+ return;
528
+ if (view.mouseDown(ev))
529
+ ev.preventDefault();
530
+ };
531
+ const setRoot = useCallback((node) => {
532
+ rootRef.current = node ?? null;
533
+ }, []);
534
+ const pane = windowed.box;
535
+ const setScroller = useCallback((node) => {
536
+ pane.current = node ?? null;
537
+ view.attachScroller(pane.current);
538
+ }, [view, pane]);
539
+ // What a drag out of the editor offers, resolved when a drop asks for it:
540
+ // a copy's text and HTML, and the slice itself for a drop in this app.
541
+ const dragData = useMemo(() => ({
542
+ 'text/plain': () => view.dragText(),
543
+ 'text/html': () => view.dragHTML(),
544
+ [SLICE_TYPE]: () => view.dragPayload(),
545
+ }), [view]);
546
+ // --- chrome --------------------------------------------------------------
547
+ let chrome = null;
548
+ if (typeof toolbar === 'function') {
549
+ chrome = toolbar(handle);
550
+ }
551
+ else if (toolbar) {
552
+ const items = toolbarItems(schema, {
553
+ link: () => {
554
+ editLink();
555
+ return true;
556
+ },
557
+ });
558
+ chrome = h(Toolbar, {
559
+ entries: resolveToolbar(toolbar === true ? DEFAULT_TOOLBAR : toolbar, items),
560
+ state,
561
+ run: (command) => {
562
+ view.run(command);
563
+ view.focus();
564
+ },
565
+ look,
566
+ disabled: !editable,
567
+ ...(styles?.toolbar ? { style: styles.toolbar } : null),
568
+ });
569
+ }
570
+ const closeLink = () => {
571
+ setLinkEdit(null);
572
+ view.focus();
573
+ };
574
+ const applyLink = (href) => {
575
+ const target = href.trim();
576
+ view.run(setLink(target === '' ? null : target));
577
+ closeLink();
578
+ };
579
+ const linkPopup = linkEdit &&
580
+ hx('popup', {
581
+ theme: theme,
582
+ anchor: {
583
+ to: rootRef,
584
+ at: linkEdit.at,
585
+ placement: 'bottom',
586
+ },
587
+ onDismiss: closeLink,
588
+ }, hx('box', {
589
+ style: {
590
+ flexDirection: 'row',
591
+ alignItems: 'center',
592
+ gap: 6,
593
+ padding: 6,
594
+ borderWidth: 1,
595
+ borderColor: look.border,
596
+ borderRadius: look.radius,
597
+ backgroundColor: look.surface,
598
+ },
599
+ }, hx('textinput', {
600
+ value: linkEdit.draft,
601
+ placeholder: 'https://',
602
+ autoFocus: true,
603
+ style: { width: 260 },
604
+ onChange: (ev) => setLinkEdit((cur) => (cur ? { ...cur, draft: ev.value } : cur)),
605
+ onSubmit: (ev) => applyLink(ev.value),
606
+ onKeyDown: (ev) => {
607
+ if (ev.keysym === XK_ESCAPE) {
608
+ ev.preventDefault();
609
+ closeLink();
610
+ }
611
+ },
612
+ })));
613
+ // The suggestion list, drawn from the plugin's state and nothing else
614
+ // (./suggest.ts) — so an app that owns the EditorState gets it too. It hangs
615
+ // off the textblock the trigger is in, at the trigger, so it follows the
616
+ // text as the document scrolls and unmaps while the text is out of view.
617
+ // It never takes focus: a press on a row takes the row, and the caret
618
+ // stays in the editor.
619
+ const suggestion = suggestionState(state);
620
+ const firstRow = useRef(0);
621
+ const rowsShown = focused && editable && !!suggestion?.items?.length;
622
+ const anchor = rowsShown && suggestion ? view.anchorAt(suggestion.from) : null;
623
+ let suggestionPopup = null;
624
+ if (suggestion?.items && anchor) {
625
+ const { items, selected } = suggestion;
626
+ // the window of rows moves only as far as keeps the highlight in it
627
+ let first = Math.min(firstRow.current, Math.max(0, items.length - SUGGESTION_PAGE));
628
+ if (selected < first)
629
+ first = selected;
630
+ if (selected >= first + SUGGESTION_PAGE)
631
+ first = selected - SUGGESTION_PAGE + 1;
632
+ firstRow.current = first;
633
+ // a suggester may draw its rows itself; the row box — the highlight
634
+ // behind it, the press on it — stays the editor's
635
+ const custom = suggesterFor(state)?.renderItem;
636
+ const rowHeight = Math.round(look.size + 12);
637
+ const rows = items.slice(first, first + SUGGESTION_PAGE).map((item, i) => {
638
+ const index = first + i;
639
+ const on = index === selected;
640
+ if (custom) {
641
+ return hx('box', {
642
+ key: `${index} ${item.label}`,
643
+ style: {
644
+ flexDirection: 'row',
645
+ alignItems: 'center',
646
+ minHeight: rowHeight,
647
+ paddingLeft: 8,
648
+ paddingRight: 8,
649
+ borderRadius: Math.max(0, look.radius - 2),
650
+ backgroundColor: on ? look.accent : 'transparent',
651
+ ...(on
652
+ ? null
653
+ : { ':hover': { backgroundColor: tint(look.text, 0.08) } }),
654
+ },
655
+ onMouseDown: (ev) => {
656
+ ev.preventDefault();
657
+ view.run(acceptSuggestion(index));
658
+ },
659
+ }, custom(item, { selected: on, query: suggestion.query }));
660
+ }
661
+ return hx('box', {
662
+ key: `${index} ${item.label}`,
663
+ style: {
664
+ flexDirection: 'row',
665
+ alignItems: 'center',
666
+ gap: 12,
667
+ height: rowHeight,
668
+ paddingLeft: 8,
669
+ paddingRight: 8,
670
+ borderRadius: Math.max(0, look.radius - 2),
671
+ backgroundColor: on ? look.accent : 'transparent',
672
+ ...(on
673
+ ? null
674
+ : { ':hover': { backgroundColor: tint(look.text, 0.08) } }),
675
+ },
676
+ onMouseDown: (ev) => {
677
+ ev.preventDefault();
678
+ view.run(acceptSuggestion(index));
679
+ },
680
+ }, hx('text', {
681
+ style: {
682
+ flexGrow: 1,
683
+ fontFamily: look.family,
684
+ fontSize: look.size,
685
+ color: on ? look.accentText : look.text,
686
+ },
687
+ }, item.label), item.detail
688
+ ? hx('text', {
689
+ style: {
690
+ fontFamily: look.family,
691
+ fontSize: Math.max(10, look.size - 2),
692
+ color: on ? look.accentText : look.muted,
693
+ },
694
+ }, item.detail)
695
+ : null);
696
+ });
697
+ suggestionPopup = hx('popup', {
698
+ theme: theme,
699
+ anchor: { to: anchor.node, at: anchor.at, placement: 'bottom' },
700
+ minWidth: 200,
701
+ maxWidth: 420,
702
+ }, hx('box', {
703
+ style: {
704
+ flexGrow: 1,
705
+ flexDirection: 'column',
706
+ padding: 4,
707
+ borderWidth: 1,
708
+ borderColor: look.border,
709
+ borderRadius: look.radius,
710
+ backgroundColor: look.surface,
711
+ },
712
+ }, ...rows));
713
+ }
714
+ else {
715
+ firstRow.current = 0;
716
+ }
717
+ const frame = {
718
+ flexDirection: 'column',
719
+ borderWidth: 1,
720
+ borderColor: look.border,
721
+ borderRadius: look.radius,
722
+ backgroundColor: look.background,
723
+ overflow: 'hidden',
724
+ ...(editable
725
+ ? {
726
+ ':focus-within': {
727
+ borderColor: String(theme.borderFocus ?? look.accent),
728
+ },
729
+ }
730
+ : null),
731
+ };
732
+ return h(ROOT_ELEMENT, {
733
+ ref: setRoot,
734
+ host: view,
735
+ focusable: !disabled,
736
+ disabled,
737
+ autoFocus,
738
+ 'aria-label': props['aria-label'] ?? placeholder,
739
+ 'data-testname': props['data-testname'],
740
+ style: style
741
+ ? [frame, ...(Array.isArray(style) ? style : [style])]
742
+ : frame,
743
+ onKeyDown,
744
+ onMouseDown,
745
+ onMouseMove: (ev) => {
746
+ if (view.mouseMove(ev))
747
+ ev.preventDefault();
748
+ },
749
+ onMouseUp: () => view.mouseUp(),
750
+ onContextMenu: (ev) => {
751
+ if (ev.defaultPrevented || latest.current.disabled)
752
+ return;
753
+ view.contextMenu(ev);
754
+ ev.preventDefault();
755
+ },
756
+ // drag and drop (./drag.ts): the selection drags out, and a drop is
757
+ // read like a paste. A press on the selection is left to core, which
758
+ // arms the drag here; `onDragStart` cancels one that is not the
759
+ // selection's, and leaves a drag of something inside alone.
760
+ draggable: !disabled,
761
+ dragData,
762
+ dragActions: editable ? MOVE_OR_COPY : COPY_ONLY,
763
+ onDragStart: (ev) => {
764
+ if (ev.target !== rootRef.current)
765
+ return;
766
+ if (!view.dragStart())
767
+ ev.preventDefault();
768
+ },
769
+ onDrag: (ev) => {
770
+ if (ev.target === rootRef.current)
771
+ view.dragMoved(ev.ctrlKey, ev.altKey);
772
+ },
773
+ onDragEnd: (ev) => {
774
+ if (ev.target === rootRef.current)
775
+ view.dragEnd(ev.action, ev.dropped);
776
+ },
777
+ ...(editable
778
+ ? {
779
+ dropAccept: DROP_TYPES,
780
+ onDragOver: (ev) => {
781
+ if (!view.dragOver(ev.x, ev.y))
782
+ ev.reject();
783
+ },
784
+ onDragLeave: () => view.dragLeave(),
785
+ onDrop: (ev) => {
786
+ const settle = (answer) => {
787
+ if (answer)
788
+ ev.accept(answer);
789
+ else
790
+ ev.reject();
791
+ };
792
+ const answer = view.drop(ev);
793
+ if (answer instanceof Promise)
794
+ return answer.then(settle);
795
+ settle(answer);
796
+ return undefined;
797
+ },
798
+ }
799
+ : null),
800
+ onFocus: props.onFocus,
801
+ onBlur: props.onBlur,
802
+ }, chrome, hx('box', {
803
+ ref: setScroller,
804
+ // a press inside focuses the editor, not the viewport it scrolls in
805
+ focusable: false,
806
+ // `flexBasis: 'auto'` is load-bearing: a scroll box that grows
807
+ // takes a zero basis, so an editor nobody gave a height collapsed
808
+ // to its border. With it the viewport is its content's height — a
809
+ // composer grows as it is typed in, up to the frame's `maxHeight`,
810
+ // and past that it shrinks to fit and scrolls; given a height or a
811
+ // `flexGrow`, it fills.
812
+ style: {
813
+ overflow: 'scroll',
814
+ flexGrow: 1,
815
+ flexShrink: 1,
816
+ flexBasis: 'auto',
817
+ flexDirection: 'column',
818
+ },
819
+ ...(virtualizing
820
+ ? { onViewport: windowed.onViewport, onScroll: windowed.onScroll }
821
+ : null),
822
+ }, hx('box', {
823
+ style: {
824
+ flexDirection: 'column',
825
+ gap: look.blockGap,
826
+ padding: Math.round(look.size * 0.85),
827
+ flexGrow: 1,
828
+ ...styles?.content,
829
+ },
830
+ },
831
+ // the blocks outside a long document's window, as space
832
+ windowed.above > 0
833
+ ? hx('box', {
834
+ key: 'spacer:before',
835
+ style: { flexShrink: 0, height: windowed.above },
836
+ })
837
+ : null, ...blocks, windowed.below > 0
838
+ ? hx('box', {
839
+ key: 'spacer:after',
840
+ style: { flexShrink: 0, height: windowed.below },
841
+ })
842
+ : null)), linkPopup, suggestionPopup);
843
+ }
844
+ // --- the rest of the surface -------------------------------------------------
845
+ export { ROOT_ELEMENT as RICH_EDITOR_ELEMENT, TEXT_ELEMENT as RICH_EDITOR_TEXT_ELEMENT, };
846
+ export { RichEditorView };
847
+ export { schema, nodes, marks } from './schema.js';
848
+ export { defaultPlugins, editingKeymap, markdownInputRules } from './keymap.js';
849
+ export { dedentCode, goToCell, indentCode, insertHorizontalRule, isBlockActive, isMarkActive, markAttrs, setLink, setTaskChecked, splitItem, toggleBlockType, toggleList, toggleTaskList, toggleWrap, } from './commands.js';
850
+ export { docFromMarkdown, markdownCodec, markdownFromDoc, docFromText, textFromDoc, } from './markdown.js';
851
+ export { docFromHTML, htmlFromContent } from './html.js';
852
+ export { DEFAULT_TOOLBAR, toolbarItems } from './toolbar.js';
853
+ export { acceptSuggestion, dismissSuggestion, filterSuggestions, selectSuggestion, suggesterFor, suggestionState, suggestions, } from './suggest.js';
854
+ export { addColumnAfter, addColumnBefore, addRowAfter, addRowBefore, columnAlign, deleteColumn, deleteRow, deleteTable, insertTable, isInTable, setColumnAlign, tableRepair, } from './tables.js';
855
+ export { remoteCaret } from './collab.js';
856
+ //# sourceMappingURL=index.js.map