@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,190 +0,0 @@
1
- import { describe, expect, it } from "vitest";
2
- import remarkFrontmatter from "remark-frontmatter";
3
- import { createParser } from "../renderer/utils";
4
- import { coerceFrontmatterValue, createFrontmatterPropertyManager, createFrontmatterReplacement, FrontmatterController, frontmatterProperties, mergeFrontmatterRecordProperties, parseFrontmatterYaml, removeFrontmatterRecordProperty, resolveFrontmatterWidget, serializeFrontmatterRecord, } from ".";
5
- import { remarkFrontmatterToHast, remarkPositionsToData } from "../remark";
6
- describe("frontmatter utilities", () => {
7
- it("parses, mutates, and serializes portable YAML properties", () => {
8
- const parsed = parseFrontmatterYaml("title: Demo\npublished: true\ncount: 2\ntags:\n - mira\n");
9
- expect(parsed.ok).toBe(true);
10
- if (!parsed.ok) {
11
- return;
12
- }
13
- const yaml = serializeFrontmatterRecord({
14
- ...parsed.value,
15
- title: "Updated",
16
- });
17
- expect(yaml).toContain("title: Updated");
18
- expect(createFrontmatterReplacement(yaml)).toMatch(/^---\n/);
19
- });
20
- it("derives Lapis-style property types and icons", () => {
21
- const properties = frontmatterProperties({
22
- aliases: ["Mira"],
23
- count: 2,
24
- draft: false,
25
- nested: { child: true },
26
- published: "2026-06-27",
27
- tags: ["mira", "editor"],
28
- title: "Demo",
29
- });
30
- expect(properties.map((property) => [property.key, property.type])).toEqual([
31
- ["aliases", "aliases"],
32
- ["count", "number"],
33
- ["draft", "checkbox"],
34
- ["nested", "object"],
35
- ["published", "date"],
36
- ["tags", "tags"],
37
- ["title", "text"],
38
- ]);
39
- expect(properties.find((property) => property.key === "tags")?.icon).toBe("lucide-hash");
40
- expect(properties.find((property) => property.key === "nested")?.children[0]
41
- ?.type).toBe("checkbox");
42
- });
43
- it("applies configured frontmatter property types and widgets", () => {
44
- const properties = frontmatterProperties({
45
- status: "draft",
46
- title: "Demo",
47
- }, {
48
- types: {
49
- status: {
50
- type: "workflow-state",
51
- label: "Workflow state",
52
- icon: "lucide-workflow",
53
- fallbackKind: "text",
54
- defaultValue: "draft",
55
- normalize: (value) => String(value).toUpperCase(),
56
- },
57
- },
58
- widgets: [
59
- {
60
- type: "workflow-state",
61
- label: "Workflow state",
62
- icon: "lucide-workflow",
63
- fallbackKind: "text",
64
- render: () => undefined,
65
- },
66
- ],
67
- });
68
- const status = properties.find((property) => property.key === "status");
69
- expect(status?.type).toBe("workflow-state");
70
- expect(status?.icon).toBe("lucide-workflow");
71
- expect(resolveFrontmatterWidget({ widgets: [] }, "missing")).toBeNull();
72
- expect(coerceFrontmatterValue("draft", "workflow-state", {
73
- widgets: [
74
- {
75
- type: "workflow-state",
76
- normalize: (value) => String(value).toUpperCase(),
77
- },
78
- ],
79
- })).toBe("DRAFT");
80
- });
81
- it("removes nested object and array properties immutably", () => {
82
- const source = {
83
- nested: { keep: true, remove: "value" },
84
- values: ["first", "second"],
85
- };
86
- expect(removeFrontmatterRecordProperty(source, ["nested", "remove"])).toEqual({
87
- nested: { keep: true },
88
- values: ["first", "second"],
89
- });
90
- expect(removeFrontmatterRecordProperty(source, ["values", 0])).toEqual({
91
- nested: { keep: true, remove: "value" },
92
- values: ["second"],
93
- });
94
- expect(source.nested.remove).toBe("value");
95
- });
96
- it("merges pasted properties into a portable parent record", () => {
97
- const source = {
98
- nested: { keep: true },
99
- title: "Demo",
100
- };
101
- expect(mergeFrontmatterRecordProperties(source, ["nested"], {
102
- owner: "[[Ada]]",
103
- status: "ready",
104
- })).toEqual({
105
- nested: {
106
- keep: true,
107
- owner: "[[Ada]]",
108
- status: "ready",
109
- },
110
- title: "Demo",
111
- });
112
- });
113
- it("renders frontmatter as a component with source offsets", () => {
114
- const parser = createParser([
115
- remarkFrontmatter,
116
- remarkFrontmatterToHast,
117
- remarkPositionsToData,
118
- ]);
119
- const ast = parser("---\ntitle: Demo\n---\n\n# Heading");
120
- const frontmatter = ast.children.find((node) => node.type === "element" && node.tagName === "frontmatter");
121
- expect(frontmatter?.properties?.value).toBe("title: Demo");
122
- expect(frontmatter?.properties?.["data-offset"]).toBe(0);
123
- expect(frontmatter?.properties?.["data-offset-end"]).toBe(19);
124
- });
125
- it("creates a property manager that resolves widgets and setType", () => {
126
- const manager = createFrontmatterPropertyManager({
127
- types: {
128
- status: {
129
- type: "workflow-state",
130
- label: "Workflow",
131
- icon: "lucide-workflow",
132
- fallbackKind: "text",
133
- },
134
- },
135
- widgets: [
136
- {
137
- type: "workflow-state",
138
- fallbackKind: "text",
139
- validate: (value) => typeof value === "string",
140
- },
141
- ],
142
- });
143
- expect(manager.resolveType("status", "status", "draft")).toBe("workflow-state");
144
- expect(manager.resolveWidget("workflow-state")?.label).toBeUndefined();
145
- expect(manager.typeOptions().some((option) => option.type === "text")).toBe(true);
146
- manager.setType("priority", "number");
147
- expect(manager.resolveType("priority", "priority", "1")).toBe("number");
148
- });
149
- it("commits controller record mutations through onRecordChange", async () => {
150
- const commits = [];
151
- const controller = new FrontmatterController({
152
- record: { title: "Demo", count: 1 },
153
- onRecordChange(commit) {
154
- commits.push(commit.record);
155
- },
156
- });
157
- controller.updateProperty(["title"], "Updated");
158
- expect(controller.getRecord().title).toBe("Updated");
159
- expect(commits.at(-1)).toEqual({ title: "Updated", count: 1 });
160
- const added = controller.addProperty("text");
161
- expect(added).toBeTruthy();
162
- expect(Object.keys(controller.getRecord())).toContain(added);
163
- controller.renameProperty([added], "subtitle");
164
- expect(controller.getRecord()).toHaveProperty("subtitle");
165
- expect(controller.getRecord()).not.toHaveProperty(added);
166
- const title = controller.propertyManager
167
- .properties(controller.getRecord())
168
- .find((property) => property.key === "title");
169
- expect(title).toBeTruthy();
170
- controller.changePropertyKind(title, "checkbox");
171
- expect(controller.getRecord().title).toBe(true);
172
- expect(commits.length).toBeGreaterThan(3);
173
- });
174
- it("splices YAML into markdown through controller document adapters", () => {
175
- const markdown = "---\ntitle: Demo\n---\n\nBody\n";
176
- let nextValue = markdown;
177
- const controller = new FrontmatterController({
178
- yaml: "title: Demo",
179
- getMarkdown: () => markdown,
180
- dataOffset: 0,
181
- dataOffsetEnd: 19,
182
- onFrontmatterChange(_yaml, value) {
183
- nextValue = value;
184
- },
185
- });
186
- controller.updateProperty(["title"], "Updated");
187
- expect(nextValue).toContain("title: Updated");
188
- expect(nextValue).toContain("Body");
189
- });
190
- });
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=suggestions.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"suggestions.test.d.ts","sourceRoot":"","sources":["../../../src/preview/frontmatter/suggestions.test.ts"],"names":[],"mappings":""}
@@ -1,45 +0,0 @@
1
- import { describe, expect, it } from "vitest";
2
- import { filterFrontmatterPropertySuggestions, filterFrontmatterValueSuggestions, parseFrontmatterPillWikilink, readFrontmatterPropertySuggestions, readFrontmatterValueSuggestions, } from "./suggestions";
3
- describe("frontmatter property suggestions", () => {
4
- it("loads lazy suggestions and derives configured icons", async () => {
5
- const suggestions = await readFrontmatterPropertySuggestions({
6
- propertySuggestions: async () => [
7
- "status",
8
- { name: "owner", kind: "aliases" },
9
- "status",
10
- ],
11
- });
12
- expect(suggestions).toEqual([
13
- { name: "status", icon: undefined },
14
- { name: "owner", kind: "aliases", icon: "lucide-at-sign" },
15
- ]);
16
- });
17
- it("filters, ranks prefixes, and excludes existing names", () => {
18
- expect(filterFrontmatterPropertySuggestions([{ name: "review-status" }, { name: "status" }, { name: "state" }], "sta", ["state"]).map((suggestion) => suggestion.name)).toEqual(["status", "review-status"]);
19
- });
20
- });
21
- describe("frontmatter value suggestions", () => {
22
- it("loads keyed values and ranks prefix matches", async () => {
23
- const suggestions = await readFrontmatterValueSuggestions({
24
- valueSuggestions: (key, query) => key === "tags" && query.startsWith("p")
25
- ? ["project/alpha", "inbox", "project/beta"]
26
- : [],
27
- }, "tags", "pro");
28
- expect(suggestions).toEqual(["project/alpha", "project/beta"]);
29
- });
30
- it("excludes current pills and empty values", () => {
31
- expect(filterFrontmatterValueSuggestions(["demo", "ideas", "demo", ""], "dem", [
32
- "demo",
33
- ])).toEqual([]);
34
- expect(filterFrontmatterValueSuggestions(["ideas", "demo"], "ide", ["demo"])).toEqual(["ideas"]);
35
- });
36
- });
37
- describe("frontmatter wikilink pills", () => {
38
- it("recognizes only whole-value wikilinks", () => {
39
- expect(parseFrontmatterPillWikilink("[[Project|Roadmap]]")).toEqual({
40
- target: "Project",
41
- text: "Roadmap",
42
- });
43
- expect(parseFrontmatterPillWikilink("See [[Project]]")).toBeNull();
44
- });
45
- });
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=outline.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"outline.test.d.ts","sourceRoot":"","sources":["../../src/preview/outline.test.ts"],"names":[],"mappings":""}
@@ -1,98 +0,0 @@
1
- import { describe, expect, it } from "vitest";
2
- import { activeMarkdownOutlineId, findMarkdownOutlineScrollRoot, } from "./outline";
3
- function setVerticalLayout(element, layout) {
4
- Object.defineProperties(element, {
5
- clientHeight: { configurable: true, value: layout.clientHeight },
6
- scrollHeight: { configurable: true, value: layout.scrollHeight },
7
- });
8
- element.getBoundingClientRect = () => ({
9
- top: layout.top ?? 0,
10
- bottom: (layout.top ?? 0) + layout.clientHeight,
11
- height: layout.clientHeight,
12
- left: 0,
13
- right: 0,
14
- width: 0,
15
- x: 0,
16
- y: layout.top ?? 0,
17
- toJSON: () => ({}),
18
- });
19
- }
20
- describe("Markdown outline scroll tracking", () => {
21
- it("uses Mira's preview when it owns the scroll range", () => {
22
- const outer = document.createElement("div");
23
- const preview = document.createElement("div");
24
- const heading = document.createElement("h1");
25
- outer.style.overflowY = "auto";
26
- preview.style.overflowY = "auto";
27
- outer.append(preview);
28
- preview.append(heading);
29
- setVerticalLayout(outer, { clientHeight: 400, scrollHeight: 800 });
30
- setVerticalLayout(preview, { clientHeight: 300, scrollHeight: 700 });
31
- expect(findMarkdownOutlineScrollRoot(heading, preview)).toBe(preview);
32
- });
33
- it("finds a consumer scroll owner when the preview overflow is visible", () => {
34
- const viewport = document.createElement("div");
35
- const preview = document.createElement("div");
36
- const heading = document.createElement("h1");
37
- viewport.style.overflowY = "scroll";
38
- preview.style.overflowY = "visible";
39
- viewport.append(preview);
40
- preview.append(heading);
41
- setVerticalLayout(viewport, { clientHeight: 300, scrollHeight: 900 });
42
- setVerticalLayout(preview, { clientHeight: 900, scrollHeight: 900 });
43
- expect(findMarkdownOutlineScrollRoot(heading, preview)).toBe(viewport);
44
- });
45
- it("selects the last heading that crosses the active-section threshold", () => {
46
- const items = [
47
- { id: "intro", text: "Intro", level: 1 },
48
- { id: "details", text: "Details", level: 2 },
49
- { id: "finish", text: "Finish", level: 2 },
50
- ];
51
- const scrollRoot = document.createElement("div");
52
- setVerticalLayout(scrollRoot, {
53
- clientHeight: 300,
54
- scrollHeight: 900,
55
- top: 40,
56
- });
57
- const tops = new Map([
58
- ["intro", 8],
59
- ["details", 118],
60
- ["finish", 390],
61
- ]);
62
- const resolveHeading = (item) => {
63
- const element = document.createElement("h2");
64
- setVerticalLayout(element, {
65
- clientHeight: 32,
66
- scrollHeight: 32,
67
- top: tops.get(item.id),
68
- });
69
- return element;
70
- };
71
- expect(activeMarkdownOutlineId(items, resolveHeading, scrollRoot)).toBe("details");
72
- });
73
- it("keeps an explicitly focused outline target active while scrolling settles", () => {
74
- const items = [
75
- { id: "intro", text: "Intro", level: 1 },
76
- { id: "details", text: "Details", level: 2 },
77
- ];
78
- const intro = document.createElement("h1");
79
- const details = document.createElement("h2");
80
- const scrollRoot = document.createElement("div");
81
- const headings = new Map([
82
- ["intro", intro],
83
- ["details", details],
84
- ]);
85
- setVerticalLayout(scrollRoot, {
86
- clientHeight: 300,
87
- scrollHeight: 900,
88
- top: 0,
89
- });
90
- setVerticalLayout(intro, { clientHeight: 32, scrollHeight: 32, top: 8 });
91
- setVerticalLayout(details, {
92
- clientHeight: 32,
93
- scrollHeight: 32,
94
- top: 390,
95
- });
96
- expect(activeMarkdownOutlineId(items, (item) => headings.get(item.id) ?? null, scrollRoot, 96, details)).toBe("details");
97
- });
98
- });
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=portable-surfaces.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"portable-surfaces.test.d.ts","sourceRoot":"","sources":["../../src/preview/portable-surfaces.test.ts"],"names":[],"mappings":""}