@limetech/lime-elements 40.5.4 → 40.6.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (451) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/dist/cjs/{adapt-color-contrast-Beo1IEl_.js → adapt-color-contrast-h6iwOfZd.js} +1 -1
  3. package/dist/cjs/{checkbox.template-BPk8WkQF.js → checkbox.template-CoNVC4Nf.js} +2 -2
  4. package/dist/cjs/{files-DI4jItxi.js → files-DpGigQ8k.js} +1 -1
  5. package/dist/cjs/{format-bytes-CpUKKU86.js → format-bytes-WTHVI718.js} +1 -4
  6. package/dist/cjs/{hotkeys-BtR8uxvl.js → hotkeys-D761KWnZ.js} +1 -0
  7. package/dist/cjs/{image-resize-CG2fitJT.js → image-resize-JlRLB97I.js} +1 -0
  8. package/dist/cjs/{image.template-DY7qwbuy.js → image.template-DlF-f23b.js} +1 -1
  9. package/dist/cjs/{index--B6-r0uo.js → index-BlsqxTB1.js} +1 -7
  10. package/dist/cjs/{index-ETPz91V5.js → index-zZvs6xK-.js} +9382 -9504
  11. package/dist/cjs/index.cjs.js +1 -1
  12. package/dist/cjs/{isArrayLikeObject-U2Ddbw4n.js → isArrayLikeObject-BhSkOTkw.js} +17 -0
  13. package/dist/cjs/{language-CaqPKPyW.js → language-v-MMS6ym.js} +1 -1
  14. package/dist/cjs/lime-elements.cjs.js +2 -2
  15. package/dist/cjs/limel-3d-hover-effect-glow.cjs.entry.js +2 -2
  16. package/dist/cjs/limel-action-bar_3.cjs.entry.js +20 -18
  17. package/dist/cjs/limel-ai-avatar.cjs.entry.js +5 -5
  18. package/dist/cjs/limel-badge.cjs.entry.js +3 -3
  19. package/dist/cjs/limel-banner.cjs.entry.js +2 -2
  20. package/dist/cjs/limel-breadcrumbs_6.cjs.entry.js +80 -80
  21. package/dist/cjs/limel-button-group.cjs.entry.js +3 -3
  22. package/dist/cjs/limel-button.cjs.entry.js +4 -4
  23. package/dist/cjs/limel-callout.cjs.entry.js +6 -6
  24. package/dist/cjs/limel-card.cjs.entry.js +8 -7
  25. package/dist/cjs/limel-chart.cjs.entry.js +5 -5
  26. package/dist/cjs/limel-checkbox.cjs.entry.js +12 -10
  27. package/dist/cjs/limel-chip-set.cjs.entry.js +30 -39
  28. package/dist/cjs/limel-chip_2.cjs.entry.js +9 -9
  29. package/dist/cjs/limel-circular-progress.cjs.entry.js +2 -2
  30. package/dist/cjs/limel-code-diff.cjs.entry.js +25 -28
  31. package/dist/cjs/limel-code-editor.cjs.entry.js +17 -12
  32. package/dist/cjs/limel-collapsible-section.cjs.entry.js +8 -8
  33. package/dist/cjs/limel-color-picker-palette.cjs.entry.js +3 -3
  34. package/dist/cjs/limel-color-picker.cjs.entry.js +6 -5
  35. package/dist/cjs/limel-config.cjs.entry.js +3 -3
  36. package/dist/cjs/limel-date-picker.cjs.entry.js +8 -11
  37. package/dist/cjs/limel-dialog.cjs.entry.js +6 -9
  38. package/dist/cjs/limel-dock-button.cjs.entry.js +6 -11
  39. package/dist/cjs/limel-dock.cjs.entry.js +3 -3
  40. package/dist/cjs/limel-drag-handle.cjs.entry.js +6 -6
  41. package/dist/cjs/limel-dynamic-label.cjs.entry.js +1 -1
  42. package/dist/cjs/limel-email-viewer.cjs.entry.js +11 -17
  43. package/dist/cjs/limel-file-dropzone_2.cjs.entry.js +11 -12
  44. package/dist/cjs/limel-file-viewer.cjs.entry.js +1099 -1147
  45. package/dist/cjs/limel-file.cjs.entry.js +17 -16
  46. package/dist/cjs/limel-flatpickr-adapter.cjs.entry.js +100 -94
  47. package/dist/cjs/limel-flex-container.cjs.entry.js +2 -2
  48. package/dist/cjs/limel-form.cjs.entry.js +67 -68
  49. package/dist/cjs/limel-grid.cjs.entry.js +2 -2
  50. package/dist/cjs/limel-header.cjs.entry.js +2 -2
  51. package/dist/cjs/limel-help-content.cjs.entry.js +2 -2
  52. package/dist/cjs/limel-help.cjs.entry.js +3 -3
  53. package/dist/cjs/limel-helper-line_3.cjs.entry.js +12 -14
  54. package/dist/cjs/limel-hotkey_4.cjs.entry.js +23 -23
  55. package/dist/cjs/limel-icon-button.cjs.entry.js +4 -4
  56. package/dist/cjs/limel-icon.cjs.entry.js +15 -13
  57. package/dist/cjs/limel-info-tile.cjs.entry.js +10 -10
  58. package/dist/cjs/limel-list-item.cjs.entry.js +10 -10
  59. package/dist/cjs/limel-markdown.cjs.entry.js +50 -23
  60. package/dist/cjs/limel-masonry-layout.cjs.entry.js +6 -5
  61. package/dist/cjs/limel-menu-item-meta.cjs.entry.js +3 -3
  62. package/dist/cjs/limel-pagination-jump.cjs.entry.js +17 -15
  63. package/dist/cjs/limel-pagination.cjs.entry.js +10 -9
  64. package/dist/cjs/limel-picker.cjs.entry.js +31 -29
  65. package/dist/cjs/limel-popover_2.cjs.entry.js +25 -21
  66. package/dist/cjs/limel-profile-picture.cjs.entry.js +12 -11
  67. package/dist/cjs/limel-progress-flow-item.cjs.entry.js +1 -1
  68. package/dist/cjs/limel-progress-flow.cjs.entry.js +11 -10
  69. package/dist/cjs/limel-prosemirror-adapter.cjs.entry.js +476 -408
  70. package/dist/cjs/limel-radio-button-group.cjs.entry.js +2 -2
  71. package/dist/cjs/limel-radio-button.cjs.entry.js +3 -3
  72. package/dist/cjs/limel-scroller.cjs.entry.js +180 -0
  73. package/dist/cjs/limel-select.cjs.entry.js +17 -17
  74. package/dist/cjs/limel-shortcut.cjs.entry.js +1 -1
  75. package/dist/cjs/limel-slider.cjs.entry.js +18 -27
  76. package/dist/cjs/limel-snackbar.cjs.entry.js +5 -5
  77. package/dist/cjs/limel-split-button.cjs.entry.js +1 -1
  78. package/dist/cjs/limel-switch.cjs.entry.js +3 -3
  79. package/dist/cjs/limel-tab-bar.cjs.entry.js +66 -97
  80. package/dist/cjs/limel-tab-panel.cjs.entry.js +12 -9
  81. package/dist/cjs/limel-table.cjs.entry.js +527 -106
  82. package/dist/cjs/limel-text-editor-link-menu.cjs.entry.js +15 -14
  83. package/dist/cjs/limel-text-editor.cjs.entry.js +3 -3
  84. package/dist/cjs/loader.cjs.js +2 -2
  85. package/dist/cjs/{make-enter-clickable-NuTMC9MU.js → make-enter-clickable-BZHEWIJD.js} +19 -12
  86. package/dist/cjs/markdown-exporter-C-UW43FF.js +6210 -0
  87. package/dist/cjs/{markdown-parser-YH5HSSgF.js → markdown-parser-ssDij8_l.js} +603 -870
  88. package/dist/cjs/{moment-CqRdiK10.js → moment-Cfsz2WF1.js} +1062 -833
  89. package/dist/cjs/{random-string-BTzDB2ee.js → random-string-CFCtFh5l.js} +1 -0
  90. package/dist/cjs/{render-list-component-5ZKWpCnM.js → render-list-component-BtAliHQp.js} +3 -5
  91. package/dist/cjs/{sv-BSR4W58y.js → sv-Co78RX70.js} +31 -3
  92. package/dist/cjs/{translations-DFFpR6AZ.js → translations-CNTWud2a.js} +5 -8
  93. package/dist/collection/collection-manifest.json +1 -0
  94. package/dist/collection/components/3d-hover-effect-glow/3d-hover-effect-glow.js +1 -1
  95. package/dist/collection/components/action-bar/action-bar-item/action-bar-item.js +8 -7
  96. package/dist/collection/components/action-bar/action-bar-item/action-bar-overflow-menu.js +1 -1
  97. package/dist/collection/components/action-bar/action-bar.js +6 -5
  98. package/dist/collection/components/ai-avatar/ai-avatar.js +1 -1
  99. package/dist/collection/components/badge/badge.js +2 -2
  100. package/dist/collection/components/banner/banner.js +1 -1
  101. package/dist/collection/components/breadcrumbs/breadcrumbs.js +2 -2
  102. package/dist/collection/components/button/button.js +2 -2
  103. package/dist/collection/components/button-group/button-group.js +1 -1
  104. package/dist/collection/components/callout/callout.js +1 -1
  105. package/dist/collection/components/card/card.js +6 -5
  106. package/dist/collection/components/checkbox/checkbox.js +9 -7
  107. package/dist/collection/components/checkbox/checkbox.template.js +1 -1
  108. package/dist/collection/components/chip/chip.js +1 -1
  109. package/dist/collection/components/chip-set/chip-set-input-helpers.js +18 -21
  110. package/dist/collection/components/chip-set/chip-set.js +7 -13
  111. package/dist/collection/components/circular-progress/circular-progress.js +1 -1
  112. package/dist/collection/components/code-diff/code-diff.js +19 -22
  113. package/dist/collection/components/code-diff/diff-engine.js +2 -2
  114. package/dist/collection/components/code-editor/code-editor.js +8 -3
  115. package/dist/collection/components/collapsible-section/collapsible-section.js +1 -1
  116. package/dist/collection/components/color-picker/color-picker-palette.js +2 -2
  117. package/dist/collection/components/color-picker/color-picker.js +5 -4
  118. package/dist/collection/components/config/config.js +2 -2
  119. package/dist/collection/components/date-picker/date-picker.js +3 -6
  120. package/dist/collection/components/date-picker/flatpickr-adapter/deferred-destroy.js +4 -3
  121. package/dist/collection/components/date-picker/flatpickr-adapter/flatpickr-adapter.js +1 -1
  122. package/dist/collection/components/date-picker/pickers/month-picker.js +40 -36
  123. package/dist/collection/components/date-picker/pickers/quarter-picker.js +35 -30
  124. package/dist/collection/components/date-picker/pickers/year-picker.js +16 -20
  125. package/dist/collection/components/dialog/dialog.js +4 -7
  126. package/dist/collection/components/dock/dock-button/dock-button.js +4 -9
  127. package/dist/collection/components/dock/dock.js +2 -2
  128. package/dist/collection/components/drag-handle/drag-handle.js +1 -1
  129. package/dist/collection/components/email-viewer/email-loader.js +14 -10
  130. package/dist/collection/components/email-viewer/email-viewer.js +1 -1
  131. package/dist/collection/components/email-viewer/sanitize-email-html.js +1 -4
  132. package/dist/collection/components/email-viewer/split-email-address-list.js +4 -10
  133. package/dist/collection/components/file/file.js +11 -10
  134. package/dist/collection/components/file-dropzone/file-dropzone.js +1 -1
  135. package/dist/collection/components/file-input/file-input.js +7 -8
  136. package/dist/collection/components/file-viewer/file-viewer.js +12 -9
  137. package/dist/collection/components/flex-container/flex-container.js +1 -1
  138. package/dist/collection/components/form/fields/schema-field.js +1 -1
  139. package/dist/collection/components/form/form.js +2 -5
  140. package/dist/collection/components/form/form.test-schemas.js +8 -10
  141. package/dist/collection/components/form/templates/array-field.js +7 -9
  142. package/dist/collection/components/form/templates/common.js +19 -19
  143. package/dist/collection/components/form/templates/object-field.js +1 -1
  144. package/dist/collection/components/form/validation-display.js +2 -2
  145. package/dist/collection/components/form/validators/format.js +1 -0
  146. package/dist/collection/components/form/widgets/code-editor.js +6 -9
  147. package/dist/collection/components/form/widgets/date-picker.js +1 -3
  148. package/dist/collection/components/grid/grid.js +1 -1
  149. package/dist/collection/components/header/header.js +1 -1
  150. package/dist/collection/components/help/help-content.js +1 -1
  151. package/dist/collection/components/help/help.js +2 -2
  152. package/dist/collection/components/helper-line/helper-line.js +3 -3
  153. package/dist/collection/components/hotkey/hotkey.js +1 -1
  154. package/dist/collection/components/icon/icon.js +11 -9
  155. package/dist/collection/components/icon-button/icon-button.js +1 -1
  156. package/dist/collection/components/info-tile/info-tile.js +9 -9
  157. package/dist/collection/components/input-field/input-field.js +11 -11
  158. package/dist/collection/components/list/list-renderer.js +5 -7
  159. package/dist/collection/components/list/list.js +2 -2
  160. package/dist/collection/components/list-item/list-item.js +2 -2
  161. package/dist/collection/components/list-item/menu-item-meta/menu-item-meta.js +1 -1
  162. package/dist/collection/components/markdown/hydrate-custom-elements.js +6 -5
  163. package/dist/collection/components/markdown/image-intersection-observer.js +9 -8
  164. package/dist/collection/components/markdown/image-markdown-plugin.js +9 -7
  165. package/dist/collection/components/markdown/link-markdown-plugin.js +11 -10
  166. package/dist/collection/components/markdown/markdown-exporter.js +186 -0
  167. package/dist/collection/components/markdown/markdown-parser.js +2 -3
  168. package/dist/collection/components/markdown/markdown.js +59 -6
  169. package/dist/collection/components/markdown/remove-empty-paragraphs-plugin.js +4 -5
  170. package/dist/collection/components/masonry-layout/masonry-layout.js +5 -4
  171. package/dist/collection/components/menu/menu.js +48 -46
  172. package/dist/collection/components/menu-list/menu-list-renderer.js +8 -8
  173. package/dist/collection/components/menu-list/menu-list.js +1 -1
  174. package/dist/collection/components/menu-surface/menu-surface.js +6 -8
  175. package/dist/collection/components/notched-outline/notched-outline.js +1 -1
  176. package/dist/collection/components/pagination/jump/pagination-jump.js +13 -11
  177. package/dist/collection/components/pagination/pagination.js +5 -4
  178. package/dist/collection/components/picker/picker.js +25 -23
  179. package/dist/collection/components/popover/popover.js +13 -10
  180. package/dist/collection/components/popover-surface/popover-surface.js +1 -1
  181. package/dist/collection/components/portal/contains.js +9 -8
  182. package/dist/collection/components/portal/portal.js +16 -16
  183. package/dist/collection/components/profile-picture/profile-picture.js +4 -3
  184. package/dist/collection/components/progress-flow/progress-flow.js +10 -9
  185. package/dist/collection/components/radio-button-group/radio-button-group.js +1 -1
  186. package/dist/collection/components/radio-button-group/radio-button.js +2 -2
  187. package/dist/collection/components/scroller/scroller.css +317 -0
  188. package/dist/collection/components/scroller/scroller.js +284 -0
  189. package/dist/collection/components/select/select.js +13 -11
  190. package/dist/collection/components/select/select.template.js +1 -3
  191. package/dist/collection/components/slider/get-percentage-class.js +9 -18
  192. package/dist/collection/components/slider/slider.js +2 -2
  193. package/dist/collection/components/tab-bar/tab-bar.css +7 -289
  194. package/dist/collection/components/tab-bar/tab-bar.js +59 -104
  195. package/dist/collection/components/tab-panel/tab-panel.js +11 -8
  196. package/dist/collection/components/table/columns.js +1 -3
  197. package/dist/collection/components/table/element-pool.js +1 -1
  198. package/dist/collection/components/table/table-selection.js +6 -5
  199. package/dist/collection/components/table/table.css +15 -17
  200. package/dist/collection/components/table/table.js +44 -39
  201. package/dist/collection/components/text-editor/link-menu/editor-link-menu.js +11 -10
  202. package/dist/collection/components/text-editor/prosemirror-adapter/menu/menu-command-utils/list-utils.js +1 -1
  203. package/dist/collection/components/text-editor/prosemirror-adapter/menu/menu-commands.js +6 -10
  204. package/dist/collection/components/text-editor/prosemirror-adapter/plugins/image/inserter.js +37 -40
  205. package/dist/collection/components/text-editor/prosemirror-adapter/plugins/image/node.js +2 -1
  206. package/dist/collection/components/text-editor/prosemirror-adapter/plugins/link/link-plugin.js +21 -20
  207. package/dist/collection/components/text-editor/prosemirror-adapter/plugins/menu-state-tracking-plugin.js +6 -5
  208. package/dist/collection/components/text-editor/prosemirror-adapter/plugins/trigger/factory-helpers/detect-trigger-removal.js +15 -14
  209. package/dist/collection/components/text-editor/prosemirror-adapter/prosemirror-adapter.js +40 -34
  210. package/dist/collection/components/text-editor/text-editor.js +1 -1
  211. package/dist/collection/components/text-editor/utils/metadata-utils.js +1 -1
  212. package/dist/collection/components/text-editor/utils/plugin-factory.js +3 -3
  213. package/dist/collection/components/tooltip/tooltip-content.js +1 -1
  214. package/dist/collection/components/tooltip/tooltip.js +2 -2
  215. package/dist/collection/global/icon-cache/factory.js +2 -3
  216. package/dist/collection/global/icon-cache/in-memory-icon-cache.js +2 -0
  217. package/dist/collection/global/translations.js +1 -3
  218. package/dist/collection/translations/fr.js +3 -3
  219. package/dist/collection/util/adapt-color-contrast.js +1 -1
  220. package/dist/collection/util/files.js +1 -1
  221. package/dist/collection/util/format-bytes.js +1 -4
  222. package/dist/collection/util/hotkeys.js +1 -0
  223. package/dist/collection/util/image-resize.js +1 -0
  224. package/dist/collection/util/language.js +1 -1
  225. package/dist/collection/util/make-enter-clickable.js +19 -12
  226. package/dist/collection/util/random-string.js +1 -0
  227. package/dist/collection/util/render-list-component.js +2 -4
  228. package/dist/esm/{adapt-color-contrast-Dgcw_h7C.js → adapt-color-contrast-BQoih_t0.js} +1 -1
  229. package/dist/esm/{checkbox.template-Cx_3u92S.js → checkbox.template-IDyv2bgn.js} +2 -2
  230. package/dist/esm/{files-DnkFEKoB.js → files-CKnLqPDj.js} +1 -1
  231. package/dist/esm/{format-bytes-u_sd2HMb.js → format-bytes-24yUSW40.js} +1 -4
  232. package/dist/esm/{hotkeys-BxrRWYts.js → hotkeys-DjmlD0Mw.js} +1 -0
  233. package/dist/esm/{image-resize-BTSG--2-.js → image-resize-Dv2HOgWN.js} +1 -0
  234. package/dist/esm/{image.template-wqMwmOF-.js → image.template-BGjw97m_.js} +1 -1
  235. package/dist/esm/{index-CbciMfiU.js → index-BN64nlbO.js} +9369 -9505
  236. package/dist/esm/{index-Bnc9lzk2.js → index-BU9IJqli.js} +1 -7
  237. package/dist/esm/index.js +1 -1
  238. package/dist/esm/{isArrayLikeObject-CJB8HbtH.js → isArrayLikeObject-tmUOLOWr.js} +17 -1
  239. package/dist/esm/{language-C3hECvXE.js → language-ChagAaNf.js} +1 -1
  240. package/dist/esm/lime-elements.js +3 -3
  241. package/dist/esm/limel-3d-hover-effect-glow.entry.js +2 -2
  242. package/dist/esm/limel-action-bar_3.entry.js +20 -18
  243. package/dist/esm/limel-ai-avatar.entry.js +5 -5
  244. package/dist/esm/limel-badge.entry.js +3 -3
  245. package/dist/esm/limel-banner.entry.js +2 -2
  246. package/dist/esm/limel-breadcrumbs_6.entry.js +80 -80
  247. package/dist/esm/limel-button-group.entry.js +3 -3
  248. package/dist/esm/limel-button.entry.js +4 -4
  249. package/dist/esm/limel-callout.entry.js +6 -6
  250. package/dist/esm/limel-card.entry.js +8 -7
  251. package/dist/esm/limel-chart.entry.js +5 -5
  252. package/dist/esm/limel-checkbox.entry.js +12 -10
  253. package/dist/esm/limel-chip-set.entry.js +30 -39
  254. package/dist/esm/limel-chip_2.entry.js +9 -9
  255. package/dist/esm/limel-circular-progress.entry.js +2 -2
  256. package/dist/esm/limel-code-diff.entry.js +25 -28
  257. package/dist/esm/limel-code-editor.entry.js +17 -12
  258. package/dist/esm/limel-collapsible-section.entry.js +8 -8
  259. package/dist/esm/limel-color-picker-palette.entry.js +3 -3
  260. package/dist/esm/limel-color-picker.entry.js +6 -5
  261. package/dist/esm/limel-config.entry.js +3 -3
  262. package/dist/esm/limel-date-picker.entry.js +8 -11
  263. package/dist/esm/limel-dialog.entry.js +6 -9
  264. package/dist/esm/limel-dock-button.entry.js +6 -11
  265. package/dist/esm/limel-dock.entry.js +3 -3
  266. package/dist/esm/limel-drag-handle.entry.js +6 -6
  267. package/dist/esm/limel-dynamic-label.entry.js +1 -1
  268. package/dist/esm/limel-email-viewer.entry.js +11 -17
  269. package/dist/esm/limel-file-dropzone_2.entry.js +11 -12
  270. package/dist/esm/limel-file-viewer.entry.js +1099 -1147
  271. package/dist/esm/limel-file.entry.js +17 -16
  272. package/dist/esm/limel-flatpickr-adapter.entry.js +100 -94
  273. package/dist/esm/limel-flex-container.entry.js +2 -2
  274. package/dist/esm/limel-form.entry.js +66 -67
  275. package/dist/esm/limel-grid.entry.js +2 -2
  276. package/dist/esm/limel-header.entry.js +2 -2
  277. package/dist/esm/limel-help-content.entry.js +2 -2
  278. package/dist/esm/limel-help.entry.js +3 -3
  279. package/dist/esm/limel-helper-line_3.entry.js +12 -14
  280. package/dist/esm/limel-hotkey_4.entry.js +23 -23
  281. package/dist/esm/limel-icon-button.entry.js +4 -4
  282. package/dist/esm/limel-icon.entry.js +15 -13
  283. package/dist/esm/limel-info-tile.entry.js +10 -10
  284. package/dist/esm/limel-list-item.entry.js +10 -10
  285. package/dist/esm/limel-markdown.entry.js +50 -23
  286. package/dist/esm/limel-masonry-layout.entry.js +6 -5
  287. package/dist/esm/limel-menu-item-meta.entry.js +3 -3
  288. package/dist/esm/limel-pagination-jump.entry.js +17 -15
  289. package/dist/esm/limel-pagination.entry.js +10 -9
  290. package/dist/esm/limel-picker.entry.js +31 -29
  291. package/dist/esm/limel-popover_2.entry.js +25 -21
  292. package/dist/esm/limel-profile-picture.entry.js +12 -11
  293. package/dist/esm/limel-progress-flow-item.entry.js +1 -1
  294. package/dist/esm/limel-progress-flow.entry.js +11 -10
  295. package/dist/esm/limel-prosemirror-adapter.entry.js +476 -408
  296. package/dist/esm/limel-radio-button-group.entry.js +2 -2
  297. package/dist/esm/limel-radio-button.entry.js +3 -3
  298. package/dist/esm/limel-scroller.entry.js +178 -0
  299. package/dist/esm/limel-select.entry.js +17 -17
  300. package/dist/esm/limel-shortcut.entry.js +1 -1
  301. package/dist/esm/limel-slider.entry.js +18 -27
  302. package/dist/esm/limel-snackbar.entry.js +5 -5
  303. package/dist/esm/limel-split-button.entry.js +1 -1
  304. package/dist/esm/limel-switch.entry.js +3 -3
  305. package/dist/esm/limel-tab-bar.entry.js +66 -97
  306. package/dist/esm/limel-tab-panel.entry.js +12 -9
  307. package/dist/esm/limel-table.entry.js +527 -106
  308. package/dist/esm/limel-text-editor-link-menu.entry.js +15 -14
  309. package/dist/esm/limel-text-editor.entry.js +3 -3
  310. package/dist/esm/loader.js +3 -3
  311. package/dist/esm/{make-enter-clickable-BgTwPGeH.js → make-enter-clickable-CIf8aGSd.js} +19 -12
  312. package/dist/esm/markdown-exporter-DblYRMhY.js +6208 -0
  313. package/dist/esm/{markdown-parser-DrxxGLF5.js → markdown-parser-CAPDx7i8.js} +530 -813
  314. package/dist/esm/{moment-DQRNe8qq.js → moment-_DadZLWp.js} +1062 -833
  315. package/dist/esm/{random-string-JbKhhoXs.js → random-string-BrjD-ITe.js} +1 -0
  316. package/dist/esm/{render-list-component-cicbMp0l.js → render-list-component-J1IzNpbv.js} +3 -5
  317. package/dist/esm/{sv-CY-6-yEp.js → sv-DpsDSi7k.js} +31 -3
  318. package/dist/esm/{translations-DMtX4tTX.js → translations-Y4i8PVc9.js} +5 -8
  319. package/dist/lime-elements/index.esm.js +1 -1
  320. package/dist/lime-elements/lime-elements.esm.js +1 -1
  321. package/dist/lime-elements/{p-3916b316.entry.js → p-03cb609e.entry.js} +1 -1
  322. package/dist/lime-elements/p-05038bbb.entry.js +1 -0
  323. package/dist/lime-elements/{p-835149c4.entry.js → p-0d6925f4.entry.js} +1 -1
  324. package/dist/lime-elements/p-0e13ec91.entry.js +1 -0
  325. package/dist/lime-elements/p-159603cf.entry.js +159 -0
  326. package/dist/lime-elements/p-22fd1c87.entry.js +1 -0
  327. package/dist/lime-elements/p-24yUSW40.js +1 -0
  328. package/dist/lime-elements/{p-f717cd7a.entry.js → p-271662d4.entry.js} +1 -1
  329. package/dist/lime-elements/{p-c2a60508.entry.js → p-29c73bdf.entry.js} +1 -1
  330. package/dist/lime-elements/{p-deceda00.entry.js → p-2a902e77.entry.js} +1 -1
  331. package/dist/lime-elements/{p-d0cec424.entry.js → p-2b033dfa.entry.js} +1 -1
  332. package/dist/lime-elements/{p-acba5700.entry.js → p-2b2253d4.entry.js} +1 -1
  333. package/dist/lime-elements/p-2e33d2a4.entry.js +1 -0
  334. package/dist/lime-elements/p-31226737.entry.js +13 -0
  335. package/dist/lime-elements/{p-36ce4fbc.entry.js → p-31f314e6.entry.js} +1 -1
  336. package/dist/lime-elements/p-32a050a3.entry.js +1 -0
  337. package/dist/lime-elements/{p-3735111e.entry.js → p-3cfe0eaf.entry.js} +1 -1
  338. package/dist/lime-elements/{p-fbcd99a3.entry.js → p-3d3bdf45.entry.js} +1 -1
  339. package/dist/lime-elements/p-440a0b43.entry.js +1 -0
  340. package/dist/lime-elements/p-45c39fb4.entry.js +1 -0
  341. package/dist/lime-elements/p-45fde7a1.entry.js +1 -0
  342. package/dist/lime-elements/p-48afa6b7.entry.js +1 -0
  343. package/dist/lime-elements/{p-f04f7c8e.entry.js → p-4a88d365.entry.js} +1 -1
  344. package/dist/lime-elements/p-4b75e653.entry.js +1 -0
  345. package/dist/lime-elements/p-4dfd1962.entry.js +67 -0
  346. package/dist/lime-elements/{p-5698e493.entry.js → p-4ecbc9f4.entry.js} +1 -1
  347. package/dist/lime-elements/p-5386c629.entry.js +1 -0
  348. package/dist/lime-elements/{p-2e568c56.entry.js → p-54a9f48f.entry.js} +1 -1
  349. package/dist/lime-elements/{p-0fba64eb.entry.js → p-5df21b25.entry.js} +2 -2
  350. package/dist/lime-elements/{p-408c4dcb.entry.js → p-5f5c6e7d.entry.js} +1 -1
  351. package/dist/lime-elements/{p-052c3bc6.entry.js → p-681cb6de.entry.js} +1 -1
  352. package/dist/lime-elements/p-6adc7c88.entry.js +1 -0
  353. package/dist/lime-elements/{p-90df3e1b.entry.js → p-6d9961f7.entry.js} +1 -1
  354. package/dist/lime-elements/{p-74bd0c1a.entry.js → p-7b4351f6.entry.js} +1 -1
  355. package/dist/lime-elements/{p-3fd7e8aa.entry.js → p-7eab1341.entry.js} +1 -1
  356. package/dist/lime-elements/p-80153f45.entry.js +1 -0
  357. package/dist/lime-elements/{p-35fa1063.entry.js → p-85318636.entry.js} +1 -1
  358. package/dist/lime-elements/p-8988b7e1.entry.js +1 -0
  359. package/dist/lime-elements/{p-4ffbfc79.entry.js → p-8ac79ef5.entry.js} +1 -1
  360. package/dist/lime-elements/{p-4902fb3f.entry.js → p-9218fa6a.entry.js} +1 -1
  361. package/dist/lime-elements/p-92669910.entry.js +1 -0
  362. package/dist/lime-elements/{p-38b09f87.entry.js → p-9415411e.entry.js} +1 -1
  363. package/dist/lime-elements/p-95ccd9e7.entry.js +1 -0
  364. package/dist/lime-elements/{p-cb407bef.entry.js → p-9afa4721.entry.js} +1 -1
  365. package/dist/lime-elements/{p-54dcf46f.entry.js → p-9c8c2fb7.entry.js} +1 -1
  366. package/dist/lime-elements/{p-B8hoCfhT.js → p-B3YP9GOq.js} +1 -1
  367. package/dist/lime-elements/{p-Dgcw_h7C.js → p-BQoih_t0.js} +1 -1
  368. package/dist/lime-elements/{p-Bnc9lzk2.js → p-BU9IJqli.js} +1 -1
  369. package/dist/lime-elements/{p-CGVVDGcv.js → p-Bkvc4sus.js} +1 -1
  370. package/dist/lime-elements/p-Bvyt2bmV.js +1 -0
  371. package/dist/lime-elements/{p-BgTwPGeH.js → p-CIf8aGSd.js} +1 -1
  372. package/dist/lime-elements/{p-C3hECvXE.js → p-ChagAaNf.js} +1 -1
  373. package/dist/lime-elements/p-DTcfed02.js +3 -0
  374. package/dist/lime-elements/p-DWMfAkOE.js +1 -0
  375. package/dist/lime-elements/{p-BY85K-4J.js → p-DqQOawxc.js} +1 -1
  376. package/dist/lime-elements/p-I0PrvthC.js +7 -0
  377. package/dist/lime-elements/p-N9vxZMhe.js +1 -0
  378. package/dist/lime-elements/{p-DsDkl4Sy.js → p-ZDFVISfu.js} +3 -3
  379. package/dist/lime-elements/p-_UXAljNc.js +1 -0
  380. package/dist/lime-elements/p-a1c69e0c.entry.js +1 -0
  381. package/dist/lime-elements/{p-2daf0482.entry.js → p-a1d1470c.entry.js} +1 -1
  382. package/dist/lime-elements/{p-cef66e53.entry.js → p-a2e6f16e.entry.js} +1 -1
  383. package/dist/lime-elements/p-a550ba18.entry.js +1 -0
  384. package/dist/lime-elements/{p-d146feda.entry.js → p-a65eb58e.entry.js} +1 -1
  385. package/dist/lime-elements/p-ab8021b9.entry.js +1 -0
  386. package/dist/lime-elements/{p-03fb2603.entry.js → p-b22b52a1.entry.js} +1 -1
  387. package/dist/lime-elements/p-b6c0dc91.entry.js +23 -0
  388. package/dist/lime-elements/{p-c2a3ca7c.entry.js → p-b6d39581.entry.js} +1 -1
  389. package/dist/lime-elements/{p-8475a3b8.entry.js → p-c439b68b.entry.js} +1 -1
  390. package/dist/lime-elements/p-d19c7a3a.entry.js +1 -0
  391. package/dist/lime-elements/{p-7cbf50fc.entry.js → p-d1e5dd12.entry.js} +1 -1
  392. package/dist/lime-elements/p-de4719a6.entry.js +1 -0
  393. package/dist/lime-elements/{p-b81a2728.entry.js → p-e02e2c5f.entry.js} +1 -1
  394. package/dist/lime-elements/{p-d351b9ae.entry.js → p-e6a34047.entry.js} +1 -1
  395. package/dist/lime-elements/p-eF09GxA_.js +1 -0
  396. package/dist/lime-elements/{p-8fa9c9ea.entry.js → p-ee719744.entry.js} +1 -1
  397. package/dist/lime-elements/{p-d3bd4b80.entry.js → p-f04e2897.entry.js} +3 -3
  398. package/dist/lime-elements/p-f3cae1e7.entry.js +1 -0
  399. package/dist/lime-elements/{p-8115da75.entry.js → p-f4a0b1bc.entry.js} +1 -1
  400. package/dist/lime-elements/{p-4855dc9b.entry.js → p-f82f72e7.entry.js} +1 -1
  401. package/dist/lime-elements/{p-2d84ea04.entry.js → p-f97ec7a5.entry.js} +1 -1
  402. package/dist/lime-elements/{p-21109d9b.entry.js → p-fdd674fc.entry.js} +1 -1
  403. package/dist/lime-elements/{p-459eea13.entry.js → p-fdec09e9.entry.js} +1 -1
  404. package/dist/lime-elements/{p-2f57c3fa.entry.js → p-fe492ff3.entry.js} +1 -1
  405. package/dist/lime-elements/{p-65cded0e.entry.js → p-ff1a8b2e.entry.js} +1 -1
  406. package/dist/types/components/chip-set/chip-set-input-helpers.d.ts +1 -1
  407. package/dist/types/components/markdown/markdown-exporter.d.ts +15 -0
  408. package/dist/types/components/markdown/markdown.d.ts +19 -0
  409. package/dist/types/components/pagination/jump/pagination-jump.d.ts +1 -1
  410. package/dist/types/components/scroller/scroller.d.ts +67 -0
  411. package/dist/types/components/tab-bar/tab-bar.d.ts +13 -16
  412. package/dist/types/components.d.ts +138 -0
  413. package/dist/types/global/icon-cache/factory.d.ts +2 -2
  414. package/dist/types/global/shared-types/custom-element.types.d.ts +25 -0
  415. package/dist/types/global/translations.d.ts +2 -2
  416. package/package.json +18 -12
  417. package/dist/lime-elements/p-05afb316.entry.js +0 -1
  418. package/dist/lime-elements/p-10594468.entry.js +0 -1
  419. package/dist/lime-elements/p-19344984.entry.js +0 -13
  420. package/dist/lime-elements/p-1e93473a.entry.js +0 -1
  421. package/dist/lime-elements/p-26c5c6b9.entry.js +0 -1
  422. package/dist/lime-elements/p-452b9b01.entry.js +0 -1
  423. package/dist/lime-elements/p-4aae63bd.entry.js +0 -1
  424. package/dist/lime-elements/p-507cc8a1.entry.js +0 -159
  425. package/dist/lime-elements/p-531b6a64.entry.js +0 -1
  426. package/dist/lime-elements/p-54793c06.entry.js +0 -1
  427. package/dist/lime-elements/p-5d974afa.entry.js +0 -1
  428. package/dist/lime-elements/p-66b125f2.entry.js +0 -1
  429. package/dist/lime-elements/p-6d5b23ad.entry.js +0 -1
  430. package/dist/lime-elements/p-7e212fa7.entry.js +0 -1
  431. package/dist/lime-elements/p-82696d24.entry.js +0 -1
  432. package/dist/lime-elements/p-9ac39039.entry.js +0 -1
  433. package/dist/lime-elements/p-9b631363.entry.js +0 -1
  434. package/dist/lime-elements/p-C9xHOCE_.js +0 -7
  435. package/dist/lime-elements/p-DMNtoJ8I.js +0 -1
  436. package/dist/lime-elements/p-DQJU9gzh.js +0 -1
  437. package/dist/lime-elements/p-DpJgXIWf.js +0 -1
  438. package/dist/lime-elements/p-a1de9bbe.entry.js +0 -1
  439. package/dist/lime-elements/p-a71f6e87.entry.js +0 -67
  440. package/dist/lime-elements/p-bd7b3f8e.entry.js +0 -1
  441. package/dist/lime-elements/p-be8610ff.entry.js +0 -1
  442. package/dist/lime-elements/p-c72e5007.entry.js +0 -1
  443. package/dist/lime-elements/p-cafec335.entry.js +0 -1
  444. package/dist/lime-elements/p-d6dadc61.entry.js +0 -1
  445. package/dist/lime-elements/p-d93b7b9f.entry.js +0 -23
  446. package/dist/lime-elements/p-pk5KIdKH.js +0 -1
  447. package/dist/lime-elements/p-u_sd2HMb.js +0 -1
  448. package/dist/lime-elements/p-zo6O9LC9.js +0 -3
  449. /package/dist/lime-elements/{p-JbKhhoXs.js → p-BrjD-ITe.js} +0 -0
  450. /package/dist/lime-elements/{p-BxrRWYts.js → p-DjmlD0Mw.js} +0 -0
  451. /package/dist/lime-elements/{p-BTSG--2-.js → p-Dv2HOgWN.js} +0 -0
