@ecsplico/editor 2.1.2 → 3.0.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 (692) hide show
  1. package/CHANGELOG.md +68 -1
  2. package/README.md +39 -156
  3. package/dist/adapters/comments/drizzle.d.ts +1 -1
  4. package/dist/adapters/comments/{client.js → rest-model.js} +3 -3
  5. package/dist/adapters/comments/rest-model.js.map +1 -0
  6. package/dist/adapters/comments/types.d.ts +2 -2
  7. package/dist/adapters/document-state.d.ts +23 -0
  8. package/dist/adapters/document-state.js +66 -0
  9. package/dist/adapters/document-state.js.map +1 -0
  10. package/dist/adapters/documents.js +14 -11
  11. package/dist/adapters/documents.js.map +1 -1
  12. package/dist/adapters/drizzle.d.ts +2 -2
  13. package/dist/adapters/drizzle.js +97 -88
  14. package/dist/adapters/drizzle.js.map +1 -1
  15. package/dist/adapters/forge.d.ts +12 -7
  16. package/dist/adapters/forge.js +38 -45
  17. package/dist/adapters/forge.js.map +1 -1
  18. package/dist/adapters/http.d.ts +20 -0
  19. package/dist/adapters/http.js +68 -0
  20. package/dist/adapters/http.js.map +1 -0
  21. package/dist/adapters/index.d.ts +5 -5
  22. package/dist/adapters/json.d.ts +3 -3
  23. package/dist/adapters/json.js +58 -49
  24. package/dist/adapters/json.js.map +1 -1
  25. package/dist/adapters/memory.d.ts +21 -0
  26. package/dist/adapters/memory.js +53 -0
  27. package/dist/adapters/memory.js.map +1 -0
  28. package/dist/adapters/nitro.d.ts +23 -20
  29. package/dist/adapters/nitro.js +58 -163
  30. package/dist/adapters/nitro.js.map +1 -1
  31. package/dist/adapters/react.d.ts +55 -0
  32. package/dist/adapters/react.js +209 -0
  33. package/dist/adapters/react.js.map +1 -0
  34. package/dist/adapters/shared.d.ts +15 -21
  35. package/dist/adapters/shared.js +10 -8
  36. package/dist/adapters/shared.js.map +1 -1
  37. package/dist/adapters/vue.d.ts +15 -30
  38. package/dist/adapters/vue.js +36 -87
  39. package/dist/adapters/vue.js.map +1 -1
  40. package/dist/config/index.d.ts +105 -0
  41. package/dist/config/index.js +95 -0
  42. package/dist/config/index.js.map +1 -0
  43. package/dist/core/abilities.js +1 -0
  44. package/dist/core/abilities.js.map +1 -1
  45. package/dist/{adapters/routes.js → core/api-routes.js} +5 -3
  46. package/dist/core/api-routes.js.map +1 -0
  47. package/dist/core/backend-capability.d.ts +7 -0
  48. package/dist/core/backend-capability.js +17 -0
  49. package/dist/core/backend-capability.js.map +1 -0
  50. package/dist/core/backend-types.d.ts +245 -0
  51. package/dist/core/backend-types.js +17 -0
  52. package/dist/core/backend-types.js.map +1 -0
  53. package/dist/core/backend.d.ts +108 -0
  54. package/dist/core/backend.js +14 -0
  55. package/dist/core/backend.js.map +1 -0
  56. package/dist/core/block-convert.d.ts +7 -5
  57. package/dist/core/block-convert.js +28 -5
  58. package/dist/core/block-convert.js.map +1 -1
  59. package/dist/core/command-types.d.ts +89 -0
  60. package/dist/core/commands.d.ts +40 -0
  61. package/dist/core/commands.js +151 -0
  62. package/dist/core/commands.js.map +1 -0
  63. package/dist/core/context.d.ts +17 -20
  64. package/dist/core/context.js +24 -21
  65. package/dist/core/context.js.map +1 -1
  66. package/dist/core/core-feature.d.ts +22 -7
  67. package/dist/core/core-feature.js +51 -18
  68. package/dist/core/core-feature.js.map +1 -1
  69. package/dist/core/define-editor.d.ts +4 -3
  70. package/dist/core/define-editor.js +14 -7
  71. package/dist/core/define-editor.js.map +1 -1
  72. package/dist/core/document-markdown.js +12 -3
  73. package/dist/core/document-markdown.js.map +1 -1
  74. package/dist/core/editor-ui.d.ts +8 -1
  75. package/dist/core/editor-ui.js +9 -8
  76. package/dist/core/editor-ui.js.map +1 -1
  77. package/dist/core/extension-points.d.ts +3 -15
  78. package/dist/core/feature-context.d.ts +8 -7
  79. package/dist/core/feature-context.js +12 -11
  80. package/dist/core/feature-context.js.map +1 -1
  81. package/dist/core/feature.d.ts +35 -19
  82. package/dist/core/feature.js.map +1 -1
  83. package/dist/core/fences.d.ts +2 -1
  84. package/dist/core/fences.js +3 -2
  85. package/dist/core/fences.js.map +1 -1
  86. package/dist/core/fetch-error.d.ts +1 -1
  87. package/dist/core/fetch-error.js +3 -1
  88. package/dist/core/fetch-error.js.map +1 -1
  89. package/dist/core/hash.d.ts +5 -0
  90. package/dist/core/hash.js +11 -0
  91. package/dist/core/hash.js.map +1 -0
  92. package/dist/core/http-backend.d.ts +11 -0
  93. package/dist/core/http-backend.js +195 -0
  94. package/dist/core/http-backend.js.map +1 -0
  95. package/dist/core/index.d.ts +14 -9
  96. package/dist/core/index.js +12 -9
  97. package/dist/core/palette.d.ts +48 -0
  98. package/dist/core/palette.js +95 -0
  99. package/dist/core/palette.js.map +1 -0
  100. package/dist/core/schema/abilities.d.ts +2 -1
  101. package/dist/core/schema/abilities.js +5 -1
  102. package/dist/core/schema/abilities.js.map +1 -1
  103. package/dist/core/schema/index.d.ts +11 -5
  104. package/dist/core/schema/index.js +13 -8
  105. package/dist/core/schema/index.js.map +1 -1
  106. package/dist/core/schema/mark-flags.d.ts +8 -1
  107. package/dist/core/schema/of-features.d.ts +13 -0
  108. package/dist/core/schema/of-features.js +14 -0
  109. package/dist/core/schema/of-features.js.map +1 -0
  110. package/dist/core/slash.d.ts +8 -6
  111. package/dist/core/slash.js +24 -16
  112. package/dist/core/slash.js.map +1 -1
  113. package/dist/core/surface-session.js +13 -5
  114. package/dist/core/surface-session.js.map +1 -1
  115. package/dist/core/toolbar-items.d.ts +10 -4
  116. package/dist/core/toolbar-items.js +269 -195
  117. package/dist/core/toolbar-items.js.map +1 -1
  118. package/dist/core/util.js +11 -0
  119. package/dist/core/util.js.map +1 -0
  120. package/dist/document/DocumentSurface.d.ts +1 -1
  121. package/dist/features/ai/agent-op-review.d.ts +1 -1
  122. package/dist/features/ai/agent-op-review.js +1 -1
  123. package/dist/features/ai/agent-ops.js +1 -1
  124. package/dist/features/ai/ai-apply.d.ts +2 -2
  125. package/dist/features/ai/ai-apply.js +1 -1
  126. package/dist/features/ai/ai-review.js +1 -1
  127. package/dist/features/ai/ai-sse.d.ts +6 -6
  128. package/dist/features/ai/ai-sse.js +20 -63
  129. package/dist/features/ai/ai-sse.js.map +1 -1
  130. package/dist/features/ai/assistant.d.ts +8 -7
  131. package/dist/features/ai/assistant.js +3 -3
  132. package/dist/features/ai/assistant.js.map +1 -1
  133. package/dist/features/ai/block-actions.d.ts +3 -2
  134. package/dist/features/ai/block-actions.js +3 -2
  135. package/dist/features/ai/block-actions.js.map +1 -1
  136. package/dist/features/ai/components/AiSelectionMenu.js +1 -1
  137. package/dist/features/ai/components/DocumentChatAnswer.js +1 -1
  138. package/dist/features/ai/components/DocumentChatOps.vue.d.ts +1 -1
  139. package/dist/features/ai/components/SettingsModelProfiles.js +8 -8
  140. package/dist/features/ai/components/SettingsModelProfiles.js.map +1 -1
  141. package/dist/features/ai/document-chat-model.d.ts +8 -7
  142. package/dist/features/ai/document-chat-model.js +5 -5
  143. package/dist/features/ai/document-chat-model.js.map +1 -1
  144. package/dist/features/ai/document-chat.js +1 -1
  145. package/dist/features/ai/feature.js +27 -14
  146. package/dist/features/ai/feature.js.map +1 -1
  147. package/dist/features/ai/ghost-autocomplete.d.ts +7 -6
  148. package/dist/features/ai/ghost-autocomplete.js +6 -9
  149. package/dist/features/ai/ghost-autocomplete.js.map +1 -1
  150. package/dist/features/ai/index.d.ts +4 -3
  151. package/dist/features/ai/index.js +10 -10
  152. package/dist/features/ai/model-profiles.d.ts +5 -4
  153. package/dist/features/ai/model-profiles.js +2 -2
  154. package/dist/features/ai/model-profiles.js.map +1 -1
  155. package/dist/features/ai/protocol/block-lines.js +1 -1
  156. package/dist/features/ai/protocol/block-lines.js.map +1 -1
  157. package/dist/features/ai/protocol/chat.js +4 -1
  158. package/dist/features/ai/protocol/chat.js.map +1 -1
  159. package/dist/features/ai/protocol/index.d.ts +3 -2
  160. package/dist/features/ai/protocol/models.d.ts +2 -16
  161. package/dist/features/ai/protocol/models.js.map +1 -1
  162. package/dist/features/ai/rate-limit.d.ts +1 -1
  163. package/dist/features/ai/rate-limit.js +3 -1
  164. package/dist/features/ai/rate-limit.js.map +1 -1
  165. package/dist/features/ai/react/AiSelectionMenu.js +2 -2
  166. package/dist/features/ai/react/AiSidebar.js +4 -4
  167. package/dist/features/ai/react/DocumentChatAnswer.js +1 -1
  168. package/dist/features/ai/react/DocumentChatOps.d.ts +1 -1
  169. package/dist/features/ai/react/DocumentChatOps.js +1 -1
  170. package/dist/features/ai/react/SettingsModelProfiles.js +8 -10
  171. package/dist/features/ai/react/SettingsModelProfiles.js.map +1 -1
  172. package/dist/features/ai/react/use-ai-assistant.d.ts +1 -1
  173. package/dist/features/ai/react/use-ai-assistant.js +3 -3
  174. package/dist/features/ai/react/use-ai-assistant.js.map +1 -1
  175. package/dist/features/ai/react/use-document-chat.js +2 -2
  176. package/dist/features/ai/react/use-document-chat.js.map +1 -1
  177. package/dist/features/ai/react/use-model-profiles.d.ts +2 -1
  178. package/dist/features/ai/selection-flow.d.ts +1 -1
  179. package/dist/features/ai/selection-flow.js +1 -1
  180. package/dist/features/ai/sidebar-flow.d.ts +1 -1
  181. package/dist/features/ai/sidebar-flow.js +1 -1
  182. package/dist/features/ai/use-ai-assistant.d.ts +1 -1
  183. package/dist/features/ai/use-ai-assistant.js +3 -3
  184. package/dist/features/ai/use-ai-assistant.js.map +1 -1
  185. package/dist/features/ai/use-document-chat.js +2 -2
  186. package/dist/features/ai/use-document-chat.js.map +1 -1
  187. package/dist/features/ai/use-model-profiles.d.ts +2 -1
  188. package/dist/features/authors/attribution.d.ts +1 -1
  189. package/dist/features/authors/feature.js +12 -11
  190. package/dist/features/authors/feature.js.map +1 -1
  191. package/dist/features/block-ui/block-actions.d.ts +1 -1
  192. package/dist/features/block-ui/block-actions.js +1 -1
  193. package/dist/features/block-ui/block-actions.js.map +1 -1
  194. package/dist/features/block-ui/components/BlockUi.js +1 -1
  195. package/dist/features/block-ui/feature.js +1 -0
  196. package/dist/features/block-ui/feature.js.map +1 -1
  197. package/dist/features/block-ui/react/BlockUi.js +1 -1
  198. package/dist/features/collab/anchor-resolver.js +1 -1
  199. package/dist/features/collab/feature.js +2 -0
  200. package/dist/features/collab/feature.js.map +1 -1
  201. package/dist/features/comments/components/CommentThreadView.vue.d.ts +2 -1
  202. package/dist/features/comments/feature.js +12 -11
  203. package/dist/features/comments/feature.js.map +1 -1
  204. package/dist/features/comments/index.d.ts +3 -2
  205. package/dist/features/comments/index.js +1 -1
  206. package/dist/features/comments/margin-layout.d.ts +3 -2
  207. package/dist/features/comments/model.d.ts +3 -67
  208. package/dist/features/comments/model.js +2 -2
  209. package/dist/features/comments/model.js.map +1 -1
  210. package/dist/features/comments/react/CommentThreadView.d.ts +3 -2
  211. package/dist/features/comments/react/use-comments.d.ts +2 -1
  212. package/dist/features/comments/react.d.ts +1 -1
  213. package/dist/features/comments/schema.d.ts +2 -52
  214. package/dist/features/comments/schema.js.map +1 -1
  215. package/dist/features/comments/snapshot-equality.js.map +1 -1
  216. package/dist/features/comments/use-comments.d.ts +3 -2
  217. package/dist/features/comments/vue.d.ts +1 -1
  218. package/dist/features/composites/accepted-children.d.ts +1 -0
  219. package/dist/features/composites/accepted-children.js +16 -1
  220. package/dist/features/composites/accepted-children.js.map +1 -1
  221. package/dist/features/composites/ai-brief.js +31 -0
  222. package/dist/features/composites/ai-brief.js.map +1 -1
  223. package/dist/features/composites/bibliography-command.d.ts +11 -0
  224. package/dist/features/composites/bibliography-form.js +90 -0
  225. package/dist/features/composites/bibliography-form.js.map +1 -0
  226. package/dist/features/composites/bibliography.d.ts +33 -0
  227. package/dist/features/composites/bibliography.js +120 -0
  228. package/dist/features/composites/bibliography.js.map +1 -0
  229. package/dist/features/composites/components/BibliographyEditor.js +261 -0
  230. package/dist/features/composites/components/BibliographyEditor.js.map +1 -0
  231. package/dist/features/composites/components/CompositeChrome.js +75 -26
  232. package/dist/features/composites/components/CompositeChrome.js.map +1 -1
  233. package/dist/features/composites/components/CompositeDetails.js +46 -11
  234. package/dist/features/composites/components/CompositeDetails.js.map +1 -1
  235. package/dist/features/composites/components/CompositeDetails.vue.d.ts +2 -1
  236. package/dist/features/composites/components/CompositeFieldEditor.js +37 -4
  237. package/dist/features/composites/components/CompositeFieldEditor.js.map +1 -1
  238. package/dist/features/composites/components/CompositeInspector.js +17 -5
  239. package/dist/features/composites/components/CompositeInspector.js.map +1 -1
  240. package/dist/features/composites/components/CompositeTable.js +13 -4
  241. package/dist/features/composites/components/CompositeTable.js.map +1 -1
  242. package/dist/features/composites/components/CompositeTagsEditor.js +1 -1
  243. package/dist/features/composites/components/CompositeView.js +11 -1
  244. package/dist/features/composites/components/CompositeView.js.map +1 -1
  245. package/dist/features/composites/components/DerivationBadge.js +103 -0
  246. package/dist/features/composites/components/DerivationBadge.js.map +1 -0
  247. package/dist/features/composites/components/ReferenceFieldSelect.js +60 -0
  248. package/dist/features/composites/components/ReferenceFieldSelect.js.map +1 -0
  249. package/dist/features/composites/components/ReferenceView.js +122 -0
  250. package/dist/features/composites/components/ReferenceView.js.map +1 -0
  251. package/dist/features/composites/components/ReferenceView.vue.d.ts +96 -0
  252. package/dist/features/composites/components/SettingsEditingTab.js +1 -1
  253. package/dist/features/composites/convert.js +2 -2
  254. package/dist/features/composites/convert.js.map +1 -1
  255. package/dist/features/composites/derivation.d.ts +61 -0
  256. package/dist/features/composites/derivation.js +98 -0
  257. package/dist/features/composites/derivation.js.map +1 -0
  258. package/dist/features/composites/derived-chrome.js +69 -0
  259. package/dist/features/composites/derived-chrome.js.map +1 -0
  260. package/dist/features/composites/feature.js +159 -109
  261. package/dist/features/composites/feature.js.map +1 -1
  262. package/dist/features/composites/fences.d.ts +4 -3
  263. package/dist/features/composites/fences.js +51 -7
  264. package/dist/features/composites/fences.js.map +1 -1
  265. package/dist/features/composites/index.d.ts +12 -3
  266. package/dist/features/composites/index.js +15 -6
  267. package/dist/features/composites/inspector-model.d.ts +4 -1
  268. package/dist/features/composites/inspector-model.js +8 -4
  269. package/dist/features/composites/inspector-model.js.map +1 -1
  270. package/dist/features/composites/kinds.d.ts +8 -1
  271. package/dist/features/composites/kinds.js +145 -6
  272. package/dist/features/composites/kinds.js.map +1 -1
  273. package/dist/features/composites/legacy.d.ts +4 -1
  274. package/dist/features/composites/legacy.js +56 -1
  275. package/dist/features/composites/legacy.js.map +1 -1
  276. package/dist/features/composites/meta-display.js +40 -1
  277. package/dist/features/composites/meta-display.js.map +1 -1
  278. package/dist/features/composites/meta-keys.d.ts +7 -0
  279. package/dist/features/composites/meta-keys.js +21 -0
  280. package/dist/features/composites/meta-keys.js.map +1 -0
  281. package/dist/features/composites/node-views.d.ts +6 -3
  282. package/dist/features/composites/node-views.js +7 -3
  283. package/dist/features/composites/node-views.js.map +1 -1
  284. package/dist/features/composites/nodes.d.ts +6 -1
  285. package/dist/features/composites/nodes.js +33 -7
  286. package/dist/features/composites/nodes.js.map +1 -1
  287. package/dist/features/composites/react/BibliographyEditor.js +229 -0
  288. package/dist/features/composites/react/BibliographyEditor.js.map +1 -0
  289. package/dist/features/composites/react/CompositeChrome.js +65 -17
  290. package/dist/features/composites/react/CompositeChrome.js.map +1 -1
  291. package/dist/features/composites/react/CompositeDetails.d.ts +2 -1
  292. package/dist/features/composites/react/CompositeDetails.js +45 -6
  293. package/dist/features/composites/react/CompositeDetails.js.map +1 -1
  294. package/dist/features/composites/react/CompositeFieldEditor.d.ts +1 -1
  295. package/dist/features/composites/react/CompositeFieldEditor.js +24 -1
  296. package/dist/features/composites/react/CompositeFieldEditor.js.map +1 -1
  297. package/dist/features/composites/react/CompositeInspector.js +11 -5
  298. package/dist/features/composites/react/CompositeInspector.js.map +1 -1
  299. package/dist/features/composites/react/CompositeStatusMenu.js +1 -1
  300. package/dist/features/composites/react/CompositeSummaryEditor.js +1 -1
  301. package/dist/features/composites/react/CompositeTable.js +16 -2
  302. package/dist/features/composites/react/CompositeTable.js.map +1 -1
  303. package/dist/features/composites/react/CompositeTagsEditor.js +2 -2
  304. package/dist/features/composites/react/CompositeView.js +6 -1
  305. package/dist/features/composites/react/CompositeView.js.map +1 -1
  306. package/dist/features/composites/react/DerivationBadge.js +116 -0
  307. package/dist/features/composites/react/DerivationBadge.js.map +1 -0
  308. package/dist/features/composites/react/ReferenceFieldSelect.js +52 -0
  309. package/dist/features/composites/react/ReferenceFieldSelect.js.map +1 -0
  310. package/dist/features/composites/react/ReferenceView.d.ts +11 -0
  311. package/dist/features/composites/react/ReferenceView.js +115 -0
  312. package/dist/features/composites/react/ReferenceView.js.map +1 -0
  313. package/dist/features/composites/react/SettingsEditingTab.js +2 -2
  314. package/dist/features/composites/react.d.ts +2 -1
  315. package/dist/features/composites/react.js +7 -3
  316. package/dist/features/composites/react.js.map +1 -1
  317. package/dist/features/composites/reference-ai.js +16 -0
  318. package/dist/features/composites/reference-ai.js.map +1 -0
  319. package/dist/features/composites/reference-label.d.ts +19 -0
  320. package/dist/features/composites/reference-label.js +58 -0
  321. package/dist/features/composites/reference-label.js.map +1 -0
  322. package/dist/features/composites/reference-suggestion.d.ts +10 -0
  323. package/dist/features/composites/reference-suggestion.js +41 -0
  324. package/dist/features/composites/reference-suggestion.js.map +1 -0
  325. package/dist/features/composites/reference-text.d.ts +18 -0
  326. package/dist/features/composites/reference-text.js +89 -0
  327. package/dist/features/composites/reference-text.js.map +1 -0
  328. package/dist/features/composites/reference.d.ts +44 -0
  329. package/dist/features/composites/reference.js +148 -0
  330. package/dist/features/composites/reference.js.map +1 -0
  331. package/dist/features/composites/reveal-source.d.ts +32 -0
  332. package/dist/features/composites/reveal-source.js +89 -0
  333. package/dist/features/composites/reveal-source.js.map +1 -0
  334. package/dist/features/composites/rows.d.ts +21 -2
  335. package/dist/features/composites/rows.js +63 -9
  336. package/dist/features/composites/rows.js.map +1 -1
  337. package/dist/features/composites/schema.d.ts +9 -3
  338. package/dist/features/composites/schema.js +11 -4
  339. package/dist/features/composites/schema.js.map +1 -1
  340. package/dist/features/composites/table-model.js +12 -21
  341. package/dist/features/composites/table-model.js.map +1 -1
  342. package/dist/features/composites/vue.d.ts +3 -2
  343. package/dist/features/composites/vue.js +8 -4
  344. package/dist/features/composites/vue.js.map +1 -1
  345. package/dist/features/media/assets.d.ts +2 -0
  346. package/dist/features/media/assets.js +3 -2
  347. package/dist/features/media/assets.js.map +1 -1
  348. package/dist/features/media/components/FileView.js +13 -4
  349. package/dist/features/media/components/FileView.js.map +1 -1
  350. package/dist/features/media/feature.d.ts +3 -3
  351. package/dist/features/media/feature.js +21 -28
  352. package/dist/features/media/feature.js.map +1 -1
  353. package/dist/features/media/file-import.js +2 -2
  354. package/dist/features/media/file-import.js.map +1 -1
  355. package/dist/features/media/index.d.ts +2 -2
  356. package/dist/features/media/index.js +2 -2
  357. package/dist/features/media/react/FileView.js +19 -2
  358. package/dist/features/media/react/FileView.js.map +1 -1
  359. package/dist/features/media/schema.d.ts +8 -0
  360. package/dist/features/media/schema.js +126 -11
  361. package/dist/features/media/schema.js.map +1 -1
  362. package/dist/features/media/upload.d.ts +16 -14
  363. package/dist/features/media/upload.js +13 -19
  364. package/dist/features/media/upload.js.map +1 -1
  365. package/dist/features/mentions/index.d.ts +4 -3
  366. package/dist/features/mentions/index.js +4 -1
  367. package/dist/features/mentions/index.js.map +1 -1
  368. package/dist/features/mentions/mention-text.d.ts +1 -1
  369. package/dist/features/mentions/mention-text.js.map +1 -1
  370. package/dist/features/mentions/mention.d.ts +0 -6
  371. package/dist/features/mentions/mention.js.map +1 -1
  372. package/dist/features/mentions/metadata-defaults.d.ts +2 -2
  373. package/dist/features/mentions/metadata-defaults.js +3 -9
  374. package/dist/features/mentions/metadata-defaults.js.map +1 -1
  375. package/dist/features/mentions/schema.d.ts +2 -1
  376. package/dist/features/mentions/schema.js.map +1 -1
  377. package/dist/features/tables/feature.d.ts +2 -1
  378. package/dist/features/tables/feature.js +90 -70
  379. package/dist/features/tables/feature.js.map +1 -1
  380. package/dist/features/themes/components/SettingsAppearanceTab.js +6 -9
  381. package/dist/features/themes/components/SettingsAppearanceTab.js.map +1 -1
  382. package/dist/features/themes/feature.js +2 -0
  383. package/dist/features/themes/feature.js.map +1 -1
  384. package/dist/features/themes/index.d.ts +2 -1
  385. package/dist/features/themes/react/SettingsAppearanceTab.js +7 -10
  386. package/dist/features/themes/react/SettingsAppearanceTab.js.map +1 -1
  387. package/dist/features/themes/schema.d.ts +2 -6
  388. package/dist/features/themes/schema.js.map +1 -1
  389. package/dist/features/themes/theme-runtime.d.ts +1 -1
  390. package/dist/features/themes/theme-runtime.js +4 -2
  391. package/dist/features/themes/theme-runtime.js.map +1 -1
  392. package/dist/features/transcript/TranscriptSegmentView.js +48 -28
  393. package/dist/features/transcript/TranscriptSegmentView.js.map +1 -1
  394. package/dist/features/transcript/feature.js +21 -19
  395. package/dist/features/transcript/feature.js.map +1 -1
  396. package/dist/features/transcript/react/TranscriptSegmentView.js +55 -36
  397. package/dist/features/transcript/react/TranscriptSegmentView.js.map +1 -1
  398. package/dist/features/transcript/segment-node.d.ts +2 -0
  399. package/dist/features/transcript/segment-node.js +35 -7
  400. package/dist/features/transcript/segment-node.js.map +1 -1
  401. package/dist/i18n/de/composites.js +91 -1
  402. package/dist/i18n/de/composites.js.map +1 -1
  403. package/dist/i18n/de/integrations.js +49 -8
  404. package/dist/i18n/de/integrations.js.map +1 -1
  405. package/dist/i18n/de/media.js +0 -1
  406. package/dist/i18n/de/media.js.map +1 -1
  407. package/dist/i18n/de/palette.js +22 -0
  408. package/dist/i18n/de/palette.js.map +1 -0
  409. package/dist/i18n/de/tables.js +0 -1
  410. package/dist/i18n/de/tables.js.map +1 -1
  411. package/dist/i18n/de/transcript.js +2 -1
  412. package/dist/i18n/de/transcript.js.map +1 -1
  413. package/dist/i18n/de/tree.js +3 -0
  414. package/dist/i18n/de/tree.js.map +1 -1
  415. package/dist/i18n/de.d.ts +157 -11
  416. package/dist/i18n/de.js +3 -1
  417. package/dist/i18n/de.js.map +1 -1
  418. package/dist/i18n/en/composites.js +89 -1
  419. package/dist/i18n/en/composites.js.map +1 -1
  420. package/dist/i18n/en/integrations.js +49 -8
  421. package/dist/i18n/en/integrations.js.map +1 -1
  422. package/dist/i18n/en/media.js +0 -1
  423. package/dist/i18n/en/media.js.map +1 -1
  424. package/dist/i18n/en/palette.js +22 -0
  425. package/dist/i18n/en/palette.js.map +1 -0
  426. package/dist/i18n/en/tables.js +0 -1
  427. package/dist/i18n/en/tables.js.map +1 -1
  428. package/dist/i18n/en/transcript.js +2 -1
  429. package/dist/i18n/en/transcript.js.map +1 -1
  430. package/dist/i18n/en/tree.js +3 -0
  431. package/dist/i18n/en/tree.js.map +1 -1
  432. package/dist/i18n/en.js +3 -1
  433. package/dist/i18n/en.js.map +1 -1
  434. package/dist/index.d.ts +4 -3
  435. package/dist/integrations/composite-ai/bibliography-fetch.d.ts +31 -0
  436. package/dist/integrations/composite-ai/bibliography-fetch.js +159 -0
  437. package/dist/integrations/composite-ai/bibliography-fetch.js.map +1 -0
  438. package/dist/integrations/composite-ai/composite-fill.d.ts +30 -8
  439. package/dist/integrations/composite-ai/composite-fill.js +97 -56
  440. package/dist/integrations/composite-ai/composite-fill.js.map +1 -1
  441. package/dist/integrations/composite-ai/composite-summary.d.ts +4 -12
  442. package/dist/integrations/composite-ai/composite-summary.js +7 -26
  443. package/dist/integrations/composite-ai/composite-summary.js.map +1 -1
  444. package/dist/integrations/composite-ai/derive.d.ts +29 -0
  445. package/dist/integrations/composite-ai/derive.js +173 -0
  446. package/dist/integrations/composite-ai/derive.js.map +1 -0
  447. package/dist/integrations/composite-ai/index.d.ts +11 -7
  448. package/dist/integrations/composite-ai/index.js +72 -14
  449. package/dist/integrations/composite-ai/index.js.map +1 -1
  450. package/dist/integrations/composite-ai/rendition.d.ts +45 -0
  451. package/dist/integrations/composite-ai/rendition.js +314 -0
  452. package/dist/integrations/composite-ai/rendition.js.map +1 -0
  453. package/dist/integrations/composite-media/index.d.ts +7 -5
  454. package/dist/integrations/composite-media/index.js +86 -13
  455. package/dist/integrations/composite-media/index.js.map +1 -1
  456. package/dist/integrations/transcript-ai/index.d.ts +1 -1
  457. package/dist/integrations/transcript-ai/index.js +5 -2
  458. package/dist/integrations/transcript-ai/index.js.map +1 -1
  459. package/dist/integrations/transcript-ai/protocol.d.ts +2 -12
  460. package/dist/integrations/transcript-ai/protocol.js +0 -2
  461. package/dist/integrations/transcript-ai/protocol.js.map +1 -1
  462. package/dist/integrations/transcript-ai/transcript-cleanup.d.ts +5 -5
  463. package/dist/integrations/transcript-ai/transcript-cleanup.js +7 -10
  464. package/dist/integrations/transcript-ai/transcript-cleanup.js.map +1 -1
  465. package/dist/markdown/MarkdownSurface.vue.d.ts +6 -5
  466. package/dist/markdown/MarkdownSurface2.js +3 -6
  467. package/dist/markdown/MarkdownSurface2.js.map +1 -1
  468. package/dist/markdown/document.js +1 -1
  469. package/dist/markdown/source-mode.d.ts +1 -1
  470. package/dist/nuxt/module.d.ts +1402 -54
  471. package/dist/nuxt/module.js +6 -49
  472. package/dist/nuxt/module.js.map +1 -1
  473. package/dist/nuxt/runtime/install-context.d.ts +7 -3
  474. package/dist/nuxt/runtime/install-context.js +14 -8
  475. package/dist/nuxt/runtime/install-context.js.map +1 -1
  476. package/dist/nuxt/runtime/plugins/editor-context-nuxt-ui.client.ts +2 -2
  477. package/dist/nuxt/runtime/server/plugins/editor-server.js +20 -12
  478. package/dist/nuxt/runtime/server/plugins/editor-server.js.map +1 -1
  479. package/dist/presets/compose.d.ts +94 -0
  480. package/dist/presets/compose.js +164 -0
  481. package/dist/presets/compose.js.map +1 -0
  482. package/dist/react/AdvancedEditor.d.ts +15 -15
  483. package/dist/react/AdvancedEditor.js +15 -13
  484. package/dist/react/AdvancedEditor.js.map +1 -1
  485. package/dist/react/EditorCommandPalette.d.ts +13 -0
  486. package/dist/react/EditorCommandPalette.js +118 -0
  487. package/dist/react/EditorCommandPalette.js.map +1 -0
  488. package/dist/react/EditorSettingsModal.d.ts +5 -5
  489. package/dist/react/EditorSettingsModal.js +7 -4
  490. package/dist/react/EditorSettingsModal.js.map +1 -1
  491. package/dist/react/EditorSettingsPanel.d.ts +7 -7
  492. package/dist/react/EditorSettingsPanel.js +8 -5
  493. package/dist/react/EditorSettingsPanel.js.map +1 -1
  494. package/dist/react/EditorSurface.d.ts +7 -7
  495. package/dist/react/EditorSurface.js +10 -6
  496. package/dist/react/EditorSurface.js.map +1 -1
  497. package/dist/react/EditorToolbar.d.ts +4 -6
  498. package/dist/react/EditorToolbar.js +29 -37
  499. package/dist/react/EditorToolbar.js.map +1 -1
  500. package/dist/react/SimpleEditor.d.ts +22 -23
  501. package/dist/react/SimpleEditor.js +21 -7
  502. package/dist/react/SimpleEditor.js.map +1 -1
  503. package/dist/react/advanced.d.ts +4 -3
  504. package/dist/react/advanced.js +2 -2
  505. package/dist/react/compose.d.ts +20 -0
  506. package/dist/react/compose.js +49 -0
  507. package/dist/react/compose.js.map +1 -0
  508. package/dist/react/composed-surface.d.ts +39 -0
  509. package/dist/react/composed-surface.js +71 -0
  510. package/dist/react/composed-surface.js.map +1 -0
  511. package/dist/react/context.js +6 -2
  512. package/dist/react/context.js.map +1 -1
  513. package/dist/react/index.d.ts +2 -1
  514. package/dist/react/index.js +2 -1
  515. package/dist/react/key-labels.js +15 -0
  516. package/dist/react/key-labels.js.map +1 -0
  517. package/dist/react/settings.d.ts +1 -1
  518. package/dist/react/simple.d.ts +2 -2
  519. package/dist/react/ui/command.js +36 -1
  520. package/dist/react/ui/command.js.map +1 -1
  521. package/dist/schema/advanced.d.ts +6 -6
  522. package/dist/schema/advanced.js +26 -29
  523. package/dist/schema/advanced.js.map +1 -1
  524. package/dist/server/ai.d.ts +5 -16
  525. package/dist/server/ai.js.map +1 -1
  526. package/dist/server/auth.d.ts +9 -0
  527. package/dist/server/collab-state.d.ts +1 -1
  528. package/dist/server/collab-state.js.map +1 -1
  529. package/dist/server/collab.d.ts +13 -13
  530. package/dist/server/collab.js +34 -18
  531. package/dist/server/collab.js.map +1 -1
  532. package/dist/server/crossref.js +78 -0
  533. package/dist/server/crossref.js.map +1 -0
  534. package/dist/server/errors.d.ts +1 -1
  535. package/dist/server/errors.js +1 -1
  536. package/dist/server/errors.js.map +1 -1
  537. package/dist/server/extract.js +308 -0
  538. package/dist/server/extract.js.map +1 -0
  539. package/dist/{nuxt/runtime/server/utils/editor-route.js → server/h3.js} +8 -16
  540. package/dist/server/h3.js.map +1 -0
  541. package/dist/server/handlers/ai.d.ts +30 -9
  542. package/dist/server/handlers/ai.js +170 -36
  543. package/dist/server/handlers/ai.js.map +1 -1
  544. package/dist/server/handlers/context.d.ts +12 -5
  545. package/dist/server/handlers/context.js +10 -4
  546. package/dist/server/handlers/context.js.map +1 -1
  547. package/dist/server/handlers/editor.d.ts +19 -13
  548. package/dist/server/handlers/editor.js +49 -38
  549. package/dist/server/handlers/editor.js.map +1 -1
  550. package/dist/server/handlers/index.d.ts +4 -4
  551. package/dist/server/handlers/index.js +4 -4
  552. package/dist/server/host.d.ts +16 -25
  553. package/dist/server/host.js +58 -41
  554. package/dist/server/host.js.map +1 -1
  555. package/dist/server/index.d.ts +6 -4
  556. package/dist/server/index.js +3 -2
  557. package/dist/server/pdf.js +97 -0
  558. package/dist/server/pdf.js.map +1 -0
  559. package/dist/server/{adapter.d.ts → ports.d.ts} +81 -30
  560. package/dist/server/ports.js +29 -0
  561. package/dist/server/ports.js.map +1 -0
  562. package/dist/server/routes.js +144 -0
  563. package/dist/server/routes.js.map +1 -0
  564. package/dist/settings/index.d.ts +1 -1
  565. package/dist/settings/index.js.map +1 -1
  566. package/dist/styles/composites.css +25 -0
  567. package/dist/tree/DocumentTree.js +56 -29
  568. package/dist/tree/DocumentTree.js.map +1 -1
  569. package/dist/tree/react/DocumentTree.js +23 -0
  570. package/dist/tree/react/DocumentTree.js.map +1 -1
  571. package/dist/tree/tree-host.js +2 -2
  572. package/dist/tree/tree-items.js +1 -1
  573. package/dist/vue/AdvancedEditor.js +30 -9
  574. package/dist/vue/AdvancedEditor.js.map +1 -1
  575. package/dist/vue/AdvancedEditor.vue.d.ts +28 -8
  576. package/dist/vue/SimpleEditor.js +62 -16
  577. package/dist/vue/SimpleEditor.js.map +1 -1
  578. package/dist/vue/SimpleEditor.vue.d.ts +37 -7
  579. package/dist/vue/advanced.d.ts +3 -2
  580. package/dist/vue/advanced.js +2 -2
  581. package/dist/vue/components/EditorCommandPalette.js +91 -0
  582. package/dist/vue/components/EditorCommandPalette.js.map +1 -0
  583. package/dist/vue/components/EditorCommandPalette.vue.d.ts +15 -0
  584. package/dist/vue/components/EditorSettingsModal.js +10 -6
  585. package/dist/vue/components/EditorSettingsModal.js.map +1 -1
  586. package/dist/vue/components/EditorSettingsModal.vue.d.ts +4 -4
  587. package/dist/vue/components/EditorSettingsPanel.js +10 -6
  588. package/dist/vue/components/EditorSettingsPanel.js.map +1 -1
  589. package/dist/vue/components/EditorSettingsPanel.vue.d.ts +6 -6
  590. package/dist/vue/components/EditorSurface.js +11 -6
  591. package/dist/vue/components/EditorSurface.js.map +1 -1
  592. package/dist/vue/components/EditorSurface.vue.d.ts +7 -7
  593. package/dist/vue/components/EditorToolbar.js +41 -49
  594. package/dist/vue/components/EditorToolbar.js.map +1 -1
  595. package/dist/vue/components/EditorToolbar.vue.d.ts +2 -4
  596. package/dist/vue/compose.d.ts +17 -0
  597. package/dist/vue/compose.js +51 -0
  598. package/dist/vue/compose.js.map +1 -0
  599. package/dist/vue/context-key.d.ts +6 -0
  600. package/dist/vue/context-key.js +6 -0
  601. package/dist/vue/context-key.js.map +1 -0
  602. package/dist/vue/context.d.ts +8 -6
  603. package/dist/vue/context.js +6 -5
  604. package/dist/vue/context.js.map +1 -1
  605. package/dist/vue/index.d.ts +10 -8
  606. package/dist/vue/index.js +10 -8
  607. package/dist/vue/kit/index.d.ts +2 -2
  608. package/dist/vue/kit/nuxt-ui.js +23 -0
  609. package/dist/vue/kit/nuxt-ui.js.map +1 -1
  610. package/dist/vue/kit/types.d.ts +40 -1
  611. package/package.json +30 -16
  612. package/dist/adapters/comments/client.d.ts +0 -64
  613. package/dist/adapters/comments/client.js.map +0 -1
  614. package/dist/adapters/routes.js.map +0 -1
  615. package/dist/core/toolbar.d.ts +0 -74
  616. package/dist/core/toolbar.js +0 -45
  617. package/dist/core/toolbar.js.map +0 -1
  618. package/dist/integrations/composite-ai/document-transcribe.d.ts +0 -14
  619. package/dist/integrations/composite-ai/document-transcribe.js +0 -89
  620. package/dist/integrations/composite-ai/document-transcribe.js.map +0 -1
  621. package/dist/nuxt/runtime/server/api/ai/chat.post.d.ts +0 -5
  622. package/dist/nuxt/runtime/server/api/ai/chat.post.js +0 -8
  623. package/dist/nuxt/runtime/server/api/ai/chat.post.js.map +0 -1
  624. package/dist/nuxt/runtime/server/api/ai/complete.post.d.ts +0 -5
  625. package/dist/nuxt/runtime/server/api/ai/complete.post.js +0 -8
  626. package/dist/nuxt/runtime/server/api/ai/complete.post.js.map +0 -1
  627. package/dist/nuxt/runtime/server/api/ai/generate.post.d.ts +0 -5
  628. package/dist/nuxt/runtime/server/api/ai/generate.post.js +0 -8
  629. package/dist/nuxt/runtime/server/api/ai/generate.post.js.map +0 -1
  630. package/dist/nuxt/runtime/server/api/ai/models.get.d.ts +0 -5
  631. package/dist/nuxt/runtime/server/api/ai/models.get.js +0 -8
  632. package/dist/nuxt/runtime/server/api/ai/models.get.js.map +0 -1
  633. package/dist/nuxt/runtime/server/api/ai/transcribe.post.d.ts +0 -5
  634. package/dist/nuxt/runtime/server/api/ai/transcribe.post.js +0 -8
  635. package/dist/nuxt/runtime/server/api/ai/transcribe.post.js.map +0 -1
  636. package/dist/nuxt/runtime/server/api/ai/transcript-cleanup.post.d.ts +0 -5
  637. package/dist/nuxt/runtime/server/api/ai/transcript-cleanup.post.js +0 -8
  638. package/dist/nuxt/runtime/server/api/ai/transcript-cleanup.post.js.map +0 -1
  639. package/dist/nuxt/runtime/server/api/editor/assets/[id]/[name].get.d.ts +0 -5
  640. package/dist/nuxt/runtime/server/api/editor/assets/[id]/[name].get.js +0 -8
  641. package/dist/nuxt/runtime/server/api/editor/assets/[id]/[name].get.js.map +0 -1
  642. package/dist/nuxt/runtime/server/api/editor/assets/[id].post.d.ts +0 -5
  643. package/dist/nuxt/runtime/server/api/editor/assets/[id].post.js +0 -8
  644. package/dist/nuxt/runtime/server/api/editor/assets/[id].post.js.map +0 -1
  645. package/dist/nuxt/runtime/server/api/editor/settings.get.d.ts +0 -5
  646. package/dist/nuxt/runtime/server/api/editor/settings.get.js +0 -8
  647. package/dist/nuxt/runtime/server/api/editor/settings.get.js.map +0 -1
  648. package/dist/nuxt/runtime/server/api/editor/settings.put.d.ts +0 -5
  649. package/dist/nuxt/runtime/server/api/editor/settings.put.js +0 -8
  650. package/dist/nuxt/runtime/server/api/editor/settings.put.js.map +0 -1
  651. package/dist/nuxt/runtime/server/api/editor/tags.get.d.ts +0 -5
  652. package/dist/nuxt/runtime/server/api/editor/tags.get.js +0 -8
  653. package/dist/nuxt/runtime/server/api/editor/tags.get.js.map +0 -1
  654. package/dist/nuxt/runtime/server/api/editor/themes/[id].delete.d.ts +0 -5
  655. package/dist/nuxt/runtime/server/api/editor/themes/[id].delete.js +0 -8
  656. package/dist/nuxt/runtime/server/api/editor/themes/[id].delete.js.map +0 -1
  657. package/dist/nuxt/runtime/server/api/editor/themes/[id].get.d.ts +0 -5
  658. package/dist/nuxt/runtime/server/api/editor/themes/[id].get.js +0 -8
  659. package/dist/nuxt/runtime/server/api/editor/themes/[id].get.js.map +0 -1
  660. package/dist/nuxt/runtime/server/api/editor/themes/index.get.d.ts +0 -5
  661. package/dist/nuxt/runtime/server/api/editor/themes/index.get.js +0 -8
  662. package/dist/nuxt/runtime/server/api/editor/themes/index.get.js.map +0 -1
  663. package/dist/nuxt/runtime/server/api/editor/themes/index.post.d.ts +0 -5
  664. package/dist/nuxt/runtime/server/api/editor/themes/index.post.js +0 -8
  665. package/dist/nuxt/runtime/server/api/editor/themes/index.post.js.map +0 -1
  666. package/dist/nuxt/runtime/server/api/editor/users.get.d.ts +0 -5
  667. package/dist/nuxt/runtime/server/api/editor/users.get.js +0 -8
  668. package/dist/nuxt/runtime/server/api/editor/users.get.js.map +0 -1
  669. package/dist/nuxt/runtime/server/plugins/collab.d.ts +0 -5
  670. package/dist/nuxt/runtime/server/plugins/collab.js +0 -10
  671. package/dist/nuxt/runtime/server/plugins/collab.js.map +0 -1
  672. package/dist/nuxt/runtime/server/routes/collab/[id].d.ts +0 -5
  673. package/dist/nuxt/runtime/server/routes/collab/[id].js +0 -35
  674. package/dist/nuxt/runtime/server/routes/collab/[id].js.map +0 -1
  675. package/dist/nuxt/runtime/server/utils/editor-route.d.ts +0 -11
  676. package/dist/nuxt/runtime/server/utils/editor-route.js.map +0 -1
  677. package/dist/presets/advanced.d.ts +0 -33
  678. package/dist/presets/advanced.js +0 -50
  679. package/dist/presets/advanced.js.map +0 -1
  680. package/dist/presets/simple.d.ts +0 -9
  681. package/dist/presets/simple.js +0 -12
  682. package/dist/presets/simple.js.map +0 -1
  683. package/dist/react/advanced-preset.d.ts +0 -11
  684. package/dist/react/advanced-preset.js +0 -31
  685. package/dist/react/advanced-preset.js.map +0 -1
  686. package/dist/vue/advanced-preset.d.ts +0 -13
  687. package/dist/vue/advanced-preset.js +0 -33
  688. package/dist/vue/advanced-preset.js.map +0 -1
  689. package/docs/extending.md +0 -538
  690. package/docs/integration.md +0 -632
  691. package/docs/llms.md +0 -383
  692. package/docs/usage.md +0 -1076
