@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 +1 @@
1
- {"version":3,"file":"CompositeTable.js","names":["_openBlock","_createElementBlock","_unref","_createVNode","_createElementVNode","_toDisplayString","_Fragment","_createSlots","_withCtx","_renderList","_createBlock","_createCommentVNode","_normalizeStyle","_createTextVNode","_normalizeClass"],"sources":["../../../../src/features/composites/components/CompositeTable.vue"],"sourcesContent":["<script setup lang=\"ts\">\n// All Bausteine of an editor's document as a sortable, filterable table. Columns beyond the fixed ones derive from the\n// meta fields of the kinds present in the document, so a host kind with fields gets its columns without code changes.\nimport type { Editor } from '@tiptap/core'\nimport { computed, ref } from 'vue'\nimport type { TableColumn } from '../../../vue/kit/types'\nimport { useUiKit } from '../../../vue/kit/use-ui-kit'\nimport { useEditorI18n } from '../../../vue/use-editor-i18n'\nimport type { CompositeRow } from '../rows'\nimport { columnSpecsOf, FILTER_ALL, fieldColumnsOf, fieldOf, fieldText, hasText, isLongText, sortRows, toggled } from '../table-model'\nimport { useCompositeRows } from '../use-composite-rows'\n\nconst props = defineProps<{ editor?: Editor }>()\nconst emit = defineEmits<{ select: [row: CompositeRow] }>()\n\nconst { Badge: UBadge, Button: UButton, Icon: UIcon, Input: UInput, Select: USelect, Table: UTable } = useUiKit()\nconst { t } = useEditorI18n()\n\nconst { rows, tags, kinds } = useCompositeRows(() => props.editor)\n\n// --- Columns ----------------------------------------------------------------------------------------------------\n\nconst fieldColumns = computed(() => fieldColumnsOf(rows.value, kinds.value))\nconst specs = computed(() => columnSpecsOf(fieldColumns.value, t))\n\nconst columns = computed<TableColumn<CompositeRow>[]>(() => specs.value.map(spec => ({\n id: spec.id,\n header: spec.label,\n accessorFn: spec.sort,\n // The table reports `aria-sort` on the header cell only for columns that opt in.\n enableSorting: true,\n meta: { class: {\n th: [spec.id === 'title' ? 'min-w-56' : '', spec.align === 'end' ? 'text-right' : ''].join(' '),\n td: spec.align === 'end' ? 'text-right' : '',\n } },\n})))\n\n// --- Filter -----------------------------------------------------------------------------------------------------\n\nconst search = ref('')\nconst pickedKinds = ref<string[]>([])\nconst pickedTags = ref<string[]>([])\nconst pickedOptions = ref<Record<string, string>>({})\n\n/** One select per `select` field in use; its choices are the union of the options of all kinds that have the key. */\nconst selectFilters = computed(() => fieldColumns.value.flatMap((column) => {\n if (column.field.type !== 'select') return []\n const options = new Map<string, string>()\n for (const row of rows.value) {\n for (const option of fieldOf(row, column.field.key)?.options ?? []) if (!options.has(option.value)) options.set(option.value, option.label)\n }\n return [{\n key: column.field.key,\n label: column.field.label,\n items: [{ label: t('composites.table.filter.all'), value: FILTER_ALL }, ...[...options].map(([value, label]) => ({ label, value }))],\n }]\n}))\n\n// A kind, tag or option that vanished from the document can no longer be unpicked in the UI, so it must not filter either.\nconst activeKinds = computed(() => pickedKinds.value.filter(id => kinds.value.some(kind => kind.id === id)))\nconst activeTags = computed(() => pickedTags.value.filter(tag => tags.value.includes(tag)))\nconst activeOptions = computed(() => selectFilters.value.flatMap((filter) => {\n const value = pickedOptions.value[filter.key]\n return value && filter.items.some(item => item.value === value && value !== FILTER_ALL) ? [[filter.key, value] as const] : []\n}))\nconst needle = computed(() => search.value.trim().toLowerCase())\nconst filterActive = computed(() => activeKinds.value.length > 0 || activeTags.value.length > 0 || activeOptions.value.length > 0 || needle.value !== '')\n\nfunction resetFilters() {\n search.value = ''\n pickedKinds.value = []\n pickedTags.value = []\n pickedOptions.value = {}\n}\n\nconst filtered = computed(() => rows.value.filter((row) => {\n if (activeKinds.value.length && !activeKinds.value.includes(row.kind)) return false\n if (activeTags.value.length && !activeTags.value.every(tag => row.tags.includes(tag))) return false\n if (activeOptions.value.some(([key, value]) => row.meta[key] !== value)) return false\n if (needle.value) {\n const haystack = `${row.title}\\n${row.description}\\n${row.tags.map(tag => `#${tag}`).join(' ')}`.toLowerCase()\n if (!haystack.includes(needle.value)) return false\n }\n return true\n}))\n\n// --- Sorting (client side; the table only reports the state, so the data is ordered here) -------------------------\n\nconst sorting = ref<{ id: string, desc: boolean }[]>([])\nconst activeSort = computed(() => {\n const entry = sorting.value[0]\n const spec = entry && specs.value.find(item => item.id === entry.id)\n return entry && spec ? { id: entry.id, desc: entry.desc, sort: spec.sort } : null\n})\n\n/** Header click cycles ascending → descending → unsorted. */\nfunction cycleSort(id: string) {\n const current = sorting.value[0]\n if (current?.id !== id) sorting.value = [{ id, desc: false }]\n else sorting.value = current.desc ? [] : [{ id, desc: true }]\n}\nconst sortIcon = (id: string) => {\n const current = sorting.value[0]\n if (current?.id !== id) return 'i-lucide-chevrons-up-down'\n return current.desc ? 'i-lucide-arrow-down' : 'i-lucide-arrow-up'\n}\n\nconst sorted = computed(() => {\n const sort = activeSort.value\n return sort ? sortRows(filtered.value, sort.sort, sort.desc) : filtered.value\n})\n\nconst countLabel = computed(() => t(rows.value.length === 1 ? 'composites.table.count.one' : 'composites.table.count.other', { n: sorted.value.length, total: rows.value.length }))\n</script>\n\n<template>\n <section class=\"flex min-h-0 flex-col gap-3\" :aria-label=\"t('composites.table.label')\">\n <div v-if=\"!rows.length\" class=\"mx-auto flex max-w-sm flex-1 flex-col items-center justify-center gap-2 py-16 text-center\">\n <UIcon name=\"i-lucide-table-2\" class=\"size-8 text-[var(--sk-fg-dimmed)]\" />\n <p class=\"text-sm font-medium text-[var(--sk-fg-highlighted)]\">\n {{ t('composites.table.emptyTitle') }}\n </p>\n <p class=\"text-sm text-[var(--sk-muted)]\">\n {{ t('composites.table.emptyText') }}\n </p>\n </div>\n\n <template v-else>\n <div class=\"flex flex-col gap-2\">\n <div class=\"flex flex-wrap items-center gap-2\">\n <UInput\n v-model=\"search\"\n class=\"w-64\"\n size=\"sm\"\n icon=\"i-lucide-search\"\n :placeholder=\"t('composites.table.search.placeholder')\"\n :aria-label=\"t('composites.table.search.label')\"\n >\n <template v-if=\"search\" #trailing>\n <UButton\n color=\"neutral\"\n variant=\"link\"\n size=\"xs\"\n icon=\"i-lucide-x\"\n :aria-label=\"t('composites.table.search.clear')\"\n @click=\"search = ''\"\n />\n </template>\n </UInput>\n\n <div v-for=\"filter in selectFilters\" :key=\"filter.key\" class=\"flex items-center gap-1.5\">\n <span class=\"text-sm text-[var(--sk-muted)]\" aria-hidden=\"true\">{{ filter.label }}</span>\n <USelect\n :model-value=\"pickedOptions[filter.key] ?? FILTER_ALL\"\n class=\"w-36\"\n size=\"sm\"\n :items=\"filter.items\"\n :aria-label=\"filter.label\"\n @update:model-value=\"pickedOptions = { ...pickedOptions, [filter.key]: String($event) }\"\n />\n </div>\n\n <UButton\n v-if=\"filterActive\"\n size=\"sm\"\n color=\"neutral\"\n variant=\"ghost\"\n icon=\"i-lucide-filter-x\"\n :label=\"t('composites.table.filter.reset')\"\n @click=\"resetFilters\"\n />\n <span class=\"ml-auto text-xs tabular-nums text-[var(--sk-muted)]\" role=\"status\">{{ countLabel }}</span>\n </div>\n\n <div v-if=\"kinds.length > 1\" class=\"flex flex-wrap items-center gap-1\" role=\"group\" :aria-label=\"t('composites.table.filter.byKind')\">\n <UButton\n v-for=\"kind in kinds\"\n :key=\"kind.id\"\n size=\"xs\"\n color=\"neutral\"\n :variant=\"activeKinds.includes(kind.id) ? 'solid' : 'outline'\"\n :icon=\"kind.icon\"\n :label=\"kind.label\"\n :aria-pressed=\"activeKinds.includes(kind.id)\"\n @click=\"pickedKinds = toggled(pickedKinds, kind.id)\"\n />\n </div>\n\n <div v-if=\"tags.length\" class=\"flex flex-wrap items-center gap-1\" role=\"group\" :aria-label=\"t('composites.table.filter.byTag')\">\n <UButton\n v-for=\"tag in tags\"\n :key=\"tag\"\n size=\"xs\"\n color=\"neutral\"\n :variant=\"activeTags.includes(tag) ? 'solid' : 'outline'\"\n :label=\"`#${tag}`\"\n :aria-pressed=\"activeTags.includes(tag)\"\n @click=\"pickedTags = toggled(pickedTags, tag)\"\n />\n </div>\n </div>\n\n <UTable\n v-model:sorting=\"sorting\"\n :data=\"sorted\"\n :columns=\"columns\"\n :get-row-id=\"(row: CompositeRow) => row.key\"\n :ui=\"{ th: 'px-3 py-2 text-sm', td: 'px-3 py-2' }\"\n sticky\n class=\"min-h-0 flex-1 rounded-md border border-[var(--sk-border)]\"\n @select=\"(_event: Event, row: { original: CompositeRow }) => emit('select', row.original)\"\n >\n <template v-for=\"spec in specs\" :key=\"spec.id\" #[`${spec.id}-header`]>\n <button\n type=\"button\"\n class=\"-mx-1.5 inline-flex cursor-pointer items-center gap-1 rounded px-1.5 py-0.5 font-semibold hover:bg-[var(--sk-bg-elevated)] focus-visible:outline-2 focus-visible:outline-[var(--sk-primary)]\"\n @click=\"cycleSort(spec.id)\"\n >\n {{ spec.label }}\n <UIcon :name=\"sortIcon(spec.id)\" class=\"size-3.5\" :class=\"activeSort?.id === spec.id ? 'text-[var(--sk-fg-highlighted)]' : 'text-[var(--sk-fg-dimmed)]'\" />\n </button>\n </template>\n\n <template #title-cell=\"{ row }: { row: { original: CompositeRow } }\">\n <div class=\"flex min-w-0 items-center gap-1.5\" :style=\"{ paddingLeft: `${row.original.depth * 1.25}rem` }\">\n <UIcon :name=\"row.original.icon\" class=\"size-4 shrink-0 text-[var(--sk-muted)]\" />\n <span v-if=\"hasText(row.original.title)\" class=\"truncate font-medium text-[var(--sk-fg-highlighted)]\">{{ row.original.title }}</span>\n <span v-else class=\"truncate text-[var(--sk-muted)]\">{{ t('composites.untitled') }}</span>\n </div>\n </template>\n <template #kind-cell=\"{ row }: { row: { original: CompositeRow } }\">\n {{ row.original.kindLabel }}\n </template>\n <template v-for=\"column in fieldColumns\" :key=\"column.id\" #[`${column.id}-cell`]=\"{ row }: { row: { original: CompositeRow } }\">\n <span\n v-if=\"fieldText(row.original, column.field.key)\"\n class=\"block\"\n :class=\"[column.field.type === 'number' || column.field.type === 'date' ? 'tabular-nums' : '', isLongText(column.field) ? 'max-w-64 truncate' : '']\"\n :title=\"isLongText(column.field) ? fieldText(row.original, column.field.key) : undefined\"\n >{{ fieldText(row.original, column.field.key) }}</span>\n <template v-else>\n <span class=\"text-[var(--sk-fg-dimmed)]\" aria-hidden=\"true\">–</span>\n <span class=\"sr-only\">{{ t('composites.table.noValue') }}</span>\n </template>\n </template>\n <template #tags-cell=\"{ row }: { row: { original: CompositeRow } }\">\n <div v-if=\"row.original.tags.length\" class=\"flex flex-wrap gap-1\">\n <UBadge v-for=\"tag in row.original.tags\" :key=\"tag\" color=\"neutral\" variant=\"subtle\" size=\"sm\" :label=\"`#${tag}`\" />\n </div>\n <template v-else>\n <span class=\"text-[var(--sk-fg-dimmed)]\" aria-hidden=\"true\">–</span>\n <span class=\"sr-only\">{{ t('composites.table.noTags') }}</span>\n </template>\n </template>\n <template #summary-cell=\"{ row }: { row: { original: CompositeRow } }\">\n <template v-if=\"hasText(row.original.description)\">\n <span class=\"inline-block size-2 rounded-full bg-[var(--sk-primary)]\" aria-hidden=\"true\" :title=\"row.original.description\" />\n <span class=\"sr-only\">{{ t('composites.table.summaryPresent') }}</span>\n </template>\n <template v-else>\n <span class=\"text-[var(--sk-fg-dimmed)]\" aria-hidden=\"true\">–</span>\n <span class=\"sr-only\">{{ t('composites.summary.none') }}</span>\n </template>\n </template>\n\n <template #empty>\n <div class=\"flex flex-col items-center gap-2 py-6\">\n <p class=\"text-sm text-[var(--sk-muted)]\">\n {{ t('composites.table.filter.noMatch') }}\n </p>\n <UButton\n size=\"sm\"\n color=\"neutral\"\n variant=\"outline\"\n icon=\"i-lucide-filter-x\"\n :label=\"t('composites.table.filter.reset')\"\n @click=\"resetFilters\"\n />\n </div>\n </template>\n </UTable>\n </template>\n </section>\n</template>\n"],"mappings":"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"}
1
+ {"version":3,"file":"CompositeTable.js","names":["_openBlock","_createElementBlock","_unref","_createVNode","_createElementVNode","_toDisplayString","_Fragment","_createSlots","_withCtx","_renderList","_createBlock","_createCommentVNode","_normalizeStyle","_createTextVNode","_normalizeClass"],"sources":["../../../../src/features/composites/components/CompositeTable.vue"],"sourcesContent":["<script setup lang=\"ts\">\n// All Bausteine of an editor's document as a sortable, filterable table. Columns beyond the fixed ones derive from the\n// meta fields of the kinds present in the document, so a host kind with fields gets its columns without code changes.\nimport type { Editor } from '@tiptap/core'\nimport { computed, ref } from 'vue'\nimport type { TableColumn } from '../../../vue/kit/types'\nimport { useUiKit } from '../../../vue/kit/use-ui-kit'\nimport { useEditorI18n } from '../../../vue/use-editor-i18n'\nimport { compositeKindsOf } from '../nodes'\nimport type { CompositeRow } from '../rows'\nimport { columnSpecsOf, type FieldContext, FILTER_ALL, fieldColumnsOf, fieldOf, fieldText, hasText, isLongText, sortRows, toggled } from '../table-model'\nimport { useCompositeRows } from '../use-composite-rows'\n\nconst props = defineProps<{ editor?: Editor }>()\nconst emit = defineEmits<{ select: [row: CompositeRow] }>()\n\nconst { Badge: UBadge, Button: UButton, Icon: UIcon, Input: UInput, Select: USelect, Table: UTable } = useUiKit()\nconst { t } = useEditorI18n()\n\nconst { rows, tags, kinds } = useCompositeRows(() => props.editor)\n\n// --- Columns ----------------------------------------------------------------------------------------------------\n\n// `reference` cells resolve their target in the document; re-read whenever the rows change.\nconst fieldContext = computed<FieldContext | undefined>(() => {\n void rows.value\n return props.editor ? { doc: props.editor.state.doc, kinds: compositeKindsOf(props.editor), t } : undefined\n})\nconst fieldColumns = computed(() => fieldColumnsOf(rows.value, kinds.value, fieldContext.value))\nconst specs = computed(() => columnSpecsOf(fieldColumns.value, t))\n\nconst columns = computed<TableColumn<CompositeRow>[]>(() => specs.value.map(spec => ({\n id: spec.id,\n header: spec.label,\n accessorFn: spec.sort,\n // The table reports `aria-sort` on the header cell only for columns that opt in.\n enableSorting: true,\n meta: { class: {\n th: [spec.id === 'title' ? 'min-w-56' : '', spec.align === 'end' ? 'text-right' : ''].join(' '),\n td: spec.align === 'end' ? 'text-right' : '',\n } },\n})))\n\n// --- Filter -----------------------------------------------------------------------------------------------------\n\nconst search = ref('')\nconst pickedKinds = ref<string[]>([])\nconst pickedTags = ref<string[]>([])\nconst pickedOptions = ref<Record<string, string>>({})\n\n/** One select per `select` field in use; its choices are the union of the options of all kinds that have the key. */\nconst selectFilters = computed(() => fieldColumns.value.flatMap((column) => {\n if (column.field.type !== 'select') return []\n const options = new Map<string, string>()\n for (const row of rows.value) {\n for (const option of fieldOf(row, column.field.key)?.options ?? []) if (!options.has(option.value)) options.set(option.value, option.label)\n }\n return [{\n key: column.field.key,\n label: column.field.label,\n items: [{ label: t('composites.table.filter.all'), value: FILTER_ALL }, ...[...options].map(([value, label]) => ({ label, value }))],\n }]\n}))\n\n// A kind, tag or option that vanished from the document can no longer be unpicked in the UI, so it must not filter either.\nconst activeKinds = computed(() => pickedKinds.value.filter(id => kinds.value.some(kind => kind.id === id)))\nconst activeTags = computed(() => pickedTags.value.filter(tag => tags.value.includes(tag)))\nconst activeOptions = computed(() => selectFilters.value.flatMap((filter) => {\n const value = pickedOptions.value[filter.key]\n return value && filter.items.some(item => item.value === value && value !== FILTER_ALL) ? [[filter.key, value] as const] : []\n}))\nconst needle = computed(() => search.value.trim().toLowerCase())\nconst filterActive = computed(() => activeKinds.value.length > 0 || activeTags.value.length > 0 || activeOptions.value.length > 0 || needle.value !== '')\n\nfunction resetFilters() {\n search.value = ''\n pickedKinds.value = []\n pickedTags.value = []\n pickedOptions.value = {}\n}\n\nconst filtered = computed(() => rows.value.filter((row) => {\n if (activeKinds.value.length && !activeKinds.value.includes(row.kind)) return false\n if (activeTags.value.length && !activeTags.value.every(tag => row.tags.includes(tag))) return false\n if (activeOptions.value.some(([key, value]) => row.meta[key] !== value)) return false\n if (needle.value) {\n const haystack = `${row.title}\\n${row.description}\\n${row.tags.map(tag => `#${tag}`).join(' ')}`.toLowerCase()\n if (!haystack.includes(needle.value)) return false\n }\n return true\n}))\n\n// --- Sorting (client side; the table only reports the state, so the data is ordered here) -------------------------\n\nconst sorting = ref<{ id: string, desc: boolean }[]>([])\nconst activeSort = computed(() => {\n const entry = sorting.value[0]\n const spec = entry && specs.value.find(item => item.id === entry.id)\n return entry && spec ? { id: entry.id, desc: entry.desc, sort: spec.sort } : null\n})\n\n/** Header click cycles ascending → descending → unsorted. */\nfunction cycleSort(id: string) {\n const current = sorting.value[0]\n if (current?.id !== id) sorting.value = [{ id, desc: false }]\n else sorting.value = current.desc ? [] : [{ id, desc: true }]\n}\nconst sortIcon = (id: string) => {\n const current = sorting.value[0]\n if (current?.id !== id) return 'i-lucide-chevrons-up-down'\n return current.desc ? 'i-lucide-arrow-down' : 'i-lucide-arrow-up'\n}\n\nconst sorted = computed(() => {\n const sort = activeSort.value\n return sort ? sortRows(filtered.value, sort.sort, sort.desc) : filtered.value\n})\n\nconst countLabel = computed(() => t(rows.value.length === 1 ? 'composites.table.count.one' : 'composites.table.count.other', { n: sorted.value.length, total: rows.value.length }))\n</script>\n\n<template>\n <section class=\"flex min-h-0 flex-col gap-3\" :aria-label=\"t('composites.table.label')\">\n <div v-if=\"!rows.length\" class=\"mx-auto flex max-w-sm flex-1 flex-col items-center justify-center gap-2 py-16 text-center\">\n <UIcon name=\"i-lucide-table-2\" class=\"size-8 text-[var(--sk-fg-dimmed)]\" />\n <p class=\"text-sm font-medium text-[var(--sk-fg-highlighted)]\">\n {{ t('composites.table.emptyTitle') }}\n </p>\n <p class=\"text-sm text-[var(--sk-muted)]\">\n {{ t('composites.table.emptyText') }}\n </p>\n </div>\n\n <template v-else>\n <div class=\"flex flex-col gap-2\">\n <div class=\"flex flex-wrap items-center gap-2\">\n <UInput\n v-model=\"search\"\n class=\"w-64\"\n size=\"sm\"\n icon=\"i-lucide-search\"\n :placeholder=\"t('composites.table.search.placeholder')\"\n :aria-label=\"t('composites.table.search.label')\"\n >\n <template v-if=\"search\" #trailing>\n <UButton\n color=\"neutral\"\n variant=\"link\"\n size=\"xs\"\n icon=\"i-lucide-x\"\n :aria-label=\"t('composites.table.search.clear')\"\n @click=\"search = ''\"\n />\n </template>\n </UInput>\n\n <div v-for=\"filter in selectFilters\" :key=\"filter.key\" class=\"flex items-center gap-1.5\">\n <span class=\"text-sm text-[var(--sk-muted)]\" aria-hidden=\"true\">{{ filter.label }}</span>\n <USelect\n :model-value=\"pickedOptions[filter.key] ?? FILTER_ALL\"\n class=\"w-36\"\n size=\"sm\"\n :items=\"filter.items\"\n :aria-label=\"filter.label\"\n @update:model-value=\"pickedOptions = { ...pickedOptions, [filter.key]: String($event) }\"\n />\n </div>\n\n <UButton\n v-if=\"filterActive\"\n size=\"sm\"\n color=\"neutral\"\n variant=\"ghost\"\n icon=\"i-lucide-filter-x\"\n :label=\"t('composites.table.filter.reset')\"\n @click=\"resetFilters\"\n />\n <span class=\"ml-auto text-xs tabular-nums text-[var(--sk-muted)]\" role=\"status\">{{ countLabel }}</span>\n </div>\n\n <div v-if=\"kinds.length > 1\" class=\"flex flex-wrap items-center gap-1\" role=\"group\" :aria-label=\"t('composites.table.filter.byKind')\">\n <UButton\n v-for=\"kind in kinds\"\n :key=\"kind.id\"\n size=\"xs\"\n color=\"neutral\"\n :variant=\"activeKinds.includes(kind.id) ? 'solid' : 'outline'\"\n :icon=\"kind.icon\"\n :label=\"kind.label\"\n :aria-pressed=\"activeKinds.includes(kind.id)\"\n @click=\"pickedKinds = toggled(pickedKinds, kind.id)\"\n />\n </div>\n\n <div v-if=\"tags.length\" class=\"flex flex-wrap items-center gap-1\" role=\"group\" :aria-label=\"t('composites.table.filter.byTag')\">\n <UButton\n v-for=\"tag in tags\"\n :key=\"tag\"\n size=\"xs\"\n color=\"neutral\"\n :variant=\"activeTags.includes(tag) ? 'solid' : 'outline'\"\n :label=\"`#${tag}`\"\n :aria-pressed=\"activeTags.includes(tag)\"\n @click=\"pickedTags = toggled(pickedTags, tag)\"\n />\n </div>\n </div>\n\n <UTable\n v-model:sorting=\"sorting\"\n :data=\"sorted\"\n :columns=\"columns\"\n :get-row-id=\"(row: CompositeRow) => row.key\"\n :ui=\"{ th: 'px-3 py-2 text-sm', td: 'px-3 py-2' }\"\n sticky\n class=\"min-h-0 flex-1 rounded-md border border-[var(--sk-border)]\"\n @select=\"(_event: Event, row: { original: CompositeRow }) => emit('select', row.original)\"\n >\n <template v-for=\"spec in specs\" :key=\"spec.id\" #[`${spec.id}-header`]>\n <button\n type=\"button\"\n class=\"-mx-1.5 inline-flex cursor-pointer items-center gap-1 rounded px-1.5 py-0.5 font-semibold hover:bg-[var(--sk-bg-elevated)] focus-visible:outline-2 focus-visible:outline-[var(--sk-primary)]\"\n @click=\"cycleSort(spec.id)\"\n >\n {{ spec.label }}\n <UIcon :name=\"sortIcon(spec.id)\" class=\"size-3.5\" :class=\"activeSort?.id === spec.id ? 'text-[var(--sk-fg-highlighted)]' : 'text-[var(--sk-fg-dimmed)]'\" />\n </button>\n </template>\n\n <template #title-cell=\"{ row }: { row: { original: CompositeRow } }\">\n <div class=\"flex min-w-0 items-center gap-1.5\" :style=\"{ paddingLeft: `${row.original.depth * 1.25}rem` }\">\n <UIcon :name=\"row.original.icon\" class=\"size-4 shrink-0 text-[var(--sk-muted)]\" />\n <span v-if=\"hasText(row.original.title)\" class=\"truncate font-medium text-[var(--sk-fg-highlighted)]\">{{ row.original.title }}</span>\n <span v-else class=\"truncate text-[var(--sk-muted)]\">{{ t('composites.untitled') }}</span>\n </div>\n </template>\n <template #kind-cell=\"{ row }: { row: { original: CompositeRow } }\">\n {{ row.original.kindLabel }}\n </template>\n <template v-for=\"column in fieldColumns\" :key=\"column.id\" #[`${column.id}-cell`]=\"{ row }: { row: { original: CompositeRow } }\">\n <span\n v-if=\"fieldText(row.original, column.field.key, fieldContext)\"\n class=\"block\"\n :class=\"[column.field.type === 'number' || column.field.type === 'date' ? 'tabular-nums' : '', isLongText(column.field) ? 'max-w-64 truncate' : '']\"\n :title=\"isLongText(column.field) ? fieldText(row.original, column.field.key, fieldContext) : undefined\"\n >{{ fieldText(row.original, column.field.key, fieldContext) }}</span>\n <template v-else>\n <span class=\"text-[var(--sk-fg-dimmed)]\" aria-hidden=\"true\">–</span>\n <span class=\"sr-only\">{{ t('composites.table.noValue') }}</span>\n </template>\n </template>\n <template #tags-cell=\"{ row }: { row: { original: CompositeRow } }\">\n <div v-if=\"row.original.tags.length\" class=\"flex flex-wrap gap-1\">\n <UBadge v-for=\"tag in row.original.tags\" :key=\"tag\" color=\"neutral\" variant=\"subtle\" size=\"sm\" :label=\"`#${tag}`\" />\n </div>\n <template v-else>\n <span class=\"text-[var(--sk-fg-dimmed)]\" aria-hidden=\"true\">–</span>\n <span class=\"sr-only\">{{ t('composites.table.noTags') }}</span>\n </template>\n </template>\n <template #summary-cell=\"{ row }: { row: { original: CompositeRow } }\">\n <template v-if=\"hasText(row.original.description)\">\n <span class=\"inline-block size-2 rounded-full bg-[var(--sk-primary)]\" aria-hidden=\"true\" :title=\"row.original.description\" />\n <span class=\"sr-only\">{{ t('composites.table.summaryPresent') }}</span>\n </template>\n <template v-else>\n <span class=\"text-[var(--sk-fg-dimmed)]\" aria-hidden=\"true\">–</span>\n <span class=\"sr-only\">{{ t('composites.summary.none') }}</span>\n </template>\n </template>\n\n <template #empty>\n <div class=\"flex flex-col items-center gap-2 py-6\">\n <p class=\"text-sm text-[var(--sk-muted)]\">\n {{ t('composites.table.filter.noMatch') }}\n </p>\n <UButton\n size=\"sm\"\n color=\"neutral\"\n variant=\"outline\"\n icon=\"i-lucide-filter-x\"\n :label=\"t('composites.table.filter.reset')\"\n @click=\"resetFilters\"\n />\n </div>\n </template>\n </UTable>\n </template>\n </section>\n</template>\n"],"mappings":"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"}
@@ -1,9 +1,9 @@
1
1
  import { metadataOf } from "../../../core/metadata.js";
