@ecsplico/editor 1.0.0 → 2.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 (363) hide show
  1. package/CHANGELOG.md +37 -0
  2. package/README.md +7 -7
  3. package/dist/adapters/anchors.d.ts +80 -0
  4. package/dist/adapters/anchors.js +270 -0
  5. package/dist/adapters/anchors.js.map +1 -0
  6. package/dist/adapters/comments/client.d.ts +64 -0
  7. package/dist/adapters/comments/client.js +536 -0
  8. package/dist/adapters/comments/client.js.map +1 -0
  9. package/dist/adapters/comments/drizzle.d.ts +430 -0
  10. package/dist/adapters/comments/drizzle.js +236 -0
  11. package/dist/adapters/comments/drizzle.js.map +1 -0
  12. package/dist/adapters/comments/errors.d.ts +9 -0
  13. package/dist/adapters/comments/errors.js +19 -0
  14. package/dist/adapters/comments/errors.js.map +1 -0
  15. package/dist/adapters/comments/json.d.ts +19 -0
  16. package/dist/adapters/comments/json.js +94 -0
  17. package/dist/adapters/comments/json.js.map +1 -0
  18. package/dist/adapters/comments/record.js +78 -0
  19. package/dist/adapters/comments/record.js.map +1 -0
  20. package/dist/adapters/comments/server.d.ts +23 -0
  21. package/dist/adapters/comments/server.js +102 -0
  22. package/dist/adapters/comments/server.js.map +1 -0
  23. package/dist/adapters/comments/types.d.ts +109 -0
  24. package/dist/adapters/documents.js +108 -0
  25. package/dist/adapters/documents.js.map +1 -0
  26. package/dist/adapters/drizzle.d.ts +293 -0
  27. package/dist/adapters/drizzle.js +157 -0
  28. package/dist/adapters/drizzle.js.map +1 -0
  29. package/dist/adapters/files.js +30 -0
  30. package/dist/adapters/files.js.map +1 -0
  31. package/dist/adapters/forge.d.ts +58 -0
  32. package/dist/adapters/forge.js +91 -0
  33. package/dist/adapters/forge.js.map +1 -0
  34. package/dist/adapters/index.d.ts +13 -0
  35. package/dist/adapters/index.js +0 -0
  36. package/dist/adapters/json.d.ts +24 -0
  37. package/dist/adapters/json.js +128 -0
  38. package/dist/adapters/json.js.map +1 -0
  39. package/dist/adapters/nitro.d.ts +61 -0
  40. package/dist/adapters/nitro.js +212 -0
  41. package/dist/adapters/nitro.js.map +1 -0
  42. package/dist/adapters/routes.js +16 -0
  43. package/dist/adapters/routes.js.map +1 -0
  44. package/dist/adapters/shared.d.ts +37 -0
  45. package/dist/adapters/shared.js +32 -0
  46. package/dist/adapters/shared.js.map +1 -0
  47. package/dist/adapters/vue.d.ts +67 -0
  48. package/dist/adapters/vue.js +187 -0
  49. package/dist/adapters/vue.js.map +1 -0
  50. package/dist/code/CodeSurface.vue.d.ts +3 -3
  51. package/dist/core/doc-anchors.d.ts +5 -0
  52. package/dist/core/doc-anchors.js +4 -3
  53. package/dist/core/doc-anchors.js.map +1 -1
  54. package/dist/core/editor-ui.js +57 -1
  55. package/dist/core/editor-ui.js.map +1 -1
  56. package/dist/core/notify.d.ts +1 -1
  57. package/dist/core/notify.js.map +1 -1
  58. package/dist/core/surface-session.js +139 -0
  59. package/dist/core/surface-session.js.map +1 -0
  60. package/dist/document/DocumentSurface.d.ts +1 -1
  61. package/dist/document/DocumentSurface.vue.d.ts +3 -3
  62. package/dist/features/ai/agent-op-review.d.ts +2 -2
  63. package/dist/features/ai/agent-op-review.js.map +1 -1
  64. package/dist/features/ai/agent-ops.d.ts +1 -1
  65. package/dist/features/ai/agent-ops.js +9 -6
  66. package/dist/features/ai/agent-ops.js.map +1 -1
  67. package/dist/features/ai/ai-apply.d.ts +1 -1
  68. package/dist/features/ai/ai-review.js +10 -1
  69. package/dist/features/ai/ai-review.js.map +1 -1
  70. package/dist/features/ai/components/AiSelectionMenu.js +78 -252
  71. package/dist/features/ai/components/AiSelectionMenu.js.map +1 -1
  72. package/dist/features/ai/components/AiSelectionMenu.vue.d.ts +2 -1
  73. package/dist/features/ai/components/AiSidebar.js +2 -2
  74. package/dist/features/ai/components/DocumentChatAnswer.js +1 -1
  75. package/dist/features/ai/components/DocumentChatOps.js +1 -0
  76. package/dist/features/ai/components/DocumentChatOps.js.map +1 -1
  77. package/dist/features/ai/components/ModelQuickSwitch.js +1 -1
  78. package/dist/features/ai/components/SettingsAiTab.js +1 -1
  79. package/dist/features/ai/components/SettingsModelProfiles.js +1 -1
  80. package/dist/features/ai/document-chat.d.ts +3 -2
  81. package/dist/features/ai/document-chat.js +16 -19
  82. package/dist/features/ai/document-chat.js.map +1 -1
  83. package/dist/features/ai/index.d.ts +5 -3
  84. package/dist/features/ai/index.js +4 -2
  85. package/dist/features/ai/protocol/agent-ops.d.ts +22 -17
  86. package/dist/features/ai/protocol/agent-ops.js +65 -39
  87. package/dist/features/ai/protocol/agent-ops.js.map +1 -1
  88. package/dist/features/ai/protocol/block-lines.d.ts +89 -0
  89. package/dist/features/ai/protocol/block-lines.js +177 -0
  90. package/dist/features/ai/protocol/block-lines.js.map +1 -0
  91. package/dist/features/ai/protocol/chat.js +10 -10
  92. package/dist/features/ai/protocol/chat.js.map +1 -1
  93. package/dist/features/ai/protocol/index.d.ts +3 -2
  94. package/dist/features/ai/protocol/index.js +3 -2
  95. package/dist/features/ai/react/AiSelectionMenu.d.ts +3 -2
  96. package/dist/features/ai/react/AiSelectionMenu.js +64 -255
  97. package/dist/features/ai/react/AiSelectionMenu.js.map +1 -1
  98. package/dist/features/ai/react/AiSidebar.js +2 -2
  99. package/dist/features/ai/react/DocumentChatAnswer.js +1 -1
  100. package/dist/features/ai/react/DocumentChatOps.js +1 -0
  101. package/dist/features/ai/react/DocumentChatOps.js.map +1 -1
  102. package/dist/features/ai/react/ModelQuickSwitch.js +1 -1
  103. package/dist/features/ai/react/SettingsAiTab.js +1 -1
  104. package/dist/features/ai/react/SettingsModelProfiles.js +1 -1
  105. package/dist/features/ai/react/use-ai-selection-flow.js +34 -0
  106. package/dist/features/ai/react/use-ai-selection-flow.js.map +1 -0
  107. package/dist/features/ai/selection-flow.d.ts +133 -0
  108. package/dist/features/ai/selection-flow.js +283 -0
  109. package/dist/features/ai/selection-flow.js.map +1 -0
  110. package/dist/features/ai/use-ai-assistant.d.ts +1 -1
  111. package/dist/features/ai/use-document-chat.d.ts +1 -1
  112. package/dist/features/authors/components/AuthorColorsPanel.js +1 -1
  113. package/dist/features/authors/feature.js +1 -1
  114. package/dist/features/authors/index.js +1 -1
  115. package/dist/features/authors/react/AuthorColorsPanel.js +1 -1
  116. package/dist/features/comments/components/CommentBubble.js +1 -1
  117. package/dist/features/comments/components/CommentComposer.js +1 -1
  118. package/dist/features/comments/components/CommentThreadView.js +5 -2
  119. package/dist/features/comments/components/CommentThreadView.js.map +1 -1
  120. package/dist/features/comments/components/CommentsMargin.js +108 -230
  121. package/dist/features/comments/components/CommentsMargin.js.map +1 -1
  122. package/dist/features/comments/components/CommentsOverlay.js +1 -1
  123. package/dist/features/comments/feature.js +1 -1
  124. package/dist/features/comments/index.d.ts +4 -2
  125. package/dist/features/comments/index.js +4 -2
  126. package/dist/features/comments/margin-controller.d.ts +44 -0
  127. package/dist/features/comments/margin-controller.js +132 -0
  128. package/dist/features/comments/margin-controller.js.map +1 -0
  129. package/dist/features/comments/margin-layout.d.ts +55 -0
  130. package/dist/features/comments/margin-layout.js +79 -0
  131. package/dist/features/comments/margin-layout.js.map +1 -0
  132. package/dist/features/comments/model.d.ts +8 -0
  133. package/dist/features/comments/model.js +60 -34
  134. package/dist/features/comments/model.js.map +1 -1
  135. package/dist/features/comments/react/CommentBubble.js +1 -1
  136. package/dist/features/comments/react/CommentComposer.js +1 -1
  137. package/dist/features/comments/react/CommentThreadView.js +2 -2
  138. package/dist/features/comments/react/CommentThreadView.js.map +1 -1
  139. package/dist/features/comments/react/CommentsMargin.d.ts +0 -5
  140. package/dist/features/comments/react/CommentsMargin.js +85 -251
  141. package/dist/features/comments/react/CommentsMargin.js.map +1 -1
  142. package/dist/features/comments/react/CommentsOverlay.js +1 -1
  143. package/dist/features/comments/react/use-comments.js +1 -1
  144. package/dist/features/comments/react/use-margin-layout.js +45 -0
  145. package/dist/features/comments/react/use-margin-layout.js.map +1 -0
  146. package/dist/features/comments/react.d.ts +1 -1
  147. package/dist/features/comments/schema.d.ts +23 -0
  148. package/dist/features/comments/schema.js.map +1 -1
  149. package/dist/features/comments/snapshot-equality.js +40 -0
  150. package/dist/features/comments/snapshot-equality.js.map +1 -0
  151. package/dist/features/comments/thread-anchor.js +33 -0
  152. package/dist/features/comments/thread-anchor.js.map +1 -0
  153. package/dist/features/comments/use-comments.d.ts +3 -1
  154. package/dist/features/comments/use-comments.js +1 -0
  155. package/dist/features/comments/use-comments.js.map +1 -1
  156. package/dist/features/comments/use-margin-layout.js +29 -0
  157. package/dist/features/comments/use-margin-layout.js.map +1 -0
  158. package/dist/features/comments/vue.d.ts +1 -1
  159. package/dist/features/composites/accepted-children.d.ts +21 -0
  160. package/dist/features/composites/accepted-children.js +126 -0
  161. package/dist/features/composites/accepted-children.js.map +1 -0
  162. package/dist/features/composites/components/CompositeDetails.js +1 -1
  163. package/dist/features/composites/components/CompositeInspector.js +38 -164
  164. package/dist/features/composites/components/CompositeInspector.js.map +1 -1
  165. package/dist/features/composites/feature.d.ts +2 -1
  166. package/dist/features/composites/feature.js +8 -2
  167. package/dist/features/composites/feature.js.map +1 -1
  168. package/dist/features/composites/index.d.ts +5 -3
  169. package/dist/features/composites/index.js +8 -6
  170. package/dist/features/composites/inspector-model.d.ts +97 -0
  171. package/dist/features/composites/inspector-model.js +255 -0
  172. package/dist/features/composites/inspector-model.js.map +1 -0
  173. package/dist/features/composites/kinds.d.ts +11 -0
  174. package/dist/features/composites/kinds.js +17 -2
  175. package/dist/features/composites/kinds.js.map +1 -1
  176. package/dist/features/composites/outline.d.ts +18 -5
  177. package/dist/features/composites/outline.js +44 -12
  178. package/dist/features/composites/outline.js.map +1 -1
  179. package/dist/features/composites/react/CompositeDetails.js +1 -1
  180. package/dist/features/composites/react/CompositeInspector.d.ts +1 -1
  181. package/dist/features/composites/react/CompositeInspector.js +21 -180
  182. package/dist/features/composites/react/CompositeInspector.js.map +1 -1
  183. package/dist/features/composites/react/CompositeStatusMenu.d.ts +1 -1
  184. package/dist/features/composites/react/CompositeView.js +1 -1
  185. package/dist/features/composites/react/use-composite-inspector.js +29 -0
  186. package/dist/features/composites/react/use-composite-inspector.js.map +1 -0
  187. package/dist/features/composites/schema.d.ts +2 -2
  188. package/dist/features/composites/schema.js +2 -2
  189. package/dist/features/composites/schema.js.map +1 -1
  190. package/dist/features/composites/use-composite-anchors.d.ts +1 -1
  191. package/dist/features/composites/use-composite-inspector.js +41 -0
  192. package/dist/features/composites/use-composite-inspector.js.map +1 -0
  193. package/dist/features/composites/use-composite-rows.d.ts +1 -1
  194. package/dist/features/media/index.d.ts +1 -1
  195. package/dist/features/media/vue.d.ts +1 -1
  196. package/dist/features/mentions/index.d.ts +3 -3
  197. package/dist/features/mentions/index.js +3 -3
  198. package/dist/features/mentions/schema.d.ts +1 -1
  199. package/dist/features/mentions/schema.js +1 -1
  200. package/dist/features/themes/index.d.ts +1 -1
  201. package/dist/features/themes/index.js +1 -1
  202. package/dist/features/transcript/feature.js +1 -1
  203. package/dist/features/transcript/index.js +2 -2
  204. package/dist/i18n/de/ai.js +2 -0
  205. package/dist/i18n/de/ai.js.map +1 -1
  206. package/dist/i18n/de/common.js +1 -2
  207. package/dist/i18n/de/common.js.map +1 -1
  208. package/dist/i18n/de/composites.js +8 -1
  209. package/dist/i18n/de/composites.js.map +1 -1
  210. package/dist/i18n/de/tree.js +14 -1
  211. package/dist/i18n/de/tree.js.map +1 -1
  212. package/dist/i18n/de.d.ts +22 -1
  213. package/dist/i18n/en/ai.js +2 -0
  214. package/dist/i18n/en/ai.js.map +1 -1
  215. package/dist/i18n/en/common.js +1 -2
  216. package/dist/i18n/en/common.js.map +1 -1
  217. package/dist/i18n/en/composites.js +8 -1
  218. package/dist/i18n/en/composites.js.map +1 -1
  219. package/dist/i18n/en/tree.js +14 -1
  220. package/dist/i18n/en/tree.js.map +1 -1
  221. package/dist/integrations/composite-ai/composite-fill.js +2 -2
  222. package/dist/integrations/composite-ai/composite-summary.js +2 -2
  223. package/dist/integrations/composite-ai/index.js +2 -2
  224. package/dist/integrations/transcript-ai/transcript-cleanup.js +1 -1
  225. package/dist/markdown/MarkdownSurface.d.ts +1 -1
  226. package/dist/markdown/MarkdownSurface.js +2 -2
  227. package/dist/markdown/MarkdownSurface.vue.d.ts +7 -7
  228. package/dist/markdown/index.d.ts +2 -2
  229. package/dist/nuxt/module.d.ts +0 -6
  230. package/dist/nuxt/module.js +3 -5
  231. package/dist/nuxt/module.js.map +1 -1
  232. package/dist/nuxt/runtime/install-context.d.ts +2 -3
  233. package/dist/nuxt/runtime/install-context.js +2 -3
  234. package/dist/nuxt/runtime/install-context.js.map +1 -1
  235. package/dist/nuxt/runtime/plugins/editor-context-nuxt-ui.client.ts +1 -1
  236. package/dist/nuxt/runtime/server/routes/collab/[id].js +1 -1
  237. package/dist/react/EditorSurface.d.ts +1 -1
  238. package/dist/react/EditorSurface.js +43 -149
  239. package/dist/react/EditorSurface.js.map +1 -1
  240. package/dist/react/EditorToolbar.js +3 -40
  241. package/dist/react/EditorToolbar.js.map +1 -1
  242. package/dist/react/styles/ui-vars.css +2 -2
  243. package/dist/schema/advanced.js +2 -2
  244. package/dist/server/adapter.d.ts +2 -2
  245. package/dist/server/collab.js +1 -1
  246. package/dist/server/handlers/ai.d.ts +4 -2
  247. package/dist/server/handlers/ai.js +11 -9
  248. package/dist/server/handlers/ai.js.map +1 -1
  249. package/dist/server/handlers/context.d.ts +1 -1
  250. package/dist/server/handlers/editor.d.ts +1 -1
  251. package/dist/server/handlers/editor.js +2 -2
  252. package/dist/server/host.d.ts +1 -1
  253. package/dist/server/index.d.ts +2 -2
  254. package/dist/settings/index.d.ts +1 -1
  255. package/dist/styles/ai.css +1 -1
  256. package/dist/styles/authors.css +1 -1
  257. package/dist/styles/block-ui.css +1 -1
  258. package/dist/styles/collab.css +1 -1
  259. package/dist/styles/comments.css +1 -1
  260. package/dist/styles/core.css +2 -2
  261. package/dist/styles/media.css +1 -1
  262. package/dist/styles/mentions.css +1 -1
  263. package/dist/styles/themes.css +1 -1
  264. package/dist/styles/tokens.css +1 -1
  265. package/dist/styles/transcript.css +1 -1
  266. package/dist/tree/DocumentTree.js +159 -387
  267. package/dist/tree/DocumentTree.js.map +1 -1
  268. package/dist/tree/drop-rules.js +37 -0
  269. package/dist/tree/drop-rules.js.map +1 -0
  270. package/dist/tree/react/DocumentTree.d.ts +2 -2
  271. package/dist/tree/react/DocumentTree.js +135 -397
  272. package/dist/tree/react/DocumentTree.js.map +1 -1
  273. package/dist/tree/react/use-tree-model.js +129 -0
  274. package/dist/tree/react/use-tree-model.js.map +1 -0
  275. package/dist/tree/react.js +1 -1
  276. package/dist/tree/tree-host.js +100 -0
  277. package/dist/tree/tree-host.js.map +1 -0
  278. package/dist/tree/tree-items.js +22 -43
  279. package/dist/tree/tree-items.js.map +1 -1
  280. package/dist/tree/tree-model.js +580 -0
  281. package/dist/tree/tree-model.js.map +1 -0
  282. package/dist/tree/tree-rows.js +77 -0
  283. package/dist/tree/tree-rows.js.map +1 -0
  284. package/dist/tree/use-tree-model.js +94 -0
  285. package/dist/tree/use-tree-model.js.map +1 -0
  286. package/dist/tree/vue.js +1 -1
  287. package/dist/vue/AdvancedEditor.vue.d.ts +4 -4
  288. package/dist/vue/SimpleEditor.vue.d.ts +2 -2
  289. package/dist/vue/components/EditorSurface.js +27 -87
  290. package/dist/vue/components/EditorSurface.js.map +1 -1
  291. package/dist/vue/components/EditorSurface.vue.d.ts +4 -4
  292. package/dist/vue/components/EditorToolbar.js +7 -44
  293. package/dist/vue/components/EditorToolbar.js.map +1 -1
  294. package/dist/vue/context.d.ts +4 -4
  295. package/dist/vue/context.js +3 -2
  296. package/dist/vue/context.js.map +1 -1
  297. package/dist/vue/kit/types.d.ts +1 -1
  298. package/dist/vue/kit/use-ui-kit.d.ts +2 -2
  299. package/dist/vue/kit/use-ui-kit.js +3 -3
  300. package/dist/vue/kit/use-ui-kit.js.map +1 -1
  301. package/dist/vue/use-editor-ui.d.ts +1 -1
  302. package/dist/vue/use-notifier.d.ts +1 -1
  303. package/docs/integration.md +98 -5
  304. package/docs/llms.md +10 -2
  305. package/docs/usage.md +10 -5
  306. package/package.json +70 -23
  307. package/dist/nuxt/runtime/plugins/editor-context-primevue.client.ts +0 -8
  308. package/dist/vue/kit/primevue/Alert.js +0 -49
  309. package/dist/vue/kit/primevue/Alert.js.map +0 -1
  310. package/dist/vue/kit/primevue/Avatar.js +0 -54
  311. package/dist/vue/kit/primevue/Avatar.js.map +0 -1
  312. package/dist/vue/kit/primevue/Badge.js +0 -41
  313. package/dist/vue/kit/primevue/Badge.js.map +0 -1
  314. package/dist/vue/kit/primevue/Button.js +0 -112
  315. package/dist/vue/kit/primevue/Button.js.map +0 -1
  316. package/dist/vue/kit/primevue/Chip.js +0 -38
  317. package/dist/vue/kit/primevue/Chip.js.map +0 -1
  318. package/dist/vue/kit/primevue/DropdownMenu.js +0 -98
  319. package/dist/vue/kit/primevue/DropdownMenu.js.map +0 -1
  320. package/dist/vue/kit/primevue/FieldGroup.js +0 -22
  321. package/dist/vue/kit/primevue/FieldGroup.js.map +0 -1
  322. package/dist/vue/kit/primevue/FormField.js +0 -56
  323. package/dist/vue/kit/primevue/FormField.js.map +0 -1
  324. package/dist/vue/kit/primevue/Icon.js +0 -23
  325. package/dist/vue/kit/primevue/Icon.js.map +0 -1
  326. package/dist/vue/kit/primevue/Input.js +0 -96
  327. package/dist/vue/kit/primevue/Input.js.map +0 -1
  328. package/dist/vue/kit/primevue/InputMenu.js +0 -122
  329. package/dist/vue/kit/primevue/InputMenu.js.map +0 -1
  330. package/dist/vue/kit/primevue/Modal.js +0 -59
  331. package/dist/vue/kit/primevue/Modal.js.map +0 -1
  332. package/dist/vue/kit/primevue/Popover.js +0 -135
  333. package/dist/vue/kit/primevue/Popover.js.map +0 -1
  334. package/dist/vue/kit/primevue/RadioGroup.js +0 -58
  335. package/dist/vue/kit/primevue/RadioGroup.js.map +0 -1
  336. package/dist/vue/kit/primevue/Select.js +0 -68
  337. package/dist/vue/kit/primevue/Select.js.map +0 -1
  338. package/dist/vue/kit/primevue/SelectMenu.js +0 -94
  339. package/dist/vue/kit/primevue/SelectMenu.js.map +0 -1
  340. package/dist/vue/kit/primevue/Separator.js +0 -16
  341. package/dist/vue/kit/primevue/Separator.js.map +0 -1
  342. package/dist/vue/kit/primevue/Switch.js +0 -46
  343. package/dist/vue/kit/primevue/Switch.js.map +0 -1
  344. package/dist/vue/kit/primevue/Table.js +0 -54
  345. package/dist/vue/kit/primevue/Table.js.map +0 -1
  346. package/dist/vue/kit/primevue/Tabs.js +0 -49
  347. package/dist/vue/kit/primevue/Tabs.js.map +0 -1
  348. package/dist/vue/kit/primevue/Textarea.js +0 -55
  349. package/dist/vue/kit/primevue/Textarea.js.map +0 -1
  350. package/dist/vue/kit/primevue/Tooltip.js +0 -43
  351. package/dist/vue/kit/primevue/Tooltip.js.map +0 -1
  352. package/dist/vue/kit/primevue/Tree.js +0 -75
  353. package/dist/vue/kit/primevue/Tree.js.map +0 -1
  354. package/dist/vue/kit/primevue/select-options.js +0 -55
  355. package/dist/vue/kit/primevue/select-options.js.map +0 -1
  356. package/dist/vue/kit/primevue/shared.js +0 -49
  357. package/dist/vue/kit/primevue/shared.js.map +0 -1
  358. package/dist/vue/kit/primevue/trigger.js +0 -25
  359. package/dist/vue/kit/primevue/trigger.js.map +0 -1
  360. package/dist/vue/kit/primevue.css +0 -86
  361. package/dist/vue/kit/primevue.d.ts +0 -33
  362. package/dist/vue/kit/primevue.js +0 -96
  363. package/dist/vue/kit/primevue.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"ai.js","names":[],"sources":["../../../src/i18n/en/ai.ts"],"sourcesContent":["import type { de } from '../de/ai'\n\nexport const en: { [K in keyof typeof de]: string } = {\n // Tasks (menus, sidebar chips, prompt hints, result headings)\n 'ai.task.reformulate.label': 'Rephrase',\n 'ai.task.reformulate.promptLabel': 'Hint (optional), e.g. “shorter” or “more formal”',\n 'ai.task.generate.label': 'Generate text',\n 'ai.task.generate.promptLabel': 'What should be written?',\n 'ai.task.transcript.promptLabel': 'Hint (optional), e.g. “decisions only” or “in German”',\n 'ai.task.transcriptSummary.heading': 'Summary',\n 'ai.task.transcriptMinutes.heading': 'Minutes',\n 'ai.task.transcriptActionItems.heading': 'Action items',\n 'ai.task.fix.label': 'Fix',\n 'ai.task.shorter.label': 'Shorter',\n 'ai.task.formal.label': 'More formal',\n 'ai.task.casual.label': 'More casual',\n 'ai.task.translate.label': 'Translate',\n 'ai.task.summarize.label': 'Summarize',\n 'ai.task.custom.label': 'Custom instruction',\n 'ai.task.custom.promptLabel': 'Instruction for the AI, e.g. “as a bullet list”',\n 'ai.task.continue.label': 'Continue writing',\n 'ai.task.fillBlock.label': 'Fill block',\n 'ai.task.fillBlock.promptLabel': 'Hint (optional)',\n\n // Model slots and target languages\n 'ai.slot.complete.label': 'Suggestions while typing',\n 'ai.slot.complete.description': 'Fast model; must support assistant prefill.',\n 'ai.slot.rewrite.label': 'Text in a block',\n 'ai.slot.rewrite.description': 'Rephrase, fix, translate, summarize, clean up transcript.',\n 'ai.slot.generate.label': 'Generate blocks & chat',\n 'ai.slot.generate.description': 'New blocks, minutes, chat agent (needs tool calling).',\n 'ai.slot.ariaLabel': 'Model for “{slot}”',\n 'ai.slot.manage': 'Manage models…',\n 'ai.language.de': 'German',\n 'ai.language.en': 'English',\n 'ai.language.fr': 'French',\n 'ai.language.es': 'Spanish',\n 'ai.language.it': 'Italian',\n\n // Feature entry points (toolbar, block action, slash command, settings tab)\n 'ai.tab': 'AI',\n 'ai.toolbar.sidebar': 'AI sidebar',\n 'ai.toolbar.autocomplete': 'AI suggestions while typing (Tab accepts, Esc dismisses)',\n 'ai.blockAction.label': 'Edit with AI',\n 'ai.slash.label': 'AI',\n\n // Notices\n 'ai.rateLimited': 'Too many AI requests, please wait a moment',\n 'ai.sse.unknownError': 'Unknown error',\n 'ai.sse.httpError': 'Error {status}',\n 'ai.sse.aborted': 'Connection interrupted',\n 'ai.chat.emptyScope': 'The selection contains no editable blocks.',\n 'ai.apply.missing.title': 'Text passage not found anymore',\n 'ai.apply.missing.description': 'The result was not applied.',\n 'ai.apply.empty.title': 'Empty result',\n 'ai.apply.empty.description': 'The result was not applied.',\n 'ai.apply.unchanged.title': 'No changes',\n 'ai.apply.unchanged.description': 'The result matches the existing text.',\n 'ai.apply.overlap.title': 'Text passage is already under review',\n 'ai.apply.overlap.description': 'Accept or discard the open AI changes first.',\n\n // In-document review\n 'ai.review.accept': 'Accept',\n 'ai.review.discard': 'Discard',\n 'ai.review.acceptAll': 'Accept all',\n 'ai.review.rejectAll': 'Discard all',\n 'ai.review.barLabel': 'Review AI changes',\n 'ai.review.count.one': '1 AI change',\n 'ai.review.count.other': '{n} AI changes',\n 'ai.review.previous': 'Previous change',\n 'ai.review.next': 'Next change',\n 'ai.review.invalid.one': 'AI change discarded',\n 'ai.review.invalid.other': '{n} AI changes discarded',\n 'ai.review.invalid.description': 'The original text has been changed in the meantime.',\n\n // Selection / caret menu\n 'ai.menu.trigger': 'AI',\n 'ai.menu.model': 'Model',\n 'ai.menu.targetLanguage': 'Target language',\n 'ai.menu.sendInstruction': 'Send instruction',\n 'ai.menu.requestWithLanguage': '{task} – {language}',\n 'ai.menu.cancel': 'Cancel',\n 'ai.menu.discard': 'Discard',\n 'ai.menu.retry': 'Try again',\n 'ai.menu.insert': 'Insert',\n 'ai.menu.insertBelow': 'Insert below',\n 'ai.menu.replace': 'Replace',\n 'ai.menu.missing.selection': 'The selected text was deleted.',\n 'ai.menu.missing.line': 'The line was deleted.',\n 'ai.menu.missing.insert': 'The result was not inserted.',\n\n // Sidebar\n 'ai.sidebar.label': 'AI sidebar',\n 'ai.sidebar.title': 'AI',\n 'ai.sidebar.newConversation': 'New conversation',\n 'ai.sidebar.close': 'Close',\n 'ai.sidebar.selection.one': 'Selection: {n} block',\n 'ai.sidebar.selection.other': 'Selection: {n} blocks',\n 'ai.sidebar.selection.title': 'Changes only affect the selected blocks',\n 'ai.sidebar.selection.clear': 'Clear selection',\n 'ai.sidebar.intro': 'Ask a question about the content, e.g. “Who said the budget isn’t enough?”, or ask for a change, e.g. “Shorten section 2”. With text selected, changes only affect the selected blocks. The quick actions below generate new blocks, e.g. minutes.',\n 'ai.sidebar.stop': 'Stop',\n 'ai.sidebar.discard': 'Discard',\n 'ai.sidebar.apply': 'Accept',\n 'ai.sidebar.generateGroup': 'Generate blocks',\n 'ai.sidebar.generate': 'Generate',\n 'ai.sidebar.placeholder': 'Question or change request…',\n 'ai.sidebar.messageLabel': 'Message about the document',\n 'ai.sidebar.send': 'Send',\n 'ai.sidebar.revealMissing': 'Text passage no longer in the document',\n\n // Chat edit operations\n 'ai.op.addAtStart': 'Insert at the start of the document',\n 'ai.op.addAfter': 'Insert after “{snippet}”',\n 'ai.op.convert': 'Convert to {target}: “{snippet}”',\n 'ai.op.update': 'Change: “{snippet}”',\n 'ai.op.delete': 'Delete: “{snippet}”',\n 'ai.op.accept': 'Accept',\n 'ai.op.discard': 'Discard',\n 'ai.op.problems.one': '1 suggestion discarded',\n 'ai.op.problems.other': '{n} suggestions discarded',\n 'ai.op.problems.description': 'The AI referred to blocks or block types that do not exist or that are outside the selection.',\n 'ai.op.invalid.title': 'Change no longer applicable',\n 'ai.op.invalid.description': 'The text has been changed differently in the meantime.',\n 'ai.op.snippet.documentStart': 'Start of document',\n 'ai.op.snippet.missing': 'Block no longer exists',\n 'ai.op.snippet.emptyBlock': 'Empty block',\n 'ai.op.snippet.image': 'Image',\n 'ai.op.snippet.audio': 'Audio',\n 'ai.op.snippet.video': 'Video',\n 'ai.op.snippet.file': 'File',\n 'ai.opBadge.pending': 'Open',\n 'ai.opBadge.accepted': 'Accepted',\n 'ai.opBadge.rejected': 'Rejected',\n 'ai.opBadge.partial': 'Partial',\n 'ai.opBadge.invalid': 'Expired',\n 'ai.opBadge.unchanged': 'No change',\n 'ai.opBadge.missing': 'Block missing',\n 'ai.opBadge.overlap': 'Spot occupied',\n 'ai.opBadge.empty': 'Empty',\n 'ai.opBadge.blocked': 'Outside the selection',\n 'ai.opTitle.pending': 'Suggestion not decided yet',\n 'ai.opTitle.accepted': 'Suggestion accepted',\n 'ai.opTitle.rejected': 'Suggestion rejected',\n 'ai.opTitle.partial': 'Suggestion partially accepted',\n 'ai.opTitle.invalid': 'Suggestion expired because the text has been changed differently in the meantime',\n 'ai.opTitle.unchanged': 'Suggestion not shown because it matches the existing text',\n 'ai.opTitle.missing': 'Suggestion not shown because the block no longer exists',\n 'ai.opTitle.overlap': 'Suggestion not shown because other AI changes are still open at that spot',\n 'ai.opTitle.empty': 'Suggestion not shown because its content is empty',\n 'ai.opTitle.blocked': 'Suggestion blocked because it lies outside the permitted area',\n\n // Settings tab\n 'ai.settings.writing.title': 'While writing',\n 'ai.settings.autocomplete.label': 'AI suggestions while typing',\n 'ai.settings.autocomplete.description': 'Grey text after the cursor; Tab accepts, Esc dismisses.',\n 'ai.settings.language.label': 'Target language for translating',\n 'ai.settings.language.description': 'Preselected; can be changed per call in the AI menu.',\n 'ai.settings.slots.title': 'Model per task',\n 'ai.settings.slots.description': 'Which profile the individual AI functions use.',\n 'ai.settings.profiles.title': 'Model profiles',\n 'ai.settings.profiles.description': 'Server presets are preconfigured. Your own profiles are stored in this browser only; their API key is sent with every request and not stored on the server.',\n 'ai.profiles.server': 'From the server',\n 'ai.profiles.noPresets': 'No presets loaded.',\n 'ai.profiles.serverBadge': 'Server',\n 'ai.profiles.own': 'Own profiles',\n 'ai.profiles.add': 'Add profile',\n 'ai.profiles.edit': 'Edit',\n 'ai.profiles.delete': 'Delete',\n 'ai.profiles.name': 'Name',\n 'ai.profiles.namePlaceholder': 'e.g. Local',\n 'ai.profiles.endpoint': 'Endpoint',\n 'ai.profiles.endpointHelp': 'OpenAI-compatible base URL.',\n 'ai.profiles.endpointPlaceholder': 'https://openrouter.ai/api/v1',\n 'ai.profiles.model': 'Model',\n 'ai.profiles.modelPlaceholder': 'google/gemini-2.5-flash',\n 'ai.profiles.apiKey': 'API key',\n 'ai.profiles.testOk': 'Connection works',\n 'ai.profiles.test': 'Test',\n 'ai.profiles.cancel': 'Cancel',\n 'ai.profiles.save': 'Save',\n}\n"],"mappings":";AAEA,MAAa,KAAyC;CAEpD,6BAA6B;CAC7B,mCAAmC;CACnC,0BAA0B;CAC1B,gCAAgC;CAChC,kCAAkC;CAClC,qCAAqC;CACrC,qCAAqC;CACrC,yCAAyC;CACzC,qBAAqB;CACrB,yBAAyB;CACzB,wBAAwB;CACxB,wBAAwB;CACxB,2BAA2B;CAC3B,2BAA2B;CAC3B,wBAAwB;CACxB,8BAA8B;CAC9B,0BAA0B;CAC1B,2BAA2B;CAC3B,iCAAiC;CAGjC,0BAA0B;CAC1B,gCAAgC;CAChC,yBAAyB;CACzB,+BAA+B;CAC/B,0BAA0B;CAC1B,gCAAgC;CAChC,qBAAqB;CACrB,kBAAkB;CAClB,kBAAkB;CAClB,kBAAkB;CAClB,kBAAkB;CAClB,kBAAkB;CAClB,kBAAkB;CAGlB,UAAU;CACV,sBAAsB;CACtB,2BAA2B;CAC3B,wBAAwB;CACxB,kBAAkB;CAGlB,kBAAkB;CAClB,uBAAuB;CACvB,oBAAoB;CACpB,kBAAkB;CAClB,sBAAsB;CACtB,0BAA0B;CAC1B,gCAAgC;CAChC,wBAAwB;CACxB,8BAA8B;CAC9B,4BAA4B;CAC5B,kCAAkC;CAClC,0BAA0B;CAC1B,gCAAgC;CAGhC,oBAAoB;CACpB,qBAAqB;CACrB,uBAAuB;CACvB,uBAAuB;CACvB,sBAAsB;CACtB,uBAAuB;CACvB,yBAAyB;CACzB,sBAAsB;CACtB,kBAAkB;CAClB,yBAAyB;CACzB,2BAA2B;CAC3B,iCAAiC;CAGjC,mBAAmB;CACnB,iBAAiB;CACjB,0BAA0B;CAC1B,2BAA2B;CAC3B,+BAA+B;CAC/B,kBAAkB;CAClB,mBAAmB;CACnB,iBAAiB;CACjB,kBAAkB;CAClB,uBAAuB;CACvB,mBAAmB;CACnB,6BAA6B;CAC7B,wBAAwB;CACxB,0BAA0B;CAG1B,oBAAoB;CACpB,oBAAoB;CACpB,8BAA8B;CAC9B,oBAAoB;CACpB,4BAA4B;CAC5B,8BAA8B;CAC9B,8BAA8B;CAC9B,8BAA8B;CAC9B,oBAAoB;CACpB,mBAAmB;CACnB,sBAAsB;CACtB,oBAAoB;CACpB,4BAA4B;CAC5B,uBAAuB;CACvB,0BAA0B;CAC1B,2BAA2B;CAC3B,mBAAmB;CACnB,4BAA4B;CAG5B,oBAAoB;CACpB,kBAAkB;CAClB,iBAAiB;CACjB,gBAAgB;CAChB,gBAAgB;CAChB,gBAAgB;CAChB,iBAAiB;CACjB,sBAAsB;CACtB,wBAAwB;CACxB,8BAA8B;CAC9B,uBAAuB;CACvB,6BAA6B;CAC7B,+BAA+B;CAC/B,yBAAyB;CACzB,4BAA4B;CAC5B,uBAAuB;CACvB,uBAAuB;CACvB,uBAAuB;CACvB,sBAAsB;CACtB,sBAAsB;CACtB,uBAAuB;CACvB,uBAAuB;CACvB,sBAAsB;CACtB,sBAAsB;CACtB,wBAAwB;CACxB,sBAAsB;CACtB,sBAAsB;CACtB,oBAAoB;CACpB,sBAAsB;CACtB,sBAAsB;CACtB,uBAAuB;CACvB,uBAAuB;CACvB,sBAAsB;CACtB,sBAAsB;CACtB,wBAAwB;CACxB,sBAAsB;CACtB,sBAAsB;CACtB,oBAAoB;CACpB,sBAAsB;CAGtB,6BAA6B;CAC7B,kCAAkC;CAClC,wCAAwC;CACxC,8BAA8B;CAC9B,oCAAoC;CACpC,2BAA2B;CAC3B,iCAAiC;CACjC,8BAA8B;CAC9B,oCAAoC;CACpC,sBAAsB;CACtB,yBAAyB;CACzB,2BAA2B;CAC3B,mBAAmB;CACnB,mBAAmB;CACnB,oBAAoB;CACpB,sBAAsB;CACtB,oBAAoB;CACpB,+BAA+B;CAC/B,wBAAwB;CACxB,4BAA4B;CAC5B,mCAAmC;CACnC,qBAAqB;CACrB,gCAAgC;CAChC,sBAAsB;CACtB,sBAAsB;CACtB,oBAAoB;CACpB,sBAAsB;CACtB,oBAAoB;AACtB"}