@@ -1,28 +1,33 @@
1
- import { MenuItem, ToolbarGroup, ToolbarItem, commandItem, mergeToolbarGroups } from "./toolbar.js";
2
- import { AbilitiesOptions, BlockAction, BlockActionContext, BlockTarget, SlashCommandItem } from "./extension-points.js";
3
- import { Abilities, AbilitiesStorage, DEFAULT_ABILITY_RULES, abilitiesAt, abilitiesAtSelection, hasAbility } from "./abilities.js";
4
- import { CORE_TARGET_IDS, ConvertTarget, Converter, ForeignBlocks, TextblockSpec, childrenOf, convertCoreBlocks, convertTargetId, coreConversionTargets, createConverter, finishConversion, isCoreSource, isCoreTarget, isCurrentTarget, isListNode, isQuoteNode, isTextblockNode, isWrapperBlock, parseCoreTarget, textblockSpecOf } from "./convert.js";
1
+ import { ReadonlyStore, Store, createStore, derived } from "./store.js";
5
2
  import { CATALOGS, DEFAULT_LOCALE, LOCALES, Locale, MessageKey, MessageParams, Messages, Translate, createTranslator, isLocale } from "../i18n/index.js";
3
+ import { BackendCapability } from "./backend-capability.js";
4
+ import { AiStreamEvent, BackendCommentsOptions, BackendError, CollaborationToken, EditorBackend } from "./backend.js";
6
5
  import { Notice, Notifier, silentNotifier } from "./notify.js";