2
2
  import { METADATA_LIST } from "../../../core/metadata-types.js";
3
+ import { normalizeTagName } from "../../../core/tag-name.js";
3
4
  import { useUiKit } from "../../../vue/kit/use-ui-kit.js";
4
5
  import { useEditorI18n } from "../../../vue/use-editor-i18n.js";
5
6
  import { setCompositeTags } from "../rows.js";
6
- import { normalizeTagName } from "../../../core/tag-name.js";
7
7
  import { Fragment, createCommentVNode, createElementBlock, createTextVNode, createVNode, defineComponent, onBeforeUnmount, openBlock, ref, toDisplayString, unref, watch, withCtx } from "vue";
8
8
  //#region src/features/composites/components/CompositeTagsEditor.vue
9
9
  /** Tags of one Baustein as an input menu with suggestions from the metadata registry, writing through `setCompositeTags`. */
@@ -1,5 +1,7 @@
1
1
  import { compositeKind } from "../kinds.js";
2
+ import { derivationOf } from "../derivation.js";
2
3
  import { compositeKindsOf } from "../nodes.js";
4
+ import { useStoreRef } from "../../../vue/store-ref.js";
3
5
  import { computed, createBlock, createCommentVNode, createElementVNode, createVNode, defineComponent, normalizeClass, normalizeStyle, openBlock, unref, withCtx } from "vue";