1
+ {"version":3,"file":"ai.js","names":[],"sources":["../../../src/i18n/en/ai.ts"],"sourcesContent":["import type { de } from '../de/ai'\n\nexport const en: { [K in keyof typeof de]: string } = {\n // Tasks (menus, sidebar chips, prompt hints, result headings)\n 'ai.task.reformulate.label': 'Rephrase',\n 'ai.task.reformulate.promptLabel': 'Hint (optional), e.g. “shorter” or “more formal”',\n 'ai.task.generate.label': 'Generate text',\n 'ai.task.generate.promptLabel': 'What should be written?',\n 'ai.task.transcript.promptLabel': 'Hint (optional), e.g. “decisions only” or “in German”',\n 'ai.task.transcriptSummary.heading': 'Summary',\n 'ai.task.transcriptMinutes.heading': 'Minutes',\n 'ai.task.transcriptActionItems.heading': 'Action items',\n 'ai.task.fix.label': 'Fix',\n 'ai.task.shorter.label': 'Shorter',\n 'ai.task.formal.label': 'More formal',\n 'ai.task.casual.label': 'More casual',\n 'ai.task.translate.label': 'Translate',\n 'ai.task.summarize.label': 'Summarize',\n 'ai.task.custom.label': 'Custom instruction',\n 'ai.task.custom.promptLabel': 'Instruction for the AI, e.g. “as a bullet list”',\n 'ai.task.continue.label': 'Continue writing',\n 'ai.task.fillBlock.label': 'Fill block',\n 'ai.task.fillBlock.promptLabel': 'Hint (optional)',\n\n // Model slots and target languages\n 'ai.slot.complete.label': 'Suggestions while typing',\n 'ai.slot.complete.description': 'Fast model; must support assistant prefill.',\n 'ai.slot.rewrite.label': 'Text in a block',\n 'ai.slot.rewrite.description': 'Rephrase, fix, translate, summarize, clean up transcript.',\n 'ai.slot.generate.label': 'Generate blocks & chat',\n 'ai.slot.generate.description': 'New blocks, minutes, chat agent (needs tool calling).',\n 'ai.slot.ariaLabel': 'Model for “{slot}”',\n 'ai.slot.manage': 'Manage models…',\n 'ai.language.de': 'German',\n 'ai.language.en': 'English',\n 'ai.language.fr': 'French',\n 'ai.language.es': 'Spanish',\n 'ai.language.it': 'Italian',\n\n // Feature entry points (toolbar, block action, slash command, settings tab)\n 'ai.tab': 'AI',\n 'ai.toolbar.sidebar': 'AI sidebar',\n 'ai.toolbar.autocomplete': 'AI suggestions while typing (Tab accepts, Esc dismisses)',\n 'ai.blockAction.label': 'Edit with AI',\n 'ai.slash.label': 'AI',\n\n // Notices\n 'ai.rateLimited': 'Too many AI requests, please wait a moment',\n 'ai.sse.unknownError': 'Unknown error',\n 'ai.sse.httpError': 'Error {status}',\n 'ai.sse.aborted': 'Connection interrupted',\n 'ai.chat.emptyScope': 'The selection contains no editable blocks.',\n 'ai.apply.missing.title': 'Text passage not found anymore',\n 'ai.apply.missing.description': 'The result was not applied.',\n 'ai.apply.empty.title': 'Empty result',\n 'ai.apply.empty.description': 'The result was not applied.',\n 'ai.apply.unchanged.title': 'No changes',\n 'ai.apply.unchanged.description': 'The result matches the existing text.',\n 'ai.apply.overlap.title': 'Text passage is already under review',\n 'ai.apply.overlap.description': 'Accept or discard the open AI changes first.',\n\n // In-document review\n 'ai.review.accept': 'Accept',\n 'ai.review.discard': 'Discard',\n 'ai.review.acceptAll': 'Accept all',\n 'ai.review.rejectAll': 'Discard all',\n 'ai.review.barLabel': 'Review AI changes',\n 'ai.review.count.one': '1 AI change',\n 'ai.review.count.other': '{n} AI changes',\n 'ai.review.previous': 'Previous change',\n 'ai.review.next': 'Next change',\n 'ai.review.invalid.one': 'AI change discarded',\n 'ai.review.invalid.other': '{n} AI changes discarded',\n 'ai.review.invalid.description': 'The original text has been changed in the meantime.',\n\n // Selection / caret menu\n 'ai.menu.trigger': 'AI',\n 'ai.menu.model': 'Model',\n 'ai.menu.targetLanguage': 'Target language',\n 'ai.menu.sendInstruction': 'Send instruction',\n 'ai.menu.requestWithLanguage': '{task} – {language}',\n 'ai.menu.cancel': 'Cancel',\n 'ai.menu.discard': 'Discard',\n 'ai.menu.retry': 'Try again',\n 'ai.menu.insert': 'Insert',\n 'ai.menu.insertBelow': 'Insert below',\n 'ai.menu.replace': 'Replace',\n 'ai.menu.missing.selection': 'The selected text was deleted.',\n 'ai.menu.missing.line': 'The line was deleted.',\n 'ai.menu.missing.insert': 'The result was not inserted.',\n\n // Sidebar\n 'ai.sidebar.label': 'AI sidebar',\n 'ai.sidebar.title': 'AI',\n 'ai.sidebar.newConversation': 'New conversation',\n 'ai.sidebar.close': 'Close',\n 'ai.sidebar.selection.one': 'Selection: {n} block',\n 'ai.sidebar.selection.other': 'Selection: {n} blocks',\n 'ai.sidebar.selection.title': 'Changes only affect the selected blocks',\n 'ai.sidebar.selection.clear': 'Clear selection',\n 'ai.sidebar.intro': 'Ask a question about the content, e.g. “Who said the budget isn’t enough?”, or ask for a change, e.g. “Shorten section 2”. With text selected, changes only affect the selected blocks. The quick actions below generate new blocks, e.g. minutes.',\n 'ai.sidebar.stop': 'Stop',\n 'ai.sidebar.discard': 'Discard',\n 'ai.sidebar.apply': 'Accept',\n 'ai.sidebar.generateGroup': 'Generate blocks',\n 'ai.sidebar.generate': 'Generate',\n 'ai.sidebar.placeholder': 'Question or change request…',\n 'ai.sidebar.messageLabel': 'Message about the document',\n 'ai.sidebar.send': 'Send',\n 'ai.sidebar.revealMissing': 'Text passage no longer in the document',\n\n // Chat edit operations\n 'ai.op.addAtStart': 'Insert at the start of the document',\n 'ai.op.addAfter': 'Insert after “{snippet}”',\n 'ai.op.convert': 'Convert to {target}: “{snippet}”',\n 'ai.op.update': 'Change: “{snippet}”',\n 'ai.op.delete': 'Delete: “{snippet}”',\n 'ai.op.accept': 'Accept',\n 'ai.op.discard': 'Discard',\n 'ai.op.problems.one': '1 suggestion discarded',\n 'ai.op.problems.other': '{n} suggestions discarded',\n 'ai.op.problems.description': 'The AI referred to blocks or block types that do not exist or that are outside the selection.',\n 'ai.op.invalid.title': 'Change no longer applicable',\n 'ai.op.invalid.description': 'The text has been changed differently in the meantime.',\n 'ai.op.snippet.documentStart': 'Start of document',\n 'ai.op.snippet.missing': 'Block no longer exists',\n 'ai.op.snippet.emptyBlock': 'Empty block',\n 'ai.op.snippet.image': 'Image',\n 'ai.op.snippet.audio': 'Audio',\n 'ai.op.snippet.video': 'Video',\n 'ai.op.snippet.file': 'File',\n 'ai.opBadge.pending': 'Open',\n 'ai.opBadge.accepted': 'Accepted',\n 'ai.opBadge.rejected': 'Rejected',\n 'ai.opBadge.partial': 'Partial',\n 'ai.opBadge.invalid': 'Expired',\n 'ai.opBadge.unchanged': 'No change',\n 'ai.opBadge.missing': 'Block missing',\n 'ai.opBadge.stale': 'Block deleted',\n 'ai.opBadge.overlap': 'Spot occupied',\n 'ai.opBadge.empty': 'Empty',\n 'ai.opBadge.blocked': 'Outside the selection',\n 'ai.opTitle.pending': 'Suggestion not decided yet',\n 'ai.opTitle.accepted': 'Suggestion accepted',\n 'ai.opTitle.rejected': 'Suggestion rejected',\n 'ai.opTitle.partial': 'Suggestion partially accepted',\n 'ai.opTitle.invalid': 'Suggestion expired because the text has been changed differently in the meantime',\n 'ai.opTitle.unchanged': 'Suggestion not shown because it matches the existing text',\n 'ai.opTitle.missing': 'Suggestion not shown because the block no longer exists',\n 'ai.opTitle.stale': 'Suggestion not shown: the block was deleted in the meantime',\n 'ai.opTitle.overlap': 'Suggestion not shown because other AI changes are still open at that spot',\n 'ai.opTitle.empty': 'Suggestion not shown because its content is empty',\n 'ai.opTitle.blocked': 'Suggestion blocked because it lies outside the permitted area',\n\n // Settings tab\n 'ai.settings.writing.title': 'While writing',\n 'ai.settings.autocomplete.label': 'AI suggestions while typing',\n 'ai.settings.autocomplete.description': 'Grey text after the cursor; Tab accepts, Esc dismisses.',\n 'ai.settings.language.label': 'Target language for translating',\n 'ai.settings.language.description': 'Preselected; can be changed per call in the AI menu.',\n 'ai.settings.slots.title': 'Model per task',\n 'ai.settings.slots.description': 'Which profile the individual AI functions use.',\n 'ai.settings.profiles.title': 'Model profiles',\n 'ai.settings.profiles.description': 'Server presets are preconfigured. Your own profiles are stored in this browser only; their API key is sent with every request and not stored on the server.',\n 'ai.profiles.server': 'From the server',\n 'ai.profiles.noPresets': 'No presets loaded.',\n 'ai.profiles.serverBadge': 'Server',\n 'ai.profiles.own': 'Own profiles',\n 'ai.profiles.add': 'Add profile',\n 'ai.profiles.edit': 'Edit',\n 'ai.profiles.delete': 'Delete',\n 'ai.profiles.name': 'Name',\n 'ai.profiles.namePlaceholder': 'e.g. Local',\n 'ai.profiles.endpoint': 'Endpoint',\n 'ai.profiles.endpointHelp': 'OpenAI-compatible base URL.',\n 'ai.profiles.endpointPlaceholder': 'https://openrouter.ai/api/v1',\n 'ai.profiles.model': 'Model',\n 'ai.profiles.modelPlaceholder': 'google/gemini-2.5-flash',\n 'ai.profiles.apiKey': 'API key',\n 'ai.profiles.testOk': 'Connection works',\n 'ai.profiles.test': 'Test',\n 'ai.profiles.cancel': 'Cancel',\n 'ai.profiles.save': 'Save',\n}\n"],"mappings":";AAEA,MAAa,KAAyC;CAEpD,6BAA6B;CAC7B,mCAAmC;CACnC,0BAA0B;CAC1B,gCAAgC;CAChC,kCAAkC;CAClC,qCAAqC;CACrC,qCAAqC;CACrC,yCAAyC;CACzC,qBAAqB;CACrB,yBAAyB;CACzB,wBAAwB;CACxB,wBAAwB;CACxB,2BAA2B;CAC3B,2BAA2B;CAC3B,wBAAwB;CACxB,8BAA8B;CAC9B,0BAA0B;CAC1B,2BAA2B;CAC3B,iCAAiC;CAGjC,0BAA0B;CAC1B,gCAAgC;CAChC,yBAAyB;CACzB,+BAA+B;CAC/B,0BAA0B;CAC1B,gCAAgC;CAChC,qBAAqB;CACrB,kBAAkB;CAClB,kBAAkB;CAClB,kBAAkB;CAClB,kBAAkB;CAClB,kBAAkB;CAClB,kBAAkB;CAGlB,UAAU;CACV,sBAAsB;CACtB,2BAA2B;CAC3B,wBAAwB;CACxB,kBAAkB;CAGlB,kBAAkB;CAClB,uBAAuB;CACvB,oBAAoB;CACpB,kBAAkB;CAClB,sBAAsB;CACtB,0BAA0B;CAC1B,gCAAgC;CAChC,wBAAwB;CACxB,8BAA8B;CAC9B,4BAA4B;CAC5B,kCAAkC;CAClC,0BAA0B;CAC1B,gCAAgC;CAGhC,oBAAoB;CACpB,qBAAqB;CACrB,uBAAuB;CACvB,uBAAuB;CACvB,sBAAsB;CACtB,uBAAuB;CACvB,yBAAyB;CACzB,sBAAsB;CACtB,kBAAkB;CAClB,yBAAyB;CACzB,2BAA2B;CAC3B,iCAAiC;CAGjC,mBAAmB;CACnB,iBAAiB;CACjB,0BAA0B;CAC1B,2BAA2B;CAC3B,+BAA+B;CAC/B,kBAAkB;CAClB,mBAAmB;CACnB,iBAAiB;CACjB,kBAAkB;CAClB,uBAAuB;CACvB,mBAAmB;CACnB,6BAA6B;CAC7B,wBAAwB;CACxB,0BAA0B;CAG1B,oBAAoB;CACpB,oBAAoB;CACpB,8BAA8B;CAC9B,oBAAoB;CACpB,4BAA4B;CAC5B,8BAA8B;CAC9B,8BAA8B;CAC9B,8BAA8B;CAC9B,oBAAoB;CACpB,mBAAmB;CACnB,sBAAsB;CACtB,oBAAoB;CACpB,4BAA4B;CAC5B,uBAAuB;CACvB,0BAA0B;CAC1B,2BAA2B;CAC3B,mBAAmB;CACnB,4BAA4B;CAG5B,oBAAoB;CACpB,kBAAkB;CAClB,iBAAiB;CACjB,gBAAgB;CAChB,gBAAgB;CAChB,gBAAgB;CAChB,iBAAiB;CACjB,sBAAsB;CACtB,wBAAwB;CACxB,8BAA8B;CAC9B,uBAAuB;CACvB,6BAA6B;CAC7B,+BAA+B;CAC/B,yBAAyB;CACzB,4BAA4B;CAC5B,uBAAuB;CACvB,uBAAuB;CACvB,uBAAuB;CACvB,sBAAsB;CACtB,sBAAsB;CACtB,uBAAuB;CACvB,uBAAuB;CACvB,sBAAsB;CACtB,sBAAsB;CACtB,wBAAwB;CACxB,sBAAsB;CACtB,oBAAoB;CACpB,sBAAsB;CACtB,oBAAoB;CACpB,sBAAsB;CACtB,sBAAsB;CACtB,uBAAuB;CACvB,uBAAuB;CACvB,sBAAsB;CACtB,sBAAsB;CACtB,wBAAwB;CACxB,sBAAsB;CACtB,oBAAoB;CACpB,sBAAsB;CACtB,oBAAoB;CACpB,sBAAsB;CAGtB,6BAA6B;CAC7B,kCAAkC;CAClC,wCAAwC;CACxC,8BAA8B;CAC9B,oCAAoC;CACpC,2BAA2B;CAC3B,iCAAiC;CACjC,8BAA8B;CAC9B,oCAAoC;CACpC,sBAAsB;CACtB,yBAAyB;CACzB,2BAA2B;CAC3B,mBAAmB;CACnB,mBAAmB;CACnB,oBAAoB;CACpB,sBAAsB;CACtB,oBAAoB;CACpB,+BAA+B;CAC/B,wBAAwB;CACxB,4BAA4B;CAC5B,mCAAmC;CACnC,qBAAqB;CACrB,gCAAgC;CAChC,sBAAsB;CACtB,sBAAsB;CACtB,oBAAoB;CACpB,sBAAsB;CACtB,oBAAoB;AACtB"}
@@ -2,8 +2,7 @@
2
2
  const en = {
3
3
  "common.loading": "Loading …",
4
4
  "common.close": "Close",
5
- "slash.empty": "No command found",
6
- "common.createItem": "Create “{value}”"
5
+ "slash.empty": "No command found"
7
6
  };
