@aquera/nile-elements 1.9.5 → 1.9.7

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 (565) hide show
  1. package/README.md +9 -0
  2. package/dist/index-178e1e57.cjs.js +2 -0
  3. package/dist/index-178e1e57.cjs.js.map +1 -0
  4. package/dist/index-1faa963c.esm.js +1 -0
  5. package/dist/index-249de90a.esm.js +1 -0
  6. package/dist/index-353172ed.esm.js +1 -0
  7. package/dist/index-6f3fa4ab.esm.js +1 -0
  8. package/dist/index-89c520e9.cjs.js +5 -0
  9. package/dist/index-89c520e9.cjs.js.map +1 -0
  10. package/dist/index-920675c4.esm.js +1 -0
  11. package/dist/index-b387a9f4.cjs.js +2 -0
  12. package/dist/index-b387a9f4.cjs.js.map +1 -0
  13. package/dist/index-cc1385e0.cjs.js +2 -0
  14. package/dist/index-cc1385e0.cjs.js.map +1 -0
  15. package/dist/index-dedc38a6.esm.js +1 -0
  16. package/dist/index-df196058.cjs.js +2 -0
  17. package/dist/index-df196058.cjs.js.map +1 -0
  18. package/dist/index-f956f56d.cjs.js +7 -0
  19. package/dist/index-f956f56d.cjs.js.map +1 -0
  20. package/dist/index.cjs.js +1 -1
  21. package/dist/index.esm.js +1 -1
  22. package/dist/index.js +3802 -664
  23. package/dist/internal/glyph.cjs.js +2 -0
  24. package/dist/internal/glyph.cjs.js.map +1 -0
  25. package/dist/internal/glyph.esm.js +5 -0
  26. package/dist/nile-auto-complete/index.cjs.js +1 -1
  27. package/dist/nile-auto-complete/nile-auto-complete.cjs.js +1 -1
  28. package/dist/nile-auto-complete/portal-manager.cjs.js +1 -1
  29. package/dist/nile-auto-complete/portal-utils.cjs.js +1 -1
  30. package/dist/nile-chip/nile-chip.css.cjs.js +1 -1
  31. package/dist/nile-chip/nile-chip.css.cjs.js.map +1 -1
  32. package/dist/nile-chip/nile-chip.css.esm.js +8 -1
  33. package/dist/nile-code-editor/extensionSetup.cjs.js +7 -7
  34. package/dist/nile-code-editor/extensionSetup.cjs.js.map +1 -1
  35. package/dist/nile-code-editor/extensionSetup.esm.js +1 -1
  36. package/dist/nile-code-editor/index.cjs.js +1 -1
  37. package/dist/nile-code-editor/index.esm.js +1 -1
  38. package/dist/nile-code-editor/nile-code-editor.cjs.js +2 -2
  39. package/dist/nile-code-editor/nile-code-editor.cjs.js.map +1 -1
  40. package/dist/nile-code-editor/nile-code-editor.esm.js +4 -4
  41. package/dist/nile-color-picker/index.cjs.js +1 -1
  42. package/dist/nile-color-picker/nile-color-picker.cjs.js +1 -1
  43. package/dist/nile-combobox/index.cjs.js +1 -1
  44. package/dist/nile-combobox/index.esm.js +1 -1
  45. package/dist/nile-combobox/nile-combobox.cjs.js +1 -1
  46. package/dist/nile-combobox/nile-combobox.esm.js +1 -1
  47. package/dist/nile-combobox/portal-manager.cjs.js +1 -1
  48. package/dist/nile-context-menu/index.cjs.js +1 -1
  49. package/dist/nile-context-menu/nile-context-menu.cjs.js +1 -1
  50. package/dist/nile-context-submenu/index.cjs.js +1 -1
  51. package/dist/nile-context-submenu/nile-context-submenu.cjs.js +1 -1
  52. package/dist/nile-detail/index.cjs.js +1 -1
  53. package/dist/nile-detail/index.esm.js +1 -1
  54. package/dist/nile-detail/nile-detail.cjs.js +1 -1
  55. package/dist/nile-detail/nile-detail.esm.js +1 -1
  56. package/dist/nile-dropdown/index.cjs.js +1 -1
  57. package/dist/nile-dropdown/nile-dropdown.cjs.js +1 -1
  58. package/dist/nile-dropdown/portal-manager.cjs.js +1 -1
  59. package/dist/nile-file-upload/index.cjs.js +1 -1
  60. package/dist/nile-file-upload/nile-file-upload.cjs.js +1 -1
  61. package/dist/nile-file-upload/nile-file-upload.template.cjs.js +1 -1
  62. package/dist/nile-floating-panel/index.cjs.js +1 -1
  63. package/dist/nile-floating-panel/nile-floating-panel.cjs.js +1 -1
  64. package/dist/nile-hero/nile-hero.cjs.js +1 -1
  65. package/dist/nile-hero/nile-hero.cjs.js.map +1 -1
  66. package/dist/nile-hero/nile-hero.css.cjs.js +1 -1
  67. package/dist/nile-hero/nile-hero.css.cjs.js.map +1 -1
  68. package/dist/nile-hero/nile-hero.css.esm.js +14 -14
  69. package/dist/nile-hero/nile-hero.esm.js +1 -1
  70. package/dist/nile-hero-header/nile-hero-header.cjs.js +1 -1
  71. package/dist/nile-hero-header/nile-hero-header.cjs.js.map +1 -1
  72. package/dist/nile-hero-header/nile-hero-header.css.cjs.js +1 -1
  73. package/dist/nile-hero-header/nile-hero-header.css.cjs.js.map +1 -1
  74. package/dist/nile-hero-header/nile-hero-header.css.esm.js +11 -11
  75. package/dist/nile-hero-header/nile-hero-header.esm.js +3 -3
  76. package/dist/nile-lite-tooltip/index.cjs.js +1 -1
  77. package/dist/nile-lite-tooltip/nile-lite-tooltip.cjs.js +1 -1
  78. package/dist/nile-markdown-editor/index.cjs.js +1 -1
  79. package/dist/nile-markdown-editor/nile-markdown-editor.cjs.js +1 -1
  80. package/dist/nile-popover/index.cjs.js +1 -1
  81. package/dist/nile-popover/nile-popover.cjs.js +1 -1
  82. package/dist/nile-popover/portal-manager.cjs.js +1 -1
  83. package/dist/nile-popup/index.cjs.js +1 -1
  84. package/dist/nile-popup/nile-popup.cjs.js +1 -1
  85. package/dist/nile-rich-text-editor/index.cjs.js +1 -1
  86. package/dist/nile-rich-text-editor/index.esm.js +1 -1
  87. package/dist/nile-rich-text-editor/nile-rich-text-editor.cjs.js +1 -1
  88. package/dist/nile-rich-text-editor/nile-rich-text-editor.cjs.js.map +1 -1
  89. package/dist/nile-rich-text-editor/nile-rich-text-editor.css.cjs.js +1 -1
  90. package/dist/nile-rich-text-editor/nile-rich-text-editor.css.cjs.js.map +1 -1
  91. package/dist/nile-rich-text-editor/nile-rich-text-editor.css.esm.js +70 -0
  92. package/dist/nile-rich-text-editor/nile-rich-text-editor.esm.js +1 -1
  93. package/dist/nile-rich-text-editor/nile-rte-image.cjs.js +3 -0
  94. package/dist/nile-rich-text-editor/nile-rte-image.cjs.js.map +1 -0
  95. package/dist/nile-rich-text-editor/nile-rte-image.esm.js +96 -0
  96. package/dist/nile-select/index.cjs.js +1 -1
  97. package/dist/nile-select/nile-select.cjs.js +1 -1
  98. package/dist/nile-select/portal-manager.cjs.js +1 -1
  99. package/dist/nile-side-bar-action/index.cjs.js +1 -1
  100. package/dist/nile-side-bar-action/nile-side-bar-action.cjs.js +1 -1
  101. package/dist/nile-side-bar-action/portal-manager.cjs.js +1 -1
  102. package/dist/nile-tooltip/index.cjs.js +1 -1
  103. package/dist/nile-tooltip/nile-tooltip.cjs.js +1 -1
  104. package/dist/nile-virtual-select/index.cjs.js +1 -1
  105. package/dist/nile-virtual-select/nile-virtual-select.cjs.js +1 -1
  106. package/dist/nile-virtual-select/portal-manager.cjs.js +1 -1
  107. package/dist/nile-virtual-select/renderer.cjs.js +1 -1
  108. package/dist/nile-wysiwyg-editor/emoji.cjs.js +2 -0
  109. package/dist/nile-wysiwyg-editor/emoji.cjs.js.map +1 -0
  110. package/dist/nile-wysiwyg-editor/emoji.esm.js +1 -0
  111. package/dist/nile-wysiwyg-editor/engine/commands.cjs.js +2 -0
  112. package/dist/nile-wysiwyg-editor/engine/commands.cjs.js.map +1 -0
  113. package/dist/nile-wysiwyg-editor/engine/commands.esm.js +1 -0
  114. package/dist/nile-wysiwyg-editor/engine/create-state.cjs.js +2 -0
  115. package/dist/nile-wysiwyg-editor/engine/create-state.cjs.js.map +1 -0
  116. package/dist/nile-wysiwyg-editor/engine/create-state.esm.js +1 -0
  117. package/dist/nile-wysiwyg-editor/engine/export.cjs.js +2 -0
  118. package/dist/nile-wysiwyg-editor/engine/export.cjs.js.map +1 -0
  119. package/dist/nile-wysiwyg-editor/engine/export.esm.js +1 -0
  120. package/dist/nile-wysiwyg-editor/engine/index.cjs.js +2 -0
  121. package/dist/nile-wysiwyg-editor/engine/index.cjs.js.map +1 -0
  122. package/dist/nile-wysiwyg-editor/engine/index.esm.js +1 -0
  123. package/dist/nile-wysiwyg-editor/engine/inputrules.cjs.js +2 -0
  124. package/dist/nile-wysiwyg-editor/engine/inputrules.cjs.js.map +1 -0
  125. package/dist/nile-wysiwyg-editor/engine/inputrules.esm.js +1 -0
  126. package/dist/nile-wysiwyg-editor/engine/keymap.cjs.js +2 -0
  127. package/dist/nile-wysiwyg-editor/engine/keymap.cjs.js.map +1 -0
  128. package/dist/nile-wysiwyg-editor/engine/keymap.esm.js +1 -0
  129. package/dist/nile-wysiwyg-editor/engine/markdown-parse.cjs.js +2 -0
  130. package/dist/nile-wysiwyg-editor/engine/markdown-parse.cjs.js.map +1 -0
  131. package/dist/nile-wysiwyg-editor/engine/markdown-parse.esm.js +1 -0
  132. package/dist/nile-wysiwyg-editor/engine/markdown.cjs.js +2 -0
  133. package/dist/nile-wysiwyg-editor/engine/markdown.cjs.js.map +1 -0
  134. package/dist/nile-wysiwyg-editor/engine/markdown.esm.js +1 -0
  135. package/dist/nile-wysiwyg-editor/engine/office-paste.cjs.js +2 -0
  136. package/dist/nile-wysiwyg-editor/engine/office-paste.cjs.js.map +1 -0
  137. package/dist/nile-wysiwyg-editor/engine/office-paste.esm.js +1 -0
  138. package/dist/nile-wysiwyg-editor/engine/plugins/code-highlight.cjs.js +2 -0
  139. package/dist/nile-wysiwyg-editor/engine/plugins/code-highlight.cjs.js.map +1 -0
  140. package/dist/nile-wysiwyg-editor/engine/plugins/code-highlight.esm.js +1 -0
  141. package/dist/nile-wysiwyg-editor/engine/plugins/embed-view.cjs.js +2 -0
  142. package/dist/nile-wysiwyg-editor/engine/plugins/embed-view.cjs.js.map +1 -0
  143. package/dist/nile-wysiwyg-editor/engine/plugins/embed-view.esm.js +1 -0
  144. package/dist/nile-wysiwyg-editor/engine/plugins/embeds.cjs.js +2 -0
  145. package/dist/nile-wysiwyg-editor/engine/plugins/embeds.cjs.js.map +1 -0
  146. package/dist/nile-wysiwyg-editor/engine/plugins/embeds.esm.js +1 -0
  147. package/dist/nile-wysiwyg-editor/engine/plugins/find-replace.cjs.js +2 -0
  148. package/dist/nile-wysiwyg-editor/engine/plugins/find-replace.cjs.js.map +1 -0
  149. package/dist/nile-wysiwyg-editor/engine/plugins/find-replace.esm.js +1 -0
  150. package/dist/nile-wysiwyg-editor/engine/plugins/format-painter.cjs.js +2 -0
  151. package/dist/nile-wysiwyg-editor/engine/plugins/format-painter.cjs.js.map +1 -0
  152. package/dist/nile-wysiwyg-editor/engine/plugins/format-painter.esm.js +1 -0
  153. package/dist/nile-wysiwyg-editor/engine/plugins/image-view.cjs.js +2 -0
  154. package/dist/nile-wysiwyg-editor/engine/plugins/image-view.cjs.js.map +1 -0
  155. package/dist/nile-wysiwyg-editor/engine/plugins/image-view.esm.js +1 -0
  156. package/dist/nile-wysiwyg-editor/engine/plugins/image.cjs.js +2 -0
  157. package/dist/nile-wysiwyg-editor/engine/plugins/image.cjs.js.map +1 -0
  158. package/dist/nile-wysiwyg-editor/engine/plugins/image.esm.js +1 -0
  159. package/dist/nile-wysiwyg-editor/engine/plugins/link.cjs.js +2 -0
  160. package/dist/nile-wysiwyg-editor/engine/plugins/link.cjs.js.map +1 -0
  161. package/dist/nile-wysiwyg-editor/engine/plugins/link.esm.js +1 -0
  162. package/dist/nile-wysiwyg-editor/engine/plugins/math-view.cjs.js +2 -0
  163. package/dist/nile-wysiwyg-editor/engine/plugins/math-view.cjs.js.map +1 -0
  164. package/dist/nile-wysiwyg-editor/engine/plugins/math-view.esm.js +1 -0
  165. package/dist/nile-wysiwyg-editor/engine/plugins/max-length.cjs.js +2 -0
  166. package/dist/nile-wysiwyg-editor/engine/plugins/max-length.cjs.js.map +1 -0
  167. package/dist/nile-wysiwyg-editor/engine/plugins/max-length.esm.js +1 -0
  168. package/dist/nile-wysiwyg-editor/engine/plugins/paste.cjs.js +2 -0
  169. package/dist/nile-wysiwyg-editor/engine/plugins/paste.cjs.js.map +1 -0
  170. package/dist/nile-wysiwyg-editor/engine/plugins/paste.esm.js +1 -0
  171. package/dist/nile-wysiwyg-editor/engine/plugins/placeholder.cjs.js +2 -0
  172. package/dist/nile-wysiwyg-editor/engine/plugins/placeholder.cjs.js.map +1 -0
  173. package/dist/nile-wysiwyg-editor/engine/plugins/placeholder.esm.js +1 -0
  174. package/dist/nile-wysiwyg-editor/engine/plugins/single-line.cjs.js +2 -0
  175. package/dist/nile-wysiwyg-editor/engine/plugins/single-line.cjs.js.map +1 -0
  176. package/dist/nile-wysiwyg-editor/engine/plugins/single-line.esm.js +1 -0
  177. package/dist/nile-wysiwyg-editor/engine/plugins/suggestions.cjs.js +2 -0
  178. package/dist/nile-wysiwyg-editor/engine/plugins/suggestions.cjs.js.map +1 -0
  179. package/dist/nile-wysiwyg-editor/engine/plugins/suggestions.esm.js +1 -0
  180. package/dist/nile-wysiwyg-editor/engine/plugins/tables.cjs.js +2 -0
  181. package/dist/nile-wysiwyg-editor/engine/plugins/tables.cjs.js.map +1 -0
  182. package/dist/nile-wysiwyg-editor/engine/plugins/tables.esm.js +1 -0
  183. package/dist/nile-wysiwyg-editor/engine/plugins/task-list.cjs.js +2 -0
  184. package/dist/nile-wysiwyg-editor/engine/plugins/task-list.cjs.js.map +1 -0
  185. package/dist/nile-wysiwyg-editor/engine/plugins/task-list.esm.js +1 -0
  186. package/dist/nile-wysiwyg-editor/engine/sanitize.cjs.js +2 -0
  187. package/dist/nile-wysiwyg-editor/engine/sanitize.cjs.js.map +1 -0
  188. package/dist/nile-wysiwyg-editor/engine/sanitize.esm.js +1 -0
  189. package/dist/nile-wysiwyg-editor/engine/schema.cjs.js +2 -0
  190. package/dist/nile-wysiwyg-editor/engine/schema.cjs.js.map +1 -0
  191. package/dist/nile-wysiwyg-editor/engine/schema.esm.js +1 -0
  192. package/dist/nile-wysiwyg-editor/engine/selection-state.cjs.js +2 -0
  193. package/dist/nile-wysiwyg-editor/engine/selection-state.cjs.js.map +1 -0
  194. package/dist/nile-wysiwyg-editor/engine/selection-state.esm.js +1 -0
  195. package/dist/nile-wysiwyg-editor/engine/serializer.cjs.js +2 -0
  196. package/dist/nile-wysiwyg-editor/engine/serializer.cjs.js.map +1 -0
  197. package/dist/nile-wysiwyg-editor/engine/serializer.esm.js +1 -0
  198. package/dist/nile-wysiwyg-editor/index.cjs.js +2 -0
  199. package/dist/nile-wysiwyg-editor/index.cjs.js.map +1 -0
  200. package/dist/nile-wysiwyg-editor/index.esm.js +1 -0
  201. package/dist/nile-wysiwyg-editor/nile-wysiwyg-editor.cjs.js +2 -0
  202. package/dist/nile-wysiwyg-editor/nile-wysiwyg-editor.cjs.js.map +1 -0
  203. package/dist/nile-wysiwyg-editor/nile-wysiwyg-editor.css.cjs.js +2 -0
  204. package/dist/nile-wysiwyg-editor/nile-wysiwyg-editor.css.cjs.js.map +1 -0
  205. package/dist/nile-wysiwyg-editor/nile-wysiwyg-editor.css.esm.js +780 -0
  206. package/dist/nile-wysiwyg-editor/nile-wysiwyg-editor.esm.js +97 -0
  207. package/dist/nile-wysiwyg-editor/nile-wysiwyg-toolbar/index.cjs.js +2 -0
  208. package/dist/nile-wysiwyg-editor/nile-wysiwyg-toolbar/index.cjs.js.map +1 -0
  209. package/dist/nile-wysiwyg-editor/nile-wysiwyg-toolbar/index.esm.js +1 -0
  210. package/dist/nile-wysiwyg-editor/nile-wysiwyg-toolbar/nile-wysiwyg-toolbar.cjs.js +2 -0
  211. package/dist/nile-wysiwyg-editor/nile-wysiwyg-toolbar/nile-wysiwyg-toolbar.cjs.js.map +1 -0
  212. package/dist/nile-wysiwyg-editor/nile-wysiwyg-toolbar/nile-wysiwyg-toolbar.css.cjs.js +2 -0
  213. package/dist/nile-wysiwyg-editor/nile-wysiwyg-toolbar/nile-wysiwyg-toolbar.css.cjs.js.map +1 -0
  214. package/dist/nile-wysiwyg-editor/nile-wysiwyg-toolbar/nile-wysiwyg-toolbar.css.esm.js +244 -0
  215. package/dist/nile-wysiwyg-editor/nile-wysiwyg-toolbar/nile-wysiwyg-toolbar.esm.js +137 -0
  216. package/dist/nile-wysiwyg-editor/types.cjs.js +2 -0
  217. package/dist/nile-wysiwyg-editor/types.cjs.js.map +1 -0
  218. package/dist/nile-wysiwyg-editor/types.esm.js +1 -0
  219. package/dist/nile-wysiwyg-editor/ui/bookmark-panel.cjs.js +2 -0
  220. package/dist/nile-wysiwyg-editor/ui/bookmark-panel.cjs.js.map +1 -0
  221. package/dist/nile-wysiwyg-editor/ui/bookmark-panel.esm.js +97 -0
  222. package/dist/nile-wysiwyg-editor/ui/bubble-menu.cjs.js +2 -0
  223. package/dist/nile-wysiwyg-editor/ui/bubble-menu.cjs.js.map +1 -0
  224. package/dist/nile-wysiwyg-editor/ui/bubble-menu.esm.js +67 -0
  225. package/dist/nile-wysiwyg-editor/ui/code-block-menu.cjs.js +2 -0
  226. package/dist/nile-wysiwyg-editor/ui/code-block-menu.cjs.js.map +1 -0
  227. package/dist/nile-wysiwyg-editor/ui/code-block-menu.esm.js +65 -0
  228. package/dist/nile-wysiwyg-editor/ui/embed-menu.cjs.js +2 -0
  229. package/dist/nile-wysiwyg-editor/ui/embed-menu.cjs.js.map +1 -0
  230. package/dist/nile-wysiwyg-editor/ui/embed-menu.esm.js +64 -0
  231. package/dist/nile-wysiwyg-editor/ui/embed-panel.cjs.js +2 -0
  232. package/dist/nile-wysiwyg-editor/ui/embed-panel.cjs.js.map +1 -0
  233. package/dist/nile-wysiwyg-editor/ui/embed-panel.esm.js +68 -0
  234. package/dist/nile-wysiwyg-editor/ui/emoji-picker.cjs.js +2 -0
  235. package/dist/nile-wysiwyg-editor/ui/emoji-picker.cjs.js.map +1 -0
  236. package/dist/nile-wysiwyg-editor/ui/emoji-picker.esm.js +96 -0
  237. package/dist/nile-wysiwyg-editor/ui/find-replace.cjs.js +2 -0
  238. package/dist/nile-wysiwyg-editor/ui/find-replace.cjs.js.map +1 -0
  239. package/dist/nile-wysiwyg-editor/ui/find-replace.esm.js +112 -0
  240. package/dist/nile-wysiwyg-editor/ui/image-menu.cjs.js +2 -0
  241. package/dist/nile-wysiwyg-editor/ui/image-menu.cjs.js.map +1 -0
  242. package/dist/nile-wysiwyg-editor/ui/image-menu.esm.js +64 -0
  243. package/dist/nile-wysiwyg-editor/ui/image-panel.cjs.js +2 -0
  244. package/dist/nile-wysiwyg-editor/ui/image-panel.cjs.js.map +1 -0
  245. package/dist/nile-wysiwyg-editor/ui/image-panel.esm.js +171 -0
  246. package/dist/nile-wysiwyg-editor/ui/insert-menu.cjs.js +2 -0
  247. package/dist/nile-wysiwyg-editor/ui/insert-menu.cjs.js.map +1 -0
  248. package/dist/nile-wysiwyg-editor/ui/insert-menu.esm.js +90 -0
  249. package/dist/nile-wysiwyg-editor/ui/link-editor.cjs.js +2 -0
  250. package/dist/nile-wysiwyg-editor/ui/link-editor.cjs.js.map +1 -0
  251. package/dist/nile-wysiwyg-editor/ui/link-editor.esm.js +114 -0
  252. package/dist/nile-wysiwyg-editor/ui/markdown-panel.cjs.js +2 -0
  253. package/dist/nile-wysiwyg-editor/ui/markdown-panel.cjs.js.map +1 -0
  254. package/dist/nile-wysiwyg-editor/ui/markdown-panel.esm.js +80 -0
  255. package/dist/nile-wysiwyg-editor/ui/math-panel.cjs.js +2 -0
  256. package/dist/nile-wysiwyg-editor/ui/math-panel.cjs.js.map +1 -0
  257. package/dist/nile-wysiwyg-editor/ui/math-panel.esm.js +92 -0
  258. package/dist/nile-wysiwyg-editor/ui/shortcut-help.cjs.js +2 -0
  259. package/dist/nile-wysiwyg-editor/ui/shortcut-help.cjs.js.map +1 -0
  260. package/dist/nile-wysiwyg-editor/ui/shortcut-help.esm.js +147 -0
  261. package/dist/nile-wysiwyg-editor/ui/source-view.cjs.js +2 -0
  262. package/dist/nile-wysiwyg-editor/ui/source-view.cjs.js.map +1 -0
  263. package/dist/nile-wysiwyg-editor/ui/source-view.esm.js +79 -0
  264. package/dist/nile-wysiwyg-editor/ui/special-chars.cjs.js +2 -0
  265. package/dist/nile-wysiwyg-editor/ui/special-chars.cjs.js.map +1 -0
  266. package/dist/nile-wysiwyg-editor/ui/special-chars.esm.js +96 -0
  267. package/dist/nile-wysiwyg-editor/ui/suggest-list.cjs.js +2 -0
  268. package/dist/nile-wysiwyg-editor/ui/suggest-list.cjs.js.map +1 -0
  269. package/dist/nile-wysiwyg-editor/ui/suggest-list.esm.js +67 -0
  270. package/dist/nile-wysiwyg-editor/ui/table-grid-picker.cjs.js +2 -0
  271. package/dist/nile-wysiwyg-editor/ui/table-grid-picker.cjs.js.map +1 -0
  272. package/dist/nile-wysiwyg-editor/ui/table-grid-picker.esm.js +100 -0
  273. package/dist/nile-wysiwyg-editor/ui/table-menu.cjs.js +2 -0
  274. package/dist/nile-wysiwyg-editor/ui/table-menu.cjs.js.map +1 -0
  275. package/dist/nile-wysiwyg-editor/ui/table-menu.esm.js +58 -0
  276. package/dist/src/index.d.ts +24 -0
  277. package/dist/src/index.js +19 -0
  278. package/dist/src/index.js.map +1 -1
  279. package/dist/src/internal/glyph.d.ts +6 -0
  280. package/dist/src/internal/glyph.js +13 -0
  281. package/dist/src/internal/glyph.js.map +1 -0
  282. package/dist/src/nile-chip/nile-chip.css.js +8 -1
  283. package/dist/src/nile-chip/nile-chip.css.js.map +1 -1
  284. package/dist/src/nile-code-editor/nile-code-editor.js +3 -3
  285. package/dist/src/nile-code-editor/nile-code-editor.js.map +1 -1
  286. package/dist/src/nile-hero/nile-hero.css.js +12 -12
  287. package/dist/src/nile-hero/nile-hero.css.js.map +1 -1
  288. package/dist/src/nile-hero/nile-hero.js +1 -1
  289. package/dist/src/nile-hero/nile-hero.js.map +1 -1
  290. package/dist/src/nile-hero-header/nile-hero-header.css.js +9 -9
  291. package/dist/src/nile-hero-header/nile-hero-header.css.js.map +1 -1
  292. package/dist/src/nile-hero-header/nile-hero-header.js +1 -1
  293. package/dist/src/nile-hero-header/nile-hero-header.js.map +1 -1
  294. package/dist/src/nile-rich-text-editor/nile-rich-text-editor.css.js +70 -0
  295. package/dist/src/nile-rich-text-editor/nile-rich-text-editor.css.js.map +1 -1
  296. package/dist/src/nile-rich-text-editor/nile-rich-text-editor.d.ts +3 -0
  297. package/dist/src/nile-rich-text-editor/nile-rich-text-editor.js +81 -3
  298. package/dist/src/nile-rich-text-editor/nile-rich-text-editor.js.map +1 -1
  299. package/dist/src/nile-rich-text-editor/nile-rte-image.d.ts +87 -0
  300. package/dist/src/nile-rich-text-editor/nile-rte-image.js +1073 -0
  301. package/dist/src/nile-rich-text-editor/nile-rte-image.js.map +1 -0
  302. package/dist/src/nile-wysiwyg-editor/emoji.d.ts +5 -0
  303. package/dist/src/nile-wysiwyg-editor/emoji.js +138 -0
  304. package/dist/src/nile-wysiwyg-editor/emoji.js.map +1 -0
  305. package/dist/src/nile-wysiwyg-editor/engine/commands.d.ts +69 -0
  306. package/dist/src/nile-wysiwyg-editor/engine/commands.js +863 -0
  307. package/dist/src/nile-wysiwyg-editor/engine/commands.js.map +1 -0
  308. package/dist/src/nile-wysiwyg-editor/engine/create-state.d.ts +35 -0
  309. package/dist/src/nile-wysiwyg-editor/engine/create-state.js +67 -0
  310. package/dist/src/nile-wysiwyg-editor/engine/create-state.js.map +1 -0
  311. package/dist/src/nile-wysiwyg-editor/engine/export.d.ts +38 -0
  312. package/dist/src/nile-wysiwyg-editor/engine/export.js +208 -0
  313. package/dist/src/nile-wysiwyg-editor/engine/export.js.map +1 -0
  314. package/dist/src/nile-wysiwyg-editor/engine/export.test.d.ts +1 -0
  315. package/dist/src/nile-wysiwyg-editor/engine/export.test.js +96 -0
  316. package/dist/src/nile-wysiwyg-editor/engine/export.test.js.map +1 -0
  317. package/dist/src/nile-wysiwyg-editor/engine/index.d.ts +37 -0
  318. package/dist/src/nile-wysiwyg-editor/engine/index.js +29 -0
  319. package/dist/src/nile-wysiwyg-editor/engine/index.js.map +1 -0
  320. package/dist/src/nile-wysiwyg-editor/engine/inputrules.d.ts +12 -0
  321. package/dist/src/nile-wysiwyg-editor/engine/inputrules.js +144 -0
  322. package/dist/src/nile-wysiwyg-editor/engine/inputrules.js.map +1 -0
  323. package/dist/src/nile-wysiwyg-editor/engine/keymap.d.ts +15 -0
  324. package/dist/src/nile-wysiwyg-editor/engine/keymap.js +94 -0
  325. package/dist/src/nile-wysiwyg-editor/engine/keymap.js.map +1 -0
  326. package/dist/src/nile-wysiwyg-editor/engine/markdown-parse.d.ts +22 -0
  327. package/dist/src/nile-wysiwyg-editor/engine/markdown-parse.js +287 -0
  328. package/dist/src/nile-wysiwyg-editor/engine/markdown-parse.js.map +1 -0
  329. package/dist/src/nile-wysiwyg-editor/engine/markdown-parse.test.d.ts +1 -0
  330. package/dist/src/nile-wysiwyg-editor/engine/markdown-parse.test.js +106 -0
  331. package/dist/src/nile-wysiwyg-editor/engine/markdown-parse.test.js.map +1 -0
  332. package/dist/src/nile-wysiwyg-editor/engine/markdown.d.ts +10 -0
  333. package/dist/src/nile-wysiwyg-editor/engine/markdown.js +162 -0
  334. package/dist/src/nile-wysiwyg-editor/engine/markdown.js.map +1 -0
  335. package/dist/src/nile-wysiwyg-editor/engine/office-paste.d.ts +13 -0
  336. package/dist/src/nile-wysiwyg-editor/engine/office-paste.js +182 -0
  337. package/dist/src/nile-wysiwyg-editor/engine/office-paste.js.map +1 -0
  338. package/dist/src/nile-wysiwyg-editor/engine/plugins/code-highlight.d.ts +10 -0
  339. package/dist/src/nile-wysiwyg-editor/engine/plugins/code-highlight.js +165 -0
  340. package/dist/src/nile-wysiwyg-editor/engine/plugins/code-highlight.js.map +1 -0
  341. package/dist/src/nile-wysiwyg-editor/engine/plugins/embed-view.d.ts +17 -0
  342. package/dist/src/nile-wysiwyg-editor/engine/plugins/embed-view.js +69 -0
  343. package/dist/src/nile-wysiwyg-editor/engine/plugins/embed-view.js.map +1 -0
  344. package/dist/src/nile-wysiwyg-editor/engine/plugins/embeds.d.ts +17 -0
  345. package/dist/src/nile-wysiwyg-editor/engine/plugins/embeds.js +96 -0
  346. package/dist/src/nile-wysiwyg-editor/engine/plugins/embeds.js.map +1 -0
  347. package/dist/src/nile-wysiwyg-editor/engine/plugins/find-replace.d.ts +26 -0
  348. package/dist/src/nile-wysiwyg-editor/engine/plugins/find-replace.js +123 -0
  349. package/dist/src/nile-wysiwyg-editor/engine/plugins/find-replace.js.map +1 -0
  350. package/dist/src/nile-wysiwyg-editor/engine/plugins/format-painter.d.ts +28 -0
  351. package/dist/src/nile-wysiwyg-editor/engine/plugins/format-painter.js +72 -0
  352. package/dist/src/nile-wysiwyg-editor/engine/plugins/format-painter.js.map +1 -0
  353. package/dist/src/nile-wysiwyg-editor/engine/plugins/image-view.d.ts +41 -0
  354. package/dist/src/nile-wysiwyg-editor/engine/plugins/image-view.js +176 -0
  355. package/dist/src/nile-wysiwyg-editor/engine/plugins/image-view.js.map +1 -0
  356. package/dist/src/nile-wysiwyg-editor/engine/plugins/image.d.ts +15 -0
  357. package/dist/src/nile-wysiwyg-editor/engine/plugins/image.js +64 -0
  358. package/dist/src/nile-wysiwyg-editor/engine/plugins/image.js.map +1 -0
  359. package/dist/src/nile-wysiwyg-editor/engine/plugins/link.d.ts +11 -0
  360. package/dist/src/nile-wysiwyg-editor/engine/plugins/link.js +42 -0
  361. package/dist/src/nile-wysiwyg-editor/engine/plugins/link.js.map +1 -0
  362. package/dist/src/nile-wysiwyg-editor/engine/plugins/math-view.d.ts +18 -0
  363. package/dist/src/nile-wysiwyg-editor/engine/plugins/math-view.js +46 -0
  364. package/dist/src/nile-wysiwyg-editor/engine/plugins/math-view.js.map +1 -0
  365. package/dist/src/nile-wysiwyg-editor/engine/plugins/max-length.d.ts +7 -0
  366. package/dist/src/nile-wysiwyg-editor/engine/plugins/max-length.js +26 -0
  367. package/dist/src/nile-wysiwyg-editor/engine/plugins/max-length.js.map +1 -0
  368. package/dist/src/nile-wysiwyg-editor/engine/plugins/paste.d.ts +31 -0
  369. package/dist/src/nile-wysiwyg-editor/engine/plugins/paste.js +55 -0
  370. package/dist/src/nile-wysiwyg-editor/engine/plugins/paste.js.map +1 -0
  371. package/dist/src/nile-wysiwyg-editor/engine/plugins/placeholder.d.ts +7 -0
  372. package/dist/src/nile-wysiwyg-editor/engine/plugins/placeholder.js +25 -0
  373. package/dist/src/nile-wysiwyg-editor/engine/plugins/placeholder.js.map +1 -0
  374. package/dist/src/nile-wysiwyg-editor/engine/plugins/single-line.d.ts +10 -0
  375. package/dist/src/nile-wysiwyg-editor/engine/plugins/single-line.js +48 -0
  376. package/dist/src/nile-wysiwyg-editor/engine/plugins/single-line.js.map +1 -0
  377. package/dist/src/nile-wysiwyg-editor/engine/plugins/suggestions.d.ts +29 -0
  378. package/dist/src/nile-wysiwyg-editor/engine/plugins/suggestions.js +87 -0
  379. package/dist/src/nile-wysiwyg-editor/engine/plugins/suggestions.js.map +1 -0
  380. package/dist/src/nile-wysiwyg-editor/engine/plugins/tables.d.ts +8 -0
  381. package/dist/src/nile-wysiwyg-editor/engine/plugins/tables.js +11 -0
  382. package/dist/src/nile-wysiwyg-editor/engine/plugins/tables.js.map +1 -0
  383. package/dist/src/nile-wysiwyg-editor/engine/plugins/task-list.d.ts +16 -0
  384. package/dist/src/nile-wysiwyg-editor/engine/plugins/task-list.js +49 -0
  385. package/dist/src/nile-wysiwyg-editor/engine/plugins/task-list.js.map +1 -0
  386. package/dist/src/nile-wysiwyg-editor/engine/pm.test.d.ts +1 -0
  387. package/dist/src/nile-wysiwyg-editor/engine/pm.test.js +883 -0
  388. package/dist/src/nile-wysiwyg-editor/engine/pm.test.js.map +1 -0
  389. package/dist/src/nile-wysiwyg-editor/engine/productivity.test.d.ts +1 -0
  390. package/dist/src/nile-wysiwyg-editor/engine/productivity.test.js +129 -0
  391. package/dist/src/nile-wysiwyg-editor/engine/productivity.test.js.map +1 -0
  392. package/dist/src/nile-wysiwyg-editor/engine/sanitize.d.ts +13 -0
  393. package/dist/src/nile-wysiwyg-editor/engine/sanitize.js +155 -0
  394. package/dist/src/nile-wysiwyg-editor/engine/sanitize.js.map +1 -0
  395. package/dist/src/nile-wysiwyg-editor/engine/schema.d.ts +20 -0
  396. package/dist/src/nile-wysiwyg-editor/engine/schema.js +823 -0
  397. package/dist/src/nile-wysiwyg-editor/engine/schema.js.map +1 -0
  398. package/dist/src/nile-wysiwyg-editor/engine/selection-state.d.ts +70 -0
  399. package/dist/src/nile-wysiwyg-editor/engine/selection-state.js +138 -0
  400. package/dist/src/nile-wysiwyg-editor/engine/selection-state.js.map +1 -0
  401. package/dist/src/nile-wysiwyg-editor/engine/serializer.d.ts +18 -0
  402. package/dist/src/nile-wysiwyg-editor/engine/serializer.js +63 -0
  403. package/dist/src/nile-wysiwyg-editor/engine/serializer.js.map +1 -0
  404. package/dist/src/nile-wysiwyg-editor/index.d.ts +3 -0
  405. package/dist/src/nile-wysiwyg-editor/index.js +3 -0
  406. package/dist/src/nile-wysiwyg-editor/index.js.map +1 -0
  407. package/dist/src/nile-wysiwyg-editor/nile-wysiwyg-editor.css.d.ts +1 -0
  408. package/dist/src/nile-wysiwyg-editor/nile-wysiwyg-editor.css.js +782 -0
  409. package/dist/src/nile-wysiwyg-editor/nile-wysiwyg-editor.css.js.map +1 -0
  410. package/dist/src/nile-wysiwyg-editor/nile-wysiwyg-editor.d.ts +364 -0
  411. package/dist/src/nile-wysiwyg-editor/nile-wysiwyg-editor.js +2038 -0
  412. package/dist/src/nile-wysiwyg-editor/nile-wysiwyg-editor.js.map +1 -0
  413. package/dist/src/nile-wysiwyg-editor/nile-wysiwyg-editor.test.d.ts +1 -0
  414. package/dist/src/nile-wysiwyg-editor/nile-wysiwyg-editor.test.js +636 -0
  415. package/dist/src/nile-wysiwyg-editor/nile-wysiwyg-editor.test.js.map +1 -0
  416. package/dist/src/nile-wysiwyg-editor/nile-wysiwyg-toolbar/index.d.ts +1 -0
  417. package/dist/src/nile-wysiwyg-editor/nile-wysiwyg-toolbar/index.js +2 -0
  418. package/dist/src/nile-wysiwyg-editor/nile-wysiwyg-toolbar/index.js.map +1 -0
  419. package/dist/src/nile-wysiwyg-editor/nile-wysiwyg-toolbar/nile-wysiwyg-toolbar.css.d.ts +6 -0
  420. package/dist/src/nile-wysiwyg-editor/nile-wysiwyg-toolbar/nile-wysiwyg-toolbar.css.js +251 -0
  421. package/dist/src/nile-wysiwyg-editor/nile-wysiwyg-toolbar/nile-wysiwyg-toolbar.css.js.map +1 -0
  422. package/dist/src/nile-wysiwyg-editor/nile-wysiwyg-toolbar/nile-wysiwyg-toolbar.d.ts +41 -0
  423. package/dist/src/nile-wysiwyg-editor/nile-wysiwyg-toolbar/nile-wysiwyg-toolbar.js +700 -0
  424. package/dist/src/nile-wysiwyg-editor/nile-wysiwyg-toolbar/nile-wysiwyg-toolbar.js.map +1 -0
  425. package/dist/src/nile-wysiwyg-editor/types.d.ts +49 -0
  426. package/dist/src/nile-wysiwyg-editor/types.js +8 -0
  427. package/dist/src/nile-wysiwyg-editor/types.js.map +1 -0
  428. package/dist/src/nile-wysiwyg-editor/ui/bookmark-panel.d.ts +20 -0
  429. package/dist/src/nile-wysiwyg-editor/ui/bookmark-panel.js +159 -0
  430. package/dist/src/nile-wysiwyg-editor/ui/bookmark-panel.js.map +1 -0
  431. package/dist/src/nile-wysiwyg-editor/ui/bubble-menu.d.ts +21 -0
  432. package/dist/src/nile-wysiwyg-editor/ui/bubble-menu.js +125 -0
  433. package/dist/src/nile-wysiwyg-editor/ui/bubble-menu.js.map +1 -0
  434. package/dist/src/nile-wysiwyg-editor/ui/code-block-menu.d.ts +18 -0
  435. package/dist/src/nile-wysiwyg-editor/ui/code-block-menu.js +107 -0
  436. package/dist/src/nile-wysiwyg-editor/ui/code-block-menu.js.map +1 -0
  437. package/dist/src/nile-wysiwyg-editor/ui/embed-menu.d.ts +19 -0
  438. package/dist/src/nile-wysiwyg-editor/ui/embed-menu.js +123 -0
  439. package/dist/src/nile-wysiwyg-editor/ui/embed-menu.js.map +1 -0
  440. package/dist/src/nile-wysiwyg-editor/ui/embed-panel.d.ts +27 -0
  441. package/dist/src/nile-wysiwyg-editor/ui/embed-panel.js +146 -0
  442. package/dist/src/nile-wysiwyg-editor/ui/embed-panel.js.map +1 -0
  443. package/dist/src/nile-wysiwyg-editor/ui/emoji-picker.d.ts +21 -0
  444. package/dist/src/nile-wysiwyg-editor/ui/emoji-picker.js +154 -0
  445. package/dist/src/nile-wysiwyg-editor/ui/emoji-picker.js.map +1 -0
  446. package/dist/src/nile-wysiwyg-editor/ui/find-replace.d.ts +26 -0
  447. package/dist/src/nile-wysiwyg-editor/ui/find-replace.js +178 -0
  448. package/dist/src/nile-wysiwyg-editor/ui/find-replace.js.map +1 -0
  449. package/dist/src/nile-wysiwyg-editor/ui/image-menu.d.ts +18 -0
  450. package/dist/src/nile-wysiwyg-editor/ui/image-menu.js +129 -0
  451. package/dist/src/nile-wysiwyg-editor/ui/image-menu.js.map +1 -0
  452. package/dist/src/nile-wysiwyg-editor/ui/image-panel.d.ts +56 -0
  453. package/dist/src/nile-wysiwyg-editor/ui/image-panel.js +349 -0
  454. package/dist/src/nile-wysiwyg-editor/ui/image-panel.js.map +1 -0
  455. package/dist/src/nile-wysiwyg-editor/ui/insert-menu.d.ts +25 -0
  456. package/dist/src/nile-wysiwyg-editor/ui/insert-menu.js +142 -0
  457. package/dist/src/nile-wysiwyg-editor/ui/insert-menu.js.map +1 -0
  458. package/dist/src/nile-wysiwyg-editor/ui/link-editor.d.ts +30 -0
  459. package/dist/src/nile-wysiwyg-editor/ui/link-editor.js +189 -0
  460. package/dist/src/nile-wysiwyg-editor/ui/link-editor.js.map +1 -0
  461. package/dist/src/nile-wysiwyg-editor/ui/markdown-panel.d.ts +24 -0
  462. package/dist/src/nile-wysiwyg-editor/ui/markdown-panel.js +144 -0
  463. package/dist/src/nile-wysiwyg-editor/ui/markdown-panel.js.map +1 -0
  464. package/dist/src/nile-wysiwyg-editor/ui/math-panel.d.ts +31 -0
  465. package/dist/src/nile-wysiwyg-editor/ui/math-panel.js +172 -0
  466. package/dist/src/nile-wysiwyg-editor/ui/math-panel.js.map +1 -0
  467. package/dist/src/nile-wysiwyg-editor/ui/shortcut-help.d.ts +30 -0
  468. package/dist/src/nile-wysiwyg-editor/ui/shortcut-help.js +296 -0
  469. package/dist/src/nile-wysiwyg-editor/ui/shortcut-help.js.map +1 -0
  470. package/dist/src/nile-wysiwyg-editor/ui/source-view.d.ts +19 -0
  471. package/dist/src/nile-wysiwyg-editor/ui/source-view.js +120 -0
  472. package/dist/src/nile-wysiwyg-editor/ui/source-view.js.map +1 -0
  473. package/dist/src/nile-wysiwyg-editor/ui/special-chars.d.ts +20 -0
  474. package/dist/src/nile-wysiwyg-editor/ui/special-chars.js +199 -0
  475. package/dist/src/nile-wysiwyg-editor/ui/special-chars.js.map +1 -0
  476. package/dist/src/nile-wysiwyg-editor/ui/suggest-list.d.ts +31 -0
  477. package/dist/src/nile-wysiwyg-editor/ui/suggest-list.js +133 -0
  478. package/dist/src/nile-wysiwyg-editor/ui/suggest-list.js.map +1 -0
  479. package/dist/src/nile-wysiwyg-editor/ui/table-grid-picker.d.ts +23 -0
  480. package/dist/src/nile-wysiwyg-editor/ui/table-grid-picker.js +177 -0
  481. package/dist/src/nile-wysiwyg-editor/ui/table-grid-picker.js.map +1 -0
  482. package/dist/src/nile-wysiwyg-editor/ui/table-menu.d.ts +16 -0
  483. package/dist/src/nile-wysiwyg-editor/ui/table-menu.js +101 -0
  484. package/dist/src/nile-wysiwyg-editor/ui/table-menu.js.map +1 -0
  485. package/dist/src/version.js +1 -1
  486. package/dist/src/version.js.map +1 -1
  487. package/dist/tsconfig.tsbuildinfo +1 -1
  488. package/package.json +18 -2
  489. package/src/index.ts +57 -1
  490. package/src/internal/glyph.ts +13 -0
  491. package/src/nile-chip/nile-chip.css.ts +8 -1
  492. package/src/nile-code-editor/nile-code-editor.ts +3 -3
  493. package/src/nile-hero/nile-hero.css.ts +12 -12
  494. package/src/nile-hero/nile-hero.ts +1 -1
  495. package/src/nile-hero-header/nile-hero-header.css.ts +9 -9
  496. package/src/nile-hero-header/nile-hero-header.ts +1 -1
  497. package/src/nile-rich-text-editor/nile-rich-text-editor.css.ts +70 -0
  498. package/src/nile-rich-text-editor/nile-rich-text-editor.ts +89 -3
  499. package/src/nile-rich-text-editor/nile-rte-image.ts +1132 -0
  500. package/src/nile-wysiwyg-editor/emoji.ts +137 -0
  501. package/src/nile-wysiwyg-editor/engine/commands.ts +1035 -0
  502. package/src/nile-wysiwyg-editor/engine/create-state.ts +117 -0
  503. package/src/nile-wysiwyg-editor/engine/export.test.ts +113 -0
  504. package/src/nile-wysiwyg-editor/engine/export.ts +242 -0
  505. package/src/nile-wysiwyg-editor/engine/index.ts +69 -0
  506. package/src/nile-wysiwyg-editor/engine/inputrules.ts +169 -0
  507. package/src/nile-wysiwyg-editor/engine/keymap.ts +146 -0
  508. package/src/nile-wysiwyg-editor/engine/markdown-parse.test.ts +148 -0
  509. package/src/nile-wysiwyg-editor/engine/markdown-parse.ts +337 -0
  510. package/src/nile-wysiwyg-editor/engine/markdown.ts +165 -0
  511. package/src/nile-wysiwyg-editor/engine/office-paste.ts +199 -0
  512. package/src/nile-wysiwyg-editor/engine/plugins/code-highlight.ts +173 -0
  513. package/src/nile-wysiwyg-editor/engine/plugins/embed-view.ts +85 -0
  514. package/src/nile-wysiwyg-editor/engine/plugins/embeds.ts +99 -0
  515. package/src/nile-wysiwyg-editor/engine/plugins/find-replace.ts +155 -0
  516. package/src/nile-wysiwyg-editor/engine/plugins/format-painter.ts +80 -0
  517. package/src/nile-wysiwyg-editor/engine/plugins/image-view.ts +220 -0
  518. package/src/nile-wysiwyg-editor/engine/plugins/image.ts +80 -0
  519. package/src/nile-wysiwyg-editor/engine/plugins/link.ts +42 -0
  520. package/src/nile-wysiwyg-editor/engine/plugins/math-view.ts +56 -0
  521. package/src/nile-wysiwyg-editor/engine/plugins/max-length.ts +24 -0
  522. package/src/nile-wysiwyg-editor/engine/plugins/paste.ts +74 -0
  523. package/src/nile-wysiwyg-editor/engine/plugins/placeholder.ts +24 -0
  524. package/src/nile-wysiwyg-editor/engine/plugins/single-line.ts +47 -0
  525. package/src/nile-wysiwyg-editor/engine/plugins/suggestions.ts +110 -0
  526. package/src/nile-wysiwyg-editor/engine/plugins/tables.ts +12 -0
  527. package/src/nile-wysiwyg-editor/engine/plugins/task-list.ts +65 -0
  528. package/src/nile-wysiwyg-editor/engine/pm.test.ts +1088 -0
  529. package/src/nile-wysiwyg-editor/engine/productivity.test.ts +163 -0
  530. package/src/nile-wysiwyg-editor/engine/sanitize.ts +156 -0
  531. package/src/nile-wysiwyg-editor/engine/schema.ts +859 -0
  532. package/src/nile-wysiwyg-editor/engine/selection-state.ts +210 -0
  533. package/src/nile-wysiwyg-editor/engine/serializer.ts +78 -0
  534. package/src/nile-wysiwyg-editor/index.ts +3 -0
  535. package/src/nile-wysiwyg-editor/nile-wysiwyg-editor.css.ts +782 -0
  536. package/src/nile-wysiwyg-editor/nile-wysiwyg-editor.test.ts +750 -0
  537. package/src/nile-wysiwyg-editor/nile-wysiwyg-editor.ts +2155 -0
  538. package/src/nile-wysiwyg-editor/nile-wysiwyg-toolbar/index.ts +1 -0
  539. package/src/nile-wysiwyg-editor/nile-wysiwyg-toolbar/nile-wysiwyg-toolbar.css.ts +251 -0
  540. package/src/nile-wysiwyg-editor/nile-wysiwyg-toolbar/nile-wysiwyg-toolbar.ts +772 -0
  541. package/src/nile-wysiwyg-editor/types.ts +83 -0
  542. package/src/nile-wysiwyg-editor/ui/bookmark-panel.ts +155 -0
  543. package/src/nile-wysiwyg-editor/ui/bubble-menu.ts +135 -0
  544. package/src/nile-wysiwyg-editor/ui/code-block-menu.ts +105 -0
  545. package/src/nile-wysiwyg-editor/ui/embed-menu.ts +133 -0
  546. package/src/nile-wysiwyg-editor/ui/embed-panel.ts +143 -0
  547. package/src/nile-wysiwyg-editor/ui/emoji-picker.ts +152 -0
  548. package/src/nile-wysiwyg-editor/ui/find-replace.ts +174 -0
  549. package/src/nile-wysiwyg-editor/ui/image-menu.ts +140 -0
  550. package/src/nile-wysiwyg-editor/ui/image-panel.ts +337 -0
  551. package/src/nile-wysiwyg-editor/ui/insert-menu.ts +142 -0
  552. package/src/nile-wysiwyg-editor/ui/link-editor.ts +180 -0
  553. package/src/nile-wysiwyg-editor/ui/markdown-panel.ts +143 -0
  554. package/src/nile-wysiwyg-editor/ui/math-panel.ts +169 -0
  555. package/src/nile-wysiwyg-editor/ui/shortcut-help.ts +311 -0
  556. package/src/nile-wysiwyg-editor/ui/source-view.ts +119 -0
  557. package/src/nile-wysiwyg-editor/ui/special-chars.ts +209 -0
  558. package/src/nile-wysiwyg-editor/ui/suggest-list.ts +138 -0
  559. package/src/nile-wysiwyg-editor/ui/table-grid-picker.ts +173 -0
  560. package/src/nile-wysiwyg-editor/ui/table-menu.ts +109 -0
  561. package/vscode-html-custom-data.json +491 -1
  562. package/web-dev-server.config.mjs +6 -2
  563. package/dist/index-5fef1a0d.esm.js +0 -1
  564. package/dist/index-8f38fae3.cjs.js +0 -2
  565. package/dist/index-8f38fae3.cjs.js.map +0 -1
