prosekit-registry 0.0.21 → 0.0.22

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 (482) hide show
  1. package/dist/r/lit-example-minimal.json +1 -1
  2. package/dist/r/lit-example-slash-menu.json +2 -2
  3. package/dist/r/lit-example-table.json +2 -2
  4. package/dist/r/lit-example-toolbar.json +2 -2
  5. package/dist/r/lit-sample-sample-doc-table.json +1 -1
  6. package/dist/r/lit-sample-sample-uploader.json +1 -1
  7. package/dist/r/lit-ui-button.json +2 -2
  8. package/dist/r/lit-ui-editor-context.json +1 -1
  9. package/dist/r/lit-ui-image-upload-popover.json +2 -2
  10. package/dist/r/lit-ui-slash-menu.json +4 -4
  11. package/dist/r/lit-ui-table-handle.json +2 -2
  12. package/dist/r/lit-ui-toolbar.json +1 -1
  13. package/dist/r/preact-example-block-handle.json +2 -2
  14. package/dist/r/preact-example-blockquote.json +2 -2
  15. package/dist/r/preact-example-bold.json +2 -2
  16. package/dist/r/preact-example-change-tracking.json +3 -3
  17. package/dist/r/preact-example-code-block-themes.json +2 -2
  18. package/dist/r/preact-example-code-block.json +2 -2
  19. package/dist/r/preact-example-code.json +2 -2
  20. package/dist/r/preact-example-drop-cursor.json +2 -2
  21. package/dist/r/preact-example-emoji-rules.json +2 -2
  22. package/dist/r/preact-example-full.json +2 -2
  23. package/dist/r/preact-example-gap-cursor.json +2 -2
  24. package/dist/r/preact-example-hard-break.json +2 -2
  25. package/dist/r/preact-example-heading.json +2 -2
  26. package/dist/r/preact-example-horizontal-rule.json +2 -2
  27. package/dist/r/preact-example-image-view.json +2 -2
  28. package/dist/r/preact-example-inline-menu.json +2 -2
  29. package/dist/r/preact-example-italic.json +2 -2
  30. package/dist/r/preact-example-keymap.json +2 -2
  31. package/dist/r/preact-example-link-mark-view.json +2 -2
  32. package/dist/r/preact-example-link.json +2 -2
  33. package/dist/r/preact-example-list-custom-checkbox.json +2 -2
  34. package/dist/r/preact-example-list.json +2 -2
  35. package/dist/r/preact-example-loro.json +2 -2
  36. package/dist/r/preact-example-mark-rule.json +2 -2
  37. package/dist/r/preact-example-minimal.json +1 -1
  38. package/dist/r/preact-example-placeholder.json +2 -2
  39. package/dist/r/preact-example-readonly.json +2 -2
  40. package/dist/r/preact-example-rtl.json +2 -2
  41. package/dist/r/preact-example-save-html.json +2 -2
  42. package/dist/r/preact-example-save-json.json +2 -2
  43. package/dist/r/preact-example-save-markdown.json +2 -2
  44. package/dist/r/preact-example-search.json +2 -2
  45. package/dist/r/preact-example-slash-menu.json +2 -2
  46. package/dist/r/preact-example-strike.json +2 -2
  47. package/dist/r/preact-example-table.json +2 -2
  48. package/dist/r/preact-example-temml.json +2 -2
  49. package/dist/r/preact-example-text-align.json +2 -2
  50. package/dist/r/preact-example-text-color.json +3 -3
  51. package/dist/r/preact-example-toolbar.json +2 -2
  52. package/dist/r/preact-example-typography.json +2 -2
  53. package/dist/r/preact-example-underline.json +2 -2
  54. package/dist/r/preact-example-unmount.json +2 -2
  55. package/dist/r/preact-example-user-menu-dynamic.json +2 -2
  56. package/dist/r/preact-example-user-menu.json +2 -2
  57. package/dist/r/preact-example-view-adapter.json +2 -2
  58. package/dist/r/preact-example-word-counter.json +2 -2
  59. package/dist/r/preact-example-yjs.json +2 -2
  60. package/dist/r/preact-sample-define-atom-block.json +1 -1
  61. package/dist/r/preact-sample-sample-doc-block-handle.json +1 -1
  62. package/dist/r/preact-sample-sample-doc-bold.json +1 -1
  63. package/dist/r/preact-sample-sample-doc-code-block.json +1 -1
  64. package/dist/r/preact-sample-sample-doc-code.json +1 -1
  65. package/dist/r/preact-sample-sample-doc-drop-cursor.json +1 -1
  66. package/dist/r/preact-sample-sample-doc-full.json +1 -1
  67. package/dist/r/preact-sample-sample-doc-gap-cursor.json +1 -1
  68. package/dist/r/preact-sample-sample-doc-hard-break.json +1 -1
  69. package/dist/r/preact-sample-sample-doc-heading.json +1 -1
  70. package/dist/r/preact-sample-sample-doc-image.json +1 -1
  71. package/dist/r/preact-sample-sample-doc-inline-menu.json +1 -1
  72. package/dist/r/preact-sample-sample-doc-italic.json +1 -1
  73. package/dist/r/preact-sample-sample-doc-link-mark-view.json +1 -1
  74. package/dist/r/preact-sample-sample-doc-link.json +1 -1
  75. package/dist/r/preact-sample-sample-doc-list-custom-checkbox.json +1 -1
  76. package/dist/r/preact-sample-sample-doc-list.json +1 -1
  77. package/dist/r/preact-sample-sample-doc-readonly.json +1 -1
  78. package/dist/r/preact-sample-sample-doc-rtl.json +1 -1
  79. package/dist/r/preact-sample-sample-doc-search.json +1 -1
  80. package/dist/r/preact-sample-sample-doc-strike.json +1 -1
  81. package/dist/r/preact-sample-sample-doc-table.json +1 -1
  82. package/dist/r/preact-sample-sample-doc-tex.json +1 -1
  83. package/dist/r/preact-sample-sample-doc-text-align.json +1 -1
  84. package/dist/r/preact-sample-sample-doc-text-color.json +1 -1
  85. package/dist/r/preact-sample-sample-doc-typography.json +1 -1
  86. package/dist/r/preact-sample-sample-doc-underline.json +1 -1
  87. package/dist/r/preact-sample-sample-doc-view-adapter.json +1 -1
  88. package/dist/r/preact-sample-sample-doc-word-counter.json +1 -1
  89. package/dist/r/preact-sample-sample-uploader.json +1 -1
  90. package/dist/r/preact-ui-block-handle.json +2 -2
  91. package/dist/r/preact-ui-button.json +2 -2
  92. package/dist/r/preact-ui-code-block-view.json +1 -1
  93. package/dist/r/preact-ui-drop-indicator.json +1 -1
  94. package/dist/r/preact-ui-image-upload-popover.json +2 -2
  95. package/dist/r/preact-ui-image-view.json +1 -1
  96. package/dist/r/preact-ui-inline-menu.json +2 -2
  97. package/dist/r/preact-ui-search.json +2 -2
  98. package/dist/r/preact-ui-slash-menu.json +4 -4
  99. package/dist/r/preact-ui-table-handle.json +2 -2
  100. package/dist/r/preact-ui-tag-menu.json +2 -2
  101. package/dist/r/preact-ui-toolbar.json +1 -1
  102. package/dist/r/preact-ui-user-menu.json +2 -2
  103. package/dist/r/preact-ui-word-counter.json +1 -1
  104. package/dist/r/react-example-block-handle.json +2 -2
  105. package/dist/r/react-example-blockquote.json +2 -2
  106. package/dist/r/react-example-bold.json +2 -2
  107. package/dist/r/react-example-change-tracking.json +3 -3
  108. package/dist/r/react-example-code-block-themes.json +2 -2
  109. package/dist/r/react-example-code-block.json +2 -2
  110. package/dist/r/react-example-code.json +2 -2
  111. package/dist/r/react-example-drop-cursor.json +2 -2
  112. package/dist/r/react-example-emoji-rules.json +2 -2
  113. package/dist/r/react-example-full.json +2 -2
  114. package/dist/r/react-example-gap-cursor.json +2 -2
  115. package/dist/r/react-example-hard-break.json +2 -2
  116. package/dist/r/react-example-heading.json +2 -2
  117. package/dist/r/react-example-horizontal-rule.json +2 -2
  118. package/dist/r/react-example-image-view.json +2 -2
  119. package/dist/r/react-example-inline-menu.json +2 -2
  120. package/dist/r/react-example-italic.json +2 -2
  121. package/dist/r/react-example-keymap.json +2 -2
  122. package/dist/r/react-example-link-mark-view.json +2 -2
  123. package/dist/r/react-example-link.json +2 -2
  124. package/dist/r/react-example-list-custom-checkbox.json +2 -2
  125. package/dist/r/react-example-list.json +2 -2
  126. package/dist/r/react-example-loro.json +2 -2
  127. package/dist/r/react-example-mark-rule.json +2 -2
  128. package/dist/r/react-example-minimal.json +1 -1
  129. package/dist/r/react-example-notion.json +6 -6
  130. package/dist/r/react-example-page.json +2 -2
  131. package/dist/r/react-example-placeholder.json +2 -2
  132. package/dist/r/react-example-readonly.json +2 -2
  133. package/dist/r/react-example-rtl.json +2 -2
  134. package/dist/r/react-example-save-html.json +2 -2
  135. package/dist/r/react-example-save-json.json +2 -2
  136. package/dist/r/react-example-save-markdown.json +2 -2
  137. package/dist/r/react-example-search.json +2 -2
  138. package/dist/r/react-example-slash-menu.json +2 -2
  139. package/dist/r/react-example-strike.json +2 -2
  140. package/dist/r/react-example-table.json +2 -2
  141. package/dist/r/react-example-temml.json +2 -2
  142. package/dist/r/react-example-text-align.json +2 -2
  143. package/dist/r/react-example-text-color.json +3 -3
  144. package/dist/r/react-example-toolbar.json +2 -2
  145. package/dist/r/react-example-tweet.json +2 -2
  146. package/dist/r/react-example-typography.json +2 -2
  147. package/dist/r/react-example-underline.json +2 -2
  148. package/dist/r/react-example-unmount.json +2 -2
  149. package/dist/r/react-example-user-menu-dynamic.json +2 -2
  150. package/dist/r/react-example-user-menu.json +2 -2
  151. package/dist/r/react-example-view-adapter.json +2 -2
  152. package/dist/r/react-example-word-counter.json +2 -2
  153. package/dist/r/react-example-yjs.json +2 -2
  154. package/dist/r/react-sample-define-atom-block.json +1 -1
  155. package/dist/r/react-sample-sample-doc-block-handle.json +1 -1
  156. package/dist/r/react-sample-sample-doc-bold.json +1 -1
  157. package/dist/r/react-sample-sample-doc-code-block.json +1 -1
  158. package/dist/r/react-sample-sample-doc-code.json +1 -1
  159. package/dist/r/react-sample-sample-doc-drop-cursor.json +1 -1
  160. package/dist/r/react-sample-sample-doc-full.json +1 -1
  161. package/dist/r/react-sample-sample-doc-gap-cursor.json +1 -1
  162. package/dist/r/react-sample-sample-doc-hard-break.json +1 -1
  163. package/dist/r/react-sample-sample-doc-heading.json +1 -1
  164. package/dist/r/react-sample-sample-doc-image.json +1 -1
  165. package/dist/r/react-sample-sample-doc-inline-menu.json +1 -1
  166. package/dist/r/react-sample-sample-doc-italic.json +1 -1
  167. package/dist/r/react-sample-sample-doc-link-mark-view.json +1 -1
  168. package/dist/r/react-sample-sample-doc-link.json +1 -1
  169. package/dist/r/react-sample-sample-doc-list-custom-checkbox.json +1 -1
  170. package/dist/r/react-sample-sample-doc-list.json +1 -1
  171. package/dist/r/react-sample-sample-doc-notion.json +1 -1
  172. package/dist/r/react-sample-sample-doc-page.json +1 -1
  173. package/dist/r/react-sample-sample-doc-readonly.json +1 -1
  174. package/dist/r/react-sample-sample-doc-rtl.json +1 -1
  175. package/dist/r/react-sample-sample-doc-search.json +1 -1
  176. package/dist/r/react-sample-sample-doc-strike.json +1 -1
  177. package/dist/r/react-sample-sample-doc-table.json +1 -1
  178. package/dist/r/react-sample-sample-doc-tex.json +1 -1
  179. package/dist/r/react-sample-sample-doc-text-align.json +1 -1
  180. package/dist/r/react-sample-sample-doc-text-color.json +1 -1
  181. package/dist/r/react-sample-sample-doc-tweet.json +1 -1
  182. package/dist/r/react-sample-sample-doc-typography.json +1 -1
  183. package/dist/r/react-sample-sample-doc-underline.json +1 -1
  184. package/dist/r/react-sample-sample-doc-view-adapter.json +1 -1
  185. package/dist/r/react-sample-sample-doc-word-counter.json +1 -1
  186. package/dist/r/react-sample-sample-uploader.json +1 -1
  187. package/dist/r/react-ui-block-handle.json +2 -2
  188. package/dist/r/react-ui-button.json +2 -2
  189. package/dist/r/react-ui-code-block-view.json +1 -1
  190. package/dist/r/react-ui-drop-indicator.json +1 -1
  191. package/dist/r/react-ui-image-upload-popover.json +2 -2
  192. package/dist/r/react-ui-image-view.json +1 -1
  193. package/dist/r/react-ui-inline-menu.json +2 -2
  194. package/dist/r/react-ui-search.json +2 -2
  195. package/dist/r/react-ui-slash-menu.json +4 -4
  196. package/dist/r/react-ui-table-handle.json +2 -2
  197. package/dist/r/react-ui-tag-menu.json +2 -2
  198. package/dist/r/react-ui-toolbar.json +1 -1
  199. package/dist/r/react-ui-user-menu.json +2 -2
  200. package/dist/r/react-ui-word-counter.json +1 -1
  201. package/dist/r/registry.json +480 -480
  202. package/dist/r/solid-example-block-handle.json +2 -2
  203. package/dist/r/solid-example-blockquote.json +2 -2
  204. package/dist/r/solid-example-bold.json +2 -2
  205. package/dist/r/solid-example-change-tracking.json +3 -3
  206. package/dist/r/solid-example-code-block-themes.json +2 -2
  207. package/dist/r/solid-example-code-block.json +2 -2
  208. package/dist/r/solid-example-code.json +2 -2
  209. package/dist/r/solid-example-drop-cursor.json +2 -2
  210. package/dist/r/solid-example-emoji-rules.json +2 -2
  211. package/dist/r/solid-example-full.json +2 -2
  212. package/dist/r/solid-example-gap-cursor.json +2 -2
  213. package/dist/r/solid-example-hard-break.json +2 -2
  214. package/dist/r/solid-example-heading.json +2 -2
  215. package/dist/r/solid-example-horizontal-rule.json +2 -2
  216. package/dist/r/solid-example-image-view.json +2 -2
  217. package/dist/r/solid-example-inline-menu.json +2 -2
  218. package/dist/r/solid-example-italic.json +2 -2
  219. package/dist/r/solid-example-keymap.json +2 -2
  220. package/dist/r/solid-example-link-mark-view.json +2 -2
  221. package/dist/r/solid-example-link.json +2 -2
  222. package/dist/r/solid-example-list-custom-checkbox.json +2 -2
  223. package/dist/r/solid-example-list.json +2 -2
  224. package/dist/r/solid-example-loro.json +2 -2
  225. package/dist/r/solid-example-mark-rule.json +2 -2
  226. package/dist/r/solid-example-minimal.json +1 -1
  227. package/dist/r/solid-example-placeholder.json +2 -2
  228. package/dist/r/solid-example-readonly.json +2 -2
  229. package/dist/r/solid-example-rtl.json +2 -2
  230. package/dist/r/solid-example-save-html.json +2 -2
  231. package/dist/r/solid-example-save-json.json +2 -2
  232. package/dist/r/solid-example-save-markdown.json +2 -2
  233. package/dist/r/solid-example-search.json +2 -2
  234. package/dist/r/solid-example-slash-menu.json +2 -2
  235. package/dist/r/solid-example-strike.json +2 -2
  236. package/dist/r/solid-example-table.json +2 -2
  237. package/dist/r/solid-example-temml.json +2 -2
  238. package/dist/r/solid-example-text-align.json +2 -2
  239. package/dist/r/solid-example-text-color.json +3 -3
  240. package/dist/r/solid-example-toolbar.json +2 -2
  241. package/dist/r/solid-example-typography.json +2 -2
  242. package/dist/r/solid-example-underline.json +2 -2
  243. package/dist/r/solid-example-unmount.json +2 -2
  244. package/dist/r/solid-example-user-menu-dynamic.json +2 -2
  245. package/dist/r/solid-example-user-menu.json +2 -2
  246. package/dist/r/solid-example-view-adapter.json +2 -2
  247. package/dist/r/solid-example-word-counter.json +2 -2
  248. package/dist/r/solid-example-yjs.json +2 -2
  249. package/dist/r/solid-sample-define-atom-block.json +1 -1
  250. package/dist/r/solid-sample-sample-doc-block-handle.json +1 -1
  251. package/dist/r/solid-sample-sample-doc-bold.json +1 -1
  252. package/dist/r/solid-sample-sample-doc-code-block.json +1 -1
  253. package/dist/r/solid-sample-sample-doc-code.json +1 -1
  254. package/dist/r/solid-sample-sample-doc-drop-cursor.json +1 -1
  255. package/dist/r/solid-sample-sample-doc-full.json +1 -1
  256. package/dist/r/solid-sample-sample-doc-gap-cursor.json +1 -1
  257. package/dist/r/solid-sample-sample-doc-hard-break.json +1 -1
  258. package/dist/r/solid-sample-sample-doc-heading.json +1 -1
  259. package/dist/r/solid-sample-sample-doc-image.json +1 -1
  260. package/dist/r/solid-sample-sample-doc-inline-menu.json +1 -1
  261. package/dist/r/solid-sample-sample-doc-italic.json +1 -1
  262. package/dist/r/solid-sample-sample-doc-link-mark-view.json +1 -1
  263. package/dist/r/solid-sample-sample-doc-link.json +1 -1
  264. package/dist/r/solid-sample-sample-doc-list-custom-checkbox.json +1 -1
  265. package/dist/r/solid-sample-sample-doc-list.json +1 -1
  266. package/dist/r/solid-sample-sample-doc-readonly.json +1 -1
  267. package/dist/r/solid-sample-sample-doc-rtl.json +1 -1
  268. package/dist/r/solid-sample-sample-doc-search.json +1 -1
  269. package/dist/r/solid-sample-sample-doc-strike.json +1 -1
  270. package/dist/r/solid-sample-sample-doc-table.json +1 -1
  271. package/dist/r/solid-sample-sample-doc-tex.json +1 -1
  272. package/dist/r/solid-sample-sample-doc-text-align.json +1 -1
  273. package/dist/r/solid-sample-sample-doc-text-color.json +1 -1
  274. package/dist/r/solid-sample-sample-doc-typography.json +1 -1
  275. package/dist/r/solid-sample-sample-doc-underline.json +1 -1
  276. package/dist/r/solid-sample-sample-doc-view-adapter.json +1 -1
  277. package/dist/r/solid-sample-sample-doc-word-counter.json +1 -1
  278. package/dist/r/solid-sample-sample-uploader.json +1 -1
  279. package/dist/r/solid-ui-block-handle.json +2 -2
  280. package/dist/r/solid-ui-button.json +2 -2
  281. package/dist/r/solid-ui-code-block-view.json +1 -1
  282. package/dist/r/solid-ui-drop-indicator.json +1 -1
  283. package/dist/r/solid-ui-image-upload-popover.json +2 -2
  284. package/dist/r/solid-ui-image-view.json +1 -1
  285. package/dist/r/solid-ui-inline-menu.json +2 -2
  286. package/dist/r/solid-ui-search.json +2 -2
  287. package/dist/r/solid-ui-slash-menu.json +4 -4
  288. package/dist/r/solid-ui-table-handle.json +2 -2
  289. package/dist/r/solid-ui-tag-menu.json +2 -2
  290. package/dist/r/solid-ui-toolbar.json +1 -1
  291. package/dist/r/solid-ui-user-menu.json +2 -2
  292. package/dist/r/solid-ui-word-counter.json +1 -1
  293. package/dist/r/svelte-example-block-handle.json +2 -2
  294. package/dist/r/svelte-example-blockquote.json +2 -2
  295. package/dist/r/svelte-example-bold.json +2 -2
  296. package/dist/r/svelte-example-change-tracking.json +3 -3
  297. package/dist/r/svelte-example-code-block-themes.json +2 -2
  298. package/dist/r/svelte-example-code-block.json +2 -2
  299. package/dist/r/svelte-example-code.json +2 -2
  300. package/dist/r/svelte-example-drop-cursor.json +2 -2
  301. package/dist/r/svelte-example-emoji-rules.json +2 -2
  302. package/dist/r/svelte-example-full.json +2 -2
  303. package/dist/r/svelte-example-gap-cursor.json +2 -2
  304. package/dist/r/svelte-example-hard-break.json +2 -2
  305. package/dist/r/svelte-example-heading.json +2 -2
  306. package/dist/r/svelte-example-horizontal-rule.json +2 -2
  307. package/dist/r/svelte-example-image-view.json +2 -2
  308. package/dist/r/svelte-example-inline-menu.json +2 -2
  309. package/dist/r/svelte-example-italic.json +2 -2
  310. package/dist/r/svelte-example-katex.json +2 -2
  311. package/dist/r/svelte-example-keymap.json +2 -2
  312. package/dist/r/svelte-example-link-mark-view.json +2 -2
  313. package/dist/r/svelte-example-link.json +2 -2
  314. package/dist/r/svelte-example-list-custom-checkbox.json +2 -2
  315. package/dist/r/svelte-example-list.json +2 -2
  316. package/dist/r/svelte-example-loro.json +2 -2
  317. package/dist/r/svelte-example-mark-rule.json +2 -2
  318. package/dist/r/svelte-example-minimal.json +1 -1
  319. package/dist/r/svelte-example-page.json +2 -2
  320. package/dist/r/svelte-example-placeholder.json +2 -2
  321. package/dist/r/svelte-example-readonly.json +2 -2
  322. package/dist/r/svelte-example-rtl.json +2 -2
  323. package/dist/r/svelte-example-save-html.json +2 -2
  324. package/dist/r/svelte-example-save-json.json +2 -2
  325. package/dist/r/svelte-example-save-markdown.json +2 -2
  326. package/dist/r/svelte-example-search.json +2 -2
  327. package/dist/r/svelte-example-slash-menu.json +2 -2
  328. package/dist/r/svelte-example-strike.json +2 -2
  329. package/dist/r/svelte-example-table.json +2 -2
  330. package/dist/r/svelte-example-text-align.json +2 -2
  331. package/dist/r/svelte-example-text-color.json +3 -3
  332. package/dist/r/svelte-example-toolbar.json +2 -2
  333. package/dist/r/svelte-example-typography.json +2 -2
  334. package/dist/r/svelte-example-underline.json +2 -2
  335. package/dist/r/svelte-example-unmount.json +2 -2
  336. package/dist/r/svelte-example-user-menu-dynamic.json +2 -2
  337. package/dist/r/svelte-example-user-menu.json +2 -2
  338. package/dist/r/svelte-example-view-adapter.json +2 -2
  339. package/dist/r/svelte-example-word-counter.json +2 -2
  340. package/dist/r/svelte-example-yjs.json +2 -2
  341. package/dist/r/svelte-sample-define-atom-block.json +1 -1
  342. package/dist/r/svelte-sample-sample-doc-block-handle.json +1 -1
  343. package/dist/r/svelte-sample-sample-doc-bold.json +1 -1
  344. package/dist/r/svelte-sample-sample-doc-code-block.json +1 -1
  345. package/dist/r/svelte-sample-sample-doc-code.json +1 -1
  346. package/dist/r/svelte-sample-sample-doc-drop-cursor.json +1 -1
  347. package/dist/r/svelte-sample-sample-doc-full.json +1 -1
  348. package/dist/r/svelte-sample-sample-doc-gap-cursor.json +1 -1
  349. package/dist/r/svelte-sample-sample-doc-hard-break.json +1 -1
  350. package/dist/r/svelte-sample-sample-doc-heading.json +1 -1
  351. package/dist/r/svelte-sample-sample-doc-image.json +1 -1
  352. package/dist/r/svelte-sample-sample-doc-inline-menu.json +1 -1
  353. package/dist/r/svelte-sample-sample-doc-italic.json +1 -1
  354. package/dist/r/svelte-sample-sample-doc-link-mark-view.json +1 -1
  355. package/dist/r/svelte-sample-sample-doc-link.json +1 -1
  356. package/dist/r/svelte-sample-sample-doc-list-custom-checkbox.json +1 -1
  357. package/dist/r/svelte-sample-sample-doc-list.json +1 -1
  358. package/dist/r/svelte-sample-sample-doc-page.json +1 -1
  359. package/dist/r/svelte-sample-sample-doc-readonly.json +1 -1
  360. package/dist/r/svelte-sample-sample-doc-rtl.json +1 -1
  361. package/dist/r/svelte-sample-sample-doc-search.json +1 -1
  362. package/dist/r/svelte-sample-sample-doc-strike.json +1 -1
  363. package/dist/r/svelte-sample-sample-doc-table.json +1 -1
  364. package/dist/r/svelte-sample-sample-doc-tex.json +1 -1
  365. package/dist/r/svelte-sample-sample-doc-text-align.json +1 -1
  366. package/dist/r/svelte-sample-sample-doc-text-color.json +1 -1
  367. package/dist/r/svelte-sample-sample-doc-typography.json +1 -1
  368. package/dist/r/svelte-sample-sample-doc-underline.json +1 -1
  369. package/dist/r/svelte-sample-sample-doc-view-adapter.json +1 -1
  370. package/dist/r/svelte-sample-sample-doc-word-counter.json +1 -1
  371. package/dist/r/svelte-sample-sample-uploader.json +1 -1
  372. package/dist/r/svelte-ui-block-handle.json +2 -2
  373. package/dist/r/svelte-ui-button.json +2 -2
  374. package/dist/r/svelte-ui-code-block-view.json +1 -1
  375. package/dist/r/svelte-ui-drop-indicator.json +1 -1
  376. package/dist/r/svelte-ui-image-upload-popover.json +2 -2
  377. package/dist/r/svelte-ui-image-view.json +1 -1
  378. package/dist/r/svelte-ui-inline-menu.json +2 -2
  379. package/dist/r/svelte-ui-search.json +2 -2
  380. package/dist/r/svelte-ui-slash-menu.json +4 -4
  381. package/dist/r/svelte-ui-table-handle.json +2 -2
  382. package/dist/r/svelte-ui-tag-menu.json +2 -2
  383. package/dist/r/svelte-ui-toolbar.json +1 -1
  384. package/dist/r/svelte-ui-user-menu.json +2 -2
  385. package/dist/r/svelte-ui-word-counter.json +1 -1
  386. package/dist/r/vanilla-example-minimal.json +1 -1
  387. package/dist/r/vanilla-example-slash-menu.json +2 -2
  388. package/dist/r/vanilla-ui-slash-menu.json +4 -4
  389. package/dist/r/vue-example-block-handle.json +2 -2
  390. package/dist/r/vue-example-blockquote.json +2 -2
  391. package/dist/r/vue-example-bold.json +2 -2
  392. package/dist/r/vue-example-change-tracking.json +3 -3
  393. package/dist/r/vue-example-code-block-themes.json +2 -2
  394. package/dist/r/vue-example-code-block.json +2 -2
  395. package/dist/r/vue-example-code.json +2 -2
  396. package/dist/r/vue-example-drop-cursor.json +2 -2
  397. package/dist/r/vue-example-emoji-rules.json +2 -2
  398. package/dist/r/vue-example-full.json +2 -2
  399. package/dist/r/vue-example-gap-cursor.json +2 -2
  400. package/dist/r/vue-example-hard-break.json +2 -2
  401. package/dist/r/vue-example-heading.json +2 -2
  402. package/dist/r/vue-example-horizontal-rule.json +2 -2
  403. package/dist/r/vue-example-image-view.json +2 -2
  404. package/dist/r/vue-example-inline-menu.json +2 -2
  405. package/dist/r/vue-example-italic.json +2 -2
  406. package/dist/r/vue-example-katex.json +2 -2
  407. package/dist/r/vue-example-keymap.json +2 -2
  408. package/dist/r/vue-example-link-mark-view.json +2 -2
  409. package/dist/r/vue-example-link.json +2 -2
  410. package/dist/r/vue-example-list-custom-checkbox.json +2 -2
  411. package/dist/r/vue-example-list.json +2 -2
  412. package/dist/r/vue-example-loro.json +2 -2
  413. package/dist/r/vue-example-mark-rule.json +2 -2
  414. package/dist/r/vue-example-minimal.json +1 -1
  415. package/dist/r/vue-example-placeholder.json +2 -2
  416. package/dist/r/vue-example-readonly.json +2 -2
  417. package/dist/r/vue-example-rtl.json +2 -2
  418. package/dist/r/vue-example-save-html.json +2 -2
  419. package/dist/r/vue-example-save-json.json +2 -2
  420. package/dist/r/vue-example-save-markdown.json +2 -2
  421. package/dist/r/vue-example-search.json +2 -2
  422. package/dist/r/vue-example-slash-menu.json +2 -2
  423. package/dist/r/vue-example-strike.json +2 -2
  424. package/dist/r/vue-example-table.json +2 -2
  425. package/dist/r/vue-example-text-align.json +2 -2
  426. package/dist/r/vue-example-text-color.json +3 -3
  427. package/dist/r/vue-example-toolbar.json +2 -2
  428. package/dist/r/vue-example-tweet.json +2 -2
  429. package/dist/r/vue-example-typography.json +2 -2
  430. package/dist/r/vue-example-underline.json +2 -2
  431. package/dist/r/vue-example-unmount.json +2 -2
  432. package/dist/r/vue-example-user-menu-dynamic.json +2 -2
  433. package/dist/r/vue-example-user-menu.json +2 -2
  434. package/dist/r/vue-example-view-adapter.json +2 -2
  435. package/dist/r/vue-example-word-counter.json +2 -2
  436. package/dist/r/vue-example-yjs.json +2 -2
  437. package/dist/r/vue-sample-define-atom-block.json +1 -1
  438. package/dist/r/vue-sample-sample-doc-block-handle.json +1 -1
  439. package/dist/r/vue-sample-sample-doc-bold.json +1 -1
  440. package/dist/r/vue-sample-sample-doc-code-block.json +1 -1
  441. package/dist/r/vue-sample-sample-doc-code.json +1 -1
  442. package/dist/r/vue-sample-sample-doc-drop-cursor.json +1 -1
  443. package/dist/r/vue-sample-sample-doc-full.json +1 -1
  444. package/dist/r/vue-sample-sample-doc-gap-cursor.json +1 -1
  445. package/dist/r/vue-sample-sample-doc-hard-break.json +1 -1
  446. package/dist/r/vue-sample-sample-doc-heading.json +1 -1
  447. package/dist/r/vue-sample-sample-doc-image.json +1 -1
  448. package/dist/r/vue-sample-sample-doc-inline-menu.json +1 -1
  449. package/dist/r/vue-sample-sample-doc-italic.json +1 -1
  450. package/dist/r/vue-sample-sample-doc-link-mark-view.json +1 -1
  451. package/dist/r/vue-sample-sample-doc-link.json +1 -1
  452. package/dist/r/vue-sample-sample-doc-list-custom-checkbox.json +1 -1
  453. package/dist/r/vue-sample-sample-doc-list.json +1 -1
  454. package/dist/r/vue-sample-sample-doc-readonly.json +1 -1
  455. package/dist/r/vue-sample-sample-doc-rtl.json +1 -1
  456. package/dist/r/vue-sample-sample-doc-search.json +1 -1
  457. package/dist/r/vue-sample-sample-doc-strike.json +1 -1
  458. package/dist/r/vue-sample-sample-doc-table.json +1 -1
  459. package/dist/r/vue-sample-sample-doc-tex.json +1 -1
  460. package/dist/r/vue-sample-sample-doc-text-align.json +1 -1
  461. package/dist/r/vue-sample-sample-doc-text-color.json +1 -1
  462. package/dist/r/vue-sample-sample-doc-tweet.json +1 -1
  463. package/dist/r/vue-sample-sample-doc-typography.json +1 -1
  464. package/dist/r/vue-sample-sample-doc-underline.json +1 -1
  465. package/dist/r/vue-sample-sample-doc-view-adapter.json +1 -1
  466. package/dist/r/vue-sample-sample-doc-word-counter.json +1 -1
  467. package/dist/r/vue-sample-sample-uploader.json +1 -1
  468. package/dist/r/vue-ui-block-handle.json +2 -2
  469. package/dist/r/vue-ui-button.json +2 -2
  470. package/dist/r/vue-ui-code-block-view.json +1 -1
  471. package/dist/r/vue-ui-drop-indicator.json +1 -1
  472. package/dist/r/vue-ui-image-upload-popover.json +2 -2
  473. package/dist/r/vue-ui-image-view.json +1 -1
  474. package/dist/r/vue-ui-inline-menu.json +2 -2
  475. package/dist/r/vue-ui-search.json +2 -2
  476. package/dist/r/vue-ui-slash-menu.json +4 -4
  477. package/dist/r/vue-ui-table-handle.json +2 -2
  478. package/dist/r/vue-ui-tag-menu.json +2 -2
  479. package/dist/r/vue-ui-toolbar.json +1 -1
  480. package/dist/r/vue-ui-user-menu.json +2 -2
  481. package/dist/r/vue-ui-word-counter.json +1 -1
  482. package/package.json +13 -13