8
7
  //#endregion
9
8
  export { en };
@@ -1 +1 @@
1
- {"version":3,"file":"common.js","names":[],"sources":["../../../src/i18n/en/common.ts"],"sourcesContent":["import type { de } from '../de/common'\n\nexport const en: { [K in keyof typeof de]: string } = {\n 'common.loading': 'Loading …',\n 'common.close': 'Close',\n 'slash.empty': 'No command found',\n 'common.createItem': 'Create “{value}”',\n}\n"],"mappings":";AAEA,MAAa,KAAyC;CACpD,kBAAkB;CAClB,gBAAgB;CAChB,eAAe;CACf,qBAAqB;AACvB"}
1
+ {"version":3,"file":"common.js","names":[],"sources":["../../../src/i18n/en/common.ts"],"sourcesContent":["import type { de } from '../de/common'\n\nexport const en: { [K in keyof typeof de]: string } = {\n 'common.loading': 'Loading …',\n 'common.close': 'Close',\n 'slash.empty': 'No command found',\n}\n"],"mappings":";AAEA,MAAa,KAAyC;CACpD,kBAAkB;CAClB,gBAAgB;CAChB,eAAe;AACjB"}
@@ -137,7 +137,14 @@ const en = {
137
137
  "composites.settings.dragHandle.hover.label": "Only on hover",
138
138
  "composites.settings.dragHandle.hover.description": "The drag handle appears on the block under the mouse.",
139
139
  "composites.settings.dragHandle.always.label": "Always show",
140
- "composites.settings.dragHandle.always.description": "Every block without an icon permanently shows its drag handle."
140
+ "composites.settings.dragHandle.always.description": "Every block without an icon permanently shows its drag handle.",
141
+ "composites.nesting.title": "Nesting not possible",
142
+ "composites.nesting.refused": "{parent} does not accept {child}.",
143
+ "composites.move.blockGone": "The block no longer exists.",
144
+ "composites.move.targetGone": "The target no longer exists.",
145
+ "composites.move.targetNotBlock": "The target is not a building block.",
146
+ "composites.move.intoSelf": "A block cannot be moved into itself.",
147
+ "composites.move.intoOwn": "A block cannot be moved into a building block it contains itself."
141
148
  };
