@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":"sanitize.cjs.js","sources":["../../../../src/nile-wysiwyg-editor/engine/sanitize.ts"],"sourcesContent":["/**\n * HTML sanitization pre-pass. The ProseMirror schema is the real whitelist —\n * anything it can't parse is dropped — but this pass removes actively\n * dangerous content (scripts, event handlers, javascript: URLs) before the\n * string ever touches a live DOM, and strips style declarations down to the\n * set the schema understands.\n */\n\nimport { isAllowedEmbedSrc, EMBED_SANDBOX, EMBED_REFERRER_POLICY } from './plugins/embeds';\n\n/** Elements removed together with their content. */\nconst DROP_WITH_CONTENT = new Set([\n 'script', 'frame', 'frameset', 'object', 'embed',\n 'applet', 'form', 'input', 'textarea', 'select', 'button', 'meta', 'link',\n 'base', 'title', 'noscript', 'template', 'svg', 'math', 'canvas', 'audio',\n 'video', 'dialog', 'slot',\n]);\n\n/** Elements kept as-is (with filtered attributes). Extended in later phases. */\nconst ALLOWED_TAGS = new Set([\n 'p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'blockquote', 'ul', 'ol', 'li',\n 'br', 'hr', 'a', 'b', 'strong', 'i', 'em', 'u', 's', 'strike', 'del',\n 'span', 'code', 'sub', 'sup', 'div', 'font',\n 'pre', 'figure', 'figcaption', 'img', 'iframe',\n 'table', 'thead', 'tbody', 'tfoot', 'tr', 'td', 'th', 'colgroup', 'col',\n]);\n\n/** Attributes allowed per tag (on top of GLOBAL_ATTRS). */\nconst TAG_ATTRS: Record<string, Set<string>> = {\n a: new Set(['href', 'title', 'target', 'rel', 'id', 'name', 'data-bookmark']),\n table: new Set(['role', 'data-layout']),\n ol: new Set(['start', 'type', 'data-list-style']),\n ul: new Set(['data-task-list']),\n figure: new Set(['data-align']),\n li: new Set(['data-task-item', 'data-checked']),\n span: new Set([\n 'data-mention-trigger', 'data-mention-key', 'data-mention-label',\n 'data-merge-field', 'data-merge-label', 'data-math', 'data-math-display',\n ]),\n pre: new Set(['data-language']),\n img: new Set(['src', 'alt', 'title', 'width', 'height']),\n td: new Set(['colspan', 'rowspan', 'data-colwidth']),\n th: new Set(['colspan', 'rowspan', 'data-colwidth']),\n col: new Set(['span', 'width']),\n div: new Set(['data-embed-provider', 'data-width', 'data-align']),\n iframe: new Set([\n 'src', 'title', 'frameborder', 'allowfullscreen', 'allow', 'sandbox', 'referrerpolicy',\n ]),\n};\n\nconst GLOBAL_ATTRS = new Set(['style', 'align', 'class', 'id']);\n\n/** Author class/id names starting with these are the editor's own; drop them so\n * content can't impersonate or restyle the chrome. */\nconst RESERVED_NAME = /^(?:nile-wysiwyg|ProseMirror)/;\n\n/** Filtered `class`: reserved-prefixed tokens removed. Empty → drop attribute. */\nfunction cleanClassAttr(value: string): string {\n return value\n .split(/\\s+/)\n .filter(token => token && !RESERVED_NAME.test(token))\n .join(' ');\n}\n\n/** Style declarations the schema can represent. Everything else is noise. */\nconst ALLOWED_STYLES = new Set([\n 'color', 'background-color', 'font-family', 'font-size', 'font-style',\n 'font-weight', 'text-align', 'text-decoration', 'text-decoration-line',\n 'vertical-align', 'margin-left', 'margin-inline-start', 'list-style-type',\n 'line-height',\n]);\n\nconst SAFE_URL_PROTOCOLS = ['http:', 'https:', 'mailto:', 'tel:', 'ftp:'];\n\nexport function isSafeUrl(url: string, allowDataImage = false): boolean {\n const trimmed = url.trim();\n if (trimmed === '') return false;\n // Relative URLs and fragments have no protocol — safe.\n if (/^(#|\\/|\\.\\/|\\.\\.\\/)/.test(trimmed)) return true;\n const match = /^([a-z][a-z0-9+.-]*):/i.exec(trimmed);\n if (!match) return true;\n const protocol = `${match[1].toLowerCase()}:`;\n if (SAFE_URL_PROTOCOLS.includes(protocol)) return true;\n if (allowDataImage && protocol === 'data:') {\n // Raster images only — data:image/svg+xml can carry scripts.\n return /^data:image\\/(png|gif|jpe?g|webp|avif|bmp);/i.test(trimmed);\n }\n return false;\n}\n\n/** Size styles allowed only where they are part of the document model. */\nconst SIZED_TAGS: Record<string, Set<string>> = {\n img: new Set(['width', 'height']),\n figure: new Set(['width', 'margin-right']),\n div: new Set(['width', 'max-width']),\n};\n\nfunction filterStyle(value: string, tag: string): string {\n const extra = SIZED_TAGS[tag];\n return value\n .split(';')\n .map(decl => decl.trim())\n .filter(decl => {\n const name = decl.slice(0, decl.indexOf(':')).trim().toLowerCase();\n if (!ALLOWED_STYLES.has(name) && !(extra && extra.has(name))) return false;\n // Defense in depth: CSS url()/expression() smuggling.\n return !/url\\s*\\(|expression\\s*\\(/i.test(decl);\n })\n .join('; ');\n}\n\n/**\n * Sanitizes the CSS inside a <style> block. Neutralizes the vectors that make\n * a raw stylesheet dangerous while leaving ordinary rules intact:\n * - `@import` (external fetch / data exfiltration) — removed,\n * - `expression()`, `behavior:`, `-moz-binding:` (script execution) — broken,\n * - `url(...)` pointing anywhere other than a safe data: image or a local\n * `#fragment` — replaced with `url(#)`,\n * - any `</style` sequence — stripped so the text can't break out of the\n * element when the document is re-serialized.\n * CSS comments are dropped first so none of the above can hide inside one.\n */\nexport function sanitizeCss(css: string): string {\n return css\n .replace(/<\\/style/gi, '')\n .replace(/\\/\\*[\\s\\S]*?\\*\\//g, '')\n .replace(/@import[^;]*;?/gi, '')\n .replace(/expression\\s*\\(/gi, 'blocked(')\n .replace(/(behavior|-moz-binding)(\\s*):/gi, 'blocked-prop$2:')\n .replace(/url\\(\\s*(['\"]?)([^)]*?)\\1\\s*\\)/gi, (full, _quote, raw) => {\n const url = String(raw).trim();\n if (/^#/.test(url)) return full;\n if (/^data:image\\/(png|gif|jpe?g|webp|avif|bmp);/i.test(url)) return full;\n return 'url(#)';\n })\n .trim();\n}\n\nfunction sanitizeElement(el: Element): void {\n const tag = el.tagName.toLowerCase();\n const allowed = TAG_ATTRS[tag];\n for (const attr of Array.from(el.attributes)) {\n const name = attr.name.toLowerCase();\n const keep =\n (GLOBAL_ATTRS.has(name) || (allowed !== undefined && allowed.has(name))) &&\n !name.startsWith('on');\n if (!keep) {\n el.removeAttribute(attr.name);\n continue;\n }\n if (name === 'style') {\n const filtered = filterStyle(attr.value, tag);\n if (filtered) el.setAttribute('style', filtered);\n else el.removeAttribute('style');\n } else if (name === 'class') {\n const cleaned = cleanClassAttr(attr.value);\n if (cleaned) el.setAttribute('class', cleaned);\n else el.removeAttribute('class');\n } else if (name === 'id') {\n if (RESERVED_NAME.test(attr.value)) el.removeAttribute('id');\n } else if (name === 'href' || name === 'src') {\n // Raster data: URLs are allowed on images only.\n if (!isSafeUrl(attr.value, tag === 'img')) el.removeAttribute(attr.name);\n } else if (name === 'target') {\n if (attr.value === '_blank') el.setAttribute('rel', 'noopener noreferrer');\n else el.removeAttribute('target');\n }\n }\n}\n\nfunction walk(node: Element): void {\n for (const child of Array.from(node.children)) {\n const tag = child.tagName.toLowerCase();\n if (DROP_WITH_CONTENT.has(tag)) {\n child.remove();\n continue;\n }\n // iframes are allowed for any https src, but always force-sandboxed so an\n // untrusted embed can never navigate the top window or run unrestricted.\n if (tag === 'iframe') {\n if (!isAllowedEmbedSrc(child.getAttribute('src') ?? '')) {\n child.remove();\n continue;\n }\n child.setAttribute('sandbox', EMBED_SANDBOX);\n child.setAttribute('referrerpolicy', EMBED_REFERRER_POLICY);\n }\n // <style> blocks are kept, but their CSS is sanitized and any attributes\n // (media, nonce, …) dropped. Handled before the unwrap branch below so the\n // raw CSS is never spilled into the document as visible text.\n if (tag === 'style') {\n child.textContent = sanitizeCss(child.textContent ?? '');\n for (const attr of Array.from(child.attributes)) child.removeAttribute(attr.name);\n continue;\n }\n if (!ALLOWED_TAGS.has(tag)) {\n // Unknown wrapper (article, section, table for now, …): keep its\n // content, drop the element itself.\n walk(child);\n child.replaceWith(...Array.from(child.childNodes));\n continue;\n }\n sanitizeElement(child);\n walk(child);\n }\n}\n\n/**\n * Sanitizes an HTML string. Parsing happens in an inert document created by\n * DOMParser, so embedded scripts never execute and images never load.\n */\nexport function sanitizeHtml(html: string): string {\n // Wrap in an explicit <body> so metadata-like tags (notably <style>) stay in\n // the body instead of being hoisted into <head> by the HTML parser — which\n // would drop them before walk() ever sees them. Mirrors htmlToDoc's parse.\n const doc = new DOMParser().parseFromString(`<body>${html}</body>`, 'text/html');\n walk(doc.body);\n return doc.body.innerHTML;\n}\n"],"names":["isSafeUrl","url","allowDataImage","trimmed","trim","test","match","exec","protocol","toLowerCase","SAFE_URL_PROTOCOLS","includes","filterStyle","value","tag","extra","SIZED_TAGS","split","map","decl","filter","name","slice","indexOf","ALLOWED_STYLES","has","join","sanitizeElement","el","tagName","allowed","TAG_ATTRS","_i","_Array$from","Array","from","attributes","length","attr","GLOBAL_ATTRS","undefined","startsWith","filtered","setAttribute","removeAttribute","cleaned","token","RESERVED_NAME","walk","node","_i3","_Array$from2","children","child","DROP_WITH_CONTENT","remove","_o$getAttribute","isAllowedEmbedSrc","getAttribute","EMBED_SANDBOX","EMBED_REFERRER_POLICY","ALLOWED_TAGS","replaceWith","childNodes","_o$textContent","textContent","replace","full","_quote","raw","String","_i4","_Array$from3","sanitizeHtml","html","doc","DOMParser","parseFromString","body","innerHTML","Set","a","table","ol","ul","figure","li","span","pre","img","td","th","col","div","iframe"],"mappings":"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"}
1
+ {"version":3,"file":"sanitize.cjs.js","sources":["../../../../src/nile-wysiwyg-editor/engine/sanitize.ts"],"sourcesContent":["/**\n * HTML sanitization pre-pass. The ProseMirror schema is the real whitelist —\n * anything it can't parse is dropped — but this pass removes actively\n * dangerous content (scripts, event handlers, javascript: URLs) before the\n * string ever touches a live DOM, and strips style declarations down to the\n * set the schema understands.\n */\n\nimport { isAllowedEmbedSrc, EMBED_SANDBOX, EMBED_REFERRER_POLICY } from './plugins/embeds';\nimport { isExtensionValueValid, NormalizedAllowedStyles } from './email-css';\n\n/** Elements removed together with their content. */\nconst DROP_WITH_CONTENT = new Set([\n 'script', 'frame', 'frameset', 'object', 'embed',\n 'applet', 'form', 'input', 'textarea', 'select', 'button', 'meta', 'link',\n 'base', 'title', 'noscript', 'template', 'svg', 'math', 'canvas', 'audio',\n 'video', 'dialog', 'slot',\n]);\n\n/** Elements kept as-is (with filtered attributes). Extended in later phases. */\nconst ALLOWED_TAGS = new Set([\n 'p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'blockquote', 'ul', 'ol', 'li',\n 'br', 'hr', 'a', 'b', 'strong', 'i', 'em', 'u', 's', 'strike', 'del',\n 'span', 'code', 'sub', 'sup', 'div', 'font',\n 'pre', 'figure', 'figcaption', 'img', 'iframe',\n 'table', 'thead', 'tbody', 'tfoot', 'tr', 'td', 'th', 'colgroup', 'col',\n]);\n\n/** Attributes allowed per tag (on top of GLOBAL_ATTRS). */\nconst TAG_ATTRS: Record<string, Set<string>> = {\n a: new Set(['href', 'title', 'target', 'rel', 'id', 'name', 'data-bookmark']),\n table: new Set(['role', 'data-layout']),\n ol: new Set(['start', 'type', 'data-list-style']),\n ul: new Set(['data-task-list']),\n figure: new Set(['data-align']),\n li: new Set(['data-task-item', 'data-checked']),\n span: new Set([\n 'data-mention-trigger', 'data-mention-key', 'data-mention-label',\n 'data-merge-field', 'data-merge-label', 'data-math', 'data-math-display',\n ]),\n pre: new Set(['data-language']),\n img: new Set(['src', 'alt', 'title', 'width', 'height']),\n td: new Set(['colspan', 'rowspan', 'data-colwidth']),\n th: new Set(['colspan', 'rowspan', 'data-colwidth']),\n col: new Set(['span', 'width']),\n div: new Set(['data-embed-provider', 'data-width', 'data-align']),\n iframe: new Set([\n 'src', 'title', 'frameborder', 'allowfullscreen', 'allow', 'sandbox', 'referrerpolicy',\n ]),\n};\n\nconst GLOBAL_ATTRS = new Set(['style', 'align', 'class', 'id']);\n\n/** Author class/id names starting with these are the editor's own; drop them so\n * content can't impersonate or restyle the chrome. */\nconst RESERVED_NAME = /^(?:nile-wysiwyg|ProseMirror)/;\n\n/** Filtered `class`: reserved-prefixed tokens removed. Empty → drop attribute. */\nfunction cleanClassAttr(value: string): string {\n return value\n .split(/\\s+/)\n .filter(token => token && !RESERVED_NAME.test(token))\n .join(' ');\n}\n\n/** Style declarations the schema can represent. Everything else is noise. */\nconst ALLOWED_STYLES = new Set([\n 'color', 'background-color', 'font-family', 'font-size', 'font-style',\n 'font-weight', 'text-align', 'text-decoration', 'text-decoration-line',\n 'vertical-align', 'margin-left', 'margin-inline-start', 'list-style-type',\n 'line-height',\n]);\n\nconst SAFE_URL_PROTOCOLS = ['http:', 'https:', 'mailto:', 'tel:', 'ftp:'];\n\nexport function isSafeUrl(url: string, allowDataImage = false): boolean {\n const trimmed = url.trim();\n if (trimmed === '') return false;\n // Relative URLs and fragments have no protocol — safe.\n if (/^(#|\\/|\\.\\/|\\.\\.\\/)/.test(trimmed)) return true;\n const match = /^([a-z][a-z0-9+.-]*):/i.exec(trimmed);\n if (!match) return true;\n const protocol = `${match[1].toLowerCase()}:`;\n if (SAFE_URL_PROTOCOLS.includes(protocol)) return true;\n if (allowDataImage && protocol === 'data:') {\n // Raster images only — data:image/svg+xml can carry scripts.\n return /^data:image\\/(png|gif|jpe?g|webp|avif|bmp);/i.test(trimmed);\n }\n return false;\n}\n\n/** Size styles allowed only where they are part of the document model. */\nconst SIZED_TAGS: Record<string, Set<string>> = {\n img: new Set(['width', 'height']),\n figure: new Set(['width', 'margin-right']),\n div: new Set(['width', 'max-width']),\n};\n\nfunction filterStyle(value: string, tag: string): string {\n const extra = SIZED_TAGS[tag];\n return value\n .split(';')\n .map(decl => decl.trim())\n .filter(decl => {\n const name = decl.slice(0, decl.indexOf(':')).trim().toLowerCase();\n if (!ALLOWED_STYLES.has(name) && !(extra && extra.has(name))) return false;\n // Defense in depth: CSS url()/expression() smuggling.\n return !/url\\s*\\(|expression\\s*\\(/i.test(decl);\n })\n .join('; ');\n}\n\n/* --- email-fidelity: container styles become node attrs, not per-run marks (flag-gated) --- */\n\n/** Containers whose inline styles must not become per-run marks. */\nconst CONTAINER_TAGS = new Set([\n 'table', 'td', 'th', 'p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6',\n 'div', 'li', 'blockquote', 'tr', 'tbody',\n]);\n\n/** Mark-triggering declarations dropped on any container. */\nconst CONTAINER_DROP = new Set([\n 'color', 'background-color', 'font-family', 'font-size', 'font-weight',\n 'font-style', 'text-decoration', 'text-decoration-line',\n 'text-decoration-style', 'text-decoration-color',\n]);\n\n/** Layout declarations allowed on cells with fidelity. */\nconst CELL_LAYOUT = new Set([\n 'padding', 'padding-top', 'padding-right', 'padding-bottom', 'padding-left',\n 'width', 'vertical-align', 'border', 'border-top', 'border-right',\n 'border-bottom', 'border-left', 'border-radius',\n]);\n\n/** `border-width`, `border-top-color`, … — resolved per side through CSSOM instead. */\nconst CELL_BORDER_LONGHAND = /^border-(?:(?:top|right|bottom|left)-)?(?:width|style|color)$/;\n\n/** Layout declarations allowed on tables with fidelity. */\nconst TABLE_LAYOUT = new Set(['width', 'max-width', 'border', 'margin-left', 'margin-right']);\n\n/** Block margins allowed on paragraphs/headings with fidelity. */\nconst BLOCK_LAYOUT = new Set(['margin', 'margin-top', 'margin-bottom']);\n\nconst BORDER_STYLES = new Set(['solid', 'dashed', 'dotted', 'double', 'none']);\nconst VALIGN_KEYWORDS = new Set([\n 'top', 'middle', 'bottom', 'baseline', 'sub', 'super', 'text-top', 'text-bottom',\n]);\nconst LENGTH_TOKEN = /^-?(?:\\d+\\.?\\d*|\\.\\d+)(?:px|%|em|rem|pt)$/;\n\nfunction isAscii(value: string): boolean {\n // eslint-disable-next-line no-control-regex\n return !/[^\\x00-\\x7f]/.test(value);\n}\n\n/** Forbidden function-ish / escape tokens shared by the length & border grammars. */\nfunction hasUnsafeToken(value: string): boolean {\n return /[\\\\/(]|url|var|calc|expression/i.test(value);\n}\n\nfunction isLengthToken(token: string): boolean {\n return token === '0' || token === 'auto' || LENGTH_TOKEN.test(token);\n}\n\n/** 1–4 whitespace-separated length tokens (padding/margin/width/radius). */\nfunction isLengthList(value: string): boolean {\n if (!isAscii(value) || hasUnsafeToken(value)) return false;\n const tokens = value.trim().split(/\\s+/);\n return tokens.length >= 1 && tokens.length <= 4 && tokens.every(isLengthToken);\n}\n\nfunction isColor(value: string): boolean {\n if (!isAscii(value)) return false;\n const v = value.trim();\n if (/^[a-z]+$/i.test(v)) return true;\n if (/^#[0-9a-f]{3,8}$/i.test(v)) return true;\n // rgb()/rgba() with numeric (optionally %) arguments only.\n if (/^rgba?\\(\\s*[\\d.]+%?(?:\\s*,\\s*[\\d.]+%?){2,3}\\s*\\)$/i.test(v)) return true;\n // hsl()/hsla() with numeric (optionally %) arguments only — numeric-only, so a\n // smuggled `hsl(var(--x))` still fails (it has letters inside the parens).\n return /^hsla?\\(\\s*[\\d.]+%?(?:\\s*,\\s*[\\d.]+%?){2,3}\\s*\\)$/i.test(v);\n}\n\n/** Line-height for tables: a unitless number or a single length token. */\nfunction isLineHeight(value: string): boolean {\n if (!isAscii(value) || hasUnsafeToken(value)) return false;\n const v = value.trim();\n if (/^\\d+(?:\\.\\d+)?$/.test(v)) return true;\n return isLengthToken(v);\n}\n\n/** Cell `text-align` keyword set (also the legacy `align` conversion source). */\nconst TEXT_ALIGN_KEYWORDS = new Set(['left', 'center', 'right', 'justify', 'start', 'end']);\nconst LEGACY_ALIGN_KEYWORDS = new Set(['left', 'center', 'right', 'justify']);\n\nfunction isBorder(value: string): boolean {\n if (!isAscii(value)) return false;\n if (/[\\\\/]|url|var|calc|expression/i.test(value)) return false;\n const tokens = value.trim().match(/rgba?\\([^)]*\\)|\\S+/gi) ?? [];\n if (!tokens.length) return false;\n let hasStyle = false;\n for (const token of tokens) {\n if (BORDER_STYLES.has(token.toLowerCase())) {\n hasStyle = true;\n continue;\n }\n if (isLengthToken(token) || isColor(token)) continue;\n return false;\n }\n return hasStyle;\n}\n\nfunction isValign(value: string): boolean {\n const v = value.trim().toLowerCase();\n return VALIGN_KEYWORDS.has(v) || isLengthToken(v);\n}\n\nfunction isLayoutValid(name: string, value: string): boolean {\n if (name === 'vertical-align') return isValign(value);\n // `border-radius` is a length list (a corner rounding), not the width/style/\n // colour grammar the `border*` shorthands use — validate it as such.\n if (name === 'border-radius') return isLengthList(value);\n if (name.startsWith('border')) return isBorder(value);\n return isLengthList(value);\n}\n\n/** Validates a cell `color`/`font-*` declaration kept as part of `textStyle`. */\nfunction isCellTextValid(name: string, value: string): boolean {\n if (!isAscii(value) || /url|expression|var|calc/i.test(value)) return false;\n if (name === 'color') return isColor(value);\n if (name === 'font-size') return isLengthToken(value);\n if (name === 'font-weight') {\n return /^(normal|bold|bolder|lighter|[1-9]00)$/i.test(value.trim());\n }\n // font-family: names, commas and quotes only — no function-ish characters.\n return !/[(){}<>;\\\\]/.test(value);\n}\n\n/** A container's kept style under fidelity: validated layout, carried background/font, legacy attrs. */\nfunction computeContainerStyle(el: Element, tag: string): string {\n const isCell = tag === 'td' || tag === 'th';\n const isTable = tag === 'table';\n const isBlock = /^(?:p|h[1-6])$/.test(tag);\n const extra = SIZED_TAGS[tag];\n const kept: string[] = [];\n\n for (const decl of (el.getAttribute('style') ?? '').split(';')) {\n const idx = decl.indexOf(':');\n if (idx === -1) continue;\n const name = decl.slice(0, idx).trim().toLowerCase();\n const value = decl.slice(idx + 1).trim();\n if (!value || /url\\s*\\(|expression\\s*\\(/i.test(decl)) continue;\n\n if (name === 'background-color') {\n if ((isCell || isTable) && isColor(value)) kept.push(`${name}: ${value}`);\n continue;\n }\n if (name === 'color' || name === 'font-family' || name === 'font-size' || name === 'font-weight') {\n // Blocks and tables keep their own text style; cells inherit the table's.\n if ((isCell || isBlock || isTable) && isCellTextValid(name, value)) {\n kept.push(`${name}: ${value}`);\n }\n continue;\n }\n if (name === 'text-align') {\n // Cells keep a validated text-align (lifted to data-cell-align); blocks let\n // it fall through to the align attr via the ALLOWED_STYLES branch below.\n if (isCell && TEXT_ALIGN_KEYWORDS.has(value.toLowerCase())) {\n kept.push(`text-align: ${value.toLowerCase()}`);\n continue;\n }\n }\n if (name === 'line-height' && isTable) {\n if (isLineHeight(value)) kept.push(`line-height: ${value}`);\n continue;\n }\n if (name === 'margin' && isTable) {\n // `margin: 0 auto` centring: keep only the horizontal parts as longhands so\n // the table parseDOM's `margin-left/right: auto` check recognises it.\n if (isLengthList(value)) {\n const tokens = value.trim().split(/\\s+/);\n const [, right] = tokens.length === 1\n ? [tokens[0], tokens[0]]\n : [tokens[0], tokens[1]];\n const left = tokens.length >= 4 ? tokens[3] : right;\n kept.push(`margin-left: ${left}`, `margin-right: ${right}`);\n }\n continue;\n }\n if (CONTAINER_DROP.has(name)) continue;\n // Border longhand groups (`border-width/-style/-color`, per side or not) are\n // how the browser re-serializes four equal sides; recombined per side below.\n if (isCell && CELL_BORDER_LONGHAND.test(name)) continue;\n\n if (isCell && CELL_LAYOUT.has(name) && isLayoutValid(name, value)) {\n kept.push(`${name}: ${value}`);\n } else if (isTable && TABLE_LAYOUT.has(name) && isLayoutValid(name, value)) {\n kept.push(`${name}: ${value}`);\n } else if (isBlock && BLOCK_LAYOUT.has(name) && isLengthList(value)) {\n kept.push(`${name}: ${value}`);\n } else if (ALLOWED_STYLES.has(name)) {\n kept.push(`${name}: ${value}`);\n } else if (extra && extra.has(name)) {\n kept.push(`${name}: ${value}`);\n }\n }\n\n // A cell border written as longhand groups: read each side back through CSSOM,\n // which resolves any mix of shorthands and longhands to `width style color`.\n if (isCell && !kept.some(d => d.startsWith('border:'))) {\n const style = (el as HTMLElement).style;\n for (const side of ['top', 'right', 'bottom', 'left']) {\n const prop = `border-${side}`;\n if (kept.some(d => d.startsWith(`${prop}:`))) continue;\n const value = style?.getPropertyValue(prop);\n if (value && isBorder(value)) kept.push(`${prop}: ${value}`);\n }\n }\n\n // Legacy presentational attributes → validated styles (raw attr removed by the\n // standard attribute pass, which doesn't list them).\n if (isCell || isTable) {\n const bgcolor = el.getAttribute('bgcolor');\n if (bgcolor && isColor(bgcolor) && !kept.some(d => d.startsWith('background-color'))) {\n kept.push(`background-color: ${bgcolor}`);\n }\n const widthAttr = el.getAttribute('width');\n if (widthAttr && !kept.some(d => d.startsWith('width'))) {\n const width = /^\\d+$/.test(widthAttr)\n ? `${widthAttr}px`\n : /^\\d+%$/.test(widthAttr)\n ? widthAttr\n : null;\n if (width) kept.push(`width: ${width}`);\n }\n const valign = el.getAttribute('valign');\n if (isCell && valign && isValign(valign) && !kept.some(d => d.startsWith('vertical-align'))) {\n kept.push(`vertical-align: ${valign}`);\n }\n // Legacy cell align → text-align; the attr stays for table centring.\n const alignAttr = el.getAttribute('align');\n if (\n isCell &&\n alignAttr &&\n LEGACY_ALIGN_KEYWORDS.has(alignAttr.toLowerCase()) &&\n !kept.some(d => d.startsWith('text-align'))\n ) {\n kept.push(`text-align: ${alignAttr.toLowerCase()}`);\n }\n }\n\n return kept.join('; ');\n}\n\n/** Cell text declarations lifted onto `data-cell-text-style` before PM parse. */\nconst CELL_TEXT_PROPS = ['color', 'font-family', 'font-size', 'font-weight'];\n\n/** Table text declarations lifted onto `data-table-text-style` before PM parse. */\nconst TABLE_TEXT_PROPS = ['color', 'font-family', 'font-size', 'font-weight', 'line-height'];\n\n/** Moves carried background/font declarations onto data-attrs so they never become marks. */\nfunction relocateElement(el: HTMLElement, tag: string): void {\n if (tag === 'td' || tag === 'th') {\n const bg = el.style.backgroundColor;\n if (bg) {\n el.setAttribute('data-cell-bg', bg);\n el.style.removeProperty('background-color');\n }\n const parts: string[] = [];\n for (const prop of CELL_TEXT_PROPS) {\n const value = el.style.getPropertyValue(prop);\n if (value) {\n parts.push(`${prop}: ${value}`);\n el.style.removeProperty(prop);\n }\n }\n if (parts.length) el.setAttribute('data-cell-text-style', parts.join('; '));\n // Cell text-align → data-cell-align (so it stays a node attr, never a mark).\n const align = el.style.textAlign;\n if (align) {\n el.setAttribute('data-cell-align', align);\n el.style.removeProperty('text-align');\n }\n if (!el.getAttribute('style')) el.removeAttribute('style');\n } else if (tag === 'table') {\n const bg = el.style.backgroundColor;\n if (bg) {\n el.setAttribute('data-table-bg', bg);\n el.style.removeProperty('background-color');\n }\n const textParts: string[] = [];\n for (const prop of TABLE_TEXT_PROPS) {\n const value = el.style.getPropertyValue(prop);\n if (value) {\n textParts.push(`${prop}: ${value}`);\n el.style.removeProperty(prop);\n }\n }\n if (textParts.length) el.setAttribute('data-table-text-style', textParts.join('; '));\n // Email containers are centred with `align=\"center\"` on the table or on\n // the cell that holds it.\n const holder = el.parentElement?.closest('td, th');\n if (\n el.getAttribute('align')?.toLowerCase() === 'center' ||\n holder?.getAttribute('align')?.toLowerCase() === 'center'\n ) {\n el.setAttribute('data-table-align', 'center');\n }\n if (!el.getAttribute('style')) el.removeAttribute('style');\n }\n}\n\nfunction relocateWalk(node: Element): void {\n for (const child of Array.from(node.children)) {\n relocateElement(child as HTMLElement, child.tagName.toLowerCase());\n relocateWalk(child);\n }\n}\n\n/** A `<col>` width (style width or `width` attr) normalized to a px/% token. */\nfunction colWidth(col: Element): string | null {\n const styleWidth = /width\\s*:\\s*([^;]+)/i.exec(col.getAttribute('style') ?? '')?.[1]?.trim();\n const v = (styleWidth || col.getAttribute('width') || '').trim();\n if (!v) return null;\n if (/^\\d+$/.test(v)) return `${v}px`;\n if (LENGTH_TOKEN.test(v) && /(?:px|%)$/.test(v)) return v;\n return null;\n}\n\n/** Per-column widths of a table's own colgroup, expanding `span`. */\nfunction tableColWidths(table: Element): (string | null)[] {\n const widths: (string | null)[] = [];\n for (const col of Array.from(table.querySelectorAll(':scope > colgroup > col, :scope > col'))) {\n const span = parseInt(col.getAttribute('span') ?? '1', 10);\n const n = Number.isFinite(span) && span > 0 ? span : 1;\n const w = colWidth(col);\n for (let i = 0; i < n; i += 1) widths.push(w);\n }\n return widths;\n}\n\n/** A table's own rows (not nested tables' rows). */\nfunction directRows(table: Element): Element[] {\n const rows: Element[] = [];\n for (const child of Array.from(table.children)) {\n const t = child.tagName.toLowerCase();\n if (t === 'tr') rows.push(child);\n else if (t === 'thead' || t === 'tbody' || t === 'tfoot') {\n for (const row of Array.from(child.children)) {\n if (row.tagName.toLowerCase() === 'tr') rows.push(row);\n }\n }\n }\n return rows;\n}\n\n/** Copies colgroup widths onto unsized cells (rows with a colspan are skipped). */\nfunction applyColgroupWidths(table: Element): void {\n const widths = tableColWidths(table);\n if (!widths.some(Boolean)) return;\n for (const row of directRows(table)) {\n const cells = Array.from(row.children).filter(c => /^t[dh]$/.test(c.tagName.toLowerCase()));\n if (cells.some(c => parseInt(c.getAttribute('colspan') ?? '1', 10) > 1)) continue;\n cells.forEach((cell, idx) => {\n const w = widths[idx];\n if (!w) return;\n const hasWidth =\n /(?:^|;)\\s*width\\s*:/i.test(cell.getAttribute('style') ?? '') || cell.hasAttribute('width');\n if (hasWidth) return;\n const style = cell.getAttribute('style') ?? '';\n cell.setAttribute('style', style ? `${style}; width: ${w}` : `width: ${w}`);\n });\n }\n}\n\n/** Fidelity-only pass run right before parsing; see `relocateElement`. */\nexport function relocateEmailContainers(html: string): string {\n const doc = new DOMParser().parseFromString(`<body>${html}</body>`, 'text/html');\n relocateWalk(doc.body);\n return doc.body.innerHTML;\n}\n\n/**\n * Sanitizes the CSS inside a <style> block. Neutralizes the vectors that make\n * a raw stylesheet dangerous while leaving ordinary rules intact:\n * - `@import` (external fetch / data exfiltration) — removed,\n * - `expression()`, `behavior:`, `-moz-binding:` (script execution) — broken,\n * - `url(...)` pointing anywhere other than a safe data: image or a local\n * `#fragment` — replaced with `url(#)`,\n * - any `</style` sequence — stripped so the text can't break out of the\n * element when the document is re-serialized.\n * CSS comments are dropped first so none of the above can hide inside one.\n */\nexport function sanitizeCss(css: string): string {\n return css\n .replace(/<\\/style/gi, '')\n .replace(/\\/\\*[\\s\\S]*?\\*\\//g, '')\n .replace(/@import[^;]*;?/gi, '')\n .replace(/expression\\s*\\(/gi, 'blocked(')\n .replace(/(behavior|-moz-binding)(\\s*):/gi, 'blocked-prop$2:')\n .replace(/url\\(\\s*(['\"]?)([^)]*?)\\1\\s*\\)/gi, (full, _quote, raw) => {\n const url = String(raw).trim();\n if (/^#/.test(url)) return full;\n if (/^data:image\\/(png|gif|jpe?g|webp|avif|bmp);/i.test(url)) return full;\n return 'url(#)';\n })\n .trim();\n}\n\n/** Container tags an app may widen with `allowedStyles`. */\nconst EXTENSION_TAGS = new Set(['td', 'th', 'table', 'p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6']);\n\n/** The allowlisted, grammar-valid extension declarations for a container, or ''. */\nfunction computeExtraStyle(el: Element, allowed: Set<string> | undefined): string {\n if (!allowed) return '';\n const kept: string[] = [];\n for (const decl of (el.getAttribute('style') ?? '').split(';')) {\n const idx = decl.indexOf(':');\n if (idx === -1) continue;\n const name = decl.slice(0, idx).trim().toLowerCase();\n const value = decl.slice(idx + 1).trim();\n if (allowed.has(name) && isExtensionValueValid(value)) kept.push(`${name}: ${value}`);\n }\n return kept.join('; ');\n}\n\n/** Re-validates a stored cell/table text style on write-back. */\nexport function sanitizeTableTextStyleForWrite(s: string): string {\n const kept: string[] = [];\n for (const decl of String(s ?? '').split(';')) {\n const idx = decl.indexOf(':');\n if (idx === -1) continue;\n const name = decl.slice(0, idx).trim().toLowerCase();\n const value = decl.slice(idx + 1).trim();\n if (!value) continue;\n const ok =\n name === 'line-height'\n ? isLineHeight(value)\n : TABLE_TEXT_PROPS.includes(name) && isCellTextValid(name, value);\n if (ok) kept.push(`${name}: ${value}`);\n }\n return kept.join('; ');\n}\n\nfunction sanitizeElement(\n el: Element,\n emailFidelity = false,\n allowedStyles?: NormalizedAllowedStyles\n): void {\n const tag = el.tagName.toLowerCase();\n // With fidelity, a table pushes its colgroup column widths down onto its own\n // cells before they are sanitized (the <col> widths are stripped otherwise).\n if (emailFidelity && tag === 'table') applyColgroupWidths(el);\n // Fidelity recomputes the container style, written back after the attribute pass.\n const email =\n emailFidelity && CONTAINER_TAGS.has(tag) ? computeContainerStyle(el, tag) : null;\n // Extension declarations come from the original style and move to data-extra-style.\n const extra =\n emailFidelity && EXTENSION_TAGS.has(tag)\n ? computeExtraStyle(el, allowedStyles?.get(tag))\n : '';\n const allowed = TAG_ATTRS[tag];\n for (const attr of Array.from(el.attributes)) {\n const name = attr.name.toLowerCase();\n const keep =\n (GLOBAL_ATTRS.has(name) || (allowed !== undefined && allowed.has(name))) &&\n !name.startsWith('on');\n if (!keep) {\n el.removeAttribute(attr.name);\n continue;\n }\n if (name === 'style') {\n const filtered = filterStyle(attr.value, tag);\n if (filtered) el.setAttribute('style', filtered);\n else el.removeAttribute('style');\n } else if (name === 'class') {\n const cleaned = cleanClassAttr(attr.value);\n if (cleaned) el.setAttribute('class', cleaned);\n else el.removeAttribute('class');\n } else if (name === 'id') {\n if (RESERVED_NAME.test(attr.value)) el.removeAttribute('id');\n } else if (name === 'href' || name === 'src') {\n // Raster data: URLs are allowed on images only.\n if (!isSafeUrl(attr.value, tag === 'img')) el.removeAttribute(attr.name);\n } else if (name === 'target') {\n if (attr.value === '_blank') el.setAttribute('rel', 'noopener noreferrer');\n else el.removeAttribute('target');\n }\n }\n\n if (email !== null) {\n if (email) el.setAttribute('style', email);\n else el.removeAttribute('style');\n }\n if (extra) el.setAttribute('data-extra-style', extra);\n}\n\nfunction walk(\n node: Element,\n emailFidelity = false,\n allowedStyles?: NormalizedAllowedStyles\n): void {\n for (const child of Array.from(node.children)) {\n const tag = child.tagName.toLowerCase();\n if (DROP_WITH_CONTENT.has(tag)) {\n child.remove();\n continue;\n }\n // Email preheaders: elements hidden with display:none / mso-hide are dropped\n // together with their content so they don't surface as 1px text.\n if (emailFidelity) {\n const style = child.getAttribute('style') ?? '';\n if (/display\\s*:\\s*none/i.test(style) || /mso-hide\\s*:\\s*all/i.test(style)) {\n child.remove();\n continue;\n }\n }\n // iframes are allowed for any https src, but always force-sandboxed so an\n // untrusted embed can never navigate the top window or run unrestricted.\n if (tag === 'iframe') {\n if (!isAllowedEmbedSrc(child.getAttribute('src') ?? '')) {\n child.remove();\n continue;\n }\n child.setAttribute('sandbox', EMBED_SANDBOX);\n child.setAttribute('referrerpolicy', EMBED_REFERRER_POLICY);\n }\n // <style> blocks are kept, but their CSS is sanitized and any attributes\n // (media, nonce, …) dropped. Handled before the unwrap branch below so the\n // raw CSS is never spilled into the document as visible text.\n if (tag === 'style') {\n child.textContent = sanitizeCss(child.textContent ?? '');\n for (const attr of Array.from(child.attributes)) child.removeAttribute(attr.name);\n continue;\n }\n if (!ALLOWED_TAGS.has(tag)) {\n // Unknown wrapper (article, section, table for now, …): keep its\n // content, drop the element itself.\n walk(child, emailFidelity, allowedStyles);\n child.replaceWith(...Array.from(child.childNodes));\n continue;\n }\n sanitizeElement(child, emailFidelity, allowedStyles);\n walk(child, emailFidelity, allowedStyles);\n }\n}\n\n/* --- email-fidelity: button links → one-cell table buttons (flag-gated) --- */\n\n/** Box declarations an email \"button\" link carries; moved onto the new cell. */\nconst BUTTON_CELL_PROPS = new Set([\n 'background-color', 'padding', 'padding-top', 'padding-right',\n 'padding-bottom', 'padding-left', 'border-radius', 'width', 'border',\n 'border-top', 'border-right', 'border-bottom', 'border-left', 'text-align',\n]);\n\n/** Text-level declarations kept on the link (they become marks on its text). */\nconst BUTTON_LINK_PROPS = new Set([\n 'color', 'font-size', 'font-weight', 'font-family', 'font-style',\n 'text-decoration', 'text-decoration-line', 'line-height',\n]);\n\n/** Block parents whose sole-child button link may be lifted into a table. */\nconst BUTTON_PARENT_TAGS = new Set(['td', 'th', 'div', 'p']);\n\ninterface Decl {\n name: string;\n value: string;\n}\n\n/** Splits an inline `style` into `{name, value}` pairs (names lowercased). */\nfunction parseDecls(style: string): Decl[] {\n const out: Decl[] = [];\n for (const decl of style.split(';')) {\n const idx = decl.indexOf(':');\n if (idx === -1) continue;\n const name = decl.slice(0, idx).trim().toLowerCase();\n const value = decl.slice(idx + 1).trim();\n if (name && value) out.push({ name, value });\n }\n return out;\n}\n\n/** A button link: `display:inline-block|block` plus a background or padding. */\nfunction isButtonLink(decls: Decl[]): boolean {\n const display = decls.find(d => d.name === 'display')?.value.toLowerCase();\n if (display !== 'inline-block' && display !== 'block') return false;\n return decls.some(d => d.name === 'background-color' || d.name.startsWith('padding'));\n}\n\n/** True when the link is horizontally auto-centred (`margin: 0 auto`, etc.). */\nfunction hasAutoHMargin(decls: Decl[]): boolean {\n const ml = decls.find(d => d.name === 'margin-left')?.value.toLowerCase();\n const mr = decls.find(d => d.name === 'margin-right')?.value.toLowerCase();\n if (ml === 'auto' || mr === 'auto') return true;\n const margin = decls.find(d => d.name === 'margin')?.value;\n if (!margin) return false;\n const tokens = margin.trim().split(/\\s+/);\n const right = tokens.length >= 2 ? tokens[1] : tokens[0];\n const left = tokens.length >= 4 ? tokens[3] : right;\n return left.toLowerCase() === 'auto' || right.toLowerCase() === 'auto';\n}\n\n/** True when a block centres its content via text-align / legacy align. */\nfunction blockCentered(el: Element): boolean {\n if (/text-align\\s*:\\s*center/i.test(el.getAttribute('style') ?? '')) return true;\n return el.getAttribute('align')?.toLowerCase() === 'center';\n}\n\n/** The link is the only non-whitespace content of its parent block. */\nfunction isSoleContent(parent: Element, child: Element): boolean {\n for (const node of Array.from(parent.childNodes)) {\n if (node === child) continue;\n if (node.nodeType === 3) {\n if ((node.textContent ?? '').trim() !== '') return false;\n } else {\n return false;\n }\n }\n return true;\n}\n\n/** Rebuilds each email button link as a one-cell layout table. */\nfunction convertButtonLinks(body: HTMLElement): void {\n const doc = body.ownerDocument;\n for (const a of Array.from(body.querySelectorAll('a[href]'))) {\n const decls = parseDecls(a.getAttribute('style') ?? '');\n if (!isButtonLink(decls)) continue;\n const parent = a.parentElement;\n if (!parent) continue;\n if (!BUTTON_PARENT_TAGS.has(parent.tagName.toLowerCase())) continue;\n if (!isSoleContent(parent, a)) continue;\n\n // Box declarations go to the cell; text declarations stay on the link;\n // margins/display are dropped (margins only inform centring below).\n const cell = decls.filter(d => BUTTON_CELL_PROPS.has(d.name));\n if (!cell.some(d => d.name === 'text-align')) {\n cell.push({ name: 'text-align', value: 'center' });\n }\n const linkStyle = decls\n .filter(d => BUTTON_LINK_PROPS.has(d.name))\n .map(d => `${d.name}: ${d.value}`)\n .join('; ');\n const centred = hasAutoHMargin(decls) || blockCentered(parent);\n\n const table = doc.createElement('table');\n table.setAttribute('role', 'presentation');\n if (centred) table.setAttribute('align', 'center');\n const tbody = doc.createElement('tbody');\n const tr = doc.createElement('tr');\n const td = doc.createElement('td');\n td.setAttribute('style', cell.map(d => `${d.name}: ${d.value}`).join('; '));\n if (linkStyle) a.setAttribute('style', linkStyle);\n else a.removeAttribute('style');\n td.appendChild(a); // detaches the link from its original parent\n tr.appendChild(td);\n tbody.appendChild(tr);\n table.appendChild(tbody);\n\n const parentTag = parent.tagName.toLowerCase();\n if (parentTag === 'p' || parentTag === 'div') parent.replaceWith(table);\n else parent.appendChild(table);\n }\n}\n\n/* --- email-fidelity: push centring onto blocks that can carry it (flag-gated) --- */\n\n/** Inline tags: loose runs of these (and text) inside a div/center are wrapped. */\nconst INLINE_TAGS = new Set([\n 'a', 'b', 'strong', 'i', 'em', 'u', 's', 'strike', 'del', 'span', 'code',\n 'sub', 'sup', 'font', 'br', 'img', 'small', 'big', 'mark', 'abbr', 'q', 'cite',\n 'label', 'bdi', 'bdo', 'wbr', 'time', 'kbd', 'samp', 'var',\n]);\n\n/** A node that may be lifted into a wrapping paragraph (inline element or text). */\nfunction isLooseInline(node: Node): boolean {\n if (node.nodeType === 3) return true;\n if (node.nodeType !== 1) return false;\n return INLINE_TAGS.has((node as Element).tagName.toLowerCase());\n}\n\n/** True when `el` already declares a valid `text-align` or legacy `align`. */\nfunction hasOwnTextAlign(el: Element): boolean {\n const styleAlign = /text-align\\s*:\\s*([a-z-]+)/i.exec(el.getAttribute('style') ?? '')?.[1];\n if (styleAlign && TEXT_ALIGN_KEYWORDS.has(styleAlign.toLowerCase())) return true;\n const attr = el.getAttribute('align');\n return !!(attr && LEGACY_ALIGN_KEYWORDS.has(attr.toLowerCase()));\n}\n\n/** Appends `text-align: value` to an element's inline style. */\nfunction addTextAlign(el: Element, value: string): void {\n const style = (el.getAttribute('style') ?? '').trim();\n el.setAttribute('style', style ? `${style}; text-align: ${value}` : `text-align: ${value}`);\n}\n\n/** Direct cells of a table (its own rows', not a nested table's). */\nfunction directCells(table: Element): Element[] {\n const cells: Element[] = [];\n for (const row of directRows(table)) {\n for (const child of Array.from(row.children)) {\n if (/^t[dh]$/.test(child.tagName.toLowerCase())) cells.push(child);\n }\n }\n return cells;\n}\n\n/** True when `el` sits inside a table that is itself a descendant of `wrapper`. */\nfunction insideNestedTable(el: Element, wrapper: Element): boolean {\n let p = el.parentElement;\n while (p && p !== wrapper) {\n if (p.tagName.toLowerCase() === 'table') return true;\n p = p.parentElement;\n }\n return false;\n}\n\n/** The block descendants (p/h1-6/li) of `wrapper` not inside a nested table. */\nfunction alignableBlocks(wrapper: Element): Element[] {\n return Array.from(wrapper.querySelectorAll('p, h1, h2, h3, h4, h5, h6, li')).filter(\n el => !insideNestedTable(el, wrapper)\n );\n}\n\n/** Wraps each loose inline run directly inside `wrapper` in an aligned `<p>`. */\nfunction wrapLooseInline(wrapper: Element, value: string): void {\n const doc = wrapper.ownerDocument;\n let group: ChildNode[] = [];\n const flush = (): void => {\n // Trim trailing whitespace-only text nodes so they stay outside the paragraph.\n while (group.length && group[group.length - 1].nodeType === 3\n && (group[group.length - 1].textContent ?? '').trim() === '') {\n group.pop();\n }\n if (!group.length) return;\n const p = doc.createElement('p');\n p.setAttribute('style', `text-align: ${value}`);\n group[0].before(p);\n for (const node of group) p.appendChild(node);\n group = [];\n };\n for (const node of Array.from(wrapper.childNodes)) {\n if (isLooseInline(node)) {\n const blank = node.nodeType === 3 && (node.textContent ?? '').trim() === '';\n // Leading whitespace with nothing accumulated is left where it is.\n if (blank && !group.length) continue;\n group.push(node as ChildNode);\n } else {\n flush();\n }\n }\n flush();\n}\n\n/** Pushes a `<center>`/aligned-`<div>` alignment onto its blocks (and tables, for legacy forms). */\nfunction propagateBlockAlignment(wrapper: Element, value: string, centreTables: boolean): void {\n wrapLooseInline(wrapper, value);\n for (const block of alignableBlocks(wrapper)) {\n if (!hasOwnTextAlign(block)) addTextAlign(block, value);\n }\n if (centreTables) {\n for (const table of Array.from(wrapper.querySelectorAll('table'))) {\n if (insideNestedTable(table, wrapper)) continue;\n if (!table.getAttribute('align')) table.setAttribute('align', value);\n }\n }\n}\n\n/** Pre-pass: resolve container-level alignment onto blocks/cells (see above). */\nfunction propagateEmailAlignment(body: HTMLElement): void {\n // Cases 2–4: <center>, div[align], div[style text-align].\n for (const el of Array.from(body.querySelectorAll('center, div'))) {\n const tag = el.tagName.toLowerCase();\n if (tag === 'center') {\n propagateBlockAlignment(el, 'center', true);\n continue;\n }\n const attr = el.getAttribute('align')?.toLowerCase();\n if (attr && LEGACY_ALIGN_KEYWORDS.has(attr)) {\n propagateBlockAlignment(el, attr, true);\n continue;\n }\n const styleAlign = /text-align\\s*:\\s*([a-z-]+)/i.exec(el.getAttribute('style') ?? '')?.[1]\n ?.toLowerCase();\n if (styleAlign && TEXT_ALIGN_KEYWORDS.has(styleAlign)) {\n propagateBlockAlignment(el, styleAlign, false);\n }\n }\n\n // Case 1: a cell's align must not leak into a table nested directly in it.\n for (const cell of Array.from(body.querySelectorAll('td[align], th[align]'))) {\n const attr = cell.getAttribute('align')?.toLowerCase();\n if (!attr || !LEGACY_ALIGN_KEYWORDS.has(attr)) continue;\n for (const table of Array.from(cell.querySelectorAll('table'))) {\n if (table.closest('td, th') !== cell) continue;\n for (const nested of directCells(table)) {\n if (!hasOwnTextAlign(nested)) addTextAlign(nested, 'left');\n }\n }\n }\n\n // Case 5: CSS text-align on a table → its direct cells that have none.\n for (const table of Array.from(body.querySelectorAll('table'))) {\n const styleAlign = /text-align\\s*:\\s*([a-z-]+)/i.exec(table.getAttribute('style') ?? '')?.[1]\n ?.toLowerCase();\n if (!styleAlign || !TEXT_ALIGN_KEYWORDS.has(styleAlign)) continue;\n for (const cell of directCells(table)) {\n if (!hasOwnTextAlign(cell)) addTextAlign(cell, styleAlign);\n }\n }\n\n // Case 6: tr[align] → its own cells that have none.\n for (const tr of Array.from(body.querySelectorAll('tr[align]'))) {\n const attr = tr.getAttribute('align')?.toLowerCase();\n if (!attr || !LEGACY_ALIGN_KEYWORDS.has(attr)) continue;\n for (const child of Array.from(tr.children)) {\n if (!/^t[dh]$/.test(child.tagName.toLowerCase())) continue;\n if (!hasOwnTextAlign(child)) addTextAlign(child, attr);\n }\n }\n}\n\n/**\n * Sanitizes an HTML string. Parsing happens in an inert document created by\n * DOMParser, so embedded scripts never execute and images never load.\n */\nexport function sanitizeHtml(\n html: string,\n options?: { emailFidelity?: boolean; allowedStyles?: NormalizedAllowedStyles }\n): string {\n // Wrap in an explicit <body> so metadata-like tags (notably <style>) stay in\n // the body instead of being hoisted into <head> by the HTML parser — which\n // would drop them before walk() ever sees them. Mirrors htmlToDoc's parse.\n const doc = new DOMParser().parseFromString(`<body>${html}</body>`, 'text/html');\n // Button links are restructured into one-cell tables before the walk, so the\n // cell/link styles they produce pass through the normal validators.\n if (options?.emailFidelity) {\n convertButtonLinks(doc.body);\n propagateEmailAlignment(doc.body);\n }\n walk(doc.body, options?.emailFidelity ?? false, options?.allowedStyles);\n return doc.body.innerHTML;\n}\n"],"names":["isSafeUrl","url","allowDataImage","trimmed","trim","test","match","exec","protocol","toLowerCase","SAFE_URL_PROTOCOLS","includes","filterStyle","value","tag","extra","SIZED_TAGS","split","map","decl","filter","name","slice","indexOf","ALLOWED_STYLES","has","join","isAscii","hasUnsafeToken","isLengthToken","token","LENGTH_TOKEN","isLengthList","tokens","length","every","isColor","v","isLineHeight","isBorder","_t$trim$match","hasStyle","_iterator","_createForOfIteratorHelper","s","_step","n","done","BORDER_STYLES","err","e","f","isValign","VALIGN_KEYWORDS","isLayoutValid","startsWith","isCellTextValid","relocateElement","el","bg","style","backgroundColor","setAttribute","removeProperty","parts","_iterator2","CELL_TEXT_PROPS","_step2","prop","getPropertyValue","push","concat","align","textAlign","getAttribute","removeAttribute","_t$parentElement","_t$getAttribute","_o3$getAttribute","textParts","_iterator3","TABLE_TEXT_PROPS","_step3","holder","parentElement","closest","relocateWalk","node","_i","_Array$from","Array","from","children","child","tagName","colWidth","col","_exec","_t$getAttribute2","styleWidth","directRows","table","rows","_i2","_Array$from2","t","_i3","_Array$from3","row","applyColgroupWidths","widths","_i4","_Array$from4","querySelectorAll","_e4$getAttribute","span","parseInt","Number","isFinite","w","i","tableColWidths","some","Boolean","_step4","_iterator4","cells","c","forEach","cell","idx","_t$getAttribute4","hasAttribute","_t$getAttribute5","relocateEmailContainers","html","doc","DOMParser","parseFromString","body","innerHTML","sanitizeTableTextStyleForWrite","kept","_iterator5","String","_step5","sanitizeElement","emailFidelity","allowedStyles","arguments","undefined","email","CONTAINER_TAGS","_t$getAttribute6","isCell","isTable","isBlock","_iterator6","_step6","TEXT_ALIGN_KEYWORDS","_ref","right","_ref2","left","CONTAINER_DROP","CELL_BORDER_LONGHAND","CELL_LAYOUT","TABLE_LAYOUT","BLOCK_LAYOUT","d","_loop","side","_i5","_arr","bgcolor","widthAttr","width","valign","alignAttr","LEGACY_ALIGN_KEYWORDS","computeContainerStyle","EXTENSION_TAGS","allowed","_iterator7","_t$getAttribute7","_step7","isExtensionValueValid","computeExtraStyle","get","TAG_ATTRS","_i8","_Array$from5","attributes","attr","GLOBAL_ATTRS","filtered","cleaned","RESERVED_NAME","walk","_i9","_Array$from6","DROP_WITH_CONTENT","remove","_l2$getAttribute","_l2$getAttribute2","isAllowedEmbedSrc","EMBED_SANDBOX","EMBED_REFERRER_POLICY","ALLOWED_TAGS","replaceWith","childNodes","_l2$textContent","textContent","replace","full","_quote","raw","_i10","_Array$from7","parseDecls","out","_iterator8","_step8","isButtonLink","decls","display","find","hasAutoHMargin","ml","mr","margin","isSoleContent","parent","_i11","_Array$from8","_e12$textContent","nodeType","isLooseInline","INLINE_TAGS","hasOwnTextAlign","styleAlign","_exec2","_t$getAttribute8","addTextAlign","_t$getAttribute9","directCells","_iterator9","_step9","_i12","_Array$from9","insideNestedTable","wrapper","p","propagateBlockAlignment","centreTables","ownerDocument","group","flush","_o$textContent","pop","createElement","before","_i13","_o10","appendChild","_i14","_Array$from10","_n12$textContent","wrapLooseInline","_iterator10","alignableBlocks","_step10","block","_i15","_Array$from11","sanitizeHtml","options","_i16","_Array$from12","_o11$getAttribute","_e$getAttribute","_e$getAttribute2","a","BUTTON_PARENT_TAGS","BUTTON_CELL_PROPS","linkStyle","BUTTON_LINK_PROPS","centred","tbody","tr","td","parentTag","convertButtonLinks","_i18","_Array$from13","_n13$getAttribute","_exec3","_n13$getAttribute2","_i19","_Array$from14","_n14$getAttribute","_i20","_Array$from15","_iterator11","_step11","nested","_i21","_Array$from16","_exec4","_n16$getAttribute","_iterator12","_step12","_i22","_Array$from17","_n17$getAttribute","_i23","_Array$from18","propagateEmailAlignment","Set","ol","ul","figure","li","pre","img","th","div","iframe"],"mappings":"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"}
@@ -1 +1 @@
1
- import{i as t,E as e,a}from"./plugins/embeds.esm.js";import"../../index-6f3fa4ab.esm.js";const i=new Set(["script","frame","frameset","object","embed","applet","form","input","textarea","select","button","meta","link","base","title","noscript","template","svg","math","canvas","audio","video","dialog","slot"]),n=new Set(["p","h1","h2","h3","h4","h5","h6","blockquote","ul","ol","li","br","hr","a","b","strong","i","em","u","s","strike","del","span","code","sub","sup","div","font","pre","figure","figcaption","img","iframe","table","thead","tbody","tfoot","tr","td","th","colgroup","col"]),r={a:new Set(["href","title","target","rel","id","name","data-bookmark"]),table:new Set(["role","data-layout"]),ol:new Set(["start","type","data-list-style"]),ul:new Set(["data-task-list"]),figure:new Set(["data-align"]),li:new Set(["data-task-item","data-checked"]),span:new Set(["data-mention-trigger","data-mention-key","data-mention-label","data-merge-field","data-merge-label","data-math","data-math-display"]),pre:new Set(["data-language"]),img:new Set(["src","alt","title","width","height"]),td:new Set(["colspan","rowspan","data-colwidth"]),th:new Set(["colspan","rowspan","data-colwidth"]),col:new Set(["span","width"]),div:new Set(["data-embed-provider","data-width","data-align"]),iframe:new Set(["src","title","frameborder","allowfullscreen","allow","sandbox","referrerpolicy"])},o=new Set(["style","align","class","id"]),s=/^(?:nile-wysiwyg|ProseMirror)/;const l=new Set(["color","background-color","font-family","font-size","font-style","font-weight","text-align","text-decoration","text-decoration-line","vertical-align","margin-left","margin-inline-start","list-style-type","line-height"]),d=["http:","https:","mailto:","tel:","ftp:"];function c(t,e=!1){const a=t.trim();if(""===a)return!1;if(/^(#|\/|\.\/|\.\.\/)/.test(a))return!0;const i=/^([a-z][a-z0-9+.-]*):/i.exec(a);if(!i)return!0;const n=`${i[1].toLowerCase()}:`;return!!d.includes(n)||!(!e||"data:"!==n)&&/^data:image\/(png|gif|jpe?g|webp|avif|bmp);/i.test(a)}const f={img:new Set(["width","height"]),figure:new Set(["width","margin-right"]),div:new Set(["width","max-width"])};function g(t,e){const a=f[e];return t.split(";").map((t=>t.trim())).filter((t=>{const e=t.slice(0,t.indexOf(":")).trim().toLowerCase();return!!(l.has(e)||a&&a.has(e))&&!/url\s*\(|expression\s*\(/i.test(t)})).join("; ")}function m(t){const e=t.tagName.toLowerCase(),a=r[e];for(const i of Array.from(t.attributes)){const n=i.name.toLowerCase();if((o.has(n)||void 0!==a&&a.has(n))&&!n.startsWith("on"))if("style"===n){const a=g(i.value,e);a?t.setAttribute("style",a):t.removeAttribute("style")}else if("class"===n){const e=i.value.split(/\s+/).filter((t=>t&&!s.test(t))).join(" ");e?t.setAttribute("class",e):t.removeAttribute("class")}else"id"===n?s.test(i.value)&&t.removeAttribute("id"):"href"===n||"src"===n?c(i.value,"img"===e)||t.removeAttribute(i.name):"target"===n&&("_blank"===i.value?t.setAttribute("rel","noopener noreferrer"):t.removeAttribute("target"));else t.removeAttribute(i.name)}}function p(r){for(const o of Array.from(r.children)){const r=o.tagName.toLowerCase();if(i.has(r))o.remove();else{if("iframe"===r){if(!t(o.getAttribute("src")??"")){o.remove();continue}o.setAttribute("sandbox",e),o.setAttribute("referrerpolicy",a)}if("style"!==r)n.has(r)?(m(o),p(o)):(p(o),o.replaceWith(...Array.from(o.childNodes)));else{o.textContent=(o.textContent??"").replace(/<\/style/gi,"").replace(/\/\*[\s\S]*?\*\//g,"").replace(/@import[^;]*;?/gi,"").replace(/expression\s*\(/gi,"blocked(").replace(/(behavior|-moz-binding)(\s*):/gi,"blocked-prop$2:").replace(/url\(\s*(['"]?)([^)]*?)\1\s*\)/gi,((t,e,a)=>{const i=String(a).trim();return/^#/.test(i)||/^data:image\/(png|gif|jpe?g|webp|avif|bmp);/i.test(i)?t:"url(#)"})).trim();for(const t of Array.from(o.attributes))o.removeAttribute(t.name)}}}}function w(t){const e=(new DOMParser).parseFromString(`<body>${t}</body>`,"text/html");return p(e.body),e.body.innerHTML}export{c as i,w as s};
1
+ import{i as t,E as n,a as e}from"./plugins/embeds.esm.js";import{i as o}from"./email-css.esm.js";import"../../index-7ca72b78.esm.js";import"../../index-5d34cff1.esm.js";const r=new Set(["script","frame","frameset","object","embed","applet","form","input","textarea","select","button","meta","link","base","title","noscript","template","svg","math","canvas","audio","video","dialog","slot"]),i=new Set(["p","h1","h2","h3","h4","h5","h6","blockquote","ul","ol","li","br","hr","a","b","strong","i","em","u","s","strike","del","span","code","sub","sup","div","font","pre","figure","figcaption","img","iframe","table","thead","tbody","tfoot","tr","td","th","colgroup","col"]),s={a:new Set(["href","title","target","rel","id","name","data-bookmark"]),table:new Set(["role","data-layout"]),ol:new Set(["start","type","data-list-style"]),ul:new Set(["data-task-list"]),figure:new Set(["data-align"]),li:new Set(["data-task-item","data-checked"]),span:new Set(["data-mention-trigger","data-mention-key","data-mention-label","data-merge-field","data-merge-label","data-math","data-math-display"]),pre:new Set(["data-language"]),img:new Set(["src","alt","title","width","height"]),td:new Set(["colspan","rowspan","data-colwidth"]),th:new Set(["colspan","rowspan","data-colwidth"]),col:new Set(["span","width"]),div:new Set(["data-embed-provider","data-width","data-align"]),iframe:new Set(["src","title","frameborder","allowfullscreen","allow","sandbox","referrerpolicy"])},a=new Set(["style","align","class","id"]),l=/^(?:nile-wysiwyg|ProseMirror)/;const c=new Set(["color","background-color","font-family","font-size","font-style","font-weight","text-align","text-decoration","text-decoration-line","vertical-align","margin-left","margin-inline-start","list-style-type","line-height"]),f=["http:","https:","mailto:","tel:","ftp:"];function d(t,n=!1){const e=t.trim();if(""===e)return!1;if(/^(#|\/|\.\/|\.\.\/)/.test(e))return!0;const o=/^([a-z][a-z0-9+.-]*):/i.exec(e);if(!o)return!0;const r=`${o[1].toLowerCase()}:`;return!!f.includes(r)||!(!n||"data:"!==r)&&/^data:image\/(png|gif|jpe?g|webp|avif|bmp);/i.test(e)}const u={img:new Set(["width","height"]),figure:new Set(["width","margin-right"]),div:new Set(["width","max-width"])};function g(t,n){const e=u[n];return t.split(";").map((t=>t.trim())).filter((t=>{const n=t.slice(0,t.indexOf(":")).trim().toLowerCase();return!!(c.has(n)||e&&e.has(n))&&!/url\s*\(|expression\s*\(/i.test(t)})).join("; ")}const h=new Set(["table","td","th","p","h1","h2","h3","h4","h5","h6","div","li","blockquote","tr","tbody"]),b=new Set(["color","background-color","font-family","font-size","font-weight","font-style","text-decoration","text-decoration-line","text-decoration-style","text-decoration-color"]),p=new Set(["padding","padding-top","padding-right","padding-bottom","padding-left","width","vertical-align","border","border-top","border-right","border-bottom","border-left","border-radius"]),m=/^border-(?:(?:top|right|bottom|left)-)?(?:width|style|color)$/,y=new Set(["width","max-width","border","margin-left","margin-right"]),w=new Set(["margin","margin-top","margin-bottom"]),$=new Set(["solid","dashed","dotted","double","none"]),x=new Set(["top","middle","bottom","baseline","sub","super","text-top","text-bottom"]),S=/^-?(?:\d+\.?\d*|\.\d+)(?:px|%|em|rem|pt)$/;function v(t){return!/[^\x00-\x7f]/.test(t)}function k(t){return/[\\/(]|url|var|calc|expression/i.test(t)}function A(t){return"0"===t||"auto"===t||S.test(t)}function z(t){if(!v(t)||k(t))return!1;const n=t.trim().split(/\s+/);return n.length>=1&&n.length<=4&&n.every(A)}function j(t){if(!v(t))return!1;const n=t.trim();return!!/^[a-z]+$/i.test(n)||(!!/^#[0-9a-f]{3,8}$/i.test(n)||(!!/^rgba?\(\s*[\d.]+%?(?:\s*,\s*[\d.]+%?){2,3}\s*\)$/i.test(n)||/^hsla?\(\s*[\d.]+%?(?:\s*,\s*[\d.]+%?){2,3}\s*\)$/i.test(n)))}function q(t){if(!v(t)||k(t))return!1;const n=t.trim();return!!/^\d+(?:\.\d+)?$/.test(n)||A(n)}const M=new Set(["left","center","right","justify","start","end"]),P=new Set(["left","center","right","justify"]);function D(t){if(!v(t))return!1;if(/[\\/]|url|var|calc|expression/i.test(t))return!1;const n=t.trim().match(/rgba?\([^)]*\)|\S+/gi)??[];if(!n.length)return!1;let e=!1;for(const t of n)if($.has(t.toLowerCase()))e=!0;else if(!A(t)&&!j(t))return!1;return e}function I(t){const n=t.trim().toLowerCase();return x.has(n)||A(n)}function O(t,n){return"vertical-align"===t?I(n):"border-radius"===t?z(n):t.startsWith("border")?D(n):z(n)}function B(t,n){return!(!v(n)||/url|expression|var|calc/i.test(n))&&("color"===t?j(n):"font-size"===t?A(n):"font-weight"===t?/^(normal|bold|bolder|lighter|[1-9]00)$/i.test(n.trim()):!/[(){}<>;\\]/.test(n))}const E=["color","font-family","font-size","font-weight"],N=["color","font-family","font-size","font-weight","line-height"];function _(t,n){if("td"===n||"th"===n){const n=t.style.backgroundColor;n&&(t.setAttribute("data-cell-bg",n),t.style.removeProperty("background-color"));const e=[];for(const n of E){const o=t.style.getPropertyValue(n);o&&(e.push(`${n}: ${o}`),t.style.removeProperty(n))}e.length&&t.setAttribute("data-cell-text-style",e.join("; "));const o=t.style.textAlign;o&&(t.setAttribute("data-cell-align",o),t.style.removeProperty("text-align")),t.getAttribute("style")||t.removeAttribute("style")}else if("table"===n){const n=t.style.backgroundColor;n&&(t.setAttribute("data-table-bg",n),t.style.removeProperty("background-color"));const e=[];for(const n of N){const o=t.style.getPropertyValue(n);o&&(e.push(`${n}: ${o}`),t.style.removeProperty(n))}e.length&&t.setAttribute("data-table-text-style",e.join("; "));const o=t.parentElement?.closest("td, th");"center"!==t.getAttribute("align")?.toLowerCase()&&"center"!==o?.getAttribute("align")?.toLowerCase()||t.setAttribute("data-table-align","center"),t.getAttribute("style")||t.removeAttribute("style")}}function C(t){for(const n of Array.from(t.children))_(n,n.tagName.toLowerCase()),C(n)}function F(t){const n=/width\s*:\s*([^;]+)/i.exec(t.getAttribute("style")??"")?.[1]?.trim(),e=(n||t.getAttribute("width")||"").trim();return e?/^\d+$/.test(e)?`${e}px`:S.test(e)&&/(?:px|%)$/.test(e)?e:null:null}function G(t){const n=[];for(const e of Array.from(t.children)){const t=e.tagName.toLowerCase();if("tr"===t)n.push(e);else if("thead"===t||"tbody"===t||"tfoot"===t)for(const t of Array.from(e.children))"tr"===t.tagName.toLowerCase()&&n.push(t)}return n}function H(t){const n=function(t){const n=[];for(const e of Array.from(t.querySelectorAll(":scope > colgroup > col, :scope > col"))){const t=parseInt(e.getAttribute("span")??"1",10),o=Number.isFinite(t)&&t>0?t:1,r=F(e);for(let t=0;t<o;t+=1)n.push(r)}return n}(t);if(n.some(Boolean))for(const e of G(t)){const t=Array.from(e.children).filter((t=>/^t[dh]$/.test(t.tagName.toLowerCase())));t.some((t=>parseInt(t.getAttribute("colspan")??"1",10)>1))||t.forEach(((t,e)=>{const o=n[e];if(!o)return;if(/(?:^|;)\s*width\s*:/i.test(t.getAttribute("style")??"")||t.hasAttribute("width"))return;const r=t.getAttribute("style")??"";t.setAttribute("style",r?`${r}; width: ${o}`:`width: ${o}`)}))}}function J(t){const n=(new DOMParser).parseFromString(`<body>${t}</body>`,"text/html");return C(n.body),n.body.innerHTML}const K=new Set(["td","th","table","p","h1","h2","h3","h4","h5","h6"]);function L(t){const n=[];for(const e of String(t??"").split(";")){const t=e.indexOf(":");if(-1===t)continue;const o=e.slice(0,t).trim().toLowerCase(),r=e.slice(t+1).trim();if(!r)continue;("line-height"===o?q(r):N.includes(o)&&B(o,r))&&n.push(`${o}: ${r}`)}return n.join("; ")}function Q(t,n=!1,e){const r=t.tagName.toLowerCase();n&&"table"===r&&H(t);const i=n&&h.has(r)?function(t,n){const e="td"===n||"th"===n,o="table"===n,r=/^(?:p|h[1-6])$/.test(n),i=u[n],s=[];for(const n of(t.getAttribute("style")??"").split(";")){const t=n.indexOf(":");if(-1===t)continue;const a=n.slice(0,t).trim().toLowerCase(),l=n.slice(t+1).trim();if(l&&!/url\s*\(|expression\s*\(/i.test(n))if("background-color"!==a)if("color"!==a&&"font-family"!==a&&"font-size"!==a&&"font-weight"!==a)if("text-align"===a&&e&&M.has(l.toLowerCase()))s.push(`text-align: ${l.toLowerCase()}`);else if("line-height"===a&&o)q(l)&&s.push(`line-height: ${l}`);else if("margin"===a&&o){if(z(l)){const t=l.trim().split(/\s+/),[,n]=1===t.length?[t[0],t[0]]:[t[0],t[1]],e=t.length>=4?t[3]:n;s.push(`margin-left: ${e}`,`margin-right: ${n}`)}}else b.has(a)||e&&m.test(a)||(e&&p.has(a)&&O(a,l)||o&&y.has(a)&&O(a,l)||r&&w.has(a)&&z(l)||c.has(a)||i&&i.has(a))&&s.push(`${a}: ${l}`);else(e||r||o)&&B(a,l)&&s.push(`${a}: ${l}`);else(e||o)&&j(l)&&s.push(`${a}: ${l}`)}if(e&&!s.some((t=>t.startsWith("border:")))){const n=t.style;for(const t of["top","right","bottom","left"]){const e=`border-${t}`;if(s.some((t=>t.startsWith(`${e}:`))))continue;const o=n?.getPropertyValue(e);o&&D(o)&&s.push(`${e}: ${o}`)}}if(e||o){const n=t.getAttribute("bgcolor");n&&j(n)&&!s.some((t=>t.startsWith("background-color")))&&s.push(`background-color: ${n}`);const o=t.getAttribute("width");if(o&&!s.some((t=>t.startsWith("width")))){const t=/^\d+$/.test(o)?`${o}px`:/^\d+%$/.test(o)?o:null;t&&s.push(`width: ${t}`)}const r=t.getAttribute("valign");e&&r&&I(r)&&!s.some((t=>t.startsWith("vertical-align")))&&s.push(`vertical-align: ${r}`);const i=t.getAttribute("align");e&&i&&P.has(i.toLowerCase())&&!s.some((t=>t.startsWith("text-align")))&&s.push(`text-align: ${i.toLowerCase()}`)}return s.join("; ")}(t,r):null,f=n&&K.has(r)?function(t,n){if(!n)return"";const e=[];for(const r of(t.getAttribute("style")??"").split(";")){const t=r.indexOf(":");if(-1===t)continue;const i=r.slice(0,t).trim().toLowerCase(),s=r.slice(t+1).trim();n.has(i)&&o(s)&&e.push(`${i}: ${s}`)}return e.join("; ")}(t,e?.get(r)):"",$=s[r];for(const n of Array.from(t.attributes)){const e=n.name.toLowerCase();if((a.has(e)||void 0!==$&&$.has(e))&&!e.startsWith("on"))if("style"===e){const e=g(n.value,r);e?t.setAttribute("style",e):t.removeAttribute("style")}else if("class"===e){const e=n.value.split(/\s+/).filter((t=>t&&!l.test(t))).join(" ");e?t.setAttribute("class",e):t.removeAttribute("class")}else"id"===e?l.test(n.value)&&t.removeAttribute("id"):"href"===e||"src"===e?d(n.value,"img"===r)||t.removeAttribute(n.name):"target"===e&&("_blank"===n.value?t.setAttribute("rel","noopener noreferrer"):t.removeAttribute("target"));else t.removeAttribute(n.name)}null!==i&&(i?t.setAttribute("style",i):t.removeAttribute("style")),f&&t.setAttribute("data-extra-style",f)}function R(o,s=!1,a){for(const l of Array.from(o.children)){const o=l.tagName.toLowerCase();if(r.has(o))l.remove();else{if(s){const t=l.getAttribute("style")??"";if(/display\s*:\s*none/i.test(t)||/mso-hide\s*:\s*all/i.test(t)){l.remove();continue}}if("iframe"===o){if(!t(l.getAttribute("src")??"")){l.remove();continue}l.setAttribute("sandbox",n),l.setAttribute("referrerpolicy",e)}if("style"!==o)i.has(o)?(Q(l,s,a),R(l,s,a)):(R(l,s,a),l.replaceWith(...Array.from(l.childNodes)));else{l.textContent=(l.textContent??"").replace(/<\/style/gi,"").replace(/\/\*[\s\S]*?\*\//g,"").replace(/@import[^;]*;?/gi,"").replace(/expression\s*\(/gi,"blocked(").replace(/(behavior|-moz-binding)(\s*):/gi,"blocked-prop$2:").replace(/url\(\s*(['"]?)([^)]*?)\1\s*\)/gi,((t,n,e)=>{const o=String(e).trim();return/^#/.test(o)||/^data:image\/(png|gif|jpe?g|webp|avif|bmp);/i.test(o)?t:"url(#)"})).trim();for(const t of Array.from(l.attributes))l.removeAttribute(t.name)}}}}const T=new Set(["background-color","padding","padding-top","padding-right","padding-bottom","padding-left","border-radius","width","border","border-top","border-right","border-bottom","border-left","text-align"]),U=new Set(["color","font-size","font-weight","font-family","font-style","text-decoration","text-decoration-line","line-height"]),V=new Set(["td","th","div","p"]);function W(t){const n=[];for(const e of t.split(";")){const t=e.indexOf(":");if(-1===t)continue;const o=e.slice(0,t).trim().toLowerCase(),r=e.slice(t+1).trim();o&&r&&n.push({name:o,value:r})}return n}function X(t){const n=t.find((t=>"display"===t.name))?.value.toLowerCase();return("inline-block"===n||"block"===n)&&t.some((t=>"background-color"===t.name||t.name.startsWith("padding")))}function Y(t){const n=t.find((t=>"margin-left"===t.name))?.value.toLowerCase(),e=t.find((t=>"margin-right"===t.name))?.value.toLowerCase();if("auto"===n||"auto"===e)return!0;const o=t.find((t=>"margin"===t.name))?.value;if(!o)return!1;const r=o.trim().split(/\s+/),i=r.length>=2?r[1]:r[0];return"auto"===(r.length>=4?r[3]:i).toLowerCase()||"auto"===i.toLowerCase()}function Z(t,n){for(const e of Array.from(t.childNodes))if(e!==n){if(3!==e.nodeType)return!1;if(""!==(e.textContent??"").trim())return!1}return!0}const tt=new Set(["a","b","strong","i","em","u","s","strike","del","span","code","sub","sup","font","br","img","small","big","mark","abbr","q","cite","label","bdi","bdo","wbr","time","kbd","samp","var"]);function nt(t){return 3===t.nodeType||1===t.nodeType&&tt.has(t.tagName.toLowerCase())}function et(t){const n=/text-align\s*:\s*([a-z-]+)/i.exec(t.getAttribute("style")??"")?.[1];if(n&&M.has(n.toLowerCase()))return!0;const e=t.getAttribute("align");return!(!e||!P.has(e.toLowerCase()))}function ot(t,n){const e=(t.getAttribute("style")??"").trim();t.setAttribute("style",e?`${e}; text-align: ${n}`:`text-align: ${n}`)}function rt(t){const n=[];for(const e of G(t))for(const t of Array.from(e.children))/^t[dh]$/.test(t.tagName.toLowerCase())&&n.push(t);return n}function it(t,n){let e=t.parentElement;for(;e&&e!==n;){if("table"===e.tagName.toLowerCase())return!0;e=e.parentElement}return!1}function st(t,n,e){!function(t,n){const e=t.ownerDocument;let o=[];const r=()=>{for(;o.length&&3===o[o.length-1].nodeType&&""===(o[o.length-1].textContent??"").trim();)o.pop();if(!o.length)return;const t=e.createElement("p");t.setAttribute("style",`text-align: ${n}`),o[0].before(t);for(const n of o)t.appendChild(n);o=[]};for(const n of Array.from(t.childNodes))if(nt(n)){if(3===n.nodeType&&""===(n.textContent??"").trim()&&!o.length)continue;o.push(n)}else r();r()}(t,n);for(const e of function(t){return Array.from(t.querySelectorAll("p, h1, h2, h3, h4, h5, h6, li")).filter((n=>!it(n,t)))}(t))et(e)||ot(e,n);if(e)for(const e of Array.from(t.querySelectorAll("table")))it(e,t)||e.getAttribute("align")||e.setAttribute("align",n)}function at(t,n){const e=(new DOMParser).parseFromString(`<body>${t}</body>`,"text/html");return n?.emailFidelity&&(function(t){const n=t.ownerDocument;for(const o of Array.from(t.querySelectorAll("a[href]"))){const t=W(o.getAttribute("style")??"");if(!X(t))continue;const r=o.parentElement;if(!r)continue;if(!V.has(r.tagName.toLowerCase()))continue;if(!Z(r,o))continue;const i=t.filter((t=>T.has(t.name)));i.some((t=>"text-align"===t.name))||i.push({name:"text-align",value:"center"});const s=t.filter((t=>U.has(t.name))).map((t=>`${t.name}: ${t.value}`)).join("; "),a=Y(t)||!!/text-align\s*:\s*center/i.test((e=r).getAttribute("style")??"")||"center"===e.getAttribute("align")?.toLowerCase(),l=n.createElement("table");l.setAttribute("role","presentation"),a&&l.setAttribute("align","center");const c=n.createElement("tbody"),f=n.createElement("tr"),d=n.createElement("td");d.setAttribute("style",i.map((t=>`${t.name}: ${t.value}`)).join("; ")),s?o.setAttribute("style",s):o.removeAttribute("style"),d.appendChild(o),f.appendChild(d),c.appendChild(f),l.appendChild(c);const u=r.tagName.toLowerCase();"p"===u||"div"===u?r.replaceWith(l):r.appendChild(l)}var e}(e.body),function(t){for(const n of Array.from(t.querySelectorAll("center, div"))){if("center"===n.tagName.toLowerCase()){st(n,"center",!0);continue}const t=n.getAttribute("align")?.toLowerCase();if(t&&P.has(t)){st(n,t,!0);continue}const e=/text-align\s*:\s*([a-z-]+)/i.exec(n.getAttribute("style")??"")?.[1]?.toLowerCase();e&&M.has(e)&&st(n,e,!1)}for(const n of Array.from(t.querySelectorAll("td[align], th[align]"))){const t=n.getAttribute("align")?.toLowerCase();if(t&&P.has(t))for(const t of Array.from(n.querySelectorAll("table")))if(t.closest("td, th")===n)for(const n of rt(t))et(n)||ot(n,"left")}for(const n of Array.from(t.querySelectorAll("table"))){const t=/text-align\s*:\s*([a-z-]+)/i.exec(n.getAttribute("style")??"")?.[1]?.toLowerCase();if(t&&M.has(t))for(const e of rt(n))et(e)||ot(e,t)}for(const n of Array.from(t.querySelectorAll("tr[align]"))){const t=n.getAttribute("align")?.toLowerCase();if(t&&P.has(t))for(const e of Array.from(n.children))/^t[dh]$/.test(e.tagName.toLowerCase())&&(et(e)||ot(e,t))}}(e.body)),R(e.body,n?.emailFidelity??!1,n?.allowedStyles),e.body.innerHTML}export{L as a,d as i,J as r,at as s};