@lapismd/mira 0.0.4 → 0.1.0

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 (305) hide show
  1. package/CHANGELOG.md +39 -0
  2. package/dist/extensions/index.d.ts +13 -1
  3. package/dist/extensions/index.d.ts.map +1 -1
  4. package/dist/extensions/index.js +13 -3
  5. package/dist/extensions/inline-links.d.ts +8 -0
  6. package/dist/extensions/inline-links.d.ts.map +1 -0
  7. package/dist/extensions/inline-links.js +120 -0
  8. package/dist/extensions/markdown-editing.d.ts +32 -0
  9. package/dist/extensions/markdown-editing.d.ts.map +1 -0
  10. package/dist/extensions/markdown-editing.js +1 -0
  11. package/dist/internal/codemirror/base/index.d.ts.map +1 -1
  12. package/dist/internal/codemirror/base/index.js +3 -0
  13. package/dist/internal/codemirror/markdown/index.d.ts.map +1 -1
  14. package/dist/internal/codemirror/markdown/index.js +2 -1
  15. package/dist/internal/codemirror/rich/block-controls.d.ts.map +1 -1
  16. package/dist/internal/codemirror/rich/block-controls.js +2 -0
  17. package/dist/internal/codemirror/rich/block-gutter-accessibility.d.ts +15 -0
  18. package/dist/internal/codemirror/rich/block-gutter-accessibility.d.ts.map +1 -0
  19. package/dist/internal/codemirror/rich/block-gutter-accessibility.js +67 -0
  20. package/dist/internal/codemirror/rich/index.d.ts.map +1 -1
  21. package/dist/internal/codemirror/rich/index.js +43 -9
  22. package/dist/internal/codemirror/rich/utils/images.d.ts +6 -3
  23. package/dist/internal/codemirror/rich/utils/images.d.ts.map +1 -1
  24. package/dist/internal/codemirror/rich/utils/images.js +16 -29
  25. package/dist/internal/codemirror/rich/utils/references.d.ts +15 -0
  26. package/dist/internal/codemirror/rich/utils/references.d.ts.map +1 -0
  27. package/dist/internal/codemirror/rich/utils/references.js +86 -0
  28. package/dist/internal/codemirror/rich/widgets/preview-widgets.d.ts +3 -0
  29. package/dist/internal/codemirror/rich/widgets/preview-widgets.d.ts.map +1 -1
  30. package/dist/internal/codemirror/rich/widgets/preview-widgets.js +31 -3
  31. package/dist/internal/inline-links/icons.d.ts +115 -0
  32. package/dist/internal/inline-links/icons.d.ts.map +1 -0
  33. package/dist/internal/inline-links/icons.js +148 -0
  34. package/dist/internal/inline-links/live-preview.d.ts +5 -0
  35. package/dist/internal/inline-links/live-preview.d.ts.map +1 -0
  36. package/dist/internal/inline-links/live-preview.js +135 -0
  37. package/dist/internal/inline-links/registry.d.ts +44 -0
  38. package/dist/internal/inline-links/registry.d.ts.map +1 -0
  39. package/dist/internal/inline-links/registry.js +153 -0
  40. package/dist/mira.svelte.d.ts +1 -1
  41. package/dist/preview/asset-url-lease.d.ts +6 -0
  42. package/dist/preview/asset-url-lease.d.ts.map +1 -0
  43. package/dist/preview/asset-url-lease.js +28 -0
  44. package/dist/preview/components/embed.svelte +10 -5
  45. package/dist/preview/components/embed.svelte.d.ts.map +1 -1
  46. package/dist/preview/components/image.svelte +7 -2
  47. package/dist/preview/components/image.svelte.d.ts.map +1 -1
  48. package/dist/preview/components/inline-link.svelte +94 -0
  49. package/dist/preview/components/inline-link.svelte.d.ts +16 -0
  50. package/dist/preview/components/inline-link.svelte.d.ts.map +1 -0
  51. package/dist/preview/components/link-destination-tooltip.svelte +63 -0
  52. package/dist/preview/components/link-destination-tooltip.svelte.d.ts +7 -0
  53. package/dist/preview/components/link-destination-tooltip.svelte.d.ts.map +1 -0
  54. package/dist/preview/components/link-site-icon.svelte +39 -0
  55. package/dist/preview/components/link-site-icon.svelte.d.ts +10 -0
  56. package/dist/preview/components/link-site-icon.svelte.d.ts.map +1 -0
  57. package/dist/preview/components/link.svelte +19 -9
  58. package/dist/preview/components/link.svelte.d.ts.map +1 -1
  59. package/dist/preview/editable-markdown-preview/editable-markdown-surface.svelte +26 -10
  60. package/dist/preview/editable-markdown-preview/editable-markdown-surface.svelte.d.ts.map +1 -1
  61. package/dist/preview/editable-markdown-preview/editing-session.d.ts +15 -0
  62. package/dist/preview/editable-markdown-preview/editing-session.d.ts.map +1 -0
  63. package/dist/preview/editable-markdown-preview/editing-session.js +103 -0
  64. package/dist/preview/editable-markdown-preview/editor-surface.svelte +13 -4
  65. package/dist/preview/editable-markdown-preview/editor-surface.svelte.d.ts +1 -0
  66. package/dist/preview/editable-markdown-preview/editor-surface.svelte.d.ts.map +1 -1
  67. package/dist/preview/editable-markdown-preview/serialized-writer.d.ts +10 -8
  68. package/dist/preview/editable-markdown-preview/serialized-writer.d.ts.map +1 -1
  69. package/dist/preview/editable-markdown-preview/serialized-writer.js +105 -6
  70. package/dist/preview/editable-markdown-preview.svelte +8 -6
  71. package/dist/preview/editable-markdown-preview.svelte.d.ts.map +1 -1
  72. package/dist/preview/index.d.ts +2 -0
  73. package/dist/preview/index.d.ts.map +1 -1
  74. package/dist/preview/index.js +2 -0
  75. package/dist/preview/markdown-preview.svelte +11 -0
  76. package/dist/preview/markdown-preview.svelte.d.ts.map +1 -1
  77. package/dist/preview/renderer/utils.js +0 -2
  78. package/dist/preview/styles/inline-links.css +38 -0
  79. package/dist/preview/styles/links-embeds-tags.css +2 -2
  80. package/dist/preview/styles/mermaid-highlight.css +4 -3
  81. package/dist/preview/styles/references.css +72 -0
  82. package/dist/preview/styles.css +2 -0
  83. package/dist/tables/editor-column.svelte +20 -7
  84. package/dist/tables/editor-column.svelte.d.ts +2 -0
  85. package/dist/tables/editor-column.svelte.d.ts.map +1 -1
  86. package/dist/tables/editor-table.svelte +4 -0
  87. package/dist/tables/editor-table.svelte.d.ts +2 -0
  88. package/dist/tables/editor-table.svelte.d.ts.map +1 -1
  89. package/dist/tables/grid-editor-column.svelte +6 -2
  90. package/dist/tables/grid-editor-column.svelte.d.ts +2 -0
  91. package/dist/tables/grid-editor-column.svelte.d.ts.map +1 -1
  92. package/dist/tables/grid-editor-table.svelte +4 -0
  93. package/dist/tables/grid-editor-table.svelte.d.ts +2 -0
  94. package/dist/tables/grid-editor-table.svelte.d.ts.map +1 -1
  95. package/dist/tables/index.d.ts +1 -0
  96. package/dist/tables/index.d.ts.map +1 -1
  97. package/dist/tables/index.js +1 -0
  98. package/dist/tables/markdown-table-data-cell.svelte +4 -0
  99. package/dist/tables/markdown-table-data-cell.svelte.d.ts +2 -0
  100. package/dist/tables/markdown-table-data-cell.svelte.d.ts.map +1 -1
  101. package/dist/tables/table-reader.svelte +101 -0
  102. package/dist/tables/table-reader.svelte.d.ts +21 -0
  103. package/dist/tables/table-reader.svelte.d.ts.map +1 -0
  104. package/dist/tables/types.d.ts +2 -0
  105. package/dist/tables/types.d.ts.map +1 -1
  106. package/dist/tables/widgets/grid-table-widget.d.ts +1 -1
  107. package/dist/tables/widgets/grid-table-widget.d.ts.map +1 -1
  108. package/dist/tables/widgets/grid-table-widget.js +5 -2
  109. package/dist/tables/widgets/lifecycle.d.ts +4 -0
  110. package/dist/tables/widgets/lifecycle.d.ts.map +1 -0
  111. package/dist/tables/widgets/lifecycle.js +13 -0
  112. package/dist/tables/widgets/pipe-table-widget.d.ts +1 -1
  113. package/dist/tables/widgets/pipe-table-widget.d.ts.map +1 -1
  114. package/dist/tables/widgets/pipe-table-widget.js +5 -2
  115. package/dist/ui/context-menu/context-menu-radio-group.svelte.d.ts +1 -1
  116. package/dist/ui/dropdown-menu/dropdown-menu-radio-group.svelte.d.ts +1 -1
  117. package/dist/ui/toolbar/toolbar-group.svelte.d.ts +1 -1
  118. package/inline-links-NOTICE.md +31 -0
  119. package/package.json +6 -2
  120. package/dist/core/code-mirror.test.d.ts +0 -2
  121. package/dist/core/code-mirror.test.d.ts.map +0 -1
  122. package/dist/core/code-mirror.test.js +0 -68
  123. package/dist/core/images.test.d.ts +0 -2
  124. package/dist/core/images.test.d.ts.map +0 -1
  125. package/dist/core/images.test.js +0 -109
  126. package/dist/core/index.test.d.ts +0 -2
  127. package/dist/core/index.test.d.ts.map +0 -1
  128. package/dist/core/index.test.js +0 -11
  129. package/dist/core/markdown-actions.test.d.ts +0 -2
  130. package/dist/core/markdown-actions.test.d.ts.map +0 -1
  131. package/dist/core/markdown-actions.test.js +0 -182
  132. package/dist/extensions/doodle-dividers.test.d.ts +0 -2
  133. package/dist/extensions/doodle-dividers.test.d.ts.map +0 -1
  134. package/dist/extensions/doodle-dividers.test.js +0 -296
  135. package/dist/extensions/index.test.d.ts +0 -2
  136. package/dist/extensions/index.test.d.ts.map +0 -1
  137. package/dist/extensions/index.test.js +0 -283
  138. package/dist/index.test.d.ts +0 -2
  139. package/dist/index.test.d.ts.map +0 -1
  140. package/dist/index.test.js +0 -64
  141. package/dist/internal/appearance-context.test.d.ts +0 -2
  142. package/dist/internal/appearance-context.test.d.ts.map +0 -1
  143. package/dist/internal/appearance-context.test.js +0 -31
  144. package/dist/internal/codemirror/base/index.test.d.ts +0 -2
  145. package/dist/internal/codemirror/base/index.test.d.ts.map +0 -1
  146. package/dist/internal/codemirror/base/index.test.js +0 -303
  147. package/dist/internal/codemirror/base/search.test.d.ts +0 -2
  148. package/dist/internal/codemirror/base/search.test.d.ts.map +0 -1
  149. package/dist/internal/codemirror/base/search.test.js +0 -155
  150. package/dist/internal/codemirror/base/selection-toolbar.test.d.ts +0 -2
  151. package/dist/internal/codemirror/base/selection-toolbar.test.d.ts.map +0 -1
  152. package/dist/internal/codemirror/base/selection-toolbar.test.js +0 -149
  153. package/dist/internal/codemirror/markdown/authoring.test.d.ts +0 -2
  154. package/dist/internal/codemirror/markdown/authoring.test.d.ts.map +0 -1
  155. package/dist/internal/codemirror/markdown/authoring.test.js +0 -222
  156. package/dist/internal/codemirror/markdown/index.test.d.ts +0 -2
  157. package/dist/internal/codemirror/markdown/index.test.d.ts.map +0 -1
  158. package/dist/internal/codemirror/markdown/index.test.js +0 -158
  159. package/dist/internal/codemirror/markdown/showcase-fixture.test.d.ts +0 -2
  160. package/dist/internal/codemirror/markdown/showcase-fixture.test.d.ts.map +0 -1
  161. package/dist/internal/codemirror/markdown/showcase-fixture.test.js +0 -50
  162. package/dist/internal/codemirror/rich/block-controls.test.d.ts +0 -2
  163. package/dist/internal/codemirror/rich/block-controls.test.d.ts.map +0 -1
  164. package/dist/internal/codemirror/rich/block-controls.test.js +0 -401
  165. package/dist/internal/codemirror/rich/block-ranges.test.d.ts +0 -2
  166. package/dist/internal/codemirror/rich/block-ranges.test.d.ts.map +0 -1
  167. package/dist/internal/codemirror/rich/block-ranges.test.js +0 -310
  168. package/dist/internal/codemirror/rich/block-toolbar.test.d.ts +0 -2
  169. package/dist/internal/codemirror/rich/block-toolbar.test.d.ts.map +0 -1
  170. package/dist/internal/codemirror/rich/block-toolbar.test.js +0 -178
  171. package/dist/internal/codemirror/rich/decorations/fold-indicators.test.d.ts +0 -2
  172. package/dist/internal/codemirror/rich/decorations/fold-indicators.test.d.ts.map +0 -1
  173. package/dist/internal/codemirror/rich/decorations/fold-indicators.test.js +0 -8
  174. package/dist/internal/codemirror/rich/index.test.d.ts +0 -2
  175. package/dist/internal/codemirror/rich/index.test.d.ts.map +0 -1
  176. package/dist/internal/codemirror/rich/index.test.js +0 -607
  177. package/dist/internal/codemirror/rich/utils/code-block-lines.test.d.ts +0 -2
  178. package/dist/internal/codemirror/rich/utils/code-block-lines.test.d.ts.map +0 -1
  179. package/dist/internal/codemirror/rich/utils/code-block-lines.test.js +0 -82
  180. package/dist/internal/codemirror/rich/utils/fenced-code.test.d.ts +0 -2
  181. package/dist/internal/codemirror/rich/utils/fenced-code.test.d.ts.map +0 -1
  182. package/dist/internal/codemirror/rich/utils/fenced-code.test.js +0 -12
  183. package/dist/internal/codemirror/rich/utils/headings.test.d.ts +0 -2
  184. package/dist/internal/codemirror/rich/utils/headings.test.d.ts.map +0 -1
  185. package/dist/internal/codemirror/rich/utils/headings.test.js +0 -27
  186. package/dist/internal/codemirror/rich/utils/height-estimates.test.d.ts +0 -2
  187. package/dist/internal/codemirror/rich/utils/height-estimates.test.d.ts.map +0 -1
  188. package/dist/internal/codemirror/rich/utils/height-estimates.test.js +0 -10
  189. package/dist/internal/codemirror/rich/utils/images.test.d.ts +0 -2
  190. package/dist/internal/codemirror/rich/utils/images.test.d.ts.map +0 -1
  191. package/dist/internal/codemirror/rich/utils/images.test.js +0 -37
  192. package/dist/internal/codemirror/rich/utils/indent.test.d.ts +0 -2
  193. package/dist/internal/codemirror/rich/utils/indent.test.d.ts.map +0 -1
  194. package/dist/internal/codemirror/rich/utils/indent.test.js +0 -169
  195. package/dist/internal/codemirror/rich/utils/inline-math.test.d.ts +0 -2
  196. package/dist/internal/codemirror/rich/utils/inline-math.test.d.ts.map +0 -1
  197. package/dist/internal/codemirror/rich/utils/inline-math.test.js +0 -15
  198. package/dist/internal/codemirror/rich/utils/links.test.d.ts +0 -2
  199. package/dist/internal/codemirror/rich/utils/links.test.d.ts.map +0 -1
  200. package/dist/internal/codemirror/rich/utils/links.test.js +0 -28
  201. package/dist/internal/codemirror/rich/utils/list-callouts.test.d.ts +0 -2
  202. package/dist/internal/codemirror/rich/utils/list-callouts.test.d.ts.map +0 -1
  203. package/dist/internal/codemirror/rich/utils/list-callouts.test.js +0 -47
  204. package/dist/internal/codemirror/rich/utils/measured-indent.test.d.ts +0 -2
  205. package/dist/internal/codemirror/rich/utils/measured-indent.test.d.ts.map +0 -1
  206. package/dist/internal/codemirror/rich/utils/measured-indent.test.js +0 -102
  207. package/dist/internal/codemirror/rich/utils/ranges.test.d.ts +0 -2
  208. package/dist/internal/codemirror/rich/utils/ranges.test.d.ts.map +0 -1
  209. package/dist/internal/codemirror/rich/utils/ranges.test.js +0 -22
  210. package/dist/internal/codemirror/rich/utils/tasks.test.d.ts +0 -2
  211. package/dist/internal/codemirror/rich/utils/tasks.test.d.ts.map +0 -1
  212. package/dist/internal/codemirror/rich/utils/tasks.test.js +0 -57
  213. package/dist/internal/task-states.test.d.ts +0 -2
  214. package/dist/internal/task-states.test.d.ts.map +0 -1
  215. package/dist/internal/task-states.test.js +0 -36
  216. package/dist/mira-code-editor.test.d.ts +0 -2
  217. package/dist/mira-code-editor.test.d.ts.map +0 -1
  218. package/dist/mira-code-editor.test.js +0 -93
  219. package/dist/mode-position.test.d.ts +0 -2
  220. package/dist/mode-position.test.d.ts.map +0 -1
  221. package/dist/mode-position.test.js +0 -60
  222. package/dist/preview/code-language.test.d.ts +0 -2
  223. package/dist/preview/code-language.test.d.ts.map +0 -1
  224. package/dist/preview/code-language.test.js +0 -12
  225. package/dist/preview/components/icon.test.d.ts +0 -2
  226. package/dist/preview/components/icon.test.d.ts.map +0 -1
  227. package/dist/preview/components/icon.test.js +0 -20
  228. package/dist/preview/editable-markdown-preview/behavior.test.d.ts +0 -2
  229. package/dist/preview/editable-markdown-preview/behavior.test.d.ts.map +0 -1
  230. package/dist/preview/editable-markdown-preview/behavior.test.js +0 -36
  231. package/dist/preview/editable-markdown-preview/serialized-writer.test.d.ts +0 -2
  232. package/dist/preview/editable-markdown-preview/serialized-writer.test.d.ts.map +0 -1
  233. package/dist/preview/editable-markdown-preview/serialized-writer.test.js +0 -59
  234. package/dist/preview/embed-target.test.d.ts +0 -2
  235. package/dist/preview/embed-target.test.d.ts.map +0 -1
  236. package/dist/preview/embed-target.test.js +0 -78
  237. package/dist/preview/frontmatter/frontmatter.test.d.ts +0 -2
  238. package/dist/preview/frontmatter/frontmatter.test.d.ts.map +0 -1
  239. package/dist/preview/frontmatter/frontmatter.test.js +0 -190
  240. package/dist/preview/frontmatter/suggestions.test.d.ts +0 -2
  241. package/dist/preview/frontmatter/suggestions.test.d.ts.map +0 -1
  242. package/dist/preview/frontmatter/suggestions.test.js +0 -45
  243. package/dist/preview/outline.test.d.ts +0 -2
  244. package/dist/preview/outline.test.d.ts.map +0 -1
  245. package/dist/preview/outline.test.js +0 -98
  246. package/dist/preview/portable-surfaces.test.d.ts +0 -2
  247. package/dist/preview/portable-surfaces.test.d.ts.map +0 -1
  248. package/dist/preview/portable-surfaces.test.js +0 -513
  249. package/dist/preview/preview.test.d.ts +0 -2
  250. package/dist/preview/preview.test.d.ts.map +0 -1
  251. package/dist/preview/preview.test.js +0 -154
  252. package/dist/preview/remark/callouts.test.d.ts +0 -2
  253. package/dist/preview/remark/callouts.test.d.ts.map +0 -1
  254. package/dist/preview/remark/callouts.test.js +0 -23
  255. package/dist/preview/remark/custom-checklists.test.d.ts +0 -2
  256. package/dist/preview/remark/custom-checklists.test.d.ts.map +0 -1
  257. package/dist/preview/remark/custom-checklists.test.js +0 -51
  258. package/dist/preview/remark/links.test.d.ts +0 -2
  259. package/dist/preview/remark/links.test.d.ts.map +0 -1
  260. package/dist/preview/remark/links.test.js +0 -62
  261. package/dist/preview/remark/parity.test.d.ts +0 -2
  262. package/dist/preview/remark/parity.test.d.ts.map +0 -1
  263. package/dist/preview/remark/parity.test.js +0 -105
  264. package/dist/preview/styles/frontmatter-properties.test.d.ts +0 -2
  265. package/dist/preview/styles/frontmatter-properties.test.d.ts.map +0 -1
  266. package/dist/preview/styles/frontmatter-properties.test.js +0 -57
  267. package/dist/preview/styles/source-mode.test.d.ts +0 -2
  268. package/dist/preview/styles/source-mode.test.d.ts.map +0 -1
  269. package/dist/preview/styles/source-mode.test.js +0 -28
  270. package/dist/tables/extension.test.d.ts +0 -2
  271. package/dist/tables/extension.test.d.ts.map +0 -1
  272. package/dist/tables/extension.test.js +0 -100
  273. package/dist/tables/grid-editor-column.test.d.ts +0 -2
  274. package/dist/tables/grid-editor-column.test.d.ts.map +0 -1
  275. package/dist/tables/grid-editor-column.test.js +0 -27
  276. package/dist/tables/grid-table.test.d.ts +0 -2
  277. package/dist/tables/grid-table.test.d.ts.map +0 -1
  278. package/dist/tables/grid-table.test.js +0 -140
  279. package/dist/tables/index.test.d.ts +0 -2
  280. package/dist/tables/index.test.d.ts.map +0 -1
  281. package/dist/tables/index.test.js +0 -7
  282. package/dist/tables/inline-editor-extensions.test.d.ts +0 -2
  283. package/dist/tables/inline-editor-extensions.test.d.ts.map +0 -1
  284. package/dist/tables/inline-editor-extensions.test.js +0 -23
  285. package/dist/tables/pipe-table.test.d.ts +0 -2
  286. package/dist/tables/pipe-table.test.d.ts.map +0 -1
  287. package/dist/tables/pipe-table.test.js +0 -13
  288. package/dist/tables/table-node.test.d.ts +0 -2
  289. package/dist/tables/table-node.test.d.ts.map +0 -1
  290. package/dist/tables/table-node.test.js +0 -167
  291. package/dist/tables/widgets/source-button.test.d.ts +0 -2
  292. package/dist/tables/widgets/source-button.test.d.ts.map +0 -1
  293. package/dist/tables/widgets/source-button.test.js +0 -11
  294. package/dist/themes/theme-contract.test.d.ts +0 -2
  295. package/dist/themes/theme-contract.test.d.ts.map +0 -1
  296. package/dist/themes/theme-contract.test.js +0 -88
  297. package/dist/ui/index.test.d.ts +0 -2
  298. package/dist/ui/index.test.d.ts.map +0 -1
  299. package/dist/ui/index.test.js +0 -7
  300. package/dist/ui/styles.test.d.ts +0 -2
  301. package/dist/ui/styles.test.d.ts.map +0 -1
  302. package/dist/ui/styles.test.js +0 -26
  303. package/dist/ui/table-dnd/table-dnd-utils.test.d.ts +0 -2
  304. package/dist/ui/table-dnd/table-dnd-utils.test.d.ts.map +0 -1
  305. package/dist/ui/table-dnd/table-dnd-utils.test.js +0 -46