142
149
  //#endregion
143
150
  export { en };
@@ -1 +1 @@
1
- {"version":3,"file":"composites.js","names":[],"sources":["../../../src/i18n/en/composites.ts"],"sourcesContent":["import type { de } from '../de/composites'\n\nexport const en: { [K in keyof typeof de]: string } = {\n 'composites.untitled': '(untitled)',\n\n 'composites.kind.section.label': 'Section',\n 'composites.kind.section.title': 'Heading',\n 'composites.kind.section.description': 'Summary',\n 'composites.kind.task.label': 'Task',\n 'composites.kind.task.title': 'Task',\n 'composites.kind.task.description': 'Description',\n 'composites.kind.task.field.status': 'Status',\n 'composites.kind.task.status.open': 'Open',\n 'composites.kind.task.status.doing': 'In progress',\n 'composites.kind.task.status.done': 'Done',\n 'composites.kind.task.field.due': 'Due',\n 'composites.kind.task.field.assignee': 'Assignee',\n 'composites.kind.note.label': 'Note',\n 'composites.kind.note.title': 'Title',\n 'composites.kind.note.description': 'Short description',\n 'composites.kind.document.label': 'Document',\n 'composites.kind.document.title': 'Document name',\n 'composites.kind.document.description': 'Summary',\n 'composites.kind.document.field.filename': 'File name',\n 'composites.kind.document.field.mimeType': 'Type',\n 'composites.kind.document.field.size': 'Size (bytes)',\n 'composites.kind.document.field.importedAt': 'Imported',\n 'composites.kind.document.field.transcript': 'Transcript',\n 'composites.kind.folder.label': 'Folder',\n 'composites.kind.folder.title': 'Folder name',\n 'composites.kind.folder.description': 'Description',\n 'composites.kind.select': 'Kind of building block',\n\n 'composites.status.none': 'No status',\n 'composites.status.label': 'Status: {status}',\n\n 'composites.tab': 'Editing',\n 'composites.slash.section': 'Section',\n 'composites.slash.group': 'Headings to building blocks',\n 'composites.slash.groupAll': 'Headings to building blocks (nested)',\n 'composites.slash.flatten': 'Building blocks to headings',\n 'composites.slash.flattenAll': 'Building blocks to headings (all levels)',\n 'composites.blockAction.export': 'Export as Markdown',\n 'composites.toolbar.toKind': 'Convert to building block',\n 'composites.toolbar.structure': 'Convert structure',\n 'composites.menu.kindHeading': 'Building block',\n 'composites.menu.toComposites': 'Headings to building blocks',\n 'composites.menu.toComposites.top': 'Top level only',\n 'composites.menu.toComposites.top.description': 'Only the highest heading level becomes building blocks',\n 'composites.menu.toComposites.all': 'All levels (nested)',\n 'composites.menu.toComposites.all.description': 'Every heading level becomes a nested building block',\n 'composites.menu.toHeadings': 'Building blocks to headings',\n 'composites.menu.toHeadings.top': 'Top level only',\n 'composites.menu.toHeadings.top.description': 'The top building blocks become headings; inner building blocks stay',\n 'composites.menu.toHeadings.all': 'All levels',\n 'composites.menu.toHeadings.all.description': 'Every building block becomes a heading of its level; description, tags and fields as text',\n 'composites.menu.settings': 'Settings…',\n 'composites.menu.preferred': 'Preferred: {mode}',\n 'composites.convert.kind': '{kind} (building block)',\n\n 'composites.chrome.details': 'Kind and details: {kind}',\n 'composites.chrome.detailsDrag': 'Kind and details: {kind} · Drag to move',\n 'composites.tag.remove': 'Remove tag #{tag}',\n 'composites.tag.add': 'Add tag',\n\n 'composites.tags.label': 'Tags',\n 'composites.tags.placeholder': 'Add tags',\n 'composites.tags.create': 'Create #{tag}',\n\n 'composites.details.confirmLost': 'Really change the kind? Switching to “{kind}” discards this information:',\n 'composites.details.confirm': 'Really change the kind?',\n 'composites.details.cancel': 'Cancel',\n 'composites.details.change': 'Change',\n 'composites.details.summary': 'Summary',\n\n 'composites.summary.placeholder': 'Short summary of the building block',\n 'composites.summary.label': 'Summary',\n 'composites.summary.none': 'No summary',\n 'composites.summary.formatted': 'Contains formatting or mentions and can only be edited in the text.',\n 'composites.field.choose': 'Choose {field}',\n\n 'composites.inspector.label': 'Properties',\n 'composites.inspector.document': 'Document',\n 'composites.inspector.composites': 'Building blocks',\n 'composites.inspector.summarized': '{n} of {total} summarized',\n 'composites.inspector.none': 'None',\n 'composites.inspector.mentions': 'Mentions',\n 'composites.inspector.composite': 'Building block',\n 'composites.inspector.kind': 'Kind',\n 'composites.inspector.title': 'Title',\n 'composites.inspector.titleHelp': 'Edit in the document',\n 'composites.inspector.untitled': 'Untitled',\n 'composites.inspector.description': 'Description',\n 'composites.inspector.descriptionHelp': 'Contains mentions or tags – edit in the document',\n 'composites.inspector.aiStatus': 'AI status',\n 'composites.inspector.summaryPresent': 'Summary present',\n 'composites.inspector.summaryMissing': 'Summary missing',\n\n 'composites.table.label': 'Building blocks as table',\n 'composites.table.emptyTitle': 'This document has no building blocks yet',\n 'composites.table.emptyText': 'Building blocks divide a document into sections, tasks or notes with a title, summary and tags. Insert one in the text with “/” and it appears here with all its details.',\n 'composites.table.column.composite': 'Building block',\n 'composites.table.column.kind': 'Kind',\n 'composites.table.column.tags': 'Tags',\n 'composites.table.column.summary': 'Summary',\n 'composites.table.search.placeholder': 'Title, summary, tags',\n 'composites.table.search.label': 'Search building blocks',\n 'composites.table.search.clear': 'Clear search',\n 'composites.table.filter.all': 'All',\n 'composites.table.filter.reset': 'Reset filters',\n 'composites.table.filter.byKind': 'Filter by kind',\n 'composites.table.filter.byTag': 'Filter by tag',\n 'composites.table.filter.noMatch': 'No building block matches these filters.',\n 'composites.table.count.one': '{n} of {total} building block',\n 'composites.table.count.other': '{n} of {total} building blocks',\n 'composites.table.noValue': 'No value',\n 'composites.table.noTags': 'No tags',\n 'composites.table.summaryPresent': 'Summary present',\n\n 'composites.settings.structure.title': 'Structure',\n 'composites.settings.structure.legend': 'Preferred structure',\n 'composites.settings.structure.flat.label': 'Headings',\n 'composites.settings.structure.flat.description': 'Toolbar with Heading 1–3. AI texts are structured flat with headings (##, ###); building blocks the AI writes anyway become headings.',\n 'composites.settings.structure.composite.label': 'Building blocks',\n 'composites.settings.structure.composite.description': 'Toolbar without Heading 1–3. AI texts are structured as building blocks, subsections as nested building blocks; headings the AI writes anyway become building blocks.',\n 'composites.settings.scope.legend': '“Convert structure” without a selection applies to',\n 'composites.settings.scope.container.label': 'Enclosing building block',\n 'composites.settings.scope.container.description': 'The building block the cursor is in; the whole document outside of building blocks.',\n 'composites.settings.scope.document.label': 'Whole document',\n 'composites.settings.scope.document.description': 'Always all blocks of the document.',\n 'composites.settings.scope.heading.label': 'Heading or building block at the cursor',\n 'composites.settings.scope.heading.description': 'Converting to building blocks: the heading at or before the cursor with its content. Converting to headings: the innermost building block around the cursor.',\n 'composites.settings.sidebar.title': 'Sidebar',\n 'composites.settings.treeRoot.legend': 'Document tree',\n 'composites.settings.treeRoot.folders.label': 'Nest folders and files',\n 'composites.settings.treeRoot.folders.description': 'The sidebar shows the folders with their files; the open file is an entry within them.',\n 'composites.settings.treeRoot.file.label': 'Root is a single file',\n 'composites.settings.treeRoot.file.description': 'While a building block file is open, the sidebar shows it as the root with its folders and documents. Without an open building block file it shows the folders.',\n 'composites.settings.composites.title': 'Building blocks',\n 'composites.settings.defaultKind.label': 'Default building block',\n 'composites.settings.defaultKind.description': 'Kind of the building blocks the toolbar, “/” commands and “Headings to building blocks” create.',\n 'composites.settings.kindIcon.legend': 'Kind icon',\n 'composites.settings.kindIcon.always.label': 'Always show',\n 'composites.settings.kindIcon.always.description': 'The kind icon is permanently shown in front of the building block.',\n 'composites.settings.kindIcon.hover.label': 'Only on hover',\n 'composites.settings.kindIcon.hover.description': 'The icon appears when the mouse is over the building block, it has focus or its details are open.',\n 'composites.settings.dragHandle.legend': 'Drag handle (blocks without icon)',\n 'composites.settings.dragHandle.hover.label': 'Only on hover',\n 'composites.settings.dragHandle.hover.description': 'The drag handle appears on the block under the mouse.',\n 'composites.settings.dragHandle.always.label': 'Always show',\n 'composites.settings.dragHandle.always.description': 'Every block without an icon permanently shows its drag handle.',\n}\n"],"mappings":";AAEA,MAAa,KAAyC;CACpD,uBAAuB;CAEvB,iCAAiC;CACjC,iCAAiC;CACjC,uCAAuC;CACvC,8BAA8B;CAC9B,8BAA8B;CAC9B,oCAAoC;CACpC,qCAAqC;CACrC,oCAAoC;CACpC,qCAAqC;CACrC,oCAAoC;CACpC,kCAAkC;CAClC,uCAAuC;CACvC,8BAA8B;CAC9B,8BAA8B;CAC9B,oCAAoC;CACpC,kCAAkC;CAClC,kCAAkC;CAClC,wCAAwC;CACxC,2CAA2C;CAC3C,2CAA2C;CAC3C,uCAAuC;CACvC,6CAA6C;CAC7C,6CAA6C;CAC7C,gCAAgC;CAChC,gCAAgC;CAChC,sCAAsC;CACtC,0BAA0B;CAE1B,0BAA0B;CAC1B,2BAA2B;CAE3B,kBAAkB;CAClB,4BAA4B;CAC5B,0BAA0B;CAC1B,6BAA6B;CAC7B,4BAA4B;CAC5B,+BAA+B;CAC/B,iCAAiC;CACjC,6BAA6B;CAC7B,gCAAgC;CAChC,+BAA+B;CAC/B,gCAAgC;CAChC,oCAAoC;CACpC,gDAAgD;CAChD,oCAAoC;CACpC,gDAAgD;CAChD,8BAA8B;CAC9B,kCAAkC;CAClC,8CAA8C;CAC9C,kCAAkC;CAClC,8CAA8C;CAC9C,4BAA4B;CAC5B,6BAA6B;CAC7B,2BAA2B;CAE3B,6BAA6B;CAC7B,iCAAiC;CACjC,yBAAyB;CACzB,sBAAsB;CAEtB,yBAAyB;CACzB,+BAA+B;CAC/B,0BAA0B;CAE1B,kCAAkC;CAClC,8BAA8B;CAC9B,6BAA6B;CAC7B,6BAA6B;CAC7B,8BAA8B;CAE9B,kCAAkC;CAClC,4BAA4B;CAC5B,2BAA2B;CAC3B,gCAAgC;CAChC,2BAA2B;CAE3B,8BAA8B;CAC9B,iCAAiC;CACjC,mCAAmC;CACnC,mCAAmC;CACnC,6BAA6B;CAC7B,iCAAiC;CACjC,kCAAkC;CAClC,6BAA6B;CAC7B,8BAA8B;CAC9B,kCAAkC;CAClC,iCAAiC;CACjC,oCAAoC;CACpC,wCAAwC;CACxC,iCAAiC;CACjC,uCAAuC;CACvC,uCAAuC;CAEvC,0BAA0B;CAC1B,+BAA+B;CAC/B,8BAA8B;CAC9B,qCAAqC;CACrC,gCAAgC;CAChC,gCAAgC;CAChC,mCAAmC;CACnC,uCAAuC;CACvC,iCAAiC;CACjC,iCAAiC;CACjC,+BAA+B;CAC/B,iCAAiC;CACjC,kCAAkC;CAClC,iCAAiC;CACjC,mCAAmC;CACnC,8BAA8B;CAC9B,gCAAgC;CAChC,4BAA4B;CAC5B,2BAA2B;CAC3B,mCAAmC;CAEnC,uCAAuC;CACvC,wCAAwC;CACxC,4CAA4C;CAC5C,kDAAkD;CAClD,iDAAiD;CACjD,uDAAuD;CACvD,oCAAoC;CACpC,6CAA6C;CAC7C,mDAAmD;CACnD,4CAA4C;CAC5C,kDAAkD;CAClD,2CAA2C;CAC3C,iDAAiD;CACjD,qCAAqC;CACrC,uCAAuC;CACvC,8CAA8C;CAC9C,oDAAoD;CACpD,2CAA2C;CAC3C,iDAAiD;CACjD,wCAAwC;CACxC,yCAAyC;CACzC,+CAA+C;CAC/C,uCAAuC;CACvC,6CAA6C;CAC7C,mDAAmD;CACnD,4CAA4C;CAC5C,kDAAkD;CAClD,yCAAyC;CACzC,8CAA8C;CAC9C,oDAAoD;CACpD,+CAA+C;CAC/C,qDAAqD;AACvD"}
1
+ {"version":3,"file":"composites.js","names":[],"sources":["../../../src/i18n/en/composites.ts"],"sourcesContent":["import type { de } from '../de/composites'\n\nexport const en: { [K in keyof typeof de]: string } = {\n 'composites.untitled': '(untitled)',\n\n 'composites.kind.section.label': 'Section',\n 'composites.kind.section.title': 'Heading',\n 'composites.kind.section.description': 'Summary',\n 'composites.kind.task.label': 'Task',\n 'composites.kind.task.title': 'Task',\n 'composites.kind.task.description': 'Description',\n 'composites.kind.task.field.status': 'Status',\n 'composites.kind.task.status.open': 'Open',\n 'composites.kind.task.status.doing': 'In progress',\n 'composites.kind.task.status.done': 'Done',\n 'composites.kind.task.field.due': 'Due',\n 'composites.kind.task.field.assignee': 'Assignee',\n 'composites.kind.note.label': 'Note',\n 'composites.kind.note.title': 'Title',\n 'composites.kind.note.description': 'Short description',\n 'composites.kind.document.label': 'Document',\n 'composites.kind.document.title': 'Document name',\n 'composites.kind.document.description': 'Summary',\n 'composites.kind.document.field.filename': 'File name',\n 'composites.kind.document.field.mimeType': 'Type',\n 'composites.kind.document.field.size': 'Size (bytes)',\n 'composites.kind.document.field.importedAt': 'Imported',\n 'composites.kind.document.field.transcript': 'Transcript',\n 'composites.kind.folder.label': 'Folder',\n 'composites.kind.folder.title': 'Folder name',\n 'composites.kind.folder.description': 'Description',\n 'composites.kind.select': 'Kind of building block',\n\n 'composites.status.none': 'No status',\n 'composites.status.label': 'Status: {status}',\n\n 'composites.tab': 'Editing',\n 'composites.slash.section': 'Section',\n 'composites.slash.group': 'Headings to building blocks',\n 'composites.slash.groupAll': 'Headings to building blocks (nested)',\n 'composites.slash.flatten': 'Building blocks to headings',\n 'composites.slash.flattenAll': 'Building blocks to headings (all levels)',\n 'composites.blockAction.export': 'Export as Markdown',\n 'composites.toolbar.toKind': 'Convert to building block',\n 'composites.toolbar.structure': 'Convert structure',\n 'composites.menu.kindHeading': 'Building block',\n 'composites.menu.toComposites': 'Headings to building blocks',\n 'composites.menu.toComposites.top': 'Top level only',\n 'composites.menu.toComposites.top.description': 'Only the highest heading level becomes building blocks',\n 'composites.menu.toComposites.all': 'All levels (nested)',\n 'composites.menu.toComposites.all.description': 'Every heading level becomes a nested building block',\n 'composites.menu.toHeadings': 'Building blocks to headings',\n 'composites.menu.toHeadings.top': 'Top level only',\n 'composites.menu.toHeadings.top.description': 'The top building blocks become headings; inner building blocks stay',\n 'composites.menu.toHeadings.all': 'All levels',\n 'composites.menu.toHeadings.all.description': 'Every building block becomes a heading of its level; description, tags and fields as text',\n 'composites.menu.settings': 'Settings…',\n 'composites.menu.preferred': 'Preferred: {mode}',\n 'composites.convert.kind': '{kind} (building block)',\n\n 'composites.chrome.details': 'Kind and details: {kind}',\n 'composites.chrome.detailsDrag': 'Kind and details: {kind} · Drag to move',\n 'composites.tag.remove': 'Remove tag #{tag}',\n 'composites.tag.add': 'Add tag',\n\n 'composites.tags.label': 'Tags',\n 'composites.tags.placeholder': 'Add tags',\n 'composites.tags.create': 'Create #{tag}',\n\n 'composites.details.confirmLost': 'Really change the kind? Switching to “{kind}” discards this information:',\n 'composites.details.confirm': 'Really change the kind?',\n 'composites.details.cancel': 'Cancel',\n 'composites.details.change': 'Change',\n 'composites.details.summary': 'Summary',\n\n 'composites.summary.placeholder': 'Short summary of the building block',\n 'composites.summary.label': 'Summary',\n 'composites.summary.none': 'No summary',\n 'composites.summary.formatted': 'Contains formatting or mentions and can only be edited in the text.',\n 'composites.field.choose': 'Choose {field}',\n\n 'composites.inspector.label': 'Properties',\n 'composites.inspector.document': 'Document',\n 'composites.inspector.composites': 'Building blocks',\n 'composites.inspector.summarized': '{n} of {total} summarized',\n 'composites.inspector.none': 'None',\n 'composites.inspector.mentions': 'Mentions',\n 'composites.inspector.composite': 'Building block',\n 'composites.inspector.kind': 'Kind',\n 'composites.inspector.title': 'Title',\n 'composites.inspector.titleHelp': 'Edit in the document',\n 'composites.inspector.untitled': 'Untitled',\n 'composites.inspector.description': 'Description',\n 'composites.inspector.descriptionHelp': 'Contains mentions or tags – edit in the document',\n 'composites.inspector.aiStatus': 'AI status',\n 'composites.inspector.summaryPresent': 'Summary present',\n 'composites.inspector.summaryMissing': 'Summary missing',\n\n 'composites.table.label': 'Building blocks as table',\n 'composites.table.emptyTitle': 'This document has no building blocks yet',\n 'composites.table.emptyText': 'Building blocks divide a document into sections, tasks or notes with a title, summary and tags. Insert one in the text with “/” and it appears here with all its details.',\n 'composites.table.column.composite': 'Building block',\n 'composites.table.column.kind': 'Kind',\n 'composites.table.column.tags': 'Tags',\n 'composites.table.column.summary': 'Summary',\n 'composites.table.search.placeholder': 'Title, summary, tags',\n 'composites.table.search.label': 'Search building blocks',\n 'composites.table.search.clear': 'Clear search',\n 'composites.table.filter.all': 'All',\n 'composites.table.filter.reset': 'Reset filters',\n 'composites.table.filter.byKind': 'Filter by kind',\n 'composites.table.filter.byTag': 'Filter by tag',\n 'composites.table.filter.noMatch': 'No building block matches these filters.',\n 'composites.table.count.one': '{n} of {total} building block',\n 'composites.table.count.other': '{n} of {total} building blocks',\n 'composites.table.noValue': 'No value',\n 'composites.table.noTags': 'No tags',\n 'composites.table.summaryPresent': 'Summary present',\n\n 'composites.settings.structure.title': 'Structure',\n 'composites.settings.structure.legend': 'Preferred structure',\n 'composites.settings.structure.flat.label': 'Headings',\n 'composites.settings.structure.flat.description': 'Toolbar with Heading 1–3. AI texts are structured flat with headings (##, ###); building blocks the AI writes anyway become headings.',\n 'composites.settings.structure.composite.label': 'Building blocks',\n 'composites.settings.structure.composite.description': 'Toolbar without Heading 1–3. AI texts are structured as building blocks, subsections as nested building blocks; headings the AI writes anyway become building blocks.',\n 'composites.settings.scope.legend': '“Convert structure” without a selection applies to',\n 'composites.settings.scope.container.label': 'Enclosing building block',\n 'composites.settings.scope.container.description': 'The building block the cursor is in; the whole document outside of building blocks.',\n 'composites.settings.scope.document.label': 'Whole document',\n 'composites.settings.scope.document.description': 'Always all blocks of the document.',\n 'composites.settings.scope.heading.label': 'Heading or building block at the cursor',\n 'composites.settings.scope.heading.description': 'Converting to building blocks: the heading at or before the cursor with its content. Converting to headings: the innermost building block around the cursor.',\n 'composites.settings.sidebar.title': 'Sidebar',\n 'composites.settings.treeRoot.legend': 'Document tree',\n 'composites.settings.treeRoot.folders.label': 'Nest folders and files',\n 'composites.settings.treeRoot.folders.description': 'The sidebar shows the folders with their files; the open file is an entry within them.',\n 'composites.settings.treeRoot.file.label': 'Root is a single file',\n 'composites.settings.treeRoot.file.description': 'While a building block file is open, the sidebar shows it as the root with its folders and documents. Without an open building block file it shows the folders.',\n 'composites.settings.composites.title': 'Building blocks',\n 'composites.settings.defaultKind.label': 'Default building block',\n 'composites.settings.defaultKind.description': 'Kind of the building blocks the toolbar, “/” commands and “Headings to building blocks” create.',\n 'composites.settings.kindIcon.legend': 'Kind icon',\n 'composites.settings.kindIcon.always.label': 'Always show',\n 'composites.settings.kindIcon.always.description': 'The kind icon is permanently shown in front of the building block.',\n 'composites.settings.kindIcon.hover.label': 'Only on hover',\n 'composites.settings.kindIcon.hover.description': 'The icon appears when the mouse is over the building block, it has focus or its details are open.',\n 'composites.settings.dragHandle.legend': 'Drag handle (blocks without icon)',\n 'composites.settings.dragHandle.hover.label': 'Only on hover',\n 'composites.settings.dragHandle.hover.description': 'The drag handle appears on the block under the mouse.',\n 'composites.settings.dragHandle.always.label': 'Always show',\n 'composites.settings.dragHandle.always.description': 'Every block without an icon permanently shows its drag handle.',\n\n 'composites.nesting.title': 'Nesting not possible',\n 'composites.nesting.refused': '{parent} does not accept {child}.',\n 'composites.move.blockGone': 'The block no longer exists.',\n 'composites.move.targetGone': 'The target no longer exists.',\n 'composites.move.targetNotBlock': 'The target is not a building block.',\n 'composites.move.intoSelf': 'A block cannot be moved into itself.',\n 'composites.move.intoOwn': 'A block cannot be moved into a building block it contains itself.',\n}\n"],"mappings":";AAEA,MAAa,KAAyC;CACpD,uBAAuB;CAEvB,iCAAiC;CACjC,iCAAiC;CACjC,uCAAuC;CACvC,8BAA8B;CAC9B,8BAA8B;CAC9B,oCAAoC;CACpC,qCAAqC;CACrC,oCAAoC;CACpC,qCAAqC;CACrC,oCAAoC;CACpC,kCAAkC;CAClC,uCAAuC;CACvC,8BAA8B;CAC9B,8BAA8B;CAC9B,oCAAoC;CACpC,kCAAkC;CAClC,kCAAkC;CAClC,wCAAwC;CACxC,2CAA2C;CAC3C,2CAA2C;CAC3C,uCAAuC;CACvC,6CAA6C;CAC7C,6CAA6C;CAC7C,gCAAgC;CAChC,gCAAgC;CAChC,sCAAsC;CACtC,0BAA0B;CAE1B,0BAA0B;CAC1B,2BAA2B;CAE3B,kBAAkB;CAClB,4BAA4B;CAC5B,0BAA0B;CAC1B,6BAA6B;CAC7B,4BAA4B;CAC5B,+BAA+B;CAC/B,iCAAiC;CACjC,6BAA6B;CAC7B,gCAAgC;CAChC,+BAA+B;CAC/B,gCAAgC;CAChC,oCAAoC;CACpC,gDAAgD;CAChD,oCAAoC;CACpC,gDAAgD;CAChD,8BAA8B;CAC9B,kCAAkC;CAClC,8CAA8C;CAC9C,kCAAkC;CAClC,8CAA8C;CAC9C,4BAA4B;CAC5B,6BAA6B;CAC7B,2BAA2B;CAE3B,6BAA6B;CAC7B,iCAAiC;CACjC,yBAAyB;CACzB,sBAAsB;CAEtB,yBAAyB;CACzB,+BAA+B;CAC/B,0BAA0B;CAE1B,kCAAkC;CAClC,8BAA8B;CAC9B,6BAA6B;CAC7B,6BAA6B;CAC7B,8BAA8B;CAE9B,kCAAkC;CAClC,4BAA4B;CAC5B,2BAA2B;CAC3B,gCAAgC;CAChC,2BAA2B;CAE3B,8BAA8B;CAC9B,iCAAiC;CACjC,mCAAmC;CACnC,mCAAmC;CACnC,6BAA6B;CAC7B,iCAAiC;CACjC,kCAAkC;CAClC,6BAA6B;CAC7B,8BAA8B;CAC9B,kCAAkC;CAClC,iCAAiC;CACjC,oCAAoC;CACpC,wCAAwC;CACxC,iCAAiC;CACjC,uCAAuC;CACvC,uCAAuC;CAEvC,0BAA0B;CAC1B,+BAA+B;CAC/B,8BAA8B;CAC9B,qCAAqC;CACrC,gCAAgC;CAChC,gCAAgC;CAChC,mCAAmC;CACnC,uCAAuC;CACvC,iCAAiC;CACjC,iCAAiC;CACjC,+BAA+B;CAC/B,iCAAiC;CACjC,kCAAkC;CAClC,iCAAiC;CACjC,mCAAmC;CACnC,8BAA8B;CAC9B,gCAAgC;CAChC,4BAA4B;CAC5B,2BAA2B;CAC3B,mCAAmC;CAEnC,uCAAuC;CACvC,wCAAwC;CACxC,4CAA4C;CAC5C,kDAAkD;CAClD,iDAAiD;CACjD,uDAAuD;CACvD,oCAAoC;CACpC,6CAA6C;CAC7C,mDAAmD;CACnD,4CAA4C;CAC5C,kDAAkD;CAClD,2CAA2C;CAC3C,iDAAiD;CACjD,qCAAqC;CACrC,uCAAuC;CACvC,8CAA8C;CAC9C,oDAAoD;CACpD,2CAA2C;CAC3C,iDAAiD;CACjD,wCAAwC;CACxC,yCAAyC;CACzC,+CAA+C;CAC/C,uCAAuC;CACvC,6CAA6C;CAC7C,mDAAmD;CACnD,4CAA4C;CAC5C,kDAAkD;CAClD,yCAAyC;CACzC,8CAA8C;CAC9C,oDAAoD;CACpD,+CAA+C;CAC/C,qDAAqD;CAErD,4BAA4B;CAC5B,8BAA8B;CAC9B,6BAA6B;CAC7B,8BAA8B;CAC9B,kCAAkC;CAClC,4BAA4B;CAC5B,2BAA2B;AAC7B"}
@@ -23,7 +23,20 @@ const en = {
23
23
  "tree.folder.placeholderIn": "New folder in {parent}",
24
24
  "tree.folder.renameFailed": "Folder not renamed",
25
25
  "tree.removed": "Document deleted",
26
- "tree.undo": "Undo"
26
+ "tree.undo": "Undo",
27
+ "tree.filterText.placeholder": "Filter by title",
28
+ "tree.filterText.clear": "Clear title filter",
29
+ "tree.noMatches": "No matches",
30
+ "tree.drop.nothing": "Nothing is being dragged.",
31
+ "tree.drop.noDocumentMove": "Documents and folders cannot be moved inside the open document.",
32
+ "tree.drop.foldersOnly": "Only folders accept entries.",
33
+ "tree.drop.documentInFolder": "The document is already in this folder.",
34
+ "tree.drop.folderIntoSelf": "A folder cannot be moved into itself or one of its subfolders.",
35
+ "tree.drop.folderInFolder": "The folder is already in this folder.",
36
+ "tree.drop.blocksOnlyInDocument": "Building blocks can only be moved within the open document.",
37
+ "tree.drop.noBlocksHere": "Building blocks cannot be dropped here.",
38
+ "tree.drop.blockWithoutId": "This building block has no ID yet and cannot be addressed as a target.",
39
+ "tree.drop.editorClosed": "The editor is no longer open."
27
40
  };
