@ecsplico/editor 2.1.2 → 3.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (706) hide show
  1. package/CHANGELOG.md +78 -1
  2. package/README.md +39 -156
  3. package/dist/adapters/comments/drizzle.d.ts +1 -1
  4. package/dist/adapters/comments/record.d.ts +15 -0
  5. package/dist/adapters/comments/{client.js → rest-model.js} +3 -3
  6. package/dist/adapters/comments/rest-model.js.map +1 -0
  7. package/dist/adapters/comments/server.d.ts +2 -1
  8. package/dist/adapters/comments/server.js +2 -1
  9. package/dist/adapters/comments/server.js.map +1 -1
  10. package/dist/adapters/comments/types.d.ts +2 -2
  11. package/dist/adapters/document-state.d.ts +23 -0
  12. package/dist/adapters/document-state.js +66 -0
  13. package/dist/adapters/document-state.js.map +1 -0
  14. package/dist/adapters/documents.js +14 -11
  15. package/dist/adapters/documents.js.map +1 -1
  16. package/dist/adapters/drizzle.d.ts +2 -2
  17. package/dist/adapters/drizzle.js +97 -88
  18. package/dist/adapters/drizzle.js.map +1 -1
  19. package/dist/adapters/forge.d.ts +12 -7
  20. package/dist/adapters/forge.js +38 -45
  21. package/dist/adapters/forge.js.map +1 -1
  22. package/dist/adapters/http.d.ts +20 -0
  23. package/dist/adapters/http.js +68 -0
  24. package/dist/adapters/http.js.map +1 -0
  25. package/dist/adapters/index.d.ts +5 -5
  26. package/dist/adapters/json.d.ts +3 -3
  27. package/dist/adapters/json.js +58 -49
  28. package/dist/adapters/json.js.map +1 -1
  29. package/dist/adapters/memory.d.ts +21 -0
  30. package/dist/adapters/memory.js +53 -0
  31. package/dist/adapters/memory.js.map +1 -0
  32. package/dist/adapters/nitro.d.ts +27 -20
  33. package/dist/adapters/nitro.js +59 -163
  34. package/dist/adapters/nitro.js.map +1 -1
  35. package/dist/adapters/react.d.ts +55 -0
  36. package/dist/adapters/react.js +209 -0
  37. package/dist/adapters/react.js.map +1 -0
  38. package/dist/adapters/shared.d.ts +15 -21
  39. package/dist/adapters/shared.js +10 -8
  40. package/dist/adapters/shared.js.map +1 -1
  41. package/dist/adapters/vue.d.ts +15 -30
  42. package/dist/adapters/vue.js +36 -87
  43. package/dist/adapters/vue.js.map +1 -1
  44. package/dist/code/CodeSurface.vue.d.ts +2 -2
  45. package/dist/config/index.d.ts +105 -0
  46. package/dist/config/index.js +95 -0
  47. package/dist/config/index.js.map +1 -0
  48. package/dist/core/abilities.js +1 -0
  49. package/dist/core/abilities.js.map +1 -1
  50. package/dist/{adapters/routes.js → core/api-routes.js} +5 -3
  51. package/dist/core/api-routes.js.map +1 -0
  52. package/dist/core/backend-capability.d.ts +7 -0
  53. package/dist/core/backend-capability.js +17 -0
  54. package/dist/core/backend-capability.js.map +1 -0
  55. package/dist/core/backend-types.d.ts +245 -0
  56. package/dist/core/backend-types.js +17 -0
  57. package/dist/core/backend-types.js.map +1 -0
  58. package/dist/core/backend.d.ts +108 -0
  59. package/dist/core/backend.js +14 -0
  60. package/dist/core/backend.js.map +1 -0
  61. package/dist/core/block-convert.d.ts +7 -5
  62. package/dist/core/block-convert.js +28 -5
  63. package/dist/core/block-convert.js.map +1 -1
  64. package/dist/core/command-types.d.ts +96 -0
  65. package/dist/core/commands.d.ts +40 -0
  66. package/dist/core/commands.js +151 -0
  67. package/dist/core/commands.js.map +1 -0
  68. package/dist/core/context.d.ts +17 -20
  69. package/dist/core/context.js +24 -21
  70. package/dist/core/context.js.map +1 -1
  71. package/dist/core/core-feature.d.ts +22 -7
  72. package/dist/core/core-feature.js +51 -18
  73. package/dist/core/core-feature.js.map +1 -1
  74. package/dist/core/define-editor.d.ts +4 -3
  75. package/dist/core/define-editor.js +14 -7
  76. package/dist/core/define-editor.js.map +1 -1
  77. package/dist/core/document-markdown.js +12 -3
  78. package/dist/core/document-markdown.js.map +1 -1
  79. package/dist/core/editor-ui.d.ts +8 -1
  80. package/dist/core/editor-ui.js +9 -8
  81. package/dist/core/editor-ui.js.map +1 -1
  82. package/dist/core/extension-points.d.ts +3 -15
  83. package/dist/core/feature-context.d.ts +8 -7
  84. package/dist/core/feature-context.js +12 -11
  85. package/dist/core/feature-context.js.map +1 -1
  86. package/dist/core/feature.d.ts +41 -19
  87. package/dist/core/feature.js.map +1 -1
  88. package/dist/core/fences.d.ts +2 -1
  89. package/dist/core/fences.js +3 -2
  90. package/dist/core/fences.js.map +1 -1
  91. package/dist/core/fetch-error.d.ts +1 -1
  92. package/dist/core/fetch-error.js +3 -1
  93. package/dist/core/fetch-error.js.map +1 -1
  94. package/dist/core/hash.d.ts +5 -0
  95. package/dist/core/hash.js +11 -0
  96. package/dist/core/hash.js.map +1 -0
  97. package/dist/core/http-backend.d.ts +11 -0
  98. package/dist/core/http-backend.js +195 -0
  99. package/dist/core/http-backend.js.map +1 -0
  100. package/dist/core/index.d.ts +15 -9
  101. package/dist/core/index.js +13 -9
  102. package/dist/core/palette.d.ts +48 -0
  103. package/dist/core/palette.js +95 -0
  104. package/dist/core/palette.js.map +1 -0
  105. package/dist/core/schema/abilities.d.ts +2 -1
  106. package/dist/core/schema/abilities.js +5 -1
  107. package/dist/core/schema/abilities.js.map +1 -1
  108. package/dist/core/schema/index.d.ts +11 -5
  109. package/dist/core/schema/index.js +13 -8
  110. package/dist/core/schema/index.js.map +1 -1
  111. package/dist/core/schema/mark-flags.d.ts +8 -1
  112. package/dist/core/schema/of-features.d.ts +13 -0
  113. package/dist/core/schema/of-features.js +14 -0
  114. package/dist/core/schema/of-features.js.map +1 -0
  115. package/dist/core/slash.d.ts +8 -6
  116. package/dist/core/slash.js +24 -16
  117. package/dist/core/slash.js.map +1 -1
  118. package/dist/core/surface-session.js +15 -5
  119. package/dist/core/surface-session.js.map +1 -1
  120. package/dist/core/toolbar-items.d.ts +10 -4
  121. package/dist/core/toolbar-items.js +269 -195
  122. package/dist/core/toolbar-items.js.map +1 -1
  123. package/dist/core/transaction-guards.d.ts +21 -0
  124. package/dist/core/transaction-guards.js +49 -0
  125. package/dist/core/transaction-guards.js.map +1 -0
  126. package/dist/core/util.js +11 -0
  127. package/dist/core/util.js.map +1 -0
  128. package/dist/document/DocumentSurface.d.ts +1 -1
  129. package/dist/document/DocumentSurface.vue.d.ts +2 -2
  130. package/dist/features/ai/agent-op-review.d.ts +1 -1
  131. package/dist/features/ai/agent-op-review.js +1 -1
  132. package/dist/features/ai/agent-ops.js +1 -1
  133. package/dist/features/ai/ai-apply.d.ts +2 -2
  134. package/dist/features/ai/ai-apply.js +1 -1
  135. package/dist/features/ai/ai-review.js +1 -1
  136. package/dist/features/ai/ai-sse.d.ts +6 -6
  137. package/dist/features/ai/ai-sse.js +20 -63
  138. package/dist/features/ai/ai-sse.js.map +1 -1
  139. package/dist/features/ai/assistant.d.ts +8 -7
  140. package/dist/features/ai/assistant.js +3 -3
  141. package/dist/features/ai/assistant.js.map +1 -1
  142. package/dist/features/ai/block-actions.d.ts +3 -2
  143. package/dist/features/ai/block-actions.js +3 -2
  144. package/dist/features/ai/block-actions.js.map +1 -1
  145. package/dist/features/ai/components/AiSelectionMenu.js +1 -1
  146. package/dist/features/ai/components/DocumentChatAnswer.js +1 -1
  147. package/dist/features/ai/components/DocumentChatOps.vue.d.ts +1 -1
  148. package/dist/features/ai/components/SettingsModelProfiles.js +8 -8
  149. package/dist/features/ai/components/SettingsModelProfiles.js.map +1 -1
  150. package/dist/features/ai/document-chat-model.d.ts +8 -7
  151. package/dist/features/ai/document-chat-model.js +5 -5
  152. package/dist/features/ai/document-chat-model.js.map +1 -1
  153. package/dist/features/ai/document-chat.js +1 -1
  154. package/dist/features/ai/feature.js +27 -14
  155. package/dist/features/ai/feature.js.map +1 -1
  156. package/dist/features/ai/ghost-autocomplete.d.ts +7 -6
  157. package/dist/features/ai/ghost-autocomplete.js +6 -9
  158. package/dist/features/ai/ghost-autocomplete.js.map +1 -1
  159. package/dist/features/ai/index.d.ts +4 -3
  160. package/dist/features/ai/index.js +10 -10
  161. package/dist/features/ai/model-profiles.d.ts +5 -4
  162. package/dist/features/ai/model-profiles.js +2 -2
  163. package/dist/features/ai/model-profiles.js.map +1 -1
  164. package/dist/features/ai/protocol/block-lines.js +1 -1
  165. package/dist/features/ai/protocol/block-lines.js.map +1 -1
  166. package/dist/features/ai/protocol/chat.js +6 -2
  167. package/dist/features/ai/protocol/chat.js.map +1 -1
  168. package/dist/features/ai/protocol/index.d.ts +3 -2
  169. package/dist/features/ai/protocol/models.d.ts +2 -16
  170. package/dist/features/ai/protocol/models.js.map +1 -1
  171. package/dist/features/ai/rate-limit.d.ts +1 -1
  172. package/dist/features/ai/rate-limit.js +3 -1
  173. package/dist/features/ai/rate-limit.js.map +1 -1
  174. package/dist/features/ai/react/AiSelectionMenu.js +2 -2
  175. package/dist/features/ai/react/AiSidebar.js +4 -4
  176. package/dist/features/ai/react/DocumentChatAnswer.js +1 -1
  177. package/dist/features/ai/react/DocumentChatOps.d.ts +1 -1
  178. package/dist/features/ai/react/DocumentChatOps.js +1 -1
  179. package/dist/features/ai/react/SettingsModelProfiles.js +8 -10
  180. package/dist/features/ai/react/SettingsModelProfiles.js.map +1 -1
  181. package/dist/features/ai/react/use-ai-assistant.d.ts +1 -1
  182. package/dist/features/ai/react/use-ai-assistant.js +3 -3
  183. package/dist/features/ai/react/use-ai-assistant.js.map +1 -1
  184. package/dist/features/ai/react/use-document-chat.js +2 -2
  185. package/dist/features/ai/react/use-document-chat.js.map +1 -1
  186. package/dist/features/ai/react/use-model-profiles.d.ts +2 -1
  187. package/dist/features/ai/selection-flow.d.ts +1 -1
  188. package/dist/features/ai/selection-flow.js +1 -1
  189. package/dist/features/ai/sidebar-flow.d.ts +1 -1
  190. package/dist/features/ai/sidebar-flow.js +1 -1
  191. package/dist/features/ai/use-ai-assistant.d.ts +1 -1
  192. package/dist/features/ai/use-ai-assistant.js +3 -3
  193. package/dist/features/ai/use-ai-assistant.js.map +1 -1
  194. package/dist/features/ai/use-document-chat.js +2 -2
  195. package/dist/features/ai/use-document-chat.js.map +1 -1
  196. package/dist/features/ai/use-model-profiles.d.ts +2 -1
  197. package/dist/features/authors/attribution.d.ts +1 -1
  198. package/dist/features/authors/feature.js +12 -11
  199. package/dist/features/authors/feature.js.map +1 -1
  200. package/dist/features/block-ui/block-actions.d.ts +1 -1
  201. package/dist/features/block-ui/block-actions.js +1 -1
  202. package/dist/features/block-ui/block-actions.js.map +1 -1
  203. package/dist/features/block-ui/components/BlockUi.js +1 -1
  204. package/dist/features/block-ui/feature.js +1 -0
  205. package/dist/features/block-ui/feature.js.map +1 -1
  206. package/dist/features/block-ui/react/BlockUi.js +1 -1
  207. package/dist/features/collab/anchor-resolver.js +1 -1
  208. package/dist/features/collab/feature.js +2 -0
  209. package/dist/features/collab/feature.js.map +1 -1
  210. package/dist/features/comments/components/CommentThreadView.vue.d.ts +2 -1
  211. package/dist/features/comments/feature.js +12 -11
  212. package/dist/features/comments/feature.js.map +1 -1
  213. package/dist/features/comments/index.d.ts +3 -2
  214. package/dist/features/comments/index.js +1 -1
  215. package/dist/features/comments/margin-layout.d.ts +3 -2
  216. package/dist/features/comments/model.d.ts +3 -67
  217. package/dist/features/comments/model.js +2 -2
  218. package/dist/features/comments/model.js.map +1 -1
  219. package/dist/features/comments/react/CommentThreadView.d.ts +3 -2
  220. package/dist/features/comments/react/use-comments.d.ts +2 -1
  221. package/dist/features/comments/react.d.ts +1 -1
  222. package/dist/features/comments/schema.d.ts +2 -52
  223. package/dist/features/comments/schema.js.map +1 -1
  224. package/dist/features/comments/snapshot-equality.js.map +1 -1
  225. package/dist/features/comments/use-comments.d.ts +3 -2
  226. package/dist/features/comments/vue.d.ts +1 -1
  227. package/dist/features/composites/accepted-children.d.ts +1 -0
  228. package/dist/features/composites/accepted-children.js +16 -1
  229. package/dist/features/composites/accepted-children.js.map +1 -1
  230. package/dist/features/composites/ai-brief.js +39 -0
  231. package/dist/features/composites/ai-brief.js.map +1 -1
  232. package/dist/features/composites/bibliography-command.d.ts +11 -0
  233. package/dist/features/composites/bibliography-form.js +90 -0
  234. package/dist/features/composites/bibliography-form.js.map +1 -0
  235. package/dist/features/composites/bibliography.d.ts +33 -0
  236. package/dist/features/composites/bibliography.js +120 -0
  237. package/dist/features/composites/bibliography.js.map +1 -0
  238. package/dist/features/composites/components/BibliographyEditor.js +261 -0
  239. package/dist/features/composites/components/BibliographyEditor.js.map +1 -0
  240. package/dist/features/composites/components/CompositeChrome.js +78 -29
  241. package/dist/features/composites/components/CompositeChrome.js.map +1 -1
  242. package/dist/features/composites/components/CompositeChrome.vue.d.ts +1 -1
  243. package/dist/features/composites/components/CompositeDetails.js +46 -11
  244. package/dist/features/composites/components/CompositeDetails.js.map +1 -1
  245. package/dist/features/composites/components/CompositeDetails.vue.d.ts +2 -1
  246. package/dist/features/composites/components/CompositeFieldEditor.js +64 -5
  247. package/dist/features/composites/components/CompositeFieldEditor.js.map +1 -1
  248. package/dist/features/composites/components/CompositeInspector.js +20 -7
  249. package/dist/features/composites/components/CompositeInspector.js.map +1 -1
  250. package/dist/features/composites/components/CompositeTable.js +13 -4
  251. package/dist/features/composites/components/CompositeTable.js.map +1 -1
  252. package/dist/features/composites/components/CompositeTagsEditor.js +1 -1
  253. package/dist/features/composites/components/CompositeView.js +11 -1
  254. package/dist/features/composites/components/CompositeView.js.map +1 -1
  255. package/dist/features/composites/components/DerivationBadge.js +103 -0
  256. package/dist/features/composites/components/DerivationBadge.js.map +1 -0
  257. package/dist/features/composites/components/ReferenceFieldSelect.js +60 -0
  258. package/dist/features/composites/components/ReferenceFieldSelect.js.map +1 -0
  259. package/dist/features/composites/components/ReferenceView.js +122 -0
  260. package/dist/features/composites/components/ReferenceView.js.map +1 -0
  261. package/dist/features/composites/components/ReferenceView.vue.d.ts +96 -0
  262. package/dist/features/composites/components/SettingsEditingTab.js +1 -1
  263. package/dist/features/composites/convert.js +2 -2
  264. package/dist/features/composites/convert.js.map +1 -1
  265. package/dist/features/composites/derivation.d.ts +61 -0
  266. package/dist/features/composites/derivation.js +98 -0
  267. package/dist/features/composites/derivation.js.map +1 -0
  268. package/dist/features/composites/derived-chrome.js +69 -0
  269. package/dist/features/composites/derived-chrome.js.map +1 -0
  270. package/dist/features/composites/feature.js +159 -109
  271. package/dist/features/composites/feature.js.map +1 -1
  272. package/dist/features/composites/fences.d.ts +4 -3
  273. package/dist/features/composites/fences.js +51 -7
  274. package/dist/features/composites/fences.js.map +1 -1
  275. package/dist/features/composites/index.d.ts +12 -3
  276. package/dist/features/composites/index.js +15 -6
  277. package/dist/features/composites/inspector-model.d.ts +4 -1
  278. package/dist/features/composites/inspector-model.js +8 -4
  279. package/dist/features/composites/inspector-model.js.map +1 -1
  280. package/dist/features/composites/kinds.d.ts +16 -2
  281. package/dist/features/composites/kinds.js +145 -6
  282. package/dist/features/composites/kinds.js.map +1 -1
  283. package/dist/features/composites/legacy.d.ts +4 -1
  284. package/dist/features/composites/legacy.js +56 -1
  285. package/dist/features/composites/legacy.js.map +1 -1
  286. package/dist/features/composites/meta-display.js +45 -2
  287. package/dist/features/composites/meta-display.js.map +1 -1
  288. package/dist/features/composites/meta-keys.d.ts +7 -0
  289. package/dist/features/composites/meta-keys.js +21 -0
  290. package/dist/features/composites/meta-keys.js.map +1 -0
  291. package/dist/features/composites/node-views.d.ts +6 -3
  292. package/dist/features/composites/node-views.js +7 -3
  293. package/dist/features/composites/node-views.js.map +1 -1
  294. package/dist/features/composites/nodes.d.ts +6 -1
  295. package/dist/features/composites/nodes.js +33 -7
  296. package/dist/features/composites/nodes.js.map +1 -1
  297. package/dist/features/composites/react/BibliographyEditor.js +229 -0
  298. package/dist/features/composites/react/BibliographyEditor.js.map +1 -0
  299. package/dist/features/composites/react/CompositeChrome.js +67 -19
  300. package/dist/features/composites/react/CompositeChrome.js.map +1 -1
  301. package/dist/features/composites/react/CompositeDetails.d.ts +2 -1
  302. package/dist/features/composites/react/CompositeDetails.js +45 -6
  303. package/dist/features/composites/react/CompositeDetails.js.map +1 -1
  304. package/dist/features/composites/react/CompositeFieldEditor.d.ts +1 -1
  305. package/dist/features/composites/react/CompositeFieldEditor.js +43 -1
  306. package/dist/features/composites/react/CompositeFieldEditor.js.map +1 -1
  307. package/dist/features/composites/react/CompositeInspector.js +12 -6
  308. package/dist/features/composites/react/CompositeInspector.js.map +1 -1
  309. package/dist/features/composites/react/CompositeStatusMenu.js +1 -1
  310. package/dist/features/composites/react/CompositeSummaryEditor.js +1 -1
  311. package/dist/features/composites/react/CompositeTable.js +16 -2
  312. package/dist/features/composites/react/CompositeTable.js.map +1 -1
  313. package/dist/features/composites/react/CompositeTagsEditor.js +2 -2
  314. package/dist/features/composites/react/CompositeView.js +6 -1
  315. package/dist/features/composites/react/CompositeView.js.map +1 -1
  316. package/dist/features/composites/react/DerivationBadge.js +116 -0
  317. package/dist/features/composites/react/DerivationBadge.js.map +1 -0
  318. package/dist/features/composites/react/ReferenceFieldSelect.js +52 -0
  319. package/dist/features/composites/react/ReferenceFieldSelect.js.map +1 -0
  320. package/dist/features/composites/react/ReferenceView.d.ts +11 -0
  321. package/dist/features/composites/react/ReferenceView.js +115 -0
  322. package/dist/features/composites/react/ReferenceView.js.map +1 -0
  323. package/dist/features/composites/react/SettingsEditingTab.js +2 -2
  324. package/dist/features/composites/react.d.ts +2 -1
  325. package/dist/features/composites/react.js +7 -3
  326. package/dist/features/composites/react.js.map +1 -1
  327. package/dist/features/composites/reference-ai.js +16 -0
  328. package/dist/features/composites/reference-ai.js.map +1 -0
  329. package/dist/features/composites/reference-label.d.ts +19 -0
  330. package/dist/features/composites/reference-label.js +58 -0
  331. package/dist/features/composites/reference-label.js.map +1 -0
  332. package/dist/features/composites/reference-suggestion.d.ts +10 -0
  333. package/dist/features/composites/reference-suggestion.js +41 -0
  334. package/dist/features/composites/reference-suggestion.js.map +1 -0
  335. package/dist/features/composites/reference-text.d.ts +18 -0
  336. package/dist/features/composites/reference-text.js +89 -0
  337. package/dist/features/composites/reference-text.js.map +1 -0
  338. package/dist/features/composites/reference.d.ts +44 -0
  339. package/dist/features/composites/reference.js +148 -0
  340. package/dist/features/composites/reference.js.map +1 -0
  341. package/dist/features/composites/reveal-source.d.ts +32 -0
  342. package/dist/features/composites/reveal-source.js +89 -0
  343. package/dist/features/composites/reveal-source.js.map +1 -0
  344. package/dist/features/composites/rows.d.ts +25 -3
  345. package/dist/features/composites/rows.js +72 -10
  346. package/dist/features/composites/rows.js.map +1 -1
  347. package/dist/features/composites/schema.d.ts +9 -3
  348. package/dist/features/composites/schema.js +11 -4
  349. package/dist/features/composites/schema.js.map +1 -1
  350. package/dist/features/composites/table-model.js +12 -21
  351. package/dist/features/composites/table-model.js.map +1 -1
  352. package/dist/features/composites/vue.d.ts +3 -2
  353. package/dist/features/composites/vue.js +8 -4
  354. package/dist/features/composites/vue.js.map +1 -1
  355. package/dist/features/media/assets.d.ts +2 -0
  356. package/dist/features/media/assets.js +3 -2
  357. package/dist/features/media/assets.js.map +1 -1
  358. package/dist/features/media/components/FileView.js +13 -4
  359. package/dist/features/media/components/FileView.js.map +1 -1
  360. package/dist/features/media/feature.d.ts +3 -3
  361. package/dist/features/media/feature.js +21 -28
  362. package/dist/features/media/feature.js.map +1 -1
  363. package/dist/features/media/file-import.js +2 -2
  364. package/dist/features/media/file-import.js.map +1 -1
  365. package/dist/features/media/index.d.ts +2 -2
  366. package/dist/features/media/index.js +3 -3
  367. package/dist/features/media/react/AudioRecorderModal.js +1 -1
  368. package/dist/features/media/react/FileView.js +19 -2
  369. package/dist/features/media/react/FileView.js.map +1 -1
  370. package/dist/features/media/react.js +1 -1
  371. package/dist/features/media/schema.d.ts +8 -0
  372. package/dist/features/media/schema.js +126 -11
  373. package/dist/features/media/schema.js.map +1 -1
  374. package/dist/features/media/upload.d.ts +16 -14
  375. package/dist/features/media/upload.js +13 -19
  376. package/dist/features/media/upload.js.map +1 -1
  377. package/dist/features/mentions/index.d.ts +4 -3
  378. package/dist/features/mentions/index.js +4 -1
  379. package/dist/features/mentions/index.js.map +1 -1
  380. package/dist/features/mentions/mention-text.d.ts +1 -1
  381. package/dist/features/mentions/mention-text.js.map +1 -1
  382. package/dist/features/mentions/mention.d.ts +0 -6
  383. package/dist/features/mentions/mention.js.map +1 -1
  384. package/dist/features/mentions/metadata-defaults.d.ts +2 -2
  385. package/dist/features/mentions/metadata-defaults.js +3 -9
  386. package/dist/features/mentions/metadata-defaults.js.map +1 -1
  387. package/dist/features/mentions/schema.d.ts +2 -1
  388. package/dist/features/mentions/schema.js.map +1 -1
  389. package/dist/features/tables/feature.d.ts +2 -1
  390. package/dist/features/tables/feature.js +90 -70
  391. package/dist/features/tables/feature.js.map +1 -1
  392. package/dist/features/themes/components/SettingsAppearanceTab.js +6 -9
  393. package/dist/features/themes/components/SettingsAppearanceTab.js.map +1 -1
  394. package/dist/features/themes/feature.js +2 -0
  395. package/dist/features/themes/feature.js.map +1 -1
  396. package/dist/features/themes/index.d.ts +2 -1
  397. package/dist/features/themes/react/SettingsAppearanceTab.js +7 -10
  398. package/dist/features/themes/react/SettingsAppearanceTab.js.map +1 -1
  399. package/dist/features/themes/schema.d.ts +2 -6
  400. package/dist/features/themes/schema.js.map +1 -1
  401. package/dist/features/themes/theme-runtime.d.ts +1 -1
  402. package/dist/features/themes/theme-runtime.js +4 -2
  403. package/dist/features/themes/theme-runtime.js.map +1 -1
  404. package/dist/features/transcript/TranscriptSegmentView.js +48 -28
  405. package/dist/features/transcript/TranscriptSegmentView.js.map +1 -1
  406. package/dist/features/transcript/feature.js +21 -19
  407. package/dist/features/transcript/feature.js.map +1 -1
  408. package/dist/features/transcript/react/TranscriptSegmentView.js +55 -36
  409. package/dist/features/transcript/react/TranscriptSegmentView.js.map +1 -1
  410. package/dist/features/transcript/segment-node.d.ts +2 -0
  411. package/dist/features/transcript/segment-node.js +35 -7
  412. package/dist/features/transcript/segment-node.js.map +1 -1
  413. package/dist/i18n/de/composites.js +91 -1
  414. package/dist/i18n/de/composites.js.map +1 -1
  415. package/dist/i18n/de/integrations.js +49 -8
  416. package/dist/i18n/de/integrations.js.map +1 -1
  417. package/dist/i18n/de/media.js +0 -1
  418. package/dist/i18n/de/media.js.map +1 -1
  419. package/dist/i18n/de/palette.js +22 -0
  420. package/dist/i18n/de/palette.js.map +1 -0
  421. package/dist/i18n/de/tables.js +0 -1
  422. package/dist/i18n/de/tables.js.map +1 -1
  423. package/dist/i18n/de/transcript.js +2 -1
  424. package/dist/i18n/de/transcript.js.map +1 -1
  425. package/dist/i18n/de/tree.js +3 -0
  426. package/dist/i18n/de/tree.js.map +1 -1
  427. package/dist/i18n/de.d.ts +157 -11
  428. package/dist/i18n/de.js +3 -1
  429. package/dist/i18n/de.js.map +1 -1
  430. package/dist/i18n/en/composites.js +89 -1
  431. package/dist/i18n/en/composites.js.map +1 -1
  432. package/dist/i18n/en/integrations.js +49 -8
  433. package/dist/i18n/en/integrations.js.map +1 -1
  434. package/dist/i18n/en/media.js +0 -1
  435. package/dist/i18n/en/media.js.map +1 -1
  436. package/dist/i18n/en/palette.js +22 -0
  437. package/dist/i18n/en/palette.js.map +1 -0
  438. package/dist/i18n/en/tables.js +0 -1
  439. package/dist/i18n/en/tables.js.map +1 -1
  440. package/dist/i18n/en/transcript.js +2 -1
  441. package/dist/i18n/en/transcript.js.map +1 -1
  442. package/dist/i18n/en/tree.js +3 -0
  443. package/dist/i18n/en/tree.js.map +1 -1
  444. package/dist/i18n/en.js +3 -1
  445. package/dist/i18n/en.js.map +1 -1
  446. package/dist/index.d.ts +4 -3
  447. package/dist/integrations/composite-ai/bibliography-fetch.d.ts +31 -0
  448. package/dist/integrations/composite-ai/bibliography-fetch.js +159 -0
  449. package/dist/integrations/composite-ai/bibliography-fetch.js.map +1 -0
  450. package/dist/integrations/composite-ai/composite-fill.d.ts +30 -8
  451. package/dist/integrations/composite-ai/composite-fill.js +97 -56
  452. package/dist/integrations/composite-ai/composite-fill.js.map +1 -1
  453. package/dist/integrations/composite-ai/composite-summary.d.ts +4 -12
  454. package/dist/integrations/composite-ai/composite-summary.js +7 -26
  455. package/dist/integrations/composite-ai/composite-summary.js.map +1 -1
  456. package/dist/integrations/composite-ai/derive.d.ts +29 -0
  457. package/dist/integrations/composite-ai/derive.js +173 -0
  458. package/dist/integrations/composite-ai/derive.js.map +1 -0
  459. package/dist/integrations/composite-ai/index.d.ts +11 -7
  460. package/dist/integrations/composite-ai/index.js +72 -14
  461. package/dist/integrations/composite-ai/index.js.map +1 -1
  462. package/dist/integrations/composite-ai/rendition.d.ts +45 -0
  463. package/dist/integrations/composite-ai/rendition.js +314 -0
  464. package/dist/integrations/composite-ai/rendition.js.map +1 -0
  465. package/dist/integrations/composite-media/index.d.ts +7 -5
  466. package/dist/integrations/composite-media/index.js +86 -13
  467. package/dist/integrations/composite-media/index.js.map +1 -1
  468. package/dist/integrations/transcript-ai/index.d.ts +1 -1
  469. package/dist/integrations/transcript-ai/index.js +5 -2
  470. package/dist/integrations/transcript-ai/index.js.map +1 -1
  471. package/dist/integrations/transcript-ai/protocol.d.ts +2 -12
  472. package/dist/integrations/transcript-ai/protocol.js +0 -2
  473. package/dist/integrations/transcript-ai/protocol.js.map +1 -1
  474. package/dist/integrations/transcript-ai/transcript-cleanup.d.ts +5 -5
  475. package/dist/integrations/transcript-ai/transcript-cleanup.js +7 -10
  476. package/dist/integrations/transcript-ai/transcript-cleanup.js.map +1 -1
  477. package/dist/markdown/MarkdownSurface.vue.d.ts +12 -11
  478. package/dist/markdown/MarkdownSurface2.js +3 -6
  479. package/dist/markdown/MarkdownSurface2.js.map +1 -1
  480. package/dist/markdown/document.js +1 -1
  481. package/dist/markdown/source-mode.d.ts +1 -1
  482. package/dist/nuxt/module.d.ts +1402 -54
  483. package/dist/nuxt/module.js +6 -49
  484. package/dist/nuxt/module.js.map +1 -1
  485. package/dist/nuxt/runtime/install-context.d.ts +7 -3
  486. package/dist/nuxt/runtime/install-context.js +14 -8
  487. package/dist/nuxt/runtime/install-context.js.map +1 -1
  488. package/dist/nuxt/runtime/plugins/editor-context-nuxt-ui.client.ts +2 -2
  489. package/dist/nuxt/runtime/server/plugins/editor-server.js +20 -12
  490. package/dist/nuxt/runtime/server/plugins/editor-server.js.map +1 -1
  491. package/dist/presets/compose.d.ts +94 -0
  492. package/dist/presets/compose.js +164 -0
  493. package/dist/presets/compose.js.map +1 -0
  494. package/dist/react/AdvancedEditor.d.ts +15 -15
  495. package/dist/react/AdvancedEditor.js +15 -13
  496. package/dist/react/AdvancedEditor.js.map +1 -1
  497. package/dist/react/EditorCommandPalette.d.ts +13 -0
  498. package/dist/react/EditorCommandPalette.js +118 -0
  499. package/dist/react/EditorCommandPalette.js.map +1 -0
  500. package/dist/react/EditorSettingsModal.d.ts +5 -5
  501. package/dist/react/EditorSettingsModal.js +7 -4
  502. package/dist/react/EditorSettingsModal.js.map +1 -1
  503. package/dist/react/EditorSettingsPanel.d.ts +7 -7
  504. package/dist/react/EditorSettingsPanel.js +8 -5
  505. package/dist/react/EditorSettingsPanel.js.map +1 -1
  506. package/dist/react/EditorSurface.d.ts +7 -7
  507. package/dist/react/EditorSurface.js +10 -6
  508. package/dist/react/EditorSurface.js.map +1 -1
  509. package/dist/react/EditorToolbar.d.ts +4 -6
  510. package/dist/react/EditorToolbar.js +29 -37
  511. package/dist/react/EditorToolbar.js.map +1 -1
  512. package/dist/react/SimpleEditor.d.ts +22 -23
  513. package/dist/react/SimpleEditor.js +21 -7
  514. package/dist/react/SimpleEditor.js.map +1 -1
  515. package/dist/react/advanced.d.ts +4 -3
  516. package/dist/react/advanced.js +2 -2
  517. package/dist/react/compose.d.ts +20 -0
  518. package/dist/react/compose.js +49 -0
  519. package/dist/react/compose.js.map +1 -0
  520. package/dist/react/composed-surface.d.ts +39 -0
  521. package/dist/react/composed-surface.js +71 -0
  522. package/dist/react/composed-surface.js.map +1 -0
  523. package/dist/react/context.js +6 -2
  524. package/dist/react/context.js.map +1 -1
  525. package/dist/react/index.d.ts +2 -1
  526. package/dist/react/index.js +2 -1
  527. package/dist/react/key-labels.js +15 -0
  528. package/dist/react/key-labels.js.map +1 -0
  529. package/dist/react/settings.d.ts +1 -1
  530. package/dist/react/simple.d.ts +2 -2
  531. package/dist/react/ui/command.js +36 -1
  532. package/dist/react/ui/command.js.map +1 -1
  533. package/dist/schema/advanced.d.ts +6 -6
  534. package/dist/schema/advanced.js +26 -29
  535. package/dist/schema/advanced.js.map +1 -1
  536. package/dist/server/ai.d.ts +5 -16
  537. package/dist/server/ai.js.map +1 -1
  538. package/dist/server/auth.d.ts +9 -0
  539. package/dist/server/collab-state.d.ts +1 -1
  540. package/dist/server/collab-state.js.map +1 -1
  541. package/dist/server/collab.d.ts +13 -13
  542. package/dist/server/collab.js +34 -18
  543. package/dist/server/collab.js.map +1 -1
  544. package/dist/server/crossref.js +78 -0
  545. package/dist/server/crossref.js.map +1 -0
  546. package/dist/server/errors.d.ts +1 -1
  547. package/dist/server/errors.js +1 -1
  548. package/dist/server/errors.js.map +1 -1
  549. package/dist/server/extract.js +308 -0
  550. package/dist/server/extract.js.map +1 -0
  551. package/dist/server/h3.d.ts +8 -0
  552. package/dist/{nuxt/runtime/server/utils/editor-route.js → server/h3.js} +8 -16
  553. package/dist/server/h3.js.map +1 -0
  554. package/dist/server/handlers/ai.d.ts +32 -10
  555. package/dist/server/handlers/ai.js +172 -37
  556. package/dist/server/handlers/ai.js.map +1 -1
  557. package/dist/server/handlers/context.d.ts +12 -5
  558. package/dist/server/handlers/context.js +10 -4
  559. package/dist/server/handlers/context.js.map +1 -1
  560. package/dist/server/handlers/editor.d.ts +19 -13
  561. package/dist/server/handlers/editor.js +49 -38
  562. package/dist/server/handlers/editor.js.map +1 -1
  563. package/dist/server/handlers/index.d.ts +4 -4
  564. package/dist/server/handlers/index.js +4 -4
  565. package/dist/server/host.d.ts +16 -25
  566. package/dist/server/host.js +58 -41
  567. package/dist/server/host.js.map +1 -1
  568. package/dist/server/index.d.ts +6 -4
  569. package/dist/server/index.js +3 -2
  570. package/dist/server/pdf.js +97 -0
  571. package/dist/server/pdf.js.map +1 -0
  572. package/dist/server/{adapter.d.ts → ports.d.ts} +81 -30
  573. package/dist/server/ports.js +29 -0
  574. package/dist/server/ports.js.map +1 -0
  575. package/dist/server/routes.d.ts +22 -0
  576. package/dist/server/routes.js +144 -0
  577. package/dist/server/routes.js.map +1 -0
  578. package/dist/settings/index.d.ts +1 -1
  579. package/dist/settings/index.js.map +1 -1
  580. package/dist/styles/composites.css +25 -0
  581. package/dist/tree/DocumentTree.js +56 -29
  582. package/dist/tree/DocumentTree.js.map +1 -1
  583. package/dist/tree/react/DocumentTree.js +23 -0
  584. package/dist/tree/react/DocumentTree.js.map +1 -1
  585. package/dist/tree/tree-host.js +2 -2
  586. package/dist/tree/tree-items.js +1 -1
  587. package/dist/vue/AdvancedEditor.js +30 -9
  588. package/dist/vue/AdvancedEditor.js.map +1 -1
  589. package/dist/vue/AdvancedEditor.vue.d.ts +32 -12
  590. package/dist/vue/SimpleEditor.js +62 -16
  591. package/dist/vue/SimpleEditor.js.map +1 -1
  592. package/dist/vue/SimpleEditor.vue.d.ts +39 -9
  593. package/dist/vue/advanced.d.ts +3 -2
  594. package/dist/vue/advanced.js +2 -2
  595. package/dist/vue/components/EditorCommandPalette.js +91 -0
  596. package/dist/vue/components/EditorCommandPalette.js.map +1 -0
  597. package/dist/vue/components/EditorCommandPalette.vue.d.ts +15 -0
  598. package/dist/vue/components/EditorSettingsModal.js +10 -6
  599. package/dist/vue/components/EditorSettingsModal.js.map +1 -1
  600. package/dist/vue/components/EditorSettingsModal.vue.d.ts +4 -4
  601. package/dist/vue/components/EditorSettingsPanel.js +10 -6
  602. package/dist/vue/components/EditorSettingsPanel.js.map +1 -1
  603. package/dist/vue/components/EditorSettingsPanel.vue.d.ts +6 -6
  604. package/dist/vue/components/EditorSurface.js +11 -6
  605. package/dist/vue/components/EditorSurface.js.map +1 -1
  606. package/dist/vue/components/EditorSurface.vue.d.ts +11 -11
  607. package/dist/vue/components/EditorToolbar.js +41 -49
  608. package/dist/vue/components/EditorToolbar.js.map +1 -1
  609. package/dist/vue/components/EditorToolbar.vue.d.ts +2 -4
  610. package/dist/vue/compose.d.ts +17 -0
  611. package/dist/vue/compose.js +51 -0
  612. package/dist/vue/compose.js.map +1 -0
  613. package/dist/vue/context-key.d.ts +6 -0
  614. package/dist/vue/context-key.js +6 -0
  615. package/dist/vue/context-key.js.map +1 -0
  616. package/dist/vue/context.d.ts +8 -6
  617. package/dist/vue/context.js +6 -5
  618. package/dist/vue/context.js.map +1 -1
  619. package/dist/vue/index.d.ts +10 -8
  620. package/dist/vue/index.js +10 -8
  621. package/dist/vue/kit/index.d.ts +2 -2
  622. package/dist/vue/kit/nuxt-ui.js +23 -0
  623. package/dist/vue/kit/nuxt-ui.js.map +1 -1
  624. package/dist/vue/kit/types.d.ts +40 -1
  625. package/package.json +30 -16
  626. package/dist/adapters/comments/client.d.ts +0 -64
  627. package/dist/adapters/comments/client.js.map +0 -1
  628. package/dist/adapters/routes.js.map +0 -1
  629. package/dist/core/toolbar.d.ts +0 -74
  630. package/dist/core/toolbar.js +0 -45
  631. package/dist/core/toolbar.js.map +0 -1
  632. package/dist/integrations/composite-ai/document-transcribe.d.ts +0 -14
  633. package/dist/integrations/composite-ai/document-transcribe.js +0 -89
  634. package/dist/integrations/composite-ai/document-transcribe.js.map +0 -1
  635. package/dist/nuxt/runtime/server/api/ai/chat.post.d.ts +0 -5
  636. package/dist/nuxt/runtime/server/api/ai/chat.post.js +0 -8
  637. package/dist/nuxt/runtime/server/api/ai/chat.post.js.map +0 -1
  638. package/dist/nuxt/runtime/server/api/ai/complete.post.d.ts +0 -5
  639. package/dist/nuxt/runtime/server/api/ai/complete.post.js +0 -8
  640. package/dist/nuxt/runtime/server/api/ai/complete.post.js.map +0 -1
  641. package/dist/nuxt/runtime/server/api/ai/generate.post.d.ts +0 -5
  642. package/dist/nuxt/runtime/server/api/ai/generate.post.js +0 -8
  643. package/dist/nuxt/runtime/server/api/ai/generate.post.js.map +0 -1
  644. package/dist/nuxt/runtime/server/api/ai/models.get.d.ts +0 -5
  645. package/dist/nuxt/runtime/server/api/ai/models.get.js +0 -8
  646. package/dist/nuxt/runtime/server/api/ai/models.get.js.map +0 -1
  647. package/dist/nuxt/runtime/server/api/ai/transcribe.post.d.ts +0 -5
  648. package/dist/nuxt/runtime/server/api/ai/transcribe.post.js +0 -8
  649. package/dist/nuxt/runtime/server/api/ai/transcribe.post.js.map +0 -1
  650. package/dist/nuxt/runtime/server/api/ai/transcript-cleanup.post.d.ts +0 -5
  651. package/dist/nuxt/runtime/server/api/ai/transcript-cleanup.post.js +0 -8
  652. package/dist/nuxt/runtime/server/api/ai/transcript-cleanup.post.js.map +0 -1
  653. package/dist/nuxt/runtime/server/api/editor/assets/[id]/[name].get.d.ts +0 -5
  654. package/dist/nuxt/runtime/server/api/editor/assets/[id]/[name].get.js +0 -8
  655. package/dist/nuxt/runtime/server/api/editor/assets/[id]/[name].get.js.map +0 -1
  656. package/dist/nuxt/runtime/server/api/editor/assets/[id].post.d.ts +0 -5
  657. package/dist/nuxt/runtime/server/api/editor/assets/[id].post.js +0 -8
  658. package/dist/nuxt/runtime/server/api/editor/assets/[id].post.js.map +0 -1
  659. package/dist/nuxt/runtime/server/api/editor/settings.get.d.ts +0 -5
  660. package/dist/nuxt/runtime/server/api/editor/settings.get.js +0 -8
  661. package/dist/nuxt/runtime/server/api/editor/settings.get.js.map +0 -1
  662. package/dist/nuxt/runtime/server/api/editor/settings.put.d.ts +0 -5
  663. package/dist/nuxt/runtime/server/api/editor/settings.put.js +0 -8
  664. package/dist/nuxt/runtime/server/api/editor/settings.put.js.map +0 -1
  665. package/dist/nuxt/runtime/server/api/editor/tags.get.d.ts +0 -5
  666. package/dist/nuxt/runtime/server/api/editor/tags.get.js +0 -8
  667. package/dist/nuxt/runtime/server/api/editor/tags.get.js.map +0 -1
  668. package/dist/nuxt/runtime/server/api/editor/themes/[id].delete.d.ts +0 -5
  669. package/dist/nuxt/runtime/server/api/editor/themes/[id].delete.js +0 -8
  670. package/dist/nuxt/runtime/server/api/editor/themes/[id].delete.js.map +0 -1
  671. package/dist/nuxt/runtime/server/api/editor/themes/[id].get.d.ts +0 -5
  672. package/dist/nuxt/runtime/server/api/editor/themes/[id].get.js +0 -8
  673. package/dist/nuxt/runtime/server/api/editor/themes/[id].get.js.map +0 -1
  674. package/dist/nuxt/runtime/server/api/editor/themes/index.get.d.ts +0 -5
  675. package/dist/nuxt/runtime/server/api/editor/themes/index.get.js +0 -8
  676. package/dist/nuxt/runtime/server/api/editor/themes/index.get.js.map +0 -1
  677. package/dist/nuxt/runtime/server/api/editor/themes/index.post.d.ts +0 -5
  678. package/dist/nuxt/runtime/server/api/editor/themes/index.post.js +0 -8
  679. package/dist/nuxt/runtime/server/api/editor/themes/index.post.js.map +0 -1
  680. package/dist/nuxt/runtime/server/api/editor/users.get.d.ts +0 -5
  681. package/dist/nuxt/runtime/server/api/editor/users.get.js +0 -8
  682. package/dist/nuxt/runtime/server/api/editor/users.get.js.map +0 -1
  683. package/dist/nuxt/runtime/server/plugins/collab.d.ts +0 -5
  684. package/dist/nuxt/runtime/server/plugins/collab.js +0 -10
  685. package/dist/nuxt/runtime/server/plugins/collab.js.map +0 -1
  686. package/dist/nuxt/runtime/server/routes/collab/[id].d.ts +0 -5
  687. package/dist/nuxt/runtime/server/routes/collab/[id].js +0 -35
  688. package/dist/nuxt/runtime/server/routes/collab/[id].js.map +0 -1
  689. package/dist/nuxt/runtime/server/utils/editor-route.d.ts +0 -11
  690. package/dist/nuxt/runtime/server/utils/editor-route.js.map +0 -1
  691. package/dist/presets/advanced.d.ts +0 -33
  692. package/dist/presets/advanced.js +0 -50
  693. package/dist/presets/advanced.js.map +0 -1
  694. package/dist/presets/simple.d.ts +0 -9
  695. package/dist/presets/simple.js +0 -12
  696. package/dist/presets/simple.js.map +0 -1
  697. package/dist/react/advanced-preset.d.ts +0 -11
  698. package/dist/react/advanced-preset.js +0 -31
  699. package/dist/react/advanced-preset.js.map +0 -1
  700. package/dist/vue/advanced-preset.d.ts +0 -13
  701. package/dist/vue/advanced-preset.js +0 -33
  702. package/dist/vue/advanced-preset.js.map +0 -1
  703. package/docs/extending.md +0 -538
  704. package/docs/integration.md +0 -632
  705. package/docs/llms.md +0 -383
  706. package/docs/usage.md +0 -1076
