@ecsplico/editor 3.1.0 → 3.2.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 (270) hide show
  1. package/CHANGELOG.md +41 -0
  2. package/dist/adapters/direct-ai.d.ts +36 -0
  3. package/dist/adapters/direct-ai.js +169 -0
  4. package/dist/adapters/direct-ai.js.map +1 -0
  5. package/dist/adapters/memory.js.map +1 -1
  6. package/dist/code/CodeSurface.vue.d.ts +2 -2
  7. package/dist/core/block-drag.js +3 -0
  8. package/dist/core/block-drag.js.map +1 -1
  9. package/dist/core/block-transfer.d.ts +44 -0
  10. package/dist/core/block-transfer.js +68 -0
  11. package/dist/core/block-transfer.js.map +1 -0
  12. package/dist/core/commands.js +5 -0
  13. package/dist/core/commands.js.map +1 -1
  14. package/dist/core/core-feature.d.ts +4 -1
  15. package/dist/core/core-feature.js +8 -3
  16. package/dist/core/core-feature.js.map +1 -1
  17. package/dist/core/editor-ui.d.ts +3 -1
  18. package/dist/core/editor-ui.js.map +1 -1
  19. package/dist/core/extension-points.d.ts +17 -1
  20. package/dist/core/feature.d.ts +6 -1
  21. package/dist/core/feature.js.map +1 -1
  22. package/dist/core/index.d.ts +4 -2
  23. package/dist/core/index.js +3 -2
  24. package/dist/core/schema/index.d.ts +24 -3
  25. package/dist/core/schema/index.js +21 -4
  26. package/dist/core/schema/index.js.map +1 -1
  27. package/dist/core/surface-session.js +3 -1
  28. package/dist/core/surface-session.js.map +1 -1
  29. package/dist/core/toolbar-items.js +1 -1
  30. package/dist/core/toolbar-items.js.map +1 -1
  31. package/dist/document/DocumentSurface.vue.d.ts +2 -2
  32. package/dist/features/ai/agent-op-review.js +1 -1
  33. package/dist/features/ai/agent-ops.js +2 -2
  34. package/dist/features/ai/ai-apply.js +1 -1
  35. package/dist/features/ai/assistant.js +1 -1
  36. package/dist/features/ai/components/AiSelectionMenu.js +2 -2
  37. package/dist/features/ai/components/AiSidebar.js +2 -2
  38. package/dist/features/ai/components/SettingsAiTab.js +1 -1
  39. package/dist/features/ai/components/SettingsModelProfiles.js +1 -1
  40. package/dist/features/ai/document-chat-model.js +1 -1
  41. package/dist/features/ai/document-chat.js +2 -2
  42. package/dist/features/ai/ghost-autocomplete.js +1 -1
  43. package/dist/features/ai/index.d.ts +4 -3
  44. package/dist/features/ai/index.js +6 -5
  45. package/dist/features/ai/protocol/complete.d.ts +19 -0
  46. package/dist/features/ai/protocol/complete.js +27 -1
  47. package/dist/features/ai/protocol/complete.js.map +1 -1
  48. package/dist/features/ai/protocol/generate.d.ts +95 -0
  49. package/dist/features/ai/protocol/generate.js +58 -0
  50. package/dist/features/ai/protocol/generate.js.map +1 -0
  51. package/dist/features/ai/protocol/index.d.ts +4 -3
  52. package/dist/features/ai/protocol/index.js +6 -5
  53. package/dist/features/ai/protocol/tasks.d.ts +3 -1
  54. package/dist/features/ai/protocol/tasks.js +74 -2
  55. package/dist/features/ai/protocol/tasks.js.map +1 -1
  56. package/dist/features/ai/react/AiSelectionMenu.js +2 -2
  57. package/dist/features/ai/react/AiSidebar.js +2 -2
  58. package/dist/features/ai/react/SettingsAiTab.js +1 -1
  59. package/dist/features/ai/react/SettingsModelProfiles.js +1 -1
  60. package/dist/features/ai/selection-flow.js +1 -1
  61. package/dist/features/ai/sidebar-flow.js +1 -1
  62. package/dist/features/block-ui/block-actions.d.ts +19 -3
  63. package/dist/features/block-ui/block-actions.js +49 -3
  64. package/dist/features/block-ui/block-actions.js.map +1 -1
  65. package/dist/features/block-ui/components/BlockActionsOverlay.js +24 -13
  66. package/dist/features/block-ui/components/BlockActionsOverlay.js.map +1 -1
  67. package/dist/features/block-ui/components/BlockActionsOverlay.vue.d.ts +12 -5
  68. package/dist/features/block-ui/components/BlockUi.js +52 -20
  69. package/dist/features/block-ui/components/BlockUi.js.map +1 -1
  70. package/dist/features/block-ui/components/BlockUi.vue.d.ts +6 -4
  71. package/dist/features/block-ui/feature.d.ts +8 -2
  72. package/dist/features/block-ui/feature.js +7 -2
  73. package/dist/features/block-ui/feature.js.map +1 -1
  74. package/dist/features/block-ui/index.d.ts +3 -2
  75. package/dist/features/block-ui/index.js +2 -2
  76. package/dist/features/block-ui/react/BlockActionsOverlay.d.ts +14 -7
  77. package/dist/features/block-ui/react/BlockActionsOverlay.js +25 -13
  78. package/dist/features/block-ui/react/BlockActionsOverlay.js.map +1 -1
  79. package/dist/features/block-ui/react/BlockUi.d.ts +6 -4
  80. package/dist/features/block-ui/react/BlockUi.js +43 -15
  81. package/dist/features/block-ui/react/BlockUi.js.map +1 -1
  82. package/dist/features/block-ui/react.d.ts +4 -2
  83. package/dist/features/block-ui/react.js +3 -3
  84. package/dist/features/block-ui/react.js.map +1 -1
  85. package/dist/features/block-ui/vue.d.ts +4 -2
  86. package/dist/features/block-ui/vue.js +3 -3
  87. package/dist/features/block-ui/vue.js.map +1 -1
  88. package/dist/features/composites/baskets.d.ts +27 -0
  89. package/dist/features/composites/baskets.js +46 -0
  90. package/dist/features/composites/baskets.js.map +1 -0
  91. package/dist/features/composites/components/CompositeBasketMenu.js +97 -0
  92. package/dist/features/composites/components/CompositeBasketMenu.js.map +1 -0
  93. package/dist/features/composites/components/CompositeChrome.js +79 -23
  94. package/dist/features/composites/components/CompositeChrome.js.map +1 -1
  95. package/dist/features/composites/components/CompositeFieldEditor.js +1 -0
  96. package/dist/features/composites/components/CompositeFieldEditor.js.map +1 -1
  97. package/dist/features/composites/components/CompositeView.js +17 -2
  98. package/dist/features/composites/components/CompositeView.js.map +1 -1
  99. package/dist/features/composites/components/DerivationBadge.js +12 -3
  100. package/dist/features/composites/components/DerivationBadge.js.map +1 -1
  101. package/dist/features/composites/components/FocusChip.js +53 -0
  102. package/dist/features/composites/components/FocusChip.js.map +1 -0
  103. package/dist/features/composites/components/FocusChip.vue.d.ts +14 -0
  104. package/dist/features/composites/components/SettingsEditingTab.js +40 -4
  105. package/dist/features/composites/components/SettingsEditingTab.js.map +1 -1
  106. package/dist/features/composites/derivation.d.ts +2 -1
  107. package/dist/features/composites/derivation.js +5 -1
  108. package/dist/features/composites/derivation.js.map +1 -1
  109. package/dist/features/composites/derived-chrome.js +13 -3
  110. package/dist/features/composites/derived-chrome.js.map +1 -1
  111. package/dist/features/composites/feature.d.ts +7 -1
  112. package/dist/features/composites/feature.js +96 -23
  113. package/dist/features/composites/feature.js.map +1 -1
  114. package/dist/features/composites/focus.d.ts +38 -0
  115. package/dist/features/composites/focus.js +86 -0
  116. package/dist/features/composites/focus.js.map +1 -0
  117. package/dist/features/composites/index.d.ts +6 -3
  118. package/dist/features/composites/index.js +6 -3
  119. package/dist/features/composites/meta-keys.d.ts +4 -0
  120. package/dist/features/composites/meta-keys.js +8 -4
  121. package/dist/features/composites/meta-keys.js.map +1 -1
  122. package/dist/features/composites/nodes.d.ts +14 -2
  123. package/dist/features/composites/nodes.js +61 -5
  124. package/dist/features/composites/nodes.js.map +1 -1
  125. package/dist/features/composites/outline.d.ts +4 -0
  126. package/dist/features/composites/outline.js +3 -0
  127. package/dist/features/composites/outline.js.map +1 -1
  128. package/dist/features/composites/react/CompositeBasketMenu.js +88 -0
  129. package/dist/features/composites/react/CompositeBasketMenu.js.map +1 -0
  130. package/dist/features/composites/react/CompositeChrome.js +52 -4
  131. package/dist/features/composites/react/CompositeChrome.js.map +1 -1
  132. package/dist/features/composites/react/CompositeView.js +12 -2
  133. package/dist/features/composites/react/CompositeView.js.map +1 -1
  134. package/dist/features/composites/react/DerivationBadge.js +10 -1
  135. package/dist/features/composites/react/DerivationBadge.js.map +1 -1
  136. package/dist/features/composites/react/FocusChip.d.ts +11 -0
  137. package/dist/features/composites/react/FocusChip.js +50 -0
  138. package/dist/features/composites/react/FocusChip.js.map +1 -0
  139. package/dist/features/composites/react/SettingsEditingTab.js +36 -1
  140. package/dist/features/composites/react/SettingsEditingTab.js.map +1 -1
  141. package/dist/features/composites/react.d.ts +2 -1
  142. package/dist/features/composites/react.js +3 -1
  143. package/dist/features/composites/react.js.map +1 -1
  144. package/dist/features/composites/schema.d.ts +5 -3
  145. package/dist/features/composites/schema.js +8 -4
  146. package/dist/features/composites/schema.js.map +1 -1
  147. package/dist/features/composites/split.d.ts +62 -0
  148. package/dist/features/composites/split.js +172 -0
  149. package/dist/features/composites/split.js.map +1 -0
  150. package/dist/features/composites/vue.d.ts +4 -3
  151. package/dist/features/composites/vue.js +7 -5
  152. package/dist/features/composites/vue.js.map +1 -1
  153. package/dist/features/media/index.js +1 -1
  154. package/dist/features/media/react/AudioRecorderModal.js +1 -1
  155. package/dist/features/media/react.js +1 -1
  156. package/dist/features/transfer/components/TransferMenu.js +93 -0
  157. package/dist/features/transfer/components/TransferMenu.js.map +1 -0
  158. package/dist/features/transfer/components/TransferMenu.vue.d.ts +15 -0
  159. package/dist/features/transfer/feature.d.ts +76 -0
  160. package/dist/features/transfer/feature.js +169 -0
  161. package/dist/features/transfer/feature.js.map +1 -0
  162. package/dist/features/transfer/index.d.ts +3 -0
  163. package/dist/features/transfer/index.js +3 -0
  164. package/dist/features/transfer/react/TransferMenu.d.ts +12 -0
  165. package/dist/features/transfer/react/TransferMenu.js +71 -0
  166. package/dist/features/transfer/react/TransferMenu.js.map +1 -0
  167. package/dist/features/transfer/react.d.ts +10 -0
  168. package/dist/features/transfer/react.js +11 -0
  169. package/dist/features/transfer/react.js.map +1 -0
  170. package/dist/features/transfer/transforms.d.ts +83 -0
  171. package/dist/features/transfer/transforms.js +137 -0
  172. package/dist/features/transfer/transforms.js.map +1 -0
  173. package/dist/features/transfer/vue.d.ts +9 -0
  174. package/dist/features/transfer/vue.js +11 -0
  175. package/dist/features/transfer/vue.js.map +1 -0
  176. package/dist/i18n/de/ai.js +4 -0
  177. package/dist/i18n/de/ai.js.map +1 -1
  178. package/dist/i18n/de/composites.js +20 -1
  179. package/dist/i18n/de/composites.js.map +1 -1
  180. package/dist/i18n/de/integrations.js +16 -0
  181. package/dist/i18n/de/integrations.js.map +1 -1
  182. package/dist/i18n/de/transfer.js +17 -0
  183. package/dist/i18n/de/transfer.js.map +1 -0
  184. package/dist/i18n/de/tree.js +6 -0
  185. package/dist/i18n/de/tree.js.map +1 -1
  186. package/dist/i18n/de.d.ts +55 -0
  187. package/dist/i18n/de.js +3 -1
  188. package/dist/i18n/de.js.map +1 -1
  189. package/dist/i18n/en/ai.js +4 -0
  190. package/dist/i18n/en/ai.js.map +1 -1
  191. package/dist/i18n/en/composites.js +20 -1
  192. package/dist/i18n/en/composites.js.map +1 -1
  193. package/dist/i18n/en/integrations.js +16 -0
  194. package/dist/i18n/en/integrations.js.map +1 -1
  195. package/dist/i18n/en/transfer.js +17 -0
  196. package/dist/i18n/en/transfer.js.map +1 -0
  197. package/dist/i18n/en/tree.js +6 -0
  198. package/dist/i18n/en/tree.js.map +1 -1
  199. package/dist/i18n/en.js +3 -1
  200. package/dist/i18n/en.js.map +1 -1
  201. package/dist/integrations/composite-ai/composite-fill.js +1 -1
  202. package/dist/integrations/composite-ai/composite-summary.js +1 -1
  203. package/dist/integrations/composite-ai/derive.d.ts +21 -0
  204. package/dist/integrations/composite-ai/derive.js +69 -47
  205. package/dist/integrations/composite-ai/derive.js.map +1 -1
  206. package/dist/integrations/composite-ai/index.d.ts +8 -3
  207. package/dist/integrations/composite-ai/index.js +50 -4
  208. package/dist/integrations/composite-ai/index.js.map +1 -1
  209. package/dist/integrations/composite-ai/outline-sanitize.d.ts +48 -0
  210. package/dist/integrations/composite-ai/outline-sanitize.js +175 -0
  211. package/dist/integrations/composite-ai/outline-sanitize.js.map +1 -0
  212. package/dist/integrations/composite-ai/split.d.ts +44 -0
  213. package/dist/integrations/composite-ai/split.js +187 -0
  214. package/dist/integrations/composite-ai/split.js.map +1 -0
  215. package/dist/integrations/composite-ai/transfer-transforms.d.ts +27 -0
  216. package/dist/integrations/composite-ai/transfer-transforms.js +153 -0
  217. package/dist/integrations/composite-ai/transfer-transforms.js.map +1 -0
  218. package/dist/integrations/transcript-ai/protocol.d.ts +13 -0
  219. package/dist/integrations/transcript-ai/protocol.js +49 -1
  220. package/dist/integrations/transcript-ai/protocol.js.map +1 -1
  221. package/dist/integrations/transcript-ai/transcript-cleanup.js +1 -1
  222. package/dist/markdown/MarkdownSurface.vue.d.ts +6 -6
  223. package/dist/nuxt/module.d.ts +110 -0
  224. package/dist/presets/compose.d.ts +24 -8
  225. package/dist/presets/compose.js +117 -58
  226. package/dist/presets/compose.js.map +1 -1
  227. package/dist/react/compose.js +6 -2
  228. package/dist/react/compose.js.map +1 -1
  229. package/dist/react/composed-surface.d.ts +9 -0
  230. package/dist/react/composed-surface.js +4 -1
  231. package/dist/react/composed-surface.js.map +1 -1
  232. package/dist/server/ai.d.ts +2 -5
  233. package/dist/server/ai.js.map +1 -1
  234. package/dist/server/handlers/ai.d.ts +7 -78
  235. package/dist/server/handlers/ai.js +30 -94
  236. package/dist/server/handlers/ai.js.map +1 -1
  237. package/dist/server/handlers/editor.d.ts +1 -0
  238. package/dist/server/handlers/index.d.ts +3 -1
  239. package/dist/server/handlers/index.js +3 -1
  240. package/dist/server/index.d.ts +2 -1
  241. package/dist/settings/index.d.ts +8 -0
  242. package/dist/settings/index.js +16 -4
  243. package/dist/settings/index.js.map +1 -1
  244. package/dist/styles/composites.css +32 -0
  245. package/dist/tree/DocumentTree.js +229 -78
  246. package/dist/tree/DocumentTree.js.map +1 -1
  247. package/dist/tree/drop-rules.js +8 -0
  248. package/dist/tree/drop-rules.js.map +1 -1
  249. package/dist/tree/react/DocumentTree.js +152 -31
  250. package/dist/tree/react/DocumentTree.js.map +1 -1
  251. package/dist/tree/tree-host.js +30 -1
  252. package/dist/tree/tree-host.js.map +1 -1
  253. package/dist/tree/tree-items.js +52 -5
  254. package/dist/tree/tree-items.js.map +1 -1
  255. package/dist/tree/tree-model.js +113 -10
  256. package/dist/tree/tree-model.js.map +1 -1
  257. package/dist/tree/tree-rows.js +20 -7
  258. package/dist/tree/tree-rows.js.map +1 -1
  259. package/dist/tree/tree-view-model.d.ts +5 -0
  260. package/dist/tree/tree-view-model.js +13 -0
  261. package/dist/tree/tree-view-model.js.map +1 -1
  262. package/dist/vue/AdvancedEditor.js +6 -0
  263. package/dist/vue/AdvancedEditor.js.map +1 -1
  264. package/dist/vue/AdvancedEditor.vue.d.ts +13 -5
  265. package/dist/vue/SimpleEditor.vue.d.ts +4 -4
  266. package/dist/vue/components/EditorSurface.vue.d.ts +4 -4
  267. package/dist/vue/compose.js +6 -2
  268. package/dist/vue/compose.js.map +1 -1
  269. package/dist/vue/kit/types.d.ts +2 -0
  270. package/package.json +21 -1