28
41
  //#endregion
29
42
  export { en };
@@ -1 +1 @@
1
- {"version":3,"file":"tree.js","names":[],"sources":["../../../src/i18n/en/tree.ts"],"sourcesContent":["import type { de } from '../de/tree'\n\nexport const en: { [K in keyof typeof de]: string } = {\n 'tree.aria': 'Documents',\n 'tree.loading': 'Loading…',\n 'tree.loadFailed': 'Documents could not be loaded',\n 'tree.empty': 'No documents yet',\n 'tree.rootFallback': 'Document',\n 'tree.untitled': '(untitled)',\n 'tree.summary': 'Has a summary',\n 'tree.filter.show': 'Show',\n 'tree.filter.title': 'Filter view',\n 'tree.filter.reset': 'Reset filter',\n 'tree.add': 'Add',\n 'tree.delete': 'Delete',\n 'tree.menu.newDocument': 'New document',\n 'tree.menu.newFolder': 'New folder',\n 'tree.menu.newSubfolder': 'New subfolder',\n 'tree.menu.newCompositeFolder': 'New folder block',\n 'tree.menu.importFile': 'Import file…',\n 'tree.menu.rename': 'Rename',\n 'tree.folder.name': 'Folder name',\n 'tree.folder.placeholder': 'New folder',\n 'tree.folder.placeholderIn': 'New folder in {parent}',\n 'tree.folder.renameFailed': 'Folder not renamed',\n 'tree.removed': 'Document deleted',\n 'tree.undo': 'Undo',\n}\n"],"mappings":";AAEA,MAAa,KAAyC;CACpD,aAAa;CACb,gBAAgB;CAChB,mBAAmB;CACnB,cAAc;CACd,qBAAqB;CACrB,iBAAiB;CACjB,gBAAgB;CAChB,oBAAoB;CACpB,qBAAqB;CACrB,qBAAqB;CACrB,YAAY;CACZ,eAAe;CACf,yBAAyB;CACzB,uBAAuB;CACvB,0BAA0B;CAC1B,gCAAgC;CAChC,wBAAwB;CACxB,oBAAoB;CACpB,oBAAoB;CACpB,2BAA2B;CAC3B,6BAA6B;CAC7B,4BAA4B;CAC5B,gBAAgB;CAChB,aAAa;AACf"}
1
+ {"version":3,"file":"tree.js","names":[],"sources":["../../../src/i18n/en/tree.ts"],"sourcesContent":["import type { de } from '../de/tree'\n\nexport const en: { [K in keyof typeof de]: string } = {\n 'tree.aria': 'Documents',\n 'tree.loading': 'Loading…',\n 'tree.loadFailed': 'Documents could not be loaded',\n 'tree.empty': 'No documents yet',\n 'tree.rootFallback': 'Document',\n 'tree.untitled': '(untitled)',\n 'tree.summary': 'Has a summary',\n 'tree.filter.show': 'Show',\n 'tree.filter.title': 'Filter view',\n 'tree.filter.reset': 'Reset filter',\n 'tree.add': 'Add',\n 'tree.delete': 'Delete',\n 'tree.menu.newDocument': 'New document',\n 'tree.menu.newFolder': 'New folder',\n 'tree.menu.newSubfolder': 'New subfolder',\n 'tree.menu.newCompositeFolder': 'New folder block',\n 'tree.menu.importFile': 'Import file…',\n 'tree.menu.rename': 'Rename',\n 'tree.folder.name': 'Folder name',\n 'tree.folder.placeholder': 'New folder',\n 'tree.folder.placeholderIn': 'New folder in {parent}',\n 'tree.folder.renameFailed': 'Folder not renamed',\n 'tree.removed': 'Document deleted',\n 'tree.undo': 'Undo',\n 'tree.filterText.placeholder': 'Filter by title',\n 'tree.filterText.clear': 'Clear title filter',\n 'tree.noMatches': 'No matches',\n\n 'tree.drop.nothing': 'Nothing is being dragged.',\n 'tree.drop.noDocumentMove': 'Documents and folders cannot be moved inside the open document.',\n 'tree.drop.foldersOnly': 'Only folders accept entries.',\n 'tree.drop.documentInFolder': 'The document is already in this folder.',\n 'tree.drop.folderIntoSelf': 'A folder cannot be moved into itself or one of its subfolders.',\n 'tree.drop.folderInFolder': 'The folder is already in this folder.',\n 'tree.drop.blocksOnlyInDocument': 'Building blocks can only be moved within the open document.',\n 'tree.drop.noBlocksHere': 'Building blocks cannot be dropped here.',\n 'tree.drop.blockWithoutId': 'This building block has no ID yet and cannot be addressed as a target.',\n 'tree.drop.editorClosed': 'The editor is no longer open.',\n}\n"],"mappings":";AAEA,MAAa,KAAyC;CACpD,aAAa;CACb,gBAAgB;CAChB,mBAAmB;CACnB,cAAc;CACd,qBAAqB;CACrB,iBAAiB;CACjB,gBAAgB;CAChB,oBAAoB;CACpB,qBAAqB;CACrB,qBAAqB;CACrB,YAAY;CACZ,eAAe;CACf,yBAAyB;CACzB,uBAAuB;CACvB,0BAA0B;CAC1B,gCAAgC;CAChC,wBAAwB;CACxB,oBAAoB;CACpB,oBAAoB;CACpB,2BAA2B;CAC3B,6BAA6B;CAC7B,4BAA4B;CAC5B,gBAAgB;CAChB,aAAa;CACb,+BAA+B;CAC/B,yBAAyB;CACzB,kBAAkB;CAElB,qBAAqB;CACrB,4BAA4B;CAC5B,yBAAyB;CACzB,8BAA8B;CAC9B,4BAA4B;CAC5B,4BAA4B;CAC5B,kCAAkC;CAClC,0BAA0B;CAC1B,4BAA4B;CAC5B,0BAA0B;AAC5B"}
@@ -1,12 +1,12 @@
1
1
  import { aiBlockDataOf, aiContextOf } from "../../core/pipeline.js";
