@byline/richtext-lexical 1.11.2 → 1.12.1

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 (256) hide show
  1. package/dist/field/apply-value-plugin.js +1 -3
  2. package/dist/field/config/default-extensions.d.ts +32 -0
  3. package/dist/field/config/default-extensions.js +49 -0
  4. package/dist/field/config/default.d.ts +8 -0
  5. package/dist/field/config/default.js +0 -28
  6. package/dist/field/config/editor-config-context.js +2 -6
  7. package/dist/field/config/extensions-list.d.ts +44 -0
  8. package/dist/field/config/extensions-list.js +55 -0
  9. package/dist/field/config/types.d.ts +28 -1
  10. package/dist/field/editor-context.d.ts +1 -1
  11. package/dist/field/editor-context.js +39 -35
  12. package/dist/field/editor.js +11 -57
  13. package/dist/field/{plugins/admonition-plugin/index.d.ts → extensions/admonition/admonition-extension.d.ts} +2 -1
  14. package/dist/field/{plugins/admonition-plugin/index.js → extensions/admonition/admonition-extension.js} +51 -4
  15. package/dist/field/{nodes/admonition-node → extensions/admonition}/admonition-node-component.d.ts +1 -1
  16. package/dist/field/{nodes/admonition-node → extensions/admonition}/admonition-node-component.js +1 -1
  17. package/dist/field/{nodes/admonition-node → extensions/admonition}/admonition-node.d.ts +1 -1
  18. package/dist/field/{plugins/admonition-plugin → extensions/admonition}/fields.d.ts +1 -1
  19. package/dist/field/{nodes/admonition-node → extensions/admonition}/index.js +1 -1
  20. package/dist/field/{plugins/admonition-plugin → extensions/admonition}/types.d.ts +1 -1
  21. package/dist/field/{plugins/auto-embed-plugin/index.d.ts → extensions/auto-embed/auto-embed-extension.d.ts} +1 -0
  22. package/dist/field/{plugins/auto-embed-plugin/index.js → extensions/auto-embed/auto-embed-extension.js} +47 -4
  23. package/dist/field/{plugins/auto-embed-plugin → extensions/auto-embed}/auto-embed-modal.d.ts +1 -1
  24. package/dist/field/extensions/byline-floating-ui/byline-floating-ui-extension.d.ts +68 -0
  25. package/dist/field/extensions/byline-floating-ui/byline-floating-ui-extension.js +19 -0
  26. package/dist/field/{nodes/admonition-node → extensions/byline-floating-ui}/index.d.ts +1 -2
  27. package/dist/field/extensions/byline-floating-ui/index.js +1 -0
  28. package/dist/field/extensions/byline-toolbar/byline-toolbar-extension.d.ts +69 -0
  29. package/dist/field/extensions/byline-toolbar/byline-toolbar-extension.js +19 -0
  30. package/dist/field/{nodes/inline-image-node → extensions/byline-toolbar}/index.d.ts +1 -2
  31. package/dist/field/extensions/byline-toolbar/index.js +1 -0
  32. package/dist/field/extensions/code-highlight/code-highlight-extension.d.ts +10 -0
  33. package/dist/field/extensions/code-highlight/code-highlight-extension.js +11 -0
  34. package/dist/field/extensions/floating-text-format/floating-text-format-extension.d.ts +18 -0
  35. package/dist/field/extensions/floating-text-format/floating-text-format-extension.js +17 -0
  36. package/dist/field/{plugins/floating-text-format-toolbar-plugin → extensions/floating-text-format}/index.js +1 -1
  37. package/dist/field/extensions/horizontal-rule/horizontal-rule-extension.d.ts +6 -0
  38. package/dist/field/extensions/horizontal-rule/horizontal-rule-extension.js +45 -0
  39. package/dist/field/{nodes/inline-image-node → extensions/inline-image}/index.js +1 -1
  40. package/dist/field/{plugins/inline-image-plugin/index.d.ts → extensions/inline-image/inline-image-extension.d.ts} +6 -3
  41. package/dist/field/{plugins/inline-image-plugin/index.js → extensions/inline-image/inline-image-extension.js} +57 -5
  42. package/dist/field/{nodes/inline-image-node → extensions/inline-image}/inline-image-node-component.d.ts +2 -2
  43. package/dist/field/{nodes/inline-image-node → extensions/inline-image}/inline-image-node-component.js +4 -4
  44. package/dist/field/{nodes/inline-image-node → extensions/inline-image}/inline-image-node.d.ts +2 -2
  45. package/dist/field/{nodes/inline-image-node/types.d.ts → extensions/inline-image/node-types.d.ts} +1 -1
  46. package/dist/field/{plugins/inline-image-plugin → extensions/inline-image}/types.d.ts +1 -1
  47. package/dist/field/{plugins/inline-image-plugin → extensions/inline-image}/utils.d.ts +1 -1
  48. package/dist/field/{plugins/layout-plugin/layout-plugin.d.ts → extensions/layout/layout-extension.d.ts} +1 -0
  49. package/dist/field/{plugins/layout-plugin/layout-plugin.js → extensions/layout/layout-extension.js} +53 -5
  50. package/dist/field/extensions/link/auto-link-extension.d.ts +12 -0
  51. package/dist/field/{plugins/link-plugin/auto-link/index.js → extensions/link/auto-link-extension.js} +14 -2
  52. package/dist/field/{plugins/link-plugin/auto-link → extensions/link}/auto-link-plugin.d.ts +1 -1
  53. package/dist/field/{plugins/link-plugin/auto-link → extensions/link}/auto-link-plugin.js +2 -2
  54. package/dist/field/{plugins/link-plugin → extensions}/link/floating-link-editor.css +2 -2
  55. package/dist/field/{plugins/link-plugin → extensions}/link/floating-link-editor.js +4 -4
  56. package/dist/field/extensions/link/index.d.ts +5 -0
  57. package/dist/field/extensions/link/index.js +5 -0
  58. package/dist/field/extensions/link/link-extension.d.ts +14 -0
  59. package/dist/field/extensions/link/link-extension.js +66 -0
  60. package/dist/field/{plugins/link-plugin/link/types.d.ts → extensions/link/link-modal-types.d.ts} +1 -1
  61. package/dist/field/{plugins/link-plugin → extensions}/link/link-modal.d.ts +1 -1
  62. package/dist/field/{plugins/link-plugin → extensions}/link/link-modal.js +3 -3
  63. package/dist/field/{nodes/link-nodes → extensions/link}/types.d.ts +1 -1
  64. package/dist/field/extensions/table/table-action-menu-plugin/index.d.ts +4 -0
  65. package/dist/field/{plugins → extensions/table}/table-action-menu-plugin/index.js +8 -6
  66. package/dist/field/extensions/table/table-extension.d.ts +17 -0
  67. package/dist/field/extensions/table/table-extension.js +58 -0
  68. package/dist/field/extensions/vimeo/vimeo-extension.d.ts +12 -0
  69. package/dist/field/extensions/vimeo/vimeo-extension.js +16 -0
  70. package/dist/field/extensions/youtube/youtube-extension.d.ts +12 -0
  71. package/dist/field/extensions/youtube/youtube-extension.js +16 -0
  72. package/dist/field/nodes/index.js +7 -7
  73. package/dist/field/plugins/table-plugin/index.js +5 -6
  74. package/dist/field/plugins/toolbar-plugin/index.js +40 -114
  75. package/dist/field/plugins/toolbar-plugin/toolbar-active-editor.d.ts +25 -0
  76. package/dist/field/plugins/toolbar-plugin/toolbar-active-editor.js +17 -0
  77. package/dist/field/themes/lexical-editor-theme.css +13 -3
  78. package/dist/field/themes/lexical-editor-theme.js +1 -0
  79. package/dist/index.d.ts +17 -1
  80. package/dist/index.js +16 -0
  81. package/dist/lexical-editor.d.ts +25 -13
  82. package/dist/lexical-editor.js +9 -1
  83. package/dist/richtext-field.js +6 -1
  84. package/dist/server.d.ts +2 -2
  85. package/dist/server.js +2 -2
  86. package/package.json +7 -10
  87. package/src/field/apply-value-plugin.tsx +6 -6
  88. package/src/field/config/default-extensions.ts +104 -0
  89. package/src/field/config/default.ts +8 -28
  90. package/src/field/config/editor-config-context.tsx +1 -7
  91. package/src/field/config/extensions-list.ts +107 -0
  92. package/src/field/config/types.ts +28 -28
  93. package/src/field/editor-context.tsx +77 -41
  94. package/src/field/editor.tsx +24 -72
  95. package/src/field/extensions/README.md +31 -0
  96. package/src/field/{plugins/admonition-plugin/index.tsx → extensions/admonition/admonition-extension.tsx} +45 -2
  97. package/src/field/{plugins/admonition-plugin → extensions/admonition}/admonition-modal.tsx +1 -1
  98. package/src/field/{nodes/admonition-node → extensions/admonition}/admonition-node-component.tsx +5 -5
  99. package/src/field/{nodes/admonition-node → extensions/admonition}/admonition-node.tsx +1 -1
  100. package/src/field/{plugins/admonition-plugin → extensions/admonition}/fields.ts +1 -1
  101. package/src/field/{nodes/admonition-node → extensions/admonition}/index.ts +5 -1
  102. package/src/field/{plugins/admonition-plugin → extensions/admonition}/types.ts +1 -1
  103. package/src/field/{plugins/auto-embed-plugin/index.tsx → extensions/auto-embed/auto-embed-extension.tsx} +46 -3
  104. package/src/field/{plugins/auto-embed-plugin → extensions/auto-embed}/auto-embed-modal.tsx +1 -1
  105. package/src/field/extensions/byline-floating-ui/byline-floating-ui-extension.ts +90 -0
  106. package/src/field/extensions/byline-floating-ui/index.ts +15 -0
  107. package/src/field/extensions/byline-toolbar/byline-toolbar-extension.ts +95 -0
  108. package/src/field/extensions/byline-toolbar/index.ts +15 -0
  109. package/src/field/extensions/code-highlight/code-highlight-extension.ts +18 -0
  110. package/src/field/extensions/floating-text-format/floating-text-format-extension.ts +39 -0
  111. package/src/field/{plugins/floating-text-format-toolbar-plugin → extensions/floating-text-format}/index.tsx +1 -1
  112. package/src/field/extensions/horizontal-rule/horizontal-rule-extension.tsx +57 -0
  113. package/src/field/{nodes/inline-image-node → extensions/inline-image}/index.ts +1 -1
  114. package/src/field/{plugins/inline-image-plugin/index.tsx → extensions/inline-image/inline-image-extension.tsx} +54 -6
  115. package/src/field/{plugins/inline-image-plugin → extensions/inline-image}/inline-image-modal.tsx +1 -1
  116. package/src/field/{nodes/inline-image-node → extensions/inline-image}/inline-image-node-component.tsx +6 -6
  117. package/src/field/{nodes/inline-image-node → extensions/inline-image}/inline-image-node.tsx +2 -2
  118. package/src/field/{nodes/inline-image-node/types.ts → extensions/inline-image/node-types.ts} +1 -1
  119. package/src/field/{plugins/inline-image-plugin → extensions/inline-image}/types.ts +1 -1
  120. package/src/field/{plugins/inline-image-plugin → extensions/inline-image}/utils.ts +1 -1
  121. package/src/field/{plugins/layout-plugin/layout-plugin.tsx → extensions/layout/layout-extension.tsx} +47 -8
  122. package/src/field/{plugins/link-plugin/auto-link/index.tsx → extensions/link/auto-link-extension.tsx} +13 -3
  123. package/src/field/{plugins/link-plugin/auto-link → extensions/link}/auto-link-plugin.tsx +2 -2
  124. package/src/field/{plugins/link-plugin → extensions}/link/floating-link-editor.css +2 -2
  125. package/src/field/{plugins/link-plugin → extensions}/link/floating-link-editor.tsx +5 -5
  126. package/src/field/extensions/link/index.ts +5 -0
  127. package/src/field/extensions/link/link-extension.tsx +131 -0
  128. package/src/field/{plugins/link-plugin/link/types.ts → extensions/link/link-modal-types.ts} +1 -1
  129. package/src/field/{plugins/link-plugin → extensions}/link/link-modal.tsx +6 -6
  130. package/src/field/{nodes/link-nodes → extensions/link}/types.ts +1 -1
  131. package/src/field/{plugins → extensions/table}/table-action-menu-plugin/index.tsx +12 -8
  132. package/src/field/extensions/table/table-extension.tsx +86 -0
  133. package/src/field/extensions/vimeo/vimeo-extension.ts +36 -0
  134. package/src/field/extensions/youtube/youtube-extension.ts +37 -0
  135. package/src/field/nodes/index.ts +7 -7
  136. package/src/field/plugins/table-plugin/index.tsx +10 -10
  137. package/src/field/plugins/toolbar-plugin/index.tsx +59 -122
  138. package/src/field/plugins/toolbar-plugin/toolbar-active-editor.tsx +48 -0
  139. package/src/field/themes/lexical-editor-theme.css +18 -3
  140. package/src/field/themes/lexical-editor-theme.tsx +1 -0
  141. package/src/index.ts +45 -2
  142. package/src/lexical-editor.tsx +35 -14
  143. package/src/richtext-field.tsx +8 -1
  144. package/src/server.ts +4 -4
  145. package/dist/field/nodes/link-nodes/index.d.ts +0 -3
  146. package/dist/field/nodes/link-nodes/index.js +0 -3
  147. package/dist/field/plugins/code-highlight-plugin/index.d.ts +0 -9
  148. package/dist/field/plugins/code-highlight-plugin/index.js +0 -11
  149. package/dist/field/plugins/link-plugin/auto-link/index.d.ts +0 -9
  150. package/dist/field/plugins/link-plugin/link/index.d.ts +0 -1
  151. package/dist/field/plugins/link-plugin/link/index.js +0 -43
  152. package/dist/field/plugins/table-action-menu-plugin/index.d.ts +0 -5
  153. package/dist/field/plugins/vimeo-plugin/index.d.ts +0 -3
  154. package/dist/field/plugins/vimeo-plugin/index.js +0 -24
  155. package/dist/field/plugins/youtube-plugin/index.d.ts +0 -3
  156. package/dist/field/plugins/youtube-plugin/index.js +0 -24
  157. package/dist/field/toolbar-extensions.d.ts +0 -31
  158. package/dist/field/toolbar-extensions.js +0 -56
  159. package/src/field/nodes/link-nodes/index.ts +0 -3
  160. package/src/field/plugins/code-highlight-plugin/index.ts +0 -23
  161. package/src/field/plugins/link-plugin/link/index.tsx +0 -99
  162. package/src/field/plugins/vimeo-plugin/index.ts +0 -42
  163. package/src/field/plugins/youtube-plugin/index.ts +0 -43
  164. package/src/field/themes/lexical-editor-theme.js +0 -104
  165. package/src/field/toolbar-extensions.tsx +0 -93
  166. /package/dist/field/{plugins/admonition-plugin → extensions/admonition}/admonition-modal.css +0 -0
  167. /package/dist/field/{plugins/admonition-plugin → extensions/admonition}/admonition-modal.d.ts +0 -0
  168. /package/dist/field/{plugins/admonition-plugin → extensions/admonition}/admonition-modal.js +0 -0
  169. /package/dist/field/{nodes/admonition-node → extensions/admonition}/admonition-node-component.css +0 -0
  170. /package/dist/field/{nodes/admonition-node → extensions/admonition}/admonition-node.js +0 -0
  171. /package/dist/field/{plugins/admonition-plugin → extensions/admonition}/fields.js +0 -0
  172. /package/dist/field/{nodes/admonition-node → extensions/admonition}/icons/danger-icon.css +0 -0
  173. /package/dist/field/{nodes/admonition-node → extensions/admonition}/icons/danger-icon.d.ts +0 -0
  174. /package/dist/field/{nodes/admonition-node → extensions/admonition}/icons/danger-icon.js +0 -0
  175. /package/dist/field/{nodes/admonition-node → extensions/admonition}/icons/index.d.ts +0 -0
  176. /package/dist/field/{nodes/admonition-node → extensions/admonition}/icons/index.js +0 -0
  177. /package/dist/field/{nodes/admonition-node → extensions/admonition}/icons/note-icon.css +0 -0
  178. /package/dist/field/{nodes/admonition-node → extensions/admonition}/icons/note-icon.d.ts +0 -0
  179. /package/dist/field/{nodes/admonition-node → extensions/admonition}/icons/note-icon.js +0 -0
  180. /package/dist/field/{nodes/admonition-node → extensions/admonition}/icons/tip-icon.css +0 -0
  181. /package/dist/field/{nodes/admonition-node → extensions/admonition}/icons/tip-icon.d.ts +0 -0
  182. /package/dist/field/{nodes/admonition-node → extensions/admonition}/icons/tip-icon.js +0 -0
  183. /package/dist/field/{nodes/admonition-node → extensions/admonition}/icons/warning-icon.css +0 -0
  184. /package/dist/field/{nodes/admonition-node → extensions/admonition}/icons/warning-icon.d.ts +0 -0
  185. /package/dist/field/{nodes/admonition-node → extensions/admonition}/icons/warning-icon.js +0 -0
  186. /package/dist/field/{nodes/admonition-node/types.d.ts → extensions/admonition/node-types.d.ts} +0 -0
  187. /package/dist/field/{nodes/admonition-node/types.js → extensions/admonition/node-types.js} +0 -0
  188. /package/dist/field/{nodes/inline-image-node → extensions/admonition}/types.js +0 -0
  189. /package/dist/field/{plugins/auto-embed-plugin → extensions/auto-embed}/auto-embed-modal.css +0 -0
  190. /package/dist/field/{plugins/auto-embed-plugin → extensions/auto-embed}/auto-embed-modal.js +0 -0
  191. /package/dist/field/{plugins/floating-text-format-toolbar-plugin → extensions/floating-text-format}/index.css +0 -0
  192. /package/dist/field/{plugins/floating-text-format-toolbar-plugin → extensions/floating-text-format}/index.d.ts +0 -0
  193. /package/dist/field/{plugins/inline-image-plugin → extensions/inline-image}/fields.d.ts +0 -0
  194. /package/dist/field/{plugins/inline-image-plugin → extensions/inline-image}/fields.js +0 -0
  195. /package/dist/field/{plugins/inline-image-plugin → extensions/inline-image}/inline-image-modal.css +0 -0
  196. /package/dist/field/{plugins/inline-image-plugin → extensions/inline-image}/inline-image-modal.d.ts +0 -0
  197. /package/dist/field/{plugins/inline-image-plugin → extensions/inline-image}/inline-image-modal.js +0 -0
  198. /package/dist/field/{nodes/inline-image-node → extensions/inline-image}/inline-image-node-component.css +0 -0
  199. /package/dist/field/{nodes/inline-image-node → extensions/inline-image}/inline-image-node.js +0 -0
  200. /package/dist/field/{nodes/link-nodes/types.js → extensions/inline-image/node-types.js} +0 -0
  201. /package/dist/field/{plugins/inline-image-plugin → extensions/inline-image}/populate.d.ts +0 -0
  202. /package/dist/field/{plugins/inline-image-plugin → extensions/inline-image}/populate.js +0 -0
  203. /package/dist/field/{plugins/admonition-plugin → extensions/inline-image}/types.js +0 -0
  204. /package/dist/field/{plugins/inline-image-plugin → extensions/inline-image}/utils.js +0 -0
  205. /package/dist/field/{plugins/layout-plugin → extensions/layout}/insert-layout-modal.css +0 -0
  206. /package/dist/field/{plugins/layout-plugin → extensions/layout}/insert-layout-modal.d.ts +0 -0
  207. /package/dist/field/{plugins/layout-plugin → extensions/layout}/insert-layout-modal.js +0 -0
  208. /package/dist/field/{nodes/layout-container-node → extensions/layout}/layout-container-node.d.ts +0 -0
  209. /package/dist/field/{nodes/layout-container-node → extensions/layout}/layout-container-node.js +0 -0
  210. /package/dist/field/{nodes/layout-container-node → extensions/layout}/layout-item-node.d.ts +0 -0
  211. /package/dist/field/{nodes/layout-container-node → extensions/layout}/layout-item-node.js +0 -0
  212. /package/dist/field/{nodes/link-nodes → extensions/link}/auto-link-node.d.ts +0 -0
  213. /package/dist/field/{nodes/link-nodes → extensions/link}/auto-link-node.js +0 -0
  214. /package/dist/field/{plugins/link-plugin → extensions}/link/floating-link-editor.d.ts +0 -0
  215. /package/dist/field/{plugins/inline-image-plugin/types.js → extensions/link/link-modal-types.js} +0 -0
  216. /package/dist/field/{nodes/link-nodes → extensions/link}/link-node.d.ts +0 -0
  217. /package/dist/field/{nodes/link-nodes → extensions/link}/link-node.js +0 -0
  218. /package/dist/field/{plugins/link-plugin → extensions/link}/populate.d.ts +0 -0
  219. /package/dist/field/{plugins/link-plugin → extensions/link}/populate.js +0 -0
  220. /package/dist/field/{plugins/link-plugin → extensions}/link/types.js +0 -0
  221. /package/dist/field/{nodes/vimeo-node/index.d.ts → extensions/vimeo/vimeo-node.d.ts} +0 -0
  222. /package/dist/field/{nodes/vimeo-node/index.js → extensions/vimeo/vimeo-node.js} +0 -0
  223. /package/dist/field/{nodes/youtube-node/index.d.ts → extensions/youtube/youtube-node.d.ts} +0 -0
  224. /package/dist/field/{nodes/youtube-node/index.js → extensions/youtube/youtube-node.js} +0 -0
  225. /package/src/field/{plugins/admonition-plugin → extensions/admonition}/admonition-modal.css +0 -0
  226. /package/src/field/{nodes/admonition-node → extensions/admonition}/admonition-node-component.css +0 -0
  227. /package/src/field/{nodes/admonition-node → extensions/admonition}/icons/danger-icon.css +0 -0
  228. /package/src/field/{nodes/admonition-node → extensions/admonition}/icons/danger-icon.js +0 -0
  229. /package/src/field/{nodes/admonition-node → extensions/admonition}/icons/danger-icon.tsx +0 -0
  230. /package/src/field/{nodes/admonition-node → extensions/admonition}/icons/index.js +0 -0
  231. /package/src/field/{nodes/admonition-node → extensions/admonition}/icons/index.ts +0 -0
  232. /package/src/field/{nodes/admonition-node → extensions/admonition}/icons/note-icon.css +0 -0
  233. /package/src/field/{nodes/admonition-node → extensions/admonition}/icons/note-icon.js +0 -0
  234. /package/src/field/{nodes/admonition-node → extensions/admonition}/icons/note-icon.tsx +0 -0
  235. /package/src/field/{nodes/admonition-node → extensions/admonition}/icons/tip-icon.css +0 -0
  236. /package/src/field/{nodes/admonition-node → extensions/admonition}/icons/tip-icon.js +0 -0
  237. /package/src/field/{nodes/admonition-node → extensions/admonition}/icons/tip-icon.tsx +0 -0
  238. /package/src/field/{nodes/admonition-node → extensions/admonition}/icons/warning-icon.css +0 -0
  239. /package/src/field/{nodes/admonition-node → extensions/admonition}/icons/warning-icon.js +0 -0
  240. /package/src/field/{nodes/admonition-node → extensions/admonition}/icons/warning-icon.tsx +0 -0
  241. /package/src/field/{nodes/admonition-node/types.ts → extensions/admonition/node-types.ts} +0 -0
  242. /package/src/field/{plugins/auto-embed-plugin → extensions/auto-embed}/auto-embed-modal.css +0 -0
  243. /package/src/field/{plugins/floating-text-format-toolbar-plugin → extensions/floating-text-format}/index.css +0 -0
  244. /package/src/field/{plugins/inline-image-plugin → extensions/inline-image}/fields.ts +0 -0
  245. /package/src/field/{plugins/inline-image-plugin → extensions/inline-image}/inline-image-modal.css +0 -0
  246. /package/src/field/{nodes/inline-image-node → extensions/inline-image}/inline-image-node-component.css +0 -0
  247. /package/src/field/{plugins/inline-image-plugin → extensions/inline-image}/populate.ts +0 -0
  248. /package/src/field/{plugins/layout-plugin → extensions/layout}/insert-layout-modal.css +0 -0
  249. /package/src/field/{plugins/layout-plugin → extensions/layout}/insert-layout-modal.tsx +0 -0
  250. /package/src/field/{nodes/layout-container-node → extensions/layout}/layout-container-node.ts +0 -0
  251. /package/src/field/{nodes/layout-container-node → extensions/layout}/layout-item-node.ts +0 -0
  252. /package/src/field/{nodes/link-nodes → extensions/link}/auto-link-node.ts +0 -0
  253. /package/src/field/{nodes/link-nodes → extensions/link}/link-node.ts +0 -0
  254. /package/src/field/{plugins/link-plugin → extensions/link}/populate.ts +0 -0
  255. /package/src/field/{nodes/vimeo-node/index.tsx → extensions/vimeo/vimeo-node.tsx} +0 -0
  256. /package/src/field/{nodes/youtube-node/index.tsx → extensions/youtube/youtube-node.tsx} +0 -0