7
- import { ReadonlyStore, Store, createStore, derived } from "./store.js";
8
6
  import { EditorAiConfig, EditorContext, EditorContextOptions, createEditorContext } from "./context.js";
7
+ import { CORE_TARGET_IDS, ConvertTarget, Converter, ForeignBlocks, TextblockSpec, childrenOf, convertCoreBlocks, convertTargetId, coreConversionTargets, createConverter, finishConversion, isCoreSource, isCoreTarget, isCurrentTarget, isListNode, isQuoteNode, isTextblockNode, isWrapperBlock, parseCoreTarget, textblockSpecOf } from "./convert.js";
8
+ import { CommandBase, CommandDef, CommandState, Creates, InsertGuard, MenuItem, PlacedToolbarGroup, ToolbarGroupDef } from "./command-types.js";
9
+ import { AbilitiesOptions, BlockAction, BlockActionContext, BlockTarget } from "./extension-points.js";
9
10
  import { EditorEntry, EditorUi, editorEntryOf, notifierOf, registerEditor } from "./editor-ui.js";
10
11
  import { EditorMetadata, METADATA_LIST, MetadataItem, MetadataQuery, MetadataSource } from "./metadata-types.js";
11
12
  import { Metadata, MetadataRegistry, createMetadataRegistry, filterMetadataItems, metadataOf } from "./metadata.js";