@@ -19,7 +19,7 @@
19
19
  "@base-ui/react",
20
20
  "@egoist/tailwindcss-icons",
21
21
  "@iconify-json/lucide",
22
- "prosekit@^0.20.0-beta.8"
22
+ "prosekit@^0.20.0"
23
23
  ],
24
24
  "files": [
25
25
  {
@@ -32,13 +32,13 @@
32
32
  "path": "registry/src/react/examples/notion/block-handle.tsx",
33
33
  "type": "registry:component",
34
34
  "target": "components/editor/examples/notion/block-handle.tsx",
35
- "content": "'use client'\n\nimport { Tooltip } from '@base-ui/react/tooltip'\nimport { BlockHandleAdd, BlockHandleDraggable, BlockHandlePopup, BlockHandlePositioner, BlockHandleRoot } from 'prosekit/react/block-handle'\n\nimport BlockHandleMenu from './block-handle-menu'\n\ninterface Props {\n enabled: boolean\n dir?: 'ltr' | 'rtl'\n}\n\nexport default function BlockHandle(props: Props) {\n if (!props.enabled) {\n return null\n }\n\n return (\n <Tooltip.Provider>\n <BlockHandleRoot>\n <BlockHandlePositioner\n placement={props.dir === 'rtl' ? 'right' : 'left'}\n className=\"block overflow-visible w-min h-min z-50 ease-out transition-transform duration-100 motion-reduce:transition-none\"\n >\n <BlockHandlePopup className=\"flex box-border origin-(--transform-origin) transition transition-discrete motion-reduce:transition-none duration-100 data-[state=closed]:duration-150 data-[state=closed]:opacity-0 starting:opacity-0 data-[state=closed]:scale-95 starting:scale-95\">\n <Tooltip.Root>\n <Tooltip.Trigger className=\"m-0 p-0\">\n <BlockHandleAdd className=\"h-6 w-6 cursor-pointer flex items-center box-border justify-center hover:bg-gray-100 dark:hover:bg-gray-800 rounded-sm text-gray-500/50 dark:text-gray-400/50\">\n <div className=\"i-lucide-plus size-5 block\" />\n </BlockHandleAdd>\n </Tooltip.Trigger>\n <Tooltip.Portal>\n <Tooltip.Positioner sideOffset={10} side=\"bottom\">\n <Tooltip.Popup className=\"\n flex flex-col justify-center items-center\n px-2 py-1\n rounded-md\n bg-[canvas]\n text-sm\n z-100\n origin-(--transform-origin)\n shadow-lg shadow-gray-200 outline-1 outline-gray-200\n transition-[transform,scale,opacity]\n data-ending-style:opacity-0 data-ending-style:scale-90\n data-instant:transition-none\n data-starting-style:opacity-0 data-starting-style:scale-90\n dark:shadow-none dark:outline-gray-300 dark:-outline-offset-1\">\n <span>\n <span>Click{' '}</span>\n <span className=\"opacity-50\">to add below</span>\n </span>\n <span>\n <span>Option-click{' '}</span>\n <span className=\"opacity-50\">to add above</span>\n </span>\n </Tooltip.Popup>\n </Tooltip.Positioner>\n </Tooltip.Portal>\n </Tooltip.Root>\n <Tooltip.Root>\n <Tooltip.Trigger className=\"m-0 p-0\">\n <BlockHandleMenu>\n <BlockHandleDraggable className=\"h-6 w-5 cursor-grab flex items-center box-border justify-center hover:bg-gray-100 dark:hover:bg-gray-800 rounded-sm text-gray-500/50 dark:text-gray-400/50\">\n <div className=\"i-lucide-grip-vertical size-5 block\" />\n </BlockHandleDraggable>\n </BlockHandleMenu>\n </Tooltip.Trigger>\n <Tooltip.Portal>\n <Tooltip.Positioner sideOffset={10} side=\"bottom\">\n <Tooltip.Popup className=\"\n flex flex-col justify-center items-center\n px-2 py-1\n rounded-md\n bg-[canvas]\n text-sm\n z-100\n origin-(--transform-origin)\n shadow-lg shadow-gray-200 outline-1 outline-gray-200\n transition-[transform,scale,opacity]\n data-ending-style:opacity-0 data-ending-style:scale-90\n data-instant:transition-none\n data-starting-style:opacity-0 data-starting-style:scale-90\n dark:shadow-none dark:outline-gray-300 dark:-outline-offset-1\">\n <span>\n <span>Drag{' '}</span>\n <span className=\"opacity-50\">to move</span>\n </span>\n <span>\n <span>Click{' '}</span>\n <span className=\"opacity-50\">to open menu</span>\n </span>\n </Tooltip.Popup>\n </Tooltip.Positioner>\n </Tooltip.Portal>\n </Tooltip.Root>\n </BlockHandlePopup>\n </BlockHandlePositioner>\n </BlockHandleRoot>\n </Tooltip.Provider>\n )\n}\n"
35
+ "content": "'use client'\n\nimport { Tooltip } from '@base-ui/react/tooltip'\nimport { BlockHandleAdd, BlockHandleDraggable, BlockHandlePopup, BlockHandlePositioner, BlockHandleRoot } from 'prosekit/react/block-handle'\n\nimport BlockHandleMenu from './block-handle-menu'\n\ninterface Props {\n enabled: boolean\n dir?: 'ltr' | 'rtl'\n}\n\nexport default function BlockHandle(props: Props) {\n if (!props.enabled) {\n return null\n }\n\n return (\n <Tooltip.Provider>\n <BlockHandleRoot>\n <BlockHandlePositioner\n placement={props.dir === 'rtl' ? 'right' : 'left'}\n className=\"block overflow-visible w-min h-min z-50 ease-out transition-transform duration-100 motion-reduce:transition-none\"\n >\n <BlockHandlePopup className=\"flex box-border origin-(--transform-origin) transition-[opacity,scale] transition-discrete motion-reduce:transition-none duration-100 data-[state=closed]:duration-150 data-[state=closed]:opacity-0 starting:opacity-0 data-[state=closed]:scale-95 starting:scale-95\">\n <Tooltip.Root>\n <Tooltip.Trigger className=\"m-0 p-0\">\n <BlockHandleAdd className=\"h-6 w-6 cursor-pointer flex items-center box-border justify-center hover:bg-gray-100 dark:hover:bg-gray-800 rounded-sm text-gray-500/50 dark:text-gray-400/50\">\n <div className=\"i-lucide-plus size-5 block\" />\n </BlockHandleAdd>\n </Tooltip.Trigger>\n <Tooltip.Portal>\n <Tooltip.Positioner sideOffset={10} side=\"bottom\">\n <Tooltip.Popup className=\"\n flex flex-col justify-center items-center\n px-2 py-1\n rounded-md\n bg-[canvas]\n text-sm\n z-100\n origin-(--transform-origin)\n shadow-lg shadow-gray-200 outline-1 outline-gray-200\n transition-[transform,scale,opacity]\n data-ending-style:opacity-0 data-ending-style:scale-90\n data-instant:transition-none\n data-starting-style:opacity-0 data-starting-style:scale-90\n dark:shadow-none dark:outline-gray-300 dark:-outline-offset-1\">\n <span>\n <span>Click{' '}</span>\n <span className=\"opacity-50\">to add below</span>\n </span>\n <span>\n <span>Option-click{' '}</span>\n <span className=\"opacity-50\">to add above</span>\n </span>\n </Tooltip.Popup>\n </Tooltip.Positioner>\n </Tooltip.Portal>\n </Tooltip.Root>\n <Tooltip.Root>\n <Tooltip.Trigger className=\"m-0 p-0\">\n <BlockHandleMenu>\n <BlockHandleDraggable className=\"h-6 w-5 cursor-grab flex items-center box-border justify-center hover:bg-gray-100 dark:hover:bg-gray-800 rounded-sm text-gray-500/50 dark:text-gray-400/50\">\n <div className=\"i-lucide-grip-vertical size-5 block\" />\n </BlockHandleDraggable>\n </BlockHandleMenu>\n </Tooltip.Trigger>\n <Tooltip.Portal>\n <Tooltip.Positioner sideOffset={10} side=\"bottom\">\n <Tooltip.Popup className=\"\n flex flex-col justify-center items-center\n px-2 py-1\n rounded-md\n bg-[canvas]\n text-sm\n z-100\n origin-(--transform-origin)\n shadow-lg shadow-gray-200 outline-1 outline-gray-200\n transition-[transform,scale,opacity]\n data-ending-style:opacity-0 data-ending-style:scale-90\n data-instant:transition-none\n data-starting-style:opacity-0 data-starting-style:scale-90\n dark:shadow-none dark:outline-gray-300 dark:-outline-offset-1\">\n <span>\n <span>Drag{' '}</span>\n <span className=\"opacity-50\">to move</span>\n </span>\n <span>\n <span>Click{' '}</span>\n <span className=\"opacity-50\">to open menu</span>\n </span>\n </Tooltip.Popup>\n </Tooltip.Positioner>\n </Tooltip.Portal>\n </Tooltip.Root>\n </BlockHandlePopup>\n </BlockHandlePositioner>\n </BlockHandleRoot>\n </Tooltip.Provider>\n )\n}\n"
36
36
  },
37
37
  {
38
38
  "path": "registry/src/react/examples/notion/editor.tsx",
39
39
  "type": "registry:component",
40
40
  "target": "components/editor/examples/notion/editor.tsx",
41
- "content": "'use client'\n\nimport 'prosekit/basic/style.css'\nimport 'prosekit/basic/typography.css'\nimport './style.css'\n\nimport { createEditor, type NodeJSON } from 'prosekit/core'\nimport { ProseKit } from 'prosekit/react'\nimport { useMemo, useState } from 'react'\n\nimport { sampleContent } from '../../sample/sample-doc-notion'\nimport { tags } from '../../sample/sample-tag-data'\nimport { users } from '../../sample/sample-user-data'\nimport { DropIndicator } from '../../ui/drop-indicator'\nimport { InlineMenu } from '../../ui/inline-menu'\nimport { TableHandle } from '../../ui/table-handle'\nimport { TagMenu } from '../../ui/tag-menu'\nimport { UserMenu } from '../../ui/user-menu'\n\nimport BlockHandle from './block-handle'\nimport { defineExtension } from './extension'\nimport { SlashMenu } from './slash-menu'\n\ninterface EditorProps {\n initialContent?: NodeJSON\n}\n\nexport default function Editor(props: EditorProps) {\n const defaultContent = props.initialContent ?? sampleContent\n const editor = useMemo(() => {\n const extension = defineExtension()\n return createEditor({ extension, defaultContent })\n }, [defaultContent])\n\n const [slashMenuOpen, setSlashMenuOpen] = useState(false)\n\n return (\n <ProseKit editor={editor}>\n <div className=\"box-border h-full w-full min-h-36 overflow-y-hidden overflow-x-hidden rounded-md border border-solid border-gray-200 dark:border-gray-700 shadow-sm flex flex-col bg-white dark:bg-gray-950 text-black dark:text-white\" data-prosekit-example=\"notion\">\n <div className=\"relative w-full flex-1 box-border overflow-y-auto\">\n <div ref={editor.mount} className=\"ProseMirror box-border min-h-full px-[max(4rem,calc(50%-20rem))] py-8 outline-hidden outline-0 [&_span[data-mention=user]]:text-blue-500 [&_span[data-mention=tag]]:text-violet-500\"></div>\n <InlineMenu />\n <SlashMenu onOpenChange={setSlashMenuOpen} />\n <UserMenu users={users} />\n <TagMenu tags={tags} />\n <BlockHandle enabled={!slashMenuOpen} />\n <TableHandle />\n <DropIndicator />\n </div>\n </div>\n </ProseKit>\n )\n}\n"
41
+ "content": "'use client'\n\nimport 'prosekit/basic/style.css'\nimport 'prosekit/basic/typography.css'\nimport './style.css'\n\nimport { createEditor, type NodeJSON } from 'prosekit/core'\nimport { ProseKit } from 'prosekit/react'\nimport { useMemo, useState } from 'react'\n\nimport { sampleContent } from '../../sample/sample-doc-notion'\nimport { tags } from '../../sample/sample-tag-data'\nimport { users } from '../../sample/sample-user-data'\nimport { DropIndicator } from '../../ui/drop-indicator'\nimport { InlineMenu } from '../../ui/inline-menu'\nimport { TableHandle } from '../../ui/table-handle'\nimport { TagMenu } from '../../ui/tag-menu'\nimport { UserMenu } from '../../ui/user-menu'\n\nimport BlockHandle from './block-handle'\nimport { defineExtension } from './extension'\nimport { SlashMenu } from './slash-menu'\n\ninterface EditorProps {\n initialContent?: NodeJSON\n}\n\nexport default function Editor(props: EditorProps) {\n const defaultContent = props.initialContent ?? sampleContent\n const editor = useMemo(() => {\n const extension = defineExtension()\n return createEditor({ extension, defaultContent })\n }, [defaultContent])\n\n const [slashMenuOpen, setSlashMenuOpen] = useState(false)\n\n return (\n <ProseKit editor={editor}>\n <div className=\"box-border h-full w-full min-h-36 overflow-y-hidden overflow-x-hidden rounded-md border border-solid border-gray-200 dark:border-gray-700 shadow-sm flex flex-col bg-[canvas] text-black dark:text-white\" data-prosekit-example=\"notion\">\n <div className=\"relative w-full flex-1 box-border overflow-y-auto\">\n <div ref={editor.mount} className=\"ProseMirror box-border min-h-full px-[max(4rem,calc(50%-20rem))] py-8 outline-hidden outline-0 [&_span[data-mention=user]]:text-blue-500 [&_span[data-mention=tag]]:text-violet-500\"></div>\n <InlineMenu />\n <SlashMenu onOpenChange={setSlashMenuOpen} />\n <UserMenu users={users} />\n <TagMenu tags={tags} />\n <BlockHandle enabled={!slashMenuOpen} />\n <TableHandle />\n <DropIndicator />\n </div>\n </div>\n </ProseKit>\n )\n}\n"
42
42
  },
43
43
  {
44
44
  "path": "registry/src/react/examples/notion/extension.ts",
@@ -86,19 +86,19 @@
86
86
  "path": "registry/src/react/examples/notion/slash-menu/slash-menu-empty.tsx",
87
87
  "type": "registry:component",
88
88
  "target": "components/editor/examples/notion/slash-menu/slash-menu-empty.tsx",
89
- "content": "'use client'\n\nimport { AutocompleteEmpty } from 'prosekit/react/autocomplete'\n\nexport default function SlashMenuEmpty() {\n return (\n <AutocompleteEmpty className=\"relative flex items-center justify-between min-w-32 scroll-my-1 rounded-sm px-3 py-1.5 box-border cursor-default select-none whitespace-nowrap outline-hidden data-highlighted:bg-gray-100 dark:data-highlighted:bg-gray-800\">\n <span>No results</span>\n </AutocompleteEmpty>\n )\n}\n"
89
+ "content": "'use client'\n\nimport { AutocompleteEmpty } from 'prosekit/react/autocomplete'\n\nexport default function SlashMenuEmpty() {\n return (\n <AutocompleteEmpty className=\"relative flex items-center justify-between min-w-32 scroll-my-1 rounded-md px-3 py-1.5 text-sm box-border cursor-default select-none whitespace-nowrap outline-hidden data-highlighted:bg-gray-100 dark:data-highlighted:bg-gray-800\">\n <span>No results</span>\n </AutocompleteEmpty>\n )\n}\n"
90
90
  },
91
91
  {
92
92
  "path": "registry/src/react/examples/notion/slash-menu/slash-menu-item.tsx",
93
93
  "type": "registry:component",
94
94
  "target": "components/editor/examples/notion/slash-menu/slash-menu-item.tsx",
95
- "content": "'use client'\n\nimport { AutocompleteItem } from 'prosekit/react/autocomplete'\n\nexport default function SlashMenuItem(props: {\n label: string\n kbd?: string\n onSelect: () => void\n}) {\n return (\n <AutocompleteItem onSelect={props.onSelect} className=\"relative flex items-center justify-between min-w-32 scroll-my-1 rounded-sm px-3 py-1.5 box-border cursor-default select-none whitespace-nowrap outline-hidden data-highlighted:bg-gray-100 dark:data-highlighted:bg-gray-800\">\n <span>{props.label}</span>\n {props.kbd && <kbd className=\"text-xs font-mono text-gray-400 dark:text-gray-500\">{props.kbd}</kbd>}\n </AutocompleteItem>\n )\n}\n"
95
+ "content": "'use client'\n\nimport { AutocompleteItem } from 'prosekit/react/autocomplete'\n\nexport default function SlashMenuItem(props: {\n label: string\n kbd?: string\n onSelect: () => void\n}) {\n return (\n <AutocompleteItem onSelect={props.onSelect} className=\"relative flex items-center justify-between min-w-32 scroll-my-1 rounded-md px-3 py-1.5 text-sm box-border cursor-default select-none whitespace-nowrap outline-hidden data-highlighted:bg-gray-100 dark:data-highlighted:bg-gray-800\">\n <span>{props.label}</span>\n {props.kbd && <kbd className=\"text-xs font-mono text-gray-400 dark:text-gray-500\">{props.kbd}</kbd>}\n </AutocompleteItem>\n )\n}\n"
96
96
  },
97
97
  {
98
98
  "path": "registry/src/react/examples/notion/slash-menu/slash-menu.tsx",
99
99
  "type": "registry:component",
100
100
  "target": "components/editor/examples/notion/slash-menu/slash-menu.tsx",
101
- "content": "'use client'\n\nimport type { BasicExtension } from 'prosekit/basic'\nimport { canUseRegexLookbehind } from 'prosekit/core'\nimport { useEditor } from 'prosekit/react'\nimport { AutocompletePopup, AutocompletePositioner, AutocompleteRoot } from 'prosekit/react/autocomplete'\n\nimport SlashMenuEmpty from './slash-menu-empty'\nimport SlashMenuItem from './slash-menu-item'\n\n// Match inputs like \"/\", \"/table\", \"/heading 1\" etc. Do not match \"/ heading\".\nconst regex = canUseRegexLookbehind() ? /(?<!\\S)\\/(\\S.*)?$/u : /\\/(\\S.*)?$/u\n\ninterface Props {\n onOpenChange: (open: boolean) => void\n}\n\nexport default function SlashMenu(props: Props) {\n const editor = useEditor<BasicExtension>()\n\n return (\n <AutocompleteRoot\n regex={regex}\n onOpenChange={(event) => {\n props.onOpenChange(event.detail)\n }}\n >\n <AutocompletePositioner className=\"block overflow-visible w-min h-min z-50 ease-out transition-transform duration-100 motion-reduce:transition-none\">\n <AutocompletePopup className=\"box-border origin-(--transform-origin) transition transition-discrete motion-reduce:transition-none data-[state=closed]:duration-150 data-[state=closed]:opacity-0 starting:opacity-0 data-[state=closed]:scale-95 starting:scale-95 duration-40 rounded-lg border border-gray-200 dark:border-gray-800 bg-white dark:bg-gray-950 shadow-lg overscroll-none flex flex-col relative max-h-100 min-w-60 select-none overflow-auto whitespace-nowrap p-1\">\n <SlashMenuItem\n label=\"Text\"\n onSelect={() => editor.commands.setParagraph()}\n />\n\n <SlashMenuItem\n label=\"Heading 1\"\n kbd=\"#\"\n onSelect={() => editor.commands.setHeading({ level: 1 })}\n />\n\n <SlashMenuItem\n label=\"Heading 2\"\n kbd=\"##\"\n onSelect={() => editor.commands.setHeading({ level: 2 })}\n />\n\n <SlashMenuItem\n label=\"Heading 3\"\n kbd=\"###\"\n onSelect={() => editor.commands.setHeading({ level: 3 })}\n />\n\n <SlashMenuItem\n label=\"Bullet list\"\n kbd=\"-\"\n onSelect={() => editor.commands.wrapInList({ kind: 'bullet' })}\n />\n\n <SlashMenuItem\n label=\"Ordered list\"\n kbd=\"1.\"\n onSelect={() => editor.commands.wrapInList({ kind: 'ordered' })}\n />\n\n <SlashMenuItem\n label=\"Task list\"\n kbd=\"[]\"\n onSelect={() => editor.commands.wrapInList({ kind: 'task' })}\n />\n\n <SlashMenuItem\n label=\"Toggle list\"\n kbd=\">>\"\n onSelect={() => editor.commands.wrapInList({ kind: 'toggle' })}\n />\n\n <SlashMenuItem\n label=\"Quote\"\n kbd=\">\"\n onSelect={() => editor.commands.setBlockquote()}\n />\n\n <SlashMenuItem\n label=\"Table\"\n onSelect={() => editor.commands.insertTable({ row: 3, col: 3 })}\n />\n\n <SlashMenuItem\n label=\"Divider\"\n kbd=\"---\"\n onSelect={() => editor.commands.insertHorizontalRule()}\n />\n\n <SlashMenuItem\n label=\"Code\"\n kbd=\"```\"\n onSelect={() => editor.commands.setCodeBlock()}\n />\n\n <SlashMenuItem\n label=\"Image\"\n onSelect={() => editor.commands.insertImage({ src: '' })}\n />\n\n <SlashMenuEmpty />\n </AutocompletePopup>\n </AutocompletePositioner>\n </AutocompleteRoot>\n )\n}\n"
101
+ "content": "'use client'\n\nimport type { BasicExtension } from 'prosekit/basic'\nimport { canUseRegexLookbehind } from 'prosekit/core'\nimport { useEditor } from 'prosekit/react'\nimport { AutocompletePopup, AutocompletePositioner, AutocompleteRoot } from 'prosekit/react/autocomplete'\n\nimport SlashMenuEmpty from './slash-menu-empty'\nimport SlashMenuItem from './slash-menu-item'\n\n// Match inputs like \"/\", \"/table\", \"/heading 1\" etc. Do not match \"/ heading\".\nconst regex = canUseRegexLookbehind() ? /(?<!\\S)\\/(\\S.*)?$/u : /\\/(\\S.*)?$/u\n\ninterface Props {\n onOpenChange: (open: boolean) => void\n}\n\nexport default function SlashMenu(props: Props) {\n const editor = useEditor<BasicExtension>()\n\n return (\n <AutocompleteRoot\n regex={regex}\n onOpenChange={(event) => {\n props.onOpenChange(event.detail)\n }}\n >\n <AutocompletePositioner className=\"block overflow-visible w-min h-min z-50 ease-out transition-transform duration-100 motion-reduce:transition-none\">\n <AutocompletePopup className=\"box-border origin-(--transform-origin) transition-[opacity,scale] transition-discrete motion-reduce:transition-none data-[state=closed]:duration-150 data-[state=closed]:opacity-0 starting:opacity-0 data-[state=closed]:scale-95 starting:scale-95 duration-40 rounded-xl border border-gray-200 dark:border-gray-800 shadow-lg bg-[canvas] flex flex-col relative max-h-100 min-h-0 min-w-60 select-none overflow-hidden whitespace-nowrap\">\n <div className=\"flex flex-col flex-1 min-h-0 overflow-y-auto p-1 bg-[canvas] overscroll-contain\">\n <SlashMenuItem\n label=\"Text\"\n onSelect={() => editor.commands.setParagraph()}\n />\n\n <SlashMenuItem\n label=\"Heading 1\"\n kbd=\"#\"\n onSelect={() => editor.commands.setHeading({ level: 1 })}\n />\n\n <SlashMenuItem\n label=\"Heading 2\"\n kbd=\"##\"\n onSelect={() => editor.commands.setHeading({ level: 2 })}\n />\n\n <SlashMenuItem\n label=\"Heading 3\"\n kbd=\"###\"\n onSelect={() => editor.commands.setHeading({ level: 3 })}\n />\n\n <SlashMenuItem\n label=\"Bullet list\"\n kbd=\"-\"\n onSelect={() => editor.commands.wrapInList({ kind: 'bullet' })}\n />\n\n <SlashMenuItem\n label=\"Ordered list\"\n kbd=\"1.\"\n onSelect={() => editor.commands.wrapInList({ kind: 'ordered' })}\n />\n\n <SlashMenuItem\n label=\"Task list\"\n kbd=\"[]\"\n onSelect={() => editor.commands.wrapInList({ kind: 'task' })}\n />\n\n <SlashMenuItem\n label=\"Toggle list\"\n kbd=\">>\"\n onSelect={() => editor.commands.wrapInList({ kind: 'toggle' })}\n />\n\n <SlashMenuItem\n label=\"Quote\"\n kbd=\">\"\n onSelect={() => editor.commands.setBlockquote()}\n />\n\n <SlashMenuItem\n label=\"Table\"\n onSelect={() => editor.commands.insertTable({ row: 3, col: 3 })}\n />\n\n <SlashMenuItem\n label=\"Divider\"\n kbd=\"---\"\n onSelect={() => editor.commands.insertHorizontalRule()}\n />\n\n <SlashMenuItem\n label=\"Code\"\n kbd=\"```\"\n onSelect={() => editor.commands.setCodeBlock()}\n />\n\n <SlashMenuItem\n label=\"Image\"\n onSelect={() => editor.commands.insertImage({ src: '' })}\n />\n\n <SlashMenuEmpty />\n </div>\n </AutocompletePopup>\n </AutocompletePositioner>\n </AutocompleteRoot>\n )\n}\n"
102
102
  },
103
103
  {
104
104
  "path": "registry/src/react/examples/notion/style.css",
@@ -7,7 +7,7 @@
7
7
  "https://unpkg.com/prosekit-registry/dist/r/react-sample-sample-doc-page.json"
8
8
  ],
9
9
  "dependencies": [
10
- "prosekit@^0.20.0-beta.8"
10
+ "prosekit@^0.20.0"
11
11
  ],
12
12
  "files": [
13
13
  {
@@ -32,7 +32,7 @@
32
32
  "path": "registry/src/react/examples/page/paper-controller.tsx",
33
33
  "type": "registry:component",
34
34
  "target": "components/editor/examples/page/paper-controller.tsx",
35
- "content": "'use client'\n\nimport { definePageRendering, type PageRenderingOptions } from 'prosekit/extensions/page'\nimport { useExtension } from 'prosekit/react'\nimport { useEffect, useId, useMemo, useState } from 'react'\n\n// Paper sizes in pixels at 96 DPI\nconst PAPER_SIZES = {\n A3: { short: 1123, long: 1587 },\n A4: { short: 794, long: 1123 },\n A5: { short: 559, long: 794 },\n B4: { short: 945, long: 1334 },\n B5: { short: 665, long: 945 },\n letter: { short: 816, long: 1056 },\n} as const\n\ntype PaperSize = keyof typeof PAPER_SIZES\ntype Orientation = 'portrait' | 'landscape'\n\nexport default function PaperController({\n zoom,\n setZoom,\n}: {\n zoom: number\n setZoom: (zoom: number) => void\n}) {\n const id = useId()\n const [paperSize, setPaperSize] = useState<PaperSize>('A4')\n const [orientation, setOrientation] = useState<Orientation>('portrait')\n const [margin, setMargin] = useState(70)\n const [enablePageLayout, setEnablePageLayout] = useState(true)\n\n const pageRenderingOptions: PageRenderingOptions = useMemo(() => {\n const { short, long } = PAPER_SIZES[paperSize]\n const pageWidth = orientation === 'portrait' ? short : long\n const pageHeight = orientation === 'portrait' ? long : short\n\n return {\n pageWidth,\n pageHeight,\n marginTop: margin,\n marginRight: margin,\n marginBottom: margin,\n marginLeft: margin,\n }\n }, [paperSize, orientation, margin])\n\n useEffect(() => {\n const styleId = 'print-page-style'\n let style = document.getElementById(styleId) as HTMLStyleElement | null\n if (!style) {\n style = document.createElement('style')\n style.id = styleId\n document.head.appendChild(style)\n }\n style.textContent = `@page { size: ${paperSize} ${orientation}; margin: 0; }`\n\n return () => {\n style.textContent = ''\n }\n }, [paperSize, orientation])\n\n const extension = useMemo(() => {\n return enablePageLayout ? definePageRendering(pageRenderingOptions) : null\n }, [pageRenderingOptions, enablePageLayout])\n\n useExtension(extension)\n\n return (\n <div\n data-paper-controller={paperSize}\n className=\"grid grid-cols-[auto_1fr] gap-2 w-min border p-2 bg-[Canvas] sticky top-2 left-2 z-10 print:hidden text-xs\"\n >\n <label htmlFor={`${id}-page`}>Page</label>\n <select\n id={`${id}-page`}\n value={enablePageLayout ? 'Enabled' : 'Disabled'}\n onChange={(e) => setEnablePageLayout(e.target.value === 'Enabled')}\n className=\"rounded border disabled:opacity-50\"\n >\n <option value=\"Enabled\">Enabled</option>\n <option value=\"Disabled\">Disabled</option>\n </select>\n <label htmlFor={`${id}-paper`}>Paper Size</label>\n <select\n id={`${id}-paper`}\n value={paperSize}\n onChange={(e) => setPaperSize(e.target.value as PaperSize)}\n disabled={!enablePageLayout}\n className=\"rounded border disabled:opacity-50\"\n >\n <option value=\"A3\">A3</option>\n <option value=\"A4\">A4</option>\n <option value=\"A5\">A5</option>\n <option value=\"B4\">B4</option>\n <option value=\"B5\">B5</option>\n <option value=\"letter\">Letter</option>\n </select>\n <label htmlFor={`${id}-orientation`}>Orientation</label>\n <select\n id={`${id}-orientation`}\n value={orientation}\n onChange={(e) => setOrientation(e.target.value as Orientation)}\n disabled={!enablePageLayout}\n className=\"rounded border disabled:opacity-50\"\n >\n <option value=\"portrait\">Portrait</option>\n <option value=\"landscape\">Landscape</option>\n </select>\n <label htmlFor={`${id}-margin`}>Margin</label>\n <select\n id={`${id}-margin`}\n value={String(margin)}\n onChange={(e) => setMargin(Number.parseInt(e.target.value, 10))}\n disabled={!enablePageLayout}\n className=\"rounded border disabled:opacity-50\"\n >\n <option value=\"30\">Narrow</option>\n <option value=\"70\">Normal</option>\n <option value=\"120\">Wide</option>\n </select>\n <label htmlFor={`${id}-zoom`}>Zoom</label>\n <select\n id={`${id}-zoom`}\n value={String(zoom)}\n onChange={(e) => setZoom(Number.parseInt(e.target.value, 10))}\n className=\"rounded border disabled:opacity-50\"\n >\n <option value=\"25\">25%</option>\n <option value=\"50\">50%</option>\n <option value=\"75\">75%</option>\n <option value=\"100\">100%</option>\n <option value=\"125\">125%</option>\n <option value=\"150\">150%</option>\n <option value=\"200\">200%</option>\n </select>\n </div>\n )\n}\n"
35
+ "content": "'use client'\n\nimport { definePageRendering, type PageRenderingOptions } from 'prosekit/extensions/page'\nimport { useExtension } from 'prosekit/react'\nimport { useEffect, useId, useMemo, useState } from 'react'\n\n// Paper sizes in pixels at 96 DPI\nconst PAPER_SIZES = {\n A3: { short: 1123, long: 1587 },\n A4: { short: 794, long: 1123 },\n A5: { short: 559, long: 794 },\n B4: { short: 945, long: 1334 },\n B5: { short: 665, long: 945 },\n letter: { short: 816, long: 1056 },\n} as const\n\ntype PaperSize = keyof typeof PAPER_SIZES\ntype Orientation = 'portrait' | 'landscape'\n\nexport default function PaperController({\n zoom,\n setZoom,\n}: {\n zoom: number\n setZoom: (zoom: number) => void\n}) {\n const id = useId()\n const [paperSize, setPaperSize] = useState<PaperSize>('A4')\n const [orientation, setOrientation] = useState<Orientation>('portrait')\n const [margin, setMargin] = useState(70)\n const [enablePageLayout, setEnablePageLayout] = useState(true)\n\n const pageRenderingOptions: PageRenderingOptions = useMemo(() => {\n const { short, long } = PAPER_SIZES[paperSize]\n const pageWidth = orientation === 'portrait' ? short : long\n const pageHeight = orientation === 'portrait' ? long : short\n\n return {\n pageWidth,\n pageHeight,\n marginTop: margin,\n marginRight: margin,\n marginBottom: margin,\n marginLeft: margin,\n }\n }, [paperSize, orientation, margin])\n\n useEffect(() => {\n const styleId = 'print-page-style'\n let style = document.getElementById(styleId) as HTMLStyleElement | null\n if (!style) {\n style = document.createElement('style')\n style.id = styleId\n document.head.appendChild(style)\n }\n style.textContent = `@page { size: ${paperSize} ${orientation}; margin: 0; }`\n\n return () => {\n style.textContent = ''\n }\n }, [paperSize, orientation])\n\n const extension = useMemo(() => {\n return enablePageLayout ? definePageRendering(pageRenderingOptions) : null\n }, [pageRenderingOptions, enablePageLayout])\n\n useExtension(extension)\n\n return (\n <div\n data-paper-controller={paperSize}\n className=\"grid grid-cols-[auto_1fr] gap-2 w-min border p-2 bg-[canvas] sticky top-2 left-2 z-10 print:hidden text-xs\"\n >\n <label htmlFor={`${id}-page`}>Page</label>\n <select\n id={`${id}-page`}\n value={enablePageLayout ? 'Enabled' : 'Disabled'}\n onChange={(e) => setEnablePageLayout(e.target.value === 'Enabled')}\n className=\"rounded border disabled:opacity-50\"\n >\n <option value=\"Enabled\">Enabled</option>\n <option value=\"Disabled\">Disabled</option>\n </select>\n <label htmlFor={`${id}-paper`}>Paper Size</label>\n <select\n id={`${id}-paper`}\n value={paperSize}\n onChange={(e) => setPaperSize(e.target.value as PaperSize)}\n disabled={!enablePageLayout}\n className=\"rounded border disabled:opacity-50\"\n >\n <option value=\"A3\">A3</option>\n <option value=\"A4\">A4</option>\n <option value=\"A5\">A5</option>\n <option value=\"B4\">B4</option>\n <option value=\"B5\">B5</option>\n <option value=\"letter\">Letter</option>\n </select>\n <label htmlFor={`${id}-orientation`}>Orientation</label>\n <select\n id={`${id}-orientation`}\n value={orientation}\n onChange={(e) => setOrientation(e.target.value as Orientation)}\n disabled={!enablePageLayout}\n className=\"rounded border disabled:opacity-50\"\n >\n <option value=\"portrait\">Portrait</option>\n <option value=\"landscape\">Landscape</option>\n </select>\n <label htmlFor={`${id}-margin`}>Margin</label>\n <select\n id={`${id}-margin`}\n value={String(margin)}\n onChange={(e) => setMargin(Number.parseInt(e.target.value, 10))}\n disabled={!enablePageLayout}\n className=\"rounded border disabled:opacity-50\"\n >\n <option value=\"30\">Narrow</option>\n <option value=\"70\">Normal</option>\n <option value=\"120\">Wide</option>\n </select>\n <label htmlFor={`${id}-zoom`}>Zoom</label>\n <select\n id={`${id}-zoom`}\n value={String(zoom)}\n onChange={(e) => setZoom(Number.parseInt(e.target.value, 10))}\n className=\"rounded border disabled:opacity-50\"\n >\n <option value=\"25\">25%</option>\n <option value=\"50\">50%</option>\n <option value=\"75\">75%</option>\n <option value=\"100\">100%</option>\n <option value=\"125\">125%</option>\n <option value=\"150\">150%</option>\n <option value=\"200\">200%</option>\n </select>\n </div>\n )\n}\n"
36
36
  },
37
37
  {
38
38
  "path": "registry/src/react/examples/page/zoom.css",
@@ -5,14 +5,14 @@
5
5
  "description": "Placeholder text displayed.",
6
6
  "registryDependencies": [],
7
7
  "dependencies": [
8
- "prosekit@^0.20.0-beta.8"
8
+ "prosekit@^0.20.0"
9
9
  ],
10
10
  "files": [
11
11
  {
12
12
  "path": "registry/src/react/examples/placeholder/editor.tsx",
13
13
  "type": "registry:component",
14
14
  "target": "components/editor/examples/placeholder/editor.tsx",
15
- "content": "'use client'\n\nimport 'prosekit/basic/style.css'\nimport 'prosekit/basic/typography.css'\n\nimport { createEditor, jsonFromNode, type NodeJSON } from 'prosekit/core'\nimport type { ProseMirrorNode } from 'prosekit/pm/model'\nimport { ProseKit, useDocChange } from 'prosekit/react'\nimport { useCallback, useMemo } from 'react'\n\nimport { defineExtension } from './extension'\n\nexport default function Editor(props: {\n initialContent?: NodeJSON\n onDocUpdate?: (doc: NodeJSON) => void\n}) {\n const editor = useMemo(() => {\n const extension = defineExtension()\n return createEditor({ extension, defaultContent: props.initialContent })\n }, [props.initialContent])\n\n const { onDocUpdate } = props\n const handleDocChange = useCallback(\n (doc: ProseMirrorNode) => onDocUpdate?.(jsonFromNode(doc)),\n [onDocUpdate],\n )\n useDocChange(handleDocChange, { editor })\n\n return (\n <ProseKit editor={editor}>\n <div className=\"box-border h-full w-full min-h-36 overflow-y-hidden overflow-x-hidden rounded-md border border-solid border-gray-200 dark:border-gray-700 shadow-sm flex flex-col bg-white dark:bg-gray-950 text-black dark:text-white\">\n <div className=\"relative w-full flex-1 box-border overflow-y-auto\">\n <div ref={editor.mount} className=\"ProseMirror box-border min-h-full px-[max(4rem,calc(50%-20rem))] py-8 outline-hidden outline-0 [&_span[data-mention=user]]:text-blue-500 [&_span[data-mention=tag]]:text-violet-500\"></div>\n </div>\n </div>\n </ProseKit>\n )\n}\n"
15
+ "content": "'use client'\n\nimport 'prosekit/basic/style.css'\nimport 'prosekit/basic/typography.css'\n\nimport { createEditor, jsonFromNode, type NodeJSON } from 'prosekit/core'\nimport type { ProseMirrorNode } from 'prosekit/pm/model'\nimport { ProseKit, useDocChange } from 'prosekit/react'\nimport { useCallback, useMemo } from 'react'\n\nimport { defineExtension } from './extension'\n\nexport default function Editor(props: {\n initialContent?: NodeJSON\n onDocUpdate?: (doc: NodeJSON) => void\n}) {\n const editor = useMemo(() => {\n const extension = defineExtension()\n return createEditor({ extension, defaultContent: props.initialContent })\n }, [props.initialContent])\n\n const { onDocUpdate } = props\n const handleDocChange = useCallback(\n (doc: ProseMirrorNode) => onDocUpdate?.(jsonFromNode(doc)),\n [onDocUpdate],\n )\n useDocChange(handleDocChange, { editor })\n\n return (\n <ProseKit editor={editor}>\n <div className=\"box-border h-full w-full min-h-36 overflow-y-hidden overflow-x-hidden rounded-md border border-solid border-gray-200 dark:border-gray-700 shadow-sm flex flex-col bg-[canvas] text-black dark:text-white\">\n <div className=\"relative w-full flex-1 box-border overflow-y-auto\">\n <div ref={editor.mount} className=\"ProseMirror box-border min-h-full px-[max(4rem,calc(50%-20rem))] py-8 outline-hidden outline-0 [&_span[data-mention=user]]:text-blue-500 [&_span[data-mention=tag]]:text-violet-500\"></div>\n </div>\n </div>\n </ProseKit>\n )\n}\n"
16
16
  },
17
17
  {
18
18
  "path": "registry/src/react/examples/placeholder/extension.ts",
@@ -8,14 +8,14 @@
8
8
  "https://unpkg.com/prosekit-registry/dist/r/react-ui-button.json"
9
9
  ],
10
10
  "dependencies": [
11
- "prosekit@^0.20.0-beta.8"
11
+ "prosekit@^0.20.0"
12
12
  ],
13
13
  "files": [
14
14
  {
15
15
  "path": "registry/src/react/examples/readonly/editor.tsx",
16
16
  "type": "registry:component",
17
17
  "target": "components/editor/examples/readonly/editor.tsx",
18
- "content": "'use client'\n\nimport 'prosekit/basic/style.css'\nimport 'prosekit/basic/typography.css'\n\nimport { createEditor, type NodeJSON } from 'prosekit/core'\nimport { ProseKit } from 'prosekit/react'\nimport { useMemo } from 'react'\n\nimport { sampleContent } from '../../sample/sample-doc-readonly'\n\nimport { defineExtension } from './extension'\nimport Toolbar from './toolbar'\n\ninterface EditorProps {\n initialContent?: NodeJSON\n}\n\nexport default function Editor(props: EditorProps) {\n const defaultContent = props.initialContent ?? sampleContent\n const editor = useMemo(() => {\n const extension = defineExtension()\n return createEditor({ extension, defaultContent })\n }, [defaultContent])\n\n return (\n <ProseKit editor={editor}>\n <div className=\"box-border h-full w-full min-h-36 overflow-y-hidden overflow-x-hidden rounded-md border border-solid border-gray-200 dark:border-gray-700 shadow-sm flex flex-col bg-white dark:bg-gray-950 text-black dark:text-white\">\n <Toolbar />\n <div className=\"relative w-full flex-1 box-border overflow-y-auto\">\n <div ref={editor.mount} className=\"ProseMirror box-border min-h-full px-[max(4rem,calc(50%-20rem))] py-8 outline-hidden outline-0 [&_span[data-mention=user]]:text-blue-500 [&_span[data-mention=tag]]:text-violet-500\"></div>\n </div>\n </div>\n </ProseKit>\n )\n}\n"
18
+ "content": "'use client'\n\nimport 'prosekit/basic/style.css'\nimport 'prosekit/basic/typography.css'\n\nimport { createEditor, type NodeJSON } from 'prosekit/core'\nimport { ProseKit } from 'prosekit/react'\nimport { useMemo } from 'react'\n\nimport { sampleContent } from '../../sample/sample-doc-readonly'\n\nimport { defineExtension } from './extension'\nimport Toolbar from './toolbar'\n\ninterface EditorProps {\n initialContent?: NodeJSON\n}\n\nexport default function Editor(props: EditorProps) {\n const defaultContent = props.initialContent ?? sampleContent\n const editor = useMemo(() => {\n const extension = defineExtension()\n return createEditor({ extension, defaultContent })\n }, [defaultContent])\n\n return (\n <ProseKit editor={editor}>\n <div className=\"box-border h-full w-full min-h-36 overflow-y-hidden overflow-x-hidden rounded-md border border-solid border-gray-200 dark:border-gray-700 shadow-sm flex flex-col bg-[canvas] text-black dark:text-white\">\n <Toolbar />\n <div className=\"relative w-full flex-1 box-border overflow-y-auto\">\n <div ref={editor.mount} className=\"ProseMirror box-border min-h-full px-[max(4rem,calc(50%-20rem))] py-8 outline-hidden outline-0 [&_span[data-mention=user]]:text-blue-500 [&_span[data-mention=tag]]:text-violet-500\"></div>\n </div>\n </div>\n </ProseKit>\n )\n}\n"
19
19
  },
20
20
  {
21
21
  "path": "registry/src/react/examples/readonly/extension.ts",
@@ -14,14 +14,14 @@
14
14
  "https://unpkg.com/prosekit-registry/dist/r/react-ui-toolbar.json"
15
15
  ],
16
16
  "dependencies": [
17
- "prosekit@^0.20.0-beta.8"
17
+ "prosekit@^0.20.0"
18
18
  ],
19
19
  "files": [
20
20
  {
21
21
  "path": "registry/src/react/examples/rtl/editor.tsx",
22
22
  "type": "registry:component",
23
23
  "target": "components/editor/examples/rtl/editor.tsx",
24
- "content": "'use client'\n\nimport 'prosekit/basic/style.css'\nimport 'prosekit/basic/typography.css'\n\nimport { defineBasicExtension } from 'prosekit/basic'\nimport { createEditor, type NodeJSON } from 'prosekit/core'\nimport { ProseKit } from 'prosekit/react'\nimport { useMemo } from 'react'\n\nimport { sampleContent } from '../../sample/sample-doc-rtl'\nimport { sampleUploader } from '../../sample/sample-uploader'\nimport { BlockHandle } from '../../ui/block-handle'\nimport { DropIndicator } from '../../ui/drop-indicator'\nimport { InlineMenu } from '../../ui/inline-menu'\nimport { SlashMenu } from '../../ui/slash-menu'\nimport { TableHandle } from '../../ui/table-handle'\nimport { Toolbar } from '../../ui/toolbar'\n\ninterface EditorProps {\n initialContent?: NodeJSON\n}\n\nexport default function Editor(props: EditorProps) {\n const defaultContent = props.initialContent ?? sampleContent\n const editor = useMemo(() => {\n const extension = defineBasicExtension()\n return createEditor({ extension, defaultContent })\n }, [defaultContent])\n\n return (\n <ProseKit editor={editor}>\n <div dir=\"rtl\" className=\"box-border h-full w-full min-h-36 overflow-y-hidden overflow-x-hidden rounded-md border border-solid border-gray-200 dark:border-gray-700 shadow-sm flex flex-col bg-white dark:bg-gray-950 text-black dark:text-white\">\n <Toolbar uploader={sampleUploader} />\n <div className=\"relative w-full flex-1 box-border overflow-y-auto\">\n <div ref={editor.mount} className=\"ProseMirror box-border min-h-full px-[max(4rem,calc(50%-20rem))] py-8 outline-hidden outline-0 [&_span[data-mention=user]]:text-blue-500 [&_span[data-mention=tag]]:text-violet-500\"></div>\n <InlineMenu />\n <SlashMenu />\n <BlockHandle dir=\"rtl\" />\n <TableHandle dir=\"rtl\" />\n <DropIndicator />\n </div>\n </div>\n </ProseKit>\n )\n}\n"
24
+ "content": "'use client'\n\nimport 'prosekit/basic/style.css'\nimport 'prosekit/basic/typography.css'\n\nimport { defineBasicExtension } from 'prosekit/basic'\nimport { createEditor, type NodeJSON } from 'prosekit/core'\nimport { ProseKit } from 'prosekit/react'\nimport { useMemo } from 'react'\n\nimport { sampleContent } from '../../sample/sample-doc-rtl'\nimport { sampleUploader } from '../../sample/sample-uploader'\nimport { BlockHandle } from '../../ui/block-handle'\nimport { DropIndicator } from '../../ui/drop-indicator'\nimport { InlineMenu } from '../../ui/inline-menu'\nimport { SlashMenu } from '../../ui/slash-menu'\nimport { TableHandle } from '../../ui/table-handle'\nimport { Toolbar } from '../../ui/toolbar'\n\ninterface EditorProps {\n initialContent?: NodeJSON\n}\n\nexport default function Editor(props: EditorProps) {\n const defaultContent = props.initialContent ?? sampleContent\n const editor = useMemo(() => {\n const extension = defineBasicExtension()\n return createEditor({ extension, defaultContent })\n }, [defaultContent])\n\n return (\n <ProseKit editor={editor}>\n <div dir=\"rtl\" className=\"box-border h-full w-full min-h-36 overflow-y-hidden overflow-x-hidden rounded-md border border-solid border-gray-200 dark:border-gray-700 shadow-sm flex flex-col bg-[canvas] text-black dark:text-white\">\n <Toolbar uploader={sampleUploader} />\n <div className=\"relative w-full flex-1 box-border overflow-y-auto\">\n <div ref={editor.mount} className=\"ProseMirror box-border min-h-full px-[max(4rem,calc(50%-20rem))] py-8 outline-hidden outline-0 [&_span[data-mention=user]]:text-blue-500 [&_span[data-mention=tag]]:text-violet-500\"></div>\n <InlineMenu />\n <SlashMenu />\n <BlockHandle dir=\"rtl\" />\n <TableHandle dir=\"rtl\" />\n <DropIndicator />\n </div>\n </div>\n </ProseKit>\n )\n}\n"
25
25
  },
26
26
  {
27
27
  "path": "registry/src/react/examples/rtl/index.ts",
@@ -5,14 +5,14 @@
5
5
  "description": "Save and load documents as HTML format.",
6
6
  "registryDependencies": [],
7
7
  "dependencies": [
8
- "prosekit@^0.20.0-beta.8"
8
+ "prosekit@^0.20.0"
9
9
  ],
10
10
  "files": [
11
11
  {
12
12
  "path": "registry/src/react/examples/save-html/editor.tsx",
13
13
  "type": "registry:component",
14
14
  "target": "components/editor/examples/save-html/editor.tsx",
15
- "content": "'use client'\n\nimport 'prosekit/basic/style.css'\nimport 'prosekit/basic/typography.css'\n\nimport { defineBasicExtension } from 'prosekit/basic'\nimport { createEditor, jsonFromHTML } from 'prosekit/core'\nimport { ProseKit, useDocChange } from 'prosekit/react'\nimport { useCallback, useMemo, useState } from 'react'\n\nexport default function Editor() {\n // A list of saved documents, stored as HTML strings\n const [records, setRecords] = useState<string[]>([])\n // Whether there are unsaved changes\n const [hasUnsavedChange, setHasUnsavedChange] = useState(false)\n // A key to force a re-render of the editor\n const [key, setKey] = useState(1)\n\n const editor = useMemo(() => {\n const extension = defineBasicExtension()\n return createEditor({ extension })\n }, [])\n\n const handleDocChange = useCallback(() => setHasUnsavedChange(true), [])\n useDocChange(handleDocChange, { editor })\n\n const handleSave = useCallback(() => {\n const record = editor.getDocHTML()\n setRecords((prev) => [...prev, record])\n setHasUnsavedChange(false)\n }, [editor])\n\n const handleLoad = useCallback(\n (record: string) => {\n editor.setContent(jsonFromHTML(record, { schema: editor.schema }))\n setHasUnsavedChange(false)\n setKey((prev) => prev + 1)\n },\n [editor],\n )\n\n return (\n <div className=\"box-border h-full w-full min-h-36 overflow-y-hidden overflow-x-hidden rounded-md border border-solid border-gray-200 dark:border-gray-700 shadow-sm flex flex-col bg-white dark:bg-gray-950 text-black dark:text-white\">\n <button\n onClick={handleSave}\n disabled={!hasUnsavedChange}\n className=\"m-1 border border-solid bg-white px-2 py-1 text-sm text-black disabled:cursor-not-allowed disabled:text-gray-500\"\n >\n {hasUnsavedChange ? 'Save' : 'No changes to save'}\n </button>\n <ul className=\"border-b border-t border-solid text-sm\">\n {records.map((record, index) => (\n <li key={index} className=\"m-1 flex gap-2\">\n <button\n className=\"border border-solid bg-white px-2 py-1 text-black\"\n onClick={() => handleLoad(record)}\n >\n Load\n </button>\n <span className=\"flex-1 overflow-x-scroll p-2\">\n <pre>{record}</pre>\n </span>\n </li>\n ))}\n </ul>\n <ProseKit editor={editor} key={key}>\n <div className=\"relative w-full flex-1 box-border overflow-y-auto\">\n <div ref={editor.mount} className=\"ProseMirror box-border min-h-full px-[max(4rem,calc(50%-20rem))] py-8 outline-hidden outline-0 [&_span[data-mention=user]]:text-blue-500 [&_span[data-mention=tag]]:text-violet-500\"></div>\n </div>\n </ProseKit>\n </div>\n )\n}\n"
15
+ "content": "'use client'\n\nimport 'prosekit/basic/style.css'\nimport 'prosekit/basic/typography.css'\n\nimport { defineBasicExtension } from 'prosekit/basic'\nimport { createEditor, jsonFromHTML } from 'prosekit/core'\nimport { ProseKit, useDocChange } from 'prosekit/react'\nimport { useCallback, useMemo, useState } from 'react'\n\nexport default function Editor() {\n // A list of saved documents, stored as HTML strings\n const [records, setRecords] = useState<string[]>([])\n // Whether there are unsaved changes\n const [hasUnsavedChange, setHasUnsavedChange] = useState(false)\n // A key to force a re-render of the editor\n const [key, setKey] = useState(1)\n\n const editor = useMemo(() => {\n const extension = defineBasicExtension()\n return createEditor({ extension })\n }, [])\n\n const handleDocChange = useCallback(() => setHasUnsavedChange(true), [])\n useDocChange(handleDocChange, { editor })\n\n const handleSave = useCallback(() => {\n const record = editor.getDocHTML()\n setRecords((prev) => [...prev, record])\n setHasUnsavedChange(false)\n }, [editor])\n\n const handleLoad = useCallback(\n (record: string) => {\n editor.setContent(jsonFromHTML(record, { schema: editor.schema }))\n setHasUnsavedChange(false)\n setKey((prev) => prev + 1)\n },\n [editor],\n )\n\n return (\n <div className=\"box-border h-full w-full min-h-36 overflow-y-hidden overflow-x-hidden rounded-md border border-solid border-gray-200 dark:border-gray-700 shadow-sm flex flex-col bg-[canvas] text-black dark:text-white\">\n <button\n onClick={handleSave}\n disabled={!hasUnsavedChange}\n className=\"m-1 border border-solid bg-white px-2 py-1 text-sm text-black disabled:cursor-not-allowed disabled:text-gray-500\"\n >\n {hasUnsavedChange ? 'Save' : 'No changes to save'}\n </button>\n <ul className=\"border-b border-t border-solid text-sm\">\n {records.map((record, index) => (\n <li key={index} className=\"m-1 flex gap-2\">\n <button\n className=\"border border-solid bg-white px-2 py-1 text-black\"\n onClick={() => handleLoad(record)}\n >\n Load\n </button>\n <span className=\"flex-1 overflow-x-scroll p-2\">\n <pre>{record}</pre>\n </span>\n </li>\n ))}\n </ul>\n <ProseKit editor={editor} key={key}>\n <div className=\"relative w-full flex-1 box-border overflow-y-auto\">\n <div ref={editor.mount} className=\"ProseMirror box-border min-h-full px-[max(4rem,calc(50%-20rem))] py-8 outline-hidden outline-0 [&_span[data-mention=user]]:text-blue-500 [&_span[data-mention=tag]]:text-violet-500\"></div>\n </div>\n </ProseKit>\n </div>\n )\n}\n"
16
16
  },
17
17
  {
18
18
  "path": "registry/src/react/examples/save-html/index.ts",
@@ -5,14 +5,14 @@
5
5
  "description": "Save and load documents as JSON format.",
6
6
  "registryDependencies": [],
7
7
  "dependencies": [
8
- "prosekit@^0.20.0-beta.8"
8
+ "prosekit@^0.20.0"
9
9
  ],
10
10
  "files": [
11
11
  {
12
12
  "path": "registry/src/react/examples/save-json/editor.tsx",
13
13
  "type": "registry:component",
14
14
  "target": "components/editor/examples/save-json/editor.tsx",
15
- "content": "'use client'\n\nimport 'prosekit/basic/style.css'\nimport 'prosekit/basic/typography.css'\n\nimport { defineBasicExtension } from 'prosekit/basic'\nimport { createEditor, type NodeJSON } from 'prosekit/core'\nimport { ProseKit, useDocChange } from 'prosekit/react'\nimport { useCallback, useMemo, useState } from 'react'\n\nexport default function Editor() {\n // A list of saved documents, stored as JSON strings\n const [records, setRecords] = useState<string[]>([])\n // Whether there are unsaved changes\n const [hasUnsavedChange, setHasUnsavedChange] = useState(false)\n // A key to force a re-render of the editor\n const [key, setKey] = useState(1)\n\n const editor = useMemo(() => {\n const extension = defineBasicExtension()\n return createEditor({ extension })\n }, [])\n\n const handleDocChange = useCallback(() => setHasUnsavedChange(true), [])\n useDocChange(handleDocChange, { editor })\n\n const handleSave = useCallback(() => {\n const record = JSON.stringify(editor.getDocJSON())\n setRecords((prev) => [...prev, record])\n setHasUnsavedChange(false)\n }, [editor])\n\n const handleLoad = useCallback((record: string) => {\n editor.setContent(JSON.parse(record) as NodeJSON)\n setHasUnsavedChange(false)\n setKey((prev) => prev + 1)\n }, [editor])\n\n return (\n <div className=\"box-border h-full w-full min-h-36 overflow-y-hidden overflow-x-hidden rounded-md border border-solid border-gray-200 dark:border-gray-700 shadow-sm flex flex-col bg-white dark:bg-gray-950 text-black dark:text-white\">\n <button\n onClick={handleSave}\n disabled={!hasUnsavedChange}\n className=\"m-1 border border-solid bg-white px-2 py-1 text-sm text-black disabled:cursor-not-allowed disabled:text-gray-500\"\n >\n {hasUnsavedChange ? 'Save' : 'No changes to save'}\n </button>\n <ul className=\"border-b border-t border-solid text-sm\">\n {records.map((record, index) => (\n <li key={index} className=\"m-1 flex gap-2\">\n <button\n className=\"border border-solid bg-white px-2 py-1 text-black\"\n onClick={() => handleLoad(record)}\n >\n Load\n </button>\n <span className=\"flex-1 overflow-x-scroll p-2\">\n <pre>{record}</pre>\n </span>\n </li>\n ))}\n </ul>\n <ProseKit editor={editor} key={key}>\n <div className=\"relative w-full flex-1 box-border overflow-y-auto\">\n <div ref={editor.mount} className=\"ProseMirror box-border min-h-full px-[max(4rem,calc(50%-20rem))] py-8 outline-hidden outline-0 [&_span[data-mention=user]]:text-blue-500 [&_span[data-mention=tag]]:text-violet-500\"></div>\n </div>\n </ProseKit>\n </div>\n )\n}\n"
15
+ "content": "'use client'\n\nimport 'prosekit/basic/style.css'\nimport 'prosekit/basic/typography.css'\n\nimport { defineBasicExtension } from 'prosekit/basic'\nimport { createEditor, type NodeJSON } from 'prosekit/core'\nimport { ProseKit, useDocChange } from 'prosekit/react'\nimport { useCallback, useMemo, useState } from 'react'\n\nexport default function Editor() {\n // A list of saved documents, stored as JSON strings\n const [records, setRecords] = useState<string[]>([])\n // Whether there are unsaved changes\n const [hasUnsavedChange, setHasUnsavedChange] = useState(false)\n // A key to force a re-render of the editor\n const [key, setKey] = useState(1)\n\n const editor = useMemo(() => {\n const extension = defineBasicExtension()\n return createEditor({ extension })\n }, [])\n\n const handleDocChange = useCallback(() => setHasUnsavedChange(true), [])\n useDocChange(handleDocChange, { editor })\n\n const handleSave = useCallback(() => {\n const record = JSON.stringify(editor.getDocJSON())\n setRecords((prev) => [...prev, record])\n setHasUnsavedChange(false)\n }, [editor])\n\n const handleLoad = useCallback((record: string) => {\n editor.setContent(JSON.parse(record) as NodeJSON)\n setHasUnsavedChange(false)\n setKey((prev) => prev + 1)\n }, [editor])\n\n return (\n <div className=\"box-border h-full w-full min-h-36 overflow-y-hidden overflow-x-hidden rounded-md border border-solid border-gray-200 dark:border-gray-700 shadow-sm flex flex-col bg-[canvas] text-black dark:text-white\">\n <button\n onClick={handleSave}\n disabled={!hasUnsavedChange}\n className=\"m-1 border border-solid bg-white px-2 py-1 text-sm text-black disabled:cursor-not-allowed disabled:text-gray-500\"\n >\n {hasUnsavedChange ? 'Save' : 'No changes to save'}\n </button>\n <ul className=\"border-b border-t border-solid text-sm\">\n {records.map((record, index) => (\n <li key={index} className=\"m-1 flex gap-2\">\n <button\n className=\"border border-solid bg-white px-2 py-1 text-black\"\n onClick={() => handleLoad(record)}\n >\n Load\n </button>\n <span className=\"flex-1 overflow-x-scroll p-2\">\n <pre>{record}</pre>\n </span>\n </li>\n ))}\n </ul>\n <ProseKit editor={editor} key={key}>\n <div className=\"relative w-full flex-1 box-border overflow-y-auto\">\n <div ref={editor.mount} className=\"ProseMirror box-border min-h-full px-[max(4rem,calc(50%-20rem))] py-8 outline-hidden outline-0 [&_span[data-mention=user]]:text-blue-500 [&_span[data-mention=tag]]:text-violet-500\"></div>\n </div>\n </ProseKit>\n </div>\n )\n}\n"
16
16
  },
17
17
  {
18
18
  "path": "registry/src/react/examples/save-json/index.ts",
@@ -5,7 +5,7 @@
5
5
  "description": "Save and load documents as Markdown format.",
6
6
  "registryDependencies": [],
7
7
  "dependencies": [
8
- "prosekit@^0.20.0-beta.8",
8
+ "prosekit@^0.20.0",
9
9
  "rehype-parse",
10
10
  "rehype-remark",
11
11
  "remark-gfm",
@@ -19,7 +19,7 @@
19
19
  "path": "registry/src/react/examples/save-markdown/editor.tsx",
20
20
  "type": "registry:component",
21
21
  "target": "components/editor/examples/save-markdown/editor.tsx",
22
- "content": "'use client'\n\nimport 'prosekit/basic/style.css'\nimport 'prosekit/basic/typography.css'\n\nimport { defineBasicExtension } from 'prosekit/basic'\nimport { createEditor, jsonFromHTML } from 'prosekit/core'\nimport { ProseKit, useDocChange } from 'prosekit/react'\nimport { useCallback, useMemo, useState } from 'react'\n\nimport { htmlFromMarkdown, markdownFromHTML } from './markdown'\n\nexport default function Editor() {\n // A list of saved documents, stored as Markdown strings\n const [records, setRecords] = useState<string[]>([])\n // Whether there are unsaved changes\n const [hasUnsavedChange, setHasUnsavedChange] = useState(false)\n // A key to force a re-render of the editor\n const [key, setKey] = useState(1)\n\n const editor = useMemo(() => {\n const extension = defineBasicExtension()\n return createEditor({ extension })\n }, [])\n\n const handleDocChange = useCallback(() => setHasUnsavedChange(true), [])\n useDocChange(handleDocChange, { editor })\n\n const handleSave = useCallback(() => {\n const html = editor.getDocHTML()\n const record = markdownFromHTML(html)\n setRecords((prev) => [...prev, record])\n setHasUnsavedChange(false)\n }, [editor])\n\n const handleLoad = useCallback(\n (record: string) => {\n const html = htmlFromMarkdown(record)\n editor.setContent(jsonFromHTML(html, { schema: editor.schema }))\n setHasUnsavedChange(false)\n setKey((prev) => prev + 1)\n },\n [editor],\n )\n\n return (\n <div className=\"box-border h-full w-full min-h-36 overflow-y-hidden overflow-x-hidden rounded-md border border-solid border-gray-200 dark:border-gray-700 shadow-sm flex flex-col bg-white dark:bg-gray-950 text-black dark:text-white\">\n <button\n onClick={handleSave}\n disabled={!hasUnsavedChange}\n className=\"m-1 border border-solid bg-white px-2 py-1 text-sm text-black disabled:cursor-not-allowed disabled:text-gray-500\"\n >\n {hasUnsavedChange ? 'Save' : 'No changes to save'}\n </button>\n <ul className=\"border-b border-t border-solid text-sm\">\n {records.map((record, index) => (\n <li key={index} className=\"m-1 flex gap-2\">\n <button\n className=\"border border-solid bg-white px-2 py-1 text-black\"\n onClick={() => handleLoad(record)}\n >\n Load\n </button>\n <span className=\"flex-1 overflow-x-scroll p-2\">\n <pre>{record}</pre>\n </span>\n </li>\n ))}\n </ul>\n <ProseKit editor={editor} key={key}>\n <div className=\"relative w-full flex-1 box-border overflow-y-auto\">\n <div ref={editor.mount} className=\"ProseMirror box-border min-h-full px-[max(4rem,calc(50%-20rem))] py-8 outline-hidden outline-0 [&_span[data-mention=user]]:text-blue-500 [&_span[data-mention=tag]]:text-violet-500\"></div>\n </div>\n </ProseKit>\n </div>\n )\n}\n"
22
+ "content": "'use client'\n\nimport 'prosekit/basic/style.css'\nimport 'prosekit/basic/typography.css'\n\nimport { defineBasicExtension } from 'prosekit/basic'\nimport { createEditor, jsonFromHTML } from 'prosekit/core'\nimport { ProseKit, useDocChange } from 'prosekit/react'\nimport { useCallback, useMemo, useState } from 'react'\n\nimport { htmlFromMarkdown, markdownFromHTML } from './markdown'\n\nexport default function Editor() {\n // A list of saved documents, stored as Markdown strings\n const [records, setRecords] = useState<string[]>([])\n // Whether there are unsaved changes\n const [hasUnsavedChange, setHasUnsavedChange] = useState(false)\n // A key to force a re-render of the editor\n const [key, setKey] = useState(1)\n\n const editor = useMemo(() => {\n const extension = defineBasicExtension()\n return createEditor({ extension })\n }, [])\n\n const handleDocChange = useCallback(() => setHasUnsavedChange(true), [])\n useDocChange(handleDocChange, { editor })\n\n const handleSave = useCallback(() => {\n const html = editor.getDocHTML()\n const record = markdownFromHTML(html)\n setRecords((prev) => [...prev, record])\n setHasUnsavedChange(false)\n }, [editor])\n\n const handleLoad = useCallback(\n (record: string) => {\n const html = htmlFromMarkdown(record)\n editor.setContent(jsonFromHTML(html, { schema: editor.schema }))\n setHasUnsavedChange(false)\n setKey((prev) => prev + 1)\n },\n [editor],\n )\n\n return (\n <div className=\"box-border h-full w-full min-h-36 overflow-y-hidden overflow-x-hidden rounded-md border border-solid border-gray-200 dark:border-gray-700 shadow-sm flex flex-col bg-[canvas] text-black dark:text-white\">\n <button\n onClick={handleSave}\n disabled={!hasUnsavedChange}\n className=\"m-1 border border-solid bg-white px-2 py-1 text-sm text-black disabled:cursor-not-allowed disabled:text-gray-500\"\n >\n {hasUnsavedChange ? 'Save' : 'No changes to save'}\n </button>\n <ul className=\"border-b border-t border-solid text-sm\">\n {records.map((record, index) => (\n <li key={index} className=\"m-1 flex gap-2\">\n <button\n className=\"border border-solid bg-white px-2 py-1 text-black\"\n onClick={() => handleLoad(record)}\n >\n Load\n </button>\n <span className=\"flex-1 overflow-x-scroll p-2\">\n <pre>{record}</pre>\n </span>\n </li>\n ))}\n </ul>\n <ProseKit editor={editor} key={key}>\n <div className=\"relative w-full flex-1 box-border overflow-y-auto\">\n <div ref={editor.mount} className=\"ProseMirror box-border min-h-full px-[max(4rem,calc(50%-20rem))] py-8 outline-hidden outline-0 [&_span[data-mention=user]]:text-blue-500 [&_span[data-mention=tag]]:text-violet-500\"></div>\n </div>\n </ProseKit>\n </div>\n )\n}\n"
23
23
  },
24
24
  {
25
25
  "path": "registry/src/react/examples/save-markdown/index.ts",
@@ -8,14 +8,14 @@
8
8
  "https://unpkg.com/prosekit-registry/dist/r/react-ui-search.json"
9
9
  ],
10
10
  "dependencies": [
11
- "prosekit@^0.20.0-beta.8"
11
+ "prosekit@^0.20.0"
12
12
  ],
13
13
  "files": [
14
14
  {
15
15
  "path": "registry/src/react/examples/search/editor.tsx",
16
16
  "type": "registry:component",
17
17
  "target": "components/editor/examples/search/editor.tsx",
18
- "content": "'use client'\n\nimport 'prosekit/basic/style.css'\nimport 'prosekit/basic/typography.css'\nimport 'prosekit/extensions/search/style.css'\n\nimport { createEditor, type NodeJSON } from 'prosekit/core'\nimport { ProseKit } from 'prosekit/react'\nimport { useMemo } from 'react'\n\nimport { sampleContent } from '../../sample/sample-doc-search'\nimport { Search } from '../../ui/search'\n\nimport { defineExtension } from './extension'\n\ninterface EditorProps {\n initialContent?: NodeJSON\n}\n\nexport default function Editor(props: EditorProps) {\n const defaultContent = props.initialContent ?? sampleContent\n const editor = useMemo(() => {\n const extension = defineExtension()\n return createEditor({\n extension,\n defaultContent,\n })\n }, [defaultContent])\n\n return (\n <ProseKit editor={editor}>\n <div className=\"box-border h-full w-full min-h-36 overflow-y-hidden overflow-x-hidden rounded-md border border-solid border-gray-200 dark:border-gray-700 shadow-sm flex flex-col bg-white dark:bg-gray-950 text-black dark:text-white\">\n <div className=\"relative w-full flex-1 box-border overflow-y-auto\">\n <Search />\n <div ref={editor.mount} className=\"ProseMirror box-border min-h-full px-[max(4rem,calc(50%-20rem))] py-8 outline-hidden outline-0 [&_span[data-mention=user]]:text-blue-500 [&_span[data-mention=tag]]:text-violet-500\"></div>\n </div>\n </div>\n </ProseKit>\n )\n}\n"
18
+ "content": "'use client'\n\nimport 'prosekit/basic/style.css'\nimport 'prosekit/basic/typography.css'\nimport 'prosekit/extensions/search/style.css'\n\nimport { createEditor, type NodeJSON } from 'prosekit/core'\nimport { ProseKit } from 'prosekit/react'\nimport { useMemo } from 'react'\n\nimport { sampleContent } from '../../sample/sample-doc-search'\nimport { Search } from '../../ui/search'\n\nimport { defineExtension } from './extension'\n\ninterface EditorProps {\n initialContent?: NodeJSON\n}\n\nexport default function Editor(props: EditorProps) {\n const defaultContent = props.initialContent ?? sampleContent\n const editor = useMemo(() => {\n const extension = defineExtension()\n return createEditor({\n extension,\n defaultContent,\n })\n }, [defaultContent])\n\n return (\n <ProseKit editor={editor}>\n <div className=\"box-border h-full w-full min-h-36 overflow-y-hidden overflow-x-hidden rounded-md border border-solid border-gray-200 dark:border-gray-700 shadow-sm flex flex-col bg-[canvas] text-black dark:text-white\">\n <div className=\"relative w-full flex-1 box-border overflow-y-auto\">\n <Search />\n <div ref={editor.mount} className=\"ProseMirror box-border min-h-full px-[max(4rem,calc(50%-20rem))] py-8 outline-hidden outline-0 [&_span[data-mention=user]]:text-blue-500 [&_span[data-mention=tag]]:text-violet-500\"></div>\n </div>\n </div>\n </ProseKit>\n )\n}\n"
19
19
  },
20
20
  {
21
21
  "path": "registry/src/react/examples/search/extension.ts",
@@ -7,14 +7,14 @@
7
7
  "https://unpkg.com/prosekit-registry/dist/r/react-ui-slash-menu.json"
8
8
  ],
9
9
  "dependencies": [
10
- "prosekit@^0.20.0-beta.8"
10
+ "prosekit@^0.20.0"
11
11
  ],
12
12
  "files": [
13
13
  {
14
14
  "path": "registry/src/react/examples/slash-menu/editor.tsx",
15
15
  "type": "registry:component",
16
16
  "target": "components/editor/examples/slash-menu/editor.tsx",
17
- "content": "'use client'\n\nimport 'prosekit/basic/style.css'\nimport 'prosekit/basic/typography.css'\n\nimport { createEditor } from 'prosekit/core'\nimport { ProseKit } from 'prosekit/react'\nimport { useMemo } from 'react'\n\nimport { SlashMenu } from '../../ui/slash-menu'\n\nimport { defineExtension } from './extension'\n\nexport default function Editor() {\n const editor = useMemo(() => {\n const extension = defineExtension()\n return createEditor({ extension })\n }, [])\n\n return (\n <ProseKit editor={editor}>\n <div className=\"box-border h-full w-full min-h-36 overflow-y-hidden overflow-x-hidden rounded-md border border-solid border-gray-200 dark:border-gray-700 shadow-sm flex flex-col bg-white dark:bg-gray-950 text-black dark:text-white\">\n <div className=\"relative w-full flex-1 box-border overflow-y-auto\">\n <div ref={editor.mount} className=\"ProseMirror box-border min-h-full px-[max(4rem,calc(50%-20rem))] py-8 outline-hidden outline-0 [&_span[data-mention=user]]:text-blue-500 [&_span[data-mention=tag]]:text-violet-500\"></div>\n <SlashMenu />\n </div>\n </div>\n </ProseKit>\n )\n}\n"
17
+ "content": "'use client'\n\nimport 'prosekit/basic/style.css'\nimport 'prosekit/basic/typography.css'\n\nimport { createEditor } from 'prosekit/core'\nimport { ProseKit } from 'prosekit/react'\nimport { useMemo } from 'react'\n\nimport { SlashMenu } from '../../ui/slash-menu'\n\nimport { defineExtension } from './extension'\n\nexport default function Editor() {\n const editor = useMemo(() => {\n const extension = defineExtension()\n return createEditor({ extension })\n }, [])\n\n return (\n <ProseKit editor={editor}>\n <div className=\"box-border h-full w-full min-h-36 overflow-y-hidden overflow-x-hidden rounded-md border border-solid border-gray-200 dark:border-gray-700 shadow-sm flex flex-col bg-[canvas] text-black dark:text-white\">\n <div className=\"relative w-full flex-1 box-border overflow-y-auto\">\n <div ref={editor.mount} className=\"ProseMirror box-border min-h-full px-[max(4rem,calc(50%-20rem))] py-8 outline-hidden outline-0 [&_span[data-mention=user]]:text-blue-500 [&_span[data-mention=tag]]:text-violet-500\"></div>\n <SlashMenu />\n </div>\n </div>\n </ProseKit>\n )\n}\n"
18
18
  },
19
19
  {
20
20
  "path": "registry/src/react/examples/slash-menu/extension.ts",
@@ -8,14 +8,14 @@
8
8
  "https://unpkg.com/prosekit-registry/dist/r/react-ui-button.json"
9
9
  ],
10
10
  "dependencies": [
11
- "prosekit@^0.20.0-beta.8"
11
+ "prosekit@^0.20.0"
12
12
  ],
13
13
  "files": [
14
14
  {
15
15
  "path": "registry/src/react/examples/strike/editor.tsx",
16
16
  "type": "registry:component",
17
17
  "target": "components/editor/examples/strike/editor.tsx",
18
- "content": "'use client'\n\nimport 'prosekit/basic/style.css'\nimport 'prosekit/basic/typography.css'\n\nimport { createEditor, type NodeJSON } from 'prosekit/core'\nimport { ProseKit } from 'prosekit/react'\nimport { useMemo } from 'react'\n\nimport { sampleContent } from '../../sample/sample-doc-strike'\n\nimport { defineExtension } from './extension'\nimport Toolbar from './toolbar'\n\ninterface EditorProps {\n initialContent?: NodeJSON\n}\n\nexport default function Editor(props: EditorProps) {\n const defaultContent = props.initialContent ?? sampleContent\n const editor = useMemo(() => {\n const extension = defineExtension()\n return createEditor({ extension, defaultContent })\n }, [defaultContent])\n\n return (\n <ProseKit editor={editor}>\n <div className=\"box-border h-full w-full min-h-36 overflow-y-hidden overflow-x-hidden rounded-md border border-solid border-gray-200 dark:border-gray-700 shadow-sm flex flex-col bg-white dark:bg-gray-950 text-black dark:text-white\">\n <Toolbar />\n <div className=\"relative w-full flex-1 box-border overflow-y-auto\">\n <div ref={editor.mount} className=\"ProseMirror box-border min-h-full px-[max(4rem,calc(50%-20rem))] py-8 outline-hidden outline-0 [&_span[data-mention=user]]:text-blue-500 [&_span[data-mention=tag]]:text-violet-500\"></div>\n </div>\n </div>\n </ProseKit>\n )\n}\n"
18
+ "content": "'use client'\n\nimport 'prosekit/basic/style.css'\nimport 'prosekit/basic/typography.css'\n\nimport { createEditor, type NodeJSON } from 'prosekit/core'\nimport { ProseKit } from 'prosekit/react'\nimport { useMemo } from 'react'\n\nimport { sampleContent } from '../../sample/sample-doc-strike'\n\nimport { defineExtension } from './extension'\nimport Toolbar from './toolbar'\n\ninterface EditorProps {\n initialContent?: NodeJSON\n}\n\nexport default function Editor(props: EditorProps) {\n const defaultContent = props.initialContent ?? sampleContent\n const editor = useMemo(() => {\n const extension = defineExtension()\n return createEditor({ extension, defaultContent })\n }, [defaultContent])\n\n return (\n <ProseKit editor={editor}>\n <div className=\"box-border h-full w-full min-h-36 overflow-y-hidden overflow-x-hidden rounded-md border border-solid border-gray-200 dark:border-gray-700 shadow-sm flex flex-col bg-[canvas] text-black dark:text-white\">\n <Toolbar />\n <div className=\"relative w-full flex-1 box-border overflow-y-auto\">\n <div ref={editor.mount} className=\"ProseMirror box-border min-h-full px-[max(4rem,calc(50%-20rem))] py-8 outline-hidden outline-0 [&_span[data-mention=user]]:text-blue-500 [&_span[data-mention=tag]]:text-violet-500\"></div>\n </div>\n </div>\n </ProseKit>\n )\n}\n"
19
19
  },
20
20
  {
21
21
  "path": "registry/src/react/examples/strike/extension.ts",
@@ -8,14 +8,14 @@
8
8
  "https://unpkg.com/prosekit-registry/dist/r/react-ui-table-handle.json"
9
9
  ],
10
10
  "dependencies": [
11
- "prosekit@^0.20.0-beta.8"
11
+ "prosekit@^0.20.0"
12
12
  ],
13
13
  "files": [
14
14
  {
15
15
  "path": "registry/src/react/examples/table/editor.tsx",
16
16
  "type": "registry:component",
17
17
  "target": "components/editor/examples/table/editor.tsx",
18
- "content": "'use client'\n\nimport 'prosekit/basic/style.css'\nimport 'prosekit/basic/typography.css'\n\nimport { createEditor, type NodeJSON } from 'prosekit/core'\nimport { ProseKit } from 'prosekit/react'\nimport { useMemo } from 'react'\n\nimport { sampleContent } from '../../sample/sample-doc-table'\nimport { TableHandle } from '../../ui/table-handle'\n\nimport { defineExtension } from './extension'\n\ninterface EditorProps {\n initialContent?: NodeJSON\n}\n\nexport default function Editor(props: EditorProps) {\n const defaultContent = props.initialContent ?? sampleContent\n const editor = useMemo(() => {\n const extension = defineExtension()\n return createEditor({ extension, defaultContent })\n }, [defaultContent])\n\n return (\n <ProseKit editor={editor}>\n <div className=\"box-border h-full w-full min-h-36 overflow-y-hidden overflow-x-hidden rounded-md border border-solid border-gray-200 dark:border-gray-700 shadow-sm flex flex-col bg-white dark:bg-gray-950 text-black dark:text-white\">\n <div className=\"relative w-full flex-1 box-border overflow-y-auto\">\n <div ref={editor.mount} className=\"ProseMirror box-border min-h-full px-[max(4rem,calc(50%-20rem))] py-8 outline-hidden outline-0 [&_span[data-mention=user]]:text-blue-500 [&_span[data-mention=tag]]:text-violet-500\"></div>\n <TableHandle />\n </div>\n </div>\n </ProseKit>\n )\n}\n"
18
+ "content": "'use client'\n\nimport 'prosekit/basic/style.css'\nimport 'prosekit/basic/typography.css'\n\nimport { createEditor, type NodeJSON } from 'prosekit/core'\nimport { ProseKit } from 'prosekit/react'\nimport { useMemo } from 'react'\n\nimport { sampleContent } from '../../sample/sample-doc-table'\nimport { TableHandle } from '../../ui/table-handle'\n\nimport { defineExtension } from './extension'\n\ninterface EditorProps {\n initialContent?: NodeJSON\n}\n\nexport default function Editor(props: EditorProps) {\n const defaultContent = props.initialContent ?? sampleContent\n const editor = useMemo(() => {\n const extension = defineExtension()\n return createEditor({ extension, defaultContent })\n }, [defaultContent])\n\n return (\n <ProseKit editor={editor}>\n <div className=\"box-border h-full w-full min-h-36 overflow-y-hidden overflow-x-hidden rounded-md border border-solid border-gray-200 dark:border-gray-700 shadow-sm flex flex-col bg-[canvas] text-black dark:text-white\">\n <div className=\"relative w-full flex-1 box-border overflow-y-auto\">\n <div ref={editor.mount} className=\"ProseMirror box-border min-h-full px-[max(4rem,calc(50%-20rem))] py-8 outline-hidden outline-0 [&_span[data-mention=user]]:text-blue-500 [&_span[data-mention=tag]]:text-violet-500\"></div>\n <TableHandle />\n </div>\n </div>\n </ProseKit>\n )\n}\n"
19
19
  },
20
20
  {
21
21
  "path": "registry/src/react/examples/table/extension.ts",
@@ -8,14 +8,14 @@
8
8
  "https://unpkg.com/prosekit-registry/dist/r/react-sample-temml.json"
9
9
  ],
10
10
  "dependencies": [
11
- "prosekit@^0.20.0-beta.8"
11
+ "prosekit@^0.20.0"
12
12
  ],
13
13
  "files": [
14
14
  {
15
15
  "path": "registry/src/react/examples/temml/editor.tsx",
16
16
  "type": "registry:component",
17
17
  "target": "components/editor/examples/temml/editor.tsx",
18
- "content": "'use client'\n\nimport 'prosekit/basic/style.css'\nimport 'prosekit/basic/typography.css'\n\nimport { createEditor, type NodeJSON } from 'prosekit/core'\nimport { ProseKit } from 'prosekit/react'\nimport { useMemo } from 'react'\n\nimport { sampleContent } from '../../sample/sample-doc-tex'\n\nimport { defineExtension } from './extension'\n\ninterface EditorProps {\n initialContent?: NodeJSON\n}\n\nexport default function Editor(props: EditorProps) {\n const defaultContent = props.initialContent ?? sampleContent\n const editor = useMemo(() => {\n const extension = defineExtension()\n return createEditor({ extension, defaultContent })\n }, [defaultContent])\n\n return (\n <ProseKit editor={editor}>\n <div className=\"box-border h-full w-full min-h-36 overflow-y-hidden overflow-x-hidden rounded-md border border-solid border-gray-200 dark:border-gray-700 shadow-sm flex flex-col bg-white dark:bg-gray-950 text-black dark:text-white\">\n <div className=\"relative w-full flex-1 box-border overflow-y-auto\">\n <div ref={editor.mount} className=\"ProseMirror box-border min-h-full px-[max(4rem,calc(50%-20rem))] py-8 outline-hidden outline-0 [&_span[data-mention=user]]:text-blue-500 [&_span[data-mention=tag]]:text-violet-500\"></div>\n </div>\n </div>\n </ProseKit>\n )\n}\n"
18
+ "content": "'use client'\n\nimport 'prosekit/basic/style.css'\nimport 'prosekit/basic/typography.css'\n\nimport { createEditor, type NodeJSON } from 'prosekit/core'\nimport { ProseKit } from 'prosekit/react'\nimport { useMemo } from 'react'\n\nimport { sampleContent } from '../../sample/sample-doc-tex'\n\nimport { defineExtension } from './extension'\n\ninterface EditorProps {\n initialContent?: NodeJSON\n}\n\nexport default function Editor(props: EditorProps) {\n const defaultContent = props.initialContent ?? sampleContent\n const editor = useMemo(() => {\n const extension = defineExtension()\n return createEditor({ extension, defaultContent })\n }, [defaultContent])\n\n return (\n <ProseKit editor={editor}>\n <div className=\"box-border h-full w-full min-h-36 overflow-y-hidden overflow-x-hidden rounded-md border border-solid border-gray-200 dark:border-gray-700 shadow-sm flex flex-col bg-[canvas] text-black dark:text-white\">\n <div className=\"relative w-full flex-1 box-border overflow-y-auto\">\n <div ref={editor.mount} className=\"ProseMirror box-border min-h-full px-[max(4rem,calc(50%-20rem))] py-8 outline-hidden outline-0 [&_span[data-mention=user]]:text-blue-500 [&_span[data-mention=tag]]:text-violet-500\"></div>\n </div>\n </div>\n </ProseKit>\n )\n}\n"
19
19
  },
20
20
  {
21
21
  "path": "registry/src/react/examples/temml/extension.ts",
@@ -8,14 +8,14 @@
8
8
  "https://unpkg.com/prosekit-registry/dist/r/react-ui-button.json"
9
9
  ],
10
10
  "dependencies": [
11
- "prosekit@^0.20.0-beta.8"
11
+ "prosekit@^0.20.0"
12
12
  ],
13
13
  "files": [
14
14
  {
15
15
  "path": "registry/src/react/examples/text-align/editor.tsx",
16
16
  "type": "registry:component",
17
17
  "target": "components/editor/examples/text-align/editor.tsx",
18
- "content": "'use client'\n\nimport 'prosekit/basic/style.css'\nimport 'prosekit/basic/typography.css'\n\nimport { createEditor, type NodeJSON } from 'prosekit/core'\nimport { ProseKit } from 'prosekit/react'\nimport { useMemo } from 'react'\n\nimport { sampleContent } from '../../sample/sample-doc-text-align'\n\nimport { defineExtension } from './extension'\nimport Toolbar from './toolbar'\n\ninterface EditorProps {\n initialContent?: NodeJSON\n}\n\nexport default function Editor(props: EditorProps) {\n const defaultContent = props.initialContent ?? sampleContent\n const editor = useMemo(() => {\n const extension = defineExtension()\n return createEditor({ extension, defaultContent })\n }, [defaultContent])\n\n return (\n <ProseKit editor={editor}>\n <div className=\"box-border h-full w-full min-h-36 overflow-y-hidden overflow-x-hidden rounded-md border border-solid border-gray-200 dark:border-gray-700 shadow-sm flex flex-col bg-white dark:bg-gray-950 text-black dark:text-white\">\n <Toolbar />\n <div className=\"relative w-full flex-1 box-border overflow-y-auto\">\n <div ref={editor.mount} className=\"ProseMirror box-border min-h-full px-[max(4rem,calc(50%-20rem))] py-8 outline-hidden outline-0 [&_span[data-mention=user]]:text-blue-500 [&_span[data-mention=tag]]:text-violet-500\"></div>\n </div>\n </div>\n </ProseKit>\n )\n}\n"
18
+ "content": "'use client'\n\nimport 'prosekit/basic/style.css'\nimport 'prosekit/basic/typography.css'\n\nimport { createEditor, type NodeJSON } from 'prosekit/core'\nimport { ProseKit } from 'prosekit/react'\nimport { useMemo } from 'react'\n\nimport { sampleContent } from '../../sample/sample-doc-text-align'\n\nimport { defineExtension } from './extension'\nimport Toolbar from './toolbar'\n\ninterface EditorProps {\n initialContent?: NodeJSON\n}\n\nexport default function Editor(props: EditorProps) {\n const defaultContent = props.initialContent ?? sampleContent\n const editor = useMemo(() => {\n const extension = defineExtension()\n return createEditor({ extension, defaultContent })\n }, [defaultContent])\n\n return (\n <ProseKit editor={editor}>\n <div className=\"box-border h-full w-full min-h-36 overflow-y-hidden overflow-x-hidden rounded-md border border-solid border-gray-200 dark:border-gray-700 shadow-sm flex flex-col bg-[canvas] text-black dark:text-white\">\n <Toolbar />\n <div className=\"relative w-full flex-1 box-border overflow-y-auto\">\n <div ref={editor.mount} className=\"ProseMirror box-border min-h-full px-[max(4rem,calc(50%-20rem))] py-8 outline-hidden outline-0 [&_span[data-mention=user]]:text-blue-500 [&_span[data-mention=tag]]:text-violet-500\"></div>\n </div>\n </div>\n </ProseKit>\n )\n}\n"
19
19
  },
20
20
  {
21
21
  "path": "registry/src/react/examples/text-align/extension.ts",
@@ -8,14 +8,14 @@
8
8
  "https://unpkg.com/prosekit-registry/dist/r/react-ui-button.json"
9
9
  ],
10
10
  "dependencies": [
11
- "prosekit@^0.20.0-beta.8"
11
+ "prosekit@^0.20.0"
12
12
  ],
13
13
  "files": [
14
14
  {
15
15
  "path": "registry/src/react/examples/text-color/editor.tsx",
16
16
  "type": "registry:component",
17
17
  "target": "components/editor/examples/text-color/editor.tsx",
18
- "content": "'use client'\n\nimport 'prosekit/basic/style.css'\nimport 'prosekit/basic/typography.css'\n\nimport { createEditor, type NodeJSON } from 'prosekit/core'\nimport { ProseKit } from 'prosekit/react'\nimport { useMemo } from 'react'\n\nimport { sampleContent } from '../../sample/sample-doc-text-color'\n\nimport { defineExtension } from './extension'\nimport InlineMenu from './inline-menu'\n\ninterface EditorProps {\n initialContent?: NodeJSON\n}\n\nexport default function Editor(props: EditorProps) {\n const defaultContent = props.initialContent ?? sampleContent\n const editor = useMemo(() => {\n const extension = defineExtension()\n return createEditor({ extension, defaultContent })\n }, [defaultContent])\n\n return (\n <ProseKit editor={editor}>\n <div className=\"box-border h-full w-full min-h-36 overflow-y-hidden overflow-x-hidden rounded-md border border-solid border-gray-200 dark:border-gray-700 shadow-sm flex flex-col bg-white dark:bg-gray-950 text-black dark:text-white\">\n <div className=\"relative w-full flex-1 box-border overflow-y-auto\">\n <div ref={editor.mount} className=\"ProseMirror box-border min-h-full px-[max(4rem,calc(50%-20rem))] py-8 outline-hidden outline-0 [&_span[data-mention=user]]:text-blue-500 [&_span[data-mention=tag]]:text-violet-500\"></div>\n <InlineMenu />\n </div>\n </div>\n </ProseKit>\n )\n}\n"
18
+ "content": "'use client'\n\nimport 'prosekit/basic/style.css'\nimport 'prosekit/basic/typography.css'\n\nimport { createEditor, type NodeJSON } from 'prosekit/core'\nimport { ProseKit } from 'prosekit/react'\nimport { useMemo } from 'react'\n\nimport { sampleContent } from '../../sample/sample-doc-text-color'\n\nimport { defineExtension } from './extension'\nimport InlineMenu from './inline-menu'\n\ninterface EditorProps {\n initialContent?: NodeJSON\n}\n\nexport default function Editor(props: EditorProps) {\n const defaultContent = props.initialContent ?? sampleContent\n const editor = useMemo(() => {\n const extension = defineExtension()\n return createEditor({ extension, defaultContent })\n }, [defaultContent])\n\n return (\n <ProseKit editor={editor}>\n <div className=\"box-border h-full w-full min-h-36 overflow-y-hidden overflow-x-hidden rounded-md border border-solid border-gray-200 dark:border-gray-700 shadow-sm flex flex-col bg-[canvas] text-black dark:text-white\">\n <div className=\"relative w-full flex-1 box-border overflow-y-auto\">\n <div ref={editor.mount} className=\"ProseMirror box-border min-h-full px-[max(4rem,calc(50%-20rem))] py-8 outline-hidden outline-0 [&_span[data-mention=user]]:text-blue-500 [&_span[data-mention=tag]]:text-violet-500\"></div>\n <InlineMenu />\n </div>\n </div>\n </ProseKit>\n )\n}\n"
19
19
  },
20
20
  {
21
21
  "path": "registry/src/react/examples/text-color/extension.ts",
@@ -33,7 +33,7 @@
33
33
  "path": "registry/src/react/examples/text-color/inline-menu.tsx",
34
34
  "type": "registry:component",
35
35
  "target": "components/editor/examples/text-color/inline-menu.tsx",
36
- "content": "'use client'\n\nimport type { Editor, Keymap } from 'prosekit/core'\nimport { useEditorDerivedValue, useKeymap } from 'prosekit/react'\nimport { InlinePopoverPopup, InlinePopoverPositioner, InlinePopoverRoot } from 'prosekit/react/inline-popover'\nimport { useMemo, useState } from 'react'\n\nimport { Button } from '../../ui/button'\n\nimport type { EditorExtension } from './extension'\n\nconst textColors = [\n { label: 'Gray', value: '#9ca3af' },\n { label: 'Brown', value: '#92400e' },\n { label: 'Orange', value: '#ea580c' },\n { label: 'Yellow', value: '#ca8a04' },\n { label: 'Green', value: '#16a34a' },\n { label: 'Blue', value: '#2563eb' },\n { label: 'Purple', value: '#9333ea' },\n { label: 'Magenta', value: '#c026d3' },\n { label: 'Red', value: '#dc2626' },\n]\n\nconst backgroundColors = [\n { label: 'Gray', value: '#f3f4f6' },\n { label: 'Brown', value: '#fef3c7' },\n { label: 'Orange', value: '#ffedd5' },\n { label: 'Yellow', value: '#fef9c3' },\n { label: 'Green', value: '#d1fae5' },\n { label: 'Blue', value: '#dbeafe' },\n { label: 'Purple', value: '#e9d5ff' },\n { label: 'Pink', value: '#fce7f3' },\n { label: 'Red', value: '#fecaca' },\n]\n\nfunction getTextColorState(editor: Editor<EditorExtension>) {\n return [{\n label: 'Default',\n value: 'currentColor',\n isActive: !editor.marks.textColor.isActive(),\n onClick: () => editor.commands.removeTextColor(),\n }].concat(textColors.map((color) => ({\n label: color.label,\n value: color.value,\n isActive: editor.marks.textColor.isActive({ color: color.value }),\n onClick: () => editor.commands.addTextColor({ color: color.value }),\n })))\n}\n\nfunction getBackgroundColorState(editor: Editor<EditorExtension>) {\n return [{\n label: 'Default',\n value: 'canvas',\n isActive: !editor.marks.backgroundColor.isActive(),\n onClick: () => editor.commands.removeBackgroundColor(),\n }].concat(\n backgroundColors.map((color) => ({\n label: color.label,\n value: color.value,\n isActive: editor.marks.backgroundColor.isActive({ color: color.value }),\n onClick: () => editor.commands.addBackgroundColor({ color: color.value }),\n })),\n )\n}\n\nexport default function InlineMenu() {\n const textColorState = useEditorDerivedValue(getTextColorState)\n const backgroundColorState = useEditorDerivedValue(getBackgroundColorState)\n const [open, setOpen] = useState(false)\n\n const keymap: Keymap = useMemo(() => ({\n Escape: () => {\n if (open) {\n setOpen(false)\n return true\n }\n return false\n },\n }), [open])\n\n useKeymap(keymap)\n\n return (\n <InlinePopoverRoot\n open={open}\n onOpenChange={(event) => setOpen(event.detail)}\n >\n <InlinePopoverPositioner className=\"block overflow-visible w-min h-min z-50 ease-out transition-transform duration-100 motion-reduce:transition-none\">\n <InlinePopoverPopup className=\"box-border origin-(--transform-origin) transition transition-discrete motion-reduce:transition-none data-[state=closed]:duration-150 data-[state=closed]:opacity-0 starting:opacity-0 data-[state=closed]:scale-95 starting:scale-95 duration-40 border border-gray-200 dark:border-gray-800 bg-white dark:bg-gray-950 shadow-lg overscroll-none relative flex min-w-32 space-x-1 overflow-auto whitespace-nowrap rounded-md p-1\">\n <div className=\"flex flex-col gap-4 p-4\">\n <div className=\"flex flex-col gap-2\">\n <div className=\"text-sm\">Text color</div>\n <div className=\"grid grid-cols-5 gap-1\">\n {textColorState.map((color) => (\n <Button\n key={color.label}\n pressed={color.isActive}\n tooltip={`Text: ${color.label}`}\n onClick={color.onClick}\n >\n <span\n className=\"text-base font-medium\"\n style={{ color: color.value }}\n >\n A\n </span>\n </Button>\n ))}\n </div>\n </div>\n <div className=\"flex flex-col gap-2\">\n <div className=\"text-sm\">Background color</div>\n <div className=\"grid grid-cols-5 gap-1\">\n {backgroundColorState.map((color) => (\n <Button\n key={color.label}\n pressed={color.isActive}\n tooltip={`Background: ${color.label}`}\n onClick={color.onClick}\n >\n <div\n className=\"w-6 h-6 rounded border border-gray-200 dark:border-gray-700\"\n style={{ backgroundColor: color.value }}\n />\n </Button>\n ))}\n </div>\n </div>\n </div>\n </InlinePopoverPopup>\n </InlinePopoverPositioner>\n </InlinePopoverRoot>\n )\n}\n"
36
+ "content": "'use client'\n\nimport type { Editor, Keymap } from 'prosekit/core'\nimport { useEditorDerivedValue, useKeymap } from 'prosekit/react'\nimport { InlinePopoverPopup, InlinePopoverPositioner, InlinePopoverRoot } from 'prosekit/react/inline-popover'\nimport { useMemo, useState } from 'react'\n\nimport { Button } from '../../ui/button'\n\nimport type { EditorExtension } from './extension'\n\nconst textColors = [\n { label: 'Gray', value: '#9ca3af' },\n { label: 'Brown', value: '#92400e' },\n { label: 'Orange', value: '#ea580c' },\n { label: 'Yellow', value: '#ca8a04' },\n { label: 'Green', value: '#16a34a' },\n { label: 'Blue', value: '#2563eb' },\n { label: 'Purple', value: '#9333ea' },\n { label: 'Magenta', value: '#c026d3' },\n { label: 'Red', value: '#dc2626' },\n]\n\nconst backgroundColors = [\n { label: 'Gray', value: '#f3f4f6' },\n { label: 'Brown', value: '#fef3c7' },\n { label: 'Orange', value: '#ffedd5' },\n { label: 'Yellow', value: '#fef9c3' },\n { label: 'Green', value: '#d1fae5' },\n { label: 'Blue', value: '#dbeafe' },\n { label: 'Purple', value: '#e9d5ff' },\n { label: 'Pink', value: '#fce7f3' },\n { label: 'Red', value: '#fecaca' },\n]\n\nfunction getTextColorState(editor: Editor<EditorExtension>) {\n return [{\n label: 'Default',\n value: 'currentColor',\n isActive: !editor.marks.textColor.isActive(),\n onClick: () => editor.commands.removeTextColor(),\n }].concat(textColors.map((color) => ({\n label: color.label,\n value: color.value,\n isActive: editor.marks.textColor.isActive({ color: color.value }),\n onClick: () => editor.commands.addTextColor({ color: color.value }),\n })))\n}\n\nfunction getBackgroundColorState(editor: Editor<EditorExtension>) {\n return [{\n label: 'Default',\n value: 'canvas',\n isActive: !editor.marks.backgroundColor.isActive(),\n onClick: () => editor.commands.removeBackgroundColor(),\n }].concat(\n backgroundColors.map((color) => ({\n label: color.label,\n value: color.value,\n isActive: editor.marks.backgroundColor.isActive({ color: color.value }),\n onClick: () => editor.commands.addBackgroundColor({ color: color.value }),\n })),\n )\n}\n\nexport default function InlineMenu() {\n const textColorState = useEditorDerivedValue(getTextColorState)\n const backgroundColorState = useEditorDerivedValue(getBackgroundColorState)\n const [open, setOpen] = useState(false)\n\n const keymap: Keymap = useMemo(() => ({\n Escape: () => {\n if (open) {\n setOpen(false)\n return true\n }\n return false\n },\n }), [open])\n\n useKeymap(keymap)\n\n return (\n <InlinePopoverRoot\n open={open}\n onOpenChange={(event) => setOpen(event.detail)}\n >\n <InlinePopoverPositioner className=\"block overflow-visible w-min h-min z-50 ease-out transition-transform duration-100 motion-reduce:transition-none\">\n <InlinePopoverPopup className=\"box-border origin-(--transform-origin) transition-[opacity,scale] transition-discrete motion-reduce:transition-none data-[state=closed]:duration-150 data-[state=closed]:opacity-0 starting:opacity-0 data-[state=closed]:scale-95 starting:scale-95 duration-40 border border-gray-200 dark:border-gray-800 shadow-lg bg-[canvas] relative flex min-w-32 space-x-1 overflow-auto whitespace-nowrap rounded-lg p-1\">\n <div className=\"flex flex-col gap-4 p-4\">\n <div className=\"flex flex-col gap-2\">\n <div className=\"text-sm\">Text color</div>\n <div className=\"grid grid-cols-5 gap-1\">\n {textColorState.map((color) => (\n <Button\n key={color.label}\n pressed={color.isActive}\n tooltip={`Text: ${color.label}`}\n onClick={color.onClick}\n >\n <span\n className=\"text-base font-medium\"\n style={{ color: color.value }}\n >\n A\n </span>\n </Button>\n ))}\n </div>\n </div>\n <div className=\"flex flex-col gap-2\">\n <div className=\"text-sm\">Background color</div>\n <div className=\"grid grid-cols-5 gap-1\">\n {backgroundColorState.map((color) => (\n <Button\n key={color.label}\n pressed={color.isActive}\n tooltip={`Background: ${color.label}`}\n onClick={color.onClick}\n >\n <div\n className=\"w-6 h-6 rounded border border-gray-200 dark:border-gray-700\"\n style={{ backgroundColor: color.value }}\n />\n </Button>\n ))}\n </div>\n </div>\n </div>\n </InlinePopoverPopup>\n </InlinePopoverPositioner>\n </InlinePopoverRoot>\n )\n}\n"
37
37
  }
38
38
  ],
39
39
  "meta": {
@@ -8,14 +8,14 @@
8
8
  "https://unpkg.com/prosekit-registry/dist/r/react-ui-toolbar.json"
9
9
  ],
10
10
  "dependencies": [
11
- "prosekit@^0.20.0-beta.8"
11
+ "prosekit@^0.20.0"
12
12
  ],
13
13
  "files": [
14
14
  {
15
15
  "path": "registry/src/react/examples/toolbar/editor.tsx",
16
16
  "type": "registry:component",
17
17
  "target": "components/editor/examples/toolbar/editor.tsx",
18
- "content": "'use client'\n\nimport 'prosekit/basic/style.css'\nimport 'prosekit/basic/typography.css'\n\nimport { createEditor } from 'prosekit/core'\nimport { ProseKit } from 'prosekit/react'\nimport { useMemo } from 'react'\n\nimport { sampleUploader } from '../../sample/sample-uploader'\nimport { Toolbar } from '../../ui/toolbar'\n\nimport { defineExtension } from './extension'\n\nexport default function Editor() {\n const editor = useMemo(() => {\n const extension = defineExtension()\n return createEditor({ extension })\n }, [])\n\n return (\n <ProseKit editor={editor}>\n <div className=\"box-border h-full w-full min-h-36 overflow-y-hidden overflow-x-hidden rounded-md border border-solid border-gray-200 dark:border-gray-700 shadow-sm flex flex-col bg-white dark:bg-gray-950 text-black dark:text-white\">\n <Toolbar uploader={sampleUploader} />\n <div className=\"relative w-full flex-1 box-border overflow-y-auto\">\n <div ref={editor.mount} className=\"ProseMirror box-border min-h-full px-[max(4rem,calc(50%-20rem))] py-8 outline-hidden outline-0 [&_span[data-mention=user]]:text-blue-500 [&_span[data-mention=tag]]:text-violet-500\"></div>\n </div>\n </div>\n </ProseKit>\n )\n}\n"
18
+ "content": "'use client'\n\nimport 'prosekit/basic/style.css'\nimport 'prosekit/basic/typography.css'\n\nimport { createEditor } from 'prosekit/core'\nimport { ProseKit } from 'prosekit/react'\nimport { useMemo } from 'react'\n\nimport { sampleUploader } from '../../sample/sample-uploader'\nimport { Toolbar } from '../../ui/toolbar'\n\nimport { defineExtension } from './extension'\n\nexport default function Editor() {\n const editor = useMemo(() => {\n const extension = defineExtension()\n return createEditor({ extension })\n }, [])\n\n return (\n <ProseKit editor={editor}>\n <div className=\"box-border h-full w-full min-h-36 overflow-y-hidden overflow-x-hidden rounded-md border border-solid border-gray-200 dark:border-gray-700 shadow-sm flex flex-col bg-[canvas] text-black dark:text-white\">\n <Toolbar uploader={sampleUploader} />\n <div className=\"relative w-full flex-1 box-border overflow-y-auto\">\n <div ref={editor.mount} className=\"ProseMirror box-border min-h-full px-[max(4rem,calc(50%-20rem))] py-8 outline-hidden outline-0 [&_span[data-mention=user]]:text-blue-500 [&_span[data-mention=tag]]:text-violet-500\"></div>\n </div>\n </div>\n </ProseKit>\n )\n}\n"
19
19
  },
20
20
  {
21
21
  "path": "registry/src/react/examples/toolbar/extension.ts",
@@ -7,7 +7,7 @@
7
7
  "https://unpkg.com/prosekit-registry/dist/r/react-sample-sample-doc-tweet.json"
8
8
  ],
9
9
  "dependencies": [
10
- "prosekit@^0.20.0-beta.8",
10
+ "prosekit@^0.20.0",
11
11
  "react-tweet"
12
12
  ],
13
13
  "files": [
@@ -15,7 +15,7 @@
15
15
  "path": "registry/src/react/examples/tweet/editor.tsx",
16
16
  "type": "registry:component",
17
17
  "target": "components/editor/examples/tweet/editor.tsx",
18
- "content": "'use client'\n\nimport 'prosekit/basic/style.css'\nimport 'prosekit/basic/typography.css'\n\nimport { createEditor, type Extension, type NodeJSON } from 'prosekit/core'\nimport { defineReactNodeView, ProseKit, useExtension } from 'prosekit/react'\nimport { useMemo, useState } from 'react'\n\nimport { sampleContent } from '../../sample/sample-doc-tweet'\n\nimport { defineExtension } from './extension'\nimport { MethodSelect } from './method-select'\nimport { TweetView } from './tweet-view'\n\ninterface EditorProps {\n initialContent?: NodeJSON\n}\n\nexport default function Editor(props: EditorProps) {\n const defaultContent = props.initialContent ?? sampleContent\n const editor = useMemo(() => {\n return createEditor({ extension: defineExtension(), defaultContent })\n }, [defaultContent])\n\n const [method, setMethod] = useState<'basic' | 'advanced'>('basic')\n\n const reactTweetView: Extension | null = useMemo(() => {\n if (method === 'basic') {\n return null\n }\n return defineReactNodeView({\n name: 'tweet',\n component: TweetView,\n })\n }, [method])\n\n useExtension(reactTweetView, { editor })\n\n return (\n <ProseKit editor={editor}>\n <MethodSelect value={method} onChange={setMethod} />\n <div className=\"box-border h-full w-full min-h-36 overflow-y-hidden overflow-x-hidden rounded-md border border-solid border-gray-200 dark:border-gray-700 shadow-sm flex flex-col bg-white dark:bg-gray-950 text-black dark:text-white\">\n <div className=\"relative w-full flex-1 box-border overflow-y-auto\">\n <div ref={editor.mount} className=\"ProseMirror box-border min-h-full px-[max(4rem,calc(50%-20rem))] py-8 outline-hidden outline-0 [&_span[data-mention=user]]:text-blue-500 [&_span[data-mention=tag]]:text-violet-500\"></div>\n </div>\n </div>\n </ProseKit>\n )\n}\n"
18
+ "content": "'use client'\n\nimport 'prosekit/basic/style.css'\nimport 'prosekit/basic/typography.css'\n\nimport { createEditor, type Extension, type NodeJSON } from 'prosekit/core'\nimport { defineReactNodeView, ProseKit, useExtension } from 'prosekit/react'\nimport { useMemo, useState } from 'react'\n\nimport { sampleContent } from '../../sample/sample-doc-tweet'\n\nimport { defineExtension } from './extension'\nimport { MethodSelect } from './method-select'\nimport { TweetView } from './tweet-view'\n\ninterface EditorProps {\n initialContent?: NodeJSON\n}\n\nexport default function Editor(props: EditorProps) {\n const defaultContent = props.initialContent ?? sampleContent\n const editor = useMemo(() => {\n return createEditor({ extension: defineExtension(), defaultContent })\n }, [defaultContent])\n\n const [method, setMethod] = useState<'basic' | 'advanced'>('basic')\n\n const reactTweetView: Extension | null = useMemo(() => {\n if (method === 'basic') {\n return null\n }\n return defineReactNodeView({\n name: 'tweet',\n component: TweetView,\n })\n }, [method])\n\n useExtension(reactTweetView, { editor })\n\n return (\n <ProseKit editor={editor}>\n <MethodSelect value={method} onChange={setMethod} />\n <div className=\"box-border h-full w-full min-h-36 overflow-y-hidden overflow-x-hidden rounded-md border border-solid border-gray-200 dark:border-gray-700 shadow-sm flex flex-col bg-[canvas] text-black dark:text-white\">\n <div className=\"relative w-full flex-1 box-border overflow-y-auto\">\n <div ref={editor.mount} className=\"ProseMirror box-border min-h-full px-[max(4rem,calc(50%-20rem))] py-8 outline-hidden outline-0 [&_span[data-mention=user]]:text-blue-500 [&_span[data-mention=tag]]:text-violet-500\"></div>\n </div>\n </div>\n </ProseKit>\n )\n}\n"
19
19
  },
20
20
  {
21
21
  "path": "registry/src/react/examples/tweet/extension.ts",