@@ -1 +1 @@
1
- {"version":3,"file":"CompositeChrome.js","names":["_unref","_openBlock","_createBlock","_Teleport","_createElementVNode","_createElementBlock","_Fragment","_renderList","_withCtx","_createVNode","CompositeDetails","_normalizeClass","_normalizeStyle","_withKeys","_withModifiers","_createCommentVNode","CompositeStatusMenu","_createTextVNode","_toDisplayString","CompositeTagsEditor"],"sources":["../../../../src/features/composites/components/CompositeChrome.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport type { Editor } from '@tiptap/vue-3'\nimport { computed, shallowRef, watch } from 'vue'\nimport { startBlockDrag } from '../../../core'\nimport { useUiKit } from '../../../vue/kit/use-ui-kit'\nimport { useEditorI18n } from '../../../vue/use-editor-i18n'\nimport { useEditorSettings } from '../../../vue/settings'\nimport { compositeSectionOf } from '../anchors'\nimport { rowStatus } from '../meta-display'\nimport { compositeOfRow, type CompositeRow, setCompositeTags } from '../rows'\nimport { useCompositeAnchors } from '../use-composite-anchors'\nimport { useCompositeRows } from '../use-composite-rows'\nimport CompositeDetails from './CompositeDetails.vue'\nimport CompositeStatusMenu from './CompositeStatusMenu.vue'\nimport CompositeTagsEditor from './CompositeTagsEditor.vue'\n\n/**\n * Chrome of every composite, laid over the editor (mounted by the composites feature): on the title line the status\n * chip and one chip per tag (with a `+` chip to add tags), and on the front the kind icon. The icon is a button that\n * opens the details popover (kind with a confirmation before it changes, the kind's fields and the summary;\n * `CompositeDetails`) and, in an editable editor, the composite's drag handle: dragging it moves the composite\n * (`startBlockDrag`). With `blocks.kindIcon: 'hover'` it shows only while the composite is hovered, its popover is\n * open or the icon has keyboard focus. Chips and popover also render in read-only editors, without edit affordances.\n * The node view's own description and tags rows are hidden by CSS; this overlay shows and edits them.\n */\nconst props = defineProps<{ editor: Editor }>()\n\nconst { Icon: UIcon, Popover: UPopover } = useUiKit()\nconst { t } = useEditorI18n()\n\nconst { rows } = useCompositeRows(() => props.editor)\nconst { host, anchors, frame } = useCompositeAnchors(() => props.editor, rows)\n\n// `isEditable` is not reactive: follow it on every transaction (`EditorSurface` dispatches one after `setEditable`).\nconst editable = shallowRef(false)\nwatch(() => props.editor, (instance, _previous, onCleanup) => {\n editable.value = !instance.isDestroyed && instance.isEditable\n const sync = () => {\n editable.value = !instance.isDestroyed && instance.isEditable\n }\n instance.on('transaction', sync)\n onCleanup(() => instance.off('transaction', sync))\n}, { immediate: true })\n\nconst { settings } = useEditorSettings()\nconst iconOnHover = computed(() => settings.value.blocks.kindIcon === 'hover')\n\n// Hover state of `kindIcon: 'hover'`: the keys of the rows whose composite is under the pointer (that one and every\n// composite around it), plus the row whose chips the pointer is on (they sit outside the editor's DOM).\nconst hoveredKeys = shallowRef<ReadonlySet<string>>(new Set())\nconst chipsHoveredKey = shallowRef<string | null>(null)\nlet hoveredSection: Element | null = null\n\nfunction onEditorMouseover(event: MouseEvent) {\n const section = event.target instanceof Element ? event.target.closest('.composite') : null\n if (section === hoveredSection) return\n hoveredSection = section\n const chain = new Set<Element>()\n for (let el = section; el; el = el.parentElement?.closest('.composite') ?? null) chain.add(el)\n const { view, state } = props.editor\n hoveredKeys.value = new Set(rows.value.filter((row) => {\n const found = compositeOfRow(state.doc, row)\n const dom = found ? view.nodeDOM(found.pos) : null\n const section = dom instanceof Element ? compositeSectionOf(dom) : null\n return section !== null && chain.has(section)\n }).map(row => row.key))\n}\n\nfunction onEditorMouseleave() {\n hoveredSection = null\n hoveredKeys.value = new Set()\n}\n\nwatch([() => props.editor, iconOnHover], ([instance, hover], _previous, onCleanup) => {\n onEditorMouseleave()\n if (!hover || instance.isDestroyed) return\n const { dom } = instance.view\n dom.addEventListener('mouseover', onEditorMouseover)\n dom.addEventListener('mouseleave', onEditorMouseleave)\n onCleanup(() => {\n dom.removeEventListener('mouseover', onEditorMouseover)\n dom.removeEventListener('mouseleave', onEditorMouseleave)\n })\n}, { immediate: true })\n\nfunction onIconDragStart(event: DragEvent, row: CompositeRow) {\n const found = compositeOfRow(props.editor.state.doc, row)\n if (!found || !startBlockDrag(props.editor, event, found.pos)) event.preventDefault()\n}\n\n/** Chips start right after the title's last character and run on to the editor's right edge. */\nconst ROW_HEIGHT = 24\n\nconst placed = computed(() => rows.value.flatMap((row) => {\n const anchor = anchors.value.get(row.key)\n if (!anchor) return []\n // An empty title shows a placeholder the anchor cannot measure: keep clear of it.\n const left = anchor.lineEnd + (anchor.titleEmpty ? 116 : 12)\n return [{\n row,\n anchor,\n left,\n top: anchor.lastCenter - ROW_HEIGHT / 2,\n width: Math.max((frame.value?.right ?? anchor.right) - left, 120),\n status: rowStatus(row, t),\n }]\n}))\n\nfunction removeTag(row: CompositeRow, tag: string) {\n setCompositeTags(props.editor, row, row.tags.filter(candidate => candidate !== tag))\n}\n\nconst chip = 'inline-flex h-5 shrink-0 items-center gap-1 rounded-sm px-1.5 text-xs leading-none whitespace-nowrap text-[var(--sk-muted)]'\nconst chipButton = `${chip} transition-colors duration-150 hover:bg-[var(--sk-bg-elevated)] hover:text-[var(--sk-fg-highlighted)] focus-visible:outline-2 focus-visible:-outline-offset-2 focus-visible:outline-[var(--sk-primary)]`\n\n/** Scale and fade in from the icon (`transform-origin` is Reka's), a bit longer than Nuxt UI's default; `composites.css` defines the keyframes and the reduced-motion override. */\nconst detailsPopoverUi = {\n content: 'composite-popover data-[state=open]:animate-[composite-pop-in_160ms_var(--ease-out)] data-[state=closed]:animate-[composite-pop-out_120ms_var(--ease-out)]',\n}\n</script>\n\n<template>\n <Teleport v-if=\"host\" :to=\"host\">\n <div class=\"absolute left-0 top-0 h-0 w-0\">\n <template v-for=\"item in placed\" :key=\"item.row.key\">\n <UPopover\n v-if=\"item.anchor.toggleSize\"\n :content=\"{ side: 'bottom', align: 'start', sideOffset: 4 }\"\n :ui=\"detailsPopoverUi\"\n >\n <!-- A span, not a `button`: Firefox does not start drags from buttons. -->\n <span\n role=\"button\"\n tabindex=\"0\"\n :draggable=\"editable\"\n :class=\"[\n 'absolute z-10 flex items-center justify-center rounded-sm bg-[var(--sk-bg)] text-[var(--sk-muted)] transition-[color,background-color,opacity] duration-120 motion-reduce:transition-none hover:bg-[var(--sk-bg-elevated)] hover:text-[var(--sk-fg-highlighted)] focus-visible:outline-2 focus-visible:-outline-offset-2 focus-visible:outline-[var(--sk-primary)]',\n editable ? 'cursor-grab active:cursor-grabbing' : 'cursor-pointer',\n iconOnHover && !hoveredKeys.has(item.row.key) && chipsHoveredKey !== item.row.key && 'opacity-0 hover:opacity-100 focus-visible:opacity-100 data-[state=open]:opacity-100',\n ]\"\n :style=\"{ top: `${item.anchor.toggleTop}px`, left: `${item.anchor.toggleLeft}px`, width: `${item.anchor.toggleSize}px`, height: `${item.anchor.toggleSize}px` }\"\n :aria-label=\"t('composites.chrome.details', { kind: item.row.kindLabel })\"\n :title=\"editable ? t('composites.chrome.detailsDrag', { kind: item.row.kindLabel }) : t('composites.chrome.details', { kind: item.row.kindLabel })\"\n @keydown.enter.space.prevent=\"($event.currentTarget as HTMLElement).click()\"\n @dragstart=\"onIconDragStart($event, item.row)\"\n >\n <UIcon :key=\"item.row.icon\" :name=\"item.row.icon\" class=\"size-3.5\" />\n </span>\n <template #content>\n <CompositeDetails :editor=\"editor\" :row=\"item.row\" :editable=\"editable\" />\n </template>\n </UPopover>\n\n <div\n v-if=\"item.status || item.row.tags.length || editable\"\n class=\"absolute z-10 flex items-center gap-px overflow-hidden rounded-md bg-[var(--sk-bg)]\"\n :style=\"{ top: `${item.top}px`, left: `${item.left}px`, maxWidth: `${item.width}px`, height: `${ROW_HEIGHT}px` }\"\n @mouseenter=\"chipsHoveredKey = item.row.key\"\n @mouseleave=\"chipsHoveredKey = null\"\n >\n <template v-if=\"item.status\">\n <CompositeStatusMenu v-if=\"editable\" :editor=\"editor\" :row=\"item.row\">\n <button type=\"button\" :class=\"chipButton\" :aria-label=\"t('composites.status.label', { status: item.status.label })\">\n <UIcon :name=\"item.status.icon\" :class=\"['size-3.5', item.status.color]\" />{{ item.status.label }}\n </button>\n </CompositeStatusMenu>\n <span v-else :class=\"chip\">\n <UIcon :name=\"item.status.icon\" :class=\"['size-3.5', item.status.color]\" />{{ item.status.label }}\n </span>\n </template>\n\n <span v-for=\"tag in item.row.tags\" :key=\"tag\" :class=\"[chip, 'group max-w-40 gap-0']\">\n <span class=\"truncate\">#{{ tag }}</span>\n <button\n v-if=\"editable\"\n type=\"button\"\n class=\"flex h-4 w-0 shrink-0 items-center justify-center overflow-hidden rounded-sm opacity-0 transition-all duration-150 group-hover:ml-1 group-hover:w-4 group-hover:opacity-100 hover:bg-[var(--sk-bg-elevated)] hover:text-[var(--sk-fg-highlighted)] focus-visible:ml-1 focus-visible:w-4 focus-visible:opacity-100 focus-visible:outline-2 focus-visible:outline-[var(--sk-primary)]\"\n :aria-label=\"t('composites.tag.remove', { tag })\"\n @click=\"removeTag(item.row, tag)\"\n >\n <UIcon name=\"i-lucide-x\" class=\"size-3\" />\n </button>\n </span>\n\n <UPopover\n v-if=\"editable\"\n :content=\"{ side: 'bottom', align: 'start', sideOffset: 6, onCloseAutoFocus: (event: Event) => event.preventDefault() }\"\n >\n <button type=\"button\" :class=\"chipButton\" :aria-label=\"t('composites.tag.add')\" :title=\"t('composites.tag.add')\">\n <UIcon name=\"i-lucide-plus\" class=\"size-3.5\" />\n </button>\n <template #content>\n <div class=\"w-64 p-3\">\n <CompositeTagsEditor :editor=\"editor\" :row=\"item.row\" />\n </div>\n </template>\n </UPopover>\n </div>\n </template>\n </div>\n </Teleport>\n</template>\n"],"mappings":"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"}
1
+ {"version":3,"file":"CompositeChrome.js","names":["_unref","_openBlock","_createBlock","_Teleport","_createElementVNode","_createElementBlock","_Fragment","_renderList","_withCtx","_createVNode","CompositeDetails","_normalizeClass","_normalizeStyle","_withKeys","_withModifiers","_createCommentVNode","_createTextVNode","_toDisplayString","CompositeStatusMenu","CompositeTagsEditor"],"sources":["../../../../src/features/composites/components/CompositeChrome.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport type { Editor } from '@tiptap/vue-3'\nimport { computed, shallowRef, watch } from 'vue'\nimport { startBlockDrag } from '../../../core'\nimport { useUiKit } from '../../../vue/kit/use-ui-kit'\nimport { useEditorI18n } from '../../../vue/use-editor-i18n'\nimport { useStoreRef } from '../../../vue/store-ref'\nimport { useEditorSettings } from '../../../vue/settings'\nimport { compositeSectionOf } from '../anchors'\nimport { derivedChromeOf } from '../derived-chrome'\nimport { rowStatus } from '../meta-display'\nimport { compositeOfRow, type CompositeRow, setCompositeTags } from '../rows'\nimport { useCompositeAnchors } from '../use-composite-anchors'\nimport { useCompositeRows } from '../use-composite-rows'\nimport CompositeDetails from './CompositeDetails.vue'\nimport CompositeStatusMenu from './CompositeStatusMenu.vue'\nimport CompositeTagsEditor from './CompositeTagsEditor.vue'\n\n/**\n * Chrome of every composite, laid over the editor (mounted by the composites feature): on the title line the status\n * chip and one chip per tag (with a `+` chip to add tags), and on the front the kind icon. The icon is a button that\n * opens the details popover (kind with a confirmation before it changes, the kind's fields and the summary;\n * `CompositeDetails`) and, in an editable editor, the composite's drag handle: dragging it moves the composite\n * (`startBlockDrag`). A kind with `chrome.tags: false` shows no tag chips and no `+` chip. With `blocks.kindIcon: 'hover'` it shows only while the composite is hovered, its popover is\n * open or the icon has keyboard focus. Chips and popover also render in read-only editors, without edit affordances.\n * The node view's own description and tags rows are hidden by CSS; this overlay shows and edits them.\n */\nconst props = defineProps<{ editor: Editor }>()\n\nconst { Icon: UIcon, Popover: UPopover } = useUiKit()\nconst { t } = useEditorI18n()\n\nconst { rows } = useCompositeRows(() => props.editor)\nconst { host, anchors, frame } = useCompositeAnchors(() => props.editor, rows)\n\n// `isEditable` is not reactive: follow it on every transaction (`EditorSurface` dispatches one after `setEditable`).\nconst editable = shallowRef(false)\nwatch(() => props.editor, (instance, _previous, onCleanup) => {\n editable.value = !instance.isDestroyed && instance.isEditable\n const sync = () => {\n editable.value = !instance.isDestroyed && instance.isEditable\n }\n instance.on('transaction', sync)\n onCleanup(() => instance.off('transaction', sync))\n}, { immediate: true })\n\nconst { settings } = useEditorSettings()\nconst iconOnHover = computed(() => settings.value.blocks.kindIcon === 'hover')\n\n// Hover state of `kindIcon: 'hover'`: the keys of the rows whose composite is under the pointer (that one and every\n// composite around it), plus the row whose chips the pointer is on (they sit outside the editor's DOM).\nconst hoveredKeys = shallowRef<ReadonlySet<string>>(new Set())\nconst chipsHoveredKey = shallowRef<string | null>(null)\nlet hoveredSection: Element | null = null\n\nfunction onEditorMouseover(event: MouseEvent) {\n const section = event.target instanceof Element ? event.target.closest('.composite') : null\n if (section === hoveredSection) return\n hoveredSection = section\n const chain = new Set<Element>()\n for (let el = section; el; el = el.parentElement?.closest('.composite') ?? null) chain.add(el)\n const { view, state } = props.editor\n hoveredKeys.value = new Set(rows.value.filter((row) => {\n const found = compositeOfRow(state.doc, row)\n const dom = found ? view.nodeDOM(found.pos) : null\n const section = dom instanceof Element ? compositeSectionOf(dom) : null\n return section !== null && chain.has(section)\n }).map(row => row.key))\n}\n\nfunction onEditorMouseleave() {\n hoveredSection = null\n hoveredKeys.value = new Set()\n}\n\nwatch([() => props.editor, iconOnHover], ([instance, hover], _previous, onCleanup) => {\n onEditorMouseleave()\n if (!hover || instance.isDestroyed) return\n const { dom } = instance.view\n dom.addEventListener('mouseover', onEditorMouseover)\n dom.addEventListener('mouseleave', onEditorMouseleave)\n onCleanup(() => {\n dom.removeEventListener('mouseover', onEditorMouseover)\n dom.removeEventListener('mouseleave', onEditorMouseleave)\n })\n}, { immediate: true })\n\nfunction onIconDragStart(event: DragEvent, row: CompositeRow) {\n const found = compositeOfRow(props.editor.state.doc, row)\n if (!found || !startBlockDrag(props.editor, event, found.pos)) event.preventDefault()\n}\n\n/** Chips start right after the title's last character and run on to the editor's right edge. */\nconst ROW_HEIGHT = 24\n\nconst expanded = useStoreRef(() => props.editor.storage.composite.expanded)\n\nconst placed = computed(() => {\n // End of the collapsed derived Baustein the rows being walked sit in: its clipped content shows no chrome.\n let hiddenUntil = -1\n return rows.value.flatMap((row) => {\n if (row.pos < hiddenUntil) return []\n const derived = derivedChromeOf(props.editor, row)\n const open = !derived || !row.id || expanded.value.has(row.id)\n if (!open) hiddenUntil = row.end\n const anchor = anchors.value.get(row.key)\n if (!anchor) return []\n // An empty title shows a placeholder the anchor cannot measure: keep clear of it.\n const left = anchor.lineEnd + (anchor.titleEmpty ? 116 : 12)\n return [{\n row,\n anchor,\n left,\n top: anchor.lastCenter - ROW_HEIGHT / 2,\n width: Math.max((frame.value?.right ?? anchor.right) - left, 120),\n status: rowStatus(row, t),\n derived: derived && { stale: derived.stale, open, toggleable: !!row.id },\n }]\n })\n})\n\nfunction toggleExpanded(row: CompositeRow) {\n if (row.id) props.editor.commands.toggleCompositeExpanded(row.id)\n}\n\nfunction removeTag(row: CompositeRow, tag: string) {\n setCompositeTags(props.editor, row, row.tags.filter(candidate => candidate !== tag))\n}\n\nconst chip = 'inline-flex h-5 shrink-0 items-center gap-1 rounded-sm px-1.5 text-xs leading-none whitespace-nowrap text-[var(--sk-muted)]'\nconst chipButton = `${chip} transition-colors duration-150 hover:bg-[var(--sk-bg-elevated)] hover:text-[var(--sk-fg-highlighted)] focus-visible:outline-2 focus-visible:-outline-offset-2 focus-visible:outline-[var(--sk-primary)]`\n\n/** Scale and fade in from the icon (`transform-origin` is Reka's), a bit longer than Nuxt UI's default; `composites.css` defines the keyframes and the reduced-motion override. */\nconst detailsPopoverUi = {\n content: 'composite-popover data-[state=open]:animate-[composite-pop-in_160ms_var(--ease-out)] data-[state=closed]:animate-[composite-pop-out_120ms_var(--ease-out)]',\n}\n</script>\n\n<template>\n <Teleport v-if=\"host\" :to=\"host\">\n <div class=\"absolute left-0 top-0 h-0 w-0\">\n <template v-for=\"item in placed\" :key=\"item.row.key\">\n <UPopover\n v-if=\"item.anchor.toggleSize\"\n :content=\"{ side: 'bottom', align: 'start', sideOffset: 4 }\"\n :ui=\"detailsPopoverUi\"\n >\n <!-- A span, not a `button`: Firefox does not start drags from buttons. -->\n <span\n role=\"button\"\n tabindex=\"0\"\n :draggable=\"editable\"\n :class=\"[\n 'absolute z-10 flex items-center justify-center rounded-sm bg-[var(--sk-bg)] text-[var(--sk-muted)] transition-[color,background-color,opacity] duration-120 motion-reduce:transition-none hover:bg-[var(--sk-bg-elevated)] hover:text-[var(--sk-fg-highlighted)] focus-visible:outline-2 focus-visible:-outline-offset-2 focus-visible:outline-[var(--sk-primary)]',\n editable ? 'cursor-grab active:cursor-grabbing' : 'cursor-pointer',\n iconOnHover && !hoveredKeys.has(item.row.key) && chipsHoveredKey !== item.row.key && 'opacity-0 hover:opacity-100 focus-visible:opacity-100 data-[state=open]:opacity-100',\n ]\"\n :style=\"{ top: `${item.anchor.toggleTop}px`, left: `${item.anchor.toggleLeft}px`, width: `${item.anchor.toggleSize}px`, height: `${item.anchor.toggleSize}px` }\"\n :aria-label=\"t('composites.chrome.details', { kind: item.row.kindLabel })\"\n :title=\"editable ? t('composites.chrome.detailsDrag', { kind: item.row.kindLabel }) : t('composites.chrome.details', { kind: item.row.kindLabel })\"\n @keydown.enter.space.prevent=\"($event.currentTarget as HTMLElement).click()\"\n @dragstart=\"onIconDragStart($event, item.row)\"\n >\n <UIcon :key=\"item.row.icon\" :name=\"item.row.icon\" class=\"size-3.5\" />\n </span>\n <template #content>\n <CompositeDetails :editor=\"editor\" :row=\"item.row\" :editable=\"editable\" />\n </template>\n </UPopover>\n\n <div\n v-if=\"item.status || item.derived || (item.row.tagsVisible && (item.row.tags.length || editable))\"\n class=\"absolute z-10 flex items-center gap-px overflow-hidden rounded-md bg-[var(--sk-bg)]\"\n :style=\"{ top: `${item.top}px`, left: `${item.left}px`, maxWidth: `${item.width}px`, height: `${ROW_HEIGHT}px` }\"\n @mouseenter=\"chipsHoveredKey = item.row.key\"\n @mouseleave=\"chipsHoveredKey = null\"\n >\n <template v-if=\"item.derived\">\n <button\n v-if=\"item.derived.toggleable\"\n type=\"button\"\n :class=\"chipButton\"\n :aria-expanded=\"item.derived.open\"\n :aria-label=\"t(item.derived.open ? 'composites.derivation.collapse' : 'composites.derivation.expand')\"\n :title=\"t(item.derived.open ? 'composites.derivation.collapse' : 'composites.derivation.expand')\"\n @click=\"toggleExpanded(item.row)\"\n >\n <UIcon :name=\"item.derived.open ? 'i-lucide-chevron-down' : 'i-lucide-chevron-right'\" class=\"size-3.5\" />\n </button>\n <span :class=\"chip\">\n <UIcon name=\"i-lucide-git-branch\" class=\"size-3.5\" />{{ t('composites.derivation.badge') }}\n </span>\n <span v-if=\"item.derived.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 </template>\n\n <template v-if=\"item.status\">\n <CompositeStatusMenu v-if=\"editable\" :editor=\"editor\" :row=\"item.row\">\n <button type=\"button\" :class=\"chipButton\" :aria-label=\"t('composites.status.label', { status: item.status.label })\">\n <UIcon :name=\"item.status.icon\" :class=\"['size-3.5', item.status.color]\" />{{ item.status.label }}\n </button>\n </CompositeStatusMenu>\n <span v-else :class=\"chip\">\n <UIcon :name=\"item.status.icon\" :class=\"['size-3.5', item.status.color]\" />{{ item.status.label }}\n </span>\n </template>\n\n <span v-for=\"tag in item.row.tagsVisible ? item.row.tags : []\" :key=\"tag\" :class=\"[chip, 'group max-w-40 gap-0']\">\n <span class=\"truncate\">#{{ tag }}</span>\n <button\n v-if=\"editable\"\n type=\"button\"\n class=\"flex h-4 w-0 shrink-0 items-center justify-center overflow-hidden rounded-sm opacity-0 transition-all duration-150 group-hover:ml-1 group-hover:w-4 group-hover:opacity-100 hover:bg-[var(--sk-bg-elevated)] hover:text-[var(--sk-fg-highlighted)] focus-visible:ml-1 focus-visible:w-4 focus-visible:opacity-100 focus-visible:outline-2 focus-visible:outline-[var(--sk-primary)]\"\n :aria-label=\"t('composites.tag.remove', { tag })\"\n @click=\"removeTag(item.row, tag)\"\n >\n <UIcon name=\"i-lucide-x\" class=\"size-3\" />\n </button>\n </span>\n\n <UPopover\n v-if=\"editable && item.row.tagsVisible\"\n :content=\"{ side: 'bottom', align: 'start', sideOffset: 6, onCloseAutoFocus: (event: Event) => event.preventDefault() }\"\n >\n <button type=\"button\" :class=\"chipButton\" :aria-label=\"t('composites.tag.add')\" :title=\"t('composites.tag.add')\">\n <UIcon name=\"i-lucide-plus\" class=\"size-3.5\" />\n </button>\n <template #content>\n <div class=\"w-64 p-3\">\n <CompositeTagsEditor :editor=\"editor\" :row=\"item.row\" />\n </div>\n </template>\n </UPopover>\n </div>\n </template>\n </div>\n </Teleport>\n</template>\n"],"mappings":"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"}
@@ -5,7 +5,7 @@ import { Editor } from "@tiptap/vue-3";
5
5
  * chip and one chip per tag (with a `+` chip to add tags), and on the front the kind icon. The icon is a button that