@@ -0,0 +1,750 @@
1
+ import { fixture, expect, oneEvent } from '@open-wc/testing';
2
+ import { html } from 'lit';
3
+ import { TextSelection } from 'prosemirror-state';
4
+ import '../index';
5
+ import type { NileWysiwygEditor } from './nile-wysiwyg-editor';
6
+
7
+ async function editorFixture(template = html`<nile-wysiwyg-editor></nile-wysiwyg-editor>`) {
8
+ const el = await fixture<NileWysiwygEditor>(template);
9
+ await el.updateComplete;
10
+ return el;
11
+ }
12
+
13
+ function selectAll(el: NileWysiwygEditor) {
14
+ const view = el.pmView!;
15
+ const selection = TextSelection.create(view.state.doc, 1, view.state.doc.content.size - 1);
16
+ view.dispatch(view.state.tr.setSelection(selection));
17
+ }
18
+
19
+ describe('nile-wysiwyg-editor', () => {
20
+ it('mounts a ProseMirror view inside its shadow root', async () => {
21
+ const el = await editorFixture();
22
+ expect(el.pmView).to.exist;
23
+ expect(el.shadowRoot!.querySelector('.ProseMirror')).to.exist;
24
+ });
25
+
26
+ it('round-trips value in and out', async () => {
27
+ const el = await editorFixture();
28
+ el.value = '<p>hello <strong>world</strong></p>';
29
+ await el.updateComplete;
30
+ expect(el.getHTML()).to.equal('<p>hello <strong>world</strong></p>');
31
+ });
32
+
33
+ it('sanitizes hostile content set via value', async () => {
34
+ const el = await editorFixture();
35
+ el.value = '<p>ok</p><script>alert(1)</script><p onclick="x()">click</p>';
36
+ await el.updateComplete;
37
+ expect(el.getHTML()).to.not.include('script');
38
+ expect(el.getHTML()).to.not.include('onclick');
39
+ });
40
+
41
+ it('emits nile-input on document changes', async () => {
42
+ const el = await editorFixture();
43
+ const view = el.pmView!;
44
+ setTimeout(() => view.dispatch(view.state.tr.insertText('typed', 1)));
45
+ const event = await oneEvent(el, 'nile-input');
46
+ expect(event.detail.value).to.equal('<p>typed</p>');
47
+ expect(event.detail.content).to.equal('<p>typed</p>');
48
+ expect(el.value).to.equal('<p>typed</p>');
49
+ });
50
+
51
+ it('emits a debounced nile-change', async () => {
52
+ const el = await editorFixture();
53
+ const view = el.pmView!;
54
+ setTimeout(() => view.dispatch(view.state.tr.insertText('x', 1)));
55
+ const event = await oneEvent(el, 'nile-change');
56
+ expect(event.detail.value).to.equal('<p>x</p>');
57
+ });
58
+
59
+ it('applies commands via execCommand', async () => {
60
+ const el = await editorFixture();
61
+ el.value = '<p>format me</p>';
62
+ await el.updateComplete;
63
+ selectAll(el);
64
+ expect(el.execCommand('bold')).to.equal(true);
65
+ expect(el.getHTML()).to.equal('<p><strong>format me</strong></p>');
66
+ expect(el.isCommandActive('bold')).to.equal(true);
67
+ });
68
+
69
+ it('insertHTML inserts sanitized content at the selection', async () => {
70
+ const el = await editorFixture();
71
+ el.insertHTML('<strong>safe</strong><script>bad()</script>');
72
+ expect(el.getHTML()).to.equal('<p><strong>safe</strong></p>');
73
+ });
74
+
75
+ it('respects disabled and readonly', async () => {
76
+ const el = await editorFixture(
77
+ html`<nile-wysiwyg-editor disabled></nile-wysiwyg-editor>`
78
+ );
79
+ const content = el.shadowRoot!.querySelector('.ProseMirror')!;
80
+ expect(content.getAttribute('contenteditable')).to.equal('false');
81
+
82
+ el.disabled = false;
83
+ el.readonly = true;
84
+ await el.updateComplete;
85
+ expect(content.getAttribute('contenteditable')).to.equal('false');
86
+ // Readonly hides the toolbar.
87
+ expect(el.shadowRoot!.querySelector('nile-wysiwyg-toolbar')).to.not.exist;
88
+
89
+ el.readonly = false;
90
+ await el.updateComplete;
91
+ expect(content.getAttribute('contenteditable')).to.equal('true');
92
+ });
93
+
94
+ it('hides the toolbar with toolbar="none"', async () => {
95
+ const el = await editorFixture(
96
+ html`<nile-wysiwyg-editor toolbar="none"></nile-wysiwyg-editor>`
97
+ );
98
+ expect(el.shadowRoot!.querySelector('nile-wysiwyg-toolbar')).to.not.exist;
99
+ });
100
+
101
+ it('renders placeholder decoration when empty', async () => {
102
+ const el = await editorFixture(
103
+ html`<nile-wysiwyg-editor placeholder="Type here"></nile-wysiwyg-editor>`
104
+ );
105
+ const empty = el.shadowRoot!.querySelector('.nile-wysiwyg__empty');
106
+ expect(empty).to.exist;
107
+ expect(empty!.getAttribute('data-placeholder')).to.equal('Type here');
108
+ });
109
+
110
+ it('keeps single-line documents to one paragraph', async () => {
111
+ const el = await editorFixture(
112
+ html`<nile-wysiwyg-editor singleline></nile-wysiwyg-editor>`
113
+ );
114
+ el.value = '<p>one</p><p>two</p><p>three</p>';
115
+ await el.updateComplete;
116
+ expect(el.pmView!.state.doc.childCount).to.equal(1);
117
+ });
118
+
119
+ it('executes toolbar commands dispatched as wysiwyg-command events', async () => {
120
+ const el = await editorFixture();
121
+ el.value = '<p>toolbar</p>';
122
+ await el.updateComplete;
123
+ selectAll(el);
124
+ const toolbar = el.shadowRoot!.querySelector('nile-wysiwyg-toolbar')!;
125
+ toolbar.dispatchEvent(
126
+ new CustomEvent('wysiwyg-command', {
127
+ detail: { name: 'italic' },
128
+ bubbles: true,
129
+ composed: true,
130
+ })
131
+ );
132
+ expect(el.getHTML()).to.equal('<p><em>toolbar</em></p>');
133
+ });
134
+
135
+ it('participates in forms with name, required, and reset', async () => {
136
+ const form = await fixture<HTMLFormElement>(html`
137
+ <form>
138
+ <nile-wysiwyg-editor name="notes" required></nile-wysiwyg-editor>
139
+ </form>
140
+ `);
141
+ const el = form.querySelector<NileWysiwygEditor>('nile-wysiwyg-editor')!;
142
+ await el.updateComplete;
143
+
144
+ expect(el.checkValidity()).to.equal(false);
145
+
146
+ el.setContent('<p>filled</p>');
147
+ expect(el.checkValidity()).to.equal(true);
148
+ expect(new FormData(form).get('notes')).to.equal('<p>filled</p>');
149
+
150
+ form.reset();
151
+ await el.updateComplete;
152
+ expect(el.getHTML()).to.equal('');
153
+ expect(el.checkValidity()).to.equal(false);
154
+ });
155
+
156
+ it('uploads image files through uploadHandler with a placeholder', async () => {
157
+ const el = await editorFixture();
158
+ let uploadedName = '';
159
+ el.uploadHandler = async file => {
160
+ uploadedName = file.name;
161
+ // Placeholder should be visible while the upload is pending.
162
+ await new Promise(resolve => setTimeout(resolve, 30));
163
+ return { src: 'https://cdn.x.dev/uploaded.png', alt: 'uploaded' };
164
+ };
165
+ const file = new File(['x'], 'pic.png', { type: 'image/png' });
166
+ const pending = el.insertImageFile(file);
167
+ await new Promise(resolve => setTimeout(resolve, 10));
168
+ expect(
169
+ el.shadowRoot!.querySelector('.nile-wysiwyg__upload-placeholder'),
170
+ 'placeholder while uploading'
171
+ ).to.exist;
172
+ await pending;
173
+ expect(uploadedName).to.equal('pic.png');
174
+ expect(el.getHTML()).to.include('https://cdn.x.dev/uploaded.png');
175
+ expect(el.shadowRoot!.querySelector('.nile-wysiwyg__upload-placeholder')).to.not.exist;
176
+ });
177
+
178
+ it('lets nile-image-upload-request listeners own the upload', async () => {
179
+ const el = await editorFixture();
180
+ el.addEventListener('nile-image-upload-request', (e: Event) => {
181
+ e.preventDefault();
182
+ (e as CustomEvent).detail.insert('https://custom.x.dev/own.png', 'mine');
183
+ });
184
+ await el.insertImageFile(new File(['x'], 'a.png', { type: 'image/png' }));
185
+ expect(el.getHTML()).to.include('https://custom.x.dev/own.png');
186
+ expect(el.getHTML()).to.include('alt="mine"');
187
+ });
188
+
189
+ it('falls back to base64 embedding without a handler', async () => {
190
+ const el = await editorFixture();
191
+ await el.insertImageFile(new File(['x'], 'a.png', { type: 'image/png' }));
192
+ expect(el.getHTML()).to.include('data:image/png;base64');
193
+ });
194
+
195
+ it('emits nile-image-upload-error when the handler rejects', async () => {
196
+ const el = await editorFixture();
197
+ el.uploadHandler = async () => {
198
+ throw new Error('boom');
199
+ };
200
+ setTimeout(() => el.insertImageFile(new File(['x'], 'a.png', { type: 'image/png' })));
201
+ const event = await oneEvent(el, 'nile-image-upload-error');
202
+ expect(event.detail.error.message).to.equal('boom');
203
+ expect(el.getHTML()).to.equal('');
204
+ });
205
+
206
+ it('inserts tables from the table picker command event', async () => {
207
+ const el = await editorFixture();
208
+ const toolbar = el.shadowRoot!.querySelector('nile-wysiwyg-toolbar')!;
209
+ toolbar.dispatchEvent(
210
+ new CustomEvent('wysiwyg-command', {
211
+ detail: { name: 'insertTable', attrs: { rows: 2, cols: 3 } },
212
+ bubbles: true,
213
+ composed: true,
214
+ })
215
+ );
216
+ expect(el.getHTML()).to.include('<table');
217
+ expect(el.pmView!.state.doc.firstChild!.childCount).to.equal(2);
218
+ });
219
+
220
+ it('shows mention suggestions and inserts a mention node', async () => {
221
+ const el = await editorFixture();
222
+ el.mentions = {
223
+ '@': [
224
+ { key: 'u1', label: 'Ada' },
225
+ { key: 'u2', label: 'Alan' },
226
+ { key: 'u3', label: 'Grace' },
227
+ ],
228
+ };
229
+ const view = el.pmView!;
230
+ view.dispatch(view.state.tr.insertText('@a', 1));
231
+ await el.updateComplete;
232
+
233
+ const list = el.shadowRoot!.querySelector('nile-wysiwyg-suggest-list')!;
234
+ expect(list.open).to.equal(true);
235
+ expect(list.items.map(i => i.label)).to.deep.equal(['Ada', 'Alan', 'Grace']);
236
+
237
+ view.dispatch(view.state.tr.insertText('d'));
238
+ await el.updateComplete;
239
+ expect(list.items.map(i => i.label)).to.deep.equal(['Ada']);
240
+
241
+ setTimeout(() => list.selectCurrent());
242
+ const selected = await oneEvent(el, 'nile-mention-select');
243
+ expect(selected.detail).to.deep.include({ trigger: '@', key: 'u1', label: 'Ada' });
244
+ expect(el.getHTML()).to.include('data-mention-key="u1"');
245
+ expect(el.getHTML()).to.include('@Ada');
246
+ });
247
+
248
+ it('inserts the highlighted mention on Enter (keymap must not steal it)', async () => {
249
+ const el = await editorFixture();
250
+ el.mentions = {
251
+ '@': [
252
+ { key: 'u1', label: 'Ada' },
253
+ { key: 'u2', label: 'Alan' },
254
+ ],
255
+ };
256
+ const view = el.pmView!;
257
+ view.dispatch(view.state.tr.insertText('@a', 1));
258
+ await el.updateComplete;
259
+
260
+ // Navigate with ArrowDown, then commit with Enter — real key events.
261
+ const press = (key: string) =>
262
+ view.dom.dispatchEvent(
263
+ new KeyboardEvent('keydown', { key, bubbles: true, cancelable: true })
264
+ );
265
+ press('ArrowDown');
266
+ await el.updateComplete;
267
+ press('Enter');
268
+ await el.updateComplete;
269
+
270
+ expect(el.getHTML()).to.include('data-mention-key="u2"');
271
+ expect(el.getHTML()).to.include('@Alan');
272
+ // Enter must not have split the paragraph.
273
+ expect(el.pmView!.state.doc.childCount).to.equal(1);
274
+ });
275
+
276
+ it('applies the highlighted slash command on Enter', async () => {
277
+ const el = await editorFixture();
278
+ const view = el.pmView!;
279
+ view.dispatch(view.state.tr.insertText('/head', 1));
280
+ await el.updateComplete;
281
+ view.dom.dispatchEvent(
282
+ new KeyboardEvent('keydown', { key: 'Enter', bubbles: true, cancelable: true })
283
+ );
284
+ await el.updateComplete;
285
+ expect(el.pmView!.state.doc.firstChild!.type.name).to.equal('heading');
286
+ expect(el.pmView!.state.doc.childCount).to.equal(1);
287
+ });
288
+
289
+ it('dismisses the suggestion popup on Escape', async () => {
290
+ const el = await editorFixture();
291
+ el.mentions = { '@': [{ key: 'u1', label: 'Ada' }] };
292
+ const view = el.pmView!;
293
+ view.dispatch(view.state.tr.insertText('@a', 1));
294
+ await el.updateComplete;
295
+ const list = el.shadowRoot!.querySelector('nile-wysiwyg-suggest-list')!;
296
+ expect(list.open).to.equal(true);
297
+ view.dom.dispatchEvent(
298
+ new KeyboardEvent('keydown', { key: 'Escape', bubbles: true, cancelable: true })
299
+ );
300
+ await el.updateComplete;
301
+ expect(list.open).to.equal(false);
302
+ // Enter now behaves normally again (splits the paragraph).
303
+ view.dom.dispatchEvent(
304
+ new KeyboardEvent('keydown', { key: 'Enter', bubbles: true, cancelable: true })
305
+ );
306
+ expect(el.pmView!.state.doc.childCount).to.equal(2);
307
+ });
308
+
309
+ it('lets nile-mention-query listeners provide async items', async () => {
310
+ const el = await editorFixture();
311
+ el.mentions = { '@': [] };
312
+ el.addEventListener('nile-mention-query', (e: Event) => {
313
+ const { query, provide } = (e as CustomEvent).detail;
314
+ provide([{ key: `srv-${query}`, label: `Server ${query}` }]);
315
+ });
316
+ const view = el.pmView!;
317
+ view.dispatch(view.state.tr.insertText('@bo', 1));
318
+ await el.updateComplete;
319
+ const list = el.shadowRoot!.querySelector('nile-wysiwyg-suggest-list')!;
320
+ expect(list.open).to.equal(true);
321
+ expect(list.items).to.deep.equal([{ key: 'srv-bo', label: 'Server bo' }]);
322
+ });
323
+
324
+ it('opens slash commands at the start of a block and applies one', async () => {
325
+ const el = await editorFixture();
326
+ const view = el.pmView!;
327
+ view.dispatch(view.state.tr.insertText('/head', 1));
328
+ await el.updateComplete;
329
+ const list = el.shadowRoot!.querySelector('nile-wysiwyg-suggest-list')!;
330
+ expect(list.open).to.equal(true);
331
+ expect(list.items[0].label).to.equal('Heading 1');
332
+ list.selectCurrent();
333
+ await el.updateComplete;
334
+ expect(el.pmView!.state.doc.firstChild!.type.name).to.equal('heading');
335
+ // The "/head" query text was consumed.
336
+ expect(el.getText()).to.equal('');
337
+ });
338
+
339
+ it('honors no-slash-commands', async () => {
340
+ const el = await editorFixture(
341
+ html`<nile-wysiwyg-editor no-slash-commands></nile-wysiwyg-editor>`
342
+ );
343
+ const view = el.pmView!;
344
+ view.dispatch(view.state.tr.insertText('/head', 1));
345
+ await el.updateComplete;
346
+ const list = el.shadowRoot!.querySelector('nile-wysiwyg-suggest-list')!;
347
+ expect(list.open).to.equal(false);
348
+ });
349
+
350
+ it('applies markdown mark input rules while typing', async () => {
351
+ const el = await editorFixture();
352
+ el.value = '<p>**bold*</p>';
353
+ await el.updateComplete;
354
+ const view = el.pmView!;
355
+ const end = view.state.doc.content.size - 1;
356
+ view.dispatch(view.state.tr.setSelection(TextSelection.create(view.state.doc, end)));
357
+ const handled = view.someProp('handleTextInput', f =>
358
+ f(view, end, end, '*', () => view.state.tr.insertText('*', end, end))
359
+ );
360
+ expect(handled).to.equal(true);
361
+ expect(el.getHTML()).to.equal('<p><strong>bold</strong></p>');
362
+ });
363
+
364
+ it('finds and replaces through the public API', async () => {
365
+ const el = await editorFixture();
366
+ el.value = '<p>red fox, red barn</p>';
367
+ await el.updateComplete;
368
+ expect(el.find('red')).to.equal(2);
369
+ el.replace('blue');
370
+ expect(el.getHTML()).to.include('blue fox, red barn');
371
+ el.replaceAll('green');
372
+ expect(el.getHTML()).to.include('blue fox, green barn');
373
+ });
374
+
375
+ it('toggles source view and re-sanitizes applied HTML', async () => {
376
+ const el = await editorFixture();
377
+ el.value = '<p>original</p>';
378
+ await el.updateComplete;
379
+ el.toggleSourceView();
380
+ await el.updateComplete;
381
+ const source = el.shadowRoot!.querySelector('nile-wysiwyg-source-view')!;
382
+ expect(source).to.exist;
383
+ await source.updateComplete;
384
+ expect(source.textarea!.value).to.equal('<p>original</p>');
385
+
386
+ source.textarea!.value = '<p>edited</p><script>alert(1)</script>';
387
+ el.toggleSourceView();
388
+ await el.updateComplete;
389
+ expect(el.shadowRoot!.querySelector('nile-wysiwyg-source-view')).to.not.exist;
390
+ expect(el.getHTML()).to.equal('<p>edited</p>');
391
+ });
392
+
393
+ it('emits nile-word-count and supports getWordCount', async () => {
394
+ const el = await editorFixture();
395
+ const view = el.pmView!;
396
+ setTimeout(() => view.dispatch(view.state.tr.insertText('three little words', 1)));
397
+ const event = await oneEvent(el, 'nile-word-count');
398
+ expect(event.detail).to.deep.equal({ words: 3, characters: 18 });
399
+ expect(el.getWordCount()).to.deep.equal({ words: 3, characters: 18 });
400
+ });
401
+
402
+ it('emits nile-autosave on the configured interval', async () => {
403
+ const el = await editorFixture(
404
+ html`<nile-wysiwyg-editor autosave-interval="40"></nile-wysiwyg-editor>`
405
+ );
406
+ const view = el.pmView!;
407
+ view.dispatch(view.state.tr.insertText('save me', 1));
408
+ const event = await oneEvent(el, 'nile-autosave');
409
+ expect(event.detail.value).to.equal('<p>save me</p>');
410
+ });
411
+
412
+ it('renders checklist items with working checkboxes', async () => {
413
+ const el = await editorFixture();
414
+ el.value =
415
+ '<ul data-task-list="true"><li data-task-item="true" data-checked="false"><p>buy milk</p></li></ul>';
416
+ await el.updateComplete;
417
+ const checkbox = el.shadowRoot!.querySelector<HTMLInputElement>(
418
+ '.nile-wysiwyg__task-item input[type="checkbox"]'
419
+ )!;
420
+ expect(checkbox).to.exist;
421
+ expect(checkbox.checked).to.equal(false);
422
+
423
+ checkbox.checked = true;
424
+ checkbox.dispatchEvent(new Event('change'));
425
+ await el.updateComplete;
426
+ expect(el.getHTML()).to.include('data-checked="true"');
427
+ });
428
+
429
+ it('opens the emoji picker on ":xx" and inserts the character', async () => {
430
+ const el = await editorFixture();
431
+ const view = el.pmView!;
432
+ view.dispatch(view.state.tr.insertText('great :fir', 1));
433
+ await el.updateComplete;
434
+ const list = el.shadowRoot!.querySelector('nile-wysiwyg-suggest-list')!;
435
+ expect(list.open).to.equal(true);
436
+ expect(list.items[0].key).to.equal('fire');
437
+ list.selectCurrent();
438
+ await el.updateComplete;
439
+ expect(el.getText()).to.equal('great 🔥');
440
+ expect(list.open).to.equal(false);
441
+ });
442
+
443
+ it('respects no-emoji', async () => {
444
+ const el = await editorFixture(html`<nile-wysiwyg-editor no-emoji></nile-wysiwyg-editor>`);
445
+ const view = el.pmView!;
446
+ view.dispatch(view.state.tr.insertText(':fir', 1));
447
+ await el.updateComplete;
448
+ expect(el.shadowRoot!.querySelector('nile-wysiwyg-suggest-list')!.open).to.equal(false);
449
+ });
450
+
451
+ it('blocks typing past maxlength and shows the counter', async () => {
452
+ const el = await editorFixture(
453
+ html`<nile-wysiwyg-editor maxlength="5"></nile-wysiwyg-editor>`
454
+ );
455
+ const view = el.pmView!;
456
+ view.dispatch(view.state.tr.insertText('12345', 1));
457
+ await el.updateComplete;
458
+ const counter = el.shadowRoot!.querySelector('.nile-wysiwyg__counter')!;
459
+ expect(counter.textContent!.trim()).to.equal('5 / 5');
460
+ expect(counter.classList.contains('over')).to.equal(true);
461
+
462
+ // Further input is rejected at the transaction level.
463
+ view.someProp('handleTextInput', f =>
464
+ f(view, 6, 6, 'x', () => view.state.tr.insertText('x', 6, 6))
465
+ );
466
+ view.dispatch; // no-op; just read state
467
+ expect(el.getText()).to.equal('12345');
468
+ });
469
+
470
+ it('offers snippets in the slash menu and inserts their HTML', async () => {
471
+ const el = await editorFixture();
472
+ el.snippets = [
473
+ { key: 'sig', label: 'Signature', html: '<p>Regards,<br><strong>Birat</strong></p>' },
474
+ ];
475
+ const view = el.pmView!;
476
+ view.dispatch(view.state.tr.insertText('/sig', 1));
477
+ await el.updateComplete;
478
+ const list = el.shadowRoot!.querySelector('nile-wysiwyg-suggest-list')!;
479
+ expect(list.open).to.equal(true);
480
+ expect(list.items[0]).to.deep.include({ key: 'snippet:sig', label: 'Signature' });
481
+ list.selectCurrent();
482
+ await el.updateComplete;
483
+ expect(el.getHTML()).to.include('<strong>Birat</strong>');
484
+ expect(el.getText()).to.not.include('/sig');
485
+ });
486
+
487
+ it('reflects sticky-toolbar for the sticky CSS hook', async () => {
488
+ const el = await editorFixture(
489
+ html`<nile-wysiwyg-editor sticky-toolbar></nile-wysiwyg-editor>`
490
+ );
491
+ expect(el.hasAttribute('sticky-toolbar')).to.equal(true);
492
+ const toolbar = el.shadowRoot!.querySelector('nile-wysiwyg-toolbar')!;
493
+ expect(getComputedStyle(toolbar).position).to.equal('sticky');
494
+ });
495
+
496
+ it('renders highlighted tokens inside code blocks', async () => {
497
+ const el = await editorFixture();
498
+ el.value =
499
+ '<pre data-language="javascript"><code>const x = "hello"; // note</code></pre>';
500
+ await el.updateComplete;
501
+ const tokens = el.shadowRoot!.querySelectorAll('.ProseMirror pre [class*="hljs-"]');
502
+ expect(tokens.length).to.be.greaterThan(2);
503
+ expect(el.shadowRoot!.querySelector('.hljs-string')!.textContent).to.equal('"hello"');
504
+ });
505
+
506
+ it('shows the language picker inside a code block and applies changes', async () => {
507
+ const el = await editorFixture();
508
+ el.value = '<pre><code>select 1 from dual</code></pre>';
509
+ await el.updateComplete;
510
+ const view = el.pmView!;
511
+ view.dom.dispatchEvent(new FocusEvent('focus'));
512
+ view.dispatch(view.state.tr.setSelection(TextSelection.create(view.state.doc, 3)));
513
+ await el.updateComplete;
514
+
515
+ const menu = el.shadowRoot!.querySelector('nile-wysiwyg-code-menu')!;
516
+ expect(menu.open).to.equal(true);
517
+ menu.dispatchEvent(
518
+ new CustomEvent('wysiwyg-command', {
519
+ detail: { name: 'setCodeBlockLanguage', attrs: { language: 'sql' } },
520
+ bubbles: true,
521
+ composed: true,
522
+ })
523
+ );
524
+ expect(el.getHTML()).to.include('data-language="sql"');
525
+ });
526
+
527
+ it('keeps the language picker open while it has focus', async () => {
528
+ const el = await editorFixture();
529
+ el.value = '<pre><code>select 1</code></pre>';
530
+ await el.updateComplete;
531
+ const view = el.pmView!;
532
+ view.dom.dispatchEvent(new FocusEvent('focus'));
533
+ view.dispatch(view.state.tr.setSelection(TextSelection.create(view.state.doc, 2)));
534
+ await el.updateComplete;
535
+ const menu = el.shadowRoot!.querySelector('nile-wysiwyg-code-menu')!;
536
+ expect(menu.open).to.equal(true);
537
+
538
+ // Clicking the picker blurs the editor with focus moving into chrome —
539
+ // the menu must stay open so the option list can show.
540
+ view.dom.dispatchEvent(new FocusEvent('blur', { relatedTarget: menu }));
541
+ await el.updateComplete;
542
+ expect(menu.open).to.equal(true);
543
+
544
+ // Blurring to outside the editor closes it.
545
+ view.dom.dispatchEvent(new FocusEvent('blur'));
546
+ await el.updateComplete;
547
+ expect(menu.open).to.equal(false);
548
+ });
549
+
550
+ it('inserts embeds through the panel flow', async () => {
551
+ const el = await editorFixture();
552
+ const panel = el.shadowRoot!.querySelector('nile-wysiwyg-embed-panel')!;
553
+ panel.dispatchEvent(
554
+ new CustomEvent('wysiwyg-embed-apply', {
555
+ detail: { src: 'https://www.youtube-nocookie.com/embed/dQw4w9WgXcQ', provider: 'youtube' },
556
+ bubbles: true,
557
+ composed: true,
558
+ })
559
+ );
560
+ expect(el.getHTML()).to.include('data-embed-provider="youtube"');
561
+ expect(el.shadowRoot!.querySelector('.nile-wysiwyg__embed iframe')).to.exist;
562
+ });
563
+
564
+ it('makes embeds interactive once selected (click-to-select, then play)', async () => {
565
+ const el = await editorFixture();
566
+ el.value =
567
+ '<p>before</p><div data-embed-provider="youtube"><iframe src="https://www.youtube-nocookie.com/embed/dQw4w9WgXcQ"></iframe></div>';
568
+ await el.updateComplete;
569
+ const iframe = el.shadowRoot!.querySelector<HTMLIFrameElement>('.nile-wysiwyg__embed iframe')!;
570
+ expect(getComputedStyle(iframe).pointerEvents).to.equal('none');
571
+
572
+ // Select the embed node — the iframe becomes interactive.
573
+ const view = el.pmView!;
574
+ const { NodeSelection } = await import('prosemirror-state');
575
+ let embedPos = -1;
576
+ view.state.doc.descendants((node, pos) => {
577
+ if (node.type.name === 'embed' && embedPos < 0) embedPos = pos;
578
+ return embedPos < 0;
579
+ });
580
+ view.dispatch(view.state.tr.setSelection(NodeSelection.create(view.state.doc, embedPos)));
581
+ await el.updateComplete;
582
+ expect(getComputedStyle(iframe).pointerEvents).to.equal('auto');
583
+ });
584
+
585
+ it('turns pasted provider URLs into embeds', async () => {
586
+ const el = await editorFixture();
587
+ const view = el.pmView!;
588
+ const event = new ClipboardEvent('paste', { clipboardData: new DataTransfer() });
589
+ event.clipboardData!.setData('text/plain', 'https://vimeo.com/123456789');
590
+ const handled = view.someProp('handlePaste', f => f(view, event, view.state.tr.doc.slice(0)));
591
+ expect(handled).to.equal(true);
592
+ expect(el.getHTML()).to.include('player.vimeo.com/video/123456789');
593
+ });
594
+
595
+ it('strips hostile iframes set via value but keeps provider embeds', async () => {
596
+ const el = await editorFixture();
597
+ el.value =
598
+ '<iframe src="https://evil.example.com/x"></iframe>' +
599
+ '<div data-embed-provider="vimeo"><iframe src="https://player.vimeo.com/video/123456789"></iframe></div>';
600
+ await el.updateComplete;
601
+ const html = el.getHTML();
602
+ expect(html).to.not.include('evil.example.com');
603
+ expect(html).to.include('player.vimeo.com');
604
+ });
605
+
606
+ it('setContent accepts ProseMirror JSON', async () => {
607
+ const el = await editorFixture();
608
+ el.setContent({
609
+ type: 'doc',
610
+ content: [
611
+ {
612
+ type: 'paragraph',
613
+ content: [{ type: 'text', text: 'from json' }],
614
+ },
615
+ ],
616
+ });
617
+ expect(el.getHTML()).to.equal('<p>from json</p>');
618
+ expect(el.getText()).to.equal('from json');
619
+ });
620
+
621
+ describe('export & import', () => {
622
+ it('getInlineStyledHTML folds styles inline and drops classes', async () => {
623
+ const el = await editorFixture();
624
+ el.setContent('<p><strong>bold</strong> plain</p>');
625
+ await el.updateComplete;
626
+ const out = el.getInlineStyledHTML();
627
+ expect(out).to.include('<p');
628
+ expect(out).to.include('bold');
629
+ expect(out).to.not.include('class=');
630
+ expect(out).to.not.include('contenteditable');
631
+ });
632
+
633
+ it('getInlineStyledHTML is empty for an empty document', async () => {
634
+ const el = await editorFixture();
635
+ expect(el.getInlineStyledHTML()).to.equal('');
636
+ });
637
+
638
+ it('exportToWord and exportToPdf are no-ops on an empty document', async () => {
639
+ const el = await editorFixture();
640
+ let clicked = false;
641
+ const orig = HTMLAnchorElement.prototype.click;
642
+ HTMLAnchorElement.prototype.click = function () {
643
+ clicked = true;
644
+ };
645
+ try {
646
+ el.exportToWord();
647
+ el.exportInlineHtml();
648
+ } finally {
649
+ HTMLAnchorElement.prototype.click = orig;
650
+ }
651
+ expect(clicked).to.be.false;
652
+ });
653
+
654
+ it('exportToWord triggers a download for non-empty content', async () => {
655
+ const el = await editorFixture();
656
+ el.setContent('<p>hello</p>');
657
+ await el.updateComplete;
658
+ let downloadName = '';
659
+ const orig = HTMLAnchorElement.prototype.click;
660
+ HTMLAnchorElement.prototype.click = function () {
661
+ downloadName = this.getAttribute('download') ?? '';
662
+ };
663
+ try {
664
+ el.name = 'my-report';
665
+ el.exportToWord();
666
+ } finally {
667
+ HTMLAnchorElement.prototype.click = orig;
668
+ }
669
+ expect(downloadName).to.equal('my-report.doc');
670
+ });
671
+
672
+ it('importFromWord normalizes Word list paragraphs into real lists', async () => {
673
+ const el = await editorFixture();
674
+ const wordHtml =
675
+ '<p class="MsoListParagraph" style="mso-list:l0 level1 lfo1">' +
676
+ '<span style="mso-list:Ignore">1.</span>First</p>' +
677
+ '<p class="MsoListParagraph" style="mso-list:l0 level1 lfo1">' +
678
+ '<span style="mso-list:Ignore">2.</span>Second</p>';
679
+ el.importFromWord(wordHtml);
680
+ await el.updateComplete;
681
+ const out = el.getHTML();
682
+ expect(out).to.include('<ol');
683
+ expect(out).to.include('First');
684
+ expect(out).to.include('Second');
685
+ expect(out).to.not.include('mso-');
686
+ });
687
+ });
688
+
689
+ describe('productivity features', () => {
690
+ it('changeCase transforms the selection', async () => {
691
+ const el = await editorFixture();
692
+ el.setContent('<p>hello world</p>');
693
+ await el.updateComplete;
694
+ selectAll(el);
695
+ el.changeCase('upper');
696
+ expect(el.getHTML()).to.equal('<p>HELLO WORLD</p>');
697
+ });
698
+
699
+ it('insertMergeField inserts a placeholder chip', async () => {
700
+ const el = await editorFixture();
701
+ el.setContent('<p>Hi </p>');
702
+ await el.updateComplete;
703
+ const view = el.pmView!;
704
+ view.dispatch(view.state.tr.setSelection(TextSelection.create(view.state.doc, 4)));
705
+ el.insertMergeField('first_name', 'First name');
706
+ expect(el.getHTML()).to.include('data-merge-field="first_name"');
707
+ });
708
+
709
+ it('insertMath inserts a math node with LaTeX', async () => {
710
+ const el = await editorFixture();
711
+ el.setContent('<p></p>');
712
+ await el.updateComplete;
713
+ const view = el.pmView!;
714
+ view.dispatch(view.state.tr.setSelection(TextSelection.create(view.state.doc, 1)));
715
+ el.insertMath('E = mc^2', 'inline');
716
+ expect(el.getHTML()).to.include('data-math="E = mc^2"');
717
+ });
718
+
719
+ it('mathRenderer draws formulas as HTML in the view', async () => {
720
+ const el = await editorFixture();
721
+ el.mathRenderer = (latex: string) => `<b class="rendered">${latex}</b>`;
722
+ el.setContent('<p><span data-math="x^2">x^2</span></p>');
723
+ await el.updateComplete;
724
+ expect(el.shadowRoot!.querySelector('.nile-wysiwyg__math .rendered')).to.exist;
725
+ });
726
+
727
+ it('toggleFormatPainter arms and reflects in toolbar state', async () => {
728
+ const el = await editorFixture();
729
+ el.setContent('<p><strong>bold</strong> plain</p>');
730
+ await el.updateComplete;
731
+ const view = el.pmView!;
732
+ view.dispatch(view.state.tr.setSelection(TextSelection.create(view.state.doc, 1, 5)));
733
+ el.toggleFormatPainter();
734
+ // Selecting "plain" applies the copied bold and disarms.
735
+ view.dispatch(view.state.tr.setSelection(TextSelection.create(view.state.doc, 6, 11)));
736
+ await el.updateComplete;
737
+ expect(el.getHTML()).to.equal('<p><strong>bold</strong> <strong>plain</strong></p>');
738
+ });
739
+
740
+ it('emits nile-autosave after the interval when content changed', async () => {
741
+ const el = await editorFixture();
742
+ el.autosaveInterval = 30;
743
+ await el.updateComplete;
744
+ el.setContent('<p>changed</p>');
745
+ const event = await oneEvent(el, 'nile-autosave');
746
+ expect(event.detail.value).to.include('changed');
747
+ el.autosaveInterval = 0;
748
+ });
749
+ });
750
+ });