@ecsplico/editor 3.6.0 → 4.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 (593) hide show
  1. package/CHANGELOG.md +73 -0
  2. package/dist/adapters/direct-ai.d.ts +4 -4
  3. package/dist/adapters/direct-ai.js +2 -2
  4. package/dist/adapters/direct-ai.js.map +1 -1
  5. package/dist/adapters/document-state.d.ts +1 -1
  6. package/dist/adapters/document-state.js.map +1 -1
  7. package/dist/adapters/forge.d.ts +2 -2
  8. package/dist/adapters/forge.js.map +1 -1
  9. package/dist/adapters/nitro.d.ts +11 -3
  10. package/dist/adapters/nitro.js +3 -1
  11. package/dist/adapters/nitro.js.map +1 -1
  12. package/dist/adapters/shared.d.ts +6 -6
  13. package/dist/adapters/shared.js.map +1 -1
  14. package/dist/code/CodeSurface.vue.d.ts +3 -3
  15. package/dist/config/index.d.ts +14 -14
  16. package/dist/config/index.js +8 -8
  17. package/dist/config/index.js.map +1 -1
  18. package/dist/core/backend-types.d.ts +3 -3
  19. package/dist/core/backend-types.js.map +1 -1
  20. package/dist/core/backend.d.ts +4 -4
  21. package/dist/core/backend.js.map +1 -1
  22. package/dist/core/block-convert.d.ts +1 -1
  23. package/dist/core/block-convert.js +5 -5
  24. package/dist/core/block-convert.js.map +1 -1
  25. package/dist/core/block-transfer.d.ts +8 -4
  26. package/dist/core/block-transfer.js +23 -14
  27. package/dist/core/block-transfer.js.map +1 -1
  28. package/dist/core/capabilities.d.ts +113 -0
  29. package/dist/core/capabilities.js +155 -0
  30. package/dist/core/capabilities.js.map +1 -0
  31. package/dist/core/command-types.d.ts +1 -1
  32. package/dist/core/context.js.map +1 -1
  33. package/dist/core/convert.d.ts +5 -5
  34. package/dist/core/convert.js +5 -5
  35. package/dist/core/convert.js.map +1 -1
  36. package/dist/core/core-feature.js +1 -1
  37. package/dist/core/define-editor.d.ts +2 -2
  38. package/dist/core/define-editor.js +34 -6
  39. package/dist/core/define-editor.js.map +1 -1
  40. package/dist/core/derivation.d.ts +119 -0
  41. package/dist/core/derivation.js +187 -0
  42. package/dist/core/derivation.js.map +1 -0
  43. package/dist/core/derive.d.ts +61 -0
  44. package/dist/core/derive.js +69 -0
  45. package/dist/core/derive.js.map +1 -0
  46. package/dist/core/extension-points.d.ts +16 -0
  47. package/dist/core/feature-context.d.ts +5 -1
  48. package/dist/core/feature-context.js +10 -3
  49. package/dist/core/feature-context.js.map +1 -1
  50. package/dist/core/feature.d.ts +41 -19
  51. package/dist/core/feature.js.map +1 -1
  52. package/dist/core/fences.js +1 -1
  53. package/dist/core/fences.js.map +1 -1
  54. package/dist/core/index.d.ts +6 -2
  55. package/dist/core/index.js +5 -1
  56. package/dist/core/pipeline.d.ts +14 -5
  57. package/dist/core/pipeline.js +19 -7
  58. package/dist/core/pipeline.js.map +1 -1
  59. package/dist/core/properties.d.ts +22 -0
  60. package/dist/core/properties.js +17 -0
  61. package/dist/core/properties.js.map +1 -0
  62. package/dist/core/schema/block-ids.js +5 -5
  63. package/dist/core/schema/block-ids.js.map +1 -1
  64. package/dist/core/schema/index.d.ts +2 -1
  65. package/dist/core/schema/index.js +2 -1
  66. package/dist/core/schema/index.js.map +1 -1
  67. package/dist/core/schema/opaque-fence.d.ts +4 -4
  68. package/dist/core/schema/opaque-fence.js +7 -7
  69. package/dist/core/schema/opaque-fence.js.map +1 -1
  70. package/dist/core/schema/persisted-names.d.ts +58 -0
  71. package/dist/core/schema/persisted-names.js +96 -0
  72. package/dist/core/schema/persisted-names.js.map +1 -0
  73. package/dist/core/toolbar-items.js +1 -1
  74. package/dist/core/toolbar-items.js.map +1 -1
  75. package/dist/core/util.js +5 -1
  76. package/dist/core/util.js.map +1 -1
  77. package/dist/document/DocumentSurface.vue.d.ts +3 -3
  78. package/dist/features/ai/agent-ops.js +1 -1
  79. package/dist/features/ai/ai-review.js +1 -1
  80. package/dist/features/ai/assistant.d.ts +4 -4
  81. package/dist/features/ai/assistant.js +1 -1
  82. package/dist/features/ai/assistant.js.map +1 -1
  83. package/dist/features/ai/components/AiSelectionMenu.js +1 -1
  84. package/dist/features/ai/components/AiSelectionMenu.js.map +1 -1
  85. package/dist/features/ai/components/ModelQuickSwitch.js +7 -7
  86. package/dist/features/ai/components/ModelQuickSwitch.js.map +1 -1
  87. package/dist/features/ai/components/ModelQuickSwitch.vue.d.ts +4 -4
  88. package/dist/features/ai/components/SettingsAiTab.js +8 -8
  89. package/dist/features/ai/components/SettingsAiTab.js.map +1 -1
  90. package/dist/features/ai/components/SettingsModelProfiles.js +1 -1
  91. package/dist/features/ai/components/SettingsModelProfiles.js.map +1 -1
  92. package/dist/features/ai/document-chat-model.d.ts +2 -2
  93. package/dist/features/ai/document-chat-model.js +5 -5
  94. package/dist/features/ai/document-chat-model.js.map +1 -1
  95. package/dist/features/ai/document-chat.js +2 -2
  96. package/dist/features/ai/document-chat.js.map +1 -1
  97. package/dist/features/ai/feature.d.ts +2 -2
  98. package/dist/features/ai/feature.js +2 -2
  99. package/dist/features/ai/feature.js.map +1 -1
  100. package/dist/features/ai/ghost-autocomplete.d.ts +4 -4
  101. package/dist/features/ai/ghost-autocomplete.js +1 -1
  102. package/dist/features/ai/ghost-autocomplete.js.map +1 -1
  103. package/dist/features/ai/index.d.ts +3 -3
  104. package/dist/features/ai/index.js +2 -2
  105. package/dist/features/ai/model-profiles.d.ts +9 -9
  106. package/dist/features/ai/model-profiles.js +13 -13
  107. package/dist/features/ai/model-profiles.js.map +1 -1
  108. package/dist/features/ai/protocol/agent-ops.d.ts +2 -2
  109. package/dist/features/ai/protocol/agent-ops.js +1 -1
  110. package/dist/features/ai/protocol/agent-ops.js.map +1 -1
  111. package/dist/features/ai/protocol/block-lines.d.ts +7 -7
  112. package/dist/features/ai/protocol/block-lines.js +10 -10
  113. package/dist/features/ai/protocol/block-lines.js.map +1 -1
  114. package/dist/features/ai/protocol/chat.d.ts +5 -5
  115. package/dist/features/ai/protocol/chat.js +12 -12
  116. package/dist/features/ai/protocol/chat.js.map +1 -1
  117. package/dist/features/ai/protocol/generate.d.ts +1 -1
  118. package/dist/features/ai/protocol/generate.js +1 -1
  119. package/dist/features/ai/protocol/generate.js.map +1 -1
  120. package/dist/features/ai/protocol/index.d.ts +3 -3
  121. package/dist/features/ai/protocol/index.js +2 -2
  122. package/dist/features/ai/protocol/models.d.ts +3 -3
  123. package/dist/features/ai/protocol/models.js +3 -3
  124. package/dist/features/ai/protocol/models.js.map +1 -1
  125. package/dist/features/ai/protocol/schemas.d.ts +1 -1
  126. package/dist/features/ai/protocol/schemas.js +1 -1
  127. package/dist/features/ai/protocol/schemas.js.map +1 -1
  128. package/dist/features/ai/protocol/tasks.d.ts +5 -5
  129. package/dist/features/ai/protocol/tasks.js +12 -12
  130. package/dist/features/ai/protocol/tasks.js.map +1 -1
  131. package/dist/features/ai/react/AiSelectionMenu.js.map +1 -1
  132. package/dist/features/ai/react/ModelQuickSwitch.d.ts +4 -4
  133. package/dist/features/ai/react/ModelQuickSwitch.js +6 -6
  134. package/dist/features/ai/react/ModelQuickSwitch.js.map +1 -1
  135. package/dist/features/ai/react/SettingsAiTab.d.ts +1 -1
  136. package/dist/features/ai/react/SettingsAiTab.js +8 -8
  137. package/dist/features/ai/react/SettingsAiTab.js.map +1 -1
  138. package/dist/features/ai/react/SettingsModelProfiles.d.ts +1 -1
  139. package/dist/features/ai/react/SettingsModelProfiles.js +1 -1
  140. package/dist/features/ai/react/SettingsModelProfiles.js.map +1 -1
  141. package/dist/features/ai/react/use-ai-assistant.d.ts +1 -1
  142. package/dist/features/ai/react/use-ai-assistant.js +1 -1
  143. package/dist/features/ai/react/use-ai-assistant.js.map +1 -1
  144. package/dist/features/ai/react/use-model-profiles.d.ts +5 -5
  145. package/dist/features/ai/react/use-model-profiles.js +2 -2
  146. package/dist/features/ai/react/use-model-profiles.js.map +1 -1
  147. package/dist/features/ai/use-ai-assistant.d.ts +1 -1
  148. package/dist/features/ai/use-ai-assistant.js +1 -1
  149. package/dist/features/ai/use-ai-assistant.js.map +1 -1
  150. package/dist/features/ai/use-model-profiles.d.ts +4 -4
  151. package/dist/features/ai/use-model-profiles.js +2 -2
  152. package/dist/features/ai/use-model-profiles.js.map +1 -1
  153. package/dist/features/block-ui/block-actions.d.ts +8 -4
  154. package/dist/features/block-ui/block-actions.js +38 -22
  155. package/dist/features/block-ui/block-actions.js.map +1 -1
  156. package/dist/features/block-ui/block-target.d.ts +29 -0
  157. package/dist/features/block-ui/block-target.js +63 -0
  158. package/dist/features/block-ui/block-target.js.map +1 -0
  159. package/dist/features/block-ui/components/BlockHandles.js +3 -3
  160. package/dist/features/block-ui/components/BlockHandles.js.map +1 -1
  161. package/dist/features/block-ui/components/BlockUi.js +11 -23
  162. package/dist/features/block-ui/components/BlockUi.js.map +1 -1
  163. package/dist/features/block-ui/feature.d.ts +3 -2
  164. package/dist/features/block-ui/feature.js +3 -2
  165. package/dist/features/block-ui/feature.js.map +1 -1
  166. package/dist/features/block-ui/handle-geometry.js +12 -23
  167. package/dist/features/block-ui/handle-geometry.js.map +1 -1
  168. package/dist/features/block-ui/index.d.ts +2 -1
  169. package/dist/features/block-ui/index.js +2 -1
  170. package/dist/features/block-ui/react/BlockHandles.d.ts +1 -1
  171. package/dist/features/block-ui/react/BlockHandles.js +4 -4
  172. package/dist/features/block-ui/react/BlockHandles.js.map +1 -1
  173. package/dist/features/block-ui/react/BlockUi.js +13 -25
  174. package/dist/features/block-ui/react/BlockUi.js.map +1 -1
  175. package/dist/features/comments/model.js +1 -1
  176. package/dist/features/composites/accepted-children.d.ts +5 -4
  177. package/dist/features/composites/accepted-children.js +26 -26
  178. package/dist/features/composites/accepted-children.js.map +1 -1
  179. package/dist/features/composites/ai-brief.d.ts +4 -4
  180. package/dist/features/composites/ai-brief.js +14 -12
  181. package/dist/features/composites/ai-brief.js.map +1 -1
  182. package/dist/features/composites/anchors.d.ts +1 -1
  183. package/dist/features/composites/anchors.js.map +1 -1
  184. package/dist/features/composites/baskets.d.ts +1 -1
  185. package/dist/features/composites/baskets.js.map +1 -1
  186. package/dist/features/composites/bibliography-command.d.ts +1 -1
  187. package/dist/features/composites/bibliography-form.js +1 -1
  188. package/dist/features/composites/bibliography-form.js.map +1 -1
  189. package/dist/features/composites/bibliography.js.map +1 -1
  190. package/dist/features/composites/block-types-json.d.ts +38 -0
  191. package/dist/features/composites/block-types-json.js +122 -0
  192. package/dist/features/composites/block-types-json.js.map +1 -0
  193. package/dist/features/composites/block-types.d.ts +119 -0
  194. package/dist/features/composites/block-types.js +343 -0
  195. package/dist/features/composites/block-types.js.map +1 -0
  196. package/dist/features/composites/capabilities.js +109 -0
  197. package/dist/features/composites/capabilities.js.map +1 -0
  198. package/dist/features/composites/components/BibliographyEditor.js +5 -5
  199. package/dist/features/composites/components/BibliographyEditor.js.map +1 -1
  200. package/dist/features/composites/components/CompositeBasketMenu.js +2 -2
  201. package/dist/features/composites/components/CompositeBasketMenu.js.map +1 -1
  202. package/dist/features/composites/components/CompositeChrome.js +18 -8
  203. package/dist/features/composites/components/CompositeChrome.js.map +1 -1
  204. package/dist/features/composites/components/CompositeChrome.vue.d.ts +1 -1
  205. package/dist/features/composites/components/CompositeDetails.js +11 -10
  206. package/dist/features/composites/components/CompositeDetails.js.map +1 -1
  207. package/dist/features/composites/components/CompositeDetails.vue.d.ts +1 -1
  208. package/dist/features/composites/components/CompositeFieldEditor.js +7 -7
  209. package/dist/features/composites/components/CompositeFieldEditor.js.map +1 -1
  210. package/dist/features/composites/components/CompositeFieldEditor.vue.d.ts +5 -5
  211. package/dist/features/composites/components/CompositeInspector.js +136 -113
  212. package/dist/features/composites/components/CompositeInspector.js.map +1 -1
  213. package/dist/features/composites/components/CompositeInspector.vue.d.ts +3 -3
  214. package/dist/features/composites/components/CompositeStatusMenu.js +2 -2
  215. package/dist/features/composites/components/CompositeStatusMenu.js.map +1 -1
  216. package/dist/features/composites/components/CompositeSummaryEditor.js +1 -1
  217. package/dist/features/composites/components/CompositeSummaryEditor.js.map +1 -1
  218. package/dist/features/composites/components/CompositeSummaryEditor.vue.d.ts +1 -1
  219. package/dist/features/composites/components/CompositeTable.js +2 -2
  220. package/dist/features/composites/components/CompositeTable.js.map +1 -1
  221. package/dist/features/composites/components/CompositeTagsEditor.js +1 -1
  222. package/dist/features/composites/components/CompositeTagsEditor.js.map +1 -1
  223. package/dist/features/composites/components/CompositeTagsEditor.vue.d.ts +1 -1
  224. package/dist/features/composites/components/CompositeView.js +19 -17
  225. package/dist/features/composites/components/CompositeView.js.map +1 -1
  226. package/dist/features/composites/components/DerivationBadge.js +15 -6
  227. package/dist/features/composites/components/DerivationBadge.js.map +1 -1
  228. package/dist/features/composites/components/FocusChip.js +1 -1
  229. package/dist/features/composites/components/FocusChip.js.map +1 -1
  230. package/dist/features/composites/components/FocusChip.vue.d.ts +1 -1
  231. package/dist/features/composites/components/ReferenceFieldSelect.js +3 -3
  232. package/dist/features/composites/components/ReferenceFieldSelect.js.map +1 -1
  233. package/dist/features/composites/components/ReferenceView.js +1 -1
  234. package/dist/features/composites/components/ReferenceView.js.map +1 -1
  235. package/dist/features/composites/components/SettingsEditingTab.js +18 -18
  236. package/dist/features/composites/components/SettingsEditingTab.js.map +1 -1
  237. package/dist/features/composites/components/SettingsEditingTab.vue.d.ts +3 -3
  238. package/dist/features/composites/convert.d.ts +4 -4
  239. package/dist/features/composites/convert.js +27 -28
  240. package/dist/features/composites/convert.js.map +1 -1
  241. package/dist/features/composites/derived-chrome.js +34 -28
  242. package/dist/features/composites/derived-chrome.js.map +1 -1
  243. package/dist/features/composites/editing-settings-keys.js +6 -6
  244. package/dist/features/composites/editing-settings-keys.js.map +1 -1
  245. package/dist/features/composites/feature.d.ts +10 -10
  246. package/dist/features/composites/feature.js +58 -46
  247. package/dist/features/composites/feature.js.map +1 -1
  248. package/dist/features/composites/fences.d.ts +3 -3
  249. package/dist/features/composites/fences.js +18 -13
  250. package/dist/features/composites/fences.js.map +1 -1
  251. package/dist/features/composites/focus.d.ts +10 -10
  252. package/dist/features/composites/focus.js +11 -11
  253. package/dist/features/composites/focus.js.map +1 -1
  254. package/dist/features/composites/heading-composites.d.ts +5 -5
  255. package/dist/features/composites/heading-composites.js +13 -16
  256. package/dist/features/composites/heading-composites.js.map +1 -1
  257. package/dist/features/composites/index.d.ts +20 -18
  258. package/dist/features/composites/index.js +9 -7
  259. package/dist/features/composites/inspector-model.d.ts +45 -22
  260. package/dist/features/composites/inspector-model.js +53 -14
  261. package/dist/features/composites/inspector-model.js.map +1 -1
  262. package/dist/features/composites/legacy.d.ts +5 -4
  263. package/dist/features/composites/legacy.js +16 -23
  264. package/dist/features/composites/legacy.js.map +1 -1
  265. package/dist/features/composites/markdown-export.js +3 -3
  266. package/dist/features/composites/markdown-export.js.map +1 -1
  267. package/dist/features/composites/merge.d.ts +8 -8
  268. package/dist/features/composites/merge.js +23 -22
  269. package/dist/features/composites/merge.js.map +1 -1
  270. package/dist/features/composites/meta-display.js +5 -5
  271. package/dist/features/composites/meta-display.js.map +1 -1
  272. package/dist/features/composites/meta-keys.d.ts +5 -5
  273. package/dist/features/composites/meta-keys.js +8 -8
  274. package/dist/features/composites/meta-keys.js.map +1 -1
  275. package/dist/features/composites/node-views.d.ts +3 -3
  276. package/dist/features/composites/node-views.js +2 -2
  277. package/dist/features/composites/node-views.js.map +1 -1
  278. package/dist/features/composites/nodes.d.ts +13 -13
  279. package/dist/features/composites/nodes.js +100 -77
  280. package/dist/features/composites/nodes.js.map +1 -1
  281. package/dist/features/composites/outline.d.ts +15 -12
  282. package/dist/features/composites/outline.js +24 -21
  283. package/dist/features/composites/outline.js.map +1 -1
  284. package/dist/features/composites/properties.d.ts +51 -0
  285. package/dist/features/composites/properties.js +89 -0
  286. package/dist/features/composites/properties.js.map +1 -0
  287. package/dist/features/composites/react/BibliographyEditor.js +5 -5
  288. package/dist/features/composites/react/BibliographyEditor.js.map +1 -1
  289. package/dist/features/composites/react/CompositeBasketMenu.js +2 -2
  290. package/dist/features/composites/react/CompositeBasketMenu.js.map +1 -1
  291. package/dist/features/composites/react/CompositeChrome.d.ts +1 -1
  292. package/dist/features/composites/react/CompositeChrome.js +15 -6
  293. package/dist/features/composites/react/CompositeChrome.js.map +1 -1
  294. package/dist/features/composites/react/CompositeDetails.d.ts +1 -1
  295. package/dist/features/composites/react/CompositeDetails.js +11 -10
  296. package/dist/features/composites/react/CompositeDetails.js.map +1 -1
  297. package/dist/features/composites/react/CompositeFieldEditor.d.ts +5 -5
  298. package/dist/features/composites/react/CompositeFieldEditor.js +6 -6
  299. package/dist/features/composites/react/CompositeFieldEditor.js.map +1 -1
  300. package/dist/features/composites/react/CompositeInspector.d.ts +3 -3
  301. package/dist/features/composites/react/CompositeInspector.js +142 -128
  302. package/dist/features/composites/react/CompositeInspector.js.map +1 -1
  303. package/dist/features/composites/react/CompositeStatusMenu.js +2 -2
  304. package/dist/features/composites/react/CompositeStatusMenu.js.map +1 -1
  305. package/dist/features/composites/react/CompositeSummaryEditor.d.ts +1 -1
  306. package/dist/features/composites/react/CompositeSummaryEditor.js +1 -1
  307. package/dist/features/composites/react/CompositeSummaryEditor.js.map +1 -1
  308. package/dist/features/composites/react/CompositeTable.d.ts +1 -1
  309. package/dist/features/composites/react/CompositeTable.js +3 -3
  310. package/dist/features/composites/react/CompositeTable.js.map +1 -1
  311. package/dist/features/composites/react/CompositeTagsEditor.d.ts +1 -1
  312. package/dist/features/composites/react/CompositeTagsEditor.js +1 -1
  313. package/dist/features/composites/react/CompositeTagsEditor.js.map +1 -1
  314. package/dist/features/composites/react/CompositeView.js +17 -15
  315. package/dist/features/composites/react/CompositeView.js.map +1 -1
  316. package/dist/features/composites/react/DerivationBadge.js +13 -4
  317. package/dist/features/composites/react/DerivationBadge.js.map +1 -1
  318. package/dist/features/composites/react/FocusChip.d.ts +1 -1
  319. package/dist/features/composites/react/FocusChip.js +1 -1
  320. package/dist/features/composites/react/FocusChip.js.map +1 -1
  321. package/dist/features/composites/react/ReferenceFieldSelect.js +3 -3
  322. package/dist/features/composites/react/ReferenceFieldSelect.js.map +1 -1
  323. package/dist/features/composites/react/ReferenceView.d.ts +1 -1
  324. package/dist/features/composites/react/ReferenceView.js +1 -1
  325. package/dist/features/composites/react/ReferenceView.js.map +1 -1
  326. package/dist/features/composites/react/SettingsEditingTab.d.ts +4 -4
  327. package/dist/features/composites/react/SettingsEditingTab.js +20 -20
  328. package/dist/features/composites/react/SettingsEditingTab.js.map +1 -1
  329. package/dist/features/composites/react.js +1 -1
  330. package/dist/features/composites/react.js.map +1 -1
  331. package/dist/features/composites/reference-ai.js +1 -1
  332. package/dist/features/composites/reference-ai.js.map +1 -1
  333. package/dist/features/composites/reference-label.d.ts +3 -3
  334. package/dist/features/composites/reference-label.js +6 -6
  335. package/dist/features/composites/reference-label.js.map +1 -1
  336. package/dist/features/composites/reference-suggestion.d.ts +1 -1
  337. package/dist/features/composites/reference-suggestion.js +3 -3
  338. package/dist/features/composites/reference-suggestion.js.map +1 -1
  339. package/dist/features/composites/reference-text.d.ts +2 -2
  340. package/dist/features/composites/reference-text.js +4 -4
  341. package/dist/features/composites/reference-text.js.map +1 -1
  342. package/dist/features/composites/reference.d.ts +3 -3
  343. package/dist/features/composites/reference.js +1 -1
  344. package/dist/features/composites/reference.js.map +1 -1
  345. package/dist/features/composites/reveal-source.d.ts +3 -3
  346. package/dist/features/composites/reveal-source.js +6 -6
  347. package/dist/features/composites/reveal-source.js.map +1 -1
  348. package/dist/features/composites/rows-model.d.ts +2 -2
  349. package/dist/features/composites/rows-model.js +4 -3
  350. package/dist/features/composites/rows-model.js.map +1 -1
  351. package/dist/features/composites/rows.d.ts +16 -28
  352. package/dist/features/composites/rows.js +20 -54
  353. package/dist/features/composites/rows.js.map +1 -1
  354. package/dist/features/composites/schema.d.ts +12 -11
  355. package/dist/features/composites/schema.js +10 -9
  356. package/dist/features/composites/schema.js.map +1 -1
  357. package/dist/features/composites/source.d.ts +20 -0
  358. package/dist/features/composites/source.js +40 -0
  359. package/dist/features/composites/source.js.map +1 -0
  360. package/dist/features/composites/split.d.ts +11 -11
  361. package/dist/features/composites/split.js +20 -20
  362. package/dist/features/composites/split.js.map +1 -1
  363. package/dist/features/composites/structure-mode.js +3 -3
  364. package/dist/features/composites/structure-mode.js.map +1 -1
  365. package/dist/features/composites/table-model.js +2 -2
  366. package/dist/features/composites/table-model.js.map +1 -1
  367. package/dist/features/composites/use-composite-inspector.js +3 -1
  368. package/dist/features/composites/use-composite-inspector.js.map +1 -1
  369. package/dist/features/composites/use-composite-rows.d.ts +2 -2
  370. package/dist/features/composites/use-composite-rows.js.map +1 -1
  371. package/dist/features/composites/vue.js +1 -1
  372. package/dist/features/composites/vue.js.map +1 -1
  373. package/dist/features/image-studio/components/ImageStudioDialog.js +150 -87
  374. package/dist/features/image-studio/components/ImageStudioDialog.js.map +1 -1
  375. package/dist/features/image-studio/components/ImageStudioDialog.vue.d.ts +5 -1
  376. package/dist/features/image-studio/components/ImageStudioLibraryPanel.js +186 -0
  377. package/dist/features/image-studio/components/ImageStudioLibraryPanel.js.map +1 -0
  378. package/dist/features/image-studio/components/ImageStudioLibraryTile.js +134 -0
  379. package/dist/features/image-studio/components/ImageStudioLibraryTile.js.map +1 -0
  380. package/dist/features/image-studio/components/ImageStudioView.js.map +1 -1
  381. package/dist/features/image-studio/feature.d.ts +1 -1
  382. package/dist/features/image-studio/feature.js +1 -1
  383. package/dist/features/image-studio/feature.js.map +1 -1
  384. package/dist/features/image-studio/index.d.ts +3 -2
  385. package/dist/features/image-studio/index.js +2 -2
  386. package/dist/features/image-studio/library.d.ts +35 -0
  387. package/dist/features/image-studio/node-core.d.ts +3 -3
  388. package/dist/features/image-studio/node-core.js +1 -1
  389. package/dist/features/image-studio/node-core.js.map +1 -1
  390. package/dist/features/image-studio/node-store.d.ts +1 -1
  391. package/dist/features/image-studio/node-store.js +1 -1
  392. package/dist/features/image-studio/node-store.js.map +1 -1
  393. package/dist/features/image-studio/react/ImageStudioDialog.d.ts +1 -1
  394. package/dist/features/image-studio/react/ImageStudioDialog.js +46 -5
  395. package/dist/features/image-studio/react/ImageStudioDialog.js.map +1 -1
  396. package/dist/features/image-studio/react/ImageStudioLibraryPanel.js +141 -0
  397. package/dist/features/image-studio/react/ImageStudioLibraryPanel.js.map +1 -0
  398. package/dist/features/image-studio/react/ImageStudioLibraryTile.js +105 -0
  399. package/dist/features/image-studio/react/ImageStudioLibraryTile.js.map +1 -0
  400. package/dist/features/image-studio/react/ImageStudioView.js +1 -1
  401. package/dist/features/image-studio/react/ImageStudioView.js.map +1 -1
  402. package/dist/features/image-studio/react/store.d.ts +8 -3
  403. package/dist/features/image-studio/react/store.js.map +1 -1
  404. package/dist/features/image-studio/react.d.ts +4 -3
  405. package/dist/features/image-studio/react.js +3 -3
  406. package/dist/features/image-studio/react.js.map +1 -1
  407. package/dist/features/image-studio/schema.d.ts +1 -1
  408. package/dist/features/image-studio/schema.js +1 -1
  409. package/dist/features/image-studio/schema.js.map +1 -1
  410. package/dist/features/image-studio/state.d.ts +8 -3
  411. package/dist/features/image-studio/state.js +11 -3
  412. package/dist/features/image-studio/state.js.map +1 -1
  413. package/dist/features/image-studio/store.d.ts +8 -3
  414. package/dist/features/image-studio/vue.d.ts +4 -3
  415. package/dist/features/image-studio/vue.js +3 -3
  416. package/dist/features/image-studio/vue.js.map +1 -1
  417. package/dist/features/mentions/tag.js +2 -1
  418. package/dist/features/mentions/tag.js.map +1 -1
  419. package/dist/features/themes/components/SettingsAppearanceTab.js +1 -1
  420. package/dist/features/themes/components/SettingsAppearanceTab.js.map +1 -1
  421. package/dist/features/themes/feature.d.ts +1 -1
  422. package/dist/features/themes/feature.js.map +1 -1
  423. package/dist/features/themes/react/SettingsAppearanceTab.d.ts +1 -1
  424. package/dist/features/themes/react/SettingsAppearanceTab.js +1 -1
  425. package/dist/features/themes/react/SettingsAppearanceTab.js.map +1 -1
  426. package/dist/features/themes/theme-runtime.js +1 -1
  427. package/dist/features/themes/theme-runtime.js.map +1 -1
  428. package/dist/features/transcript/TranscriptSegmentView.js +1 -1
  429. package/dist/features/transcript/TranscriptSegmentView.js.map +1 -1
  430. package/dist/features/transcript/react/TranscriptSegmentView.js +1 -1
  431. package/dist/features/transcript/react/TranscriptSegmentView.js.map +1 -1
  432. package/dist/features/transcript/segment-node.js.map +1 -1
  433. package/dist/features/transfer/feature.js +1 -1
  434. package/dist/features/transfer/feature.js.map +1 -1
  435. package/dist/features/transfer/transforms.d.ts +4 -4
  436. package/dist/features/transfer/transforms.js +12 -12
  437. package/dist/features/transfer/transforms.js.map +1 -1
  438. package/dist/i18n/de/ai.js +4 -4
  439. package/dist/i18n/de/ai.js.map +1 -1
  440. package/dist/i18n/de/authors.js +1 -1
  441. package/dist/i18n/de/authors.js.map +1 -1
  442. package/dist/i18n/de/comments.js +1 -1
  443. package/dist/i18n/de/comments.js.map +1 -1
  444. package/dist/i18n/de/composites.js +62 -59
  445. package/dist/i18n/de/composites.js.map +1 -1
  446. package/dist/i18n/de/image-studio.js +11 -2
  447. package/dist/i18n/de/image-studio.js.map +1 -1
  448. package/dist/i18n/de/integrations.js +20 -20
  449. package/dist/i18n/de/integrations.js.map +1 -1
  450. package/dist/i18n/de/markdown.js +1 -1
  451. package/dist/i18n/de/markdown.js.map +1 -1
  452. package/dist/i18n/de/palette.js +1 -1
  453. package/dist/i18n/de/palette.js.map +1 -1
  454. package/dist/i18n/de/themes.js +3 -3
  455. package/dist/i18n/de/themes.js.map +1 -1
  456. package/dist/i18n/de/transfer.js +2 -2
  457. package/dist/i18n/de/transfer.js.map +1 -1
  458. package/dist/i18n/de/tree.js +6 -6
  459. package/dist/i18n/de/tree.js.map +1 -1
  460. package/dist/i18n/de.d.ts +110 -98
  461. package/dist/i18n/en/ai.js +2 -2
  462. package/dist/i18n/en/ai.js.map +1 -1
  463. package/dist/i18n/en/composites.js +64 -61
  464. package/dist/i18n/en/composites.js.map +1 -1
  465. package/dist/i18n/en/image-studio.js +9 -0
  466. package/dist/i18n/en/image-studio.js.map +1 -1
  467. package/dist/i18n/en/integrations.js +9 -9
  468. package/dist/i18n/en/integrations.js.map +1 -1
  469. package/dist/i18n/en/markdown.js +1 -1
  470. package/dist/i18n/en/markdown.js.map +1 -1
  471. package/dist/i18n/en/palette.js +1 -1
  472. package/dist/i18n/en/palette.js.map +1 -1
  473. package/dist/i18n/en/themes.js +4 -4
  474. package/dist/i18n/en/themes.js.map +1 -1
  475. package/dist/i18n/en/tree.js +5 -5
  476. package/dist/i18n/en/tree.js.map +1 -1
  477. package/dist/index.d.ts +4 -1
  478. package/dist/integrations/composite-ai/bibliography-fetch.d.ts +6 -6
  479. package/dist/integrations/composite-ai/bibliography-fetch.js +19 -19
  480. package/dist/integrations/composite-ai/bibliography-fetch.js.map +1 -1
  481. package/dist/integrations/composite-ai/composite-fill.d.ts +4 -4
  482. package/dist/integrations/composite-ai/composite-fill.js +5 -5
  483. package/dist/integrations/composite-ai/composite-fill.js.map +1 -1
  484. package/dist/integrations/composite-ai/composite-summary.d.ts +2 -2
  485. package/dist/integrations/composite-ai/composite-summary.js +5 -5
  486. package/dist/integrations/composite-ai/composite-summary.js.map +1 -1
  487. package/dist/integrations/composite-ai/derive.d.ts +17 -17
  488. package/dist/integrations/composite-ai/derive.js +27 -26
  489. package/dist/integrations/composite-ai/derive.js.map +1 -1
  490. package/dist/integrations/composite-ai/index.d.ts +14 -15
  491. package/dist/integrations/composite-ai/index.js +98 -77
  492. package/dist/integrations/composite-ai/index.js.map +1 -1
  493. package/dist/integrations/composite-ai/outline-sanitize.d.ts +1 -1
  494. package/dist/integrations/composite-ai/outline-sanitize.js +1 -1
  495. package/dist/integrations/composite-ai/outline-sanitize.js.map +1 -1
  496. package/dist/integrations/composite-ai/rendition.d.ts +9 -9
  497. package/dist/integrations/composite-ai/rendition.js +27 -27
  498. package/dist/integrations/composite-ai/rendition.js.map +1 -1
  499. package/dist/integrations/composite-ai/split.d.ts +8 -8
  500. package/dist/integrations/composite-ai/split.js +12 -12
  501. package/dist/integrations/composite-ai/split.js.map +1 -1
  502. package/dist/integrations/composite-ai/transfer-transforms.d.ts +2 -2
  503. package/dist/integrations/composite-ai/transfer-transforms.js +11 -11
  504. package/dist/integrations/composite-ai/transfer-transforms.js.map +1 -1
  505. package/dist/integrations/composite-media/index.d.ts +4 -3
  506. package/dist/integrations/composite-media/index.js +20 -14
  507. package/dist/integrations/composite-media/index.js.map +1 -1
  508. package/dist/markdown/MarkdownSurface.vue.d.ts +7 -7
  509. package/dist/markdown/document.js +1 -1
  510. package/dist/markdown/document.js.map +1 -1
  511. package/dist/nuxt/module.d.ts +48 -24
  512. package/dist/nuxt/module.js.map +1 -1
  513. package/dist/nuxt/runtime/server/plugins/editor-server.js +3 -2
  514. package/dist/nuxt/runtime/server/plugins/editor-server.js.map +1 -1
  515. package/dist/presets/compose.d.ts +6 -6
  516. package/dist/presets/compose.js +7 -4
  517. package/dist/presets/compose.js.map +1 -1
  518. package/dist/react/AdvancedEditor.d.ts +2 -2
  519. package/dist/react/AdvancedEditor.js +1 -1
  520. package/dist/react/AdvancedEditor.js.map +1 -1
  521. package/dist/react/compose.d.ts +1 -1
  522. package/dist/react/compose.js +1 -1
  523. package/dist/react/compose.js.map +1 -1
  524. package/dist/react/composed-surface.d.ts +5 -5
  525. package/dist/react/composed-surface.js +2 -2
  526. package/dist/react/composed-surface.js.map +1 -1
  527. package/dist/server/ai.d.ts +7 -7
  528. package/dist/server/ai.js +1 -1
  529. package/dist/server/ai.js.map +1 -1
  530. package/dist/server/auth.d.ts +1 -1
  531. package/dist/server/collab-state.d.ts +1 -1
  532. package/dist/server/collab-state.js.map +1 -1
  533. package/dist/server/collab.d.ts +4 -4
  534. package/dist/server/collab.js +22 -17
  535. package/dist/server/collab.js.map +1 -1
  536. package/dist/server/handlers/ai.d.ts +9 -6
  537. package/dist/server/handlers/ai.js +13 -17
  538. package/dist/server/handlers/ai.js.map +1 -1
  539. package/dist/server/handlers/context.d.ts +4 -0
  540. package/dist/server/handlers/context.js.map +1 -1
  541. package/dist/server/handlers/editor.d.ts +33 -32
  542. package/dist/server/handlers/editor.js +13 -8
  543. package/dist/server/handlers/editor.js.map +1 -1
  544. package/dist/server/handlers/images.d.ts +1 -1
  545. package/dist/server/handlers/images.js +1 -1
  546. package/dist/server/handlers/images.js.map +1 -1
  547. package/dist/server/host.d.ts +4 -0
  548. package/dist/server/host.js +10 -2
  549. package/dist/server/host.js.map +1 -1
  550. package/dist/server/index.d.ts +3 -3
  551. package/dist/server/ports.d.ts +8 -8
  552. package/dist/server/ports.js.map +1 -1
  553. package/dist/settings/index.d.ts +20 -19
  554. package/dist/settings/index.js +25 -24
  555. package/dist/settings/index.js.map +1 -1
  556. package/dist/settings/migrate.d.ts +18 -0
  557. package/dist/settings/migrate.js +46 -0
  558. package/dist/settings/migrate.js.map +1 -0
  559. package/dist/settings/values.d.ts +12 -12
  560. package/dist/settings/values.js +11 -11
  561. package/dist/settings/values.js.map +1 -1
  562. package/dist/styles/composites.css +10 -10
  563. package/dist/tree/DocumentTree.js +12 -5
  564. package/dist/tree/DocumentTree.js.map +1 -1
  565. package/dist/tree/drop-rules.js +5 -5
  566. package/dist/tree/drop-rules.js.map +1 -1
  567. package/dist/tree/react/DocumentTree.js +14 -5
  568. package/dist/tree/react/DocumentTree.js.map +1 -1
  569. package/dist/tree/tree-host.js +5 -5
  570. package/dist/tree/tree-host.js.map +1 -1
  571. package/dist/tree/tree-items.js +34 -28
  572. package/dist/tree/tree-items.js.map +1 -1
  573. package/dist/tree/tree-model.js +16 -16
  574. package/dist/tree/tree-model.js.map +1 -1
  575. package/dist/tree/tree-rows.js +2 -2
  576. package/dist/tree/tree-rows.js.map +1 -1
  577. package/dist/tree/tree-view-model.d.ts +2 -2
  578. package/dist/tree/tree-view-model.js.map +1 -1
  579. package/dist/vue/AdvancedEditor.js +2 -2
  580. package/dist/vue/AdvancedEditor.js.map +1 -1
  581. package/dist/vue/AdvancedEditor.vue.d.ts +10 -10
  582. package/dist/vue/SimpleEditor.vue.d.ts +4 -4
  583. package/dist/vue/components/EditorSurface.vue.d.ts +4 -4
  584. package/dist/vue/compose.d.ts +1 -1
  585. package/dist/vue/compose.js +1 -1
  586. package/dist/vue/compose.js.map +1 -1
  587. package/package.json +1 -1
  588. package/dist/features/composites/derivation.d.ts +0 -62
  589. package/dist/features/composites/derivation.js +0 -102
  590. package/dist/features/composites/derivation.js.map +0 -1
  591. package/dist/features/composites/kinds.d.ts +0 -89
  592. package/dist/features/composites/kinds.js +0 -285
  593. package/dist/features/composites/kinds.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"CompositeTable.js","names":["_openBlock","_createElementBlock","_unref","_createVNode","_createElementVNode","_toDisplayString","_Fragment","_createSlots","_withCtx","_renderList","_createBlock","_createCommentVNode","_normalizeStyle","_createTextVNode","_normalizeClass"],"sources":["../../../../src/features/composites/components/CompositeTable.vue"],"sourcesContent":["<script setup lang=\"ts\">\n// All Bausteine of an editor's document as a sortable, filterable table. Columns beyond the fixed ones derive from the\n// meta fields of the kinds present in the document, so a host kind with fields gets its columns without code changes.\nimport type { Editor } from '@tiptap/core'\nimport { computed, ref } from 'vue'\nimport type { TableColumn } from '../../../vue/kit/types'\nimport { useUiKit } from '../../../vue/kit/use-ui-kit'\nimport { useEditorI18n } from '../../../vue/use-editor-i18n'\nimport { compositeKindsOf } from '../nodes'\nimport type { CompositeRow } from '../rows'\nimport { columnSpecsOf, type FieldContext, FILTER_ALL, fieldColumnsOf, fieldOf, fieldText, hasText, isLongText, sortRows, toggled } from '../table-model'\nimport { useCompositeRows } from '../use-composite-rows'\n\nconst props = defineProps<{ editor?: Editor }>()\nconst emit = defineEmits<{ select: [row: CompositeRow] }>()\n\nconst { Badge: UBadge, Button: UButton, Icon: UIcon, Input: UInput, Select: USelect, Table: UTable } = useUiKit()\nconst { t } = useEditorI18n()\n\nconst { rows, tags, kinds } = useCompositeRows(() => props.editor)\n\n// --- Columns ----------------------------------------------------------------------------------------------------\n\n// `reference` cells resolve their target in the document; re-read whenever the rows change.\nconst fieldContext = computed<FieldContext | undefined>(() => {\n void rows.value\n return props.editor ? { doc: props.editor.state.doc, kinds: compositeKindsOf(props.editor), t } : undefined\n})\nconst fieldColumns = computed(() => fieldColumnsOf(rows.value, kinds.value, fieldContext.value))\nconst specs = computed(() => columnSpecsOf(fieldColumns.value, t))\n\nconst columns = computed<TableColumn<CompositeRow>[]>(() => specs.value.map(spec => ({\n id: spec.id,\n header: spec.label,\n accessorFn: spec.sort,\n // The table reports `aria-sort` on the header cell only for columns that opt in.\n enableSorting: true,\n meta: { class: {\n th: [spec.id === 'title' ? 'min-w-56' : '', spec.align === 'end' ? 'text-right' : ''].join(' '),\n td: spec.align === 'end' ? 'text-right' : '',\n } },\n})))\n\n// --- Filter -----------------------------------------------------------------------------------------------------\n\nconst search = ref('')\nconst pickedKinds = ref<string[]>([])\nconst pickedTags = ref<string[]>([])\nconst pickedOptions = ref<Record<string, string>>({})\n\n/** One select per `select` field in use; its choices are the union of the options of all kinds that have the key. */\nconst selectFilters = computed(() => fieldColumns.value.flatMap((column) => {\n if (column.field.type !== 'select') return []\n const options = new Map<string, string>()\n for (const row of rows.value) {\n for (const option of fieldOf(row, column.field.key)?.options ?? []) if (!options.has(option.value)) options.set(option.value, option.label)\n }\n return [{\n key: column.field.key,\n label: column.field.label,\n items: [{ label: t('composites.table.filter.all'), value: FILTER_ALL }, ...[...options].map(([value, label]) => ({ label, value }))],\n }]\n}))\n\n// A kind, tag or option that vanished from the document can no longer be unpicked in the UI, so it must not filter either.\nconst activeKinds = computed(() => pickedKinds.value.filter(id => kinds.value.some(kind => kind.id === id)))\nconst activeTags = computed(() => pickedTags.value.filter(tag => tags.value.includes(tag)))\nconst activeOptions = computed(() => selectFilters.value.flatMap((filter) => {\n const value = pickedOptions.value[filter.key]\n return value && filter.items.some(item => item.value === value && value !== FILTER_ALL) ? [[filter.key, value] as const] : []\n}))\nconst needle = computed(() => search.value.trim().toLowerCase())\nconst filterActive = computed(() => activeKinds.value.length > 0 || activeTags.value.length > 0 || activeOptions.value.length > 0 || needle.value !== '')\n\nfunction resetFilters() {\n search.value = ''\n pickedKinds.value = []\n pickedTags.value = []\n pickedOptions.value = {}\n}\n\nconst filtered = computed(() => rows.value.filter((row) => {\n if (activeKinds.value.length && !activeKinds.value.includes(row.kind)) return false\n if (activeTags.value.length && !activeTags.value.every(tag => row.tags.includes(tag))) return false\n if (activeOptions.value.some(([key, value]) => row.meta[key] !== value)) return false\n if (needle.value) {\n const haystack = `${row.title}\\n${row.description}\\n${row.tags.map(tag => `#${tag}`).join(' ')}`.toLowerCase()\n if (!haystack.includes(needle.value)) return false\n }\n return true\n}))\n\n// --- Sorting (client side; the table only reports the state, so the data is ordered here) -------------------------\n\nconst sorting = ref<{ id: string, desc: boolean }[]>([])\nconst activeSort = computed(() => {\n const entry = sorting.value[0]\n const spec = entry && specs.value.find(item => item.id === entry.id)\n return entry && spec ? { id: entry.id, desc: entry.desc, sort: spec.sort } : null\n})\n\n/** Header click cycles ascending → descending → unsorted. */\nfunction cycleSort(id: string) {\n const current = sorting.value[0]\n if (current?.id !== id) sorting.value = [{ id, desc: false }]\n else sorting.value = current.desc ? [] : [{ id, desc: true }]\n}\nconst sortIcon = (id: string) => {\n const current = sorting.value[0]\n if (current?.id !== id) return 'i-lucide-chevrons-up-down'\n return current.desc ? 'i-lucide-arrow-down' : 'i-lucide-arrow-up'\n}\n\nconst sorted = computed(() => {\n const sort = activeSort.value\n return sort ? sortRows(filtered.value, sort.sort, sort.desc) : filtered.value\n})\n\nconst countLabel = computed(() => t(rows.value.length === 1 ? 'composites.table.count.one' : 'composites.table.count.other', { n: sorted.value.length, total: rows.value.length }))\n</script>\n\n<template>\n <section class=\"flex min-h-0 flex-col gap-3\" :aria-label=\"t('composites.table.label')\">\n <div v-if=\"!rows.length\" class=\"mx-auto flex max-w-sm flex-1 flex-col items-center justify-center gap-2 py-16 text-center\">\n <UIcon name=\"i-lucide-table-2\" class=\"size-8 text-[var(--sk-fg-dimmed)]\" />\n <p class=\"text-sm font-medium text-[var(--sk-fg-highlighted)]\">\n {{ t('composites.table.emptyTitle') }}\n </p>\n <p class=\"text-sm text-[var(--sk-muted)]\">\n {{ t('composites.table.emptyText') }}\n </p>\n </div>\n\n <template v-else>\n <div class=\"flex flex-col gap-2\">\n <div class=\"flex flex-wrap items-center gap-2\">\n <UInput\n v-model=\"search\"\n class=\"w-64\"\n size=\"sm\"\n icon=\"i-lucide-search\"\n :placeholder=\"t('composites.table.search.placeholder')\"\n :aria-label=\"t('composites.table.search.label')\"\n >\n <template v-if=\"search\" #trailing>\n <UButton\n color=\"neutral\"\n variant=\"link\"\n size=\"xs\"\n icon=\"i-lucide-x\"\n :aria-label=\"t('composites.table.search.clear')\"\n @click=\"search = ''\"\n />\n </template>\n </UInput>\n\n <div v-for=\"filter in selectFilters\" :key=\"filter.key\" class=\"flex items-center gap-1.5\">\n <span class=\"text-sm text-[var(--sk-muted)]\" aria-hidden=\"true\">{{ filter.label }}</span>\n <USelect\n :model-value=\"pickedOptions[filter.key] ?? FILTER_ALL\"\n class=\"w-36\"\n size=\"sm\"\n :items=\"filter.items\"\n :aria-label=\"filter.label\"\n @update:model-value=\"pickedOptions = { ...pickedOptions, [filter.key]: String($event) }\"\n />\n </div>\n\n <UButton\n v-if=\"filterActive\"\n size=\"sm\"\n color=\"neutral\"\n variant=\"ghost\"\n icon=\"i-lucide-filter-x\"\n :label=\"t('composites.table.filter.reset')\"\n @click=\"resetFilters\"\n />\n <span class=\"ml-auto text-xs tabular-nums text-[var(--sk-muted)]\" role=\"status\">{{ countLabel }}</span>\n </div>\n\n <div v-if=\"kinds.length > 1\" class=\"flex flex-wrap items-center gap-1\" role=\"group\" :aria-label=\"t('composites.table.filter.byKind')\">\n <UButton\n v-for=\"kind in kinds\"\n :key=\"kind.id\"\n size=\"xs\"\n color=\"neutral\"\n :variant=\"activeKinds.includes(kind.id) ? 'solid' : 'outline'\"\n :icon=\"kind.icon\"\n :label=\"kind.label\"\n :aria-pressed=\"activeKinds.includes(kind.id)\"\n @click=\"pickedKinds = toggled(pickedKinds, kind.id)\"\n />\n </div>\n\n <div v-if=\"tags.length\" class=\"flex flex-wrap items-center gap-1\" role=\"group\" :aria-label=\"t('composites.table.filter.byTag')\">\n <UButton\n v-for=\"tag in tags\"\n :key=\"tag\"\n size=\"xs\"\n color=\"neutral\"\n :variant=\"activeTags.includes(tag) ? 'solid' : 'outline'\"\n :label=\"`#${tag}`\"\n :aria-pressed=\"activeTags.includes(tag)\"\n @click=\"pickedTags = toggled(pickedTags, tag)\"\n />\n </div>\n </div>\n\n <UTable\n v-model:sorting=\"sorting\"\n :data=\"sorted\"\n :columns=\"columns\"\n :get-row-id=\"(row: CompositeRow) => row.key\"\n :ui=\"{ th: 'px-3 py-2 text-sm', td: 'px-3 py-2' }\"\n sticky\n class=\"min-h-0 flex-1 rounded-md border border-[var(--sk-border)]\"\n @select=\"(_event: Event, row: { original: CompositeRow }) => emit('select', row.original)\"\n >\n <template v-for=\"spec in specs\" :key=\"spec.id\" #[`${spec.id}-header`]>\n <button\n type=\"button\"\n class=\"-mx-1.5 inline-flex cursor-pointer items-center gap-1 rounded px-1.5 py-0.5 font-semibold hover:bg-[var(--sk-bg-elevated)] focus-visible:outline-2 focus-visible:outline-[var(--sk-primary)]\"\n @click=\"cycleSort(spec.id)\"\n >\n {{ spec.label }}\n <UIcon :name=\"sortIcon(spec.id)\" class=\"size-3.5\" :class=\"activeSort?.id === spec.id ? 'text-[var(--sk-fg-highlighted)]' : 'text-[var(--sk-fg-dimmed)]'\" />\n </button>\n </template>\n\n <template #title-cell=\"{ row }: { row: { original: CompositeRow } }\">\n <div class=\"flex min-w-0 items-center gap-1.5\" :style=\"{ paddingLeft: `${row.original.depth * 1.25}rem` }\">\n <UIcon :name=\"row.original.icon\" class=\"size-4 shrink-0 text-[var(--sk-muted)]\" />\n <span v-if=\"hasText(row.original.title)\" class=\"truncate font-medium text-[var(--sk-fg-highlighted)]\">{{ row.original.title }}</span>\n <span v-else class=\"truncate text-[var(--sk-muted)]\">{{ t('composites.untitled') }}</span>\n </div>\n </template>\n <template #kind-cell=\"{ row }: { row: { original: CompositeRow } }\">\n {{ row.original.kindLabel }}\n </template>\n <template v-for=\"column in fieldColumns\" :key=\"column.id\" #[`${column.id}-cell`]=\"{ row }: { row: { original: CompositeRow } }\">\n <span\n v-if=\"fieldText(row.original, column.field.key, fieldContext)\"\n class=\"block\"\n :class=\"[column.field.type === 'number' || column.field.type === 'date' ? 'tabular-nums' : '', isLongText(column.field) ? 'max-w-64 truncate' : '']\"\n :title=\"isLongText(column.field) ? fieldText(row.original, column.field.key, fieldContext) : undefined\"\n >{{ fieldText(row.original, column.field.key, fieldContext) }}</span>\n <template v-else>\n <span class=\"text-[var(--sk-fg-dimmed)]\" aria-hidden=\"true\">–</span>\n <span class=\"sr-only\">{{ t('composites.table.noValue') }}</span>\n </template>\n </template>\n <template #tags-cell=\"{ row }: { row: { original: CompositeRow } }\">\n <div v-if=\"row.original.tags.length\" class=\"flex flex-wrap gap-1\">\n <UBadge v-for=\"tag in row.original.tags\" :key=\"tag\" color=\"neutral\" variant=\"subtle\" size=\"sm\" :label=\"`#${tag}`\" />\n </div>\n <template v-else>\n <span class=\"text-[var(--sk-fg-dimmed)]\" aria-hidden=\"true\">–</span>\n <span class=\"sr-only\">{{ t('composites.table.noTags') }}</span>\n </template>\n </template>\n <template #summary-cell=\"{ row }: { row: { original: CompositeRow } }\">\n <template v-if=\"hasText(row.original.description)\">\n <span class=\"inline-block size-2 rounded-full bg-[var(--sk-primary)]\" aria-hidden=\"true\" :title=\"row.original.description\" />\n <span class=\"sr-only\">{{ t('composites.table.summaryPresent') }}</span>\n </template>\n <template v-else>\n <span class=\"text-[var(--sk-fg-dimmed)]\" aria-hidden=\"true\">–</span>\n <span class=\"sr-only\">{{ t('composites.summary.none') }}</span>\n </template>\n </template>\n\n <template #empty>\n <div class=\"flex flex-col items-center gap-2 py-6\">\n <p class=\"text-sm text-[var(--sk-muted)]\">\n {{ t('composites.table.filter.noMatch') }}\n </p>\n <UButton\n size=\"sm\"\n color=\"neutral\"\n variant=\"outline\"\n icon=\"i-lucide-filter-x\"\n :label=\"t('composites.table.filter.reset')\"\n @click=\"resetFilters\"\n />\n </div>\n </template>\n </UTable>\n </template>\n </section>\n</template>\n"],"mappings":"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"}