6
6
  * opens the details popover (kind with a confirmation before it changes, the kind's fields and the summary;
7
7
  * `CompositeDetails`) and, in an editable editor, the composite's drag handle: dragging it moves the composite
8
- * (`startBlockDrag`). With `blocks.kindIcon: 'hover'` it shows only while the composite is hovered, its popover is
8
+ * (`startBlockDrag`). A kind with `chrome.tags: false` shows no tag chips and no `+` chip. With `blocks.kindIcon: 'hover'` it shows only while the composite is hovered, its popover is
9
9
  * open or the icon has keyboard focus. Chips and popover also render in read-only editors, without edit affordances.
10
10
  * The node view's own description and tags rows are hidden by CSS; this overlay shows and edits them.
11
11
  */
@@ -1,9 +1,12 @@
1
+ import { keepsMetaKey } from "../meta-keys.js";
2
+ import { derivationOf } from "../derivation.js";
1
3
  import { compositeKindsOf } from "../nodes.js";
2
4
  import { useUiKit } from "../../../vue/kit/use-ui-kit.js";
3
5
  import { useEditorI18n } from "../../../vue/use-editor-i18n.js";
4
- import { compositeOfRow } from "../rows.js";
5
- import _sfc_main$1 from "./CompositeFieldEditor.js";
6
- import _sfc_main$2 from "./CompositeSummaryEditor.js";
6
+ import { compositeBacklinks, compositeOfRow } from "../rows.js";
7
+ import _sfc_main$1 from "./DerivationBadge.js";
8
+ import _sfc_main$2 from "./CompositeFieldEditor.js";
9
+ import _sfc_main$3 from "./CompositeSummaryEditor.js";
7
10
  import { Fragment, computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createVNode, defineComponent, openBlock, ref, renderList, toDisplayString, unref, watch } from "vue";