4
6
  import { NodeViewContent, NodeViewWrapper, nodeViewProps } from "@tiptap/vue-3";
5
7
  //#region src/features/composites/components/CompositeView.vue
@@ -9,13 +11,21 @@ const _sfc_main = /*@__PURE__*/ defineComponent({
9
11
  setup(__props) {
10
12
  const props = __props;
11
13
  const kind = computed(() => compositeKind(compositeKindsOf(props.editor), String(props.node.attrs.kind)));
14
+ const expanded = useStoreRef(() => props.editor.storage.composite.expanded);
15
+ const collapsed = computed(() => {
16
+ const id = props.node.attrs.id;
17
+ return typeof id === "string" && id !== "" && derivationOf(props.node) !== null && !expanded.value.has(id);
18
+ });
12
19
  /** `text` as a CSS string literal (for `content:`). */
13
20
  const cssString = (text) => `"${text.replace(/["\\]/g, "\\$&").replace(/\n/g, "\\a ")}"`;
14
21
  const placeholderVars = computed(() => ({ "--composite-title-placeholder": cssString(kind.value.titlePlaceholder) }));
15
22
  return (_ctx, _cache) => {
16
23
  return openBlock(), createBlock(unref(NodeViewWrapper), {
17
24
  as: "section",
18
- class: normalizeClass(["composite", { "is-selected rounded-md ring-1 ring-[var(--sk-primary)]": _ctx.selected }]),
25
+ class: normalizeClass(["composite", {
26
+ "is-collapsed": collapsed.value,
27
+ "is-selected rounded-md ring-1 ring-[var(--sk-primary)]": _ctx.selected
28
+ }]),
19
29
  "data-type": "composite",
20
30
  "data-kind": _ctx.node.attrs.kind,
21
31
  "data-id": _ctx.node.attrs.id || void 0,
@@ -1 +1 @@
1
- {"version":3,"file":"CompositeView.js","names":["selected","node","_openBlock","_createBlock","_unref","_normalizeClass","_normalizeStyle","_withCtx","_createCommentVNode","_createElementVNode","_createVNode"],"sources":["../../../../src/features/composites/components/CompositeView.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { NodeViewContent, NodeViewWrapper, nodeViewProps } from '@tiptap/vue-3'\nimport { computed } from 'vue'\nimport { compositeKind } from '../kinds'\nimport { compositeKindsOf } from '../nodes'\n\nconst props = defineProps(nodeViewProps)\n\nconst kind = computed(() => compositeKind(compositeKindsOf(props.editor), String(props.node.attrs.kind)))\n\n/** `text` as a CSS string literal (for `content:`). */\nconst cssString = (text: string) => `\"${text.replace(/[\"\\\\]/g, '\\\\$&').replace(/\\n/g, '\\\\a ')}\"`\n// Placeholder of the empty title (composites.css `content: var(…)`); a nested composite sets its own.\nconst placeholderVars = computed(() => ({\n '--composite-title-placeholder': cssString(kind.value.titlePlaceholder),\n}))\n</script>\n\n<template>\n <NodeViewWrapper\n as=\"section\"\n :class=\"['composite', { 'is-selected rounded-md ring-1 ring-[var(--sk-primary)]': selected }]\"\n data-type=\"composite\"\n :data-kind=\"node.attrs.kind\"\n :data-id=\"node.attrs.id || undefined\"\n :style=\"placeholderVars\"\n >\n <!-- Anchor of the kind icon on the left border: it only takes the icon's place and size. The composite chrome overlay\n measures it and draws the icon as the button that opens the details popover and drags the composite. -->\n <span class=\"composite__toggle\" contenteditable=\"false\" aria-hidden=\"true\" />\n <NodeViewContent class=\"composite__content\" />\n </NodeViewWrapper>\n</template>\n"],"mappings":";;;;;;;;;EAMA,MAAM,QAAQ;EAEd,MAAM,OAAO,eAAe,cAAc,iBAAiB,MAAM,MAAM,GAAG,OAAO,MAAM,KAAK,MAAM,IAAI,CAAC,CAAC;;EAGxG,MAAM,aAAa,SAAiB,IAAI,KAAK,QAAQ,UAAU,MAAM,CAAC,CAAC,QAAQ,OAAO,MAAM,EAAE;EAE9F,MAAM,kBAAkB,gBAAgB,EACtC,iCAAiC,UAAU,KAAK,MAAM,gBAAgB,EACxE,EAAE;;GAIA,OAAAE,UAAA,GAAAC,YAYkBC,MAAA,eAAA,GAAA;IAXhB,IAAG;IACF,OAAKC,eAAA,CAAA,aAAA,EAAA,0DAA4EL,KAAAA,SAAQ,CAAA,CAAA;IAC1F,aAAU;IACT,aAAWC,KAAAA,KAAK,MAAM;IACtB,WAASA,KAAAA,KAAK,MAAM,MAAM,KAAA;IAC1B,OAAKK,eAAE,gBAAA,KAAe;;IAEvB,SAAAC,cAC6G;KAD7GC,mBAAA,oOAAA;KAEA,OAAA,OAAA,OAAA,KAAAC,mBAA6E,QAAA;MAAvE,OAAM;MAAoB,iBAAgB;MAAQ,eAAY;;KACpEC,YAA8CN,MAAA,eAAA,GAAA,EAA7B,OAAM,qBAAoB,CAAA"}
1
+ {"version":3,"file":"CompositeView.js","names":["selected","node","_openBlock","_createBlock","_unref","_normalizeClass","_normalizeStyle","_withCtx","_createCommentVNode","_createElementVNode","_createVNode"],"sources":["../../../../src/features/composites/components/CompositeView.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { NodeViewContent, NodeViewWrapper, nodeViewProps } from '@tiptap/vue-3'\nimport { computed } from 'vue'\nimport { compositeKind } from '../kinds'\nimport { compositeKindsOf } from '../nodes'\nimport { useStoreRef } from '../../../vue/store-ref'\nimport { derivationOf } from '../derivation'\n\nconst props = defineProps(nodeViewProps)\n\nconst kind = computed(() => compositeKind(compositeKindsOf(props.editor), String(props.node.attrs.kind)))\n\n// A derived Baustein (one with a `meta.derivation`) shows collapsed to a faded preview until it is opened; the content\n// stays laid out (CSS clips it), so editing positions are unaffected. The chrome's chevron and a caret inside open it.\nconst expanded = useStoreRef(() => props.editor.storage.composite.expanded)\nconst collapsed = computed(() => {\n const id: unknown = props.node.attrs.id\n return typeof id === 'string' && id !== '' && derivationOf(props.node) !== null && !expanded.value.has(id)\n})\n\n/** `text` as a CSS string literal (for `content:`). */\nconst cssString = (text: string) => `\"${text.replace(/[\"\\\\]/g, '\\\\$&').replace(/\\n/g, '\\\\a ')}\"`\n// Placeholder of the empty title (composites.css `content: var(…)`); a nested composite sets its own.\nconst placeholderVars = computed(() => ({\n '--composite-title-placeholder': cssString(kind.value.titlePlaceholder),\n}))\n</script>\n\n<template>\n <NodeViewWrapper\n as=\"section\"\n :class=\"['composite', { 'is-collapsed': collapsed, 'is-selected rounded-md ring-1 ring-[var(--sk-primary)]': selected }]\"\n data-type=\"composite\"\n :data-kind=\"node.attrs.kind\"\n :data-id=\"node.attrs.id || undefined\"\n :style=\"placeholderVars\"\n >\n <!-- Anchor of the kind icon on the left border: it only takes the icon's place and size. The composite chrome overlay\n measures it and draws the icon as the button that opens the details popover and drags the composite. -->\n <span class=\"composite__toggle\" contenteditable=\"false\" aria-hidden=\"true\" />\n <NodeViewContent class=\"composite__content\" />\n </NodeViewWrapper>\n</template>\n"],"mappings":";;;;;;;;;;;EAQA,MAAM,QAAQ;EAEd,MAAM,OAAO,eAAe,cAAc,iBAAiB,MAAM,MAAM,GAAG,OAAO,MAAM,KAAK,MAAM,IAAI,CAAC,CAAC;EAIxG,MAAM,WAAW,kBAAkB,MAAM,OAAO,QAAQ,UAAU,QAAQ;EAC1E,MAAM,YAAY,eAAe;GAC/B,MAAM,KAAc,MAAM,KAAK,MAAM;GACrC,OAAO,OAAO,OAAO,YAAY,OAAO,MAAM,aAAa,MAAM,IAAI,MAAM,QAAQ,CAAC,SAAS,MAAM,IAAI,EAAE;EAC3G,CAAC;;EAGD,MAAM,aAAa,SAAiB,IAAI,KAAK,QAAQ,UAAU,MAAM,CAAC,CAAC,QAAQ,OAAO,MAAM,EAAE;EAE9F,MAAM,kBAAkB,gBAAgB,EACtC,iCAAiC,UAAU,KAAK,MAAM,gBAAgB,EACxE,EAAE;;GAIA,OAAAE,UAAA,GAAAC,YAYkBC,MAAA,eAAA,GAAA;IAXhB,IAAG;IACF,OAAKC,eAAA,CAAA,aAAA;KAAA,gBAAkC,UAAA;KAAS,0DAA4DL,KAAAA;IAAQ,CAAA,CAAA;IACrH,aAAU;IACT,aAAWC,KAAAA,KAAK,MAAM;IACtB,WAASA,KAAAA,KAAK,MAAM,MAAM,KAAA;IAC1B,OAAKK,eAAE,gBAAA,KAAe;;IAEvB,SAAAC,cAC6G;KAD7GC,mBAAA,oOAAA;KAEA,OAAA,OAAA,OAAA,KAAAC,mBAA6E,QAAA;MAAvE,OAAM;MAAoB,iBAAgB;MAAQ,eAAY;;KACpEC,YAA8CN,MAAA,eAAA,GAAA,EAA7B,OAAM,qBAAoB,CAAA"}
@@ -0,0 +1,103 @@
1
+ import { derivationOf } from "../derivation.js";
2
+ import { useUiKit } from "../../../vue/kit/use-ui-kit.js";
3
+ import { useEditorI18n } from "../../../vue/use-editor-i18n.js";
4
+ import { derivationDetailsOf, derivationMethodLabel } from "../derived-chrome.js";
5
+ import { formatDate } from "../meta-display.js";
6
+ import { Fragment, computed, createCommentVNode, createElementBlock, createElementVNode, createTextVNode, createVNode, defineComponent, normalizeClass, openBlock, toDisplayString, unref } from "vue";
7
+ //#region src/features/composites/components/DerivationBadge.vue
8
+ const _hoisted_1 = {
9
+ key: 0,
10
+ class: "flex min-w-0 items-center gap-1.5 text-xs text-[var(--sk-muted)]"
11
+ };
12
+ const _hoisted_2 = { class: "truncate" };
13
+ const _hoisted_3 = {
14
+ key: 1,
15
+ class: "flex flex-col gap-1.5 rounded-md p-2 text-xs ring ring-[var(--sk-border)]"
16
+ };
17
+ const _hoisted_4 = { class: "flex flex-wrap items-center gap-1" };
18
+ const _hoisted_5 = { class: "grid grid-cols-[auto_1fr] gap-x-2 gap-y-0.5" };
19
+ const _hoisted_6 = { class: "text-[var(--sk-muted)]" };
20
+ const _hoisted_7 = { class: "truncate text-[var(--sk-fg)]" };
21
+ const _hoisted_8 = { class: "text-[var(--sk-muted)]" };
22
+ const _hoisted_9 = ["title"];
23
+ const _hoisted_10 = { class: "text-[var(--sk-muted)]" };
24
+ const _hoisted_11 = { class: "text-[var(--sk-fg)]" };
25
+ const _hoisted_12 = ["href"];
26
+ /**
27
+ * Where a derived Baustein comes from. Compact (the `derivation` field type): the „abgeleitet“ badge with method and
28
+ * date. `detailed` (the details card): also the model, whether the source changed („Quelle geändert“), whether the body
29
+ * was edited since it was generated („bearbeitet“) and a link to the stored raw output. The detailed variant hashes
30
+ * the body, so it belongs only where one Baustein is shown.
31
+ */
32
+ const chip = "inline-flex h-5 shrink-0 items-center gap-1 rounded-sm px-1.5 text-xs leading-none whitespace-nowrap";
33
+ const _sfc_main = /*@__PURE__*/ defineComponent({
34
+ __name: "DerivationBadge",
35
+ props: {
36
+ editor: {},
37
+ node: {},
38
+ detailed: { type: Boolean }
39
+ },
40
+ setup(__props) {
41
+ const props = __props;
42
+ const { Icon: UIcon } = useUiKit();
43
+ const { t } = useEditorI18n();
44
+ const derivation = computed(() => derivationOf(props.node));
45
+ const details = computed(() => props.detailed ? derivationDetailsOf(props.editor, props.node) : null);
46
+ const method = computed(() => derivation.value ? derivationMethodLabel(t, derivation.value.method) : "");
47
+ const created = computed(() => derivation.value?.createdAt ? formatDate(derivation.value.createdAt) : "");
48
+ return (_ctx, _cache) => {
49
+ return derivation.value && !__props.detailed ? (openBlock(), createElementBlock("div", _hoisted_1, [createVNode(unref(UIcon), {
50
+ name: "i-lucide-git-branch",
51
+ class: "size-3.5 shrink-0"
52
+ }), createElementVNode("span", _hoisted_2, toDisplayString([
53
+ unref(t)("composites.derivation.badge"),
54
+ method.value,
55
+ created.value
56
+ ].filter(Boolean).join(" · ")), 1)])) : derivation.value && details.value ? (openBlock(), createElementBlock("div", _hoisted_3, [
57
+ createElementVNode("div", _hoisted_4, [
58
+ createElementVNode("span", { class: normalizeClass([chip, "text-[var(--sk-muted)]"]) }, [createVNode(unref(UIcon), {
59
+ name: "i-lucide-git-branch",
60
+ class: "size-3.5"
61
+ }), createTextVNode(toDisplayString(unref(t)("composites.derivation.badge")), 1)], 2),
62
+ details.value.stale ? (openBlock(), createElementBlock("span", {
63
+ key: 0,
64
+ class: normalizeClass([chip, "text-[var(--sk-warning)]"])
65
+ }, [createVNode(unref(UIcon), {
66
+ name: "i-lucide-triangle-alert",
67
+ class: "size-3.5"
68
+ }), createTextVNode(toDisplayString(unref(t)("composites.derivation.stale")), 1)], 2)) : createCommentVNode("v-if", true),
69
+ details.value.edited ? (openBlock(), createElementBlock("span", {
70
+ key: 1,
71
+ class: normalizeClass([chip, "text-[var(--sk-muted)]"])
72
+ }, [createVNode(unref(UIcon), {
73
+ name: "i-lucide-pencil",
74
+ class: "size-3.5"
75
+ }), createTextVNode(toDisplayString(unref(t)("composites.derivation.edited")), 1)], 2)) : createCommentVNode("v-if", true)
76
+ ]),
77
+ createElementVNode("dl", _hoisted_5, [
78
+ createElementVNode("dt", _hoisted_6, toDisplayString(unref(t)("composites.derivation.method")), 1),
79
+ createElementVNode("dd", _hoisted_7, toDisplayString(method.value), 1),
80
+ derivation.value.model ? (openBlock(), createElementBlock(Fragment, { key: 0 }, [createElementVNode("dt", _hoisted_8, toDisplayString(unref(t)("composites.derivation.model")), 1), createElementVNode("dd", {
81
+ class: "truncate text-[var(--sk-fg)]",
82
+ title: derivation.value.model
83
+ }, toDisplayString(derivation.value.model), 9, _hoisted_9)], 64)) : createCommentVNode("v-if", true),
84
+ created.value ? (openBlock(), createElementBlock(Fragment, { key: 1 }, [createElementVNode("dt", _hoisted_10, toDisplayString(unref(t)("composites.derivation.createdAt")), 1), createElementVNode("dd", _hoisted_11, toDisplayString(created.value), 1)], 64)) : createCommentVNode("v-if", true)
85
+ ]),
86
+ details.value.outputUrl ? (openBlock(), createElementBlock("a", {
87
+ key: 0,
88
+ href: details.value.outputUrl,
89
+ target: "_blank",
90
+ rel: "noopener",
91
+ class: "inline-flex w-fit items-center gap-1 text-[var(--sk-primary)] hover:underline"
92
+ }, [createVNode(unref(UIcon), {
93
+ name: "i-lucide-external-link",
94
+ class: "size-3.5"
95
+ }), createTextVNode(toDisplayString(unref(t)("composites.derivation.openOutput")), 1)], 8, _hoisted_12)) : createCommentVNode("v-if", true)
96
+ ])) : createCommentVNode("v-if", true);
97
+ };
98
+ }
99
+ });
100
+ //#endregion
101
+ export { _sfc_main as default };
102
+
103
+ //# sourceMappingURL=DerivationBadge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DerivationBadge.js","names":["_openBlock","_createElementBlock","_createVNode","_unref","_createElementVNode","_toDisplayString","_normalizeClass","_createTextVNode","_createCommentVNode","_Fragment"],"sources":["../../../../src/features/composites/components/DerivationBadge.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport type { Node as ProseMirrorNode } from '@tiptap/pm/model'\nimport type { Editor } from '@tiptap/core'\nimport { computed } from 'vue'\nimport { useUiKit } from '../../../vue/kit/use-ui-kit'\nimport { useEditorI18n } from '../../../vue/use-editor-i18n'\nimport { derivationOf } from '../derivation'\nimport { derivationDetailsOf, derivationMethodLabel } from '../derived-chrome'\nimport { formatDate } from '../meta-display'\n\n/**\n * Where a derived Baustein comes from. Compact (the `derivation` field type): the „abgeleitet“ badge with method and\n * date. `detailed` (the details card): also the model, whether the source changed („Quelle geändert“), whether the body\n * was edited since it was generated („bearbeitet“) and a link to the stored raw output. The detailed variant hashes\n * the body, so it belongs only where one Baustein is shown.\n */\nconst props = defineProps<{ editor: Editor, node: ProseMirrorNode, detailed?: boolean }>()\n\nconst { Icon: UIcon } = useUiKit()\nconst { t } = useEditorI18n()\n\nconst derivation = computed(() => derivationOf(props.node))\nconst details = computed(() => props.detailed ? derivationDetailsOf(props.editor, props.node) : null)\nconst method = computed(() => derivation.value ? derivationMethodLabel(t, derivation.value.method) : '')\nconst created = computed(() => derivation.value?.createdAt ? formatDate(derivation.value.createdAt) : '')\n\nconst chip = 'inline-flex h-5 shrink-0 items-center gap-1 rounded-sm px-1.5 text-xs leading-none whitespace-nowrap'\n</script>\n\n<template>\n <div v-if=\"derivation && !detailed\" class=\"flex min-w-0 items-center gap-1.5 text-xs text-[var(--sk-muted)]\">\n <UIcon name=\"i-lucide-git-branch\" class=\"size-3.5 shrink-0\" />\n <span class=\"truncate\">{{ [t('composites.derivation.badge'), method, created].filter(Boolean).join(' · ') }}</span>\n </div>\n\n <div v-else-if=\"derivation && details\" class=\"flex flex-col gap-1.5 rounded-md p-2 text-xs ring ring-[var(--sk-border)]\">\n <div class=\"flex flex-wrap items-center gap-1\">\n <span :class=\"[chip, 'text-[var(--sk-muted)]']\">\n <UIcon name=\"i-lucide-git-branch\" class=\"size-3.5\" />{{ t('composites.derivation.badge') }}\n </span>\n <span v-if=\"details.stale\" :class=\"[chip, 'text-[var(--sk-warning)]']\">\n <UIcon name=\"i-lucide-triangle-alert\" class=\"size-3.5\" />{{ t('composites.derivation.stale') }}\n </span>\n <span v-if=\"details.edited\" :class=\"[chip, 'text-[var(--sk-muted)]']\">\n <UIcon name=\"i-lucide-pencil\" class=\"size-3.5\" />{{ t('composites.derivation.edited') }}\n </span>\n </div>\n <dl class=\"grid grid-cols-[auto_1fr] gap-x-2 gap-y-0.5\">\n <dt class=\"text-[var(--sk-muted)]\">{{ t('composites.derivation.method') }}</dt>\n <dd class=\"truncate text-[var(--sk-fg)]\">{{ method }}</dd>\n <template v-if=\"derivation.model\">\n <dt class=\"text-[var(--sk-muted)]\">{{ t('composites.derivation.model') }}</dt>\n <dd class=\"truncate text-[var(--sk-fg)]\" :title=\"derivation.model\">{{ derivation.model }}</dd>\n </template>\n <template v-if=\"created\">\n <dt class=\"text-[var(--sk-muted)]\">{{ t('composites.derivation.createdAt') }}</dt>\n <dd class=\"text-[var(--sk-fg)]\">{{ created }}</dd>\n </template>\n </dl>\n <a\n v-if=\"details.outputUrl\"\n :href=\"details.outputUrl\"\n target=\"_blank\"\n rel=\"noopener\"\n class=\"inline-flex w-fit items-center gap-1 text-[var(--sk-primary)] hover:underline\"\n >\n <UIcon name=\"i-lucide-external-link\" class=\"size-3.5\" />{{ t('composites.derivation.openOutput') }}\n </a>\n </div>\n</template>\n"],"mappings":"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"}
@@ -0,0 +1,60 @@
1
+ import { useUiKit } from "../../../vue/kit/use-ui-kit.js";
2
+ import { useEditorI18n } from "../../../vue/use-editor-i18n.js";
3
+ import { setCompositeMetaField } from "../rows.js";
4
+ import { metaText } from "../meta-display.js";
5
+ import { useCompositeRows } from "../use-composite-rows.js";
6
+ import { computed, createBlock, defineComponent, openBlock, unref } from "vue";
7
+ //#region src/features/composites/components/ReferenceFieldSelect.vue
8
+ /** The select of a `reference` field: the other Bausteine of the document (with a block ID, of the field's target kinds) by title. */
9
+ const NONE = "__none__";
10
+ const _sfc_main = /*@__PURE__*/ defineComponent({
11
+ __name: "ReferenceFieldSelect",
12
+ props: {
13
+ editor: {},
14
+ row: {},
15
+ field: {},
16
+ disabled: { type: Boolean },
17
+ size: {}
18
+ },
19
+ setup(__props) {
20
+ const props = __props;
21
+ /** Nuxt UI's select has no empty-string value: the "no reference" item travels as this sentinel. */
22
+ const { Select: USelect } = useUiKit();
23
+ const { t } = useEditorI18n();
24
+ const { rows } = useCompositeRows(() => props.editor);
25
+ const stored = computed(() => metaText(props.row, props.field));
26
+ const items = computed(() => [{
27
+ label: t("composites.field.none"),
28
+ value: NONE
29
+ }, ...rows.value.filter((candidate) => candidate.id !== null && candidate.id !== props.row.id && (!props.field.targets || props.field.targets.includes(candidate.kind))).map((candidate) => ({
30
+ label: `${candidate.title.trim() || t("composites.inspector.untitled")} · ${candidate.kindLabel}`,
31
+ value: candidate.id
32
+ }))]);
33
+ function onChoice(value) {
34
+ setCompositeMetaField(props.editor, props.row, props.field.key, typeof value === "string" && value !== NONE ? value : "");
35
+ }
36
+ return (_ctx, _cache) => {
37
+ return openBlock(), createBlock(unref(USelect), {
38
+ "model-value": stored.value || void 0,
39
+ items: items.value,
40
+ placeholder: unref(t)("composites.field.choose", { field: __props.field.label }),
41
+ "aria-label": __props.field.label,
42
+ disabled: __props.disabled,
43
+ size: __props.size,
44
+ class: "w-full",
45
+ "onUpdate:modelValue": onChoice
46
+ }, null, 8, [
47
+ "model-value",
48
+ "items",
49
+ "placeholder",
50
+ "aria-label",
51
+ "disabled",
52
+ "size"
53
+ ]);
54
+ };
55
+ }
56
+ });
57
+ //#endregion
58
+ export { _sfc_main as default };
59
+
60
+ //# sourceMappingURL=ReferenceFieldSelect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ReferenceFieldSelect.js","names":["_openBlock","_createBlock","_unref"],"sources":["../../../../src/features/composites/components/ReferenceFieldSelect.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport type { Editor } from '@tiptap/core'\nimport { computed } from 'vue'\nimport { useUiKit } from '../../../vue/kit/use-ui-kit'\nimport { useEditorI18n } from '../../../vue/use-editor-i18n'\nimport type { CompositeMetaField } from '../kinds'\nimport { metaText } from '../meta-display'\nimport { type CompositeRow, setCompositeMetaField } from '../rows'\nimport { useCompositeRows } from '../use-composite-rows'\n\n/** The select of a `reference` field: the other Bausteine of the document (with a block ID, of the field's target kinds) by title. */\nconst props = defineProps<{\n editor: Editor\n row: CompositeRow\n field: CompositeMetaField\n disabled?: boolean\n size?: 'xs' | 'sm' | 'md'\n}>()\n\n/** Nuxt UI's select has no empty-string value: the \"no reference\" item travels as this sentinel. */\nconst NONE = '__none__'\n\nconst { Select: USelect } = useUiKit()\nconst { t } = useEditorI18n()\nconst { rows } = useCompositeRows(() => props.editor)\n\nconst stored = computed(() => metaText(props.row, props.field))\nconst items = computed(() => [\n { label: t('composites.field.none'), value: NONE },\n ...rows.value\n .filter(candidate => candidate.id !== null && candidate.id !== props.row.id && (!props.field.targets || props.field.targets.includes(candidate.kind)))\n .map(candidate => ({ label: `${candidate.title.trim() || t('composites.inspector.untitled')} · ${candidate.kindLabel}`, value: candidate.id as string })),\n])\n\nfunction onChoice(value: unknown) {\n setCompositeMetaField(props.editor, props.row, props.field.key, typeof value === 'string' && value !== NONE ? value : '')\n}\n</script>\n\n<template>\n <USelect\n :model-value=\"stored || undefined\"\n :items=\"items\"\n :placeholder=\"t('composites.field.choose', { field: field.label })\"\n :aria-label=\"field.label\"\n :disabled=\"disabled\"\n :size=\"size\"\n class=\"w-full\"\n @update:model-value=\"onChoice\"\n />\n</template>\n"],"mappings":";;;;;;;;AAoBA,MAAM,OAAO;;;;;;;;;;;EATb,MAAM,QAAQ;;EAWd,MAAM,EAAE,QAAQ,YAAY,SAAS;EACrC,MAAM,EAAE,MAAM,cAAc;EAC5B,MAAM,EAAE,SAAS,uBAAuB,MAAM,MAAM;EAEpD,MAAM,SAAS,eAAe,SAAS,MAAM,KAAK,MAAM,KAAK,CAAC;EAC9D,MAAM,QAAQ,eAAe,CAC3B;GAAE,OAAO,EAAE,uBAAuB;GAAG,OAAO;EAAK,GACjD,GAAG,KAAK,MACL,QAAO,cAAa,UAAU,OAAO,QAAQ,UAAU,OAAO,MAAM,IAAI,OAAO,CAAC,MAAM,MAAM,WAAW,MAAM,MAAM,QAAQ,SAAS,UAAU,IAAI,EAAE,CAAA,CACpJ,KAAI,eAAc;GAAE,OAAO,GAAG,UAAU,MAAM,KAAK,KAAK,EAAE,+BAA+B,EAAE,KAAK,UAAU;GAAa,OAAO,UAAU;EAAa,EAAE,CAC5J,CAAC;EAED,SAAS,SAAS,OAAgB;GAChC,sBAAsB,MAAM,QAAQ,MAAM,KAAK,MAAM,MAAM,KAAK,OAAO,UAAU,YAAY,UAAU,OAAO,QAAQ,EAAE;EAC1H;;GAIE,OAAAA,UAAA,GAAAC,YASEC,MAAA,OAAA,GAAA;IARC,eAAa,OAAA,SAAU,KAAA;IACvB,OAAO,MAAA;IACP,aAAaA,MAAA,CAAA,CAAC,CAAA,2BAAA,EAAA,OAAqC,QAAA,MAAM,MAAK,CAAA;IAC9D,cAAY,QAAA,MAAM;IAClB,UAAU,QAAA;IACV,MAAM,QAAA;IACP,OAAM;IACL,uBAAoB"}
@@ -0,0 +1,122 @@
1
+ import { useUiKit } from "../../../vue/kit/use-ui-kit.js";
2
+ import { useEditorI18n } from "../../../vue/use-editor-i18n.js";
3
+ import { referenceAttrsOf, resolveReference } from "../reference-label.js";
4
+ import { revealSource } from "../reveal-source.js";
5
+ import { computed, createBlock, createTextVNode, createVNode, defineComponent, normalizeClass, onBeforeUnmount, onMounted, openBlock, ref, shallowRef, toDisplayString, unref, withCtx, withKeys, withModifiers } from "vue";
6
+ import { NodeViewWrapper, nodeViewProps } from "@tiptap/vue-3";
7
+ //#region src/features/composites/components/ReferenceView.vue
8
+ /**
9
+ * The `reference` chip: the live short citation (or title) of the Baustein it points at, followed by its locator.
10
+ * A click reveals the target and, with a locator, opens its source there (page of a PDF, time of a recording); a
11
+ * target that no longer exists shows a greyed „gone“ label. Double click or right click opens a popover to set the
12
+ * locator („Stelle“) in an editable editor.
13
+ */
14
+ const _sfc_main = /*@__PURE__*/ defineComponent({
15
+ __name: "ReferenceView",
16
+ props: nodeViewProps,
17
+ setup(__props) {
18
+ const props = __props;
19
+ const { Input: UInput, Popover: UPopover } = useUiKit();
20
+ const { t } = useEditorI18n();
21
+ const resolved = shallowRef(resolveReference(props.editor, referenceAttrsOf(props.node)));
22
+ let frame = 0;
23
+ function sync() {
24
+ cancelAnimationFrame(frame);
25
+ frame = requestAnimationFrame(() => {
26
+ if (props.editor.isDestroyed) return;
27
+ const next = resolveReference(props.editor, referenceAttrsOf(props.node));
28
+ const current = resolved.value;
29
+ if (next.label !== current.label || next.title !== current.title || next.gone !== current.gone) resolved.value = next;
30
+ });
31
+ }
32
+ onMounted(() => props.editor.on("update", sync));
33
+ onBeforeUnmount(() => {
34
+ cancelAnimationFrame(frame);
35
+ props.editor.off("update", sync);
36
+ });
37
+ const text = computed(() => {
38
+ const label = resolved.value.gone ? t("composites.reference.gone") : resolved.value.label;
39
+ const locator = props.node.attrs.locator;
40
+ return typeof locator === "string" && locator && !resolved.value.gone ? `${label}, ${locator}` : label;
41
+ });
42
+ function onClick() {
43
+ const target = String(props.node.attrs.target);
44
+ if (!props.editor.commands.revealBlock(target)) return;
45
+ const locator = props.node.attrs.locator;
46
+ if (typeof locator === "string" && locator) revealSource(props.editor, target, locator);
47
+ }
48
+ const root = ref(null);
49
+ const reference = { getBoundingClientRect: () => root.value?.$el.getBoundingClientRect() ?? new DOMRect() };
50
+ const open = ref(false);
51
+ const draft = ref("");
52
+ function openLocator() {
53
+ if (!props.editor.isEditable) return;
54
+ draft.value = typeof props.node.attrs.locator === "string" ? props.node.attrs.locator : "";
55
+ open.value = true;
56
+ }
57
+ function commit() {
58
+ open.value = false;
59
+ const pos = props.getPos();
60
+ if (typeof pos !== "number" || draft.value.trim() === (props.node.attrs.locator ?? "")) return;
61
+ props.editor.commands.setReferenceLocator(pos, draft.value);
62
+ }
63
+ return (_ctx, _cache) => {
64
+ return openBlock(), createBlock(unref(NodeViewWrapper), {
65
+ ref_key: "root",
66
+ ref: root,
67
+ as: "span",
68
+ class: normalizeClass(["reference", {
69
+ "is-gone": resolved.value.gone,
70
+ "is-selected": _ctx.selected
71
+ }]),
72
+ "data-type": "reference",
73
+ "data-target": _ctx.node.attrs.target,
74
+ title: resolved.value.gone ? void 0 : resolved.value.title,
75
+ role: "link",
76
+ onClick,
77
+ onDblclick: withModifiers(openLocator, ["prevent"]),
78
+ onContextmenu: withModifiers(openLocator, ["prevent"])
79
+ }, {
80
+ default: withCtx(() => [createTextVNode(toDisplayString(text.value) + " ", 1), createVNode(unref(UPopover), {
81
+ open: open.value,
82
+ reference,
83
+ content: {
84
+ side: "bottom",
85
+ align: "start",
86
+ sideOffset: 4,
87
+ onCloseAutoFocus: (event) => event.preventDefault()
88
+ },
89
+ ui: { content: "w-56 p-2" },
90
+ "onUpdate:open": _cache[1] || (_cache[1] = (value) => {
91
+ if (!value) commit();
92
+ })
93
+ }, {
94
+ content: withCtx(() => [createVNode(unref(UInput), {
95
+ modelValue: draft.value,
96
+ "onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => draft.value = $event),
97
+ size: "xs",
98
+ class: "w-full",
99
+ placeholder: unref(t)("composites.reference.locatorPlaceholder"),
100
+ "aria-label": unref(t)("composites.reference.locator"),
101
+ onKeydown: withKeys(withModifiers(commit, ["prevent"]), ["enter"])
102
+ }, null, 8, [
103
+ "modelValue",
104
+ "placeholder",
105
+ "aria-label",
106
+ "onKeydown"
107
+ ])]),
108
+ _: 1
109
+ }, 8, ["open", "content"])]),
110
+ _: 1
111
+ }, 8, [
112
+ "class",
113
+ "data-target",
114
+ "title"
115
+ ]);
116
+ };
117
+ }
118
+ });
119
+ //#endregion
120
+ export { _sfc_main as default };
121
+
122
+ //# sourceMappingURL=ReferenceView.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ReferenceView.js","names":["selected","node","_openBlock","_createBlock","_unref","_normalizeClass","_withModifiers","_withCtx","_createTextVNode","_toDisplayString","_createVNode","_withKeys"],"sources":["../../../../src/features/composites/components/ReferenceView.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { NodeViewWrapper, nodeViewProps } from '@tiptap/vue-3'\nimport { computed, onBeforeUnmount, onMounted, ref, shallowRef } from 'vue'\nimport { useUiKit } from '../../../vue/kit/use-ui-kit'\nimport { useEditorI18n } from '../../../vue/use-editor-i18n'\nimport { referenceAttrsOf, resolveReference } from '../reference-label'\nimport { revealSource } from '../reveal-source'\n\n/**\n * The `reference` chip: the live short citation (or title) of the Baustein it points at, followed by its locator.\n * A click reveals the target and, with a locator, opens its source there (page of a PDF, time of a recording); a\n * target that no longer exists shows a greyed „gone“ label. Double click or right click opens a popover to set the\n * locator („Stelle“) in an editable editor.\n */\nconst props = defineProps(nodeViewProps)\n\nconst { Input: UInput, Popover: UPopover } = useUiKit()\nconst { t } = useEditorI18n()\n\nconst resolved = shallowRef(resolveReference(props.editor, referenceAttrsOf(props.node)))\n\n// The target's title and bibliography edits change the label: re-resolve after document changes, once per frame.\nlet frame = 0\nfunction sync() {\n cancelAnimationFrame(frame)\n frame = requestAnimationFrame(() => {\n if (props.editor.isDestroyed) return\n const next = resolveReference(props.editor, referenceAttrsOf(props.node))\n const current = resolved.value\n if (next.label !== current.label || next.title !== current.title || next.gone !== current.gone) resolved.value = next\n })\n}\nonMounted(() => props.editor.on('update', sync))\nonBeforeUnmount(() => {\n cancelAnimationFrame(frame)\n props.editor.off('update', sync)\n})\n\nconst text = computed(() => {\n const label = resolved.value.gone ? t('composites.reference.gone') : resolved.value.label\n const locator = props.node.attrs.locator\n return typeof locator === 'string' && locator && !resolved.value.gone ? `${label}, ${locator}` : label\n})\n\nfunction onClick() {\n const target = String(props.node.attrs.target)\n if (!props.editor.commands.revealBlock(target)) return\n const locator = props.node.attrs.locator\n if (typeof locator === 'string' && locator) revealSource(props.editor, target, locator)\n}\n\nconst root = ref<{ $el: HTMLElement } | null>(null)\nconst reference = { getBoundingClientRect: () => root.value?.$el.getBoundingClientRect() ?? new DOMRect() }\n\nconst open = ref(false)\nconst draft = ref('')\n\nfunction openLocator() {\n if (!props.editor.isEditable) return\n draft.value = typeof props.node.attrs.locator === 'string' ? props.node.attrs.locator : ''\n open.value = true\n}\n\nfunction commit() {\n open.value = false\n const pos = props.getPos()\n if (typeof pos !== 'number' || draft.value.trim() === (props.node.attrs.locator ?? '')) return\n props.editor.commands.setReferenceLocator(pos, draft.value)\n}\n</script>\n\n<template>\n <NodeViewWrapper\n ref=\"root\"\n as=\"span\"\n :class=\"['reference', { 'is-gone': resolved.gone, 'is-selected': selected }]\"\n data-type=\"reference\"\n :data-target=\"node.attrs.target\"\n :title=\"resolved.gone ? undefined : resolved.title\"\n role=\"link\"\n @click=\"onClick\"\n @dblclick.prevent=\"openLocator\"\n @contextmenu.prevent=\"openLocator\"\n >\n {{ text }}\n <UPopover\n :open=\"open\"\n :reference=\"reference\"\n :content=\"{ side: 'bottom', align: 'start', sideOffset: 4, onCloseAutoFocus: (event: Event) => event.preventDefault() }\"\n :ui=\"{ content: 'w-56 p-2' }\"\n @update:open=\"(value: boolean) => { if (!value) commit() }\"\n >\n <template #content>\n <UInput\n v-model=\"draft\"\n size=\"xs\"\n class=\"w-full\"\n :placeholder=\"t('composites.reference.locatorPlaceholder')\"\n :aria-label=\"t('composites.reference.locator')\"\n @keydown.enter.prevent=\"commit\"\n />\n </template>\n </UPopover>\n </NodeViewWrapper>\n</template>\n"],"mappings":"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"}
@@ -0,0 +1,96 @@
1
+ //#region src/features/composites/components/ReferenceView.vue.d.ts
2
+ declare const __VLS_export: import("vue").DefineComponent<import("vue").ExtractPropTypes<{
3
+ editor: {
4
+ type: import("vue").PropType<import("@tiptap/core").NodeViewProps["editor"]>;
5
+ required: true;
6
+ };
7
+ node: {
8
+ type: import("vue").PropType<import("@tiptap/core").NodeViewProps["node"]>;
9
+ required: true;
10
+ };
11
+ decorations: {
12
+ type: import("vue").PropType<import("@tiptap/core").NodeViewProps["decorations"]>;
13
+ required: true;
14
+ };
15
+ selected: {
16
+ type: import("vue").PropType<import("@tiptap/core").NodeViewProps["selected"]>;
17
+ required: true;
18
+ };
19
+ extension: {
20
+ type: import("vue").PropType<import("@tiptap/core").NodeViewProps["extension"]>;
21
+ required: true;
22
+ };
23
+ getPos: {
24
+ type: import("vue").PropType<import("@tiptap/core").NodeViewProps["getPos"]>;
25
+ required: true;
26
+ };
27
+ updateAttributes: {
28
+ type: import("vue").PropType<import("@tiptap/core").NodeViewProps["updateAttributes"]>;
29
+ required: true;
30
+ };
31
+ deleteNode: {
32
+ type: import("vue").PropType<import("@tiptap/core").NodeViewProps["deleteNode"]>;
33
+ required: true;
34
+ };
35
+ view: {
36
+ type: import("vue").PropType<import("@tiptap/core").NodeViewProps["view"]>;
37
+ required: true;
38
+ };
39
+ innerDecorations: {
40
+ type: import("vue").PropType<import("@tiptap/core").NodeViewProps["innerDecorations"]>;
41
+ required: true;
42
+ };
43
+ HTMLAttributes: {
44
+ type: import("vue").PropType<import("@tiptap/core").NodeViewProps["HTMLAttributes"]>;
45
+ required: true;
46
+ };
47
+ }>, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
48
+ editor: {
49
+ type: import("vue").PropType<import("@tiptap/core").NodeViewProps["editor"]>;
50
+ required: true;
51
+ };
52
+ node: {
53
+ type: import("vue").PropType<import("@tiptap/core").NodeViewProps["node"]>;
54
+ required: true;
55
+ };
56
+ decorations: {
57
+ type: import("vue").PropType<import("@tiptap/core").NodeViewProps["decorations"]>;
58
+ required: true;
59
+ };
60
+ selected: {
61
+ type: import("vue").PropType<import("@tiptap/core").NodeViewProps["selected"]>;
62
+ required: true;
63
+ };
64
+ extension: {
65
+ type: import("vue").PropType<import("@tiptap/core").NodeViewProps["extension"]>;
66
+ required: true;
67
+ };
68
+ getPos: {
69
+ type: import("vue").PropType<import("@tiptap/core").NodeViewProps["getPos"]>;
70
+ required: true;
71
+ };
72
+ updateAttributes: {
73
+ type: import("vue").PropType<import("@tiptap/core").NodeViewProps["updateAttributes"]>;
74
+ required: true;
75
+ };
76
+ deleteNode: {
77
+ type: import("vue").PropType<import("@tiptap/core").NodeViewProps["deleteNode"]>;
78
+ required: true;
79
+ };
80
+ view: {
81
+ type: import("vue").PropType<import("@tiptap/core").NodeViewProps["view"]>;
82
+ required: true;
83
+ };
84
+ innerDecorations: {
85
+ type: import("vue").PropType<import("@tiptap/core").NodeViewProps["innerDecorations"]>;
86
+ required: true;
87
+ };
88
+ HTMLAttributes: {
89
+ type: import("vue").PropType<import("@tiptap/core").NodeViewProps["HTMLAttributes"]>;
90
+ required: true;
91
+ };
92
+ }>> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
93
+ declare const _default: typeof __VLS_export;
94
+ //#endregion
95
+ export { _default as default };
96
+ //# sourceMappingURL=ReferenceView.vue.d.ts.map
@@ -3,8 +3,8 @@ import { useUiKit } from "../../../vue/kit/use-ui-kit.js";
3
3
  import { useEditorSettings } from "../../../vue/settings.js";
4
4
  import { useEditorI18n } from "../../../vue/use-editor-i18n.js";
5
5
  import { STRUCTURE_MODE_KEYS } from "../structure-mode.js";
6
- import { TREE_ROOT_KEYS } from "../tree-root.js";
7
6
  import { DRAG_HANDLE_KEYS, HEADING_SCOPE_KEYS, KIND_ICON_KEYS, optionItems } from "../editing-settings-keys.js";
7
+ import { TREE_ROOT_KEYS } from "../tree-root.js";
8
8
  import _sfc_main$1 from "../../../vue/components/SettingsSection.js";
9
9
  import { computed, createElementBlock, createElementVNode, createVNode, defineComponent, openBlock, unref, withCtx } from "vue";
10
10
  //#region src/features/composites/components/SettingsEditingTab.vue