@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,10 +1,11 @@
1
1
  import { fetchErrorMessage } from "../../../core/fetch-error.js";
2
2
  import { useUiKit } from "../../../vue/kit/use-ui-kit.js";
3
3
  import { useEditorI18n } from "../../../vue/use-editor-i18n.js";
4
- import { addGeneration, addReference, removeImage, select, selectedImage, setDescription, toggleImage, togglePromptBlock } from "../state.js";
4
+ import { addGeneration, addReference, adoptImage, removeImage, select, selectedImage, setDescription, toggleImage, togglePromptBlock } from "../state.js";
5
5
  import _sfc_main$1 from "./ImageStudioChat.js";
6
- import _sfc_main$2 from "./ImageStudioTile.js";
7
- import { Fragment, computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createVNode, defineComponent, onBeforeUnmount, openBlock, ref, renderList, toDisplayString, unref, useId, useTemplateRef, watch, withCtx, withModifiers } from "vue";
6
+ import _sfc_main$2 from "./ImageStudioLibraryPanel.js";
7
+ import _sfc_main$3 from "./ImageStudioTile.js";
8
+ import { Fragment, computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createVNode, defineComponent, onBeforeUnmount, openBlock, ref, renderList, toDisplayString, unref, useId, useTemplateRef, vShow, watch, withCtx, withDirectives, withModifiers } from "vue";
8
9
  //#region src/features/image-studio/components/ImageStudioDialog.vue