8
11
  //#region src/features/composites/components/CompositeDetails.vue
9
12
  const _hoisted_1 = { class: "flex w-72 flex-col gap-2.5 p-3 text-sm" };
@@ -29,10 +32,23 @@ const _hoisted_10 = { class: "flex justify-end gap-1.5" };
29
32
  const _hoisted_11 = { class: "text-xs text-[var(--sk-muted)]" };
30
33
  const _hoisted_12 = { class: "flex flex-col gap-1" };
31
34
  const _hoisted_13 = { class: "text-xs text-[var(--sk-muted)]" };
35
+ const _hoisted_14 = {
36
+ key: 4,
37
+ class: "flex flex-col gap-1"
38
+ };
39
+ const _hoisted_15 = { class: "text-xs text-[var(--sk-muted)]" };
40
+ const _hoisted_16 = { class: "flex flex-col gap-0.5" };
41
+ const _hoisted_17 = ["onClick"];
42
+ const _hoisted_18 = { class: "truncate" };
43
+ const _hoisted_19 = {
44
+ key: 0,
45
+ class: "shrink-0 text-[var(--sk-muted)]"
46
+ };
32
47
  /**
33
48
  * Content of the popover on a composite's front icon: the kind (a select, plain text while read-only), every field of
34
49
  * the kind except the status (its chip edits it) and the summary. Choosing another kind first shows an inline warning
35
- * that names the field values the switch drops (`setCompositeKind` keeps only meta keys the new kind declares) and
50
+ * that names the field values the switch drops (`setCompositeKind` keeps the meta keys the new kind declares, plus
51
+ * `derivation` and `bib`, see `keepsMetaKey`) and
36
52
  * applies the change on „Ändern“.
37
53
  */