2
2
  import { captureRange, releaseRanges, resolveRange } from "../../core/doc-anchors.js";
3
+ import "../../features/composites/nodes.js";
4
+ import { compositeAiBrief } from "../../features/composites/ai-brief.js";
3
5
  import { AI_LIMITS } from "../../features/ai/protocol/tasks.js";
4
6
  import { aiApplyFailure, documentMarkdown } from "../../features/ai/ai-apply.js";
5
7
  import { startAiReview } from "../../features/ai/ai-review.js";
6
8
  import { notifyAiRateLimited } from "../../features/ai/rate-limit.js";
7
9
  import { postAiSse } from "../../features/ai/ai-sse.js";
8
- import "../../features/composites/nodes.js";
9
- import { compositeAiBrief } from "../../features/composites/ai-brief.js";
10
10
  //#region src/integrations/composite-ai/composite-fill.ts
11
11
  /** Entries of `aiBlockData` that travel with a request (the server accepts at most as many). */
12
12
  const MAX_BLOCK_DATA = 10;
@@ -1,10 +1,10 @@
1
1
  import { parseBlocks } from "../../core/pipeline.js";
2
2
  import { captureRange, releaseRanges, resolveRange } from "../../core/doc-anchors.js";
3
+ import "../../features/composites/nodes.js";
4
+ import { assetRefOf } from "../../features/media/assets.js";
3
5
  import { AI_LIMITS } from "../../features/ai/protocol/tasks.js";
4
6
  import { notifyAiRateLimited } from "../../features/ai/rate-limit.js";
5
7
  import { postAiSse } from "../../features/ai/ai-sse.js";
6
- import "../../features/composites/nodes.js";
7
- import { assetRefOf } from "../../features/media/assets.js";
8
8
  import { Fragment } from "@tiptap/pm/model";
9
9
  //#region src/integrations/composite-ai/composite-summary.ts
10
10
  /** Index of a composite's first body block, after `compositeTitle`, `compositeDescription` and `compositeTags`. */
@@ -1,9 +1,9 @@
1
1
  import { ABILITY } from "../../core/schema/abilities.js";
2
- import { withHeading } from "../../features/ai/protocol/tasks.js";
3
- import { modelProfiles } from "../../features/ai/model-profiles.js";
4
2
  import { compositeKind } from "../../features/composites/kinds.js";
5
3
  import { compositeFence } from "../../features/composites/fences.js";
6
4
  import { compositeKindsOf } from "../../features/composites/nodes.js";
5
+ import { withHeading } from "../../features/ai/protocol/tasks.js";
6
+ import { modelProfiles } from "../../features/ai/model-profiles.js";
7
7
  import { structureOf } from "../../features/composites/structure.js";
8
8
  import { fillComposite } from "./composite-fill.js";
9
9
  import { COMPOSITE_BODY_START, compositeSourceText, mediaAssetOf, summarizeComposite } from "./composite-summary.js";
@@ -2,9 +2,9 @@ import { blockIdOf, findBlockById } from "../../core/schema/block-ids.js";
2
2
  import { createStore } from "../../core/store.js";
3
3
  import { captureRange, releaseRanges } from "../../core/doc-anchors.js";
4
4
  import { fetchErrorMessage } from "../../core/fetch-error.js";
5
+ import { TRANSCRIPT_CLEANUP_LIMITS } from "./protocol.js";
5
6
  import { startAiReview } from "../../features/ai/ai-review.js";
6
7
  import { isRateLimited, notifyAiRateLimited } from "../../features/ai/rate-limit.js";
7
- import { TRANSCRIPT_CLEANUP_LIMITS } from "./protocol.js";
8
8
  //#region src/integrations/transcript-ai/transcript-cleanup.ts
9
9
  const SEGMENT = "transcriptSegment";
10
10
  /** Calls `visit` for every speaker segment overlapping `scope`; `visit` returns true to stop. */
@@ -1,5 +1,5 @@
1
- import { EditorSurfaceHandle, EditorSurfaceProps } from "../react/EditorSurface.js";
2
1
  import { MarkdownDiagnostic, MarkdownPolicy } from "./policy.js";
2
+ import { EditorSurfaceHandle, EditorSurfaceProps } from "../react/EditorSurface.js";
3
3
  import { Editor } from "@tiptap/core";
4
4
  //#region src/markdown/MarkdownSurface.d.ts
5
5
  export interface MarkdownSurfaceProps extends Omit<EditorSurfaceProps, 'value' | 'onChange' | 'onReady'> {
@@ -1,8 +1,8 @@
1
- import { useEditorI18n } from "../react/use-editor-i18n.js";
2
- import { EditorSurface } from "../react/EditorSurface.js";
3
1
  import { contentToMarkdown, markdownToContent } from "./document.js";
4
2
  import { MarkdownClipboard } from "./clipboard.js";
5
3
  import { joinFrontmatter, splitFrontmatter } from "./frontmatter.js";
4
+ import { useEditorI18n } from "../react/use-editor-i18n.js";
5
+ import { EditorSurface } from "../react/EditorSurface.js";
6
6
  import { forwardRef, useEffect, useMemo, useRef, useState } from "react";
7
7
  import { jsx } from "react/jsx-runtime";
8
8
  //#region src/markdown/MarkdownSurface.tsx
@@ -40,29 +40,29 @@ declare const __VLS_base: import("vue").DefineComponent<__VLS_PublicProps, {
40
40
  settingsOpen: import("vue").WritableComputedRef<boolean, boolean>;
41
41
  settingsTab: import("vue").WritableComputedRef<string | undefined, string | undefined>;
42
42
  }, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
43
+ settingsOpen: (tab?: string | undefined) => any;
43
44
  "update:sidebarOpen": (value: boolean) => any;
44
45
  "update:commentsOpen": (value: boolean) => any;
45
- ready: (editor: Editor) => any;
46
46
  "update:modelValue": (markdown: string) => any;
47
+ frontmatter: (frontmatter: string | null) => any;
48
+ ready: (editor: Editor) => any;
47
49
  metadataCreate: (list: string, item: MetadataItem) => any;
48
50
  contentError: (error: Error) => any;
49
- settingsOpen: (tab?: string | undefined) => any;
50
- frontmatter: (frontmatter: string | null) => any;
51
51
  diagnostics: (diagnostics: MarkdownDiagnostic[]) => any;
52
52
  }, string, import("vue").PublicProps, Readonly<__VLS_PublicProps> & Readonly<{
53
+ onSettingsOpen?: ((tab?: string | undefined) => any) | undefined;
53
54
  "onUpdate:sidebarOpen"?: ((value: boolean) => any) | undefined;
54
55
  "onUpdate:commentsOpen"?: ((value: boolean) => any) | undefined;
55
- onReady?: ((editor: Editor) => any) | undefined;
56
56
  "onUpdate:modelValue"?: ((markdown: string) => any) | undefined;
57
+ onFrontmatter?: ((frontmatter: string | null) => any) | undefined;
58
+ onReady?: ((editor: Editor) => any) | undefined;
57
59
  onMetadataCreate?: ((list: string, item: MetadataItem) => any) | undefined;
58
60
  onContentError?: ((error: Error) => any) | undefined;
59
- onSettingsOpen?: ((tab?: string | undefined) => any) | undefined;
60
- onFrontmatter?: ((frontmatter: string | null) => any) | undefined;
61
61
  onDiagnostics?: ((diagnostics: MarkdownDiagnostic[]) => any) | undefined;
62
62
  }>, {
63
- modelValue: string;
64
63
  editable: boolean;
65
64
  settingsUi: "internal" | "external";
65
+ modelValue: string;
66
66
  }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
67
67
  declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
68
68
  declare const _default: typeof __VLS_export;
@@ -1,6 +1,6 @@
1
1
  import { MarkdownDiagnostic, MarkdownDiagnosticCode, MarkdownPolicy, hasFatalDiagnostics } from "./policy.js";
2
- import { MarkdownContent, contentToMarkdown, markdownToContent } from "./document.js";
3
- import { SourceMode, SourceModeOptions, SourceModeState, createSourceMode } from "./source-mode.js";
4
2
  import { MarkdownClipboard, MarkdownClipboardOptions } from "./clipboard.js";
3
+ import { MarkdownContent, contentToMarkdown, markdownToContent } from "./document.js";
5
4
  import { SplitMarkdown, joinFrontmatter, splitFrontmatter } from "./frontmatter.js";
5
+ import { SourceMode, SourceModeOptions, SourceModeState, createSourceMode } from "./source-mode.js";
6
6
  export { MarkdownClipboard, type MarkdownClipboardOptions, type MarkdownContent, type MarkdownDiagnostic, type MarkdownDiagnosticCode, type MarkdownPolicy, type SourceMode, type SourceModeOptions, type SourceModeState, type SplitMarkdown, contentToMarkdown, createSourceMode, hasFatalDiagnostics, joinFrontmatter, markdownToContent, splitFrontmatter };
@@ -3,12 +3,6 @@ import { ModelSlot } from "../settings/values.js";
3
3
  import "../settings/index.js";
4
4
  //#region src/nuxt/module.d.ts