@@ -1,14 +1,14 @@
1
1
  'use strict';
2
2
 
3
- var index$1 = require('./index--B6-r0uo.js');
3
+ var index$1 = require('./index-BlsqxTB1.js');
4
4
  var types = require('./types-C7gNcwzE.js');
5
- var markdownParser = require('./markdown-parser-YH5HSSgF.js');
5
+ var markdownParser = require('./markdown-parser-ssDij8_l.js');
6
6
  var cloneDeep = require('./cloneDeep-D2immmwT.js');
7
- var translations = require('./translations-DFFpR6AZ.js');
8
- var index = require('./index-ETPz91V5.js');
9
- var randomString = require('./random-string-BTzDB2ee.js');
7
+ var translations = require('./translations-CNTWud2a.js');
8
+ var index = require('./index-zZvs6xK-.js');
9
+ var randomString = require('./random-string-CFCtFh5l.js');
10
10
  var isItem = require('./is-item-DMELyaao.js');
11
- var files = require('./files-DI4jItxi.js');
11
+ var files = require('./files-DpGigQ8k.js');
12
12
  var isEqual = require('./isEqual-D3eFkhqd.js');
13
13
  var debounce = require('./debounce-DgDnRSlt.js');
14
14
  require('./_commonjsHelpers-CFO10eej.js');
@@ -25,7 +25,7 @@ require('./_isIndex-Bu45fvR7.js');
25
25
  require('./_assignValue-DQh76m39.js');
26
26
  require('./_defineProperty-Csu6P9HT.js');
27
27
  require('./_getPrototype-CCLHkBHj.js');
28
- require('./language-CaqPKPyW.js');
28
+ require('./language-v-MMS6ym.js');
29
29
  require('./file-metadata-BrhOssGG.js');
30
30
  require('./icons-isR5V1X0.js');
31
31
  require('./get-icon-props-CwpDdQDI.js');