12
- import { AiBlock, AiBlockDataProvider, AiBlockDataRequest, AiBlockDatum, AiContext, AiContextKind, AnchorResolver, AuthorIdentity, BlockPipeline, CollaborationSession, ConversionProvider, EditorFeature, EditorPreset, FeatureContext, SINGLETON_PIPELINE_HOOKS, SettingsTab, UploadFn } from "./feature.js";
13
+ import { AiBlock, AiBlockDataProvider, AiBlockDataRequest, AiBlockDatum, AiContext, AiContextKind, AnchorResolver, AuthorIdentity, BlockPipeline, CollaborationSession, ConversionProvider, Dimension, EditorFeature, EditorPreset, FeatureContext, SINGLETON_PIPELINE_HOOKS, SettingsTab } from "./feature.js";
14
+ import { Abilities, AbilitiesStorage, DEFAULT_ABILITY_RULES, abilitiesAt, abilitiesAtSelection, hasAbility } from "./abilities.js";
13
15
  import { BlockConvert, blockConversion, conversionLabel, conversionTargetGroups, convertMenuItems, coreConversions, parseConversionTarget, targetOwner } from "./block-convert.js";
14
16
  import { startBlockDrag } from "./block-drag.js";
15
17
  import { BlockFlash } from "./block-flash.js";
16
- import { coreBlockActions, coreFeature } from "./core-feature.js";
18
+ import { CoreUi, coreBlockActions, coreContentFeature, coreUiFeature } from "./core-feature.js";
19
+ import { canCreateAt, command, commandState, commandsOf, guardsAccept, toolbarOf } from "./commands.js";
17
20
  import { contributions, defineEditor, settingsTabsOf } from "./define-editor.js";
18
21
  import { DocumentMarkdown } from "./document-markdown.js";
19
22
  import { downloadText } from "./download.js";
20
23
  import { DocAnchor, DocAnchors, DocAnchorsMeta, DocAnchorsOptions, anchorResolverOf, captureRange, docAnchorsKey, releaseRanges, resolveRange } from "./doc-anchors.js";
21
24
  import { FeatureContextOptions, blockActionsOf, createFeatureContext } from "./feature-context.js";
22
25
  import { fetchErrorMessage } from "./fetch-error.js";
26
+ import { sha256Hex } from "./hash.js";
27
+ import { PALETTE_OTHER_GROUP, PaletteEntry, PaletteGroup, filterPalette, paletteGroupsOf } from "./palette.js";
23
28
  import { DEFAULT_BLOCK_PIPELINE, PresetStorage, aiBlockDataOf, aiContextOf, conversionsOf, formatAiResultOf, parseBlocks, pipelineOf, presetExtension, structureBlocks, wrapImportBlocks } from "./pipeline.js";
24
29
  import { selectionRange } from "./selection-range.js";
25
30
  import { SlashCommand, SlashCommandOptions, SlashCommandPluginKey } from "./slash.js";
26
31
  import { SuggestionDisplay, SuggestionListProps, SuggestionPopup, SuggestionPopupHandle, SuggestionPopupRenderer, createSuggestionRender, suggestionPopupOf } from "./suggestion-popup.js";
27
- import { coreToolbarGroups } from "./toolbar-items.js";
28
- export { Abilities, type AbilitiesOptions, type AbilitiesStorage, type AiBlock, type AiBlockDataProvider, type AiBlockDataRequest, type AiBlockDatum, type AiContext, type AiContextKind, type AnchorResolver, type AuthorIdentity, type BlockAction, type BlockActionContext, BlockConvert, BlockFlash, type BlockPipeline, type BlockTarget, CATALOGS, CORE_TARGET_IDS, type CollaborationSession, type ConversionProvider, type ConvertTarget, type Converter, DEFAULT_ABILITY_RULES, DEFAULT_BLOCK_PIPELINE, DEFAULT_LOCALE, type DocAnchor, DocAnchors, type DocAnchorsMeta, type DocAnchorsOptions, DocumentMarkdown, type EditorAiConfig, type EditorContext, type EditorContextOptions, type EditorEntry, type EditorFeature, type EditorMetadata, type EditorPreset, type EditorUi, type FeatureContext, type FeatureContextOptions, type ForeignBlocks, LOCALES, type Locale, METADATA_LIST, type MenuItem, type MessageKey, type MessageParams, type Messages, Metadata, type MetadataItem, type MetadataQuery, type MetadataRegistry, type MetadataSource, type Notice, type Notifier, type PresetStorage, type ReadonlyStore, SINGLETON_PIPELINE_HOOKS, type SettingsTab, SlashCommand, type SlashCommandItem, type SlashCommandOptions, SlashCommandPluginKey, type Store, type SuggestionDisplay, type SuggestionListProps, SuggestionPopup, type SuggestionPopupHandle, type SuggestionPopupRenderer, type TextblockSpec, type ToolbarGroup, type ToolbarItem, type Translate, type UploadFn, abilitiesAt, abilitiesAtSelection, aiBlockDataOf, aiContextOf, anchorResolverOf, blockActionsOf, blockConversion, captureRange, childrenOf, commandItem, contributions, conversionLabel, conversionTargetGroups, conversionsOf, convertCoreBlocks, convertMenuItems, convertTargetId, coreBlockActions, coreConversionTargets, coreConversions, coreFeature, coreToolbarGroups, createConverter, createEditorContext, createFeatureContext, createMetadataRegistry, createStore, createSuggestionRender, createTranslator, defineEditor, derived, docAnchorsKey, downloadText, editorEntryOf, fetchErrorMessage, filterMetadataItems, finishConversion, formatAiResultOf, hasAbility, isCoreSource, isCoreTarget, isCurrentTarget, isListNode, isLocale, isQuoteNode, isTextblockNode, isWrapperBlock, mergeToolbarGroups, metadataOf, notifierOf, parseBlocks, parseConversionTarget, parseCoreTarget, pipelineOf, presetExtension, registerEditor, releaseRanges, resolveRange, selectionRange, settingsTabsOf, silentNotifier, startBlockDrag, structureBlocks, suggestionPopupOf, targetOwner, textblockSpecOf, wrapImportBlocks };
32
+ import { CORE_TOOLBAR_GROUPS, coreCommands } from "./toolbar-items.js";
33
+ export { Abilities, type AbilitiesOptions, type AbilitiesStorage, type AiBlock, type AiBlockDataProvider, type AiBlockDataRequest, type AiBlockDatum, type AiContext, type AiContextKind, type AiStreamEvent, type AnchorResolver, type AuthorIdentity, type BackendCapability, type BackendCommentsOptions, BackendError, type BlockAction, type BlockActionContext, BlockConvert, BlockFlash, type BlockPipeline, type BlockTarget, CATALOGS, CORE_TARGET_IDS, CORE_TOOLBAR_GROUPS, type CollaborationSession, type CollaborationToken, type CommandBase, type CommandDef, type CommandState, type ConversionProvider, type ConvertTarget, type Converter, type CoreUi, type Creates, DEFAULT_ABILITY_RULES, DEFAULT_BLOCK_PIPELINE, DEFAULT_LOCALE, type Dimension, type DocAnchor, DocAnchors, type DocAnchorsMeta, type DocAnchorsOptions, DocumentMarkdown, type EditorAiConfig, type EditorBackend, type EditorContext, type EditorContextOptions, type EditorEntry, type EditorFeature, type EditorMetadata, type EditorPreset, type EditorUi, type FeatureContext, type FeatureContextOptions, type ForeignBlocks, type InsertGuard, LOCALES, type Locale, METADATA_LIST, type MenuItem, type MessageKey, type MessageParams, type Messages, Metadata, type MetadataItem, type MetadataQuery, type MetadataRegistry, type MetadataSource, type Notice, type Notifier, PALETTE_OTHER_GROUP, type PaletteEntry, type PaletteGroup, type PlacedToolbarGroup, type PresetStorage, type ReadonlyStore, SINGLETON_PIPELINE_HOOKS, type SettingsTab, SlashCommand, type SlashCommandOptions, SlashCommandPluginKey, type Store, type SuggestionDisplay, type SuggestionListProps, SuggestionPopup, type SuggestionPopupHandle, type SuggestionPopupRenderer, type TextblockSpec, type ToolbarGroupDef, type Translate, abilitiesAt, abilitiesAtSelection, aiBlockDataOf, aiContextOf, anchorResolverOf, blockActionsOf, blockConversion, canCreateAt, captureRange, childrenOf, command, commandState, commandsOf, contributions, conversionLabel, conversionTargetGroups, conversionsOf, convertCoreBlocks, convertMenuItems, convertTargetId, coreBlockActions, coreCommands, coreContentFeature, coreConversionTargets, coreConversions, coreUiFeature, createConverter, createEditorContext, createFeatureContext, createMetadataRegistry, createStore, createSuggestionRender, createTranslator, defineEditor, derived, docAnchorsKey, downloadText, editorEntryOf, fetchErrorMessage, filterMetadataItems, filterPalette, finishConversion, formatAiResultOf, guardsAccept, hasAbility, isCoreSource, isCoreTarget, isCurrentTarget, isListNode, isLocale, isQuoteNode, isTextblockNode, isWrapperBlock, metadataOf, notifierOf, paletteGroupsOf, parseBlocks, parseConversionTarget, parseCoreTarget, pipelineOf, presetExtension, registerEditor, releaseRanges, resolveRange, selectionRange, settingsTabsOf, sha256Hex, silentNotifier, startBlockDrag, structureBlocks, suggestionPopupOf, targetOwner, textblockSpecOf, toolbarOf, wrapImportBlocks };
@@ -1,27 +1,30 @@
1
1
  import { Abilities, DEFAULT_ABILITY_RULES, abilitiesAt, abilitiesAtSelection, hasAbility } from "./abilities.js";
2
- import { CORE_TARGET_IDS, childrenOf, convertCoreBlocks, convertTargetId, coreConversionTargets, createConverter, finishConversion, isCoreSource, isCoreTarget, isCurrentTarget, isListNode, isQuoteNode, isTextblockNode, isWrapperBlock, parseCoreTarget, textblockSpecOf } from "./convert.js";
2
+ import { SINGLETON_PIPELINE_HOOKS } from "./feature.js";
3
3
  import { DEFAULT_BLOCK_PIPELINE, aiBlockDataOf, aiContextOf, conversionsOf, formatAiResultOf, parseBlocks, pipelineOf, presetExtension, structureBlocks, wrapImportBlocks } from "./pipeline.js";
4
+ import { contributions, defineEditor, settingsTabsOf } from "./define-editor.js";
5
+ import { Metadata, createMetadataRegistry, filterMetadataItems, metadataOf } from "./metadata.js";
6
+ import { editorEntryOf, notifierOf, registerEditor } from "./editor-ui.js";
7
+ import { canCreateAt, command, commandState, commandsOf, guardsAccept, toolbarOf } from "./commands.js";
8
+ import { CORE_TARGET_IDS, childrenOf, convertCoreBlocks, convertTargetId, coreConversionTargets, createConverter, finishConversion, isCoreSource, isCoreTarget, isCurrentTarget, isListNode, isQuoteNode, isTextblockNode, isWrapperBlock, parseCoreTarget, textblockSpecOf } from "./convert.js";
4
9
  import { BlockConvert, blockConversion, conversionLabel, conversionTargetGroups, convertMenuItems, coreConversions, parseConversionTarget, targetOwner } from "./block-convert.js";
5
10
  import { startBlockDrag } from "./block-drag.js";
6
11
  import { BlockFlash } from "./block-flash.js";
12
+ import { BackendError } from "./backend.js";
7
13
  import { CATALOGS, DEFAULT_LOCALE, LOCALES, createTranslator, isLocale } from "../i18n/index.js";
8
14
  import { silentNotifier } from "./notify.js";
9
15
  import { createStore, derived } from "./store.js";
10
16
  import { createEditorContext } from "./context.js";
11
17
  import { DocAnchors, anchorResolverOf, captureRange, docAnchorsKey, releaseRanges, resolveRange } from "./doc-anchors.js";
12
18
  import { DocumentMarkdown } from "./document-markdown.js";
13
- import { Metadata, createMetadataRegistry, filterMetadataItems, metadataOf } from "./metadata.js";
14
19
  import { SuggestionPopup, createSuggestionRender, suggestionPopupOf } from "./suggestion-popup.js";
15
20
  import { SlashCommand, SlashCommandPluginKey } from "./slash.js";
16
- import { commandItem, mergeToolbarGroups } from "./toolbar.js";
17
- import { coreToolbarGroups } from "./toolbar-items.js";
18
- import { coreBlockActions, coreFeature } from "./core-feature.js";
19
- import { SINGLETON_PIPELINE_HOOKS } from "./feature.js";
20
- import { contributions, defineEditor, settingsTabsOf } from "./define-editor.js";
21
+ import { CORE_TOOLBAR_GROUPS, coreCommands } from "./toolbar-items.js";
22
+ import { coreBlockActions, coreContentFeature, coreUiFeature } from "./core-feature.js";
21
23
  import { downloadText } from "./download.js";
22
- import { editorEntryOf, notifierOf, registerEditor } from "./editor-ui.js";
23
24
  import { blockActionsOf, createFeatureContext } from "./feature-context.js";
