@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,5 +1,6 @@
1
1
  import { CORE_TARGET_IDS, childrenOf, createConverter, finishConversion, isCoreTarget, isCurrentTarget, isListNode, isQuoteNode, isTextblockNode, parseCoreTarget, textblockSpecOf } from "../../core/convert.js";
2
2
  import { compositeKind, defaultCompositeKinds, fallbackCompositeKinds } from "./kinds.js";
3
+ import { keptMeta } from "./meta-keys.js";
3
4
  import { compositeChromeBlocks, flattenCompositesToHeadings, headingGroupRange } from "./heading-composites.js";
4
5
  import "./nodes.js";
5
6
  import { Fragment } from "@tiptap/pm/model";
@@ -40,8 +41,7 @@ function convertCompositeBlocks(schema, nodes, target, kinds) {
40
41
  });
41
42
  function toComposite(head, rest, kind) {
42
43
  if (isComposite(head)) {
43
- const keys = new Set(compositeKind(kinds, kind).fields.map((field) => field.key));
44
- const meta = Object.fromEntries(Object.entries(head.attrs.meta).filter(([key]) => keys.has(key)));
44
+ const meta = keptMeta(compositeKind(kinds, kind), head.attrs.meta);
45
45
  return head.type.create({
46
46
  ...head.attrs,
47
47
  kind,
@@ -1 +1 @@
1
- {"version":3,"file":"convert.js","names":[],"sources":["../../../src/features/composites/convert.ts"],"sourcesContent":["import { Fragment, type Node as PMNode, type Schema } from '@tiptap/pm/model'\nimport {\n CORE_TARGET_IDS,\n childrenOf,\n type ConvertTarget,\n createConverter,\n finishConversion,\n isCoreTarget,\n isCurrentTarget,\n isListNode,\n isQuoteNode,\n isTextblockNode,\n parseCoreTarget,\n textblockSpecOf,\n} from '../../core/convert'\nimport type { ConversionProvider } from '../../core/feature'\nimport { compositeChromeBlocks, flattenCompositesToHeadings, headingGroupRange } from './heading-composites'\nimport { type CompositeKind, compositeKind, defaultCompositeKinds, fallbackCompositeKinds } from './kinds'\nimport { COMPOSITE_CHROME_COUNT } from './nodes'\n\n// Vue-free and server-importable: the composite family's block conversions — wrapping blocks into a composite,\n// switching its kind and unwrapping it into plain blocks — as `ConversionProvider`s of the composite feature.\n\nconst COMPOSITE = 'composite'\nconst TITLE = 'compositeTitle'\nconst COMPOSITE_PREFIX = 'composite:'\n\nconst isComposite = (node: PMNode) => node.type.name === COMPOSITE\n\n/** The conversion targets of the core provider, offered for composites (they unwrap into them). */\nconst UNWRAP_TARGETS: readonly ConvertTarget[] = CORE_TARGET_IDS.flatMap(id => parseCoreTarget(id) ?? [])\n\n/**\n * Blocks `nodes` (siblings) converted to `target`. A composite takes the first block as title and the rest as body;\n * composites unwrap into the core targets (title first, description as italic paragraph, tags as a paragraph of tag\n * chips, meta as a `Label: Wert` line); into a heading, nested composites become sub-headings. Null when nothing\n * changes, the target is not a composite or core target or a node is not a textblock, list, quote or composite.\n * Never looks outside `nodes`: a heading's group is the caller's business.\n */\nexport function convertCompositeBlocks(schema: Schema, nodes: PMNode[], target: ConvertTarget, kinds: readonly CompositeKind[]): PMNode[] | null {\n const first = nodes[0]\n if (!first || !schema.nodes[target.type]) return null\n if (!nodes.every(node => isTextblockNode(node) || isListNode(node) || isQuoteNode(node) || isComposite(node))) return null\n if (nodes.length === 1 && isCurrentTarget(first, target)) return null\n const n = schema.nodes\n const paragraph = n.paragraph!\n\n /** A composite as plain blocks: title paragraph (an empty one only with `keepEmptyTitle`), description, tags, meta, body. */\n function unwrapComposite(composite: PMNode, keepEmptyTitle: boolean, headingLevel?: number): PMNode[] {\n const title = composite.child(0)\n const blocks: PMNode[] = []\n if (keepEmptyTitle || title.content.size) blocks.push(paragraph.create(null, title.content))\n blocks.push(...compositeChromeBlocks(schema, composite, kinds))\n let body = childrenOf(composite, COMPOSITE_CHROME_COUNT)\n if (headingLevel !== undefined) body = flattenCompositesToHeadings(schema, body, true, headingLevel + 1, kinds) ?? body\n return [...blocks, ...body]\n }\n\n const converter = createConverter(schema, { is: isComposite, unwrap: unwrapComposite })\n\n function toComposite(head: PMNode, rest: PMNode[], kind: string): PMNode {\n if (isComposite(head)) {\n // Another kind: the same node; `meta` keeps only the fields of the new kind. Further blocks join its body.\n const keys = new Set(compositeKind(kinds, kind).fields.map(field => field.key))\n const meta = Object.fromEntries(Object.entries(head.attrs.meta as Record<string, unknown>).filter(([key]) => keys.has(key)))\n return head.type.create({ ...head.attrs, kind, meta }, [...childrenOf(head), ...rest])\n }\n let title = Fragment.empty\n let body: PMNode[] = []\n if (isTextblockNode(head)) title = converter.inline(head, TITLE)\n else if (isQuoteNode(head)) body = childrenOf(head)\n else {\n // List: the first item's paragraph is the title, its other blocks and the remaining items (same list type) the body.\n const [item, ...more] = childrenOf(head)\n const [itemHead, ...itemRest] = item ? childrenOf(item) : []\n if (itemHead && isTextblockNode(itemHead)) title = converter.inline(itemHead, TITLE)\n else if (itemHead) itemRest.unshift(itemHead)\n body = [...itemRest, ...(more.length ? [head.type.create(null, more)] : [])]\n }\n body = [...body, ...rest]\n if (!body.length) body = [paragraph.create()]\n return n[COMPOSITE]!.create({ kind }, [n[TITLE]!.create(null, title), n.compositeDescription!.create(), n.compositeTags!.create(), ...body])\n }\n\n let output: PMNode[]\n if (target.type === 'composite') output = [toComposite(first, nodes.slice(1), target.kind)]\n else if (!isCoreTarget(target)) return null\n else if (target.type === 'bulletList' || target.type === 'orderedList') output = converter.toList(nodes, target.type)\n else if (target.type === 'blockquote') output = converter.toQuote(nodes)\n else output = converter.toTextblocks(nodes, textblockSpecOf(target))\n return finishConversion(nodes, output)\n}\n\n/**\n * The conversion of the block right after `$start` into `target`: the range it replaces (a heading becoming a composite\n * takes its group along, which turns into the composite's body) and the converted blocks.\n */\nfunction convertAt(kinds: readonly CompositeKind[]): ConversionProvider['convert'] {\n return (state, $start, target) => {\n const parent = $start.parent\n const from = $start.index()\n const to = target.type === 'composite' && parent.child(from).type.name === 'heading' ? headingGroupRange(parent, from).to : from + 1\n const nodes: PMNode[] = []\n for (let index = from; index < to; index++) nodes.push(parent.child(index))\n const blocks = convertCompositeBlocks(state.schema, nodes, target, kinds)\n return blocks ? { from: $start.pos, to: nodes.reduce((end, node) => end + node.nodeSize, $start.pos), blocks } : null\n }\n}\n\n/**\n * The composite feature's providers, in menu order. The first claims composites as source blocks (`handlesSource`): it\n * offers the core targets for them and executes every conversion of a composite, including kind changes. The second\n * owns the `composite:<kind>` targets: blocks and kind switches. `kinds` are the host's configured kinds; without them the\n * built-in kinds apply, and their labels (the menu entries) follow the language of the `t` the menu renders with. What\n * a conversion writes into the document (the `Label: Wert` line of a composite's meta) uses the built-in kinds in the\n * default language, since `convert` runs without a translator.\n */\nexport function compositeConversions(kinds?: readonly CompositeKind[]): readonly ConversionProvider[] {\n const structure = kinds ?? fallbackCompositeKinds()\n const convert = convertAt(structure)\n const unwrap: ConversionProvider = {\n handlesSource: isComposite,\n targets: (_editor, node) => isComposite(node) ? UNWRAP_TARGETS.filter(target => node.type.schema.nodes[target.type]) : [],\n parseTarget: () => null,\n label: () => null,\n convert,\n }\n const wrap: ConversionProvider = {\n targets: (_editor, node) => {\n if (!(isTextblockNode(node) || isListNode(node) || isQuoteNode(node) || isComposite(node)) || !node.type.schema.nodes[COMPOSITE]) return []\n return structure.map((kind): ConvertTarget => ({ type: 'composite', kind: kind.id })).filter(target => !isCurrentTarget(node, target))\n },\n parseTarget: (id) => {\n if (!id.startsWith(COMPOSITE_PREFIX)) return null\n const kind = id.slice(COMPOSITE_PREFIX.length)\n return structure.some(known => known.id === kind) ? { type: 'composite', kind } : null\n },\n label: (target, t) => {\n if (target.type !== 'composite') return null\n const kind = compositeKind(kinds ?? defaultCompositeKinds(t), target.kind)\n return { label: t('composites.convert.kind', { kind: kind.label }), icon: kind.icon }\n },\n convert,\n }\n return [unwrap, wrap]\n}\n"],"mappings":";;;;;;AAuBA,MAAM,YAAY;AAClB,MAAM,QAAQ;AACd,MAAM,mBAAmB;AAEzB,MAAM,eAAe,SAAiB,KAAK,KAAK,SAAS;;AAGzD,MAAM,iBAA2C,gBAAgB,SAAQ,OAAM,gBAAgB,EAAE,KAAK,CAAC,CAAC;;;;;;;;AASxG,SAAgB,uBAAuB,QAAgB,OAAiB,QAAuB,OAAkD;CAC/I,MAAM,QAAQ,MAAM;CACpB,IAAI,CAAC,SAAS,CAAC,OAAO,MAAM,OAAO,OAAO,OAAO;CACjD,IAAI,CAAC,MAAM,OAAM,SAAQ,gBAAgB,IAAI,KAAK,WAAW,IAAI,KAAK,YAAY,IAAI,KAAK,YAAY,IAAI,CAAC,GAAG,OAAO;CACtH,IAAI,MAAM,WAAW,KAAK,gBAAgB,OAAO,MAAM,GAAG,OAAO;CACjE,MAAM,IAAI,OAAO;CACjB,MAAM,YAAY,EAAE;;CAGpB,SAAS,gBAAgB,WAAmB,gBAAyB,cAAiC;EACpG,MAAM,QAAQ,UAAU,MAAM,CAAC;EAC/B,MAAM,SAAmB,CAAC;EAC1B,IAAI,kBAAkB,MAAM,QAAQ,MAAM,OAAO,KAAK,UAAU,OAAO,MAAM,MAAM,OAAO,CAAC;EAC3F,OAAO,KAAK,GAAG,sBAAsB,QAAQ,WAAW,KAAK,CAAC;EAC9D,IAAI,OAAO,WAAW,WAAA,CAAiC;EACvD,IAAI,iBAAiB,KAAA,GAAW,OAAO,4BAA4B,QAAQ,MAAM,MAAM,eAAe,GAAG,KAAK,KAAK;EACnH,OAAO,CAAC,GAAG,QAAQ,GAAG,IAAI;CAC5B;CAEA,MAAM,YAAY,gBAAgB,QAAQ;EAAE,IAAI;EAAa,QAAQ;CAAgB,CAAC;CAEtF,SAAS,YAAY,MAAc,MAAgB,MAAsB;EACvE,IAAI,YAAY,IAAI,GAAG;GAErB,MAAM,OAAO,IAAI,IAAI,cAAc,OAAO,IAAI,CAAC,CAAC,OAAO,KAAI,UAAS,MAAM,GAAG,CAAC;GAC9E,MAAM,OAAO,OAAO,YAAY,OAAO,QAAQ,KAAK,MAAM,IAA+B,CAAC,CAAC,QAAQ,CAAC,SAAS,KAAK,IAAI,GAAG,CAAC,CAAC;GAC3H,OAAO,KAAK,KAAK,OAAO;IAAE,GAAG,KAAK;IAAO;IAAM;GAAK,GAAG,CAAC,GAAG,WAAW,IAAI,GAAG,GAAG,IAAI,CAAC;EACvF;EACA,IAAI,QAAQ,SAAS;EACrB,IAAI,OAAiB,CAAC;EACtB,IAAI,gBAAgB,IAAI,GAAG,QAAQ,UAAU,OAAO,MAAM,KAAK;OAC1D,IAAI,YAAY,IAAI,GAAG,OAAO,WAAW,IAAI;OAC7C;GAEH,MAAM,CAAC,MAAM,GAAG,QAAQ,WAAW,IAAI;GACvC,MAAM,CAAC,UAAU,GAAG,YAAY,OAAO,WAAW,IAAI,IAAI,CAAC;GAC3D,IAAI,YAAY,gBAAgB,QAAQ,GAAG,QAAQ,UAAU,OAAO,UAAU,KAAK;QAC9E,IAAI,UAAU,SAAS,QAAQ,QAAQ;GAC5C,OAAO,CAAC,GAAG,UAAU,GAAI,KAAK,SAAS,CAAC,KAAK,KAAK,OAAO,MAAM,IAAI,CAAC,IAAI,CAAC,CAAE;EAC7E;EACA,OAAO,CAAC,GAAG,MAAM,GAAG,IAAI;EACxB,IAAI,CAAC,KAAK,QAAQ,OAAO,CAAC,UAAU,OAAO,CAAC;EAC5C,OAAO,EAAE,UAAU,CAAE,OAAO,EAAE,KAAK,GAAG;GAAC,EAAE,MAAM,CAAE,OAAO,MAAM,KAAK;GAAG,EAAE,qBAAsB,OAAO;GAAG,EAAE,cAAe,OAAO;GAAG,GAAG;EAAI,CAAC;CAC7I;CAEA,IAAI;CACJ,IAAI,OAAO,SAAS,aAAa,SAAS,CAAC,YAAY,OAAO,MAAM,MAAM,CAAC,GAAG,OAAO,IAAI,CAAC;MACrF,IAAI,CAAC,aAAa,MAAM,GAAG,OAAO;MAClC,IAAI,OAAO,SAAS,gBAAgB,OAAO,SAAS,eAAe,SAAS,UAAU,OAAO,OAAO,OAAO,IAAI;MAC/G,IAAI,OAAO,SAAS,cAAc,SAAS,UAAU,QAAQ,KAAK;MAClE,SAAS,UAAU,aAAa,OAAO,gBAAgB,MAAM,CAAC;CACnE,OAAO,iBAAiB,OAAO,MAAM;AACvC;;;;;AAMA,SAAS,UAAU,OAAgE;CACjF,QAAQ,OAAO,QAAQ,WAAW;EAChC,MAAM,SAAS,OAAO;EACtB,MAAM,OAAO,OAAO,MAAM;EAC1B,MAAM,KAAK,OAAO,SAAS,eAAe,OAAO,MAAM,IAAI,CAAC,CAAC,KAAK,SAAS,YAAY,kBAAkB,QAAQ,IAAI,CAAC,CAAC,KAAK,OAAO;EACnI,MAAM,QAAkB,CAAC;EACzB,KAAK,IAAI,QAAQ,MAAM,QAAQ,IAAI,SAAS,MAAM,KAAK,OAAO,MAAM,KAAK,CAAC;EAC1E,MAAM,SAAS,uBAAuB,MAAM,QAAQ,OAAO,QAAQ,KAAK;EACxE,OAAO,SAAS;GAAE,MAAM,OAAO;GAAK,IAAI,MAAM,QAAQ,KAAK,SAAS,MAAM,KAAK,UAAU,OAAO,GAAG;GAAG;EAAO,IAAI;CACnH;AACF;;;;;;;;;AAUA,SAAgB,qBAAqB,OAAiE;CACpG,MAAM,YAAY,SAAS,uBAAuB;CAClD,MAAM,UAAU,UAAU,SAAS;CAyBnC,OAAO,CAAC;EAvBN,eAAe;EACf,UAAU,SAAS,SAAS,YAAY,IAAI,IAAI,eAAe,QAAO,WAAU,KAAK,KAAK,OAAO,MAAM,OAAO,KAAK,IAAI,CAAC;EACxH,mBAAmB;EACnB,aAAa;EACb;CAmBW,GAAG;EAhBd,UAAU,SAAS,SAAS;GAC1B,IAAI,EAAE,gBAAgB,IAAI,KAAK,WAAW,IAAI,KAAK,YAAY,IAAI,KAAK,YAAY,IAAI,MAAM,CAAC,KAAK,KAAK,OAAO,MAAM,YAAY,OAAO,CAAC;GAC1I,OAAO,UAAU,KAAK,UAAyB;IAAE,MAAM;IAAa,MAAM,KAAK;GAAG,EAAE,CAAC,CAAC,QAAO,WAAU,CAAC,gBAAgB,MAAM,MAAM,CAAC;EACvI;EACA,cAAc,OAAO;GACnB,IAAI,CAAC,GAAG,WAAW,gBAAgB,GAAG,OAAO;GAC7C,MAAM,OAAO,GAAG,MAAM,EAAuB;GAC7C,OAAO,UAAU,MAAK,UAAS,MAAM,OAAO,IAAI,IAAI;IAAE,MAAM;IAAa;GAAK,IAAI;EACpF;EACA,QAAQ,QAAQ,MAAM;GACpB,IAAI,OAAO,SAAS,aAAa,OAAO;GACxC,MAAM,OAAO,cAAc,SAAS,sBAAsB,CAAC,GAAG,OAAO,IAAI;GACzE,OAAO;IAAE,OAAO,EAAE,2BAA2B,EAAE,MAAM,KAAK,MAAM,CAAC;IAAG,MAAM,KAAK;GAAK;EACtF;EACA;CAEiB,CAAC;AACtB"}
1
+ {"version":3,"file":"convert.js","names":[],"sources":["../../../src/features/composites/convert.ts"],"sourcesContent":["import { Fragment, type Node as PMNode, type Schema } from '@tiptap/pm/model'\nimport {\n CORE_TARGET_IDS,\n childrenOf,\n type ConvertTarget,\n createConverter,\n finishConversion,\n isCoreTarget,\n isCurrentTarget,\n isListNode,\n isQuoteNode,\n isTextblockNode,\n parseCoreTarget,\n textblockSpecOf,\n} from '../../core/convert'\nimport type { ConversionProvider } from '../../core/feature'\nimport { compositeChromeBlocks, flattenCompositesToHeadings, headingGroupRange } from './heading-composites'\nimport { type CompositeKind, compositeKind, defaultCompositeKinds, fallbackCompositeKinds } from './kinds'\nimport { keptMeta } from './meta-keys'\nimport { COMPOSITE_CHROME_COUNT } from './nodes'\n\n// Vue-free and server-importable: the composite family's block conversions — wrapping blocks into a composite,\n// switching its kind and unwrapping it into plain blocks — as `ConversionProvider`s of the composite feature.\n\nconst COMPOSITE = 'composite'\nconst TITLE = 'compositeTitle'\nconst COMPOSITE_PREFIX = 'composite:'\n\nconst isComposite = (node: PMNode) => node.type.name === COMPOSITE\n\n/** The conversion targets of the core provider, offered for composites (they unwrap into them). */\nconst UNWRAP_TARGETS: readonly ConvertTarget[] = CORE_TARGET_IDS.flatMap(id => parseCoreTarget(id) ?? [])\n\n/**\n * Blocks `nodes` (siblings) converted to `target`. A composite takes the first block as title and the rest as body;\n * composites unwrap into the core targets (title first, description as italic paragraph, tags as a paragraph of tag\n * chips, meta as a `Label: Wert` line); into a heading, nested composites become sub-headings. Null when nothing\n * changes, the target is not a composite or core target or a node is not a textblock, list, quote or composite.\n * Never looks outside `nodes`: a heading's group is the caller's business.\n */\nexport function convertCompositeBlocks(schema: Schema, nodes: PMNode[], target: ConvertTarget, kinds: readonly CompositeKind[]): PMNode[] | null {\n const first = nodes[0]\n if (!first || !schema.nodes[target.type]) return null\n if (!nodes.every(node => isTextblockNode(node) || isListNode(node) || isQuoteNode(node) || isComposite(node))) return null\n if (nodes.length === 1 && isCurrentTarget(first, target)) return null\n const n = schema.nodes\n const paragraph = n.paragraph!\n\n /** A composite as plain blocks: title paragraph (an empty one only with `keepEmptyTitle`), description, tags, meta, body. */\n function unwrapComposite(composite: PMNode, keepEmptyTitle: boolean, headingLevel?: number): PMNode[] {\n const title = composite.child(0)\n const blocks: PMNode[] = []\n if (keepEmptyTitle || title.content.size) blocks.push(paragraph.create(null, title.content))\n blocks.push(...compositeChromeBlocks(schema, composite, kinds))\n let body = childrenOf(composite, COMPOSITE_CHROME_COUNT)\n if (headingLevel !== undefined) body = flattenCompositesToHeadings(schema, body, true, headingLevel + 1, kinds) ?? body\n return [...blocks, ...body]\n }\n\n const converter = createConverter(schema, { is: isComposite, unwrap: unwrapComposite })\n\n function toComposite(head: PMNode, rest: PMNode[], kind: string): PMNode {\n if (isComposite(head)) {\n // Another kind: the same node; `meta` keeps the fields of the new kind plus `derivation` and `bib`. Further blocks join its body.\n const meta = keptMeta(compositeKind(kinds, kind), head.attrs.meta as Record<string, unknown>)\n return head.type.create({ ...head.attrs, kind, meta }, [...childrenOf(head), ...rest])\n }\n let title = Fragment.empty\n let body: PMNode[] = []\n if (isTextblockNode(head)) title = converter.inline(head, TITLE)\n else if (isQuoteNode(head)) body = childrenOf(head)\n else {\n // List: the first item's paragraph is the title, its other blocks and the remaining items (same list type) the body.\n const [item, ...more] = childrenOf(head)\n const [itemHead, ...itemRest] = item ? childrenOf(item) : []\n if (itemHead && isTextblockNode(itemHead)) title = converter.inline(itemHead, TITLE)\n else if (itemHead) itemRest.unshift(itemHead)\n body = [...itemRest, ...(more.length ? [head.type.create(null, more)] : [])]\n }\n body = [...body, ...rest]\n if (!body.length) body = [paragraph.create()]\n return n[COMPOSITE]!.create({ kind }, [n[TITLE]!.create(null, title), n.compositeDescription!.create(), n.compositeTags!.create(), ...body])\n }\n\n let output: PMNode[]\n if (target.type === 'composite') output = [toComposite(first, nodes.slice(1), target.kind)]\n else if (!isCoreTarget(target)) return null\n else if (target.type === 'bulletList' || target.type === 'orderedList') output = converter.toList(nodes, target.type)\n else if (target.type === 'blockquote') output = converter.toQuote(nodes)\n else output = converter.toTextblocks(nodes, textblockSpecOf(target))\n return finishConversion(nodes, output)\n}\n\n/**\n * The conversion of the block right after `$start` into `target`: the range it replaces (a heading becoming a composite\n * takes its group along, which turns into the composite's body) and the converted blocks.\n */\nfunction convertAt(kinds: readonly CompositeKind[]): ConversionProvider['convert'] {\n return (state, $start, target) => {\n const parent = $start.parent\n const from = $start.index()\n const to = target.type === 'composite' && parent.child(from).type.name === 'heading' ? headingGroupRange(parent, from).to : from + 1\n const nodes: PMNode[] = []\n for (let index = from; index < to; index++) nodes.push(parent.child(index))\n const blocks = convertCompositeBlocks(state.schema, nodes, target, kinds)\n return blocks ? { from: $start.pos, to: nodes.reduce((end, node) => end + node.nodeSize, $start.pos), blocks } : null\n }\n}\n\n/**\n * The composite feature's providers, in menu order. The first claims composites as source blocks (`handlesSource`): it\n * offers the core targets for them and executes every conversion of a composite, including kind changes. The second\n * owns the `composite:<kind>` targets: blocks and kind switches. `kinds` are the host's configured kinds; without them the\n * built-in kinds apply, and their labels (the menu entries) follow the language of the `t` the menu renders with. What\n * a conversion writes into the document (the `Label: Wert` line of a composite's meta) uses the built-in kinds in the\n * default language, since `convert` runs without a translator.\n */\nexport function compositeConversions(kinds?: readonly CompositeKind[]): readonly ConversionProvider[] {\n const structure = kinds ?? fallbackCompositeKinds()\n const convert = convertAt(structure)\n const unwrap: ConversionProvider = {\n handlesSource: isComposite,\n targets: (_editor, node) => isComposite(node) ? UNWRAP_TARGETS.filter(target => node.type.schema.nodes[target.type]) : [],\n parseTarget: () => null,\n label: () => null,\n convert,\n }\n const wrap: ConversionProvider = {\n targets: (_editor, node) => {\n if (!(isTextblockNode(node) || isListNode(node) || isQuoteNode(node) || isComposite(node)) || !node.type.schema.nodes[COMPOSITE]) return []\n return structure.map((kind): ConvertTarget => ({ type: 'composite', kind: kind.id })).filter(target => !isCurrentTarget(node, target))\n },\n parseTarget: (id) => {\n if (!id.startsWith(COMPOSITE_PREFIX)) return null\n const kind = id.slice(COMPOSITE_PREFIX.length)\n return structure.some(known => known.id === kind) ? { type: 'composite', kind } : null\n },\n label: (target, t) => {\n if (target.type !== 'composite') return null\n const kind = compositeKind(kinds ?? defaultCompositeKinds(t), target.kind)\n return { label: t('composites.convert.kind', { kind: kind.label }), icon: kind.icon }\n },\n convert,\n }\n return [unwrap, wrap]\n}\n"],"mappings":"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"}
@@ -0,0 +1,61 @@
1
+ import { CompositeKind } from "./kinds.js";
2
+ import { DERIVATION_KEY } from "./meta-keys.js";
3
+ import { Editor } from "@tiptap/core";
4
+ import { Node as Node$1 } from "@tiptap/pm/model";
5
+ //#region src/features/composites/derivation.d.ts
6
+ /** How a derived Baustein was made; `ai:<kindId>` for a block derived from another block by the model. */
7
+ export type DerivationMethod = 'transcription' | 'pdf-text' | 'ocr' | 'description' | 'bibliography' | (string & {});
8
+ /** What a derived Baustein was made from: an uploaded asset (by asset name) or another block (by block id). */
9
+ export type DerivationSource = {
10
+ asset: string;
11
+ } | {
12
+ block: string;
13
+ };
14
+ /** `meta.derivation` of a derived Baustein. */
15
+ export interface Derivation {
16
+ from: DerivationSource;
17
+ method: DerivationMethod;
18
+ model?: string;
19
+ /** ISO timestamp. */
20
+ createdAt: string;
21
+ /** SHA-256 hex of the asset bytes / of the source block's Markdown; `''` when unknown. */
22
+ inputHash: string;
23
+ /** SHA-256 hex of the produced body's Markdown; `''` when unknown. */
24
+ outputHash: string;
25
+ /** Asset name of the stored raw output (text/markdown). */
26
+ output?: string;
27
+ }
28
+ /** The derivation of a composite (`meta.derivation` with a `from` object and a `method`); null when it has none. */
29
+ export declare function derivationOf(node: Node$1): Derivation | null;
30
+ /** The media block a source-holding kind keeps its original in: first body child of a type in `kind.source`. */
31
+ export declare function sourceOf(composite: Node$1, kinds: readonly CompositeKind[]): {
32
+ node: Node$1;
33
+ index: number;
34
+ asset: {
35
+ documentId: string;
36
+ name: string;
37
+ } | null;
38
+ hash: string | null;
39
+ } | null;
40
+ /** The body children of `composite` that are derived Bausteine, with their child index. */
41
+ export declare function renditionsOf(composite: Node$1): {
42
+ node: Node$1;
43
+ index: number;
44
+ derivation: Derivation;
45
+ }[];
46
+ /**
47
+ * Whether `derived` (a Baustein with a derivation, a child of `composite`) is out of date or was edited since it was made.
48
+ * `stale`: for an asset source, the block `sourceOf(composite, kinds)` finds has a `hash` that differs from `inputHash`; null
49
+ * when either is unknown. A block source is null here: callers with the document compare the hash of the source block's
50
+ * Markdown. `edited`: the body's
51
+ * hash (computed lazily, it serialises the whole body) differs from `outputHash`; null when `outputHash` is unknown.
52
+ */
53
+ export declare function derivationState(composite: Node$1, derived: Node$1, bodyHash: () => string, kinds: readonly CompositeKind[]): {
54
+ stale: boolean | null;
55
+ edited: boolean | null;
56
+ };
57
+ /** Markdown of the body of `composite` (everything after title, description and tags). */
58
+ export declare function bodyMarkdown(editor: Editor, composite: Node$1): string;
59
+ //#endregion
60
+ export { DERIVATION_KEY };
61
+ //# sourceMappingURL=derivation.d.ts.map
@@ -0,0 +1,98 @@
1
+ import { EDITOR_API } from "../../core/api-routes.js";
2
+ import { compositeKind } from "./kinds.js";
3
+ import { DERIVATION_KEY } from "./meta-keys.js";
4
+ import "./nodes.js";
5
+ //#region src/features/composites/derivation.ts
6
+ /** The derivation of a composite (`meta.derivation` with a `from` object and a `method`); null when it has none. */
7
+ function derivationOf(node) {
8
+ const meta = node.attrs.meta;
9
+ const value = meta && typeof meta === "object" ? meta[DERIVATION_KEY] : void 0;
10
+ if (!value || typeof value !== "object") return null;
11
+ const { from, method } = value;
12
+ if (!from || typeof from !== "object" || typeof method !== "string") return null;
13
+ return value;
14
+ }
15
+ const ASSET_URL_PREFIX = `${EDITOR_API}/assets/`;
16
+ const ASSET_NAME = /^[0-9a-f-]{36}\.[a-z0-9]{1,8}$/;
17
+ const ASSET_DOCUMENT_ID = /^[A-Za-z0-9_-]{1,64}$/;
18
+ /** The stored asset behind an `/api/editor/assets/<documentId>/<name>` URL; null for any other `src`. */
19
+ function assetRefOf(src) {
20
+ if (!src.startsWith(ASSET_URL_PREFIX)) return null;
21
+ const [documentId, name, ...rest] = src.slice(ASSET_URL_PREFIX.length).split("/");
22
+ if (rest.length || !documentId || !name || !ASSET_DOCUMENT_ID.test(documentId) || !ASSET_NAME.test(name)) return null;
23
+ return {
24
+ documentId,
25
+ name
26
+ };
27
+ }
28
+ /** The media block a source-holding kind keeps its original in: first body child of a type in `kind.source`. */
29
+ function sourceOf(composite, kinds) {
30
+ if (composite.type.name !== "composite") return null;
31
+ const types = compositeKind(kinds, String(composite.attrs.kind)).source;
32
+ if (!types) return null;
33
+ for (let index = 3; index < composite.childCount; index++) {
34
+ const node = composite.child(index);
35
+ if (!types.includes(node.type.name)) continue;
36
+ const hash = node.attrs.hash;
37
+ return {
38
+ node,
39
+ index,
40
+ asset: assetRefOf(String(node.attrs.src ?? "")),
41
+ hash: typeof hash === "string" && hash ? hash : null
42
+ };
43
+ }
44
+ return null;
45
+ }
46
+ /** The body children of `composite` that are derived Bausteine, with their child index. */
47
+ function renditionsOf(composite) {
48
+ const found = [];
49
+ composite.forEach((node, _offset, index) => {
50
+ if (index < 3 || node.type.name !== "composite") return;
51
+ const derivation = derivationOf(node);
52
+ if (derivation) found.push({
53
+ node,
54
+ index,
55
+ derivation
56
+ });
57
+ });
58
+ return found;
59
+ }
60
+ /**
61
+ * Whether `derived` (a Baustein with a derivation, a child of `composite`) is out of date or was edited since it was made.
62
+ * `stale`: for an asset source, the block `sourceOf(composite, kinds)` finds has a `hash` that differs from `inputHash`; null
63
+ * when either is unknown. A block source is null here: callers with the document compare the hash of the source block's
64
+ * Markdown. `edited`: the body's
65
+ * hash (computed lazily, it serialises the whole body) differs from `outputHash`; null when `outputHash` is unknown.
66
+ */
67
+ function derivationState(composite, derived, bodyHash, kinds) {
68
+ const derivation = derivationOf(derived);
69
+ if (!derivation) return {
70
+ stale: null,
71
+ edited: null
72
+ };
73
+ let stale = null;
74
+ if ("asset" in derivation.from) {
75
+ const hash = sourceOf(composite, kinds)?.hash;
76
+ stale = hash && derivation.inputHash ? hash !== derivation.inputHash : null;
77
+ }
78
+ const edited = derivation.outputHash ? bodyHash() !== derivation.outputHash : null;
79
+ return {
80
+ stale,
81
+ edited
82
+ };
83
+ }
84
+ /** Markdown of the body of `composite` (everything after title, description and tags). */
85
+ function bodyMarkdown(editor, composite) {
86
+ const content = [];
87
+ composite.forEach((child, _offset, index) => {
88
+ if (index >= 3) content.push(child.toJSON());
89
+ });
90
+ return editor.markdown.serialize({
91
+ type: "doc",
92
+ content
93
+ });
94
+ }
95
+ //#endregion
96
+ export { DERIVATION_KEY, assetRefOf, bodyMarkdown, derivationOf, derivationState, renditionsOf, sourceOf };
97
+
98
+ //# sourceMappingURL=derivation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"derivation.js","names":[],"sources":["../../../src/features/composites/derivation.ts"],"sourcesContent":["// Vue-free and server-importable: where a Baustein's content comes from. A source-holding Baustein (`recording`, `paper`,\n// `book`, `figure`, `document`) carries its original as an `image|audio|video|file` block in the body; a derived\n// Baustein (transcript, full text, description, AI result) records in `meta.derivation` what it was made from.\nimport type { Editor, JSONContent } from '@tiptap/core'\n// Types only: brings in the `editor.markdown` augmentation of `@tiptap/markdown` for contexts that do not otherwise load it.\nimport type {} from '@tiptap/markdown'\nimport type { Node as PMNode } from '@tiptap/pm/model'\nimport { EDITOR_API } from '../../core/api-routes'\nimport { type CompositeKind, compositeKind } from './kinds'\nimport { COMPOSITE_CHROME_COUNT } from './nodes'\nimport { DERIVATION_KEY } from './meta-keys'\n\n/** How a derived Baustein was made; `ai:<kindId>` for a block derived from another block by the model. */\nexport type DerivationMethod = 'transcription' | 'pdf-text' | 'ocr' | 'description' | 'bibliography' | (string & {})\n\n/** What a derived Baustein was made from: an uploaded asset (by asset name) or another block (by block id). */\nexport type DerivationSource = { asset: string } | { block: string }\n\n/** `meta.derivation` of a derived Baustein. */\nexport interface Derivation {\n from: DerivationSource\n method: DerivationMethod\n model?: string\n /** ISO timestamp. */\n createdAt: string\n /** SHA-256 hex of the asset bytes / of the source block's Markdown; `''` when unknown. */\n inputHash: string\n /** SHA-256 hex of the produced body's Markdown; `''` when unknown. */\n outputHash: string\n /** Asset name of the stored raw output (text/markdown). */\n output?: string\n}\n\nexport { DERIVATION_KEY }\n\n/** The derivation of a composite (`meta.derivation` with a `from` object and a `method`); null when it has none. */\nexport function derivationOf(node: PMNode): Derivation | null {\n const meta: unknown = node.attrs.meta\n const value = meta && typeof meta === 'object' ? (meta as Record<string, unknown>)[DERIVATION_KEY] : undefined\n if (!value || typeof value !== 'object') return null\n const { from, method } = value as Record<string, unknown>\n if (!from || typeof from !== 'object' || typeof method !== 'string') return null\n return value as Derivation\n}\n\nconst ASSET_URL_PREFIX = `${EDITOR_API}/assets/`\n// Same patterns as `features/media/assets.ts`; copied because composites must not import media.\nconst ASSET_NAME = /^[0-9a-f-]{36}\\.[a-z0-9]{1,8}$/\nconst ASSET_DOCUMENT_ID = /^[A-Za-z0-9_-]{1,64}$/\n\n/** The stored asset behind an `/api/editor/assets/<documentId>/<name>` URL; null for any other `src`. */\nexport function assetRefOf(src: string): { documentId: string, name: string } | null {\n if (!src.startsWith(ASSET_URL_PREFIX)) return null\n const [documentId, name, ...rest] = src.slice(ASSET_URL_PREFIX.length).split('/')\n if (rest.length || !documentId || !name || !ASSET_DOCUMENT_ID.test(documentId) || !ASSET_NAME.test(name)) return null\n return { documentId, name }\n}\n\n/** The media block a source-holding kind keeps its original in: first body child of a type in `kind.source`. */\nexport function sourceOf(\n composite: PMNode,\n kinds: readonly CompositeKind[],\n): { node: PMNode, index: number, asset: { documentId: string, name: string } | null, hash: string | null } | null {\n if (composite.type.name !== 'composite') return null\n const types = compositeKind(kinds, String(composite.attrs.kind)).source\n if (!types) return null\n for (let index = COMPOSITE_CHROME_COUNT; index < composite.childCount; index++) {\n const node = composite.child(index)\n if (!(types as readonly string[]).includes(node.type.name)) continue\n const hash: unknown = node.attrs.hash\n return { node, index, asset: assetRefOf(String(node.attrs.src ?? '')), hash: typeof hash === 'string' && hash ? hash : null }\n }\n return null\n}\n\n/** The body children of `composite` that are derived Bausteine, with their child index. */\nexport function renditionsOf(composite: PMNode): { node: PMNode, index: number, derivation: Derivation }[] {\n const found: { node: PMNode, index: number, derivation: Derivation }[] = []\n composite.forEach((node, _offset, index) => {\n if (index < COMPOSITE_CHROME_COUNT || node.type.name !== 'composite') return\n const derivation = derivationOf(node)\n if (derivation) found.push({ node, index, derivation })\n })\n return found\n}\n\n/**\n * Whether `derived` (a Baustein with a derivation, a child of `composite`) is out of date or was edited since it was made.\n * `stale`: for an asset source, the block `sourceOf(composite, kinds)` finds has a `hash` that differs from `inputHash`; null\n * when either is unknown. A block source is null here: callers with the document compare the hash of the source block's\n * Markdown. `edited`: the body's\n * hash (computed lazily, it serialises the whole body) differs from `outputHash`; null when `outputHash` is unknown.\n */\nexport function derivationState(\n composite: PMNode,\n derived: PMNode,\n bodyHash: () => string,\n kinds: readonly CompositeKind[],\n): { stale: boolean | null, edited: boolean | null } {\n const derivation = derivationOf(derived)\n if (!derivation) return { stale: null, edited: null }\n let stale: boolean | null = null\n if ('asset' in derivation.from) {\n const hash = sourceOf(composite, kinds)?.hash\n stale = hash && derivation.inputHash ? hash !== derivation.inputHash : null\n }\n const edited = derivation.outputHash ? bodyHash() !== derivation.outputHash : null\n return { stale, edited }\n}\n\n/** Markdown of the body of `composite` (everything after title, description and tags). */\nexport function bodyMarkdown(editor: Editor, composite: PMNode): string {\n const content: JSONContent[] = []\n composite.forEach((child, _offset, index) => {\n if (index >= COMPOSITE_CHROME_COUNT) content.push(child.toJSON() as JSONContent)\n })\n return editor.markdown!.serialize({ type: 'doc', content })\n}\n"],"mappings":";;;;;;AAoCA,SAAgB,aAAa,MAAiC;CAC5D,MAAM,OAAgB,KAAK,MAAM;CACjC,MAAM,QAAQ,QAAQ,OAAO,SAAS,WAAY,KAAiC,kBAAkB,KAAA;CACrG,IAAI,CAAC,SAAS,OAAO,UAAU,UAAU,OAAO;CAChD,MAAM,EAAE,MAAM,WAAW;CACzB,IAAI,CAAC,QAAQ,OAAO,SAAS,YAAY,OAAO,WAAW,UAAU,OAAO;CAC5E,OAAO;AACT;AAEA,MAAM,mBAAmB,GAAG,WAAW;AAEvC,MAAM,aAAa;AACnB,MAAM,oBAAoB;;AAG1B,SAAgB,WAAW,KAA0D;CACnF,IAAI,CAAC,IAAI,WAAW,gBAAgB,GAAG,OAAO;CAC9C,MAAM,CAAC,YAAY,MAAM,GAAG,QAAQ,IAAI,MAAM,iBAAiB,MAAM,CAAC,CAAC,MAAM,GAAG;CAChF,IAAI,KAAK,UAAU,CAAC,cAAc,CAAC,QAAQ,CAAC,kBAAkB,KAAK,UAAU,KAAK,CAAC,WAAW,KAAK,IAAI,GAAG,OAAO;CACjH,OAAO;EAAE;EAAY;CAAK;AAC5B;;AAGA,SAAgB,SACd,WACA,OACiH;CACjH,IAAI,UAAU,KAAK,SAAS,aAAa,OAAO;CAChD,MAAM,QAAQ,cAAc,OAAO,OAAO,UAAU,MAAM,IAAI,CAAC,CAAC,CAAC;CACjE,IAAI,CAAC,OAAO,OAAO;CACnB,KAAK,IAAI,QAAA,GAAgC,QAAQ,UAAU,YAAY,SAAS;EAC9E,MAAM,OAAO,UAAU,MAAM,KAAK;EAClC,IAAI,CAAE,MAA4B,SAAS,KAAK,KAAK,IAAI,GAAG;EAC5D,MAAM,OAAgB,KAAK,MAAM;EACjC,OAAO;GAAE;GAAM;GAAO,OAAO,WAAW,OAAO,KAAK,MAAM,OAAO,EAAE,CAAC;GAAG,MAAM,OAAO,SAAS,YAAY,OAAO,OAAO;EAAK;CAC9H;CACA,OAAO;AACT;;AAGA,SAAgB,aAAa,WAA8E;CACzG,MAAM,QAAmE,CAAC;CAC1E,UAAU,SAAS,MAAM,SAAS,UAAU;EAC1C,IAAI,QAAA,KAAkC,KAAK,KAAK,SAAS,aAAa;EACtE,MAAM,aAAa,aAAa,IAAI;EACpC,IAAI,YAAY,MAAM,KAAK;GAAE;GAAM;GAAO;EAAW,CAAC;CACxD,CAAC;CACD,OAAO;AACT;;;;;;;;AASA,SAAgB,gBACd,WACA,SACA,UACA,OACmD;CACnD,MAAM,aAAa,aAAa,OAAO;CACvC,IAAI,CAAC,YAAY,OAAO;EAAE,OAAO;EAAM,QAAQ;CAAK;CACpD,IAAI,QAAwB;CAC5B,IAAI,WAAW,WAAW,MAAM;EAC9B,MAAM,OAAO,SAAS,WAAW,KAAK,CAAC,EAAE;EACzC,QAAQ,QAAQ,WAAW,YAAY,SAAS,WAAW,YAAY;CACzE;CACA,MAAM,SAAS,WAAW,aAAa,SAAS,MAAM,WAAW,aAAa;CAC9E,OAAO;EAAE;EAAO;CAAO;AACzB;;AAGA,SAAgB,aAAa,QAAgB,WAA2B;CACtE,MAAM,UAAyB,CAAC;CAChC,UAAU,SAAS,OAAO,SAAS,UAAU;EAC3C,IAAI,SAAA,GAAiC,QAAQ,KAAK,MAAM,OAAO,CAAgB;CACjF,CAAC;CACD,OAAO,OAAO,SAAU,UAAU;EAAE,MAAM;EAAO;CAAQ,CAAC;AAC5D"}
@@ -0,0 +1,69 @@
1
+ import { findBlockById } from "../../core/schema/block-ids.js";
2
+ import { EDITOR_API } from "../../core/api-routes.js";
3
+ import { sha256Hex } from "../../core/hash.js";
4
+ import { bodyMarkdown, derivationOf, derivationState, sourceOf } from "./derivation.js";
5
+ import { compositeKindsOf } from "./nodes.js";
6
+ import { compositeOfRow } from "./rows.js";
7
+ //#region src/features/composites/derived-chrome.ts
8
+ /**
9
+ * The chrome state of the row's Baustein when it is derived (null when it is not): `stale` when its asset source has
10
+ * changed since it was made, i.e. the enclosing Baustein's source block hash differs from the stored `inputHash`.
11
+ * Cheap on purpose (no body hashing): the chrome runs it for every row on every refresh. „bearbeitet“ and the staleness
12
+ * of a block-derived Baustein hash Markdown, so only the details card computes them (`derivationDetailsOf`).
13
+ */
14
+ function derivedChromeOf(editor, row) {
15
+ const { doc } = editor.state;
16
+ const at = doc.nodeAt(row.pos);
17
+ const found = at?.type.name === "composite" && (at.attrs.id ?? null) === row.id ? {
18
+ pos: row.pos,
19
+ node: at
20
+ } : compositeOfRow(doc, row);
21
+ if (!found || !derivationOf(found.node)) return null;
22
+ const parent = doc.resolve(found.pos).parent;
23
+ return { stale: parent.type.name === "composite" && derivationState(parent, found.node, () => "", compositeKindsOf(editor)).stale === true };
24
+ }
25
+ /**
26
+ * Details of the derived Baustein `node` of `editor`'s document (null when it is not derived). Serialises and hashes
27
+ * the body (and for a block source the source block), so call it for one Baustein at a time, not for every row.
28
+ */
29
+ function derivationDetailsOf(editor, node) {
30
+ const derivation = derivationOf(node);
31
+ if (!derivation) return null;
32
+ const { doc } = editor.state;
33
+ const kinds = compositeKindsOf(editor);
34
+ const id = node.attrs.id;
35
+ const found = typeof id === "string" && id ? findBlockById(doc, id) : null;
36
+ const parent = found ? doc.resolve(found.pos).parent : null;
37
+ const holder = parent?.type.name === "composite" ? parent : null;
38
+ let bodyHash;
39
+ const state = derivationState(holder ?? node, node, () => bodyHash ??= sha256Hex(bodyMarkdown(editor, node)), kinds);
40
+ let stale = state.stale;
41
+ if ("block" in derivation.from) {
42
+ const source = findBlockById(doc, derivation.from.block);
43
+ stale = source && derivation.inputHash ? sha256Hex(bodyMarkdown(editor, source.node)) !== derivation.inputHash : null;
44
+ }
45
+ const documentId = holder ? sourceOf(holder, kinds)?.asset?.documentId : void 0;
46
+ const outputUrl = derivation.output && documentId ? `${EDITOR_API}/assets/${documentId}/${derivation.output}` : null;
47
+ return {
48
+ derivation,
49
+ stale,
50
+ edited: state.edited,
51
+ outputUrl
52
+ };
53
+ }
54
+ const KNOWN_METHODS = [
55
+ "transcription",
56
+ "pdf-text",
57
+ "ocr",
58
+ "description",
59
+ "bibliography"
60
+ ];
61
+ /** The words for a derivation method: the known ones translated, `ai:<kind>` as „KI-Ableitung“, anything else as stored. */
62
+ function derivationMethodLabel(t, method) {
63
+ if (method.startsWith("ai:")) return t("composites.derivation.method.ai");
64
+ return KNOWN_METHODS.includes(method) ? t(`composites.derivation.method.${method}`) : method;
65
+ }
66
+ //#endregion
67
+ export { derivationDetailsOf, derivationMethodLabel, derivedChromeOf };
68
+
69
+ //# sourceMappingURL=derived-chrome.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"derived-chrome.js","names":[],"sources":["../../../src/features/composites/derived-chrome.ts"],"sourcesContent":["// Vue-free: what the composite chrome and the details card show for a derived Baustein (one with a `meta.derivation`).\nimport type { Editor } from '@tiptap/core'\nimport type { Node as PMNode } from '@tiptap/pm/model'\nimport { EDITOR_API } from '../../core/api-routes'\nimport { sha256Hex } from '../../core/hash'\nimport { findBlockById } from '../../core/schema/block-ids'\nimport type { MessageKey, Translate } from '../../i18n'\nimport { type Derivation, bodyMarkdown, derivationOf, derivationState, sourceOf } from './derivation'\nimport { compositeKindsOf } from './nodes'\nimport { type CompositeRow, compositeOfRow } from './rows'\n\n/**\n * The chrome state of the row's Baustein when it is derived (null when it is not): `stale` when its asset source has\n * changed since it was made, i.e. the enclosing Baustein's source block hash differs from the stored `inputHash`.\n * Cheap on purpose (no body hashing): the chrome runs it for every row on every refresh. „bearbeitet“ and the staleness\n * of a block-derived Baustein hash Markdown, so only the details card computes them (`derivationDetailsOf`).\n */\nexport function derivedChromeOf(editor: Editor, row: Pick<CompositeRow, 'id' | 'pos'>): { stale: boolean } | null {\n const { doc } = editor.state\n // The row's position may be stale for a moment after an edit; take it only when it still holds the same Baustein.\n const at = doc.nodeAt(row.pos)\n const found = at?.type.name === 'composite' && (at.attrs.id ?? null) === row.id ? { pos: row.pos, node: at } : compositeOfRow(doc, row)\n if (!found || !derivationOf(found.node)) return null\n const parent = doc.resolve(found.pos).parent\n const stale = parent.type.name === 'composite' && derivationState(parent, found.node, () => '', compositeKindsOf(editor)).stale === true\n return { stale }\n}\n\n/** Everything the details card shows about the derivation of `node`; `stale`/`edited` are null when they cannot be told. */\nexport interface DerivationDetails {\n derivation: Derivation\n /** The source changed since `node` was made: asset hash for an asset source, Markdown hash of the source block for a block source. */\n stale: boolean | null\n /** The body differs from what was generated. */\n edited: boolean | null\n /** URL of the stored raw output, when there is one and its document is known. */\n outputUrl: string | null\n}\n\n/**\n * Details of the derived Baustein `node` of `editor`'s document (null when it is not derived). Serialises and hashes\n * the body (and for a block source the source block), so call it for one Baustein at a time, not for every row.\n */\nexport function derivationDetailsOf(editor: Editor, node: PMNode): DerivationDetails | null {\n const derivation = derivationOf(node)\n if (!derivation) return null\n const { doc } = editor.state\n const kinds = compositeKindsOf(editor)\n const id: unknown = node.attrs.id\n const found = typeof id === 'string' && id ? findBlockById(doc, id) : null\n const parent = found ? doc.resolve(found.pos).parent : null\n const holder = parent?.type.name === 'composite' ? parent : null\n\n let bodyHash: string | undefined\n const state = derivationState(holder ?? node, node, () => (bodyHash ??= sha256Hex(bodyMarkdown(editor, node))), kinds)\n let stale = state.stale\n if ('block' in derivation.from) {\n const source = findBlockById(doc, derivation.from.block)\n stale = source && derivation.inputHash ? sha256Hex(bodyMarkdown(editor, source.node)) !== derivation.inputHash : null\n }\n\n const documentId = holder ? sourceOf(holder, kinds)?.asset?.documentId : undefined\n const outputUrl = derivation.output && documentId ? `${EDITOR_API}/assets/${documentId}/${derivation.output}` : null\n return { derivation, stale, edited: state.edited, outputUrl }\n}\n\nconst KNOWN_METHODS: readonly string[] = ['transcription', 'pdf-text', 'ocr', 'description', 'bibliography']\n\n/** The words for a derivation method: the known ones translated, `ai:<kind>` as „KI-Ableitung“, anything else as stored. */\nexport function derivationMethodLabel(t: Translate, method: string): string {\n if (method.startsWith('ai:')) return t('composites.derivation.method.ai')\n return KNOWN_METHODS.includes(method) ? t(`composites.derivation.method.${method}` as MessageKey) : method\n}\n"],"mappings":";;;;;;;;;;;;;AAiBA,SAAgB,gBAAgB,QAAgB,KAAkE;CAChH,MAAM,EAAE,QAAQ,OAAO;CAEvB,MAAM,KAAK,IAAI,OAAO,IAAI,GAAG;CAC7B,MAAM,QAAQ,IAAI,KAAK,SAAS,gBAAgB,GAAG,MAAM,MAAM,UAAU,IAAI,KAAK;EAAE,KAAK,IAAI;EAAK,MAAM;CAAG,IAAI,eAAe,KAAK,GAAG;CACtI,IAAI,CAAC,SAAS,CAAC,aAAa,MAAM,IAAI,GAAG,OAAO;CAChD,MAAM,SAAS,IAAI,QAAQ,MAAM,GAAG,CAAC,CAAC;CAEtC,OAAO,EAAE,OADK,OAAO,KAAK,SAAS,eAAe,gBAAgB,QAAQ,MAAM,YAAY,IAAI,iBAAiB,MAAM,CAAC,CAAC,CAAC,UAAU,KACrH;AACjB;;;;;AAiBA,SAAgB,oBAAoB,QAAgB,MAAwC;CAC1F,MAAM,aAAa,aAAa,IAAI;CACpC,IAAI,CAAC,YAAY,OAAO;CACxB,MAAM,EAAE,QAAQ,OAAO;CACvB,MAAM,QAAQ,iBAAiB,MAAM;CACrC,MAAM,KAAc,KAAK,MAAM;CAC/B,MAAM,QAAQ,OAAO,OAAO,YAAY,KAAK,cAAc,KAAK,EAAE,IAAI;CACtE,MAAM,SAAS,QAAQ,IAAI,QAAQ,MAAM,GAAG,CAAC,CAAC,SAAS;CACvD,MAAM,SAAS,QAAQ,KAAK,SAAS,cAAc,SAAS;CAE5D,IAAI;CACJ,MAAM,QAAQ,gBAAgB,UAAU,MAAM,YAAa,aAAa,UAAU,aAAa,QAAQ,IAAI,CAAC,GAAI,KAAK;CACrH,IAAI,QAAQ,MAAM;CAClB,IAAI,WAAW,WAAW,MAAM;EAC9B,MAAM,SAAS,cAAc,KAAK,WAAW,KAAK,KAAK;EACvD,QAAQ,UAAU,WAAW,YAAY,UAAU,aAAa,QAAQ,OAAO,IAAI,CAAC,MAAM,WAAW,YAAY;CACnH;CAEA,MAAM,aAAa,SAAS,SAAS,QAAQ,KAAK,CAAC,EAAE,OAAO,aAAa,KAAA;CACzE,MAAM,YAAY,WAAW,UAAU,aAAa,GAAG,WAAW,UAAU,WAAW,GAAG,WAAW,WAAW;CAChH,OAAO;EAAE;EAAY;EAAO,QAAQ,MAAM;EAAQ;CAAU;AAC9D;AAEA,MAAM,gBAAmC;CAAC;CAAiB;CAAY;CAAO;CAAe;AAAc;;AAG3G,SAAgB,sBAAsB,GAAc,QAAwB;CAC1E,IAAI,OAAO,WAAW,KAAK,GAAG,OAAO,EAAE,iCAAiC;CACxE,OAAO,cAAc,SAAS,MAAM,IAAI,EAAE,gCAAgC,QAAsB,IAAI;AACtG"}