@@ -1,29 +1,24 @@
1
1
  "use client";
2
2
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
3
- import { Fragment as external_react_Fragment, useCallback, useEffect, useState } from "react";
4
- import { $createCodeNode, $isCodeNode, CODE_LANGUAGE_FRIENDLY_NAME_MAP, CODE_LANGUAGE_MAP, getLanguageFriendlyName } from "@lexical/code";
5
- import { $isListNode, INSERT_CHECK_LIST_COMMAND, INSERT_ORDERED_LIST_COMMAND, INSERT_UNORDERED_LIST_COMMAND, ListNode, REMOVE_LIST_COMMAND } from "@lexical/list";
6
- import { INSERT_EMBED_COMMAND } from "@lexical/react/LexicalAutoEmbedPlugin";
3
+ import { Fragment as external_react_Fragment, useCallback, useEffect, useMemo, useState } from "react";
4
+ import { $createCodeNode, $isCodeNode, CODE_LANGUAGE_FRIENDLY_NAME_MAP, CODE_LANGUAGE_MAP, CodeNode, getLanguageFriendlyName } from "@lexical/code";
5
+ import { $isListNode, CheckListExtension, INSERT_CHECK_LIST_COMMAND, INSERT_ORDERED_LIST_COMMAND, INSERT_UNORDERED_LIST_COMMAND, ListExtension, ListNode, REMOVE_LIST_COMMAND } from "@lexical/list";
7
6
  import { useLexicalComposerContext } from "@lexical/react/LexicalComposerContext";
