@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,10 +1,5 @@
1
- export type SerializedMarkdownWriterState = {
2
- dirty: boolean;
3
- saving: boolean;
4
- error: Error | null;
5
- value: string;
6
- persistedValue: string;
7
- };
1
+ import type { MiraMarkdownRecoveryLease, MiraMarkdownTextState } from "../../extensions/markdown-editing";
2
+ export type SerializedMarkdownWriterState = MiraMarkdownTextState;
8
3
  type Options = {
9
4
  value: string;
10
5
  write: (value: string) => void | Promise<void>;
@@ -20,10 +15,17 @@ export declare class SerializedMarkdownWriter {
20
15
  private value;
21
16
  private persistedValue;
22
17
  private saving;
18
+ private protections;
19
+ private recoveries;
20
+ private readonly listeners;
21
+ private destroyed;
23
22
  private error;
24
23
  constructor(options: Options);
25
24
  get state(): SerializedMarkdownWriterState;
26
- update(value: string): void;
25
+ update(value: string): boolean;
26
+ subscribe(listener: (state: SerializedMarkdownWriterState) => void): () => void;
27
+ protectRecovery(): Promise<MiraMarkdownRecoveryLease>;
28
+ protect(): Promise<() => void>;
27
29
  replaceExternal(value: string): boolean;
28
30
  flush(): Promise<boolean>;
29
31
  destroy(): void;
@@ -1 +1 @@
1
- {"version":3,"file":"serialized-writer.d.ts","sourceRoot":"","sources":["../../../src/preview/editable-markdown-preview/serialized-writer.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,6BAA6B,GAAG;IAC1C,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,OAAO,CAAC;IAChB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,cAAc,EAAE,MAAM,CAAC;CACxB,CAAC;AAEF,KAAK,OAAO,GAAG;IACb,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,6BAA6B,KAAK,IAAI,CAAC;CAChE,CAAC;AAEF,qBAAa,wBAAwB;IACnC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAmB;IAEzC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;IAE/B,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC,CAA2B;IAE1D,OAAO,CAAC,KAAK,CAA8C;IAE3D,OAAO,CAAC,YAAY,CAAiC;IAErD,OAAO,CAAC,KAAK,CAAS;IAEtB,OAAO,CAAC,cAAc,CAAS;IAE/B,OAAO,CAAC,MAAM,CAAS;IAEvB,OAAO,CAAC,KAAK,CAAsB;gBAEvB,OAAO,EAAE,OAAO;IAS5B,IAAI,KAAK,IAAI,6BAA6B,CAQzC;IAED,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAO3B,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAYjC,KAAK,IAAI,OAAO,CAAC,OAAO,CAAC;IAkB/B,OAAO,IAAI,IAAI;IAOf,OAAO,CAAC,QAAQ;YAYF,WAAW;IA0BzB,OAAO,CAAC,UAAU;IAOlB,OAAO,CAAC,IAAI;CAGb"}
1
+ {"version":3,"file":"serialized-writer.d.ts","sourceRoot":"","sources":["../../../src/preview/editable-markdown-preview/serialized-writer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,yBAAyB,EACzB,qBAAqB,EACtB,MAAM,mCAAmC,CAAC;AAC3C,MAAM,MAAM,6BAA6B,GAAG,qBAAqB,CAAC;AAElE,KAAK,OAAO,GAAG;IACb,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,6BAA6B,KAAK,IAAI,CAAC;CAChE,CAAC;AAEF,qBAAa,wBAAwB;IACnC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAmB;IAEzC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;IAE/B,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC,CAA2B;IAE1D,OAAO,CAAC,KAAK,CAA8C;IAE3D,OAAO,CAAC,YAAY,CAAiC;IAErD,OAAO,CAAC,KAAK,CAAS;IAEtB,OAAO,CAAC,cAAc,CAAS;IAE/B,OAAO,CAAC,MAAM,CAAS;IAEvB,OAAO,CAAC,WAAW,CAAK;IACxB,OAAO,CAAC,UAAU,CAAK;IACvB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAEtB;IAEJ,OAAO,CAAC,SAAS,CAAS;IAE1B,OAAO,CAAC,KAAK,CAAsB;gBAEvB,OAAO,EAAE,OAAO;IAS5B,IAAI,KAAK,IAAI,6BAA6B,CASzC;IAED,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAQ9B,SAAS,CACP,QAAQ,EAAE,CAAC,KAAK,EAAE,6BAA6B,KAAK,IAAI,GACvD,MAAM,IAAI;IAQP,eAAe,IAAI,OAAO,CAAC,yBAAyB,CAAC;IA2CrD,OAAO,IAAI,OAAO,CAAC,MAAM,IAAI,CAAC;IAoBpC,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAiBjC,KAAK,IAAI,OAAO,CAAC,OAAO,CAAC;IA0B/B,OAAO,IAAI,IAAI;IASf,OAAO,CAAC,QAAQ;YAYF,WAAW;IA2BzB,OAAO,CAAC,UAAU;IAOlB,OAAO,CAAC,IAAI;CAIb"}
@@ -7,6 +7,10 @@ export class SerializedMarkdownWriter {
7
7
  value;
8
8
  persistedValue;
9
9
  saving = false;
10
+ protections = 0;
11
+ recoveries = 0;
12
+ listeners = new Set();
13
+ destroyed = false;
10
14
  error = null;
11
15
  constructor(options) {
12
16
  this.value = options.value;
@@ -18,6 +22,7 @@ export class SerializedMarkdownWriter {
18
22
  }
19
23
  get state() {
20
24
  return {
25
+ readonly: this.protections > 0 || this.destroyed,
21
26
  dirty: this.value !== this.persistedValue,
22
27
  saving: this.saving,
23
28
  error: this.error,
@@ -26,13 +31,92 @@ export class SerializedMarkdownWriter {
26
31
  };
27
32
  }
28
33
  update(value) {
34
+ if (this.protections > 0 || this.destroyed)
35
+ return false;
29
36
  this.value = value;
30
- this.error = null;
31
37
  this.schedule();
32
38
  this.emit();
39
+ return true;
40
+ }
41
+ subscribe(listener) {
42
+ this.listeners.add(listener);
43
+ listener(this.state);
44
+ return () => {
45
+ this.listeners.delete(listener);
46
+ };
47
+ }
48
+ async protectRecovery() {
49
+ this.protections++;
50
+ this.recoveries++;
51
+ let active = true;
52
+ const release = () => {
53
+ if (!active)
54
+ return;
55
+ active = false;
56
+ this.protections--;
57
+ this.recoveries--;
58
+ this.emit();
59
+ };
60
+ const assertHeld = () => {
61
+ if (!active)
62
+ throw new Error("Markdown recovery lease expired");
63
+ if (this.saving)
64
+ throw new Error("Markdown recovery must settle persistence first");
65
+ };
66
+ try {
67
+ this.clearTimer();
68
+ this.emit();
69
+ const flight = this.flushPromise;
70
+ if (flight)
71
+ await flight;
72
+ return {
73
+ acceptLocal: () => {
74
+ assertHeld();
75
+ this.persistedValue = this.value;
76
+ this.error = null;
77
+ this.emit();
78
+ },
79
+ useExternal: (value) => {
80
+ assertHeld();
81
+ this.value = value;
82
+ this.persistedValue = value;
83
+ this.error = null;
84
+ this.emit();
85
+ },
86
+ release,
87
+ };
88
+ }
89
+ catch (error) {
90
+ release();
91
+ throw error;
92
+ }
93
+ }
94
+ async protect() {
95
+ this.protections++;
96
+ this.emit();
97
+ let released = false;
98
+ const release = () => {
99
+ if (released)
100
+ return;
101
+ released = true;
102
+ this.protections--;
103
+ this.emit();
104
+ };
105
+ try {
106
+ if (!(await this.flush()))
107
+ throw this.error ?? new Error("Unable to protect unsaved Markdown");
108
+ return release;
109
+ }
110
+ catch (error) {
111
+ release();
112
+ throw error;
113
+ }
33
114
  }
34
115
  replaceExternal(value) {
35
- if (this.state.dirty || this.saving) {
116
+ if (this.recoveries > 0 ||
117
+ this.state.dirty ||
118
+ this.saving ||
119
+ this.error !== null) {
36
120
  return false;
37
121
  }
38
122
  this.value = value;
@@ -43,6 +127,8 @@ export class SerializedMarkdownWriter {
43
127
  }
44
128
  async flush() {
45
129
  this.clearTimer();
130
+ if (this.recoveries > 0)
131
+ return false;
46
132
  if (this.flushPromise) {
47
133
  const saved = await this.flushPromise;
48
134
  if (!saved) {
@@ -50,7 +136,14 @@ export class SerializedMarkdownWriter {
50
136
  }
51
137
  return this.state.dirty ? this.flush() : true;
52
138
  }
53
- this.flushPromise = this.flushLatest();
139
+ // Reserve the flight before notifying subscribers, which may request recovery.
140
+ let resolve;
141
+ let reject;
142
+ this.flushPromise = new Promise((done, fail) => {
143
+ resolve = done;
144
+ reject = fail;
145
+ });
146
+ void this.flushLatest().then(resolve, reject);
54
147
  try {
55
148
  return await this.flushPromise;
56
149
  }
@@ -59,14 +152,16 @@ export class SerializedMarkdownWriter {
59
152
  }
60
153
  }
61
154
  destroy() {
155
+ this.destroyed = true;
62
156
  this.clearTimer();
63
- if (this.state.dirty) {
157
+ this.emit();
158
+ if (this.state.dirty || this.error !== null) {
64
159
  void this.flush();
65
160
  }
66
161
  }
67
162
  schedule() {
68
163
  this.clearTimer();
69
- if (!this.state.dirty) {
164
+ if (!this.state.dirty && this.error === null) {
70
165
  return;
71
166
  }
72
167
  this.timer = setTimeout(() => {
@@ -75,7 +170,9 @@ export class SerializedMarkdownWriter {
75
170
  }, this.delay);
76
171
  }
77
172
  async flushLatest() {
78
- while (this.value !== this.persistedValue) {
173
+ while (this.value !== this.persistedValue || this.error !== null) {
174
+ if (this.recoveries > 0)
175
+ return false;
79
176
  const snapshot = this.value;
80
177
  this.saving = true;
81
178
  this.error = null;
@@ -105,5 +202,7 @@ export class SerializedMarkdownWriter {
105
202
  }
106
203
  emit() {
107
204
  this.onStateChange?.(this.state);
205
+ for (const listener of this.listeners)
206
+ listener(this.state);
108
207
  }
109
208
  }
@@ -84,12 +84,14 @@
84
84
  | ((replacement: string, from: number, to: number) => void)
85
85
  | undefined = $state(undefined);
86
86
 
87
- const writeMarkdown = $derived(
88
- fileAdapter.writeMarkdown &&
89
- (file.kind === undefined || file.kind === "markdown")
90
- ? (nextValue: string) => fileAdapter.writeMarkdown?.(file, nextValue)
91
- : undefined,
92
- );
87
+ const writeMarkdown = $derived.by(() => {
88
+ const adapter = fileAdapter,
89
+ target = file;
90
+ return adapter.writeMarkdown &&
91
+ (target.kind === undefined || target.kind === "markdown")
92
+ ? (nextValue: string) => adapter.writeMarkdown?.(target, nextValue)
93
+ : undefined;
94
+ });
93
95
 
94
96
  $effect(() => {
95
97
  const currentFile = file;
@@ -1 +1 @@
1
- {"version":3,"file":"editable-markdown-preview.svelte.d.ts","sourceRoot":"","sources":["../../src/preview/editable-markdown-preview.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACR,iBAAiB,EACjB,aAAa,EACb,eAAe,EACf,WAAW,EACX,eAAe,EACf,gBAAgB,EAChB,eAAe,EACf,2BAA2B,EAC3B,yBAAyB,EACzB,sBAAsB,EACvB,MAAM,0BAA0B,CAAC;AACpC,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AAKtE,KAAK,KAAK,GAAG;IACX,IAAI,EAAE,WAAW,CAAC;IAClB,WAAW,EAAE,eAAe,CAAC;IAC7B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,UAAU,CAAC,EAAE,aAAa,EAAE,CAAC;IAC7B,UAAU,CAAC,EAAE,sBAAsB,CAAC;IACpC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,YAAY,CAAC,EAAE,gBAAgB,CAAC;IAChC,aAAa,CAAC,EAAE,iBAAiB,CAAC;IAClC,WAAW,CAAC,EAAE,eAAe,CAAC;IAC9B,SAAS,CAAC,EAAE,2BAA2B,CAAC;IACxC,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,iBAAiB,CAAC,EAAE,iBAAiB,CAAC;IACtC,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,UAAU,CAAC,EAAE,SAAS,GAAG,MAAM,CAAC;IAChC,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,YAAY,CAAC,EAAE,eAAe,EAAE,CAAC;IACjC,WAAW,CAAC,EAAE,yBAAyB,CAAC;IACxC,4BAA4B,CAAC,EAAE,OAAO,CAAC;IACvC,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,eAAe,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IAC7C,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB,mBAAmB,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;CACrE,CAAC;AAoHJ,QAAA,MAAM,uBAAuB;iBArBF,OAAO,CAAC,OAAO,CAAC;gBAIjB,OAAO,CAAC,OAAO,CAAC;aAiB2B,CAAC;AACtE,KAAK,uBAAuB,GAAG,UAAU,CAAC,OAAO,uBAAuB,CAAC,CAAC;AAC1E,eAAe,uBAAuB,CAAC"}
1
+ {"version":3,"file":"editable-markdown-preview.svelte.d.ts","sourceRoot":"","sources":["../../src/preview/editable-markdown-preview.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACR,iBAAiB,EACjB,aAAa,EACb,eAAe,EACf,WAAW,EACX,eAAe,EACf,gBAAgB,EAChB,eAAe,EACf,2BAA2B,EAC3B,yBAAyB,EACzB,sBAAsB,EACvB,MAAM,0BAA0B,CAAC;AACpC,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AAKtE,KAAK,KAAK,GAAG;IACX,IAAI,EAAE,WAAW,CAAC;IAClB,WAAW,EAAE,eAAe,CAAC;IAC7B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,UAAU,CAAC,EAAE,aAAa,EAAE,CAAC;IAC7B,UAAU,CAAC,EAAE,sBAAsB,CAAC;IACpC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,YAAY,CAAC,EAAE,gBAAgB,CAAC;IAChC,aAAa,CAAC,EAAE,iBAAiB,CAAC;IAClC,WAAW,CAAC,EAAE,eAAe,CAAC;IAC9B,SAAS,CAAC,EAAE,2BAA2B,CAAC;IACxC,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,iBAAiB,CAAC,EAAE,iBAAiB,CAAC;IACtC,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,UAAU,CAAC,EAAE,SAAS,GAAG,MAAM,CAAC;IAChC,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,YAAY,CAAC,EAAE,eAAe,EAAE,CAAC;IACjC,WAAW,CAAC,EAAE,yBAAyB,CAAC;IACxC,4BAA4B,CAAC,EAAE,OAAO,CAAC;IACvC,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,eAAe,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IAC7C,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB,mBAAmB,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;CACrE,CAAC;AAsHJ,QAAA,MAAM,uBAAuB;iBArBF,OAAO,CAAC,OAAO,CAAC;gBAIjB,OAAO,CAAC,OAAO,CAAC;aAiB2B,CAAC;AACtE,KAAK,uBAAuB,GAAG,UAAU,CAAC,OAAO,uBAAuB,CAAC,CAAC;AAC1E,eAAe,uBAAuB,CAAC"}
@@ -1,4 +1,6 @@
1
1
  import MarkdownPreview from "./markdown-preview.svelte";
2
+ export { default as InlineLink } from "./components/inline-link.svelte";
3
+ export { default as LinkSiteIcon } from "./components/link-site-icon.svelte";
2
4
  import MarkdownOutline from "./markdown-outline.svelte";
3
5
  import Markdown from "./renderer/markdown.svelte";
4
6
  import FileEmbed from "./file-embed.svelte";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/preview/index.ts"],"names":[],"mappings":"AAAA,OAAO,eAAe,MAAM,2BAA2B,CAAC;AACxD,OAAO,eAAe,MAAM,2BAA2B,CAAC;AACxD,OAAO,QAAQ,MAAM,4BAA4B,CAAC;AAClD,OAAO,SAAS,MAAM,qBAAqB,CAAC;AAC5C,OAAO,aAAa,MAAM,yBAAyB,CAAC;AACpD,OAAO,QAAQ,MAAM,oBAAoB,CAAC;AAC1C,OAAO,iBAAiB,MAAM,iCAAiC,CAAC;AAChE,OAAO,uBAAuB,MAAM,oCAAoC,CAAC;AAEzE,OAAO,EACL,uBAAuB,EACvB,SAAS,EACT,iBAAiB,EACjB,QAAQ,EACR,aAAa,EACb,eAAe,EACf,eAAe,EACf,QAAQ,GACT,CAAC;AACF,YAAY,EAAE,mBAAmB,EAAE,sBAAsB,EAAE,MAAM,WAAW,CAAC;AAC7E,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,4BAA4B,CAAC;AACjE,cAAc,iBAAiB,CAAC;AAChC,mBAAmB,kBAAkB,CAAC;AACtC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,UAAU,CAAC;AACzB,OAAO,EACL,qBAAqB,EACrB,gCAAgC,EAChC,KAAK,2BAA2B,EAChC,KAAK,4BAA4B,EACjC,KAAK,0BAA0B,EAC/B,KAAK,uCAAuC,EAC5C,KAAK,uBAAuB,EAC5B,KAAK,iBAAiB,EACtB,KAAK,mBAAmB,EACxB,KAAK,uBAAuB,EAC5B,KAAK,yBAAyB,GAC/B,MAAM,eAAe,CAAC;AACvB,eAAe,eAAe,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/preview/index.ts"],"names":[],"mappings":"AAAA,OAAO,eAAe,MAAM,2BAA2B,CAAC;AACxD,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,iCAAiC,CAAC;AACxE,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,oCAAoC,CAAC;AAC7E,OAAO,eAAe,MAAM,2BAA2B,CAAC;AACxD,OAAO,QAAQ,MAAM,4BAA4B,CAAC;AAClD,OAAO,SAAS,MAAM,qBAAqB,CAAC;AAC5C,OAAO,aAAa,MAAM,yBAAyB,CAAC;AACpD,OAAO,QAAQ,MAAM,oBAAoB,CAAC;AAC1C,OAAO,iBAAiB,MAAM,iCAAiC,CAAC;AAChE,OAAO,uBAAuB,MAAM,oCAAoC,CAAC;AAEzE,OAAO,EACL,uBAAuB,EACvB,SAAS,EACT,iBAAiB,EACjB,QAAQ,EACR,aAAa,EACb,eAAe,EACf,eAAe,EACf,QAAQ,GACT,CAAC;AACF,YAAY,EAAE,mBAAmB,EAAE,sBAAsB,EAAE,MAAM,WAAW,CAAC;AAC7E,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,4BAA4B,CAAC;AACjE,cAAc,iBAAiB,CAAC;AAChC,mBAAmB,kBAAkB,CAAC;AACtC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,UAAU,CAAC;AACzB,OAAO,EACL,qBAAqB,EACrB,gCAAgC,EAChC,KAAK,2BAA2B,EAChC,KAAK,4BAA4B,EACjC,KAAK,0BAA0B,EAC/B,KAAK,uCAAuC,EAC5C,KAAK,uBAAuB,EAC5B,KAAK,iBAAiB,EACtB,KAAK,mBAAmB,EACxB,KAAK,uBAAuB,EAC5B,KAAK,yBAAyB,GAC/B,MAAM,eAAe,CAAC;AACvB,eAAe,eAAe,CAAC"}
@@ -1,4 +1,6 @@
1
1
  import MarkdownPreview from "./markdown-preview.svelte";
2
+ export { default as InlineLink } from "./components/inline-link.svelte";
3
+ export { default as LinkSiteIcon } from "./components/link-site-icon.svelte";
2
4
  import MarkdownOutline from "./markdown-outline.svelte";
3
5
  import Markdown from "./renderer/markdown.svelte";
4
6
  import FileEmbed from "./file-embed.svelte";
@@ -215,6 +215,17 @@
215
215
  "data-sourcepos",
216
216
  ],
217
217
  img: [...(defaultSchema.attributes?.img ?? []), "src", "alt", "title"],
218
+ code: [
219
+ ...(defaultSchema.attributes?.code ?? []).filter(
220
+ (attribute) =>
221
+ !Array.isArray(attribute) || attribute[0] !== "className",
222
+ ),
223
+ ["className", /^language-/, "hljs"],
224
+ ],
225
+ span: [
226
+ ...(defaultSchema.attributes?.span ?? []),
227
+ ["className", /^hljs-/, "code-line", "highlighted-code-line"],
228
+ ],
218
229
  a: [
219
230
  ...(defaultSchema.attributes?.a ?? []),
220
231
  "href",
@@ -1 +1 @@
1
- {"version":3,"file":"markdown-preview.svelte.d.ts","sourceRoot":"","sources":["../../src/preview/markdown-preview.svelte.ts"],"names":[],"mappings":"AAkBA,OAAO,KAAK,EACR,iBAAiB,EACjB,aAAa,EACb,eAAe,EACf,eAAe,EACf,gBAAgB,EAChB,yBAAyB,EACzB,sBAAsB,EACvB,MAAM,0BAA0B,CAAC;AAqCpC,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AAGtE,KAAK,KAAK,GAAG;IACX,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,aAAa,EAAE,CAAC;IAC7B,UAAU,CAAC,EAAE,sBAAsB,CAAC;IACpC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,YAAY,CAAC,EAAE,gBAAgB,CAAC;IAChC,aAAa,CAAC,EAAE,iBAAiB,CAAC;IAClC,WAAW,CAAC,EAAE,eAAe,CAAC;IAC9B,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,iBAAiB,CAAC,EAAE,iBAAiB,CAAC;IACtC,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,UAAU,CAAC,EAAE,SAAS,GAAG,MAAM,CAAC;IAChC,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,YAAY,CAAC,EAAE,eAAe,EAAE,CAAC;IACjC,WAAW,CAAC,EAAE,yBAAyB,CAAC;IACxC,QAAQ,CAAC,EAAE,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IACnE,mBAAmB,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;CACrE,CAAC;AA6ZJ,QAAA,MAAM,eAAe,2CAAwC,CAAC;AAC9D,KAAK,eAAe,GAAG,UAAU,CAAC,OAAO,eAAe,CAAC,CAAC;AAC1D,eAAe,eAAe,CAAC"}
1
+ {"version":3,"file":"markdown-preview.svelte.d.ts","sourceRoot":"","sources":["../../src/preview/markdown-preview.svelte.ts"],"names":[],"mappings":"AAkBA,OAAO,KAAK,EACR,iBAAiB,EACjB,aAAa,EACb,eAAe,EACf,eAAe,EACf,gBAAgB,EAChB,yBAAyB,EACzB,sBAAsB,EACvB,MAAM,0BAA0B,CAAC;AAqCpC,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AAGtE,KAAK,KAAK,GAAG;IACX,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,aAAa,EAAE,CAAC;IAC7B,UAAU,CAAC,EAAE,sBAAsB,CAAC;IACpC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,YAAY,CAAC,EAAE,gBAAgB,CAAC;IAChC,aAAa,CAAC,EAAE,iBAAiB,CAAC;IAClC,WAAW,CAAC,EAAE,eAAe,CAAC;IAC9B,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,iBAAiB,CAAC,EAAE,iBAAiB,CAAC;IACtC,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,UAAU,CAAC,EAAE,SAAS,GAAG,MAAM,CAAC;IAChC,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,YAAY,CAAC,EAAE,eAAe,EAAE,CAAC;IACjC,WAAW,CAAC,EAAE,yBAAyB,CAAC;IACxC,QAAQ,CAAC,EAAE,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IACnE,mBAAmB,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;CACrE,CAAC;AAwaJ,QAAA,MAAM,eAAe,2CAAwC,CAAC;AAC9D,KAAK,eAAe,GAAG,UAAU,CAAC,OAAO,eAAe,CAAC,CAAC;AAC1D,eAAe,eAAe,CAAC"}
@@ -114,7 +114,6 @@ const svgCamelCaseAttributes = new Set([
114
114
  "markerEnd",
115
115
  "markerMid",
116
116
  "markerStart",
117
- "preserveAspectRatio",
118
117
  "strokeDasharray",
119
118
  "strokeDashoffset",
120
119
  "strokeLinecap",
@@ -123,7 +122,6 @@ const svgCamelCaseAttributes = new Set([
123
122
  "strokeOpacity",
124
123
  "strokeWidth",
125
124
  "textAnchor",
126
- "viewBox",
127
125
  "xlinkHref",
128
126
  ]);
129
127
  const htmlCamelCaseAttributes = {
@@ -0,0 +1,38 @@
1
+ .mira-link-site-icon {
2
+ display: inline-block;
3
+ width: 0.95em;
4
+ height: 0.95em;
5
+ margin-inline-end: 0.25em;
6
+ vertical-align: -0.12em;
7
+ color: inherit;
8
+ }
9
+
10
+ .mira-inline-link,
11
+ .markdown-rendered a.mira-inline-link,
12
+ .markdown-preview-surface .markdown a.mira-inline-link {
13
+ color: var(
14
+ --markdown-link-external-color,
15
+ var(--mira-link, var(--mira-accent))
16
+ );
17
+ text-decoration: underline;
18
+ text-underline-offset: 0.2em;
19
+ overflow-wrap: anywhere;
20
+ background-image: none;
21
+ padding-inline-end: 0;
22
+ filter: none;
23
+ }
24
+
25
+ .mira-inline-link:hover,
26
+ .markdown-rendered a.mira-inline-link:hover {
27
+ color: var(--markdown-link-color-hover, var(--mira-link, var(--mira-accent)));
28
+ }
29
+
30
+ .mira-inline-link:focus-visible {
31
+ outline: 2px solid var(--mira-focus-ring);
32
+ outline-offset: 2px;
33
+ border-radius: 2px;
34
+ }
35
+
36
+ .mira-inline-link__destination {
37
+ overflow-wrap: anywhere;
38
+ }
@@ -31,7 +31,8 @@
31
31
  text-decoration-line: var(--markdown-link-external-decoration);
32
32
  }
33
33
 
34
- .markdown-live-preview-mode .cm-external-link .cm-link,
34
+ .markdown-live-preview-mode .cm-external-link .cm-link-text,
35
+ .markdown-live-preview-mode .cm-link-text > .cm-external-link > .cm-url,
35
36
  .markdown-live-preview-mode .cm-url.cm-external-link {
36
37
  background-image:
37
38
  linear-gradient(transparent, transparent),
@@ -43,7 +44,6 @@
43
44
  color: var(--markdown-link-external-color);
44
45
  filter: var(--markdown-link-external-filter);
45
46
  padding-inline-end: 0.9em;
46
- text-decoration-line: var(--markdown-link-external-decoration);
47
47
  }
48
48
 
49
49
  .mira-link-preview {
@@ -87,9 +87,10 @@
87
87
  color: var(--mira-syntax-keyword);
88
88
  }
89
89
 
90
- .markdown-preview-surface :is(.hljs-title, .hljs-title.function_),
91
- .markdown-rendered :is(.hljs-title, .hljs-title.function_),
92
- .markdown-widget-shell :is(.hljs-title, .hljs-title.function_) {
90
+ .markdown-preview-surface
91
+ :is(.hljs-title, .hljs-title.function_, .hljs-section),
92
+ .markdown-rendered :is(.hljs-title, .hljs-title.function_, .hljs-section),
93
+ .markdown-widget-shell :is(.hljs-title, .hljs-title.function_, .hljs-section) {
93
94
  color: var(--mira-syntax-heading);
94
95
  }
95
96
 
@@ -0,0 +1,72 @@
1
+ .mira-reference-definition.mira-reference--link {
2
+ display: flex;
3
+ align-items: baseline;
4
+ gap: 0.5em;
5
+ min-width: 0;
6
+ padding-block: 0.25em;
7
+ }
8
+
9
+ .mira-reference--link .mira-reference__label {
10
+ color: var(--mira-muted-foreground);
11
+ flex: none;
12
+ font-size: 0.75em;
13
+ font-weight: 650;
14
+ letter-spacing: 0.04em;
15
+ max-inline-size: 40%;
16
+ overflow: hidden;
17
+ text-overflow: ellipsis;
18
+ white-space: nowrap;
19
+ }
20
+
21
+ .mira-reference--link > p {
22
+ min-width: 0;
23
+ margin: 0;
24
+ overflow-wrap: anywhere;
25
+ }
26
+
27
+ .mira-reference--image {
28
+ position: relative;
29
+ display: inline-block;
30
+ box-sizing: border-box;
31
+ max-width: 100%;
32
+ border: 1px solid var(--mira-border);
33
+ border-radius: var(--mira-radius, 8px);
34
+ padding: 0.75rem;
35
+ background: var(--mira-background);
36
+ }
37
+
38
+ /* Give percentage-constrained SVGs a definite containing width in block frames. */
39
+ .mira-rich-widget--block.mira-reference--image .mira-markdown-image-root,
40
+ .mira-rich-widget--block.mira-reference--image .mira-markdown-image__trigger {
41
+ display: block;
42
+ }
43
+
44
+ .mira-rich-widget--block.mira-reference--image .mira-markdown-image__trigger {
45
+ width: 100%;
46
+ }
47
+
48
+ .mira-reference--image > .mira-reference__label {
49
+ position: absolute;
50
+ inset-block-start: 0;
51
+ inset-inline-end: 0;
52
+ z-index: 1;
53
+ border-end-start-radius: var(--mira-radius, 8px);
54
+ border-start-end-radius: calc(var(--mira-radius, 8px) - 1px);
55
+ background: var(--mira-accent);
56
+ color: var(--mira-accent-foreground);
57
+ font-size: 0.75em;
58
+ font-weight: 650;
59
+ letter-spacing: 0.04em;
60
+ padding: 0.35em 0.65em;
61
+ box-sizing: border-box;
62
+ max-inline-size: 75%;
63
+ overflow: hidden;
64
+ text-overflow: ellipsis;
65
+ white-space: nowrap;
66
+ pointer-events: none;
67
+ }
68
+
69
+ .mira-reference--image .mira-rich-widget__source-toggle {
70
+ inset-inline-start: 0.25rem;
71
+ inset-inline-end: auto;
72
+ }
@@ -10,6 +10,8 @@
10
10
  @import "./styles/blockquotes-footnotes.css";
11
11
  @import "./styles/code-katex.css";
12
12
  @import "./styles/links-embeds-tags.css";
13
+ @import "./styles/inline-links.css";
14
+ @import "./styles/references.css";
13
15
  @import "./styles/callouts.css";
14
16
  @import "./styles/images.css";
15
17
  @import "./styles/tables.css";
@@ -5,8 +5,10 @@
5
5
  import { EditorView } from "@codemirror/view";
6
6
  import { EditorState } from "@codemirror/state";
7
7
  import { cn } from "./utils";
8
- import { tick } from "svelte";
8
+ import { tick, onDestroy } from "svelte";
9
9
  import { toHtml } from "./utils";
10
+ import { MarkdownPreview } from "@lapismd/mira/preview";
11
+ import type { MiraExtension } from "../extensions";
10
12
  import { createInlineTableMarkdownExtensions } from "./inline-editor-extensions";
11
13
 
12
14
  let {
@@ -14,6 +16,7 @@
14
16
  onContentChange,
15
17
  onEdit = () => {},
16
18
  readonly = false,
19
+ extensions = [],
17
20
  class: className,
18
21
  }: {
19
22
  node: Mdast.Nodes;
@@ -21,6 +24,7 @@
21
24
  onContentChange: (value: string) => void;
22
25
  onEdit?: (evt: MouseEvent) => void;
23
26
  readonly?: boolean;
27
+ extensions?: MiraExtension[];
24
28
  } = $props();
25
29
  let content = $derived(TableNode.toMarkdown(node).trim());
26
30
  let view: EditorView = new EditorView({
@@ -42,6 +46,7 @@
42
46
  }),
43
47
  });
44
48
 
49
+ onDestroy(() => view.destroy());
45
50
  let editing: boolean = $state(false);
46
51
 
47
52
  const codeMirror = (node: HTMLDivElement, content: string) => {
@@ -97,9 +102,13 @@
97
102
  <div class="cm-scroller">
98
103
  <div class="cm-content">
99
104
  {#if content}
100
- {#await toHtml(content) then markup}
101
- {@html markup}
102
- {/await}
105
+ {#if extensions.length}<MarkdownPreview
106
+ inline
107
+ value={content}
108
+ {extensions}
109
+ />{:else}{#await toHtml(content) then markup}
110
+ {@html markup}
111
+ {/await}{/if}
103
112
  {:else}
104
113
  &NonBreakingSpace;
105
114
  {/if}
@@ -115,9 +124,13 @@
115
124
  <div class="cm-scroller">
116
125
  <div class="cm-content">
117
126
  {#if content}
118
- {#await toHtml(content) then markup}
119
- {@html markup}
120
- {/await}
127
+ {#if extensions.length}<MarkdownPreview
128
+ inline
129
+ value={content}
130
+ {extensions}
131
+ />{:else}{#await toHtml(content) then markup}
132
+ {@html markup}
133
+ {/await}{/if}
121
134
  {:else}
122
135
  &NonBreakingSpace;
123
136
  {/if}
@@ -1,10 +1,12 @@
1
1
  import type * as Mdast from "mdast";
2
+ import type { MiraExtension } from "../extensions";
2
3
  type $$ComponentProps = {
3
4
  node: Mdast.Nodes;
4
5
  class?: string;
5
6
  onContentChange: (value: string) => void;
6
7
  onEdit?: (evt: MouseEvent) => void;
7
8
  readonly?: boolean;
9
+ extensions?: MiraExtension[];
8
10
  };
9
11
  declare const EditorColumn: import("svelte").Component<$$ComponentProps, {}, "">;
10
12
  type EditorColumn = ReturnType<typeof EditorColumn>;
@@ -1 +1 @@
1
- {"version":3,"file":"editor-column.svelte.d.ts","sourceRoot":"","sources":["../../src/tables/editor-column.svelte.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,KAAK,KAAK,MAAM,OAAO,CAAC;AASnC,KAAK,gBAAgB,GAAI;IACtB,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,eAAe,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACzC,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,UAAU,KAAK,IAAI,CAAC;IACnC,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB,CAAC;AA4HJ,QAAA,MAAM,YAAY,sDAAwC,CAAC;AAC3D,KAAK,YAAY,GAAG,UAAU,CAAC,OAAO,YAAY,CAAC,CAAC;AACpD,eAAe,YAAY,CAAC"}
1
+ {"version":3,"file":"editor-column.svelte.d.ts","sourceRoot":"","sources":["../../src/tables/editor-column.svelte.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,KAAK,KAAK,MAAM,OAAO,CAAC;AAQpC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAGlD,KAAK,gBAAgB,GAAI;IACtB,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,eAAe,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACzC,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,UAAU,KAAK,IAAI,CAAC;IACnC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,UAAU,CAAC,EAAE,aAAa,EAAE,CAAC;CAC9B,CAAC;AAgIJ,QAAA,MAAM,YAAY,sDAAwC,CAAC;AAC3D,KAAK,YAAY,GAAG,UAAU,CAAC,OAAO,YAAY,CAAC,CAAC;AACpD,eAAe,YAAY,CAAC"}
@@ -1,6 +1,7 @@
1
1
  <script lang="ts">
2
2
  // @ts-nocheck
3
3
  import { TableNode } from "./table-node";
4
+ import type { MiraExtension } from "../extensions";
4
5
  import * as Table from "@lapismd/mira/ui/table";
5
6
  import { cn } from "./utils";
6
7
  import ColumnEditor from "./editor-column.svelte";
@@ -45,12 +46,14 @@
45
46
  onDelete = () => {},
46
47
  onMouseUp = () => {},
47
48
  selectedCells = [],
49
+ extensions = [],
48
50
  }: {
49
51
  node: TableNode;
50
52
  onChange?: (data: string, props?: Record<string, any>) => void;
51
53
  onDelete?: (evt: Event) => void;
52
54
  onMouseUp?: (evt: MouseEvent) => void;
53
55
  selectedCells?: Array<[number, number]>;
56
+ extensions?: MiraExtension[];
54
57
  } = $props();
55
58
  let tableVersion = $state(0);
56
59
  let mdastNode = $derived.by(() => {
@@ -765,6 +768,7 @@
765
768
  hProperties.displayColIndex ?? index}
766
769
  {@const id = [sourceRowIndex, sourceColIndex].join(",")}
767
770
  <MarkdownTableDataCell
771
+ {extensions}
768
772
  node={col}
769
773
  {rowIndex}
770
774
  colIndex={displayColIndex}
@@ -1,10 +1,12 @@
1
1
  import { TableNode } from "./table-node";
2
+ import type { MiraExtension } from "../extensions";
2
3
  type $$ComponentProps = {
3
4
  node: TableNode;
4
5
  onChange?: (data: string, props?: Record<string, any>) => void;
5
6
  onDelete?: (evt: Event) => void;
6
7
  onMouseUp?: (evt: MouseEvent) => void;
7
8
  selectedCells?: Array<[number, number]>;
9
+ extensions?: MiraExtension[];
8
10
  };
9
11
  declare const EditorTable: import("svelte").Component<$$ComponentProps, {}, "">;
10
12
  type EditorTable = ReturnType<typeof EditorTable>;
@@ -1 +1 @@
1
- {"version":3,"file":"editor-table.svelte.d.ts","sourceRoot":"","sources":["../../src/tables/editor-table.svelte.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAuCxC,KAAK,gBAAgB,GAAI;IACtB,IAAI,EAAE,SAAS,CAAC;IAChB,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,KAAK,IAAI,CAAC;IAC/D,QAAQ,CAAC,EAAE,CAAC,GAAG,EAAE,KAAK,KAAK,IAAI,CAAC;IAChC,SAAS,CAAC,EAAE,CAAC,GAAG,EAAE,UAAU,KAAK,IAAI,CAAC;IACtC,aAAa,CAAC,EAAE,KAAK,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;CACzC,CAAC;AA2wBJ,QAAA,MAAM,WAAW,sDAAwC,CAAC;AAC1D,KAAK,WAAW,GAAG,UAAU,CAAC,OAAO,WAAW,CAAC,CAAC;AAClD,eAAe,WAAW,CAAC"}
1
+ {"version":3,"file":"editor-table.svelte.d.ts","sourceRoot":"","sources":["../../src/tables/editor-table.svelte.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAuClD,KAAK,gBAAgB,GAAI;IACtB,IAAI,EAAE,SAAS,CAAC;IAChB,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,KAAK,IAAI,CAAC;IAC/D,QAAQ,CAAC,EAAE,CAAC,GAAG,EAAE,KAAK,KAAK,IAAI,CAAC;IAChC,SAAS,CAAC,EAAE,CAAC,GAAG,EAAE,UAAU,KAAK,IAAI,CAAC;IACtC,aAAa,CAAC,EAAE,KAAK,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IACxC,UAAU,CAAC,EAAE,aAAa,EAAE,CAAC;CAC9B,CAAC;AA6wBJ,QAAA,MAAM,WAAW,sDAAwC,CAAC;AAC1D,KAAK,WAAW,GAAG,UAAU,CAAC,OAAO,WAAW,CAAC,CAAC;AAClD,eAAe,WAAW,CAAC"}
@@ -3,17 +3,20 @@
3
3
  import { EditorView, keymap } from "@codemirror/view";
4
4
  import { EditorState } from "@codemirror/state";
5
5
  import { cn } from "./utils";
6
- import { tick } from "svelte";
6
+ import { tick, onDestroy } from "svelte";
7
7
  import { MarkdownPreview } from "@lapismd/mira/preview";
8
+ import type { MiraExtension } from "../extensions";
8
9
  import { createInlineTableMarkdownExtensions } from "./inline-editor-extensions";
9
10
 
10
11
  let {
11
12
  content,
13
+ extensions = [],
12
14
  onContentChange,
13
15
  onEdit = () => true,
14
16
  class: className,
15
17
  }: {
16
18
  content: string;
19
+ extensions?: MiraExtension[];
17
20
  class?: string;
18
21
  onContentChange: (value: string) => void;
19
22
  onEdit?: (evt: MouseEvent) => boolean;
@@ -50,6 +53,7 @@
50
53
  }),
51
54
  });
52
55
 
56
+ onDestroy(() => view.destroy());
53
57
  let editing: boolean = $state(false);
54
58
 
55
59
  const codeMirror = (node: HTMLDivElement, content: string) => {
@@ -108,7 +112,7 @@
108
112
  <div class="cm-scroller">
109
113
  <div class="cm-content">
110
114
  {#if content}
111
- <MarkdownPreview inline value={content} />
115
+ <MarkdownPreview inline value={content} {extensions} />
112
116
  {:else}
113
117
  &NonBreakingSpace;
114
118
  {/if}
@@ -1,5 +1,7 @@
1
+ import type { MiraExtension } from "../extensions";
1
2
  type $$ComponentProps = {
2
3
  content: string;
4
+ extensions?: MiraExtension[];
3
5
  class?: string;
4
6
  onContentChange: (value: string) => void;
5
7
  onEdit?: (evt: MouseEvent) => boolean;