@@ -1 +1 @@
1
- {"version":3,"file":"SettingsEditingTab.js","names":[],"sources":["../../../../src/features/composites/react/SettingsEditingTab.tsx"],"sourcesContent":["import { useId } from 'react'\nimport { Icon } from '../../../react/Icon'\nimport { useEditorSettings } from '../../../react/settings'\nimport { SettingsSection } from '../../../react/SettingsSection'\nimport { Label } from '../../../react/ui/label'\nimport { RadioGroup, RadioGroupItem } from '../../../react/ui/radio-group'\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '../../../react/ui/select'\nimport { DRAG_HANDLE_VISIBILITIES, HEADING_CONVERSION_SCOPES, KIND_ICON_VISIBILITIES, STRUCTURE_MODES, TREE_ROOTS } from '../../../settings'\nimport { useEditorI18n } from '../../../react/use-editor-i18n'\nimport { DRAG_HANDLE_KEYS, HEADING_SCOPE_KEYS, KIND_ICON_KEYS, optionItems } from '../editing-settings-keys'\nimport type { CompositeKind } from '../kinds'\nimport { STRUCTURE_MODE_KEYS } from '../structure-mode'\nimport { TREE_ROOT_KEYS } from '../tree-root'\n\n/** A group of radio options under a legend (the counterpart of Nuxt UI's `URadioGroup`), the options one above the other. */\nfunction RadioField<T extends string>({ legend, items, value, onChange }: {\n legend: string\n items: readonly { label: string, description: string, value: T }[]\n value: T\n onChange: (value: T) => void\n}) {\n const legendId = useId()\n return (\n <div className=\"py-3\">\n <p id={legendId} className=\"mb-2 text-sm font-medium text-foreground\">{legend}</p>\n <RadioGroup\n aria-labelledby={legendId}\n className=\"flex flex-col gap-2\"\n value={value}\n onValueChange={(next) => {\n const item = items.find(candidate => candidate.value === next)\n if (item) onChange(item.value)\n }}\n >\n {items.map(item => <RadioOption key={item.value} item={item} />)}\n </RadioGroup>\n </div>\n )\n}\n\nfunction RadioOption({ item }: { item: { label: string, description: string, value: string } }) {\n const id = useId()\n return (\n <div className=\"flex items-start gap-2\">\n <RadioGroupItem id={id} value={item.value} className=\"mt-0.5\" />\n <Label htmlFor={id} className=\"flex-col items-start gap-0.5\">\n <span className=\"text-sm font-medium text-foreground\">{item.label}</span>\n <span className=\"text-sm font-normal text-muted-foreground\">{item.description}</span>\n </Label>\n </div>\n )\n}\n\n/** „Bearbeiten“: Gliederung (structure mode, conversion scope), Bausteine defaults and the visibility of the block handles. */\nexport function SettingsEditingTab({ kinds }: { kinds: readonly CompositeKind[] }) {\n const { settings, update } = useEditorSettings()\n const kindLabelId = useId()\n const { t } = useEditorI18n()\n const structureItems = optionItems(STRUCTURE_MODES, STRUCTURE_MODE_KEYS, t)\n const scopeItems = optionItems(HEADING_CONVERSION_SCOPES, HEADING_SCOPE_KEYS, t)\n const treeRootItems = optionItems(TREE_ROOTS, TREE_ROOT_KEYS, t)\n const kindIconItems = optionItems(KIND_ICON_VISIBILITIES, KIND_ICON_KEYS, t)\n const dragHandleItems = optionItems(DRAG_HANDLE_VISIBILITIES, DRAG_HANDLE_KEYS, t)\n\n return (\n <div className=\"flex flex-col gap-8\">\n <SettingsSection title={t('composites.settings.structure.title')}>\n <RadioField\n legend={t('composites.settings.structure.legend')}\n items={structureItems}\n value={settings.blocks.structure}\n onChange={value => update((draft) => { draft.blocks.structure = value })}\n />\n <RadioField\n legend={t('composites.settings.scope.legend')}\n items={scopeItems}\n value={settings.editing.headingConversionScope}\n onChange={value => update((draft) => { draft.editing.headingConversionScope = value })}\n />\n </SettingsSection>\n\n <SettingsSection title={t('composites.settings.sidebar.title')}>\n <RadioField\n legend={t('composites.settings.treeRoot.legend')}\n items={treeRootItems}\n value={settings.blocks.treeRoot}\n onChange={value => update((draft) => { draft.blocks.treeRoot = value })}\n />\n </SettingsSection>\n\n <SettingsSection title={t('composites.settings.composites.title')}>\n <div className=\"flex items-start justify-between gap-4 py-3\">\n <div className=\"min-w-0 flex-1\">\n <Label id={kindLabelId} className=\"text-sm font-medium text-foreground\">{t('composites.settings.defaultKind.label')}</Label>\n <p className=\"text-sm text-muted-foreground\">{t('composites.settings.defaultKind.description')}</p>\n </div>\n <Select value={settings.blocks.defaultKind} onValueChange={value => update((draft) => { draft.blocks.defaultKind = value })}>\n <SelectTrigger aria-labelledby={kindLabelId} className=\"w-64\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {kinds.map(kind => (\n <SelectItem key={kind.id} value={kind.id}>\n <Icon name={kind.icon} />\n {kind.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n <RadioField\n legend={t('composites.settings.kindIcon.legend')}\n items={kindIconItems}\n value={settings.blocks.kindIcon}\n onChange={value => update((draft) => { draft.blocks.kindIcon = value })}\n />\n <RadioField\n legend={t('composites.settings.dragHandle.legend')}\n items={dragHandleItems}\n value={settings.blocks.dragHandle}\n onChange={value => update((draft) => { draft.blocks.dragHandle = value })}\n />\n </SettingsSection>\n </div>\n )\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"SettingsEditingTab.js","names":[],"sources":["../../../../src/features/composites/react/SettingsEditingTab.tsx"],"sourcesContent":["import { useEffect, useId, useState } from 'react'\nimport { Icon } from '../../../react/Icon'\nimport { useEditorSettings } from '../../../react/settings'\nimport { SettingsSection } from '../../../react/SettingsSection'\nimport { Input } from '../../../react/ui/input'\nimport { Label } from '../../../react/ui/label'\nimport { RadioGroup, RadioGroupItem } from '../../../react/ui/radio-group'\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '../../../react/ui/select'\nimport { clampSplitTargetChars, DRAG_HANDLE_VISIBILITIES, HEADING_CONVERSION_SCOPES, KIND_ICON_VISIBILITIES, SPLIT_TARGET_CHARS_MAX, SPLIT_TARGET_CHARS_MIN, STRUCTURE_MODES, TREE_ROOTS } from '../../../settings'\nimport { useEditorI18n } from '../../../react/use-editor-i18n'\nimport { DRAG_HANDLE_KEYS, HEADING_SCOPE_KEYS, KIND_ICON_KEYS, optionItems } from '../editing-settings-keys'\nimport type { CompositeKind } from '../kinds'\nimport { STRUCTURE_MODE_KEYS } from '../structure-mode'\nimport { TREE_ROOT_KEYS } from '../tree-root'\n\n/** A group of radio options under a legend (the counterpart of Nuxt UI's `URadioGroup`), the options one above the other. */\nfunction RadioField<T extends string>({ legend, items, value, onChange }: {\n legend: string\n items: readonly { label: string, description: string, value: T }[]\n value: T\n onChange: (value: T) => void\n}) {\n const legendId = useId()\n return (\n <div className=\"py-3\">\n <p id={legendId} className=\"mb-2 text-sm font-medium text-foreground\">{legend}</p>\n <RadioGroup\n aria-labelledby={legendId}\n className=\"flex flex-col gap-2\"\n value={value}\n onValueChange={(next) => {\n const item = items.find(candidate => candidate.value === next)\n if (item) onChange(item.value)\n }}\n >\n {items.map(item => <RadioOption key={item.value} item={item} />)}\n </RadioGroup>\n </div>\n )\n}\n\nfunction RadioOption({ item }: { item: { label: string, description: string, value: string } }) {\n const id = useId()\n return (\n <div className=\"flex items-start gap-2\">\n <RadioGroupItem id={id} value={item.value} className=\"mt-0.5\" />\n <Label htmlFor={id} className=\"flex-col items-start gap-0.5\">\n <span className=\"text-sm font-medium text-foreground\">{item.label}</span>\n <span className=\"text-sm font-normal text-muted-foreground\">{item.description}</span>\n </Label>\n </div>\n )\n}\n\n/** „Bearbeiten“: Gliederung (structure mode, conversion scope), Bausteine defaults and the visibility of the block handles. */\nexport function SettingsEditingTab({ kinds }: { kinds: readonly CompositeKind[] }) {\n const { settings, update } = useEditorSettings()\n const kindLabelId = useId()\n const splitTargetId = useId()\n // The target size is edited as text and written back clamped to its range when the field is left, so a half-typed number never reaches the settings.\n const [splitTarget, setSplitTarget] = useState(String(settings.blocks.splitTargetChars))\n useEffect(() => { setSplitTarget(String(settings.blocks.splitTargetChars)) }, [settings.blocks.splitTargetChars])\n const commitSplitTarget = () => {\n const next = clampSplitTargetChars(splitTarget, settings.blocks.splitTargetChars)\n update((draft) => { draft.blocks.splitTargetChars = next })\n setSplitTarget(String(next))\n }\n const { t } = useEditorI18n()\n const structureItems = optionItems(STRUCTURE_MODES, STRUCTURE_MODE_KEYS, t)\n const scopeItems = optionItems(HEADING_CONVERSION_SCOPES, HEADING_SCOPE_KEYS, t)\n const treeRootItems = optionItems(TREE_ROOTS, TREE_ROOT_KEYS, t)\n const kindIconItems = optionItems(KIND_ICON_VISIBILITIES, KIND_ICON_KEYS, t)\n const dragHandleItems = optionItems(DRAG_HANDLE_VISIBILITIES, DRAG_HANDLE_KEYS, t)\n\n return (\n <div className=\"flex flex-col gap-8\">\n <SettingsSection title={t('composites.settings.structure.title')}>\n <RadioField\n legend={t('composites.settings.structure.legend')}\n items={structureItems}\n value={settings.blocks.structure}\n onChange={value => update((draft) => { draft.blocks.structure = value })}\n />\n <RadioField\n legend={t('composites.settings.scope.legend')}\n items={scopeItems}\n value={settings.editing.headingConversionScope}\n onChange={value => update((draft) => { draft.editing.headingConversionScope = value })}\n />\n </SettingsSection>\n\n <SettingsSection title={t('composites.settings.sidebar.title')}>\n <RadioField\n legend={t('composites.settings.treeRoot.legend')}\n items={treeRootItems}\n value={settings.blocks.treeRoot}\n onChange={value => update((draft) => { draft.blocks.treeRoot = value })}\n />\n </SettingsSection>\n\n <SettingsSection title={t('composites.settings.composites.title')}>\n <div className=\"flex items-start justify-between gap-4 py-3\">\n <div className=\"min-w-0 flex-1\">\n <Label id={kindLabelId} className=\"text-sm font-medium text-foreground\">{t('composites.settings.defaultKind.label')}</Label>\n <p className=\"text-sm text-muted-foreground\">{t('composites.settings.defaultKind.description')}</p>\n </div>\n <Select value={settings.blocks.defaultKind} onValueChange={value => update((draft) => { draft.blocks.defaultKind = value })}>\n <SelectTrigger aria-labelledby={kindLabelId} className=\"w-64\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {kinds.map(kind => (\n <SelectItem key={kind.id} value={kind.id}>\n <Icon name={kind.icon} />\n {kind.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n <div className=\"flex items-start justify-between gap-4 py-3\">\n <Label htmlFor={splitTargetId} className=\"min-w-0 flex-1 text-sm font-medium text-foreground\">{t('settings.editing.splitTargetChars')}</Label>\n <Input\n id={splitTargetId}\n type=\"number\"\n min={SPLIT_TARGET_CHARS_MIN}\n max={SPLIT_TARGET_CHARS_MAX}\n step={100}\n className=\"w-32\"\n value={splitTarget}\n onChange={event => setSplitTarget(event.target.value)}\n onBlur={commitSplitTarget}\n onKeyDown={(event) => {\n if (event.key === 'Enter') commitSplitTarget()\n }}\n />\n </div>\n <RadioField\n legend={t('composites.settings.kindIcon.legend')}\n items={kindIconItems}\n value={settings.blocks.kindIcon}\n onChange={value => update((draft) => { draft.blocks.kindIcon = value })}\n />\n <RadioField\n legend={t('composites.settings.dragHandle.legend')}\n items={dragHandleItems}\n value={settings.blocks.dragHandle}\n onChange={value => update((draft) => { draft.blocks.dragHandle = value })}\n />\n </SettingsSection>\n </div>\n )\n}\n"],"mappings":"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"}
@@ -10,6 +10,7 @@ import { CompositeSummaryEditor } from "./react/CompositeSummaryEditor.js";
10
10
  import { CompositeTable } from "./react/CompositeTable.js";
11
11
  import { CompositeTagsEditor } from "./react/CompositeTagsEditor.js";
12
12
  import { CompositeView } from "./react/CompositeView.js";
13
+ import { FocusChip } from "./react/FocusChip.js";
13
14
  import { ReferenceView } from "./react/ReferenceView.js";
14
15
  import { SettingsEditingTab } from "./react/SettingsEditingTab.js";
15
16
  import { useCompositeAnchors } from "./react/use-composite-anchors.js";
@@ -21,5 +22,5 @@ import { useCompositeRows } from "./react/use-composite-rows.js";
21
22
  */
22
23
  export declare function compositeFeature(options?: CompositeFeatureOptions): ReactFeature;
23
24
  //#endregion
24
- export { CompositeChrome, CompositeDetails, CompositeFieldEditor, CompositeInspector, CompositeStatusMenu, CompositeSummaryEditor, CompositeTable, CompositeTagsEditor, CompositeView, ReferenceView, SettingsEditingTab, useCompositeAnchors, useCompositeRows };
25
+ export { CompositeChrome, CompositeDetails, CompositeFieldEditor, CompositeInspector, CompositeStatusMenu, CompositeSummaryEditor, CompositeTable, CompositeTagsEditor, CompositeView, FocusChip, ReferenceView, SettingsEditingTab, useCompositeAnchors, useCompositeRows };
25
26
  //# sourceMappingURL=react.d.ts.map
@@ -9,6 +9,7 @@ import { useCompositeAnchors } from "./react/use-composite-anchors.js";
9
9
  import { CompositeChrome } from "./react/CompositeChrome.js";
10
10
  import { ReferenceView } from "./react/ReferenceView.js";
11
11
  import { CompositeView } from "./react/CompositeView.js";
12
+ import { FocusChip } from "./react/FocusChip.js";
12
13
  import { SettingsEditingTab } from "./react/SettingsEditingTab.js";
13
14
  import { CompositeInspector } from "./react/CompositeInspector.js";
14
15
  import { CompositeTable } from "./react/CompositeTable.js";
@@ -21,6 +22,7 @@ import { ReactNodeViewRenderer } from "@tiptap/react";
21
22
  function compositeFeature(options = {}) {
22
23
  return compositeFeatureCore({
23
24
  chrome: CompositeChrome,
25
+ focusChip: FocusChip,
24
26
  settingsTab: SettingsEditingTab,
25
27
  nodeViews: {
26
28
  composite: ReactNodeViewRenderer(CompositeView),
@@ -29,6 +31,6 @@ function compositeFeature(options = {}) {
29
31
  }, options);
30
32
  }
31
33
  //#endregion
32
- export { CompositeChrome, CompositeDetails, CompositeFieldEditor, CompositeInspector, CompositeStatusMenu, CompositeSummaryEditor, CompositeTable, CompositeTagsEditor, CompositeView, ReferenceView, SettingsEditingTab, compositeFeature, useCompositeAnchors, useCompositeRows };
34
+ export { CompositeChrome, CompositeDetails, CompositeFieldEditor, CompositeInspector, CompositeStatusMenu, CompositeSummaryEditor, CompositeTable, CompositeTagsEditor, CompositeView, FocusChip, ReferenceView, SettingsEditingTab, compositeFeature, useCompositeAnchors, useCompositeRows };
33
35
 
34
36
  //# sourceMappingURL=react.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"react.js","names":[],"sources":["../../../src/features/composites/react.ts"],"sourcesContent":["import type { Editor } from '@tiptap/core'\nimport { ReactNodeViewRenderer } from '@tiptap/react'\nimport type { ComponentType } from 'react'\nimport type { ReactFeature } from '../../react'\nimport { type CompositeFeatureOptions, compositeFeatureCore } from './feature'\nimport { CompositeChrome } from './react/CompositeChrome'\nimport { ReferenceView } from './react/ReferenceView'\nimport { CompositeView } from './react/CompositeView'\nimport { SettingsEditingTab } from './react/SettingsEditingTab'\n\nexport { CompositeChrome } from './react/CompositeChrome'\nexport { CompositeDetails } from './react/CompositeDetails'\nexport { CompositeFieldEditor } from './react/CompositeFieldEditor'\nexport { CompositeInspector } from './react/CompositeInspector'\nexport { CompositeStatusMenu } from './react/CompositeStatusMenu'\nexport { CompositeSummaryEditor } from './react/CompositeSummaryEditor'\nexport { CompositeTable } from './react/CompositeTable'\nexport { CompositeTagsEditor } from './react/CompositeTagsEditor'\nexport { CompositeView } from './react/CompositeView'\nexport { ReferenceView } from './react/ReferenceView'\nexport { SettingsEditingTab } from './react/SettingsEditingTab'\nexport { useCompositeAnchors } from './react/use-composite-anchors'\nexport { useCompositeRows } from './react/use-composite-rows'\n\n/**\n * The React composites feature (shadcn): see `compositeFeatureCore`. The host places `CompositeTable` and\n * `CompositeInspector` beside the editor.\n */\nexport function compositeFeature(options: CompositeFeatureOptions = {}): ReactFeature {\n return compositeFeatureCore<ComponentType<{ editor: Editor }>>({\n chrome: CompositeChrome,\n // A settings tab receives only its descriptor's `props` (`{ kinds }`), not the toolbar's `{ editor }` (see `EditorSettingsPanel`).\n settingsTab: SettingsEditingTab as unknown as ComponentType<{ editor: Editor }>,\n nodeViews: { composite: ReactNodeViewRenderer(CompositeView), reference: ReactNodeViewRenderer(ReferenceView) },\n }, options)\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AA4BA,SAAgB,iBAAiB,UAAmC,CAAC,GAAiB;CACpF,OAAO,qBAAwD;EAC7D,QAAQ;EAER,aAAa;EACb,WAAW;GAAE,WAAW,sBAAsB,aAAa;GAAG,WAAW,sBAAsB,aAAa;EAAE;CAChH,GAAG,OAAO;AACZ"}
1
+ {"version":3,"file":"react.js","names":[],"sources":["../../../src/features/composites/react.ts"],"sourcesContent":["import type { Editor } from '@tiptap/core'\nimport { ReactNodeViewRenderer } from '@tiptap/react'\nimport type { ComponentType } from 'react'\nimport type { ReactFeature } from '../../react'\nimport { type CompositeFeatureOptions, compositeFeatureCore } from './feature'\nimport { CompositeChrome } from './react/CompositeChrome'\nimport { ReferenceView } from './react/ReferenceView'\nimport { CompositeView } from './react/CompositeView'\nimport { FocusChip } from './react/FocusChip'\nimport { SettingsEditingTab } from './react/SettingsEditingTab'\n\nexport { CompositeChrome } from './react/CompositeChrome'\nexport { CompositeDetails } from './react/CompositeDetails'\nexport { CompositeFieldEditor } from './react/CompositeFieldEditor'\nexport { CompositeInspector } from './react/CompositeInspector'\nexport { CompositeStatusMenu } from './react/CompositeStatusMenu'\nexport { CompositeSummaryEditor } from './react/CompositeSummaryEditor'\nexport { CompositeTable } from './react/CompositeTable'\nexport { CompositeTagsEditor } from './react/CompositeTagsEditor'\nexport { CompositeView } from './react/CompositeView'\nexport { FocusChip } from './react/FocusChip'\nexport { ReferenceView } from './react/ReferenceView'\nexport { SettingsEditingTab } from './react/SettingsEditingTab'\nexport { useCompositeAnchors } from './react/use-composite-anchors'\nexport { useCompositeRows } from './react/use-composite-rows'\n\n/**\n * The React composites feature (shadcn): see `compositeFeatureCore`. The host places `CompositeTable` and\n * `CompositeInspector` beside the editor.\n */\nexport function compositeFeature(options: CompositeFeatureOptions = {}): ReactFeature {\n return compositeFeatureCore<ComponentType<{ editor: Editor }>>({\n chrome: CompositeChrome,\n focusChip: FocusChip,\n // A settings tab receives only its descriptor's `props` (`{ kinds }`), not the toolbar's `{ editor }` (see `EditorSettingsPanel`).\n settingsTab: SettingsEditingTab as unknown as ComponentType<{ editor: Editor }>,\n nodeViews: { composite: ReactNodeViewRenderer(CompositeView), reference: ReactNodeViewRenderer(ReferenceView) },\n }, options)\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AA8BA,SAAgB,iBAAiB,UAAmC,CAAC,GAAiB;CACpF,OAAO,qBAAwD;EAC7D,QAAQ;EACR,WAAW;EAEX,aAAa;EACb,WAAW;GAAE,WAAW,sBAAsB,aAAa;GAAG,WAAW,sBAAsB,aAAa;EAAE;CAChH,GAAG,OAAO;AACZ"}
@@ -1,13 +1,14 @@
1
1
  import { CSL_TYPES, CslDate, CslItem, CslName, CslType } from "../../core/backend-types.js";
2
2
  import { CompositeAiBrief, compositeAiBrief } from "./ai-brief.js";
3
3
  import { CompositeKind, CompositeKindAi, CompositeMetaField, SOURCE_MEDIA_TYPES, compositeKind, defaultCompositeKinds, kindAccepts } from "./kinds.js";
4
- import { COMPOSITE_CHROME_COUNT, CompositeDescriptionNode, CompositeNode, CompositeOptions, CompositeStorage, CompositeTagsNode, CompositeTitleNode, compositeJSON, compositeKindsOf } from "./nodes.js";
4
+ import { BASKET_IDS, Basket, basketById, basketOf, defaultBaskets, titleHiddenOf } from "./baskets.js";
5
+ import { COMPOSITE_CHROME_COUNT, CompositeDescriptionNode, CompositeNode, CompositeOptions, CompositeStorage, CompositeTagsNode, CompositeTitleNode, compositeBasketsOf, compositeJSON, compositeKindsOf } from "./nodes.js";
5
6
  import { REFERENCE_NODE, ReferenceAttrs, ReferenceNode, ReferenceOptions, ReferenceSuggestionPluginKey, referenceMarkdown } from "./reference.js";
6
7
  import { compositeConversions, convertCompositeBlocks } from "./convert.js";
7
8
  import { CompositeFence, FenceSegment, splitCompositeFences } from "../../core/fences.js";
8
9
  import { blocksFromMarkdown, compositeFence, compositeFromMarkdown } from "./fences.js";
9
10
  import { compositeChromeBlocks, flattenCompositesToHeadings, groupHeadingsIntoComposites, headingGroupRange, structureBlocks } from "./heading-composites.js";
10
- import { BIB_KEY, DERIVATION_KEY } from "./meta-keys.js";
11
+ import { BASKET_KEY, BIB_KEY, DERIVATION_KEY, TITLE_HIDDEN_KEY } from "./meta-keys.js";
11
12
  import { bibOf, bibtexOf, citeFull, citeShort, cslOf, cslTypeOptions, yearOf } from "./bibliography.js";
12
13
  import { Derivation, DerivationMethod, DerivationSource, bodyMarkdown, derivationOf, derivationState, renditionsOf, sourceOf } from "./derivation.js";
13
14
  import { LEGACY_COMPOSITE_NODE, migrateLegacyContent } from "./legacy.js";
@@ -21,7 +22,8 @@ import { AnyExtension } from "@tiptap/core";
21
22
  */
22
23
  export declare function compositeSchemaExtensions(options?: {
23
24
  kinds?: readonly CompositeKind[];
25
+ baskets?: readonly Basket[];
24
26
  }): AnyExtension[];
25
27
  //#endregion
26
- export { BIB_KEY, COMPOSITE_CHROME_COUNT, CSL_TYPES, type CompositeAiBrief, CompositeDescriptionNode, type CompositeFence, type CompositeKind, type CompositeKindAi, type CompositeMetaField, CompositeNode, type CompositeOptions, type CompositeStorage, CompositeTagsNode, CompositeTitleNode, type CslDate, type CslItem, type CslName, type CslType, DERIVATION_KEY, type Derivation, type DerivationMethod, type DerivationSource, type FenceSegment, LEGACY_COMPOSITE_NODE, REFERENCE_NODE, type ReferenceAttrs, ReferenceNode, type ReferenceOptions, ReferenceSuggestionPluginKey, SOURCE_MEDIA_TYPES, bibOf, bibtexOf, blocksFromMarkdown, bodyMarkdown, citeFull, citeShort, collectCompositeIds, compositeAiBrief, compositeChromeBlocks, compositeConversions, compositeFence, compositeFromMarkdown, compositeIdsOf, compositeJSON, compositeKind, compositeKindsOf, convertCompositeBlocks, cslOf, cslTypeOptions, defaultCompositeKinds, derivationOf, derivationState, flattenCompositesToHeadings, groupHeadingsIntoComposites, headingGroupRange, kindAccepts, migrateLegacyContent, normalizeReferences, referenceMarkdown, referencesFromText, renditionsOf, sourceOf, splitCompositeFences, structureBlocks, yearOf };
28
+ export { BASKET_IDS, BASKET_KEY, BIB_KEY, type Basket, COMPOSITE_CHROME_COUNT, CSL_TYPES, type CompositeAiBrief, CompositeDescriptionNode, type CompositeFence, type CompositeKind, type CompositeKindAi, type CompositeMetaField, CompositeNode, type CompositeOptions, type CompositeStorage, CompositeTagsNode, CompositeTitleNode, type CslDate, type CslItem, type CslName, type CslType, DERIVATION_KEY, type Derivation, type DerivationMethod, type DerivationSource, type FenceSegment, LEGACY_COMPOSITE_NODE, REFERENCE_NODE, type ReferenceAttrs, ReferenceNode, type ReferenceOptions, ReferenceSuggestionPluginKey, SOURCE_MEDIA_TYPES, TITLE_HIDDEN_KEY, basketById, basketOf, bibOf, bibtexOf, blocksFromMarkdown, bodyMarkdown, citeFull, citeShort, collectCompositeIds, compositeAiBrief, compositeBasketsOf, compositeChromeBlocks, compositeConversions, compositeFence, compositeFromMarkdown, compositeIdsOf, compositeJSON, compositeKind, compositeKindsOf, convertCompositeBlocks, cslOf, cslTypeOptions, defaultBaskets, defaultCompositeKinds, derivationOf, derivationState, flattenCompositesToHeadings, groupHeadingsIntoComposites, headingGroupRange, kindAccepts, migrateLegacyContent, normalizeReferences, referenceMarkdown, referencesFromText, renditionsOf, sourceOf, splitCompositeFences, structureBlocks, titleHiddenOf, yearOf };
27
29
  //# sourceMappingURL=schema.d.ts.map
@@ -1,10 +1,11 @@
1
1
  import { splitCompositeFences } from "../../core/fences.js";
2
2
  import { SOURCE_MEDIA_TYPES, compositeKind, defaultCompositeKinds, kindAccepts } from "./kinds.js";
3
- import { BIB_KEY, DERIVATION_KEY } from "./meta-keys.js";
3
+ import { BASKET_KEY, BIB_KEY, DERIVATION_KEY, TITLE_HIDDEN_KEY } from "./meta-keys.js";
4
4
  import { blocksFromMarkdown, compositeFence, compositeFromMarkdown } from "./fences.js";
5
+ import { BASKET_IDS, basketById, basketOf, defaultBaskets, titleHiddenOf } from "./baskets.js";
5
6
  import { bodyMarkdown, derivationOf, derivationState, renditionsOf, sourceOf } from "./derivation.js";
6
7
  import { compositeChromeBlocks, flattenCompositesToHeadings, groupHeadingsIntoComposites, headingGroupRange, structureBlocks } from "./heading-composites.js";
7
- import { COMPOSITE_CHROME_COUNT, CompositeDescriptionNode, CompositeNode, CompositeTagsNode, CompositeTitleNode, compositeJSON, compositeKindsOf } from "./nodes.js";
8
+ import { COMPOSITE_CHROME_COUNT, CompositeDescriptionNode, CompositeNode, CompositeTagsNode, CompositeTitleNode, compositeBasketsOf, compositeJSON, compositeKindsOf } from "./nodes.js";
8
9
  import { REFERENCE_NODE, ReferenceNode, ReferenceSuggestionPluginKey, referenceMarkdown } from "./reference.js";
9
10
  import { CSL_TYPES } from "../../core/backend-types.js";
10
11
  import { bibOf, bibtexOf, citeFull, citeShort, cslOf, cslTypeOptions, yearOf } from "./bibliography.js";
@@ -20,7 +21,10 @@ import { collectCompositeIds, compositeIdsOf, normalizeReferences, referencesFro
20
21
  */
21
22
  function compositeSchemaExtensions(options = {}) {
22
23
  return [
23
- CompositeNode.configure(options.kinds ? { kinds: options.kinds } : {}),
24
+ CompositeNode.configure({
25
+ ...options.kinds && { kinds: options.kinds },
26
+ ...options.baskets && { baskets: options.baskets }
27
+ }),
24
28
  CompositeTitleNode,
25
29
  CompositeDescriptionNode,
26
30
  CompositeTagsNode,
@@ -28,6 +32,6 @@ function compositeSchemaExtensions(options = {}) {
28
32
  ];
29
33
  }
30
34
  //#endregion
31
- export { BIB_KEY, COMPOSITE_CHROME_COUNT, CSL_TYPES, CompositeDescriptionNode, CompositeNode, CompositeTagsNode, CompositeTitleNode, DERIVATION_KEY, LEGACY_COMPOSITE_NODE, REFERENCE_NODE, ReferenceNode, ReferenceSuggestionPluginKey, SOURCE_MEDIA_TYPES, bibOf, bibtexOf, blocksFromMarkdown, bodyMarkdown, citeFull, citeShort, collectCompositeIds, compositeAiBrief, compositeChromeBlocks, compositeConversions, compositeFence, compositeFromMarkdown, compositeIdsOf, compositeJSON, compositeKind, compositeKindsOf, compositeSchemaExtensions, convertCompositeBlocks, cslOf, cslTypeOptions, defaultCompositeKinds, derivationOf, derivationState, flattenCompositesToHeadings, groupHeadingsIntoComposites, headingGroupRange, kindAccepts, migrateLegacyContent, normalizeReferences, referenceMarkdown, referencesFromText, renditionsOf, sourceOf, splitCompositeFences, structureBlocks, yearOf };
35
+ export { BASKET_IDS, BASKET_KEY, BIB_KEY, COMPOSITE_CHROME_COUNT, CSL_TYPES, CompositeDescriptionNode, CompositeNode, CompositeTagsNode, CompositeTitleNode, DERIVATION_KEY, LEGACY_COMPOSITE_NODE, REFERENCE_NODE, ReferenceNode, ReferenceSuggestionPluginKey, SOURCE_MEDIA_TYPES, TITLE_HIDDEN_KEY, basketById, basketOf, bibOf, bibtexOf, blocksFromMarkdown, bodyMarkdown, citeFull, citeShort, collectCompositeIds, compositeAiBrief, compositeBasketsOf, compositeChromeBlocks, compositeConversions, compositeFence, compositeFromMarkdown, compositeIdsOf, compositeJSON, compositeKind, compositeKindsOf, compositeSchemaExtensions, convertCompositeBlocks, cslOf, cslTypeOptions, defaultBaskets, defaultCompositeKinds, derivationOf, derivationState, flattenCompositesToHeadings, groupHeadingsIntoComposites, headingGroupRange, kindAccepts, migrateLegacyContent, normalizeReferences, referenceMarkdown, referencesFromText, renditionsOf, sourceOf, splitCompositeFences, structureBlocks, titleHiddenOf, yearOf };
32
36
 
33
37
  //# sourceMappingURL=schema.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"schema.js","names":[],"sources":["../../../src/features/composites/schema.ts"],"sourcesContent":["// Vue-free entry of the composite feature (`@ecsplico/editor/composites/schema`): the node family, kinds, Markdown\n// fences, legacy migration, heading↔composite transforms and conversions. Servers build their schema from it; it never\n// imports node views, components or the feature factory.\nimport type { AnyExtension } from '@tiptap/core'\nimport { type CompositeKind } from './kinds'\nimport { CompositeNode, CompositeDescriptionNode, CompositeTagsNode, CompositeTitleNode } from './nodes'\nimport { ReferenceNode } from './reference'\n\nexport { type CompositeAiBrief, compositeAiBrief } from './ai-brief'\nexport { compositeConversions, convertCompositeBlocks } from './convert'\nexport { blocksFromMarkdown, type CompositeFence, compositeFence, compositeFromMarkdown, type FenceSegment, splitCompositeFences } from './fences'\nexport { compositeChromeBlocks, flattenCompositesToHeadings, groupHeadingsIntoComposites, headingGroupRange, structureBlocks } from './heading-composites'\nexport { BIB_KEY, bibOf, bibtexOf, citeFull, citeShort, type CslDate, type CslItem, type CslName, type CslType, CSL_TYPES, cslOf, cslTypeOptions, yearOf } from './bibliography'\nexport { bodyMarkdown, DERIVATION_KEY, type Derivation, derivationOf, derivationState, type DerivationMethod, type DerivationSource, renditionsOf, sourceOf } from './derivation'\nexport { type CompositeKind, type CompositeKindAi, type CompositeMetaField, compositeKind, defaultCompositeKinds, kindAccepts, SOURCE_MEDIA_TYPES } from './kinds'\nexport { LEGACY_COMPOSITE_NODE, migrateLegacyContent } from './legacy'\nexport { REFERENCE_NODE, type ReferenceAttrs, referenceMarkdown, ReferenceNode, type ReferenceOptions, ReferenceSuggestionPluginKey } from './reference'\nexport { compositeIdsOf, collectCompositeIds, normalizeReferences, referencesFromText } from './reference-text'\nexport {\n COMPOSITE_CHROME_COUNT,\n compositeJSON,\n compositeKindsOf,\n CompositeDescriptionNode,\n CompositeNode,\n type CompositeOptions,\n type CompositeStorage,\n CompositeTagsNode,\n CompositeTitleNode,\n} from './nodes'\n\n/**\n * The schema-bearing composite family (composite, title, description, tags, and the inline `reference` chip) without node views, to append to\n * `coreSchemaExtensions()`: `getSchema([...coreSchemaExtensions(), ...compositeSchemaExtensions({ kinds })])`. `kinds`\n * is the host's kind list (default: the built-in kinds in German, `defaultCompositeKinds`); it is storage, not schema.\n */\nexport function compositeSchemaExtensions(options: { kinds?: readonly CompositeKind[] } = {}): AnyExtension[] {\n return [CompositeNode.configure(options.kinds ? { kinds: options.kinds } : {}), CompositeTitleNode, CompositeDescriptionNode, CompositeTagsNode, ReferenceNode]\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAmCA,SAAgB,0BAA0B,UAAgD,CAAC,GAAmB;CAC5G,OAAO;EAAC,cAAc,UAAU,QAAQ,QAAQ,EAAE,OAAO,QAAQ,MAAM,IAAI,CAAC,CAAC;EAAG;EAAoB;EAA0B;EAAmB;CAAa;AAChK"}
1
+ {"version":3,"file":"schema.js","names":[],"sources":["../../../src/features/composites/schema.ts"],"sourcesContent":["// Vue-free entry of the composite feature (`@ecsplico/editor/composites/schema`): the node family, kinds, Markdown\n// fences, legacy migration, heading↔composite transforms and conversions. Servers build their schema from it; it never\n// imports node views, components or the feature factory.\nimport type { AnyExtension } from '@tiptap/core'\nimport type { Basket } from './baskets'\nimport { type CompositeKind } from './kinds'\nimport { CompositeNode, CompositeDescriptionNode, CompositeTagsNode, CompositeTitleNode } from './nodes'\nimport { ReferenceNode } from './reference'\n\nexport { type CompositeAiBrief, compositeAiBrief } from './ai-brief'\nexport { type Basket, BASKET_IDS, basketById, basketOf, defaultBaskets, titleHiddenOf } from './baskets'\nexport { compositeConversions, convertCompositeBlocks } from './convert'\nexport { blocksFromMarkdown, type CompositeFence, compositeFence, compositeFromMarkdown, type FenceSegment, splitCompositeFences } from './fences'\nexport { compositeChromeBlocks, flattenCompositesToHeadings, groupHeadingsIntoComposites, headingGroupRange, structureBlocks } from './heading-composites'\nexport { BIB_KEY, bibOf, bibtexOf, citeFull, citeShort, type CslDate, type CslItem, type CslName, type CslType, CSL_TYPES, cslOf, cslTypeOptions, yearOf } from './bibliography'\nexport { bodyMarkdown, DERIVATION_KEY, type Derivation, derivationOf, derivationState, type DerivationMethod, type DerivationSource, renditionsOf, sourceOf } from './derivation'\nexport { type CompositeKind, type CompositeKindAi, type CompositeMetaField, compositeKind, defaultCompositeKinds, kindAccepts, SOURCE_MEDIA_TYPES } from './kinds'\nexport { BASKET_KEY, TITLE_HIDDEN_KEY } from './meta-keys'\nexport { LEGACY_COMPOSITE_NODE, migrateLegacyContent } from './legacy'\nexport { REFERENCE_NODE, type ReferenceAttrs, referenceMarkdown, ReferenceNode, type ReferenceOptions, ReferenceSuggestionPluginKey } from './reference'\nexport { compositeIdsOf, collectCompositeIds, normalizeReferences, referencesFromText } from './reference-text'\nexport {\n COMPOSITE_CHROME_COUNT,\n compositeJSON,\n compositeBasketsOf,\n compositeKindsOf,\n CompositeDescriptionNode,\n CompositeNode,\n type CompositeOptions,\n type CompositeStorage,\n CompositeTagsNode,\n CompositeTitleNode,\n} from './nodes'\n\n/**\n * The schema-bearing composite family (composite, title, description, tags, and the inline `reference` chip) without node views, to append to\n * `coreSchemaExtensions()`: `getSchema([...coreSchemaExtensions(), ...compositeSchemaExtensions({ kinds })])`. `kinds`\n * is the host's kind list (default: the built-in kinds in German, `defaultCompositeKinds`); it is storage, not schema.\n */\nexport function compositeSchemaExtensions(options: { kinds?: readonly CompositeKind[], baskets?: readonly Basket[] } = {}): AnyExtension[] {\n return [CompositeNode.configure({ ...(options.kinds && { kinds: options.kinds }), ...(options.baskets && { baskets: options.baskets }) }), CompositeTitleNode, CompositeDescriptionNode, CompositeTagsNode, ReferenceNode]\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAuCA,SAAgB,0BAA0B,UAA6E,CAAC,GAAmB;CACzI,OAAO;EAAC,cAAc,UAAU;GAAE,GAAI,QAAQ,SAAS,EAAE,OAAO,QAAQ,MAAM;GAAI,GAAI,QAAQ,WAAW,EAAE,SAAS,QAAQ,QAAQ;EAAG,CAAC;EAAG;EAAoB;EAA0B;EAAmB;CAAa;AAC3N"}
@@ -0,0 +1,62 @@
1
+ import { CompositeKind } from "./kinds.js";
2
+ import { Extension } from "@tiptap/core";
3
+ import { Node as Node$1, Schema } from "@tiptap/pm/model";
4
+ //#region src/features/composites/split.d.ts
5
+ /** Where the parts of a split go: next to the split Baustein (`siblings`) or into it as sub-Bausteine (`children`). */
6
+ export type SplitMode = 'siblings' | 'children';
7
+ /**
8
+ * Groups `blocks` in order so that no group exceeds `targetChars` text characters, never splitting inside a block: a
9
+ * new group starts when adding the block would exceed the target and the group is not empty, so a single block longer
10
+ * than the target forms a group of its own.
11
+ */
12
+ export declare function splitBodyByLength(blocks: readonly Node$1[], targetChars: number): Node$1[][];
13
+ /**
14
+ * Title for a part holding `blocks`: the first sentence of its first textblock (up to the first `.`, `!` or `?` that
15
+ * is followed by white space or ends the text; the mark itself is left out), at most 60 characters, `…` appended when
16
+ * cut. '' when the blocks hold no text.
17
+ */
18
+ export declare function generatedTitle(blocks: readonly Node$1[]): string;
19
+ /**
20
+ * Kind of the sub-Bausteine a split of a `parentKind` Baustein creates: `defaultKind` when the parent accepts it, else
21
+ * the parent's own kind when it accepts itself, else null (the split is refused).
22
+ */
23
+ export declare function childKindFor(kinds: readonly CompositeKind[], parentKind: string, defaultKind: string): string | null;
24
+ /**
25
+ * The nodes that replace `composite` once its body is cut into `groups` (in order, each non-empty).
26
+ * - `children`: one node, `composite` with its own title, description, tags and meta whose body is one new Baustein of
27
+ * `childKind` per group.
28
+ * - `siblings`: `composite` itself keeping the first group, then one new Baustein of the same kind per further group.
29
+ * New parts carry a generated title, hidden when `hideTitles`, and no block id.
30
+ */
31
+ export declare function splitComposite(schema: Schema, composite: Node$1, groups: readonly (readonly Node$1[])[], mode: SplitMode, childKind: string, hideTitles: boolean): Node$1[];
32
+ declare module '@tiptap/core' {
33
+ interface Commands<ReturnType> {
34
+ compositeSplit: {
35
+ /**
36
+ * Split the caret's innermost Baustein in front of the body block holding the caret (refused when that is the first body block or the caret is not in a body): the part before and the part from the caret on become sibling Bausteine or sub-Bausteine (`children`, of the default kind or the parent's own; refused when neither is accepted). The caret moves into the new part.
37
+ */
38
+ splitCompositeAtCaret: (options: {
39
+ mode: SplitMode;
40
+ }) => ReturnType;
41
+ /**
42
+ * Split the Baustein at `pos` (default: the caret's innermost one) into parts of about `targetChars` characters (default: setting `blocks.splitTargetChars`) without cutting inside a block. Refused with fewer than two parts, or in `children` mode when no child kind is accepted. The generated titles are hidden.
43
+ */
44
+ splitCompositeByLength: (options: {
45
+ mode: SplitMode;
46
+ targetChars?: number;
47
+ pos?: number;
48
+ }) => ReturnType;
49
+ };
50
+ }
51
+ }
52
+ /** Options of `CompositeSplit`: read on every use, so a changed setting applies without recreating the editor. */
53
+ export interface CompositeSplitOptions {
54
+ /** Kind of the sub-Bausteine a `children` split creates when the parent accepts it (setting `blocks.defaultKind`). */
55
+ defaultKind: () => string;
56
+ /** Target size in characters of a length split (setting `blocks.splitTargetChars`). */
57
+ targetChars: () => number;
58
+ }
59
+ /** Client-only, no schema: the split commands of Bausteine. */
60
+ export declare const CompositeSplit: Extension<CompositeSplitOptions, any>;
61
+ //#endregion
62
+ //# sourceMappingURL=split.d.ts.map
@@ -0,0 +1,172 @@
1
+ import { EDITOR_SETTINGS_DEFAULTS } from "../../settings/index.js";
2
+ import { kindAccepts } from "./kinds.js";
3
+ import { TITLE_HIDDEN_KEY } from "./meta-keys.js";
4
+ import { compositeAround, compositeKindsOf } from "./nodes.js";
5
+ import { Extension } from "@tiptap/core";
6
+ import { TextSelection } from "@tiptap/pm/state";
7
+ import { Fragment } from "@tiptap/pm/model";
8
+ //#region src/features/composites/split.ts
9
+ /** Longest generated title; a longer first sentence is cut and ends in `…`. */
10
+ const TITLE_MAX_CHARS = 60;
11
+ /**
12
+ * Groups `blocks` in order so that no group exceeds `targetChars` text characters, never splitting inside a block: a
13
+ * new group starts when adding the block would exceed the target and the group is not empty, so a single block longer
14
+ * than the target forms a group of its own.
15
+ */
16
+ function splitBodyByLength(blocks, targetChars) {
17
+ const groups = [];
18
+ let current = [];
19
+ let size = 0;
20
+ for (const block of blocks) {
21
+ const chars = block.textContent.length;
22
+ if (current.length && size + chars > targetChars) {
23
+ groups.push(current);
24
+ current = [];
25
+ size = 0;
26
+ }
27
+ current.push(block);
28
+ size += chars;
29
+ }
30
+ if (current.length) groups.push(current);
31
+ return groups;
32
+ }
33
+ /** Text of the first non-empty textblock in `blocks` (nested ones included), or ''. */
34
+ function firstText(blocks) {
35
+ let found = "";
36
+ for (const block of blocks) {
37
+ if (block.isTextblock) found = block.textContent.trim();
38
+ else block.descendants((node) => {
39
+ if (found) return false;
40
+ if (node.isTextblock) found = node.textContent.trim();
41
+ return !node.isTextblock;
42
+ });
43
+ if (found) return found;
44
+ }
45
+ return "";
46
+ }
47
+ /**
48
+ * Title for a part holding `blocks`: the first sentence of its first textblock (up to the first `.`, `!` or `?` that
49
+ * is followed by white space or ends the text; the mark itself is left out), at most 60 characters, `…` appended when
50
+ * cut. '' when the blocks hold no text.
51
+ */
52
+ function generatedTitle(blocks) {
53
+ const text = firstText(blocks).replace(/\s+/g, " ");
54
+ const end = text.search(/[.!?](?=\s|$)/);
55
+ const sentence = (end === -1 ? text : text.slice(0, end)).trim();
56
+ return sentence.length > TITLE_MAX_CHARS ? `${sentence.slice(0, TITLE_MAX_CHARS).trimEnd()}…` : sentence;
57
+ }
58
+ /**
59
+ * Kind of the sub-Bausteine a split of a `parentKind` Baustein creates: `defaultKind` when the parent accepts it, else
60
+ * the parent's own kind when it accepts itself, else null (the split is refused).
61
+ */
62
+ function childKindFor(kinds, parentKind, defaultKind) {
63
+ if (kindAccepts(kinds, parentKind, defaultKind)) return defaultKind;
64
+ if (kindAccepts(kinds, parentKind, parentKind)) return parentKind;
65
+ return null;
66
+ }
67
+ function chromeOf(composite) {
68
+ const chrome = [];
69
+ for (let i = 0; i < 3; i++) chrome.push(composite.child(i));
70
+ return chrome;
71
+ }
72
+ function bodyOf(composite) {
73
+ const body = [];
74
+ composite.forEach((child, _offset, index) => {
75
+ if (index >= 3) body.push(child);
76
+ });
77
+ return body;
78
+ }
79
+ /** A new Baustein of `kind` holding `group`, titled by `generatedTitle(group)`. */
80
+ function newPart(schema, kind, group, hideTitle) {
81
+ const { nodes } = schema;
82
+ const title = generatedTitle(group);
83
+ return nodes.composite.create({
84
+ kind,
85
+ meta: hideTitle ? { [TITLE_HIDDEN_KEY]: true } : {}
86
+ }, [
87
+ nodes.compositeTitle.create(null, title ? schema.text(title) : null),
88
+ nodes.compositeDescription.create(),
89
+ nodes.compositeTags.create(),
90
+ ...group.length ? group : [nodes.paragraph.create()]
91
+ ]);
92
+ }
93
+ /**
94
+ * The nodes that replace `composite` once its body is cut into `groups` (in order, each non-empty).
95
+ * - `children`: one node, `composite` with its own title, description, tags and meta whose body is one new Baustein of
96
+ * `childKind` per group.
97
+ * - `siblings`: `composite` itself keeping the first group, then one new Baustein of the same kind per further group.
98
+ * New parts carry a generated title, hidden when `hideTitles`, and no block id.
99
+ */
100
+ function splitComposite(schema, composite, groups, mode, childKind, hideTitles) {
101
+ const chrome = chromeOf(composite);
102
+ if (mode === "children") return [composite.copy(Fragment.from([...chrome, ...groups.map((group) => newPart(schema, childKind, group, hideTitles))]))];
103
+ const [first = [], ...rest] = groups;
104
+ return [composite.copy(Fragment.from([...chrome, ...first.length ? first : [schema.nodes.paragraph.create()]])), ...rest.map((group) => newPart(schema, composite.attrs.kind, group, hideTitles))];
105
+ }
106
+ /** The composite whose content starts at `pos` in `state`, or the caret's innermost one when `pos` is undefined. */
107
+ function targetComposite(state, pos) {
108
+ if (pos === void 0) return compositeAround(state.selection.$head);
109
+ const node = state.doc.nodeAt(pos);
110
+ return node?.type.name === "composite" ? {
111
+ pos,
112
+ node
113
+ } : null;
114
+ }
115
+ /** Position right in front of the body of `composite`, which starts at `pos`. */
116
+ function bodyStartOf(pos, composite) {
117
+ return pos + 1 + chromeOf(composite).reduce((size, child) => size + child.nodeSize, 0);
118
+ }
119
+ /** Position in front of the body of the last part among `nodes`, which replaced a composite starting at `pos`. */
120
+ function lastPartBodyStart(pos, nodes, mode) {
121
+ if (mode === "children") {
122
+ const parent = nodes[0];
123
+ const last = parent.lastChild;
124
+ return bodyStartOf(pos + parent.nodeSize - 1 - last.nodeSize, last);
125
+ }
126
+ const last = nodes[nodes.length - 1];
127
+ return bodyStartOf(pos + nodes.reduce((size, node) => size + node.nodeSize, 0) - last.nodeSize, last);
128
+ }
129
+ /** Client-only, no schema: the split commands of Bausteine. */
130
+ const CompositeSplit = Extension.create({
131
+ name: "compositeSplit",
132
+ addOptions: () => ({
133
+ defaultKind: () => EDITOR_SETTINGS_DEFAULTS.blocks.defaultKind,
134
+ targetChars: () => EDITOR_SETTINGS_DEFAULTS.blocks.splitTargetChars
135
+ }),
136
+ addCommands() {
137
+ /** The kind of the sub-Bausteine (`children`) or of the composite itself (`siblings`); null when a `children` split has no accepted kind. */
138
+ const partKind = (composite, mode) => mode === "siblings" ? composite.attrs.kind : childKindFor(compositeKindsOf(this.editor), composite.attrs.kind, this.options.defaultKind());
139
+ return {
140
+ splitCompositeAtCaret: ({ mode }) => ({ state, tr, dispatch }) => {
141
+ const { $head } = state.selection;
142
+ const found = compositeAround($head);
143
+ if (!found) return false;
144
+ const index = $head.index(found.depth) - 3;
145
+ if (index < 1) return false;
146
+ const kind = partKind(found.node, mode);
147
+ if (kind === null) return false;
148
+ if (dispatch) {
149
+ const body = bodyOf(found.node);
150
+ const nodes = splitComposite(state.schema, found.node, [body.slice(0, index), body.slice(index)], mode, kind, true);
151
+ tr.replaceWith(found.pos, found.pos + found.node.nodeSize, nodes);
152
+ tr.setSelection(TextSelection.near(tr.doc.resolve(lastPartBodyStart(found.pos, nodes, mode))));
153
+ }
154
+ return true;
155
+ },
156
+ splitCompositeByLength: ({ mode, targetChars, pos }) => ({ state, tr, dispatch }) => {
157
+ const found = targetComposite(state, pos);
158
+ if (!found) return false;
159
+ const groups = splitBodyByLength(bodyOf(found.node), targetChars ?? this.options.targetChars());
160
+ if (groups.length < 2) return false;
161
+ const kind = partKind(found.node, mode);
162
+ if (kind === null) return false;
163
+ if (dispatch) tr.replaceWith(found.pos, found.pos + found.node.nodeSize, splitComposite(state.schema, found.node, groups, mode, kind, true));
164
+ return true;
165
+ }
166
+ };
167
+ }
168
+ });
169
+ //#endregion
170
+ export { CompositeSplit, childKindFor, generatedTitle, splitBodyByLength, splitComposite };
171
+
172
+ //# sourceMappingURL=split.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"split.js","names":[],"sources":["../../../src/features/composites/split.ts"],"sourcesContent":["// Splitting a Baustein: at the caret or by length, into sibling Bausteine or into sub-Bausteine. The pure parts\n// (`splitBodyByLength`, `generatedTitle`, `childKindFor`, `splitComposite`) know nothing about the editor; the\n// `CompositeSplit` extension wraps them into commands. Generated parts get a title from their first sentence and hide it.\nimport { Extension } from '@tiptap/core'\nimport { Fragment, type Node as PMNode, type Schema } from '@tiptap/pm/model'\nimport { type EditorState, TextSelection } from '@tiptap/pm/state'\nimport { EDITOR_SETTINGS_DEFAULTS } from '../../settings'\nimport { type CompositeKind, kindAccepts } from './kinds'\nimport { TITLE_HIDDEN_KEY } from './meta-keys'\nimport { COMPOSITE_CHROME_COUNT, compositeAround, compositeKindsOf } from './nodes'\n\n/** Where the parts of a split go: next to the split Baustein (`siblings`) or into it as sub-Bausteine (`children`). */\nexport type SplitMode = 'siblings' | 'children'\n\n/** Longest generated title; a longer first sentence is cut and ends in `…`. */\nconst TITLE_MAX_CHARS = 60\n\n/**\n * Groups `blocks` in order so that no group exceeds `targetChars` text characters, never splitting inside a block: a\n * new group starts when adding the block would exceed the target and the group is not empty, so a single block longer\n * than the target forms a group of its own.\n */\nexport function splitBodyByLength(blocks: readonly PMNode[], targetChars: number): PMNode[][] {\n const groups: PMNode[][] = []\n let current: PMNode[] = []\n let size = 0\n for (const block of blocks) {\n const chars = block.textContent.length\n if (current.length && size + chars > targetChars) {\n groups.push(current)\n current = []\n size = 0\n }\n current.push(block)\n size += chars\n }\n if (current.length) groups.push(current)\n return groups\n}\n\n/** Text of the first non-empty textblock in `blocks` (nested ones included), or ''. */\nfunction firstText(blocks: readonly PMNode[]): string {\n let found = ''\n for (const block of blocks) {\n if (block.isTextblock) found = block.textContent.trim()\n else block.descendants((node) => {\n if (found) return false\n if (node.isTextblock) found = node.textContent.trim()\n return !node.isTextblock\n })\n if (found) return found\n }\n return ''\n}\n\n/**\n * Title for a part holding `blocks`: the first sentence of its first textblock (up to the first `.`, `!` or `?` that\n * is followed by white space or ends the text; the mark itself is left out), at most 60 characters, `…` appended when\n * cut. '' when the blocks hold no text.\n */\nexport function generatedTitle(blocks: readonly PMNode[]): string {\n const text = firstText(blocks).replace(/\\s+/g, ' ')\n const end = text.search(/[.!?](?=\\s|$)/)\n const sentence = (end === -1 ? text : text.slice(0, end)).trim()\n return sentence.length > TITLE_MAX_CHARS ? `${sentence.slice(0, TITLE_MAX_CHARS).trimEnd()}…` : sentence\n}\n\n/**\n * Kind of the sub-Bausteine a split of a `parentKind` Baustein creates: `defaultKind` when the parent accepts it, else\n * the parent's own kind when it accepts itself, else null (the split is refused).\n */\nexport function childKindFor(kinds: readonly CompositeKind[], parentKind: string, defaultKind: string): string | null {\n if (kindAccepts(kinds, parentKind, defaultKind)) return defaultKind\n if (kindAccepts(kinds, parentKind, parentKind)) return parentKind\n return null\n}\n\nfunction chromeOf(composite: PMNode): PMNode[] {\n const chrome: PMNode[] = []\n for (let i = 0; i < COMPOSITE_CHROME_COUNT; i++) chrome.push(composite.child(i))\n return chrome\n}\n\nfunction bodyOf(composite: PMNode): PMNode[] {\n const body: PMNode[] = []\n composite.forEach((child, _offset, index) => {\n if (index >= COMPOSITE_CHROME_COUNT) body.push(child)\n })\n return body\n}\n\n/** A new Baustein of `kind` holding `group`, titled by `generatedTitle(group)`. */\nfunction newPart(schema: Schema, kind: string, group: readonly PMNode[], hideTitle: boolean): PMNode {\n const { nodes } = schema\n const title = generatedTitle(group)\n return nodes.composite!.create({ kind, meta: hideTitle ? { [TITLE_HIDDEN_KEY]: true } : {} }, [\n nodes.compositeTitle!.create(null, title ? schema.text(title) : null),\n nodes.compositeDescription!.create(),\n nodes.compositeTags!.create(),\n ...(group.length ? group : [nodes.paragraph!.create()]),\n ])\n}\n\n/**\n * The nodes that replace `composite` once its body is cut into `groups` (in order, each non-empty).\n * - `children`: one node, `composite` with its own title, description, tags and meta whose body is one new Baustein of\n * `childKind` per group.\n * - `siblings`: `composite` itself keeping the first group, then one new Baustein of the same kind per further group.\n * New parts carry a generated title, hidden when `hideTitles`, and no block id.\n */\nexport function splitComposite(schema: Schema, composite: PMNode, groups: readonly (readonly PMNode[])[], mode: SplitMode, childKind: string, hideTitles: boolean): PMNode[] {\n const chrome = chromeOf(composite)\n if (mode === 'children') return [composite.copy(Fragment.from([...chrome, ...groups.map(group => newPart(schema, childKind, group, hideTitles))]))]\n const [first = [], ...rest] = groups\n return [\n composite.copy(Fragment.from([...chrome, ...(first.length ? first : [schema.nodes.paragraph!.create()])])),\n ...rest.map(group => newPart(schema, composite.attrs.kind as string, group, hideTitles)),\n ]\n}\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n compositeSplit: {\n /**\n * Split the caret's innermost Baustein in front of the body block holding the caret (refused when that is the first body block or the caret is not in a body): the part before and the part from the caret on become sibling Bausteine or sub-Bausteine (`children`, of the default kind or the parent's own; refused when neither is accepted). The caret moves into the new part.\n */\n splitCompositeAtCaret: (options: { mode: SplitMode }) => ReturnType\n /**\n * Split the Baustein at `pos` (default: the caret's innermost one) into parts of about `targetChars` characters (default: setting `blocks.splitTargetChars`) without cutting inside a block. Refused with fewer than two parts, or in `children` mode when no child kind is accepted. The generated titles are hidden.\n */\n splitCompositeByLength: (options: { mode: SplitMode, targetChars?: number, pos?: number }) => ReturnType\n }\n }\n}\n\n/** Options of `CompositeSplit`: read on every use, so a changed setting applies without recreating the editor. */\nexport interface CompositeSplitOptions {\n /** Kind of the sub-Bausteine a `children` split creates when the parent accepts it (setting `blocks.defaultKind`). */\n defaultKind: () => string\n /** Target size in characters of a length split (setting `blocks.splitTargetChars`). */\n targetChars: () => number\n}\n\n/** The composite whose content starts at `pos` in `state`, or the caret's innermost one when `pos` is undefined. */\nfunction targetComposite(state: EditorState, pos: number | undefined): { pos: number, node: PMNode } | null {\n if (pos === undefined) return compositeAround(state.selection.$head)\n const node = state.doc.nodeAt(pos)\n return node?.type.name === 'composite' ? { pos, node } : null\n}\n\n/** Position right in front of the body of `composite`, which starts at `pos`. */\nfunction bodyStartOf(pos: number, composite: PMNode): number {\n return pos + 1 + chromeOf(composite).reduce((size, child) => size + child.nodeSize, 0)\n}\n\n/** Position in front of the body of the last part among `nodes`, which replaced a composite starting at `pos`. */\nfunction lastPartBodyStart(pos: number, nodes: readonly PMNode[], mode: SplitMode): number {\n if (mode === 'children') {\n const parent = nodes[0]!\n const last = parent.lastChild!\n return bodyStartOf(pos + parent.nodeSize - 1 - last.nodeSize, last)\n }\n const last = nodes[nodes.length - 1]!\n return bodyStartOf(pos + nodes.reduce((size, node) => size + node.nodeSize, 0) - last.nodeSize, last)\n}\n\n/** Client-only, no schema: the split commands of Bausteine. */\nexport const CompositeSplit = Extension.create<CompositeSplitOptions>({\n name: 'compositeSplit',\n addOptions: () => ({\n defaultKind: () => EDITOR_SETTINGS_DEFAULTS.blocks.defaultKind,\n targetChars: () => EDITOR_SETTINGS_DEFAULTS.blocks.splitTargetChars,\n }),\n addCommands() {\n /** The kind of the sub-Bausteine (`children`) or of the composite itself (`siblings`); null when a `children` split has no accepted kind. */\n const partKind = (composite: PMNode, mode: SplitMode): string | null =>\n mode === 'siblings' ? composite.attrs.kind as string : childKindFor(compositeKindsOf(this.editor), composite.attrs.kind as string, this.options.defaultKind())\n\n return {\n splitCompositeAtCaret: ({ mode }) => ({ state, tr, dispatch }) => {\n const { $head } = state.selection\n const found = compositeAround($head)\n if (!found) return false\n const index = $head.index(found.depth) - COMPOSITE_CHROME_COUNT\n if (index < 1) return false\n const kind = partKind(found.node, mode)\n if (kind === null) return false\n if (dispatch) {\n const body = bodyOf(found.node)\n const nodes = splitComposite(state.schema, found.node, [body.slice(0, index), body.slice(index)], mode, kind, true)\n tr.replaceWith(found.pos, found.pos + found.node.nodeSize, nodes)\n tr.setSelection(TextSelection.near(tr.doc.resolve(lastPartBodyStart(found.pos, nodes, mode))))\n }\n return true\n },\n\n splitCompositeByLength: ({ mode, targetChars, pos }) => ({ state, tr, dispatch }) => {\n const found = targetComposite(state, pos)\n if (!found) return false\n const groups = splitBodyByLength(bodyOf(found.node), targetChars ?? this.options.targetChars())\n if (groups.length < 2) return false\n const kind = partKind(found.node, mode)\n if (kind === null) return false\n if (dispatch) tr.replaceWith(found.pos, found.pos + found.node.nodeSize, splitComposite(state.schema, found.node, groups, mode, kind, true))\n return true\n },\n }\n },\n})\n"],"mappings":"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"}
@@ -9,8 +9,9 @@ import _default$5 from "./components/CompositeSummaryEditor.vue.js";
9
9
  import _default$6 from "./components/CompositeTable.vue.js";
10
10
  import _default$7 from "./components/CompositeTagsEditor.vue.js";
11
11
  import _default$8 from "./components/CompositeView.vue.js";
12
- import _default$9 from "./components/ReferenceView.vue.js";
13
- import _default$10 from "./components/SettingsEditingTab.vue.js";
12
+ import _default$9 from "./components/FocusChip.vue.js";
13
+ import _default$10 from "./components/ReferenceView.vue.js";
14
+ import _default$11 from "./components/SettingsEditingTab.vue.js";
14
15
  import { useCompositeAnchors } from "./use-composite-anchors.js";
15
16
  import { CompositeRowsModel, useCompositeRows } from "./use-composite-rows.js";
16
17
  //#region src/features/composites/vue.d.ts
@@ -20,5 +21,5 @@ import { CompositeRowsModel, useCompositeRows } from "./use-composite-rows.js";
20
21
  */
21
22
  export declare function compositeFeature(options?: CompositeFeatureOptions): VueFeature;
22
23
  //#endregion
23
- export { _default as CompositeChrome, _default$1 as CompositeDetails, _default$2 as CompositeFieldEditor, _default$3 as CompositeInspector, type CompositeRowsModel, _default$4 as CompositeStatusMenu, _default$5 as CompositeSummaryEditor, _default$6 as CompositeTable, _default$7 as CompositeTagsEditor, _default$8 as CompositeView, _default$9 as ReferenceView, _default$10 as SettingsEditingTab, useCompositeAnchors, useCompositeRows };
24
+ export { _default as CompositeChrome, _default$1 as CompositeDetails, _default$2 as CompositeFieldEditor, _default$3 as CompositeInspector, type CompositeRowsModel, _default$4 as CompositeStatusMenu, _default$5 as CompositeSummaryEditor, _default$6 as CompositeTable, _default$7 as CompositeTagsEditor, _default$8 as CompositeView, _default$9 as FocusChip, _default$10 as ReferenceView, _default$11 as SettingsEditingTab, useCompositeAnchors, useCompositeRows };
24
25
  //# sourceMappingURL=vue.d.ts.map
@@ -8,8 +8,9 @@ import _sfc_main$4 from "./components/CompositeStatusMenu.js";
8
8
  import _sfc_main$7 from "./components/CompositeTagsEditor.js";
9
9
  import _sfc_main from "./components/CompositeChrome.js";
10
10
  import _sfc_main$8 from "./components/CompositeView.js";
11
- import _sfc_main$9 from "./components/ReferenceView.js";
12
- import _sfc_main$10 from "./components/SettingsEditingTab.js";
11
+ import _sfc_main$9 from "./components/FocusChip.js";
12
+ import _sfc_main$10 from "./components/ReferenceView.js";
13
+ import _sfc_main$11 from "./components/SettingsEditingTab.js";
13
14
  import _sfc_main$3 from "./components/CompositeInspector.js";
14
15
  import _sfc_main$6 from "./components/CompositeTable.js";
15
16
  import { VueNodeViewRenderer } from "@tiptap/vue-3";
@@ -21,14 +22,15 @@ import { VueNodeViewRenderer } from "@tiptap/vue-3";
21
22
  function compositeFeature(options = {}) {
22
23
  return compositeFeatureCore({
23
24
  chrome: _sfc_main,
24
- settingsTab: _sfc_main$10,
25
+ focusChip: _sfc_main$9,
26
+ settingsTab: _sfc_main$11,
25
27
  nodeViews: {
26
28
  composite: VueNodeViewRenderer(_sfc_main$8),
27
- reference: VueNodeViewRenderer(_sfc_main$9)
29
+ reference: VueNodeViewRenderer(_sfc_main$10)
28
30
  }
29
31
  }, options);
30
32
  }
31
33
  //#endregion
32
- export { _sfc_main as CompositeChrome, _sfc_main$1 as CompositeDetails, _sfc_main$2 as CompositeFieldEditor, _sfc_main$3 as CompositeInspector, _sfc_main$4 as CompositeStatusMenu, _sfc_main$5 as CompositeSummaryEditor, _sfc_main$6 as CompositeTable, _sfc_main$7 as CompositeTagsEditor, _sfc_main$8 as CompositeView, _sfc_main$9 as ReferenceView, _sfc_main$10 as SettingsEditingTab, compositeFeature, useCompositeAnchors, useCompositeRows };
34
+ export { _sfc_main as CompositeChrome, _sfc_main$1 as CompositeDetails, _sfc_main$2 as CompositeFieldEditor, _sfc_main$3 as CompositeInspector, _sfc_main$4 as CompositeStatusMenu, _sfc_main$5 as CompositeSummaryEditor, _sfc_main$6 as CompositeTable, _sfc_main$7 as CompositeTagsEditor, _sfc_main$8 as CompositeView, _sfc_main$9 as FocusChip, _sfc_main$10 as ReferenceView, _sfc_main$11 as SettingsEditingTab, compositeFeature, useCompositeAnchors, useCompositeRows };
33
35
 
34
36
  //# sourceMappingURL=vue.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"vue.js","names":["CompositeChrome","SettingsEditingTab","CompositeView","ReferenceView"],"sources":["../../../src/features/composites/vue.ts"],"sourcesContent":["import { VueNodeViewRenderer } from '@tiptap/vue-3'\nimport type { Component } from 'vue'\nimport type { VueFeature } from '../../vue'\nimport CompositeChrome from './components/CompositeChrome.vue'\nimport CompositeView from './components/CompositeView.vue'\nimport ReferenceView from './components/ReferenceView.vue'\nimport SettingsEditingTab from './components/SettingsEditingTab.vue'\nimport { type CompositeFeatureOptions, compositeFeatureCore } from './feature'\n\nexport { default as CompositeChrome } from './components/CompositeChrome.vue'\nexport { default as CompositeDetails } from './components/CompositeDetails.vue'\nexport { default as CompositeFieldEditor } from './components/CompositeFieldEditor.vue'\nexport { default as CompositeInspector } from './components/CompositeInspector.vue'\nexport { default as CompositeStatusMenu } from './components/CompositeStatusMenu.vue'\nexport { default as CompositeSummaryEditor } from './components/CompositeSummaryEditor.vue'\nexport { default as CompositeTable } from './components/CompositeTable.vue'\nexport { default as CompositeTagsEditor } from './components/CompositeTagsEditor.vue'\nexport { default as CompositeView } from './components/CompositeView.vue'\nexport { default as ReferenceView } from './components/ReferenceView.vue'\nexport { default as SettingsEditingTab } from './components/SettingsEditingTab.vue'\nexport { useCompositeAnchors } from './use-composite-anchors'\nexport { type CompositeRowsModel, useCompositeRows } from './use-composite-rows'\n\n/**\n * The Vue composites feature (Nuxt UI): see `compositeFeatureCore`. The host places `CompositeTable` and\n * `CompositeInspector` beside the editor.\n */\nexport function compositeFeature(options: CompositeFeatureOptions = {}): VueFeature {\n return compositeFeatureCore<Component>({\n chrome: CompositeChrome,\n settingsTab: SettingsEditingTab,\n nodeViews: { composite: VueNodeViewRenderer(CompositeView), reference: VueNodeViewRenderer(ReferenceView) },\n }, options)\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AA2BA,SAAgB,iBAAiB,UAAmC,CAAC,GAAe;CAClF,OAAO,qBAAgC;EACrC,QAAQA;EACR,aAAaC;EACb,WAAW;GAAE,WAAW,oBAAoBC,WAAa;GAAG,WAAW,oBAAoBC,WAAa;EAAE;CAC5G,GAAG,OAAO;AACZ"}
1
+ {"version":3,"file":"vue.js","names":["CompositeChrome","FocusChip","SettingsEditingTab","CompositeView","ReferenceView"],"sources":["../../../src/features/composites/vue.ts"],"sourcesContent":["import { VueNodeViewRenderer } from '@tiptap/vue-3'\nimport type { Component } from 'vue'\nimport type { VueFeature } from '../../vue'\nimport CompositeChrome from './components/CompositeChrome.vue'\nimport CompositeView from './components/CompositeView.vue'\nimport FocusChip from './components/FocusChip.vue'\nimport ReferenceView from './components/ReferenceView.vue'\nimport SettingsEditingTab from './components/SettingsEditingTab.vue'\nimport { type CompositeFeatureOptions, compositeFeatureCore } from './feature'\n\nexport { default as CompositeChrome } from './components/CompositeChrome.vue'\nexport { default as CompositeDetails } from './components/CompositeDetails.vue'\nexport { default as CompositeFieldEditor } from './components/CompositeFieldEditor.vue'\nexport { default as CompositeInspector } from './components/CompositeInspector.vue'\nexport { default as CompositeStatusMenu } from './components/CompositeStatusMenu.vue'\nexport { default as CompositeSummaryEditor } from './components/CompositeSummaryEditor.vue'\nexport { default as CompositeTable } from './components/CompositeTable.vue'\nexport { default as CompositeTagsEditor } from './components/CompositeTagsEditor.vue'\nexport { default as CompositeView } from './components/CompositeView.vue'\nexport { default as FocusChip } from './components/FocusChip.vue'\nexport { default as ReferenceView } from './components/ReferenceView.vue'\nexport { default as SettingsEditingTab } from './components/SettingsEditingTab.vue'\nexport { useCompositeAnchors } from './use-composite-anchors'\nexport { type CompositeRowsModel, useCompositeRows } from './use-composite-rows'\n\n/**\n * The Vue composites feature (Nuxt UI): see `compositeFeatureCore`. The host places `CompositeTable` and\n * `CompositeInspector` beside the editor.\n */\nexport function compositeFeature(options: CompositeFeatureOptions = {}): VueFeature {\n return compositeFeatureCore<Component>({\n chrome: CompositeChrome,\n focusChip: FocusChip,\n settingsTab: SettingsEditingTab,\n nodeViews: { composite: VueNodeViewRenderer(CompositeView), reference: VueNodeViewRenderer(ReferenceView) },\n }, options)\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AA6BA,SAAgB,iBAAiB,UAAmC,CAAC,GAAe;CAClF,OAAO,qBAAgC;EACrC,QAAQA;EACR,WAAWC;EACX,aAAaC;EACb,WAAW;GAAE,WAAW,oBAAoBC,WAAa;GAAG,WAAW,oBAAoBC,YAAa;EAAE;CAC5G,GAAG,OAAO;AACZ"}
@@ -1,7 +1,7 @@
1
1
  import { MAX_MEDIA_BYTES, MEDIA_TYPES, acceptFor, mediaKindOf, mediaMime } from "./schema.js";
2
+ import { createAudioRecorder } from "./audio-recorder.js";
2
3
  import { AUDIO_RECORDER_OPEN, Media, fileNodeFor, formatBytes, mediaNodeFor, openAudioRecorder, pickFiles, uploadOf } from "./upload.js";
3
4
  import { MAX_TEXT_BYTES, fileImport, isTextFile } from "./file-import.js";
4
5
  import { mediaBlocks, playerOptions } from "./node-views.js";
5
6
  import { mediaFeatureCore } from "./feature.js";
6
- import { createAudioRecorder } from "./audio-recorder.js";
7
7
  export { AUDIO_RECORDER_OPEN, MAX_MEDIA_BYTES, MAX_TEXT_BYTES, MEDIA_TYPES, Media, acceptFor, createAudioRecorder, fileImport, fileNodeFor, formatBytes, isTextFile, mediaBlocks, mediaFeatureCore, mediaKindOf, mediaMime, mediaNodeFor, openAudioRecorder, pickFiles, playerOptions, uploadOf };
@@ -5,8 +5,8 @@ import { cn } from "../../../react/ui/utils.js";
5
5
  import { Icon } from "../../../react/Icon.js";
6
6
  import { Button } from "../../../react/ui/button.js";
7
7
  import { Dialog, DialogContent, DialogFooter, DialogHeader, DialogTitle } from "../../../react/ui/dialog.js";
8
- import { useNotifier } from "../../../react/use-notifier.js";
9
8
  import "../upload.js";
9
+ import { useNotifier } from "../../../react/use-notifier.js";
10
10
  import { useAudioRecorder } from "./use-audio-recorder.js";
11
11
  import { useCallback, useEffect, useRef, useState } from "react";
12
12
  import { jsx, jsxs } from "react/jsx-runtime";
@@ -1,8 +1,8 @@
1
1
  import { useEditorI18n } from "../../react/use-editor-i18n.js";
2
- import { useNotifier } from "../../react/use-notifier.js";
3
2
  import { fileImport } from "./file-import.js";
4
3
  import { playerOptions } from "./node-views.js";
5
4
  import { mediaFeatureCore } from "./feature.js";
5
+ import { useNotifier } from "../../react/use-notifier.js";
6
6
  import { useAudioRecorder } from "./react/use-audio-recorder.js";
7
7
  import { AudioRecorderModal } from "./react/AudioRecorderModal.js";
8
8
  import { AudioView } from "./react/AudioView.js";