8
7
  import { $isDecoratorBlockNode } from "@lexical/react/LexicalDecoratorBlockNode";
9
- import { INSERT_HORIZONTAL_RULE_COMMAND } from "@lexical/react/LexicalHorizontalRuleNode";
8
+ import { useExtensionDependency, useOptionalExtensionDependency } from "@lexical/react/useExtensionComponent";
10
9
  import { $createHeadingNode, $createQuoteNode, $isHeadingNode, $isQuoteNode } from "@lexical/rich-text";
11
10
  import { $setBlocksType } from "@lexical/selection";
12
11
  import { $isTableNode } from "@lexical/table";
13
12
  import { $findMatchingParent, $getNearestBlockElementAncestorOrThrow, $getNearestNodeOfType, mergeRegister } from "@lexical/utils";
14
13
  import { $createParagraphNode, $getNodeByKey, $getSelection, $isRangeSelection, $isRootOrShadowRoot, $isTextNode, CAN_REDO_COMMAND, CAN_UNDO_COMMAND, COMMAND_PRIORITY_CRITICAL, COMMAND_PRIORITY_NORMAL, FORMAT_ELEMENT_COMMAND, FORMAT_TEXT_COMMAND, INDENT_CONTENT_COMMAND, KEY_MODIFIER_COMMAND, OUTDENT_CONTENT_COMMAND, REDO_COMMAND, SELECTION_CHANGE_COMMAND, UNDO_COMMAND } from "lexical";
