@aquera/nile-elements 2.0.16 → 2.0.18

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 (383) hide show
  1. package/README.md +6 -0
  2. package/dist/{index-f6944844.cjs.js → index-0c0c869d.cjs.js} +2 -2
  3. package/dist/{index-f6944844.cjs.js.map → index-0c0c869d.cjs.js.map} +1 -1
  4. package/dist/{index-403841c7.cjs.js → index-129ef6fb.cjs.js} +3 -3
  5. package/dist/{index-403841c7.cjs.js.map → index-129ef6fb.cjs.js.map} +1 -1
  6. package/dist/{index-1faa963c.esm.js → index-36f2a6b5.esm.js} +1 -1
  7. package/dist/index-4df50481.esm.js +1 -0
  8. package/dist/index-5d34cff1.esm.js +1 -0
  9. package/dist/index-7ae95edd.cjs.js +2 -0
  10. package/dist/{index-3ca67627.cjs.js.map → index-7ae95edd.cjs.js.map} +1 -1
  11. package/dist/index-7ca72b78.esm.js +1 -0
  12. package/dist/index-bbe23ad8.cjs.js +2 -0
  13. package/dist/index-bbe23ad8.cjs.js.map +1 -0
  14. package/dist/index-ccc6a799.cjs.js +5 -0
  15. package/dist/index-ccc6a799.cjs.js.map +1 -0
  16. package/dist/index.cjs.js +1 -1
  17. package/dist/index.esm.js +1 -1
  18. package/dist/index.js +686 -464
  19. package/dist/nile-auto-complete/index.cjs.js +1 -1
  20. package/dist/nile-auto-complete/nile-auto-complete.cjs.js +1 -1
  21. package/dist/nile-auto-complete/portal-manager.cjs.js +1 -1
  22. package/dist/nile-auto-complete/portal-utils.cjs.js +1 -1
  23. package/dist/nile-code-editor/extensionSetup.cjs.js +2 -2
  24. package/dist/nile-code-editor/index.cjs.js +1 -1
  25. package/dist/nile-code-editor/nile-code-editor.cjs.js +1 -1
  26. package/dist/nile-code-editor/theme.cjs.js +1 -1
  27. package/dist/nile-color-picker/index.cjs.js +1 -1
  28. package/dist/nile-color-picker/nile-color-picker.cjs.js +1 -1
  29. package/dist/nile-combobox/index.cjs.js +1 -1
  30. package/dist/nile-combobox/nile-combobox.cjs.js +1 -1
  31. package/dist/nile-combobox/portal-manager.cjs.js +1 -1
  32. package/dist/nile-context-menu/index.cjs.js +1 -1
  33. package/dist/nile-context-menu/nile-context-menu.cjs.js +1 -1
  34. package/dist/nile-context-submenu/index.cjs.js +1 -1
  35. package/dist/nile-context-submenu/nile-context-submenu.cjs.js +1 -1
  36. package/dist/nile-detail/index.cjs.js +1 -1
  37. package/dist/nile-detail/nile-detail.cjs.js +1 -1
  38. package/dist/nile-dropdown/index.cjs.js +1 -1
  39. package/dist/nile-dropdown/nile-dropdown.cjs.js +1 -1
  40. package/dist/nile-dropdown/portal-manager.cjs.js +1 -1
  41. package/dist/nile-file-upload/index.cjs.js +1 -1
  42. package/dist/nile-file-upload/nile-file-upload.cjs.js +1 -1
  43. package/dist/nile-file-upload/nile-file-upload.template.cjs.js +1 -1
  44. package/dist/nile-floating-panel/index.cjs.js +1 -1
  45. package/dist/nile-floating-panel/nile-floating-panel.cjs.js +1 -1
  46. package/dist/nile-lite-tooltip/index.cjs.js +1 -1
  47. package/dist/nile-lite-tooltip/nile-lite-tooltip.cjs.js +1 -1
  48. package/dist/nile-markdown-editor/index.cjs.js +1 -1
  49. package/dist/nile-markdown-editor/nile-markdown-editor.cjs.js +1 -1
  50. package/dist/nile-minimap/index.cjs.js +2 -0
  51. package/dist/nile-minimap/index.cjs.js.map +1 -0
  52. package/dist/nile-minimap/index.esm.js +1 -0
  53. package/dist/nile-minimap/nile-minimap.cjs.js +2 -0
  54. package/dist/nile-minimap/nile-minimap.cjs.js.map +1 -0
  55. package/dist/nile-minimap/nile-minimap.css.cjs.js +2 -0
  56. package/dist/nile-minimap/nile-minimap.css.cjs.js.map +1 -0
  57. package/dist/nile-minimap/nile-minimap.css.esm.js +150 -0
  58. package/dist/nile-minimap/nile-minimap.esm.js +22 -0
  59. package/dist/nile-popover/index.cjs.js +1 -1
  60. package/dist/nile-popover/nile-popover.cjs.js +1 -1
  61. package/dist/nile-popover/portal-manager.cjs.js +1 -1
  62. package/dist/nile-popup/index.cjs.js +1 -1
  63. package/dist/nile-popup/nile-popup.cjs.js +1 -1
  64. package/dist/nile-segmented-progress-bar/index.cjs.js +1 -1
  65. package/dist/nile-segmented-progress-bar/nile-segmented-progress-bar.cjs.js +1 -1
  66. package/dist/nile-select/index.cjs.js +1 -1
  67. package/dist/nile-select/nile-select.cjs.js +1 -1
  68. package/dist/nile-select/portal-manager.cjs.js +1 -1
  69. package/dist/nile-side-bar-action/index.cjs.js +1 -1
  70. package/dist/nile-side-bar-action/nile-side-bar-action.cjs.js +1 -1
  71. package/dist/nile-side-bar-action/portal-manager.cjs.js +1 -1
  72. package/dist/nile-tooltip/index.cjs.js +1 -1
  73. package/dist/nile-tooltip/nile-tooltip.cjs.js +1 -1
  74. package/dist/nile-virtual-select/index.cjs.js +1 -1
  75. package/dist/nile-virtual-select/nile-virtual-select.cjs.js +1 -1
  76. package/dist/nile-virtual-select/portal-manager.cjs.js +1 -1
  77. package/dist/nile-virtual-select/renderer.cjs.js +1 -1
  78. package/dist/nile-wysiwyg-editor/engine/commands.cjs.js +1 -1
  79. package/dist/nile-wysiwyg-editor/engine/commands.cjs.js.map +1 -1
  80. package/dist/nile-wysiwyg-editor/engine/commands.esm.js +1 -1
  81. package/dist/nile-wysiwyg-editor/engine/create-state.cjs.js +1 -1
  82. package/dist/nile-wysiwyg-editor/engine/create-state.cjs.js.map +1 -1
  83. package/dist/nile-wysiwyg-editor/engine/create-state.esm.js +1 -1
  84. package/dist/nile-wysiwyg-editor/engine/email-css.cjs.js +2 -0
  85. package/dist/nile-wysiwyg-editor/engine/email-css.cjs.js.map +1 -0
  86. package/dist/nile-wysiwyg-editor/engine/email-css.esm.js +1 -0
  87. package/dist/nile-wysiwyg-editor/engine/email-render.cjs.js +2 -0
  88. package/dist/nile-wysiwyg-editor/engine/email-render.cjs.js.map +1 -0
  89. package/dist/nile-wysiwyg-editor/engine/email-render.esm.js +1 -0
  90. package/dist/nile-wysiwyg-editor/engine/html-detect.cjs.js +2 -0
  91. package/dist/nile-wysiwyg-editor/engine/html-detect.cjs.js.map +1 -0
  92. package/dist/nile-wysiwyg-editor/engine/html-detect.esm.js +1 -0
  93. package/dist/nile-wysiwyg-editor/engine/index.cjs.js +1 -1
  94. package/dist/nile-wysiwyg-editor/engine/index.esm.js +1 -1
  95. package/dist/nile-wysiwyg-editor/engine/inputrules.cjs.js +1 -1
  96. package/dist/nile-wysiwyg-editor/engine/inputrules.cjs.js.map +1 -1
  97. package/dist/nile-wysiwyg-editor/engine/inputrules.esm.js +1 -1
  98. package/dist/nile-wysiwyg-editor/engine/keymap.cjs.js +1 -1
  99. package/dist/nile-wysiwyg-editor/engine/keymap.cjs.js.map +1 -1
  100. package/dist/nile-wysiwyg-editor/engine/keymap.esm.js +1 -1
  101. package/dist/nile-wysiwyg-editor/engine/plugins/code-highlight.cjs.js +1 -1
  102. package/dist/nile-wysiwyg-editor/engine/plugins/code-highlight.cjs.js.map +1 -1
  103. package/dist/nile-wysiwyg-editor/engine/plugins/code-highlight.esm.js +1 -1
  104. package/dist/nile-wysiwyg-editor/engine/plugins/embed-view.cjs.js +1 -1
  105. package/dist/nile-wysiwyg-editor/engine/plugins/embed-view.cjs.js.map +1 -1
  106. package/dist/nile-wysiwyg-editor/engine/plugins/embed-view.esm.js +1 -1
  107. package/dist/nile-wysiwyg-editor/engine/plugins/embeds.cjs.js +1 -1
  108. package/dist/nile-wysiwyg-editor/engine/plugins/embeds.cjs.js.map +1 -1
  109. package/dist/nile-wysiwyg-editor/engine/plugins/embeds.esm.js +1 -1
  110. package/dist/nile-wysiwyg-editor/engine/plugins/find-replace.cjs.js +1 -1
  111. package/dist/nile-wysiwyg-editor/engine/plugins/find-replace.cjs.js.map +1 -1
  112. package/dist/nile-wysiwyg-editor/engine/plugins/find-replace.esm.js +1 -1
  113. package/dist/nile-wysiwyg-editor/engine/plugins/format-painter.cjs.js +1 -1
  114. package/dist/nile-wysiwyg-editor/engine/plugins/format-painter.cjs.js.map +1 -1
  115. package/dist/nile-wysiwyg-editor/engine/plugins/format-painter.esm.js +1 -1
  116. package/dist/nile-wysiwyg-editor/engine/plugins/image-view.cjs.js +1 -1
  117. package/dist/nile-wysiwyg-editor/engine/plugins/image-view.cjs.js.map +1 -1
  118. package/dist/nile-wysiwyg-editor/engine/plugins/image-view.esm.js +1 -1
  119. package/dist/nile-wysiwyg-editor/engine/plugins/image.cjs.js +1 -1
  120. package/dist/nile-wysiwyg-editor/engine/plugins/image.cjs.js.map +1 -1
  121. package/dist/nile-wysiwyg-editor/engine/plugins/image.esm.js +1 -1
  122. package/dist/nile-wysiwyg-editor/engine/plugins/link.cjs.js +1 -1
  123. package/dist/nile-wysiwyg-editor/engine/plugins/link.cjs.js.map +1 -1
  124. package/dist/nile-wysiwyg-editor/engine/plugins/link.esm.js +1 -1
  125. package/dist/nile-wysiwyg-editor/engine/plugins/max-length.cjs.js +1 -1
  126. package/dist/nile-wysiwyg-editor/engine/plugins/max-length.cjs.js.map +1 -1
  127. package/dist/nile-wysiwyg-editor/engine/plugins/max-length.esm.js +1 -1
  128. package/dist/nile-wysiwyg-editor/engine/plugins/paste.cjs.js +1 -1
  129. package/dist/nile-wysiwyg-editor/engine/plugins/paste.cjs.js.map +1 -1
  130. package/dist/nile-wysiwyg-editor/engine/plugins/paste.esm.js +1 -1
  131. package/dist/nile-wysiwyg-editor/engine/plugins/placeholder.cjs.js +1 -1
  132. package/dist/nile-wysiwyg-editor/engine/plugins/placeholder.cjs.js.map +1 -1
  133. package/dist/nile-wysiwyg-editor/engine/plugins/placeholder.esm.js +1 -1
  134. package/dist/nile-wysiwyg-editor/engine/plugins/single-line.cjs.js +1 -1
  135. package/dist/nile-wysiwyg-editor/engine/plugins/single-line.cjs.js.map +1 -1
  136. package/dist/nile-wysiwyg-editor/engine/plugins/single-line.esm.js +1 -1
  137. package/dist/nile-wysiwyg-editor/engine/plugins/suggestions.cjs.js +1 -1
  138. package/dist/nile-wysiwyg-editor/engine/plugins/suggestions.cjs.js.map +1 -1
  139. package/dist/nile-wysiwyg-editor/engine/plugins/suggestions.esm.js +1 -1
  140. package/dist/nile-wysiwyg-editor/engine/plugins/tables.cjs.js +1 -1
  141. package/dist/nile-wysiwyg-editor/engine/plugins/tables.cjs.js.map +1 -1
  142. package/dist/nile-wysiwyg-editor/engine/plugins/tables.esm.js +1 -1
  143. package/dist/nile-wysiwyg-editor/engine/sanitize.cjs.js +2 -1
  144. package/dist/nile-wysiwyg-editor/engine/sanitize.cjs.js.map +1 -1
  145. package/dist/nile-wysiwyg-editor/engine/sanitize.esm.js +1 -1
  146. package/dist/nile-wysiwyg-editor/engine/schema.cjs.js +1 -1
  147. package/dist/nile-wysiwyg-editor/engine/schema.cjs.js.map +1 -1
  148. package/dist/nile-wysiwyg-editor/engine/schema.esm.js +1 -1
  149. package/dist/nile-wysiwyg-editor/engine/selection-state.cjs.js +1 -1
  150. package/dist/nile-wysiwyg-editor/engine/selection-state.cjs.js.map +1 -1
  151. package/dist/nile-wysiwyg-editor/engine/selection-state.esm.js +1 -1
  152. package/dist/nile-wysiwyg-editor/engine/serializer.cjs.js +1 -1
  153. package/dist/nile-wysiwyg-editor/engine/serializer.cjs.js.map +1 -1
  154. package/dist/nile-wysiwyg-editor/engine/serializer.esm.js +1 -1
  155. package/dist/nile-wysiwyg-editor/index.cjs.js +1 -1
  156. package/dist/nile-wysiwyg-editor/index.esm.js +1 -1
  157. package/dist/nile-wysiwyg-editor/nile-wysiwyg-editor.cjs.js +1 -1
  158. package/dist/nile-wysiwyg-editor/nile-wysiwyg-editor.cjs.js.map +1 -1
  159. package/dist/nile-wysiwyg-editor/nile-wysiwyg-editor.css.cjs.js +1 -1
  160. package/dist/nile-wysiwyg-editor/nile-wysiwyg-editor.css.cjs.js.map +1 -1
  161. package/dist/nile-wysiwyg-editor/nile-wysiwyg-editor.css.esm.js +45 -4
  162. package/dist/nile-wysiwyg-editor/nile-wysiwyg-editor.esm.js +2 -2
  163. package/dist/nile-wysiwyg-editor/nile-wysiwyg-toolbar/index.cjs.js +1 -1
  164. package/dist/nile-wysiwyg-editor/nile-wysiwyg-toolbar/nile-wysiwyg-toolbar.cjs.js +1 -1
  165. package/dist/nile-wysiwyg-editor/ui/bookmark-panel.cjs.js +1 -1
  166. package/dist/nile-wysiwyg-editor/ui/bookmark-panel.cjs.js.map +1 -1
  167. package/dist/nile-wysiwyg-editor/ui/bookmark-panel.esm.js +2 -2
  168. package/dist/nile-wysiwyg-editor/ui/bubble-menu.cjs.js +1 -1
  169. package/dist/nile-wysiwyg-editor/ui/bubble-menu.cjs.js.map +1 -1
  170. package/dist/nile-wysiwyg-editor/ui/bubble-menu.esm.js +5 -5
  171. package/dist/nile-wysiwyg-editor/ui/code-block-menu.cjs.js +1 -1
  172. package/dist/nile-wysiwyg-editor/ui/code-block-menu.cjs.js.map +1 -1
  173. package/dist/nile-wysiwyg-editor/ui/code-block-menu.esm.js +1 -1
  174. package/dist/nile-wysiwyg-editor/ui/embed-menu.cjs.js +1 -1
  175. package/dist/nile-wysiwyg-editor/ui/embed-menu.cjs.js.map +1 -1
  176. package/dist/nile-wysiwyg-editor/ui/embed-menu.esm.js +1 -1
  177. package/dist/nile-wysiwyg-editor/ui/embed-panel.cjs.js +1 -1
  178. package/dist/nile-wysiwyg-editor/ui/embed-panel.cjs.js.map +1 -1
  179. package/dist/nile-wysiwyg-editor/ui/embed-panel.esm.js +2 -2
  180. package/dist/nile-wysiwyg-editor/ui/emoji-picker.cjs.js +1 -1
  181. package/dist/nile-wysiwyg-editor/ui/emoji-picker.cjs.js.map +1 -1
  182. package/dist/nile-wysiwyg-editor/ui/emoji-picker.esm.js +1 -1
  183. package/dist/nile-wysiwyg-editor/ui/find-replace.cjs.js +1 -1
  184. package/dist/nile-wysiwyg-editor/ui/find-replace.cjs.js.map +1 -1
  185. package/dist/nile-wysiwyg-editor/ui/find-replace.esm.js +3 -3
  186. package/dist/nile-wysiwyg-editor/ui/image-menu.cjs.js +1 -1
  187. package/dist/nile-wysiwyg-editor/ui/image-menu.cjs.js.map +1 -1
  188. package/dist/nile-wysiwyg-editor/ui/image-menu.esm.js +3 -3
  189. package/dist/nile-wysiwyg-editor/ui/image-panel.cjs.js +1 -1
  190. package/dist/nile-wysiwyg-editor/ui/image-panel.cjs.js.map +1 -1
  191. package/dist/nile-wysiwyg-editor/ui/image-panel.esm.js +1 -1
  192. package/dist/nile-wysiwyg-editor/ui/insert-menu.cjs.js +1 -1
  193. package/dist/nile-wysiwyg-editor/ui/insert-menu.cjs.js.map +1 -1
  194. package/dist/nile-wysiwyg-editor/ui/insert-menu.esm.js +1 -1
  195. package/dist/nile-wysiwyg-editor/ui/link-editor.cjs.js +1 -1
  196. package/dist/nile-wysiwyg-editor/ui/link-editor.cjs.js.map +1 -1
  197. package/dist/nile-wysiwyg-editor/ui/link-editor.esm.js +9 -9
  198. package/dist/nile-wysiwyg-editor/ui/markdown-panel.cjs.js +1 -1
  199. package/dist/nile-wysiwyg-editor/ui/markdown-panel.cjs.js.map +1 -1
  200. package/dist/nile-wysiwyg-editor/ui/markdown-panel.esm.js +1 -1
  201. package/dist/nile-wysiwyg-editor/ui/math-panel.cjs.js +1 -1
  202. package/dist/nile-wysiwyg-editor/ui/math-panel.cjs.js.map +1 -1
  203. package/dist/nile-wysiwyg-editor/ui/math-panel.esm.js +1 -1
  204. package/dist/nile-wysiwyg-editor/ui/shortcut-help.cjs.js +1 -1
  205. package/dist/nile-wysiwyg-editor/ui/shortcut-help.cjs.js.map +1 -1
  206. package/dist/nile-wysiwyg-editor/ui/shortcut-help.esm.js +1 -1
  207. package/dist/nile-wysiwyg-editor/ui/source-view.cjs.js +1 -1
  208. package/dist/nile-wysiwyg-editor/ui/source-view.cjs.js.map +1 -1
  209. package/dist/nile-wysiwyg-editor/ui/source-view.esm.js +4 -4
  210. package/dist/nile-wysiwyg-editor/ui/special-chars.cjs.js +1 -1
  211. package/dist/nile-wysiwyg-editor/ui/special-chars.cjs.js.map +1 -1
  212. package/dist/nile-wysiwyg-editor/ui/special-chars.esm.js +1 -1
  213. package/dist/nile-wysiwyg-editor/ui/suggest-list.cjs.js +1 -1
  214. package/dist/nile-wysiwyg-editor/ui/suggest-list.cjs.js.map +1 -1
  215. package/dist/nile-wysiwyg-editor/ui/suggest-list.esm.js +23 -12
  216. package/dist/nile-wysiwyg-editor/ui/table-grid-picker.cjs.js +1 -1
  217. package/dist/nile-wysiwyg-editor/ui/table-grid-picker.cjs.js.map +1 -1
  218. package/dist/nile-wysiwyg-editor/ui/table-grid-picker.esm.js +7 -7
  219. package/dist/nile-wysiwyg-editor/ui/table-menu.cjs.js +1 -1
  220. package/dist/nile-wysiwyg-editor/ui/table-menu.cjs.js.map +1 -1
  221. package/dist/nile-wysiwyg-editor/ui/table-menu.esm.js +1 -1
  222. package/dist/src/index.d.ts +1 -0
  223. package/dist/src/index.js +1 -0
  224. package/dist/src/index.js.map +1 -1
  225. package/dist/src/nile-minimap/index.d.ts +1 -0
  226. package/dist/src/nile-minimap/index.js +2 -0
  227. package/dist/src/nile-minimap/index.js.map +1 -0
  228. package/dist/src/nile-minimap/nile-minimap.css.d.ts +12 -0
  229. package/dist/src/nile-minimap/nile-minimap.css.js +162 -0
  230. package/dist/src/nile-minimap/nile-minimap.css.js.map +1 -0
  231. package/dist/src/nile-minimap/nile-minimap.d.ts +131 -0
  232. package/dist/src/nile-minimap/nile-minimap.js +704 -0
  233. package/dist/src/nile-minimap/nile-minimap.js.map +1 -0
  234. package/dist/src/nile-minimap/nile-minimap.test.d.ts +1 -0
  235. package/dist/src/nile-minimap/nile-minimap.test.js +785 -0
  236. package/dist/src/nile-minimap/nile-minimap.test.js.map +1 -0
  237. package/dist/src/nile-wysiwyg-editor/engine/create-state.d.ts +5 -0
  238. package/dist/src/nile-wysiwyg-editor/engine/create-state.js +2 -0
  239. package/dist/src/nile-wysiwyg-editor/engine/create-state.js.map +1 -1
  240. package/dist/src/nile-wysiwyg-editor/engine/email-css.d.ts +14 -0
  241. package/dist/src/nile-wysiwyg-editor/engine/email-css.js +140 -0
  242. package/dist/src/nile-wysiwyg-editor/engine/email-css.js.map +1 -0
  243. package/dist/src/nile-wysiwyg-editor/engine/email-fidelity.test.d.ts +1 -0
  244. package/dist/src/nile-wysiwyg-editor/engine/email-fidelity.test.js +1045 -0
  245. package/dist/src/nile-wysiwyg-editor/engine/email-fidelity.test.js.map +1 -0
  246. package/dist/src/nile-wysiwyg-editor/engine/email-render.d.ts +11 -0
  247. package/dist/src/nile-wysiwyg-editor/engine/email-render.js +93 -0
  248. package/dist/src/nile-wysiwyg-editor/engine/email-render.js.map +1 -0
  249. package/dist/src/nile-wysiwyg-editor/engine/html-detect.d.ts +2 -0
  250. package/dist/src/nile-wysiwyg-editor/engine/html-detect.js +24 -0
  251. package/dist/src/nile-wysiwyg-editor/engine/html-detect.js.map +1 -0
  252. package/dist/src/nile-wysiwyg-editor/engine/index.d.ts +4 -1
  253. package/dist/src/nile-wysiwyg-editor/engine/index.js +3 -1
  254. package/dist/src/nile-wysiwyg-editor/engine/index.js.map +1 -1
  255. package/dist/src/nile-wysiwyg-editor/engine/inputrules.d.ts +0 -5
  256. package/dist/src/nile-wysiwyg-editor/engine/inputrules.js +19 -0
  257. package/dist/src/nile-wysiwyg-editor/engine/inputrules.js.map +1 -1
  258. package/dist/src/nile-wysiwyg-editor/engine/plugins/image-view.js +3 -2
  259. package/dist/src/nile-wysiwyg-editor/engine/plugins/image-view.js.map +1 -1
  260. package/dist/src/nile-wysiwyg-editor/engine/plugins/link.d.ts +4 -0
  261. package/dist/src/nile-wysiwyg-editor/engine/plugins/link.js +56 -1
  262. package/dist/src/nile-wysiwyg-editor/engine/plugins/link.js.map +1 -1
  263. package/dist/src/nile-wysiwyg-editor/engine/plugins/paste.d.ts +5 -0
  264. package/dist/src/nile-wysiwyg-editor/engine/plugins/paste.js +27 -6
  265. package/dist/src/nile-wysiwyg-editor/engine/plugins/paste.js.map +1 -1
  266. package/dist/src/nile-wysiwyg-editor/engine/plugins/tables.js +30 -7
  267. package/dist/src/nile-wysiwyg-editor/engine/plugins/tables.js.map +1 -1
  268. package/dist/src/nile-wysiwyg-editor/engine/pm.test.js +46 -0
  269. package/dist/src/nile-wysiwyg-editor/engine/pm.test.js.map +1 -1
  270. package/dist/src/nile-wysiwyg-editor/engine/sanitize.d.ts +9 -1
  271. package/dist/src/nile-wysiwyg-editor/engine/sanitize.js +730 -7
  272. package/dist/src/nile-wysiwyg-editor/engine/sanitize.js.map +1 -1
  273. package/dist/src/nile-wysiwyg-editor/engine/schema.d.ts +3 -0
  274. package/dist/src/nile-wysiwyg-editor/engine/schema.js +215 -34
  275. package/dist/src/nile-wysiwyg-editor/engine/schema.js.map +1 -1
  276. package/dist/src/nile-wysiwyg-editor/engine/selection-state.js +3 -1
  277. package/dist/src/nile-wysiwyg-editor/engine/selection-state.js.map +1 -1
  278. package/dist/src/nile-wysiwyg-editor/engine/serializer.d.ts +12 -4
  279. package/dist/src/nile-wysiwyg-editor/engine/serializer.js +18 -8
  280. package/dist/src/nile-wysiwyg-editor/engine/serializer.js.map +1 -1
  281. package/dist/src/nile-wysiwyg-editor/nile-wysiwyg-editor-email-fidelity.test.d.ts +1 -0
  282. package/dist/src/nile-wysiwyg-editor/nile-wysiwyg-editor-email-fidelity.test.js +287 -0
  283. package/dist/src/nile-wysiwyg-editor/nile-wysiwyg-editor-email-fidelity.test.js.map +1 -0
  284. package/dist/src/nile-wysiwyg-editor/nile-wysiwyg-editor.css.js +45 -4
  285. package/dist/src/nile-wysiwyg-editor/nile-wysiwyg-editor.css.js.map +1 -1
  286. package/dist/src/nile-wysiwyg-editor/nile-wysiwyg-editor.d.ts +23 -0
  287. package/dist/src/nile-wysiwyg-editor/nile-wysiwyg-editor.js +113 -15
  288. package/dist/src/nile-wysiwyg-editor/nile-wysiwyg-editor.js.map +1 -1
  289. package/dist/src/nile-wysiwyg-editor/nile-wysiwyg-editor.test.js +213 -0
  290. package/dist/src/nile-wysiwyg-editor/nile-wysiwyg-editor.test.js.map +1 -1
  291. package/dist/src/nile-wysiwyg-editor/ui/bookmark-panel.js +2 -2
  292. package/dist/src/nile-wysiwyg-editor/ui/bookmark-panel.js.map +1 -1
  293. package/dist/src/nile-wysiwyg-editor/ui/bubble-menu.js +1 -1
  294. package/dist/src/nile-wysiwyg-editor/ui/bubble-menu.js.map +1 -1
  295. package/dist/src/nile-wysiwyg-editor/ui/embed-menu.js +1 -1
  296. package/dist/src/nile-wysiwyg-editor/ui/embed-menu.js.map +1 -1
  297. package/dist/src/nile-wysiwyg-editor/ui/embed-panel.js +1 -1
  298. package/dist/src/nile-wysiwyg-editor/ui/embed-panel.js.map +1 -1
  299. package/dist/src/nile-wysiwyg-editor/ui/emoji-picker.js +1 -1
  300. package/dist/src/nile-wysiwyg-editor/ui/emoji-picker.js.map +1 -1
  301. package/dist/src/nile-wysiwyg-editor/ui/find-replace.js +1 -1
  302. package/dist/src/nile-wysiwyg-editor/ui/find-replace.js.map +1 -1
  303. package/dist/src/nile-wysiwyg-editor/ui/image-menu.js +1 -1
  304. package/dist/src/nile-wysiwyg-editor/ui/image-menu.js.map +1 -1
  305. package/dist/src/nile-wysiwyg-editor/ui/image-panel.js +1 -1
  306. package/dist/src/nile-wysiwyg-editor/ui/image-panel.js.map +1 -1
  307. package/dist/src/nile-wysiwyg-editor/ui/insert-menu.js +1 -1
  308. package/dist/src/nile-wysiwyg-editor/ui/insert-menu.js.map +1 -1
  309. package/dist/src/nile-wysiwyg-editor/ui/link-editor.js +2 -2
  310. package/dist/src/nile-wysiwyg-editor/ui/link-editor.js.map +1 -1
  311. package/dist/src/nile-wysiwyg-editor/ui/markdown-panel.js +1 -1
  312. package/dist/src/nile-wysiwyg-editor/ui/markdown-panel.js.map +1 -1
  313. package/dist/src/nile-wysiwyg-editor/ui/math-panel.js +1 -1
  314. package/dist/src/nile-wysiwyg-editor/ui/math-panel.js.map +1 -1
  315. package/dist/src/nile-wysiwyg-editor/ui/shortcut-help.js +1 -1
  316. package/dist/src/nile-wysiwyg-editor/ui/shortcut-help.js.map +1 -1
  317. package/dist/src/nile-wysiwyg-editor/ui/source-view.js +2 -2
  318. package/dist/src/nile-wysiwyg-editor/ui/source-view.js.map +1 -1
  319. package/dist/src/nile-wysiwyg-editor/ui/special-chars.js +1 -1
  320. package/dist/src/nile-wysiwyg-editor/ui/special-chars.js.map +1 -1
  321. package/dist/src/nile-wysiwyg-editor/ui/suggest-list.js +14 -3
  322. package/dist/src/nile-wysiwyg-editor/ui/suggest-list.js.map +1 -1
  323. package/dist/src/nile-wysiwyg-editor/ui/table-grid-picker.js +2 -2
  324. package/dist/src/nile-wysiwyg-editor/ui/table-grid-picker.js.map +1 -1
  325. package/dist/src/nile-wysiwyg-editor/ui/table-menu.js +1 -1
  326. package/dist/src/nile-wysiwyg-editor/ui/table-menu.js.map +1 -1
  327. package/dist/src/version.js +1 -1
  328. package/dist/src/version.js.map +1 -1
  329. package/dist/tsconfig.tsbuildinfo +1 -1
  330. package/package.json +2 -1
  331. package/src/index.ts +1 -0
  332. package/src/nile-minimap/index.ts +1 -0
  333. package/src/nile-minimap/nile-minimap.css.ts +164 -0
  334. package/src/nile-minimap/nile-minimap.test.ts +924 -0
  335. package/src/nile-minimap/nile-minimap.ts +796 -0
  336. package/src/nile-wysiwyg-editor/engine/create-state.ts +7 -0
  337. package/src/nile-wysiwyg-editor/engine/email-css.ts +136 -0
  338. package/src/nile-wysiwyg-editor/engine/email-fidelity.test.ts +1347 -0
  339. package/src/nile-wysiwyg-editor/engine/email-render.ts +99 -0
  340. package/src/nile-wysiwyg-editor/engine/html-detect.ts +26 -0
  341. package/src/nile-wysiwyg-editor/engine/index.ts +10 -1
  342. package/src/nile-wysiwyg-editor/engine/inputrules.ts +18 -1
  343. package/src/nile-wysiwyg-editor/engine/plugins/image-view.ts +3 -2
  344. package/src/nile-wysiwyg-editor/engine/plugins/link.ts +58 -2
  345. package/src/nile-wysiwyg-editor/engine/plugins/paste.ts +31 -8
  346. package/src/nile-wysiwyg-editor/engine/plugins/tables.ts +29 -7
  347. package/src/nile-wysiwyg-editor/engine/pm.test.ts +73 -0
  348. package/src/nile-wysiwyg-editor/engine/sanitize.ts +729 -7
  349. package/src/nile-wysiwyg-editor/engine/schema.ts +206 -33
  350. package/src/nile-wysiwyg-editor/engine/selection-state.ts +3 -1
  351. package/src/nile-wysiwyg-editor/engine/serializer.ts +30 -8
  352. package/src/nile-wysiwyg-editor/nile-wysiwyg-editor-email-fidelity.test.ts +357 -0
  353. package/src/nile-wysiwyg-editor/nile-wysiwyg-editor.css.ts +45 -4
  354. package/src/nile-wysiwyg-editor/nile-wysiwyg-editor.test.ts +258 -0
  355. package/src/nile-wysiwyg-editor/nile-wysiwyg-editor.ts +119 -12
  356. package/src/nile-wysiwyg-editor/ui/bookmark-panel.ts +2 -2
  357. package/src/nile-wysiwyg-editor/ui/bubble-menu.ts +1 -1
  358. package/src/nile-wysiwyg-editor/ui/embed-menu.ts +1 -1
  359. package/src/nile-wysiwyg-editor/ui/embed-panel.ts +1 -1
  360. package/src/nile-wysiwyg-editor/ui/emoji-picker.ts +1 -1
  361. package/src/nile-wysiwyg-editor/ui/find-replace.ts +1 -1
  362. package/src/nile-wysiwyg-editor/ui/image-menu.ts +1 -1
  363. package/src/nile-wysiwyg-editor/ui/image-panel.ts +1 -1
  364. package/src/nile-wysiwyg-editor/ui/insert-menu.ts +1 -1
  365. package/src/nile-wysiwyg-editor/ui/link-editor.ts +2 -2
  366. package/src/nile-wysiwyg-editor/ui/markdown-panel.ts +1 -1
  367. package/src/nile-wysiwyg-editor/ui/math-panel.ts +1 -1
  368. package/src/nile-wysiwyg-editor/ui/shortcut-help.ts +1 -1
  369. package/src/nile-wysiwyg-editor/ui/source-view.ts +2 -2
  370. package/src/nile-wysiwyg-editor/ui/special-chars.ts +1 -1
  371. package/src/nile-wysiwyg-editor/ui/suggest-list.ts +14 -3
  372. package/src/nile-wysiwyg-editor/ui/table-grid-picker.ts +2 -2
  373. package/src/nile-wysiwyg-editor/ui/table-menu.ts +1 -1
  374. package/vscode-html-custom-data.json +116 -25
  375. package/web-test-runner.config.mjs +4 -0
  376. package/dist/index-3ca67627.cjs.js +0 -2
  377. package/dist/index-6f3fa4ab.esm.js +0 -1
  378. package/dist/index-7b1c9857.esm.js +0 -1
  379. package/dist/index-89c520e9.cjs.js +0 -5
  380. package/dist/index-89c520e9.cjs.js.map +0 -1
  381. package/dist/index-ba47645d.esm.js +0 -1
  382. package/dist/index-c3210a9c.cjs.js +0 -2
  383. package/dist/index-c3210a9c.cjs.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../../../src/nile-wysiwyg-editor/engine/schema.ts"],"names":[],"mappings":"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","sourcesContent":["import { Schema, NodeSpec, MarkSpec, Attrs, DOMOutputSpec, ParseRule } from 'prosemirror-model';\nimport { addListNodes } from 'prosemirror-schema-list';\nimport { tableNodes } from 'prosemirror-tables';\nimport OrderedMap from 'orderedmap';\nimport { EMBED_SANDBOX, EMBED_REFERRER_POLICY } from './plugins/embeds';\n\nexport type Alignment = 'left' | 'center' | 'right' | 'justify';\n\nconst ALIGN_VALUES: Alignment[] = ['left', 'center', 'right', 'justify'];\n\nfunction getAlignFromDom(dom: HTMLElement): Alignment | null {\n const value = dom.style.textAlign || dom.getAttribute('align') || '';\n return (ALIGN_VALUES as string[]).includes(value) ? (value as Alignment) : null;\n}\n\nfunction alignStyle(align: Alignment | null): string | null {\n return align ? `text-align: ${align}` : null;\n}\n\n/** Indent depth in 40px steps, like CKEditor/Google Docs. */\nexport const INDENT_STEP_PX = 40;\nexport const MAX_INDENT = 8;\n\nfunction getIndentFromDom(dom: HTMLElement): number {\n const raw = dom.style.marginInlineStart || dom.style.marginLeft || '';\n const px = parseFloat(raw);\n if (!Number.isFinite(px) || px <= 0) return 0;\n return Math.min(MAX_INDENT, Math.round(px / INDENT_STEP_PX));\n}\n\n/**\n * Line height as a unitless multiplier string ('1.5'). Percentages are\n * converted; px values pass through as-is so pasted content keeps its look.\n */\nfunction getLineHeightFromDom(dom: HTMLElement): string | null {\n const raw = dom.style.lineHeight.trim();\n if (!raw || raw === 'normal') return null;\n const num = parseFloat(raw);\n if (!Number.isFinite(num) || num <= 0) return null;\n if (raw.endsWith('%')) return String(num / 100);\n return raw;\n}\n\n/** Combined style string for align + indent + line-height textblock attrs. */\nfunction blockStyle(attrs: {\n align?: Alignment | null;\n indent?: number;\n lineHeight?: string | null;\n}): string | null {\n const parts: string[] = [];\n const align = alignStyle(attrs.align ?? null);\n if (align) parts.push(align);\n if (attrs.indent) parts.push(`margin-inline-start: ${attrs.indent * INDENT_STEP_PX}px`);\n if (attrs.lineHeight) parts.push(`line-height: ${attrs.lineHeight}`);\n return parts.length ? parts.join('; ') : null;\n}\n\n/* -------------------------------------------------------------------------\n * Author class / id passthrough\n *\n * Content elements keep the `class` and `id` an author gave them, so class/id\n * CSS (e.g. a scoped author <style> block) can target the document. Values that\n * collide with the editor's own internal names are dropped so content can never\n * impersonate or restyle the chrome; the editor's own classes (emitted in\n * toDOM) are always preserved and merged with the author's.\n * ------------------------------------------------------------------------- */\n\nconst RESERVED_NAME = /^(?:nile-wysiwyg|ProseMirror)/;\n\nexport function cleanClass(value: string | null): string | null {\n if (!value) return null;\n const kept = value.split(/\\s+/).filter(token => token && !RESERVED_NAME.test(token));\n return kept.length ? kept.join(' ') : null;\n}\n\nexport function cleanId(value: string | null): string | null {\n return value && !RESERVED_NAME.test(value) ? value : null;\n}\n\nconst HTML_ATTR_SPEC = { htmlClass: { default: null }, htmlId: { default: null } };\n\nfunction readHtmlAttrs(dom: HTMLElement): { htmlClass: string | null; htmlId: string | null } {\n return {\n htmlClass: cleanClass(dom.getAttribute('class')),\n htmlId: cleanId(dom.getAttribute('id')),\n };\n}\n\n/** Wraps a tag-based parse rule so it also captures author class/id. Rules\n * keyed by `style` (whose getAttrs receives a value string, not an element)\n * pass through untouched. */\nfunction augmentParseRule(rule: ParseRule): ParseRule {\n if (!('tag' in rule) || 'style' in rule) return rule;\n const inner = rule.getAttrs;\n return {\n ...rule,\n getAttrs(dom: HTMLElement) {\n const base = inner ? inner(dom) : null;\n if (base === false) return false;\n return { ...(base ?? {}), ...readHtmlAttrs(dom) };\n },\n } as ParseRule;\n}\n\n/** Wraps a toDOM so stored class/id are written back onto the element, merged\n * with any class the spec emits itself. Handles the `[tag]`, `[tag, attrs]`,\n * `[tag, 0]`, and `[tag, attrs, …children]` output shapes. */\nfunction augmentToDOM(\n toDOM?: (node: { attrs: Attrs }, ...rest: unknown[]) => DOMOutputSpec\n): ((node: { attrs: Attrs }, ...rest: unknown[]) => DOMOutputSpec) | undefined {\n if (!toDOM) return toDOM;\n return (node, ...rest) => {\n const out = toDOM(node, ...rest);\n const cls = node.attrs.htmlClass as string | null;\n const id = node.attrs.htmlId as string | null;\n if (!Array.isArray(out) || (!cls && !id)) return out;\n const [tag, ...tail] = out as unknown[];\n let attrs: Record<string, unknown> = {};\n let children = tail;\n if (tail.length && tail[0] && typeof tail[0] === 'object' && !Array.isArray(tail[0])) {\n attrs = { ...(tail[0] as Record<string, unknown>) };\n children = tail.slice(1);\n }\n if (cls) attrs.class = attrs.class ? `${attrs.class as string} ${cls}` : cls;\n if (id) attrs.id = id;\n return [tag, attrs, ...children] as DOMOutputSpec;\n };\n}\n\n/** Adds `htmlClass`/`htmlId` attrs plus parse/serialize support to a spec. */\nfunction withHtmlAttrs<S extends NodeSpec | MarkSpec>(spec: S): S {\n return {\n ...spec,\n attrs: { ...(spec.attrs ?? {}), ...HTML_ATTR_SPEC },\n parseDOM: spec.parseDOM?.map(augmentParseRule),\n toDOM: augmentToDOM(spec.toDOM as never) as never,\n };\n}\n\n/** Content nodes/marks that carry author class/id. Excludes structural leaves\n * (doc, text), atoms with bespoke DOM (image, embeds, mentions, math, …) and\n * style-only marks (their spans are covered by `html_span`). */\nconst HTML_ATTR_NODES = [\n 'paragraph', 'heading', 'blockquote', 'code_block',\n 'bullet_list', 'ordered_list', 'list_item',\n 'table', 'table_row', 'table_cell', 'table_header',\n];\nconst HTML_ATTR_MARKS = [\n 'link', 'bold', 'italic', 'underline', 'strike', 'code', 'subscript', 'superscript',\n];\n\n/**\n * Block nodes. `align` is modeled as an attribute on textblocks rather than a\n * wrapper node so alignment survives block-type changes (heading <-> paragraph).\n */\nconst nodes: Record<string, NodeSpec> = {\n doc: {\n content: 'block+',\n },\n\n paragraph: {\n content: 'inline*',\n group: 'block',\n attrs: {\n align: { default: null },\n indent: { default: 0 },\n lineHeight: { default: null },\n },\n parseDOM: [\n {\n tag: 'p',\n getAttrs: (dom: HTMLElement) => ({\n align: getAlignFromDom(dom),\n indent: getIndentFromDom(dom),\n lineHeight: getLineHeightFromDom(dom),\n }),\n },\n ],\n toDOM(node) {\n const style = blockStyle(node.attrs);\n return style ? ['p', { style }, 0] : ['p', 0];\n },\n },\n\n heading: {\n content: 'inline*',\n group: 'block',\n defining: true,\n attrs: {\n level: { default: 1 },\n align: { default: null },\n indent: { default: 0 },\n lineHeight: { default: null },\n },\n parseDOM: [1, 2, 3, 4, 5, 6].map(level => ({\n tag: `h${level}`,\n getAttrs: (dom: HTMLElement) => ({\n level,\n align: getAlignFromDom(dom),\n indent: getIndentFromDom(dom),\n lineHeight: getLineHeightFromDom(dom),\n }),\n })),\n toDOM(node) {\n const style = blockStyle(node.attrs);\n return style ? [`h${node.attrs.level}`, { style }, 0] : [`h${node.attrs.level}`, 0];\n },\n },\n\n blockquote: {\n content: 'block+',\n group: 'block',\n defining: true,\n parseDOM: [{ tag: 'blockquote' }],\n toDOM() {\n return ['blockquote', 0];\n },\n },\n\n horizontal_rule: {\n group: 'block',\n parseDOM: [{ tag: 'hr' }],\n toDOM() {\n return ['hr'];\n },\n },\n\n text: {\n group: 'inline',\n },\n\n hard_break: {\n inline: true,\n group: 'inline',\n selectable: false,\n parseDOM: [{ tag: 'br' }],\n toDOM() {\n return ['br'];\n },\n },\n\n code_block: {\n content: 'text*',\n group: 'block',\n marks: '',\n code: true,\n defining: true,\n attrs: { language: { default: null } },\n parseDOM: [\n {\n tag: 'pre',\n preserveWhitespace: 'full',\n getAttrs: (dom: HTMLElement) => ({\n language: dom.getAttribute('data-language'),\n }),\n },\n ],\n toDOM(node) {\n const attrs: Record<string, string> = { class: 'nile-wysiwyg__code-block' };\n if (node.attrs.language) attrs['data-language'] = node.attrs.language;\n return ['pre', attrs, ['code', 0]];\n },\n },\n\n /**\n * ProseMirror's canonical inline image, extended with a `width` attr (px)\n * written by the drag-resize handles.\n */\n image: {\n inline: true,\n group: 'inline',\n draggable: true,\n attrs: {\n src: {},\n alt: { default: null },\n title: { default: null },\n width: { default: null },\n },\n parseDOM: [\n {\n tag: 'img[src]',\n getAttrs: (dom: HTMLElement) => {\n const styleWidth = parseFloat(dom.style.width);\n const attrWidth = parseFloat(dom.getAttribute('width') ?? '');\n const width = Number.isFinite(styleWidth)\n ? Math.round(styleWidth)\n : Number.isFinite(attrWidth)\n ? Math.round(attrWidth)\n : null;\n return {\n src: dom.getAttribute('src'),\n alt: dom.getAttribute('alt'),\n title: dom.getAttribute('title'),\n width: width && width > 0 ? width : null,\n };\n },\n },\n ],\n toDOM(node) {\n const { src, alt, title, width } = node.attrs;\n const attrs: Record<string, string> = { src };\n if (alt) attrs.alt = alt;\n if (title) attrs.title = title;\n if (width) attrs.style = `width: ${width}px`;\n return ['img', attrs];\n },\n },\n\n /**\n * Captioned image: a block figure whose inline content is the caption. The\n * image itself lives in the attrs (TipTap-style), so the node stays valid\n * ProseMirror content — a node can't mix an inline img child with a block\n * figcaption child.\n */\n figure: {\n group: 'block',\n content: 'inline*',\n defining: true,\n isolating: true,\n attrs: {\n src: {},\n alt: { default: null },\n title: { default: null },\n width: { default: null },\n align: { default: null },\n },\n parseDOM: [\n {\n tag: 'figure',\n contentElement: 'figcaption',\n getAttrs: (dom: HTMLElement) => {\n const img = dom.querySelector('img[src]') as HTMLElement | null;\n if (!img) return false;\n const styleWidth = parseFloat(img.style.width || dom.style.width);\n const align = dom.getAttribute('data-align');\n return {\n src: img.getAttribute('src'),\n alt: img.getAttribute('alt'),\n title: img.getAttribute('title'),\n width:\n Number.isFinite(styleWidth) && styleWidth > 0\n ? Math.round(styleWidth)\n : null,\n align: align === 'left' || align === 'center' || align === 'right' ? align : null,\n };\n },\n },\n ],\n toDOM(node) {\n const { src, alt, title, width, align } = node.attrs;\n const figureAttrs: Record<string, string> = { class: 'nile-wysiwyg__figure' };\n if (align) figureAttrs['data-align'] = align;\n const styles: string[] = [];\n if (width) styles.push(`width: ${width}px`);\n if (align === 'center') styles.push('margin-left: auto; margin-right: auto');\n else if (align === 'right') styles.push('margin-left: auto; margin-right: 0');\n if (styles.length) figureAttrs.style = styles.join('; ');\n const imgAttrs: Record<string, string> = { src, style: 'width: 100%' };\n if (alt) imgAttrs.alt = alt;\n if (title) imgAttrs.title = title;\n return [\n 'figure',\n figureAttrs,\n ['img', imgAttrs],\n ['figcaption', { class: 'nile-wysiwyg__figcaption' }, 0],\n ];\n },\n },\n\n /**\n * Checklists. Serialized as <ul data-task-list><li data-task-item\n * data-checked> so they survive HTML round-trips; the live checkbox is an\n * editor-only NodeView. parseDOM priority 51 beats the generic li rule.\n */\n task_list: {\n content: 'task_item+',\n group: 'block',\n parseDOM: [{ tag: 'ul[data-task-list]', priority: 51 }],\n toDOM() {\n return ['ul', { 'data-task-list': 'true', class: 'nile-wysiwyg__task-list' }, 0];\n },\n },\n\n task_item: {\n content: 'paragraph block*',\n defining: true,\n attrs: { checked: { default: false } },\n parseDOM: [\n {\n tag: 'li[data-task-item]',\n priority: 51,\n getAttrs: (dom: HTMLElement) => ({\n checked: dom.getAttribute('data-checked') === 'true',\n }),\n },\n ],\n toDOM(node) {\n return [\n 'li',\n {\n 'data-task-item': 'true',\n 'data-checked': String(node.attrs.checked),\n class: 'nile-wysiwyg__task-item',\n },\n 0,\n ];\n },\n },\n\n /**\n * Provider embeds (YouTube/Vimeo/Loom) as block atoms. The iframe sits in\n * a wrapper div for aspect-ratio styling and a click-to-select overlay.\n */\n embed: {\n group: 'block',\n atom: true,\n selectable: true,\n draggable: true,\n attrs: {\n src: {},\n provider: { default: null },\n title: { default: null },\n /** Rendered width in px (drag-resize); null = default size. */\n width: { default: null },\n /** Block alignment: 'left' | 'center' | 'right' | null. */\n align: { default: null },\n },\n parseDOM: [\n {\n tag: 'div[data-embed-provider]',\n getAttrs: (dom: HTMLElement) => {\n const iframe = dom.querySelector('iframe[src]');\n if (!iframe) return false;\n const widthAttr =\n dom.getAttribute('data-width') ?? /^(\\d+)px$/.exec(dom.style.width)?.[1];\n const width = widthAttr ? parseInt(widthAttr, 10) : NaN;\n const align = dom.getAttribute('data-align');\n return {\n src: iframe.getAttribute('src'),\n provider: dom.getAttribute('data-embed-provider'),\n title: iframe.getAttribute('title'),\n width: Number.isFinite(width) && width > 0 ? width : null,\n align: align === 'left' || align === 'center' || align === 'right' ? align : null,\n };\n },\n },\n {\n tag: 'iframe[src]',\n getAttrs: (dom: HTMLElement) => {\n const width = parseInt(dom.getAttribute('width') ?? '', 10);\n return {\n src: dom.getAttribute('src'),\n title: dom.getAttribute('title'),\n width: Number.isFinite(width) && width > 0 ? width : null,\n };\n },\n },\n ],\n toDOM(node) {\n const { src, provider, title, width, align } = node.attrs;\n const iframeAttrs: Record<string, string> = {\n src,\n frameborder: '0',\n allowfullscreen: 'true',\n allow: 'accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture',\n sandbox: EMBED_SANDBOX,\n referrerpolicy: EMBED_REFERRER_POLICY,\n };\n if (title) iframeAttrs.title = title;\n const wrapperAttrs: Record<string, string> = {\n class: 'nile-wysiwyg__embed',\n 'data-embed-provider': provider ?? 'generic',\n };\n const styles: string[] = [];\n if (width) {\n wrapperAttrs['data-width'] = String(width);\n styles.push(`width: ${width}px`, 'max-width: 100%');\n }\n if (align) {\n wrapperAttrs['data-align'] = align;\n if (align === 'center') styles.push('margin-left: auto', 'margin-right: auto');\n else if (align === 'right') styles.push('margin-left: auto', 'margin-right: 0');\n }\n if (styles.length) wrapperAttrs.style = styles.join('; ');\n return ['div', wrapperAttrs, ['iframe', iframeAttrs]];\n },\n },\n\n /**\n * Author-supplied `<style>` block, entered via the HTML source view. The CSS\n * is sanitized on the way in (see sanitizeCss) — `@import`, `expression()`\n * and external `url()` are neutralized — then stored verbatim and serialized\n * straight back to a `<style>` element. A node view renders it live in the\n * editor with a small chip so the otherwise-invisible block stays selectable.\n */\n styleBlock: {\n group: 'block',\n atom: true,\n selectable: true,\n attrs: { css: { default: '' } },\n parseDOM: [\n {\n tag: 'style',\n getAttrs: (dom: HTMLElement) => ({ css: dom.textContent ?? '' }),\n },\n ],\n toDOM(node) {\n return ['style', node.attrs.css];\n },\n },\n\n /**\n * Bookmark: a named in-text anchor (`<a id=\"…\">`) for intra-document\n * navigation. Invisible in serialized output; the editor draws a flag\n * marker via CSS so it can be selected and deleted.\n */\n bookmark: {\n inline: true,\n group: 'inline',\n atom: true,\n selectable: true,\n attrs: { id: {} },\n parseDOM: [\n {\n tag: 'a[data-bookmark]',\n priority: 60,\n getAttrs: (dom: HTMLElement) => {\n const id = dom.getAttribute('id') || dom.getAttribute('name');\n return id ? { id } : false;\n },\n },\n // Anchors without an href are bookmarks (`<a id>` / legacy `<a name>`).\n {\n tag: 'a[id]',\n getAttrs: (dom: HTMLElement) =>\n dom.hasAttribute('href') ? false : { id: dom.getAttribute('id') },\n },\n {\n tag: 'a[name]',\n getAttrs: (dom: HTMLElement) =>\n dom.hasAttribute('href') ? false : { id: dom.getAttribute('name') },\n },\n ],\n toDOM(node) {\n return ['a', { id: node.attrs.id, 'data-bookmark': 'true' }];\n },\n },\n\n /** Inline atom for @-style mentions. The label renders as `${trigger}${label}`. */\n mention: {\n inline: true,\n group: 'inline',\n atom: true,\n selectable: true,\n attrs: {\n trigger: { default: '@' },\n key: {},\n label: {},\n },\n parseDOM: [\n {\n tag: 'span[data-mention-key]',\n getAttrs: (dom: HTMLElement) => ({\n trigger: dom.getAttribute('data-mention-trigger') || '@',\n key: dom.getAttribute('data-mention-key'),\n label:\n dom.getAttribute('data-mention-label') || dom.textContent?.slice(1) || '',\n }),\n },\n ],\n toDOM(node) {\n const { trigger, key, label } = node.attrs;\n return [\n 'span',\n {\n class: 'nile-wysiwyg__mention',\n 'data-mention-trigger': trigger,\n 'data-mention-key': key,\n 'data-mention-label': label,\n },\n `${trigger}${label}`,\n ];\n },\n },\n\n /**\n * Merge field: an inline atom placeholder for mail-merge / personalization\n * (e.g. `{{first_name}}`). Stores a stable `id` and a human `label`; renders\n * the label (falling back to `{{id}}`) as a non-editable chip.\n */\n merge_field: {\n inline: true,\n group: 'inline',\n atom: true,\n selectable: true,\n attrs: { id: {}, label: { default: null } },\n parseDOM: [\n {\n tag: 'span[data-merge-field]',\n getAttrs: (dom: HTMLElement) => {\n const id = dom.getAttribute('data-merge-field');\n if (!id) return false;\n return {\n id,\n label: dom.getAttribute('data-merge-label') || dom.textContent || null,\n };\n },\n },\n ],\n toDOM(node) {\n const { id, label } = node.attrs;\n return [\n 'span',\n {\n class: 'nile-wysiwyg__merge-field',\n 'data-merge-field': id,\n 'data-merge-label': label ?? '',\n },\n label || `{{${id}}}`,\n ];\n },\n },\n\n /**\n * Math: an inline atom holding a LaTeX source string. Rendering is pluggable\n * via the editor's `mathRenderer` (KaTeX/MathJax, or MathML). Without a\n * renderer the raw LaTeX is shown in a math-styled chip. `display` chooses\n * inline vs. block presentation.\n */\n math: {\n inline: true,\n group: 'inline',\n atom: true,\n selectable: true,\n attrs: { latex: {}, display: { default: 'inline' } },\n parseDOM: [\n {\n tag: 'span[data-math]',\n getAttrs: (dom: HTMLElement) => ({\n latex: dom.getAttribute('data-math') || dom.textContent || '',\n display: dom.getAttribute('data-math-display') === 'block' ? 'block' : 'inline',\n }),\n },\n ],\n toDOM(node) {\n const { latex, display } = node.attrs;\n return [\n 'span',\n {\n class: 'nile-wysiwyg__math',\n 'data-math': latex,\n 'data-math-display': display,\n },\n latex,\n ];\n },\n },\n};\n\n/** Table nodes from prosemirror-tables, with cell background support. */\nconst tableNodeSpecs = tableNodes({\n tableGroup: 'block',\n cellContent: 'block+',\n cellAttributes: {\n background: {\n default: null,\n getFromDOM(dom) {\n return (dom as HTMLElement).style.backgroundColor || null;\n },\n setDOMAttr(value, attrs) {\n if (value) {\n attrs.style = `${(attrs.style as string) || ''}background-color: ${value};`;\n }\n },\n },\n },\n});\n\n/**\n * The table spec extended with a `layout` attr: layout tables (structured\n * layouts, e.g. for email HTML) serialize as `role=\"presentation\"` and render\n * borderless, with dashed guides visible only while editing.\n */\nconst baseTableSpec = tableNodeSpecs.table;\nconst tableSpec: NodeSpec = {\n ...baseTableSpec,\n attrs: { ...(baseTableSpec.attrs ?? {}), layout: { default: false } },\n parseDOM: [\n {\n tag: 'table',\n getAttrs: (dom: HTMLElement) => ({\n layout:\n dom.getAttribute('role') === 'presentation' || dom.hasAttribute('data-layout'),\n }),\n },\n ],\n toDOM(node) {\n return node.attrs.layout\n ? ['table', { role: 'presentation', 'data-layout': 'true' }, ['tbody', 0]]\n : ['table', ['tbody', 0]];\n },\n};\n\n/**\n * Marks. Order matters: marks later in the map render closer to the text.\n * Each styling mark parses from both semantic tags AND inline `style=`\n * declarations so pasted Word/Google Docs content keeps its formatting.\n */\nconst marks: Record<string, MarkSpec> = {\n link: {\n attrs: {\n href: {},\n title: { default: null },\n target: { default: null },\n },\n inclusive: false,\n parseDOM: [\n {\n tag: 'a[href]',\n getAttrs: (dom: HTMLElement) => ({\n href: dom.getAttribute('href'),\n title: dom.getAttribute('title'),\n target: dom.getAttribute('target'),\n }),\n },\n ],\n toDOM(mark) {\n const { href, title, target } = mark.attrs;\n const attrs: Record<string, string> = { href };\n if (title) attrs.title = title;\n if (target) {\n attrs.target = target;\n if (target === '_blank') attrs.rel = 'noopener noreferrer';\n }\n return ['a', attrs, 0];\n },\n },\n\n bold: {\n parseDOM: [\n { tag: 'strong' },\n // Google Docs wraps everything in <b style=\"font-weight: normal\">\n {\n tag: 'b',\n getAttrs: (dom: HTMLElement) => dom.style.fontWeight !== 'normal' && null,\n },\n {\n style: 'font-weight',\n getAttrs: (value: string) => /^(bold(er)?|[5-9]\\d{2,})$/.test(value) && null,\n },\n ],\n toDOM() {\n return ['strong', 0];\n },\n },\n\n italic: {\n parseDOM: [\n { tag: 'i' },\n { tag: 'em' },\n { style: 'font-style=italic' },\n ],\n toDOM() {\n return ['em', 0];\n },\n },\n\n underline: {\n parseDOM: [\n { tag: 'u' },\n {\n style: 'text-decoration',\n getAttrs: (value: string) => value.includes('underline') && null,\n },\n {\n style: 'text-decoration-line',\n getAttrs: (value: string) => value.includes('underline') && null,\n },\n ],\n toDOM() {\n return ['u', 0];\n },\n },\n\n strike: {\n parseDOM: [\n { tag: 's' },\n { tag: 'strike' },\n { tag: 'del' },\n {\n style: 'text-decoration',\n getAttrs: (value: string) => value.includes('line-through') && null,\n },\n {\n style: 'text-decoration-line',\n getAttrs: (value: string) => value.includes('line-through') && null,\n },\n ],\n toDOM() {\n return ['s', 0];\n },\n },\n\n /** Mutually exclusive vertical-shift marks (formulas, footnote refs). */\n subscript: {\n excludes: 'subscript superscript',\n parseDOM: [{ tag: 'sub' }, { style: 'vertical-align=sub' }],\n toDOM() {\n return ['sub', 0];\n },\n },\n\n superscript: {\n excludes: 'subscript superscript',\n parseDOM: [{ tag: 'sup' }, { style: 'vertical-align=super' }],\n toDOM() {\n return ['sup', 0];\n },\n },\n\n code: {\n parseDOM: [{ tag: 'code' }],\n toDOM() {\n return ['code', { class: 'nile-wysiwyg__inline-code' }, 0];\n },\n },\n\n /** Carries an author `class`/`id` on an inline `<span>` that has no other\n * meaning, so class/id CSS can target runs of text. Low priority so styled\n * spans (color/font marks) and atom spans (mention/merge/math) win. */\n html_span: {\n attrs: { htmlClass: { default: null }, htmlId: { default: null } },\n parseDOM: [\n {\n tag: 'span',\n priority: 5,\n getAttrs: (dom: HTMLElement) => {\n const htmlClass = cleanClass(dom.getAttribute('class'));\n const htmlId = cleanId(dom.getAttribute('id'));\n return htmlClass || htmlId ? { htmlClass, htmlId } : false;\n },\n },\n ],\n toDOM(mark) {\n const attrs: Record<string, string> = {};\n if (mark.attrs.htmlClass) attrs.class = mark.attrs.htmlClass;\n if (mark.attrs.htmlId) attrs.id = mark.attrs.htmlId;\n return ['span', attrs, 0];\n },\n },\n\n text_color: {\n attrs: { color: {} },\n parseDOM: [\n {\n style: 'color',\n getAttrs: (value: string) => (value ? { color: value } : false),\n },\n ],\n toDOM(mark) {\n return ['span', { style: `color: ${mark.attrs.color}` }, 0];\n },\n },\n\n bg_color: {\n attrs: { color: {} },\n parseDOM: [\n {\n style: 'background-color',\n getAttrs: (value: string) =>\n value && value !== 'transparent' ? { color: value } : false,\n },\n ],\n toDOM(mark) {\n return ['span', { style: `background-color: ${mark.attrs.color}` }, 0];\n },\n },\n\n font_family: {\n attrs: { family: {} },\n parseDOM: [\n {\n style: 'font-family',\n getAttrs: (value: string) => (value ? { family: value } : false),\n },\n ],\n toDOM(mark) {\n return ['span', { style: `font-family: ${mark.attrs.family}` }, 0];\n },\n },\n\n font_size: {\n attrs: { size: {} },\n parseDOM: [\n {\n style: 'font-size',\n getAttrs: (value: string) => (value ? { size: value } : false),\n },\n ],\n toDOM(mark) {\n return ['span', { style: `font-size: ${mark.attrs.size}` }, 0];\n },\n },\n};\n\n/** Bullet markers CSS understands; anything else falls back to default. */\nexport const BULLET_STYLES = ['disc', 'circle', 'square'] as const;\n\n/** Numbering styles, keyed by the HTML `type` attribute letter. */\nexport const ORDERED_STYLES: Record<string, string> = {\n '1': 'decimal',\n a: 'lower-alpha',\n A: 'upper-alpha',\n i: 'lower-roman',\n I: 'upper-roman',\n};\n\nconst STYLE_TO_TYPE: Record<string, string> = Object.fromEntries(\n Object.entries(ORDERED_STYLES).map(([type, style]) => [style, type])\n);\n\n/**\n * Legal-style continuous numbering (1, 1.1, 1.1.1). Not a CSS\n * list-style-type: it serializes as `data-list-style=\"multilevel\"` and is\n * rendered with CSS counters (see the editor stylesheet). Consumers rendering\n * the output need the same counter rules.\n */\nexport const MULTILEVEL_STYLE = 'multilevel';\n\n/** List specs from prosemirror-schema-list, extended with style attrs. */\nconst bulletListSpec: NodeSpec = {\n content: 'list_item+',\n group: 'block',\n attrs: { style: { default: null } },\n parseDOM: [\n {\n tag: 'ul',\n getAttrs: (dom: HTMLElement) => {\n const style = dom.style.listStyleType;\n return {\n style: (BULLET_STYLES as readonly string[]).includes(style) ? style : null,\n };\n },\n },\n ],\n toDOM(node) {\n return node.attrs.style\n ? ['ul', { style: `list-style-type: ${node.attrs.style}` }, 0]\n : ['ul', 0];\n },\n};\n\nconst orderedListSpec: NodeSpec = {\n content: 'list_item+',\n group: 'block',\n attrs: { order: { default: 1 }, style: { default: null } },\n parseDOM: [\n {\n tag: 'ol',\n getAttrs: (dom: HTMLElement) => {\n const type = dom.getAttribute('type') ?? '';\n const cssStyle = dom.style.listStyleType;\n const style =\n dom.getAttribute('data-list-style') === MULTILEVEL_STYLE\n ? MULTILEVEL_STYLE\n : ORDERED_STYLES[type] ??\n (Object.values(ORDERED_STYLES).includes(cssStyle) ? cssStyle : null);\n const start = Number(dom.getAttribute('start'));\n return {\n order: Number.isFinite(start) && start > 0 ? start : 1,\n style,\n };\n },\n },\n ],\n toDOM(node) {\n const attrs: Record<string, string> = {};\n if (node.attrs.order !== 1) attrs.start = String(node.attrs.order);\n if (node.attrs.style === MULTILEVEL_STYLE) {\n attrs['data-list-style'] = MULTILEVEL_STYLE;\n } else if (node.attrs.style && STYLE_TO_TYPE[node.attrs.style]) {\n attrs.type = STYLE_TO_TYPE[node.attrs.style];\n }\n return ['ol', attrs, 0];\n },\n};\n\n/** Builds the editor schema. List nodes are added via prosemirror-schema-list. */\nexport function createSchema(): Schema {\n let nodeMap = addListNodes(OrderedMap.from(nodes), 'paragraph block*', 'block')\n .update('bullet_list', bulletListSpec)\n .update('ordered_list', orderedListSpec)\n .append(tableNodeSpecs)\n .update('table', tableSpec);\n // Thread author class/id through the content nodes and marks (applied last so\n // it also wraps the list/table specs pulled in from external packages).\n for (const name of HTML_ATTR_NODES) {\n const spec = nodeMap.get(name);\n if (spec) nodeMap = nodeMap.update(name, withHtmlAttrs(spec));\n }\n let markMap = OrderedMap.from<MarkSpec>(marks);\n for (const name of HTML_ATTR_MARKS) {\n const spec = markMap.get(name);\n if (spec) markMap = markMap.update(name, withHtmlAttrs(spec));\n }\n return new Schema({ nodes: nodeMap, marks: markMap });\n}\n\n/** A shared default schema instance. */\nexport const defaultSchema = createSchema();\n"]}
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../../../src/nile-wysiwyg-editor/engine/schema.ts"],"names":[],"mappings":"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","sourcesContent":["import { Schema, NodeSpec, MarkSpec, Attrs, DOMOutputSpec, ParseRule } from 'prosemirror-model';\nimport { addListNodes } from 'prosemirror-schema-list';\nimport { tableNodes } from 'prosemirror-tables';\nimport OrderedMap from 'orderedmap';\nimport { EMBED_SANDBOX, EMBED_REFERRER_POLICY } from './plugins/embeds';\nimport { sanitizeExtraStyleForWrite } from './email-css';\nimport { sanitizeTableTextStyleForWrite } from './sanitize';\n\nexport type Alignment = 'left' | 'center' | 'right' | 'justify';\n\nconst ALIGN_VALUES: Alignment[] = ['left', 'center', 'right', 'justify'];\n\n/** Keywords a cell's `text-align` attr may hold (email-fidelity). */\nconst CELL_ALIGN_KEYWORDS = new Set(['left', 'center', 'right', 'justify', 'start', 'end']);\n\nfunction getAlignFromDom(dom: HTMLElement): Alignment | null {\n const value = dom.style.textAlign || dom.getAttribute('align') || '';\n return (ALIGN_VALUES as string[]).includes(value) ? (value as Alignment) : null;\n}\n\nfunction alignStyle(align: Alignment | null): string | null {\n return align ? `text-align: ${align}` : null;\n}\n\n/** Image/figure width: a number is px, a `<n>%` string a percentage. */\nconst IMAGE_PERCENT = /^(\\d{1,3}(?:\\.\\d{1,2})?)%$/;\n\nexport function imageWidthCss(width: number | string | null): string | null {\n if (typeof width === 'number') return width > 0 ? `${width}px` : null;\n if (typeof width === 'string') {\n const match = IMAGE_PERCENT.exec(width.trim());\n if (match) {\n const n = parseFloat(match[1]);\n if (n > 0 && n <= 100) return width.trim();\n }\n }\n return null;\n}\n\n/** Reads an img/figure width: a valid `<n>%` keeps the string, else px rounds. */\nfunction imageWidthFromDom(styleWidth: string, attrWidth?: string): number | string | null {\n const trimmed = styleWidth.trim();\n // A percentage style width is kept only in range; an out-of-range/invalid one\n // (e.g. '150%') is dropped rather than silently reinterpreted as px.\n if (trimmed.endsWith('%')) {\n const match = IMAGE_PERCENT.exec(trimmed);\n if (match) {\n const n = parseFloat(match[1]);\n if (n > 0 && n <= 100) return trimmed;\n }\n return null;\n }\n const sw = parseFloat(styleWidth);\n const aw = parseFloat(attrWidth ?? '');\n const px = Number.isFinite(sw) ? Math.round(sw) : Number.isFinite(aw) ? Math.round(aw) : null;\n return px && px > 0 ? px : null;\n}\n\n/** Indent depth in 40px steps, like CKEditor/Google Docs. */\nexport const INDENT_STEP_PX = 40;\nexport const MAX_INDENT = 8;\n\nfunction getIndentFromDom(dom: HTMLElement): number {\n const raw = dom.style.marginInlineStart || dom.style.marginLeft || '';\n const px = parseFloat(raw);\n if (!Number.isFinite(px) || px <= 0) return 0;\n return Math.min(MAX_INDENT, Math.round(px / INDENT_STEP_PX));\n}\n\n/**\n * Line height as a unitless multiplier string ('1.5'). Percentages are\n * converted; px values pass through as-is so pasted content keeps its look.\n */\nfunction getLineHeightFromDom(dom: HTMLElement): string | null {\n const raw = dom.style.lineHeight.trim();\n if (!raw || raw === 'normal') return null;\n const num = parseFloat(raw);\n if (!Number.isFinite(num) || num <= 0) return null;\n if (raw.endsWith('%')) return String(num / 100);\n return raw;\n}\n\n/** Fidelity block margin, stored as a ready-to-emit declaration string. */\nfunction getMarginFromDom(dom: HTMLElement): string | null {\n const s = dom.style;\n if (s.margin) return `margin: ${s.margin}`;\n const parts: string[] = [];\n if (s.marginTop) parts.push(`margin-top: ${s.marginTop}`);\n if (s.marginBottom) parts.push(`margin-bottom: ${s.marginBottom}`);\n return parts.length ? parts.join('; ') : null;\n}\n\n/** Combined style string for margin + align + indent + line-height textblock attrs. */\nfunction blockStyle(attrs: {\n align?: Alignment | null;\n indent?: number;\n lineHeight?: string | null;\n margin?: string | null;\n extraStyle?: string | null;\n}): string | null {\n const parts: string[] = [];\n if (attrs.margin) parts.push(attrs.margin);\n const align = alignStyle(attrs.align ?? null);\n if (align) parts.push(align);\n if (attrs.indent) parts.push(`margin-inline-start: ${attrs.indent * INDENT_STEP_PX}px`);\n if (attrs.lineHeight) parts.push(`line-height: ${attrs.lineHeight}`);\n // Per-app extension declarations, re-validated against the permanent denylist\n // + value grammar (the singleton schema can't see the per-app allowlist).\n if (attrs.extraStyle) {\n const safe = sanitizeExtraStyleForWrite(attrs.extraStyle);\n if (safe) parts.push(safe);\n }\n return parts.length ? parts.join('; ') : null;\n}\n\n/* -------------------------------------------------------------------------\n * Author class / id passthrough\n *\n * Content elements keep the `class` and `id` an author gave them, so class/id\n * CSS (e.g. a scoped author <style> block) can target the document. Values that\n * collide with the editor's own internal names are dropped so content can never\n * impersonate or restyle the chrome; the editor's own classes (emitted in\n * toDOM) are always preserved and merged with the author's.\n * ------------------------------------------------------------------------- */\n\nconst RESERVED_NAME = /^(?:nile-wysiwyg|ProseMirror)/;\n\nexport function cleanClass(value: string | null): string | null {\n if (!value) return null;\n const kept = value.split(/\\s+/).filter(token => token && !RESERVED_NAME.test(token));\n return kept.length ? kept.join(' ') : null;\n}\n\nexport function cleanId(value: string | null): string | null {\n return value && !RESERVED_NAME.test(value) ? value : null;\n}\n\nconst HTML_ATTR_SPEC = { htmlClass: { default: null }, htmlId: { default: null } };\n\nfunction readHtmlAttrs(dom: HTMLElement): { htmlClass: string | null; htmlId: string | null } {\n return {\n htmlClass: cleanClass(dom.getAttribute('class')),\n htmlId: cleanId(dom.getAttribute('id')),\n };\n}\n\n/** Wraps a tag-based parse rule so it also captures author class/id. Rules\n * keyed by `style` (whose getAttrs receives a value string, not an element)\n * pass through untouched. */\nfunction augmentParseRule(rule: ParseRule): ParseRule {\n if (!('tag' in rule) || 'style' in rule) return rule;\n const inner = rule.getAttrs;\n return {\n ...rule,\n getAttrs(dom: HTMLElement) {\n const base = inner ? inner(dom) : null;\n if (base === false) return false;\n return { ...(base ?? {}), ...readHtmlAttrs(dom) };\n },\n } as ParseRule;\n}\n\n/** Wraps a toDOM so stored class/id are written back onto the element, merged\n * with any class the spec emits itself. Handles the `[tag]`, `[tag, attrs]`,\n * `[tag, 0]`, and `[tag, attrs, …children]` output shapes. */\nfunction augmentToDOM(\n toDOM?: (node: { attrs: Attrs }, ...rest: unknown[]) => DOMOutputSpec\n): ((node: { attrs: Attrs }, ...rest: unknown[]) => DOMOutputSpec) | undefined {\n if (!toDOM) return toDOM;\n return (node, ...rest) => {\n const out = toDOM(node, ...rest);\n const cls = node.attrs.htmlClass as string | null;\n const id = node.attrs.htmlId as string | null;\n if (!Array.isArray(out) || (!cls && !id)) return out;\n const [tag, ...tail] = out as unknown[];\n let attrs: Record<string, unknown> = {};\n let children = tail;\n if (tail.length && tail[0] && typeof tail[0] === 'object' && !Array.isArray(tail[0])) {\n attrs = { ...(tail[0] as Record<string, unknown>) };\n children = tail.slice(1);\n }\n if (cls) attrs.class = attrs.class ? `${attrs.class as string} ${cls}` : cls;\n if (id) attrs.id = id;\n return [tag, attrs, ...children] as DOMOutputSpec;\n };\n}\n\n/** Adds `htmlClass`/`htmlId` attrs plus parse/serialize support to a spec. */\nfunction withHtmlAttrs<S extends NodeSpec | MarkSpec>(spec: S): S {\n return {\n ...spec,\n attrs: { ...(spec.attrs ?? {}), ...HTML_ATTR_SPEC },\n parseDOM: spec.parseDOM?.map(augmentParseRule),\n toDOM: augmentToDOM(spec.toDOM as never) as never,\n };\n}\n\n/** Content nodes/marks that carry author class/id. Excludes structural leaves\n * (doc, text), atoms with bespoke DOM (image, embeds, mentions, math, …) and\n * style-only marks (their spans are covered by `html_span`). */\nconst HTML_ATTR_NODES = [\n 'paragraph', 'heading', 'blockquote', 'code_block',\n 'bullet_list', 'ordered_list', 'list_item',\n 'table', 'table_row', 'table_cell', 'table_header',\n];\nconst HTML_ATTR_MARKS = [\n 'link', 'bold', 'italic', 'underline', 'strike', 'code', 'subscript', 'superscript',\n];\n\n/**\n * Block nodes. `align` is modeled as an attribute on textblocks rather than a\n * wrapper node so alignment survives block-type changes (heading <-> paragraph).\n */\nconst nodes: Record<string, NodeSpec> = {\n doc: {\n content: 'block+',\n },\n\n paragraph: {\n content: 'inline*',\n group: 'block',\n attrs: {\n align: { default: null },\n indent: { default: 0 },\n lineHeight: { default: null },\n margin: { default: null },\n extraStyle: { default: null },\n },\n parseDOM: [\n {\n tag: 'p',\n getAttrs: (dom: HTMLElement) => ({\n align: getAlignFromDom(dom),\n indent: getIndentFromDom(dom),\n lineHeight: getLineHeightFromDom(dom),\n margin: getMarginFromDom(dom),\n extraStyle: dom.getAttribute('data-extra-style'),\n }),\n },\n ],\n toDOM(node) {\n const style = blockStyle(node.attrs);\n return style ? ['p', { style }, 0] : ['p', 0];\n },\n },\n\n heading: {\n content: 'inline*',\n group: 'block',\n defining: true,\n attrs: {\n level: { default: 1 },\n align: { default: null },\n indent: { default: 0 },\n lineHeight: { default: null },\n margin: { default: null },\n extraStyle: { default: null },\n },\n parseDOM: [1, 2, 3, 4, 5, 6].map(level => ({\n tag: `h${level}`,\n getAttrs: (dom: HTMLElement) => ({\n level,\n align: getAlignFromDom(dom),\n indent: getIndentFromDom(dom),\n lineHeight: getLineHeightFromDom(dom),\n margin: getMarginFromDom(dom),\n extraStyle: dom.getAttribute('data-extra-style'),\n }),\n })),\n toDOM(node) {\n const style = blockStyle(node.attrs);\n return style ? [`h${node.attrs.level}`, { style }, 0] : [`h${node.attrs.level}`, 0];\n },\n },\n\n blockquote: {\n content: 'block+',\n group: 'block',\n defining: true,\n parseDOM: [{ tag: 'blockquote' }],\n toDOM() {\n return ['blockquote', 0];\n },\n },\n\n horizontal_rule: {\n group: 'block',\n parseDOM: [{ tag: 'hr' }],\n toDOM() {\n return ['hr'];\n },\n },\n\n text: {\n group: 'inline',\n },\n\n hard_break: {\n inline: true,\n group: 'inline',\n selectable: false,\n parseDOM: [{ tag: 'br' }],\n toDOM() {\n return ['br'];\n },\n },\n\n code_block: {\n content: 'text*',\n group: 'block',\n marks: '',\n code: true,\n defining: true,\n attrs: { language: { default: null } },\n parseDOM: [\n {\n tag: 'pre',\n preserveWhitespace: 'full',\n getAttrs: (dom: HTMLElement) => ({\n language: dom.getAttribute('data-language'),\n }),\n },\n ],\n toDOM(node) {\n const attrs: Record<string, string> = { class: 'nile-wysiwyg__code-block' };\n if (node.attrs.language) attrs['data-language'] = node.attrs.language;\n return ['pre', attrs, ['code', 0]];\n },\n },\n\n /** Inline image with a `width` attr (px number or `<n>%`). */\n image: {\n inline: true,\n group: 'inline',\n draggable: true,\n attrs: {\n src: {},\n alt: { default: null },\n title: { default: null },\n width: { default: null },\n },\n parseDOM: [\n {\n tag: 'img[src]',\n getAttrs: (dom: HTMLElement) => ({\n src: dom.getAttribute('src'),\n alt: dom.getAttribute('alt'),\n title: dom.getAttribute('title'),\n width: imageWidthFromDom(dom.style.width, dom.getAttribute('width') ?? ''),\n }),\n },\n ],\n toDOM(node) {\n const { src, alt, title, width } = node.attrs;\n const attrs: Record<string, string> = { src };\n if (alt) attrs.alt = alt;\n if (title) attrs.title = title;\n const css = imageWidthCss(width);\n if (css) attrs.style = `width: ${css}`;\n return ['img', attrs];\n },\n },\n\n /**\n * Captioned image: a block figure whose inline content is the caption. The\n * image itself lives in the attrs (TipTap-style), so the node stays valid\n * ProseMirror content — a node can't mix an inline img child with a block\n * figcaption child.\n */\n figure: {\n group: 'block',\n content: 'inline*',\n defining: true,\n isolating: true,\n attrs: {\n src: {},\n alt: { default: null },\n title: { default: null },\n width: { default: null },\n align: { default: null },\n },\n parseDOM: [\n {\n tag: 'figure',\n contentElement: 'figcaption',\n getAttrs: (dom: HTMLElement) => {\n const img = dom.querySelector('img[src]') as HTMLElement | null;\n if (!img) return false;\n const align = dom.getAttribute('data-align');\n return {\n src: img.getAttribute('src'),\n alt: img.getAttribute('alt'),\n title: img.getAttribute('title'),\n width: imageWidthFromDom(img.style.width || dom.style.width),\n align: align === 'left' || align === 'center' || align === 'right' ? align : null,\n };\n },\n },\n ],\n toDOM(node) {\n const { src, alt, title, width, align } = node.attrs;\n const figureAttrs: Record<string, string> = { class: 'nile-wysiwyg__figure' };\n if (align) figureAttrs['data-align'] = align;\n const styles: string[] = [];\n const widthCss = imageWidthCss(width);\n if (widthCss) styles.push(`width: ${widthCss}`);\n if (align === 'center') styles.push('margin-left: auto; margin-right: auto');\n else if (align === 'right') styles.push('margin-left: auto; margin-right: 0');\n if (styles.length) figureAttrs.style = styles.join('; ');\n const imgAttrs: Record<string, string> = { src, style: 'width: 100%' };\n if (alt) imgAttrs.alt = alt;\n if (title) imgAttrs.title = title;\n return [\n 'figure',\n figureAttrs,\n ['img', imgAttrs],\n ['figcaption', { class: 'nile-wysiwyg__figcaption' }, 0],\n ];\n },\n },\n\n /**\n * Checklists. Serialized as <ul data-task-list><li data-task-item\n * data-checked> so they survive HTML round-trips; the live checkbox is an\n * editor-only NodeView. parseDOM priority 51 beats the generic li rule.\n */\n task_list: {\n content: 'task_item+',\n group: 'block',\n parseDOM: [{ tag: 'ul[data-task-list]', priority: 51 }],\n toDOM() {\n return ['ul', { 'data-task-list': 'true', class: 'nile-wysiwyg__task-list' }, 0];\n },\n },\n\n task_item: {\n content: 'paragraph block*',\n defining: true,\n attrs: { checked: { default: false } },\n parseDOM: [\n {\n tag: 'li[data-task-item]',\n priority: 51,\n getAttrs: (dom: HTMLElement) => ({\n checked: dom.getAttribute('data-checked') === 'true',\n }),\n },\n ],\n toDOM(node) {\n return [\n 'li',\n {\n 'data-task-item': 'true',\n 'data-checked': String(node.attrs.checked),\n class: 'nile-wysiwyg__task-item',\n },\n 0,\n ];\n },\n },\n\n /**\n * Provider embeds (YouTube/Vimeo/Loom) as block atoms. The iframe sits in\n * a wrapper div for aspect-ratio styling and a click-to-select overlay.\n */\n embed: {\n group: 'block',\n atom: true,\n selectable: true,\n draggable: true,\n attrs: {\n src: {},\n provider: { default: null },\n title: { default: null },\n /** Rendered width in px (drag-resize); null = default size. */\n width: { default: null },\n /** Block alignment: 'left' | 'center' | 'right' | null. */\n align: { default: null },\n },\n parseDOM: [\n {\n tag: 'div[data-embed-provider]',\n getAttrs: (dom: HTMLElement) => {\n const iframe = dom.querySelector('iframe[src]');\n if (!iframe) return false;\n const widthAttr =\n dom.getAttribute('data-width') ?? /^(\\d+)px$/.exec(dom.style.width)?.[1];\n const width = widthAttr ? parseInt(widthAttr, 10) : NaN;\n const align = dom.getAttribute('data-align');\n return {\n src: iframe.getAttribute('src'),\n provider: dom.getAttribute('data-embed-provider'),\n title: iframe.getAttribute('title'),\n width: Number.isFinite(width) && width > 0 ? width : null,\n align: align === 'left' || align === 'center' || align === 'right' ? align : null,\n };\n },\n },\n {\n tag: 'iframe[src]',\n getAttrs: (dom: HTMLElement) => {\n const width = parseInt(dom.getAttribute('width') ?? '', 10);\n return {\n src: dom.getAttribute('src'),\n title: dom.getAttribute('title'),\n width: Number.isFinite(width) && width > 0 ? width : null,\n };\n },\n },\n ],\n toDOM(node) {\n const { src, provider, title, width, align } = node.attrs;\n const iframeAttrs: Record<string, string> = {\n src,\n frameborder: '0',\n allowfullscreen: 'true',\n allow: 'accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture',\n sandbox: EMBED_SANDBOX,\n referrerpolicy: EMBED_REFERRER_POLICY,\n };\n if (title) iframeAttrs.title = title;\n const wrapperAttrs: Record<string, string> = {\n class: 'nile-wysiwyg__embed',\n 'data-embed-provider': provider ?? 'generic',\n };\n const styles: string[] = [];\n if (width) {\n wrapperAttrs['data-width'] = String(width);\n styles.push(`width: ${width}px`, 'max-width: 100%');\n }\n if (align) {\n wrapperAttrs['data-align'] = align;\n if (align === 'center') styles.push('margin-left: auto', 'margin-right: auto');\n else if (align === 'right') styles.push('margin-left: auto', 'margin-right: 0');\n }\n if (styles.length) wrapperAttrs.style = styles.join('; ');\n return ['div', wrapperAttrs, ['iframe', iframeAttrs]];\n },\n },\n\n /**\n * Author-supplied `<style>` block, entered via the HTML source view. The CSS\n * is sanitized on the way in (see sanitizeCss) — `@import`, `expression()`\n * and external `url()` are neutralized — then stored verbatim and serialized\n * straight back to a `<style>` element. A node view renders it live in the\n * editor with a small chip so the otherwise-invisible block stays selectable.\n */\n styleBlock: {\n group: 'block',\n atom: true,\n selectable: true,\n attrs: { css: { default: '' } },\n parseDOM: [\n {\n tag: 'style',\n getAttrs: (dom: HTMLElement) => ({ css: dom.textContent ?? '' }),\n },\n ],\n toDOM(node) {\n return ['style', node.attrs.css];\n },\n },\n\n /**\n * Bookmark: a named in-text anchor (`<a id=\"…\">`) for intra-document\n * navigation. Invisible in serialized output; the editor draws a flag\n * marker via CSS so it can be selected and deleted.\n */\n bookmark: {\n inline: true,\n group: 'inline',\n atom: true,\n selectable: true,\n attrs: { id: {} },\n parseDOM: [\n {\n tag: 'a[data-bookmark]',\n priority: 60,\n getAttrs: (dom: HTMLElement) => {\n const id = dom.getAttribute('id') || dom.getAttribute('name');\n return id ? { id } : false;\n },\n },\n // Anchors without an href are bookmarks (`<a id>` / legacy `<a name>`).\n {\n tag: 'a[id]',\n getAttrs: (dom: HTMLElement) =>\n dom.hasAttribute('href') ? false : { id: dom.getAttribute('id') },\n },\n {\n tag: 'a[name]',\n getAttrs: (dom: HTMLElement) =>\n dom.hasAttribute('href') ? false : { id: dom.getAttribute('name') },\n },\n ],\n toDOM(node) {\n return ['a', { id: node.attrs.id, 'data-bookmark': 'true' }];\n },\n },\n\n /** Inline atom for @-style mentions. The label renders as `${trigger}${label}`. */\n mention: {\n inline: true,\n group: 'inline',\n atom: true,\n selectable: true,\n attrs: {\n trigger: { default: '@' },\n key: {},\n label: {},\n },\n parseDOM: [\n {\n tag: 'span[data-mention-key]',\n getAttrs: (dom: HTMLElement) => ({\n trigger: dom.getAttribute('data-mention-trigger') || '@',\n key: dom.getAttribute('data-mention-key'),\n label:\n dom.getAttribute('data-mention-label') || dom.textContent?.slice(1) || '',\n }),\n },\n ],\n toDOM(node) {\n const { trigger, key, label } = node.attrs;\n return [\n 'span',\n {\n class: 'nile-wysiwyg__mention',\n 'data-mention-trigger': trigger,\n 'data-mention-key': key,\n 'data-mention-label': label,\n },\n `${trigger}${label}`,\n ];\n },\n },\n\n /**\n * Merge field: an inline atom placeholder for mail-merge / personalization\n * (e.g. `{{first_name}}`). Stores a stable `id` and a human `label`; renders\n * the label (falling back to `{{id}}`) as a non-editable chip.\n */\n merge_field: {\n inline: true,\n group: 'inline',\n atom: true,\n selectable: true,\n attrs: { id: {}, label: { default: null } },\n parseDOM: [\n {\n tag: 'span[data-merge-field]',\n getAttrs: (dom: HTMLElement) => {\n const id = dom.getAttribute('data-merge-field');\n if (!id) return false;\n return {\n id,\n label: dom.getAttribute('data-merge-label') || dom.textContent || null,\n };\n },\n },\n ],\n toDOM(node) {\n const { id, label } = node.attrs;\n return [\n 'span',\n {\n class: 'nile-wysiwyg__merge-field',\n 'data-merge-field': id,\n 'data-merge-label': label ?? '',\n },\n label || `{{${id}}}`,\n ];\n },\n },\n\n /**\n * Math: an inline atom holding a LaTeX source string. Rendering is pluggable\n * via the editor's `mathRenderer` (KaTeX/MathJax, or MathML). Without a\n * renderer the raw LaTeX is shown in a math-styled chip. `display` chooses\n * inline vs. block presentation.\n */\n math: {\n inline: true,\n group: 'inline',\n atom: true,\n selectable: true,\n attrs: { latex: {}, display: { default: 'inline' } },\n parseDOM: [\n {\n tag: 'span[data-math]',\n getAttrs: (dom: HTMLElement) => ({\n latex: dom.getAttribute('data-math') || dom.textContent || '',\n display: dom.getAttribute('data-math-display') === 'block' ? 'block' : 'inline',\n }),\n },\n ],\n toDOM(node) {\n const { latex, display } = node.attrs;\n return [\n 'span',\n {\n class: 'nile-wysiwyg__math',\n 'data-math': latex,\n 'data-math-display': display,\n },\n latex,\n ];\n },\n },\n};\n\n/** A cell attr that reads and writes one inline-style declaration. */\nfunction cellStyleAttr(cssName: string) {\n return {\n default: null,\n getFromDOM(dom: HTMLElement) {\n return dom.style.getPropertyValue(cssName) || null;\n },\n setDOMAttr(value: unknown, attrs: Record<string, unknown>) {\n if (value) attrs.style = `${(attrs.style as string) || ''}${cssName}: ${value};`;\n },\n };\n}\n\n/** Table nodes from prosemirror-tables, with cell background + email-layout support. */\nconst tableNodeSpecs = tableNodes({\n tableGroup: 'block',\n cellContent: 'block+',\n cellAttributes: {\n background: {\n default: null,\n getFromDOM(dom) {\n // Fidelity stashes the cell background on a data-attr (so it never\n // becomes a bg mark); legacy/non-fidelity content keeps it in the style.\n return (\n (dom as HTMLElement).getAttribute('data-cell-bg') ||\n (dom as HTMLElement).style.backgroundColor ||\n null\n );\n },\n setDOMAttr(value, attrs) {\n if (value) {\n attrs.style = `${(attrs.style as string) || ''}background-color: ${value};`;\n }\n },\n },\n // Padding is read per side so partial shorthands round-trip.\n paddingTop: cellStyleAttr('padding-top'),\n paddingRight: cellStyleAttr('padding-right'),\n paddingBottom: cellStyleAttr('padding-bottom'),\n paddingLeft: cellStyleAttr('padding-left'),\n width: cellStyleAttr('width'),\n valign: cellStyleAttr('vertical-align'),\n borderTop: cellStyleAttr('border-top'),\n borderRight: cellStyleAttr('border-right'),\n borderBottom: cellStyleAttr('border-bottom'),\n borderLeft: cellStyleAttr('border-left'),\n borderRadius: cellStyleAttr('border-radius'),\n // Cell text colour/font, carried on a data-attr so it inherits through the\n // cell's style instead of spawning a span on every text run.\n textStyle: {\n default: null,\n getFromDOM(dom: HTMLElement) {\n return dom.getAttribute('data-cell-text-style') || null;\n },\n setDOMAttr(value: unknown, attrs: Record<string, unknown>) {\n const safe = sanitizeTableTextStyleForWrite(value as string);\n if (safe) attrs.style = `${(attrs.style as string) || ''}${safe};`;\n },\n },\n // Cell text-align, carried on data-cell-align (never the live style) so\n // flag-off output is unchanged; validated against the keyword set on write.\n textAlign: {\n default: null,\n getFromDOM(dom: HTMLElement) {\n return dom.getAttribute('data-cell-align') || null;\n },\n setDOMAttr(value: unknown, attrs: Record<string, unknown>) {\n const v = String(value ?? '').toLowerCase();\n if (CELL_ALIGN_KEYWORDS.has(v)) {\n attrs.style = `${(attrs.style as string) || ''}text-align: ${v};`;\n }\n },\n },\n // Per-app extension declarations, re-validated on write-back.\n extraStyle: {\n default: null,\n getFromDOM(dom: HTMLElement) {\n return dom.getAttribute('data-extra-style') || null;\n },\n setDOMAttr(value: unknown, attrs: Record<string, unknown>) {\n const safe = sanitizeExtraStyleForWrite(value as string);\n if (safe) attrs.style = `${(attrs.style as string) || ''}${safe};`;\n },\n },\n },\n});\n\n/**\n * The table spec extended with a `layout` attr: layout tables (structured\n * layouts, e.g. for email HTML) serialize as `role=\"presentation\"` and render\n * borderless, with dashed guides visible only while editing.\n */\nconst baseTableSpec = tableNodeSpecs.table;\n\n/** Inline styles for a table's fidelity attrs; shared by toDOM and the live TableView. */\nexport function tableStyles(attrs: Record<string, unknown>): string[] {\n const { width, maxWidth, background, border, align, textStyle, extraStyle } = attrs;\n const styles: string[] = [];\n if (width) styles.push(`width: ${width}`);\n if (maxWidth) styles.push(`max-width: ${maxWidth}`);\n if (background) styles.push(`background-color: ${background}`);\n if (border) styles.push(`border: ${border}`);\n if (align === 'center') styles.push('margin-left: auto', 'margin-right: auto');\n // Table-level font/colour/line-height, re-validated on write-back (same\n // validators as the sanitizer) so cells/paragraphs inherit it through CSS.\n if (textStyle) {\n const safe = sanitizeTableTextStyleForWrite(textStyle as string);\n if (safe) styles.push(safe);\n }\n // Per-app extension declarations, re-validated against the permanent denylist\n // + value grammar on write-back (the singleton schema can't see the allowlist).\n if (extraStyle) {\n const safe = sanitizeExtraStyleForWrite(extraStyle as string);\n if (safe) styles.push(safe);\n }\n return styles;\n}\nconst tableSpec: NodeSpec = {\n ...baseTableSpec,\n attrs: {\n ...(baseTableSpec.attrs ?? {}),\n layout: { default: false },\n width: { default: null },\n maxWidth: { default: null },\n background: { default: null },\n border: { default: null },\n align: { default: null },\n textStyle: { default: null },\n extraStyle: { default: null },\n },\n parseDOM: [\n {\n tag: 'table',\n getAttrs: (dom: HTMLElement) => ({\n layout:\n dom.getAttribute('role') === 'presentation' || dom.hasAttribute('data-layout'),\n width: dom.style.width || null,\n maxWidth: dom.style.maxWidth || null,\n extraStyle: dom.getAttribute('data-extra-style') || null,\n // Table font/colour comes only from the fidelity data-attr (so flag-off\n // tables keep today's no-table-text-style behaviour).\n textStyle: dom.getAttribute('data-table-text-style') || null,\n // Table background comes only from the fidelity data-attr.\n background: dom.getAttribute('data-table-bg') || null,\n border: dom.style.border || null,\n // Centring comes from the fidelity data-attr (email `align=\"center\"`) or\n // from auto side margins written back by toDOM.\n align:\n dom.getAttribute('data-table-align') === 'center' ||\n (dom.style.marginLeft === 'auto' && dom.style.marginRight === 'auto')\n ? 'center'\n : null,\n }),\n },\n ],\n toDOM(node) {\n const styles = tableStyles(node.attrs);\n const attrs: Record<string, string> = node.attrs.layout\n ? { role: 'presentation', 'data-layout': 'true' }\n : {};\n if (styles.length) attrs.style = styles.join('; ');\n return ['table', attrs, ['tbody', 0]];\n },\n};\n\n/**\n * Marks. Order matters: marks later in the map render closer to the text.\n * Each styling mark parses from both semantic tags AND inline `style=`\n * declarations so pasted Word/Google Docs content keeps its formatting.\n */\nconst marks: Record<string, MarkSpec> = {\n link: {\n attrs: {\n href: {},\n title: { default: null },\n target: { default: null },\n },\n inclusive: false,\n parseDOM: [\n {\n tag: 'a[href]',\n getAttrs: (dom: HTMLElement) => ({\n href: dom.getAttribute('href'),\n title: dom.getAttribute('title'),\n target: dom.getAttribute('target'),\n }),\n },\n ],\n toDOM(mark) {\n const { href, title, target } = mark.attrs;\n const attrs: Record<string, string> = { href };\n if (title) attrs.title = title;\n if (target) {\n attrs.target = target;\n if (target === '_blank') attrs.rel = 'noopener noreferrer';\n }\n return ['a', attrs, 0];\n },\n },\n\n bold: {\n parseDOM: [\n { tag: 'strong' },\n // Google Docs wraps everything in <b style=\"font-weight: normal\">\n {\n tag: 'b',\n getAttrs: (dom: HTMLElement) => dom.style.fontWeight !== 'normal' && null,\n },\n {\n style: 'font-weight',\n getAttrs: (value: string) => /^(bold(er)?|[5-9]\\d{2,})$/.test(value) && null,\n },\n ],\n toDOM() {\n return ['strong', 0];\n },\n },\n\n italic: {\n parseDOM: [\n { tag: 'i' },\n { tag: 'em' },\n { style: 'font-style=italic' },\n ],\n toDOM() {\n return ['em', 0];\n },\n },\n\n underline: {\n parseDOM: [\n { tag: 'u' },\n {\n style: 'text-decoration',\n getAttrs: (value: string) => value.includes('underline') && null,\n },\n {\n style: 'text-decoration-line',\n getAttrs: (value: string) => value.includes('underline') && null,\n },\n ],\n toDOM() {\n return ['u', 0];\n },\n },\n\n strike: {\n parseDOM: [\n { tag: 's' },\n { tag: 'strike' },\n { tag: 'del' },\n {\n style: 'text-decoration',\n getAttrs: (value: string) => value.includes('line-through') && null,\n },\n {\n style: 'text-decoration-line',\n getAttrs: (value: string) => value.includes('line-through') && null,\n },\n ],\n toDOM() {\n return ['s', 0];\n },\n },\n\n /** Mutually exclusive vertical-shift marks (formulas, footnote refs). */\n subscript: {\n excludes: 'subscript superscript',\n parseDOM: [{ tag: 'sub' }, { style: 'vertical-align=sub' }],\n toDOM() {\n return ['sub', 0];\n },\n },\n\n superscript: {\n excludes: 'subscript superscript',\n parseDOM: [{ tag: 'sup' }, { style: 'vertical-align=super' }],\n toDOM() {\n return ['sup', 0];\n },\n },\n\n code: {\n parseDOM: [{ tag: 'code' }],\n toDOM() {\n return ['code', { class: 'nile-wysiwyg__inline-code' }, 0];\n },\n },\n\n /** Carries an author `class`/`id` on an inline `<span>` that has no other\n * meaning, so class/id CSS can target runs of text. Low priority so styled\n * spans (color/font marks) and atom spans (mention/merge/math) win. */\n html_span: {\n attrs: { htmlClass: { default: null }, htmlId: { default: null } },\n parseDOM: [\n {\n tag: 'span',\n priority: 5,\n getAttrs: (dom: HTMLElement) => {\n const htmlClass = cleanClass(dom.getAttribute('class'));\n const htmlId = cleanId(dom.getAttribute('id'));\n return htmlClass || htmlId ? { htmlClass, htmlId } : false;\n },\n },\n ],\n toDOM(mark) {\n const attrs: Record<string, string> = {};\n if (mark.attrs.htmlClass) attrs.class = mark.attrs.htmlClass;\n if (mark.attrs.htmlId) attrs.id = mark.attrs.htmlId;\n return ['span', attrs, 0];\n },\n },\n\n text_color: {\n attrs: { color: {} },\n parseDOM: [\n {\n style: 'color',\n getAttrs: (value: string) => (value ? { color: value } : false),\n },\n ],\n toDOM(mark) {\n return ['span', { style: `color: ${mark.attrs.color}` }, 0];\n },\n },\n\n bg_color: {\n attrs: { color: {} },\n parseDOM: [\n {\n style: 'background-color',\n getAttrs: (value: string) =>\n value && value !== 'transparent' ? { color: value } : false,\n },\n ],\n toDOM(mark) {\n return ['span', { style: `background-color: ${mark.attrs.color}` }, 0];\n },\n },\n\n font_family: {\n attrs: { family: {} },\n parseDOM: [\n {\n style: 'font-family',\n getAttrs: (value: string) => (value ? { family: value } : false),\n },\n ],\n toDOM(mark) {\n return ['span', { style: `font-family: ${mark.attrs.family}` }, 0];\n },\n },\n\n font_size: {\n attrs: { size: {} },\n parseDOM: [\n {\n style: 'font-size',\n getAttrs: (value: string) => (value ? { size: value } : false),\n },\n ],\n toDOM(mark) {\n return ['span', { style: `font-size: ${mark.attrs.size}` }, 0];\n },\n },\n};\n\n/** Bullet markers CSS understands; anything else falls back to default. */\nexport const BULLET_STYLES = ['disc', 'circle', 'square'] as const;\n\n/** Numbering styles, keyed by the HTML `type` attribute letter. */\nexport const ORDERED_STYLES: Record<string, string> = {\n '1': 'decimal',\n a: 'lower-alpha',\n A: 'upper-alpha',\n i: 'lower-roman',\n I: 'upper-roman',\n};\n\nconst STYLE_TO_TYPE: Record<string, string> = Object.fromEntries(\n Object.entries(ORDERED_STYLES).map(([type, style]) => [style, type])\n);\n\n/**\n * Legal-style continuous numbering (1, 1.1, 1.1.1). Not a CSS\n * list-style-type: it serializes as `data-list-style=\"multilevel\"` and is\n * rendered with CSS counters (see the editor stylesheet). Consumers rendering\n * the output need the same counter rules.\n */\nexport const MULTILEVEL_STYLE = 'multilevel';\n\n/** List specs from prosemirror-schema-list, extended with style attrs. */\nconst bulletListSpec: NodeSpec = {\n content: 'list_item+',\n group: 'block',\n attrs: { style: { default: null } },\n parseDOM: [\n {\n tag: 'ul',\n getAttrs: (dom: HTMLElement) => {\n const style = dom.style.listStyleType;\n return {\n style: (BULLET_STYLES as readonly string[]).includes(style) ? style : null,\n };\n },\n },\n ],\n toDOM(node) {\n return node.attrs.style\n ? ['ul', { style: `list-style-type: ${node.attrs.style}` }, 0]\n : ['ul', 0];\n },\n};\n\nconst orderedListSpec: NodeSpec = {\n content: 'list_item+',\n group: 'block',\n attrs: { order: { default: 1 }, style: { default: null } },\n parseDOM: [\n {\n tag: 'ol',\n getAttrs: (dom: HTMLElement) => {\n const type = dom.getAttribute('type') ?? '';\n const cssStyle = dom.style.listStyleType;\n const style =\n dom.getAttribute('data-list-style') === MULTILEVEL_STYLE\n ? MULTILEVEL_STYLE\n : ORDERED_STYLES[type] ??\n (Object.values(ORDERED_STYLES).includes(cssStyle) ? cssStyle : null);\n const start = Number(dom.getAttribute('start'));\n return {\n order: Number.isFinite(start) && start > 0 ? start : 1,\n style,\n };\n },\n },\n ],\n toDOM(node) {\n const attrs: Record<string, string> = {};\n if (node.attrs.order !== 1) attrs.start = String(node.attrs.order);\n if (node.attrs.style === MULTILEVEL_STYLE) {\n attrs['data-list-style'] = MULTILEVEL_STYLE;\n } else if (node.attrs.style && STYLE_TO_TYPE[node.attrs.style]) {\n attrs.type = STYLE_TO_TYPE[node.attrs.style];\n }\n return ['ol', attrs, 0];\n },\n};\n\n/** Builds the editor schema. List nodes are added via prosemirror-schema-list. */\nexport function createSchema(): Schema {\n let nodeMap = addListNodes(OrderedMap.from(nodes), 'paragraph block*', 'block')\n .update('bullet_list', bulletListSpec)\n .update('ordered_list', orderedListSpec)\n .append(tableNodeSpecs)\n .update('table', tableSpec);\n // Thread author class/id through the content nodes and marks (applied last so\n // it also wraps the list/table specs pulled in from external packages).\n for (const name of HTML_ATTR_NODES) {\n const spec = nodeMap.get(name);\n if (spec) nodeMap = nodeMap.update(name, withHtmlAttrs(spec));\n }\n let markMap = OrderedMap.from<MarkSpec>(marks);\n for (const name of HTML_ATTR_MARKS) {\n const spec = markMap.get(name);\n if (spec) markMap = markMap.update(name, withHtmlAttrs(spec));\n }\n return new Schema({ nodes: nodeMap, marks: markMap });\n}\n\n/** A shared default schema instance. */\nexport const defaultSchema = createSchema();\n"]}
@@ -73,7 +73,9 @@ export function computeToolbarState(state) {
73
73
  inTaskList = true;
74
74
  else if (node.type === schema.nodes.blockquote)
75
75
  inBlockquote = true;
76
- else if (node.type === schema.nodes.table) {
76
+ else if (node.type === schema.nodes.table && !inTable) {
77
+ // Innermost table wins: a data table nested in an email layout table
78
+ // is not a layout table.
77
79
  inTable = true;
78
80
  tableLayout = !!node.attrs.layout;
79
81
  }
@@ -1 +1 @@
1
- {"version":3,"file":"selection-state.js","sourceRoot":"","sources":["../../../../src/nile-wysiwyg-editor/engine/selection-state.ts"],"names":[],"mappings":"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","sourcesContent":["import { EditorState } from 'prosemirror-state';\nimport { MarkType, Node as PMNode } from 'prosemirror-model';\nimport { undo, redo } from 'prosemirror-history';\nimport type { Alignment } from './schema';\nimport { getMarkRange, selectedImageInfo, selectedEmbedInfo } from './commands';\n\n/**\n * Immutable snapshot of everything the toolbar needs to render. Computed once\n * per transaction in the host's dispatchTransaction and passed down as a\n * single reactive property.\n */\nexport interface ToolbarState {\n bold: boolean;\n italic: boolean;\n underline: boolean;\n strike: boolean;\n subscript: boolean;\n superscript: boolean;\n code: boolean;\n /** 'paragraph' | 'heading' for the innermost textblock at the cursor. */\n blockType: string;\n headingLevel: number | null;\n align: Alignment | null;\n /** Line height ('1.5') of the textblock at the cursor, null = default. */\n lineHeight: string | null;\n inBulletList: boolean;\n inOrderedList: boolean;\n inTaskList: boolean;\n inBlockquote: boolean;\n inTable: boolean;\n /** The surrounding table is a layout (presentation) table. */\n tableLayout: boolean;\n /** Margin-indent level (0..MAX_INDENT) of the textblock at the cursor. */\n blockIndent: number;\n /** list-style-type of the surrounding list ('' = default). */\n listStyle: string | null;\n /** Start number of the surrounding ordered list. */\n listStart: number | null;\n /** An image or figure is selected (or the cursor is in a caption). */\n imageSelected: boolean;\n /** The selected image is a captioned figure. */\n imageIsFigure: boolean;\n /** Alignment of the selected figure. */\n imageAlign: string | null;\n /** A video embed is selected. */\n embedSelected: boolean;\n /** Alignment of the selected embed. */\n embedAlign: string | null;\n inCodeBlock: boolean;\n /** Language attr of the surrounding code block ('' = auto). */\n codeBlockLanguage: string | null;\n canUndo: boolean;\n canRedo: boolean;\n linkActive: boolean;\n linkHref: string | null;\n textColor: string | null;\n bgColor: string | null;\n fontFamily: string | null;\n fontSize: string | null;\n /** True when the selection is a cursor (no range). */\n selectionEmpty: boolean;\n /**\n * Whether the host's \"paste as plain text\" toggle is on. Not derivable from\n * editor state, so the host injects it after computeToolbarState().\n */\n pasteAsPlainText?: boolean;\n /** Whether the host is in fullscreen mode. Injected like pasteAsPlainText. */\n fullscreen?: boolean;\n /** Whether block boundaries are outlined. Injected like pasteAsPlainText. */\n showBlocks?: boolean;\n /** Whether the format painter is armed. Injected like pasteAsPlainText. */\n formatPainter?: boolean;\n}\n\nfunction markActive(state: EditorState, type: MarkType): boolean {\n const { from, $from, to, empty } = state.selection;\n if (empty) return !!type.isInSet(state.storedMarks || $from.marks());\n return state.doc.rangeHasMark(from, to, type);\n}\n\nfunction markAttr(state: EditorState, type: MarkType, attr: string): string | null {\n const { $from, from, to, empty } = state.selection;\n if (empty) {\n const mark = type.isInSet(state.storedMarks || $from.marks());\n return mark ? ((mark.attrs[attr] as string) ?? null) : null;\n }\n // Range: report the first occurrence of the mark inside the selection.\n // (Boundary marks() lookups miss non-inclusive marks like link.)\n let found: string | null = null;\n state.doc.nodesBetween(from, to, node => {\n if (found !== null || !node.isText) return found === null;\n const mark = type.isInSet(node.marks);\n if (mark) found = (mark.attrs[attr] as string) ?? null;\n return found === null;\n });\n return found;\n}\n\nexport function computeToolbarState(state: EditorState): ToolbarState {\n const { schema } = state;\n const { $from, from, to, empty } = state.selection;\n\n // $from.parent is the doc (not a textblock) for AllSelection / block\n // NodeSelections; report the first textblock in the range instead so the\n // toolbar reflects what's actually selected.\n let parent = $from.parent;\n if (!parent.isTextblock) {\n let firstTextblock: PMNode | null = null;\n state.doc.nodesBetween(from, to, node => {\n if (!firstTextblock && node.isTextblock) firstTextblock = node;\n return !firstTextblock;\n });\n if (firstTextblock) parent = firstTextblock;\n }\n const blockType = parent.type.name;\n const headingLevel = blockType === 'heading' ? (parent.attrs.level as number) : null;\n const align =\n parent.type.spec.attrs && 'align' in parent.type.spec.attrs\n ? ((parent.attrs.align as Alignment) ?? null)\n : null;\n\n let inBulletList = false;\n let inOrderedList = false;\n let inTaskList = false;\n let inBlockquote = false;\n let inTable = false;\n let tableLayout = false;\n let listStyle: string | null = null;\n let listStart: number | null = null;\n for (let depth = $from.depth; depth > 0; depth -= 1) {\n const node = $from.node(depth);\n if (node.type === schema.nodes.bullet_list) {\n inBulletList = true;\n if (listStyle === null) listStyle = (node.attrs.style as string) ?? null;\n } else if (node.type === schema.nodes.ordered_list) {\n inOrderedList = true;\n if (listStyle === null) listStyle = (node.attrs.style as string) ?? null;\n if (listStart === null) listStart = (node.attrs.order as number) ?? 1;\n } else if (node.type === schema.nodes.task_list) inTaskList = true;\n else if (node.type === schema.nodes.blockquote) inBlockquote = true;\n else if (node.type === schema.nodes.table) {\n inTable = true;\n tableLayout = !!node.attrs.layout;\n }\n }\n\n const imageInfo = selectedImageInfo(state);\n const embedInfo = selectedEmbedInfo(state);\n\n const linkActive = markActive(state, schema.marks.link);\n let linkHref: string | null = null;\n if (linkActive) {\n linkHref = markAttr(state, schema.marks.link, 'href');\n if (linkHref === null && empty) {\n const range = getMarkRange($from, schema.marks.link);\n if (range) {\n const mark = schema.marks.link.isInSet(\n state.doc.resolve(range.from + 1).marks()\n );\n linkHref = mark ? (mark.attrs.href as string) : null;\n }\n }\n }\n\n return {\n bold: markActive(state, schema.marks.bold),\n italic: markActive(state, schema.marks.italic),\n underline: markActive(state, schema.marks.underline),\n strike: markActive(state, schema.marks.strike),\n subscript: markActive(state, schema.marks.subscript),\n superscript: markActive(state, schema.marks.superscript),\n code: markActive(state, schema.marks.code),\n blockType,\n headingLevel,\n align,\n lineHeight:\n parent.type.spec.attrs && 'lineHeight' in parent.type.spec.attrs\n ? ((parent.attrs.lineHeight as string) ?? null)\n : null,\n inBulletList,\n inOrderedList,\n inTaskList,\n inBlockquote,\n inTable,\n tableLayout,\n blockIndent:\n parent.type.spec.attrs && 'indent' in parent.type.spec.attrs\n ? ((parent.attrs.indent as number) ?? 0)\n : 0,\n listStyle,\n listStart,\n imageSelected: imageInfo !== null,\n imageIsFigure: imageInfo?.isFigure ?? false,\n imageAlign: imageInfo?.isFigure ? ((imageInfo.node.attrs.align as string) ?? null) : null,\n embedSelected: embedInfo !== null,\n embedAlign: (embedInfo?.node.attrs.align as string) ?? null,\n inCodeBlock: blockType === 'code_block',\n codeBlockLanguage:\n blockType === 'code_block' ? ((parent.attrs.language as string) ?? null) : null,\n canUndo: undo(state),\n canRedo: redo(state),\n linkActive,\n linkHref,\n textColor: markAttr(state, schema.marks.text_color, 'color'),\n bgColor: markAttr(state, schema.marks.bg_color, 'color'),\n fontFamily: markAttr(state, schema.marks.font_family, 'family'),\n fontSize: markAttr(state, schema.marks.font_size, 'size'),\n selectionEmpty: empty,\n };\n}\n"]}
1
+ {"version":3,"file":"selection-state.js","sourceRoot":"","sources":["../../../../src/nile-wysiwyg-editor/engine/selection-state.ts"],"names":[],"mappings":"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","sourcesContent":["import { EditorState } from 'prosemirror-state';\nimport { MarkType, Node as PMNode } from 'prosemirror-model';\nimport { undo, redo } from 'prosemirror-history';\nimport type { Alignment } from './schema';\nimport { getMarkRange, selectedImageInfo, selectedEmbedInfo } from './commands';\n\n/**\n * Immutable snapshot of everything the toolbar needs to render. Computed once\n * per transaction in the host's dispatchTransaction and passed down as a\n * single reactive property.\n */\nexport interface ToolbarState {\n bold: boolean;\n italic: boolean;\n underline: boolean;\n strike: boolean;\n subscript: boolean;\n superscript: boolean;\n code: boolean;\n /** 'paragraph' | 'heading' for the innermost textblock at the cursor. */\n blockType: string;\n headingLevel: number | null;\n align: Alignment | null;\n /** Line height ('1.5') of the textblock at the cursor, null = default. */\n lineHeight: string | null;\n inBulletList: boolean;\n inOrderedList: boolean;\n inTaskList: boolean;\n inBlockquote: boolean;\n inTable: boolean;\n /** The surrounding table is a layout (presentation) table. */\n tableLayout: boolean;\n /** Margin-indent level (0..MAX_INDENT) of the textblock at the cursor. */\n blockIndent: number;\n /** list-style-type of the surrounding list ('' = default). */\n listStyle: string | null;\n /** Start number of the surrounding ordered list. */\n listStart: number | null;\n /** An image or figure is selected (or the cursor is in a caption). */\n imageSelected: boolean;\n /** The selected image is a captioned figure. */\n imageIsFigure: boolean;\n /** Alignment of the selected figure. */\n imageAlign: string | null;\n /** A video embed is selected. */\n embedSelected: boolean;\n /** Alignment of the selected embed. */\n embedAlign: string | null;\n inCodeBlock: boolean;\n /** Language attr of the surrounding code block ('' = auto). */\n codeBlockLanguage: string | null;\n canUndo: boolean;\n canRedo: boolean;\n linkActive: boolean;\n linkHref: string | null;\n textColor: string | null;\n bgColor: string | null;\n fontFamily: string | null;\n fontSize: string | null;\n /** True when the selection is a cursor (no range). */\n selectionEmpty: boolean;\n /**\n * Whether the host's \"paste as plain text\" toggle is on. Not derivable from\n * editor state, so the host injects it after computeToolbarState().\n */\n pasteAsPlainText?: boolean;\n /** Whether the host is in fullscreen mode. Injected like pasteAsPlainText. */\n fullscreen?: boolean;\n /** Whether block boundaries are outlined. Injected like pasteAsPlainText. */\n showBlocks?: boolean;\n /** Whether the format painter is armed. Injected like pasteAsPlainText. */\n formatPainter?: boolean;\n}\n\nfunction markActive(state: EditorState, type: MarkType): boolean {\n const { from, $from, to, empty } = state.selection;\n if (empty) return !!type.isInSet(state.storedMarks || $from.marks());\n return state.doc.rangeHasMark(from, to, type);\n}\n\nfunction markAttr(state: EditorState, type: MarkType, attr: string): string | null {\n const { $from, from, to, empty } = state.selection;\n if (empty) {\n const mark = type.isInSet(state.storedMarks || $from.marks());\n return mark ? ((mark.attrs[attr] as string) ?? null) : null;\n }\n // Range: report the first occurrence of the mark inside the selection.\n // (Boundary marks() lookups miss non-inclusive marks like link.)\n let found: string | null = null;\n state.doc.nodesBetween(from, to, node => {\n if (found !== null || !node.isText) return found === null;\n const mark = type.isInSet(node.marks);\n if (mark) found = (mark.attrs[attr] as string) ?? null;\n return found === null;\n });\n return found;\n}\n\nexport function computeToolbarState(state: EditorState): ToolbarState {\n const { schema } = state;\n const { $from, from, to, empty } = state.selection;\n\n // $from.parent is the doc (not a textblock) for AllSelection / block\n // NodeSelections; report the first textblock in the range instead so the\n // toolbar reflects what's actually selected.\n let parent = $from.parent;\n if (!parent.isTextblock) {\n let firstTextblock: PMNode | null = null;\n state.doc.nodesBetween(from, to, node => {\n if (!firstTextblock && node.isTextblock) firstTextblock = node;\n return !firstTextblock;\n });\n if (firstTextblock) parent = firstTextblock;\n }\n const blockType = parent.type.name;\n const headingLevel = blockType === 'heading' ? (parent.attrs.level as number) : null;\n const align =\n parent.type.spec.attrs && 'align' in parent.type.spec.attrs\n ? ((parent.attrs.align as Alignment) ?? null)\n : null;\n\n let inBulletList = false;\n let inOrderedList = false;\n let inTaskList = false;\n let inBlockquote = false;\n let inTable = false;\n let tableLayout = false;\n let listStyle: string | null = null;\n let listStart: number | null = null;\n for (let depth = $from.depth; depth > 0; depth -= 1) {\n const node = $from.node(depth);\n if (node.type === schema.nodes.bullet_list) {\n inBulletList = true;\n if (listStyle === null) listStyle = (node.attrs.style as string) ?? null;\n } else if (node.type === schema.nodes.ordered_list) {\n inOrderedList = true;\n if (listStyle === null) listStyle = (node.attrs.style as string) ?? null;\n if (listStart === null) listStart = (node.attrs.order as number) ?? 1;\n } else if (node.type === schema.nodes.task_list) inTaskList = true;\n else if (node.type === schema.nodes.blockquote) inBlockquote = true;\n else if (node.type === schema.nodes.table && !inTable) {\n // Innermost table wins: a data table nested in an email layout table\n // is not a layout table.\n inTable = true;\n tableLayout = !!node.attrs.layout;\n }\n }\n\n const imageInfo = selectedImageInfo(state);\n const embedInfo = selectedEmbedInfo(state);\n\n const linkActive = markActive(state, schema.marks.link);\n let linkHref: string | null = null;\n if (linkActive) {\n linkHref = markAttr(state, schema.marks.link, 'href');\n if (linkHref === null && empty) {\n const range = getMarkRange($from, schema.marks.link);\n if (range) {\n const mark = schema.marks.link.isInSet(\n state.doc.resolve(range.from + 1).marks()\n );\n linkHref = mark ? (mark.attrs.href as string) : null;\n }\n }\n }\n\n return {\n bold: markActive(state, schema.marks.bold),\n italic: markActive(state, schema.marks.italic),\n underline: markActive(state, schema.marks.underline),\n strike: markActive(state, schema.marks.strike),\n subscript: markActive(state, schema.marks.subscript),\n superscript: markActive(state, schema.marks.superscript),\n code: markActive(state, schema.marks.code),\n blockType,\n headingLevel,\n align,\n lineHeight:\n parent.type.spec.attrs && 'lineHeight' in parent.type.spec.attrs\n ? ((parent.attrs.lineHeight as string) ?? null)\n : null,\n inBulletList,\n inOrderedList,\n inTaskList,\n inBlockquote,\n inTable,\n tableLayout,\n blockIndent:\n parent.type.spec.attrs && 'indent' in parent.type.spec.attrs\n ? ((parent.attrs.indent as number) ?? 0)\n : 0,\n listStyle,\n listStart,\n imageSelected: imageInfo !== null,\n imageIsFigure: imageInfo?.isFigure ?? false,\n imageAlign: imageInfo?.isFigure ? ((imageInfo.node.attrs.align as string) ?? null) : null,\n embedSelected: embedInfo !== null,\n embedAlign: (embedInfo?.node.attrs.align as string) ?? null,\n inCodeBlock: blockType === 'code_block',\n codeBlockLanguage:\n blockType === 'code_block' ? ((parent.attrs.language as string) ?? null) : null,\n canUndo: undo(state),\n canRedo: redo(state),\n linkActive,\n linkHref,\n textColor: markAttr(state, schema.marks.text_color, 'color'),\n bgColor: markAttr(state, schema.marks.bg_color, 'color'),\n fontFamily: markAttr(state, schema.marks.font_family, 'family'),\n fontSize: markAttr(state, schema.marks.font_size, 'size'),\n selectionEmpty: empty,\n };\n}\n"]}
@@ -1,10 +1,18 @@
1
1
  import { Node as PMNode, Schema, Slice } from 'prosemirror-model';
2
+ import { NormalizedAllowedStyles } from './email-css';
3
+ import { EmailRenderDefaults } from './email-render';
2
4
  /** Parses an HTML string into a document node, sanitizing by default. */
3
- export declare function htmlToDoc(schema: Schema, html: string, sanitize?: boolean): PMNode;
5
+ export declare function htmlToDoc(schema: Schema, html: string, sanitize?: boolean, options?: {
6
+ emailFidelity?: boolean;
7
+ allowedStyles?: NormalizedAllowedStyles;
8
+ }): PMNode;
4
9
  /** Parses an HTML string into a slice suitable for replaceSelection. */
5
- export declare function htmlToSlice(schema: Schema, html: string, sanitize?: boolean): Slice;
6
- /** Serializes a document node back to an HTML string. */
7
- export declare function docToHtml(doc: PMNode): string;
10
+ export declare function htmlToSlice(schema: Schema, html: string, sanitize?: boolean, options?: {
11
+ emailFidelity?: boolean;
12
+ allowedStyles?: NormalizedAllowedStyles;
13
+ }): Slice;
14
+ /** Serializes a document to HTML; `emailDefaults` writes the editor's table rendering into it. */
15
+ export declare function docToHtml(doc: PMNode, emailDefaults?: EmailRenderDefaults): string;
8
16
  /** Plain-text projection of the document (blocks joined by newlines). */
9
17
  export declare function docToText(doc: PMNode): string;
10
18
  export declare function docToJson(doc: PMNode): Record<string, unknown>;
@@ -1,5 +1,6 @@
1
1
  import { DOMParser as PMDOMParser, DOMSerializer, Node as PMNode, } from 'prosemirror-model';
2
- import { sanitizeHtml } from './sanitize';
2
+ import { sanitizeHtml, relocateEmailContainers } from './sanitize';
3
+ import { applyEmailRenderDefaults, finishEmailTables, } from './email-render';
3
4
  const parserCache = new WeakMap();
4
5
  const serializerCache = new WeakMap();
5
6
  function getParser(schema) {
@@ -19,22 +20,31 @@ function getSerializer(schema) {
19
20
  return serializer;
20
21
  }
21
22
  /** Parses an HTML string into a document node, sanitizing by default. */
22
- export function htmlToDoc(schema, html, sanitize = true) {
23
- const clean = sanitize ? sanitizeHtml(html) : html;
23
+ export function htmlToDoc(schema, html, sanitize = true, options) {
24
+ let clean = sanitize ? sanitizeHtml(html, options) : html;
25
+ // Lift carried container background/font declarations onto node-attr data
26
+ // hooks so they don't become per-run marks (see relocateEmailContainers).
27
+ if (options?.emailFidelity)
28
+ clean = relocateEmailContainers(clean);
24
29
  const dom = new DOMParser().parseFromString(`<body>${clean}</body>`, 'text/html');
25
30
  return getParser(schema).parse(dom.body);
26
31
  }
27
32
  /** Parses an HTML string into a slice suitable for replaceSelection. */
28
- export function htmlToSlice(schema, html, sanitize = true) {
29
- const clean = sanitize ? sanitizeHtml(html) : html;
33
+ export function htmlToSlice(schema, html, sanitize = true, options) {
34
+ let clean = sanitize ? sanitizeHtml(html, options) : html;
35
+ if (options?.emailFidelity)
36
+ clean = relocateEmailContainers(clean);
30
37
  const dom = new DOMParser().parseFromString(`<body>${clean}</body>`, 'text/html');
31
38
  return getParser(schema).parseSlice(dom.body, { preserveWhitespace: true });
32
39
  }
33
- /** Serializes a document node back to an HTML string. */
34
- export function docToHtml(doc) {
40
+ /** Serializes a document to HTML; `emailDefaults` writes the editor's table rendering into it. */
41
+ export function docToHtml(doc, emailDefaults) {
35
42
  const schema = doc.type.schema;
43
+ const source = emailDefaults ? applyEmailRenderDefaults(doc, emailDefaults) : doc;
36
44
  const container = document.createElement('div');
37
- container.appendChild(getSerializer(schema).serializeFragment(doc.content));
45
+ container.appendChild(getSerializer(schema).serializeFragment(source.content));
46
+ if (emailDefaults)
47
+ finishEmailTables(container);
38
48
  return container.innerHTML;
39
49
  }
40
50
  /** Plain-text projection of the document (blocks joined by newlines). */
@@ -1 +1 @@
1
- {"version":3,"file":"serializer.js","sourceRoot":"","sources":["../../../../src/nile-wysiwyg-editor/engine/serializer.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n DOMParser as PMDOMParser,\n DOMSerializer,\n Node as PMNode,\n Schema,\n Slice,\n} from 'prosemirror-model';\nimport { sanitizeHtml } from './sanitize';\n\nconst parserCache = new WeakMap<Schema, PMDOMParser>();\nconst serializerCache = new WeakMap<Schema, DOMSerializer>();\n\nfunction getParser(schema: Schema): PMDOMParser {\n let parser = parserCache.get(schema);\n if (!parser) {\n parser = PMDOMParser.fromSchema(schema);\n parserCache.set(schema, parser);\n }\n return parser;\n}\n\nfunction getSerializer(schema: Schema): DOMSerializer {\n let serializer = serializerCache.get(schema);\n if (!serializer) {\n serializer = DOMSerializer.fromSchema(schema);\n serializerCache.set(schema, serializer);\n }\n return serializer;\n}\n\n/** Parses an HTML string into a document node, sanitizing by default. */\nexport function htmlToDoc(schema: Schema, html: string, sanitize = true): PMNode {\n const clean = sanitize ? sanitizeHtml(html) : html;\n const dom = new DOMParser().parseFromString(`<body>${clean}</body>`, 'text/html');\n return getParser(schema).parse(dom.body);\n}\n\n/** Parses an HTML string into a slice suitable for replaceSelection. */\nexport function htmlToSlice(schema: Schema, html: string, sanitize = true): Slice {\n const clean = sanitize ? sanitizeHtml(html) : html;\n const dom = new DOMParser().parseFromString(`<body>${clean}</body>`, 'text/html');\n return getParser(schema).parseSlice(dom.body, { preserveWhitespace: true });\n}\n\n/** Serializes a document node back to an HTML string. */\nexport function docToHtml(doc: PMNode): string {\n const schema = doc.type.schema;\n const container = document.createElement('div');\n container.appendChild(getSerializer(schema).serializeFragment(doc.content));\n return container.innerHTML;\n}\n\n/** Plain-text projection of the document (blocks joined by newlines). */\nexport function docToText(doc: PMNode): string {\n return doc.textBetween(0, doc.content.size, '\\n', ' ');\n}\n\nexport function docToJson(doc: PMNode): Record<string, unknown> {\n return doc.toJSON();\n}\n\nexport function jsonToDoc(schema: Schema, json: Record<string, unknown>): PMNode {\n return PMNode.fromJSON(schema, json);\n}\n\n/** Word and character counts over the document's text content. */\nexport function countWords(doc: PMNode): { words: number; characters: number } {\n const text = docToText(doc);\n const words = text.trim() ? text.trim().split(/\\s+/).length : 0;\n return { words, characters: text.replace(/\\n/g, '').length };\n}\n\n/** True when the document has no visible content. */\nexport function isDocEmpty(doc: PMNode): boolean {\n if (doc.childCount > 1) return false;\n const first = doc.firstChild;\n return !first || (first.type.name === 'paragraph' && first.content.size === 0);\n}\n"]}
1
+ {"version":3,"file":"serializer.js","sourceRoot":"","sources":["../../../../src/nile-wysiwyg-editor/engine/serializer.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n DOMParser as PMDOMParser,\n DOMSerializer,\n Node as PMNode,\n Schema,\n Slice,\n} from 'prosemirror-model';\nimport { sanitizeHtml, relocateEmailContainers } from './sanitize';\nimport { NormalizedAllowedStyles } from './email-css';\nimport {\n applyEmailRenderDefaults,\n finishEmailTables,\n EmailRenderDefaults,\n} from './email-render';\n\nconst parserCache = new WeakMap<Schema, PMDOMParser>();\nconst serializerCache = new WeakMap<Schema, DOMSerializer>();\n\nfunction getParser(schema: Schema): PMDOMParser {\n let parser = parserCache.get(schema);\n if (!parser) {\n parser = PMDOMParser.fromSchema(schema);\n parserCache.set(schema, parser);\n }\n return parser;\n}\n\nfunction getSerializer(schema: Schema): DOMSerializer {\n let serializer = serializerCache.get(schema);\n if (!serializer) {\n serializer = DOMSerializer.fromSchema(schema);\n serializerCache.set(schema, serializer);\n }\n return serializer;\n}\n\n/** Parses an HTML string into a document node, sanitizing by default. */\nexport function htmlToDoc(\n schema: Schema,\n html: string,\n sanitize = true,\n options?: { emailFidelity?: boolean; allowedStyles?: NormalizedAllowedStyles }\n): PMNode {\n let clean = sanitize ? sanitizeHtml(html, options) : html;\n // Lift carried container background/font declarations onto node-attr data\n // hooks so they don't become per-run marks (see relocateEmailContainers).\n if (options?.emailFidelity) clean = relocateEmailContainers(clean);\n const dom = new DOMParser().parseFromString(`<body>${clean}</body>`, 'text/html');\n return getParser(schema).parse(dom.body);\n}\n\n/** Parses an HTML string into a slice suitable for replaceSelection. */\nexport function htmlToSlice(\n schema: Schema,\n html: string,\n sanitize = true,\n options?: { emailFidelity?: boolean; allowedStyles?: NormalizedAllowedStyles }\n): Slice {\n let clean = sanitize ? sanitizeHtml(html, options) : html;\n if (options?.emailFidelity) clean = relocateEmailContainers(clean);\n const dom = new DOMParser().parseFromString(`<body>${clean}</body>`, 'text/html');\n return getParser(schema).parseSlice(dom.body, { preserveWhitespace: true });\n}\n\n/** Serializes a document to HTML; `emailDefaults` writes the editor's table rendering into it. */\nexport function docToHtml(doc: PMNode, emailDefaults?: EmailRenderDefaults): string {\n const schema = doc.type.schema;\n const source = emailDefaults ? applyEmailRenderDefaults(doc, emailDefaults) : doc;\n const container = document.createElement('div');\n container.appendChild(getSerializer(schema).serializeFragment(source.content));\n if (emailDefaults) finishEmailTables(container);\n return container.innerHTML;\n}\n\n/** Plain-text projection of the document (blocks joined by newlines). */\nexport function docToText(doc: PMNode): string {\n return doc.textBetween(0, doc.content.size, '\\n', ' ');\n}\n\nexport function docToJson(doc: PMNode): Record<string, unknown> {\n return doc.toJSON();\n}\n\nexport function jsonToDoc(schema: Schema, json: Record<string, unknown>): PMNode {\n return PMNode.fromJSON(schema, json);\n}\n\n/** Word and character counts over the document's text content. */\nexport function countWords(doc: PMNode): { words: number; characters: number } {\n const text = docToText(doc);\n const words = text.trim() ? text.trim().split(/\\s+/).length : 0;\n return { words, characters: text.replace(/\\n/g, '').length };\n}\n\n/** True when the document has no visible content. */\nexport function isDocEmpty(doc: PMNode): boolean {\n if (doc.childCount > 1) return false;\n const first = doc.firstChild;\n return !first || (first.type.name === 'paragraph' && first.content.size === 0);\n}\n"]}