5
5
  export interface ModuleOptions {
6
- /**
7
- * The UI kit that renders the editor chrome. `'nuxt-ui'` (default): Nuxt UI, which must be registered before this
8
- * module (its generated `ui.css` is patched so Tailwind scans the package). `'primevue'`: PrimeVue; the host installs
9
- * PrimeVue (`app.use(PrimeVue, …)`, `ToastService`), mounts `<Toast />` and lets Tailwind scan the package.
10
- */
11
- kit: 'nuxt-ui' | 'primevue';
12
6
  /** Language of the editor's strings: `'de'` (default) or `'en'`. Set once per app; a host that switches languages at run time recreates the editor context. */
13
7
  locale: Locale;
14
8
  /** Overrides of single messages by key (see `MessageKey`), applied on top of the catalog of `locale`; must be JSON-serialisable. */
@@ -12,7 +12,6 @@ var module_default = defineNuxtModule({
12
12
  configKey: "tiptapEditor"
13
13
  },
14
14
  defaults: {
15
- kit: "nuxt-ui",
16
15
  locale: "de",
17
16
  collab: { authenticateUpgrade: false },
18
17
  ai: {
@@ -43,14 +42,14 @@ var module_default = defineNuxtModule({
43
42
  const { resolve } = createResolver(import.meta.url);
44
43
  const packageSrc = resolve("..");
45
44
  nuxt.options.build.transpile.push(packageSrc);
46
- nuxt.options.css.push(resolve(options.kit === "primevue" ? "../vue/kit/primevue.css" : "../vue/kit/nuxt-ui.css"));
45
+ nuxt.options.css.push(resolve("../vue/kit/nuxt-ui.css"));
47
46
  nuxt.options.css.push(resolve("../styles/core.css"), resolve("../styles/media.css"), resolve("../styles/mentions.css"), resolve("../styles/authors.css"), resolve("../styles/comments.css"), resolve("../styles/transcript.css"), resolve("../styles/composites.css"), resolve("../styles/ai.css"), resolve("../styles/collab.css"), resolve("../styles/block-ui.css"), resolve("../styles/themes.css"));
48
47
  addPlugin({
49
- src: resolve(`./runtime/plugins/editor-context-${options.kit}.client.ts`),
48
+ src: resolve("./runtime/plugins/editor-context-nuxt-ui.client.ts"),
50
49
  mode: "client"
51
50
  });
52
51
  addServerScanDir(resolve("./runtime/server"));
53
- if (options.kit === "nuxt-ui") nuxt.hook("modules:done", () => {
52
+ nuxt.hook("modules:done", () => {
54
53
  const uiCss = nuxt.options.build.templates.find((t) => t.filename === "ui.css");
55
54
  if (!uiCss?.getContents) throw new Error("tiptap-editor: @nuxt/ui muss vor diesem Modul registriert sein (ui.css-Template fehlt)");
56
55
  const getContents = uiCss.getContents;
@@ -86,7 +85,6 @@ var module_default = defineNuxtModule({
86
85
  ...nuxt.options.runtimeConfig.tiptapEditor
87
86
  };
88
87
  nuxt.options.runtimeConfig.public.tiptapEditor = {
89
- kit: options.kit,
90
88
  locale: options.locale,
91
89
  ...options.messages && { messages: options.messages },
92
90
  ai: {
@@ -1 +1 @@
1
- {"version":3,"file":"module.js","names":[],"sources":["../../src/nuxt/module.ts"],"sourcesContent":["import { addPlugin, addServerScanDir, createResolver, defineNuxtModule } from 'nuxt/kit'\nimport type { Locale, Messages } from '../i18n'\nimport type { ModelSlot } from '../settings'\n\nexport interface ModuleOptions {\n /**\n * The UI kit that renders the editor chrome. `'nuxt-ui'` (default): Nuxt UI, which must be registered before this\n * module (its generated `ui.css` is patched so Tailwind scans the package). `'primevue'`: PrimeVue; the host installs\n * PrimeVue (`app.use(PrimeVue, …)`, `ToastService`), mounts `<Toast />` and lets Tailwind scan the package.\n */\n kit: 'nuxt-ui' | 'primevue'\n /** Language of the editor's strings: `'de'` (default) or `'en'`. Set once per app; a host that switches languages at run time recreates the editor context. */\n locale: Locale\n /** Overrides of single messages by key (see `MessageKey`), applied on top of the catalog of `locale`; must be JSON-serialisable. */\n messages?: Partial<Messages>\n ai: {\n /**\n * Server-defined model presets (any OpenAI-compatible chat completions endpoint), keyed by preset id. The key is\n * per preset or the shared `apiKey`, both from env only: `NUXT_TIPTAP_EDITOR_AI_PRESETS_<ID>_API_KEY` (`<ID>` = the\n * preset id in upper snake case, e.g. `flashLite` → `FLASH_LITE`) or `NUXT_TIPTAP_EDITOR_AI_API_KEY`. Preset ids\n * must be camelCase so the env names map onto them.\n */\n presets: Record<string, { label: string, endpoint: string, model: string, apiKey?: string }>\n /** Default preset per slot; users may override in settings. The `complete` model must support assistant prefill. */\n slots: Record<ModelSlot, string>\n /** Per-user limit shared by all AI endpoints: at most `max` requests per sliding `windowMs`. */\n rateLimit: { max: number, windowMs: number }\n /**\n * Speech-to-text for audio/video `document` composites: any OpenAI-compatible `<endpoint>/audio/transcriptions`\n * (e.g. OpenAI `whisper-1`; OpenRouter presets do not provide one). Absent = the action and the endpoint are off.\n * The key comes from env only: `NUXT_TIPTAP_EDITOR_AI_TRANSCRIPTION_API_KEY`.\n */\n transcription?: { endpoint: string, model: string, apiKey?: string }\n }\n collab: {\n /**\n * Authenticate the `/collab/:id` websocket upgrade itself (`EditorAdapter.authenticate` with the upgrade request's\n * headers) and refuse it with HTTP 401 for an unknown user. Default `false`: the upgrade always succeeds, the user\n * is authenticated afterwards from the headers or the provider's `token`, and an unauthenticated socket is closed\n * with code 4401. Enable only when every client authenticates by cookie/headers: a client that sends its identity\n * as `collaboration.token` (no cookies) cannot connect then. Env override:\n * `NUXT_TIPTAP_EDITOR_COLLAB_AUTHENTICATE_UPGRADE=true`.\n */\n authenticateUpgrade: boolean\n }\n}\n\n/**\n * Nuxt/Nitro integration of the editor package: the client context plugin (settings persistence, AI configuration),\n * the Nitro API routes, the collaboration websocket and the AI configuration with its server-only secrets. The host\n * plugs in through `setEditorAdapter()` (`@ecsplico/editor/server`) in a Nitro plugin (auth, loading and storing\n * document content). Components are imported explicitly from the package entries; nothing is auto-registered.\n */\nexport default defineNuxtModule<ModuleOptions>({\n meta: { name: 'tiptap-editor', configKey: 'tiptapEditor' },\n defaults: {\n kit: 'nuxt-ui',\n locale: 'de',\n collab: { authenticateUpgrade: false },\n ai: {\n presets: {\n sonnet: { label: 'Claude Sonnet 4.5 (OpenRouter)', endpoint: 'https://openrouter.ai/api/v1', model: 'anthropic/claude-sonnet-4.5' },\n flashLite: { label: 'Gemini 2.5 Flash Lite (OpenRouter)', endpoint: 'https://openrouter.ai/api/v1', model: 'google/gemini-2.5-flash-lite' },\n },\n slots: { complete: 'flashLite', rewrite: 'sonnet', generate: 'sonnet' },\n rateLimit: { max: 30, windowMs: 60_000 },\n },\n },\n setup(options, nuxt) {\n const { resolve } = createResolver(import.meta.url)\n // `resolve('..')` is the package root of the built output (`dist`) or of `src` in this repository's app: both\n // hold the stylesheets and the unbundled `nuxt/runtime` files, which Nuxt compiles for the client and Nitro for the server.\n const packageSrc = resolve('..')\n nuxt.options.build.transpile.push(packageSrc)\n // The kit's token map comes first: the feature sheets (and an Obsidian theme, `themes.css`, last) read and may override `--sk-*`.\n nuxt.options.css.push(resolve(options.kit === 'primevue' ? '../vue/kit/primevue.css' : '../vue/kit/nuxt-ui.css'))\n nuxt.options.css.push(\n resolve('../styles/core.css'),\n resolve('../styles/media.css'),\n resolve('../styles/mentions.css'),\n resolve('../styles/authors.css'),\n resolve('../styles/comments.css'),\n resolve('../styles/transcript.css'),\n resolve('../styles/composites.css'),\n resolve('../styles/ai.css'),\n resolve('../styles/collab.css'),\n resolve('../styles/block-ui.css'),\n resolve('../styles/themes.css'),\n )\n // One plugin file per kit: a dynamic `import()` of the other kit would still be bundled and needs its (optional) UI library.\n addPlugin({ src: resolve(`./runtime/plugins/editor-context-${options.kit}.client.ts`), mode: 'client' })\n addServerScanDir(resolve('./runtime/server'))\n // Tailwind only scans the app layers listed in Nuxt UI's generated `ui.css` (`@source \"<layer>/app/**/*\"`), so the\n // utility classes used by the package's components would never be generated. Append its source.\n if (options.kit === 'nuxt-ui') nuxt.hook('modules:done', () => {\n const uiCss = nuxt.options.build.templates.find(t => t.filename === 'ui.css')\n if (!uiCss?.getContents) throw new Error('tiptap-editor: @nuxt/ui muss vor diesem Modul registriert sein (ui.css-Template fehlt)')\n const getContents = uiCss.getContents\n uiCss.getContents = async data => `@source \"${packageSrc}/**/*\";\\n${await getContents(data)}`\n })\n nuxt.options.nitro.experimental = { ...nuxt.options.nitro.experimental, websocket: true }\n // Nitro bundles the package (the runtime files import `h3` and `nitropack/runtime`, which the host's Nitro resolves): never leave it external.\n nuxt.options.nitro.externals = { ...nuxt.options.nitro.externals, inline: [...(nuxt.options.nitro.externals?.inline ?? []), '@ecsplico/editor', packageSrc] }\n nuxt.options.runtimeConfig.tiptapEditor = {\n collab: { authenticateUpgrade: options.collab.authenticateUpgrade },\n ai: {\n apiKey: '',\n // Every preset gets an empty `apiKey`, so its env variable has a key to override.\n presets: Object.fromEntries(Object.entries(options.ai.presets).map(([id, preset]) => [id, { ...preset, apiKey: preset.apiKey ?? '' }])),\n slots: options.ai.slots,\n rateLimit: options.ai.rateLimit,\n // `apiKey` defaults to '' so its env variable has a key to override.\n ...(options.ai.transcription && { transcription: { ...options.ai.transcription, apiKey: options.ai.transcription.apiKey ?? '' } }),\n },\n ...(nuxt.options.runtimeConfig.tiptapEditor as object | undefined),\n }\n // Default slot presets for the client before `GET /api/ai/models` has answered; read by the client context plugin.\n nuxt.options.runtimeConfig.public.tiptapEditor = {\n kit: options.kit,\n locale: options.locale,\n ...(options.messages && { messages: options.messages }),\n ai: { slots: options.ai.slots, transcription: Boolean(options.ai.transcription) },\n ...(nuxt.options.runtimeConfig.public.tiptapEditor as object | undefined),\n }\n },\n})\n"],"mappings":";;;;;;;;AAqDA,IAAA,iBAAe,iBAAgC;CAC7C,MAAM;EAAE,MAAM;EAAiB,WAAW;CAAe;CACzD,UAAU;EACR,KAAK;EACL,QAAQ;EACR,QAAQ,EAAE,qBAAqB,MAAM;EACrC,IAAI;GACF,SAAS;IACP,QAAQ;KAAE,OAAO;KAAkC,UAAU;KAAgC,OAAO;IAA8B;IAClI,WAAW;KAAE,OAAO;KAAsC,UAAU;KAAgC,OAAO;IAA+B;GAC5I;GACA,OAAO;IAAE,UAAU;IAAa,SAAS;IAAU,UAAU;GAAS;GACtE,WAAW;IAAE,KAAK;IAAI,UAAU;GAAO;EACzC;CACF;CACA,MAAM,SAAS,MAAM;EACnB,MAAM,EAAE,YAAY,eAAe,YAAY,GAAG;EAGlD,MAAM,aAAa,QAAQ,IAAI;EAC/B,KAAK,QAAQ,MAAM,UAAU,KAAK,UAAU;EAE5C,KAAK,QAAQ,IAAI,KAAK,QAAQ,QAAQ,QAAQ,aAAa,4BAA4B,wBAAwB,CAAC;EAChH,KAAK,QAAQ,IAAI,KACf,QAAQ,oBAAoB,GAC5B,QAAQ,qBAAqB,GAC7B,QAAQ,wBAAwB,GAChC,QAAQ,uBAAuB,GAC/B,QAAQ,wBAAwB,GAChC,QAAQ,0BAA0B,GAClC,QAAQ,0BAA0B,GAClC,QAAQ,kBAAkB,GAC1B,QAAQ,sBAAsB,GAC9B,QAAQ,wBAAwB,GAChC,QAAQ,sBAAsB,CAChC;EAEA,UAAU;GAAE,KAAK,QAAQ,oCAAoC,QAAQ,IAAI,WAAW;GAAG,MAAM;EAAS,CAAC;EACvG,iBAAiB,QAAQ,kBAAkB,CAAC;EAG5C,IAAI,QAAQ,QAAQ,WAAW,KAAK,KAAK,sBAAsB;GAC7D,MAAM,QAAQ,KAAK,QAAQ,MAAM,UAAU,MAAK,MAAK,EAAE,aAAa,QAAQ;GAC5E,IAAI,CAAC,OAAO,aAAa,MAAM,IAAI,MAAM,wFAAwF;GACjI,MAAM,cAAc,MAAM;GAC1B,MAAM,cAAc,OAAM,SAAQ,YAAY,WAAW,WAAW,MAAM,YAAY,IAAI;EAC5F,CAAC;EACD,KAAK,QAAQ,MAAM,eAAe;GAAE,GAAG,KAAK,QAAQ,MAAM;GAAc,WAAW;EAAK;EAExF,KAAK,QAAQ,MAAM,YAAY;GAAE,GAAG,KAAK,QAAQ,MAAM;GAAW,QAAQ;IAAC,GAAI,KAAK,QAAQ,MAAM,WAAW,UAAU,CAAC;IAAI;IAAoB;GAAU;EAAE;EAC5J,KAAK,QAAQ,cAAc,eAAe;GACxC,QAAQ,EAAE,qBAAqB,QAAQ,OAAO,oBAAoB;GAClE,IAAI;IACF,QAAQ;IAER,SAAS,OAAO,YAAY,OAAO,QAAQ,QAAQ,GAAG,OAAO,CAAC,CAAC,KAAK,CAAC,IAAI,YAAY,CAAC,IAAI;KAAE,GAAG;KAAQ,QAAQ,OAAO,UAAU;IAAG,CAAC,CAAC,CAAC;IACtI,OAAO,QAAQ,GAAG;IAClB,WAAW,QAAQ,GAAG;IAEtB,GAAI,QAAQ,GAAG,iBAAiB,EAAE,eAAe;KAAE,GAAG,QAAQ,GAAG;KAAe,QAAQ,QAAQ,GAAG,cAAc,UAAU;IAAG,EAAE;GAClI;GACA,GAAI,KAAK,QAAQ,cAAc;EACjC;EAEA,KAAK,QAAQ,cAAc,OAAO,eAAe;GAC/C,KAAK,QAAQ;GACb,QAAQ,QAAQ;GAChB,GAAI,QAAQ,YAAY,EAAE,UAAU,QAAQ,SAAS;GACrD,IAAI;IAAE,OAAO,QAAQ,GAAG;IAAO,eAAe,QAAQ,QAAQ,GAAG,aAAa;GAAE;GAChF,GAAI,KAAK,QAAQ,cAAc,OAAO;EACxC;CACF;AACF,CAAC"}
1
+ {"version":3,"file":"module.js","names":[],"sources":["../../src/nuxt/module.ts"],"sourcesContent":["import { addPlugin, addServerScanDir, createResolver, defineNuxtModule } from 'nuxt/kit'\nimport type { Locale, Messages } from '../i18n'\nimport type { ModelSlot } from '../settings'\n\nexport interface ModuleOptions {\n /** Language of the editor's strings: `'de'` (default) or `'en'`. Set once per app; a host that switches languages at run time recreates the editor context. */\n locale: Locale\n /** Overrides of single messages by key (see `MessageKey`), applied on top of the catalog of `locale`; must be JSON-serialisable. */\n messages?: Partial<Messages>\n ai: {\n /**\n * Server-defined model presets (any OpenAI-compatible chat completions endpoint), keyed by preset id. The key is\n * per preset or the shared `apiKey`, both from env only: `NUXT_TIPTAP_EDITOR_AI_PRESETS_<ID>_API_KEY` (`<ID>` = the\n * preset id in upper snake case, e.g. `flashLite` → `FLASH_LITE`) or `NUXT_TIPTAP_EDITOR_AI_API_KEY`. Preset ids\n * must be camelCase so the env names map onto them.\n */\n presets: Record<string, { label: string, endpoint: string, model: string, apiKey?: string }>\n /** Default preset per slot; users may override in settings. The `complete` model must support assistant prefill. */\n slots: Record<ModelSlot, string>\n /** Per-user limit shared by all AI endpoints: at most `max` requests per sliding `windowMs`. */\n rateLimit: { max: number, windowMs: number }\n /**\n * Speech-to-text for audio/video `document` composites: any OpenAI-compatible `<endpoint>/audio/transcriptions`\n * (e.g. OpenAI `whisper-1`; OpenRouter presets do not provide one). Absent = the action and the endpoint are off.\n * The key comes from env only: `NUXT_TIPTAP_EDITOR_AI_TRANSCRIPTION_API_KEY`.\n */\n transcription?: { endpoint: string, model: string, apiKey?: string }\n }\n collab: {\n /**\n * Authenticate the `/collab/:id` websocket upgrade itself (`EditorAdapter.authenticate` with the upgrade request's\n * headers) and refuse it with HTTP 401 for an unknown user. Default `false`: the upgrade always succeeds, the user\n * is authenticated afterwards from the headers or the provider's `token`, and an unauthenticated socket is closed\n * with code 4401. Enable only when every client authenticates by cookie/headers: a client that sends its identity\n * as `collaboration.token` (no cookies) cannot connect then. Env override:\n * `NUXT_TIPTAP_EDITOR_COLLAB_AUTHENTICATE_UPGRADE=true`.\n */\n authenticateUpgrade: boolean\n }\n}\n\n/**\n * Nuxt/Nitro integration of the editor package: the client context plugin (settings persistence, AI configuration),\n * the Nitro API routes, the collaboration websocket and the AI configuration with its server-only secrets. The host\n * plugs in through `setEditorAdapter()` (`@ecsplico/editor/server`) in a Nitro plugin (auth, loading and storing\n * document content). Components are imported explicitly from the package entries; nothing is auto-registered.\n */\nexport default defineNuxtModule<ModuleOptions>({\n meta: { name: 'tiptap-editor', configKey: 'tiptapEditor' },\n defaults: {\n locale: 'de',\n collab: { authenticateUpgrade: false },\n ai: {\n presets: {\n sonnet: { label: 'Claude Sonnet 4.5 (OpenRouter)', endpoint: 'https://openrouter.ai/api/v1', model: 'anthropic/claude-sonnet-4.5' },\n flashLite: { label: 'Gemini 2.5 Flash Lite (OpenRouter)', endpoint: 'https://openrouter.ai/api/v1', model: 'google/gemini-2.5-flash-lite' },\n },\n slots: { complete: 'flashLite', rewrite: 'sonnet', generate: 'sonnet' },\n rateLimit: { max: 30, windowMs: 60_000 },\n },\n },\n setup(options, nuxt) {\n const { resolve } = createResolver(import.meta.url)\n // `resolve('..')` is the package root of the built output (`dist`) or of `src` in this repository's app: both\n // hold the stylesheets and the unbundled `nuxt/runtime` files, which Nuxt compiles for the client and Nitro for the server.\n const packageSrc = resolve('..')\n nuxt.options.build.transpile.push(packageSrc)\n // The Nuxt UI token map comes first: the feature sheets (and an Obsidian theme, `themes.css`, last) read and may override `--sk-*`.\n nuxt.options.css.push(resolve('../vue/kit/nuxt-ui.css'))\n nuxt.options.css.push(\n resolve('../styles/core.css'),\n resolve('../styles/media.css'),\n resolve('../styles/mentions.css'),\n resolve('../styles/authors.css'),\n resolve('../styles/comments.css'),\n resolve('../styles/transcript.css'),\n resolve('../styles/composites.css'),\n resolve('../styles/ai.css'),\n resolve('../styles/collab.css'),\n resolve('../styles/block-ui.css'),\n resolve('../styles/themes.css'),\n )\n addPlugin({ src: resolve('./runtime/plugins/editor-context-nuxt-ui.client.ts'), mode: 'client' })\n addServerScanDir(resolve('./runtime/server'))\n // Tailwind only scans the app layers listed in Nuxt UI's generated `ui.css` (`@source \"<layer>/app/**/*\"`), so the\n // utility classes used by the package's components would never be generated. Append its source. `@nuxt/ui` must be\n // registered before this module.\n nuxt.hook('modules:done', () => {\n const uiCss = nuxt.options.build.templates.find(t => t.filename === 'ui.css')\n if (!uiCss?.getContents) throw new Error('tiptap-editor: @nuxt/ui muss vor diesem Modul registriert sein (ui.css-Template fehlt)')\n const getContents = uiCss.getContents\n uiCss.getContents = async data => `@source \"${packageSrc}/**/*\";\\n${await getContents(data)}`\n })\n nuxt.options.nitro.experimental = { ...nuxt.options.nitro.experimental, websocket: true }\n // Nitro bundles the package (the runtime files import `h3` and `nitropack/runtime`, which the host's Nitro resolves): never leave it external.\n nuxt.options.nitro.externals = { ...nuxt.options.nitro.externals, inline: [...(nuxt.options.nitro.externals?.inline ?? []), '@ecsplico/editor', packageSrc] }\n nuxt.options.runtimeConfig.tiptapEditor = {\n collab: { authenticateUpgrade: options.collab.authenticateUpgrade },\n ai: {\n apiKey: '',\n // Every preset gets an empty `apiKey`, so its env variable has a key to override.\n presets: Object.fromEntries(Object.entries(options.ai.presets).map(([id, preset]) => [id, { ...preset, apiKey: preset.apiKey ?? '' }])),\n slots: options.ai.slots,\n rateLimit: options.ai.rateLimit,\n // `apiKey` defaults to '' so its env variable has a key to override.\n ...(options.ai.transcription && { transcription: { ...options.ai.transcription, apiKey: options.ai.transcription.apiKey ?? '' } }),\n },\n ...(nuxt.options.runtimeConfig.tiptapEditor as object | undefined),\n }\n // Default slot presets for the client before `GET /api/ai/models` has answered; read by the client context plugin.\n nuxt.options.runtimeConfig.public.tiptapEditor = {\n locale: options.locale,\n ...(options.messages && { messages: options.messages }),\n ai: { slots: options.ai.slots, transcription: Boolean(options.ai.transcription) },\n ...(nuxt.options.runtimeConfig.public.tiptapEditor as object | undefined),\n }\n },\n})\n"],"mappings":";;;;;;;;AA+CA,IAAA,iBAAe,iBAAgC;CAC7C,MAAM;EAAE,MAAM;EAAiB,WAAW;CAAe;CACzD,UAAU;EACR,QAAQ;EACR,QAAQ,EAAE,qBAAqB,MAAM;EACrC,IAAI;GACF,SAAS;IACP,QAAQ;KAAE,OAAO;KAAkC,UAAU;KAAgC,OAAO;IAA8B;IAClI,WAAW;KAAE,OAAO;KAAsC,UAAU;KAAgC,OAAO;IAA+B;GAC5I;GACA,OAAO;IAAE,UAAU;IAAa,SAAS;IAAU,UAAU;GAAS;GACtE,WAAW;IAAE,KAAK;IAAI,UAAU;GAAO;EACzC;CACF;CACA,MAAM,SAAS,MAAM;EACnB,MAAM,EAAE,YAAY,eAAe,YAAY,GAAG;EAGlD,MAAM,aAAa,QAAQ,IAAI;EAC/B,KAAK,QAAQ,MAAM,UAAU,KAAK,UAAU;EAE5C,KAAK,QAAQ,IAAI,KAAK,QAAQ,wBAAwB,CAAC;EACvD,KAAK,QAAQ,IAAI,KACf,QAAQ,oBAAoB,GAC5B,QAAQ,qBAAqB,GAC7B,QAAQ,wBAAwB,GAChC,QAAQ,uBAAuB,GAC/B,QAAQ,wBAAwB,GAChC,QAAQ,0BAA0B,GAClC,QAAQ,0BAA0B,GAClC,QAAQ,kBAAkB,GAC1B,QAAQ,sBAAsB,GAC9B,QAAQ,wBAAwB,GAChC,QAAQ,sBAAsB,CAChC;EACA,UAAU;GAAE,KAAK,QAAQ,oDAAoD;GAAG,MAAM;EAAS,CAAC;EAChG,iBAAiB,QAAQ,kBAAkB,CAAC;EAI5C,KAAK,KAAK,sBAAsB;GAC9B,MAAM,QAAQ,KAAK,QAAQ,MAAM,UAAU,MAAK,MAAK,EAAE,aAAa,QAAQ;GAC5E,IAAI,CAAC,OAAO,aAAa,MAAM,IAAI,MAAM,wFAAwF;GACjI,MAAM,cAAc,MAAM;GAC1B,MAAM,cAAc,OAAM,SAAQ,YAAY,WAAW,WAAW,MAAM,YAAY,IAAI;EAC5F,CAAC;EACD,KAAK,QAAQ,MAAM,eAAe;GAAE,GAAG,KAAK,QAAQ,MAAM;GAAc,WAAW;EAAK;EAExF,KAAK,QAAQ,MAAM,YAAY;GAAE,GAAG,KAAK,QAAQ,MAAM;GAAW,QAAQ;IAAC,GAAI,KAAK,QAAQ,MAAM,WAAW,UAAU,CAAC;IAAI;IAAoB;GAAU;EAAE;EAC5J,KAAK,QAAQ,cAAc,eAAe;GACxC,QAAQ,EAAE,qBAAqB,QAAQ,OAAO,oBAAoB;GAClE,IAAI;IACF,QAAQ;IAER,SAAS,OAAO,YAAY,OAAO,QAAQ,QAAQ,GAAG,OAAO,CAAC,CAAC,KAAK,CAAC,IAAI,YAAY,CAAC,IAAI;KAAE,GAAG;KAAQ,QAAQ,OAAO,UAAU;IAAG,CAAC,CAAC,CAAC;IACtI,OAAO,QAAQ,GAAG;IAClB,WAAW,QAAQ,GAAG;IAEtB,GAAI,QAAQ,GAAG,iBAAiB,EAAE,eAAe;KAAE,GAAG,QAAQ,GAAG;KAAe,QAAQ,QAAQ,GAAG,cAAc,UAAU;IAAG,EAAE;GAClI;GACA,GAAI,KAAK,QAAQ,cAAc;EACjC;EAEA,KAAK,QAAQ,cAAc,OAAO,eAAe;GAC/C,QAAQ,QAAQ;GAChB,GAAI,QAAQ,YAAY,EAAE,UAAU,QAAQ,SAAS;GACrD,IAAI;IAAE,OAAO,QAAQ,GAAG;IAAO,eAAe,QAAQ,QAAQ,GAAG,aAAa;GAAE;GAChF,GAAI,KAAK,QAAQ,cAAc,OAAO;EACxC;CACF;AACF,CAAC"}
@@ -5,9 +5,8 @@ import { App } from "vue";
5
5
  * Installs the editor context on a Nuxt app (client only: TipTap does not render on the server). Settings are kept per
6
6
  * account through the host's `/api/editor/settings`; the AI configuration is the module's public runtime config,
7
7
  * passed on as inert data. Features request through ofetch, which is what Nuxt's `$fetch` is on the client. `locale`
8
- * and `messages` are the module's options of the same name. The kit comes from the plugin file the module registered
9
- * for its `kit` option, so a bundler only ever reaches the UI library the app uses (a PrimeVue app never resolves
10
- * `@nuxt/ui`, a Nuxt UI app never `primevue`). Only the Vue app is read, so the parameter is structural: a host's
8
+ * and `messages` are the module's options of the same name. The kit is passed in by the plugin file the module registers
9
+ * (`nuxtUiKit()`). Only the Vue app is read, so the parameter is structural: a host's
11
10
  * augmented `NuxtApp` (plugins adding `$router`, `$auth`, ...) and the `_NuxtApp` a plugin receives both fit.
12
11
  */
13
12
  export declare function installEditorContext(nuxtApp: {
@@ -5,9 +5,8 @@ import { useRuntimeConfig } from "#app";
5
5
  * Installs the editor context on a Nuxt app (client only: TipTap does not render on the server). Settings are kept per
6
6
  * account through the host's `/api/editor/settings`; the AI configuration is the module's public runtime config,
7
7
  * passed on as inert data. Features request through ofetch, which is what Nuxt's `$fetch` is on the client. `locale`
8
- * and `messages` are the module's options of the same name. The kit comes from the plugin file the module registered
9
- * for its `kit` option, so a bundler only ever reaches the UI library the app uses (a PrimeVue app never resolves
10
- * `@nuxt/ui`, a Nuxt UI app never `primevue`). Only the Vue app is read, so the parameter is structural: a host's
8
+ * and `messages` are the module's options of the same name. The kit is passed in by the plugin file the module registers
9
+ * (`nuxtUiKit()`). Only the Vue app is read, so the parameter is structural: a host's
11
10
  * augmented `NuxtApp` (plugins adding `$router`, `$auth`, ...) and the `_NuxtApp` a plugin receives both fit.
12
11
  */
13
12
  function installEditorContext(nuxtApp, kit) {
@@ -1 +1 @@
1
- {"version":3,"file":"install-context.js","names":[],"sources":["../../../src/nuxt/runtime/install-context.ts"],"sourcesContent":["import type { App } from 'vue'\nimport { useRuntimeConfig } from '#app'\nimport type { EditorAiConfig } from '../../core/context'\nimport type { Locale, Messages } from '../../i18n'\nimport { createEditor } from '../../vue/context'\nimport type { VueUiKit } from '../../vue/kit/types'\n\n/**\n * Installs the editor context on a Nuxt app (client only: TipTap does not render on the server). Settings are kept per\n * account through the host's `/api/editor/settings`; the AI configuration is the module's public runtime config,\n * passed on as inert data. Features request through ofetch, which is what Nuxt's `$fetch` is on the client. `locale`\n * and `messages` are the module's options of the same name. The kit comes from the plugin file the module registered\n * for its `kit` option, so a bundler only ever reaches the UI library the app uses (a PrimeVue app never resolves\n * `@nuxt/ui`, a Nuxt UI app never `primevue`). Only the Vue app is read, so the parameter is structural: a host's\n * augmented `NuxtApp` (plugins adding `$router`, `$auth`, ...) and the `_NuxtApp` a plugin receives both fit.\n */\nexport function installEditorContext(nuxtApp: { vueApp: App }, kit: VueUiKit): void {\n const { ai, locale, messages } = useRuntimeConfig().public.tiptapEditor as { ai?: EditorAiConfig, locale?: Locale, messages?: Partial<Messages> }\n nuxtApp.vueApp.use(createEditor({ kit, settings: { remote: true }, ...(ai && { ai }), ...(locale && { locale }), ...(messages && { messages }) }))\n}\n"],"mappings":";;;;;;;;;;;;AAgBA,SAAgB,qBAAqB,SAA0B,KAAqB;CAClF,MAAM,EAAE,IAAI,QAAQ,aAAa,iBAAiB,CAAC,CAAC,OAAO;CAC3D,QAAQ,OAAO,IAAI,aAAa;EAAE;EAAK,UAAU,EAAE,QAAQ,KAAK;EAAG,GAAI,MAAM,EAAE,GAAG;EAAI,GAAI,UAAU,EAAE,OAAO;EAAI,GAAI,YAAY,EAAE,SAAS;CAAG,CAAC,CAAC;AACnJ"}
1
+ {"version":3,"file":"install-context.js","names":[],"sources":["../../../src/nuxt/runtime/install-context.ts"],"sourcesContent":["import type { App } from 'vue'\nimport { useRuntimeConfig } from '#app'\nimport type { EditorAiConfig } from '../../core/context'\nimport type { Locale, Messages } from '../../i18n'\nimport { createEditor } from '../../vue/context'\nimport type { VueUiKit } from '../../vue/kit/types'\n\n/**\n * Installs the editor context on a Nuxt app (client only: TipTap does not render on the server). Settings are kept per\n * account through the host's `/api/editor/settings`; the AI configuration is the module's public runtime config,\n * passed on as inert data. Features request through ofetch, which is what Nuxt's `$fetch` is on the client. `locale`\n * and `messages` are the module's options of the same name. The kit is passed in by the plugin file the module registers\n * (`nuxtUiKit()`). Only the Vue app is read, so the parameter is structural: a host's\n * augmented `NuxtApp` (plugins adding `$router`, `$auth`, ...) and the `_NuxtApp` a plugin receives both fit.\n */\nexport function installEditorContext(nuxtApp: { vueApp: App }, kit: VueUiKit): void {\n const { ai, locale, messages } = useRuntimeConfig().public.tiptapEditor as { ai?: EditorAiConfig, locale?: Locale, messages?: Partial<Messages> }\n nuxtApp.vueApp.use(createEditor({ kit, settings: { remote: true }, ...(ai && { ai }), ...(locale && { locale }), ...(messages && { messages }) }))\n}\n"],"mappings":";;;;;;;;;;;AAeA,SAAgB,qBAAqB,SAA0B,KAAqB;CAClF,MAAM,EAAE,IAAI,QAAQ,aAAa,iBAAiB,CAAC,CAAC,OAAO;CAC3D,QAAQ,OAAO,IAAI,aAAa;EAAE;EAAK,UAAU,EAAE,QAAQ,KAAK;EAAG,GAAI,MAAM,EAAE,GAAG;EAAI,GAAI,UAAU,EAAE,OAAO;EAAI,GAAI,YAAY,EAAE,SAAS;CAAG,CAAC,CAAC;AACnJ"}
@@ -2,7 +2,7 @@ import { nuxtUiKit } from '../../../vue/kit/nuxt-ui'
2
2
  import { installEditorContext } from '../install-context'
3
3
  import { defineNuxtPlugin } from '#app'
4
4
 
5
- // Registered by the module for `kit: 'nuxt-ui'` (the default); see `install-context.ts`.
5
+ // Registered by the module; see `install-context.ts`.
6
6
  export default defineNuxtPlugin((nuxtApp) => {
7
7
  installEditorContext(nuxtApp, nuxtUiKit())
8
8
  })
@@ -1,6 +1,6 @@
1
1
  import { useCollabServer, useEditorAdapter } from "../../../../../server/host.js";
2
- import { useRuntimeConfig } from "nitropack/runtime";
3
2
  import { defineWebSocketHandler } from "h3";
3
+ import { useRuntimeConfig } from "nitropack/runtime";
4
4
  //#region src/nuxt/runtime/server/routes/collab/[id].ts
5
5
  var _id__default = defineWebSocketHandler({
6
6
  async upgrade(request) {
@@ -1,8 +1,8 @@
1
1
  import { AbilitiesOptions, BlockAction, SlashCommandItem } from "../core/extension-points.js";
2
2
  import { EditorMetadata, MetadataItem } from "../core/metadata-types.js";
3
3
  import { CollaborationSession, EditorFeature, EditorPreset, UploadFn } from "../core/feature.js";
4
- import { ComponentType } from "react";
5
4
  import { AnyExtension, Editor, JSONContent } from "@tiptap/core";
5
+ import { ComponentType } from "react";
6
6
  //#region src/react/EditorSurface.d.ts
7
7
  export type ReactFeature = EditorFeature<ComponentType<{
8
8
  editor: Editor;