15
14
  import { useEditorConfig } from "../../config/editor-config-context.js";
16
- import { $isLinkNode, OPEN_LINK_MODAL_COMMAND, TOGGLE_LINK_COMMAND } from "../../nodes/link-nodes/index.js";
15
+ import { BylineToolbarExtension, selectToolbarItems } from "../../extensions/byline-toolbar/byline-toolbar-extension.js";
16
+ import { $isLinkNode, LinkExtension, OPEN_LINK_MODAL_COMMAND, TOGGLE_LINK_COMMAND } from "../../extensions/link/index.js";
17
17
  import { IS_APPLE } from "../../shared/environment.js";
18
- import { useToolbarExtensions } from "../../toolbar-extensions.js";
19
18
  import { DropDown, DropDownItem } from "../../ui/dropdown.js";
20
19
  import { getSelectedNode } from "../../utils/getSelectedNode.js";
21
20
  import { sanitizeUrl } from "../../utils/url.js";
22
- import { OPEN_ADMONITION_MODAL_COMMAND } from "../admonition-plugin/index.js";
23
- import { EmbedConfigs } from "../auto-embed-plugin/index.js";
24
- import { OPEN_INLINE_IMAGE_MODAL_COMMAND } from "../inline-image-plugin/index.js";
25
- import { OPEN_INSERT_LAYOUT_MODAL_COMMAND } from "../layout-plugin/layout-plugin.js";
26
- import { OPEN_TABLE_MODAL_COMMAND } from "../table-plugin/index.js";
21
+ import { ToolbarActiveEditorProvider } from "./toolbar-active-editor.js";
27
22
  const blockTypeToBlockName = {
28
23
  bullet: 'Bulleted List',
29
24
  check: 'Check List',
@@ -52,7 +47,12 @@ function dropDownActiveClass(active) {
52
47
  return '';
53
48
  }
54
49
  function BlockFormatDropDown({ editor, blockType, rootType, disabled = false }) {
55
- const { config: { options: { checkListPlugin, listPlugin, codeHighlightPlugin } } } = useEditorConfig();
50
+ const hasList = void 0 !== useOptionalExtensionDependency(ListExtension);
51
+ const hasCheckList = void 0 !== useOptionalExtensionDependency(CheckListExtension);
52
+ const [composerEditor] = useLexicalComposerContext();
53
+ const hasCodeHighlight = composerEditor.hasNodes([
54
+ CodeNode
55
+ ]);
56
56
  const formatParagraph = ()=>{
57
57
  editor.update(()=>{
58
58
  const selection = $getSelection();
@@ -178,7 +178,7 @@ function BlockFormatDropDown({ editor, blockType, rootType, disabled = false })
178
178
  })
179
179
  ]
180
180
  }),