24
25
  import { fetchErrorMessage } from "./fetch-error.js";
26
+ import { sha256Hex } from "./hash.js";
25
27
  import { METADATA_LIST } from "./metadata-types.js";
28
+ import { PALETTE_OTHER_GROUP, filterPalette, paletteGroupsOf } from "./palette.js";
26
29
  import { selectionRange } from "./selection-range.js";
27
- export { Abilities, BlockConvert, BlockFlash, CATALOGS, CORE_TARGET_IDS, DEFAULT_ABILITY_RULES, DEFAULT_BLOCK_PIPELINE, DEFAULT_LOCALE, DocAnchors, DocumentMarkdown, LOCALES, METADATA_LIST, Metadata, SINGLETON_PIPELINE_HOOKS, SlashCommand, SlashCommandPluginKey, SuggestionPopup, abilitiesAt, abilitiesAtSelection, aiBlockDataOf, aiContextOf, anchorResolverOf, blockActionsOf, blockConversion, captureRange, childrenOf, commandItem, contributions, conversionLabel, conversionTargetGroups, conversionsOf, convertCoreBlocks, convertMenuItems, convertTargetId, coreBlockActions, coreConversionTargets, coreConversions, coreFeature, coreToolbarGroups, createConverter, createEditorContext, createFeatureContext, createMetadataRegistry, createStore, createSuggestionRender, createTranslator, defineEditor, derived, docAnchorsKey, downloadText, editorEntryOf, fetchErrorMessage, filterMetadataItems, finishConversion, formatAiResultOf, hasAbility, isCoreSource, isCoreTarget, isCurrentTarget, isListNode, isLocale, isQuoteNode, isTextblockNode, isWrapperBlock, mergeToolbarGroups, metadataOf, notifierOf, parseBlocks, parseConversionTarget, parseCoreTarget, pipelineOf, presetExtension, registerEditor, releaseRanges, resolveRange, selectionRange, settingsTabsOf, silentNotifier, startBlockDrag, structureBlocks, suggestionPopupOf, targetOwner, textblockSpecOf, wrapImportBlocks };
30
+ export { Abilities, BackendError, BlockConvert, BlockFlash, CATALOGS, CORE_TARGET_IDS, CORE_TOOLBAR_GROUPS, DEFAULT_ABILITY_RULES, DEFAULT_BLOCK_PIPELINE, DEFAULT_LOCALE, DocAnchors, DocumentMarkdown, LOCALES, METADATA_LIST, Metadata, PALETTE_OTHER_GROUP, SINGLETON_PIPELINE_HOOKS, SlashCommand, SlashCommandPluginKey, SuggestionPopup, abilitiesAt, abilitiesAtSelection, aiBlockDataOf, aiContextOf, anchorResolverOf, blockActionsOf, blockConversion, canCreateAt, captureRange, childrenOf, command, commandState, commandsOf, contributions, conversionLabel, conversionTargetGroups, conversionsOf, convertCoreBlocks, convertMenuItems, convertTargetId, coreBlockActions, coreCommands, coreContentFeature, coreConversionTargets, coreConversions, coreUiFeature, createConverter, createEditorContext, createFeatureContext, createMetadataRegistry, createStore, createSuggestionRender, createTranslator, defineEditor, derived, docAnchorsKey, downloadText, editorEntryOf, fetchErrorMessage, filterMetadataItems, filterPalette, finishConversion, formatAiResultOf, guardsAccept, hasAbility, isCoreSource, isCoreTarget, isCurrentTarget, isListNode, isLocale, isQuoteNode, isTextblockNode, isWrapperBlock, metadataOf, notifierOf, paletteGroupsOf, parseBlocks, parseConversionTarget, parseCoreTarget, pipelineOf, presetExtension, registerEditor, releaseRanges, resolveRange, selectionRange, settingsTabsOf, sha256Hex, silentNotifier, startBlockDrag, structureBlocks, suggestionPopupOf, targetOwner, textblockSpecOf, toolbarOf, wrapImportBlocks };
@@ -0,0 +1,48 @@
1
+ import { EditorEntry } from "./editor-ui.js";
2
+ import { Editor } from "@tiptap/core";
3
+ //#region src/core/palette.d.ts
4
+ /** One row of the palette: a command (leaf, `run`) or a menu command with its menu rows as `children` (the second level). */
5
+ export interface PaletteEntry {
6
+ /** The command id; a row of a menu command is `<command id>:<index>`. */
7
+ id: string;
8
+ /** Already translated. */
9
+ label: string;
10
+ /** Iconify name, e.g. `i-lucide-table`; empty when the row has none. */
11
+ icon: string;
12
+ /** Shortcut keys, e.g. `['meta', 'b']`. */
13
+ kbds?: string[];
14
+ description?: string;
15
+ /** `commandState(...).enabled === false` (a menu command without an enabled row is disabled too). */
16
+ disabled: boolean;
17
+ /** The command is on at the selection (toggle style). */
18
+ active: boolean;
19
+ /** Runs the command; absent on a row that opens a second level. */
20
+ run?: () => void;
21
+ /** The rows of a menu command; selecting the entry opens them. */
22
+ children?: PaletteEntry[];
23
+ }
24
+ /** The entries of one toolbar group, in the group's order; commands without a toolbar group are the last group (`other`). */
25
+ export interface PaletteGroup {
26
+ id: string;
27
+ /** Already translated. */
28
+ label: string;
29
+ entries: PaletteEntry[];
30
+ }
31
+ /** The id and heading key of the group that holds the commands without a toolbar group. */
32
+ export declare const PALETTE_OTHER_GROUP = "other";
33
+ /**
34
+ * The palette of `editor`: every command of its surface (the features' commands after the host's `commands` transformer)
35
+ * that is listed (`palette !== false`, never a `component` command) and visible, grouped by toolbar group in the
36
+ * toolbar's order, the ungrouped commands last. Each entry's state is `commandState(editor, cmd, 'selection')`; menu
37
+ * commands carry the rows of their menu as a second level. Evaluated at call time: build it when the palette opens.
38
+ * `editor` is the raw instance the surface registered.
39
+ */
40
+ export declare function paletteGroupsOf(editor: Editor, entry: Pick<EditorEntry, 'preset' | 'ctx'>): PaletteGroup[];
41
+ /**
42
+ * The groups with only the entries matching `query`: case-insensitive, `query` is a prefix or any substring of the
43
+ * entry's label or command id; entries that start with it come first. Empty groups drop out; a blank query keeps
44
+ * everything. Only the first level is filtered (a menu command's rows are the framework search's job).
45
+ */
46
+ export declare function filterPalette(groups: readonly PaletteGroup[], query: string): PaletteGroup[];
47
+ //#endregion
48
+ //# sourceMappingURL=palette.d.ts.map
@@ -0,0 +1,95 @@
1
+ import { commandState, placeInGroups, toolbarGroupsOf } from "./commands.js";
2
+ //#region src/core/palette.ts
3
+ /** The id and heading key of the group that holds the commands without a toolbar group. */
4
+ const PALETTE_OTHER_GROUP = "other";
5
+ function entryOf(editor, cmd, state) {
6
+ if ("component" in cmd) return void 0;
7
+ const base = {
8
+ id: cmd.id,
9
+ label: cmd.label,
10
+ icon: cmd.icon,
11
+ ...cmd.kbds && { kbds: cmd.kbds },
12
+ active: state.active
13
+ };
14
+ if ("run" in cmd) return {
15
+ ...base,
16
+ disabled: !state.enabled,
17
+ run: () => cmd.run(editor)
18
+ };
19
+ const children = cmd.menu(editor).flatMap((item, index) => {
20
+ if (item.type || item.label === void 0) return [];
21
+ return [{
22
+ id: `${cmd.id}:${index}`,
23
+ label: item.label,
24
+ icon: item.icon ?? "",
25
+ ...item.description !== void 0 && { description: item.description },
26
+ disabled: !!item.disabled,
27
+ active: false,
28
+ ...item.onSelect && { run: item.onSelect }
29
+ }];
30
+ });
31
+ return {
32
+ ...base,
33
+ disabled: !state.enabled || !children.some((child) => !child.disabled),
34
+ children
35
+ };
36
+ }
37
+ /**
38
+ * The palette of `editor`: every command of its surface (the features' commands after the host's `commands` transformer)
39
+ * that is listed (`palette !== false`, never a `component` command) and visible, grouped by toolbar group in the
40
+ * toolbar's order, the ungrouped commands last. Each entry's state is `commandState(editor, cmd, 'selection')`; menu
41
+ * commands carry the rows of their menu as a second level. Evaluated at call time: build it when the palette opens.
42
+ * `editor` is the raw instance the surface registered.
43
+ */
44
+ function paletteGroupsOf(editor, entry) {
45
+ const { preset, ctx } = entry;
46
+ const rows = /* @__PURE__ */ new Map();
47
+ for (const cmd of ctx.commands()) {
48
+ if (cmd.palette === false) continue;
49
+ const state = commandState(editor, cmd, "selection");
50
+ if (!state.visible) continue;
51
+ const row = entryOf(editor, cmd, state);
52
+ if (row) rows.set(cmd, row);
53
+ }
54
+ const other = [];
55
+ const groups = placeInGroups(toolbarGroupsOf(preset), [...rows.keys()], (cmd) => other.push(rows.get(cmd))).filter((group) => group.items.length > 0 && (!group.visible || group.visible(editor))).map((group) => ({
56
+ id: group.id,
57
+ label: group.labelKey ? ctx.t(group.labelKey) : group.id,
58
+ entries: group.items.map((cmd) => rows.get(cmd))
59
+ }));
60
+ if (other.length) groups.push({
61
+ id: PALETTE_OTHER_GROUP,
62
+ label: ctx.t("palette.group.other"),
63
+ entries: other
64
+ });
65
+ return groups;
66
+ }
67
+ /**
68
+ * The groups with only the entries matching `query`: case-insensitive, `query` is a prefix or any substring of the
69
+ * entry's label or command id; entries that start with it come first. Empty groups drop out; a blank query keeps
70
+ * everything. Only the first level is filtered (a menu command's rows are the framework search's job).
71
+ */
72
+ function filterPalette(groups, query) {
73
+ const needle = query.trim().toLowerCase();
74
+ if (!needle) return [...groups];
75
+ const rank = (entry) => {
76
+ const label = entry.label.toLowerCase();
77
+ const id = entry.id.toLowerCase();
78
+ if (label.startsWith(needle) || id.startsWith(needle)) return 0;
79
+ return label.includes(needle) || id.includes(needle) ? 1 : void 0;
80
+ };
81
+ return groups.flatMap((group) => {
82
+ const entries = group.entries.flatMap((entry) => rank(entry) === void 0 ? [] : [{
83
+ entry,
84
+ rank: rank(entry)
85
+ }]).sort((a, b) => a.rank - b.rank).map((item) => item.entry);
86
+ return entries.length ? [{
87
+ ...group,
88
+ entries
89
+ }] : [];
90
+ });
91
+ }
92
+ //#endregion
93
+ export { PALETTE_OTHER_GROUP, filterPalette, paletteGroupsOf };
94
+
95
+ //# sourceMappingURL=palette.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"palette.js","names":[],"sources":["../../src/core/palette.ts"],"sourcesContent":["import type { Editor } from '@tiptap/core'\nimport { type CommandDef, commandState, placeInGroups, toolbarGroupsOf } from './commands'\nimport type { EditorEntry } from './editor-ui'\n\n// The ⌘K palette's model, framework-free: the framework layers (`vue/components/EditorCommandPalette.vue`,\n// `react/EditorCommandPalette.tsx`) render `PaletteGroup`s and own nothing but the dialog and the search box.\n\n/** One row of the palette: a command (leaf, `run`) or a menu command with its menu rows as `children` (the second level). */\nexport interface PaletteEntry {\n /** The command id; a row of a menu command is `<command id>:<index>`. */\n id: string\n /** Already translated. */\n label: string\n /** Iconify name, e.g. `i-lucide-table`; empty when the row has none. */\n icon: string\n /** Shortcut keys, e.g. `['meta', 'b']`. */\n kbds?: string[]\n description?: string\n /** `commandState(...).enabled === false` (a menu command without an enabled row is disabled too). */\n disabled: boolean\n /** The command is on at the selection (toggle style). */\n active: boolean\n /** Runs the command; absent on a row that opens a second level. */\n run?: () => void\n /** The rows of a menu command; selecting the entry opens them. */\n children?: PaletteEntry[]\n}\n\n/** The entries of one toolbar group, in the group's order; commands without a toolbar group are the last group (`other`). */\nexport interface PaletteGroup {\n id: string\n /** Already translated. */\n label: string\n entries: PaletteEntry[]\n}\n\n/** The id and heading key of the group that holds the commands without a toolbar group. */\nexport const PALETTE_OTHER_GROUP = 'other'\n\nfunction entryOf(editor: Editor, cmd: CommandDef, state: { enabled: boolean, active: boolean }): PaletteEntry | undefined {\n if ('component' in cmd) return undefined\n const base = { id: cmd.id, label: cmd.label, icon: cmd.icon, ...(cmd.kbds && { kbds: cmd.kbds }), active: state.active }\n if ('run' in cmd) return { ...base, disabled: !state.enabled, run: () => cmd.run(editor) }\n const children = cmd.menu(editor).flatMap((item, index): PaletteEntry[] => {\n if (item.type || item.label === undefined) return []\n return [{\n id: `${cmd.id}:${index}`,\n label: item.label,\n icon: item.icon ?? '',\n ...(item.description !== undefined && { description: item.description }),\n disabled: !!item.disabled,\n active: false,\n ...(item.onSelect && { run: item.onSelect }),\n }]\n })\n return { ...base, disabled: !state.enabled || !children.some(child => !child.disabled), children }\n}\n\n/**\n * The palette of `editor`: every command of its surface (the features' commands after the host's `commands` transformer)\n * that is listed (`palette !== false`, never a `component` command) and visible, grouped by toolbar group in the\n * toolbar's order, the ungrouped commands last. Each entry's state is `commandState(editor, cmd, 'selection')`; menu\n * commands carry the rows of their menu as a second level. Evaluated at call time: build it when the palette opens.\n * `editor` is the raw instance the surface registered.\n */\nexport function paletteGroupsOf(editor: Editor, entry: Pick<EditorEntry, 'preset' | 'ctx'>): PaletteGroup[] {\n const { preset, ctx } = entry\n const rows = new Map<CommandDef, PaletteEntry>()\n for (const cmd of ctx.commands()) {\n if (cmd.palette === false) continue\n const state = commandState(editor, cmd, 'selection')\n if (!state.visible) continue\n const row = entryOf(editor, cmd, state)\n if (row) rows.set(cmd, row)\n }\n // Unlike the toolbar, a command naming a group no feature declares is not an error here: it is listed under `other`.\n const other: PaletteEntry[] = []\n const groups: PaletteGroup[] = placeInGroups(toolbarGroupsOf(preset), [...rows.keys()], cmd => other.push(rows.get(cmd)!))\n .filter(group => group.items.length > 0 && (!group.visible || group.visible(editor)))\n .map(group => ({ id: group.id, label: group.labelKey ? ctx.t(group.labelKey) : group.id, entries: group.items.map(cmd => rows.get(cmd)!) }))\n if (other.length) groups.push({ id: PALETTE_OTHER_GROUP, label: ctx.t('palette.group.other'), entries: other })\n return groups\n}\n\n/**\n * The groups with only the entries matching `query`: case-insensitive, `query` is a prefix or any substring of the\n * entry's label or command id; entries that start with it come first. Empty groups drop out; a blank query keeps\n * everything. Only the first level is filtered (a menu command's rows are the framework search's job).\n */\nexport function filterPalette(groups: readonly PaletteGroup[], query: string): PaletteGroup[] {\n const needle = query.trim().toLowerCase()\n if (!needle) return [...groups]\n const rank = (entry: PaletteEntry) => {\n const label = entry.label.toLowerCase()\n const id = entry.id.toLowerCase()\n if (label.startsWith(needle) || id.startsWith(needle)) return 0\n return label.includes(needle) || id.includes(needle) ? 1 : undefined\n }\n return groups.flatMap((group) => {\n const entries = group.entries\n .flatMap(entry => (rank(entry) === undefined ? [] : [{ entry, rank: rank(entry)! }]))\n .sort((a, b) => a.rank - b.rank)\n .map(item => item.entry)\n return entries.length ? [{ ...group, entries }] : []\n })\n}\n"],"mappings":";;;AAqCA,MAAa,sBAAsB;AAEnC,SAAS,QAAQ,QAAgB,KAAiB,OAAwE;CACxH,IAAI,eAAe,KAAK,OAAO,KAAA;CAC/B,MAAM,OAAO;EAAE,IAAI,IAAI;EAAI,OAAO,IAAI;EAAO,MAAM,IAAI;EAAM,GAAI,IAAI,QAAQ,EAAE,MAAM,IAAI,KAAK;EAAI,QAAQ,MAAM;CAAO;CACvH,IAAI,SAAS,KAAK,OAAO;EAAE,GAAG;EAAM,UAAU,CAAC,MAAM;EAAS,WAAW,IAAI,IAAI,MAAM;CAAE;CACzF,MAAM,WAAW,IAAI,KAAK,MAAM,CAAC,CAAC,SAAS,MAAM,UAA0B;EACzE,IAAI,KAAK,QAAQ,KAAK,UAAU,KAAA,GAAW,OAAO,CAAC;EACnD,OAAO,CAAC;GACN,IAAI,GAAG,IAAI,GAAG,GAAG;GACjB,OAAO,KAAK;GACZ,MAAM,KAAK,QAAQ;GACnB,GAAI,KAAK,gBAAgB,KAAA,KAAa,EAAE,aAAa,KAAK,YAAY;GACtE,UAAU,CAAC,CAAC,KAAK;GACjB,QAAQ;GACR,GAAI,KAAK,YAAY,EAAE,KAAK,KAAK,SAAS;EAC5C,CAAC;CACH,CAAC;CACD,OAAO;EAAE,GAAG;EAAM,UAAU,CAAC,MAAM,WAAW,CAAC,SAAS,MAAK,UAAS,CAAC,MAAM,QAAQ;EAAG;CAAS;AACnG;;;;;;;;AASA,SAAgB,gBAAgB,QAAgB,OAA4D;CAC1G,MAAM,EAAE,QAAQ,QAAQ;CACxB,MAAM,uBAAO,IAAI,IAA8B;CAC/C,KAAK,MAAM,OAAO,IAAI,SAAS,GAAG;EAChC,IAAI,IAAI,YAAY,OAAO;EAC3B,MAAM,QAAQ,aAAa,QAAQ,KAAK,WAAW;EACnD,IAAI,CAAC,MAAM,SAAS;EACpB,MAAM,MAAM,QAAQ,QAAQ,KAAK,KAAK;EACtC,IAAI,KAAK,KAAK,IAAI,KAAK,GAAG;CAC5B;CAEA,MAAM,QAAwB,CAAC;CAC/B,MAAM,SAAyB,cAAc,gBAAgB,MAAM,GAAG,CAAC,GAAG,KAAK,KAAK,CAAC,IAAG,QAAO,MAAM,KAAK,KAAK,IAAI,GAAG,CAAE,CAAC,CAAC,CACvH,QAAO,UAAS,MAAM,MAAM,SAAS,MAAM,CAAC,MAAM,WAAW,MAAM,QAAQ,MAAM,EAAE,CAAC,CACpF,KAAI,WAAU;EAAE,IAAI,MAAM;EAAI,OAAO,MAAM,WAAW,IAAI,EAAE,MAAM,QAAQ,IAAI,MAAM;EAAI,SAAS,MAAM,MAAM,KAAI,QAAO,KAAK,IAAI,GAAG,CAAE;CAAE,EAAE;CAC7I,IAAI,MAAM,QAAQ,OAAO,KAAK;EAAE,IAAI;EAAqB,OAAO,IAAI,EAAE,qBAAqB;EAAG,SAAS;CAAM,CAAC;CAC9G,OAAO;AACT;;;;;;AAOA,SAAgB,cAAc,QAAiC,OAA+B;CAC5F,MAAM,SAAS,MAAM,KAAK,CAAC,CAAC,YAAY;CACxC,IAAI,CAAC,QAAQ,OAAO,CAAC,GAAG,MAAM;CAC9B,MAAM,QAAQ,UAAwB;EACpC,MAAM,QAAQ,MAAM,MAAM,YAAY;EACtC,MAAM,KAAK,MAAM,GAAG,YAAY;EAChC,IAAI,MAAM,WAAW,MAAM,KAAK,GAAG,WAAW,MAAM,GAAG,OAAO;EAC9D,OAAO,MAAM,SAAS,MAAM,KAAK,GAAG,SAAS,MAAM,IAAI,IAAI,KAAA;CAC7D;CACA,OAAO,OAAO,SAAS,UAAU;EAC/B,MAAM,UAAU,MAAM,QACnB,SAAQ,UAAU,KAAK,KAAK,MAAM,KAAA,IAAY,CAAC,IAAI,CAAC;GAAE;GAAO,MAAM,KAAK,KAAK;EAAG,CAAC,CAAE,CAAC,CACpF,MAAM,GAAG,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,CAC/B,KAAI,SAAQ,KAAK,KAAK;EACzB,OAAO,QAAQ,SAAS,CAAC;GAAE,GAAG;GAAO;EAAQ,CAAC,IAAI,CAAC;CACrD,CAAC;AACH"}
@@ -14,6 +14,7 @@ export declare const ABILITY: {
14
14
  readonly media: "insert.media";
15
15
  readonly record: "insert.record";
16
16
  readonly mention: "insert.mention";
17
+ readonly reference: "insert.reference";
17
18
  readonly tag: "insert.tag";
18
19
  readonly aiRewrite: "ai.rewrite";
19
20
  readonly aiGenerate: "ai.generate";
@@ -24,7 +25,7 @@ export declare const ABILITY: {
24
25
  readonly compositeMeta: "composite.meta";
25
26
  readonly compositeSummarize: "composite.summarize";
26
27
  readonly compositeExport: "composite.export";
27
- readonly compositeTranscribe: "composite.transcribe";
28
+ readonly compositeDerive: "composite.derive";
28
29
  };
29
30
  export type Ability = (typeof ABILITY)[keyof typeof ABILITY] | (string & {});
30
31
  /** How a node changes the abilities of everything inside it: `grants`, then `revokes`; `own` only applies when it is the innermost node. */
@@ -13,6 +13,7 @@ const ABILITY = {
13
13
  media: "insert.media",
14
14
  record: "insert.record",
15
15
  mention: "insert.mention",
16
+ reference: "insert.reference",
16
17
  tag: "insert.tag",
17
18
  aiRewrite: "ai.rewrite",
18
19
  aiGenerate: "ai.generate",
@@ -23,7 +24,7 @@ const ABILITY = {
23
24
  compositeMeta: "composite.meta",
24
25
  compositeSummarize: "composite.summarize",
25
26
  compositeExport: "composite.export",
26
- compositeTranscribe: "composite.transcribe"
27
+ compositeDerive: "composite.derive"
27
28
  };
28
29
  /** Everything a plain paragraph at document root can do. `composite.*` are `own` abilities of composites only. */
29
30
  const ROOT_ABILITIES = [
@@ -39,6 +40,7 @@ const ROOT_ABILITIES = [
39
40
  ABILITY.media,
40
41
  ABILITY.record,
41
42
  ABILITY.mention,
43
+ ABILITY.reference,
42
44
  ABILITY.tag,
43
45
  ABILITY.aiRewrite,
44
46
  ABILITY.aiGenerate,
@@ -61,6 +63,7 @@ const TEXT_ABILITIES = [
61
63
  ABILITY.media,
62
64
  ABILITY.record,
63
65
  ABILITY.mention,
66
+ ABILITY.reference,
64
67
  ABILITY.tag,
65
68
  ABILITY.aiRewrite,
66
69
  ABILITY.aiGenerate,
@@ -88,6 +91,7 @@ const TYPE_ABILITIES = {
88
91
  video: ABILITY.media,
89
92
  file: ABILITY.media,
90
93
  mention: ABILITY.mention,
94
+ reference: ABILITY.reference,
91
95
  tag: ABILITY.tag
92
96
  };
93
97
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"abilities.js","names":[],"sources":["../../../src/core/schema/abilities.ts"],"sourcesContent":["import type { Node as PMNode } from '@tiptap/pm/model'\n\n// Vue-free and server-importable: node schemas shared with the server declare their rule via `NodeConfig.abilities`.\n\n/** Ability ids. Hosts may add their own strings; these are the ones the editor itself checks. */\nexport const ABILITY = {\n marks: 'format.marks',\n headings: 'format.headings',\n lists: 'format.lists',\n blockquote: 'format.blockquote',\n codeBlock: 'format.codeBlock',\n rule: 'format.rule',\n blockContent: 'block.content',\n composite: 'format.composite',\n transcript: 'transcript.segment',\n media: 'insert.media',\n record: 'insert.record',\n mention: 'insert.mention',\n tag: 'insert.tag',\n aiRewrite: 'ai.rewrite',\n aiGenerate: 'ai.generate',\n aiAutocomplete: 'ai.autocomplete',\n blockDelete: 'block.delete',\n blockDuplicate: 'block.duplicate',\n blockConvert: 'block.convert',\n compositeMeta: 'composite.meta',\n compositeSummarize: 'composite.summarize',\n compositeExport: 'composite.export',\n compositeTranscribe: 'composite.transcribe',\n} as const\n\nexport type Ability = (typeof ABILITY)[keyof typeof ABILITY] | (string & {})\n\n/** How a node changes the abilities of everything inside it: `grants`, then `revokes`; `own` only applies when it is the innermost node. */\nexport interface AbilityRule {\n grants?: readonly Ability[]\n revokes?: readonly Ability[]\n own?: readonly Ability[]\n}\n\nexport type AbilityRuleSource = AbilityRule | ((node: PMNode) => AbilityRule)\n\n/** Everything a plain paragraph at document root can do. `composite.*` are `own` abilities of composites only. */\nexport const ROOT_ABILITIES: readonly Ability[] = [\n ABILITY.marks, ABILITY.headings, ABILITY.lists, ABILITY.blockquote, ABILITY.codeBlock, ABILITY.rule, ABILITY.blockContent, ABILITY.composite,\n ABILITY.transcript, ABILITY.media, ABILITY.record, ABILITY.mention, ABILITY.tag, ABILITY.aiRewrite, ABILITY.aiGenerate,\n ABILITY.aiAutocomplete, ABILITY.blockDelete, ABILITY.blockDuplicate, ABILITY.blockConvert,\n]\n\n/** Text-editing abilities an atom block (image/audio/video) or a tags row can never have. */\nexport const TEXT_ABILITIES: readonly Ability[] = [\n ABILITY.marks, ABILITY.headings, ABILITY.lists, ABILITY.blockquote, ABILITY.codeBlock, ABILITY.rule, ABILITY.blockContent, ABILITY.composite,\n ABILITY.transcript, ABILITY.media, ABILITY.record, ABILITY.mention, ABILITY.tag, ABILITY.aiRewrite, ABILITY.aiGenerate,\n ABILITY.aiAutocomplete,\n]\n\n/** Node/mark type → ability its creation/toggling needs (toolbar fallback, shortcut + input-rule gate). */\nexport const TYPE_ABILITIES: Readonly<Record<string, Ability>> = {\n bold: ABILITY.marks,\n italic: ABILITY.marks,\n strike: ABILITY.marks,\n code: ABILITY.marks,\n heading: ABILITY.headings,\n bulletList: ABILITY.lists,\n orderedList: ABILITY.lists,\n listItem: ABILITY.lists,\n taskList: ABILITY.lists,\n taskItem: ABILITY.lists,\n blockquote: ABILITY.blockquote,\n codeBlock: ABILITY.codeBlock,\n horizontalRule: ABILITY.rule,\n composite: ABILITY.composite,\n transcriptSegment: ABILITY.transcript,\n image: ABILITY.media,\n audio: ABILITY.media,\n video: ABILITY.media,\n file: ABILITY.media,\n mention: ABILITY.mention,\n tag: ABILITY.tag,\n}\n\n/**\n * Abilities at the end of `chain` (ancestors from depth 1 down to and including the innermost node):\n * start with `root`; per node add its `grants`, remove its `revokes`; finally add the innermost node's `own`.\n */\nexport function resolveAbilities(rules: ReadonlyMap<string, AbilityRuleSource>, root: readonly Ability[], chain: readonly PMNode[]): ReadonlySet<Ability> {\n const set = new Set<Ability>(root)\n let own: readonly Ability[] | undefined\n for (const node of chain) {\n const source = rules.get(node.type.name)\n const rule = typeof source === 'function' ? source(node) : source\n for (const ability of rule?.grants ?? []) set.add(ability)\n for (const ability of rule?.revokes ?? []) set.delete(ability)\n own = rule?.own\n }\n for (const ability of own ?? []) set.add(ability)\n return set\n}\n\ndeclare module '@tiptap/core' {\n interface NodeConfig<Options, Storage> {\n /** Abilities this node grants/revokes for its content (`own`: only when it is the innermost node). Host rules override it. */\n abilities?: AbilityRuleSource\n }\n}\n"],"mappings":";;AAKA,MAAa,UAAU;CACrB,OAAO;CACP,UAAU;CACV,OAAO;CACP,YAAY;CACZ,WAAW;CACX,MAAM;CACN,cAAc;CACd,WAAW;CACX,YAAY;CACZ,OAAO;CACP,QAAQ;CACR,SAAS;CACT,KAAK;CACL,WAAW;CACX,YAAY;CACZ,gBAAgB;CAChB,aAAa;CACb,gBAAgB;CAChB,cAAc;CACd,eAAe;CACf,oBAAoB;CACpB,iBAAiB;CACjB,qBAAqB;AACvB;;AAcA,MAAa,iBAAqC;CAChD,QAAQ;CAAO,QAAQ;CAAU,QAAQ;CAAO,QAAQ;CAAY,QAAQ;CAAW,QAAQ;CAAM,QAAQ;CAAc,QAAQ;CACnI,QAAQ;CAAY,QAAQ;CAAO,QAAQ;CAAQ,QAAQ;CAAS,QAAQ;CAAK,QAAQ;CAAW,QAAQ;CAC5G,QAAQ;CAAgB,QAAQ;CAAa,QAAQ;CAAgB,QAAQ;AAC/E;;AAGA,MAAa,iBAAqC;CAChD,QAAQ;CAAO,QAAQ;CAAU,QAAQ;CAAO,QAAQ;CAAY,QAAQ;CAAW,QAAQ;CAAM,QAAQ;CAAc,QAAQ;CACnI,QAAQ;CAAY,QAAQ;CAAO,QAAQ;CAAQ,QAAQ;CAAS,QAAQ;CAAK,QAAQ;CAAW,QAAQ;CAC5G,QAAQ;AACV;;AAGA,MAAa,iBAAoD;CAC/D,MAAM,QAAQ;CACd,QAAQ,QAAQ;CAChB,QAAQ,QAAQ;CAChB,MAAM,QAAQ;CACd,SAAS,QAAQ;CACjB,YAAY,QAAQ;CACpB,aAAa,QAAQ;CACrB,UAAU,QAAQ;CAClB,UAAU,QAAQ;CAClB,UAAU,QAAQ;CAClB,YAAY,QAAQ;CACpB,WAAW,QAAQ;CACnB,gBAAgB,QAAQ;CACxB,WAAW,QAAQ;CACnB,mBAAmB,QAAQ;CAC3B,OAAO,QAAQ;CACf,OAAO,QAAQ;CACf,OAAO,QAAQ;CACf,MAAM,QAAQ;CACd,SAAS,QAAQ;CACjB,KAAK,QAAQ;AACf;;;;;AAMA,SAAgB,iBAAiB,OAA+C,MAA0B,OAAgD;CACxJ,MAAM,MAAM,IAAI,IAAa,IAAI;CACjC,IAAI;CACJ,KAAK,MAAM,QAAQ,OAAO;EACxB,MAAM,SAAS,MAAM,IAAI,KAAK,KAAK,IAAI;EACvC,MAAM,OAAO,OAAO,WAAW,aAAa,OAAO,IAAI,IAAI;EAC3D,KAAK,MAAM,WAAW,MAAM,UAAU,CAAC,GAAG,IAAI,IAAI,OAAO;EACzD,KAAK,MAAM,WAAW,MAAM,WAAW,CAAC,GAAG,IAAI,OAAO,OAAO;EAC7D,MAAM,MAAM;CACd;CACA,KAAK,MAAM,WAAW,OAAO,CAAC,GAAG,IAAI,IAAI,OAAO;CAChD,OAAO;AACT"}
1
+ {"version":3,"file":"abilities.js","names":[],"sources":["../../../src/core/schema/abilities.ts"],"sourcesContent":["import type { Node as PMNode } from '@tiptap/pm/model'\n\n// Vue-free and server-importable: node schemas shared with the server declare their rule via `NodeConfig.abilities`.\n\n/** Ability ids. Hosts may add their own strings; these are the ones the editor itself checks. */\nexport const ABILITY = {\n marks: 'format.marks',\n headings: 'format.headings',\n lists: 'format.lists',\n blockquote: 'format.blockquote',\n codeBlock: 'format.codeBlock',\n rule: 'format.rule',\n blockContent: 'block.content',\n composite: 'format.composite',\n transcript: 'transcript.segment',\n media: 'insert.media',\n record: 'insert.record',\n mention: 'insert.mention',\n reference: 'insert.reference',\n tag: 'insert.tag',\n aiRewrite: 'ai.rewrite',\n aiGenerate: 'ai.generate',\n aiAutocomplete: 'ai.autocomplete',\n blockDelete: 'block.delete',\n blockDuplicate: 'block.duplicate',\n blockConvert: 'block.convert',\n compositeMeta: 'composite.meta',\n compositeSummarize: 'composite.summarize',\n compositeExport: 'composite.export',\n compositeDerive: 'composite.derive',\n} as const\n\nexport type Ability = (typeof ABILITY)[keyof typeof ABILITY] | (string & {})\n\n/** How a node changes the abilities of everything inside it: `grants`, then `revokes`; `own` only applies when it is the innermost node. */\nexport interface AbilityRule {\n grants?: readonly Ability[]\n revokes?: readonly Ability[]\n own?: readonly Ability[]\n}\n\nexport type AbilityRuleSource = AbilityRule | ((node: PMNode) => AbilityRule)\n\n/** Everything a plain paragraph at document root can do. `composite.*` are `own` abilities of composites only. */\nexport const ROOT_ABILITIES: readonly Ability[] = [\n ABILITY.marks, ABILITY.headings, ABILITY.lists, ABILITY.blockquote, ABILITY.codeBlock, ABILITY.rule, ABILITY.blockContent, ABILITY.composite,\n ABILITY.transcript, ABILITY.media, ABILITY.record, ABILITY.mention, ABILITY.reference, ABILITY.tag, ABILITY.aiRewrite, ABILITY.aiGenerate,\n ABILITY.aiAutocomplete, ABILITY.blockDelete, ABILITY.blockDuplicate, ABILITY.blockConvert,\n]\n\n/** Text-editing abilities an atom block (image/audio/video) or a tags row can never have. */\nexport const TEXT_ABILITIES: readonly Ability[] = [\n ABILITY.marks, ABILITY.headings, ABILITY.lists, ABILITY.blockquote, ABILITY.codeBlock, ABILITY.rule, ABILITY.blockContent, ABILITY.composite,\n ABILITY.transcript, ABILITY.media, ABILITY.record, ABILITY.mention, ABILITY.reference, ABILITY.tag, ABILITY.aiRewrite, ABILITY.aiGenerate,\n ABILITY.aiAutocomplete,\n]\n\n/** Node/mark type → ability its creation/toggling needs (toolbar fallback, shortcut + input-rule gate). */\nexport const TYPE_ABILITIES: Readonly<Record<string, Ability>> = {\n bold: ABILITY.marks,\n italic: ABILITY.marks,\n strike: ABILITY.marks,\n code: ABILITY.marks,\n heading: ABILITY.headings,\n bulletList: ABILITY.lists,\n orderedList: ABILITY.lists,\n listItem: ABILITY.lists,\n taskList: ABILITY.lists,\n taskItem: ABILITY.lists,\n blockquote: ABILITY.blockquote,\n codeBlock: ABILITY.codeBlock,\n horizontalRule: ABILITY.rule,\n composite: ABILITY.composite,\n transcriptSegment: ABILITY.transcript,\n image: ABILITY.media,\n audio: ABILITY.media,\n video: ABILITY.media,\n file: ABILITY.media,\n mention: ABILITY.mention,\n reference: ABILITY.reference,\n tag: ABILITY.tag,\n}\n\n/**\n * Abilities at the end of `chain` (ancestors from depth 1 down to and including the innermost node):\n * start with `root`; per node add its `grants`, remove its `revokes`; finally add the innermost node's `own`.\n */\nexport function resolveAbilities(rules: ReadonlyMap<string, AbilityRuleSource>, root: readonly Ability[], chain: readonly PMNode[]): ReadonlySet<Ability> {\n const set = new Set<Ability>(root)\n let own: readonly Ability[] | undefined\n for (const node of chain) {\n const source = rules.get(node.type.name)\n const rule = typeof source === 'function' ? source(node) : source\n for (const ability of rule?.grants ?? []) set.add(ability)\n for (const ability of rule?.revokes ?? []) set.delete(ability)\n own = rule?.own\n }\n for (const ability of own ?? []) set.add(ability)\n return set\n}\n\ndeclare module '@tiptap/core' {\n interface NodeConfig<Options, Storage> {\n /** Abilities this node grants/revokes for its content (`own`: only when it is the innermost node). Host rules override it. */\n abilities?: AbilityRuleSource\n }\n}\n"],"mappings":";;AAKA,MAAa,UAAU;CACrB,OAAO;CACP,UAAU;CACV,OAAO;CACP,YAAY;CACZ,WAAW;CACX,MAAM;CACN,cAAc;CACd,WAAW;CACX,YAAY;CACZ,OAAO;CACP,QAAQ;CACR,SAAS;CACT,WAAW;CACX,KAAK;CACL,WAAW;CACX,YAAY;CACZ,gBAAgB;CAChB,aAAa;CACb,gBAAgB;CAChB,cAAc;CACd,eAAe;CACf,oBAAoB;CACpB,iBAAiB;CACjB,iBAAiB;AACnB;;AAcA,MAAa,iBAAqC;CAChD,QAAQ;CAAO,QAAQ;CAAU,QAAQ;CAAO,QAAQ;CAAY,QAAQ;CAAW,QAAQ;CAAM,QAAQ;CAAc,QAAQ;CACnI,QAAQ;CAAY,QAAQ;CAAO,QAAQ;CAAQ,QAAQ;CAAS,QAAQ;CAAW,QAAQ;CAAK,QAAQ;CAAW,QAAQ;CAC/H,QAAQ;CAAgB,QAAQ;CAAa,QAAQ;CAAgB,QAAQ;AAC/E;;AAGA,MAAa,iBAAqC;CAChD,QAAQ;CAAO,QAAQ;CAAU,QAAQ;CAAO,QAAQ;CAAY,QAAQ;CAAW,QAAQ;CAAM,QAAQ;CAAc,QAAQ;CACnI,QAAQ;CAAY,QAAQ;CAAO,QAAQ;CAAQ,QAAQ;CAAS,QAAQ;CAAW,QAAQ;CAAK,QAAQ;CAAW,QAAQ;CAC/H,QAAQ;AACV;;AAGA,MAAa,iBAAoD;CAC/D,MAAM,QAAQ;CACd,QAAQ,QAAQ;CAChB,QAAQ,QAAQ;CAChB,MAAM,QAAQ;CACd,SAAS,QAAQ;CACjB,YAAY,QAAQ;CACpB,aAAa,QAAQ;CACrB,UAAU,QAAQ;CAClB,UAAU,QAAQ;CAClB,UAAU,QAAQ;CAClB,YAAY,QAAQ;CACpB,WAAW,QAAQ;CACnB,gBAAgB,QAAQ;CACxB,WAAW,QAAQ;CACnB,mBAAmB,QAAQ;CAC3B,OAAO,QAAQ;CACf,OAAO,QAAQ;CACf,OAAO,QAAQ;CACf,MAAM,QAAQ;CACd,SAAS,QAAQ;CACjB,WAAW,QAAQ;CACnB,KAAK,QAAQ;AACf;;;;;AAMA,SAAgB,iBAAiB,OAA+C,MAA0B,OAAgD;CACxJ,MAAM,MAAM,IAAI,IAAa,IAAI;CACjC,IAAI;CACJ,KAAK,MAAM,QAAQ,OAAO;EACxB,MAAM,SAAS,MAAM,IAAI,KAAK,KAAK,IAAI;EACvC,MAAM,OAAO,OAAO,WAAW,aAAa,OAAO,IAAI,IAAI;EAC3D,KAAK,MAAM,WAAW,MAAM,UAAU,CAAC,GAAG,IAAI,IAAI,OAAO;EACzD,KAAK,MAAM,WAAW,MAAM,WAAW,CAAC,GAAG,IAAI,OAAO,OAAO;EAC7D,MAAM,MAAM;CACd;CACA,KAAK,MAAM,WAAW,OAAO,CAAC,GAAG,IAAI,IAAI,OAAO;CAChD,OAAO;AACT"}
@@ -5,17 +5,23 @@ import { HEX_COLOR } from "./hex-color.js";
5
5
  import { NodeFlags, isBlockContainer, isChromeNode, isEditorBlock } from "./node-flags.js";
6
6
  import { OpaqueFence } from "./opaque-fence.js";
7
7
  import { StrikeX } from "./strike.js";
8
+ import { schemaExtensionsOf } from "./of-features.js";
8
9
  import { AnyExtension, JSONContent } from "@tiptap/core";
9
10
  //#region src/core/schema/index.d.ts
10
11
  /**
11
- * Base Vue-free nodes and marks of every editor: StarterKit (history off: the surface enables it for standalone
12
- * editors, collaboration brings its own), StrikeX, the node-flags extension, `OpaqueFence` (Markdown fences of unknown
13
- * kinds, kept verbatim) and `BlockId`, which adds the `id` attribute to every block type (its ID-assigning plugins only
14
- * run in an editor). The server builds its schema from these as well (`getSchema(...)`).
12
+ * The Vue-free nodes and marks of the content base (`core-content` feature): StarterKit (history off: the surface enables
13
+ * it for standalone editors, collaboration brings its own), StrikeX, the node-flags extension and `OpaqueFence` (Markdown
14
+ * fences of unknown kinds, kept verbatim). Without `BlockId`: `schemaExtensionsOf` appends it last.
15
+ */
16
+ export declare const coreContentSchemaExtensions: () => AnyExtension[];
17
+ /**
18
+ * Base Vue-free nodes and marks of every editor: `coreContentSchemaExtensions()` and `BlockId`, which adds the `id`
19
+ * attribute to every block type (its ID-assigning plugins only run in an editor). The server builds its schema from
20
+ * these as well (`getSchema(...)`).
15
21
  */
16
22
  export declare const coreSchemaExtensions: () => AnyExtension[];
17
23
  /** Content of a fresh, empty document. */
18
24
  export declare const EMPTY_EDITOR_CONTENT: JSONContent;
19
25
  //#endregion
20
- export { ABILITY, Ability, AbilityRule, AbilityRuleSource, BLOCK_ID_ATTR, BLOCK_ID_TYPES, BlockId, HEX_COLOR, NodeFlags, OpaqueFence, ROOT_ABILITIES, StrikeX, TEXT_ABILITIES, TYPE_ABILITIES, assignBlockIds, blockIdOf, findBlockById, isBlockContainer, isChromeNode, isEditorBlock, newBlockId, resolveAbilities };
26
+ export { ABILITY, Ability, AbilityRule, AbilityRuleSource, BLOCK_ID_ATTR, BLOCK_ID_TYPES, BlockId, HEX_COLOR, NodeFlags, OpaqueFence, ROOT_ABILITIES, StrikeX, TEXT_ABILITIES, TYPE_ABILITIES, assignBlockIds, blockIdOf, findBlockById, isBlockContainer, isChromeNode, isEditorBlock, newBlockId, resolveAbilities, schemaExtensionsOf };
21
27
  //# sourceMappingURL=index.d.ts.map
@@ -4,30 +4,35 @@ import { NodeFlags, isBlockContainer, isChromeNode, isEditorBlock } from "./node
4
4
  import { OpaqueFence } from "./opaque-fence.js";
5
5
  import { StrikeX } from "./strike.js";
6
6
  import { HEX_COLOR } from "./hex-color.js";
7
+ import { schemaExtensionsOf } from "./of-features.js";
7
8
  import StarterKit from "@tiptap/starter-kit";
8
9
  //#region src/core/schema/index.ts
9
10
  /**
10
- * Base Vue-free nodes and marks of every editor: StarterKit (history off: the surface enables it for standalone
11
- * editors, collaboration brings its own), StrikeX, the node-flags extension, `OpaqueFence` (Markdown fences of unknown
12
- * kinds, kept verbatim) and `BlockId`, which adds the `id` attribute to every block type (its ID-assigning plugins only
13
- * run in an editor). The server builds its schema from these as well (`getSchema(...)`).
11
+ * The Vue-free nodes and marks of the content base (`core-content` feature): StarterKit (history off: the surface enables
12
+ * it for standalone editors, collaboration brings its own), StrikeX, the node-flags extension and `OpaqueFence` (Markdown
13
+ * fences of unknown kinds, kept verbatim). Without `BlockId`: `schemaExtensionsOf` appends it last.
14
14
  */
15
- const coreSchemaExtensions = () => [
15
+ const coreContentSchemaExtensions = () => [
16
16
  StarterKit.configure({
17
17
  strike: false,
18
18
  undoRedo: false
19
19
  }),
20
20
  StrikeX,
21
21
  NodeFlags,
22
- OpaqueFence,
23
- BlockId
22
+ OpaqueFence
24
23
  ];
24
+ /**
25
+ * Base Vue-free nodes and marks of every editor: `coreContentSchemaExtensions()` and `BlockId`, which adds the `id`
26
+ * attribute to every block type (its ID-assigning plugins only run in an editor). The server builds its schema from
27
+ * these as well (`getSchema(...)`).
28
+ */
29
+ const coreSchemaExtensions = () => [...coreContentSchemaExtensions(), BlockId];
25
30
  /** Content of a fresh, empty document. */
26
31
  const EMPTY_EDITOR_CONTENT = {
27
32
  type: "doc",
28
33
  content: [{ type: "paragraph" }]
29
34
  };
30
35
  //#endregion
31
- export { ABILITY, BLOCK_ID_ATTR, BLOCK_ID_TYPES, BlockId, EMPTY_EDITOR_CONTENT, HEX_COLOR, NodeFlags, OpaqueFence, ROOT_ABILITIES, StrikeX, TEXT_ABILITIES, TYPE_ABILITIES, assignBlockIds, blockIdOf, coreSchemaExtensions, findBlockById, isBlockContainer, isChromeNode, isEditorBlock, newBlockId, resolveAbilities };
36
+ export { ABILITY, BLOCK_ID_ATTR, BLOCK_ID_TYPES, BlockId, EMPTY_EDITOR_CONTENT, HEX_COLOR, NodeFlags, OpaqueFence, ROOT_ABILITIES, StrikeX, TEXT_ABILITIES, TYPE_ABILITIES, assignBlockIds, blockIdOf, coreContentSchemaExtensions, coreSchemaExtensions, findBlockById, isBlockContainer, isChromeNode, isEditorBlock, newBlockId, resolveAbilities, schemaExtensionsOf };
32
37
 
33
38
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../../src/core/schema/index.ts"],"sourcesContent":["import type { AnyExtension, JSONContent } from '@tiptap/core'\nimport StarterKit from '@tiptap/starter-kit'\nimport { BlockId } from './block-ids'\nimport { NodeFlags } from './node-flags'\nimport { OpaqueFence } from './opaque-fence'\nimport { StrikeX } from './strike'\n\nexport * from './abilities'\nexport * from './block-ids'\nexport * from './hex-color'\nexport * from './mark-flags'\nexport * from './node-flags'\nexport { OpaqueFence } from './opaque-fence'\nexport { StrikeX } from './strike'\n\n/**\n * Base Vue-free nodes and marks of every editor: StarterKit (history off: the surface enables it for standalone\n * editors, collaboration brings its own), StrikeX, the node-flags extension, `OpaqueFence` (Markdown fences of unknown\n * kinds, kept verbatim) and `BlockId`, which adds the `id` attribute to every block type (its ID-assigning plugins only\n * run in an editor). The server builds its schema from these as well (`getSchema(...)`).\n */\nexport const coreSchemaExtensions = (): AnyExtension[] => [StarterKit.configure({ strike: false, undoRedo: false }), StrikeX, NodeFlags, OpaqueFence, BlockId]\n\n/** Content of a fresh, empty document. */\nexport const EMPTY_EDITOR_CONTENT: JSONContent = { type: 'doc', content: [{ type: 'paragraph' }] }\n"],"mappings":";;;;;;;;;;;;;;AAqBA,MAAa,6BAA6C;CAAC,WAAW,UAAU;EAAE,QAAQ;EAAO,UAAU;CAAM,CAAC;CAAG;CAAS;CAAW;CAAa;AAAO;;AAG7J,MAAa,uBAAoC;CAAE,MAAM;CAAO,SAAS,CAAC,EAAE,MAAM,YAAY,CAAC;AAAE"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../src/core/schema/index.ts"],"sourcesContent":["import type { AnyExtension, JSONContent } from '@tiptap/core'\nimport StarterKit from '@tiptap/starter-kit'\nimport { BlockId } from './block-ids'\nimport { NodeFlags } from './node-flags'\nimport { OpaqueFence } from './opaque-fence'\nimport { StrikeX } from './strike'\n\nexport * from './abilities'\nexport * from './block-ids'\nexport * from './hex-color'\nexport * from './mark-flags'\nexport * from './node-flags'\nexport { OpaqueFence } from './opaque-fence'\nexport { StrikeX } from './strike'\nexport { schemaExtensionsOf } from './of-features'\n\n/**\n * The Vue-free nodes and marks of the content base (`core-content` feature): StarterKit (history off: the surface enables\n * it for standalone editors, collaboration brings its own), StrikeX, the node-flags extension and `OpaqueFence` (Markdown\n * fences of unknown kinds, kept verbatim). Without `BlockId`: `schemaExtensionsOf` appends it last.\n */\nexport const coreContentSchemaExtensions = (): AnyExtension[] => [StarterKit.configure({ strike: false, undoRedo: false }), StrikeX, NodeFlags, OpaqueFence]\n\n/**\n * Base Vue-free nodes and marks of every editor: `coreContentSchemaExtensions()` and `BlockId`, which adds the `id`\n * attribute to every block type (its ID-assigning plugins only run in an editor). The server builds its schema from\n * these as well (`getSchema(...)`).\n */\nexport const coreSchemaExtensions = (): AnyExtension[] => [...coreContentSchemaExtensions(), BlockId]\n\n/** Content of a fresh, empty document. */\nexport const EMPTY_EDITOR_CONTENT: JSONContent = { type: 'doc', content: [{ type: 'paragraph' }] }\n"],"mappings":";;;;;;;;;;;;;;AAqBA,MAAa,oCAAoD;CAAC,WAAW,UAAU;EAAE,QAAQ;EAAO,UAAU;CAAM,CAAC;CAAG;CAAS;CAAW;AAAW;;;;;;AAO3J,MAAa,6BAA6C,CAAC,GAAG,4BAA4B,GAAG,OAAO;;AAGpG,MAAa,uBAAoC;CAAE,MAAM;CAAO,SAAS,CAAC,EAAE,MAAM,YAAY,CAAC;AAAE"}
@@ -1,3 +1,4 @@
1
+ import { JSONContent } from "@tiptap/core";
1
2
  //#region src/core/schema/mark-flags.d.ts
2
3
  declare module '@tiptap/core' {
3
4
  interface MarkConfig<Options, Storage> {
@@ -7,6 +8,12 @@ declare module '@tiptap/core' {
7
8
  */
8
9
  markdownInvisible?: boolean;
9
10
  }
11
+ interface NodeConfig<Options, Storage> {
12
+ /**
13
+ * Rewrites the document JSON just before `editor.markdown.serialize` renders it (every node extension that declares it,
14
+ * in extension order), e.g. to drop attributes that must not reach the Markdown. Must not modify its input.
15
+ */
16
+ markdownPrepare?: (json: JSONContent, editor: Editor) => JSONContent;
17
+ }
10
18
  }
11
- export {};
12
19
  //# sourceMappingURL=mark-flags.d.ts.map
@@ -0,0 +1,13 @@
1
+ import { EditorFeature } from "../feature.js";
2
+ import { AnyExtension } from "@tiptap/core";
3
+ //#region src/core/schema/of-features.d.ts
4
+ /**
5
+ * The server schema of a feature list: every feature's Vue-free `schemaExtensions` in feature order, then `BlockId`
6
+ * (it adds the `id` attribute to every block type, so it comes last). The content features carry the document model;
7
+ * an interaction feature may also declare `schemaExtensions` for marks that stored documents contain (`comments`), so
8
+ * the collection looks at the declaration, not at the dimension. Takes the schema-bearing slice of a feature, so
9
+ * server code can pass schema-only sources and never load a feature's UI.
10
+ */
11
+ export declare const schemaExtensionsOf: (features: readonly Pick<EditorFeature, "schemaExtensions">[]) => AnyExtension[];
12
+ //#endregion
13
+ //# sourceMappingURL=of-features.d.ts.map
@@ -0,0 +1,14 @@
1
+ import { BlockId } from "./block-ids.js";
2
+ //#region src/core/schema/of-features.ts
3
+ /**
4
+ * The server schema of a feature list: every feature's Vue-free `schemaExtensions` in feature order, then `BlockId`
5
+ * (it adds the `id` attribute to every block type, so it comes last). The content features carry the document model;
6
+ * an interaction feature may also declare `schemaExtensions` for marks that stored documents contain (`comments`), so
7
+ * the collection looks at the declaration, not at the dimension. Takes the schema-bearing slice of a feature, so
8
+ * server code can pass schema-only sources and never load a feature's UI.
9
+ */
10
+ const schemaExtensionsOf = (features) => [...features.flatMap((feature) => feature.schemaExtensions?.() ?? []), BlockId];
11
+ //#endregion
12
+ export { schemaExtensionsOf };
13
+
14
+ //# sourceMappingURL=of-features.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"of-features.js","names":[],"sources":["../../../src/core/schema/of-features.ts"],"sourcesContent":["import type { AnyExtension } from '@tiptap/core'\nimport type { EditorFeature } from '../feature'\nimport { BlockId } from './block-ids'\n\n/**\n * The server schema of a feature list: every feature's Vue-free `schemaExtensions` in feature order, then `BlockId`\n * (it adds the `id` attribute to every block type, so it comes last). The content features carry the document model;\n * an interaction feature may also declare `schemaExtensions` for marks that stored documents contain (`comments`), so\n * the collection looks at the declaration, not at the dimension. Takes the schema-bearing slice of a feature, so\n * server code can pass schema-only sources and never load a feature's UI.\n */\nexport const schemaExtensionsOf = (features: readonly Pick<EditorFeature, 'schemaExtensions'>[]): AnyExtension[] =>\n [...features.flatMap(feature => feature.schemaExtensions?.() ?? []), BlockId]\n"],"mappings":";;;;;;;;;AAWA,MAAa,sBAAsB,aACjC,CAAC,GAAG,SAAS,SAAQ,YAAW,QAAQ,mBAAmB,KAAK,CAAC,CAAC,GAAG,OAAO"}
@@ -1,10 +1,11 @@
1
- import { SlashCommandItem } from "./extension-points.js";
1
+ import { CommandDef } from "./command-types.js";
2
+ import "./commands.js";
2
3
  import { Extension } from "@tiptap/core";
3
4
  import { PluginKey } from "@tiptap/pm/state";
4
5
  //#region src/core/slash.d.ts
5
6
  export interface SlashCommandOptions {
6
- /** The final `/` menu: features' commands after the host's `slashCommands` transformer. */
7
- items: SlashCommandItem[];
7
+ /** The final command list (features' commands after the host's `commands` transformer); the ones with a `slash` placement make the menu. */
8
+ commands: CommandDef[];
8
9
  /** Popup text while no command matches the typed query (`ctx.t('slash.empty')`). */
9
10
  emptyText: string;
10
11
  /** Popup text while the commands are pending (`ctx.t('common.loading')`). */
@@ -14,9 +15,10 @@ export interface SlashCommandOptions {
14
15
  export declare const SlashCommandPluginKey: PluginKey<any>;
15
16
  /**
16
17
  * `/` menu on an empty line: typing `/` as the only content of a textblock (outside code) opens the shared suggestion
17
- * popup with the commands allowed at the caret (`SlashCommandItem.ability`) whose id or label starts with the typed
18
- * query; picking one deletes `/query` and runs it. A query no allowed command matches (`/foo`) shows nothing and stays
19
- * plain text. The commands come from features and the host; the core feature has none of its own.
18
+ * popup with the commands that have a `slash` placement and are visible and enabled at the caret (`commandState`: ability,
19
+ * structural check, schema and accepted-children fit) whose slash id or label starts with the typed query; picking one
20
+ * deletes `/query` and runs it. A query no such command matches (`/foo`) shows nothing and stays plain text. The commands
21
+ * come from features and the host.
20
22
  * Client-only: not part of the Vue-free schema.
21
23
  */
22
24
  export declare const SlashCommand: Extension<SlashCommandOptions, any>;
@@ -1,33 +1,41 @@
1
- import { abilitiesAt } from "./abilities.js";
1
+ import { commandState } from "./commands.js";
2
2
  import { createSuggestionRender } from "./suggestion-popup.js";
3
3
  import { Extension } from "@tiptap/core";
4
4
  import { PluginKey } from "@tiptap/pm/state";
5
5
  import { Suggestion } from "@tiptap/suggestion";
6
6
  //#region src/core/slash.ts
7
- function matching(items, query, abilities) {
7
+ const slashIdOf = (cmd) => cmd.slash.id ?? cmd.id;
8
+ /** The slash commands that are visible and enabled at the caret (`$at` when the editor state lags, see `commandState`) and whose slash id or label starts with `query`. */
9
+ function matching(editor, commands, query, $at) {
8
10
  const q = query.toLowerCase();
9
- return items.filter((item) => (!item.ability || abilities.has(item.ability)) && (item.id.startsWith(q) || item.label.toLowerCase().startsWith(q)));
11
+ return commands.filter((cmd) => {
12
+ if (!cmd.slash || !("run" in cmd)) return false;
13
+ if (!(slashIdOf(cmd).startsWith(q) || cmd.label.toLowerCase().startsWith(q))) return false;
14
+ const state = commandState(editor, cmd, "caret", $at);
15
+ return state.visible && state.enabled;
16
+ });
10
17
  }
11
18
  /** Own key, so the `/` popup runs next to the `@` and `#` popups. */
12
19
  const SlashCommandPluginKey = new PluginKey("slashCommand");
13
20
  /**
14
21
  * `/` menu on an empty line: typing `/` as the only content of a textblock (outside code) opens the shared suggestion
15
- * popup with the commands allowed at the caret (`SlashCommandItem.ability`) whose id or label starts with the typed
16
- * query; picking one deletes `/query` and runs it. A query no allowed command matches (`/foo`) shows nothing and stays
17
- * plain text. The commands come from features and the host; the core feature has none of its own.
22
+ * popup with the commands that have a `slash` placement and are visible and enabled at the caret (`commandState`: ability,
23
+ * structural check, schema and accepted-children fit) whose slash id or label starts with the typed query; picking one
24
+ * deletes `/query` and runs it. A query no such command matches (`/foo`) shows nothing and stays plain text. The commands
25
+ * come from features and the host.
18
26
  * Client-only: not part of the Vue-free schema.
19
27
  */
20
28
  const SlashCommand = Extension.create({
21
29
  name: "slashCommand",
22
30
  addOptions() {
23
31
  return {
24
- items: [],
32
+ commands: [],
25
33
  emptyText: "",
26
34
  loadingText: ""
27
35
  };
28
36
  },
29
37
  addProseMirrorPlugins() {
30
- const { items, emptyText, loadingText } = this.options;
38
+ const { commands, emptyText, loadingText } = this.options;
31
39
  return [Suggestion({
32
40
  pluginKey: SlashCommandPluginKey,
33
41
  editor: this.editor,
@@ -35,18 +43,18 @@ const SlashCommand = Extension.create({
35
43
  startOfLine: true,
36
44
  shouldShow: ({ editor, range, query, transaction }) => {
37
45
  const $from = transaction.doc.resolve(range.from);
38
- return $from.parentOffset === 0 && range.to === $from.end() && !$from.parent.type.spec.code && matching(items, query, abilitiesAt(editor, $from)).length > 0;
46
+ return $from.parentOffset === 0 && range.to === $from.end() && !$from.parent.type.spec.code && matching(editor, commands, query, $from).length > 0;
39
47
  },
40
- items: ({ editor, query }) => matching(items, query, abilitiesAt(editor, editor.state.selection.$from)),
41
- command: ({ editor, range, props: item }) => {
48
+ items: ({ editor, query }) => matching(editor, commands, query),
49
+ command: ({ editor, range, props: cmd }) => {
42
50
  editor.chain().focus().deleteRange(range).run();
43
- item.run(editor);
51
+ cmd.run(editor);
44
52
  },
45
53
  render: createSuggestionRender({
46
- display: (item) => ({
47
- label: item.label,
48
- description: `/${item.id}`,
49
- icon: item.icon
54
+ display: (cmd) => ({
55
+ label: cmd.label,
56
+ description: `/${slashIdOf(cmd)}`,
57
+ icon: cmd.icon
50
58
  }),
51
59
  emptyText,
52
60
  loadingText