38
54
  const _sfc_main = /*@__PURE__*/ defineComponent({
@@ -52,19 +68,25 @@ const _sfc_main = /*@__PURE__*/ defineComponent({
52
68
  label: kind.label,
53
69
  icon: kind.icon
54
70
  })));
55
- const fields = computed(() => props.row.fields.filter((field) => field.key !== "status"));
71
+ const fields = computed(() => props.row.fields.filter((field) => field.key !== "status" && field.type !== "derivation"));
72
+ /** The row's Baustein when it is derived (has a `meta.derivation`). */
73
+ const derivedNode = computed(() => {
74
+ const found = compositeOfRow(props.editor.state.doc, props.row);
75
+ return found && derivationOf(found.node) ? found.node : null;
76
+ });
77
+ /** The places that refer to the row's Baustein (chips in other blocks, `reference` fields), for the „Verweise“ list. */
78
+ const backlinks = computed(() => props.row.id ? compositeBacklinks(props.editor.state.doc, kinds.value, props.row.id) : []);
56
79
  /** The kind chosen in the select, waiting for the confirmation. */
57
80
  const pending = ref(null);
58
81
  watch(() => props.row.kind, () => {
59
82
  pending.value = null;
60
83
  });
61
84
  const pendingLabel = computed(() => kinds.value.find((kind) => kind.id === pending.value)?.label ?? "");