9
10
  const _hoisted_1 = {
10
11
  class: "flex flex-col gap-3",
@@ -20,46 +21,57 @@ const _hoisted_7 = {
20
21
  class: "text-sm text-[var(--sk-muted)]"
21
22
  };
22
23
  const _hoisted_8 = { class: "flex min-h-0 flex-col gap-4 lg:overflow-y-auto" };
23
- const _hoisted_9 = ["data-dragging", "aria-labelledby"];
24
- const _hoisted_10 = { class: "flex items-center justify-between gap-2" };
25
- const _hoisted_11 = ["id"];
26
- const _hoisted_12 = {
24
+ const _hoisted_9 = {
25
+ key: 0,
26
+ class: "flex gap-2",
27
+ role: "tablist",
28
+ "data-image-studio-tabs": ""
29
+ };
30
+ const _hoisted_10 = ["data-dragging", "aria-labelledby"];
31
+ const _hoisted_11 = { class: "flex items-center justify-between gap-2" };
32
+ const _hoisted_12 = ["id"];
33
+ const _hoisted_13 = {
27
34
  key: 0,
28
35
  class: "text-xs text-[var(--sk-muted)]",
29
36
  role: "status"
30
37
  };
31
- const _hoisted_13 = {
38
+ const _hoisted_14 = {
32
39
  key: 2,
33
40
  class: "grid grid-cols-2 gap-2 sm:grid-cols-3"
34
41
  };
35
- const _hoisted_14 = {
42
+ const _hoisted_15 = {
36
43
  key: 3,
37
44
  class: "text-sm text-[var(--sk-muted)]"
38
45
  };
39
- const _hoisted_15 = ["aria-labelledby"];
40
- const _hoisted_16 = ["id"];
41
- const _hoisted_17 = {
46
+ const _hoisted_16 = ["aria-labelledby"];
47
+ const _hoisted_17 = ["id"];
48
+ const _hoisted_18 = {
42
49
  key: 0,
43
50
  class: "grid grid-cols-2 gap-2 sm:grid-cols-3"
44
51
  };
45
- const _hoisted_18 = {
52
+ const _hoisted_19 = {
46
53
  key: 1,
47
54
  class: "text-sm text-[var(--sk-muted)]"
48
55
  };
49
- const _hoisted_19 = { class: "flex min-h-0 flex-col gap-3" };
50
- const _hoisted_20 = ["aria-labelledby"];
51
- const _hoisted_21 = ["id"];
52
- const _hoisted_22 = { class: "flex aspect-square items-center justify-center overflow-hidden rounded-md border border-[var(--sk-border)] bg-[var(--sk-bg-elevated)]" };
53
- const _hoisted_23 = ["src", "alt"];
54
- const _hoisted_24 = {
55
- key: 1,
56
+ const _hoisted_20 = { class: "flex min-h-0 flex-col gap-3" };
57
+ const _hoisted_21 = ["aria-labelledby"];
58
+ const _hoisted_22 = ["id"];
59
+ const _hoisted_23 = { class: "flex aspect-square items-center justify-center overflow-hidden rounded-md border border-[var(--sk-border)] bg-[var(--sk-bg-elevated)]" };
60
+ const _hoisted_24 = ["src", "alt"];
61
+ const _hoisted_25 = ["src"];
62
+ const _hoisted_26 = {
63
+ key: 2,
56
64
  class: "text-sm text-[var(--sk-muted)]"
57
65
  };
58
66
  /**
59
- * The Bild-Studio: description and Prompt-Bausteine on the left, references and previous generations in the middle,
67
+ * The Bild-Studio: description and prompt blocks on the left, references and previous generations in the middle,
60
68
  * the block's image and the chat on the right. The dialog applies the reducers of `../state` to `store.state` and
61
69
  * hands every result to `store.update`; the store only generates, uploads and persists (see `ImageStudioStore`).
62
70
  *
71
+ * With `store.library` the middle column has two tabs: „Dieser Block“ (the above) and „Galerie“ (the host's images to
72
+ * use as the block's image, add as references, rename or delete). `store.placeholderUrl` is shown in the preview while
73
+ * no image is selected.
74
+ *
63
75
  * The description is committed 500 ms after the last keystroke and at once on blur, on „Erzeugen“ and on close, so the
64
76
  * host never builds a prompt from a stale text. Closing (or unmounting) aborts a running generation; an aborted
65
77
  * generation adds no turn, a failed one adds a turn with the problem.
@@ -110,6 +122,20 @@ const _sfc_main = /*@__PURE__*/ defineComponent({
110
122
  const toggle = (id) => update(toggleImage(props.store.state.value, id));
111
123
  const use = (id) => update(select(props.store.state.value, id));
112
124
  const remove = (id) => update(removeImage(props.store.state.value, id));
125
+ const tab = ref("block");
126
+ const library = computed(() => props.store.library);
127
+ const plain = ({ id, url, title }) => ({
128
+ id,
129
+ url,
130
+ title,
131
+ active: false
132
+ });
133
+ const useFromLibrary = (item) => update(adoptImage(props.store.state.value, plain(item)));
134
+ const referenceFromLibrary = (item) => update(addReference(props.store.state.value, plain(item)));
135
+ function removedFromLibrary(id) {
136
+ const current = props.store.state.value;
137
+ if (current.references.some((image) => image.id === id) || current.generations.some((image) => image.id === id)) update(removeImage(current, id));
138
+ }
113
139
  const fileInputRef = useTemplateRef("fileInput");
114
140
  const uploading = ref(0);
115
141
  const uploadProblem = ref();
@@ -187,6 +213,7 @@ const _sfc_main = /*@__PURE__*/ defineComponent({
187
213
  }
188
214
  watch(() => props.open, (open) => {
189
215
  if (open) return;
216
+ tab.value = "block";
190
217
  commitDescription();
191
218
  abortGeneration();
192
219
  });
@@ -255,49 +282,100 @@ const _sfc_main = /*@__PURE__*/ defineComponent({
255
282
  }), 128))], 8, _hoisted_6)) : (openBlock(), createElementBlock("p", _hoisted_7, toDisplayString(unref(t)("imageStudio.dialog.blocks.empty")), 1))
256
283
  ], 8, _hoisted_3),
257
284
  createCommentVNode(" Middle: references and previous generations. "),
258
- createElementVNode("div", _hoisted_8, [createElementVNode("section", {
259
- class: "flex flex-col gap-2 rounded-md border border-dashed border-transparent p-1 data-[dragging=true]:border-[var(--sk-primary)]",
260
- "data-dragging": dragging.value,
261
- "aria-labelledby": `${unref(uid)}-references`,
262
- "data-image-studio-drop": "",
263
- onDragenter: _cache[2] || (_cache[2] = withModifiers(($event) => dragging.value = true, ["prevent"])),
264
- onDragover: _cache[3] || (_cache[3] = withModifiers(($event) => dragging.value = true, ["prevent"])),
265
- onDragleave: _cache[4] || (_cache[4] = ($event) => dragging.value = false),
266
- onDrop: withModifiers(onDrop, ["prevent"])
267
- }, [
268
- createElementVNode("div", _hoisted_10, [
269
- createElementVNode("h3", {
270
- id: `${unref(uid)}-references`,
271
- class: "text-sm font-medium text-[var(--sk-fg-highlighted)]"
272
- }, toDisplayString(unref(t)("imageStudio.dialog.references.heading")), 9, _hoisted_11),
273
- createVNode(unref(UButton), {
274
- label: unref(t)("imageStudio.dialog.references.upload"),
275
- icon: "i-lucide-upload",
285
+ createElementVNode("div", _hoisted_8, [
286
+ library.value ? (openBlock(), createElementBlock("div", _hoisted_9, [(openBlock(), createElementBlock(Fragment, null, renderList(["block", "library"], (entry) => {
287
+ return createVNode(unref(UButton), {
288
+ key: entry,
289
+ label: unref(t)(`imageStudio.dialog.tabs.${entry}`),
276
290
  size: "xs",
277
291
  color: "neutral",
278
- variant: "outline",
279
- loading: uploading.value > 0,
280
- onClick: _cache[1] || (_cache[1] = ($event) => fileInputRef.value?.click())
281
- }, null, 8, ["label", "loading"]),
282
- createElementVNode("input", {
283
- ref: "fileInput",
284
- type: "file",
285
- accept: "image/*",
286
- multiple: "",
287
- hidden: "",
288
- "data-image-studio-file": "",
289
- onChange: onFilesChosen
290
- }, null, 544)
291
- ]),
292
- uploading.value ? (openBlock(), createElementBlock("p", _hoisted_12, toDisplayString(unref(t)("imageStudio.dialog.references.uploading")), 1)) : createCommentVNode("v-if", true),
293
- uploadProblem.value ? (openBlock(), createBlock(unref(UAlert), {
292
+ variant: tab.value === entry ? "solid" : "ghost",
293
+ role: "tab",
294
+ "aria-selected": tab.value === entry,
295
+ "data-image-studio-tab": entry,
296
+ onClick: ($event) => tab.value = entry
297
+ }, null, 8, [
298
+ "label",
299
+ "variant",
300
+ "aria-selected",
301
+ "data-image-studio-tab",
302
+ "onClick"
303
+ ]);
304
+ }), 64))])) : createCommentVNode("v-if", true),
305
+ library.value && tab.value === "library" ? (openBlock(), createBlock(_sfc_main$2, {
294
306
  key: 1,
295
- color: "error",
296
- variant: "subtle",
297
- title: uploadProblem.value
298
- }, null, 8, ["title"])) : createCommentVNode("v-if", true),
299
- state.value.references.length ? (openBlock(), createElementBlock("ul", _hoisted_13, [(openBlock(true), createElementBlock(Fragment, null, renderList(state.value.references, (image) => {
300
- return openBlock(), createBlock(_sfc_main$2, {
307
+ library: library.value,
308
+ state: state.value,
309
+ onUse: useFromLibrary,
310
+ onReference: referenceFromLibrary,
311
+ onRemoved: removedFromLibrary
312
+ }, null, 8, ["library", "state"])) : createCommentVNode("v-if", true),
313
+ withDirectives(createElementVNode("section", {
314
+ class: "flex flex-col gap-2 rounded-md border border-dashed border-transparent p-1 data-[dragging=true]:border-[var(--sk-primary)]",
315
+ "data-dragging": dragging.value,
316
+ "aria-labelledby": `${unref(uid)}-references`,
317
+ "data-image-studio-drop": "",
318
+ onDragenter: _cache[2] || (_cache[2] = withModifiers(($event) => dragging.value = true, ["prevent"])),
319
+ onDragover: _cache[3] || (_cache[3] = withModifiers(($event) => dragging.value = true, ["prevent"])),
320
+ onDragleave: _cache[4] || (_cache[4] = ($event) => dragging.value = false),
321
+ onDrop: withModifiers(onDrop, ["prevent"])
322
+ }, [
323
+ createElementVNode("div", _hoisted_11, [
324
+ createElementVNode("h3", {
325
+ id: `${unref(uid)}-references`,
326
+ class: "text-sm font-medium text-[var(--sk-fg-highlighted)]"
327
+ }, toDisplayString(unref(t)("imageStudio.dialog.references.heading")), 9, _hoisted_12),
328
+ createVNode(unref(UButton), {
329
+ label: unref(t)("imageStudio.dialog.references.upload"),
330
+ icon: "i-lucide-upload",
331
+ size: "xs",
332
+ color: "neutral",
333
+ variant: "outline",
334
+ loading: uploading.value > 0,
335
+ onClick: _cache[1] || (_cache[1] = ($event) => fileInputRef.value?.click())
336
+ }, null, 8, ["label", "loading"]),
337
+ createElementVNode("input", {
338
+ ref: "fileInput",
339
+ type: "file",
340
+ accept: "image/*",
341
+ multiple: "",
342
+ hidden: "",
343
+ "data-image-studio-file": "",
344
+ onChange: onFilesChosen
345
+ }, null, 544)
346
+ ]),
347
+ uploading.value ? (openBlock(), createElementBlock("p", _hoisted_13, toDisplayString(unref(t)("imageStudio.dialog.references.uploading")), 1)) : createCommentVNode("v-if", true),
348
+ uploadProblem.value ? (openBlock(), createBlock(unref(UAlert), {
349
+ key: 1,
350
+ color: "error",
351
+ variant: "subtle",
352
+ title: uploadProblem.value
353
+ }, null, 8, ["title"])) : createCommentVNode("v-if", true),
354
+ state.value.references.length ? (openBlock(), createElementBlock("ul", _hoisted_14, [(openBlock(true), createElementBlock(Fragment, null, renderList(state.value.references, (image) => {
355
+ return openBlock(), createBlock(_sfc_main$3, {
356
+ key: image.id,
357
+ image,
358
+ selected: state.value.selected === image.id,
359
+ onToggle: ($event) => toggle(image.id),
360
+ onSelect: ($event) => use(image.id),
361
+ onRemove: ($event) => remove(image.id)
362
+ }, null, 8, [
363
+ "image",
364
+ "selected",
365
+ "onToggle",
366
+ "onSelect",
367
+ "onRemove"
368
+ ]);
369
+ }), 128))])) : (openBlock(), createElementBlock("p", _hoisted_15, toDisplayString(unref(t)("imageStudio.dialog.references.drop")), 1))
370
+ ], 40, _hoisted_10), [[vShow, tab.value === "block" || !library.value]]),
371
+ withDirectives(createElementVNode("section", {
372
+ class: "flex flex-col gap-2 p-1",
373
+ "aria-labelledby": `${unref(uid)}-generations`
374
+ }, [createElementVNode("h3", {
375
+ id: `${unref(uid)}-generations`,
376
+ class: "text-sm font-medium text-[var(--sk-fg-highlighted)]"
377
+ }, toDisplayString(unref(t)("imageStudio.dialog.generations.heading")), 9, _hoisted_17), state.value.generations.length ? (openBlock(), createElementBlock("ul", _hoisted_18, [(openBlock(true), createElementBlock(Fragment, null, renderList(state.value.generations, (image) => {
378
+ return openBlock(), createBlock(_sfc_main$3, {
301
379
  key: image.id,
302
380
  image,
303
381
  selected: state.value.selected === image.id,
@@ -311,43 +389,28 @@ const _sfc_main = /*@__PURE__*/ defineComponent({
311
389
  "onSelect",
312
390
  "onRemove"
313
391
  ]);
314
- }), 128))])) : (openBlock(), createElementBlock("p", _hoisted_14, toDisplayString(unref(t)("imageStudio.dialog.references.drop")), 1))
315
- ], 40, _hoisted_9), createElementVNode("section", {
316
- class: "flex flex-col gap-2 p-1",
317
- "aria-labelledby": `${unref(uid)}-generations`
318
- }, [createElementVNode("h3", {
319
- id: `${unref(uid)}-generations`,
320
- class: "text-sm font-medium text-[var(--sk-fg-highlighted)]"
321
- }, toDisplayString(unref(t)("imageStudio.dialog.generations.heading")), 9, _hoisted_16), state.value.generations.length ? (openBlock(), createElementBlock("ul", _hoisted_17, [(openBlock(true), createElementBlock(Fragment, null, renderList(state.value.generations, (image) => {
322
- return openBlock(), createBlock(_sfc_main$2, {
323
- key: image.id,
324
- image,
325
- selected: state.value.selected === image.id,
326
- onToggle: ($event) => toggle(image.id),
327
- onSelect: ($event) => use(image.id),
328
- onRemove: ($event) => remove(image.id)
329
- }, null, 8, [
330
- "image",
331
- "selected",
332
- "onToggle",
333
- "onSelect",
334
- "onRemove"
335
- ]);
336
- }), 128))])) : (openBlock(), createElementBlock("p", _hoisted_18, toDisplayString(unref(t)("imageStudio.dialog.generations.empty")), 1))], 8, _hoisted_15)]),
392
+ }), 128))])) : (openBlock(), createElementBlock("p", _hoisted_19, toDisplayString(unref(t)("imageStudio.dialog.generations.empty")), 1))], 8, _hoisted_16), [[vShow, tab.value === "block" || !library.value]])
393
+ ]),
337
394
  createCommentVNode(" Right: the block's image and the chat. "),
338
- createElementVNode("div", _hoisted_19, [createElementVNode("section", {
395
+ createElementVNode("div", _hoisted_20, [createElementVNode("section", {
339
396
  class: "flex flex-col gap-2",
340
397
  "aria-labelledby": `${unref(uid)}-preview`
341
398
  }, [createElementVNode("h3", {
342
399
  id: `${unref(uid)}-preview`,
343
400
  class: "text-sm font-medium text-[var(--sk-fg-highlighted)]"
344
- }, toDisplayString(unref(t)("imageStudio.dialog.preview.heading")), 9, _hoisted_21), createElementVNode("div", _hoisted_22, [picture.value ? (openBlock(), createElementBlock("img", {
401
+ }, toDisplayString(unref(t)("imageStudio.dialog.preview.heading")), 9, _hoisted_22), createElementVNode("div", _hoisted_23, [picture.value ? (openBlock(), createElementBlock("img", {
345
402
  key: 0,
346
403
  src: picture.value.url,
347
404
  alt: picture.value.title || unref(t)("imageStudio.dialog.tile.untitled"),
348
405
  class: "size-full object-contain",
349
406
  "data-image-studio-preview": ""
350
- }, null, 8, _hoisted_23)) : (openBlock(), createElementBlock("p", _hoisted_24, toDisplayString(unref(t)("imageStudio.dialog.preview.empty")), 1))])], 8, _hoisted_20), createVNode(_sfc_main$1, {
407
+ }, null, 8, _hoisted_24)) : __props.store.placeholderUrl ? (openBlock(), createElementBlock("img", {
408
+ key: 1,
409
+ src: __props.store.placeholderUrl,
410
+ alt: "",
411
+ class: "size-full object-contain opacity-60",
412
+ "data-image-studio-placeholder": ""
413
+ }, null, 8, _hoisted_25)) : (openBlock(), createElementBlock("p", _hoisted_26, toDisplayString(unref(t)("imageStudio.dialog.preview.empty")), 1))])], 8, _hoisted_21), createVNode(_sfc_main$1, {
351
414
  turns: state.value.turns,
352
415
  images: images.value,
353
416
  running: running.value,
@@ -1 +1 @@
1
- {"version":3,"file":"ImageStudioDialog.js","names":["_openBlock","_createBlock","_unref","_withCtx","_createElementVNode","_createCommentVNode","_toDisplayString","_createVNode","_createElementBlock","_Fragment","_renderList","_withModifiers","ImageStudioTile","ImageStudioChat"],"sources":["../../../../src/features/image-studio/components/ImageStudioDialog.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed, onBeforeUnmount, ref, useId, useTemplateRef, watch } from 'vue'\nimport { fetchErrorMessage } from '../../../core'\nimport { useUiKit } from '../../../vue/kit/use-ui-kit'\nimport { useEditorI18n } from '../../../vue/use-editor-i18n'\nimport {\n addGeneration,\n addReference,\n type ImageStudioState,\n type ImageStudioTurn,\n removeImage,\n select,\n selectedImage,\n setDescription,\n toggleImage,\n togglePromptBlock,\n} from '../state'\nimport type { ImageStudioStore } from '../store'\nimport ImageStudioChat from './ImageStudioChat.vue'\nimport ImageStudioTile from './ImageStudioTile.vue'\n\n/**\n * The Bild-Studio: description and Prompt-Bausteine on the left, references and previous generations in the middle,\n * the block's image and the chat on the right. The dialog applies the reducers of `../state` to `store.state` and\n * hands every result to `store.update`; the store only generates, uploads and persists (see `ImageStudioStore`).\n *\n * The description is committed 500 ms after the last keystroke and at once on blur, on „Erzeugen“ and on close, so the\n * host never builds a prompt from a stale text. Closing (or unmounting) aborts a running generation; an aborted\n * generation adds no turn, a failed one adds a turn with the problem.\n */\nconst props = defineProps<{ open: boolean, store: ImageStudioStore, title?: string }>()\nconst emit = defineEmits<{ 'update:open': [open: boolean] }>()\n\nconst { Alert: UAlert, Button: UButton, Modal: UModal, Switch: USwitch, Textarea: UTextarea } = useUiKit()\nconst { t } = useEditorI18n()\n\nconst uid = useId()\nconst state = computed(() => props.store.state.value)\nconst promptBlocks = computed(() => props.store.promptBlocks.value)\nconst problem = computed(() => props.store.problem.value)\nconst images = computed(() => [...state.value.generations, ...state.value.references])\nconst picture = computed(() => selectedImage(state.value))\n\n// --- Description ----------------------------------------------------------------------------------------------------\n\nconst COMMIT_DELAY_MS = 500\nconst draft = ref(state.value.description)\n/** The description as last committed or received: the host's echo of our own commit must not overwrite a newer draft. */\nlet known = state.value.description\nlet commitTimer: ReturnType<typeof setTimeout> | undefined\n\nfunction commitDescription() {\n clearTimeout(commitTimer)\n commitTimer = undefined\n if (draft.value === props.store.state.value.description) return\n known = draft.value\n props.store.update(setDescription(props.store.state.value, draft.value))\n}\n\nwatch(draft, (text) => {\n if (text === props.store.state.value.description) return\n clearTimeout(commitTimer)\n commitTimer = setTimeout(commitDescription, COMMIT_DELAY_MS)\n})\n// A change of the host (undo, another tab) shows unless the user has typed something that is not committed yet.\nwatch(() => state.value.description, (description) => {\n if (description === known) return\n known = description\n if (commitTimer === undefined) draft.value = description\n})\n\n// --- Reducers -------------------------------------------------------------------------------------------------------\n\nconst update = (next: ImageStudioState) => props.store.update(next)\nconst toggleBlock = (id: string) => update(togglePromptBlock(props.store.state.value, id))\nconst toggle = (id: string) => update(toggleImage(props.store.state.value, id))\nconst use = (id: string) => update(select(props.store.state.value, id))\nconst remove = (id: string) => update(removeImage(props.store.state.value, id))\n\n// --- References: upload and drop ------------------------------------------------------------------------------------\n\nconst fileInputRef = useTemplateRef<HTMLInputElement>('fileInput')\nconst uploading = ref(0)\nconst uploadProblem = ref<string>()\nconst dragging = ref(false)\n\nasync function upload(files: readonly File[]) {\n const pictures = files.filter(file => file.type.startsWith('image/'))\n if (!pictures.length) return\n uploadProblem.value = undefined\n uploading.value += pictures.length\n await Promise.all(pictures.map(async (file) => {\n try {\n const image = await props.store.upload(file)\n update(addReference(props.store.state.value, image))\n } catch (error) {\n uploadProblem.value = t('imageStudio.dialog.references.failed', { message: fetchErrorMessage(error) })\n } finally {\n uploading.value -= 1\n }\n }))\n}\n\nfunction onFilesChosen(event: Event) {\n const input = event.target as HTMLInputElement\n const files = [...(input.files ?? [])]\n input.value = '' // the same file can be chosen again\n void upload(files)\n}\n\nfunction onDrop(event: DragEvent) {\n dragging.value = false\n void upload([...(event.dataTransfer?.files ?? [])])\n}\n\n// --- Generation -----------------------------------------------------------------------------------------------------\n\nconst running = ref(false)\nlet controller: AbortController | undefined\n\nfunction abortGeneration() {\n controller?.abort()\n controller = undefined\n running.value = false\n}\n\nasync function generate(instruction: string) {\n if (controller) return\n commitDescription()\n const own = new AbortController()\n controller = own\n running.value = true\n const turn: ImageStudioTurn = { id: crypto.randomUUID(), instruction, imageId: null, createdAt: new Date().toISOString() }\n try {\n const image = await props.store.generate(instruction, own.signal)\n if (own.signal.aborted) return\n props.store.update(addGeneration(props.store.state.value, image, turn))\n } catch (error) {\n if (own.signal.aborted) return\n const current = props.store.state.value\n props.store.update({ ...current, turns: [...current.turns, { ...turn, problem: fetchErrorMessage(error) }] })\n } finally {\n if (controller === own) {\n controller = undefined\n running.value = false\n }\n }\n}\n\n// --- Closing --------------------------------------------------------------------------------------------------------\n\nfunction close() {\n commitDescription()\n abortGeneration()\n emit('update:open', false)\n}\n\nwatch(() => props.open, (open) => {\n if (open) return\n commitDescription()\n abortGeneration()\n})\n\nonBeforeUnmount(() => {\n commitDescription()\n abortGeneration()\n})\n</script>\n\n<template>\n <UModal\n :open=\"open\"\n :title=\"title ?? t('imageStudio.dialog.title')\"\n :ui=\"{ content: 'sm:w-[72rem] sm:max-w-[calc(100vw-2rem)]' }\"\n @update:open=\"(value: boolean) => { if (!value) close() }\"\n >\n <template #body>\n <div class=\"flex flex-col gap-3\" data-image-studio-dialog>\n <UAlert v-if=\"problem\" color=\"error\" variant=\"subtle\" :title=\"problem\" />\n <div class=\"grid gap-4 lg:h-[68vh] lg:grid-cols-[17rem_minmax(0,1fr)_minmax(0,22rem)]\">\n <!-- Left: what the picture shows. -->\n <section class=\"flex min-h-0 flex-col gap-3 lg:overflow-y-auto\" :aria-labelledby=\"`${uid}-description`\">\n <h3 :id=\"`${uid}-description`\" class=\"text-sm font-medium text-[var(--sk-fg-highlighted)]\">\n {{ t('imageStudio.dialog.description.heading') }}\n </h3>\n <UTextarea\n v-model=\"draft\"\n :rows=\"6\"\n :maxrows=\"14\"\n autoresize\n :placeholder=\"t('imageStudio.dialog.description.placeholder')\"\n :aria-label=\"t('imageStudio.dialog.description.heading')\"\n @blur=\"commitDescription\"\n />\n <h3 :id=\"`${uid}-blocks`\" class=\"mt-2 text-sm font-medium text-[var(--sk-fg-highlighted)]\">\n {{ t('imageStudio.dialog.blocks.heading') }}\n </h3>\n <ul v-if=\"promptBlocks.length\" class=\"flex flex-col gap-3\" :aria-labelledby=\"`${uid}-blocks`\">\n <li v-for=\"block in promptBlocks\" :key=\"block.id\">\n <USwitch\n :model-value=\"state.promptBlockIds.includes(block.id)\"\n :label=\"block.label\"\n :description=\"block.text\"\n @update:model-value=\"toggleBlock(block.id)\"\n />\n </li>\n </ul>\n <p v-else class=\"text-sm text-[var(--sk-muted)]\">\n {{ t('imageStudio.dialog.blocks.empty') }}\n </p>\n </section>\n\n <!-- Middle: references and previous generations. -->\n <div class=\"flex min-h-0 flex-col gap-4 lg:overflow-y-auto\">\n <section\n class=\"flex flex-col gap-2 rounded-md border border-dashed border-transparent p-1 data-[dragging=true]:border-[var(--sk-primary)]\"\n :data-dragging=\"dragging\"\n :aria-labelledby=\"`${uid}-references`\"\n data-image-studio-drop\n @dragenter.prevent=\"dragging = true\"\n @dragover.prevent=\"dragging = true\"\n @dragleave=\"dragging = false\"\n @drop.prevent=\"onDrop\"\n >\n <div class=\"flex items-center justify-between gap-2\">\n <h3 :id=\"`${uid}-references`\" class=\"text-sm font-medium text-[var(--sk-fg-highlighted)]\">\n {{ t('imageStudio.dialog.references.heading') }}\n </h3>\n <UButton\n :label=\"t('imageStudio.dialog.references.upload')\"\n icon=\"i-lucide-upload\"\n size=\"xs\"\n color=\"neutral\"\n variant=\"outline\"\n :loading=\"uploading > 0\"\n @click=\"fileInputRef?.click()\"\n />\n <input ref=\"fileInput\" type=\"file\" accept=\"image/*\" multiple hidden data-image-studio-file @change=\"onFilesChosen\">\n </div>\n <p v-if=\"uploading\" class=\"text-xs text-[var(--sk-muted)]\" role=\"status\">\n {{ t('imageStudio.dialog.references.uploading') }}\n </p>\n <UAlert v-if=\"uploadProblem\" color=\"error\" variant=\"subtle\" :title=\"uploadProblem\" />\n <ul v-if=\"state.references.length\" class=\"grid grid-cols-2 gap-2 sm:grid-cols-3\">\n <ImageStudioTile\n v-for=\"image in state.references\"\n :key=\"image.id\"\n :image=\"image\"\n :selected=\"state.selected === image.id\"\n @toggle=\"toggle(image.id)\"\n @select=\"use(image.id)\"\n @remove=\"remove(image.id)\"\n />\n </ul>\n <p v-else class=\"text-sm text-[var(--sk-muted)]\">\n {{ t('imageStudio.dialog.references.drop') }}\n </p>\n </section>\n\n <section class=\"flex flex-col gap-2 p-1\" :aria-labelledby=\"`${uid}-generations`\">\n <h3 :id=\"`${uid}-generations`\" class=\"text-sm font-medium text-[var(--sk-fg-highlighted)]\">\n {{ t('imageStudio.dialog.generations.heading') }}\n </h3>\n <ul v-if=\"state.generations.length\" class=\"grid grid-cols-2 gap-2 sm:grid-cols-3\">\n <ImageStudioTile\n v-for=\"image in state.generations\"\n :key=\"image.id\"\n :image=\"image\"\n :selected=\"state.selected === image.id\"\n @toggle=\"toggle(image.id)\"\n @select=\"use(image.id)\"\n @remove=\"remove(image.id)\"\n />\n </ul>\n <p v-else class=\"text-sm text-[var(--sk-muted)]\">\n {{ t('imageStudio.dialog.generations.empty') }}\n </p>\n </section>\n </div>\n\n <!-- Right: the block's image and the chat. -->\n <div class=\"flex min-h-0 flex-col gap-3\">\n <section class=\"flex flex-col gap-2\" :aria-labelledby=\"`${uid}-preview`\">\n <h3 :id=\"`${uid}-preview`\" class=\"text-sm font-medium text-[var(--sk-fg-highlighted)]\">\n {{ t('imageStudio.dialog.preview.heading') }}\n </h3>\n <div class=\"flex aspect-square items-center justify-center overflow-hidden rounded-md border border-[var(--sk-border)] bg-[var(--sk-bg-elevated)]\">\n <img\n v-if=\"picture\"\n :src=\"picture.url\"\n :alt=\"picture.title || t('imageStudio.dialog.tile.untitled')\"\n class=\"size-full object-contain\"\n data-image-studio-preview\n >\n <p v-else class=\"text-sm text-[var(--sk-muted)]\">\n {{ t('imageStudio.dialog.preview.empty') }}\n </p>\n </div>\n </section>\n <ImageStudioChat\n :turns=\"state.turns\"\n :images=\"images\"\n :running=\"running\"\n :empty-allowed=\"draft.trim() !== ''\"\n @send=\"generate\"\n />\n </div>\n </div>\n </div>\n </template>\n </UModal>\n</template>\n"],"mappings":"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"}
1
+ {"version":3,"file":"ImageStudioDialog.js","names":["_openBlock","_createBlock","_unref","_withCtx","_createElementVNode","_createCommentVNode","_toDisplayString","_createVNode","_createElementBlock","_Fragment","_renderList","ImageStudioLibraryPanel","_withDirectives","_withModifiers","ImageStudioTile","_vShow","ImageStudioChat"],"sources":["../../../../src/features/image-studio/components/ImageStudioDialog.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed, onBeforeUnmount, ref, useId, useTemplateRef, watch } from 'vue'\nimport { fetchErrorMessage } from '../../../core'\nimport { useUiKit } from '../../../vue/kit/use-ui-kit'\nimport { useEditorI18n } from '../../../vue/use-editor-i18n'\nimport {\n addGeneration,\n addReference,\n adoptImage,\n type ImageStudioState,\n type ImageStudioTurn,\n removeImage,\n select,\n selectedImage,\n setDescription,\n toggleImage,\n togglePromptBlock,\n} from '../state'\nimport type { ImageStudioLibraryItem } from '../library'\nimport type { ImageStudioStore } from '../store'\nimport ImageStudioChat from './ImageStudioChat.vue'\nimport ImageStudioLibraryPanel from './ImageStudioLibraryPanel.vue'\nimport ImageStudioTile from './ImageStudioTile.vue'\n\n/**\n * The Bild-Studio: description and prompt blocks on the left, references and previous generations in the middle,\n * the block's image and the chat on the right. The dialog applies the reducers of `../state` to `store.state` and\n * hands every result to `store.update`; the store only generates, uploads and persists (see `ImageStudioStore`).\n *\n * With `store.library` the middle column has two tabs: „Dieser Block“ (the above) and „Galerie“ (the host's images to\n * use as the block's image, add as references, rename or delete). `store.placeholderUrl` is shown in the preview while\n * no image is selected.\n *\n * The description is committed 500 ms after the last keystroke and at once on blur, on „Erzeugen“ and on close, so the\n * host never builds a prompt from a stale text. Closing (or unmounting) aborts a running generation; an aborted\n * generation adds no turn, a failed one adds a turn with the problem.\n */\nconst props = defineProps<{ open: boolean, store: ImageStudioStore, title?: string }>()\nconst emit = defineEmits<{ 'update:open': [open: boolean] }>()\n\nconst { Alert: UAlert, Button: UButton, Modal: UModal, Switch: USwitch, Textarea: UTextarea } = useUiKit()\nconst { t } = useEditorI18n()\n\nconst uid = useId()\nconst state = computed(() => props.store.state.value)\nconst promptBlocks = computed(() => props.store.promptBlocks.value)\nconst problem = computed(() => props.store.problem.value)\nconst images = computed(() => [...state.value.generations, ...state.value.references])\nconst picture = computed(() => selectedImage(state.value))\n\n// --- Description ----------------------------------------------------------------------------------------------------\n\nconst COMMIT_DELAY_MS = 500\nconst draft = ref(state.value.description)\n/** The description as last committed or received: the host's echo of our own commit must not overwrite a newer draft. */\nlet known = state.value.description\nlet commitTimer: ReturnType<typeof setTimeout> | undefined\n\nfunction commitDescription() {\n clearTimeout(commitTimer)\n commitTimer = undefined\n if (draft.value === props.store.state.value.description) return\n known = draft.value\n props.store.update(setDescription(props.store.state.value, draft.value))\n}\n\nwatch(draft, (text) => {\n if (text === props.store.state.value.description) return\n clearTimeout(commitTimer)\n commitTimer = setTimeout(commitDescription, COMMIT_DELAY_MS)\n})\n// A change of the host (undo, another tab) shows unless the user has typed something that is not committed yet.\nwatch(() => state.value.description, (description) => {\n if (description === known) return\n known = description\n if (commitTimer === undefined) draft.value = description\n})\n\n// --- Reducers -------------------------------------------------------------------------------------------------------\n\nconst update = (next: ImageStudioState) => props.store.update(next)\nconst toggleBlock = (id: string) => update(togglePromptBlock(props.store.state.value, id))\nconst toggle = (id: string) => update(toggleImage(props.store.state.value, id))\nconst use = (id: string) => update(select(props.store.state.value, id))\nconst remove = (id: string) => update(removeImage(props.store.state.value, id))\n\n// --- Gallery --------------------------------------------------------------------------------------------------------\n\nconst tab = ref<'block' | 'library'>('block')\nconst library = computed(() => props.store.library)\nconst plain = ({ id, url, title }: ImageStudioLibraryItem) => ({ id, url, title, active: false })\nconst useFromLibrary = (item: ImageStudioLibraryItem) => update(adoptImage(props.store.state.value, plain(item)))\nconst referenceFromLibrary = (item: ImageStudioLibraryItem) => update(addReference(props.store.state.value, plain(item)))\nfunction removedFromLibrary(id: string) {\n const current = props.store.state.value\n if (current.references.some(image => image.id === id) || current.generations.some(image => image.id === id)) update(removeImage(current, id))\n}\n\n// --- References: upload and drop ------------------------------------------------------------------------------------\n\nconst fileInputRef = useTemplateRef<HTMLInputElement>('fileInput')\nconst uploading = ref(0)\nconst uploadProblem = ref<string>()\nconst dragging = ref(false)\n\nasync function upload(files: readonly File[]) {\n const pictures = files.filter(file => file.type.startsWith('image/'))\n if (!pictures.length) return\n uploadProblem.value = undefined\n uploading.value += pictures.length\n await Promise.all(pictures.map(async (file) => {\n try {\n const image = await props.store.upload(file)\n update(addReference(props.store.state.value, image))\n } catch (error) {\n uploadProblem.value = t('imageStudio.dialog.references.failed', { message: fetchErrorMessage(error) })\n } finally {\n uploading.value -= 1\n }\n }))\n}\n\nfunction onFilesChosen(event: Event) {\n const input = event.target as HTMLInputElement\n const files = [...(input.files ?? [])]\n input.value = '' // the same file can be chosen again\n void upload(files)\n}\n\nfunction onDrop(event: DragEvent) {\n dragging.value = false\n void upload([...(event.dataTransfer?.files ?? [])])\n}\n\n// --- Generation -----------------------------------------------------------------------------------------------------\n\nconst running = ref(false)\nlet controller: AbortController | undefined\n\nfunction abortGeneration() {\n controller?.abort()\n controller = undefined\n running.value = false\n}\n\nasync function generate(instruction: string) {\n if (controller) return\n commitDescription()\n const own = new AbortController()\n controller = own\n running.value = true\n const turn: ImageStudioTurn = { id: crypto.randomUUID(), instruction, imageId: null, createdAt: new Date().toISOString() }\n try {\n const image = await props.store.generate(instruction, own.signal)\n if (own.signal.aborted) return\n props.store.update(addGeneration(props.store.state.value, image, turn))\n } catch (error) {\n if (own.signal.aborted) return\n const current = props.store.state.value\n props.store.update({ ...current, turns: [...current.turns, { ...turn, problem: fetchErrorMessage(error) }] })\n } finally {\n if (controller === own) {\n controller = undefined\n running.value = false\n }\n }\n}\n\n// --- Closing --------------------------------------------------------------------------------------------------------\n\nfunction close() {\n commitDescription()\n abortGeneration()\n emit('update:open', false)\n}\n\nwatch(() => props.open, (open) => {\n if (open) return\n tab.value = 'block'\n commitDescription()\n abortGeneration()\n})\n\nonBeforeUnmount(() => {\n commitDescription()\n abortGeneration()\n})\n</script>\n\n<template>\n <UModal\n :open=\"open\"\n :title=\"title ?? t('imageStudio.dialog.title')\"\n :ui=\"{ content: 'sm:w-[72rem] sm:max-w-[calc(100vw-2rem)]' }\"\n @update:open=\"(value: boolean) => { if (!value) close() }\"\n >\n <template #body>\n <div class=\"flex flex-col gap-3\" data-image-studio-dialog>\n <UAlert v-if=\"problem\" color=\"error\" variant=\"subtle\" :title=\"problem\" />\n <div class=\"grid gap-4 lg:h-[68vh] lg:grid-cols-[17rem_minmax(0,1fr)_minmax(0,22rem)]\">\n <!-- Left: what the picture shows. -->\n <section class=\"flex min-h-0 flex-col gap-3 lg:overflow-y-auto\" :aria-labelledby=\"`${uid}-description`\">\n <h3 :id=\"`${uid}-description`\" class=\"text-sm font-medium text-[var(--sk-fg-highlighted)]\">\n {{ t('imageStudio.dialog.description.heading') }}\n </h3>\n <UTextarea\n v-model=\"draft\"\n :rows=\"6\"\n :maxrows=\"14\"\n autoresize\n :placeholder=\"t('imageStudio.dialog.description.placeholder')\"\n :aria-label=\"t('imageStudio.dialog.description.heading')\"\n @blur=\"commitDescription\"\n />\n <h3 :id=\"`${uid}-blocks`\" class=\"mt-2 text-sm font-medium text-[var(--sk-fg-highlighted)]\">\n {{ t('imageStudio.dialog.blocks.heading') }}\n </h3>\n <ul v-if=\"promptBlocks.length\" class=\"flex flex-col gap-3\" :aria-labelledby=\"`${uid}-blocks`\">\n <li v-for=\"block in promptBlocks\" :key=\"block.id\">\n <USwitch\n :model-value=\"state.promptBlockIds.includes(block.id)\"\n :label=\"block.label\"\n :description=\"block.text\"\n @update:model-value=\"toggleBlock(block.id)\"\n />\n </li>\n </ul>\n <p v-else class=\"text-sm text-[var(--sk-muted)]\">\n {{ t('imageStudio.dialog.blocks.empty') }}\n </p>\n </section>\n\n <!-- Middle: references and previous generations. -->\n <div class=\"flex min-h-0 flex-col gap-4 lg:overflow-y-auto\">\n <div v-if=\"library\" class=\"flex gap-2\" role=\"tablist\" data-image-studio-tabs>\n <UButton\n v-for=\"entry in (['block', 'library'] as const)\"\n :key=\"entry\"\n :label=\"t(`imageStudio.dialog.tabs.${entry}`)\"\n size=\"xs\"\n color=\"neutral\"\n :variant=\"tab === entry ? 'solid' : 'ghost'\"\n role=\"tab\"\n :aria-selected=\"tab === entry\"\n :data-image-studio-tab=\"entry\"\n @click=\"tab = entry\"\n />\n </div>\n <ImageStudioLibraryPanel\n v-if=\"library && tab === 'library'\"\n :library=\"library\"\n :state=\"state\"\n @use=\"useFromLibrary\"\n @reference=\"referenceFromLibrary\"\n @removed=\"removedFromLibrary\"\n />\n <section\n v-show=\"tab === 'block' || !library\"\n class=\"flex flex-col gap-2 rounded-md border border-dashed border-transparent p-1 data-[dragging=true]:border-[var(--sk-primary)]\"\n :data-dragging=\"dragging\"\n :aria-labelledby=\"`${uid}-references`\"\n data-image-studio-drop\n @dragenter.prevent=\"dragging = true\"\n @dragover.prevent=\"dragging = true\"\n @dragleave=\"dragging = false\"\n @drop.prevent=\"onDrop\"\n >\n <div class=\"flex items-center justify-between gap-2\">\n <h3 :id=\"`${uid}-references`\" class=\"text-sm font-medium text-[var(--sk-fg-highlighted)]\">\n {{ t('imageStudio.dialog.references.heading') }}\n </h3>\n <UButton\n :label=\"t('imageStudio.dialog.references.upload')\"\n icon=\"i-lucide-upload\"\n size=\"xs\"\n color=\"neutral\"\n variant=\"outline\"\n :loading=\"uploading > 0\"\n @click=\"fileInputRef?.click()\"\n />\n <input ref=\"fileInput\" type=\"file\" accept=\"image/*\" multiple hidden data-image-studio-file @change=\"onFilesChosen\">\n </div>\n <p v-if=\"uploading\" class=\"text-xs text-[var(--sk-muted)]\" role=\"status\">\n {{ t('imageStudio.dialog.references.uploading') }}\n </p>\n <UAlert v-if=\"uploadProblem\" color=\"error\" variant=\"subtle\" :title=\"uploadProblem\" />\n <ul v-if=\"state.references.length\" class=\"grid grid-cols-2 gap-2 sm:grid-cols-3\">\n <ImageStudioTile\n v-for=\"image in state.references\"\n :key=\"image.id\"\n :image=\"image\"\n :selected=\"state.selected === image.id\"\n @toggle=\"toggle(image.id)\"\n @select=\"use(image.id)\"\n @remove=\"remove(image.id)\"\n />\n </ul>\n <p v-else class=\"text-sm text-[var(--sk-muted)]\">\n {{ t('imageStudio.dialog.references.drop') }}\n </p>\n </section>\n\n <section v-show=\"tab === 'block' || !library\" class=\"flex flex-col gap-2 p-1\" :aria-labelledby=\"`${uid}-generations`\">\n <h3 :id=\"`${uid}-generations`\" class=\"text-sm font-medium text-[var(--sk-fg-highlighted)]\">\n {{ t('imageStudio.dialog.generations.heading') }}\n </h3>\n <ul v-if=\"state.generations.length\" class=\"grid grid-cols-2 gap-2 sm:grid-cols-3\">\n <ImageStudioTile\n v-for=\"image in state.generations\"\n :key=\"image.id\"\n :image=\"image\"\n :selected=\"state.selected === image.id\"\n @toggle=\"toggle(image.id)\"\n @select=\"use(image.id)\"\n @remove=\"remove(image.id)\"\n />\n </ul>\n <p v-else class=\"text-sm text-[var(--sk-muted)]\">\n {{ t('imageStudio.dialog.generations.empty') }}\n </p>\n </section>\n </div>\n\n <!-- Right: the block's image and the chat. -->\n <div class=\"flex min-h-0 flex-col gap-3\">\n <section class=\"flex flex-col gap-2\" :aria-labelledby=\"`${uid}-preview`\">\n <h3 :id=\"`${uid}-preview`\" class=\"text-sm font-medium text-[var(--sk-fg-highlighted)]\">\n {{ t('imageStudio.dialog.preview.heading') }}\n </h3>\n <div class=\"flex aspect-square items-center justify-center overflow-hidden rounded-md border border-[var(--sk-border)] bg-[var(--sk-bg-elevated)]\">\n <img\n v-if=\"picture\"\n :src=\"picture.url\"\n :alt=\"picture.title || t('imageStudio.dialog.tile.untitled')\"\n class=\"size-full object-contain\"\n data-image-studio-preview\n >\n <img\n v-else-if=\"store.placeholderUrl\"\n :src=\"store.placeholderUrl\"\n alt=\"\"\n class=\"size-full object-contain opacity-60\"\n data-image-studio-placeholder\n >\n <p v-else class=\"text-sm text-[var(--sk-muted)]\">\n {{ t('imageStudio.dialog.preview.empty') }}\n </p>\n </div>\n </section>\n <ImageStudioChat\n :turns=\"state.turns\"\n :images=\"images\"\n :running=\"running\"\n :empty-allowed=\"draft.trim() !== ''\"\n @send=\"generate\"\n />\n </div>\n </div>\n </div>\n </template>\n </UModal>\n</template>\n"],"mappings":"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"}
@@ -1,10 +1,14 @@
1
1
  import { ImageStudioStore } from "../store.js";
2
2
  //#region src/features/image-studio/components/ImageStudioDialog.vue.d.ts
3
3
  /**
4
- * The Bild-Studio: description and Prompt-Bausteine on the left, references and previous generations in the middle,
4
+ * The Bild-Studio: description and prompt blocks on the left, references and previous generations in the middle,
5
5
  * the block's image and the chat on the right. The dialog applies the reducers of `../state` to `store.state` and
6
6
  * hands every result to `store.update`; the store only generates, uploads and persists (see `ImageStudioStore`).
7
7
  *
8
+ * With `store.library` the middle column has two tabs: „Dieser Block“ (the above) and „Galerie“ (the host's images to
9
+ * use as the block's image, add as references, rename or delete). `store.placeholderUrl` is shown in the preview while
10
+ * no image is selected.
11
+ *
8
12
  * The description is committed 500 ms after the last keystroke and at once on blur, on „Erzeugen“ and on close, so the
9
13
  * host never builds a prompt from a stale text. Closing (or unmounting) aborts a running generation; an aborted
10
14
  * generation adds no turn, a failed one adds a turn with the problem.
@@ -0,0 +1,186 @@
1
+ import { fetchErrorMessage } from "../../../core/fetch-error.js";
2
+ import { useUiKit } from "../../../vue/kit/use-ui-kit.js";
3
+ import { useEditorI18n } from "../../../vue/use-editor-i18n.js";
4
+ import _sfc_main$1 from "./ImageStudioLibraryTile.js";
5
+ import { Fragment, createBlock, createCommentVNode, createElementBlock, createElementVNode, createVNode, defineComponent, onBeforeUnmount, onMounted, openBlock, reactive, ref, renderList, toDisplayString, unref, watch } from "vue";
6
+ //#region src/features/image-studio/components/ImageStudioLibraryPanel.vue
7
+ const _hoisted_1 = {
8
+ class: "flex flex-col gap-3 p-1",
9
+ "data-image-studio-library": ""
10
+ };
11
+ const _hoisted_2 = { class: "flex flex-wrap items-center gap-2" };
12
+ const _hoisted_3 = {
13
+ key: 1,
14
+ class: "text-sm text-[var(--sk-muted)]",
15
+ role: "status"
16
+ };
17
+ const _hoisted_4 = {
18
+ key: 2,
19
+ class: "text-sm text-[var(--sk-muted)]"
20
+ };
21
+ const _hoisted_5 = {
22
+ key: 3,
23
+ class: "grid grid-cols-2 gap-2 sm:grid-cols-3"
24
+ };
25
+ /**
26
+ * The gallery tab of the Bild-Studio: search, one select per facet of the host and the host's images as tiles. The
27
+ * list is read on mount (the facets with their first option chosen), after a facet change and 300 ms after the last
28
+ * keystroke of the search; a newer read aborts the running one. Picking, referencing, renaming and deleting go to the
29
+ * host (`library`) or up to the dialog (`use`, `reference`, `removed`), which applies the reducers.
30
+ */
31
+ const SEARCH_DELAY_MS = 300;
32
+ const _sfc_main = /*@__PURE__*/ defineComponent({
33
+ __name: "ImageStudioLibraryPanel",
34
+ props: {
35
+ library: {},
36
+ state: {}
37
+ },
38
+ emits: [
39
+ "use",
40
+ "reference",
41
+ "removed"
42
+ ],
43
+ setup(__props, { emit: __emit }) {
44
+ const props = __props;
45
+ const emit = __emit;
46
+ const { Alert: UAlert, Input: UInput, Select: USelect } = useUiKit();
47
+ const { t } = useEditorI18n();
48
+ const facets = props.library.facets();
49
+ const values = reactive(Object.fromEntries(facets.map((facet) => [facet.id, facet.options[0]?.value ?? ""])));
50
+ const search = ref("");
51
+ const items = ref([]);
52
+ const busy = ref(false);
53
+ const problem = ref();
54
+ let controller;
55
+ let searchTimer;
56
+ async function load() {
57
+ clearTimeout(searchTimer);
58
+ searchTimer = void 0;
59
+ controller?.abort();
60
+ const own = new AbortController();
61
+ controller = own;
62
+ busy.value = true;
63
+ problem.value = void 0;
64
+ try {
65
+ const found = await props.library.list({
66
+ search: search.value,
67
+ facets: { ...values }
68
+ }, own.signal);
69
+ if (own.signal.aborted) return;
70
+ items.value = found;
71
+ } catch (error) {
72
+ if (own.signal.aborted) return;
73
+ problem.value = t("imageStudio.dialog.library.failed", { message: fetchErrorMessage(error) });
74
+ } finally {
75
+ if (controller === own) {
76
+ controller = void 0;
77
+ busy.value = false;
78
+ }
79
+ }
80
+ }
81
+ onMounted(() => void load());
82
+ watch(values, () => void load());
83
+ watch(search, () => {
84
+ clearTimeout(searchTimer);
85
+ searchTimer = setTimeout(() => void load(), SEARCH_DELAY_MS);
86
+ });
87
+ onBeforeUnmount(() => {
88
+ clearTimeout(searchTimer);
89
+ controller?.abort();
90
+ });
91
+ const held = (id) => props.state.references.some((image) => image.id === id) || props.state.generations.some((image) => image.id === id);
92
+ async function rename(item, title) {
93
+ if (!props.library.rename) return;
94
+ problem.value = void 0;
95
+ try {
96
+ const renamed = await props.library.rename(item.id, title);
97
+ items.value = items.value.map((other) => other.id === item.id ? renamed : other);
98
+ } catch (error) {
99
+ problem.value = fetchErrorMessage(error);
100
+ }
101
+ }
102
+ async function remove(item) {
103
+ if (!props.library.remove) return;
104
+ problem.value = void 0;
105
+ try {
106
+ await props.library.remove(item.id);
107
+ items.value = items.value.filter((other) => other.id !== item.id);
108
+ emit("removed", item.id);
109
+ } catch (error) {
110
+ problem.value = fetchErrorMessage(error);
111
+ }
112
+ }
113
+ return (_ctx, _cache) => {
114
+ return openBlock(), createElementBlock("section", _hoisted_1, [
115
+ createElementVNode("div", _hoisted_2, [createVNode(unref(UInput), {
116
+ modelValue: search.value,
117
+ "onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => search.value = $event),
118
+ class: "min-w-40 flex-1",
119
+ icon: "i-lucide-search",
120
+ size: "xs",
121
+ placeholder: unref(t)("imageStudio.dialog.library.search"),
122
+ "aria-label": unref(t)("imageStudio.dialog.library.search"),
123
+ "data-image-studio-library-search": ""
124
+ }, null, 8, [
125
+ "modelValue",
126
+ "placeholder",
127
+ "aria-label"
128
+ ]), (openBlock(true), createElementBlock(Fragment, null, renderList(unref(facets), (facet) => {
129
+ return openBlock(), createBlock(unref(USelect), {
130
+ key: facet.id,
131
+ modelValue: values[facet.id],
132
+ "onUpdate:modelValue": ($event) => values[facet.id] = $event,
133
+ items: facet.options.map((option) => ({
134
+ label: option.label,
135
+ value: option.value
136
+ })),
137
+ size: "xs",
138
+ "aria-label": facet.label,
139
+ "data-image-studio-facet": facet.id
140
+ }, null, 8, [
141
+ "modelValue",
142
+ "onUpdate:modelValue",
143
+ "items",
144
+ "aria-label",
145
+ "data-image-studio-facet"
146
+ ]);
147
+ }), 128))]),
148
+ problem.value ? (openBlock(), createBlock(unref(UAlert), {
149
+ key: 0,
150
+ color: "error",
151
+ variant: "subtle",
152
+ title: problem.value
153
+ }, null, 8, ["title"])) : createCommentVNode("v-if", true),
154
+ busy.value ? (openBlock(), createElementBlock("p", _hoisted_3, toDisplayString(unref(t)("imageStudio.dialog.library.loading")), 1)) : !items.value.length && !problem.value ? (openBlock(), createElementBlock("p", _hoisted_4, toDisplayString(unref(t)("imageStudio.dialog.library.empty")), 1)) : createCommentVNode("v-if", true),
155
+ items.value.length ? (openBlock(), createElementBlock("ul", _hoisted_5, [(openBlock(true), createElementBlock(Fragment, null, renderList(items.value, (item) => {
156
+ return openBlock(), createBlock(_sfc_main$1, {
157
+ key: item.id,
158
+ item,
159
+ selected: __props.state.selected === item.id,
160
+ held: held(item.id),
161
+ renamable: Boolean(__props.library.rename),
162
+ removable: Boolean(__props.library.remove),
163
+ onUse: ($event) => emit("use", item),
164
+ onReference: ($event) => emit("reference", item),
165
+ onRename: (title) => rename(item, title),
166
+ onRemove: ($event) => remove(item)
167
+ }, null, 8, [
168
+ "item",
169
+ "selected",
170
+ "held",
171
+ "renamable",
172
+ "removable",
173
+ "onUse",
174
+ "onReference",
175
+ "onRename",
176
+ "onRemove"
177
+ ]);
178
+ }), 128))])) : createCommentVNode("v-if", true)
179
+ ]);
180
+ };
181
+ }
182
+ });
183
+ //#endregion
184
+ export { _sfc_main as default };
185
+
186
+ //# sourceMappingURL=ImageStudioLibraryPanel.js.map