1
+ {"version":3,"file":"CompositeTable.js","names":["_openBlock","_createElementBlock","_unref","_createVNode","_createElementVNode","_toDisplayString","_Fragment","_createSlots","_withCtx","_renderList","_createBlock","_createCommentVNode","_normalizeStyle","_createTextVNode","_normalizeClass"],"sources":["../../../../src/features/composites/components/CompositeTable.vue"],"sourcesContent":["<script setup lang=\"ts\">\n// All Typed blocks of an editor's document as a sortable, filterable table. Columns beyond the fixed ones derive from the\n// meta fields of the kinds present in the document, so a host kind with fields gets its columns without code changes.\nimport type { Editor } from '@tiptap/core'\nimport { computed, ref } from 'vue'\nimport type { TableColumn } from '../../../vue/kit/types'\nimport { useUiKit } from '../../../vue/kit/use-ui-kit'\nimport { useEditorI18n } from '../../../vue/use-editor-i18n'\nimport { blockTypesOf } from '../nodes'\nimport type { CompositeRow } from '../rows'\nimport { columnSpecsOf, type FieldContext, FILTER_ALL, fieldColumnsOf, fieldOf, fieldText, hasText, isLongText, sortRows, toggled } from '../table-model'\nimport { useCompositeRows } from '../use-composite-rows'\n\nconst props = defineProps<{ editor?: Editor }>()\nconst emit = defineEmits<{ select: [row: CompositeRow] }>()\n\nconst { Badge: UBadge, Button: UButton, Icon: UIcon, Input: UInput, Select: USelect, Table: UTable } = useUiKit()\nconst { t } = useEditorI18n()\n\nconst { rows, tags, kinds } = useCompositeRows(() => props.editor)\n\n// --- Columns ----------------------------------------------------------------------------------------------------\n\n// `reference` cells resolve their target in the document; re-read whenever the rows change.\nconst fieldContext = computed<FieldContext | undefined>(() => {\n void rows.value\n return props.editor ? { doc: props.editor.state.doc, kinds: blockTypesOf(props.editor), t } : undefined\n})\nconst fieldColumns = computed(() => fieldColumnsOf(rows.value, kinds.value, fieldContext.value))\nconst specs = computed(() => columnSpecsOf(fieldColumns.value, t))\n\nconst columns = computed<TableColumn<CompositeRow>[]>(() => specs.value.map(spec => ({\n id: spec.id,\n header: spec.label,\n accessorFn: spec.sort,\n // The table reports `aria-sort` on the header cell only for columns that opt in.\n enableSorting: true,\n meta: { class: {\n th: [spec.id === 'title' ? 'min-w-56' : '', spec.align === 'end' ? 'text-right' : ''].join(' '),\n td: spec.align === 'end' ? 'text-right' : '',\n } },\n})))\n\n// --- Filter -----------------------------------------------------------------------------------------------------\n\nconst search = ref('')\nconst pickedKinds = ref<string[]>([])\nconst pickedTags = ref<string[]>([])\nconst pickedOptions = ref<Record<string, string>>({})\n\n/** One select per `select` field in use; its choices are the union of the options of all kinds that have the key. */\nconst selectFilters = computed(() => fieldColumns.value.flatMap((column) => {\n if (column.field.type !== 'select') return []\n const options = new Map<string, string>()\n for (const row of rows.value) {\n for (const option of fieldOf(row, column.field.key)?.options ?? []) if (!options.has(option.value)) options.set(option.value, option.label)\n }\n return [{\n key: column.field.key,\n label: column.field.label,\n items: [{ label: t('composites.table.filter.all'), value: FILTER_ALL }, ...[...options].map(([value, label]) => ({ label, value }))],\n }]\n}))\n\n// A kind, tag or option that vanished from the document can no longer be unpicked in the UI, so it must not filter either.\nconst activeKinds = computed(() => pickedKinds.value.filter(id => kinds.value.some(kind => kind.id === id)))\nconst activeTags = computed(() => pickedTags.value.filter(tag => tags.value.includes(tag)))\nconst activeOptions = computed(() => selectFilters.value.flatMap((filter) => {\n const value = pickedOptions.value[filter.key]\n return value && filter.items.some(item => item.value === value && value !== FILTER_ALL) ? [[filter.key, value] as const] : []\n}))\nconst needle = computed(() => search.value.trim().toLowerCase())\nconst filterActive = computed(() => activeKinds.value.length > 0 || activeTags.value.length > 0 || activeOptions.value.length > 0 || needle.value !== '')\n\nfunction resetFilters() {\n search.value = ''\n pickedKinds.value = []\n pickedTags.value = []\n pickedOptions.value = {}\n}\n\nconst filtered = computed(() => rows.value.filter((row) => {\n if (activeKinds.value.length && !activeKinds.value.includes(row.kind)) return false\n if (activeTags.value.length && !activeTags.value.every(tag => row.tags.includes(tag))) return false\n if (activeOptions.value.some(([key, value]) => row.meta[key] !== value)) return false\n if (needle.value) {\n const haystack = `${row.title}\\n${row.description}\\n${row.tags.map(tag => `#${tag}`).join(' ')}`.toLowerCase()\n if (!haystack.includes(needle.value)) return false\n }\n return true\n}))\n\n// --- Sorting (client side; the table only reports the state, so the data is ordered here) -------------------------\n\nconst sorting = ref<{ id: string, desc: boolean }[]>([])\nconst activeSort = computed(() => {\n const entry = sorting.value[0]\n const spec = entry && specs.value.find(item => item.id === entry.id)\n return entry && spec ? { id: entry.id, desc: entry.desc, sort: spec.sort } : null\n})\n\n/** Header click cycles ascending → descending → unsorted. */\nfunction cycleSort(id: string) {\n const current = sorting.value[0]\n if (current?.id !== id) sorting.value = [{ id, desc: false }]\n else sorting.value = current.desc ? [] : [{ id, desc: true }]\n}\nconst sortIcon = (id: string) => {\n const current = sorting.value[0]\n if (current?.id !== id) return 'i-lucide-chevrons-up-down'\n return current.desc ? 'i-lucide-arrow-down' : 'i-lucide-arrow-up'\n}\n\nconst sorted = computed(() => {\n const sort = activeSort.value\n return sort ? sortRows(filtered.value, sort.sort, sort.desc) : filtered.value\n})\n\nconst countLabel = computed(() => t(rows.value.length === 1 ? 'composites.table.count.one' : 'composites.table.count.other', { n: sorted.value.length, total: rows.value.length }))\n</script>\n\n<template>\n <section class=\"flex min-h-0 flex-col gap-3\" :aria-label=\"t('composites.table.label')\">\n <div v-if=\"!rows.length\" class=\"mx-auto flex max-w-sm flex-1 flex-col items-center justify-center gap-2 py-16 text-center\">\n <UIcon name=\"i-lucide-table-2\" class=\"size-8 text-[var(--sk-fg-dimmed)]\" />\n <p class=\"text-sm font-medium text-[var(--sk-fg-highlighted)]\">\n {{ t('composites.table.emptyTitle') }}\n </p>\n <p class=\"text-sm text-[var(--sk-muted)]\">\n {{ t('composites.table.emptyText') }}\n </p>\n </div>\n\n <template v-else>\n <div class=\"flex flex-col gap-2\">\n <div class=\"flex flex-wrap items-center gap-2\">\n <UInput\n v-model=\"search\"\n class=\"w-64\"\n size=\"sm\"\n icon=\"i-lucide-search\"\n :placeholder=\"t('composites.table.search.placeholder')\"\n :aria-label=\"t('composites.table.search.label')\"\n >\n <template v-if=\"search\" #trailing>\n <UButton\n color=\"neutral\"\n variant=\"link\"\n size=\"xs\"\n icon=\"i-lucide-x\"\n :aria-label=\"t('composites.table.search.clear')\"\n @click=\"search = ''\"\n />\n </template>\n </UInput>\n\n <div v-for=\"filter in selectFilters\" :key=\"filter.key\" class=\"flex items-center gap-1.5\">\n <span class=\"text-sm text-[var(--sk-muted)]\" aria-hidden=\"true\">{{ filter.label }}</span>\n <USelect\n :model-value=\"pickedOptions[filter.key] ?? FILTER_ALL\"\n class=\"w-36\"\n size=\"sm\"\n :items=\"filter.items\"\n :aria-label=\"filter.label\"\n @update:model-value=\"pickedOptions = { ...pickedOptions, [filter.key]: String($event) }\"\n />\n </div>\n\n <UButton\n v-if=\"filterActive\"\n size=\"sm\"\n color=\"neutral\"\n variant=\"ghost\"\n icon=\"i-lucide-filter-x\"\n :label=\"t('composites.table.filter.reset')\"\n @click=\"resetFilters\"\n />\n <span class=\"ml-auto text-xs tabular-nums text-[var(--sk-muted)]\" role=\"status\">{{ countLabel }}</span>\n </div>\n\n <div v-if=\"kinds.length > 1\" class=\"flex flex-wrap items-center gap-1\" role=\"group\" :aria-label=\"t('composites.table.filter.byKind')\">\n <UButton\n v-for=\"kind in kinds\"\n :key=\"kind.id\"\n size=\"xs\"\n color=\"neutral\"\n :variant=\"activeKinds.includes(kind.id) ? 'solid' : 'outline'\"\n :icon=\"kind.icon\"\n :label=\"kind.label\"\n :aria-pressed=\"activeKinds.includes(kind.id)\"\n @click=\"pickedKinds = toggled(pickedKinds, kind.id)\"\n />\n </div>\n\n <div v-if=\"tags.length\" class=\"flex flex-wrap items-center gap-1\" role=\"group\" :aria-label=\"t('composites.table.filter.byTag')\">\n <UButton\n v-for=\"tag in tags\"\n :key=\"tag\"\n size=\"xs\"\n color=\"neutral\"\n :variant=\"activeTags.includes(tag) ? 'solid' : 'outline'\"\n :label=\"`#${tag}`\"\n :aria-pressed=\"activeTags.includes(tag)\"\n @click=\"pickedTags = toggled(pickedTags, tag)\"\n />\n </div>\n </div>\n\n <UTable\n v-model:sorting=\"sorting\"\n :data=\"sorted\"\n :columns=\"columns\"\n :get-row-id=\"(row: CompositeRow) => row.key\"\n :ui=\"{ th: 'px-3 py-2 text-sm', td: 'px-3 py-2' }\"\n sticky\n class=\"min-h-0 flex-1 rounded-md border border-[var(--sk-border)]\"\n @select=\"(_event: Event, row: { original: CompositeRow }) => emit('select', row.original)\"\n >\n <template v-for=\"spec in specs\" :key=\"spec.id\" #[`${spec.id}-header`]>\n <button\n type=\"button\"\n class=\"-mx-1.5 inline-flex cursor-pointer items-center gap-1 rounded px-1.5 py-0.5 font-semibold hover:bg-[var(--sk-bg-elevated)] focus-visible:outline-2 focus-visible:outline-[var(--sk-primary)]\"\n @click=\"cycleSort(spec.id)\"\n >\n {{ spec.label }}\n <UIcon :name=\"sortIcon(spec.id)\" class=\"size-3.5\" :class=\"activeSort?.id === spec.id ? 'text-[var(--sk-fg-highlighted)]' : 'text-[var(--sk-fg-dimmed)]'\" />\n </button>\n </template>\n\n <template #title-cell=\"{ row }: { row: { original: CompositeRow } }\">\n <div class=\"flex min-w-0 items-center gap-1.5\" :style=\"{ paddingLeft: `${row.original.depth * 1.25}rem` }\">\n <UIcon :name=\"row.original.icon\" class=\"size-4 shrink-0 text-[var(--sk-muted)]\" />\n <span v-if=\"hasText(row.original.title)\" class=\"truncate font-medium text-[var(--sk-fg-highlighted)]\">{{ row.original.title }}</span>\n <span v-else class=\"truncate text-[var(--sk-muted)]\">{{ t('composites.untitled') }}</span>\n </div>\n </template>\n <template #kind-cell=\"{ row }: { row: { original: CompositeRow } }\">\n {{ row.original.kindLabel }}\n </template>\n <template v-for=\"column in fieldColumns\" :key=\"column.id\" #[`${column.id}-cell`]=\"{ row }: { row: { original: CompositeRow } }\">\n <span\n v-if=\"fieldText(row.original, column.field.key, fieldContext)\"\n class=\"block\"\n :class=\"[column.field.type === 'number' || column.field.type === 'date' ? 'tabular-nums' : '', isLongText(column.field) ? 'max-w-64 truncate' : '']\"\n :title=\"isLongText(column.field) ? fieldText(row.original, column.field.key, fieldContext) : undefined\"\n >{{ fieldText(row.original, column.field.key, fieldContext) }}</span>\n <template v-else>\n <span class=\"text-[var(--sk-fg-dimmed)]\" aria-hidden=\"true\">–</span>\n <span class=\"sr-only\">{{ t('composites.table.noValue') }}</span>\n </template>\n </template>\n <template #tags-cell=\"{ row }: { row: { original: CompositeRow } }\">\n <div v-if=\"row.original.tags.length\" class=\"flex flex-wrap gap-1\">\n <UBadge v-for=\"tag in row.original.tags\" :key=\"tag\" color=\"neutral\" variant=\"subtle\" size=\"sm\" :label=\"`#${tag}`\" />\n </div>\n <template v-else>\n <span class=\"text-[var(--sk-fg-dimmed)]\" aria-hidden=\"true\">–</span>\n <span class=\"sr-only\">{{ t('composites.table.noTags') }}</span>\n </template>\n </template>\n <template #summary-cell=\"{ row }: { row: { original: CompositeRow } }\">\n <template v-if=\"hasText(row.original.description)\">\n <span class=\"inline-block size-2 rounded-full bg-[var(--sk-primary)]\" aria-hidden=\"true\" :title=\"row.original.description\" />\n <span class=\"sr-only\">{{ t('composites.table.summaryPresent') }}</span>\n </template>\n <template v-else>\n <span class=\"text-[var(--sk-fg-dimmed)]\" aria-hidden=\"true\">–</span>\n <span class=\"sr-only\">{{ t('composites.summary.none') }}</span>\n </template>\n </template>\n\n <template #empty>\n <div class=\"flex flex-col items-center gap-2 py-6\">\n <p class=\"text-sm text-[var(--sk-muted)]\">\n {{ t('composites.table.filter.noMatch') }}\n </p>\n <UButton\n size=\"sm\"\n color=\"neutral\"\n variant=\"outline\"\n icon=\"i-lucide-filter-x\"\n :label=\"t('composites.table.filter.reset')\"\n @click=\"resetFilters\"\n />\n </div>\n </template>\n </UTable>\n </template>\n </section>\n</template>\n"],"mappings":"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"}
@@ -6,7 +6,7 @@ import { useEditorI18n } from "../../../vue/use-editor-i18n.js";
6
6
  import { setCompositeTags } from "../rows.js";