62
- /** Field values of the row that the pending kind does not declare, as „Label: value“. */
85
+ /** Field values of the row that the pending kind does not keep (`keepsMetaKey`), as „Label: value“. */
63
86
  const lost = computed(() => {
64
87
  const target = kinds.value.find((kind) => kind.id === pending.value);
65
88
  if (!target) return [];
66
- const kept = new Set(target.fields.map((field) => field.key));
67
- return Object.entries(props.row.meta).filter(([key, value]) => !kept.has(key) && value != null && value !== "").map(([key, value]) => {
89
+ return Object.entries(props.row.meta).filter(([key, value]) => !keepsMetaKey(target, key) && value != null && value !== "").map(([key, value]) => {
68
90
  const field = props.row.fields.find((candidate) => candidate.key === key);
69
91
  const text = typeof value === "object" ? JSON.stringify(value) : String(value);
70
92
  return {
@@ -122,11 +144,17 @@ const _sfc_main = /*@__PURE__*/ defineComponent({
122
144
  label: unref(t)("composites.details.change"),
123
145
  onClick: apply
124
146
  }, null, 8, ["label"])])])) : createCommentVNode("v-if", true),
147
+ derivedNode.value ? (openBlock(), createBlock(_sfc_main$1, {
148
+ key: 3,
149
+ editor: __props.editor,
150
+ node: derivedNode.value,
151
+ detailed: ""
152
+ }, null, 8, ["editor", "node"])) : createCommentVNode("v-if", true),
125
153
  (openBlock(true), createElementBlock(Fragment, null, renderList(fields.value, (field) => {
126
154
  return openBlock(), createElementBlock("div", {
127
155
  key: field.key,
128
156
  class: "flex flex-col gap-1"
129
- }, [createElementVNode("span", _hoisted_11, toDisplayString(field.label), 1), createVNode(_sfc_main$1, {
157
+ }, [createElementVNode("span", _hoisted_11, toDisplayString(field.label), 1), createVNode(_sfc_main$2, {
130
158
  editor: __props.editor,
131
159
  row: __props.row,
132
160
  field,
@@ -139,7 +167,7 @@ const _sfc_main = /*@__PURE__*/ defineComponent({
139
167
  "disabled"
140
168
  ])]);
141
169
  }), 128)),
142
- createElementVNode("div", _hoisted_12, [createElementVNode("span", _hoisted_13, toDisplayString(unref(t)("composites.details.summary")), 1), createVNode(_sfc_main$2, {
170
+ createElementVNode("div", _hoisted_12, [createElementVNode("span", _hoisted_13, toDisplayString(unref(t)("composites.details.summary")), 1), createVNode(_sfc_main$3, {
143
171
  editor: __props.editor,
144
172
  row: __props.row,
145
173
  readonly: !__props.editable
@@ -147,7 +175,14 @@ const _sfc_main = /*@__PURE__*/ defineComponent({
147
175
  "editor",
148
176
  "row",
149
177
  "readonly"
150
- ])])
178
+ ])]),
179
+ backlinks.value.length ? (openBlock(), createElementBlock("div", _hoisted_14, [createElementVNode("span", _hoisted_15, toDisplayString(unref(t)("composites.reference.backlinks")), 1), createElementVNode("ul", _hoisted_16, [(openBlock(true), createElementBlock(Fragment, null, renderList(backlinks.value, (link, index) => {
180
+ return openBlock(), createElementBlock("li", { key: `${link.from}:${index}` }, [createElementVNode("button", {
181
+ type: "button",
182
+ class: "flex w-full min-w-0 items-baseline gap-1 rounded-sm text-left text-xs text-[var(--sk-fg)] hover:text-[var(--sk-primary)] focus-visible:outline-2 focus-visible:outline-[var(--sk-primary)]",
183
+ onClick: ($event) => __props.editor.commands.revealBlock(link.from)
184
+ }, [createElementVNode("span", _hoisted_18, toDisplayString(link.excerpt || "…"), 1), link.locator ? (openBlock(), createElementBlock("span", _hoisted_19, toDisplayString(link.locator), 1)) : createCommentVNode("v-if", true)], 8, _hoisted_17)]);
185
+ }), 128))])])) : createCommentVNode("v-if", true)
151
186
  ]);
152
187
  };
153
188
  }
@@ -1 +1 @@
1
- {"version":3,"file":"CompositeDetails.js","names":["_openBlock","_createElementBlock","_createBlock","_unref","_createElementVNode","_toDisplayString","_Fragment","_renderList","_createVNode","_createCommentVNode","CompositeFieldEditor","CompositeSummaryEditor"],"sources":["../../../../src/features/composites/components/CompositeDetails.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport type { Editor } from '@tiptap/vue-3'\nimport { computed, ref, watch } from 'vue'\nimport { useUiKit } from '../../../vue/kit/use-ui-kit'\nimport { useEditorI18n } from '../../../vue/use-editor-i18n'\nimport { compositeKindsOf } from '../nodes'\nimport { compositeOfRow, type CompositeRow } from '../rows'\nimport CompositeFieldEditor from './CompositeFieldEditor.vue'\nimport CompositeSummaryEditor from './CompositeSummaryEditor.vue'\n\n/**\n * Content of the popover on a composite's front icon: the kind (a select, plain text while read-only), every field of\n * the kind except the status (its chip edits it) and the summary. Choosing another kind first shows an inline warning\n * that names the field values the switch drops (`setCompositeKind` keeps only meta keys the new kind declares) and\n * applies the change on „Ändern“.\n */\nconst props = defineProps<{ editor: Editor, row: CompositeRow, editable: boolean }>()\n\nconst { Button: UButton, Icon: UIcon, Select: USelect } = useUiKit()\nconst { t } = useEditorI18n()\n\nconst kinds = computed(() => compositeKindsOf(props.editor))\nconst kindItems = computed(() => kinds.value.map(kind => ({ value: kind.id, label: kind.label, icon: kind.icon })))\nconst fields = computed(() => props.row.fields.filter(field => field.key !== 'status'))\n\n/** The kind chosen in the select, waiting for the confirmation. */\nconst pending = ref<string | null>(null)\n// The kind changed some other way (undo, inspector, another select): a stale confirmation would be misleading.\nwatch(() => props.row.kind, () => {\n pending.value = null\n})\n\nconst pendingLabel = computed(() => kinds.value.find(kind => kind.id === pending.value)?.label ?? '')\n\n/** Field values of the row that the pending kind does not declare, as „Label: value“. */\nconst lost = computed(() => {\n const target = kinds.value.find(kind => kind.id === pending.value)\n if (!target) return []\n const kept = new Set(target.fields.map(field => field.key))\n return Object.entries(props.row.meta)\n .filter(([key, value]) => !kept.has(key) && value != null && value !== '')\n .map(([key, value]) => {\n const field = props.row.fields.find(candidate => candidate.key === key)\n const text = typeof value === 'object' ? JSON.stringify(value) : String(value)\n return { key, label: field?.label ?? key, text: field?.options?.find(option => option.value === text)?.label ?? text }\n })\n})\n\nfunction onKind(kind: unknown) {\n pending.value = typeof kind === 'string' && kind !== props.row.kind ? kind : null\n}\n\nfunction apply() {\n const kind = pending.value\n pending.value = null\n const found = compositeOfRow(props.editor.state.doc, props.row)\n if (kind && found) props.editor.commands.setCompositeKind(kind, found.pos)\n}\n</script>\n\n<template>\n <div class=\"flex w-72 flex-col gap-2.5 p-3 text-sm\">\n <USelect\n v-if=\"editable\"\n :model-value=\"row.kind\"\n :items=\"kindItems\"\n size=\"xs\"\n class=\"w-full\"\n :aria-label=\"t('composites.kind.select')\"\n @update:model-value=\"onKind\"\n />\n <p v-else class=\"flex min-w-0 items-center gap-1.5 text-[var(--sk-fg-highlighted)]\">\n <UIcon :key=\"row.icon\" :name=\"row.icon\" class=\"size-4 shrink-0 text-[var(--sk-muted)]\" />\n <span class=\"truncate\">{{ row.kindLabel }}</span>\n </p>\n\n <div v-if=\"pending\" role=\"alert\" class=\"flex flex-col gap-2 rounded-md bg-[color-mix(in_oklab,var(--sk-warning)_10%,transparent)] p-2 text-xs text-[var(--sk-fg)] ring ring-[color-mix(in_oklab,var(--sk-warning)_40%,transparent)]\">\n <template v-if=\"lost.length\">\n <p class=\"font-medium\">\n {{ t('composites.details.confirmLost', { kind: pendingLabel }) }}\n </p>\n <ul class=\"flex flex-col gap-0.5\">\n <li v-for=\"item in lost\" :key=\"item.key\" class=\"flex min-w-0 gap-1\">\n <span class=\"shrink-0 text-[var(--sk-muted)]\">{{ item.label }}:</span>\n <span class=\"truncate\" :title=\"item.text\">{{ item.text }}</span>\n </li>\n </ul>\n </template>\n <p v-else class=\"font-medium\">\n {{ t('composites.details.confirm') }}\n </p>\n <div class=\"flex justify-end gap-1.5\">\n <UButton size=\"xs\" color=\"neutral\" variant=\"ghost\" :label=\"t('composites.details.cancel')\" @click=\"pending = null\" />\n <UButton size=\"xs\" color=\"warning\" :label=\"t('composites.details.change')\" @click=\"apply\" />\n </div>\n </div>\n\n <div v-for=\"field in fields\" :key=\"field.key\" class=\"flex flex-col gap-1\">\n <span class=\"text-xs text-[var(--sk-muted)]\">{{ field.label }}</span>\n <CompositeFieldEditor :editor=\"editor\" :row=\"row\" :field=\"field\" :disabled=\"!editable\" size=\"xs\" />\n </div>\n\n <div class=\"flex flex-col gap-1\">\n <span class=\"text-xs text-[var(--sk-muted)]\">{{ t('composites.details.summary') }}</span>\n <CompositeSummaryEditor :editor=\"editor\" :row=\"row\" :readonly=\"!editable\" />\n </div>\n </div>\n</template>\n"],"mappings":"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"}
1
+ {"version":3,"file":"CompositeDetails.js","names":["_openBlock","_createElementBlock","_createBlock","_unref","_createElementVNode","_toDisplayString","_Fragment","_renderList","_createVNode","_createCommentVNode","DerivationBadge","CompositeFieldEditor","CompositeSummaryEditor"],"sources":["../../../../src/features/composites/components/CompositeDetails.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport type { Editor } from '@tiptap/vue-3'\nimport { computed, ref, watch } from 'vue'\nimport { useUiKit } from '../../../vue/kit/use-ui-kit'\nimport { useEditorI18n } from '../../../vue/use-editor-i18n'\nimport { derivationOf } from '../derivation'\nimport { keepsMetaKey } from '../meta-keys'\nimport { compositeKindsOf } from '../nodes'\nimport { compositeBacklinks, compositeOfRow, type CompositeRow } from '../rows'\nimport CompositeFieldEditor from './CompositeFieldEditor.vue'\nimport DerivationBadge from './DerivationBadge.vue'\nimport CompositeSummaryEditor from './CompositeSummaryEditor.vue'\n\n/**\n * Content of the popover on a composite's front icon: the kind (a select, plain text while read-only), every field of\n * the kind except the status (its chip edits it) and the summary. Choosing another kind first shows an inline warning\n * that names the field values the switch drops (`setCompositeKind` keeps the meta keys the new kind declares, plus\n * `derivation` and `bib`, see `keepsMetaKey`) and\n * applies the change on „Ändern“.\n */\nconst props = defineProps<{ editor: Editor, row: CompositeRow, editable: boolean }>()\n\nconst { Button: UButton, Icon: UIcon, Select: USelect } = useUiKit()\nconst { t } = useEditorI18n()\n\nconst kinds = computed(() => compositeKindsOf(props.editor))\nconst kindItems = computed(() => kinds.value.map(kind => ({ value: kind.id, label: kind.label, icon: kind.icon })))\n// The `derivation` field is shown by the details badge below, with the checks a field display cannot do.\nconst fields = computed(() => props.row.fields.filter(field => field.key !== 'status' && field.type !== 'derivation'))\n\n/** The row's Baustein when it is derived (has a `meta.derivation`). */\nconst derivedNode = computed(() => {\n const found = compositeOfRow(props.editor.state.doc, props.row)\n return found && derivationOf(found.node) ? found.node : null\n})\n\n/** The places that refer to the row's Baustein (chips in other blocks, `reference` fields), for the „Verweise“ list. */\nconst backlinks = computed(() => props.row.id ? compositeBacklinks(props.editor.state.doc, kinds.value, props.row.id) : [])\n\n/** The kind chosen in the select, waiting for the confirmation. */\nconst pending = ref<string | null>(null)\n// The kind changed some other way (undo, inspector, another select): a stale confirmation would be misleading.\nwatch(() => props.row.kind, () => {\n pending.value = null\n})\n\nconst pendingLabel = computed(() => kinds.value.find(kind => kind.id === pending.value)?.label ?? '')\n\n/** Field values of the row that the pending kind does not keep (`keepsMetaKey`), as „Label: value“. */\nconst lost = computed(() => {\n const target = kinds.value.find(kind => kind.id === pending.value)\n if (!target) return []\n return Object.entries(props.row.meta)\n .filter(([key, value]) => !keepsMetaKey(target, key) && value != null && value !== '')\n .map(([key, value]) => {\n const field = props.row.fields.find(candidate => candidate.key === key)\n const text = typeof value === 'object' ? JSON.stringify(value) : String(value)\n return { key, label: field?.label ?? key, text: field?.options?.find(option => option.value === text)?.label ?? text }\n })\n})\n\nfunction onKind(kind: unknown) {\n pending.value = typeof kind === 'string' && kind !== props.row.kind ? kind : null\n}\n\nfunction apply() {\n const kind = pending.value\n pending.value = null\n const found = compositeOfRow(props.editor.state.doc, props.row)\n if (kind && found) props.editor.commands.setCompositeKind(kind, found.pos)\n}\n</script>\n\n<template>\n <div class=\"flex w-72 flex-col gap-2.5 p-3 text-sm\">\n <USelect\n v-if=\"editable\"\n :model-value=\"row.kind\"\n :items=\"kindItems\"\n size=\"xs\"\n class=\"w-full\"\n :aria-label=\"t('composites.kind.select')\"\n @update:model-value=\"onKind\"\n />\n <p v-else class=\"flex min-w-0 items-center gap-1.5 text-[var(--sk-fg-highlighted)]\">\n <UIcon :key=\"row.icon\" :name=\"row.icon\" class=\"size-4 shrink-0 text-[var(--sk-muted)]\" />\n <span class=\"truncate\">{{ row.kindLabel }}</span>\n </p>\n\n <div v-if=\"pending\" role=\"alert\" class=\"flex flex-col gap-2 rounded-md bg-[color-mix(in_oklab,var(--sk-warning)_10%,transparent)] p-2 text-xs text-[var(--sk-fg)] ring ring-[color-mix(in_oklab,var(--sk-warning)_40%,transparent)]\">\n <template v-if=\"lost.length\">\n <p class=\"font-medium\">\n {{ t('composites.details.confirmLost', { kind: pendingLabel }) }}\n </p>\n <ul class=\"flex flex-col gap-0.5\">\n <li v-for=\"item in lost\" :key=\"item.key\" class=\"flex min-w-0 gap-1\">\n <span class=\"shrink-0 text-[var(--sk-muted)]\">{{ item.label }}:</span>\n <span class=\"truncate\" :title=\"item.text\">{{ item.text }}</span>\n </li>\n </ul>\n </template>\n <p v-else class=\"font-medium\">\n {{ t('composites.details.confirm') }}\n </p>\n <div class=\"flex justify-end gap-1.5\">\n <UButton size=\"xs\" color=\"neutral\" variant=\"ghost\" :label=\"t('composites.details.cancel')\" @click=\"pending = null\" />\n <UButton size=\"xs\" color=\"warning\" :label=\"t('composites.details.change')\" @click=\"apply\" />\n </div>\n </div>\n\n <DerivationBadge v-if=\"derivedNode\" :editor=\"editor\" :node=\"derivedNode\" detailed />\n\n <div v-for=\"field in fields\" :key=\"field.key\" class=\"flex flex-col gap-1\">\n <span class=\"text-xs text-[var(--sk-muted)]\">{{ field.label }}</span>\n <CompositeFieldEditor :editor=\"editor\" :row=\"row\" :field=\"field\" :disabled=\"!editable\" size=\"xs\" />\n </div>\n\n <div class=\"flex flex-col gap-1\">\n <span class=\"text-xs text-[var(--sk-muted)]\">{{ t('composites.details.summary') }}</span>\n <CompositeSummaryEditor :editor=\"editor\" :row=\"row\" :readonly=\"!editable\" />\n </div>\n\n <div v-if=\"backlinks.length\" class=\"flex flex-col gap-1\">\n <span class=\"text-xs text-[var(--sk-muted)]\">{{ t('composites.reference.backlinks') }}</span>\n <ul class=\"flex flex-col gap-0.5\">\n <li v-for=\"(link, index) in backlinks\" :key=\"`${link.from}:${index}`\">\n <button\n type=\"button\"\n class=\"flex w-full min-w-0 items-baseline gap-1 rounded-sm text-left text-xs text-[var(--sk-fg)] hover:text-[var(--sk-primary)] focus-visible:outline-2 focus-visible:outline-[var(--sk-primary)]\"\n @click=\"editor.commands.revealBlock(link.from)\"\n >\n <span class=\"truncate\">{{ link.excerpt || '…' }}</span>\n <span v-if=\"link.locator\" class=\"shrink-0 text-[var(--sk-muted)]\">{{ link.locator }}</span>\n </button>\n </li>\n </ul>\n </div>\n </div>\n</template>\n"],"mappings":"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"}
@@ -4,7 +4,8 @@ import { Editor } from "@tiptap/vue-3";
4
4
  /**
5
5
  * Content of the popover on a composite's front icon: the kind (a select, plain text while read-only), every field of
6
6
  * the kind except the status (its chip edits it) and the summary. Choosing another kind first shows an inline warning
7
- * that names the field values the switch drops (`setCompositeKind` keeps only meta keys the new kind declares) and
7
+ * that names the field values the switch drops (`setCompositeKind` keeps the meta keys the new kind declares, plus
8
+ * `derivation` and `bib`, see `keepsMetaKey`) and
8
9
  * applies the change on „Ändern“.
9
10
  */
10
11
  type __VLS_Props = {
@@ -1,8 +1,11 @@
1
1
  import { useUiKit } from "../../../vue/kit/use-ui-kit.js";
2
2
  import { useEditorI18n } from "../../../vue/use-editor-i18n.js";
3
- import { setCompositeMetaField } from "../rows.js";
3
+ import { compositeOfRow, setCompositeMetaField } from "../rows.js";
4
4
  import { metaText } from "../meta-display.js";
5
- import { computed, createBlock, defineComponent, onBeforeUnmount, openBlock, ref, unref, watch, withKeys } from "vue";
5
+ import _sfc_main$1 from "./BibliographyEditor.js";
6
+ import _sfc_main$2 from "./DerivationBadge.js";
7
+ import _sfc_main$3 from "./ReferenceFieldSelect.js";
8
+ import { Fragment, computed, createBlock, createCommentVNode, createElementBlock, defineComponent, onBeforeUnmount, openBlock, ref, unref, watch, withKeys } from "vue";
6
9
  //#region src/features/composites/components/CompositeFieldEditor.vue
7
10
  /**
8
11
  * One meta field of a Baustein as an input that writes through `setCompositeMetaField`. Text-like inputs keep a local
@@ -20,9 +23,16 @@ const _sfc_main = /*@__PURE__*/ defineComponent({
20
23
  },
21
24
  setup(__props) {
22
25
  const props = __props;
23
- const { Input: UInput, Select: USelect, Textarea: UTextarea } = useUiKit();
26
+ const { Input: UInput, InputMenu: UInputMenu, Select: USelect, Textarea: UTextarea } = useUiKit();
24
27
  const { t } = useEditorI18n();
28
+ /** The Baustein a `derivation` field belongs to; the read-only provenance display needs the node, not the field text. */
29
+ const derived = computed(() => props.field.type === "derivation" ? compositeOfRow(props.editor.state.doc, props.row)?.node ?? null : null);
25
30
  const stored = computed(() => metaText(props.row, props.field));
31
+ /** The chosen values of a `multiselect` field (`meta[key]` is a `string[]`). */
32
+ const chosen = computed(() => {
33
+ const value = props.row.meta[props.field.key];
34
+ return Array.isArray(value) ? value.filter((item) => typeof item === "string") : [];
35
+ });
26
36
  const draft = ref(stored.value);
27
37
  const typing = ref(false);
28
38
  let dirty = false;
@@ -50,6 +60,9 @@ const _sfc_main = /*@__PURE__*/ defineComponent({
50
60
  function onChoice(value) {
51
61
  setCompositeMetaField(props.editor, props.row, props.field.key, typeof value === "string" ? value : "");
52
62
  }
63
+ function onChoices(value) {
64
+ setCompositeMetaField(props.editor, props.row, props.field.key, Array.isArray(value) ? value : []);
65
+ }
53
66
  return (_ctx, _cache) => {
54
67
  return __props.field.type === "select" ? (openBlock(), createBlock(unref(USelect), {
55
68
  key: 0,
@@ -68,8 +81,54 @@ const _sfc_main = /*@__PURE__*/ defineComponent({
68
81
  "aria-label",
69
82
  "disabled",
70
83
  "size"
71
- ])) : __props.field.type === "textarea" ? (openBlock(), createBlock(unref(UTextarea), {
84
+ ])) : __props.field.type === "multiselect" ? (openBlock(), createBlock(unref(UInputMenu), {
72
85
  key: 1,
86
+ multiple: "",
87
+ "model-value": chosen.value,
88
+ items: __props.field.options ?? [],
89
+ placeholder: unref(t)("composites.field.choose", { field: __props.field.label }),
90
+ "aria-label": __props.field.label,
91
+ disabled: __props.disabled,
92
+ size: __props.size,
93
+ class: "w-full",
94
+ "onUpdate:modelValue": onChoices
95
+ }, null, 8, [
96
+ "model-value",
97
+ "items",
98
+ "placeholder",
99
+ "aria-label",
100
+ "disabled",
101
+ "size"
102
+ ])) : __props.field.type === "reference" ? (openBlock(), createBlock(_sfc_main$3, {
103
+ key: 2,
104
+ editor: __props.editor,
105
+ row: __props.row,
106
+ field: __props.field,
107
+ disabled: __props.disabled,
108
+ size: __props.size
109
+ }, null, 8, [
110
+ "editor",
111
+ "row",
112
+ "field",
113
+ "disabled",
114
+ "size"
115
+ ])) : __props.field.type === "bibliography" ? (openBlock(), createBlock(_sfc_main$1, {
116
+ key: 3,
117
+ editor: __props.editor,
118
+ row: __props.row,
119
+ field: __props.field,
120
+ disabled: __props.disabled
121
+ }, null, 8, [
122
+ "editor",
123
+ "row",
124
+ "field",
125
+ "disabled"
126
+ ])) : __props.field.type === "derivation" ? (openBlock(), createElementBlock(Fragment, { key: 4 }, [derived.value ? (openBlock(), createBlock(_sfc_main$2, {
127
+ key: 0,
128
+ editor: __props.editor,
129
+ node: derived.value
130
+ }, null, 8, ["editor", "node"])) : createCommentVNode("v-if", true)], 64)) : __props.field.type === "textarea" ? (openBlock(), createBlock(unref(UTextarea), {
131
+ key: 5,
73
132
  "model-value": draft.value,
74
133
  "aria-label": __props.field.label,
75
134
  disabled: __props.disabled,
@@ -87,7 +146,7 @@ const _sfc_main = /*@__PURE__*/ defineComponent({
87
146
  "disabled",
88
147
  "size"
89
148
  ])) : (openBlock(), createBlock(unref(UInput), {
90
- key: 2,
149
+ key: 6,
91
150
  "model-value": draft.value,
92
151
  type: __props.field.type,
93
152
  "aria-label": __props.field.label,
@@ -1 +1 @@
1
- {"version":3,"file":"CompositeFieldEditor.js","names":["_openBlock","_createBlock","_unref","_withKeys"],"sources":["../../../../src/features/composites/components/CompositeFieldEditor.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport type { Editor } from '@tiptap/core'\nimport { computed, onBeforeUnmount, ref, watch } 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'\n\n/**\n * One meta field of a Baustein as an input that writes through `setCompositeMetaField`. Text-like inputs keep a local\n * draft and commit after typing pauses, on blur and on unmount, so the one-frame-late re-read of the rows never\n * overwrites what is being typed.\n */\nconst props = withDefaults(defineProps<{\n editor: Editor\n row: CompositeRow\n field: CompositeMetaField\n disabled?: boolean\n size?: 'xs' | 'sm' | 'md'\n}>(), { size: 'sm' })\n\nconst { Input: UInput, Select: USelect, Textarea: UTextarea } = useUiKit()\nconst { t } = useEditorI18n()\n\nconst stored = computed(() => metaText(props.row, props.field))\nconst draft = ref(stored.value)\nconst typing = ref(false)\nlet dirty = false\nlet timer: ReturnType<typeof setTimeout> | undefined\n\nwatch(stored, (value) => {\n if (!typing.value && !dirty) draft.value = value\n})\n\nfunction commit() {\n clearTimeout(timer)\n if (!dirty) return\n dirty = false\n if (!props.editor.isDestroyed) setCompositeMetaField(props.editor, props.row, props.field.key, draft.value)\n}\n\nfunction onInput(value: unknown) {\n draft.value = typeof value === 'string' ? value : ''\n dirty = true\n clearTimeout(timer)\n timer = setTimeout(commit, 400)\n}\n\nfunction onBlur() {\n typing.value = false\n commit()\n}\n\nonBeforeUnmount(commit)\n\nfunction onChoice(value: unknown) {\n setCompositeMetaField(props.editor, props.row, props.field.key, typeof value === 'string' ? value : '')\n}\n</script>\n\n<template>\n <USelect\n v-if=\"field.type === 'select'\"\n :model-value=\"stored || undefined\"\n :items=\"field.options ?? []\"\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 <UTextarea\n v-else-if=\"field.type === 'textarea'\"\n :model-value=\"draft\"\n :aria-label=\"field.label\"\n :disabled=\"disabled\"\n :size=\"size\"\n autoresize\n :rows=\"2\"\n :maxrows=\"6\"\n class=\"w-full\"\n @focus=\"typing = true\"\n @blur=\"onBlur\"\n @update:model-value=\"onInput\"\n />\n <UInput\n v-else\n :model-value=\"draft\"\n :type=\"field.type\"\n :aria-label=\"field.label\"\n :disabled=\"disabled\"\n :size=\"size\"\n class=\"w-full\"\n @focus=\"typing = true\"\n @blur=\"onBlur\"\n @keydown.enter=\"commit\"\n @update:model-value=\"onInput\"\n />\n</template>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;EAcA,MAAM,QAAQ;EAQd,MAAM,EAAE,OAAO,QAAQ,QAAQ,SAAS,UAAU,cAAc,SAAS;EACzE,MAAM,EAAE,MAAM,cAAc;EAE5B,MAAM,SAAS,eAAe,SAAS,MAAM,KAAK,MAAM,KAAK,CAAC;EAC9D,MAAM,QAAQ,IAAI,OAAO,KAAK;EAC9B,MAAM,SAAS,IAAI,KAAK;EACxB,IAAI,QAAQ;EACZ,IAAI;EAEJ,MAAM,SAAS,UAAU;GACvB,IAAI,CAAC,OAAO,SAAS,CAAC,OAAO,MAAM,QAAQ;EAC7C,CAAC;EAED,SAAS,SAAS;GAChB,aAAa,KAAK;GAClB,IAAI,CAAC,OAAO;GACZ,QAAQ;GACR,IAAI,CAAC,MAAM,OAAO,aAAa,sBAAsB,MAAM,QAAQ,MAAM,KAAK,MAAM,MAAM,KAAK,MAAM,KAAK;EAC5G;EAEA,SAAS,QAAQ,OAAgB;GAC/B,MAAM,QAAQ,OAAO,UAAU,WAAW,QAAQ;GAClD,QAAQ;GACR,aAAa,KAAK;GAClB,QAAQ,WAAW,QAAQ,GAAG;EAChC;EAEA,SAAS,SAAS;GAChB,OAAO,QAAQ;GACf,OAAO;EACT;EAEA,gBAAgB,MAAM;EAEtB,SAAS,SAAS,OAAgB;GAChC,sBAAsB,MAAM,QAAQ,MAAM,KAAK,MAAM,MAAM,KAAK,OAAO,UAAU,WAAW,QAAQ,EAAE;EACxG;;GAKU,OAAA,QAAA,MAAM,SAAI,YADlBA,UAAA,GAAAC,YAUEC,MAAA,OAAA,GAAA;;IARC,eAAa,OAAA,SAAU,KAAA;IACvB,OAAO,QAAA,MAAM,WAAO,CAAA;IACpB,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;;;;;;;;GAGV,CAAA,KAAA,QAAA,MAAM,SAAI,cADvBF,UAAA,GAAAC,YAaEC,MAAA,SAAA,GAAA;;IAXC,eAAa,MAAA;IACb,cAAY,QAAA,MAAM;IAClB,UAAU,QAAA;IACV,MAAM,QAAA;IACP,YAAA;IACC,MAAM;IACN,SAAS;IACV,OAAM;IACL,SAAK,OAAA,OAAA,OAAA,MAAA,WAAE,OAAA,QAAM;IACP;IACN,uBAAoB;;;;;;GAEvB,CAAA,MAAAF,UAAA,GAAAC,YAYEC,MAAA,MAAA,GAAA;;IAVC,eAAa,MAAA;IACb,MAAM,QAAA,MAAM;IACZ,cAAY,QAAA,MAAM;IAClB,UAAU,QAAA;IACV,MAAM,QAAA;IACP,OAAM;IACL,SAAK,OAAA,OAAA,OAAA,MAAA,WAAE,OAAA,QAAM;IACP;IACN,WAAOC,SAAQ,QAAM,CAAA,OAAA,CAAA;IACrB,uBAAoB"}
1
+ {"version":3,"file":"CompositeFieldEditor.js","names":["_openBlock","_createBlock","_unref","ReferenceFieldSelect","BibliographyEditor","_createElementBlock","_Fragment","DerivationBadge","_createCommentVNode","_withKeys"],"sources":["../../../../src/features/composites/components/CompositeFieldEditor.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport type { Editor } from '@tiptap/core'\nimport { computed, onBeforeUnmount, ref, watch } 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 { compositeOfRow, type CompositeRow, setCompositeMetaField } from '../rows'\nimport BibliographyEditor from './BibliographyEditor.vue'\nimport DerivationBadge from './DerivationBadge.vue'\nimport ReferenceFieldSelect from './ReferenceFieldSelect.vue'\n\n/**\n * One meta field of a Baustein as an input that writes through `setCompositeMetaField`. Text-like inputs keep a local\n * draft and commit after typing pauses, on blur and on unmount, so the one-frame-late re-read of the rows never\n * overwrites what is being typed.\n */\nconst props = withDefaults(defineProps<{\n editor: Editor\n row: CompositeRow\n field: CompositeMetaField\n disabled?: boolean\n size?: 'xs' | 'sm' | 'md'\n}>(), { size: 'sm' })\n\nconst { Input: UInput, InputMenu: UInputMenu, Select: USelect, Textarea: UTextarea } = useUiKit()\nconst { t } = useEditorI18n()\n\n/** The Baustein a `derivation` field belongs to; the read-only provenance display needs the node, not the field text. */\nconst derived = computed(() => props.field.type === 'derivation' ? compositeOfRow(props.editor.state.doc, props.row)?.node ?? null : null)\n\nconst stored = computed(() => metaText(props.row, props.field))\n/** The chosen values of a `multiselect` field (`meta[key]` is a `string[]`). */\nconst chosen = computed(() => {\n const value = props.row.meta[props.field.key]\n return Array.isArray(value) ? value.filter((item): item is string => typeof item === 'string') : []\n})\nconst draft = ref(stored.value)\nconst typing = ref(false)\nlet dirty = false\nlet timer: ReturnType<typeof setTimeout> | undefined\n\nwatch(stored, (value) => {\n if (!typing.value && !dirty) draft.value = value\n})\n\nfunction commit() {\n clearTimeout(timer)\n if (!dirty) return\n dirty = false\n if (!props.editor.isDestroyed) setCompositeMetaField(props.editor, props.row, props.field.key, draft.value)\n}\n\nfunction onInput(value: unknown) {\n draft.value = typeof value === 'string' ? value : ''\n dirty = true\n clearTimeout(timer)\n timer = setTimeout(commit, 400)\n}\n\nfunction onBlur() {\n typing.value = false\n commit()\n}\n\nonBeforeUnmount(commit)\n\nfunction onChoice(value: unknown) {\n setCompositeMetaField(props.editor, props.row, props.field.key, typeof value === 'string' ? value : '')\n}\n\nfunction onChoices(value: unknown) {\n setCompositeMetaField(props.editor, props.row, props.field.key, Array.isArray(value) ? value : [])\n}\n</script>\n\n<template>\n <USelect\n v-if=\"field.type === 'select'\"\n :model-value=\"stored || undefined\"\n :items=\"field.options ?? []\"\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 <UInputMenu\n v-else-if=\"field.type === 'multiselect'\"\n multiple\n :model-value=\"chosen\"\n :items=\"field.options ?? []\"\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=\"onChoices\"\n />\n <ReferenceFieldSelect\n v-else-if=\"field.type === 'reference'\"\n :editor=\"editor\"\n :row=\"row\"\n :field=\"field\"\n :disabled=\"disabled\"\n :size=\"size\"\n />\n <BibliographyEditor\n v-else-if=\"field.type === 'bibliography'\"\n :editor=\"editor\"\n :row=\"row\"\n :field=\"field\"\n :disabled=\"disabled\"\n />\n <template v-else-if=\"field.type === 'derivation'\">\n <DerivationBadge v-if=\"derived\" :editor=\"editor\" :node=\"derived\" />\n </template>\n <UTextarea\n v-else-if=\"field.type === 'textarea'\"\n :model-value=\"draft\"\n :aria-label=\"field.label\"\n :disabled=\"disabled\"\n :size=\"size\"\n autoresize\n :rows=\"2\"\n :maxrows=\"6\"\n class=\"w-full\"\n @focus=\"typing = true\"\n @blur=\"onBlur\"\n @update:model-value=\"onInput\"\n />\n <UInput\n v-else\n :model-value=\"draft\"\n :type=\"field.type\"\n :aria-label=\"field.label\"\n :disabled=\"disabled\"\n :size=\"size\"\n class=\"w-full\"\n @focus=\"typing = true\"\n @blur=\"onBlur\"\n @keydown.enter=\"commit\"\n @update:model-value=\"onInput\"\n />\n</template>\n"],"mappings":"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"}
@@ -1,7 +1,8 @@
1
+ import { normalizeTagName } from "../../../core/tag-name.js";
1
2
  import { useUiKit } from "../../../vue/kit/use-ui-kit.js";
2
3
  import { useEditorI18n } from "../../../vue/use-editor-i18n.js";
3
- import { normalizeTagName } from "../../../core/tag-name.js";
4
- import { compositeFieldText } from "../inspector-model.js";
4
+ import { compositeFieldText, isStructuredField } from "../inspector-model.js";
5
+ import _sfc_main$1 from "./CompositeFieldEditor.js";
5
6
  import { useCompositeInspector } from "../use-composite-inspector.js";
6
7
  import { Fragment, createBlock, createCommentVNode, createElementBlock, createElementVNode, createTextVNode, createVNode, defineComponent, normalizeClass, normalizeStyle, openBlock, renderList, renderSlot, toDisplayString, unref, useId, withCtx } from "vue";
7
8
  //#region src/features/composites/components/CompositeInspector.vue
@@ -199,7 +200,8 @@ const _sfc_main = /*@__PURE__*/ defineComponent({
199
200
  ])]),
200
201
  _: 1
201
202
  }, 8, ["label", "help"]),
202
- createVNode(unref(UFormField), {
203
+ unref(focused).tagsVisible ? (openBlock(), createBlock(unref(UFormField), {
204
+ key: 0,
203
205
  label: unref(t)("composites.tags.label"),
204
206
  size: "sm"
205
207
  }, {
@@ -237,15 +239,26 @@ const _sfc_main = /*@__PURE__*/ defineComponent({
237
239
  "onCreate"
238
240
  ])]),
239
241
  _: 1
240
- }, 8, ["label"]),
242
+ }, 8, ["label"])) : createCommentVNode("v-if", true),
241
243
  (openBlock(true), createElementBlock(Fragment, null, renderList(unref(focused).fields, (field) => {
242
244
  return openBlock(), createBlock(unref(UFormField), {
243
245
  key: field.key,
244
246
  label: field.label,
245
247
  size: "sm"
246
248
  }, {
247
- default: withCtx(() => [field.type === "select" ? (openBlock(), createBlock(unref(USelect), {
249
+ default: withCtx(() => [createCommentVNode(" Fields whose value is not text (reference, bibliography, derivation) have their own editors, as in the details card; a text input would overwrite the stored object with a string. "), unref(isStructuredField)(field) ? (openBlock(), createElementBlock(Fragment, { key: 0 }, [__props.editor ? (openBlock(), createBlock(_sfc_main$1, {
248
250
  key: 0,
251
+ editor: __props.editor,
252
+ row: unref(focused),
253
+ field,
254
+ disabled: !unref(editable)
255
+ }, null, 8, [
256
+ "editor",
257
+ "row",
258
+ "field",
259
+ "disabled"
260
+ ])) : createCommentVNode("v-if", true)], 64)) : field.type === "select" ? (openBlock(), createBlock(unref(USelect), {
261
+ key: 1,
249
262
  "model-value": unref(compositeFieldText)(unref(focused), field) || void 0,
250
263
  items: field.options ?? [],
251
264
  "aria-label": field.label,
@@ -261,7 +274,7 @@ const _sfc_main = /*@__PURE__*/ defineComponent({
261
274
  "disabled",
262
275
  "onUpdate:modelValue"
263
276
  ])) : field.type === "textarea" ? (openBlock(), createBlock(unref(UTextarea), {
264
- key: 1,
277
+ key: 2,
265
278
  "model-value": unref(compositeFieldText)(unref(focused), field),
266
279
  "aria-label": field.label,
267
280
  autoresize: "",
@@ -277,7 +290,7 @@ const _sfc_main = /*@__PURE__*/ defineComponent({
277
290
  "readonly",
278
291
  "onUpdate:modelValue"
279
292
  ])) : (openBlock(), createBlock(unref(UInput), {
280
- key: 2,
293
+ key: 3,
281
294
  "model-value": unref(compositeFieldText)(unref(focused), field),
282
295
  type: field.type,
283
296
  "aria-label": field.label,
@@ -1 +1 @@
1
- {"version":3,"file":"CompositeInspector.js","names":["_openBlock","_createElementBlock","_unref","_createElementVNode","_toDisplayString","_renderSlot","_Fragment","_renderList","_createVNode","_createBlock","_normalizeStyle","_withCtx","_normalizeClass","_createCommentVNode","_createTextVNode"],"sources":["../../../../src/features/composites/components/CompositeInspector.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport type { Editor } from '@tiptap/core'\nimport { useId } from 'vue'\nimport { normalizeTagName } from '../../../core/tag-name'\nimport { useUiKit } from '../../../vue/kit/use-ui-kit'\nimport { useEditorI18n } from '../../../vue/use-editor-i18n'\nimport { compositeFieldText } from '../inspector-model'\nimport { useCompositeInspector } from '../use-composite-inspector'\n\n/**\n * Side panel with the metadata of the document *or* of the Baustein under the caret — one at a time — connected to\n * `editor`. Fills the height of its container and scrolls on its own; the width comes from the host. Open/close is\n * the host's business. The `document` slot carries host-provided document facts (title, folder, dates, presence) at\n * the top of the „Dokument“ section: render them as a `<dl>` with the same grid as below to look native.\n *\n * The „Baustein“ section shows while the caret is in a Baustein of the editor; the „Dokument“ section shows before\n * the editor was ever focused, while the caret is in editor text outside any Baustein, and while `documentFocused`.\n * `documentFocused`: the host's document-level input (its title field) has the focus. While it is true the panel\n * shows the „Dokument“ section and keeps showing it after the input blurs, until the caret returns to the editor.\n */\nconst props = defineProps<{ editor?: Editor, documentFocused?: boolean }>()\n\nconst { Badge: UBadge, FormField: UFormField, Icon: UIcon, Input: UInput, InputMenu: UInputMenu, Select: USelect, Textarea: UTextarea } = useUiKit()\nconst { t } = useEditorI18n()\n\ndefineSlots<{\n /** Document facts known to the host only, rendered above the facts derived from the editor. */\n document?: () => unknown\n}>()\n\nconst { inspector, section, editable, draft, searchTerm, tagItems, kindOptions, summarized, hasSummary, rows, tags, kinds, mentions, focused } = useCompositeInspector(() => props.editor, () => props.documentFocused)\n\nconst uid = useId()\n\nconst HEX_COLOR = /^#[0-9a-f]{3,8}$/i\n// Same tint as the chip in the document (`--mention-color`), only invalid colors fall back to the primary color.\nconst mentionStyle = (color: string | null) => ({ '--mention-color': color && HEX_COLOR.test(color) ? color : 'var(--sk-primary)' })\n\n// The Nuxt UI inputs emit loosely typed values; the model takes strings.\nfunction onKind(kind: unknown) {\n if (typeof kind === 'string') inspector.value.setKind(kind)\n}\n\nfunction onDescriptionInput(value: unknown) {\n inspector.value.inputDescription(typeof value === 'string' ? value : '')\n}\n\nfunction onTags(value: unknown) {\n inspector.value.setTags(Array.isArray(value) ? value.filter((tag): tag is string => typeof tag === 'string') : [])\n}\n</script>\n\n<template>\n <aside class=\"flex h-full min-h-0 flex-col overflow-y-auto text-sm\" :aria-label=\"t('composites.inspector.label')\">\n <section v-if=\"section === 'document'\" class=\"flex-1 p-4\" :aria-labelledby=\"`${uid}-document`\">\n <h2 :id=\"`${uid}-document`\" class=\"mb-3 text-sm font-semibold text-[var(--sk-fg-highlighted)]\">\n {{ t('composites.inspector.document') }}\n </h2>\n <div class=\"flex flex-col gap-y-2\">\n <slot name=\"document\" />\n <dl class=\"grid grid-cols-[6.5rem_minmax(0,1fr)] items-start gap-x-3 gap-y-2\">\n <dt class=\"min-h-6 leading-6 text-[var(--sk-muted)]\">\n {{ t('composites.inspector.composites') }}\n </dt>\n <dd v-if=\"kinds.length\" class=\"m-0 flex min-w-0 flex-col gap-y-1\">\n <span v-for=\"kind in kinds\" :key=\"kind.id\" class=\"flex min-h-6 min-w-0 items-center gap-2\">\n <UIcon :name=\"kind.icon\" class=\"size-4 shrink-0 text-[var(--sk-muted)]\" />\n <span class=\"min-w-0 flex-1 truncate text-[var(--sk-fg-highlighted)]\">{{ kind.label }}</span>\n <span class=\"tabular-nums text-[var(--sk-muted)]\">{{ kind.count }}</span>\n </span>\n <span class=\"min-h-6 leading-6 tabular-nums text-[var(--sk-muted)]\">\n {{ t('composites.inspector.summarized', { n: summarized, total: rows.length }) }}\n </span>\n </dd>\n <dd v-else class=\"m-0 min-h-6 leading-6 text-[var(--sk-fg-dimmed)]\">\n {{ t('composites.inspector.none') }}\n </dd>\n\n <dt class=\"min-h-6 leading-6 text-[var(--sk-muted)]\">\n {{ t('composites.tags.label') }}\n </dt>\n <dd v-if=\"tags.length\" class=\"m-0 flex min-w-0 flex-wrap items-center gap-1\">\n <UBadge v-for=\"tag in tags\" :key=\"tag\" color=\"neutral\" variant=\"subtle\" size=\"sm\" :label=\"`#${tag}`\" class=\"max-w-full\" />\n </dd>\n <dd v-else class=\"m-0 min-h-6 leading-6 text-[var(--sk-fg-dimmed)]\">\n {{ t('composites.inspector.none') }}\n </dd>\n\n <dt class=\"min-h-6 leading-6 text-[var(--sk-muted)]\">\n {{ t('composites.inspector.mentions') }}\n </dt>\n <dd v-if=\"mentions.length\" class=\"m-0 flex min-w-0 flex-wrap items-center gap-1\">\n <span\n v-for=\"mention in mentions\"\n :key=\"mention.id\"\n class=\"inline-flex max-w-full items-center gap-1.5 truncate rounded-sm px-1.5 py-0.5 text-xs font-medium text-[var(--sk-fg-highlighted)]\"\n :style=\"[mentionStyle(mention.color), { background: 'color-mix(in oklab, var(--mention-color) 15%, transparent)' }]\"\n >\n <span class=\"size-1.5 shrink-0 rounded-full\" :style=\"{ background: 'var(--mention-color)' }\" />\n <span class=\"truncate\">@{{ mention.label }}</span>\n </span>\n </dd>\n <dd v-else class=\"m-0 min-h-6 leading-6 text-[var(--sk-fg-dimmed)]\">\n {{ t('composites.inspector.none') }}\n </dd>\n </dl>\n </div>\n </section>\n <section v-else-if=\"focused\" class=\"flex-1 p-4\" :aria-labelledby=\"`${uid}-composite`\">\n <h2 :id=\"`${uid}-composite`\" class=\"mb-3 text-sm font-semibold text-[var(--sk-fg-highlighted)]\">\n {{ t('composites.inspector.composite') }}\n </h2>\n\n <div :key=\"focused.key\" class=\"flex flex-col gap-3\">\n <UFormField :label=\"t('composites.inspector.kind')\" size=\"sm\">\n <USelect\n :model-value=\"focused.kind\"\n :items=\"kindOptions\"\n size=\"sm\"\n class=\"w-full\"\n :aria-label=\"t('composites.kind.select')\"\n :disabled=\"!editable\"\n @update:model-value=\"onKind\"\n />\n </UFormField>\n\n <UFormField :label=\"t('composites.inspector.title')\" size=\"sm\" :help=\"editable ? t('composites.inspector.titleHelp') : undefined\">\n <p class=\"min-h-6 truncate leading-6\" :class=\"focused.title ? 'text-[var(--sk-fg-highlighted)]' : 'text-[var(--sk-fg-dimmed)]'\" :title=\"focused.title\">\n {{ focused.title || t('composites.inspector.untitled') }}\n </p>\n </UFormField>\n\n <UFormField\n :label=\"t('composites.inspector.description')\"\n size=\"sm\"\n :help=\"focused.descriptionTextOnly ? undefined : t('composites.inspector.descriptionHelp')\"\n >\n <UTextarea\n :model-value=\"draft\"\n autoresize\n :rows=\"3\"\n :maxrows=\"10\"\n size=\"sm\"\n class=\"w-full\"\n :placeholder=\"t('composites.inspector.description')\"\n :aria-label=\"t('composites.inspector.description')\"\n :readonly=\"!editable || !focused.descriptionTextOnly\"\n @update:model-value=\"onDescriptionInput\"\n @blur=\"inspector.blurDescription\"\n />\n </UFormField>\n\n <UFormField :label=\"t('composites.tags.label')\" size=\"sm\">\n <!-- `position` is required in the object form: InputMenu renders the create row only for 'top' or 'bottom'. -->\n <UInputMenu\n :search-term=\"searchTerm\"\n multiple\n :create-item=\"{ position: 'bottom', when: 'always' }\"\n :model-value=\"focused.tags\"\n :items=\"tagItems\"\n ignore-filter\n :placeholder=\"t('composites.tags.label')\"\n :aria-label=\"t('composites.tags.label')\"\n size=\"sm\"\n icon=\"i-lucide-hash\"\n class=\"w-full\"\n :disabled=\"!editable\"\n @update:model-value=\"onTags\"\n @update:search-term=\"inspector.setSearchTerm\"\n @update:open=\"(isOpen: boolean) => isOpen && inspector.searchTags()\"\n @create=\"inspector.createTag\"\n >\n <template #create-item-label=\"{ item }: { item: string }\">\n {{ t('composites.tags.create', { tag: normalizeTagName(item) || item }) }}\n </template>\n </UInputMenu>\n </UFormField>\n\n <UFormField v-for=\"field in focused.fields\" :key=\"field.key\" :label=\"field.label\" size=\"sm\">\n <USelect\n v-if=\"field.type === 'select'\"\n :model-value=\"compositeFieldText(focused, field) || undefined\"\n :items=\"field.options ?? []\"\n :aria-label=\"field.label\"\n placeholder=\"–\"\n size=\"sm\"\n class=\"w-full\"\n :disabled=\"!editable\"\n @update:model-value=\"(value: unknown) => inspector.setField(field, value)\"\n />\n <UTextarea\n v-else-if=\"field.type === 'textarea'\"\n :model-value=\"compositeFieldText(focused, field)\"\n :aria-label=\"field.label\"\n autoresize\n :rows=\"2\"\n :maxrows=\"8\"\n size=\"sm\"\n class=\"w-full\"\n :readonly=\"!editable\"\n @update:model-value=\"(value: unknown) => inspector.setField(field, value)\"\n />\n <UInput\n v-else\n :model-value=\"compositeFieldText(focused, field)\"\n :type=\"field.type\"\n :aria-label=\"field.label\"\n size=\"sm\"\n class=\"w-full\"\n :readonly=\"!editable\"\n @update:model-value=\"(value: unknown) => inspector.setField(field, value)\"\n />\n </UFormField>\n\n <div class=\"flex items-center gap-2 border-t border-[var(--sk-border)] pt-3\">\n <UIcon name=\"i-lucide-sparkles\" class=\"size-4 shrink-0 text-[var(--sk-muted)]\" />\n <span class=\"text-[var(--sk-muted)]\">{{ t('composites.inspector.aiStatus') }}</span>\n <span class=\"ml-auto inline-flex items-center gap-1.5\" :class=\"hasSummary ? 'text-[var(--sk-fg-highlighted)]' : 'text-[var(--sk-fg-dimmed)]'\">\n <span class=\"size-2 rounded-full\" :class=\"hasSummary ? 'bg-[var(--sk-success)]' : 'bg-[var(--sk-bg-accented)]'\" />\n {{ hasSummary ? t('composites.inspector.summaryPresent') : t('composites.inspector.summaryMissing') }}\n </span>\n </div>\n </div>\n </section>\n </aside>\n</template>\n"],"mappings":"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"}
1
+ {"version":3,"file":"CompositeInspector.js","names":["_openBlock","_createElementBlock","_unref","_createElementVNode","_toDisplayString","_renderSlot","_Fragment","_renderList","_createVNode","_createBlock","_normalizeStyle","_withCtx","_normalizeClass","_createCommentVNode","_createTextVNode","CompositeFieldEditor"],"sources":["../../../../src/features/composites/components/CompositeInspector.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport type { Editor } from '@tiptap/core'\nimport { useId } from 'vue'\nimport { normalizeTagName } from '../../../core/tag-name'\nimport { useUiKit } from '../../../vue/kit/use-ui-kit'\nimport { useEditorI18n } from '../../../vue/use-editor-i18n'\nimport { compositeFieldText, isStructuredField } from '../inspector-model'\nimport { useCompositeInspector } from '../use-composite-inspector'\nimport CompositeFieldEditor from './CompositeFieldEditor.vue'\n\n/**\n * Side panel with the metadata of the document *or* of the Baustein under the caret — one at a time — connected to\n * `editor`. Fills the height of its container and scrolls on its own; the width comes from the host. Open/close is\n * the host's business. The `document` slot carries host-provided document facts (title, folder, dates, presence) at\n * the top of the „Dokument“ section: render them as a `<dl>` with the same grid as below to look native.\n *\n * The „Baustein“ section shows while the caret is in a Baustein of the editor; the „Dokument“ section shows before\n * the editor was ever focused, while the caret is in editor text outside any Baustein, and while `documentFocused`.\n * `documentFocused`: the host's document-level input (its title field) has the focus. While it is true the panel\n * shows the „Dokument“ section and keeps showing it after the input blurs, until the caret returns to the editor.\n */\nconst props = defineProps<{ editor?: Editor, documentFocused?: boolean }>()\n\nconst { Badge: UBadge, FormField: UFormField, Icon: UIcon, Input: UInput, InputMenu: UInputMenu, Select: USelect, Textarea: UTextarea } = useUiKit()\nconst { t } = useEditorI18n()\n\ndefineSlots<{\n /** Document facts known to the host only, rendered above the facts derived from the editor. */\n document?: () => unknown\n}>()\n\nconst { inspector, section, editable, draft, searchTerm, tagItems, kindOptions, summarized, hasSummary, rows, tags, kinds, mentions, focused } = useCompositeInspector(() => props.editor, () => props.documentFocused)\n\nconst uid = useId()\n\nconst HEX_COLOR = /^#[0-9a-f]{3,8}$/i\n// Same tint as the chip in the document (`--mention-color`), only invalid colors fall back to the primary color.\nconst mentionStyle = (color: string | null) => ({ '--mention-color': color && HEX_COLOR.test(color) ? color : 'var(--sk-primary)' })\n\n// The Nuxt UI inputs emit loosely typed values; the model takes strings.\nfunction onKind(kind: unknown) {\n if (typeof kind === 'string') inspector.value.setKind(kind)\n}\n\nfunction onDescriptionInput(value: unknown) {\n inspector.value.inputDescription(typeof value === 'string' ? value : '')\n}\n\nfunction onTags(value: unknown) {\n inspector.value.setTags(Array.isArray(value) ? value.filter((tag): tag is string => typeof tag === 'string') : [])\n}\n</script>\n\n<template>\n <aside class=\"flex h-full min-h-0 flex-col overflow-y-auto text-sm\" :aria-label=\"t('composites.inspector.label')\">\n <section v-if=\"section === 'document'\" class=\"flex-1 p-4\" :aria-labelledby=\"`${uid}-document`\">\n <h2 :id=\"`${uid}-document`\" class=\"mb-3 text-sm font-semibold text-[var(--sk-fg-highlighted)]\">\n {{ t('composites.inspector.document') }}\n </h2>\n <div class=\"flex flex-col gap-y-2\">\n <slot name=\"document\" />\n <dl class=\"grid grid-cols-[6.5rem_minmax(0,1fr)] items-start gap-x-3 gap-y-2\">\n <dt class=\"min-h-6 leading-6 text-[var(--sk-muted)]\">\n {{ t('composites.inspector.composites') }}\n </dt>\n <dd v-if=\"kinds.length\" class=\"m-0 flex min-w-0 flex-col gap-y-1\">\n <span v-for=\"kind in kinds\" :key=\"kind.id\" class=\"flex min-h-6 min-w-0 items-center gap-2\">\n <UIcon :name=\"kind.icon\" class=\"size-4 shrink-0 text-[var(--sk-muted)]\" />\n <span class=\"min-w-0 flex-1 truncate text-[var(--sk-fg-highlighted)]\">{{ kind.label }}</span>\n <span class=\"tabular-nums text-[var(--sk-muted)]\">{{ kind.count }}</span>\n </span>\n <span class=\"min-h-6 leading-6 tabular-nums text-[var(--sk-muted)]\">\n {{ t('composites.inspector.summarized', { n: summarized, total: rows.length }) }}\n </span>\n </dd>\n <dd v-else class=\"m-0 min-h-6 leading-6 text-[var(--sk-fg-dimmed)]\">\n {{ t('composites.inspector.none') }}\n </dd>\n\n <dt class=\"min-h-6 leading-6 text-[var(--sk-muted)]\">\n {{ t('composites.tags.label') }}\n </dt>\n <dd v-if=\"tags.length\" class=\"m-0 flex min-w-0 flex-wrap items-center gap-1\">\n <UBadge v-for=\"tag in tags\" :key=\"tag\" color=\"neutral\" variant=\"subtle\" size=\"sm\" :label=\"`#${tag}`\" class=\"max-w-full\" />\n </dd>\n <dd v-else class=\"m-0 min-h-6 leading-6 text-[var(--sk-fg-dimmed)]\">\n {{ t('composites.inspector.none') }}\n </dd>\n\n <dt class=\"min-h-6 leading-6 text-[var(--sk-muted)]\">\n {{ t('composites.inspector.mentions') }}\n </dt>\n <dd v-if=\"mentions.length\" class=\"m-0 flex min-w-0 flex-wrap items-center gap-1\">\n <span\n v-for=\"mention in mentions\"\n :key=\"mention.id\"\n class=\"inline-flex max-w-full items-center gap-1.5 truncate rounded-sm px-1.5 py-0.5 text-xs font-medium text-[var(--sk-fg-highlighted)]\"\n :style=\"[mentionStyle(mention.color), { background: 'color-mix(in oklab, var(--mention-color) 15%, transparent)' }]\"\n >\n <span class=\"size-1.5 shrink-0 rounded-full\" :style=\"{ background: 'var(--mention-color)' }\" />\n <span class=\"truncate\">@{{ mention.label }}</span>\n </span>\n </dd>\n <dd v-else class=\"m-0 min-h-6 leading-6 text-[var(--sk-fg-dimmed)]\">\n {{ t('composites.inspector.none') }}\n </dd>\n </dl>\n </div>\n </section>\n <section v-else-if=\"focused\" class=\"flex-1 p-4\" :aria-labelledby=\"`${uid}-composite`\">\n <h2 :id=\"`${uid}-composite`\" class=\"mb-3 text-sm font-semibold text-[var(--sk-fg-highlighted)]\">\n {{ t('composites.inspector.composite') }}\n </h2>\n\n <div :key=\"focused.key\" class=\"flex flex-col gap-3\">\n <UFormField :label=\"t('composites.inspector.kind')\" size=\"sm\">\n <USelect\n :model-value=\"focused.kind\"\n :items=\"kindOptions\"\n size=\"sm\"\n class=\"w-full\"\n :aria-label=\"t('composites.kind.select')\"\n :disabled=\"!editable\"\n @update:model-value=\"onKind\"\n />\n </UFormField>\n\n <UFormField :label=\"t('composites.inspector.title')\" size=\"sm\" :help=\"editable ? t('composites.inspector.titleHelp') : undefined\">\n <p class=\"min-h-6 truncate leading-6\" :class=\"focused.title ? 'text-[var(--sk-fg-highlighted)]' : 'text-[var(--sk-fg-dimmed)]'\" :title=\"focused.title\">\n {{ focused.title || t('composites.inspector.untitled') }}\n </p>\n </UFormField>\n\n <UFormField\n :label=\"t('composites.inspector.description')\"\n size=\"sm\"\n :help=\"focused.descriptionTextOnly ? undefined : t('composites.inspector.descriptionHelp')\"\n >\n <UTextarea\n :model-value=\"draft\"\n autoresize\n :rows=\"3\"\n :maxrows=\"10\"\n size=\"sm\"\n class=\"w-full\"\n :placeholder=\"t('composites.inspector.description')\"\n :aria-label=\"t('composites.inspector.description')\"\n :readonly=\"!editable || !focused.descriptionTextOnly\"\n @update:model-value=\"onDescriptionInput\"\n @blur=\"inspector.blurDescription\"\n />\n </UFormField>\n\n <UFormField v-if=\"focused.tagsVisible\" :label=\"t('composites.tags.label')\" size=\"sm\">\n <!-- `position` is required in the object form: InputMenu renders the create row only for 'top' or 'bottom'. -->\n <UInputMenu\n :search-term=\"searchTerm\"\n multiple\n :create-item=\"{ position: 'bottom', when: 'always' }\"\n :model-value=\"focused.tags\"\n :items=\"tagItems\"\n ignore-filter\n :placeholder=\"t('composites.tags.label')\"\n :aria-label=\"t('composites.tags.label')\"\n size=\"sm\"\n icon=\"i-lucide-hash\"\n class=\"w-full\"\n :disabled=\"!editable\"\n @update:model-value=\"onTags\"\n @update:search-term=\"inspector.setSearchTerm\"\n @update:open=\"(isOpen: boolean) => isOpen && inspector.searchTags()\"\n @create=\"inspector.createTag\"\n >\n <template #create-item-label=\"{ item }: { item: string }\">\n {{ t('composites.tags.create', { tag: normalizeTagName(item) || item }) }}\n </template>\n </UInputMenu>\n </UFormField>\n\n <UFormField v-for=\"field in focused.fields\" :key=\"field.key\" :label=\"field.label\" size=\"sm\">\n <!-- Fields whose value is not text (reference, bibliography, derivation) have their own editors, as in the details card; a text input would overwrite the stored object with a string. -->\n <template v-if=\"isStructuredField(field)\">\n <CompositeFieldEditor\n v-if=\"editor\"\n :editor=\"editor\"\n :row=\"focused\"\n :field=\"field\"\n :disabled=\"!editable\"\n />\n </template>\n <USelect\n v-else-if=\"field.type === 'select'\"\n :model-value=\"compositeFieldText(focused, field) || undefined\"\n :items=\"field.options ?? []\"\n :aria-label=\"field.label\"\n placeholder=\"–\"\n size=\"sm\"\n class=\"w-full\"\n :disabled=\"!editable\"\n @update:model-value=\"(value: unknown) => inspector.setField(field, value)\"\n />\n <UTextarea\n v-else-if=\"field.type === 'textarea'\"\n :model-value=\"compositeFieldText(focused, field)\"\n :aria-label=\"field.label\"\n autoresize\n :rows=\"2\"\n :maxrows=\"8\"\n size=\"sm\"\n class=\"w-full\"\n :readonly=\"!editable\"\n @update:model-value=\"(value: unknown) => inspector.setField(field, value)\"\n />\n <UInput\n v-else\n :model-value=\"compositeFieldText(focused, field)\"\n :type=\"field.type\"\n :aria-label=\"field.label\"\n size=\"sm\"\n class=\"w-full\"\n :readonly=\"!editable\"\n @update:model-value=\"(value: unknown) => inspector.setField(field, value)\"\n />\n </UFormField>\n\n <div class=\"flex items-center gap-2 border-t border-[var(--sk-border)] pt-3\">\n <UIcon name=\"i-lucide-sparkles\" class=\"size-4 shrink-0 text-[var(--sk-muted)]\" />\n <span class=\"text-[var(--sk-muted)]\">{{ t('composites.inspector.aiStatus') }}</span>\n <span class=\"ml-auto inline-flex items-center gap-1.5\" :class=\"hasSummary ? 'text-[var(--sk-fg-highlighted)]' : 'text-[var(--sk-fg-dimmed)]'\">\n <span class=\"size-2 rounded-full\" :class=\"hasSummary ? 'bg-[var(--sk-success)]' : 'bg-[var(--sk-bg-accented)]'\" />\n {{ hasSummary ? t('composites.inspector.summaryPresent') : t('composites.inspector.summaryMissing') }}\n </span>\n </div>\n </div>\n </section>\n </aside>\n</template>\n"],"mappings":"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"}