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
@@ -5,7 +5,7 @@
5
5
  "description": "",
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
  {
@@ -5,7 +5,7 @@
5
5
  "description": "",
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
  {
@@ -5,7 +5,7 @@
5
5
  "description": "",
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
  {
@@ -5,7 +5,7 @@
5
5
  "description": "",
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
  {
@@ -5,7 +5,7 @@
5
5
  "description": "",
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
  {
@@ -5,7 +5,7 @@
5
5
  "description": "",
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
  {
@@ -5,7 +5,7 @@
5
5
  "description": "",
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
  {
@@ -5,7 +5,7 @@
5
5
  "description": "",
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
  {
@@ -5,7 +5,7 @@
5
5
  "description": "",
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
  {
@@ -5,7 +5,7 @@
5
5
  "description": "",
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
  {
@@ -5,7 +5,7 @@
5
5
  "description": "",
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
  {
@@ -5,7 +5,7 @@
5
5
  "description": "",
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
  {
@@ -5,7 +5,7 @@
5
5
  "description": "",
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
  {
@@ -5,7 +5,7 @@
5
5
  "description": "",
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
  {
@@ -5,7 +5,7 @@
5
5
  "description": "",
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
  {
@@ -5,7 +5,7 @@
5
5
  "description": "",
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
  {
@@ -5,7 +5,7 @@
5
5
  "description": "",
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
  {
@@ -5,7 +5,7 @@
5
5
  "description": "",
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
  {
@@ -5,7 +5,7 @@
5
5
  "description": "",
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
  {
@@ -5,7 +5,7 @@
5
5
  "description": "",
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
  {
@@ -5,7 +5,7 @@
5
5
  "description": "",
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
  {
@@ -5,7 +5,7 @@
5
5
  "description": "",
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
  {
@@ -5,7 +5,7 @@
5
5
  "description": "",
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
  {
@@ -5,7 +5,7 @@
5
5
  "description": "",
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
  {
@@ -5,7 +5,7 @@
5
5
  "description": "",
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
  {
@@ -5,7 +5,7 @@
5
5
  "description": "",
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
  {
@@ -5,7 +5,7 @@
5
5
  "description": "",
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
  {
@@ -5,7 +5,7 @@
5
5
  "description": "",
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
  {
@@ -5,7 +5,7 @@
5
5
  "description": "",
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
  {
@@ -5,7 +5,7 @@
5
5
  "description": "",
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
  {
@@ -7,14 +7,14 @@
7
7
  "dependencies": [
8
8
  "@egoist/tailwindcss-icons",
9
9
  "@iconify-json/lucide",
10
- "prosekit@^0.20.0-beta.8"
10
+ "prosekit@^0.20.0"
11
11
  ],
12
12
  "files": [
13
13
  {
14
14
  "path": "registry/src/solid/ui/block-handle/block-handle.tsx",
15
15
  "type": "registry:component",
16
16
  "target": "components/editor/ui/block-handle/block-handle.tsx",
17
- "content": "import { BlockHandleAdd, BlockHandleDraggable, BlockHandlePopup, BlockHandlePositioner, BlockHandleRoot } from 'prosekit/solid/block-handle'\nimport type { JSX } from 'solid-js'\n\ninterface Props {\n dir?: 'ltr' | 'rtl'\n}\n\nexport default function BlockHandle(props: Props): JSX.Element {\n return (\n <BlockHandleRoot>\n <BlockHandlePositioner\n placement={props.dir === 'rtl' ? 'right' : 'left'}\n class=\"block overflow-visible w-min h-min z-50 ease-out transition-transform duration-100 motion-reduce:transition-none\"\n >\n <BlockHandlePopup class=\"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 <BlockHandleAdd class=\"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 class=\"i-lucide-plus size-5 block\" />\n </BlockHandleAdd>\n <BlockHandleDraggable class=\"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 class=\"i-lucide-grip-vertical size-5 block\" />\n </BlockHandleDraggable>\n </BlockHandlePopup>\n </BlockHandlePositioner>\n </BlockHandleRoot>\n )\n}\n"
17
+ "content": "import { BlockHandleAdd, BlockHandleDraggable, BlockHandlePopup, BlockHandlePositioner, BlockHandleRoot } from 'prosekit/solid/block-handle'\nimport type { JSX } from 'solid-js'\n\ninterface Props {\n dir?: 'ltr' | 'rtl'\n}\n\nexport default function BlockHandle(props: Props): JSX.Element {\n return (\n <BlockHandleRoot>\n <BlockHandlePositioner\n placement={props.dir === 'rtl' ? 'right' : 'left'}\n class=\"block overflow-visible w-min h-min z-50 ease-out transition-transform duration-100 motion-reduce:transition-none\"\n >\n <BlockHandlePopup class=\"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 <BlockHandleAdd class=\"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 class=\"i-lucide-plus size-5 block\" />\n </BlockHandleAdd>\n <BlockHandleDraggable class=\"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 class=\"i-lucide-grip-vertical size-5 block\" />\n </BlockHandleDraggable>\n </BlockHandlePopup>\n </BlockHandlePositioner>\n </BlockHandleRoot>\n )\n}\n"
18
18
  },
19
19
  {
20
20
  "path": "registry/src/solid/ui/block-handle/index.ts",
@@ -5,14 +5,14 @@
5
5
  "description": "",
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/solid/ui/button/button.tsx",
13
13
  "type": "registry:component",
14
14
  "target": "components/editor/ui/button/button.tsx",
15
- "content": "import { TooltipPopup, TooltipPositioner, TooltipRoot, TooltipTrigger } from 'prosekit/solid/tooltip'\nimport type { JSX } from 'solid-js'\n\nexport default function Button(props: {\n pressed?: boolean\n disabled?: boolean\n onClick?: () => void\n tooltip?: string\n children: JSX.Element\n}): JSX.Element {\n return (\n <TooltipRoot>\n <TooltipTrigger class=\"block\">\n <button\n data-state={props.pressed ? 'on' : 'off'}\n disabled={props.disabled}\n onClick={props.onClick}\n onMouseDown={(event) => {\n // Prevent the editor from being blurred when the button is clicked\n event.preventDefault()\n }}\n class=\"outline-unset focus-visible:outline-unset flex items-center justify-center rounded-md p-2 font-medium transition focus-visible:ring-2 text-sm focus-visible:ring-gray-900 dark:focus-visible:ring-gray-300 disabled:pointer-events-none min-w-9 min-h-9 text-gray-900 dark:text-gray-50 disabled:text-gray-900/50 dark:disabled:text-gray-50/50 bg-transparent hover:bg-gray-100 dark:hover:bg-gray-800 data-[state=on]:bg-gray-200 dark:data-[state=on]:bg-gray-700\"\n >\n {props.children}\n {props.tooltip ? <span class=\"sr-only\">{props.tooltip}</span> : null}\n </button>\n </TooltipTrigger>\n {props.tooltip\n ? (\n <TooltipPositioner class=\"block overflow-visible w-min h-min z-50 ease-out transition-transform duration-100 motion-reduce:transition-none\">\n <TooltipPopup class=\"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 overflow-hidden rounded-md border border-solid bg-gray-900 dark:bg-gray-50 px-3 py-1.5 text-xs text-gray-50 dark:text-gray-900 shadow-xs text-nowrap\">\n {props.tooltip}\n </TooltipPopup>\n </TooltipPositioner>\n )\n : null}\n </TooltipRoot>\n )\n}\n"
15
+ "content": "import { TooltipPopup, TooltipPositioner, TooltipRoot, TooltipTrigger } from 'prosekit/solid/tooltip'\nimport type { JSX } from 'solid-js'\n\nexport default function Button(props: {\n pressed?: boolean\n disabled?: boolean\n onClick?: () => void\n tooltip?: string\n children: JSX.Element\n}): JSX.Element {\n return (\n <TooltipRoot>\n <TooltipTrigger class=\"block\">\n <button\n data-state={props.pressed ? 'on' : 'off'}\n disabled={props.disabled}\n onClick={props.onClick}\n onMouseDown={(event) => {\n // Prevent the editor from being blurred when the button is clicked\n event.preventDefault()\n }}\n class=\"outline-unset focus-visible:outline-unset flex items-center justify-center rounded-md p-2 font-medium transition focus-visible:ring-2 text-sm focus-visible:ring-gray-900 dark:focus-visible:ring-gray-300 disabled:pointer-events-none min-w-9 min-h-9 text-gray-900 dark:text-gray-50 disabled:text-gray-900/50 dark:disabled:text-gray-50/50 bg-transparent hover:bg-gray-100 dark:hover:bg-gray-800 data-[state=on]:bg-gray-200 dark:data-[state=on]:bg-gray-700\"\n >\n {props.children}\n {props.tooltip ? <span class=\"sr-only\">{props.tooltip}</span> : null}\n </button>\n </TooltipTrigger>\n {props.tooltip\n ? (\n <TooltipPositioner class=\"block overflow-visible w-min h-min z-50 ease-out transition-transform duration-100 motion-reduce:transition-none\">\n <TooltipPopup class=\"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 overflow-hidden rounded-md border border-solid bg-gray-900 dark:bg-gray-50 px-3 py-1.5 text-xs text-gray-50 dark:text-gray-900 shadow-xs text-nowrap\">\n {props.tooltip}\n </TooltipPopup>\n </TooltipPositioner>\n )\n : null}\n </TooltipRoot>\n )\n}\n"
16
16
  },
17
17
  {
18
18
  "path": "registry/src/solid/ui/button/index.ts",
@@ -5,7 +5,7 @@
5
5
  "description": "",
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
  {
@@ -5,7 +5,7 @@
5
5
  "description": "",
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
  {
@@ -7,14 +7,14 @@
7
7
  "https://unpkg.com/prosekit-registry/dist/r/solid-ui-button.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/solid/ui/image-upload-popover/image-upload-popover.tsx",
15
15
  "type": "registry:component",
16
16
  "target": "components/editor/ui/image-upload-popover/image-upload-popover.tsx",
17
- "content": "import type { Uploader } from 'prosekit/extensions/file'\nimport type { ImageExtension } from 'prosekit/extensions/image'\nimport { useEditor } from 'prosekit/solid'\nimport { PopoverPopup, PopoverPositioner, PopoverRoot, PopoverTrigger } from 'prosekit/solid/popover'\nimport type { OpenChangeEvent } from 'prosekit/web/popover'\nimport { createSignal, createUniqueId, Show, type JSX } from 'solid-js'\n\nimport { Button } from '../button'\n\nexport default function ImageUploadPopover(props: {\n uploader: Uploader<string>\n tooltip: string\n disabled: boolean\n children: JSX.Element\n}): JSX.Element {\n const [open, setOpen] = createSignal(false)\n const [url, setUrl] = createSignal('')\n const [file, setFile] = createSignal<File | null>(null)\n const ariaId = createUniqueId()\n\n const editor = useEditor<ImageExtension>()\n\n const handleFileChange = (event: Event) => {\n const target = event.target as HTMLInputElement\n const selectedFile = target.files?.[0]\n\n if (selectedFile) {\n setFile(selectedFile)\n setUrl('')\n } else {\n setFile(null)\n }\n }\n\n const handleUrlChange = (event: Event) => {\n const target = event.target as HTMLInputElement\n const inputUrl = target.value\n\n if (inputUrl) {\n setUrl(inputUrl)\n setFile(null)\n } else {\n setUrl('')\n }\n }\n\n const deferResetState = () => {\n setTimeout(() => {\n setUrl('')\n setFile(null)\n }, 300)\n }\n\n const handleSubmit = () => {\n if (url()) {\n editor().commands.insertImage({ src: url() })\n } else if (file()) {\n editor().commands.uploadImage({ file: file()!, uploader: props.uploader })\n }\n setOpen(false)\n deferResetState()\n }\n\n const handleOpenChange = (event: OpenChangeEvent) => {\n if (!event.detail) {\n deferResetState()\n }\n setOpen(event.detail)\n }\n\n return (\n <PopoverRoot open={open()} onOpenChange={handleOpenChange}>\n <PopoverTrigger>\n <Button pressed={open()} disabled={props.disabled} tooltip={props.tooltip}>\n {props.children}\n </Button>\n </PopoverTrigger>\n\n <PopoverPositioner placement=\"bottom\" class=\"block overflow-visible w-min h-min z-50 ease-out transition-transform duration-100 motion-reduce:transition-none\">\n <PopoverPopup class=\"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 gap-y-4 p-6 text-sm w-sm\">\n <Show when={!file()}>\n <label for={`id-link-${ariaId}`}>Embed Link</label>\n <input\n id={`id-link-${ariaId}`}\n class=\"flex h-9 rounded-md w-full bg-white dark:bg-gray-950 px-3 py-2 text-sm placeholder:text-gray-500 dark:placeholder:text-gray-500 transition border box-border border-gray-200 dark:border-gray-800 border-solid ring-0 ring-transparent focus-visible:ring-2 focus-visible:ring-gray-900 dark:focus-visible:ring-gray-300 focus-visible:ring-offset-0 outline-hidden focus-visible:outline-hidden file:border-0 file:bg-transparent file:text-sm file:font-medium disabled:cursor-not-allowed disabled:opacity-50\"\n placeholder=\"Paste the image link...\"\n type=\"url\"\n value={url()}\n onInput={handleUrlChange}\n />\n </Show>\n\n <Show when={!url()}>\n <label for={`id-upload-${ariaId}`}>Upload</label>\n <input\n id={`id-upload-${ariaId}`}\n class=\"flex h-9 rounded-md w-full bg-white dark:bg-gray-950 px-3 py-2 text-sm placeholder:text-gray-500 dark:placeholder:text-gray-500 transition border box-border border-gray-200 dark:border-gray-800 border-solid ring-0 ring-transparent focus-visible:ring-2 focus-visible:ring-gray-900 dark:focus-visible:ring-gray-300 focus-visible:ring-offset-0 outline-hidden focus-visible:outline-hidden file:border-0 file:bg-transparent file:text-sm file:font-medium disabled:cursor-not-allowed disabled:opacity-50\"\n accept=\"image/*\"\n type=\"file\"\n onChange={handleFileChange}\n />\n </Show>\n\n <Show when={url()}>\n <button class=\"inline-flex items-center justify-center whitespace-nowrap rounded-md text-sm font-medium ring-offset-white dark:ring-offset-gray-950 transition-colors focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-gray-900 dark:focus-visible:ring-gray-300 focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 border-0 bg-gray-900 dark:bg-gray-50 text-gray-50 dark:text-gray-900 hover:bg-gray-900/90 dark:hover:bg-gray-50/90 h-10 px-4 py-2 w-full\" onClick={handleSubmit}>\n Insert Image\n </button>\n </Show>\n\n <Show when={file()}>\n <button class=\"inline-flex items-center justify-center whitespace-nowrap rounded-md text-sm font-medium ring-offset-white dark:ring-offset-gray-950 transition-colors focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-gray-900 dark:focus-visible:ring-gray-300 focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 border-0 bg-gray-900 dark:bg-gray-50 text-gray-50 dark:text-gray-900 hover:bg-gray-900/90 dark:hover:bg-gray-50/90 h-10 px-4 py-2 w-full\" onClick={handleSubmit}>\n Upload Image\n </button>\n </Show>\n </PopoverPopup>\n </PopoverPositioner>\n </PopoverRoot>\n )\n}\n"
17
+ "content": "import type { Uploader } from 'prosekit/extensions/file'\nimport type { ImageExtension } from 'prosekit/extensions/image'\nimport { useEditor } from 'prosekit/solid'\nimport { PopoverPopup, PopoverPositioner, PopoverRoot, PopoverTrigger } from 'prosekit/solid/popover'\nimport type { OpenChangeEvent } from 'prosekit/web/popover'\nimport { createSignal, createUniqueId, Show, type JSX } from 'solid-js'\n\nimport { Button } from '../button'\n\nexport default function ImageUploadPopover(props: {\n uploader: Uploader<string>\n tooltip: string\n disabled: boolean\n children: JSX.Element\n}): JSX.Element {\n const [open, setOpen] = createSignal(false)\n const [url, setUrl] = createSignal('')\n const [file, setFile] = createSignal<File | null>(null)\n const ariaId = createUniqueId()\n\n const editor = useEditor<ImageExtension>()\n\n const handleFileChange = (event: Event) => {\n const target = event.target as HTMLInputElement\n const selectedFile = target.files?.[0]\n\n if (selectedFile) {\n setFile(selectedFile)\n setUrl('')\n } else {\n setFile(null)\n }\n }\n\n const handleUrlChange = (event: Event) => {\n const target = event.target as HTMLInputElement\n const inputUrl = target.value\n\n if (inputUrl) {\n setUrl(inputUrl)\n setFile(null)\n } else {\n setUrl('')\n }\n }\n\n const deferResetState = () => {\n setTimeout(() => {\n setUrl('')\n setFile(null)\n }, 300)\n }\n\n const handleSubmit = () => {\n if (url()) {\n editor().commands.insertImage({ src: url() })\n } else if (file()) {\n editor().commands.uploadImage({ file: file()!, uploader: props.uploader })\n }\n setOpen(false)\n deferResetState()\n }\n\n const handleOpenChange = (event: OpenChangeEvent) => {\n if (!event.detail) {\n deferResetState()\n }\n setOpen(event.detail)\n }\n\n return (\n <PopoverRoot open={open()} onOpenChange={handleOpenChange}>\n <PopoverTrigger>\n <Button pressed={open()} disabled={props.disabled} tooltip={props.tooltip}>\n {props.children}\n </Button>\n </PopoverTrigger>\n\n <PopoverPositioner placement=\"bottom\" class=\"block overflow-visible w-min h-min z-50 ease-out transition-transform duration-100 motion-reduce:transition-none\">\n <PopoverPopup class=\"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 gap-y-4 p-6 text-sm w-sm\">\n <Show when={!file()}>\n <label for={`id-link-${ariaId}`}>Embed Link</label>\n <input\n id={`id-link-${ariaId}`}\n class=\"flex h-9 rounded-md w-full bg-[canvas] px-3 py-2 text-sm placeholder:text-gray-500 dark:placeholder:text-gray-500 transition border box-border border-gray-200 dark:border-gray-800 border-solid ring-0 ring-transparent focus-visible:ring-2 focus-visible:ring-gray-900 dark:focus-visible:ring-gray-300 focus-visible:ring-offset-0 outline-hidden focus-visible:outline-hidden file:border-0 file:bg-transparent file:text-sm file:font-medium disabled:cursor-not-allowed disabled:opacity-50\"\n placeholder=\"Paste the image link...\"\n type=\"url\"\n value={url()}\n onInput={handleUrlChange}\n />\n </Show>\n\n <Show when={!url()}>\n <label for={`id-upload-${ariaId}`}>Upload</label>\n <input\n id={`id-upload-${ariaId}`}\n class=\"flex h-9 rounded-md w-full bg-[canvas] px-3 py-2 text-sm placeholder:text-gray-500 dark:placeholder:text-gray-500 transition border box-border border-gray-200 dark:border-gray-800 border-solid ring-0 ring-transparent focus-visible:ring-2 focus-visible:ring-gray-900 dark:focus-visible:ring-gray-300 focus-visible:ring-offset-0 outline-hidden focus-visible:outline-hidden file:border-0 file:bg-transparent file:text-sm file:font-medium disabled:cursor-not-allowed disabled:opacity-50\"\n accept=\"image/*\"\n type=\"file\"\n onChange={handleFileChange}\n />\n </Show>\n\n <Show when={url()}>\n <button class=\"inline-flex items-center justify-center whitespace-nowrap rounded-md text-sm font-medium ring-offset-white dark:ring-offset-gray-950 transition-colors focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-gray-900 dark:focus-visible:ring-gray-300 focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 border-0 bg-gray-900 dark:bg-gray-50 text-gray-50 dark:text-gray-900 hover:bg-gray-900/90 dark:hover:bg-gray-50/90 h-10 px-4 py-2 w-full\" onClick={handleSubmit}>\n Insert Image\n </button>\n </Show>\n\n <Show when={file()}>\n <button class=\"inline-flex items-center justify-center whitespace-nowrap rounded-md text-sm font-medium ring-offset-white dark:ring-offset-gray-950 transition-colors focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-gray-900 dark:focus-visible:ring-gray-300 focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 border-0 bg-gray-900 dark:bg-gray-50 text-gray-50 dark:text-gray-900 hover:bg-gray-900/90 dark:hover:bg-gray-50/90 h-10 px-4 py-2 w-full\" onClick={handleSubmit}>\n Upload Image\n </button>\n </Show>\n </PopoverPopup>\n </PopoverPositioner>\n </PopoverRoot>\n )\n}\n"
18
18
  },
19
19
  {
20
20
  "path": "registry/src/solid/ui/image-upload-popover/index.ts",
@@ -7,7 +7,7 @@
7
7
  "dependencies": [
8
8
  "@egoist/tailwindcss-icons",
9
9
  "@iconify-json/lucide",
10
- "prosekit@^0.20.0-beta.8"
10
+ "prosekit@^0.20.0"
11
11
  ],
12
12
  "files": [
13
13
  {
@@ -9,7 +9,7 @@
9
9
  "dependencies": [
10
10
  "@egoist/tailwindcss-icons",
11
11
  "@iconify-json/lucide",
12
- "prosekit@^0.20.0-beta.8"
12
+ "prosekit@^0.20.0"
13
13
  ],
14
14
  "files": [
15
15
  {
@@ -22,7 +22,7 @@
22
22
  "path": "registry/src/solid/ui/inline-menu/inline-menu.tsx",
23
23
  "type": "registry:component",
24
24
  "target": "components/editor/ui/inline-menu/inline-menu.tsx",
25
- "content": "import type { BasicExtension } from 'prosekit/basic'\nimport type { Editor } from 'prosekit/core'\nimport type { LinkAttrs } from 'prosekit/extensions/link'\nimport type { EditorState } from 'prosekit/pm/state'\nimport { useEditor, useEditorDerivedValue } from 'prosekit/solid'\nimport { InlinePopoverPopup, InlinePopoverPositioner, InlinePopoverRoot } from 'prosekit/solid/inline-popover'\nimport { createSignal, Show, type JSX } from 'solid-js'\n\nimport { Button } from '../button'\n\nfunction getInlineMenuItems(editor: Editor<BasicExtension>) {\n return {\n bold: editor.commands.toggleBold\n ? {\n isActive: editor.marks.bold.isActive(),\n canExec: editor.commands.toggleBold.canExec(),\n command: () => editor.commands.toggleBold(),\n }\n : undefined,\n italic: editor.commands.toggleItalic\n ? {\n isActive: editor.marks.italic.isActive(),\n canExec: editor.commands.toggleItalic.canExec(),\n command: () => editor.commands.toggleItalic(),\n }\n : undefined,\n underline: editor.commands.toggleUnderline\n ? {\n isActive: editor.marks.underline.isActive(),\n canExec: editor.commands.toggleUnderline.canExec(),\n command: () => editor.commands.toggleUnderline(),\n }\n : undefined,\n strike: editor.commands.toggleStrike\n ? {\n isActive: editor.marks.strike.isActive(),\n canExec: editor.commands.toggleStrike.canExec(),\n command: () => editor.commands.toggleStrike(),\n }\n : undefined,\n code: editor.commands.toggleCode\n ? {\n isActive: editor.marks.code.isActive(),\n canExec: editor.commands.toggleCode.canExec(),\n command: () => editor.commands.toggleCode(),\n }\n : undefined,\n link: editor.commands.addLink\n ? {\n isActive: editor.marks.link.isActive(),\n canExec: editor.commands.addLink.canExec({ href: '' }),\n command: () => editor.commands.expandLink(),\n currentLink: getCurrentLink(editor.state) || '',\n }\n : undefined,\n }\n}\n\nfunction getCurrentLink(state: EditorState): string | undefined {\n const { $from } = state.selection\n const marks = $from.marksAcross($from)\n if (!marks) {\n return\n }\n for (const mark of marks) {\n if (mark.type.name === 'link') {\n return (mark.attrs as LinkAttrs).href\n }\n }\n}\n\nexport default function InlineMenu(): JSX.Element {\n const editor = useEditor<BasicExtension>()\n const items = useEditorDerivedValue(getInlineMenuItems)\n\n const [linkMenuOpen, setLinkMenuOpen] = createSignal(false)\n const toggleLinkMenuOpen = () => setLinkMenuOpen((open) => !open)\n\n const handleLinkUpdate = (href?: string) => {\n if (href) {\n editor().commands.addLink({ href })\n } else {\n editor().commands.removeLink()\n }\n\n setLinkMenuOpen(false)\n editor().focus()\n }\n\n return (\n <>\n <InlinePopoverRoot\n onOpenChange={(event) => {\n if (!event.detail) {\n setLinkMenuOpen(false)\n }\n }}\n >\n <InlinePopoverPositioner class=\"block overflow-visible w-min h-min z-50 ease-out transition-transform duration-100 motion-reduce:transition-none\">\n <InlinePopoverPopup\n attr:data-testid=\"inline-menu-main\"\n class=\"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 >\n <Show when={items().bold}>\n {(item) => (\n <Button\n pressed={item().isActive}\n disabled={!item().canExec}\n onClick={item().command}\n tooltip=\"Bold\"\n >\n <div class=\"i-lucide-bold size-5 block\"></div>\n </Button>\n )}\n </Show>\n <Show when={items().italic}>\n {(item) => (\n <Button\n pressed={item().isActive}\n disabled={!item().canExec}\n onClick={item().command}\n tooltip=\"Italic\"\n >\n <div class=\"i-lucide-italic size-5 block\"></div>\n </Button>\n )}\n </Show>\n <Show when={items().underline}>\n {(item) => (\n <Button\n pressed={item().isActive}\n disabled={!item().canExec}\n onClick={item().command}\n tooltip=\"Underline\"\n >\n <div class=\"i-lucide-underline size-5 block\"></div>\n </Button>\n )}\n </Show>\n <Show when={items().strike}>\n {(item) => (\n <Button\n pressed={item().isActive}\n disabled={!item().canExec}\n onClick={item().command}\n tooltip=\"Strikethrough\"\n >\n <div class=\"i-lucide-strikethrough size-5 block\"></div>\n </Button>\n )}\n </Show>\n <Show when={items().code}>\n {(item) => (\n <Button\n pressed={item().isActive}\n disabled={!item().canExec}\n onClick={item().command}\n tooltip=\"Code\"\n >\n <div class=\"i-lucide-code size-5 block\"></div>\n </Button>\n )}\n </Show>\n <Show when={items().link?.canExec && items().link}>\n {(item) => (\n <Button\n pressed={item().isActive}\n onClick={() => {\n item().command()\n toggleLinkMenuOpen()\n }}\n tooltip=\"Link\"\n >\n <div class=\"i-lucide-link size-5 block\"></div>\n </Button>\n )}\n </Show>\n </InlinePopoverPopup>\n </InlinePopoverPositioner>\n </InlinePopoverRoot>\n\n <Show when={items().link}>\n {(item) => (\n <InlinePopoverRoot\n defaultOpen={false}\n open={linkMenuOpen()}\n onOpenChange={(event) => setLinkMenuOpen(event.detail)}\n >\n <InlinePopoverPositioner placement=\"bottom\" class=\"block overflow-visible w-min h-min z-50 ease-out transition-transform duration-100 motion-reduce:transition-none\">\n <InlinePopoverPopup\n attr:data-testid=\"inline-menu-link\"\n class=\"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 flex-col w-xs rounded-lg p-4 gap-y-2 items-stretch\"\n >\n <Show when={linkMenuOpen()}>\n <form\n onSubmit={(event) => {\n event.preventDefault()\n const target = event.target as HTMLFormElement | null\n const href = target?.querySelector('input')?.value?.trim()\n handleLinkUpdate(href)\n }}\n >\n <input\n placeholder=\"Paste the link...\"\n value={item().currentLink || ''}\n class=\"flex h-9 rounded-md w-full bg-white dark:bg-gray-950 px-3 py-2 text-sm placeholder:text-gray-500 dark:placeholder:text-gray-500 transition border box-border border-gray-200 dark:border-gray-800 border-solid ring-0 ring-transparent focus-visible:ring-2 focus-visible:ring-gray-900 dark:focus-visible:ring-gray-300 focus-visible:ring-offset-0 outline-hidden focus-visible:outline-hidden file:border-0 file:bg-transparent file:text-sm file:font-medium disabled:cursor-not-allowed disabled:opacity-50\"\n />\n </form>\n </Show>\n <Show when={item().isActive}>\n <button\n onClick={() => handleLinkUpdate()}\n onMouseDown={(event) => event.preventDefault()}\n class=\"inline-flex items-center justify-center whitespace-nowrap rounded-md text-sm font-medium ring-offset-white dark:ring-offset-gray-950 transition-colors focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-gray-900 dark:focus-visible:ring-gray-300 focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 border-0 bg-gray-900 dark:bg-gray-50 text-gray-50 dark:text-gray-900 hover:bg-gray-900/90 dark:hover:bg-gray-50/90 h-9 px-3\"\n >\n Remove link\n </button>\n </Show>\n </InlinePopoverPopup>\n </InlinePopoverPositioner>\n </InlinePopoverRoot>\n )}\n </Show>\n </>\n )\n}\n"
25
+ "content": "import type { BasicExtension } from 'prosekit/basic'\nimport type { Editor } from 'prosekit/core'\nimport type { LinkAttrs } from 'prosekit/extensions/link'\nimport type { EditorState } from 'prosekit/pm/state'\nimport { useEditor, useEditorDerivedValue } from 'prosekit/solid'\nimport { InlinePopoverPopup, InlinePopoverPositioner, InlinePopoverRoot } from 'prosekit/solid/inline-popover'\nimport { createSignal, Show, type JSX } from 'solid-js'\n\nimport { Button } from '../button'\n\nfunction getInlineMenuItems(editor: Editor<BasicExtension>) {\n return {\n bold: editor.commands.toggleBold\n ? {\n isActive: editor.marks.bold.isActive(),\n canExec: editor.commands.toggleBold.canExec(),\n command: () => editor.commands.toggleBold(),\n }\n : undefined,\n italic: editor.commands.toggleItalic\n ? {\n isActive: editor.marks.italic.isActive(),\n canExec: editor.commands.toggleItalic.canExec(),\n command: () => editor.commands.toggleItalic(),\n }\n : undefined,\n underline: editor.commands.toggleUnderline\n ? {\n isActive: editor.marks.underline.isActive(),\n canExec: editor.commands.toggleUnderline.canExec(),\n command: () => editor.commands.toggleUnderline(),\n }\n : undefined,\n strike: editor.commands.toggleStrike\n ? {\n isActive: editor.marks.strike.isActive(),\n canExec: editor.commands.toggleStrike.canExec(),\n command: () => editor.commands.toggleStrike(),\n }\n : undefined,\n code: editor.commands.toggleCode\n ? {\n isActive: editor.marks.code.isActive(),\n canExec: editor.commands.toggleCode.canExec(),\n command: () => editor.commands.toggleCode(),\n }\n : undefined,\n link: editor.commands.addLink\n ? {\n isActive: editor.marks.link.isActive(),\n canExec: editor.commands.addLink.canExec({ href: '' }),\n command: () => editor.commands.expandLink(),\n currentLink: getCurrentLink(editor.state) || '',\n }\n : undefined,\n }\n}\n\nfunction getCurrentLink(state: EditorState): string | undefined {\n const { $from } = state.selection\n const marks = $from.marksAcross($from)\n if (!marks) {\n return\n }\n for (const mark of marks) {\n if (mark.type.name === 'link') {\n return (mark.attrs as LinkAttrs).href\n }\n }\n}\n\nexport default function InlineMenu(): JSX.Element {\n const editor = useEditor<BasicExtension>()\n const items = useEditorDerivedValue(getInlineMenuItems)\n\n const [linkMenuOpen, setLinkMenuOpen] = createSignal(false)\n const toggleLinkMenuOpen = () => setLinkMenuOpen((open) => !open)\n\n const handleLinkUpdate = (href?: string) => {\n if (href) {\n editor().commands.addLink({ href })\n } else {\n editor().commands.removeLink()\n }\n\n setLinkMenuOpen(false)\n editor().focus()\n }\n\n return (\n <>\n <InlinePopoverRoot\n onOpenChange={(event) => {\n if (!event.detail) {\n setLinkMenuOpen(false)\n }\n }}\n >\n <InlinePopoverPositioner class=\"block overflow-visible w-min h-min z-50 ease-out transition-transform duration-100 motion-reduce:transition-none\">\n <InlinePopoverPopup\n attr:data-testid=\"inline-menu-main\"\n class=\"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 >\n <Show when={items().bold}>\n {(item) => (\n <Button\n pressed={item().isActive}\n disabled={!item().canExec}\n onClick={item().command}\n tooltip=\"Bold\"\n >\n <div class=\"i-lucide-bold size-5 block\"></div>\n </Button>\n )}\n </Show>\n <Show when={items().italic}>\n {(item) => (\n <Button\n pressed={item().isActive}\n disabled={!item().canExec}\n onClick={item().command}\n tooltip=\"Italic\"\n >\n <div class=\"i-lucide-italic size-5 block\"></div>\n </Button>\n )}\n </Show>\n <Show when={items().underline}>\n {(item) => (\n <Button\n pressed={item().isActive}\n disabled={!item().canExec}\n onClick={item().command}\n tooltip=\"Underline\"\n >\n <div class=\"i-lucide-underline size-5 block\"></div>\n </Button>\n )}\n </Show>\n <Show when={items().strike}>\n {(item) => (\n <Button\n pressed={item().isActive}\n disabled={!item().canExec}\n onClick={item().command}\n tooltip=\"Strikethrough\"\n >\n <div class=\"i-lucide-strikethrough size-5 block\"></div>\n </Button>\n )}\n </Show>\n <Show when={items().code}>\n {(item) => (\n <Button\n pressed={item().isActive}\n disabled={!item().canExec}\n onClick={item().command}\n tooltip=\"Code\"\n >\n <div class=\"i-lucide-code size-5 block\"></div>\n </Button>\n )}\n </Show>\n <Show when={items().link?.canExec && items().link}>\n {(item) => (\n <Button\n pressed={item().isActive}\n onClick={() => {\n item().command()\n toggleLinkMenuOpen()\n }}\n tooltip=\"Link\"\n >\n <div class=\"i-lucide-link size-5 block\"></div>\n </Button>\n )}\n </Show>\n </InlinePopoverPopup>\n </InlinePopoverPositioner>\n </InlinePopoverRoot>\n\n <Show when={items().link}>\n {(item) => (\n <InlinePopoverRoot\n defaultOpen={false}\n open={linkMenuOpen()}\n onOpenChange={(event) => setLinkMenuOpen(event.detail)}\n >\n <InlinePopoverPositioner placement=\"bottom\" class=\"block overflow-visible w-min h-min z-50 ease-out transition-transform duration-100 motion-reduce:transition-none\">\n <InlinePopoverPopup\n attr:data-testid=\"inline-menu-link\"\n class=\"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 flex-col w-xs rounded-lg p-4 gap-y-2 items-stretch\"\n >\n <Show when={linkMenuOpen()}>\n <form\n onSubmit={(event) => {\n event.preventDefault()\n const target = event.target as HTMLFormElement | null\n const href = target?.querySelector('input')?.value?.trim()\n handleLinkUpdate(href)\n }}\n >\n <input\n placeholder=\"Paste the link...\"\n value={item().currentLink || ''}\n class=\"flex h-9 rounded-md w-full bg-[canvas] px-3 py-2 text-sm placeholder:text-gray-500 dark:placeholder:text-gray-500 transition border box-border border-gray-200 dark:border-gray-800 border-solid ring-0 ring-transparent focus-visible:ring-2 focus-visible:ring-gray-900 dark:focus-visible:ring-gray-300 focus-visible:ring-offset-0 outline-hidden focus-visible:outline-hidden file:border-0 file:bg-transparent file:text-sm file:font-medium disabled:cursor-not-allowed disabled:opacity-50\"\n />\n </form>\n </Show>\n <Show when={item().isActive}>\n <button\n onClick={() => handleLinkUpdate()}\n onMouseDown={(event) => event.preventDefault()}\n class=\"inline-flex items-center justify-center whitespace-nowrap rounded-md text-sm font-medium ring-offset-white dark:ring-offset-gray-950 transition-colors focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-gray-900 dark:focus-visible:ring-gray-300 focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 border-0 bg-gray-900 dark:bg-gray-50 text-gray-50 dark:text-gray-900 hover:bg-gray-900/90 dark:hover:bg-gray-50/90 h-9 px-3\"\n >\n Remove link\n </button>\n </Show>\n </InlinePopoverPopup>\n </InlinePopoverPositioner>\n </InlinePopoverRoot>\n )}\n </Show>\n </>\n )\n}\n"
26
26
  }
27
27
  ],
28
28
  "meta": {
@@ -9,7 +9,7 @@
9
9
  "dependencies": [
10
10
  "@egoist/tailwindcss-icons",
11
11
  "@iconify-json/lucide",
12
- "prosekit@^0.20.0-beta.8"
12
+ "prosekit@^0.20.0"
13
13
  ],
14
14
  "files": [
15
15
  {
@@ -22,7 +22,7 @@
22
22
  "path": "registry/src/solid/ui/search/search.tsx",
23
23
  "type": "registry:component",
24
24
  "target": "components/editor/ui/search/search.tsx",
25
- "content": "import { defineSearchQuery, type SearchCommandsExtension } from 'prosekit/extensions/search'\nimport { useEditor, useExtension } from 'prosekit/solid'\nimport { createMemo, createSignal, type JSX } from 'solid-js'\n\nimport { Button } from '../button'\n\nexport default function Search(props: { onClose?: VoidFunction }): JSX.Element {\n const [showReplace, setShowReplace] = createSignal(false)\n const toggleReplace = () => setShowReplace((value) => !value)\n\n const [searchText, setSearchText] = createSignal('')\n const [replaceText, setReplaceText] = createSignal('')\n\n const extension = createMemo(() => {\n if (!searchText()) {\n return null\n }\n return defineSearchQuery({ search: searchText(), replace: replaceText() })\n })\n\n useExtension(extension)\n\n const editor = useEditor<SearchCommandsExtension>({ update: true })\n\n const handleSearchKeyDown = (event: KeyboardEvent) => {\n if (isEnter(event)) {\n event.preventDefault()\n editor().commands.findNext()\n } else if (isShiftEnter(event)) {\n event.preventDefault()\n editor().commands.findPrev()\n }\n }\n\n const handleReplaceKeyDown = (event: KeyboardEvent) => {\n if (isEnter(event)) {\n event.preventDefault()\n editor().commands.replaceNext()\n } else if (isShiftEnter(event)) {\n event.preventDefault()\n editor().commands.replaceAll()\n }\n }\n\n return (\n <div class=\"z-2 box-border border-gray-200 dark:border-gray-800 border-solid border-l-0 border-r-0 border-t-0 border-b grid grid-cols-[min-content_1fr_min-content] gap-2 p-2\">\n <Button tooltip=\"Toggle Replace\" onClick={toggleReplace}>\n <span\n attr:data-rotate={showReplace() ? '' : undefined}\n class=\"i-lucide-chevron-right size-5 block transition-transform data-rotate:rotate-90\"\n />\n </Button>\n <input\n placeholder=\"Search\"\n type=\"text\"\n value={searchText()}\n onInput={(event) => setSearchText(event.currentTarget.value)}\n onKeyDown={handleSearchKeyDown}\n class=\"flex h-9 rounded-md w-full bg-white dark:bg-gray-950 px-3 py-2 text-sm placeholder:text-gray-500 dark:placeholder:text-gray-500 transition border box-border border-gray-200 dark:border-gray-800 border-solid ring-0 ring-transparent focus-visible:ring-2 focus-visible:ring-gray-900 dark:focus-visible:ring-gray-300 focus-visible:ring-offset-0 outline-hidden focus-visible:outline-hidden file:border-0 file:bg-transparent file:text-sm file:font-medium disabled:cursor-not-allowed disabled:opacity-50 col-start-2\"\n />\n <div class=\"flex items-center justify-between gap-1\">\n <Button\n tooltip=\"Previous (Shift Enter)\"\n onClick={() => editor().commands.findPrev()}\n >\n <span class=\"i-lucide-arrow-left size-5 block\" />\n </Button>\n <Button tooltip=\"Next (Enter)\" onClick={() => editor().commands.findNext()}>\n <span class=\"i-lucide-arrow-right size-5 block\" />\n </Button>\n <Button tooltip=\"Close\" onClick={() => props.onClose?.()}>\n <span class=\"i-lucide-x size-5 block\" />\n </Button>\n </div>\n {showReplace() && (\n <input\n placeholder=\"Replace\"\n type=\"text\"\n value={replaceText()}\n onInput={(event) => setReplaceText(event.currentTarget.value)}\n onKeyDown={handleReplaceKeyDown}\n class=\"flex h-9 rounded-md w-full bg-white dark:bg-gray-950 px-3 py-2 text-sm placeholder:text-gray-500 dark:placeholder:text-gray-500 transition border box-border border-gray-200 dark:border-gray-800 border-solid ring-0 ring-transparent focus-visible:ring-2 focus-visible:ring-gray-900 dark:focus-visible:ring-gray-300 focus-visible:ring-offset-0 outline-hidden focus-visible:outline-hidden file:border-0 file:bg-transparent file:text-sm file:font-medium disabled:cursor-not-allowed disabled:opacity-50 col-start-2\"\n />\n )}\n {showReplace() && (\n <div class=\"flex items-center justify-between gap-1\">\n <Button tooltip=\"Replace (Enter)\" onClick={() => editor().commands.replaceNext()}>\n Replace\n </Button>\n <Button\n tooltip=\"Replace All (Shift Enter)\"\n onClick={() => editor().commands.replaceAll()}\n >\n All\n </Button>\n </div>\n )}\n </div>\n )\n}\n\nfunction isEnter(event: KeyboardEvent) {\n return (\n event.key === 'Enter'\n && !event.shiftKey\n && !event.metaKey\n && !event.altKey\n && !event.ctrlKey\n && !event.isComposing\n )\n}\n\nfunction isShiftEnter(event: KeyboardEvent) {\n return (\n event.key === 'Enter'\n && event.shiftKey\n && !event.metaKey\n && !event.altKey\n && !event.ctrlKey\n && !event.isComposing\n )\n}\n"
25
+ "content": "import { defineSearchQuery, type SearchCommandsExtension } from 'prosekit/extensions/search'\nimport { useEditor, useExtension } from 'prosekit/solid'\nimport { createMemo, createSignal, type JSX } from 'solid-js'\n\nimport { Button } from '../button'\n\nexport default function Search(props: { onClose?: VoidFunction }): JSX.Element {\n const [showReplace, setShowReplace] = createSignal(false)\n const toggleReplace = () => setShowReplace((value) => !value)\n\n const [searchText, setSearchText] = createSignal('')\n const [replaceText, setReplaceText] = createSignal('')\n\n const extension = createMemo(() => {\n if (!searchText()) {\n return null\n }\n return defineSearchQuery({ search: searchText(), replace: replaceText() })\n })\n\n useExtension(extension)\n\n const editor = useEditor<SearchCommandsExtension>({ update: true })\n\n const handleSearchKeyDown = (event: KeyboardEvent) => {\n if (isEnter(event)) {\n event.preventDefault()\n editor().commands.findNext()\n } else if (isShiftEnter(event)) {\n event.preventDefault()\n editor().commands.findPrev()\n }\n }\n\n const handleReplaceKeyDown = (event: KeyboardEvent) => {\n if (isEnter(event)) {\n event.preventDefault()\n editor().commands.replaceNext()\n } else if (isShiftEnter(event)) {\n event.preventDefault()\n editor().commands.replaceAll()\n }\n }\n\n return (\n <div class=\"z-2 box-border border-gray-200 dark:border-gray-800 border-solid border-l-0 border-r-0 border-t-0 border-b grid grid-cols-[min-content_1fr_min-content] gap-2 p-2\">\n <Button tooltip=\"Toggle Replace\" onClick={toggleReplace}>\n <span\n attr:data-rotate={showReplace() ? '' : undefined}\n class=\"i-lucide-chevron-right size-5 block transition-transform data-rotate:rotate-90\"\n />\n </Button>\n <input\n placeholder=\"Search\"\n type=\"text\"\n value={searchText()}\n onInput={(event) => setSearchText(event.currentTarget.value)}\n onKeyDown={handleSearchKeyDown}\n class=\"flex h-9 rounded-md w-full bg-[canvas] px-3 py-2 text-sm placeholder:text-gray-500 dark:placeholder:text-gray-500 transition border box-border border-gray-200 dark:border-gray-800 border-solid ring-0 ring-transparent focus-visible:ring-2 focus-visible:ring-gray-900 dark:focus-visible:ring-gray-300 focus-visible:ring-offset-0 outline-hidden focus-visible:outline-hidden file:border-0 file:bg-transparent file:text-sm file:font-medium disabled:cursor-not-allowed disabled:opacity-50 col-start-2\"\n />\n <div class=\"flex items-center justify-between gap-1\">\n <Button\n tooltip=\"Previous (Shift Enter)\"\n onClick={() => editor().commands.findPrev()}\n >\n <span class=\"i-lucide-arrow-left size-5 block\" />\n </Button>\n <Button tooltip=\"Next (Enter)\" onClick={() => editor().commands.findNext()}>\n <span class=\"i-lucide-arrow-right size-5 block\" />\n </Button>\n <Button tooltip=\"Close\" onClick={() => props.onClose?.()}>\n <span class=\"i-lucide-x size-5 block\" />\n </Button>\n </div>\n {showReplace() && (\n <input\n placeholder=\"Replace\"\n type=\"text\"\n value={replaceText()}\n onInput={(event) => setReplaceText(event.currentTarget.value)}\n onKeyDown={handleReplaceKeyDown}\n class=\"flex h-9 rounded-md w-full bg-[canvas] px-3 py-2 text-sm placeholder:text-gray-500 dark:placeholder:text-gray-500 transition border box-border border-gray-200 dark:border-gray-800 border-solid ring-0 ring-transparent focus-visible:ring-2 focus-visible:ring-gray-900 dark:focus-visible:ring-gray-300 focus-visible:ring-offset-0 outline-hidden focus-visible:outline-hidden file:border-0 file:bg-transparent file:text-sm file:font-medium disabled:cursor-not-allowed disabled:opacity-50 col-start-2\"\n />\n )}\n {showReplace() && (\n <div class=\"flex items-center justify-between gap-1\">\n <Button tooltip=\"Replace (Enter)\" onClick={() => editor().commands.replaceNext()}>\n Replace\n </Button>\n <Button\n tooltip=\"Replace All (Shift Enter)\"\n onClick={() => editor().commands.replaceAll()}\n >\n All\n </Button>\n </div>\n )}\n </div>\n )\n}\n\nfunction isEnter(event: KeyboardEvent) {\n return (\n event.key === 'Enter'\n && !event.shiftKey\n && !event.metaKey\n && !event.altKey\n && !event.ctrlKey\n && !event.isComposing\n )\n}\n\nfunction isShiftEnter(event: KeyboardEvent) {\n return (\n event.key === 'Enter'\n && event.shiftKey\n && !event.metaKey\n && !event.altKey\n && !event.ctrlKey\n && !event.isComposing\n )\n}\n"
26
26
  }
27
27
  ],
28
28
  "meta": {
@@ -5,7 +5,7 @@
5
5
  "description": "",
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
  {
@@ -18,19 +18,19 @@
18
18
  "path": "registry/src/solid/ui/slash-menu/slash-menu-empty.tsx",
19
19
  "type": "registry:component",
20
20
  "target": "components/editor/ui/slash-menu/slash-menu-empty.tsx",
21
- "content": "import { AutocompleteEmpty } from 'prosekit/solid/autocomplete'\nimport type { JSX } from 'solid-js'\n\nexport default function SlashMenuEmpty(): JSX.Element {\n return (\n <AutocompleteEmpty class=\"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"
21
+ "content": "import { AutocompleteEmpty } from 'prosekit/solid/autocomplete'\nimport type { JSX } from 'solid-js'\n\nexport default function SlashMenuEmpty(): JSX.Element {\n return (\n <AutocompleteEmpty class=\"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"
22
22
  },
23
23
  {
24
24
  "path": "registry/src/solid/ui/slash-menu/slash-menu-item.tsx",
25
25
  "type": "registry:component",
26
26
  "target": "components/editor/ui/slash-menu/slash-menu-item.tsx",
27
- "content": "import { AutocompleteItem } from 'prosekit/solid/autocomplete'\nimport { Show, type JSX } from 'solid-js'\n\nexport default function SlashMenuItem(props: {\n label: string\n kbd?: string\n onSelect: () => void\n}): JSX.Element {\n return (\n <AutocompleteItem onSelect={props.onSelect} class=\"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 <Show when={props.kbd}>\n <kbd class=\"text-xs font-mono text-gray-400 dark:text-gray-500\">{props.kbd}</kbd>\n </Show>\n </AutocompleteItem>\n )\n}\n"
27
+ "content": "import { AutocompleteItem } from 'prosekit/solid/autocomplete'\nimport { Show, type JSX } from 'solid-js'\n\nexport default function SlashMenuItem(props: {\n label: string\n kbd?: string\n onSelect: () => void\n}): JSX.Element {\n return (\n <AutocompleteItem onSelect={props.onSelect} class=\"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 <Show when={props.kbd}>\n <kbd class=\"text-xs font-mono text-gray-400 dark:text-gray-500\">{props.kbd}</kbd>\n </Show>\n </AutocompleteItem>\n )\n}\n"
28
28
  },
29
29
  {
30
30
  "path": "registry/src/solid/ui/slash-menu/slash-menu.tsx",
31
31
  "type": "registry:component",
32
32
  "target": "components/editor/ui/slash-menu/slash-menu.tsx",
33
- "content": "import type { BasicExtension } from 'prosekit/basic'\nimport { canUseRegexLookbehind } from 'prosekit/core'\nimport { useEditor } from 'prosekit/solid'\nimport { AutocompletePopup, AutocompletePositioner, AutocompleteRoot } from 'prosekit/solid/autocomplete'\nimport type { JSX } from 'solid-js'\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\nexport default function SlashMenu(): JSX.Element {\n const editor = useEditor<BasicExtension>()\n\n return (\n <AutocompleteRoot regex={regex}>\n <AutocompletePositioner class=\"block overflow-visible w-min h-min z-50 ease-out transition-transform duration-100 motion-reduce:transition-none\">\n <AutocompletePopup class=\"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 <SlashMenuEmpty />\n </AutocompletePopup>\n </AutocompletePositioner>\n </AutocompleteRoot>\n )\n}\n"
33
+ "content": "import type { BasicExtension } from 'prosekit/basic'\nimport { canUseRegexLookbehind } from 'prosekit/core'\nimport { useEditor } from 'prosekit/solid'\nimport { AutocompletePopup, AutocompletePositioner, AutocompleteRoot } from 'prosekit/solid/autocomplete'\nimport type { JSX } from 'solid-js'\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\nexport default function SlashMenu(): JSX.Element {\n const editor = useEditor<BasicExtension>()\n\n return (\n <AutocompleteRoot regex={regex}>\n <AutocompletePositioner class=\"block overflow-visible w-min h-min z-50 ease-out transition-transform duration-100 motion-reduce:transition-none\">\n <AutocompletePopup class=\"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 class=\"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 <SlashMenuEmpty />\n </div>\n </AutocompletePopup>\n </AutocompletePositioner>\n </AutocompleteRoot>\n )\n}\n"
34
34
  }
35
35
  ],
36
36
  "meta": {