7
7
  import { Fragment, createCommentVNode, createElementBlock, createTextVNode, createVNode, defineComponent, onBeforeUnmount, openBlock, ref, toDisplayString, unref, watch, withCtx } from "vue";
8
8
  //#region src/features/composites/components/CompositeTagsEditor.vue
9
- /** Tags of one Baustein as an input menu with suggestions from the metadata registry, writing through `setCompositeTags`. */
9
+ /** Tags of one Typed block as an input menu with suggestions from the metadata registry, writing through `setCompositeTags`. */
10
10
  const _sfc_main = /*@__PURE__*/ defineComponent({
11
11
  __name: "CompositeTagsEditor",
12
12
  props: {
@@ -1 +1 @@
1
- {"version":3,"file":"CompositeTagsEditor.js","names":["_openBlock","_createElementBlock","_Fragment","_createCommentVNode","_createVNode","_unref","_withCtx","_createTextVNode","_toDisplayString"],"sources":["../../../../src/features/composites/components/CompositeTagsEditor.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport type { Editor } from '@tiptap/core'\nimport { onBeforeUnmount, ref, watch } from 'vue'\nimport { metadataOf } from '../../../core/metadata'\nimport { METADATA_LIST } from '../../../core/metadata-types'\nimport { normalizeTagName } from '../../../core/tag-name'\nimport { useUiKit } from '../../../vue/kit/use-ui-kit'\nimport { useEditorI18n } from '../../../vue/use-editor-i18n'\nimport { type CompositeRow, setCompositeTags } from '../rows'\n\n/** Tags of one Baustein as an input menu with suggestions from the metadata registry, writing through `setCompositeTags`. */\nconst props = defineProps<{ editor: Editor, row: CompositeRow }>()\n\nconst { InputMenu: UInputMenu } = useUiKit()\nconst { t } = useEditorI18n()\n\nconst term = ref('')\nconst items = ref<string[]>([])\n// Suggestions are loaded when the menu opens and 150 ms after typing pauses; a newer search aborts the older one.\nlet timer: ReturnType<typeof setTimeout> | undefined\nlet pending: AbortController | undefined\n\nfunction scheduleSearch() {\n clearTimeout(timer)\n timer = setTimeout(async () => {\n pending?.abort()\n const controller = pending = new AbortController()\n try {\n const found = await metadataOf(props.editor).search(METADATA_LIST.hashtags, { query: term.value, editor: props.editor, signal: controller.signal })\n if (!controller.signal.aborted) items.value = found.map(item => item.label)\n }\n catch (error) {\n if (!controller.signal.aborted) console.warn('Tag-Vorschläge konnten nicht geladen werden', error)\n }\n }, 150)\n}\nwatch(term, scheduleSearch)\nonBeforeUnmount(() => {\n clearTimeout(timer)\n pending?.abort()\n})\n\nfunction onTags(value: unknown) {\n setCompositeTags(props.editor, props.row, Array.isArray(value) ? value.filter((tag): tag is string => typeof tag === 'string') : [])\n}\n\n// „Neu Tag“ → `neu-tag`; a name that is already set is ignored.\nfunction onCreate(raw: string) {\n const name = normalizeTagName(raw)\n term.value = ''\n if (!name || props.row.tags.includes(name)) return\n setCompositeTags(props.editor, props.row, [...props.row.tags, name])\n if (!items.value.includes(name)) metadataOf(props.editor).create(METADATA_LIST.hashtags, { id: name, label: name })\n}\n</script>\n\n<template>\n <!-- `position` is required in the object form of `create-item`: InputMenu renders the create row only for 'top' or 'bottom'. -->\n <UInputMenu\n v-model:search-term=\"term\"\n multiple\n :create-item=\"{ position: 'bottom', when: 'always' }\"\n :model-value=\"row.tags\"\n :items=\"items\"\n ignore-filter\n :placeholder=\"t('composites.tags.placeholder')\"\n :aria-label=\"t('composites.tags.label')\"\n size=\"sm\"\n icon=\"i-lucide-hash\"\n class=\"w-full\"\n @update:model-value=\"onTags\"\n @update:open=\"(open: boolean) => open && scheduleSearch()\"\n @create=\"onCreate\"\n >\n <template #create-item-label=\"{ item }: { item: string }\">\n {{ t('composites.tags.create', { tag: normalizeTagName(item) || item }) }}\n </template>\n </UInputMenu>\n</template>\n"],"mappings":";;;;;;;;;;;;;;;;EAWA,MAAM,QAAQ;EAEd,MAAM,EAAE,WAAW,eAAe,SAAS;EAC3C,MAAM,EAAE,MAAM,cAAc;EAE5B,MAAM,OAAO,IAAI,EAAE;EACnB,MAAM,QAAQ,IAAc,CAAC,CAAC;EAE9B,IAAI;EACJ,IAAI;EAEJ,SAAS,iBAAiB;GACxB,aAAa,KAAK;GAClB,QAAQ,WAAW,YAAY;IAC7B,SAAS,MAAM;IACf,MAAM,aAAa,UAAU,IAAI,gBAAgB;IACjD,IAAI;KACF,MAAM,QAAQ,MAAM,WAAW,MAAM,MAAM,CAAC,CAAC,OAAO,cAAc,UAAU;MAAE,OAAO,KAAK;MAAO,QAAQ,MAAM;MAAQ,QAAQ,WAAW;KAAO,CAAC;KAClJ,IAAI,CAAC,WAAW,OAAO,SAAS,MAAM,QAAQ,MAAM,KAAI,SAAQ,KAAK,KAAK;IAC5E,SACO,OAAO;KACZ,IAAI,CAAC,WAAW,OAAO,SAAS,QAAQ,KAAK,+CAA+C,KAAK;IACnG;GACF,GAAG,GAAG;EACR;EACA,MAAM,MAAM,cAAc;EAC1B,sBAAsB;GACpB,aAAa,KAAK;GAClB,SAAS,MAAM;EACjB,CAAC;EAED,SAAS,OAAO,OAAgB;GAC9B,iBAAiB,MAAM,QAAQ,MAAM,KAAK,MAAM,QAAQ,KAAK,IAAI,MAAM,QAAQ,QAAuB,OAAO,QAAQ,QAAQ,IAAI,CAAC,CAAC;EACrI;EAGA,SAAS,SAAS,KAAa;GAC7B,MAAM,OAAO,iBAAiB,GAAG;GACjC,KAAK,QAAQ;GACb,IAAI,CAAC,QAAQ,MAAM,IAAI,KAAK,SAAS,IAAI,GAAG;GAC5C,iBAAiB,MAAM,QAAQ,MAAM,KAAK,CAAC,GAAG,MAAM,IAAI,MAAM,IAAI,CAAC;GACnE,IAAI,CAAC,MAAM,MAAM,SAAS,IAAI,GAAG,WAAW,MAAM,MAAM,CAAC,CAAC,OAAO,cAAc,UAAU;IAAE,IAAI;IAAM,OAAO;GAAK,CAAC;EACpH;;GAIE,OAAA,UAAA,GAAA,mBAAA,UAAA,MAAA,CAAAG,mBAAA,4HAAA,GACAC,YAmBaC,MAAA,UAAA,GAAA;IAlBH,eAAa,KAAA;IAAA,uBAAA,OAAA,OAAA,OAAA,MAAA,WAAA,KAAI,QAAA;IACzB,UAAA;IACC,eAAa;KAAA,UAAA;KAAA,MAAA;IAAA;IACb,eAAa,QAAA,IAAI;IACjB,OAAO,MAAA;IACR,iBAAA;IACC,aAAaA,MAAA,CAAA,CAAC,CAAA,6BAAA;IACd,cAAYA,MAAA,CAAA,CAAC,CAAA,uBAAA;IACd,MAAK;IACL,MAAK;IACL,OAAM;IACL,uBAAoB;IACpB,iBAAW,OAAA,OAAA,OAAA,MAAG,SAAkB,QAAQ,eAAc;IAC9C;;IAEE,qBAAiBC,SACgD,EAD5C,WAAI,CAC/BC,gBAAAC,gBAAAH,MAAA,CAAA,CAAC,CAAA,0BAAA,EAAA,KAAkCA,MAAA,gBAAA,CAAgB,CAAC,IAAI,KAAK,KAAI,CAAA,CAAA,GAAA,CAAA,CAAA,CAAA"}
1
+ {"version":3,"file":"CompositeTagsEditor.js","names":["_openBlock","_createElementBlock","_Fragment","_createCommentVNode","_createVNode","_unref","_withCtx","_createTextVNode","_toDisplayString"],"sources":["../../../../src/features/composites/components/CompositeTagsEditor.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport type { Editor } from '@tiptap/core'\nimport { onBeforeUnmount, ref, watch } from 'vue'\nimport { metadataOf } from '../../../core/metadata'\nimport { METADATA_LIST } from '../../../core/metadata-types'\nimport { normalizeTagName } from '../../../core/tag-name'\nimport { useUiKit } from '../../../vue/kit/use-ui-kit'\nimport { useEditorI18n } from '../../../vue/use-editor-i18n'\nimport { type CompositeRow, setCompositeTags } from '../rows'\n\n/** Tags of one Typed block as an input menu with suggestions from the metadata registry, writing through `setCompositeTags`. */\nconst props = defineProps<{ editor: Editor, row: CompositeRow }>()\n\nconst { InputMenu: UInputMenu } = useUiKit()\nconst { t } = useEditorI18n()\n\nconst term = ref('')\nconst items = ref<string[]>([])\n// Suggestions are loaded when the menu opens and 150 ms after typing pauses; a newer search aborts the older one.\nlet timer: ReturnType<typeof setTimeout> | undefined\nlet pending: AbortController | undefined\n\nfunction scheduleSearch() {\n clearTimeout(timer)\n timer = setTimeout(async () => {\n pending?.abort()\n const controller = pending = new AbortController()\n try {\n const found = await metadataOf(props.editor).search(METADATA_LIST.hashtags, { query: term.value, editor: props.editor, signal: controller.signal })\n if (!controller.signal.aborted) items.value = found.map(item => item.label)\n }\n catch (error) {\n if (!controller.signal.aborted) console.warn('Tag-Vorschläge konnten nicht geladen werden', error)\n }\n }, 150)\n}\nwatch(term, scheduleSearch)\nonBeforeUnmount(() => {\n clearTimeout(timer)\n pending?.abort()\n})\n\nfunction onTags(value: unknown) {\n setCompositeTags(props.editor, props.row, Array.isArray(value) ? value.filter((tag): tag is string => typeof tag === 'string') : [])\n}\n\n// „Neu Tag“ → `neu-tag`; a name that is already set is ignored.\nfunction onCreate(raw: string) {\n const name = normalizeTagName(raw)\n term.value = ''\n if (!name || props.row.tags.includes(name)) return\n setCompositeTags(props.editor, props.row, [...props.row.tags, name])\n if (!items.value.includes(name)) metadataOf(props.editor).create(METADATA_LIST.hashtags, { id: name, label: name })\n}\n</script>\n\n<template>\n <!-- `position` is required in the object form of `create-item`: InputMenu renders the create row only for 'top' or 'bottom'. -->\n <UInputMenu\n v-model:search-term=\"term\"\n multiple\n :create-item=\"{ position: 'bottom', when: 'always' }\"\n :model-value=\"row.tags\"\n :items=\"items\"\n ignore-filter\n :placeholder=\"t('composites.tags.placeholder')\"\n :aria-label=\"t('composites.tags.label')\"\n size=\"sm\"\n icon=\"i-lucide-hash\"\n class=\"w-full\"\n @update:model-value=\"onTags\"\n @update:open=\"(open: boolean) => open && scheduleSearch()\"\n @create=\"onCreate\"\n >\n <template #create-item-label=\"{ item }: { item: string }\">\n {{ t('composites.tags.create', { tag: normalizeTagName(item) || item }) }}\n </template>\n </UInputMenu>\n</template>\n"],"mappings":";;;;;;;;;;;;;;;;EAWA,MAAM,QAAQ;EAEd,MAAM,EAAE,WAAW,eAAe,SAAS;EAC3C,MAAM,EAAE,MAAM,cAAc;EAE5B,MAAM,OAAO,IAAI,EAAE;EACnB,MAAM,QAAQ,IAAc,CAAC,CAAC;EAE9B,IAAI;EACJ,IAAI;EAEJ,SAAS,iBAAiB;GACxB,aAAa,KAAK;GAClB,QAAQ,WAAW,YAAY;IAC7B,SAAS,MAAM;IACf,MAAM,aAAa,UAAU,IAAI,gBAAgB;IACjD,IAAI;KACF,MAAM,QAAQ,MAAM,WAAW,MAAM,MAAM,CAAC,CAAC,OAAO,cAAc,UAAU;MAAE,OAAO,KAAK;MAAO,QAAQ,MAAM;MAAQ,QAAQ,WAAW;KAAO,CAAC;KAClJ,IAAI,CAAC,WAAW,OAAO,SAAS,MAAM,QAAQ,MAAM,KAAI,SAAQ,KAAK,KAAK;IAC5E,SACO,OAAO;KACZ,IAAI,CAAC,WAAW,OAAO,SAAS,QAAQ,KAAK,+CAA+C,KAAK;IACnG;GACF,GAAG,GAAG;EACR;EACA,MAAM,MAAM,cAAc;EAC1B,sBAAsB;GACpB,aAAa,KAAK;GAClB,SAAS,MAAM;EACjB,CAAC;EAED,SAAS,OAAO,OAAgB;GAC9B,iBAAiB,MAAM,QAAQ,MAAM,KAAK,MAAM,QAAQ,KAAK,IAAI,MAAM,QAAQ,QAAuB,OAAO,QAAQ,QAAQ,IAAI,CAAC,CAAC;EACrI;EAGA,SAAS,SAAS,KAAa;GAC7B,MAAM,OAAO,iBAAiB,GAAG;GACjC,KAAK,QAAQ;GACb,IAAI,CAAC,QAAQ,MAAM,IAAI,KAAK,SAAS,IAAI,GAAG;GAC5C,iBAAiB,MAAM,QAAQ,MAAM,KAAK,CAAC,GAAG,MAAM,IAAI,MAAM,IAAI,CAAC;GACnE,IAAI,CAAC,MAAM,MAAM,SAAS,IAAI,GAAG,WAAW,MAAM,MAAM,CAAC,CAAC,OAAO,cAAc,UAAU;IAAE,IAAI;IAAM,OAAO;GAAK,CAAC;EACpH;;GAIE,OAAA,UAAA,GAAA,mBAAA,UAAA,MAAA,CAAAG,mBAAA,4HAAA,GACAC,YAmBaC,MAAA,UAAA,GAAA;IAlBH,eAAa,KAAA;IAAA,uBAAA,OAAA,OAAA,OAAA,MAAA,WAAA,KAAI,QAAA;IACzB,UAAA;IACC,eAAa;KAAA,UAAA;KAAA,MAAA;IAAA;IACb,eAAa,QAAA,IAAI;IACjB,OAAO,MAAA;IACR,iBAAA;IACC,aAAaA,MAAA,CAAA,CAAC,CAAA,6BAAA;IACd,cAAYA,MAAA,CAAA,CAAC,CAAA,uBAAA;IACd,MAAK;IACL,MAAK;IACL,OAAM;IACL,uBAAoB;IACpB,iBAAW,OAAA,OAAA,OAAA,MAAG,SAAkB,QAAQ,eAAc;IAC9C;;IAEE,qBAAiBC,SACgD,EAD5C,WAAI,CAC/BC,gBAAAC,gBAAAH,MAAA,CAAA,CAAC,CAAA,0BAAA,EAAA,KAAkCA,MAAA,gBAAA,CAAgB,CAAC,IAAI,KAAK,KAAI,CAAA,CAAA,GAAA,CAAA,CAAA,CAAA"}
@@ -1,7 +1,7 @@
1
1
  import { CompositeRow } from "../rows.js";
2
2
  import { Editor } from "@tiptap/core";
3
3
  //#region src/features/composites/components/CompositeTagsEditor.vue.d.ts
4
- /** Tags of one Baustein as an input menu with suggestions from the metadata registry, writing through `setCompositeTags`. */
4
+ /** Tags of one Typed block as an input menu with suggestions from the metadata registry, writing through `setCompositeTags`. */
5
5
  type __VLS_Props = {
6
6
  editor: Editor;
7
7
  row: CompositeRow;
@@ -1,7 +1,9 @@
1
- import { compositeKind } from "../kinds.js";
2
- import { basketOf, titleHiddenOf } from "../baskets.js";
3
- import { derivationOf } from "../derivation.js";
4
- import { compositeBasketsOf, compositeKindsOf } from "../nodes.js";
1
+ import { capabilityDataOf } from "../../../core/capabilities.js";
2
+ import { TYPED_BLOCK_CLASS } from "../../../core/schema/persisted-names.js";
3
+ import { derivationOf } from "../../../core/derivation.js";
4
+ import { blockTypeOf } from "../block-types.js";
5
+ import { titleHiddenOf } from "../baskets.js";
6
+ import { blockTypesOf, compositeBasketsOf } from "../nodes.js";
5
7
  import { useStoreRef } from "../../../vue/store-ref.js";
6
8
  import { computed, createBlock, createCommentVNode, createElementVNode, createVNode, defineComponent, normalizeClass, normalizeStyle, openBlock, unref, withCtx } from "vue";
7
9
  import { NodeViewContent, NodeViewWrapper, nodeViewProps } from "@tiptap/vue-3";
@@ -11,16 +13,16 @@ const _sfc_main = /*@__PURE__*/ defineComponent({
11
13
  props: nodeViewProps,
12
14
  setup(__props) {
13
15
  const props = __props;
14
- const kind = computed(() => compositeKind(compositeKindsOf(props.editor), String(props.node.attrs.kind)));
15
- const expanded = useStoreRef(() => props.editor.storage.composite.expanded);
16
+ const kind = computed(() => blockTypeOf(blockTypesOf(props.editor), String(props.node.attrs.blockType)));
17
+ const expanded = useStoreRef(() => props.editor.storage.typedBlock.expanded);
16
18
  const collapsed = computed(() => {
17
19
  const id = props.node.attrs.id;
18
20
  return typeof id === "string" && id !== "" && derivationOf(props.node) !== null && !expanded.value.has(id);
19
21
  });
20
- const basket = computed(() => basketOf(props.node));
22
+ const basket = computed(() => capabilityDataOf(props.editor, props.node, "basket"));
21
23
  const basketColor = computed(() => compositeBasketsOf(props.editor).find((candidate) => candidate.id === basket.value)?.color);
22
- const kindTone = computed(() => kind.value.chrome?.tone || void 0);
23
- const revealedTitles = useStoreRef(() => props.editor.storage.composite.revealedTitles);
24
+ const blockTypeTone = computed(() => kind.value.chrome?.tone || void 0);
25
+ const revealedTitles = useStoreRef(() => props.editor.storage.typedBlock.revealedTitles);
24
26
  const titleHidden = computed(() => {
25
27
  const id = props.node.attrs.id;
26
28
  return titleHiddenOf(props.node) && !(typeof id === "string" && revealedTitles.value.has(id));
@@ -28,22 +30,22 @@ const _sfc_main = /*@__PURE__*/ defineComponent({
28
30
  /** `text` as a CSS string literal (for `content:`). */
29
31
  const cssString = (text) => `"${text.replace(/["\\]/g, "\\$&").replace(/\n/g, "\\a ")}"`;
30
32
  const placeholderVars = computed(() => ({
31
- "--composite-title-placeholder": cssString(kind.value.titlePlaceholder),
33
+ "--composite-title-placeholder": cssString(kind.value.titlePlaceholder ?? ""),
32
34
  ...basketColor.value ? { "--sk-basket-color": basketColor.value } : {},
33
- ...kindTone.value ? { "--sk-kind-tone": kindTone.value } : {}
35
+ ...blockTypeTone.value ? { "--sk-block-type-tone": blockTypeTone.value } : {}
34
36
  }));
35
37
  return (_ctx, _cache) => {
36
38
  return openBlock(), createBlock(unref(NodeViewWrapper), {
37
39
  as: "section",
38
- class: normalizeClass(["composite", {
40
+ class: normalizeClass([unref(TYPED_BLOCK_CLASS), {
39
41
  "is-collapsed": collapsed.value,
40
42
  "is-selected rounded-md ring-1 ring-[var(--sk-primary)]": _ctx.selected
41
43
  }]),
42
- "data-type": "composite",
43
- "data-kind": _ctx.node.attrs.kind,
44
+ "data-type": "typedBlock",
45
+ "data-block-type": _ctx.node.attrs.blockType,
44
46
  "data-id": _ctx.node.attrs.id || void 0,
45
47
  "data-basket": basket.value || void 0,
46
- "data-kind-tone": kindTone.value ? "" : void 0,
48
+ "data-block-type-tone": blockTypeTone.value ? "" : void 0,
47
49
  "data-title-hidden": titleHidden.value ? "" : void 0,
48
50
  style: normalizeStyle(placeholderVars.value)
49
51
  }, {
@@ -59,10 +61,10 @@ const _sfc_main = /*@__PURE__*/ defineComponent({
59
61
  _: 1
60
62
  }, 8, [
61
63
  "class",
62
- "data-kind",
64
+ "data-block-type",
63
65
  "data-id",
64
66
  "data-basket",
65
- "data-kind-tone",
67
+ "data-block-type-tone",
66
68
  "data-title-hidden",
67
69
  "style"
68
70
  ]);
@@ -1 +1 @@
1
- {"version":3,"file":"CompositeView.js","names":["selected","node","_openBlock","_createBlock","_unref","_normalizeClass","_normalizeStyle","_withCtx","_createCommentVNode","_createElementVNode","_createVNode"],"sources":["../../../../src/features/composites/components/CompositeView.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { NodeViewContent, NodeViewWrapper, nodeViewProps } from '@tiptap/vue-3'\nimport { computed } from 'vue'\nimport { basketOf, titleHiddenOf } from '../baskets'\nimport { compositeKind } from '../kinds'\nimport { compositeBasketsOf, compositeKindsOf } from '../nodes'\nimport { useStoreRef } from '../../../vue/store-ref'\nimport { derivationOf } from '../derivation'\n\nconst props = defineProps(nodeViewProps)\n\nconst kind = computed(() => compositeKind(compositeKindsOf(props.editor), String(props.node.attrs.kind)))\n\n// A derived Baustein (one with a `meta.derivation`) shows collapsed to a faded preview until it is opened; the content\n// stays laid out (CSS clips it), so editing positions are unaffected. The chrome's chevron and a caret inside open it.\nconst expanded = useStoreRef(() => props.editor.storage.composite.expanded)\nconst collapsed = computed(() => {\n const id: unknown = props.node.attrs.id\n return typeof id === 'string' && id !== '' && derivationOf(props.node) !== null && !expanded.value.has(id)\n})\n\n// Colour basket (`meta.basket`): `data-basket` carries the id, the stripe takes the basket's colour from `--sk-basket-color`.\nconst basket = computed(() => basketOf(props.node))\nconst basketColor = computed(() => compositeBasketsOf(props.editor).find(candidate => candidate.id === basket.value)?.color)\n\n// Kind tone (`CompositeKind.chrome.tone`): `data-kind-tone` marks the wrapper, the surface reads the colour from `--sk-kind-tone`.\nconst kindTone = computed(() => kind.value.chrome?.tone || undefined)\n\n// A hidden title (`meta.titleHidden`) stays hidden until a caret enters it (`revealedTitles`, see `CompositeNode`).\nconst revealedTitles = useStoreRef(() => props.editor.storage.composite.revealedTitles)\nconst titleHidden = computed(() => {\n const id: unknown = props.node.attrs.id\n return titleHiddenOf(props.node) && !(typeof id === 'string' && revealedTitles.value.has(id))\n})\n\n/** `text` as a CSS string literal (for `content:`). */\nconst cssString = (text: string) => `\"${text.replace(/[\"\\\\]/g, '\\\\$&').replace(/\\n/g, '\\\\a ')}\"`\n// Placeholder of the empty title (composites.css `content: var(…)`); a nested composite sets its own.\nconst placeholderVars = computed(() => ({\n '--composite-title-placeholder': cssString(kind.value.titlePlaceholder),\n ...(basketColor.value ? { '--sk-basket-color': basketColor.value } : {}),\n ...(kindTone.value ? { '--sk-kind-tone': kindTone.value } : {}),\n}))\n</script>\n\n<template>\n <NodeViewWrapper\n as=\"section\"\n :class=\"['composite', { 'is-collapsed': collapsed, 'is-selected rounded-md ring-1 ring-[var(--sk-primary)]': selected }]\"\n data-type=\"composite\"\n :data-kind=\"node.attrs.kind\"\n :data-id=\"node.attrs.id || undefined\"\n :data-basket=\"basket || undefined\"\n :data-kind-tone=\"kindTone ? '' : undefined\"\n :data-title-hidden=\"titleHidden ? '' : undefined\"\n :style=\"placeholderVars\"\n >\n <!-- Anchor of the kind icon on the left border: it only takes the icon's place and size. The composite chrome overlay\n measures it and draws the icon as the button that opens the details popover and drags the composite. -->\n <span class=\"composite__toggle\" contenteditable=\"false\" aria-hidden=\"true\" />\n <NodeViewContent class=\"composite__content\" />\n </NodeViewWrapper>\n</template>\n"],"mappings":";;;;;;;;;;;;EASA,MAAM,QAAQ;EAEd,MAAM,OAAO,eAAe,cAAc,iBAAiB,MAAM,MAAM,GAAG,OAAO,MAAM,KAAK,MAAM,IAAI,CAAC,CAAC;EAIxG,MAAM,WAAW,kBAAkB,MAAM,OAAO,QAAQ,UAAU,QAAQ;EAC1E,MAAM,YAAY,eAAe;GAC/B,MAAM,KAAc,MAAM,KAAK,MAAM;GACrC,OAAO,OAAO,OAAO,YAAY,OAAO,MAAM,aAAa,MAAM,IAAI,MAAM,QAAQ,CAAC,SAAS,MAAM,IAAI,EAAE;EAC3G,CAAC;EAGD,MAAM,SAAS,eAAe,SAAS,MAAM,IAAI,CAAC;EAClD,MAAM,cAAc,eAAe,mBAAmB,MAAM,MAAM,CAAC,CAAC,MAAK,cAAa,UAAU,OAAO,OAAO,KAAK,CAAC,EAAE,KAAK;EAG3H,MAAM,WAAW,eAAe,KAAK,MAAM,QAAQ,QAAQ,KAAA,CAAS;EAGpE,MAAM,iBAAiB,kBAAkB,MAAM,OAAO,QAAQ,UAAU,cAAc;EACtF,MAAM,cAAc,eAAe;GACjC,MAAM,KAAc,MAAM,KAAK,MAAM;GACrC,OAAO,cAAc,MAAM,IAAI,KAAK,EAAE,OAAO,OAAO,YAAY,eAAe,MAAM,IAAI,EAAE;EAC7F,CAAC;;EAGD,MAAM,aAAa,SAAiB,IAAI,KAAK,QAAQ,UAAU,MAAM,CAAC,CAAC,QAAQ,OAAO,MAAM,EAAE;EAE9F,MAAM,kBAAkB,gBAAgB;GACtC,iCAAiC,UAAU,KAAK,MAAM,gBAAgB;GACtE,GAAI,YAAY,QAAQ,EAAE,qBAAqB,YAAY,MAAM,IAAI,CAAC;GACtE,GAAI,SAAS,QAAQ,EAAE,kBAAkB,SAAS,MAAM,IAAI,CAAC;EAC/D,EAAE;;GAIA,OAAAE,UAAA,GAAAC,YAekBC,MAAA,eAAA,GAAA;IAdhB,IAAG;IACF,OAAKC,eAAA,CAAA,aAAA;KAAA,gBAAkC,UAAA;KAAS,0DAA4DL,KAAAA;IAAQ,CAAA,CAAA;IACrH,aAAU;IACT,aAAWC,KAAAA,KAAK,MAAM;IACtB,WAASA,KAAAA,KAAK,MAAM,MAAM,KAAA;IAC1B,eAAa,OAAA,SAAU,KAAA;IACvB,kBAAgB,SAAA,QAAQ,KAAQ,KAAA;IAChC,qBAAmB,YAAA,QAAW,KAAQ,KAAA;IACtC,OAAKK,eAAE,gBAAA,KAAe;;IAEvB,SAAAC,cAC6G;KAD7GC,mBAAA,oOAAA;KAEA,OAAA,OAAA,OAAA,KAAAC,mBAA6E,QAAA;MAAvE,OAAM;MAAoB,iBAAgB;MAAQ,eAAY;;KACpEC,YAA8CN,MAAA,eAAA,GAAA,EAA7B,OAAM,qBAAoB,CAAA"}
1
+ {"version":3,"file":"CompositeView.js","names":["selected","node","_openBlock","_createBlock","_unref","_normalizeClass","_normalizeStyle","_withCtx","_createCommentVNode","_createElementVNode","_createVNode"],"sources":["../../../../src/features/composites/components/CompositeView.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { NodeViewContent, NodeViewWrapper, nodeViewProps } from '@tiptap/vue-3'\nimport { computed } from 'vue'\nimport { capabilityDataOf } from '../../../core/capabilities'\nimport { titleHiddenOf } from '../baskets'\nimport { blockTypeOf } from '../block-types'\nimport { compositeBasketsOf, blockTypesOf } from '../nodes'\nimport { useStoreRef } from '../../../vue/store-ref'\nimport { derivationOf } from '../../../core/derivation'\nimport { TYPED_BLOCK_CLASS } from '../../../core/schema/persisted-names'\n\nconst props = defineProps(nodeViewProps)\n\nconst kind = computed(() => blockTypeOf(blockTypesOf(props.editor), String(props.node.attrs.blockType)))\n\n// A derived Typed block (one with a `meta.derivation`) shows collapsed to a faded preview until it is opened; the content\n// stays laid out (CSS clips it), so editing positions are unaffected. The chrome's chevron and a caret inside open it.\nconst expanded = useStoreRef(() => props.editor.storage.typedBlock.expanded)\nconst collapsed = computed(() => {\n const id: unknown = props.node.attrs.id\n return typeof id === 'string' && id !== '' && derivationOf(props.node) !== null && !expanded.value.has(id)\n})\n\n// Colour basket (`meta.basket`): `data-basket` carries the id, the stripe takes the basket's colour from `--sk-basket-color`.\nconst basket = computed(() => capabilityDataOf<string>(props.editor, props.node, 'basket'))\nconst basketColor = computed(() => compositeBasketsOf(props.editor).find(candidate => candidate.id === basket.value)?.color)\n\n// Block type tone (`BlockType.chrome.tone`): `data-block-type-tone` marks the wrapper, the surface reads the colour from `--sk-block-type-tone`.\nconst blockTypeTone = computed(() => kind.value.chrome?.tone || undefined)\n\n// A hidden title (`meta.titleHidden`) stays hidden until a caret enters it (`revealedTitles`, see `CompositeNode`).\nconst revealedTitles = useStoreRef(() => props.editor.storage.typedBlock.revealedTitles)\nconst titleHidden = computed(() => {\n const id: unknown = props.node.attrs.id\n return titleHiddenOf(props.node) && !(typeof id === 'string' && revealedTitles.value.has(id))\n})\n\n/** `text` as a CSS string literal (for `content:`). */\nconst cssString = (text: string) => `\"${text.replace(/[\"\\\\]/g, '\\\\$&').replace(/\\n/g, '\\\\a ')}\"`\n// Placeholder of the empty title (composites.css `content: var(…)`); a nested composite sets its own.\nconst placeholderVars = computed(() => ({\n '--composite-title-placeholder': cssString(kind.value.titlePlaceholder ?? ''),\n ...(basketColor.value ? { '--sk-basket-color': basketColor.value } : {}),\n ...(blockTypeTone.value ? { '--sk-block-type-tone': blockTypeTone.value } : {}),\n}))\n</script>\n\n<template>\n <NodeViewWrapper\n as=\"section\"\n :class=\"[TYPED_BLOCK_CLASS, { 'is-collapsed': collapsed, 'is-selected rounded-md ring-1 ring-[var(--sk-primary)]': selected }]\"\n data-type=\"typedBlock\"\n :data-block-type=\"node.attrs.blockType\"\n :data-id=\"node.attrs.id || undefined\"\n :data-basket=\"basket || undefined\"\n :data-block-type-tone=\"blockTypeTone ? '' : undefined\"\n :data-title-hidden=\"titleHidden ? '' : undefined\"\n :style=\"placeholderVars\"\n >\n <!-- Anchor of the kind icon on the left border: it only takes the icon's place and size. The composite chrome overlay\n measures it and draws the icon as the button that opens the details popover and drags the composite. -->\n <span class=\"composite__toggle\" contenteditable=\"false\" aria-hidden=\"true\" />\n <NodeViewContent class=\"composite__content\" />\n </NodeViewWrapper>\n</template>\n"],"mappings":";;;;;;;;;;;;;;EAWA,MAAM,QAAQ;EAEd,MAAM,OAAO,eAAe,YAAY,aAAa,MAAM,MAAM,GAAG,OAAO,MAAM,KAAK,MAAM,SAAS,CAAC,CAAC;EAIvG,MAAM,WAAW,kBAAkB,MAAM,OAAO,QAAQ,WAAW,QAAQ;EAC3E,MAAM,YAAY,eAAe;GAC/B,MAAM,KAAc,MAAM,KAAK,MAAM;GACrC,OAAO,OAAO,OAAO,YAAY,OAAO,MAAM,aAAa,MAAM,IAAI,MAAM,QAAQ,CAAC,SAAS,MAAM,IAAI,EAAE;EAC3G,CAAC;EAGD,MAAM,SAAS,eAAe,iBAAyB,MAAM,QAAQ,MAAM,MAAM,QAAQ,CAAC;EAC1F,MAAM,cAAc,eAAe,mBAAmB,MAAM,MAAM,CAAC,CAAC,MAAK,cAAa,UAAU,OAAO,OAAO,KAAK,CAAC,EAAE,KAAK;EAG3H,MAAM,gBAAgB,eAAe,KAAK,MAAM,QAAQ,QAAQ,KAAA,CAAS;EAGzE,MAAM,iBAAiB,kBAAkB,MAAM,OAAO,QAAQ,WAAW,cAAc;EACvF,MAAM,cAAc,eAAe;GACjC,MAAM,KAAc,MAAM,KAAK,MAAM;GACrC,OAAO,cAAc,MAAM,IAAI,KAAK,EAAE,OAAO,OAAO,YAAY,eAAe,MAAM,IAAI,EAAE;EAC7F,CAAC;;EAGD,MAAM,aAAa,SAAiB,IAAI,KAAK,QAAQ,UAAU,MAAM,CAAC,CAAC,QAAQ,OAAO,MAAM,EAAE;EAE9F,MAAM,kBAAkB,gBAAgB;GACtC,iCAAiC,UAAU,KAAK,MAAM,oBAAoB,EAAE;GAC5E,GAAI,YAAY,QAAQ,EAAE,qBAAqB,YAAY,MAAM,IAAI,CAAC;GACtE,GAAI,cAAc,QAAQ,EAAE,wBAAwB,cAAc,MAAM,IAAI,CAAC;EAC/E,EAAE;;GAIA,OAAAE,UAAA,GAAAC,YAekBC,MAAA,eAAA,GAAA;IAdhB,IAAG;IACF,OAAKC,eAAA,CAAGD,MAAA,iBAAA,GAAiB;KAAA,gBAAoB,UAAA;KAAS,0DAA4DJ,KAAAA;IAAQ,CAAA,CAAA;IAC3H,aAAU;IACT,mBAAiBC,KAAAA,KAAK,MAAM;IAC5B,WAASA,KAAAA,KAAK,MAAM,MAAM,KAAA;IAC1B,eAAa,OAAA,SAAU,KAAA;IACvB,wBAAsB,cAAA,QAAa,KAAQ,KAAA;IAC3C,qBAAmB,YAAA,QAAW,KAAQ,KAAA;IACtC,OAAKK,eAAE,gBAAA,KAAe;;IAEvB,SAAAC,cAC6G;KAD7GC,mBAAA,oOAAA;KAEA,OAAA,OAAA,OAAA,KAAAC,mBAA6E,QAAA;MAAvE,OAAM;MAAoB,iBAAgB;MAAQ,eAAY;;KACpEC,YAA8CN,MAAA,eAAA,GAAA,EAA7B,OAAM,qBAAoB,CAAA"}
@@ -1,7 +1,7 @@
1
- import { derivationOf } from "../derivation.js";
1
+ import { derivationOf } from "../../../core/derivation.js";
2
2
  import { useUiKit } from "../../../vue/kit/use-ui-kit.js";
3
3
  import { useEditorI18n } from "../../../vue/use-editor-i18n.js";
4
- import { derivationDetailsOf, derivationIsForeign, derivationMethodLabel } from "../derived-chrome.js";
4
+ import { derivationDetailsOf, derivationIsForeign, derivationMethodLabel, isSourceMissing } from "../derived-chrome.js";
5
5
  import { formatDate } from "../meta-display.js";
6
6
  import { Fragment, computed, createCommentVNode, createElementBlock, createElementVNode, createTextVNode, createVNode, defineComponent, normalizeClass, openBlock, toDisplayString, unref } from "vue";
7
7
  //#region src/features/composites/components/DerivationBadge.vue
@@ -24,10 +24,10 @@ const _hoisted_10 = { class: "text-[var(--sk-muted)]" };
24
24
  const _hoisted_11 = { class: "text-[var(--sk-fg)]" };
25
25
  const _hoisted_12 = ["href"];
26
26
  /**
27
- * Where a derived Baustein comes from. Compact (the `derivation` field type): the „abgeleitet“ badge with method and
27
+ * Where a derived Typed block comes from. Compact (the `derivation` field type): the „abgeleitet“ badge with method and
28
28
  * date. `detailed` (the details card): also the model, whether the source changed („Quelle geändert“), whether the body
29
29
  * was edited since it was generated („bearbeitet“) and a link to the stored raw output. The detailed variant hashes
30
- * the body, so it belongs only where one Baustein is shown.
30
+ * the body, so it belongs only where one Typed block is shown.
31
31
  */
32
32
  const chip = "inline-flex h-5 shrink-0 items-center gap-1 rounded-sm px-1.5 text-xs leading-none whitespace-nowrap";
33
33
  const _sfc_main = /*@__PURE__*/ defineComponent({
@@ -45,6 +45,7 @@ const _sfc_main = /*@__PURE__*/ defineComponent({
45
45
  const details = computed(() => props.detailed ? derivationDetailsOf(props.editor, props.node) : null);
46
46
  const method = computed(() => derivation.value ? derivationMethodLabel(t, derivation.value.method) : "");
47
47
  const foreign = computed(() => derivation.value ? derivationIsForeign(props.editor, derivation.value) : false);
48
+ const sourceMissing = computed(() => derivation.value ? isSourceMissing(props.editor, props.node) : false);
48
49
  const created = computed(() => derivation.value?.createdAt ? formatDate(derivation.value.createdAt) : "");
49
50
  return (_ctx, _cache) => {
50
51
  return derivation.value && !__props.detailed ? (openBlock(), createElementBlock("div", _hoisted_1, [createVNode(unref(UIcon), {
@@ -54,6 +55,7 @@ const _sfc_main = /*@__PURE__*/ defineComponent({
54
55
  unref(t)("composites.derivation.badge"),
55
56
  method.value,
56
57
  foreign.value ? unref(t)("composites.derivation.foreign") : "",
58
+ sourceMissing.value ? unref(t)("composites.derivation.sourceMissing") : "",
57
59
  created.value
58
60
  ].filter(Boolean).join(" · ")), 1)])) : derivation.value && details.value ? (openBlock(), createElementBlock("div", _hoisted_3, [
59
61
  createElementVNode("div", _hoisted_4, [
@@ -68,15 +70,22 @@ const _sfc_main = /*@__PURE__*/ defineComponent({
68
70
  name: "i-lucide-file-symlink",
69
71
  class: "size-3.5"
70
72
  }), createTextVNode(toDisplayString(unref(t)("composites.derivation.foreign")), 1)], 2)) : createCommentVNode("v-if", true),
71
- details.value.stale ? (openBlock(), createElementBlock("span", {
73
+ details.value.sourceMissing ? (openBlock(), createElementBlock("span", {
72
74
  key: 1,
73
75
  class: normalizeClass([chip, "text-[var(--sk-warning)]"])
76
+ }, [createVNode(unref(UIcon), {
77
+ name: "i-lucide-unlink",
78
+ class: "size-3.5"
79
+ }), createTextVNode(toDisplayString(unref(t)("composites.derivation.sourceMissing")), 1)], 2)) : createCommentVNode("v-if", true),
80
+ details.value.stale ? (openBlock(), createElementBlock("span", {
81
+ key: 2,
82
+ class: normalizeClass([chip, "text-[var(--sk-warning)]"])
74
83
  }, [createVNode(unref(UIcon), {
75
84
  name: "i-lucide-triangle-alert",
76
85
  class: "size-3.5"
77
86
  }), createTextVNode(toDisplayString(unref(t)("composites.derivation.stale")), 1)], 2)) : createCommentVNode("v-if", true),
78
87
  details.value.edited ? (openBlock(), createElementBlock("span", {
79
- key: 2,
88
+ key: 3,
80
89
  class: normalizeClass([chip, "text-[var(--sk-muted)]"])
81
90
  }, [createVNode(unref(UIcon), {
82
91
  name: "i-lucide-pencil",
@@ -1 +1 @@
1
- {"version":3,"file":"DerivationBadge.js","names":["_openBlock","_createElementBlock","_createVNode","_unref","_createElementVNode","_toDisplayString","_normalizeClass","_createTextVNode","_createCommentVNode","_Fragment"],"sources":["../../../../src/features/composites/components/DerivationBadge.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport type { Node as ProseMirrorNode } from '@tiptap/pm/model'\nimport type { Editor } from '@tiptap/core'\nimport { computed } from 'vue'\nimport { useUiKit } from '../../../vue/kit/use-ui-kit'\nimport { useEditorI18n } from '../../../vue/use-editor-i18n'\nimport { derivationOf } from '../derivation'\nimport { derivationDetailsOf, derivationIsForeign, derivationMethodLabel } from '../derived-chrome'\nimport { formatDate } from '../meta-display'\n\n/**\n * Where a derived Baustein comes from. Compact (the `derivation` field type): the „abgeleitet“ badge with method and\n * date. `detailed` (the details card): also the model, whether the source changed („Quelle geändert“), whether the body\n * was edited since it was generated („bearbeitet“) and a link to the stored raw output. The detailed variant hashes\n * the body, so it belongs only where one Baustein is shown.\n */\nconst props = defineProps<{ editor: Editor, node: ProseMirrorNode, detailed?: boolean }>()\n\nconst { Icon: UIcon } = useUiKit()\nconst { t } = useEditorI18n()\n\nconst derivation = computed(() => derivationOf(props.node))\nconst details = computed(() => props.detailed ? derivationDetailsOf(props.editor, props.node) : null)\nconst method = computed(() => derivation.value ? derivationMethodLabel(t, derivation.value.method) : '')\nconst foreign = computed(() => derivation.value ? derivationIsForeign(props.editor, derivation.value) : false)\nconst created = computed(() => derivation.value?.createdAt ? formatDate(derivation.value.createdAt) : '')\n\nconst chip = 'inline-flex h-5 shrink-0 items-center gap-1 rounded-sm px-1.5 text-xs leading-none whitespace-nowrap'\n</script>\n\n<template>\n <div v-if=\"derivation && !detailed\" class=\"flex min-w-0 items-center gap-1.5 text-xs text-[var(--sk-muted)]\">\n <UIcon name=\"i-lucide-git-branch\" class=\"size-3.5 shrink-0\" />\n <span class=\"truncate\">{{ [t('composites.derivation.badge'), method, foreign ? t('composites.derivation.foreign') : '', created].filter(Boolean).join(' · ') }}</span>\n </div>\n\n <div v-else-if=\"derivation && details\" class=\"flex flex-col gap-1.5 rounded-md p-2 text-xs ring ring-[var(--sk-border)]\">\n <div class=\"flex flex-wrap items-center gap-1\">\n <span :class=\"[chip, 'text-[var(--sk-muted)]']\">\n <UIcon name=\"i-lucide-git-branch\" class=\"size-3.5\" />{{ t('composites.derivation.badge') }}\n </span>\n <span v-if=\"details.foreign\" :class=\"[chip, 'text-[var(--sk-muted)]']\">\n <UIcon name=\"i-lucide-file-symlink\" class=\"size-3.5\" />{{ t('composites.derivation.foreign') }}\n </span>\n <span v-if=\"details.stale\" :class=\"[chip, 'text-[var(--sk-warning)]']\">\n <UIcon name=\"i-lucide-triangle-alert\" class=\"size-3.5\" />{{ t('composites.derivation.stale') }}\n </span>\n <span v-if=\"details.edited\" :class=\"[chip, 'text-[var(--sk-muted)]']\">\n <UIcon name=\"i-lucide-pencil\" class=\"size-3.5\" />{{ t('composites.derivation.edited') }}\n </span>\n </div>\n <dl class=\"grid grid-cols-[auto_1fr] gap-x-2 gap-y-0.5\">\n <dt class=\"text-[var(--sk-muted)]\">{{ t('composites.derivation.method') }}</dt>\n <dd class=\"truncate text-[var(--sk-fg)]\">{{ method }}</dd>\n <template v-if=\"derivation.model\">\n <dt class=\"text-[var(--sk-muted)]\">{{ t('composites.derivation.model') }}</dt>\n <dd class=\"truncate text-[var(--sk-fg)]\" :title=\"derivation.model\">{{ derivation.model }}</dd>\n </template>\n <template v-if=\"created\">\n <dt class=\"text-[var(--sk-muted)]\">{{ t('composites.derivation.createdAt') }}</dt>\n <dd class=\"text-[var(--sk-fg)]\">{{ created }}</dd>\n </template>\n </dl>\n <a\n v-if=\"details.outputUrl\"\n :href=\"details.outputUrl\"\n target=\"_blank\"\n rel=\"noopener\"\n class=\"inline-flex w-fit items-center gap-1 text-[var(--sk-primary)] hover:underline\"\n >\n <UIcon name=\"i-lucide-external-link\" class=\"size-3.5\" />{{ t('composites.derivation.openOutput') }}\n </a>\n </div>\n</template>\n"],"mappings":"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"}
1
+ {"version":3,"file":"DerivationBadge.js","names":["_openBlock","_createElementBlock","_createVNode","_unref","_createElementVNode","_toDisplayString","_normalizeClass","_createTextVNode","_createCommentVNode","_Fragment"],"sources":["../../../../src/features/composites/components/DerivationBadge.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport type { Node as ProseMirrorNode } from '@tiptap/pm/model'\nimport type { Editor } from '@tiptap/core'\nimport { computed } from 'vue'\nimport { useUiKit } from '../../../vue/kit/use-ui-kit'\nimport { useEditorI18n } from '../../../vue/use-editor-i18n'\nimport { derivationOf } from '../../../core/derivation'\nimport { derivationDetailsOf, derivationIsForeign, derivationMethodLabel, isSourceMissing } from '../derived-chrome'\nimport { formatDate } from '../meta-display'\n\n/**\n * Where a derived Typed block comes from. Compact (the `derivation` field type): the „abgeleitet“ badge with method and\n * date. `detailed` (the details card): also the model, whether the source changed („Quelle geändert“), whether the body\n * was edited since it was generated („bearbeitet“) and a link to the stored raw output. The detailed variant hashes\n * the body, so it belongs only where one Typed block is shown.\n */\nconst props = defineProps<{ editor: Editor, node: ProseMirrorNode, detailed?: boolean }>()\n\nconst { Icon: UIcon } = useUiKit()\nconst { t } = useEditorI18n()\n\nconst derivation = computed(() => derivationOf(props.node))\nconst details = computed(() => props.detailed ? derivationDetailsOf(props.editor, props.node) : null)\nconst method = computed(() => derivation.value ? derivationMethodLabel(t, derivation.value.method) : '')\nconst foreign = computed(() => derivation.value ? derivationIsForeign(props.editor, derivation.value) : false)\nconst sourceMissing = computed(() => derivation.value ? isSourceMissing(props.editor, props.node) : false)\nconst created = computed(() => derivation.value?.createdAt ? formatDate(derivation.value.createdAt) : '')\n\nconst chip = 'inline-flex h-5 shrink-0 items-center gap-1 rounded-sm px-1.5 text-xs leading-none whitespace-nowrap'\n</script>\n\n<template>\n <div v-if=\"derivation && !detailed\" class=\"flex min-w-0 items-center gap-1.5 text-xs text-[var(--sk-muted)]\">\n <UIcon name=\"i-lucide-git-branch\" class=\"size-3.5 shrink-0\" />\n <span class=\"truncate\">{{ [t('composites.derivation.badge'), method, foreign ? t('composites.derivation.foreign') : '', sourceMissing ? t('composites.derivation.sourceMissing') : '', created].filter(Boolean).join(' · ') }}</span>\n </div>\n\n <div v-else-if=\"derivation && details\" class=\"flex flex-col gap-1.5 rounded-md p-2 text-xs ring ring-[var(--sk-border)]\">\n <div class=\"flex flex-wrap items-center gap-1\">\n <span :class=\"[chip, 'text-[var(--sk-muted)]']\">\n <UIcon name=\"i-lucide-git-branch\" class=\"size-3.5\" />{{ t('composites.derivation.badge') }}\n </span>\n <span v-if=\"details.foreign\" :class=\"[chip, 'text-[var(--sk-muted)]']\">\n <UIcon name=\"i-lucide-file-symlink\" class=\"size-3.5\" />{{ t('composites.derivation.foreign') }}\n </span>\n <span v-if=\"details.sourceMissing\" :class=\"[chip, 'text-[var(--sk-warning)]']\">\n <UIcon name=\"i-lucide-unlink\" class=\"size-3.5\" />{{ t('composites.derivation.sourceMissing') }}\n </span>\n <span v-if=\"details.stale\" :class=\"[chip, 'text-[var(--sk-warning)]']\">\n <UIcon name=\"i-lucide-triangle-alert\" class=\"size-3.5\" />{{ t('composites.derivation.stale') }}\n </span>\n <span v-if=\"details.edited\" :class=\"[chip, 'text-[var(--sk-muted)]']\">\n <UIcon name=\"i-lucide-pencil\" class=\"size-3.5\" />{{ t('composites.derivation.edited') }}\n </span>\n </div>\n <dl class=\"grid grid-cols-[auto_1fr] gap-x-2 gap-y-0.5\">\n <dt class=\"text-[var(--sk-muted)]\">{{ t('composites.derivation.method') }}</dt>\n <dd class=\"truncate text-[var(--sk-fg)]\">{{ method }}</dd>\n <template v-if=\"derivation.model\">\n <dt class=\"text-[var(--sk-muted)]\">{{ t('composites.derivation.model') }}</dt>\n <dd class=\"truncate text-[var(--sk-fg)]\" :title=\"derivation.model\">{{ derivation.model }}</dd>\n </template>\n <template v-if=\"created\">\n <dt class=\"text-[var(--sk-muted)]\">{{ t('composites.derivation.createdAt') }}</dt>\n <dd class=\"text-[var(--sk-fg)]\">{{ created }}</dd>\n </template>\n </dl>\n <a\n v-if=\"details.outputUrl\"\n :href=\"details.outputUrl\"\n target=\"_blank\"\n rel=\"noopener\"\n class=\"inline-flex w-fit items-center gap-1 text-[var(--sk-primary)] hover:underline\"\n >\n <UIcon name=\"i-lucide-external-link\" class=\"size-3.5\" />{{ t('composites.derivation.openOutput') }}\n </a>\n </div>\n</template>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4BA,MAAM,OAAO;;;;;;;;;EAZb,MAAM,QAAQ;EAEd,MAAM,EAAE,MAAM,UAAU,SAAS;EACjC,MAAM,EAAE,MAAM,cAAc;EAE5B,MAAM,aAAa,eAAe,aAAa,MAAM,IAAI,CAAC;EAC1D,MAAM,UAAU,eAAe,MAAM,WAAW,oBAAoB,MAAM,QAAQ,MAAM,IAAI,IAAI,IAAI;EACpG,MAAM,SAAS,eAAe,WAAW,QAAQ,sBAAsB,GAAG,WAAW,MAAM,MAAM,IAAI,EAAE;EACvG,MAAM,UAAU,eAAe,WAAW,QAAQ,oBAAoB,MAAM,QAAQ,WAAW,KAAK,IAAI,KAAK;EAC7G,MAAM,gBAAgB,eAAe,WAAW,QAAQ,gBAAgB,MAAM,QAAQ,MAAM,IAAI,IAAI,KAAK;EACzG,MAAM,UAAU,eAAe,WAAW,OAAO,YAAY,WAAW,WAAW,MAAM,SAAS,IAAI,EAAE;;GAM3F,OAAA,WAAA,SAAU,CAAK,QAAA,YAA1BA,UAAA,GAAAC,mBAGM,OAHN,YAGM,CAFJC,YAA8DC,MAAA,KAAA,GAAA;IAAvD,MAAK;IAAsB,OAAM;GACxC,CAAA,GAAAC,mBAAqO,QAArO,YAAqOC,gBAAA;IAA1MF,MAAA,CAAA,CAAC,CAAA,6BAAA;IAAiC,OAAA;IAAQ,QAAA,QAAUA,MAAA,CAAA,CAAC,CAAA,+BAAA,IAAA;IAAwC,cAAA,QAAgBA,MAAA,CAAA,CAAC,CAAA,qCAAA,IAAA;IAA8C,QAAA;GAAO,CAAA,CAAE,OAAO,OAAO,CAAA,CAAE,KAAI,KAAA,CAAA,GAAA,CAAA,CAAA,CAAA,KAGtM,WAAA,SAAc,QAAA,SAA9BH,UAAA,GAAAC,mBAuCM,OAvCN,YAuCM;IAtCJG,mBAgBM,OAhBN,YAgBM;KAfJA,mBAEO,QAAA,EAFA,OAAKE,eAAA,CAAG,MAAI,wBAAA,CAAA,EAAA,GACjB,CAAAJ,YAAqDC,MAAA,KAAA,GAAA;MAA9C,MAAK;MAAsB,OAAM;KAAgB,CAAA,GAAAI,gBAAAF,gBAAAF,MAAA,CAAA,CAAC,CAAA,6BAAA,CAAA,GAAA,CAAA,CAAA,GAAA,CAAA;KAE/C,QAAA,MAAQ,WAApBH,UAAA,GAAAC,mBAEO,QAAA;;MAFuB,OAAKK,eAAA,CAAG,MAAI,wBAAA,CAAA;KACxC,GAAA,CAAAJ,YAAuDC,MAAA,KAAA,GAAA;MAAhD,MAAK;MAAwB,OAAM;KAAgB,CAAA,GAAAI,gBAAAF,gBAAAF,MAAA,CAAA,CAAC,CAAA,+BAAA,CAAA,GAAA,CAAA,CAAA,GAAA,CAAA,KAAA,mBAAA,QAAA,IAAA;KAEjD,QAAA,MAAQ,iBAApBH,UAAA,GAAAC,mBAEO,QAAA;;MAF6B,OAAKK,eAAA,CAAG,MAAI,0BAAA,CAAA;KAC9C,GAAA,CAAAJ,YAAiDC,MAAA,KAAA,GAAA;MAA1C,MAAK;MAAkB,OAAM;KAAgB,CAAA,GAAAI,gBAAAF,gBAAAF,MAAA,CAAA,CAAC,CAAA,qCAAA,CAAA,GAAA,CAAA,CAAA,GAAA,CAAA,KAAA,mBAAA,QAAA,IAAA;KAE3C,QAAA,MAAQ,SAApBH,UAAA,GAAAC,mBAEO,QAAA;;MAFqB,OAAKK,eAAA,CAAG,MAAI,0BAAA,CAAA;KACtC,GAAA,CAAAJ,YAAyDC,MAAA,KAAA,GAAA;MAAlD,MAAK;MAA0B,OAAM;KAAgB,CAAA,GAAAI,gBAAAF,gBAAAF,MAAA,CAAA,CAAC,CAAA,6BAAA,CAAA,GAAA,CAAA,CAAA,GAAA,CAAA,KAAA,mBAAA,QAAA,IAAA;KAEnD,QAAA,MAAQ,UAApBH,UAAA,GAAAC,mBAEO,QAAA;;MAFsB,OAAKK,eAAA,CAAG,MAAI,wBAAA,CAAA;KACvC,GAAA,CAAAJ,YAAiDC,MAAA,KAAA,GAAA;MAA1C,MAAK;MAAkB,OAAM;KAAgB,CAAA,GAAAI,gBAAAF,gBAAAF,MAAA,CAAA,CAAC,CAAA,8BAAA,CAAA,GAAA,CAAA,CAAA,GAAA,CAAA,KAAA,mBAAA,QAAA,IAAA;;IAGzDC,mBAWK,MAXL,YAWK;KAVHA,mBAA+E,MAA/E,YAA+EC,gBAAzCF,MAAA,CAAA,CAAC,CAAA,8BAAA,CAAA,GAAA,CAAA;KACvCC,mBAA0D,MAA1D,YAA0DC,gBAAd,OAAA,KAAM,GAAA,CAAA;KAClC,WAAA,MAAW,SAA3BL,UAAA,GAAAC,mBAGWQ,UAAA,EAAA,KAAA,EAAA,GAAA,CAFTL,mBAA8E,MAA9E,YAA8EC,gBAAxCF,MAAA,CAAA,CAAC,CAAA,6BAAA,CAAA,GAAA,CAAA,GACvCC,mBAA8F,MAAA;MAA1F,OAAM;MAAgC,OAAO,WAAA,MAAW;KAAU,GAAAC,gBAAA,WAAA,MAAW,KAAK,GAAA,GAAA,UAAA,CAAA,GAAA,EAAA,KAAA,mBAAA,QAAA,IAAA;KAExE,QAAA,SAAhBL,UAAA,GAAAC,mBAGWQ,UAAA,EAAA,KAAA,EAAA,GAAA,CAFTL,mBAAkF,MAAlF,aAAkFC,gBAA5CF,MAAA,CAAA,CAAC,CAAA,iCAAA,CAAA,GAAA,CAAA,GACvCC,mBAAkD,MAAlD,aAAkDC,gBAAf,QAAA,KAAO,GAAA,CAAA,CAAA,GAAA,EAAA,KAAA,mBAAA,QAAA,IAAA;;IAItC,QAAA,MAAQ,aADhBL,UAAA,GAAAC,mBAQI,KAAA;;KAND,MAAM,QAAA,MAAQ;KACf,QAAO;KACP,KAAI;KACJ,OAAM;IAEN,GAAA,CAAAC,YAAwDC,MAAA,KAAA,GAAA;KAAjD,MAAK;KAAyB,OAAM;IAAgB,CAAA,GAAAI,gBAAAF,gBAAAF,MAAA,CAAA,CAAC,CAAA,kCAAA,CAAA,GAAA,CAAA,CAAA,GAAA,GAAA,WAAA,KAAAK,mBAAA,QAAA,IAAA"}
@@ -11,7 +11,7 @@ const _hoisted_1 = {
11
11
  };
12
12
  const _hoisted_2 = { class: "truncate text-sm" };
13
13
  /**
14
- * Focus mode indicator (mounted by the composites feature): while a Baustein is focused (`focusComposite`) a small chip
14
+ * Focus mode indicator (mounted by the composites feature): while a Typed block is focused (`focusComposite`) a small chip
15
15
  * fixed at the bottom of the surface names it and leaves focus mode.
16
16
  */
17
17
  const _sfc_main = /*@__PURE__*/ defineComponent({
@@ -1 +1 @@
1
- {"version":3,"file":"FocusChip.js","names":["_openBlock","_createElementBlock","_createVNode","_unref","_createElementVNode","_toDisplayString","_createCommentVNode"],"sources":["../../../../src/features/composites/components/FocusChip.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport type { Editor } from '@tiptap/vue-3'\nimport { computed } from 'vue'\nimport { findBlockById } from '../../../core/schema'\nimport { useUiKit } from '../../../vue/kit/use-ui-kit'\nimport { useEditorI18n } from '../../../vue/use-editor-i18n'\nimport { compositeFocusOf } from '../focus'\n\n/**\n * Focus mode indicator (mounted by the composites feature): while a Baustein is focused (`focusComposite`) a small chip\n * fixed at the bottom of the surface names it and leaves focus mode.\n */\nconst props = defineProps<{ editor: Editor }>()\n\nconst { Button: UButton, Icon: UIcon } = useUiKit()\nconst { t } = useEditorI18n()\n\n// The vue-3 Editor's `state` is reactive, so this follows every transaction.\nconst focused = computed(() => {\n if (props.editor.isDestroyed) return null\n const id = compositeFocusOf(props.editor.state)\n const found = id ? findBlockById(props.editor.state.doc, id) : null\n return found ? { title: found.node.child(0).textContent.trim() || t('composites.untitled') } : null\n})\n</script>\n\n<template>\n <div\n v-if=\"focused\"\n class=\"fixed bottom-4 left-1/2 z-20 flex max-w-[90vw] -translate-x-1/2 items-center gap-2 rounded-full border border-[var(--sk-border)] bg-[var(--sk-bg)] py-1 pl-3 pr-1 shadow-lg\"\n role=\"status\"\n >\n <UIcon name=\"i-lucide-focus\" class=\"size-4 shrink-0 text-[var(--sk-primary)]\" />\n <span class=\"truncate text-sm\">{{ t('composites.focus.chip', { title: focused.title }) }}</span>\n <UButton size=\"xs\" color=\"neutral\" variant=\"ghost\" icon=\"i-lucide-x\" :label=\"t('composites.focus.release')\" :aria-label=\"t('composites.focus.leave')\" @click=\"editor.commands.focusComposite(null)\" />\n </div>\n</template>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;EAYA,MAAM,QAAQ;EAEd,MAAM,EAAE,QAAQ,SAAS,MAAM,UAAU,SAAS;EAClD,MAAM,EAAE,MAAM,cAAc;EAG5B,MAAM,UAAU,eAAe;GAC7B,IAAI,MAAM,OAAO,aAAa,OAAO;GACrC,MAAM,KAAK,iBAAiB,MAAM,OAAO,KAAK;GAC9C,MAAM,QAAQ,KAAK,cAAc,MAAM,OAAO,MAAM,KAAK,EAAE,IAAI;GAC/D,OAAO,QAAQ,EAAE,OAAO,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,YAAY,KAAK,KAAK,EAAE,qBAAqB,EAAE,IAAI;EACjG,CAAC;;GAKS,OAAA,QAAA,SADRA,UAAA,GAAAC,mBAQM,OARN,YAQM;IAHJC,YAAgFC,MAAA,KAAA,GAAA;KAAzE,MAAK;KAAiB,OAAM;;IACnCC,mBAAgG,QAAhG,YAAgGC,gBAA9DF,MAAA,CAAA,CAAC,CAAA,yBAAA,EAAA,OAAmC,QAAA,MAAQ,MAAK,CAAA,CAAA,GAAA,CAAA;IACnFD,YAAsMC,MAAA,OAAA,GAAA;KAA7L,MAAK;KAAK,OAAM;KAAU,SAAQ;KAAQ,MAAK;KAAc,OAAOA,MAAA,CAAA,CAAC,CAAA,0BAAA;KAA+B,cAAYA,MAAA,CAAA,CAAC,CAAA,wBAAA;KAA6B,SAAK,OAAA,OAAA,OAAA,MAAA,WAAE,QAAA,OAAO,SAAS,eAAc,IAAA"}
1
+ {"version":3,"file":"FocusChip.js","names":["_openBlock","_createElementBlock","_createVNode","_unref","_createElementVNode","_toDisplayString","_createCommentVNode"],"sources":["../../../../src/features/composites/components/FocusChip.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport type { Editor } from '@tiptap/vue-3'\nimport { computed } from 'vue'\nimport { findBlockById } from '../../../core/schema'\nimport { useUiKit } from '../../../vue/kit/use-ui-kit'\nimport { useEditorI18n } from '../../../vue/use-editor-i18n'\nimport { compositeFocusOf } from '../focus'\n\n/**\n * Focus mode indicator (mounted by the composites feature): while a Typed block is focused (`focusComposite`) a small chip\n * fixed at the bottom of the surface names it and leaves focus mode.\n */\nconst props = defineProps<{ editor: Editor }>()\n\nconst { Button: UButton, Icon: UIcon } = useUiKit()\nconst { t } = useEditorI18n()\n\n// The vue-3 Editor's `state` is reactive, so this follows every transaction.\nconst focused = computed(() => {\n if (props.editor.isDestroyed) return null\n const id = compositeFocusOf(props.editor.state)\n const found = id ? findBlockById(props.editor.state.doc, id) : null\n return found ? { title: found.node.child(0).textContent.trim() || t('composites.untitled') } : null\n})\n</script>\n\n<template>\n <div\n v-if=\"focused\"\n class=\"fixed bottom-4 left-1/2 z-20 flex max-w-[90vw] -translate-x-1/2 items-center gap-2 rounded-full border border-[var(--sk-border)] bg-[var(--sk-bg)] py-1 pl-3 pr-1 shadow-lg\"\n role=\"status\"\n >\n <UIcon name=\"i-lucide-focus\" class=\"size-4 shrink-0 text-[var(--sk-primary)]\" />\n <span class=\"truncate text-sm\">{{ t('composites.focus.chip', { title: focused.title }) }}</span>\n <UButton size=\"xs\" color=\"neutral\" variant=\"ghost\" icon=\"i-lucide-x\" :label=\"t('composites.focus.release')\" :aria-label=\"t('composites.focus.leave')\" @click=\"editor.commands.focusComposite(null)\" />\n </div>\n</template>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;EAYA,MAAM,QAAQ;EAEd,MAAM,EAAE,QAAQ,SAAS,MAAM,UAAU,SAAS;EAClD,MAAM,EAAE,MAAM,cAAc;EAG5B,MAAM,UAAU,eAAe;GAC7B,IAAI,MAAM,OAAO,aAAa,OAAO;GACrC,MAAM,KAAK,iBAAiB,MAAM,OAAO,KAAK;GAC9C,MAAM,QAAQ,KAAK,cAAc,MAAM,OAAO,MAAM,KAAK,EAAE,IAAI;GAC/D,OAAO,QAAQ,EAAE,OAAO,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,YAAY,KAAK,KAAK,EAAE,qBAAqB,EAAE,IAAI;EACjG,CAAC;;GAKS,OAAA,QAAA,SADRA,UAAA,GAAAC,mBAQM,OARN,YAQM;IAHJC,YAAgFC,MAAA,KAAA,GAAA;KAAzE,MAAK;KAAiB,OAAM;;IACnCC,mBAAgG,QAAhG,YAAgGC,gBAA9DF,MAAA,CAAA,CAAC,CAAA,yBAAA,EAAA,OAAmC,QAAA,MAAQ,MAAK,CAAA,CAAA,GAAA,CAAA;IACnFD,YAAsMC,MAAA,OAAA,GAAA;KAA7L,MAAK;KAAK,OAAM;KAAU,SAAQ;KAAQ,MAAK;KAAc,OAAOA,MAAA,CAAA,CAAC,CAAA,0BAAA;KAA+B,cAAYA,MAAA,CAAA,CAAC,CAAA,wBAAA;KAA6B,SAAK,OAAA,OAAA,OAAA,MAAA,WAAE,QAAA,OAAO,SAAS,eAAc,IAAA"}
@@ -1,7 +1,7 @@
1
1
  import { Editor } from "@tiptap/vue-3";
2
2
  //#region src/features/composites/components/FocusChip.vue.d.ts
3
3
  /**
4
- * Focus mode indicator (mounted by the composites feature): while a Baustein is focused (`focusComposite`) a small chip
4
+ * Focus mode indicator (mounted by the composites feature): while a Typed block is focused (`focusComposite`) a small chip
5
5
  * fixed at the bottom of the surface names it and leaves focus mode.
6
6
  */
7
7
  type __VLS_Props = {
@@ -1,11 +1,11 @@
1
+ import { setBlockProperty } from "../properties.js";
1
2
  import { useUiKit } from "../../../vue/kit/use-ui-kit.js";
2
3
  import { useEditorI18n } from "../../../vue/use-editor-i18n.js";
3
- import { setCompositeMetaField } from "../rows.js";
4
4
  import { metaText } from "../meta-display.js";
5
5
  import { useCompositeRows } from "../use-composite-rows.js";
6
6
  import { computed, createBlock, defineComponent, openBlock, unref } from "vue";
7
7
  //#region src/features/composites/components/ReferenceFieldSelect.vue
8
- /** The select of a `reference` field: the other Bausteine of the document (with a block ID, of the field's target kinds) by title. */
8
+ /** The select of a `reference` field: the other Typed blocks of the document (with a block ID, of the field's target Block types) by title. */
9
9
  const NONE = "__none__";
10
10
  const _sfc_main = /*@__PURE__*/ defineComponent({
11
11
  __name: "ReferenceFieldSelect",
@@ -31,7 +31,7 @@ const _sfc_main = /*@__PURE__*/ defineComponent({
31
31
  value: candidate.id
32
32
  }))]);
33
33
  function onChoice(value) {
34
- setCompositeMetaField(props.editor, props.row, props.field.key, typeof value === "string" && value !== NONE ? value : "");
34
+ setBlockProperty(props.editor, props.row, props.field.key, typeof value === "string" && value !== NONE ? value : "");
35
35
  }
36
36
  return (_ctx, _cache) => {
37
37
  return openBlock(), createBlock(unref(USelect), {
@@ -1 +1 @@
1
- {"version":3,"file":"ReferenceFieldSelect.js","names":["_openBlock","_createBlock","_unref"],"sources":["../../../../src/features/composites/components/ReferenceFieldSelect.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport type { Editor } from '@tiptap/core'\nimport { computed } from 'vue'\nimport { useUiKit } from '../../../vue/kit/use-ui-kit'\nimport { useEditorI18n } from '../../../vue/use-editor-i18n'\nimport type { CompositeMetaField } from '../kinds'\nimport { metaText } from '../meta-display'\nimport { type CompositeRow, setCompositeMetaField } from '../rows'\nimport { useCompositeRows } from '../use-composite-rows'\n\n/** The select of a `reference` field: the other Bausteine of the document (with a block ID, of the field's target kinds) by title. */\nconst props = defineProps<{\n editor: Editor\n row: CompositeRow\n field: CompositeMetaField\n disabled?: boolean\n size?: 'xs' | 'sm' | 'md'\n}>()\n\n/** Nuxt UI's select has no empty-string value: the \"no reference\" item travels as this sentinel. */\nconst NONE = '__none__'\n\nconst { Select: USelect } = useUiKit()\nconst { t } = useEditorI18n()\nconst { rows } = useCompositeRows(() => props.editor)\n\nconst stored = computed(() => metaText(props.row, props.field))\nconst items = computed(() => [\n { label: t('composites.field.none'), value: NONE },\n ...rows.value\n .filter(candidate => candidate.id !== null && candidate.id !== props.row.id && (!props.field.targets || props.field.targets.includes(candidate.kind)))\n .map(candidate => ({ label: `${candidate.title.trim() || t('composites.inspector.untitled')} · ${candidate.kindLabel}`, value: candidate.id as string })),\n])\n\nfunction onChoice(value: unknown) {\n setCompositeMetaField(props.editor, props.row, props.field.key, typeof value === 'string' && value !== NONE ? value : '')\n}\n</script>\n\n<template>\n <USelect\n :model-value=\"stored || undefined\"\n :items=\"items\"\n :placeholder=\"t('composites.field.choose', { field: field.label })\"\n :aria-label=\"field.label\"\n :disabled=\"disabled\"\n :size=\"size\"\n class=\"w-full\"\n @update:model-value=\"onChoice\"\n />\n</template>\n"],"mappings":";;;;;;;;AAoBA,MAAM,OAAO;;;;;;;;;;;EATb,MAAM,QAAQ;;EAWd,MAAM,EAAE,QAAQ,YAAY,SAAS;EACrC,MAAM,EAAE,MAAM,cAAc;EAC5B,MAAM,EAAE,SAAS,uBAAuB,MAAM,MAAM;EAEpD,MAAM,SAAS,eAAe,SAAS,MAAM,KAAK,MAAM,KAAK,CAAC;EAC9D,MAAM,QAAQ,eAAe,CAC3B;GAAE,OAAO,EAAE,uBAAuB;GAAG,OAAO;EAAK,GACjD,GAAG,KAAK,MACL,QAAO,cAAa,UAAU,OAAO,QAAQ,UAAU,OAAO,MAAM,IAAI,OAAO,CAAC,MAAM,MAAM,WAAW,MAAM,MAAM,QAAQ,SAAS,UAAU,IAAI,EAAE,CAAA,CACpJ,KAAI,eAAc;GAAE,OAAO,GAAG,UAAU,MAAM,KAAK,KAAK,EAAE,+BAA+B,EAAE,KAAK,UAAU;GAAa,OAAO,UAAU;EAAa,EAAE,CAC5J,CAAC;EAED,SAAS,SAAS,OAAgB;GAChC,sBAAsB,MAAM,QAAQ,MAAM,KAAK,MAAM,MAAM,KAAK,OAAO,UAAU,YAAY,UAAU,OAAO,QAAQ,EAAE;EAC1H;;GAIE,OAAAA,UAAA,GAAAC,YASEC,MAAA,OAAA,GAAA;IARC,eAAa,OAAA,SAAU,KAAA;IACvB,OAAO,MAAA;IACP,aAAaA,MAAA,CAAA,CAAC,CAAA,2BAAA,EAAA,OAAqC,QAAA,MAAM,MAAK,CAAA;IAC9D,cAAY,QAAA,MAAM;IAClB,UAAU,QAAA;IACV,MAAM,QAAA;IACP,OAAM;IACL,uBAAoB"}
1
+ {"version":3,"file":"ReferenceFieldSelect.js","names":["_openBlock","_createBlock","_unref"],"sources":["../../../../src/features/composites/components/ReferenceFieldSelect.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport type { Editor } from '@tiptap/core'\nimport { computed } from 'vue'\nimport { useUiKit } from '../../../vue/kit/use-ui-kit'\nimport { useEditorI18n } from '../../../vue/use-editor-i18n'\nimport type { PropertyDefinition } from '../../../core/properties'\nimport { metaText } from '../meta-display'\nimport { type BlockProperties, setBlockProperty } from '../properties'\nimport { useCompositeRows } from '../use-composite-rows'\n\n/** The select of a `reference` field: the other Typed blocks of the document (with a block ID, of the field's target Block types) by title. */\nconst props = defineProps<{\n editor: Editor\n row: BlockProperties\n field: PropertyDefinition\n disabled?: boolean\n size?: 'xs' | 'sm' | 'md'\n}>()\n\n/** Nuxt UI's select has no empty-string value: the \"no reference\" item travels as this sentinel. */\nconst NONE = '__none__'\n\nconst { Select: USelect } = useUiKit()\nconst { t } = useEditorI18n()\nconst { rows } = useCompositeRows(() => props.editor)\n\nconst stored = computed(() => metaText(props.row, props.field))\nconst items = computed(() => [\n { label: t('composites.field.none'), value: NONE },\n ...rows.value\n .filter(candidate => candidate.id !== null && candidate.id !== props.row.id && (!props.field.targets || props.field.targets.includes(candidate.kind)))\n .map(candidate => ({ label: `${candidate.title.trim() || t('composites.inspector.untitled')} · ${candidate.kindLabel}`, value: candidate.id as string })),\n])\n\nfunction onChoice(value: unknown) {\n setBlockProperty(props.editor, props.row, props.field.key, typeof value === 'string' && value !== NONE ? value : '')\n}\n</script>\n\n<template>\n <USelect\n :model-value=\"stored || undefined\"\n :items=\"items\"\n :placeholder=\"t('composites.field.choose', { field: field.label })\"\n :aria-label=\"field.label\"\n :disabled=\"disabled\"\n :size=\"size\"\n class=\"w-full\"\n @update:model-value=\"onChoice\"\n />\n</template>\n"],"mappings":";;;;;;;;AAoBA,MAAM,OAAO;;;;;;;;;;;EATb,MAAM,QAAQ;;EAWd,MAAM,EAAE,QAAQ,YAAY,SAAS;EACrC,MAAM,EAAE,MAAM,cAAc;EAC5B,MAAM,EAAE,SAAS,uBAAuB,MAAM,MAAM;EAEpD,MAAM,SAAS,eAAe,SAAS,MAAM,KAAK,MAAM,KAAK,CAAC;EAC9D,MAAM,QAAQ,eAAe,CAC3B;GAAE,OAAO,EAAE,uBAAuB;GAAG,OAAO;EAAK,GACjD,GAAG,KAAK,MACL,QAAO,cAAa,UAAU,OAAO,QAAQ,UAAU,OAAO,MAAM,IAAI,OAAO,CAAC,MAAM,MAAM,WAAW,MAAM,MAAM,QAAQ,SAAS,UAAU,IAAI,EAAE,CAAA,CACpJ,KAAI,eAAc;GAAE,OAAO,GAAG,UAAU,MAAM,KAAK,KAAK,EAAE,+BAA+B,EAAE,KAAK,UAAU;GAAa,OAAO,UAAU;EAAa,EAAE,CAC5J,CAAC;EAED,SAAS,SAAS,OAAgB;GAChC,iBAAiB,MAAM,QAAQ,MAAM,KAAK,MAAM,MAAM,KAAK,OAAO,UAAU,YAAY,UAAU,OAAO,QAAQ,EAAE;EACrH;;GAIE,OAAAA,UAAA,GAAAC,YASEC,MAAA,OAAA,GAAA;IARC,eAAa,OAAA,SAAU,KAAA;IACvB,OAAO,MAAA;IACP,aAAaA,MAAA,CAAA,CAAC,CAAA,2BAAA,EAAA,OAAqC,QAAA,MAAM,MAAK,CAAA;IAC9D,cAAY,QAAA,MAAM;IAClB,UAAU,QAAA;IACV,MAAM,QAAA;IACP,OAAM;IACL,uBAAoB"}
@@ -6,7 +6,7 @@ import { computed, createBlock, createTextVNode, createVNode, defineComponent, n
6
6
  import { NodeViewWrapper, nodeViewProps } from "@tiptap/vue-3";
7
7
  //#region src/features/composites/components/ReferenceView.vue
8
8
  /**
9
- * The `reference` chip: the live short citation (or title) of the Baustein it points at, followed by its locator.
9
+ * The `reference` chip: the live short citation (or title) of the Typed block it points at, followed by its locator.
10
10
  * A click reveals the target and, with a locator, opens its source there (page of a PDF, time of a recording); a
11
11
  * target that no longer exists shows a greyed „gone“ label. Double click or right click opens a popover to set the
12
12
  * locator („Stelle“) in an editable editor.
@@ -1 +1 @@
1
- {"version":3,"file":"ReferenceView.js","names":["selected","node","_openBlock","_createBlock","_unref","_normalizeClass","_withModifiers","_withCtx","_createTextVNode","_toDisplayString","_createVNode","_withKeys"],"sources":["../../../../src/features/composites/components/ReferenceView.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { NodeViewWrapper, nodeViewProps } from '@tiptap/vue-3'\nimport { computed, onBeforeUnmount, onMounted, ref, shallowRef } from 'vue'\nimport { useUiKit } from '../../../vue/kit/use-ui-kit'\nimport { useEditorI18n } from '../../../vue/use-editor-i18n'\nimport { referenceAttrsOf, resolveReference } from '../reference-label'\nimport { revealSource } from '../reveal-source'\n\n/**\n * The `reference` chip: the live short citation (or title) of the Baustein it points at, followed by its locator.\n * A click reveals the target and, with a locator, opens its source there (page of a PDF, time of a recording); a\n * target that no longer exists shows a greyed „gone“ label. Double click or right click opens a popover to set the\n * locator („Stelle“) in an editable editor.\n */\nconst props = defineProps(nodeViewProps)\n\nconst { Input: UInput, Popover: UPopover } = useUiKit()\nconst { t } = useEditorI18n()\n\nconst resolved = shallowRef(resolveReference(props.editor, referenceAttrsOf(props.node)))\n\n// The target's title and bibliography edits change the label: re-resolve after document changes, once per frame.\nlet frame = 0\nfunction sync() {\n cancelAnimationFrame(frame)\n frame = requestAnimationFrame(() => {\n if (props.editor.isDestroyed) return\n const next = resolveReference(props.editor, referenceAttrsOf(props.node))\n const current = resolved.value\n if (next.label !== current.label || next.title !== current.title || next.gone !== current.gone) resolved.value = next\n })\n}\nonMounted(() => props.editor.on('update', sync))\nonBeforeUnmount(() => {\n cancelAnimationFrame(frame)\n props.editor.off('update', sync)\n})\n\nconst text = computed(() => {\n const label = resolved.value.gone ? t('composites.reference.gone') : resolved.value.label\n const locator = props.node.attrs.locator\n return typeof locator === 'string' && locator && !resolved.value.gone ? `${label}, ${locator}` : label\n})\n\nfunction onClick() {\n const target = String(props.node.attrs.target)\n if (!props.editor.commands.revealBlock(target)) return\n const locator = props.node.attrs.locator\n if (typeof locator === 'string' && locator) revealSource(props.editor, target, locator)\n}\n\nconst root = ref<{ $el: HTMLElement } | null>(null)\nconst reference = { getBoundingClientRect: () => root.value?.$el.getBoundingClientRect() ?? new DOMRect() }\n\nconst open = ref(false)\nconst draft = ref('')\n\nfunction openLocator() {\n if (!props.editor.isEditable) return\n draft.value = typeof props.node.attrs.locator === 'string' ? props.node.attrs.locator : ''\n open.value = true\n}\n\nfunction commit() {\n open.value = false\n const pos = props.getPos()\n if (typeof pos !== 'number' || draft.value.trim() === (props.node.attrs.locator ?? '')) return\n props.editor.commands.setReferenceLocator(pos, draft.value)\n}\n</script>\n\n<template>\n <NodeViewWrapper\n ref=\"root\"\n as=\"span\"\n :class=\"['reference', { 'is-gone': resolved.gone, 'is-selected': selected }]\"\n data-type=\"reference\"\n :data-target=\"node.attrs.target\"\n :title=\"resolved.gone ? undefined : resolved.title\"\n role=\"link\"\n @click=\"onClick\"\n @dblclick.prevent=\"openLocator\"\n @contextmenu.prevent=\"openLocator\"\n >\n {{ text }}\n <UPopover\n :open=\"open\"\n :reference=\"reference\"\n :content=\"{ side: 'bottom', align: 'start', sideOffset: 4, onCloseAutoFocus: (event: Event) => event.preventDefault() }\"\n :ui=\"{ content: 'w-56 p-2' }\"\n @update:open=\"(value: boolean) => { if (!value) commit() }\"\n >\n <template #content>\n <UInput\n v-model=\"draft\"\n size=\"xs\"\n class=\"w-full\"\n :placeholder=\"t('composites.reference.locatorPlaceholder')\"\n :aria-label=\"t('composites.reference.locator')\"\n @keydown.enter.prevent=\"commit\"\n />\n </template>\n </UPopover>\n </NodeViewWrapper>\n</template>\n"],"mappings":"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"}
1
+ {"version":3,"file":"ReferenceView.js","names":["selected","node","_openBlock","_createBlock","_unref","_normalizeClass","_withModifiers","_withCtx","_createTextVNode","_toDisplayString","_createVNode","_withKeys"],"sources":["../../../../src/features/composites/components/ReferenceView.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { NodeViewWrapper, nodeViewProps } from '@tiptap/vue-3'\nimport { computed, onBeforeUnmount, onMounted, ref, shallowRef } from 'vue'\nimport { useUiKit } from '../../../vue/kit/use-ui-kit'\nimport { useEditorI18n } from '../../../vue/use-editor-i18n'\nimport { referenceAttrsOf, resolveReference } from '../reference-label'\nimport { revealSource } from '../reveal-source'\n\n/**\n * The `reference` chip: the live short citation (or title) of the Typed block it points at, followed by its locator.\n * A click reveals the target and, with a locator, opens its source there (page of a PDF, time of a recording); a\n * target that no longer exists shows a greyed „gone“ label. Double click or right click opens a popover to set the\n * locator („Stelle“) in an editable editor.\n */\nconst props = defineProps(nodeViewProps)\n\nconst { Input: UInput, Popover: UPopover } = useUiKit()\nconst { t } = useEditorI18n()\n\nconst resolved = shallowRef(resolveReference(props.editor, referenceAttrsOf(props.node)))\n\n// The target's title and bibliography edits change the label: re-resolve after document changes, once per frame.\nlet frame = 0\nfunction sync() {\n cancelAnimationFrame(frame)\n frame = requestAnimationFrame(() => {\n if (props.editor.isDestroyed) return\n const next = resolveReference(props.editor, referenceAttrsOf(props.node))\n const current = resolved.value\n if (next.label !== current.label || next.title !== current.title || next.gone !== current.gone) resolved.value = next\n })\n}\nonMounted(() => props.editor.on('update', sync))\nonBeforeUnmount(() => {\n cancelAnimationFrame(frame)\n props.editor.off('update', sync)\n})\n\nconst text = computed(() => {\n const label = resolved.value.gone ? t('composites.reference.gone') : resolved.value.label\n const locator = props.node.attrs.locator\n return typeof locator === 'string' && locator && !resolved.value.gone ? `${label}, ${locator}` : label\n})\n\nfunction onClick() {\n const target = String(props.node.attrs.target)\n if (!props.editor.commands.revealBlock(target)) return\n const locator = props.node.attrs.locator\n if (typeof locator === 'string' && locator) revealSource(props.editor, target, locator)\n}\n\nconst root = ref<{ $el: HTMLElement } | null>(null)\nconst reference = { getBoundingClientRect: () => root.value?.$el.getBoundingClientRect() ?? new DOMRect() }\n\nconst open = ref(false)\nconst draft = ref('')\n\nfunction openLocator() {\n if (!props.editor.isEditable) return\n draft.value = typeof props.node.attrs.locator === 'string' ? props.node.attrs.locator : ''\n open.value = true\n}\n\nfunction commit() {\n open.value = false\n const pos = props.getPos()\n if (typeof pos !== 'number' || draft.value.trim() === (props.node.attrs.locator ?? '')) return\n props.editor.commands.setReferenceLocator(pos, draft.value)\n}\n</script>\n\n<template>\n <NodeViewWrapper\n ref=\"root\"\n as=\"span\"\n :class=\"['reference', { 'is-gone': resolved.gone, 'is-selected': selected }]\"\n data-type=\"reference\"\n :data-target=\"node.attrs.target\"\n :title=\"resolved.gone ? undefined : resolved.title\"\n role=\"link\"\n @click=\"onClick\"\n @dblclick.prevent=\"openLocator\"\n @contextmenu.prevent=\"openLocator\"\n >\n {{ text }}\n <UPopover\n :open=\"open\"\n :reference=\"reference\"\n :content=\"{ side: 'bottom', align: 'start', sideOffset: 4, onCloseAutoFocus: (event: Event) => event.preventDefault() }\"\n :ui=\"{ content: 'w-56 p-2' }\"\n @update:open=\"(value: boolean) => { if (!value) commit() }\"\n >\n <template #content>\n <UInput\n v-model=\"draft\"\n size=\"xs\"\n class=\"w-full\"\n :placeholder=\"t('composites.reference.locatorPlaceholder')\"\n :aria-label=\"t('composites.reference.locator')\"\n @keydown.enter.prevent=\"commit\"\n />\n </template>\n </UPopover>\n </NodeViewWrapper>\n</template>\n"],"mappings":";;;;;;;;;;;;;;;;;EAcA,MAAM,QAAQ;EAEd,MAAM,EAAE,OAAO,QAAQ,SAAS,aAAa,SAAS;EACtD,MAAM,EAAE,MAAM,cAAc;EAE5B,MAAM,WAAW,WAAW,iBAAiB,MAAM,QAAQ,iBAAiB,MAAM,IAAI,CAAC,CAAC;EAGxF,IAAI,QAAQ;EACZ,SAAS,OAAO;GACd,qBAAqB,KAAK;GAC1B,QAAQ,4BAA4B;IAClC,IAAI,MAAM,OAAO,aAAa;IAC9B,MAAM,OAAO,iBAAiB,MAAM,QAAQ,iBAAiB,MAAM,IAAI,CAAC;IACxE,MAAM,UAAU,SAAS;IACzB,IAAI,KAAK,UAAU,QAAQ,SAAS,KAAK,UAAU,QAAQ,SAAS,KAAK,SAAS,QAAQ,MAAM,SAAS,QAAQ;GACnH,CAAC;EACH;EACA,gBAAgB,MAAM,OAAO,GAAG,UAAU,IAAI,CAAC;EAC/C,sBAAsB;GACpB,qBAAqB,KAAK;GAC1B,MAAM,OAAO,IAAI,UAAU,IAAI;EACjC,CAAC;EAED,MAAM,OAAO,eAAe;GAC1B,MAAM,QAAQ,SAAS,MAAM,OAAO,EAAE,2BAA2B,IAAI,SAAS,MAAM;GACpF,MAAM,UAAU,MAAM,KAAK,MAAM;GACjC,OAAO,OAAO,YAAY,YAAY,WAAW,CAAC,SAAS,MAAM,OAAO,GAAG,MAAM,IAAI,YAAY;EACnG,CAAC;EAED,SAAS,UAAU;GACjB,MAAM,SAAS,OAAO,MAAM,KAAK,MAAM,MAAM;GAC7C,IAAI,CAAC,MAAM,OAAO,SAAS,YAAY,MAAM,GAAG;GAChD,MAAM,UAAU,MAAM,KAAK,MAAM;GACjC,IAAI,OAAO,YAAY,YAAY,SAAS,aAAa,MAAM,QAAQ,QAAQ,OAAO;EACxF;EAEA,MAAM,OAAO,IAAiC,IAAI;EAClD,MAAM,YAAY,EAAE,6BAA6B,KAAK,OAAO,IAAI,sBAAsB,KAAK,IAAI,QAAQ,EAAE;EAE1G,MAAM,OAAO,IAAI,KAAK;EACtB,MAAM,QAAQ,IAAI,EAAE;EAEpB,SAAS,cAAc;GACrB,IAAI,CAAC,MAAM,OAAO,YAAY;GAC9B,MAAM,QAAQ,OAAO,MAAM,KAAK,MAAM,YAAY,WAAW,MAAM,KAAK,MAAM,UAAU;GACxF,KAAK,QAAQ;EACf;EAEA,SAAS,SAAS;GAChB,KAAK,QAAQ;GACb,MAAM,MAAM,MAAM,OAAO;GACzB,IAAI,OAAO,QAAQ,YAAY,MAAM,MAAM,KAAK,OAAO,MAAM,KAAK,MAAM,WAAW,KAAK;GACxF,MAAM,OAAO,SAAS,oBAAoB,KAAK,MAAM,KAAK;EAC5D;;GAIE,OAAAE,UAAA,GAAAC,YA+BkBC,MAAA,eAAA,GAAA;IA9BZ,SAAA;IAAJ,KAAI;IACJ,IAAG;IACF,OAAKC,eAAA,CAAA,aAAA;KAAA,WAA6B,SAAA,MAAS;KAAI,eAAiBL,KAAAA;IAAQ,CAAA,CAAA;IACzE,aAAU;IACT,eAAaC,KAAAA,KAAK,MAAM;IACxB,OAAO,SAAA,MAAS,OAAO,KAAA,IAAY,SAAA,MAAS;IAC7C,MAAK;IACG;IACP,YAAQK,cAAU,aAAW,CAAA,SAAA,CAAA;IAC7B,eAAWA,cAAU,aAAW,CAAA,SAAA,CAAA;;IAEjC,SAAAC,cAAU,CAAPC,gBAAAC,gBAAA,KAAA,KAAI,IAAG,KACV,CAAA,GAAAC,YAiBWN,MAAA,QAAA,GAAA;KAhBR,MAAM,KAAA;KACK;KACX,SAAO;MAAA,MAAA;MAAA,OAAA;MAAA,YAAA;MAAA,mBAAsE,UAAiB,MAAM,eAAc;KAAA;KAClH,IAAI,EAAA,SAAA,WAAA;KACJ,iBAAW,OAAA,OAAA,OAAA,MAAG,UAAc;MAAA,IAAA,CAAY,OAAO,OAAM;KAAA;;KAE3C,SAAOG,cAQd,CAPFG,YAOEN,MAAA,MAAA,GAAA;MANS,YAAA,MAAA;MAAA,uBAAA,OAAA,OAAA,OAAA,MAAA,WAAA,MAAK,QAAA;MACd,MAAK;MACL,OAAM;MACL,aAAaA,MAAA,CAAA,CAAC,CAAA,yCAAA;MACd,cAAYA,MAAA,CAAA,CAAC,CAAA,8BAAA;MACb,WAAOO,SAAAL,cAAgB,QAAM,CAAA,SAAA,CAAA,GAAA,CAAA,OAAA,CAAA"}