181
- listPlugin && /*#__PURE__*/ jsxs(Fragment, {
181
+ hasList && /*#__PURE__*/ jsxs(Fragment, {
182
182
  children: [
183
183
  /*#__PURE__*/ jsxs(DropDownItem, {
184
184
  className: `item ${dropDownActiveClass('bullet' === blockType)}`,
@@ -208,7 +208,7 @@ function BlockFormatDropDown({ editor, blockType, rootType, disabled = false })
208
208
  })
209
209
  ]
210
210
  }),
211
- checkListPlugin && /*#__PURE__*/ jsxs(DropDownItem, {
211
+ hasCheckList && /*#__PURE__*/ jsxs(DropDownItem, {
212
212
  className: `item ${dropDownActiveClass('check' === blockType)}`,
213
213
  onClick: formatCheckList,
214
214
  children: [
@@ -234,7 +234,7 @@ function BlockFormatDropDown({ editor, blockType, rootType, disabled = false })
234
234
  })
235
235
  ]
236
236
  }),
237
- codeHighlightPlugin && /*#__PURE__*/ jsxs(DropDownItem, {
237
+ hasCodeHighlight && /*#__PURE__*/ jsxs(DropDownItem, {
238
238
  className: `item ${dropDownActiveClass('code' === blockType)}`,
239
239
  onClick: formatCode,
240
240
  children: [
@@ -275,8 +275,15 @@ function ToolbarPlugin() {
275
275
  const [isRTL, _setIsRTL] = useState(false);
276
276
  const [codeLanguage, setCodeLanguage] = useState('');
277
277
  const [isEditable, setIsEditable] = useState(()=>editor.isEditable());
278
- const { items: toolbarExtensionItems } = useToolbarExtensions();
279
- const { uuid, config: { options: { textAlignment, tablePlugin, inlineImagePlugin, admonitionPlugin, horizontalRulePlugin, layoutPlugin, autoEmbedPlugin, undoRedo, textStyle, inlineCode, links } } } = useEditorConfig();
278
+ const { config: toolbarConfig } = useExtensionDependency(BylineToolbarExtension);
279
+ const insertMenuItems = useMemo(()=>selectToolbarItems(toolbarConfig.items, 'insert-menu'), [
280
+ toolbarConfig.items
281
+ ]);
282
+ const trailingToolbarItems = useMemo(()=>selectToolbarItems(toolbarConfig.items, 'toolbar'), [
283
+ toolbarConfig.items
284
+ ]);
285
+ const hasLinkExtension = void 0 !== useOptionalExtensionDependency(LinkExtension);
286
+ const { uuid, config: { options: { textAlignment, undoRedo, textStyle, inlineCode } } } = useEditorConfig();
280
287
  const $updateToolbar = useCallback(()=>{
281
288
  const selection = $getSelection();
282
289
  if ($isRangeSelection(selection)) {
@@ -638,7 +645,7 @@ function ToolbarPlugin() {
638
645
  className: "format code"
639
646
  })
640
647
  }),
641
- links && /*#__PURE__*/ jsx("button", {
648
+ hasLinkExtension && /*#__PURE__*/ jsx("button", {
642
649
  type: "button",
643
650
  disabled: !isEditable,
644
651
  onClick: insertLink,
@@ -724,113 +731,32 @@ function ToolbarPlugin() {
724
731
  })
725
732
  ]
726
733
  }),
727
- activeEditor === editor && (horizontalRulePlugin || inlineImagePlugin || tablePlugin || admonitionPlugin) && /*#__PURE__*/ jsxs(Fragment, {
734
+ activeEditor === editor && insertMenuItems.length > 0 && /*#__PURE__*/ jsxs(Fragment, {
728
735
  children: [
729
736
  /*#__PURE__*/ jsx(Divider, {}),
730
- /*#__PURE__*/ jsxs(DropDown, {
737
+ /*#__PURE__*/ jsx(DropDown, {
731
738
  disabled: !isEditable,
732
739
  buttonClassName: "toolbar-item spaced",
733
740
  buttonLabel: "Insert",
734
741
  buttonAriaLabel: "Insert specialized editor node",
735
742
  buttonIconClassName: "icon plus",
736
- children: [
737
- horizontalRulePlugin && /*#__PURE__*/ jsxs(DropDownItem, {
738
- onClick: ()=>{
739
- activeEditor.dispatchCommand(INSERT_HORIZONTAL_RULE_COMMAND, void 0);
740
- },
741
- className: "item",
742
- children: [
743
- /*#__PURE__*/ jsx("i", {
744
- className: "icon horizontal-rule"
745
- }),
746
- /*#__PURE__*/ jsx("span", {
747
- className: "text",
748
- children: "Horizontal Rule"
749
- })
750
- ]
751
- }),
752
- layoutPlugin && /*#__PURE__*/ jsxs(DropDownItem, {
753
- onClick: ()=>{
754
- activeEditor.dispatchCommand(OPEN_INSERT_LAYOUT_MODAL_COMMAND, null);
755
- },
756
- className: "item",
757
- children: [
758
- /*#__PURE__*/ jsx("i", {
759
- className: "icon columns"
760
- }),
761
- /*#__PURE__*/ jsx("span", {
762
- className: "text",
763
- children: "Columns Layout"
764
- })
765
- ]
766
- }),
767
- admonitionPlugin && /*#__PURE__*/ jsxs(DropDownItem, {
768
- onClick: ()=>{
769
- activeEditor.dispatchCommand(OPEN_ADMONITION_MODAL_COMMAND, null);
770
- },
771
- className: "item",
772
- children: [
773
- /*#__PURE__*/ jsx("i", {
774
- className: "icon admonition"
775
- }),
776
- /*#__PURE__*/ jsx("span", {
777
- className: "text",
778
- children: "Admonition"
779
- })
780
- ]
781
- }),
782
- inlineImagePlugin && /*#__PURE__*/ jsxs(DropDownItem, {
783
- onClick: ()=>{
784
- activeEditor.dispatchCommand(OPEN_INLINE_IMAGE_MODAL_COMMAND, null);
785
- },
786
- className: "item",
787
- children: [
788
- /*#__PURE__*/ jsx("i", {
789
- className: "icon image"
790
- }),
791
- /*#__PURE__*/ jsx("span", {
792
- className: "text",
793
- children: "Inline Image"
794
- })
795
- ]
796
- }),
797
- tablePlugin && /*#__PURE__*/ jsxs(DropDownItem, {
798
- onClick: ()=>{
799
- activeEditor.dispatchCommand(OPEN_TABLE_MODAL_COMMAND, null);
800
- },
801
- className: "item",
802
- children: [
803
- /*#__PURE__*/ jsx("i", {
804
- className: "icon table"
805
- }),
806
- /*#__PURE__*/ jsx("span", {
807
- className: "text",
808
- children: "Table"
809
- })
810
- ]
811
- }),
812
- autoEmbedPlugin && EmbedConfigs.map((embedConfig)=>/*#__PURE__*/ jsxs(DropDownItem, {
813
- onClick: ()=>{
814
- activeEditor.dispatchCommand(INSERT_EMBED_COMMAND, embedConfig.type);
815
- },
816
- className: "item",
817
- children: [
818
- embedConfig.icon,
819
- /*#__PURE__*/ jsx("span", {
820
- className: "text",
821
- children: embedConfig.contentName
822
- })
823
- ]
824
- }, embedConfig.type))
825
- ]
743
+ children: /*#__PURE__*/ jsx(ToolbarActiveEditorProvider, {
744
+ editor: activeEditor,
745
+ children: insertMenuItems.map((item)=>/*#__PURE__*/ jsx(external_react_Fragment, {
746
+ children: item.node
747
+ }, item.id))
748
+ })
826
749
  })
827
750
  ]
828
751
  })
829
752
  ]
830
753
  }),
831
- toolbarExtensionItems.slice().sort((a, b)=>(a.order ?? 0) - (b.order ?? 0)).map((item)=>/*#__PURE__*/ jsx(external_react_Fragment, {
832
- children: item.node
833
- }, item.id))
754
+ /*#__PURE__*/ jsx(ToolbarActiveEditorProvider, {
755
+ editor: activeEditor,
756
+ children: trailingToolbarItems.map((item)=>/*#__PURE__*/ jsx(external_react_Fragment, {
757
+ children: item.node
758
+ }, item.id))
759
+ })
834
760
  ]
835
761
  });
836
762
  }
@@ -0,0 +1,25 @@
1
+ /**
2
+ * This Source Code is subject to the terms of the Mozilla Public
3
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
4
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
5
+ *
6
+ * Copyright (c) Infonomic Company Limited
7
+ */
8
+ import type * as React from 'react';
9
+ import type { LexicalEditor } from 'lexical';
10
+ /**
11
+ * Provider used by the toolbar plugin to expose the *active* Lexical
12
+ * editor (the editor for the current selection — may be a nested
13
+ * composer's editor) to contributed toolbar items.
14
+ */
15
+ export declare function ToolbarActiveEditorProvider({ editor, children, }: {
16
+ editor: LexicalEditor;
17
+ children: React.ReactNode;
18
+ }): React.JSX.Element;
19
+ /**
20
+ * Returns the editor a toolbar contribution should dispatch commands on.
21
+ * Falls back to the root composer editor when called outside the
22
+ * toolbar's provider, so contributions remain usable in standalone
23
+ * test/preview contexts.
24
+ */
25
+ export declare function useToolbarActiveEditor(): LexicalEditor;
@@ -0,0 +1,17 @@
1
+ "use client";
2
+ import { jsx } from "react/jsx-runtime";
3
+ import { createContext, useContext } from "react";
4
+ import { useLexicalComposerContext } from "@lexical/react/LexicalComposerContext";
5
+ const ToolbarActiveEditorContext = /*#__PURE__*/ createContext(null);
6
+ function ToolbarActiveEditorProvider({ editor, children }) {
7
+ return /*#__PURE__*/ jsx(ToolbarActiveEditorContext.Provider, {
8
+ value: editor,
9
+ children: children
10
+ });
11
+ }
12
+ function useToolbarActiveEditor() {
13
+ const fromToolbar = useContext(ToolbarActiveEditorContext);
14
+ const [composerEditor] = useLexicalComposerContext();
15
+ return fromToolbar ?? composerEditor;
16
+ }
17
+ export { ToolbarActiveEditorProvider, useToolbarActiveEditor };
@@ -94,7 +94,7 @@
94
94
  font-weight: 400;
95
95
  }
96
96
 
97
- html[data-theme="dark"] .LexicalEditorTheme__textCode {
97
+ html[data-theme="dark"] .LexicalEditorTheme__textCode, .dark .LexicalEditorTheme__textCode {
98
98
  color: #f1f5f9;
99
99
  background-color: #1e293b;
100
100
  border-color: #495362;
@@ -145,11 +145,11 @@ html[data-theme="dark"] .LexicalEditorTheme__textCode {
145
145
  left: 0;
146
146
  }
147
147
 
148
- html[data-theme="dark"] .LexicalEditorTheme__code {
148
+ html[data-theme="dark"] .LexicalEditorTheme__code, .dark .LexicalEditorTheme__code {
149
149
  background-color: #1a1a1a;
150
150
  }
151
151
 
152
- html[data-theme="dark"] .LexicalEditorTheme__code:before {
152
+ html[data-theme="dark"] .LexicalEditorTheme__code:before, .dark .LexicalEditorTheme__code:before {
153
153
  color: #777;
154
154
  background-color: #161616;
155
155
  border-right: 1px solid #ccc;
@@ -165,6 +165,16 @@ html[data-theme="dark"] .LexicalEditorTheme__code:before {
165
165
  overflow-y: scroll;
166
166
  }
167
167
 
168
+ .LexicalEditorTheme__tableScrollableWrapper {
169
+ margin: 30px 0;
170
+ overflow-x: auto;
171
+ }
172
+
173
+ .LexicalEditorTheme__tableScrollableWrapper > .LexicalEditorTheme__table {
174
+ margin-top: 0;
175
+ margin-bottom: 0;
176
+ }
177
+
168
178
  .LexicalEditorTheme__tableSelected {
169
179
  outline: 2px solid #3c84f4;
170
180
  }
@@ -90,6 +90,7 @@ const theme = {
90
90
  tableCellSelected: 'LexicalEditorTheme__tableCellSelected',
91
91
  tableCellSortedIndicator: 'LexicalEditorTheme__tableCellSortedIndicator',
92
92
  tableResizeRuler: 'LexicalEditorTheme__tableCellResizeRuler',
93
+ tableScrollableWrapper: 'LexicalEditorTheme__tableScrollableWrapper',
93
94
  tableSelected: 'LexicalEditorTheme__tableSelected',
94
95
  text: {
95
96
  bold: 'LexicalEditorTheme__textBold',
package/dist/index.d.ts CHANGED
@@ -1,11 +1,27 @@
1
1
  export type { SerializedEditor, SerializedEditorState, SerializedElementNode, SerializedLexicalNode, SerializedRootNode, SerializedTextNode, } from 'lexical';
2
2
  export { defaultEditorConfig } from './field/config/default';
3
+ export { defaultClientEditorConfig, defaultExtensionsArray, defaultExtensionsList, } from './field/config/default-extensions';
4
+ export { ExtensionsList } from './field/config/extensions-list';
3
5
  export { EditorField } from './field/editor-field';
6
+ export { AdmonitionExtension } from './field/extensions/admonition/admonition-extension';
7
+ export { AutoEmbedExtension } from './field/extensions/auto-embed/auto-embed-extension';
8
+ export { type BylineFloatingUIConfig, BylineFloatingUIExtension, type BylineFloatingUIItem, type BylineFloatingUIProps, selectFloatingUIItems, } from './field/extensions/byline-floating-ui';
9
+ export { type BylineToolbarConfig, BylineToolbarExtension, type BylineToolbarItem, type BylineToolbarPlacement, selectToolbarItems, } from './field/extensions/byline-toolbar';
10
+ export { CodeHighlightExtension } from './field/extensions/code-highlight/code-highlight-extension';
11
+ export { FloatingTextFormatExtension } from './field/extensions/floating-text-format/floating-text-format-extension';
12
+ export { HorizontalRuleExtension } from './field/extensions/horizontal-rule/horizontal-rule-extension';
13
+ export { type InlineImageConfig, InlineImageExtension, } from './field/extensions/inline-image/inline-image-extension';
14
+ export { LayoutExtension } from './field/extensions/layout/layout-extension';
15
+ export { AutoLinkExtension, LinkExtension } from './field/extensions/link';
16
+ export { TableExtension } from './field/extensions/table/table-extension';
17
+ export { VimeoExtension } from './field/extensions/vimeo/vimeo-extension';
18
+ export { YouTubeExtension } from './field/extensions/youtube/youtube-extension';
4
19
  export { Nodes } from './field/nodes';
20
+ export { ToolbarActiveEditorProvider, useToolbarActiveEditor, } from './field/plugins/toolbar-plugin/toolbar-active-editor';
5
21
  export { lexicalEditor } from './lexical-editor';
6
22
  export { RichTextField } from './richtext-field';
7
23
  export { createEmptyEditorState } from './validate/createEmptyEditorState';
8
24
  export { hasText } from './validate/hasText';
9
25
  export type { EditorConfig, EditorSettings, EditorSettingsOverride } from './field/config/types';
26
+ export type { InlineImageAttributes, Position as InlineImagePosition, SerializedInlineImageNode, } from './field/extensions/inline-image/node-types';
10
27
  export type { DocumentRelation } from './field/nodes/document-relation';
11
- export type { InlineImageAttributes, Position as InlineImagePosition, SerializedInlineImageNode, } from './field/nodes/inline-image-node/types';
package/dist/index.js CHANGED
@@ -1,6 +1,22 @@
1
1
  export { defaultEditorConfig } from "./field/config/default.js";
2
+ export { defaultClientEditorConfig, defaultExtensionsArray, defaultExtensionsList } from "./field/config/default-extensions.js";
3
+ export { ExtensionsList } from "./field/config/extensions-list.js";
2
4
  export { EditorField } from "./field/editor-field.js";
5
+ export { AdmonitionExtension } from "./field/extensions/admonition/admonition-extension.js";
6
+ export { AutoEmbedExtension } from "./field/extensions/auto-embed/auto-embed-extension.js";
7
+ export { BylineFloatingUIExtension, selectFloatingUIItems } from "./field/extensions/byline-floating-ui/index.js";
8
+ export { BylineToolbarExtension, selectToolbarItems } from "./field/extensions/byline-toolbar/index.js";
9
+ export { CodeHighlightExtension } from "./field/extensions/code-highlight/code-highlight-extension.js";
10
+ export { FloatingTextFormatExtension } from "./field/extensions/floating-text-format/floating-text-format-extension.js";
11
+ export { HorizontalRuleExtension } from "./field/extensions/horizontal-rule/horizontal-rule-extension.js";
12
+ export { InlineImageExtension } from "./field/extensions/inline-image/inline-image-extension.js";
13
+ export { LayoutExtension } from "./field/extensions/layout/layout-extension.js";
14
+ export { AutoLinkExtension, LinkExtension } from "./field/extensions/link/index.js";
15
+ export { TableExtension } from "./field/extensions/table/table-extension.js";
16
+ export { VimeoExtension } from "./field/extensions/vimeo/vimeo-extension.js";
17
+ export { YouTubeExtension } from "./field/extensions/youtube/youtube-extension.js";
3
18
  export { Nodes } from "./field/nodes/index.js";
19
+ export { ToolbarActiveEditorProvider, useToolbarActiveEditor } from "./field/plugins/toolbar-plugin/toolbar-active-editor.js";
4
20
  export { lexicalEditor } from "./lexical-editor.js";
5
21
  export { RichTextField } from "./richtext-field.js";
6
22
  export { createEmptyEditorState } from "./validate/createEmptyEditorState.js";
@@ -6,30 +6,42 @@
6
6
  * Copyright (c) Infonomic Company Limited
7
7
  */
8
8
  import type { RichTextEditorComponent } from '@byline/core';
9
+ import type { ExtensionsList } from './field/config/extensions-list';
9
10
  import type { EditorConfig } from './field/config/types';
10
11
  /**
11
- * Returns a `RichTextEditorComponent` with editor settings baked in. Use this
12
- * at the registration site in your admin config when you want to
13
- * customise the editor across the whole installation; per-field overrides
14
- * via `RichTextField.editorConfig` continue to take precedence at render time.
12
+ * Inside `lexicalEditor((c) => ...)` the seed always carries an
13
+ * `ExtensionsList`, so narrow the callback parameter so callers can write
14
+ * `c.extensions.add(...)` without a non-null assertion.
15
+ */
16
+ export type LexicalEditorConfigureInput = Omit<EditorConfig, 'extensions'> & {
17
+ extensions: ExtensionsList;
18
+ };
19
+ /**
20
+ * Returns a `RichTextEditorComponent` with editor settings baked in. Use
21
+ * this at the registration site in your admin config when you want to
22
+ * customise the editor across the whole installation; per-field
23
+ * overrides via `RichTextField.editorConfig` continue to take precedence
24
+ * at render time.
15
25
  *
16
- * The `configure` callback receives a deep clone of `defaultEditorConfig`
17
- * mutate and return, or return a new object. Mutating the input is safe
18
- * because the clone is local to this call.
26
+ * The `configure` callback receives a deep clone of `defaultEditorConfig`
27
+ * with `extensions` populated from `defaultExtensionsList()`. Mutate the
28
+ * clone freely it's local to this call. Use the chainable
29
+ * `c.extensions.add(...)`, `.remove(...)`, `.replace(...)`, and
30
+ * `.configure(...)` methods to manipulate the extension graph.
19
31
  *
20
- * Calling `lexicalEditor()` with no argument is equivalent to registering
21
- * `RichTextField` directly.
32
+ * Calling `lexicalEditor()` with no argument is equivalent to
33
+ * registering `RichTextField` directly with the package defaults.
22
34
  *
23
35
  * @example
24
36
  * ```ts
25
- * import { lexicalEditor } from '@byline/richtext-lexical'
37
+ * import { lexicalEditor, TableExtension } from '@byline/richtext-lexical'
26
38
  *
27
39
  * defineClientConfig({
28
40
  * fields: {
29
41
  * richText: {
30
42
  * editor: lexicalEditor((c) => {
31
- * c.settings.options.tablePlugin = false
32
- * c.settings.options.codeHighlightPlugin = false
43
+ * c.extensions.remove(TableExtension) // drop a built-in
44
+ * c.settings.placeholderText = 'Start writing...'
33
45
  * return c
34
46
  * }),
35
47
  * },
@@ -37,4 +49,4 @@ import type { EditorConfig } from './field/config/types';
37
49
  * })
38
50
  * ```
39
51
  */
40
- export declare function lexicalEditor(configure?: (config: EditorConfig) => EditorConfig): RichTextEditorComponent;
52
+ export declare function lexicalEditor(configure?: (config: LexicalEditorConfigureInput) => LexicalEditorConfigureInput): RichTextEditorComponent;
@@ -1,9 +1,17 @@
1
1
  import { jsx } from "react/jsx-runtime";
2
2
  import { cloneDeep } from "lodash-es";
3
3
  import { defaultEditorConfig } from "./field/config/default.js";
4
+ import { defaultExtensionsList } from "./field/config/default-extensions.js";
4
5
  import { RichTextField } from "./richtext-field.js";
5
6
  function lexicalEditor(configure) {
6
- const baked = configure ? configure(cloneDeep(defaultEditorConfig)) : void 0;
7
+ let baked;
8
+ if (configure) {
9
+ const seed = {
10
+ ...cloneDeep(defaultEditorConfig),
11
+ extensions: defaultExtensionsList()
12
+ };
13
+ baked = configure(seed);
14
+ }
7
15
  const ConfiguredEditor = (props)=>/*#__PURE__*/ jsx(RichTextField, {
8
16
  ...props,
9
17
  editorConfig: baked
@@ -2,6 +2,7 @@ import { jsx, jsxs } from "react/jsx-runtime";
2
2
  import { ErrorText, Label, LocaleBadge, useFieldError, useFieldValue } from "@byline/ui/react";
3
3
  import classnames from "classnames";
4
4
  import { defaultEditorConfig } from "./field/config/default.js";
5
+ import { defaultExtensionsList } from "./field/config/default-extensions.js";
5
6
  import { EditorField } from "./field/editor-field.js";
6
7
  import richtext_field_module from "./richtext-field.module.js";
7
8
  const RichTextField = ({ field, value, defaultValue, editorConfig, readonly = false, instanceKey, onChange, path, locale, featureBeforeEditor, featureAfterEditor, featureChildren })=>{
@@ -11,7 +12,11 @@ const RichTextField = ({ field, value, defaultValue, editorConfig, readonly = fa
11
12
  const incomingValue = value ?? fieldValue;
12
13
  const incomingDefault = defaultValue;
13
14
  const fieldId = instanceKey ? `${field.name}-${instanceKey}` : field.name;
14
- const baseEditorConfig = field.editorConfig ?? editorConfig ?? defaultEditorConfig;
15
+ const resolved = field.editorConfig ?? editorConfig ?? defaultEditorConfig;
16
+ const baseEditorConfig = null != resolved.extensions ? resolved : {
17
+ ...resolved,
18
+ extensions: defaultExtensionsList()
19
+ };
15
20
  const resolvedEditorConfig = void 0 === field.embedRelationsOnSave ? baseEditorConfig : {
16
21
  ...baseEditorConfig,
17
22
  settings: {
package/dist/server.d.ts CHANGED
@@ -29,8 +29,8 @@ import type { BylineClient } from '@byline/client';
29
29
  import type { RichTextPopulateFn } from '@byline/core';
30
30
  import { type LexicalNodeVisitor } from './field/lexical-populate-shared';
31
31
  export { defaultEditorConfig } from './field/config/default';
32
- export { inlineImageVisitor } from './field/plugins/inline-image-plugin/populate';
33
- export { linkVisitor } from './field/plugins/link-plugin/populate';
32
+ export { inlineImageVisitor } from './field/extensions/inline-image/populate';
33
+ export { linkVisitor } from './field/extensions/link/populate';
34
34
  export type { EditorConfig, EditorSettings, EditorSettingsOverride } from './field/config/types';
35
35
  export type { LexicalNodeLike, LexicalNodeVisitor, PendingHydration, } from './field/lexical-populate-shared';
36
36
  export interface LexicalServerOptions {
package/dist/server.js CHANGED
@@ -1,6 +1,6 @@
1
+ import { inlineImageVisitor } from "./field/extensions/inline-image/populate.js";
2
+ import { linkVisitor } from "./field/extensions/link/populate.js";
1
3
  import { runLexicalPopulate } from "./field/lexical-populate-shared.js";
2
- import { inlineImageVisitor } from "./field/plugins/inline-image-plugin/populate.js";
3
- import { linkVisitor } from "./field/plugins/link-plugin/populate.js";
4
4
  function lexicalEditorServer(options) {
5
5
  const visitors = options.visitors ?? [
6
6
  inlineImageVisitor,
package/package.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "private": false,
4
4
  "type": "module",
5
5
  "license": "MPL-2.0",
6
- "version": "1.11.2",
6
+ "version": "1.12.1",
7
7
  "engines": {
8
8
  "node": ">=20.9.0"
9
9
  },
@@ -42,10 +42,6 @@
42
42
  "main": "./dist/index.js",
43
43
  "default": "./dist/index.js"
44
44
  },
45
- "./toolbar-extensions": {
46
- "types": "./dist/field/toolbar-extensions.d.ts",
47
- "import": "./dist/field/toolbar-extensions.js"
48
- },
49
45
  "./server": {
50
46
  "types": "./dist/server.d.ts",
51
47
  "import": "./dist/server.js",
@@ -56,6 +52,7 @@
56
52
  "dependencies": {
57
53
  "@lexical/clipboard": "0.44.0",
58
54
  "@lexical/code": "0.44.0",
55
+ "@lexical/extension": "0.44.0",
59
56
  "@lexical/hashtag": "0.44.0",
60
57
  "@lexical/headless": "0.44.0",
61
58
  "@lexical/html": "0.44.0",
@@ -75,9 +72,9 @@
75
72
  "npm-run-all": "^4.1.5",
76
73
  "prism-react-renderer": "^2.4.1",
77
74
  "react-error-boundary": "^6.1.1",
78
- "@byline/client": "1.11.2",
79
- "@byline/ui": "1.11.2",
80
- "@byline/core": "1.11.2"
75
+ "@byline/ui": "1.12.1",
76
+ "@byline/core": "1.12.1",
77
+ "@byline/client": "1.12.1"
81
78
  },
82
79
  "peerDependencies": {
83
80
  "react": "^19.0.0",
@@ -113,10 +110,10 @@
113
110
  "dev": "run-p dev:*",
114
111
  "dev:code": "rslib build --watch",
115
112
  "build": "run-s build:*",
116
- "build:clean": "rimraf dist build",
113
+ "build:clean": "node scripts/clean.js dist build",
117
114
  "build:code": "rslib build",
118
115
  "typecheck": "tsc --noEmit",
119
- "clean": "rimraf node_modules dist build types .turbo",
116
+ "clean": "node scripts/clean.js node_modules dist build types .turbo",
120
117
  "lint": "biome check --write --unsafe --diagnostic-level=error",
121
118
  "skip:test": "vitest"
122
119
  }
@@ -61,12 +61,12 @@ export function ApplyValuePlugin({
61
61
 
62
62
  const nextState = editor.parseEditorState(value)
63
63
 
64
- editor.update(
65
- () => {
66
- editor.setEditorState(nextState)
67
- },
68
- { tag: APPLY_VALUE_TAG }
69
- )
64
+ // Must NOT be wrapped in editor.update — setEditorState defers its commit
65
+ // when called inside an active update, leaving selection/node references
66
+ // pointing into the pre-swap nodeMap. Surfaces as @lexical/table observer
67
+ // errors ("Expected node with key N to exist") on the very next selection
68
+ // change. setEditorState applies the tag itself.
69
+ editor.setEditorState(nextState, { tag: APPLY_VALUE_TAG })
70
70
  lastAppliedHashRef.current = nextRawHash
71
71
 
72
72
  let cancelled = false