@@ -1,401 +0,0 @@
1
- import { EditorView } from "@codemirror/view";
2
- import { EditorState } from "@codemirror/state";
3
- import { describe, expect, it, vi } from "vitest";
4
- import { createRichEditorExtensions } from ".";
5
- function nextFrame() {
6
- return new Promise((resolve) => requestAnimationFrame(() => resolve()));
7
- }
8
- describe("block controls", () => {
9
- it("renders block handles in a dedicated gutter", async () => {
10
- const parent = document.createElement("div");
11
- document.body.append(parent);
12
- const view = new EditorView({
13
- doc: "Alpha\n\nBeta",
14
- extensions: [
15
- createRichEditorExtensions({
16
- blockControls: true,
17
- livePreview: false,
18
- }),
19
- ],
20
- parent,
21
- });
22
- await nextFrame();
23
- const blockGutter = parent.querySelector(".mira-block-controls-gutter");
24
- expect(blockGutter).not.toBeNull();
25
- expect(blockGutter?.querySelector(".mira-block-handle")).not.toBeNull();
26
- expect(parent.querySelector(".cm-lineNumbers .mira-block-handle")).toBeNull();
27
- view.destroy();
28
- parent.remove();
29
- });
30
- it("pins block handles to the first line and matches line-number band", async () => {
31
- const parent = document.createElement("div");
32
- document.body.append(parent);
33
- const view = new EditorView({
34
- doc: "Alpha\n\nBeta",
35
- extensions: [
36
- createRichEditorExtensions({
37
- blockControls: true,
38
- livePreview: false,
39
- }),
40
- ],
41
- parent,
42
- });
43
- await nextFrame();
44
- const gutterElement = parent.querySelector(".mira-block-controls-gutter .cm-gutterElement");
45
- const handle = parent.querySelector(".mira-block-handle");
46
- expect(gutterElement).not.toBeNull();
47
- expect(handle).not.toBeNull();
48
- expect(getComputedStyle(gutterElement).alignItems).toBe("flex-start");
49
- expect(handle.classList.contains("mira-block-handle")).toBe(true);
50
- view.destroy();
51
- parent.remove();
52
- });
53
- it("renders the contextual toolbar only when explicitly enabled", async () => {
54
- const legacyParent = document.createElement("div");
55
- document.body.append(legacyParent);
56
- const legacyView = new EditorView({
57
- doc: "Paragraph",
58
- extensions: [
59
- createRichEditorExtensions({
60
- blockControls: true,
61
- livePreview: false,
62
- }),
63
- ],
64
- parent: legacyParent,
65
- });
66
- await nextFrame();
67
- expect(legacyParent.querySelector(".mira-block-toolbar-trigger")).toBeNull();
68
- legacyView.destroy();
69
- legacyParent.remove();
70
- const parent = document.createElement("div");
71
- document.body.append(parent);
72
- const view = new EditorView({
73
- doc: "Paragraph",
74
- extensions: [
75
- createRichEditorExtensions({
76
- blockControls: { toolbar: true },
77
- livePreview: false,
78
- }),
79
- ],
80
- parent,
81
- });
82
- await nextFrame();
83
- expect(view.dom.classList.contains("mira-block-toolbar-enabled")).toBe(true);
84
- expect(parent
85
- .querySelector(".mira-block-toolbar-trigger")
86
- ?.getAttribute("aria-label")).toBe("Change Paragraph");
87
- expect(getComputedStyle(parent.querySelector(".mira-block-controls-gutter")).width).toBe("2.375rem");
88
- expect(getComputedStyle(parent.querySelector(".cm-gutters"))
89
- .marginInlineEnd).toBe("1.75rem");
90
- expect(getComputedStyle(parent.querySelector(".mira-block-toolbar-trigger")).width).toBe("1.25rem");
91
- view.destroy();
92
- parent.remove();
93
- });
94
- it("opens the contextual menu and converts the active block", async () => {
95
- const parent = document.createElement("div");
96
- document.body.append(parent);
97
- const view = new EditorView({
98
- doc: "# Heading",
99
- extensions: [
100
- createRichEditorExtensions({
101
- blockControls: { toolbar: true },
102
- livePreview: false,
103
- }),
104
- ],
105
- parent,
106
- });
107
- await nextFrame();
108
- parent
109
- .querySelector(".mira-block-toolbar-trigger")
110
- .click();
111
- await nextFrame();
112
- const menu = document.body.querySelector(".mira-block-toolbar-menu");
113
- expect(menu?.hidden).toBe(false);
114
- expect(menu?.getAttribute("role")).toBe("menu");
115
- expect(menu?.parentElement?.classList.contains("mira-block-toolbar-portal")).toBe(true);
116
- const portal = menu?.parentElement;
117
- expect(portal.classList.contains("mira")).toBe(false);
118
- expect(portal.style.getPropertyValue("position")).toBe("fixed");
119
- expect(portal.style.getPropertyPriority("position")).toBe("important");
120
- expect(portal.style.height).toBe("0px");
121
- expect(portal.style.minHeight).toBe("0px");
122
- expect(portal.style.width).toBe("0px");
123
- expect(portal.style.overflow).toBe("visible");
124
- expect(menu
125
- ?.querySelector('[data-block-toolbar-item="heading1"]')
126
- ?.getAttribute("aria-checked")).toBe("true");
127
- menu
128
- ?.querySelector('[data-block-toolbar-item="heading2"]')
129
- ?.click();
130
- expect(view.state.doc.toString()).toBe("## Heading");
131
- expect(menu?.hidden).toBe(true);
132
- view.destroy();
133
- expect(document.body.contains(menu)).toBe(false);
134
- expect(document.body.contains(portal)).toBe(false);
135
- parent.remove();
136
- });
137
- it("hides the contextual trigger for readonly editors", async () => {
138
- const parent = document.createElement("div");
139
- document.body.append(parent);
140
- const view = new EditorView({
141
- doc: "Paragraph",
142
- extensions: [
143
- EditorState.readOnly.of(true),
144
- createRichEditorExtensions({
145
- blockControls: { toolbar: true },
146
- livePreview: false,
147
- }),
148
- ],
149
- parent,
150
- });
151
- await nextFrame();
152
- expect(parent.querySelector(".mira-block-toolbar-trigger")).toBeNull();
153
- view.destroy();
154
- parent.remove();
155
- });
156
- it("hides contextual triggers for multi-block selections", async () => {
157
- const parent = document.createElement("div");
158
- document.body.append(parent);
159
- const view = new EditorView({
160
- doc: "Alpha\n\nBeta",
161
- extensions: [
162
- createRichEditorExtensions({
163
- blockControls: { toolbar: true },
164
- livePreview: false,
165
- }),
166
- ],
167
- parent,
168
- });
169
- await nextFrame();
170
- expect(parent.querySelectorAll(".mira-block-toolbar-trigger")).toHaveLength(2);
171
- view.dispatch({
172
- selection: { anchor: 0, head: view.state.doc.length },
173
- });
174
- await nextFrame();
175
- expect(parent.querySelector(".mira-block-toolbar-trigger")).toBeNull();
176
- view.destroy();
177
- parent.remove();
178
- });
179
- it("shows explicitly placed block actions without moving the selection", async () => {
180
- const parent = document.createElement("div");
181
- document.body.append(parent);
182
- let activeBlock = "";
183
- const cleanupIcon = vi.fn();
184
- const view = new EditorView({
185
- doc: "Alpha\n\nBeta",
186
- selection: { anchor: 8 },
187
- extensions: [
188
- createRichEditorExtensions({
189
- blockControls: { toolbar: true },
190
- blockActions: [
191
- {
192
- id: "talk",
193
- label: "Talk",
194
- icon: "sparkles",
195
- placements: ["block-menu"],
196
- renderIcon(target) {
197
- target.dataset.frameworkIcon = "mounted";
198
- return cleanupIcon;
199
- },
200
- run(context) {
201
- activeBlock = context.block.text;
202
- },
203
- },
204
- ],
205
- livePreview: false,
206
- }),
207
- ],
208
- parent,
209
- });
210
- await nextFrame();
211
- parent
212
- .querySelector('[data-mira-block-id="line-1"] + .mira-block-toolbar-trigger')
213
- ?.click();
214
- await nextFrame();
215
- expect(document.body.querySelector('[data-framework-icon="mounted"]')).not.toBeNull();
216
- document.body
217
- .querySelector('[data-block-toolbar-item="talk"]')
218
- ?.click();
219
- expect(activeBlock).toBe("Alpha");
220
- expect(view.state.selection.main.head).toBe(8);
221
- expect(parent.querySelector(".mira-block-menu")?.textContent).not.toContain("Talk");
222
- expect(cleanupIcon).toHaveBeenCalledOnce();
223
- view.destroy();
224
- parent.remove();
225
- });
226
- it("supports keyboard navigation and returns focus on Escape", async () => {
227
- const parent = document.createElement("div");
228
- document.body.append(parent);
229
- const view = new EditorView({
230
- doc: "Paragraph",
231
- extensions: [
232
- createRichEditorExtensions({
233
- blockControls: { toolbar: true },
234
- livePreview: false,
235
- }),
236
- ],
237
- parent,
238
- });
239
- await nextFrame();
240
- const trigger = parent.querySelector(".mira-block-toolbar-trigger");
241
- trigger.dispatchEvent(new KeyboardEvent("keydown", {
242
- bubbles: true,
243
- cancelable: true,
244
- key: "ArrowDown",
245
- }));
246
- await nextFrame();
247
- const menu = document.body.querySelector(".mira-block-toolbar-menu");
248
- const first = menu.querySelector(".mira-block-toolbar-menu__item:not(:disabled)");
249
- expect(menu.hidden).toBe(false);
250
- expect(menu.contains(document.activeElement)).toBe(true);
251
- first.dispatchEvent(new KeyboardEvent("keydown", {
252
- bubbles: true,
253
- cancelable: true,
254
- key: "End",
255
- }));
256
- expect(document.activeElement).toBe(Array.from(menu.querySelectorAll(".mira-block-toolbar-menu__item:not(:disabled)")).at(-1));
257
- document.activeElement?.dispatchEvent(new KeyboardEvent("keydown", {
258
- bubbles: true,
259
- cancelable: true,
260
- key: "Escape",
261
- }));
262
- expect(menu.hidden).toBe(true);
263
- expect(document.activeElement).toBe(parent.querySelector(".mira-block-toolbar-trigger"));
264
- view.destroy();
265
- parent.remove();
266
- });
267
- it("keeps the active block handle visible without hover", async () => {
268
- const parent = document.createElement("div");
269
- document.body.append(parent);
270
- const view = new EditorView({
271
- doc: "Alpha\ncontinues\n\nBeta",
272
- extensions: [
273
- createRichEditorExtensions({
274
- blockControls: true,
275
- livePreview: false,
276
- }),
277
- ],
278
- parent,
279
- });
280
- await nextFrame();
281
- const firstHandle = () => parent.querySelector('[data-mira-block-id="line-1"]');
282
- const secondHandle = () => parent.querySelector('[data-mira-block-id="line-4"]');
283
- expect(firstHandle()?.classList.contains("mira-block-handle--active")).toBe(true);
284
- expect(secondHandle()?.classList.contains("mira-block-handle--active")).toBe(false);
285
- view.dispatch({
286
- selection: { anchor: view.state.doc.line(4).from },
287
- });
288
- await nextFrame();
289
- expect(firstHandle()?.classList.contains("mira-block-handle--active")).toBe(false);
290
- expect(secondHandle()?.classList.contains("mira-block-handle--active")).toBe(true);
291
- view.dispatch({
292
- selection: {
293
- anchor: view.state.doc.line(1).from,
294
- head: view.state.doc.line(4).to,
295
- },
296
- });
297
- await nextFrame();
298
- expect(firstHandle()?.classList.contains("mira-block-handle--active")).toBe(true);
299
- expect(secondHandle()?.classList.contains("mira-block-handle--active")).toBe(true);
300
- view.destroy();
301
- parent.remove();
302
- });
303
- it("renders one handle for each list item", async () => {
304
- const parent = document.createElement("div");
305
- document.body.append(parent);
306
- const view = new EditorView({
307
- doc: "- parent\n - child\n- sibling",
308
- extensions: [
309
- createRichEditorExtensions({
310
- blockControls: true,
311
- livePreview: false,
312
- }),
313
- ],
314
- parent,
315
- });
316
- await nextFrame();
317
- const handles = Array.from(parent.querySelectorAll(".mira-block-handle")).map((handle) => handle.dataset.miraBlockId);
318
- expect(handles).toEqual(["list-item-1", "list-item-2", "list-item-3"]);
319
- expect(parent.querySelector('[data-mira-block-id="line-1"]')).toBeNull();
320
- view.destroy();
321
- parent.remove();
322
- });
323
- it("left-clicks a handle to highlight the affected range without selecting text", async () => {
324
- const parent = document.createElement("div");
325
- document.body.append(parent);
326
- const view = new EditorView({
327
- doc: "# One\n\nBody\n\n# Two",
328
- extensions: [
329
- createRichEditorExtensions({
330
- blockControls: true,
331
- livePreview: false,
332
- }),
333
- ],
334
- parent,
335
- });
336
- await nextFrame();
337
- const handle = parent.querySelector('[data-mira-block-id="line-1"]');
338
- handle.dispatchEvent(new MouseEvent("click", { bubbles: true, cancelable: true }));
339
- await nextFrame();
340
- expect(view.state.selection.main.empty).toBe(true);
341
- expect(parent.querySelector(".mira-block-menu[hidden]")).not.toBeNull();
342
- expect(parent.querySelectorAll(".mira-block-affected-line")).toHaveLength(3);
343
- expect(parent
344
- .querySelector('[data-mira-block-id="line-1"]')
345
- ?.classList.contains("mira-block-handle--selected")).toBe(true);
346
- view.destroy();
347
- parent.remove();
348
- });
349
- it("opens block actions from the handle context menu", async () => {
350
- const parent = document.createElement("div");
351
- document.body.append(parent);
352
- const view = new EditorView({
353
- doc: "Alpha\n\nBeta",
354
- extensions: [
355
- createRichEditorExtensions({
356
- blockControls: true,
357
- livePreview: false,
358
- }),
359
- ],
360
- parent,
361
- });
362
- await nextFrame();
363
- const handle = parent.querySelector('[data-mira-block-id="line-1"]');
364
- handle.dispatchEvent(new MouseEvent("contextmenu", { bubbles: true, cancelable: true }));
365
- await nextFrame();
366
- const menu = parent.querySelector(".mira-block-menu");
367
- expect(menu?.hasAttribute("hidden")).toBe(false);
368
- expect(menu?.textContent).toContain("Duplicate");
369
- expect(parent.querySelectorAll(".mira-block-affected-line")).toHaveLength(1);
370
- view.destroy();
371
- parent.remove();
372
- });
373
- it("opens block actions from the keyboard context-menu shortcut", async () => {
374
- const parent = document.createElement("div");
375
- document.body.append(parent);
376
- const view = new EditorView({
377
- doc: "Alpha\n\nBeta",
378
- extensions: [
379
- createRichEditorExtensions({
380
- blockControls: true,
381
- livePreview: false,
382
- }),
383
- ],
384
- parent,
385
- });
386
- await nextFrame();
387
- const handle = parent.querySelector('[data-mira-block-id="line-1"]');
388
- handle.dispatchEvent(new KeyboardEvent("keydown", {
389
- bubbles: true,
390
- cancelable: true,
391
- key: "F10",
392
- shiftKey: true,
393
- }));
394
- await nextFrame();
395
- const menu = parent.querySelector(".mira-block-menu");
396
- expect(menu?.hasAttribute("hidden")).toBe(false);
397
- expect(menu?.textContent).toContain("Delete");
398
- view.destroy();
399
- parent.remove();
400
- });
401
- });
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=block-ranges.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"block-ranges.test.d.ts","sourceRoot":"","sources":["../../../../src/internal/codemirror/rich/block-ranges.test.ts"],"names":[],"mappings":""}