@@ -6873,15 +6873,15 @@ function scanFor(node, off, targetNode, targetOff, dir) {
6873
6873
  return true;
6874
6874
  if (off == (dir < 0 ? 0 : nodeSize(node))) {
6875
6875
  let parent = node.parentNode;
6876
- if (!parent || parent.nodeType != 1 || hasBlockDesc(node) || atomElements.test(node.nodeName) ||
6876
+ if (!parent || !isElt(parent) || hasBlockDesc(node) || atomElements.test(node.nodeName) ||
6877
6877
  node.contentEditable == "false")
6878
6878
  return false;
6879
6879
  off = domIndex(node) + (dir < 0 ? 0 : 1);
6880
6880
  node = parent;
6881
6881
  }
6882
- else if (node.nodeType == 1) {
6882
+ else if (isElt(node)) {
6883
6883
  let child = node.childNodes[off + (dir < 0 ? -1 : 0)];
6884
- if (child.nodeType == 1 && child.contentEditable == "false") {
6884
+ if (isElt(child) && child.contentEditable == "false") {
6885
6885
  if ((_a = child.pmViewDesc) === null || _a === void 0 ? void 0 : _a.ignoreForSelection)
6886
6886
  off += dir;
6887
6887
  else
@@ -6900,11 +6900,16 @@ function scanFor(node, off, targetNode, targetOff, dir) {
6900
6900
  function nodeSize(node) {
6901
6901
  return node.nodeType == 3 ? node.nodeValue.length : node.childNodes.length;
6902
6902
  }
6903
+ function isElt(node) { return node.nodeType == 1; }
6904
+ function isText(node) { return node.nodeType == 3; }
6905
+ function contains(parent, child) {
6906
+ return child ? parent.contains(isElt(child) ? child : child.parentNode) : false;
6907
+ }
6903
6908
  function textNodeBefore$1(node, offset) {
6904
6909
  for (;;) {
6905
- if (node.nodeType == 3 && offset)
6910
+ if (isText(node) && offset)
6906
6911
  return node;
6907
- if (node.nodeType == 1 && offset > 0) {
6912
+ if (isElt(node) && offset > 0) {
6908
6913
  if (node.contentEditable == "false")
6909
6914
  return null;
6910
6915
  node = node.childNodes[offset - 1];
@@ -6921,9 +6926,9 @@ function textNodeBefore$1(node, offset) {
6921
6926
  }
6922
6927
  function textNodeAfter$1(node, offset) {
6923
6928
  for (;;) {
6924
- if (node.nodeType == 3 && offset < node.nodeValue.length)
6929
+ if (isText(node) && offset < node.nodeValue.length)
6925
6930
  return node;
6926
- if (node.nodeType == 1 && offset < node.childNodes.length) {
6931
+ if (isElt(node) && offset < node.childNodes.length) {
6927
6932
  if (node.contentEditable == "false")
6928
6933
  return null;
6929
6934
  node = node.childNodes[offset];
@@ -7038,18 +7043,20 @@ function clientRect(node) {
7038
7043
  top: rect.top, bottom: rect.top + node.clientHeight * scaleY };
7039
7044
  }
7040
7045
  function scrollRectIntoView(view, rect, startDOM) {
7046
+ // Skip empty rects with all sides at 0, for example, when the element has no CSS box (display: none)
7047
+ if (!nonZero(rect) && rect.left == 0)
7048
+ return;
7041
7049
  let scrollThreshold = view.someProp("scrollThreshold") || 0, scrollMargin = view.someProp("scrollMargin") || 5;
7042
7050
  let doc = view.dom.ownerDocument;
7043
7051
  for (let parent = startDOM || view.dom;;) {
7044
7052
  if (!parent)
7045
7053
  break;
7046
- if (parent.nodeType != 1) {
7054
+ if (!isElt(parent)) {
7047
7055
  parent = parentNode(parent);
7048
7056
  continue;
7049
7057
  }
7050
- let elt = parent;
7051
- let atTop = elt == doc.body;
7052
- let bounding = atTop ? windowRect(doc) : clientRect(elt);
7058
+ let atTop = parent == doc.body;
7059
+ let bounding = atTop ? windowRect(doc) : clientRect(parent);
7053
7060
  let moveX = 0, moveY = 0;
7054
7061
  if (rect.top < bounding.top + getSide(scrollThreshold, "top"))
7055
7062
  moveY = -(bounding.top - rect.top + getSide(scrollMargin, "top"));
@@ -7066,12 +7073,12 @@ function scrollRectIntoView(view, rect, startDOM) {
7066
7073
  doc.defaultView.scrollBy(moveX, moveY);
7067
7074
  }
7068
7075
  else {
7069
- let startX = elt.scrollLeft, startY = elt.scrollTop;
7076
+ let startX = parent.scrollLeft, startY = parent.scrollTop;
7070
7077
  if (moveY)
7071
- elt.scrollTop += moveY;
7078
+ parent.scrollTop += moveY;
7072
7079
  if (moveX)
7073
- elt.scrollLeft += moveX;
7074
- let dX = elt.scrollLeft - startX, dY = elt.scrollTop - startY;
7080
+ parent.scrollLeft += moveX;
7081
+ let dX = parent.scrollLeft - startX, dY = parent.scrollTop - startY;
7075
7082
  rect = { left: rect.left - dX, top: rect.top - dY, right: rect.right - dX, bottom: rect.bottom - dY };
7076
7083
  }
7077
7084
  }
@@ -7146,14 +7153,15 @@ function focusPreventScroll(dom) {
7146
7153
  }
7147
7154
  }
7148
7155
  function findOffsetInNode(node, coords) {
7149
- let closest, dxClosest = 2e8, coordsClosest, offset = 0;
7156
+ let closest;
7157
+ let dxClosest = 2e8, coordsClosest, offset = 0;
7150
7158
  let rowBot = coords.top, rowTop = coords.top;
7151
7159
  let firstBelow, coordsBelow;
7152
7160
  for (let child = node.firstChild, childIndex = 0; child; child = child.nextSibling, childIndex++) {
7153
7161
  let rects;
7154
- if (child.nodeType == 1)
7162
+ if (isElt(child))
7155
7163
  rects = child.getClientRects();
7156
- else if (child.nodeType == 3)
7164
+ else if (isText(child))
7157
7165
  rects = textRange(child).getClientRects();
7158
7166
  else
7159
7167
  continue;
@@ -7167,11 +7175,11 @@ function findOffsetInNode(node, coords) {
7167
7175
  if (dx < dxClosest) {
7168
7176
  closest = child;
7169
7177
  dxClosest = dx;
7170
- coordsClosest = dx && closest.nodeType == 3 ? {
7178
+ coordsClosest = dx && isText(closest) ? {
7171
7179
  left: rect.right < coords.left ? rect.right : rect.left,
7172
7180
  top: coords.top
7173
7181
  } : coords;
7174
- if (child.nodeType == 1 && dx)
7182
+ if (isElt(child) && dx)
7175
7183
  offset = childIndex + (coords.left >= (rect.left + rect.right) / 2 ? 1 : 0);
7176
7184
  continue;
7177
7185
  }
@@ -7190,9 +7198,9 @@ function findOffsetInNode(node, coords) {
7190
7198
  coordsClosest = coordsBelow;
7191
7199
  dxClosest = 0;
7192
7200
  }
7193
- if (closest && closest.nodeType == 3)
7201
+ if (closest && isText(closest))
7194
7202
  return findOffsetInText(closest, coordsClosest);
7195
- if (!closest || (dxClosest && closest.nodeType == 1))
7203
+ if (!closest || dxClosest)
7196
7204
  return { node, offset };
7197
7205
  return findOffsetInNode(closest, coordsClosest);
7198
7206
  }
@@ -7225,7 +7233,7 @@ function targetKludge(dom, coords) {
7225
7233
  }
7226
7234
  function posFromElement(view, elt, coords) {
7227
7235
  let { node, offset } = findOffsetInNode(elt, coords), bias = -1;
7228
- if (node.nodeType == 1 && !node.firstChild) {
7236
+ if (isElt(node) && !node.firstChild) {
7229
7237
  let rect = node.getBoundingClientRect();
7230
7238
  bias = rect.left != rect.right && coords.left > (rect.left + rect.right) / 2 ? 1 : -1;
7231
7239
  }
@@ -7245,7 +7253,7 @@ function posFromCaret(view, node, offset, coords) {
7245
7253
  let desc = view.docView.nearestDesc(cur, true), rect;
7246
7254
  if (!desc)
7247
7255
  return null;
7248
- if (desc.dom.nodeType == 1 && (desc.node.isBlock && desc.parent || !desc.contentDOM) &&
7256
+ if (isElt(desc.dom) && (desc.node.isBlock && desc.parent || !desc.contentDOM) &&
7249
7257
  // Ignore elements with zero-size bounding rectangles
7250
7258
  ((rect = desc.dom.getBoundingClientRect()).width || rect.height)) {
7251
7259
  if (desc.node.isBlock && desc.parent && !/^T(R|BODY|HEAD|FOOT)$/.test(desc.dom.nodeName)) {
@@ -7272,7 +7280,7 @@ function elementFromPoint(element, coords, box) {
7272
7280
  if (len && box.top < box.bottom) {
7273
7281
  for (let startI = Math.max(0, Math.min(len - 1, Math.floor(len * (coords.top - box.top) / (box.bottom - box.top)) - 2)), i = startI;;) {
7274
7282
  let child = element.childNodes[i];
7275
- if (child.nodeType == 1) {
7283
+ if (isElt(child)) {
7276
7284
  let rects = child.getClientRects();
7277
7285
  for (let j = 0; j < rects.length; j++) {
7278
7286
  let rect = rects[j];
@@ -7295,7 +7303,7 @@ function posAtCoords(view, coords) {
7295
7303
  let elt = (view.root.elementFromPoint ? view.root : doc)
7296
7304
  .elementFromPoint(coords.left, coords.top);
7297
7305
  let pos;
7298
- if (!elt || !view.dom.contains(elt.nodeType != 1 ? elt.parentNode : elt)) {
7306
+ if (!elt || !view.dom.contains(elt)) {
7299
7307
  let box = view.dom.getBoundingClientRect();
7300
7308
  if (!inRect(coords, box))
7301
7309
  return null;
@@ -7311,7 +7319,7 @@ function posAtCoords(view, coords) {
7311
7319
  }
7312
7320
  elt = targetKludge(elt, coords);
7313
7321
  if (node) {
7314
- if (gecko && node.nodeType == 1) {
7322
+ if (gecko && isElt(node)) {
7315
7323
  // Firefox will sometimes return offsets into <input> nodes, which
7316
7324
  // have no actual children, from caretPositionFromPoint (#953)
7317
7325
  offset = Math.min(offset, node.childNodes.length);
@@ -7326,18 +7334,18 @@ function posAtCoords(view, coords) {
7326
7334
  }
7327
7335
  let prev;
7328
7336
  // When clicking above the right side of an uneditable node, Chrome will report a cursor position after that node.
7329
- if (webkit && offset && node.nodeType == 1 && (prev = node.childNodes[offset - 1]).nodeType == 1 &&
7337
+ if (webkit && offset && isElt(node) && isElt(prev = node.childNodes[offset - 1]) &&
7330
7338
  prev.contentEditable == "false" && prev.getBoundingClientRect().top >= coords.top)
7331
7339
  offset--;
7332
7340
  // Suspiciously specific kludge to work around caret*FromPoint
7333
7341
  // never returning a position at the end of the document
7334
- if (node == view.dom && offset == node.childNodes.length - 1 && node.lastChild.nodeType == 1 &&
7342
+ if (node == view.dom && offset == node.childNodes.length - 1 && isElt(node.lastChild) &&
7335
7343
  coords.top > node.lastChild.getBoundingClientRect().bottom)
7336
7344
  pos = view.state.doc.content.size;
7337
7345
  // Ignore positions directly after a BR, since caret*FromPoint
7338
7346
  // 'round up' positions that would be more accurately placed
7339
7347
  // before the BR node.
7340
- else if (offset == 0 || node.nodeType != 1 || node.childNodes[offset - 1].nodeName != "BR")
7348
+ else if (offset == 0 || !isElt(node) || node.childNodes[offset - 1].nodeName != "BR")
7341
7349
  pos = posFromCaret(view, node, offset, coords);
7342
7350
  }
7343
7351
  if (pos == null)
@@ -7363,7 +7371,7 @@ const BIDI = /[\u0590-\u05f4\u0600-\u06ff\u0700-\u08ac]/;
7363
7371
  function coordsAtPos(view, pos, side) {
7364
7372
  let { node, offset, atom } = view.docView.domFromPos(pos, side < 0 ? -1 : 1);
7365
7373
  let supportEmptyRange = webkit || gecko;
7366
- if (node.nodeType == 3) {
7374
+ if (isText(node)) {
7367
7375
  // These browsers support querying empty text ranges. Prefer that in
7368
7376
  // bidi context or when at the end of a node.
7369
7377
  if (supportEmptyRange && (BIDI.test(node.nodeValue) || (side < 0 ? !offset : offset == node.nodeValue.length))) {
@@ -7405,12 +7413,12 @@ function coordsAtPos(view, pos, side) {
7405
7413
  if (!$dom.parent.inlineContent) {
7406
7414
  if (atom == null && offset && (side < 0 || offset == nodeSize(node))) {
7407
7415
  let before = node.childNodes[offset - 1];
7408
- if (before.nodeType == 1)
7416
+ if (isElt(before))
7409
7417
  return flattenH(before.getBoundingClientRect(), false);
7410
7418
  }
7411
7419
  if (atom == null && offset < nodeSize(node)) {
7412
7420
  let after = node.childNodes[offset];
7413
- if (after.nodeType == 1)
7421
+ if (isElt(after))
7414
7422
  return flattenH(after.getBoundingClientRect(), true);
7415
7423
  }
7416
7424
  return flattenH(node.getBoundingClientRect(), side >= 0);
@@ -7418,10 +7426,10 @@ function coordsAtPos(view, pos, side) {
7418
7426
  // Inline, not in text node (this is not Bidi-safe)
7419
7427
  if (atom == null && offset && (side < 0 || offset == nodeSize(node))) {
7420
7428
  let before = node.childNodes[offset - 1];
7421
- let target = before.nodeType == 3 ? textRange(before, nodeSize(before) - (supportEmptyRange ? 0 : 1))
7429
+ let target = isText(before) ? textRange(before, nodeSize(before) - (supportEmptyRange ? 0 : 1))
7422
7430
  // BR nodes tend to only return the rectangle before them.
7423
7431
  // Only use them if they are the last element in their parent
7424
- : before.nodeType == 1 && (before.nodeName != "BR" || !before.nextSibling) ? before : null;
7432
+ : isElt(before) && (before.nodeName != "BR" || !before.nextSibling) ? before : null;
7425
7433
  if (target)
7426
7434
  return flattenV(singleRect(target, 1), false);
7427
7435
  }
@@ -7429,13 +7437,13 @@ function coordsAtPos(view, pos, side) {
7429
7437
  let after = node.childNodes[offset];
7430
7438
  while (after.pmViewDesc && after.pmViewDesc.ignoreForCoords)
7431
7439
  after = after.nextSibling;
7432
- let target = !after ? null : after.nodeType == 3 ? textRange(after, 0, (supportEmptyRange ? 0 : 1))
7433
- : after.nodeType == 1 ? after : null;
7440
+ let target = !after ? null : isText(after) ? textRange(after, 0, (supportEmptyRange ? 0 : 1))
7441
+ : isElt(after) ? after : null;
7434
7442
  if (target)
7435
7443
  return flattenV(singleRect(target, -1), true);
7436
7444
  }
7437
7445
  // All else failed, just try to get a rectangle for the target node
7438
- return flattenV(singleRect(node.nodeType == 3 ? textRange(node) : node, -side), side >= 0);
7446
+ return flattenV(singleRect(isText(node) ? textRange(node) : node, -side), side >= 0);
7439
7447
  }
7440
7448
  function flattenV(rect, left) {
7441
7449
  if (rect.width == 0)
@@ -7485,9 +7493,9 @@ function endOfTextblockVertical(view, state, dir) {
7485
7493
  let coords = coordsAtPos(view, $pos.pos, 1);
7486
7494
  for (let child = dom.firstChild; child; child = child.nextSibling) {
7487
7495
  let boxes;
7488
- if (child.nodeType == 1)
7496
+ if (isElt(child))
7489
7497
  boxes = child.getClientRects();
7490
- else if (child.nodeType == 3)
7498
+ else if (isText(child))
7491
7499
  boxes = textRange(child, 0, child.nodeValue.length).getClientRects();
7492
7500
  else
7493
7501
  continue;
@@ -7527,8 +7535,7 @@ function endOfTextblockHorizontal(view, state, dir) {
7527
7535
  sel.modify("move", dir, "character");
7528
7536
  let parentDOM = $head.depth ? view.docView.domAfterPos($head.before()) : view.dom;
7529
7537
  let { focusNode: newNode, focusOffset: newOff } = view.domSelectionRange();
7530
- let result = newNode && !parentDOM.contains(newNode.nodeType == 1 ? newNode : newNode.parentNode) ||
7531
- (oldNode == newNode && oldOff == newOff);
7538
+ let result = newNode && !contains(parentDOM, newNode) || (oldNode == newNode && oldOff == newOff);
7532
7539
  // Restore the previous selection
7533
7540
  try {
7534
7541
  sel.collapse(anchorNode, anchorOffset);
@@ -7592,7 +7599,7 @@ class ViewDesc {
7592
7599
  // When parsing in-editor content (in domchange.js), we allow
7593
7600
  // descriptions to determine the parse rules that should be used to
7594
7601
  // parse them.
7595
- parseRule() { return null; }
7602
+ parseRule(addedNodes) { return null; }
7596
7603
  // Used by the editor's event handler to ignore events that come
7597
7604
  // from certain descs.
7598
7605
  stopEvent(event) { return false; }
@@ -7636,7 +7643,7 @@ class ViewDesc {
7636
7643
  localPosFromDOM(dom, offset, bias) {
7637
7644
  // If the DOM position is in the content, use the child desc after
7638
7645
  // it to figure out a position.
7639
- if (this.contentDOM && this.contentDOM.contains(dom.nodeType == 1 ? dom : dom.parentNode)) {
7646
+ if (this.contentDOM && contains(this.contentDOM, dom)) {
7640
7647
  if (bias < 0) {
7641
7648
  let domBefore, desc;
7642
7649
  if (dom == this.contentDOM) {
@@ -7674,7 +7681,7 @@ class ViewDesc {
7674
7681
  atEnd = offset > domIndex(this.contentDOM);
7675
7682
  }
7676
7683
  else if (this.contentDOM && this.contentDOM != this.dom && this.dom.contains(this.contentDOM)) {
7677
- atEnd = dom.compareDocumentPosition(this.contentDOM) & 2;
7684
+ atEnd = !!(dom.compareDocumentPosition(this.contentDOM) & 4);
7678
7685
  }
7679
7686
  else if (this.dom.firstChild) {
7680
7687
  if (offset == 0)
@@ -7704,7 +7711,7 @@ class ViewDesc {
7704
7711
  if (desc && (!onlyNodes || desc.node)) {
7705
7712
  // If dom is outside of this desc's nodeDOM, don't count it.
7706
7713
  if (first && (nodeDOM = desc.nodeDOM) &&
7707
- !(nodeDOM.nodeType == 1 ? nodeDOM.contains(dom.nodeType == 1 ? dom : dom.parentNode) : nodeDOM == dom))
7714
+ !(isElt(nodeDOM) ? contains(nodeDOM, dom) : nodeDOM == dom))
7708
7715
  first = false;
7709
7716
  else
7710
7717
  return desc;
@@ -7754,7 +7761,7 @@ class ViewDesc {
7754
7761
  let i = 0, offset = 0;
7755
7762
  for (let curPos = 0; i < this.children.length; i++) {
7756
7763
  let child = this.children[i], end = curPos + child.size;
7757
- if (end > pos || child instanceof TrailingHackViewDesc) {
7764
+ if (end > pos) {
7758
7765
  offset = pos - curPos;
7759
7766
  break;
7760
7767
  }
@@ -7764,7 +7771,11 @@ class ViewDesc {
7764
7771
  if (offset)
7765
7772
  return this.children[i].domFromPos(offset - this.children[i].border, side);
7766
7773
  // Go back if there were any zero-length widgets with side >= 0 before this point
7767
- for (let prev; i && !(prev = this.children[i - 1]).size && prev instanceof WidgetViewDesc && prev.side >= 0; i--) { }
7774
+ for (; i > 0; i--) {
7775
+ let prev = this.children[i - 1];
7776
+ if (prev.size || !(prev instanceof BufferHackViewDesc || prev instanceof WidgetViewDesc && prev.side >= 0))
7777
+ break;
7778
+ }
7768
7779
  // Scan towards the first useable node
7769
7780
  if (side <= 0) {
7770
7781
  let prev, enter = true;
@@ -7841,7 +7852,7 @@ class ViewDesc {
7841
7852
  }
7842
7853
  domAfterPos(pos) {
7843
7854
  let { node, offset } = this.domFromPos(pos, 0);
7844
- if (node.nodeType != 1 || offset == node.childNodes.length)
7855
+ if (!isElt(node) || offset == node.childNodes.length)
7845
7856
  throw new RangeError("No node after pos " + pos);
7846
7857
  return node.childNodes[offset];
7847
7858
  }
@@ -7870,7 +7881,7 @@ class ViewDesc {
7870
7881
  // reported position in such situations (#1092).
7871
7882
  if ((gecko || safari) && anchor == head) {
7872
7883
  let { node, offset } = anchorDOM;
7873
- if (node.nodeType == 3) {
7884
+ if (isText(node)) {
7874
7885
  brKludge = !!(offset && node.nodeValue[offset - 1] == "\n");
7875
7886
  // Issue #1128
7876
7887
  if (brKludge && offset == node.nodeValue.length) {
@@ -7893,7 +7904,7 @@ class ViewDesc {
7893
7904
  }
7894
7905
  // Firefox can act strangely when the selection is in front of an
7895
7906
  // uneditable node. See #1163 and https://bugzilla.mozilla.org/show_bug.cgi?id=1709536
7896
- if (gecko && selRange.focusNode && selRange.focusNode != headDOM.node && selRange.focusNode.nodeType == 1) {
7907
+ if (gecko && selRange.focusNode && selRange.focusNode != headDOM.node && isElt(selRange.focusNode)) {
7897
7908
  let after = selRange.focusNode.childNodes[selRange.focusOffset];
7898
7909
  if (after && after.contentEditable == "false")
7899
7910
  force = true;
@@ -7992,13 +8003,12 @@ class WidgetViewDesc extends ViewDesc {
7992
8003
  return self.parent.posBeforeChild(self);
7993
8004
  });
7994
8005
  if (!widget.type.spec.raw) {
7995
- if (dom.nodeType != 1) {
7996
- let wrap = document.createElement("span");
7997
- wrap.appendChild(dom);
7998
- dom = wrap;
7999
- }
8000
- dom.contentEditable = "false";
8001
- dom.classList.add("ProseMirror-widget");
8006
+ let elt = isElt(dom) ? dom : document.createElement("span");
8007
+ if (elt != dom)
8008
+ elt.appendChild(dom);
8009
+ if (!elt.hasAttribute("contenteditable"))
8010
+ elt.contentEditable = "false";
8011
+ elt.classList.add("ProseMirror-widget");
8002
8012
  }
8003
8013
  super(parent, [], dom, null);
8004
8014
  this.widget = widget;
@@ -8104,7 +8114,7 @@ class MarkViewDesc extends ViewDesc {
8104
8114
  // correspond to an actual node in the document. Unlike mark descs,
8105
8115
  // they populate their child array themselves.
8106
8116
  class NodeViewDesc extends ViewDesc {
8107
- constructor(parent, node, outerDeco, innerDeco, dom, contentDOM, nodeDOM, view, pos) {
8117
+ constructor(parent, node, outerDeco, innerDeco, dom, contentDOM, nodeDOM) {
8108
8118
  super(parent, [], dom, contentDOM);
8109
8119
  this.node = node;
8110
8120
  this.outerDeco = outerDeco;
@@ -8134,7 +8144,7 @@ class NodeViewDesc extends ViewDesc {
8134
8144
  if (node.isText) {
8135
8145
  if (!dom)
8136
8146
  dom = document.createTextNode(node.text);
8137
- else if (dom.nodeType != 3)
8147
+ else if (!isText(dom))
8138
8148
  throw new RangeError("Text must be rendered as a DOM text node");
8139
8149
  }
8140
8150
  else if (!dom) {
@@ -8150,13 +8160,13 @@ class NodeViewDesc extends ViewDesc {
8150
8160
  let nodeDOM = dom;
8151
8161
  dom = applyOuterDeco(dom, outerDeco, node);
8152
8162
  if (spec)
8153
- return descObj = new CustomNodeViewDesc(parent, node, outerDeco, innerDeco, dom, contentDOM || null, nodeDOM, spec, view, pos + 1);
8163
+ return descObj = new CustomNodeViewDesc(parent, node, outerDeco, innerDeco, dom, contentDOM || null, nodeDOM, spec);
8154
8164
  else if (node.isText)
8155
- return new TextViewDesc(parent, node, outerDeco, innerDeco, dom, nodeDOM, view);
8165
+ return new TextViewDesc(parent, node, outerDeco, innerDeco, dom, nodeDOM);
8156
8166
  else
8157
- return new NodeViewDesc(parent, node, outerDeco, innerDeco, dom, contentDOM || null, nodeDOM, view, pos + 1);
8167
+ return new NodeViewDesc(parent, node, outerDeco, innerDeco, dom, contentDOM || null, nodeDOM);
8158
8168
  }
8159
- parseRule() {
8169
+ parseRule(addedNodes) {
8160
8170
  // Experimental kludge to allow opt-in re-parsing of nodes
8161
8171
  if (this.node.type.spec.reparseInView)
8162
8172
  return null;
@@ -8184,8 +8194,14 @@ class NodeViewDesc extends ViewDesc {
8184
8194
  break;
8185
8195
  }
8186
8196
  }
8187
- if (!rule.contentElement)
8188
- rule.getContent = () => Fragment.empty;
8197
+ if (!rule.contentElement) {
8198
+ let found = addedNodes &&
8199
+ addedNodes.find(n => isElt(n) && addedNodes.indexOf(n.parentNode) < 0 && this.dom.contains(n));
8200
+ if (found)
8201
+ rule.contentElement = found;
8202
+ else
8203
+ rule.getContent = () => Fragment.empty;
8204
+ }
8189
8205
  }
8190
8206
  return rule;
8191
8207
  }
@@ -8205,6 +8221,7 @@ class NodeViewDesc extends ViewDesc {
8205
8221
  let localComposition = composition && composition.pos > -1 ? composition : null;
8206
8222
  let compositionInChild = composition && composition.pos < 0;
8207
8223
  let updater = new ViewTreeUpdater(this, localComposition && localComposition.node, view);
8224
+ let addBuffers = this.node.inlineContent, atBufferPos = addBuffers && this.node.isBlock;
8208
8225
  iterDeco(this.node, this.innerDeco, (widget, i, insideNode) => {
8209
8226
  if (widget.spec.marks)
8210
8227
  updater.syncToMarks(widget.spec.marks, inline, view, i);
@@ -8216,6 +8233,8 @@ class NodeViewDesc extends ViewDesc {
8216
8233
  }, (child, outerDeco, innerDeco, i) => {
8217
8234
  // Make sure the wrapping mark descs match the node's marks.
8218
8235
  updater.syncToMarks(child.marks, inline, view, i);
8236
+ if (atBufferPos && child.isAtom && !child.isText)
8237
+ updater.addHackNode("IMG", updater.top);
8219
8238
  // Try several strategies for drawing this node
8220
8239
  let compIndex;
8221
8240
  if (updater.findNodeMatch(child, outerDeco, innerDeco, i)) ;
@@ -8229,6 +8248,8 @@ class NodeViewDesc extends ViewDesc {
8229
8248
  updater.addNode(child, outerDeco, innerDeco, view, off);
8230
8249
  }
8231
8250
  off += child.nodeSize;
8251
+ if (addBuffers)
8252
+ atBufferPos = child.isAtom && !child.isText;
8232
8253
  });
8233
8254
  // Drop all remaining descs after the current position.
8234
8255
  updater.syncToMarks([], inline, view, 0);
@@ -8307,7 +8328,7 @@ class NodeViewDesc extends ViewDesc {
8307
8328
  updateOuterDeco(outerDeco) {
8308
8329
  if (sameOuterDeco(outerDeco, this.outerDeco))
8309
8330
  return;
8310
- let needsWrap = this.nodeDOM.nodeType != 1;
8331
+ let needsWrap = !isElt(this.nodeDOM);
8311
8332
  let oldDOM = this.dom;
8312
8333
  this.dom = patchOuterDeco(this.dom, this.nodeDOM, computeOuterDeco(this.outerDeco, this.node, needsWrap), computeOuterDeco(outerDeco, this.node, needsWrap));
8313
8334
  if (this.dom != oldDOM) {
@@ -8318,7 +8339,7 @@ class NodeViewDesc extends ViewDesc {
8318
8339
  }
8319
8340
  // Mark this node as being the selected node.
8320
8341
  selectNode() {
8321
- if (this.nodeDOM.nodeType == 1) {
8342
+ if (isElt(this.nodeDOM)) {
8322
8343
  this.nodeDOM.classList.add("ProseMirror-selectednode");
8323
8344
  if (this.contentDOM || !this.node.type.spec.draggable)
8324
8345
  this.nodeDOM.draggable = true;
@@ -8326,7 +8347,7 @@ class NodeViewDesc extends ViewDesc {
8326
8347
  }
8327
8348
  // Remove selected node marking from this node.
8328
8349
  deselectNode() {
8329
- if (this.nodeDOM.nodeType == 1) {
8350
+ if (isElt(this.nodeDOM)) {
8330
8351
  this.nodeDOM.classList.remove("ProseMirror-selectednode");
8331
8352
  if (this.contentDOM || !this.node.type.spec.draggable)
8332
8353
  this.nodeDOM.removeAttribute("draggable");
@@ -8338,14 +8359,14 @@ class NodeViewDesc extends ViewDesc {
8338
8359
  // and used by the view class.
8339
8360
  function docViewDesc(doc, outerDeco, innerDeco, dom, view) {
8340
8361
  applyOuterDeco(dom, outerDeco, doc);
8341
- let docView = new NodeViewDesc(undefined, doc, outerDeco, innerDeco, dom, dom, dom, view, 0);
8362
+ let docView = new NodeViewDesc(undefined, doc, outerDeco, innerDeco, dom, dom, dom);
8342
8363
  if (docView.contentDOM)
8343
8364
  docView.updateChildren(view, 0);
8344
8365
  return docView;
8345
8366
  }
8346
8367
  class TextViewDesc extends NodeViewDesc {
8347
- constructor(parent, node, outerDeco, innerDeco, dom, nodeDOM, view) {
8348
- super(parent, node, outerDeco, innerDeco, dom, null, nodeDOM, view, 0);
8368
+ constructor(parent, node, outerDeco, innerDeco, dom, nodeDOM) {
8369
+ super(parent, node, outerDeco, innerDeco, dom, null, nodeDOM);
8349
8370
  }
8350
8371
  parseRule() {
8351
8372
  let skip = this.nodeDOM.parentNode;
@@ -8385,9 +8406,9 @@ class TextViewDesc extends NodeViewDesc {
8385
8406
  ignoreMutation(mutation) {
8386
8407
  return mutation.type != "characterData" && mutation.type != "selection";
8387
8408
  }
8388
- slice(from, to, view) {
8409
+ slice(from, to, _view) {
8389
8410
  let node = this.node.cut(from, to), dom = document.createTextNode(node.text);
8390
- return new TextViewDesc(this.parent, node, this.outerDeco, this.innerDeco, dom, dom, view);
8411
+ return new TextViewDesc(this.parent, node, this.outerDeco, this.innerDeco, dom, dom);
8391
8412
  }
8392
8413
  markDirty(from, to) {
8393
8414
  super.markDirty(from, to);
@@ -8397,9 +8418,9 @@ class TextViewDesc extends NodeViewDesc {
8397
8418
  get domAtom() { return false; }
8398
8419
  isText(text) { return this.node.text == text; }
8399
8420
  }
8400
- // A dummy desc used to tag trailing BR or IMG nodes created to work
8421
+ // A dummy desc used to tag extra BR or IMG nodes created to work
8401
8422
  // around contentEditable terribleness.
8402
- class TrailingHackViewDesc extends ViewDesc {
8423
+ class BufferHackViewDesc extends ViewDesc {
8403
8424
  parseRule() { return { ignore: true }; }
8404
8425
  matchesHack(nodeName) { return this.dirty == NOT_DIRTY && this.dom.nodeName == nodeName; }
8405
8426
  get domAtom() { return true; }
@@ -8409,8 +8430,8 @@ class TrailingHackViewDesc extends ViewDesc {
8409
8430
  // extra checks only have to be made for nodes that are actually
8410
8431
  // customized.
8411
8432
  class CustomNodeViewDesc extends NodeViewDesc {
8412
- constructor(parent, node, outerDeco, innerDeco, dom, contentDOM, nodeDOM, spec, view, pos) {
8413
- super(parent, node, outerDeco, innerDeco, dom, contentDOM, nodeDOM, view, pos);
8433
+ constructor(parent, node, outerDeco, innerDeco, dom, contentDOM, nodeDOM, spec) {
8434
+ super(parent, node, outerDeco, innerDeco, dom, contentDOM, nodeDOM);
8414
8435
  this.spec = spec;
8415
8436
  }
8416
8437
  // A custom `update` method gets to decide whether the update goes
@@ -8572,7 +8593,7 @@ function patchAttributes(dom, prev, cur) {
8572
8593
  }
8573
8594
  }
8574
8595
  function applyOuterDeco(dom, deco, node) {
8575
- return patchOuterDeco(dom, dom, noDeco, computeOuterDeco(deco, node, dom.nodeType != 1));
8596
+ return patchOuterDeco(dom, dom, noDeco, computeOuterDeco(deco, node, !isElt(dom)));
8576
8597
  }
8577
8598
  function sameOuterDeco(a, b) {
8578
8599
  if (a.length != b.length)
@@ -8647,6 +8668,19 @@ class ViewTreeUpdater {
8647
8668
  break;
8648
8669
  }
8649
8670
  }
8671
+ // When nothing matches, try to update the mark view at this position
8672
+ // in place, so a custom mark view can adapt to a changed mark without
8673
+ // re-creating its DOM.
8674
+ if (found < 0 && this.index < this.top.children.length) {
8675
+ let cur = this.top.children[this.index];
8676
+ if (cur instanceof MarkViewDesc && cur.dirty != NODE_DIRTY &&
8677
+ cur.mark.type == marks[depth].type && cur.spec.update &&
8678
+ !this.isLocked(cur.dom) && cur.spec.update(marks[depth])) {
8679
+ cur.mark = marks[depth];
8680
+ found = this.index;
8681
+ this.changed = true;
8682
+ }
8683
+ }
8650
8684
  if (found > -1) {
8651
8685
  if (found > this.index) {
8652
8686
  this.changed = true;
@@ -8822,7 +8856,7 @@ class ViewTreeUpdater {
8822
8856
  }
8823
8857
  if (nodeName == "BR")
8824
8858
  dom.className = "ProseMirror-trailingBreak";
8825
- let hack = new TrailingHackViewDesc(this.top, [], dom, null);
8859
+ let hack = new BufferHackViewDesc(this.top, [], dom, null);
8826
8860
  if (parent != this.top)
8827
8861
  parent.children.push(hack);
8828
8862
  else
@@ -8831,7 +8865,7 @@ class ViewTreeUpdater {
8831
8865
  }
8832
8866
  }
8833
8867
  isLocked(node) {
8834
- return this.lock && (node == this.lock || node.nodeType == 1 && node.contains(this.lock.parentNode));
8868
+ return this.lock && (node == this.lock || isElt(node) && node.contains(this.lock.parentNode));
8835
8869
  }
8836
8870
  }
8837
8871
  // Iterate from the end of the fragment and array of descs to find
@@ -9033,12 +9067,27 @@ function selectionFromDOM(view, origin = null) {
9033
9067
  anchor = head;
9034
9068
  while (nearestDesc && !nearestDesc.node)
9035
9069
  nearestDesc = nearestDesc.parent;
9036
- let nearestDescNode = nearestDesc.node;
9037
- if (nearestDesc && nearestDescNode.isAtom && NodeSelection.isSelectable(nearestDescNode) && nearestDesc.parent
9038
- && !(nearestDescNode.isInline && isOnEdge(domSel.focusNode, domSel.focusOffset, nearestDesc.dom))) {
9070
+ if (nearestDesc && nearestDesc.node.isAtom && NodeSelection.isSelectable(nearestDesc.node) &&
9071
+ nearestDesc.parent &&
9072
+ !(nearestDesc.node.isInline && isOnEdge(domSel.focusNode, domSel.focusOffset, nearestDesc.dom))) {
9039
9073
  let pos = nearestDesc.posBefore;
9040
9074
  selection = new NodeSelection(head == pos ? $head : doc.resolve(pos));
9041
9075
  }
9076
+ else if (gecko && origin == "key" && head > view.state.selection.to &&
9077
+ isElt(domSel.focusNode) && domSel.focusOffset == domSel.focusNode.childNodes.length &&
9078
+ nearestDesc && nearestDesc.posAtStart > view.state.selection.to) {
9079
+ // Firefox will jump across scrollable wrapper nodes on keyboard
9080
+ // cursor motion (#1594). This tries to detect this situation
9081
+ // and work around it.
9082
+ for (let scan = domSel.focusNode;; scan = scan.parentNode) {
9083
+ if (getComputedStyle(scan).overflow != "visible") {
9084
+ selection = Selection.findFrom(doc.resolve(nearestDesc.posAtStart), 1);
9085
+ break;
9086
+ }
9087
+ if (scan == nearestDesc.dom || scan.nextSibling || !scan.parentNode || !isElt(scan.parentNode))
9088
+ break;
9089
+ }
9090
+ }
9042
9091
  }
9043
9092
  else {
9044
9093
  if (domSel instanceof view.dom.ownerDocument.defaultView.Selection && domSel.rangeCount > 1) {
@@ -9075,14 +9124,14 @@ function selectionToDOM(view, force = false) {
9075
9124
  syncNodeSelection(view, sel);
9076
9125
  if (!editorOwnsSelection(view))
9077
9126
  return;
9078
- // The delayed drag selection causes issues with Cell Selections
9079
- // in Safari. And the drag selection delay is to workarond issues
9080
- // which only present in Chrome.
9081
- if (!force && view.input.mouseDown && view.input.mouseDown.allowDefault && chrome) {
9127
+ // Need to delay selection normalization during a native selection
9128
+ // drag on Chrome, or it will cause further dragging to glitch.
9129
+ let mouseDown = view.input.mouseDown;
9130
+ if (!force && chrome && mouseDown) {
9082
9131
  let domSel = view.domSelectionRange(), curSel = view.domObserver.currentSelection;
9083
9132
  if (domSel.anchorNode && curSel.anchorNode &&
9084
- isEquivalentPosition(domSel.anchorNode, domSel.anchorOffset, curSel.anchorNode, curSel.anchorOffset)) {
9085
- view.input.mouseDown.delayedSelectionSync = true;
9133
+ isEquivalentPosition(domSel.anchorNode, domSel.anchorOffset, curSel.anchorNode, curSel.anchorOffset) &&
9134
+ mouseDown.delaySelUpdate()) {
9086
9135
  view.domObserver.setCurSelection();
9087
9136
  return;
9088
9137
  }
@@ -9224,8 +9273,7 @@ function hasSelection(view) {
9224
9273
  // Firefox will raise 'permission denied' errors when accessing
9225
9274
  // properties of `sel.anchorNode` when it's in a generated CSS
9226
9275
  // element.
9227
- return view.dom.contains(sel.anchorNode.nodeType == 3 ? sel.anchorNode.parentNode : sel.anchorNode) &&
9228
- (view.editable || view.dom.contains(sel.focusNode.nodeType == 3 ? sel.focusNode.parentNode : sel.focusNode));
9276
+ return contains(view.dom, sel.anchorNode) && (view.editable || contains(view.dom, sel.focusNode));
9229
9277
  }
9230
9278
  catch (_) {
9231
9279
  return false;
@@ -9276,15 +9324,14 @@ function selectHorizontally(view, dir, mods) {
9276
9324
  if (NodeSelection.isSelectable(node)) {
9277
9325
  return apply(view, new NodeSelection(dir < 0 ? view.state.doc.resolve($head.pos - node.nodeSize) : $head));
9278
9326
  }
9279
- else if (webkit) {
9327
+ else {
9280
9328
  // Chrome and Safari will introduce extra pointless cursor
9281
- // positions around inline uneditable nodes, so we have to
9282
- // take over and move the cursor past them (#937)
9329
+ // positions around inline uneditable nodes (#937), and
9330
+ // Firefox will sometimes just plain refuse to move across
9331
+ // them (#1592), so in this situation we move the cursor
9332
+ // ourselves.
9283
9333
  return apply(view, new TextSelection(view.state.doc.resolve(dir < 0 ? nodePos : nodePos + node.nodeSize)));
9284
9334
  }
9285
- else {
9286
- return false;
9287
- }
9288
9335
  }
9289
9336
  }
9290
9337
  else if (sel instanceof NodeSelection && sel.node.isInline) {
@@ -9297,12 +9344,10 @@ function selectHorizontally(view, dir, mods) {
9297
9344
  return false;
9298
9345
  }
9299
9346
  }
9300
- function nodeLen(node) {
9301
- return node.nodeType == 3 ? node.nodeValue.length : node.childNodes.length;
9302
- }
9303
9347
  function isIgnorable(dom, dir) {
9304
9348
  let desc = dom.pmViewDesc;
9305
- return desc && desc.size == 0 && (dir < 0 || dom.nextSibling || dom.nodeName != "BR");
9349
+ return desc ? desc.size == 0 && (dir < 0 || dom.nextSibling || dom.nodeName != "BR")
9350
+ : isElt(dom) && dom.contentEditable == "false";
9306
9351
  }
9307
9352
  function skipIgnoredNodes(view, dir) {
9308
9353
  return dir < 0 ? skipIgnoredNodesBefore(view) : skipIgnoredNodesAfter(view);
@@ -9318,25 +9363,23 @@ function skipIgnoredNodesBefore(view) {
9318
9363
  // Gecko will do odd things when the selection is directly in front
9319
9364
  // of a non-editable node, so in that case, move it into the next
9320
9365
  // node if possible. Issue prosemirror/prosemirror#832.
9321
- if (gecko && node.nodeType == 1 && offset < nodeLen(node) && isIgnorable(node.childNodes[offset], -1))
9366
+ if (gecko && isElt(node) && offset < nodeSize(node) && isIgnorable(node.childNodes[offset], -1))
9322
9367
  force = true;
9323
9368
  for (;;) {
9324
9369
  if (offset > 0) {
9325
- if (node.nodeType != 1) {
9370
+ if (!isElt(node))
9326
9371
  break;
9372
+ let before = node.childNodes[offset - 1];
9373
+ if (isIgnorable(before, -1)) {
9374
+ moveNode = node;
9375
+ moveOffset = --offset;
9376
+ }
9377
+ else if (isText(before)) {
9378
+ node = before;
9379
+ offset = node.nodeValue.length;
9327
9380
  }
9328
9381
  else {
9329
- let before = node.childNodes[offset - 1];
9330
- if (isIgnorable(before, -1)) {
9331
- moveNode = node;
9332
- moveOffset = --offset;
9333
- }
9334
- else if (before.nodeType == 3) {
9335
- node = before;
9336
- offset = node.nodeValue.length;
9337
- }
9338
- else
9339
- break;
9382
+ break;
9340
9383
  }
9341
9384
  }
9342
9385
  else if (isBlockNode(node)) {
@@ -9357,7 +9400,7 @@ function skipIgnoredNodesBefore(view) {
9357
9400
  }
9358
9401
  else {
9359
9402
  node = prev;
9360
- offset = nodeLen(node);
9403
+ offset = nodeSize(node);
9361
9404
  }
9362
9405
  }
9363
9406
  }
@@ -9373,19 +9416,20 @@ function skipIgnoredNodesAfter(view) {
9373
9416
  let node = sel.focusNode, offset = sel.focusOffset;
9374
9417
  if (!node)
9375
9418
  return;
9376
- let len = nodeLen(node);
9419
+ let len = nodeSize(node);
9377
9420
  let moveNode, moveOffset;
9378
9421
  for (;;) {
9379
9422
  if (offset < len) {
9380
- if (node.nodeType != 1)
9423
+ if (!isElt(node))
9381
9424
  break;
9382
9425
  let after = node.childNodes[offset];
9383
9426
  if (isIgnorable(after, 1)) {
9384
9427
  moveNode = node;
9385
9428
  moveOffset = ++offset;
9386
9429
  }
9387
- else
9430
+ else {
9388
9431
  break;
9432
+ }
9389
9433
  }
9390
9434
  else if (isBlockNode(node)) {
9391
9435
  break;
@@ -9406,7 +9450,7 @@ function skipIgnoredNodesAfter(view) {
9406
9450
  else {
9407
9451
  node = next;
9408
9452
  offset = 0;
9409
- len = nodeLen(node);
9453
+ len = nodeSize(node);
9410
9454
  }
9411
9455
  }
9412
9456
  }
@@ -9424,9 +9468,9 @@ function textNodeAfter(node, offset) {
9424
9468
  }
9425
9469
  while (node && offset < node.childNodes.length) {
9426
9470
  let next = node.childNodes[offset];
9427
- if (next.nodeType == 3)
9471
+ if (isText(next))
9428
9472
  return next;
9429
- if (next.nodeType == 1 && next.contentEditable == "false")
9473
+ if (isElt(next) && next.contentEditable == "false")
9430
9474
  break;
9431
9475
  node = next;
9432
9476
  offset = 0;
@@ -9439,16 +9483,16 @@ function textNodeBefore(node, offset) {
9439
9483
  }
9440
9484
  while (node && offset) {
9441
9485
  let next = node.childNodes[offset - 1];
9442
- if (next.nodeType == 3)
9486
+ if (isText(next))
9443
9487
  return next;
9444
- if (next.nodeType == 1 && next.contentEditable == "false")
9488
+ if (isElt(next) && next.contentEditable == "false")
9445
9489
  break;
9446
9490
  node = next;
9447
9491
  offset = node.childNodes.length;
9448
9492
  }
9449
9493
  }
9450
9494
  function setSelFocus(view, node, offset) {
9451
- if (node.nodeType != 3) {
9495
+ if (!isText(node)) {
9452
9496
  let before, after;
9453
9497
  if (after = textNodeAfter(node, offset)) {
9454
9498
  node = after;
@@ -9558,8 +9602,8 @@ function safariDownArrowBug(view) {
9558
9602
  if (!safari || view.state.selection.$head.parentOffset > 0)
9559
9603
  return false;
9560
9604
  let { focusNode, focusOffset } = view.domSelectionRange();
9561
- if (focusNode && focusNode.nodeType == 1 && focusOffset == 0 &&
9562
- focusNode.firstChild && focusNode.firstChild.contentEditable == "false") {
9605
+ if (focusNode && isElt(focusNode) && focusOffset == 0 &&
9606
+ focusNode.firstChild && isElt(focusNode.firstChild) && focusNode.firstChild.contentEditable == "false") {
9563
9607
  let child = focusNode.firstChild;
9564
9608
  switchEditable(view, child, "true");
9565
9609
  setTimeout(() => switchEditable(view, child, "false"), 20);
@@ -9630,7 +9674,7 @@ function serializeForClipboard(view, slice) {
9630
9674
  let doc = detachedDoc(), wrap = doc.createElement("div");
9631
9675
  wrap.appendChild(serializer.serializeFragment(content, { document: doc }));
9632
9676
  let firstChild = wrap.firstChild, needsWrap, wrappers = 0;
9633
- while (firstChild && firstChild.nodeType == 1 && (needsWrap = wrapMap[firstChild.nodeName.toLowerCase()])) {
9677
+ while (firstChild && isElt(firstChild) && (needsWrap = wrapMap[firstChild.nodeName.toLowerCase()])) {
9634
9678
  for (let i = needsWrap.length - 1; i >= 0; i--) {
9635
9679
  let wrapper = doc.createElement(needsWrap[i]);
9636
9680
  while (wrap.firstChild)
@@ -9640,7 +9684,7 @@ function serializeForClipboard(view, slice) {
9640
9684
  }
9641
9685
  firstChild = wrap.firstChild;
9642
9686
  }
9643
- if (firstChild && firstChild.nodeType == 1)
9687
+ if (firstChild && isElt(firstChild))
9644
9688
  firstChild.setAttribute("data-pm-slice", `${openStart} ${openEnd}${wrappers ? ` -${wrappers}` : ""} ${JSON.stringify(context)}`);
9645
9689
  let text = view.someProp("clipboardTextSerializer", f => f(slice, view)) ||
9646
9690
  slice.content.textBetween(0, slice.content.size, "\n\n");
@@ -9686,7 +9730,7 @@ function parseFromClipboard(view, text, html, plainText, $context) {
9686
9730
  if (sliceData && sliceData[3])
9687
9731
  for (let i = +sliceData[3]; i > 0; i--) {
9688
9732
  let child = dom.firstChild;
9689
- while (child && child.nodeType != 1)
9733
+ while (child && !isElt(child))
9690
9734
  child = child.nextSibling;
9691
9735
  if (!child)
9692
9736
  break;
@@ -9815,9 +9859,8 @@ const wrapMap = {
9815
9859
  td: ["table", "tbody", "tr"],
9816
9860
  th: ["table", "tbody", "tr"]
9817
9861
  };
9818
- let _detachedDoc = null;
9819
9862
  function detachedDoc() {
9820
- return _detachedDoc || (_detachedDoc = document.implementation.createHTMLDocument("title"));
9863
+ return document.implementation.createHTMLDocument("title");
9821
9864
  }
9822
9865
  let _policy = null;
9823
9866
  function maybeWrapTrusted(html) {
@@ -9827,15 +9870,21 @@ function maybeWrapTrusted(html) {
9827
9870
  // With the require-trusted-types-for CSP, Chrome will block
9828
9871
  // innerHTML, even on a detached document. This wraps the string in
9829
9872
  // a way that makes the browser allow us to use its parser again.
9830
- if (!_policy)
9831
- _policy = trustedTypes.defaultPolicy || trustedTypes.createPolicy("ProseMirrorClipboard", { createHTML: (s) => s });
9873
+ if (!_policy) {
9874
+ if (_policy = trustedTypes.defaultPolicy)
9875
+ try {
9876
+ return _policy.createHTML(html);
9877
+ }
9878
+ catch (_a) { }
9879
+ _policy = trustedTypes.createPolicy("ProseMirrorClipboard", { createHTML: (s) => s });
9880
+ }
9832
9881
  return _policy.createHTML(html);
9833
9882
  }
9834
9883
  function readHTML(html) {
9835
9884
  let metas = /^(\s*<meta [^>]*>)*/.exec(html);
9836
9885
  if (metas)
9837
9886
  html = html.slice(metas[0].length);
9838
- let elt = detachedDoc().createElement("div");
9887
+ let doc = detachedDoc(), elt = doc.body;
9839
9888
  let firstTag = /<([a-z][^>\s]+)/i.exec(html), wrap;
9840
9889
  if (wrap = firstTag && wrapMap[firstTag[1].toLowerCase()])
9841
9890
  html = wrap.map(n => "<" + n + ">").join("") + html + wrap.map(n => "</" + n + ">").reverse().join("");
@@ -9843,6 +9892,18 @@ function readHTML(html) {
9843
9892
  if (wrap)
9844
9893
  for (let i = 0; i < wrap.length; i++)
9845
9894
  elt = elt.querySelector(wrap[i]) || elt;
9895
+ // Inline styles defined in the pasted content, so that parse rules pick them up
9896
+ for (let i = 0; i < doc.styleSheets.length; i++) {
9897
+ let style = doc.styleSheets[i];
9898
+ for (let j = 0; j < style.rules.length; j++) {
9899
+ let rule = style.rules[j];
9900
+ if (rule instanceof CSSStyleRule) {
9901
+ let matches = elt.querySelectorAll(rule.selectorText);
9902
+ for (let k = 0; k < matches.length; k++)
9903
+ matches[k].style.cssText += rule.style.cssText;
9904
+ }
9905
+ }
9906
+ }
9846
9907
  return elt;
9847
9908
  }
9848
9909
  // Webkit browsers do some hard-to-predict replacement of regular
@@ -9873,7 +9934,12 @@ function addContext(slice, context) {
9873
9934
  let type = schema.nodes[array[i]];
9874
9935
  if (!type || type.hasRequiredAttrs())
9875
9936
  break;
9876
- content = Fragment.from(type.create(array[i + 1], content));
9937
+ try {
9938
+ content = Fragment.from(type.create(array[i + 1], content));
9939
+ }
9940
+ catch (e) {
9941
+ break;
9942
+ }
9877
9943
  openStart++;
9878
9944
  openEnd++;
9879
9945
  }
@@ -9934,6 +10000,8 @@ function setSelectionOrigin(view, origin) {
9934
10000
  view.input.lastSelectionTime = Date.now();
9935
10001
  }
9936
10002
  function destroyInput(view) {
10003
+ if (view.input.mouseDown)
10004
+ view.input.mouseDown.done();
9937
10005
  view.domObserver.stop();
9938
10006
  for (let type in view.input.eventHandlers)
9939
10007
  view.dom.removeEventListener(type, view.input.eventHandlers[type]);
@@ -9972,7 +10040,7 @@ function dispatchEvent(view, event) {
9972
10040
  editHandlers.keydown = (view, _event) => {
9973
10041
  let event = _event;
9974
10042
  view.input.shiftKey = event.keyCode == 16 || event.shiftKey;
9975
- if (inOrNearComposition(view, event))
10043
+ if (inOrNearComposition(view))
9976
10044
  return;
9977
10045
  view.input.lastKeyCode = event.keyCode;
9978
10046
  view.input.lastKeyCodeTime = Date.now();
@@ -10010,7 +10078,7 @@ editHandlers.keyup = (view, event) => {
10010
10078
  };
10011
10079
  editHandlers.keypress = (view, _event) => {
10012
10080
  let event = _event;
10013
- if (inOrNearComposition(view, event) || !event.charCode ||
10081
+ if (inOrNearComposition(view) || !event.charCode ||
10014
10082
  event.ctrlKey && !event.altKey || mac$4 && event.metaKey)
10015
10083
  return;
10016
10084
  if (view.someProp("handleKeyPress", f => f(view, event))) {
@@ -10104,26 +10172,28 @@ function handleTripleClick$1(view, pos, inside, event) {
10104
10172
  function defaultTripleClick(view, inside, event) {
10105
10173
  if (event.button != 0)
10106
10174
  return false;
10107
- let doc = view.state.doc;
10108
- if (inside == -1) {
10109
- if (doc.inlineContent) {
10110
- updateSelection(view, TextSelection.create(doc, 0, doc.content.size));
10111
- return true;
10112
- }
10175
+ let selection = selectionForTripleClick(view, inside, true), doc = view.state.doc;
10176
+ if (!selection)
10113
10177
  return false;
10114
- }
10178
+ updateSelection(view, selection);
10179
+ if (selection instanceof TextSelection && doc.eq(view.state.doc))
10180
+ view.input.mouseDown = new TripleClickDrag(view, selection);
10181
+ return true;
10182
+ }
10183
+ function selectionForTripleClick(view, inside, selectNodes) {
10184
+ let doc = view.state.doc;
10185
+ if (inside == -1)
10186
+ return doc.inlineContent ? TextSelection.create(doc, 0, doc.content.size) : null;
10115
10187
  let $pos = doc.resolve(inside);
10116
10188
  for (let i = $pos.depth + 1; i > 0; i--) {
10117
10189
  let node = i > $pos.depth ? $pos.nodeAfter : $pos.node(i);
10118
10190
  let nodePos = $pos.before(i);
10119
10191
  if (node.inlineContent)
10120
- updateSelection(view, TextSelection.create(doc, nodePos + 1, nodePos + 1 + node.content.size));
10121
- else if (NodeSelection.isSelectable(node))
10122
- updateSelection(view, NodeSelection.create(doc, nodePos));
10123
- else
10124
- continue;
10125
- return true;
10192
+ return TextSelection.create(doc, nodePos + 1, nodePos + 1 + node.content.size);
10193
+ else if (selectNodes && NodeSelection.isSelectable(node))
10194
+ return NodeSelection.create(doc, nodePos);
10126
10195
  }
10196
+ return null;
10127
10197
  }
10128
10198
  function forceDOMFlush(view) {
10129
10199
  return endComposition(view);
@@ -10142,13 +10212,13 @@ handlers.mousedown = (view, _event) => {
10142
10212
  type = "tripleClick";
10143
10213
  }
10144
10214
  view.input.lastClick = { time: now, x: event.clientX, y: event.clientY, type, button: event.button };
10215
+ if (view.input.mouseDown)
10216
+ view.input.mouseDown.done();
10145
10217
  let pos = view.posAtCoords(eventCoords(event));
10146
10218
  if (!pos)
10147
10219
  return;
10148
10220
  if (type == "singleClick") {
10149
- if (view.input.mouseDown)
10150
- view.input.mouseDown.done();
10151
- view.input.mouseDown = new MouseDown(view, pos, event, !!flushed);
10221
+ view.input.mouseDown = new LeftMouseDown(view, pos, event, !!flushed);
10152
10222
  }
10153
10223
  else if ((type == "doubleClick" ? handleDoubleClick : handleTripleClick$1)(view, pos.pos, pos.inside, event)) {
10154
10224
  event.preventDefault();
@@ -10158,13 +10228,34 @@ handlers.mousedown = (view, _event) => {
10158
10228
  }
10159
10229
  };
10160
10230
  class MouseDown {
10161
- constructor(view, pos, event, flushed) {
10231
+ constructor(view) {
10162
10232
  this.view = view;
10233
+ this.mightDrag = null;
10234
+ view.root.addEventListener("mouseup", this.up = this.up.bind(this));
10235
+ view.root.addEventListener("mousemove", this.move = this.move.bind(this));
10236
+ }
10237
+ up(event) {
10238
+ this.done();
10239
+ }
10240
+ move(event) {
10241
+ if (event.buttons == 0)
10242
+ this.done();
10243
+ }
10244
+ done() {
10245
+ this.view.root.removeEventListener("mouseup", this.up);
10246
+ this.view.root.removeEventListener("mousemove", this.move);
10247
+ if (this.view.input.mouseDown == this)
10248
+ this.view.input.mouseDown = null;
10249
+ }
10250
+ delaySelUpdate() { return false; }
10251
+ }
10252
+ class LeftMouseDown extends MouseDown {
10253
+ constructor(view, pos, event, flushed) {
10254
+ super(view);
10163
10255
  this.pos = pos;
10164
10256
  this.event = event;
10165
10257
  this.flushed = flushed;
10166
10258
  this.delayedSelectionSync = false;
10167
- this.mightDrag = null;
10168
10259
  this.startDoc = view.state.doc;
10169
10260
  this.selectNode = !!event[selectNodeModifier];
10170
10261
  this.allowDefault = event.shiftKey;
@@ -10180,7 +10271,7 @@ class MouseDown {
10180
10271
  }
10181
10272
  const target = flushed ? null : event.target;
10182
10273
  const targetDesc = target ? view.docView.nearestDesc(target, true) : null;
10183
- this.target = targetDesc && targetDesc.nodeDOM.nodeType == 1 ? targetDesc.nodeDOM : null;
10274
+ this.target = targetDesc && isElt(targetDesc.nodeDOM) ? targetDesc.nodeDOM : null;
10184
10275
  let { selection } = view.state;
10185
10276
  if (event.button == 0 &&
10186
10277
  (targetNode.type.spec.draggable && targetNode.type.spec.selectable !== false ||
@@ -10202,13 +10293,10 @@ class MouseDown {
10202
10293
  }, 20);
10203
10294
  this.view.domObserver.start();
10204
10295
  }
10205
- view.root.addEventListener("mouseup", this.up = this.up.bind(this));
10206
- view.root.addEventListener("mousemove", this.move = this.move.bind(this));
10207
10296
  setSelectionOrigin(view, "pointer");
10208
10297
  }
10209
10298
  done() {
10210
- this.view.root.removeEventListener("mouseup", this.up);
10211
- this.view.root.removeEventListener("mousemove", this.move);
10299
+ super.done();
10212
10300
  if (this.mightDrag && this.target) {
10213
10301
  this.view.domObserver.stop();
10214
10302
  if (this.mightDrag.addAttr)
@@ -10218,8 +10306,10 @@ class MouseDown {
10218
10306
  this.view.domObserver.start();
10219
10307
  }
10220
10308
  if (this.delayedSelectionSync)
10221
- setTimeout(() => selectionToDOM(this.view));
10222
- this.view.input.mouseDown = null;
10309
+ setTimeout(() => {
10310
+ if (!this.view.isDestroyed)
10311
+ selectionToDOM(this.view);
10312
+ });
10223
10313
  }
10224
10314
  up(event) {
10225
10315
  this.done();
@@ -10258,14 +10348,41 @@ class MouseDown {
10258
10348
  move(event) {
10259
10349
  this.updateAllowDefault(event);
10260
10350
  setSelectionOrigin(this.view, "pointer");
10261
- if (event.buttons == 0)
10262
- this.done();
10351
+ super.move(event);
10263
10352
  }
10264
10353
  updateAllowDefault(event) {
10265
10354
  if (!this.allowDefault && (Math.abs(this.event.x - event.clientX) > 4 ||
10266
10355
  Math.abs(this.event.y - event.clientY) > 4))
10267
10356
  this.allowDefault = true;
10268
10357
  }
10358
+ delaySelUpdate() {
10359
+ if (!this.allowDefault)
10360
+ return false;
10361
+ this.delayedSelectionSync = true;
10362
+ return true;
10363
+ }
10364
+ }
10365
+ class TripleClickDrag extends MouseDown {
10366
+ constructor(view, startSelection) {
10367
+ super(view);
10368
+ this.startSelection = startSelection;
10369
+ this.startDoc = view.state.doc;
10370
+ }
10371
+ move(event) {
10372
+ if (event.buttons == 0 || this.view.isDestroyed || !this.view.state.doc.eq(this.startDoc)) {
10373
+ this.done();
10374
+ return;
10375
+ }
10376
+ event.preventDefault();
10377
+ setSelectionOrigin(this.view, "pointer");
10378
+ let pos = this.view.posAtCoords(eventCoords(event));
10379
+ let target = pos && selectionForTripleClick(this.view, pos.inside, false);
10380
+ if (!target)
10381
+ return;
10382
+ let { doc } = this.view.state, start = this.startSelection;
10383
+ let [anchor, head] = target.from < start.from ? [start.to, target.from] : [start.from, target.to];
10384
+ updateSelection(this.view, TextSelection.create(doc, anchor, head));
10385
+ }
10269
10386
  }
10270
10387
  handlers.touchstart = view => {
10271
10388
  view.input.lastTouch = Date.now();
@@ -10290,7 +10407,7 @@ function inOrNearComposition(view, event) {
10290
10407
  // This guards against the case where compositionend is triggered without the keyboard
10291
10408
  // (e.g. character confirmation may be done with the mouse), and keydown is triggered
10292
10409
  // afterwards- we wouldn't want to ignore the keydown event in this case.
10293
- if (safari && Math.abs(event.timeStamp - view.input.compositionEndedAt) < 500) {
10410
+ if (safari && Math.abs(Date.now() - view.input.compositionEndedAt) < 500) {
10294
10411
  view.input.compositionEndedAt = -2e8;
10295
10412
  return true;
10296
10413
  }
@@ -10302,7 +10419,7 @@ editHandlers.compositionstart = editHandlers.compositionupdate = view => {
10302
10419
  if (!view.composing) {
10303
10420
  view.domObserver.flush();
10304
10421
  let { state } = view, $pos = state.selection.$to;
10305
- if (state.selection instanceof TextSelection &&
10422
+ if (state.selection instanceof TextSelection && state.selection.empty &&
10306
10423
  (state.storedMarks ||
10307
10424
  (!$pos.textOffset && $pos.parentOffset && $pos.nodeBefore.marks.some(m => m.type.spec.inclusive === false)) ||
10308
10425
  chrome && windows$1 && selectionBeforeUneditable(view))) { // Issue #1500
@@ -10318,11 +10435,11 @@ editHandlers.compositionstart = editHandlers.compositionupdate = view => {
10318
10435
  // inside if necessary.
10319
10436
  if (gecko && state.selection.empty && $pos.parentOffset && !$pos.textOffset && $pos.nodeBefore.marks.length) {
10320
10437
  let sel = view.domSelectionRange();
10321
- for (let node = sel.focusNode, offset = sel.focusOffset; node && node.nodeType == 1 && offset != 0;) {
10438
+ for (let node = sel.focusNode, offset = sel.focusOffset; node && isElt(node) && offset != 0;) {
10322
10439
  let before = offset < 0 ? node.lastChild : node.childNodes[offset - 1];
10323
10440
  if (!before)
10324
10441
  break;
10325
- if (before.nodeType == 3) {
10442
+ if (isText(before)) {
10326
10443
  let sel = view.domSelection();
10327
10444
  if (sel)
10328
10445
  sel.collapse(before, before.nodeValue.length);
@@ -10341,15 +10458,15 @@ editHandlers.compositionstart = editHandlers.compositionupdate = view => {
10341
10458
  };
10342
10459
  function selectionBeforeUneditable(view) {
10343
10460
  let { focusNode, focusOffset } = view.domSelectionRange();
10344
- if (!focusNode || focusNode.nodeType != 1 || focusOffset >= focusNode.childNodes.length)
10461
+ if (!focusNode || !isElt(focusNode) || focusOffset >= focusNode.childNodes.length)
10345
10462
  return false;
10346
10463
  let next = focusNode.childNodes[focusOffset];
10347
- return next.nodeType == 1 && next.contentEditable == "false";
10464
+ return isElt(next) && next.contentEditable == "false";
10348
10465
  }
10349
10466
  editHandlers.compositionend = (view, event) => {
10350
10467
  if (view.composing) {
10351
10468
  view.input.composing = false;
10352
- view.input.compositionEndedAt = event.timeStamp;
10469
+ view.input.compositionEndedAt = Date.now();
10353
10470
  view.input.compositionPendingChanges = view.domObserver.pendingRecords().length ? view.input.compositionID : 0;
10354
10471
  view.input.compositionNode = null;
10355
10472
  if (view.input.badSafariComposition)
@@ -10368,7 +10485,7 @@ function scheduleComposeEnd(view, delay) {
10368
10485
  function clearComposition(view) {
10369
10486
  if (view.composing) {
10370
10487
  view.input.composing = false;
10371
- view.input.compositionEndedAt = timestampFromCustomEvent();
10488
+ view.input.compositionEndedAt = Date.now();
10372
10489
  }
10373
10490
  while (view.input.compositionNodes.length > 0)
10374
10491
  view.input.compositionNodes.pop().markParentsDirty();
@@ -10394,11 +10511,6 @@ function findCompositionNode(view) {
10394
10511
  }
10395
10512
  return textBefore || textAfter;
10396
10513
  }
10397
- function timestampFromCustomEvent() {
10398
- let event = document.createEvent("Event");
10399
- event.initEvent("event", true, true);
10400
- return event.timeStamp;
10401
- }
10402
10514
  /**
10403
10515
  @internal
10404
10516
  */
@@ -10551,7 +10663,7 @@ handlers.dragstart = (view, _event) => {
10551
10663
  else if (mouseDown && mouseDown.mightDrag) {
10552
10664
  node = NodeSelection.create(view.state.doc, mouseDown.mightDrag.pos);
10553
10665
  }
10554
- else if (event.target && event.target.nodeType == 1) {
10666
+ else if (event.target && isElt(event.target)) {
10555
10667
  let desc = view.docView.nearestDesc(event.target, true);
10556
10668
  if (desc && desc.node.type.spec.draggable && desc != view.docView)
10557
10669
  node = NodeSelection.create(view.state.doc, desc.posBefore);
@@ -10668,8 +10780,8 @@ handlers.beforeinput = (view, _event) => {
10668
10780
  // We should probably do more with beforeinput events, but support
10669
10781
  // is so spotty that I'm still waiting to see where they are going.
10670
10782
  // Very specific hack to deal with backspace sometimes failing on
10671
- // Chrome Android when after an uneditable node.
10672
- if (chrome && android && event.inputType == "deleteContentBackward") {
10783
+ // Chrome and Firefox Android when after an uneditable node.
10784
+ if (android && event.inputType == "deleteContentBackward") {
10673
10785
  view.domObserver.flushSoon();
10674
10786
  let { domChangeCount } = view.input;
10675
10787
  setTimeout(() => {
@@ -11522,7 +11634,7 @@ class DOMObserver {
11522
11634
  let desc = container && this.view.docView.nearestDesc(container);
11523
11635
  if (desc && desc.ignoreMutation({
11524
11636
  type: "selection",
11525
- target: container.nodeType == 3 ? container.parentNode : container
11637
+ target: isText(container) ? container.parentNode : container
11526
11638
  })) {
11527
11639
  this.setCurSelection();
11528
11640
  return true;
@@ -11555,13 +11667,16 @@ class DOMObserver {
11555
11667
  }
11556
11668
  }
11557
11669
  }
11558
- if (added.some(n => n.nodeName == "BR") && (view.input.lastKeyCode == 8 || view.input.lastKeyCode == 46)) {
11670
+ if (added.some(n => n.nodeName == "BR") &&
11671
+ (view.input.lastKeyCode == 8 || view.input.lastKeyCode == 46 ||
11672
+ chrome && (view.composing || view.input.compositionEndedAt > Date.now() - 50) &&
11673
+ mutations.some(m => m.type == "childList" && m.removedNodes.length))) {
11559
11674
  // Browsers sometimes insert a bogus break node if you
11560
11675
  // backspace out the last bit of text before an inline-flex node (#1552)
11561
11676
  for (let node of added)
11562
11677
  if (node.nodeName == "BR" && node.parentNode) {
11563
11678
  let after = node.nextSibling;
11564
- while (after && after.nodeType == 1) {
11679
+ while (after && isElt(after)) {
11565
11680
  if (after.contentEditable == "false") {
11566
11681
  node.parentNode.removeChild(node);
11567
11682
  break;
@@ -11634,7 +11749,7 @@ class DOMObserver {
11634
11749
  for (let i = 0; i < mut.addedNodes.length; i++) {
11635
11750
  let node = mut.addedNodes[i];
11636
11751
  added.push(node);
11637
- if (node.nodeType == 3)
11752
+ if (isText(node))
11638
11753
  this.lastChangedTextNode = node;
11639
11754
  }
11640
11755
  if (desc.contentDOM && desc.contentDOM != desc.dom && !desc.contentDOM.contains(mut.target))
@@ -11749,8 +11864,7 @@ function fixUpBadSafariComposition(view, addedNodes) {
11749
11864
  let parent = nextCell;
11750
11865
  for (;;) {
11751
11866
  let first = parent.firstChild;
11752
- if (!first || first.nodeType != 1 || first.contentEditable == "false" ||
11753
- /^(BR|IMG)$/.test(first.nodeName))
11867
+ if (!first || !isElt(first) || first.contentEditable == "false" || /^(BR|IMG)$/.test(first.nodeName))
11754
11868
  break;
11755
11869
  parent = first;
11756
11870
  }
@@ -11770,12 +11884,12 @@ function fixUpBadSafariComposition(view, addedNodes) {
11770
11884
  // that the DOM represents. If any changes came in in the meantime,
11771
11885
  // the modification is mapped over those before it is applied, in
11772
11886
  // readDOMChange.
11773
- function parseBetween(view, from_, to_) {
11887
+ function parseBetween(view, from_, to_, addedNodes) {
11774
11888
  let { node: parent, fromOffset, toOffset, from, to } = view.docView.parseRange(from_, to_);
11775
11889
  let domSel = view.domSelectionRange();
11776
11890
  let find;
11777
11891
  let anchor = domSel.anchorNode;
11778
- if (anchor && view.dom.contains(anchor.nodeType == 1 ? anchor : anchor.parentNode)) {
11892
+ if (anchor && contains(view.dom, anchor)) {
11779
11893
  find = [{ node: anchor, offset: domSel.anchorOffset }];
11780
11894
  if (!selectionCollapsed(domSel))
11781
11895
  find.push({ node: domSel.focusNode, offset: domSel.focusOffset });
@@ -11804,7 +11918,7 @@ function parseBetween(view, from_, to_) {
11804
11918
  to: toOffset,
11805
11919
  preserveWhitespace: $from.parent.type.whitespace == "pre" ? "full" : true,
11806
11920
  findPositions: find,
11807
- ruleFromNode,
11921
+ ruleFromNode: ruleFromNode(addedNodes),
11808
11922
  context: $from
11809
11923
  });
11810
11924
  if (find && find[0].pos != null) {
@@ -11815,10 +11929,10 @@ function parseBetween(view, from_, to_) {
11815
11929
  }
11816
11930
  return { doc, sel, from, to };
11817
11931
  }
11818
- function ruleFromNode(dom) {
11932
+ const ruleFromNode = (added) => (dom) => {
11819
11933
  let desc = dom.pmViewDesc;
11820
11934
  if (desc) {
11821
- return desc.parseRule();
11935
+ return desc.parseRule(added);
11822
11936
  }
11823
11937
  else if (dom.nodeName == "BR" && dom.parentNode) {
11824
11938
  // Safari replaces the list item or table cell with a BR
@@ -11837,7 +11951,7 @@ function ruleFromNode(dom) {
11837
11951
  return { ignore: true };
11838
11952
  }
11839
11953
  return null;
11840
- }
11954
+ };
11841
11955
  const isInline = /^(a|abbr|acronym|b|bd[io]|big|br|button|cite|code|data(list)?|del|dfn|em|i|img|ins|kbd|label|map|mark|meter|output|q|ruby|s|samp|small|span|strong|su[bp]|time|u|tt|var)$/i;
11842
11956
  function readDOMChange(view, from, to, typeOver, addedNodes) {
11843
11957
  let compositionID = view.input.compositionPendingChanges || (view.composing ? view.input.compositionID : 0);
@@ -11866,7 +11980,7 @@ function readDOMChange(view, from, to, typeOver, addedNodes) {
11866
11980
  from = $before.before(shared + 1);
11867
11981
  to = view.state.doc.resolve(to).after(shared + 1);
11868
11982
  let sel = view.state.selection;
11869
- let parse = parseBetween(view, from, to);
11983
+ let parse = parseBetween(view, from, to, addedNodes);
11870
11984
  let doc = view.state.doc, compare = doc.slice(parse.from, parse.to);
11871
11985
  let preferredPos, preferredSide;
11872
11986
  // Prefer anchoring to end when Backspace is pressed
@@ -11883,7 +11997,7 @@ function readDOMChange(view, from, to, typeOver, addedNodes) {
11883
11997
  if (change)
11884
11998
  view.input.domChangeCount++;
11885
11999
  if ((ios && view.input.lastIOSEnter > Date.now() - 225 || android) &&
11886
- addedNodes.some(n => n.nodeType == 1 && !isInline.test(n.nodeName)) &&
12000
+ addedNodes.some(n => isElt(n) && !isInline.test(n.nodeName)) &&
11887
12001
  (!change || change.endA >= change.endB) &&
11888
12002
  view.someProp("handleKeyDown", f => f(view, keyEvent(13, "Enter")))) {
11889
12003
  view.input.lastIOSEnter = 0;
@@ -11941,9 +12055,7 @@ function readDOMChange(view, from, to, typeOver, addedNodes) {
11941
12055
  // as being an iOS enter press), just dispatch an Enter key instead.
11942
12056
  if (((ios && view.input.lastIOSEnter > Date.now() - 225 &&
11943
12057
  (!inlineChange || addedNodes.some(n => n.nodeName == "DIV" || n.nodeName == "P"))) ||
11944
- (!inlineChange && $from.pos < parse.doc.content.size &&
11945
- (!$from.sameParent($to) || !$from.parent.inlineContent) &&
11946
- $from.pos < $to.pos && !/\S/.test(parse.doc.textBetween($from.pos, $to.pos, "", "")))) &&
12058
+ (!inlineChange && looksLikeEnter(parse.doc, $from.pos, $to.pos))) &&
11947
12059
  view.someProp("handleKeyDown", f => f(view, keyEvent(13, "Enter")))) {
11948
12060
  view.input.lastIOSEnter = 0;
11949
12061
  return;
@@ -12094,6 +12206,16 @@ function looksLikeBackspace(old, start, end, $newStart, $newEnd) {
12094
12206
  // The fragments after the join point must match
12095
12207
  return $newStart.parent.content.cut($newStart.parentOffset).eq($next.parent.content);
12096
12208
  }
12209
+ function looksLikeEnter(content, from, to) {
12210
+ let newTextlines = 0, newLeaves = 0;
12211
+ content.nodesBetween(from, to, (node, pos) => {
12212
+ if (node.isTextblock && pos >= from && pos < to)
12213
+ newTextlines++;
12214
+ else if (node.isText ? /\S/.test(node.text.slice(Math.max(0, from - pos), Math.min(node.nodeSize, to - pos))) : node.isLeaf)
12215
+ newLeaves++;
12216
+ });
12217
+ return newLeaves == 0 && newTextlines == 1;
12218
+ }
12097
12219
  function skipClosingAndOpening($pos, fromEnd, mayOpen) {
12098
12220
  let depth = $pos.depth, end = fromEnd ? $pos.end() : $pos.pos;
12099
12221
  while (depth > 0 && (fromEnd || $pos.indexAfter(depth) == $pos.node(depth).childCount)) {
@@ -12111,38 +12233,28 @@ function skipClosingAndOpening($pos, fromEnd, mayOpen) {
12111
12233
  return end;
12112
12234
  }
12113
12235
  function findDiff(a, b, pos, preferredPos, preferredSide) {
12114
- let start = a.findDiffStart(b, pos);
12236
+ let start = a.findDiffStart(b, pos), lenA = pos + a.size, lenB = pos + b.size;
12115
12237
  if (start == null)
12116
12238
  return null;
12117
- let { a: endA, b: endB } = a.findDiffEnd(b, pos + a.size, pos + b.size);
12239
+ let { a: endA, b: endB } = a.findDiffEnd(b, lenA, lenB);
12118
12240
  if (preferredSide == "end") {
12119
12241
  let adjust = Math.max(0, start - Math.min(endA, endB));
12120
12242
  preferredPos -= endA + adjust - start;
12121
12243
  }
12122
- if (endA < start && a.size < b.size) {
12244
+ if (endA < start && lenA < lenB) {
12123
12245
  let move = preferredPos <= start && preferredPos >= endA ? start - preferredPos : 0;
12124
12246
  start -= move;
12125
- if (start && start < b.size && isSurrogatePair(b.textBetween(start - 1, start + 1)))
12126
- start += move ? 1 : -1;
12127
12247
  endB = start + (endB - endA);
12128
12248
  endA = start;
12129
12249
  }
12130
12250
  else if (endB < start) {
12131
12251
  let move = preferredPos <= start && preferredPos >= endB ? start - preferredPos : 0;
12132
12252
  start -= move;
12133
- if (start && start < a.size && isSurrogatePair(a.textBetween(start - 1, start + 1)))
12134
- start += move ? 1 : -1;
12135
12253
  endA = start + (endA - endB);
12136
12254
  endB = start;
12137
12255
  }
12138
12256
  return { start, endA, endB };
12139
12257
  }
12140
- function isSurrogatePair(str) {
12141
- if (str.length != 2)
12142
- return false;
12143
- let a = str.charCodeAt(0), b = str.charCodeAt(1);
12144
- return a >= 0xDC00 && a <= 0xDFFF && b >= 0xD800 && b <= 0xDBFF;
12145
- }
12146
12258
  /**
12147
12259
  An editor view manages the DOM structure that represents an
12148
12260
  editable document. Its state and behavior are determined by its
@@ -12334,9 +12446,10 @@ class EditorView {
12334
12446
  // a DOM selection change and the "selectionchange" event for it
12335
12447
  // can cause a spurious DOM selection update, disrupting mouse
12336
12448
  // drag selection.
12449
+ let mouseDown = this.input.mouseDown;
12337
12450
  if (forceSelUpdate ||
12338
- !(this.input.mouseDown && this.domObserver.currentSelection.eq(this.domSelectionRange()) &&
12339
- anchorInRightPlace(this))) {
12451
+ !(mouseDown && this.domObserver.currentSelection.eq(this.domSelectionRange()) &&
12452
+ anchorInRightPlace(this) && mouseDown.delaySelUpdate())) {
12340
12453
  selectionToDOM(this, forceSelUpdate);
12341
12454
  }
12342
12455
  else {
@@ -12363,11 +12476,11 @@ class EditorView {
12363
12476
  */
12364
12477
  scrollToSelection() {
12365
12478
  let startDOM = this.domSelectionRange().focusNode;
12366
- if (!startDOM || !this.dom.contains(startDOM.nodeType == 1 ? startDOM : startDOM.parentNode)) ;
12479
+ if (!startDOM || !contains(this.dom, startDOM)) ;
12367
12480
  else if (this.someProp("handleScrollToSelection", f => f(this))) ;
12368
12481
  else if (this.state.selection instanceof NodeSelection) {
12369
12482
  let target = this.docView.domAfterPos(this.state.selection.from);
12370
- if (target.nodeType == 1)
12483
+ if (isElt(target))
12371
12484
  scrollRectIntoView(this, target.getBoundingClientRect(), startDOM);
12372
12485
  }
12373
12486
  else {
@@ -12632,7 +12745,7 @@ class EditorView {
12632
12745
  @internal
12633
12746
  */
12634
12747
  domSelectionRange() {
12635
- let sel = this.domSelection();
12748
+ let sel = this.dom.isConnected !== false && this.domSelection();
12636
12749
  if (!sel)
12637
12750
  return { focusNode: null, focusOffset: 0, anchorNode: null, anchorOffset: 0 };
12638
12751
  return safari && this.root.nodeType === 11 &&
@@ -13920,7 +14033,7 @@ const convertListsAndWrapRuns = (tr, state, targetType, startIndex, endIndex) =>
13920
14033
  const inRange = i >= startIndex && i <= endIndex;
13921
14034
  const isList = isListNode(child, state.schema);
13922
14035
  if (inRange && child.type === state.schema.nodes.paragraph) {
13923
- runStart = runStart !== null && runStart !== void 0 ? runStart : pos;
14036
+ runStart !== null && runStart !== void 0 ? runStart : (runStart = pos);
13924
14037
  runEnd = pos + child.nodeSize;
13925
14038
  }
13926
14039
  else if (runStart !== null && runEnd !== null) {
@@ -14027,17 +14140,13 @@ const toggleNodeType = (schema, type, attrs = {}, shouldWrap = false) => {
14027
14140
  }
14028
14141
  return true;
14029
14142
  }
14030
- else {
14031
- if (hasActiveWrap) {
14032
- return lift(state, dispatch);
14033
- }
14034
- if (shouldWrap) {
14035
- return wrapIn(nodeType, attrs)(state, dispatch);
14036
- }
14037
- else {
14038
- return setBlockType(nodeType, attrs)(state, dispatch);
14039
- }
14143
+ if (hasActiveWrap) {
14144
+ return lift(state, dispatch);
14145
+ }
14146
+ if (shouldWrap) {
14147
+ return wrapIn(nodeType, attrs)(state, dispatch);
14040
14148
  }
14149
+ return setBlockType(nodeType, attrs)(state, dispatch);
14041
14150
  }
14042
14151
  return false;
14043
14152
  };
@@ -14442,7 +14551,7 @@ function buildInlineImageDOMAttrs(attrs) {
14442
14551
  }
14443
14552
  function getStatusHTML(state, alt, language) {
14444
14553
  const key = state === 'failed' ? 'failed' : 'loading';
14445
- const text = translations.translate.get(`editor-image-view.${key}`, language, {
14554
+ const text = translations.translations.get(`editor-image-view.${key}`, language, {
14446
14555
  filename: alt || 'file',
14447
14556
  });
14448
14557
  return `<span>${text}</span>`;
@@ -14554,7 +14663,8 @@ function createImageParseDOM(inlineImages) {
14554
14663
  return rules;
14555
14664
  }
14556
14665
  function isEditorImageState(state) {
14557
- return state === 'loading' || state === 'failed' || state === 'success';
14666
+ const states = ['loading', 'failed', 'success'];
14667
+ return states.includes(state);
14558
14668
  }
14559
14669
  function getOrCreateImageElement(fileInfoId, node) {
14560
14670
  let img = imageCache.get(fileInfoId);
@@ -14572,7 +14682,7 @@ function createStatusSpanForState(state, node, language) {
14572
14682
  return createStatusSpan(statusKey, node, language);
14573
14683
  }
14574
14684
  function createStatusSpan(key, node, language) {
14575
- const text = translations.translate.get(`editor-image-view.${key}`, language, {
14685
+ const text = translations.translations.get(`editor-image-view.${key}`, language, {
14576
14686
  filename: node.attrs.alt || 'file',
14577
14687
  });
14578
14688
  const span = document.createElement('span');
@@ -15179,54 +15289,6 @@ var ucmicro = /*#__PURE__*/Object.freeze({
15179
15289
  Z: Z
15180
15290
  });
15181
15291
 
15182
- // Generated using scripts/write-encode-map.ts
15183
- function restoreDiff(arr) {
15184
- for (let i = 1; i < arr.length; i++) {
15185
- arr[i][0] += arr[i - 1][0] + 1;
15186
- }
15187
- return arr;
15188
- }
15189
- // prettier-ignore
15190
- new Map(/* #__PURE__ */ restoreDiff([[9, "&Tab;"], [0, "&NewLine;"], [22, "&excl;"], [0, "&quot;"], [0, "&num;"], [0, "&dollar;"], [0, "&percnt;"], [0, "&amp;"], [0, "&apos;"], [0, "&lpar;"], [0, "&rpar;"], [0, "&ast;"], [0, "&plus;"], [0, "&comma;"], [1, "&period;"], [0, "&sol;"], [10, "&colon;"], [0, "&semi;"], [0, { v: "&lt;", n: 8402, o: "&nvlt;" }], [0, { v: "&equals;", n: 8421, o: "&bne;" }], [0, { v: "&gt;", n: 8402, o: "&nvgt;" }], [0, "&quest;"], [0, "&commat;"], [26, "&lbrack;"], [0, "&bsol;"], [0, "&rbrack;"], [0, "&Hat;"], [0, "&lowbar;"], [0, "&DiacriticalGrave;"], [5, { n: 106, o: "&fjlig;" }], [20, "&lbrace;"], [0, "&verbar;"], [0, "&rbrace;"], [34, "&nbsp;"], [0, "&iexcl;"], [0, "&cent;"], [0, "&pound;"], [0, "&curren;"], [0, "&yen;"], [0, "&brvbar;"], [0, "&sect;"], [0, "&die;"], [0, "&copy;"], [0, "&ordf;"], [0, "&laquo;"], [0, "&not;"], [0, "&shy;"], [0, "&circledR;"], [0, "&macr;"], [0, "&deg;"], [0, "&PlusMinus;"], [0, "&sup2;"], [0, "&sup3;"], [0, "&acute;"], [0, "&micro;"], [0, "&para;"], [0, "&centerdot;"], [0, "&cedil;"], [0, "&sup1;"], [0, "&ordm;"], [0, "&raquo;"], [0, "&frac14;"], [0, "&frac12;"], [0, "&frac34;"], [0, "&iquest;"], [0, "&Agrave;"], [0, "&Aacute;"], [0, "&Acirc;"], [0, "&Atilde;"], [0, "&Auml;"], [0, "&angst;"], [0, "&AElig;"], [0, "&Ccedil;"], [0, "&Egrave;"], [0, "&Eacute;"], [0, "&Ecirc;"], [0, "&Euml;"], [0, "&Igrave;"], [0, "&Iacute;"], [0, "&Icirc;"], [0, "&Iuml;"], [0, "&ETH;"], [0, "&Ntilde;"], [0, "&Ograve;"], [0, "&Oacute;"], [0, "&Ocirc;"], [0, "&Otilde;"], [0, "&Ouml;"], [0, "&times;"], [0, "&Oslash;"], [0, "&Ugrave;"], [0, "&Uacute;"], [0, "&Ucirc;"], [0, "&Uuml;"], [0, "&Yacute;"], [0, "&THORN;"], [0, "&szlig;"], [0, "&agrave;"], [0, "&aacute;"], [0, "&acirc;"], [0, "&atilde;"], [0, "&auml;"], [0, "&aring;"], [0, "&aelig;"], [0, "&ccedil;"], [0, "&egrave;"], [0, "&eacute;"], [0, "&ecirc;"], [0, "&euml;"], [0, "&igrave;"], [0, "&iacute;"], [0, "&icirc;"], [0, "&iuml;"], [0, "&eth;"], [0, "&ntilde;"], [0, "&ograve;"], [0, "&oacute;"], [0, "&ocirc;"], [0, "&otilde;"], [0, "&ouml;"], [0, "&div;"], [0, "&oslash;"], [0, "&ugrave;"], [0, "&uacute;"], [0, "&ucirc;"], [0, "&uuml;"], [0, "&yacute;"], [0, "&thorn;"], [0, "&yuml;"], [0, "&Amacr;"], [0, "&amacr;"], [0, "&Abreve;"], [0, "&abreve;"], [0, "&Aogon;"], [0, "&aogon;"], [0, "&Cacute;"], [0, "&cacute;"], [0, "&Ccirc;"], [0, "&ccirc;"], [0, "&Cdot;"], [0, "&cdot;"], [0, "&Ccaron;"], [0, "&ccaron;"], [0, "&Dcaron;"], [0, "&dcaron;"], [0, "&Dstrok;"], [0, "&dstrok;"], [0, "&Emacr;"], [0, "&emacr;"], [2, "&Edot;"], [0, "&edot;"], [0, "&Eogon;"], [0, "&eogon;"], [0, "&Ecaron;"], [0, "&ecaron;"], [0, "&Gcirc;"], [0, "&gcirc;"], [0, "&Gbreve;"], [0, "&gbreve;"], [0, "&Gdot;"], [0, "&gdot;"], [0, "&Gcedil;"], [1, "&Hcirc;"], [0, "&hcirc;"], [0, "&Hstrok;"], [0, "&hstrok;"], [0, "&Itilde;"], [0, "&itilde;"], [0, "&Imacr;"], [0, "&imacr;"], [2, "&Iogon;"], [0, "&iogon;"], [0, "&Idot;"], [0, "&imath;"], [0, "&IJlig;"], [0, "&ijlig;"], [0, "&Jcirc;"], [0, "&jcirc;"], [0, "&Kcedil;"], [0, "&kcedil;"], [0, "&kgreen;"], [0, "&Lacute;"], [0, "&lacute;"], [0, "&Lcedil;"], [0, "&lcedil;"], [0, "&Lcaron;"], [0, "&lcaron;"], [0, "&Lmidot;"], [0, "&lmidot;"], [0, "&Lstrok;"], [0, "&lstrok;"], [0, "&Nacute;"], [0, "&nacute;"], [0, "&Ncedil;"], [0, "&ncedil;"], [0, "&Ncaron;"], [0, "&ncaron;"], [0, "&napos;"], [0, "&ENG;"], [0, "&eng;"], [0, "&Omacr;"], [0, "&omacr;"], [2, "&Odblac;"], [0, "&odblac;"], [0, "&OElig;"], [0, "&oelig;"], [0, "&Racute;"], [0, "&racute;"], [0, "&Rcedil;"], [0, "&rcedil;"], [0, "&Rcaron;"], [0, "&rcaron;"], [0, "&Sacute;"], [0, "&sacute;"], [0, "&Scirc;"], [0, "&scirc;"], [0, "&Scedil;"], [0, "&scedil;"], [0, "&Scaron;"], [0, "&scaron;"], [0, "&Tcedil;"], [0, "&tcedil;"], [0, "&Tcaron;"], [0, "&tcaron;"], [0, "&Tstrok;"], [0, "&tstrok;"], [0, "&Utilde;"], [0, "&utilde;"], [0, "&Umacr;"], [0, "&umacr;"], [0, "&Ubreve;"], [0, "&ubreve;"], [0, "&Uring;"], [0, "&uring;"], [0, "&Udblac;"], [0, "&udblac;"], [0, "&Uogon;"], [0, "&uogon;"], [0, "&Wcirc;"], [0, "&wcirc;"], [0, "&Ycirc;"], [0, "&ycirc;"], [0, "&Yuml;"], [0, "&Zacute;"], [0, "&zacute;"], [0, "&Zdot;"], [0, "&zdot;"], [0, "&Zcaron;"], [0, "&zcaron;"], [19, "&fnof;"], [34, "&imped;"], [63, "&gacute;"], [65, "&jmath;"], [142, "&circ;"], [0, "&caron;"], [16, "&breve;"], [0, "&DiacriticalDot;"], [0, "&ring;"], [0, "&ogon;"], [0, "&DiacriticalTilde;"], [0, "&dblac;"], [51, "&DownBreve;"], [127, "&Alpha;"], [0, "&Beta;"], [0, "&Gamma;"], [0, "&Delta;"], [0, "&Epsilon;"], [0, "&Zeta;"], [0, "&Eta;"], [0, "&Theta;"], [0, "&Iota;"], [0, "&Kappa;"], [0, "&Lambda;"], [0, "&Mu;"], [0, "&Nu;"], [0, "&Xi;"], [0, "&Omicron;"], [0, "&Pi;"], [0, "&Rho;"], [1, "&Sigma;"], [0, "&Tau;"], [0, "&Upsilon;"], [0, "&Phi;"], [0, "&Chi;"], [0, "&Psi;"], [0, "&ohm;"], [7, "&alpha;"], [0, "&beta;"], [0, "&gamma;"], [0, "&delta;"], [0, "&epsi;"], [0, "&zeta;"], [0, "&eta;"], [0, "&theta;"], [0, "&iota;"], [0, "&kappa;"], [0, "&lambda;"], [0, "&mu;"], [0, "&nu;"], [0, "&xi;"], [0, "&omicron;"], [0, "&pi;"], [0, "&rho;"], [0, "&sigmaf;"], [0, "&sigma;"], [0, "&tau;"], [0, "&upsi;"], [0, "&phi;"], [0, "&chi;"], [0, "&psi;"], [0, "&omega;"], [7, "&thetasym;"], [0, "&Upsi;"], [2, "&phiv;"], [0, "&piv;"], [5, "&Gammad;"], [0, "&digamma;"], [18, "&kappav;"], [0, "&rhov;"], [3, "&epsiv;"], [0, "&backepsilon;"], [10, "&IOcy;"], [0, "&DJcy;"], [0, "&GJcy;"], [0, "&Jukcy;"], [0, "&DScy;"], [0, "&Iukcy;"], [0, "&YIcy;"], [0, "&Jsercy;"], [0, "&LJcy;"], [0, "&NJcy;"], [0, "&TSHcy;"], [0, "&KJcy;"], [1, "&Ubrcy;"], [0, "&DZcy;"], [0, "&Acy;"], [0, "&Bcy;"], [0, "&Vcy;"], [0, "&Gcy;"], [0, "&Dcy;"], [0, "&IEcy;"], [0, "&ZHcy;"], [0, "&Zcy;"], [0, "&Icy;"], [0, "&Jcy;"], [0, "&Kcy;"], [0, "&Lcy;"], [0, "&Mcy;"], [0, "&Ncy;"], [0, "&Ocy;"], [0, "&Pcy;"], [0, "&Rcy;"], [0, "&Scy;"], [0, "&Tcy;"], [0, "&Ucy;"], [0, "&Fcy;"], [0, "&KHcy;"], [0, "&TScy;"], [0, "&CHcy;"], [0, "&SHcy;"], [0, "&SHCHcy;"], [0, "&HARDcy;"], [0, "&Ycy;"], [0, "&SOFTcy;"], [0, "&Ecy;"], [0, "&YUcy;"], [0, "&YAcy;"], [0, "&acy;"], [0, "&bcy;"], [0, "&vcy;"], [0, "&gcy;"], [0, "&dcy;"], [0, "&iecy;"], [0, "&zhcy;"], [0, "&zcy;"], [0, "&icy;"], [0, "&jcy;"], [0, "&kcy;"], [0, "&lcy;"], [0, "&mcy;"], [0, "&ncy;"], [0, "&ocy;"], [0, "&pcy;"], [0, "&rcy;"], [0, "&scy;"], [0, "&tcy;"], [0, "&ucy;"], [0, "&fcy;"], [0, "&khcy;"], [0, "&tscy;"], [0, "&chcy;"], [0, "&shcy;"], [0, "&shchcy;"], [0, "&hardcy;"], [0, "&ycy;"], [0, "&softcy;"], [0, "&ecy;"], [0, "&yucy;"], [0, "&yacy;"], [1, "&iocy;"], [0, "&djcy;"], [0, "&gjcy;"], [0, "&jukcy;"], [0, "&dscy;"], [0, "&iukcy;"], [0, "&yicy;"], [0, "&jsercy;"], [0, "&ljcy;"], [0, "&njcy;"], [0, "&tshcy;"], [0, "&kjcy;"], [1, "&ubrcy;"], [0, "&dzcy;"], [7074, "&ensp;"], [0, "&emsp;"], [0, "&emsp13;"], [0, "&emsp14;"], [1, "&numsp;"], [0, "&puncsp;"], [0, "&ThinSpace;"], [0, "&hairsp;"], [0, "&NegativeMediumSpace;"], [0, "&zwnj;"], [0, "&zwj;"], [0, "&lrm;"], [0, "&rlm;"], [0, "&dash;"], [2, "&ndash;"], [0, "&mdash;"], [0, "&horbar;"], [0, "&Verbar;"], [1, "&lsquo;"], [0, "&CloseCurlyQuote;"], [0, "&lsquor;"], [1, "&ldquo;"], [0, "&CloseCurlyDoubleQuote;"], [0, "&bdquo;"], [1, "&dagger;"], [0, "&Dagger;"], [0, "&bull;"], [2, "&nldr;"], [0, "&hellip;"], [9, "&permil;"], [0, "&pertenk;"], [0, "&prime;"], [0, "&Prime;"], [0, "&tprime;"], [0, "&backprime;"], [3, "&lsaquo;"], [0, "&rsaquo;"], [3, "&oline;"], [2, "&caret;"], [1, "&hybull;"], [0, "&frasl;"], [10, "&bsemi;"], [7, "&qprime;"], [7, { v: "&MediumSpace;", n: 8202, o: "&ThickSpace;" }], [0, "&NoBreak;"], [0, "&af;"], [0, "&InvisibleTimes;"], [0, "&ic;"], [72, "&euro;"], [46, "&tdot;"], [0, "&DotDot;"], [37, "&complexes;"], [2, "&incare;"], [4, "&gscr;"], [0, "&hamilt;"], [0, "&Hfr;"], [0, "&Hopf;"], [0, "&planckh;"], [0, "&hbar;"], [0, "&imagline;"], [0, "&Ifr;"], [0, "&lagran;"], [0, "&ell;"], [1, "&naturals;"], [0, "&numero;"], [0, "&copysr;"], [0, "&weierp;"], [0, "&Popf;"], [0, "&Qopf;"], [0, "&realine;"], [0, "&real;"], [0, "&reals;"], [0, "&rx;"], [3, "&trade;"], [1, "&integers;"], [2, "&mho;"], [0, "&zeetrf;"], [0, "&iiota;"], [2, "&bernou;"], [0, "&Cayleys;"], [1, "&escr;"], [0, "&Escr;"], [0, "&Fouriertrf;"], [1, "&Mellintrf;"], [0, "&order;"], [0, "&alefsym;"], [0, "&beth;"], [0, "&gimel;"], [0, "&daleth;"], [12, "&CapitalDifferentialD;"], [0, "&dd;"], [0, "&ee;"], [0, "&ii;"], [10, "&frac13;"], [0, "&frac23;"], [0, "&frac15;"], [0, "&frac25;"], [0, "&frac35;"], [0, "&frac45;"], [0, "&frac16;"], [0, "&frac56;"], [0, "&frac18;"], [0, "&frac38;"], [0, "&frac58;"], [0, "&frac78;"], [49, "&larr;"], [0, "&ShortUpArrow;"], [0, "&rarr;"], [0, "&darr;"], [0, "&harr;"], [0, "&updownarrow;"], [0, "&nwarr;"], [0, "&nearr;"], [0, "&LowerRightArrow;"], [0, "&LowerLeftArrow;"], [0, "&nlarr;"], [0, "&nrarr;"], [1, { v: "&rarrw;", n: 824, o: "&nrarrw;" }], [0, "&Larr;"], [0, "&Uarr;"], [0, "&Rarr;"], [0, "&Darr;"], [0, "&larrtl;"], [0, "&rarrtl;"], [0, "&LeftTeeArrow;"], [0, "&mapstoup;"], [0, "&map;"], [0, "&DownTeeArrow;"], [1, "&hookleftarrow;"], [0, "&hookrightarrow;"], [0, "&larrlp;"], [0, "&looparrowright;"], [0, "&harrw;"], [0, "&nharr;"], [1, "&lsh;"], [0, "&rsh;"], [0, "&ldsh;"], [0, "&rdsh;"], [1, "&crarr;"], [0, "&cularr;"], [0, "&curarr;"], [2, "&circlearrowleft;"], [0, "&circlearrowright;"], [0, "&leftharpoonup;"], [0, "&DownLeftVector;"], [0, "&RightUpVector;"], [0, "&LeftUpVector;"], [0, "&rharu;"], [0, "&DownRightVector;"], [0, "&dharr;"], [0, "&dharl;"], [0, "&RightArrowLeftArrow;"], [0, "&udarr;"], [0, "&LeftArrowRightArrow;"], [0, "&leftleftarrows;"], [0, "&upuparrows;"], [0, "&rightrightarrows;"], [0, "&ddarr;"], [0, "&leftrightharpoons;"], [0, "&Equilibrium;"], [0, "&nlArr;"], [0, "&nhArr;"], [0, "&nrArr;"], [0, "&DoubleLeftArrow;"], [0, "&DoubleUpArrow;"], [0, "&DoubleRightArrow;"], [0, "&dArr;"], [0, "&DoubleLeftRightArrow;"], [0, "&DoubleUpDownArrow;"], [0, "&nwArr;"], [0, "&neArr;"], [0, "&seArr;"], [0, "&swArr;"], [0, "&lAarr;"], [0, "&rAarr;"], [1, "&zigrarr;"], [6, "&larrb;"], [0, "&rarrb;"], [15, "&DownArrowUpArrow;"], [7, "&loarr;"], [0, "&roarr;"], [0, "&hoarr;"], [0, "&forall;"], [0, "&comp;"], [0, { v: "&part;", n: 824, o: "&npart;" }], [0, "&exist;"], [0, "&nexist;"], [0, "&empty;"], [1, "&Del;"], [0, "&Element;"], [0, "&NotElement;"], [1, "&ni;"], [0, "&notni;"], [2, "&prod;"], [0, "&coprod;"], [0, "&sum;"], [0, "&minus;"], [0, "&MinusPlus;"], [0, "&dotplus;"], [1, "&Backslash;"], [0, "&lowast;"], [0, "&compfn;"], [1, "&radic;"], [2, "&prop;"], [0, "&infin;"], [0, "&angrt;"], [0, { v: "&ang;", n: 8402, o: "&nang;" }], [0, "&angmsd;"], [0, "&angsph;"], [0, "&mid;"], [0, "&nmid;"], [0, "&DoubleVerticalBar;"], [0, "&NotDoubleVerticalBar;"], [0, "&and;"], [0, "&or;"], [0, { v: "&cap;", n: 65024, o: "&caps;" }], [0, { v: "&cup;", n: 65024, o: "&cups;" }], [0, "&int;"], [0, "&Int;"], [0, "&iiint;"], [0, "&conint;"], [0, "&Conint;"], [0, "&Cconint;"], [0, "&cwint;"], [0, "&ClockwiseContourIntegral;"], [0, "&awconint;"], [0, "&there4;"], [0, "&becaus;"], [0, "&ratio;"], [0, "&Colon;"], [0, "&dotminus;"], [1, "&mDDot;"], [0, "&homtht;"], [0, { v: "&sim;", n: 8402, o: "&nvsim;" }], [0, { v: "&backsim;", n: 817, o: "&race;" }], [0, { v: "&ac;", n: 819, o: "&acE;" }], [0, "&acd;"], [0, "&VerticalTilde;"], [0, "&NotTilde;"], [0, { v: "&eqsim;", n: 824, o: "&nesim;" }], [0, "&sime;"], [0, "&NotTildeEqual;"], [0, "&cong;"], [0, "&simne;"], [0, "&ncong;"], [0, "&ap;"], [0, "&nap;"], [0, "&ape;"], [0, { v: "&apid;", n: 824, o: "&napid;" }], [0, "&backcong;"], [0, { v: "&asympeq;", n: 8402, o: "&nvap;" }], [0, { v: "&bump;", n: 824, o: "&nbump;" }], [0, { v: "&bumpe;", n: 824, o: "&nbumpe;" }], [0, { v: "&doteq;", n: 824, o: "&nedot;" }], [0, "&doteqdot;"], [0, "&efDot;"], [0, "&erDot;"], [0, "&Assign;"], [0, "&ecolon;"], [0, "&ecir;"], [0, "&circeq;"], [1, "&wedgeq;"], [0, "&veeeq;"], [1, "&triangleq;"], [2, "&equest;"], [0, "&ne;"], [0, { v: "&Congruent;", n: 8421, o: "&bnequiv;" }], [0, "&nequiv;"], [1, { v: "&le;", n: 8402, o: "&nvle;" }], [0, { v: "&ge;", n: 8402, o: "&nvge;" }], [0, { v: "&lE;", n: 824, o: "&nlE;" }], [0, { v: "&gE;", n: 824, o: "&ngE;" }], [0, { v: "&lnE;", n: 65024, o: "&lvertneqq;" }], [0, { v: "&gnE;", n: 65024, o: "&gvertneqq;" }], [0, { v: "&ll;", n: new Map(/* #__PURE__ */ restoreDiff([[824, "&nLtv;"], [7577, "&nLt;"]])) }], [0, { v: "&gg;", n: new Map(/* #__PURE__ */ restoreDiff([[824, "&nGtv;"], [7577, "&nGt;"]])) }], [0, "&between;"], [0, "&NotCupCap;"], [0, "&nless;"], [0, "&ngt;"], [0, "&nle;"], [0, "&nge;"], [0, "&lesssim;"], [0, "&GreaterTilde;"], [0, "&nlsim;"], [0, "&ngsim;"], [0, "&LessGreater;"], [0, "&gl;"], [0, "&NotLessGreater;"], [0, "&NotGreaterLess;"], [0, "&pr;"], [0, "&sc;"], [0, "&prcue;"], [0, "&sccue;"], [0, "&PrecedesTilde;"], [0, { v: "&scsim;", n: 824, o: "&NotSucceedsTilde;" }], [0, "&NotPrecedes;"], [0, "&NotSucceeds;"], [0, { v: "&sub;", n: 8402, o: "&NotSubset;" }], [0, { v: "&sup;", n: 8402, o: "&NotSuperset;" }], [0, "&nsub;"], [0, "&nsup;"], [0, "&sube;"], [0, "&supe;"], [0, "&NotSubsetEqual;"], [0, "&NotSupersetEqual;"], [0, { v: "&subne;", n: 65024, o: "&varsubsetneq;" }], [0, { v: "&supne;", n: 65024, o: "&varsupsetneq;" }], [1, "&cupdot;"], [0, "&UnionPlus;"], [0, { v: "&sqsub;", n: 824, o: "&NotSquareSubset;" }], [0, { v: "&sqsup;", n: 824, o: "&NotSquareSuperset;" }], [0, "&sqsube;"], [0, "&sqsupe;"], [0, { v: "&sqcap;", n: 65024, o: "&sqcaps;" }], [0, { v: "&sqcup;", n: 65024, o: "&sqcups;" }], [0, "&CirclePlus;"], [0, "&CircleMinus;"], [0, "&CircleTimes;"], [0, "&osol;"], [0, "&CircleDot;"], [0, "&circledcirc;"], [0, "&circledast;"], [1, "&circleddash;"], [0, "&boxplus;"], [0, "&boxminus;"], [0, "&boxtimes;"], [0, "&dotsquare;"], [0, "&RightTee;"], [0, "&dashv;"], [0, "&DownTee;"], [0, "&bot;"], [1, "&models;"], [0, "&DoubleRightTee;"], [0, "&Vdash;"], [0, "&Vvdash;"], [0, "&VDash;"], [0, "&nvdash;"], [0, "&nvDash;"], [0, "&nVdash;"], [0, "&nVDash;"], [0, "&prurel;"], [1, "&LeftTriangle;"], [0, "&RightTriangle;"], [0, { v: "&LeftTriangleEqual;", n: 8402, o: "&nvltrie;" }], [0, { v: "&RightTriangleEqual;", n: 8402, o: "&nvrtrie;" }], [0, "&origof;"], [0, "&imof;"], [0, "&multimap;"], [0, "&hercon;"], [0, "&intcal;"], [0, "&veebar;"], [1, "&barvee;"], [0, "&angrtvb;"], [0, "&lrtri;"], [0, "&bigwedge;"], [0, "&bigvee;"], [0, "&bigcap;"], [0, "&bigcup;"], [0, "&diam;"], [0, "&sdot;"], [0, "&sstarf;"], [0, "&divideontimes;"], [0, "&bowtie;"], [0, "&ltimes;"], [0, "&rtimes;"], [0, "&leftthreetimes;"], [0, "&rightthreetimes;"], [0, "&backsimeq;"], [0, "&curlyvee;"], [0, "&curlywedge;"], [0, "&Sub;"], [0, "&Sup;"], [0, "&Cap;"], [0, "&Cup;"], [0, "&fork;"], [0, "&epar;"], [0, "&lessdot;"], [0, "&gtdot;"], [0, { v: "&Ll;", n: 824, o: "&nLl;" }], [0, { v: "&Gg;", n: 824, o: "&nGg;" }], [0, { v: "&leg;", n: 65024, o: "&lesg;" }], [0, { v: "&gel;", n: 65024, o: "&gesl;" }], [2, "&cuepr;"], [0, "&cuesc;"], [0, "&NotPrecedesSlantEqual;"], [0, "&NotSucceedsSlantEqual;"], [0, "&NotSquareSubsetEqual;"], [0, "&NotSquareSupersetEqual;"], [2, "&lnsim;"], [0, "&gnsim;"], [0, "&precnsim;"], [0, "&scnsim;"], [0, "&nltri;"], [0, "&NotRightTriangle;"], [0, "&nltrie;"], [0, "&NotRightTriangleEqual;"], [0, "&vellip;"], [0, "&ctdot;"], [0, "&utdot;"], [0, "&dtdot;"], [0, "&disin;"], [0, "&isinsv;"], [0, "&isins;"], [0, { v: "&isindot;", n: 824, o: "&notindot;" }], [0, "&notinvc;"], [0, "&notinvb;"], [1, { v: "&isinE;", n: 824, o: "&notinE;" }], [0, "&nisd;"], [0, "&xnis;"], [0, "&nis;"], [0, "&notnivc;"], [0, "&notnivb;"], [6, "&barwed;"], [0, "&Barwed;"], [1, "&lceil;"], [0, "&rceil;"], [0, "&LeftFloor;"], [0, "&rfloor;"], [0, "&drcrop;"], [0, "&dlcrop;"], [0, "&urcrop;"], [0, "&ulcrop;"], [0, "&bnot;"], [1, "&profline;"], [0, "&profsurf;"], [1, "&telrec;"], [0, "&target;"], [5, "&ulcorn;"], [0, "&urcorn;"], [0, "&dlcorn;"], [0, "&drcorn;"], [2, "&frown;"], [0, "&smile;"], [9, "&cylcty;"], [0, "&profalar;"], [7, "&topbot;"], [6, "&ovbar;"], [1, "&solbar;"], [60, "&angzarr;"], [51, "&lmoustache;"], [0, "&rmoustache;"], [2, "&OverBracket;"], [0, "&bbrk;"], [0, "&bbrktbrk;"], [37, "&OverParenthesis;"], [0, "&UnderParenthesis;"], [0, "&OverBrace;"], [0, "&UnderBrace;"], [2, "&trpezium;"], [4, "&elinters;"], [59, "&blank;"], [164, "&circledS;"], [55, "&boxh;"], [1, "&boxv;"], [9, "&boxdr;"], [3, "&boxdl;"], [3, "&boxur;"], [3, "&boxul;"], [3, "&boxvr;"], [7, "&boxvl;"], [7, "&boxhd;"], [7, "&boxhu;"], [7, "&boxvh;"], [19, "&boxH;"], [0, "&boxV;"], [0, "&boxdR;"], [0, "&boxDr;"], [0, "&boxDR;"], [0, "&boxdL;"], [0, "&boxDl;"], [0, "&boxDL;"], [0, "&boxuR;"], [0, "&boxUr;"], [0, "&boxUR;"], [0, "&boxuL;"], [0, "&boxUl;"], [0, "&boxUL;"], [0, "&boxvR;"], [0, "&boxVr;"], [0, "&boxVR;"], [0, "&boxvL;"], [0, "&boxVl;"], [0, "&boxVL;"], [0, "&boxHd;"], [0, "&boxhD;"], [0, "&boxHD;"], [0, "&boxHu;"], [0, "&boxhU;"], [0, "&boxHU;"], [0, "&boxvH;"], [0, "&boxVh;"], [0, "&boxVH;"], [19, "&uhblk;"], [3, "&lhblk;"], [3, "&block;"], [8, "&blk14;"], [0, "&blk12;"], [0, "&blk34;"], [13, "&square;"], [8, "&blacksquare;"], [0, "&EmptyVerySmallSquare;"], [1, "&rect;"], [0, "&marker;"], [2, "&fltns;"], [1, "&bigtriangleup;"], [0, "&blacktriangle;"], [0, "&triangle;"], [2, "&blacktriangleright;"], [0, "&rtri;"], [3, "&bigtriangledown;"], [0, "&blacktriangledown;"], [0, "&dtri;"], [2, "&blacktriangleleft;"], [0, "&ltri;"], [6, "&loz;"], [0, "&cir;"], [32, "&tridot;"], [2, "&bigcirc;"], [8, "&ultri;"], [0, "&urtri;"], [0, "&lltri;"], [0, "&EmptySmallSquare;"], [0, "&FilledSmallSquare;"], [8, "&bigstar;"], [0, "&star;"], [7, "&phone;"], [49, "&female;"], [1, "&male;"], [29, "&spades;"], [2, "&clubs;"], [1, "&hearts;"], [0, "&diamondsuit;"], [3, "&sung;"], [2, "&flat;"], [0, "&natural;"], [0, "&sharp;"], [163, "&check;"], [3, "&cross;"], [8, "&malt;"], [21, "&sext;"], [33, "&VerticalSeparator;"], [25, "&lbbrk;"], [0, "&rbbrk;"], [84, "&bsolhsub;"], [0, "&suphsol;"], [28, "&LeftDoubleBracket;"], [0, "&RightDoubleBracket;"], [0, "&lang;"], [0, "&rang;"], [0, "&Lang;"], [0, "&Rang;"], [0, "&loang;"], [0, "&roang;"], [7, "&longleftarrow;"], [0, "&longrightarrow;"], [0, "&longleftrightarrow;"], [0, "&DoubleLongLeftArrow;"], [0, "&DoubleLongRightArrow;"], [0, "&DoubleLongLeftRightArrow;"], [1, "&longmapsto;"], [2, "&dzigrarr;"], [258, "&nvlArr;"], [0, "&nvrArr;"], [0, "&nvHarr;"], [0, "&Map;"], [6, "&lbarr;"], [0, "&bkarow;"], [0, "&lBarr;"], [0, "&dbkarow;"], [0, "&drbkarow;"], [0, "&DDotrahd;"], [0, "&UpArrowBar;"], [0, "&DownArrowBar;"], [2, "&Rarrtl;"], [2, "&latail;"], [0, "&ratail;"], [0, "&lAtail;"], [0, "&rAtail;"], [0, "&larrfs;"], [0, "&rarrfs;"], [0, "&larrbfs;"], [0, "&rarrbfs;"], [2, "&nwarhk;"], [0, "&nearhk;"], [0, "&hksearow;"], [0, "&hkswarow;"], [0, "&nwnear;"], [0, "&nesear;"], [0, "&seswar;"], [0, "&swnwar;"], [8, { v: "&rarrc;", n: 824, o: "&nrarrc;" }], [1, "&cudarrr;"], [0, "&ldca;"], [0, "&rdca;"], [0, "&cudarrl;"], [0, "&larrpl;"], [2, "&curarrm;"], [0, "&cularrp;"], [7, "&rarrpl;"], [2, "&harrcir;"], [0, "&Uarrocir;"], [0, "&lurdshar;"], [0, "&ldrushar;"], [2, "&LeftRightVector;"], [0, "&RightUpDownVector;"], [0, "&DownLeftRightVector;"], [0, "&LeftUpDownVector;"], [0, "&LeftVectorBar;"], [0, "&RightVectorBar;"], [0, "&RightUpVectorBar;"], [0, "&RightDownVectorBar;"], [0, "&DownLeftVectorBar;"], [0, "&DownRightVectorBar;"], [0, "&LeftUpVectorBar;"], [0, "&LeftDownVectorBar;"], [0, "&LeftTeeVector;"], [0, "&RightTeeVector;"], [0, "&RightUpTeeVector;"], [0, "&RightDownTeeVector;"], [0, "&DownLeftTeeVector;"], [0, "&DownRightTeeVector;"], [0, "&LeftUpTeeVector;"], [0, "&LeftDownTeeVector;"], [0, "&lHar;"], [0, "&uHar;"], [0, "&rHar;"], [0, "&dHar;"], [0, "&luruhar;"], [0, "&ldrdhar;"], [0, "&ruluhar;"], [0, "&rdldhar;"], [0, "&lharul;"], [0, "&llhard;"], [0, "&rharul;"], [0, "&lrhard;"], [0, "&udhar;"], [0, "&duhar;"], [0, "&RoundImplies;"], [0, "&erarr;"], [0, "&simrarr;"], [0, "&larrsim;"], [0, "&rarrsim;"], [0, "&rarrap;"], [0, "&ltlarr;"], [1, "&gtrarr;"], [0, "&subrarr;"], [1, "&suplarr;"], [0, "&lfisht;"], [0, "&rfisht;"], [0, "&ufisht;"], [0, "&dfisht;"], [5, "&lopar;"], [0, "&ropar;"], [4, "&lbrke;"], [0, "&rbrke;"], [0, "&lbrkslu;"], [0, "&rbrksld;"], [0, "&lbrksld;"], [0, "&rbrkslu;"], [0, "&langd;"], [0, "&rangd;"], [0, "&lparlt;"], [0, "&rpargt;"], [0, "&gtlPar;"], [0, "&ltrPar;"], [3, "&vzigzag;"], [1, "&vangrt;"], [0, "&angrtvbd;"], [6, "&ange;"], [0, "&range;"], [0, "&dwangle;"], [0, "&uwangle;"], [0, "&angmsdaa;"], [0, "&angmsdab;"], [0, "&angmsdac;"], [0, "&angmsdad;"], [0, "&angmsdae;"], [0, "&angmsdaf;"], [0, "&angmsdag;"], [0, "&angmsdah;"], [0, "&bemptyv;"], [0, "&demptyv;"], [0, "&cemptyv;"], [0, "&raemptyv;"], [0, "&laemptyv;"], [0, "&ohbar;"], [0, "&omid;"], [0, "&opar;"], [1, "&operp;"], [1, "&olcross;"], [0, "&odsold;"], [1, "&olcir;"], [0, "&ofcir;"], [0, "&olt;"], [0, "&ogt;"], [0, "&cirscir;"], [0, "&cirE;"], [0, "&solb;"], [0, "&bsolb;"], [3, "&boxbox;"], [3, "&trisb;"], [0, "&rtriltri;"], [0, { v: "&LeftTriangleBar;", n: 824, o: "&NotLeftTriangleBar;" }], [0, { v: "&RightTriangleBar;", n: 824, o: "&NotRightTriangleBar;" }], [11, "&iinfin;"], [0, "&infintie;"], [0, "&nvinfin;"], [4, "&eparsl;"], [0, "&smeparsl;"], [0, "&eqvparsl;"], [5, "&blacklozenge;"], [8, "&RuleDelayed;"], [1, "&dsol;"], [9, "&bigodot;"], [0, "&bigoplus;"], [0, "&bigotimes;"], [1, "&biguplus;"], [1, "&bigsqcup;"], [5, "&iiiint;"], [0, "&fpartint;"], [2, "&cirfnint;"], [0, "&awint;"], [0, "&rppolint;"], [0, "&scpolint;"], [0, "&npolint;"], [0, "&pointint;"], [0, "&quatint;"], [0, "&intlarhk;"], [10, "&pluscir;"], [0, "&plusacir;"], [0, "&simplus;"], [0, "&plusdu;"], [0, "&plussim;"], [0, "&plustwo;"], [1, "&mcomma;"], [0, "&minusdu;"], [2, "&loplus;"], [0, "&roplus;"], [0, "&Cross;"], [0, "&timesd;"], [0, "&timesbar;"], [1, "&smashp;"], [0, "&lotimes;"], [0, "&rotimes;"], [0, "&otimesas;"], [0, "&Otimes;"], [0, "&odiv;"], [0, "&triplus;"], [0, "&triminus;"], [0, "&tritime;"], [0, "&intprod;"], [2, "&amalg;"], [0, "&capdot;"], [1, "&ncup;"], [0, "&ncap;"], [0, "&capand;"], [0, "&cupor;"], [0, "&cupcap;"], [0, "&capcup;"], [0, "&cupbrcap;"], [0, "&capbrcup;"], [0, "&cupcup;"], [0, "&capcap;"], [0, "&ccups;"], [0, "&ccaps;"], [2, "&ccupssm;"], [2, "&And;"], [0, "&Or;"], [0, "&andand;"], [0, "&oror;"], [0, "&orslope;"], [0, "&andslope;"], [1, "&andv;"], [0, "&orv;"], [0, "&andd;"], [0, "&ord;"], [1, "&wedbar;"], [6, "&sdote;"], [3, "&simdot;"], [2, { v: "&congdot;", n: 824, o: "&ncongdot;" }], [0, "&easter;"], [0, "&apacir;"], [0, { v: "&apE;", n: 824, o: "&napE;" }], [0, "&eplus;"], [0, "&pluse;"], [0, "&Esim;"], [0, "&Colone;"], [0, "&Equal;"], [1, "&ddotseq;"], [0, "&equivDD;"], [0, "&ltcir;"], [0, "&gtcir;"], [0, "&ltquest;"], [0, "&gtquest;"], [0, { v: "&leqslant;", n: 824, o: "&nleqslant;" }], [0, { v: "&geqslant;", n: 824, o: "&ngeqslant;" }], [0, "&lesdot;"], [0, "&gesdot;"], [0, "&lesdoto;"], [0, "&gesdoto;"], [0, "&lesdotor;"], [0, "&gesdotol;"], [0, "&lap;"], [0, "&gap;"], [0, "&lne;"], [0, "&gne;"], [0, "&lnap;"], [0, "&gnap;"], [0, "&lEg;"], [0, "&gEl;"], [0, "&lsime;"], [0, "&gsime;"], [0, "&lsimg;"], [0, "&gsiml;"], [0, "&lgE;"], [0, "&glE;"], [0, "&lesges;"], [0, "&gesles;"], [0, "&els;"], [0, "&egs;"], [0, "&elsdot;"], [0, "&egsdot;"], [0, "&el;"], [0, "&eg;"], [2, "&siml;"], [0, "&simg;"], [0, "&simlE;"], [0, "&simgE;"], [0, { v: "&LessLess;", n: 824, o: "&NotNestedLessLess;" }], [0, { v: "&GreaterGreater;", n: 824, o: "&NotNestedGreaterGreater;" }], [1, "&glj;"], [0, "&gla;"], [0, "&ltcc;"], [0, "&gtcc;"], [0, "&lescc;"], [0, "&gescc;"], [0, "&smt;"], [0, "&lat;"], [0, { v: "&smte;", n: 65024, o: "&smtes;" }], [0, { v: "&late;", n: 65024, o: "&lates;" }], [0, "&bumpE;"], [0, { v: "&PrecedesEqual;", n: 824, o: "&NotPrecedesEqual;" }], [0, { v: "&sce;", n: 824, o: "&NotSucceedsEqual;" }], [2, "&prE;"], [0, "&scE;"], [0, "&precneqq;"], [0, "&scnE;"], [0, "&prap;"], [0, "&scap;"], [0, "&precnapprox;"], [0, "&scnap;"], [0, "&Pr;"], [0, "&Sc;"], [0, "&subdot;"], [0, "&supdot;"], [0, "&subplus;"], [0, "&supplus;"], [0, "&submult;"], [0, "&supmult;"], [0, "&subedot;"], [0, "&supedot;"], [0, { v: "&subE;", n: 824, o: "&nsubE;" }], [0, { v: "&supE;", n: 824, o: "&nsupE;" }], [0, "&subsim;"], [0, "&supsim;"], [2, { v: "&subnE;", n: 65024, o: "&varsubsetneqq;" }], [0, { v: "&supnE;", n: 65024, o: "&varsupsetneqq;" }], [2, "&csub;"], [0, "&csup;"], [0, "&csube;"], [0, "&csupe;"], [0, "&subsup;"], [0, "&supsub;"], [0, "&subsub;"], [0, "&supsup;"], [0, "&suphsub;"], [0, "&supdsub;"], [0, "&forkv;"], [0, "&topfork;"], [0, "&mlcp;"], [8, "&Dashv;"], [1, "&Vdashl;"], [0, "&Barv;"], [0, "&vBar;"], [0, "&vBarv;"], [1, "&Vbar;"], [0, "&Not;"], [0, "&bNot;"], [0, "&rnmid;"], [0, "&cirmid;"], [0, "&midcir;"], [0, "&topcir;"], [0, "&nhpar;"], [0, "&parsim;"], [9, { v: "&parsl;", n: 8421, o: "&nparsl;" }], [44343, { n: new Map(/* #__PURE__ */ restoreDiff([[56476, "&Ascr;"], [1, "&Cscr;"], [0, "&Dscr;"], [2, "&Gscr;"], [2, "&Jscr;"], [0, "&Kscr;"], [2, "&Nscr;"], [0, "&Oscr;"], [0, "&Pscr;"], [0, "&Qscr;"], [1, "&Sscr;"], [0, "&Tscr;"], [0, "&Uscr;"], [0, "&Vscr;"], [0, "&Wscr;"], [0, "&Xscr;"], [0, "&Yscr;"], [0, "&Zscr;"], [0, "&ascr;"], [0, "&bscr;"], [0, "&cscr;"], [0, "&dscr;"], [1, "&fscr;"], [1, "&hscr;"], [0, "&iscr;"], [0, "&jscr;"], [0, "&kscr;"], [0, "&lscr;"], [0, "&mscr;"], [0, "&nscr;"], [1, "&pscr;"], [0, "&qscr;"], [0, "&rscr;"], [0, "&sscr;"], [0, "&tscr;"], [0, "&uscr;"], [0, "&vscr;"], [0, "&wscr;"], [0, "&xscr;"], [0, "&yscr;"], [0, "&zscr;"], [52, "&Afr;"], [0, "&Bfr;"], [1, "&Dfr;"], [0, "&Efr;"], [0, "&Ffr;"], [0, "&Gfr;"], [2, "&Jfr;"], [0, "&Kfr;"], [0, "&Lfr;"], [0, "&Mfr;"], [0, "&Nfr;"], [0, "&Ofr;"], [0, "&Pfr;"], [0, "&Qfr;"], [1, "&Sfr;"], [0, "&Tfr;"], [0, "&Ufr;"], [0, "&Vfr;"], [0, "&Wfr;"], [0, "&Xfr;"], [0, "&Yfr;"], [1, "&afr;"], [0, "&bfr;"], [0, "&cfr;"], [0, "&dfr;"], [0, "&efr;"], [0, "&ffr;"], [0, "&gfr;"], [0, "&hfr;"], [0, "&ifr;"], [0, "&jfr;"], [0, "&kfr;"], [0, "&lfr;"], [0, "&mfr;"], [0, "&nfr;"], [0, "&ofr;"], [0, "&pfr;"], [0, "&qfr;"], [0, "&rfr;"], [0, "&sfr;"], [0, "&tfr;"], [0, "&ufr;"], [0, "&vfr;"], [0, "&wfr;"], [0, "&xfr;"], [0, "&yfr;"], [0, "&zfr;"], [0, "&Aopf;"], [0, "&Bopf;"], [1, "&Dopf;"], [0, "&Eopf;"], [0, "&Fopf;"], [0, "&Gopf;"], [1, "&Iopf;"], [0, "&Jopf;"], [0, "&Kopf;"], [0, "&Lopf;"], [0, "&Mopf;"], [1, "&Oopf;"], [3, "&Sopf;"], [0, "&Topf;"], [0, "&Uopf;"], [0, "&Vopf;"], [0, "&Wopf;"], [0, "&Xopf;"], [0, "&Yopf;"], [1, "&aopf;"], [0, "&bopf;"], [0, "&copf;"], [0, "&dopf;"], [0, "&eopf;"], [0, "&fopf;"], [0, "&gopf;"], [0, "&hopf;"], [0, "&iopf;"], [0, "&jopf;"], [0, "&kopf;"], [0, "&lopf;"], [0, "&mopf;"], [0, "&nopf;"], [0, "&oopf;"], [0, "&popf;"], [0, "&qopf;"], [0, "&ropf;"], [0, "&sopf;"], [0, "&topf;"], [0, "&uopf;"], [0, "&vopf;"], [0, "&wopf;"], [0, "&xopf;"], [0, "&yopf;"], [0, "&zopf;"]])) }], [8906, "&fflig;"], [0, "&filig;"], [0, "&fllig;"], [0, "&ffilig;"], [0, "&ffllig;"]]));
15191
-
15192
- /** The level of entities to support. */
15193
- var EntityLevel;
15194
- (function (EntityLevel) {
15195
- /** Support only XML entities. */
15196
- EntityLevel[EntityLevel["XML"] = 0] = "XML";
15197
- /** Support HTML entities, which are a superset of XML entities. */
15198
- EntityLevel[EntityLevel["HTML"] = 1] = "HTML";
15199
- })(EntityLevel || (EntityLevel = {}));
15200
- var EncodingMode;
15201
- (function (EncodingMode) {
15202
- /**
15203
- * The output is UTF-8 encoded. Only characters that need escaping within
15204
- * XML will be escaped.
15205
- */
15206
- EncodingMode[EncodingMode["UTF8"] = 0] = "UTF8";
15207
- /**
15208
- * The output consists only of ASCII characters. Characters that need
15209
- * escaping within HTML, and characters that aren't ASCII characters will
15210
- * be escaped.
15211
- */
15212
- EncodingMode[EncodingMode["ASCII"] = 1] = "ASCII";
15213
- /**
15214
- * Encode all characters that have an equivalent entity, as well as all
15215
- * characters that are not ASCII characters.
15216
- */
15217
- EncodingMode[EncodingMode["Extensive"] = 2] = "Extensive";
15218
- /**
15219
- * Encode all characters that have to be escaped in HTML attributes,
15220
- * following {@link https://html.spec.whatwg.org/multipage/parsing.html#escapingString}.
15221
- */
15222
- EncodingMode[EncodingMode["Attribute"] = 3] = "Attribute";
15223
- /**
15224
- * Encode all characters that have to be escaped in HTML text,
15225
- * following {@link https://html.spec.whatwg.org/multipage/parsing.html#escapingString}.
15226
- */
15227
- EncodingMode[EncodingMode["Text"] = 4] = "Text";
15228
- })(EncodingMode || (EncodingMode = {}));
15229
-
15230
15292
  // Utilities
15231
15293
  //
15232
15294
 
@@ -25520,12 +25582,11 @@ const updateLink = (view, updateLinkCallback) => {
25520
25582
  const fromInNode = Math.max(0, from - pos);
25521
25583
  const toInNode = Math.min(node.text.length, to - pos);
25522
25584
  text += node.text.slice(fromInNode, toInNode);
25523
- // eslint-disable-next-line unicorn/no-array-for-each
25524
- node.marks.forEach((mark) => {
25585
+ for (const mark of node.marks) {
25525
25586
  if (mark.type.name === 'link') {
25526
25587
  href = mark.attrs.href;
25527
25588
  }
25528
- });
25589
+ }
25529
25590
  });
25530
25591
  if (updateLinkCallback) {
25531
25592
  updateLinkCallback(text, href);
@@ -25542,8 +25603,8 @@ const findStart = (doc, pos, href) => {
25542
25603
  while (pos > 0) {
25543
25604
  const node = doc.nodeAt(pos - 1);
25544
25605
  if (!(node === null || node === void 0 ? void 0 : node.isText) ||
25545
- !node.marks.some((mark) => mark.type.name === types.EditorMenuTypes.Link &&
25546
- mark.attrs.href === href)) {
25606
+ node.marks.every((mark) => mark.type.name !== types.EditorMenuTypes.Link ||
25607
+ mark.attrs.href !== href)) {
25547
25608
  break;
25548
25609
  }
25549
25610
  pos--;
@@ -25561,8 +25622,8 @@ const findEnd = (doc, pos, href) => {
25561
25622
  while (pos < doc.content.size) {
25562
25623
  const node = doc.nodeAt(pos);
25563
25624
  if (!(node === null || node === void 0 ? void 0 : node.isText) ||
25564
- !node.marks.some((mark) => mark.type.name === types.EditorMenuTypes.Link &&
25565
- mark.attrs.href === href)) {
25625
+ node.marks.every((mark) => mark.type.name !== types.EditorMenuTypes.Link ||
25626
+ mark.attrs.href !== href)) {
25566
25627
  break;
25567
25628
  }
25568
25629
  pos++;
@@ -25698,16 +25759,17 @@ const createNodesWithLinksAndBreaks = (text, schema) => {
25698
25759
  if (line.length > 0) {
25699
25760
  nodes.push(...createNodesWithLinks(line, schema));
25700
25761
  }
25701
- if (index < lines.length - 1) {
25702
- const hb = schema.nodes.hard_break;
25703
- if (hb) {
25704
- nodes.push(hb.create());
25705
- }
25706
- else {
25707
- // Fallback: if schema lacks hard_break, defer to default paste behavior
25708
- // (Do NOT throw; keep behavior stable across versions)
25709
- console.warn('hard_break node not found in schema');
25710
- }
25762
+ if (index >= lines.length - 1) {
25763
+ continue;
25764
+ }
25765
+ const hb = schema.nodes.hard_break;
25766
+ if (hb) {
25767
+ nodes.push(hb.create());
25768
+ }
25769
+ else {
25770
+ // Fallback: if schema lacks hard_break, defer to default paste behavior
25771
+ // (Do NOT throw; keep behavior stable across versions)
25772
+ console.warn('hard_break node not found in schema');
25711
25773
  }
25712
25774
  }
25713
25775
  return nodes;
@@ -25844,10 +25906,11 @@ const createLinkPlugin = (updateLinkCallback) => {
25844
25906
  }
25845
25907
  // Prevent unhandled navigation and bubbling for link clicks
25846
25908
  const link = event.target.closest('a');
25847
- if (link) {
25848
- event.preventDefault();
25849
- event.stopPropagation();
25909
+ if (!link) {
25910
+ return;
25850
25911
  }
25912
+ event.preventDefault();
25913
+ event.stopPropagation();
25851
25914
  },
25852
25915
  },
25853
25916
  },
@@ -25918,11 +25981,12 @@ const replaceImageNodeByFileInfoId = (view, fileInfoId, buildNode) => {
25918
25981
  if (found) {
25919
25982
  return false;
25920
25983
  }
25921
- if (node.attrs.fileInfoId === fileInfoId) {
25922
- tr.replaceWith(pos, pos + node.nodeSize, buildNode(node));
25923
- found = true;
25924
- return false;
25984
+ if (node.attrs.fileInfoId !== fileInfoId) {
25985
+ return true;
25925
25986
  }
25987
+ tr.replaceWith(pos, pos + node.nodeSize, buildNode(node));
25988
+ found = true;
25989
+ return false;
25926
25990
  });
25927
25991
  if (found) {
25928
25992
  dispatch(tr);
@@ -25994,24 +26058,20 @@ const isImageNode$1 = (node) => {
25994
26058
  if (node.type.name === 'image') {
25995
26059
  return true;
25996
26060
  }
25997
- let found = false;
25998
- // eslint-disable-next-line unicorn/no-array-for-each
25999
- node.content.forEach((child) => {
26061
+ for (const child of node.children) {
26000
26062
  if (isImageNode$1(child)) {
26001
- found = true;
26063
+ return true;
26002
26064
  }
26003
- });
26004
- return found;
26065
+ }
26066
+ return false;
26005
26067
  }
26006
- else if (node instanceof Fragment) {
26007
- let found = false;
26008
- // eslint-disable-next-line unicorn/no-array-for-each
26009
- node.forEach((child) => {
26068
+ if (node instanceof Fragment) {
26069
+ for (const child of node.content) {
26010
26070
  if (isImageNode$1(child)) {
26011
- found = true;
26071
+ return true;
26012
26072
  }
26013
- });
26014
- return found;
26073
+ }
26074
+ return false;
26015
26075
  }
26016
26076
  return false;
26017
26077
  };
@@ -26022,8 +26082,7 @@ const isImageNode$1 = (node) => {
26022
26082
  */
26023
26083
  const filterImageNodes = (fragment) => {
26024
26084
  const filteredChildren = [];
26025
- // eslint-disable-next-line unicorn/no-array-for-each
26026
- fragment.forEach((child) => {
26085
+ for (const child of fragment.content) {
26027
26086
  if (!isImageNode$1(child)) {
26028
26087
  if (child.content.size > 0) {
26029
26088
  const filteredContent = filterImageNodes(child.content);
@@ -26034,7 +26093,7 @@ const filterImageNodes = (fragment) => {
26034
26093
  filteredChildren.push(child);
26035
26094
  }
26036
26095
  }
26037
- });
26096
+ }
26038
26097
  return Fragment.fromArray(filteredChildren);
26039
26098
  };
26040
26099
  /**
@@ -26074,27 +26133,28 @@ function handlePastedImages(view, clipboardData, inlineImages) {
26074
26133
  let isImageFilePasted = false;
26075
26134
  const files$1 = [...(clipboardData.files || [])];
26076
26135
  for (const file of files$1) {
26077
- if (isImageFile(file, clipboardData)) {
26078
- isImageFilePasted = true;
26079
- const reader = new FileReader();
26080
- reader.onloadend = () => {
26081
- const base64Data = reader.result;
26082
- const fileInfo = files.createFileInfo(file);
26083
- if (inlineImages) {
26084
- // Once inline images are configured they own the paste
26085
- // lifecycle; never fall back to the legacy imagePasted
26086
- // event. Without an upload handler the paste is a no-op.
26087
- if (inlineImages.upload) {
26088
- runInlineImageUpload(view, file, base64Data, fileInfo, inlineImages);
26089
- }
26090
- return;
26091
- }
26092
- view.dom.dispatchEvent(new CustomEvent('imagePasted', {
26093
- detail: imageInserterFactory(view, base64Data, fileInfo),
26094
- }));
26095
- };
26096
- reader.readAsDataURL(file);
26136
+ if (!isImageFile(file, clipboardData)) {
26137
+ continue;
26097
26138
  }
26139
+ isImageFilePasted = true;
26140
+ const reader = new FileReader();
26141
+ reader.onloadend = () => {
26142
+ const base64Data = reader.result;
26143
+ const fileInfo = files.createFileInfo(file);
26144
+ if (inlineImages) {
26145
+ // Once inline images are configured they own the paste
26146
+ // lifecycle; never fall back to the legacy imagePasted
26147
+ // event. Without an upload handler the paste is a no-op.
26148
+ if (inlineImages.upload) {
26149
+ runInlineImageUpload(view, file, base64Data, fileInfo, inlineImages);
26150
+ }
26151
+ return;
26152
+ }
26153
+ view.dom.dispatchEvent(new CustomEvent('imagePasted', {
26154
+ detail: imageInserterFactory(view, base64Data, fileInfo),
26155
+ }));
26156
+ };
26157
+ reader.readAsDataURL(file);
26098
26158
  }
26099
26159
  return isImageFilePasted;
26100
26160
  }
@@ -26154,7 +26214,7 @@ class ImageView {
26154
26214
  const handle = document.createElement('div');
26155
26215
  handle.className = `resize-handle ${position}`;
26156
26216
  handle.setAttribute('role', 'slider');
26157
- handle.setAttribute('aria-label', translations.translate.get('editor-image-view.resize-handle', this.language));
26217
+ handle.setAttribute('aria-label', translations.translations.get('editor-image-view.resize-handle', this.language));
26158
26218
  handle.setAttribute('tabindex', '0');
26159
26219
  handle.setAttribute('aria-valuemin', MIN_WIDTH.toString());
26160
26220
  handle.setAttribute('aria-valuenow', this.img.offsetWidth.toString());
@@ -26195,7 +26255,7 @@ class ImageView {
26195
26255
  this.createLoadingState = () => {
26196
26256
  this.dom.setAttribute('aria-live', 'polite');
26197
26257
  this.dom.setAttribute('aria-busy', 'true');
26198
- this.dom.setAttribute('aria-label', translations.translate.get('editor-image-view.loading', this.language, {
26258
+ this.dom.setAttribute('aria-label', translations.translations.get('editor-image-view.loading', this.language, {
26199
26259
  filename: this.node.attrs.alt || 'file',
26200
26260
  }));
26201
26261
  const spinnerElement = document.createElement('limel-linear-progress');
@@ -26205,7 +26265,7 @@ class ImageView {
26205
26265
  this.createSuccessState = () => {
26206
26266
  this.dom.setAttribute('aria-live', 'polite');
26207
26267
  this.dom.setAttribute('aria-busy', 'false');
26208
- this.dom.setAttribute('aria-label', translations.translate.get('editor-image-view.success', this.language, {
26268
+ this.dom.setAttribute('aria-label', translations.translations.get('editor-image-view.success', this.language, {
26209
26269
  filename: this.node.attrs.alt || 'file',
26210
26270
  }));
26211
26271
  const bottomRightHandle = this.createResizeHandle('bottom-right');
@@ -26216,7 +26276,7 @@ class ImageView {
26216
26276
  this.createFailedState = () => {
26217
26277
  this.dom.setAttribute('aria-live', 'assertive');
26218
26278
  this.dom.setAttribute('aria-busy', 'false');
26219
- this.dom.setAttribute('aria-label', translations.translate.get('editor-image-view.failed', this.language, {
26279
+ this.dom.setAttribute('aria-label', translations.translations.get('editor-image-view.failed', this.language, {
26220
26280
  filename: this.node.attrs.alt || 'file',
26221
26281
  }));
26222
26282
  };
@@ -26288,7 +26348,7 @@ const getMenuItemStates = (menuTypes, menuCommandFactory, view) => {
26288
26348
  const allowedTypes = {};
26289
26349
  for (const type of menuTypes) {
26290
26350
  const command = menuCommandFactory.getCommand(type);
26291
- activeTypes[type] = !!((_a = command === null || command === void 0 ? void 0 : command.active) === null || _a === void 0 ? void 0 : _a.call(command, view.state)) || false;
26351
+ activeTypes[type] = !!((_a = command === null || command === void 0 ? void 0 : command.active) === null || _a === void 0 ? void 0 : _a.call(command, view.state));
26292
26352
  allowedTypes[type] = !!((_c = (_b = command === null || command === void 0 ? void 0 : command.allowed) === null || _b === void 0 ? void 0 : _b.call(command, view.state)) !== null && _c !== void 0 ? _c : true);
26293
26353
  }
26294
26354
  return { active: activeTypes, allowed: allowedTypes };
@@ -26309,11 +26369,12 @@ const createMenuStateTrackingPlugin = (menuTypes, menuCommandFactory, updateCall
26309
26369
  update: (view) => {
26310
26370
  const oldItemStates = actionBarPluginKey.getState(view.state);
26311
26371
  const menuItemStates = getMenuItemStates(menuTypes, menuCommandFactory, view);
26312
- if (!isEqual.isEqual(oldItemStates, menuItemStates)) {
26313
- const tr = view.state.tr.setMeta(actionBarPluginKey, menuItemStates);
26314
- view.dispatch(tr);
26315
- updateCallback(menuItemStates.active, menuItemStates.allowed);
26372
+ if (isEqual.isEqual(oldItemStates, menuItemStates)) {
26373
+ return;
26316
26374
  }
26375
+ const tr = view.state.tr.setMeta(actionBarPluginKey, menuItemStates);
26376
+ view.dispatch(tr);
26377
+ updateCallback(menuItemStates.active, menuItemStates.allowed);
26317
26378
  },
26318
26379
  }),
26319
26380
  });
@@ -26539,20 +26600,21 @@ const detectTriggerRemoval = (transaction, activeTrigger, resetActiveTrigger, co
26539
26600
  return false;
26540
26601
  }
26541
26602
  for (const step of transaction.steps) {
26542
- if (step instanceof ReplaceStep) {
26543
- const { from, to, slice } = step; // Access properties specific to ReplaceStep
26544
- // Check if the step affects the trigger position
26545
- if (from <= activeTrigger.position &&
26546
- to >= activeTrigger.position) {
26547
- const text = slice.content.textBetween(0, slice.content.size, '');
26548
- // Check if the trigger character has been removed
26549
- // `text` is the text after the step has been applied
26550
- if (!text.includes(activeTrigger.character)) {
26551
- resetActiveTrigger();
26552
- sendTriggerEvent('triggerStop', view, contentConverter, activeTrigger, '');
26553
- return true;
26554
- }
26555
- }
26603
+ if (!(step instanceof ReplaceStep)) {
26604
+ continue;
26605
+ }
26606
+ const { from, to, slice } = step; // Access properties specific to ReplaceStep
26607
+ // Check if the step affects the trigger position
26608
+ if (!(from <= activeTrigger.position && to >= activeTrigger.position)) {
26609
+ continue;
26610
+ }
26611
+ const text = slice.content.textBetween(0, slice.content.size, '');
26612
+ // Check if the trigger character has been removed
26613
+ // `text` is the text after the step has been applied
26614
+ if (!text.includes(activeTrigger.character)) {
26615
+ resetActiveTrigger();
26616
+ sendTriggerEvent('triggerStop', view, contentConverter, activeTrigger, '');
26617
+ return true;
26556
26618
  }
26557
26619
  }
26558
26620
  return false;
@@ -28024,9 +28086,9 @@ const createNodeSpec = (config) => {
28024
28086
  tag: tag,
28025
28087
  getAttrs: (dom) => {
28026
28088
  const attributes = {};
28027
- // eslint-disable-next-line unicorn/no-array-for-each
28028
- config.attributes.forEach((attribute) => (attributes[attribute] =
28029
- dom.getAttribute(attribute)));
28089
+ for (const attribute of config.attributes) {
28090
+ attributes[attribute] = dom.getAttribute(attribute);
28091
+ }
28030
28092
  return attributes;
28031
28093
  },
28032
28094
  },
@@ -28207,7 +28269,7 @@ function areFrequencyMapsEqual(map1, map2) {
28207
28269
  if (map1.size !== map2.size) {
28208
28270
  return false;
28209
28271
  }
28210
- for (const [key, count] of map1.entries()) {
28272
+ for (const [key, count] of map1) {
28211
28273
  if (map2.get(key) !== count) {
28212
28274
  return false;
28213
28275
  }
@@ -28279,7 +28341,7 @@ const ProsemirrorAdapter = class {
28279
28341
  if (isItem.isItem(item)) {
28280
28342
  const translationId = menuTranslationIDs[item.value];
28281
28343
  if (translationId) {
28282
- newItem.text = translations.translate.get(translationId, this.language);
28344
+ newItem.text = translations.translations.get(translationId, this.language);
28283
28345
  }
28284
28346
  }
28285
28347
  return newItem;
@@ -28289,7 +28351,9 @@ const ProsemirrorAdapter = class {
28289
28351
  .map(this.getTranslatedItem)
28290
28352
  .map((item) => {
28291
28353
  if (isItem.isItem(item)) {
28292
- return Object.assign(Object.assign({}, item), { selected: activeTypes[item.value], disabled: !allowedTypes[item.value] });
28354
+ return Object.assign(Object.assign({}, item), { selected: activeTypes[item.value],
28355
+ // eslint-disable-next-line unicorn/no-computed-property-existence-check -- reads a boolean value, not key existence
28356
+ disabled: !allowedTypes[item.value] });
28293
28357
  }
28294
28358
  return item;
28295
28359
  });
@@ -28346,35 +28410,38 @@ const ProsemirrorAdapter = class {
28346
28410
  };
28347
28411
  this.handleFocus = () => {
28348
28412
  var _a;
28349
- if (!this.disabled) {
28350
- (_a = this.view) === null || _a === void 0 ? void 0 : _a.focus();
28351
- // Workaround: On some focus interactions (especially clicking the first line and the last line),
28352
- // ProseMirror does not dispatch a transaction or update the selection. This can cause
28353
- // the cursor to fall back to the end of the document instead of placing it where the user clicked.
28354
- //
28355
- // To detect this, we wait one tick after focus. If no transaction has fired by then,
28356
- // we assume the selection is unresolved and manually move the cursor to the last clicked position.
28357
- //
28358
- // The clicked position is only meaningful for the focus event that the
28359
- // click itself triggered, so it is consumed here and cleared on blur.
28360
- // Focus regained without a click (e.g. switching back to the window)
28361
- // must leave the selection untouched.
28362
- this.transactionFired = false;
28363
- this.focusRestoreTimeout = setTimeout(() => {
28364
- const clickedPos = this.lastClickedPos;
28365
- this.lastClickedPos = null;
28366
- if (!this.transactionFired &&
28367
- clickedPos !== null &&
28368
- clickedPos <= this.view.state.doc.content.size) {
28369
- const { doc, tr } = this.view.state;
28370
- const resolvedPos = doc.resolve(clickedPos);
28371
- const selection = Selection.near(resolvedPos);
28372
- tr.setMeta('pointer', true);
28373
- this.view.dispatch(tr.setSelection(selection));
28374
- }
28375
- }, 0);
28413
+ if (this.disabled) {
28414
+ return;
28376
28415
  }
28416
+ (_a = this.view) === null || _a === void 0 ? void 0 : _a.focus();
28417
+ // Workaround: On some focus interactions (especially clicking the first line and the last line),
28418
+ // ProseMirror does not dispatch a transaction or update the selection. This can cause
28419
+ // the cursor to fall back to the end of the document instead of placing it where the user clicked.
28420
+ //
28421
+ // To detect this, we wait one tick after focus. If no transaction has fired by then,
28422
+ // we assume the selection is unresolved and manually move the cursor to the last clicked position.
28423
+ //
28424
+ // The clicked position is only meaningful for the focus event that the
28425
+ // click itself triggered, so it is consumed here and cleared on blur.
28426
+ // Focus regained without a click (e.g. switching back to the window)
28427
+ // must leave the selection untouched.
28428
+ this.transactionFired = false;
28429
+ this.focusRestoreTimeout = setTimeout(() => {
28430
+ const clickedPos = this.lastClickedPos;
28431
+ this.lastClickedPos = null;
28432
+ if (this.transactionFired ||
28433
+ clickedPos === null ||
28434
+ clickedPos > this.view.state.doc.content.size) {
28435
+ return;
28436
+ }
28437
+ const { doc, tr } = this.view.state;
28438
+ const resolvedPos = doc.resolve(clickedPos);
28439
+ const selection = Selection.near(resolvedPos);
28440
+ tr.setMeta('pointer', true);
28441
+ this.view.dispatch(tr.setSelection(selection));
28442
+ }, 0);
28377
28443
  };
28444
+ // eslint-disable-next-line unicorn/prefer-default-parameters -- a default parameter would not cover an empty string
28378
28445
  this.handleNewLinkSelection = (text, href) => {
28379
28446
  this.link.text = text;
28380
28447
  this.link.href = href || 'https://';
@@ -28501,13 +28568,13 @@ const ProsemirrorAdapter = class {
28501
28568
  (_e = this.view) === null || _e === void 0 ? void 0 : _e.destroy();
28502
28569
  }
28503
28570
  render() {
28504
- return (index$1.h(index$1.Host, { key: '19a2071a0e50b4c9e95006ae12e44ec14df7460b', onFocus: this.handleFocus }, index$1.h("div", { key: 'f1215347c7eaf79cd16c9219c124ace3ebb22fc7', id: "editor" }), this.renderToolbar(), this.renderLinkMenu()));
28571
+ return (index$1.h(index$1.Host, { key: '16ef71481dea1fcefa1735e5a6350f47bf1d78ca', onFocus: this.handleFocus }, index$1.h("div", { key: '3b6598d8efd561afb6191d3d650f3a32e86f6904', id: "editor" }), this.renderToolbar(), this.renderLinkMenu()));
28505
28572
  }
28506
28573
  renderToolbar() {
28507
28574
  if (this.actionBarItems.length === 0 || this.ui === 'no-toolbar') {
28508
28575
  return;
28509
28576
  }
28510
- return (index$1.h("div", { class: "toolbar" }, index$1.h("limel-action-bar", { ref: (el) => (this.actionBarElement = el), accessibleLabel: translations.translate.get('editor-menu.toolbar', this.language), actions: this.actionBarItems, onItemSelected: this.handleActionBarItem })));
28577
+ return (index$1.h("div", { class: "toolbar" }, index$1.h("limel-action-bar", { ref: (el) => (this.actionBarElement = el), accessibleLabel: translations.translations.get('editor-menu.toolbar', this.language), actions: this.actionBarItems, onItemSelected: this.handleActionBarItem })));
28511
28578
  }
28512
28579
  renderLinkMenu() {
28513
28580
  if (!this.isLinkMenuOpen) {
@@ -28620,17 +28687,18 @@ const ProsemirrorAdapter = class {
28620
28687
  }
28621
28688
  }
28622
28689
  metadataEmitter(metadata) {
28623
- if (hasMetadataChanged(this.metadata, metadata)) {
28624
- this.removeImagesFromCache(this.metadata, metadata);
28625
- this.metadata = metadata;
28626
- this.metadataChange.emit(metadata);
28690
+ if (!hasMetadataChanged(this.metadata, metadata)) {
28691
+ return;
28627
28692
  }
28693
+ this.removeImagesFromCache(this.metadata, metadata);
28694
+ this.metadata = metadata;
28695
+ this.metadataChange.emit(metadata);
28628
28696
  }
28629
28697
  // When the deprecated metadata events are removed, this cache eviction
28630
28698
  // must be kept: re-derive the removed fileInfoIds from the node attrs so
28631
28699
  // pasted images still get evicted from `imageCache` when deleted.
28632
28700
  removeImagesFromCache(oldMetadata, newMetadata) {
28633
- const removedImages = oldMetadata.images.filter((oldImage) => !newMetadata.images.some((newImage) => newImage.fileInfoId === oldImage.fileInfoId));
28701
+ const removedImages = oldMetadata.images.filter((oldImage) => newMetadata.images.every((newImage) => newImage.fileInfoId !== oldImage.fileInfoId));
28634
28702
  for (const image of removedImages) {
28635
28703
  imageCache.delete(image.fileInfoId);
28636
28704
  this.imageRemoved.emit(image);