@ecsplico/editor 2.1.2 → 3.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +78 -1
- package/README.md +39 -156
- package/dist/adapters/comments/drizzle.d.ts +1 -1
- package/dist/adapters/comments/record.d.ts +15 -0
- package/dist/adapters/comments/{client.js → rest-model.js} +3 -3
- package/dist/adapters/comments/rest-model.js.map +1 -0
- package/dist/adapters/comments/server.d.ts +2 -1
- package/dist/adapters/comments/server.js +2 -1
- package/dist/adapters/comments/server.js.map +1 -1
- package/dist/adapters/comments/types.d.ts +2 -2
- package/dist/adapters/document-state.d.ts +23 -0
- package/dist/adapters/document-state.js +66 -0
- package/dist/adapters/document-state.js.map +1 -0
- package/dist/adapters/documents.js +14 -11
- package/dist/adapters/documents.js.map +1 -1
- package/dist/adapters/drizzle.d.ts +2 -2
- package/dist/adapters/drizzle.js +97 -88
- package/dist/adapters/drizzle.js.map +1 -1
- package/dist/adapters/forge.d.ts +12 -7
- package/dist/adapters/forge.js +38 -45
- package/dist/adapters/forge.js.map +1 -1
- package/dist/adapters/http.d.ts +20 -0
- package/dist/adapters/http.js +68 -0
- package/dist/adapters/http.js.map +1 -0
- package/dist/adapters/index.d.ts +5 -5
- package/dist/adapters/json.d.ts +3 -3
- package/dist/adapters/json.js +58 -49
- package/dist/adapters/json.js.map +1 -1
- package/dist/adapters/memory.d.ts +21 -0
- package/dist/adapters/memory.js +53 -0
- package/dist/adapters/memory.js.map +1 -0
- package/dist/adapters/nitro.d.ts +27 -20
- package/dist/adapters/nitro.js +59 -163
- package/dist/adapters/nitro.js.map +1 -1
- package/dist/adapters/react.d.ts +55 -0
- package/dist/adapters/react.js +209 -0
- package/dist/adapters/react.js.map +1 -0
- package/dist/adapters/shared.d.ts +15 -21
- package/dist/adapters/shared.js +10 -8
- package/dist/adapters/shared.js.map +1 -1
- package/dist/adapters/vue.d.ts +15 -30
- package/dist/adapters/vue.js +36 -87
- package/dist/adapters/vue.js.map +1 -1
- package/dist/code/CodeSurface.vue.d.ts +2 -2
- package/dist/config/index.d.ts +105 -0
- package/dist/config/index.js +95 -0
- package/dist/config/index.js.map +1 -0
- package/dist/core/abilities.js +1 -0
- package/dist/core/abilities.js.map +1 -1
- package/dist/{adapters/routes.js → core/api-routes.js} +5 -3
- package/dist/core/api-routes.js.map +1 -0
- package/dist/core/backend-capability.d.ts +7 -0
- package/dist/core/backend-capability.js +17 -0
- package/dist/core/backend-capability.js.map +1 -0
- package/dist/core/backend-types.d.ts +245 -0
- package/dist/core/backend-types.js +17 -0
- package/dist/core/backend-types.js.map +1 -0
- package/dist/core/backend.d.ts +108 -0
- package/dist/core/backend.js +14 -0
- package/dist/core/backend.js.map +1 -0
- package/dist/core/block-convert.d.ts +7 -5
- package/dist/core/block-convert.js +28 -5
- package/dist/core/block-convert.js.map +1 -1
- package/dist/core/command-types.d.ts +96 -0
- package/dist/core/commands.d.ts +40 -0
- package/dist/core/commands.js +151 -0
- package/dist/core/commands.js.map +1 -0
- package/dist/core/context.d.ts +17 -20
- package/dist/core/context.js +24 -21
- package/dist/core/context.js.map +1 -1
- package/dist/core/core-feature.d.ts +22 -7
- package/dist/core/core-feature.js +51 -18
- package/dist/core/core-feature.js.map +1 -1
- package/dist/core/define-editor.d.ts +4 -3
- package/dist/core/define-editor.js +14 -7
- package/dist/core/define-editor.js.map +1 -1
- package/dist/core/document-markdown.js +12 -3
- package/dist/core/document-markdown.js.map +1 -1
- package/dist/core/editor-ui.d.ts +8 -1
- package/dist/core/editor-ui.js +9 -8
- package/dist/core/editor-ui.js.map +1 -1
- package/dist/core/extension-points.d.ts +3 -15
- package/dist/core/feature-context.d.ts +8 -7
- package/dist/core/feature-context.js +12 -11
- package/dist/core/feature-context.js.map +1 -1
- package/dist/core/feature.d.ts +41 -19
- package/dist/core/feature.js.map +1 -1
- package/dist/core/fences.d.ts +2 -1
- package/dist/core/fences.js +3 -2
- package/dist/core/fences.js.map +1 -1
- package/dist/core/fetch-error.d.ts +1 -1
- package/dist/core/fetch-error.js +3 -1
- package/dist/core/fetch-error.js.map +1 -1
- package/dist/core/hash.d.ts +5 -0
- package/dist/core/hash.js +11 -0
- package/dist/core/hash.js.map +1 -0
- package/dist/core/http-backend.d.ts +11 -0
- package/dist/core/http-backend.js +195 -0
- package/dist/core/http-backend.js.map +1 -0
- package/dist/core/index.d.ts +15 -9
- package/dist/core/index.js +13 -9
- package/dist/core/palette.d.ts +48 -0
- package/dist/core/palette.js +95 -0
- package/dist/core/palette.js.map +1 -0
- package/dist/core/schema/abilities.d.ts +2 -1
- package/dist/core/schema/abilities.js +5 -1
- package/dist/core/schema/abilities.js.map +1 -1
- package/dist/core/schema/index.d.ts +11 -5
- package/dist/core/schema/index.js +13 -8
- package/dist/core/schema/index.js.map +1 -1
- package/dist/core/schema/mark-flags.d.ts +8 -1
- package/dist/core/schema/of-features.d.ts +13 -0
- package/dist/core/schema/of-features.js +14 -0
- package/dist/core/schema/of-features.js.map +1 -0
- package/dist/core/slash.d.ts +8 -6
- package/dist/core/slash.js +24 -16
- package/dist/core/slash.js.map +1 -1
- package/dist/core/surface-session.js +15 -5
- package/dist/core/surface-session.js.map +1 -1
- package/dist/core/toolbar-items.d.ts +10 -4
- package/dist/core/toolbar-items.js +269 -195
- package/dist/core/toolbar-items.js.map +1 -1
- package/dist/core/transaction-guards.d.ts +21 -0
- package/dist/core/transaction-guards.js +49 -0
- package/dist/core/transaction-guards.js.map +1 -0
- package/dist/core/util.js +11 -0
- package/dist/core/util.js.map +1 -0
- package/dist/document/DocumentSurface.d.ts +1 -1
- package/dist/document/DocumentSurface.vue.d.ts +2 -2
- package/dist/features/ai/agent-op-review.d.ts +1 -1
- package/dist/features/ai/agent-op-review.js +1 -1
- package/dist/features/ai/agent-ops.js +1 -1
- package/dist/features/ai/ai-apply.d.ts +2 -2
- package/dist/features/ai/ai-apply.js +1 -1
- package/dist/features/ai/ai-review.js +1 -1
- package/dist/features/ai/ai-sse.d.ts +6 -6
- package/dist/features/ai/ai-sse.js +20 -63
- package/dist/features/ai/ai-sse.js.map +1 -1
- package/dist/features/ai/assistant.d.ts +8 -7
- package/dist/features/ai/assistant.js +3 -3
- package/dist/features/ai/assistant.js.map +1 -1
- package/dist/features/ai/block-actions.d.ts +3 -2
- package/dist/features/ai/block-actions.js +3 -2
- package/dist/features/ai/block-actions.js.map +1 -1
- package/dist/features/ai/components/AiSelectionMenu.js +1 -1
- package/dist/features/ai/components/DocumentChatAnswer.js +1 -1
- package/dist/features/ai/components/DocumentChatOps.vue.d.ts +1 -1
- package/dist/features/ai/components/SettingsModelProfiles.js +8 -8
- package/dist/features/ai/components/SettingsModelProfiles.js.map +1 -1
- package/dist/features/ai/document-chat-model.d.ts +8 -7
- package/dist/features/ai/document-chat-model.js +5 -5
- package/dist/features/ai/document-chat-model.js.map +1 -1
- package/dist/features/ai/document-chat.js +1 -1
- package/dist/features/ai/feature.js +27 -14
- package/dist/features/ai/feature.js.map +1 -1
- package/dist/features/ai/ghost-autocomplete.d.ts +7 -6
- package/dist/features/ai/ghost-autocomplete.js +6 -9
- package/dist/features/ai/ghost-autocomplete.js.map +1 -1
- package/dist/features/ai/index.d.ts +4 -3
- package/dist/features/ai/index.js +10 -10
- package/dist/features/ai/model-profiles.d.ts +5 -4
- package/dist/features/ai/model-profiles.js +2 -2
- package/dist/features/ai/model-profiles.js.map +1 -1
- package/dist/features/ai/protocol/block-lines.js +1 -1
- package/dist/features/ai/protocol/block-lines.js.map +1 -1
- package/dist/features/ai/protocol/chat.js +6 -2
- package/dist/features/ai/protocol/chat.js.map +1 -1
- package/dist/features/ai/protocol/index.d.ts +3 -2
- package/dist/features/ai/protocol/models.d.ts +2 -16
- package/dist/features/ai/protocol/models.js.map +1 -1
- package/dist/features/ai/rate-limit.d.ts +1 -1
- package/dist/features/ai/rate-limit.js +3 -1
- package/dist/features/ai/rate-limit.js.map +1 -1
- package/dist/features/ai/react/AiSelectionMenu.js +2 -2
- package/dist/features/ai/react/AiSidebar.js +4 -4
- package/dist/features/ai/react/DocumentChatAnswer.js +1 -1
- package/dist/features/ai/react/DocumentChatOps.d.ts +1 -1
- package/dist/features/ai/react/DocumentChatOps.js +1 -1
- package/dist/features/ai/react/SettingsModelProfiles.js +8 -10
- package/dist/features/ai/react/SettingsModelProfiles.js.map +1 -1
- package/dist/features/ai/react/use-ai-assistant.d.ts +1 -1
- package/dist/features/ai/react/use-ai-assistant.js +3 -3
- package/dist/features/ai/react/use-ai-assistant.js.map +1 -1
- package/dist/features/ai/react/use-document-chat.js +2 -2
- package/dist/features/ai/react/use-document-chat.js.map +1 -1
- package/dist/features/ai/react/use-model-profiles.d.ts +2 -1
- package/dist/features/ai/selection-flow.d.ts +1 -1
- package/dist/features/ai/selection-flow.js +1 -1
- package/dist/features/ai/sidebar-flow.d.ts +1 -1
- package/dist/features/ai/sidebar-flow.js +1 -1
- package/dist/features/ai/use-ai-assistant.d.ts +1 -1
- package/dist/features/ai/use-ai-assistant.js +3 -3
- package/dist/features/ai/use-ai-assistant.js.map +1 -1
- package/dist/features/ai/use-document-chat.js +2 -2
- package/dist/features/ai/use-document-chat.js.map +1 -1
- package/dist/features/ai/use-model-profiles.d.ts +2 -1
- package/dist/features/authors/attribution.d.ts +1 -1
- package/dist/features/authors/feature.js +12 -11
- package/dist/features/authors/feature.js.map +1 -1
- package/dist/features/block-ui/block-actions.d.ts +1 -1
- package/dist/features/block-ui/block-actions.js +1 -1
- package/dist/features/block-ui/block-actions.js.map +1 -1
- package/dist/features/block-ui/components/BlockUi.js +1 -1
- package/dist/features/block-ui/feature.js +1 -0
- package/dist/features/block-ui/feature.js.map +1 -1
- package/dist/features/block-ui/react/BlockUi.js +1 -1
- package/dist/features/collab/anchor-resolver.js +1 -1
- package/dist/features/collab/feature.js +2 -0
- package/dist/features/collab/feature.js.map +1 -1
- package/dist/features/comments/components/CommentThreadView.vue.d.ts +2 -1
- package/dist/features/comments/feature.js +12 -11
- package/dist/features/comments/feature.js.map +1 -1
- package/dist/features/comments/index.d.ts +3 -2
- package/dist/features/comments/index.js +1 -1
- package/dist/features/comments/margin-layout.d.ts +3 -2
- package/dist/features/comments/model.d.ts +3 -67
- package/dist/features/comments/model.js +2 -2
- package/dist/features/comments/model.js.map +1 -1
- package/dist/features/comments/react/CommentThreadView.d.ts +3 -2
- package/dist/features/comments/react/use-comments.d.ts +2 -1
- package/dist/features/comments/react.d.ts +1 -1
- package/dist/features/comments/schema.d.ts +2 -52
- package/dist/features/comments/schema.js.map +1 -1
- package/dist/features/comments/snapshot-equality.js.map +1 -1
- package/dist/features/comments/use-comments.d.ts +3 -2
- package/dist/features/comments/vue.d.ts +1 -1
- package/dist/features/composites/accepted-children.d.ts +1 -0
- package/dist/features/composites/accepted-children.js +16 -1
- package/dist/features/composites/accepted-children.js.map +1 -1
- package/dist/features/composites/ai-brief.js +39 -0
- package/dist/features/composites/ai-brief.js.map +1 -1
- package/dist/features/composites/bibliography-command.d.ts +11 -0
- package/dist/features/composites/bibliography-form.js +90 -0
- package/dist/features/composites/bibliography-form.js.map +1 -0
- package/dist/features/composites/bibliography.d.ts +33 -0
- package/dist/features/composites/bibliography.js +120 -0
- package/dist/features/composites/bibliography.js.map +1 -0
- package/dist/features/composites/components/BibliographyEditor.js +261 -0
- package/dist/features/composites/components/BibliographyEditor.js.map +1 -0
- package/dist/features/composites/components/CompositeChrome.js +78 -29
- package/dist/features/composites/components/CompositeChrome.js.map +1 -1
- package/dist/features/composites/components/CompositeChrome.vue.d.ts +1 -1
- package/dist/features/composites/components/CompositeDetails.js +46 -11
- package/dist/features/composites/components/CompositeDetails.js.map +1 -1
- package/dist/features/composites/components/CompositeDetails.vue.d.ts +2 -1
- package/dist/features/composites/components/CompositeFieldEditor.js +64 -5
- package/dist/features/composites/components/CompositeFieldEditor.js.map +1 -1
- package/dist/features/composites/components/CompositeInspector.js +20 -7
- package/dist/features/composites/components/CompositeInspector.js.map +1 -1
- package/dist/features/composites/components/CompositeTable.js +13 -4
- package/dist/features/composites/components/CompositeTable.js.map +1 -1
- package/dist/features/composites/components/CompositeTagsEditor.js +1 -1
- package/dist/features/composites/components/CompositeView.js +11 -1
- package/dist/features/composites/components/CompositeView.js.map +1 -1
- package/dist/features/composites/components/DerivationBadge.js +103 -0
- package/dist/features/composites/components/DerivationBadge.js.map +1 -0
- package/dist/features/composites/components/ReferenceFieldSelect.js +60 -0
- package/dist/features/composites/components/ReferenceFieldSelect.js.map +1 -0
- package/dist/features/composites/components/ReferenceView.js +122 -0
- package/dist/features/composites/components/ReferenceView.js.map +1 -0
- package/dist/features/composites/components/ReferenceView.vue.d.ts +96 -0
- package/dist/features/composites/components/SettingsEditingTab.js +1 -1
- package/dist/features/composites/convert.js +2 -2
- package/dist/features/composites/convert.js.map +1 -1
- package/dist/features/composites/derivation.d.ts +61 -0
- package/dist/features/composites/derivation.js +98 -0
- package/dist/features/composites/derivation.js.map +1 -0
- package/dist/features/composites/derived-chrome.js +69 -0
- package/dist/features/composites/derived-chrome.js.map +1 -0
- package/dist/features/composites/feature.js +159 -109
- package/dist/features/composites/feature.js.map +1 -1
- package/dist/features/composites/fences.d.ts +4 -3
- package/dist/features/composites/fences.js +51 -7
- package/dist/features/composites/fences.js.map +1 -1
- package/dist/features/composites/index.d.ts +12 -3
- package/dist/features/composites/index.js +15 -6
- package/dist/features/composites/inspector-model.d.ts +4 -1
- package/dist/features/composites/inspector-model.js +8 -4
- package/dist/features/composites/inspector-model.js.map +1 -1
- package/dist/features/composites/kinds.d.ts +16 -2
- package/dist/features/composites/kinds.js +145 -6
- package/dist/features/composites/kinds.js.map +1 -1
- package/dist/features/composites/legacy.d.ts +4 -1
- package/dist/features/composites/legacy.js +56 -1
- package/dist/features/composites/legacy.js.map +1 -1
- package/dist/features/composites/meta-display.js +45 -2
- package/dist/features/composites/meta-display.js.map +1 -1
- package/dist/features/composites/meta-keys.d.ts +7 -0
- package/dist/features/composites/meta-keys.js +21 -0
- package/dist/features/composites/meta-keys.js.map +1 -0
- package/dist/features/composites/node-views.d.ts +6 -3
- package/dist/features/composites/node-views.js +7 -3
- package/dist/features/composites/node-views.js.map +1 -1
- package/dist/features/composites/nodes.d.ts +6 -1
- package/dist/features/composites/nodes.js +33 -7
- package/dist/features/composites/nodes.js.map +1 -1
- package/dist/features/composites/react/BibliographyEditor.js +229 -0
- package/dist/features/composites/react/BibliographyEditor.js.map +1 -0
- package/dist/features/composites/react/CompositeChrome.js +67 -19
- package/dist/features/composites/react/CompositeChrome.js.map +1 -1
- package/dist/features/composites/react/CompositeDetails.d.ts +2 -1
- package/dist/features/composites/react/CompositeDetails.js +45 -6
- package/dist/features/composites/react/CompositeDetails.js.map +1 -1
- package/dist/features/composites/react/CompositeFieldEditor.d.ts +1 -1
- package/dist/features/composites/react/CompositeFieldEditor.js +43 -1
- package/dist/features/composites/react/CompositeFieldEditor.js.map +1 -1
- package/dist/features/composites/react/CompositeInspector.js +12 -6
- package/dist/features/composites/react/CompositeInspector.js.map +1 -1
- package/dist/features/composites/react/CompositeStatusMenu.js +1 -1
- package/dist/features/composites/react/CompositeSummaryEditor.js +1 -1
- package/dist/features/composites/react/CompositeTable.js +16 -2
- package/dist/features/composites/react/CompositeTable.js.map +1 -1
- package/dist/features/composites/react/CompositeTagsEditor.js +2 -2
- package/dist/features/composites/react/CompositeView.js +6 -1
- package/dist/features/composites/react/CompositeView.js.map +1 -1
- package/dist/features/composites/react/DerivationBadge.js +116 -0
- package/dist/features/composites/react/DerivationBadge.js.map +1 -0
- package/dist/features/composites/react/ReferenceFieldSelect.js +52 -0
- package/dist/features/composites/react/ReferenceFieldSelect.js.map +1 -0
- package/dist/features/composites/react/ReferenceView.d.ts +11 -0
- package/dist/features/composites/react/ReferenceView.js +115 -0
- package/dist/features/composites/react/ReferenceView.js.map +1 -0
- package/dist/features/composites/react/SettingsEditingTab.js +2 -2
- package/dist/features/composites/react.d.ts +2 -1
- package/dist/features/composites/react.js +7 -3
- package/dist/features/composites/react.js.map +1 -1
- package/dist/features/composites/reference-ai.js +16 -0
- package/dist/features/composites/reference-ai.js.map +1 -0
- package/dist/features/composites/reference-label.d.ts +19 -0
- package/dist/features/composites/reference-label.js +58 -0
- package/dist/features/composites/reference-label.js.map +1 -0
- package/dist/features/composites/reference-suggestion.d.ts +10 -0
- package/dist/features/composites/reference-suggestion.js +41 -0
- package/dist/features/composites/reference-suggestion.js.map +1 -0
- package/dist/features/composites/reference-text.d.ts +18 -0
- package/dist/features/composites/reference-text.js +89 -0
- package/dist/features/composites/reference-text.js.map +1 -0
- package/dist/features/composites/reference.d.ts +44 -0
- package/dist/features/composites/reference.js +148 -0
- package/dist/features/composites/reference.js.map +1 -0
- package/dist/features/composites/reveal-source.d.ts +32 -0
- package/dist/features/composites/reveal-source.js +89 -0
- package/dist/features/composites/reveal-source.js.map +1 -0
- package/dist/features/composites/rows.d.ts +25 -3
- package/dist/features/composites/rows.js +72 -10
- package/dist/features/composites/rows.js.map +1 -1
- package/dist/features/composites/schema.d.ts +9 -3
- package/dist/features/composites/schema.js +11 -4
- package/dist/features/composites/schema.js.map +1 -1
- package/dist/features/composites/table-model.js +12 -21
- package/dist/features/composites/table-model.js.map +1 -1
- package/dist/features/composites/vue.d.ts +3 -2
- package/dist/features/composites/vue.js +8 -4
- package/dist/features/composites/vue.js.map +1 -1
- package/dist/features/media/assets.d.ts +2 -0
- package/dist/features/media/assets.js +3 -2
- package/dist/features/media/assets.js.map +1 -1
- package/dist/features/media/components/FileView.js +13 -4
- package/dist/features/media/components/FileView.js.map +1 -1
- package/dist/features/media/feature.d.ts +3 -3
- package/dist/features/media/feature.js +21 -28
- package/dist/features/media/feature.js.map +1 -1
- package/dist/features/media/file-import.js +2 -2
- package/dist/features/media/file-import.js.map +1 -1
- package/dist/features/media/index.d.ts +2 -2
- package/dist/features/media/index.js +3 -3
- package/dist/features/media/react/AudioRecorderModal.js +1 -1
- package/dist/features/media/react/FileView.js +19 -2
- package/dist/features/media/react/FileView.js.map +1 -1
- package/dist/features/media/react.js +1 -1
- package/dist/features/media/schema.d.ts +8 -0
- package/dist/features/media/schema.js +126 -11
- package/dist/features/media/schema.js.map +1 -1
- package/dist/features/media/upload.d.ts +16 -14
- package/dist/features/media/upload.js +13 -19
- package/dist/features/media/upload.js.map +1 -1
- package/dist/features/mentions/index.d.ts +4 -3
- package/dist/features/mentions/index.js +4 -1
- package/dist/features/mentions/index.js.map +1 -1
- package/dist/features/mentions/mention-text.d.ts +1 -1
- package/dist/features/mentions/mention-text.js.map +1 -1
- package/dist/features/mentions/mention.d.ts +0 -6
- package/dist/features/mentions/mention.js.map +1 -1
- package/dist/features/mentions/metadata-defaults.d.ts +2 -2
- package/dist/features/mentions/metadata-defaults.js +3 -9
- package/dist/features/mentions/metadata-defaults.js.map +1 -1
- package/dist/features/mentions/schema.d.ts +2 -1
- package/dist/features/mentions/schema.js.map +1 -1
- package/dist/features/tables/feature.d.ts +2 -1
- package/dist/features/tables/feature.js +90 -70
- package/dist/features/tables/feature.js.map +1 -1
- package/dist/features/themes/components/SettingsAppearanceTab.js +6 -9
- package/dist/features/themes/components/SettingsAppearanceTab.js.map +1 -1
- package/dist/features/themes/feature.js +2 -0
- package/dist/features/themes/feature.js.map +1 -1
- package/dist/features/themes/index.d.ts +2 -1
- package/dist/features/themes/react/SettingsAppearanceTab.js +7 -10
- package/dist/features/themes/react/SettingsAppearanceTab.js.map +1 -1
- package/dist/features/themes/schema.d.ts +2 -6
- package/dist/features/themes/schema.js.map +1 -1
- package/dist/features/themes/theme-runtime.d.ts +1 -1
- package/dist/features/themes/theme-runtime.js +4 -2
- package/dist/features/themes/theme-runtime.js.map +1 -1
- package/dist/features/transcript/TranscriptSegmentView.js +48 -28
- package/dist/features/transcript/TranscriptSegmentView.js.map +1 -1
- package/dist/features/transcript/feature.js +21 -19
- package/dist/features/transcript/feature.js.map +1 -1
- package/dist/features/transcript/react/TranscriptSegmentView.js +55 -36
- package/dist/features/transcript/react/TranscriptSegmentView.js.map +1 -1
- package/dist/features/transcript/segment-node.d.ts +2 -0
- package/dist/features/transcript/segment-node.js +35 -7
- package/dist/features/transcript/segment-node.js.map +1 -1
- package/dist/i18n/de/composites.js +91 -1
- package/dist/i18n/de/composites.js.map +1 -1
- package/dist/i18n/de/integrations.js +49 -8
- package/dist/i18n/de/integrations.js.map +1 -1
- package/dist/i18n/de/media.js +0 -1
- package/dist/i18n/de/media.js.map +1 -1
- package/dist/i18n/de/palette.js +22 -0
- package/dist/i18n/de/palette.js.map +1 -0
- package/dist/i18n/de/tables.js +0 -1
- package/dist/i18n/de/tables.js.map +1 -1
- package/dist/i18n/de/transcript.js +2 -1
- package/dist/i18n/de/transcript.js.map +1 -1
- package/dist/i18n/de/tree.js +3 -0
- package/dist/i18n/de/tree.js.map +1 -1
- package/dist/i18n/de.d.ts +157 -11
- package/dist/i18n/de.js +3 -1
- package/dist/i18n/de.js.map +1 -1
- package/dist/i18n/en/composites.js +89 -1
- package/dist/i18n/en/composites.js.map +1 -1
- package/dist/i18n/en/integrations.js +49 -8
- package/dist/i18n/en/integrations.js.map +1 -1
- package/dist/i18n/en/media.js +0 -1
- package/dist/i18n/en/media.js.map +1 -1
- package/dist/i18n/en/palette.js +22 -0
- package/dist/i18n/en/palette.js.map +1 -0
- package/dist/i18n/en/tables.js +0 -1
- package/dist/i18n/en/tables.js.map +1 -1
- package/dist/i18n/en/transcript.js +2 -1
- package/dist/i18n/en/transcript.js.map +1 -1
- package/dist/i18n/en/tree.js +3 -0
- package/dist/i18n/en/tree.js.map +1 -1
- package/dist/i18n/en.js +3 -1
- package/dist/i18n/en.js.map +1 -1
- package/dist/index.d.ts +4 -3
- package/dist/integrations/composite-ai/bibliography-fetch.d.ts +31 -0
- package/dist/integrations/composite-ai/bibliography-fetch.js +159 -0
- package/dist/integrations/composite-ai/bibliography-fetch.js.map +1 -0
- package/dist/integrations/composite-ai/composite-fill.d.ts +30 -8
- package/dist/integrations/composite-ai/composite-fill.js +97 -56
- package/dist/integrations/composite-ai/composite-fill.js.map +1 -1
- package/dist/integrations/composite-ai/composite-summary.d.ts +4 -12
- package/dist/integrations/composite-ai/composite-summary.js +7 -26
- package/dist/integrations/composite-ai/composite-summary.js.map +1 -1
- package/dist/integrations/composite-ai/derive.d.ts +29 -0
- package/dist/integrations/composite-ai/derive.js +173 -0
- package/dist/integrations/composite-ai/derive.js.map +1 -0
- package/dist/integrations/composite-ai/index.d.ts +11 -7
- package/dist/integrations/composite-ai/index.js +72 -14
- package/dist/integrations/composite-ai/index.js.map +1 -1
- package/dist/integrations/composite-ai/rendition.d.ts +45 -0
- package/dist/integrations/composite-ai/rendition.js +314 -0
- package/dist/integrations/composite-ai/rendition.js.map +1 -0
- package/dist/integrations/composite-media/index.d.ts +7 -5
- package/dist/integrations/composite-media/index.js +86 -13
- package/dist/integrations/composite-media/index.js.map +1 -1
- package/dist/integrations/transcript-ai/index.d.ts +1 -1
- package/dist/integrations/transcript-ai/index.js +5 -2
- package/dist/integrations/transcript-ai/index.js.map +1 -1
- package/dist/integrations/transcript-ai/protocol.d.ts +2 -12
- package/dist/integrations/transcript-ai/protocol.js +0 -2
- package/dist/integrations/transcript-ai/protocol.js.map +1 -1
- package/dist/integrations/transcript-ai/transcript-cleanup.d.ts +5 -5
- package/dist/integrations/transcript-ai/transcript-cleanup.js +7 -10
- package/dist/integrations/transcript-ai/transcript-cleanup.js.map +1 -1
- package/dist/markdown/MarkdownSurface.vue.d.ts +12 -11
- package/dist/markdown/MarkdownSurface2.js +3 -6
- package/dist/markdown/MarkdownSurface2.js.map +1 -1
- package/dist/markdown/document.js +1 -1
- package/dist/markdown/source-mode.d.ts +1 -1
- package/dist/nuxt/module.d.ts +1402 -54
- package/dist/nuxt/module.js +6 -49
- package/dist/nuxt/module.js.map +1 -1
- package/dist/nuxt/runtime/install-context.d.ts +7 -3
- package/dist/nuxt/runtime/install-context.js +14 -8
- package/dist/nuxt/runtime/install-context.js.map +1 -1
- package/dist/nuxt/runtime/plugins/editor-context-nuxt-ui.client.ts +2 -2
- package/dist/nuxt/runtime/server/plugins/editor-server.js +20 -12
- package/dist/nuxt/runtime/server/plugins/editor-server.js.map +1 -1
- package/dist/presets/compose.d.ts +94 -0
- package/dist/presets/compose.js +164 -0
- package/dist/presets/compose.js.map +1 -0
- package/dist/react/AdvancedEditor.d.ts +15 -15
- package/dist/react/AdvancedEditor.js +15 -13
- package/dist/react/AdvancedEditor.js.map +1 -1
- package/dist/react/EditorCommandPalette.d.ts +13 -0
- package/dist/react/EditorCommandPalette.js +118 -0
- package/dist/react/EditorCommandPalette.js.map +1 -0
- package/dist/react/EditorSettingsModal.d.ts +5 -5
- package/dist/react/EditorSettingsModal.js +7 -4
- package/dist/react/EditorSettingsModal.js.map +1 -1
- package/dist/react/EditorSettingsPanel.d.ts +7 -7
- package/dist/react/EditorSettingsPanel.js +8 -5
- package/dist/react/EditorSettingsPanel.js.map +1 -1
- package/dist/react/EditorSurface.d.ts +7 -7
- package/dist/react/EditorSurface.js +10 -6
- package/dist/react/EditorSurface.js.map +1 -1
- package/dist/react/EditorToolbar.d.ts +4 -6
- package/dist/react/EditorToolbar.js +29 -37
- package/dist/react/EditorToolbar.js.map +1 -1
- package/dist/react/SimpleEditor.d.ts +22 -23
- package/dist/react/SimpleEditor.js +21 -7
- package/dist/react/SimpleEditor.js.map +1 -1
- package/dist/react/advanced.d.ts +4 -3
- package/dist/react/advanced.js +2 -2
- package/dist/react/compose.d.ts +20 -0
- package/dist/react/compose.js +49 -0
- package/dist/react/compose.js.map +1 -0
- package/dist/react/composed-surface.d.ts +39 -0
- package/dist/react/composed-surface.js +71 -0
- package/dist/react/composed-surface.js.map +1 -0
- package/dist/react/context.js +6 -2
- package/dist/react/context.js.map +1 -1
- package/dist/react/index.d.ts +2 -1
- package/dist/react/index.js +2 -1
- package/dist/react/key-labels.js +15 -0
- package/dist/react/key-labels.js.map +1 -0
- package/dist/react/settings.d.ts +1 -1
- package/dist/react/simple.d.ts +2 -2
- package/dist/react/ui/command.js +36 -1
- package/dist/react/ui/command.js.map +1 -1
- package/dist/schema/advanced.d.ts +6 -6
- package/dist/schema/advanced.js +26 -29
- package/dist/schema/advanced.js.map +1 -1
- package/dist/server/ai.d.ts +5 -16
- package/dist/server/ai.js.map +1 -1
- package/dist/server/auth.d.ts +9 -0
- package/dist/server/collab-state.d.ts +1 -1
- package/dist/server/collab-state.js.map +1 -1
- package/dist/server/collab.d.ts +13 -13
- package/dist/server/collab.js +34 -18
- package/dist/server/collab.js.map +1 -1
- package/dist/server/crossref.js +78 -0
- package/dist/server/crossref.js.map +1 -0
- package/dist/server/errors.d.ts +1 -1
- package/dist/server/errors.js +1 -1
- package/dist/server/errors.js.map +1 -1
- package/dist/server/extract.js +308 -0
- package/dist/server/extract.js.map +1 -0
- package/dist/server/h3.d.ts +8 -0
- package/dist/{nuxt/runtime/server/utils/editor-route.js → server/h3.js} +8 -16
- package/dist/server/h3.js.map +1 -0
- package/dist/server/handlers/ai.d.ts +32 -10
- package/dist/server/handlers/ai.js +172 -37
- package/dist/server/handlers/ai.js.map +1 -1
- package/dist/server/handlers/context.d.ts +12 -5
- package/dist/server/handlers/context.js +10 -4
- package/dist/server/handlers/context.js.map +1 -1
- package/dist/server/handlers/editor.d.ts +19 -13
- package/dist/server/handlers/editor.js +49 -38
- package/dist/server/handlers/editor.js.map +1 -1
- package/dist/server/handlers/index.d.ts +4 -4
- package/dist/server/handlers/index.js +4 -4
- package/dist/server/host.d.ts +16 -25
- package/dist/server/host.js +58 -41
- package/dist/server/host.js.map +1 -1
- package/dist/server/index.d.ts +6 -4
- package/dist/server/index.js +3 -2
- package/dist/server/pdf.js +97 -0
- package/dist/server/pdf.js.map +1 -0
- package/dist/server/{adapter.d.ts → ports.d.ts} +81 -30
- package/dist/server/ports.js +29 -0
- package/dist/server/ports.js.map +1 -0
- package/dist/server/routes.d.ts +22 -0
- package/dist/server/routes.js +144 -0
- package/dist/server/routes.js.map +1 -0
- package/dist/settings/index.d.ts +1 -1
- package/dist/settings/index.js.map +1 -1
- package/dist/styles/composites.css +25 -0
- package/dist/tree/DocumentTree.js +56 -29
- package/dist/tree/DocumentTree.js.map +1 -1
- package/dist/tree/react/DocumentTree.js +23 -0
- package/dist/tree/react/DocumentTree.js.map +1 -1
- package/dist/tree/tree-host.js +2 -2
- package/dist/tree/tree-items.js +1 -1
- package/dist/vue/AdvancedEditor.js +30 -9
- package/dist/vue/AdvancedEditor.js.map +1 -1
- package/dist/vue/AdvancedEditor.vue.d.ts +32 -12
- package/dist/vue/SimpleEditor.js +62 -16
- package/dist/vue/SimpleEditor.js.map +1 -1
- package/dist/vue/SimpleEditor.vue.d.ts +39 -9
- package/dist/vue/advanced.d.ts +3 -2
- package/dist/vue/advanced.js +2 -2
- package/dist/vue/components/EditorCommandPalette.js +91 -0
- package/dist/vue/components/EditorCommandPalette.js.map +1 -0
- package/dist/vue/components/EditorCommandPalette.vue.d.ts +15 -0
- package/dist/vue/components/EditorSettingsModal.js +10 -6
- package/dist/vue/components/EditorSettingsModal.js.map +1 -1
- package/dist/vue/components/EditorSettingsModal.vue.d.ts +4 -4
- package/dist/vue/components/EditorSettingsPanel.js +10 -6
- package/dist/vue/components/EditorSettingsPanel.js.map +1 -1
- package/dist/vue/components/EditorSettingsPanel.vue.d.ts +6 -6
- package/dist/vue/components/EditorSurface.js +11 -6
- package/dist/vue/components/EditorSurface.js.map +1 -1
- package/dist/vue/components/EditorSurface.vue.d.ts +11 -11
- package/dist/vue/components/EditorToolbar.js +41 -49
- package/dist/vue/components/EditorToolbar.js.map +1 -1
- package/dist/vue/components/EditorToolbar.vue.d.ts +2 -4
- package/dist/vue/compose.d.ts +17 -0
- package/dist/vue/compose.js +51 -0
- package/dist/vue/compose.js.map +1 -0
- package/dist/vue/context-key.d.ts +6 -0
- package/dist/vue/context-key.js +6 -0
- package/dist/vue/context-key.js.map +1 -0
- package/dist/vue/context.d.ts +8 -6
- package/dist/vue/context.js +6 -5
- package/dist/vue/context.js.map +1 -1
- package/dist/vue/index.d.ts +10 -8
- package/dist/vue/index.js +10 -8
- package/dist/vue/kit/index.d.ts +2 -2
- package/dist/vue/kit/nuxt-ui.js +23 -0
- package/dist/vue/kit/nuxt-ui.js.map +1 -1
- package/dist/vue/kit/types.d.ts +40 -1
- package/package.json +30 -16
- package/dist/adapters/comments/client.d.ts +0 -64
- package/dist/adapters/comments/client.js.map +0 -1
- package/dist/adapters/routes.js.map +0 -1
- package/dist/core/toolbar.d.ts +0 -74
- package/dist/core/toolbar.js +0 -45
- package/dist/core/toolbar.js.map +0 -1
- package/dist/integrations/composite-ai/document-transcribe.d.ts +0 -14
- package/dist/integrations/composite-ai/document-transcribe.js +0 -89
- package/dist/integrations/composite-ai/document-transcribe.js.map +0 -1
- package/dist/nuxt/runtime/server/api/ai/chat.post.d.ts +0 -5
- package/dist/nuxt/runtime/server/api/ai/chat.post.js +0 -8
- package/dist/nuxt/runtime/server/api/ai/chat.post.js.map +0 -1
- package/dist/nuxt/runtime/server/api/ai/complete.post.d.ts +0 -5
- package/dist/nuxt/runtime/server/api/ai/complete.post.js +0 -8
- package/dist/nuxt/runtime/server/api/ai/complete.post.js.map +0 -1
- package/dist/nuxt/runtime/server/api/ai/generate.post.d.ts +0 -5
- package/dist/nuxt/runtime/server/api/ai/generate.post.js +0 -8
- package/dist/nuxt/runtime/server/api/ai/generate.post.js.map +0 -1
- package/dist/nuxt/runtime/server/api/ai/models.get.d.ts +0 -5
- package/dist/nuxt/runtime/server/api/ai/models.get.js +0 -8
- package/dist/nuxt/runtime/server/api/ai/models.get.js.map +0 -1
- package/dist/nuxt/runtime/server/api/ai/transcribe.post.d.ts +0 -5
- package/dist/nuxt/runtime/server/api/ai/transcribe.post.js +0 -8
- package/dist/nuxt/runtime/server/api/ai/transcribe.post.js.map +0 -1
- package/dist/nuxt/runtime/server/api/ai/transcript-cleanup.post.d.ts +0 -5
- package/dist/nuxt/runtime/server/api/ai/transcript-cleanup.post.js +0 -8
- package/dist/nuxt/runtime/server/api/ai/transcript-cleanup.post.js.map +0 -1
- package/dist/nuxt/runtime/server/api/editor/assets/[id]/[name].get.d.ts +0 -5
- package/dist/nuxt/runtime/server/api/editor/assets/[id]/[name].get.js +0 -8
- package/dist/nuxt/runtime/server/api/editor/assets/[id]/[name].get.js.map +0 -1
- package/dist/nuxt/runtime/server/api/editor/assets/[id].post.d.ts +0 -5
- package/dist/nuxt/runtime/server/api/editor/assets/[id].post.js +0 -8
- package/dist/nuxt/runtime/server/api/editor/assets/[id].post.js.map +0 -1
- package/dist/nuxt/runtime/server/api/editor/settings.get.d.ts +0 -5
- package/dist/nuxt/runtime/server/api/editor/settings.get.js +0 -8
- package/dist/nuxt/runtime/server/api/editor/settings.get.js.map +0 -1
- package/dist/nuxt/runtime/server/api/editor/settings.put.d.ts +0 -5
- package/dist/nuxt/runtime/server/api/editor/settings.put.js +0 -8
- package/dist/nuxt/runtime/server/api/editor/settings.put.js.map +0 -1
- package/dist/nuxt/runtime/server/api/editor/tags.get.d.ts +0 -5
- package/dist/nuxt/runtime/server/api/editor/tags.get.js +0 -8
- package/dist/nuxt/runtime/server/api/editor/tags.get.js.map +0 -1
- package/dist/nuxt/runtime/server/api/editor/themes/[id].delete.d.ts +0 -5
- package/dist/nuxt/runtime/server/api/editor/themes/[id].delete.js +0 -8
- package/dist/nuxt/runtime/server/api/editor/themes/[id].delete.js.map +0 -1
- package/dist/nuxt/runtime/server/api/editor/themes/[id].get.d.ts +0 -5
- package/dist/nuxt/runtime/server/api/editor/themes/[id].get.js +0 -8
- package/dist/nuxt/runtime/server/api/editor/themes/[id].get.js.map +0 -1
- package/dist/nuxt/runtime/server/api/editor/themes/index.get.d.ts +0 -5
- package/dist/nuxt/runtime/server/api/editor/themes/index.get.js +0 -8
- package/dist/nuxt/runtime/server/api/editor/themes/index.get.js.map +0 -1
- package/dist/nuxt/runtime/server/api/editor/themes/index.post.d.ts +0 -5
- package/dist/nuxt/runtime/server/api/editor/themes/index.post.js +0 -8
- package/dist/nuxt/runtime/server/api/editor/themes/index.post.js.map +0 -1
- package/dist/nuxt/runtime/server/api/editor/users.get.d.ts +0 -5
- package/dist/nuxt/runtime/server/api/editor/users.get.js +0 -8
- package/dist/nuxt/runtime/server/api/editor/users.get.js.map +0 -1
- package/dist/nuxt/runtime/server/plugins/collab.d.ts +0 -5
- package/dist/nuxt/runtime/server/plugins/collab.js +0 -10
- package/dist/nuxt/runtime/server/plugins/collab.js.map +0 -1
- package/dist/nuxt/runtime/server/routes/collab/[id].d.ts +0 -5
- package/dist/nuxt/runtime/server/routes/collab/[id].js +0 -35
- package/dist/nuxt/runtime/server/routes/collab/[id].js.map +0 -1
- package/dist/nuxt/runtime/server/utils/editor-route.d.ts +0 -11
- package/dist/nuxt/runtime/server/utils/editor-route.js.map +0 -1
- package/dist/presets/advanced.d.ts +0 -33
- package/dist/presets/advanced.js +0 -50
- package/dist/presets/advanced.js.map +0 -1
- package/dist/presets/simple.d.ts +0 -9
- package/dist/presets/simple.js +0 -12
- package/dist/presets/simple.js.map +0 -1
- package/dist/react/advanced-preset.d.ts +0 -11
- package/dist/react/advanced-preset.js +0 -31
- package/dist/react/advanced-preset.js.map +0 -1
- package/dist/vue/advanced-preset.d.ts +0 -13
- package/dist/vue/advanced-preset.js +0 -33
- package/dist/vue/advanced-preset.js.map +0 -1
- package/docs/extending.md +0 -538
- package/docs/integration.md +0 -632
- package/docs/llms.md +0 -383
- package/docs/usage.md +0 -1076
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { metadataOf } from "../../../core/metadata.js";
|
|
2
2
|
import { METADATA_LIST } from "../../../core/metadata-types.js";
|
|
3
|
+
import { formatSegmentTime } from "../segment-node.js";
|
|
3
4
|
import { useEditorI18n } from "../../../react/use-editor-i18n.js";
|
|
4
5
|
import { cn } from "../../../react/ui/utils.js";
|
|
5
6
|
import { SuggestionList } from "../../../react/suggestion-renderer.js";
|
|
@@ -99,6 +100,12 @@ function TranscriptSegmentView({ node, editor, selected, updateAttributes, getPo
|
|
|
99
100
|
editor.commands.focus(getPos() + node.nodeSize - 1);
|
|
100
101
|
}
|
|
101
102
|
};
|
|
103
|
+
/** Seeks and plays the source recording of the enclosing Baustein (a no-op without the composites feature or a source). */
|
|
104
|
+
const seek = () => {
|
|
105
|
+
const start = node.attrs.start;
|
|
106
|
+
const pos = getPos();
|
|
107
|
+
if (typeof start === "number" && pos !== void 0) editor.commands.seekSource?.(pos, start);
|
|
108
|
+
};
|
|
102
109
|
return /* @__PURE__ */ jsx(NodeViewWrapper, {
|
|
103
110
|
className: cn("transcript-segment my-2", selected && "is-selected rounded-md ring-1 ring-primary"),
|
|
104
111
|
"data-type": "transcript-segment",
|
|
@@ -108,43 +115,55 @@ function TranscriptSegmentView({ node, editor, selected, updateAttributes, getPo
|
|
|
108
115
|
children: [/* @__PURE__ */ jsxs("div", {
|
|
109
116
|
className: "transcript-segment__speaker relative pt-0.5",
|
|
110
117
|
contentEditable: false,
|
|
111
|
-
children: [
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
118
|
+
children: [
|
|
119
|
+
/* @__PURE__ */ jsx("input", {
|
|
120
|
+
value: draft,
|
|
121
|
+
title: draft || void 0,
|
|
122
|
+
placeholder: t("transcript.speaker"),
|
|
123
|
+
"aria-label": t("transcript.speaker"),
|
|
124
|
+
autoComplete: "off",
|
|
125
|
+
role: "combobox",
|
|
126
|
+
"aria-expanded": open && items.length > 0,
|
|
127
|
+
readOnly: readonly,
|
|
128
|
+
className: "w-full truncate rounded bg-transparent px-1 text-sm text-muted-foreground outline-none placeholder:text-muted-foreground/60 focus:bg-muted focus:text-foreground",
|
|
129
|
+
onFocus: () => {
|
|
130
|
+
focused.current = true;
|
|
131
|
+
setReadonly(!editor.isEditable);
|
|
132
|
+
},
|
|
133
|
+
onBlur: () => {
|
|
134
|
+
focused.current = false;
|
|
135
|
+
closeList();
|
|
136
|
+
commit();
|
|
137
|
+
},
|
|
138
|
+
onMouseDown: () => openList(""),
|
|
139
|
+
onChange: (e) => {
|
|
140
|
+
setDraft(e.target.value);
|
|
141
|
+
openList(e.target.value);
|
|
142
|
+
},
|
|
143
|
+
onKeyDown
|
|
144
|
+
}),
|
|
145
|
+
node.attrs.start != null && /* @__PURE__ */ jsx("button", {
|
|
146
|
+
type: "button",
|
|
147
|
+
className: "transcript-segment__time block rounded px-1 text-xs tabular-nums text-muted-foreground hover:text-primary hover:underline",
|
|
148
|
+
title: t("transcript.seek", { time: formatSegmentTime(node.attrs.start) }),
|
|
149
|
+
"aria-label": t("transcript.seek", { time: formatSegmentTime(node.attrs.start) }),
|
|
150
|
+
onMouseDown: (e) => e.preventDefault(),
|
|
151
|
+
onClick: seek,
|
|
152
|
+
children: formatSegmentTime(node.attrs.start)
|
|
153
|
+
}),
|
|
154
|
+
open && items.length > 0 && /* @__PURE__ */ jsx("div", {
|
|
155
|
+
className: "absolute top-full left-0 z-50 mt-1",
|
|
156
|
+
children: /* @__PURE__ */ jsx(SuggestionList, {
|
|
157
|
+
ref: list,
|
|
158
|
+
items,
|
|
159
|
+
display: displayItem,
|
|
160
|
+
command: pick,
|
|
161
|
+
loading: false,
|
|
162
|
+
loadingText: "",
|
|
163
|
+
emptyText: ""
|
|
164
|
+
})
|
|
146
165
|
})
|
|
147
|
-
|
|
166
|
+
]
|
|
148
167
|
}), /* @__PURE__ */ jsx(NodeViewContent, { className: "transcript-segment__text" })]
|
|
149
168
|
})
|
|
150
169
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TranscriptSegmentView.js","names":[],"sources":["../../../../src/features/transcript/react/TranscriptSegmentView.tsx"],"sourcesContent":["import { NodeViewContent, NodeViewWrapper, type NodeViewProps } from '@tiptap/react'\nimport { type KeyboardEvent as ReactKeyboardEvent, useCallback, useEffect, useRef, useState } from 'react'\nimport { METADATA_LIST, type MetadataItem, metadataOf } from '../../../core'\nimport { SuggestionList, type SuggestionListHandle } from '../../../react/suggestion-renderer'\nimport { cn } from '../../../react/ui/utils'\nimport { useEditorI18n } from '../../../react/use-editor-i18n'\n\n// Module-level so the list's memoised rows keep their identity across renders.\nconst displayItem = (item: unknown) => ({ label: (item as MetadataItem).label })\n\n/** The speaker segment: the speaker field (with a suggestion list of the `speakers` metadata) beside the editable text. */\nexport function TranscriptSegmentView({ node, editor, selected, updateAttributes, getPos }: NodeViewProps) {\n const { t } = useEditorI18n()\n const speaker = String(node.attrs.speaker ?? '')\n // Typed text is a draft until committed (blur, Enter, picking a suggestion): one undo step per name, and the\n // speaker list is only extended with whole names, not with every prefix typed on the way.\n const [draft, setDraft] = useState(speaker)\n const focused = useRef(false)\n useEffect(() => {\n if (!focused.current) setDraft(speaker)\n }, [speaker])\n // `editor.isEditable` is not reactive, so a read-only editor is detected when the input gets focus.\n const [readonly, setReadonly] = useState(false)\n\n const [open, setOpen] = useState(false)\n const [items, setItems] = useState<MetadataItem[]>([])\n const list = useRef<SuggestionListHandle>(null)\n\n // Same loading as the composite tags: 150 ms after typing pauses, a newer search aborts the older one (sources may be remote).\n const timer = useRef<ReturnType<typeof setTimeout>>(undefined)\n const pending = useRef<AbortController>(undefined)\n const scheduleSearch = (query: string) => {\n clearTimeout(timer.current)\n timer.current = setTimeout(async () => {\n pending.current?.abort()\n const controller = pending.current = new AbortController()\n try {\n const found = await metadataOf(editor).search(METADATA_LIST.speakers, { query, editor, signal: controller.signal })\n if (!controller.signal.aborted) setItems(found.filter(item => item.label.trim()))\n }\n catch (error) {\n if (!controller.signal.aborted) console.warn('Sprecher-Vorschläge konnten nicht geladen werden', error)\n }\n }, 150)\n }\n useEffect(() => () => {\n clearTimeout(timer.current)\n pending.current?.abort()\n }, [])\n\n const openList = (query: string) => {\n if (!editor.isEditable) return\n setOpen(true)\n scheduleSearch(query)\n }\n\n const closeList = useCallback(() => {\n setOpen(false)\n clearTimeout(timer.current)\n pending.current?.abort()\n }, [])\n\n /** Writes the draft to the node; a name the speaker list does not know yet is added to it (reported via `metadataCreate`). */\n const commit = async (name = draft.trim()) => {\n setDraft(name)\n if (readonly || name === speaker) return\n // Searched before the node changes: `search` calls the source synchronously, so a list derived from the document\n // (the default `speakers`) does not already contain the name just typed here.\n const found = name ? metadataOf(editor).search(METADATA_LIST.speakers, { query: name, editor }) : null\n updateAttributes({ speaker: name })\n if (!found) return\n if (!(await found).some(item => item.label.toLowerCase() === name.toLowerCase())) {\n metadataOf(editor).create(METADATA_LIST.speakers, { id: name, label: name })\n }\n }\n\n const pick = (item: unknown) => {\n closeList()\n void commit((item as MetadataItem).label)\n }\n\n /** The speaker field of the segment `step` places before/after this one (document order), if any. */\n const neighbourField = (input: HTMLInputElement, step: -1 | 1): HTMLInputElement | undefined => {\n const fields = [...editor.view.dom.querySelectorAll<HTMLInputElement>('.transcript-segment__speaker input')]\n return fields[fields.indexOf(input) + step]\n }\n\n // An open list takes ArrowUp/ArrowDown/Enter/Tab; otherwise ArrowUp/ArrowDown move to the neighbouring segment's\n // speaker and Enter continues in this segment's text.\n const onKeyDown = (e: ReactKeyboardEvent<HTMLInputElement>) => {\n if (open && items.length && list.current?.onKeyDown(e.nativeEvent)) {\n e.preventDefault()\n return\n }\n const input = e.currentTarget\n if (e.key === 'Escape' && open) {\n e.preventDefault()\n closeList()\n }\n else if (e.key === 'ArrowUp' || e.key === 'ArrowDown') {\n const next = neighbourField(input, e.key === 'ArrowUp' ? -1 : 1)\n if (!next) return\n e.preventDefault()\n next.focus()\n next.setSelectionRange(next.value.length, next.value.length)\n }\n else if (e.key === 'Enter') {\n e.preventDefault()\n input.blur()\n editor.commands.focus(getPos()! + node.nodeSize - 1)\n }\n }\n\n return (\n <NodeViewWrapper\n className={cn('transcript-segment my-2', selected && 'is-selected rounded-md ring-1 ring-primary')}\n data-type=\"transcript-segment\"\n data-id={node.attrs.id || undefined}\n >\n <div className=\"grid grid-cols-[5.5rem_1fr] items-start gap-2\">\n <div className=\"transcript-segment__speaker relative pt-0.5\" contentEditable={false}>\n <input\n value={draft}\n title={draft || undefined}\n placeholder={t('transcript.speaker')}\n aria-label={t('transcript.speaker')}\n autoComplete=\"off\"\n role=\"combobox\"\n aria-expanded={open && items.length > 0}\n readOnly={readonly}\n className=\"w-full truncate rounded bg-transparent px-1 text-sm text-muted-foreground outline-none placeholder:text-muted-foreground/60 focus:bg-muted focus:text-foreground\"\n onFocus={() => {\n focused.current = true\n setReadonly(!editor.isEditable)\n }}\n onBlur={() => {\n focused.current = false\n closeList()\n void commit()\n }}\n onMouseDown={() => openList('')}\n onChange={(e) => {\n setDraft(e.target.value)\n openList(e.target.value)\n }}\n onKeyDown={onKeyDown}\n />\n {open && items.length > 0 && (\n <div className=\"absolute top-full left-0 z-50 mt-1\">\n <SuggestionList ref={list} items={items} display={displayItem} command={pick} loading={false} loadingText=\"\" emptyText=\"\" />\n </div>\n )}\n </div>\n <NodeViewContent className=\"transcript-segment__text\" />\n </div>\n </NodeViewWrapper>\n )\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"TranscriptSegmentView.js","names":[],"sources":["../../../../src/features/transcript/react/TranscriptSegmentView.tsx"],"sourcesContent":["import { NodeViewContent, NodeViewWrapper, type NodeViewProps } from '@tiptap/react'\nimport { type KeyboardEvent as ReactKeyboardEvent, useCallback, useEffect, useRef, useState } from 'react'\nimport { METADATA_LIST, type MetadataItem, metadataOf } from '../../../core'\nimport { SuggestionList, type SuggestionListHandle } from '../../../react/suggestion-renderer'\nimport { cn } from '../../../react/ui/utils'\nimport { useEditorI18n } from '../../../react/use-editor-i18n'\nimport { formatSegmentTime } from '../segment-node'\n\n// Module-level so the list's memoised rows keep their identity across renders.\nconst displayItem = (item: unknown) => ({ label: (item as MetadataItem).label })\n\n/** The speaker segment: the speaker field (with a suggestion list of the `speakers` metadata) beside the editable text. */\nexport function TranscriptSegmentView({ node, editor, selected, updateAttributes, getPos }: NodeViewProps) {\n const { t } = useEditorI18n()\n const speaker = String(node.attrs.speaker ?? '')\n // Typed text is a draft until committed (blur, Enter, picking a suggestion): one undo step per name, and the\n // speaker list is only extended with whole names, not with every prefix typed on the way.\n const [draft, setDraft] = useState(speaker)\n const focused = useRef(false)\n useEffect(() => {\n if (!focused.current) setDraft(speaker)\n }, [speaker])\n // `editor.isEditable` is not reactive, so a read-only editor is detected when the input gets focus.\n const [readonly, setReadonly] = useState(false)\n\n const [open, setOpen] = useState(false)\n const [items, setItems] = useState<MetadataItem[]>([])\n const list = useRef<SuggestionListHandle>(null)\n\n // Same loading as the composite tags: 150 ms after typing pauses, a newer search aborts the older one (sources may be remote).\n const timer = useRef<ReturnType<typeof setTimeout>>(undefined)\n const pending = useRef<AbortController>(undefined)\n const scheduleSearch = (query: string) => {\n clearTimeout(timer.current)\n timer.current = setTimeout(async () => {\n pending.current?.abort()\n const controller = pending.current = new AbortController()\n try {\n const found = await metadataOf(editor).search(METADATA_LIST.speakers, { query, editor, signal: controller.signal })\n if (!controller.signal.aborted) setItems(found.filter(item => item.label.trim()))\n }\n catch (error) {\n if (!controller.signal.aborted) console.warn('Sprecher-Vorschläge konnten nicht geladen werden', error)\n }\n }, 150)\n }\n useEffect(() => () => {\n clearTimeout(timer.current)\n pending.current?.abort()\n }, [])\n\n const openList = (query: string) => {\n if (!editor.isEditable) return\n setOpen(true)\n scheduleSearch(query)\n }\n\n const closeList = useCallback(() => {\n setOpen(false)\n clearTimeout(timer.current)\n pending.current?.abort()\n }, [])\n\n /** Writes the draft to the node; a name the speaker list does not know yet is added to it (reported via `metadataCreate`). */\n const commit = async (name = draft.trim()) => {\n setDraft(name)\n if (readonly || name === speaker) return\n // Searched before the node changes: `search` calls the source synchronously, so a list derived from the document\n // (the default `speakers`) does not already contain the name just typed here.\n const found = name ? metadataOf(editor).search(METADATA_LIST.speakers, { query: name, editor }) : null\n updateAttributes({ speaker: name })\n if (!found) return\n if (!(await found).some(item => item.label.toLowerCase() === name.toLowerCase())) {\n metadataOf(editor).create(METADATA_LIST.speakers, { id: name, label: name })\n }\n }\n\n const pick = (item: unknown) => {\n closeList()\n void commit((item as MetadataItem).label)\n }\n\n /** The speaker field of the segment `step` places before/after this one (document order), if any. */\n const neighbourField = (input: HTMLInputElement, step: -1 | 1): HTMLInputElement | undefined => {\n const fields = [...editor.view.dom.querySelectorAll<HTMLInputElement>('.transcript-segment__speaker input')]\n return fields[fields.indexOf(input) + step]\n }\n\n // An open list takes ArrowUp/ArrowDown/Enter/Tab; otherwise ArrowUp/ArrowDown move to the neighbouring segment's\n // speaker and Enter continues in this segment's text.\n const onKeyDown = (e: ReactKeyboardEvent<HTMLInputElement>) => {\n if (open && items.length && list.current?.onKeyDown(e.nativeEvent)) {\n e.preventDefault()\n return\n }\n const input = e.currentTarget\n if (e.key === 'Escape' && open) {\n e.preventDefault()\n closeList()\n }\n else if (e.key === 'ArrowUp' || e.key === 'ArrowDown') {\n const next = neighbourField(input, e.key === 'ArrowUp' ? -1 : 1)\n if (!next) return\n e.preventDefault()\n next.focus()\n next.setSelectionRange(next.value.length, next.value.length)\n }\n else if (e.key === 'Enter') {\n e.preventDefault()\n input.blur()\n editor.commands.focus(getPos()! + node.nodeSize - 1)\n }\n }\n\n /** Seeks and plays the source recording of the enclosing Baustein (a no-op without the composites feature or a source). */\n const seek = () => {\n const start = node.attrs.start\n const pos = getPos()\n // `seekSource` is contributed by the composites feature; without it the editor has no command and the click does nothing.\n if (typeof start === 'number' && pos !== undefined) editor.commands.seekSource?.(pos, start)\n }\n\n return (\n <NodeViewWrapper\n className={cn('transcript-segment my-2', selected && 'is-selected rounded-md ring-1 ring-primary')}\n data-type=\"transcript-segment\"\n data-id={node.attrs.id || undefined}\n >\n <div className=\"grid grid-cols-[5.5rem_1fr] items-start gap-2\">\n <div className=\"transcript-segment__speaker relative pt-0.5\" contentEditable={false}>\n <input\n value={draft}\n title={draft || undefined}\n placeholder={t('transcript.speaker')}\n aria-label={t('transcript.speaker')}\n autoComplete=\"off\"\n role=\"combobox\"\n aria-expanded={open && items.length > 0}\n readOnly={readonly}\n className=\"w-full truncate rounded bg-transparent px-1 text-sm text-muted-foreground outline-none placeholder:text-muted-foreground/60 focus:bg-muted focus:text-foreground\"\n onFocus={() => {\n focused.current = true\n setReadonly(!editor.isEditable)\n }}\n onBlur={() => {\n focused.current = false\n closeList()\n void commit()\n }}\n onMouseDown={() => openList('')}\n onChange={(e) => {\n setDraft(e.target.value)\n openList(e.target.value)\n }}\n onKeyDown={onKeyDown}\n />\n {node.attrs.start != null && (\n <button\n type=\"button\"\n className=\"transcript-segment__time block rounded px-1 text-xs tabular-nums text-muted-foreground hover:text-primary hover:underline\"\n title={t('transcript.seek', { time: formatSegmentTime(node.attrs.start) })}\n aria-label={t('transcript.seek', { time: formatSegmentTime(node.attrs.start) })}\n onMouseDown={e => e.preventDefault()}\n onClick={seek}\n >\n {formatSegmentTime(node.attrs.start)}\n </button>\n )}\n {open && items.length > 0 && (\n <div className=\"absolute top-full left-0 z-50 mt-1\">\n <SuggestionList ref={list} items={items} display={displayItem} command={pick} loading={false} loadingText=\"\" emptyText=\"\" />\n </div>\n )}\n </div>\n <NodeViewContent className=\"transcript-segment__text\" />\n </div>\n </NodeViewWrapper>\n )\n}\n"],"mappings":";;;;;;;;;;AASA,MAAM,eAAe,UAAmB,EAAE,OAAQ,KAAsB,MAAM;;AAG9E,SAAgB,sBAAsB,EAAE,MAAM,QAAQ,UAAU,kBAAkB,UAAyB;CACzG,MAAM,EAAE,MAAM,cAAc;CAC5B,MAAM,UAAU,OAAO,KAAK,MAAM,WAAW,EAAE;CAG/C,MAAM,CAAC,OAAO,YAAY,SAAS,OAAO;CAC1C,MAAM,UAAU,OAAO,KAAK;CAC5B,gBAAgB;EACd,IAAI,CAAC,QAAQ,SAAS,SAAS,OAAO;CACxC,GAAG,CAAC,OAAO,CAAC;CAEZ,MAAM,CAAC,UAAU,eAAe,SAAS,KAAK;CAE9C,MAAM,CAAC,MAAM,WAAW,SAAS,KAAK;CACtC,MAAM,CAAC,OAAO,YAAY,SAAyB,CAAC,CAAC;CACrD,MAAM,OAAO,OAA6B,IAAI;CAG9C,MAAM,QAAQ,OAAsC,KAAA,CAAS;CAC7D,MAAM,UAAU,OAAwB,KAAA,CAAS;CACjD,MAAM,kBAAkB,UAAkB;EACxC,aAAa,MAAM,OAAO;EAC1B,MAAM,UAAU,WAAW,YAAY;GACrC,QAAQ,SAAS,MAAM;GACvB,MAAM,aAAa,QAAQ,UAAU,IAAI,gBAAgB;GACzD,IAAI;IACF,MAAM,QAAQ,MAAM,WAAW,MAAM,CAAC,CAAC,OAAO,cAAc,UAAU;KAAE;KAAO;KAAQ,QAAQ,WAAW;IAAO,CAAC;IAClH,IAAI,CAAC,WAAW,OAAO,SAAS,SAAS,MAAM,QAAO,SAAQ,KAAK,MAAM,KAAK,CAAC,CAAC;GAClF,SACO,OAAO;IACZ,IAAI,CAAC,WAAW,OAAO,SAAS,QAAQ,KAAK,oDAAoD,KAAK;GACxG;EACF,GAAG,GAAG;CACR;CACA,sBAAsB;EACpB,aAAa,MAAM,OAAO;EAC1B,QAAQ,SAAS,MAAM;CACzB,GAAG,CAAC,CAAC;CAEL,MAAM,YAAY,UAAkB;EAClC,IAAI,CAAC,OAAO,YAAY;EACxB,QAAQ,IAAI;EACZ,eAAe,KAAK;CACtB;CAEA,MAAM,YAAY,kBAAkB;EAClC,QAAQ,KAAK;EACb,aAAa,MAAM,OAAO;EAC1B,QAAQ,SAAS,MAAM;CACzB,GAAG,CAAC,CAAC;;CAGL,MAAM,SAAS,OAAO,OAAO,MAAM,KAAK,MAAM;EAC5C,SAAS,IAAI;EACb,IAAI,YAAY,SAAS,SAAS;EAGlC,MAAM,QAAQ,OAAO,WAAW,MAAM,CAAC,CAAC,OAAO,cAAc,UAAU;GAAE,OAAO;GAAM;EAAO,CAAC,IAAI;EAClG,iBAAiB,EAAE,SAAS,KAAK,CAAC;EAClC,IAAI,CAAC,OAAO;EACZ,IAAI,EAAE,MAAM,MAAA,CAAO,MAAK,SAAQ,KAAK,MAAM,YAAY,MAAM,KAAK,YAAY,CAAC,GAC7E,WAAW,MAAM,CAAC,CAAC,OAAO,cAAc,UAAU;GAAE,IAAI;GAAM,OAAO;EAAK,CAAC;CAE/E;CAEA,MAAM,QAAQ,SAAkB;EAC9B,UAAU;EACV,OAAa,KAAsB,KAAK;CAC1C;;CAGA,MAAM,kBAAkB,OAAyB,SAA+C;EAC9F,MAAM,SAAS,CAAC,GAAG,OAAO,KAAK,IAAI,iBAAmC,oCAAoC,CAAC;EAC3G,OAAO,OAAO,OAAO,QAAQ,KAAK,IAAI;CACxC;CAIA,MAAM,aAAa,MAA4C;EAC7D,IAAI,QAAQ,MAAM,UAAU,KAAK,SAAS,UAAU,EAAE,WAAW,GAAG;GAClE,EAAE,eAAe;GACjB;EACF;EACA,MAAM,QAAQ,EAAE;EAChB,IAAI,EAAE,QAAQ,YAAY,MAAM;GAC9B,EAAE,eAAe;GACjB,UAAU;EACZ,OACK,IAAI,EAAE,QAAQ,aAAa,EAAE,QAAQ,aAAa;GACrD,MAAM,OAAO,eAAe,OAAO,EAAE,QAAQ,YAAY,KAAK,CAAC;GAC/D,IAAI,CAAC,MAAM;GACX,EAAE,eAAe;GACjB,KAAK,MAAM;GACX,KAAK,kBAAkB,KAAK,MAAM,QAAQ,KAAK,MAAM,MAAM;EAC7D,OACK,IAAI,EAAE,QAAQ,SAAS;GAC1B,EAAE,eAAe;GACjB,MAAM,KAAK;GACX,OAAO,SAAS,MAAM,OAAO,IAAK,KAAK,WAAW,CAAC;EACrD;CACF;;CAGA,MAAM,aAAa;EACjB,MAAM,QAAQ,KAAK,MAAM;EACzB,MAAM,MAAM,OAAO;EAEnB,IAAI,OAAO,UAAU,YAAY,QAAQ,KAAA,GAAW,OAAO,SAAS,aAAa,KAAK,KAAK;CAC7F;CAEA,OACE,oBAAC,iBAAD;EACE,WAAW,GAAG,2BAA2B,YAAY,4CAA4C;EACjG,aAAU;EACV,WAAS,KAAK,MAAM,MAAM,KAAA;EAE1B,UAAA,qBAAC,OAAD;GAAK,WAAU;GAAf,UAAA,CACE,qBAAC,OAAD;IAAK,WAAU;IAA8C,iBAAiB;IAA9E,UAAA;KACE,oBAAC,SAAD;MACE,OAAO;MACP,OAAO,SAAS,KAAA;MAChB,aAAa,EAAE,oBAAoB;MACnC,cAAY,EAAE,oBAAoB;MAClC,cAAa;MACb,MAAK;MACL,iBAAe,QAAQ,MAAM,SAAS;MACtC,UAAU;MACV,WAAU;MACV,eAAe;OACb,QAAQ,UAAU;OAClB,YAAY,CAAC,OAAO,UAAU;MAChC;MACA,cAAc;OACZ,QAAQ,UAAU;OAClB,UAAU;OACV,OAAY;MACd;MACA,mBAAmB,SAAS,EAAE;MAC9B,WAAW,MAAM;OACf,SAAS,EAAE,OAAO,KAAK;OACvB,SAAS,EAAE,OAAO,KAAK;MACzB;MACW;KACZ,CAAA;KACA,KAAK,MAAM,SAAS,QACnB,oBAAC,UAAD;MACE,MAAK;MACL,WAAU;MACV,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,KAAK,MAAM,KAAK,EAAE,CAAC;MACzE,cAAY,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,KAAK,MAAM,KAAK,EAAE,CAAC;MAC9E,cAAa,MAAK,EAAE,eAAe;MACnC,SAAS;MAER,UAAA,kBAAkB,KAAK,MAAM,KAAK;KAC7B,CAAA;KAET,QAAQ,MAAM,SAAS,KACtB,oBAAC,OAAD;MAAK,WAAU;MACb,UAAA,oBAAC,gBAAD;OAAgB,KAAK;OAAa;OAAO,SAAS;OAAa,SAAS;OAAM,SAAS;OAAO,aAAY;OAAG,WAAU;MAAI,CAAA;KACxH,CAAA;IAEJ;GACL,CAAA,GAAA,oBAAC,iBAAD,EAAiB,WAAU,2BAA4B,CAAA,CACpD;;CACU,CAAA;AAErB"}
|
|
@@ -6,6 +6,8 @@ declare module '@tiptap/core' {
|
|
|
6
6
|
/** Turn the current block into a speaker segment (or back into a paragraph when it already is one). */
|
|
7
7
|
toggleTranscriptSegment: (attrs?: {
|
|
8
8
|
speaker?: string;
|
|
9
|
+
start?: number | null;
|
|
10
|
+
end?: number | null;
|
|
9
11
|
}) => ReturnType;
|
|
10
12
|
};
|
|
11
13
|
}
|
|
@@ -7,6 +7,18 @@ import { canSplit } from "@tiptap/pm/transform";
|
|
|
7
7
|
const UNNAMED_SPEAKER = "Sprecher";
|
|
8
8
|
/** Longer bold paragraph openers („**Bitte beachten Sie Folgendes:** …“) are not treated as speaker labels. */
|
|
9
9
|
const MAX_SPEAKER_LENGTH = 80;
|
|
10
|
+
/** A `data-start`/`data-end` attribute as seconds; null when missing or not a non-negative number. */
|
|
11
|
+
function timeAttr(value) {
|
|
12
|
+
if (value === null || value.trim() === "") return null;
|
|
13
|
+
const seconds = Number(value);
|
|
14
|
+
return Number.isFinite(seconds) && seconds >= 0 ? seconds : null;
|
|
15
|
+
}
|
|
16
|
+
/** `mm:ss` of a segment time in seconds (minutes keep counting past 59: `75:03`); '' for null / not a number. */
|
|
17
|
+
function formatSegmentTime(seconds) {
|
|
18
|
+
if (typeof seconds !== "number" || !Number.isFinite(seconds) || seconds < 0) return "";
|
|
19
|
+
const whole = Math.floor(seconds);
|
|
20
|
+
return `${String(Math.floor(whole / 60)).padStart(2, "0")}:${String(whole % 60).padStart(2, "0")}`;
|
|
21
|
+
}
|
|
10
22
|
const TranscriptSegmentNode = Node.create({
|
|
11
23
|
name: "transcriptSegment",
|
|
12
24
|
priority: 101,
|
|
@@ -23,11 +35,23 @@ const TranscriptSegmentNode = Node.create({
|
|
|
23
35
|
ABILITY.record
|
|
24
36
|
] },
|
|
25
37
|
defining: true,
|
|
26
|
-
addAttributes: () => ({
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
38
|
+
addAttributes: () => ({
|
|
39
|
+
speaker: {
|
|
40
|
+
default: "",
|
|
41
|
+
parseHTML: (el) => el.getAttribute("data-speaker") ?? "",
|
|
42
|
+
renderHTML: (attrs) => ({ "data-speaker": attrs.speaker })
|
|
43
|
+
},
|
|
44
|
+
start: {
|
|
45
|
+
default: null,
|
|
46
|
+
parseHTML: (el) => timeAttr(el.getAttribute("data-start")),
|
|
47
|
+
renderHTML: (attrs) => attrs.start == null ? {} : { "data-start": attrs.start }
|
|
48
|
+
},
|
|
49
|
+
end: {
|
|
50
|
+
default: null,
|
|
51
|
+
parseHTML: (el) => timeAttr(el.getAttribute("data-end")),
|
|
52
|
+
renderHTML: (attrs) => attrs.end == null ? {} : { "data-end": attrs.end }
|
|
53
|
+
}
|
|
54
|
+
}),
|
|
31
55
|
parseHTML: () => [{ tag: "div[data-type=\"transcript-segment\"]" }],
|
|
32
56
|
renderHTML: ({ HTMLAttributes }) => [
|
|
33
57
|
"div",
|
|
@@ -36,7 +60,11 @@ const TranscriptSegmentNode = Node.create({
|
|
|
36
60
|
],
|
|
37
61
|
renderMarkdown: (node, h) => `**${String(node.attrs?.speaker || UNNAMED_SPEAKER).replace(/[\\*_`[\]<>~]/g, "\\$&")}:** ${h.renderChildren(node.content ?? [])}`,
|
|
38
62
|
addCommands() {
|
|
39
|
-
return { toggleTranscriptSegment: (attrs = {}) => ({ editor, commands }) => editor.isActive(this.name) ? commands.setNode("paragraph") : commands.setNode(this.name, {
|
|
63
|
+
return { toggleTranscriptSegment: (attrs = {}) => ({ editor, commands }) => editor.isActive(this.name) ? commands.setNode("paragraph") : commands.setNode(this.name, {
|
|
64
|
+
speaker: attrs.speaker ?? lastSpeaker(editor.state.doc),
|
|
65
|
+
start: attrs.start ?? null,
|
|
66
|
+
end: attrs.end ?? null
|
|
67
|
+
}) };
|
|
40
68
|
},
|
|
41
69
|
addKeyboardShortcuts() {
|
|
42
70
|
return {
|
|
@@ -108,6 +136,6 @@ function speakerParagraphsToSegments(doc) {
|
|
|
108
136
|
};
|
|
109
137
|
}
|
|
110
138
|
//#endregion
|
|
111
|
-
export { TranscriptSegmentNode, speakerParagraphsToSegments };
|
|
139
|
+
export { TranscriptSegmentNode, formatSegmentTime, speakerParagraphsToSegments };
|
|
112
140
|
|
|
113
141
|
//# sourceMappingURL=segment-node.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"segment-node.js","names":[],"sources":["../../../src/features/transcript/segment-node.ts"],"sourcesContent":["import { type JSONContent, mergeAttributes, Node } from '@tiptap/core'\nimport { canSplit } from '@tiptap/pm/transform'\nimport { ABILITY } from '../../core/schema'\nimport { lastSpeaker } from './speakers'\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n transcriptSegment: {\n /** Turn the current block into a speaker segment (or back into a paragraph when it already is one). */\n toggleTranscriptSegment: (attrs?: { speaker?: string }) => ReturnType\n }\n }\n}\n\n/** Markdown label for a segment without speaker; read back as an empty speaker so export → import round-trips. */\nconst UNNAMED_SPEAKER = 'Sprecher'\n/** Longer bold paragraph openers („**Bitte beachten Sie Folgendes:** …“) are not treated as speaker labels. */\nconst MAX_SPEAKER_LENGTH = 80\n\n// Schema-only node (no node view): shared by the client editor and the server-side Yjs seeding.\n// The client adds its node view in node-view.ts.\nexport const TranscriptSegmentNode = Node.create({\n name: 'transcriptSegment',\n // Above StarterKit's default (100) so this Enter / Mod-Shift-s keymap runs first,\n // below Paragraph (1000) so the paragraph stays the schema's default block.\n priority: 101,\n group: 'block',\n content: 'inline*',\n // A speaker turn is plain running text: no structural blocks or media inside it.\n abilities: {\n revokes: [ABILITY.headings, ABILITY.lists, ABILITY.blockquote, ABILITY.codeBlock, ABILITY.blockContent, ABILITY.composite, ABILITY.media, ABILITY.record],\n },\n defining: true,\n addAttributes: () => ({\n speaker: {\n default: '',\n parseHTML: (el) => el.getAttribute('data-speaker') ?? '',\n renderHTML: (attrs) => ({ 'data-speaker': attrs.speaker }),\n },\n }),\n parseHTML: () => [{ tag: 'div[data-type=\"transcript-segment\"]' }],\n renderHTML: ({ HTMLAttributes }) => ['div', mergeAttributes(HTMLAttributes, { 'data-type': 'transcript-segment' }), 0],\n // Markdown export (editor.getMarkdown(), AI context/selection) keeps the speaker visible to the model as\n // `**Name:** text`. Import goes through speakerParagraphsToSegments() below, not parseMarkdown: marked yields\n // an ordinary paragraph token, and Paragraph (priority 1000) would always win that token over this node.\n // Backslash-escaped ASCII punctuation parses back to the literal character, so odd names survive the round-trip.\n // No trailing newline: the serializer separates blocks itself; extra blank lines re-import as empty paragraphs.\n renderMarkdown: (node, h) => `**${String(node.attrs?.speaker || UNNAMED_SPEAKER).replace(/[\\\\*_`[\\]<>~]/g, '\\\\$&')}:** ${h.renderChildren(node.content ?? [])}`,\n addCommands() {\n return {\n toggleTranscriptSegment: (attrs = {}) => ({ editor, commands }) =>\n editor.isActive(this.name)\n ? commands.setNode('paragraph')\n : commands.setNode(this.name, { speaker: attrs.speaker ?? lastSpeaker(editor.state.doc) }),\n }\n },\n addKeyboardShortcuts() {\n return {\n // Enter inside a segment splits it into two segments with the same speaker — at the start, middle\n // or end alike. `splitBlock` is not used: it creates the default block (paragraph) at the end and\n // re-types the first half at the start. Shift-Enter keeps StarterKit's hard break.\n Enter: () => {\n const { $from } = this.editor.state.selection\n if ($from.parent.type.name !== this.name) return false\n const type = $from.parent.type\n const speaker = String($from.parent.attrs.speaker ?? '')\n return this.editor.commands.command(({ tr, state, dispatch }) => {\n const marks = state.storedMarks ?? ($from.parentOffset ? $from.marks() : null)\n const after = [{ type, attrs: { speaker } }]\n if (!canSplit(state.doc, state.selection.from, 1, after)) return false\n if (dispatch) {\n if (!tr.selection.empty) tr.deleteSelection()\n tr.split(tr.selection.from, 1, after)\n if (marks) tr.ensureMarks(marks)\n tr.scrollIntoView()\n }\n return true\n })\n },\n 'Mod-Shift-s': () => this.editor.commands.toggleTranscriptSegment(),\n }\n },\n})\n\n/**\n * Speaker name of a speaker line, i.e. a paragraph whose first inline node is bold-only text `Name:`\n * (Markdown `**Name:** text`), or null. Bold elsewhere in the paragraph does not count.\n */\nfunction speakerOf(block: JSONContent): string | null {\n const first = block.content?.[0]\n if (block.type !== 'paragraph' || first?.type !== 'text' || !first.text?.endsWith(':')) return null\n if (first.marks?.length !== 1 || first.marks[0]!.type !== 'bold') return null\n const name = first.text.slice(0, -1).trim()\n if (!name || name.length > MAX_SPEAKER_LENGTH || name.includes('\\n')) return null\n return name\n}\n\n/**\n * Turns top-level speaker-line paragraphs of parsed Markdown into transcriptSegment nodes (the inverse of\n * renderMarkdown above); every other block is returned unchanged. Applied to AI results on both apply paths.\n * A label without text (`**Aufgaben:**` above a list) is a bold pseudo-heading, not an empty turn, and stays a paragraph.\n */\nexport function speakerParagraphsToSegments(doc: JSONContent): JSONContent {\n if (!doc.content) return doc\n return {\n ...doc,\n content: doc.content.map((block) => {\n const name = speakerOf(block)\n if (name === null) return block\n const content = block.content!.slice(1)\n if (content.every(node => node.type === 'text' && !node.text?.trim())) return block\n const next = content[0]\n // renderMarkdown puts exactly one space between label and text; drop only that one.\n if (next?.type === 'text' && next.text && /^\\s/.test(next.text)) {\n if (next.text.length === 1) content.shift()\n else content[0] = { ...next, text: next.text.slice(1) }\n }\n return { type: 'transcriptSegment', attrs: { speaker: name === UNNAMED_SPEAKER ? '' : name }, content }\n }),\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"segment-node.js","names":[],"sources":["../../../src/features/transcript/segment-node.ts"],"sourcesContent":["import { type JSONContent, mergeAttributes, Node } from '@tiptap/core'\nimport { canSplit } from '@tiptap/pm/transform'\nimport { ABILITY } from '../../core/schema'\nimport { lastSpeaker } from './speakers'\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n transcriptSegment: {\n /** Turn the current block into a speaker segment (or back into a paragraph when it already is one). */\n toggleTranscriptSegment: (attrs?: { speaker?: string, start?: number | null, end?: number | null }) => ReturnType\n }\n }\n}\n\n/** Markdown label for a segment without speaker; read back as an empty speaker so export → import round-trips. */\nconst UNNAMED_SPEAKER = 'Sprecher'\n/** Longer bold paragraph openers („**Bitte beachten Sie Folgendes:** …“) are not treated as speaker labels. */\nconst MAX_SPEAKER_LENGTH = 80\n\n/** A `data-start`/`data-end` attribute as seconds; null when missing or not a non-negative number. */\nfunction timeAttr(value: string | null): number | null {\n if (value === null || value.trim() === '') return null\n const seconds = Number(value)\n return Number.isFinite(seconds) && seconds >= 0 ? seconds : null\n}\n\n/** `mm:ss` of a segment time in seconds (minutes keep counting past 59: `75:03`); '' for null / not a number. */\nexport function formatSegmentTime(seconds: unknown): string {\n if (typeof seconds !== 'number' || !Number.isFinite(seconds) || seconds < 0) return ''\n const whole = Math.floor(seconds)\n return `${String(Math.floor(whole / 60)).padStart(2, '0')}:${String(whole % 60).padStart(2, '0')}`\n}\n\n// Schema-only node (no node view): shared by the client editor and the server-side Yjs seeding.\n// The client adds its node view in node-view.ts.\nexport const TranscriptSegmentNode = Node.create({\n name: 'transcriptSegment',\n // Above StarterKit's default (100) so this Enter / Mod-Shift-s keymap runs first,\n // below Paragraph (1000) so the paragraph stays the schema's default block.\n priority: 101,\n group: 'block',\n content: 'inline*',\n // A speaker turn is plain running text: no structural blocks or media inside it.\n abilities: {\n revokes: [ABILITY.headings, ABILITY.lists, ABILITY.blockquote, ABILITY.codeBlock, ABILITY.blockContent, ABILITY.composite, ABILITY.media, ABILITY.record],\n },\n defining: true,\n addAttributes: () => ({\n speaker: {\n default: '',\n parseHTML: (el) => el.getAttribute('data-speaker') ?? '',\n renderHTML: (attrs) => ({ 'data-speaker': attrs.speaker }),\n },\n // Seconds into the recording of the enclosing source-holding Baustein; null for a segment without timing.\n start: {\n default: null,\n parseHTML: el => timeAttr(el.getAttribute('data-start')),\n renderHTML: attrs => (attrs.start == null ? {} : { 'data-start': attrs.start }),\n },\n end: {\n default: null,\n parseHTML: el => timeAttr(el.getAttribute('data-end')),\n renderHTML: attrs => (attrs.end == null ? {} : { 'data-end': attrs.end }),\n },\n }),\n parseHTML: () => [{ tag: 'div[data-type=\"transcript-segment\"]' }],\n renderHTML: ({ HTMLAttributes }) => ['div', mergeAttributes(HTMLAttributes, { 'data-type': 'transcript-segment' }), 0],\n // Markdown export (editor.getMarkdown(), AI context/selection) keeps the speaker visible to the model as\n // `**Name:** text`; `start`/`end` (seconds into the source recording) live in JSON/Yjs only and are not part of the\n // Markdown, so the Markdown output of a segment is the same with or without timestamps.\n // Import goes through speakerParagraphsToSegments() below, not parseMarkdown: marked yields\n // an ordinary paragraph token, and Paragraph (priority 1000) would always win that token over this node.\n // Backslash-escaped ASCII punctuation parses back to the literal character, so odd names survive the round-trip.\n // No trailing newline: the serializer separates blocks itself; extra blank lines re-import as empty paragraphs.\n renderMarkdown: (node, h) => `**${String(node.attrs?.speaker || UNNAMED_SPEAKER).replace(/[\\\\*_`[\\]<>~]/g, '\\\\$&')}:** ${h.renderChildren(node.content ?? [])}`,\n addCommands() {\n return {\n toggleTranscriptSegment: (attrs = {}) => ({ editor, commands }) =>\n editor.isActive(this.name)\n ? commands.setNode('paragraph')\n : commands.setNode(this.name, { speaker: attrs.speaker ?? lastSpeaker(editor.state.doc), start: attrs.start ?? null, end: attrs.end ?? null }),\n }\n },\n addKeyboardShortcuts() {\n return {\n // Enter inside a segment splits it into two segments with the same speaker — at the start, middle\n // or end alike. `splitBlock` is not used: it creates the default block (paragraph) at the end and\n // re-types the first half at the start. Shift-Enter keeps StarterKit's hard break.\n Enter: () => {\n const { $from } = this.editor.state.selection\n if ($from.parent.type.name !== this.name) return false\n const type = $from.parent.type\n const speaker = String($from.parent.attrs.speaker ?? '')\n return this.editor.commands.command(({ tr, state, dispatch }) => {\n const marks = state.storedMarks ?? ($from.parentOffset ? $from.marks() : null)\n const after = [{ type, attrs: { speaker } }]\n if (!canSplit(state.doc, state.selection.from, 1, after)) return false\n if (dispatch) {\n if (!tr.selection.empty) tr.deleteSelection()\n tr.split(tr.selection.from, 1, after)\n if (marks) tr.ensureMarks(marks)\n tr.scrollIntoView()\n }\n return true\n })\n },\n 'Mod-Shift-s': () => this.editor.commands.toggleTranscriptSegment(),\n }\n },\n})\n\n/**\n * Speaker name of a speaker line, i.e. a paragraph whose first inline node is bold-only text `Name:`\n * (Markdown `**Name:** text`), or null. Bold elsewhere in the paragraph does not count.\n */\nfunction speakerOf(block: JSONContent): string | null {\n const first = block.content?.[0]\n if (block.type !== 'paragraph' || first?.type !== 'text' || !first.text?.endsWith(':')) return null\n if (first.marks?.length !== 1 || first.marks[0]!.type !== 'bold') return null\n const name = first.text.slice(0, -1).trim()\n if (!name || name.length > MAX_SPEAKER_LENGTH || name.includes('\\n')) return null\n return name\n}\n\n/**\n * Turns top-level speaker-line paragraphs of parsed Markdown into transcriptSegment nodes (the inverse of\n * renderMarkdown above); every other block is returned unchanged. Applied to AI results on both apply paths.\n * A label without text (`**Aufgaben:**` above a list) is a bold pseudo-heading, not an empty turn, and stays a paragraph.\n */\nexport function speakerParagraphsToSegments(doc: JSONContent): JSONContent {\n if (!doc.content) return doc\n return {\n ...doc,\n content: doc.content.map((block) => {\n const name = speakerOf(block)\n if (name === null) return block\n const content = block.content!.slice(1)\n if (content.every(node => node.type === 'text' && !node.text?.trim())) return block\n const next = content[0]\n // renderMarkdown puts exactly one space between label and text; drop only that one.\n if (next?.type === 'text' && next.text && /^\\s/.test(next.text)) {\n if (next.text.length === 1) content.shift()\n else content[0] = { ...next, text: next.text.slice(1) }\n }\n return { type: 'transcriptSegment', attrs: { speaker: name === UNNAMED_SPEAKER ? '' : name }, content }\n }),\n }\n}\n"],"mappings":"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"}
|
|
@@ -23,7 +23,74 @@ const de = {
|
|
|
23
23
|
"composites.kind.document.field.mimeType": "Typ",
|
|
24
24
|
"composites.kind.document.field.size": "Größe (Bytes)",
|
|
25
25
|
"composites.kind.document.field.importedAt": "Importiert",
|
|
26
|
-
"composites.kind.
|
|
26
|
+
"composites.kind.recording.label": "Aufnahme",
|
|
27
|
+
"composites.kind.recording.title": "Titel der Aufnahme",
|
|
28
|
+
"composites.kind.recording.description": "Zusammenfassung",
|
|
29
|
+
"composites.kind.recording.field.filename": "Dateiname",
|
|
30
|
+
"composites.kind.recording.field.mimeType": "Typ",
|
|
31
|
+
"composites.kind.recording.field.size": "Größe (Bytes)",
|
|
32
|
+
"composites.kind.recording.field.importedAt": "Importiert",
|
|
33
|
+
"composites.kind.recording.field.recordedAt": "Aufgenommen am",
|
|
34
|
+
"composites.kind.recording.field.participants": "Beteiligte",
|
|
35
|
+
"composites.kind.recording.field.durationSeconds": "Dauer (Sekunden)",
|
|
36
|
+
"composites.kind.paper.label": "Paper",
|
|
37
|
+
"composites.kind.paper.title": "Titel der Arbeit",
|
|
38
|
+
"composites.kind.paper.description": "Zusammenfassung",
|
|
39
|
+
"composites.kind.paper.field.filename": "Dateiname",
|
|
40
|
+
"composites.kind.paper.field.mimeType": "Typ",
|
|
41
|
+
"composites.kind.paper.field.size": "Größe (Bytes)",
|
|
42
|
+
"composites.kind.paper.field.importedAt": "Importiert",
|
|
43
|
+
"composites.kind.paper.field.bib": "Literaturangabe",
|
|
44
|
+
"composites.kind.paper.field.doi": "DOI",
|
|
45
|
+
"composites.kind.book.label": "Buch",
|
|
46
|
+
"composites.kind.book.title": "Buchtitel",
|
|
47
|
+
"composites.kind.book.description": "Zusammenfassung",
|
|
48
|
+
"composites.kind.book.field.filename": "Dateiname",
|
|
49
|
+
"composites.kind.book.field.mimeType": "Typ",
|
|
50
|
+
"composites.kind.book.field.size": "Größe (Bytes)",
|
|
51
|
+
"composites.kind.book.field.importedAt": "Importiert",
|
|
52
|
+
"composites.kind.book.field.bib": "Literaturangabe",
|
|
53
|
+
"composites.kind.book.field.isbn": "ISBN",
|
|
54
|
+
"composites.kind.figure.label": "Bild",
|
|
55
|
+
"composites.kind.figure.title": "Bildtitel",
|
|
56
|
+
"composites.kind.figure.description": "Bildbeschreibung",
|
|
57
|
+
"composites.kind.figure.field.filename": "Dateiname",
|
|
58
|
+
"composites.kind.figure.field.mimeType": "Typ",
|
|
59
|
+
"composites.kind.figure.field.size": "Größe (Bytes)",
|
|
60
|
+
"composites.kind.figure.field.importedAt": "Importiert",
|
|
61
|
+
"composites.kind.figure.field.credit": "Quellenangabe",
|
|
62
|
+
"composites.kind.rendition.label": "Lesefassung",
|
|
63
|
+
"composites.kind.rendition.title": "Transkript, Volltext, Beschreibung …",
|
|
64
|
+
"composites.kind.rendition.description": "Hinweis zur Entstehung",
|
|
65
|
+
"composites.kind.rendition.field.derivation": "Herkunft",
|
|
66
|
+
"composites.kind.rendition.field.language": "Sprache",
|
|
67
|
+
/** Literature types of a `bibliography` field (CSL-JSON `type`). */
|
|
68
|
+
"composites.bib.type.article-journal": "Zeitschriftenartikel",
|
|
69
|
+
"composites.bib.type.book": "Buch",
|
|
70
|
+
"composites.bib.type.chapter": "Buchkapitel",
|
|
71
|
+
"composites.bib.type.paper-conference": "Konferenzbeitrag",
|
|
72
|
+
"composites.bib.type.thesis": "Abschlussarbeit",
|
|
73
|
+
"composites.bib.type.report": "Bericht",
|
|
74
|
+
"composites.bib.type.webpage": "Webseite",
|
|
75
|
+
"composites.bib.type.article": "Artikel",
|
|
76
|
+
"composites.bib.type.dataset": "Datensatz",
|
|
77
|
+
/** The `bibliography` field editor. */
|
|
78
|
+
"composites.bib.field.type": "Art",
|
|
79
|
+
"composites.bib.field.authors": "Autorinnen und Autoren",
|
|
80
|
+
"composites.bib.field.authorsHelp": "Eine Person pro Zeile: Nachname, Vorname",
|
|
81
|
+
"composites.bib.field.year": "Jahr",
|
|
82
|
+
"composites.bib.field.containerTitle": "Zeitschrift / Sammelwerk",
|
|
83
|
+
"composites.bib.field.volume": "Band",
|
|
84
|
+
"composites.bib.field.issue": "Heft",
|
|
85
|
+
"composites.bib.field.page": "Seiten",
|
|
86
|
+
"composites.bib.field.publisher": "Verlag",
|
|
87
|
+
"composites.bib.field.doi": "DOI",
|
|
88
|
+
"composites.bib.field.isbn": "ISBN",
|
|
89
|
+
"composites.bib.field.url": "URL",
|
|
90
|
+
"composites.bib.field.abstract": "Kurzfassung",
|
|
91
|
+
"composites.bib.copyBibtex": "BibTeX kopieren",
|
|
92
|
+
"composites.bib.copied": "BibTeX kopiert",
|
|
93
|
+
"composites.bib.fetchDoi": "DOI abrufen",
|
|
27
94
|
"composites.kind.folder.label": "Ordner",
|
|
28
95
|
"composites.kind.folder.title": "Ordnername",
|
|
29
96
|
"composites.kind.folder.description": "Beschreibung",
|
|
@@ -38,6 +105,7 @@ const de = {
|
|
|
38
105
|
"composites.slash.flatten": "Bausteine in Überschriften",
|
|
39
106
|
"composites.slash.flattenAll": "Bausteine in Überschriften (alle Ebenen)",
|
|
40
107
|
"composites.blockAction.export": "Als Markdown exportieren",
|
|
108
|
+
"composites.blockAction.bibtex": "Literaturangabe exportieren (BibTeX)",
|
|
41
109
|
"composites.toolbar.toKind": "In Baustein umwandeln",
|
|
42
110
|
"composites.toolbar.structure": "Gliederung umwandeln",
|
|
43
111
|
"composites.menu.kindHeading": "Baustein",
|
|
@@ -67,11 +135,33 @@ const de = {
|
|
|
67
135
|
"composites.details.cancel": "Abbrechen",
|
|
68
136
|
"composites.details.change": "Ändern",
|
|
69
137
|
"composites.details.summary": "Zusammenfassung",
|
|
138
|
+
"composites.reference.insert": "Verweis auf Baustein",
|
|
139
|
+
"composites.reference.empty": "Keine passenden Bausteine",
|
|
140
|
+
"composites.reference.gone": "Baustein gelöscht",
|
|
141
|
+
"composites.reference.locator": "Stelle",
|
|
142
|
+
"composites.reference.locatorPlaceholder": "Stelle, z. B. S. 12 oder 03:14",
|
|
143
|
+
"composites.reference.backlinks": "Verweise",
|
|
144
|
+
"composites.derivation.badge": "abgeleitet",
|
|
145
|
+
"composites.derivation.stale": "Quelle geändert",
|
|
146
|
+
"composites.derivation.edited": "bearbeitet",
|
|
147
|
+
"composites.derivation.expand": "Abgeleiteten Inhalt aufklappen",
|
|
148
|
+
"composites.derivation.collapse": "Abgeleiteten Inhalt zuklappen",
|
|
149
|
+
"composites.derivation.method": "Methode",
|
|
150
|
+
"composites.derivation.model": "Modell",
|
|
151
|
+
"composites.derivation.createdAt": "Erzeugt",
|
|
152
|
+
"composites.derivation.openOutput": "Original öffnen",
|
|
153
|
+
"composites.derivation.method.transcription": "Transkription",
|
|
154
|
+
"composites.derivation.method.pdf-text": "PDF-Text",
|
|
155
|
+
"composites.derivation.method.ocr": "Texterkennung (OCR)",
|
|
156
|
+
"composites.derivation.method.description": "Bildbeschreibung",
|
|
157
|
+
"composites.derivation.method.bibliography": "Literaturangaben",
|
|
158
|
+
"composites.derivation.method.ai": "KI-Ableitung",
|
|
70
159
|
"composites.summary.placeholder": "Kurze Zusammenfassung des Bausteins",
|
|
71
160
|
"composites.summary.label": "Zusammenfassung",
|
|
72
161
|
"composites.summary.none": "Keine Zusammenfassung",
|
|
73
162
|
"composites.summary.formatted": "Enthält Formatierung oder Erwähnungen und lässt sich nur im Text bearbeiten.",
|
|
74
163
|
"composites.field.choose": "{field} wählen",
|
|
164
|
+
"composites.field.none": "Keine Auswahl",
|
|
75
165
|
"composites.inspector.label": "Eigenschaften",
|
|
76
166
|
"composites.inspector.document": "Dokument",
|
|
77
167
|
"composites.inspector.composites": "Bausteine",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"composites.js","names":[],"sources":["../../../src/i18n/de/composites.ts"],"sourcesContent":["export const de = {\n // Fallback title of an untitled Baustein (outline, table).\n 'composites.untitled': '(ohne Titel)',\n\n // Built-in kinds (`defaultCompositeKinds`): label, placeholders of the empty title/description, fields and their choices.\n 'composites.kind.section.label': 'Abschnitt',\n 'composites.kind.section.title': 'Überschrift',\n 'composites.kind.section.description': 'Zusammenfassung',\n 'composites.kind.task.label': 'Aufgabe',\n 'composites.kind.task.title': 'Aufgabe',\n 'composites.kind.task.description': 'Beschreibung',\n 'composites.kind.task.field.status': 'Status',\n 'composites.kind.task.status.open': 'Offen',\n 'composites.kind.task.status.doing': 'In Arbeit',\n 'composites.kind.task.status.done': 'Erledigt',\n 'composites.kind.task.field.due': 'Fällig',\n 'composites.kind.task.field.assignee': 'Zuständig',\n 'composites.kind.note.label': 'Notiz',\n 'composites.kind.note.title': 'Titel',\n 'composites.kind.note.description': 'Kurzbeschreibung',\n 'composites.kind.document.label': 'Dokument',\n 'composites.kind.document.title': 'Dokumentname',\n 'composites.kind.document.description': 'Zusammenfassung',\n 'composites.kind.document.field.filename': 'Dateiname',\n 'composites.kind.document.field.mimeType': 'Typ',\n 'composites.kind.document.field.size': 'Größe (Bytes)',\n 'composites.kind.document.field.importedAt': 'Importiert',\n 'composites.kind.document.field.transcript': 'Transkript',\n 'composites.kind.folder.label': 'Ordner',\n 'composites.kind.folder.title': 'Ordnername',\n 'composites.kind.folder.description': 'Beschreibung',\n /** The select that changes a Baustein's kind (details popover, inspector). */\n 'composites.kind.select': 'Art des Bausteins',\n\n // Status chip.\n 'composites.status.none': 'Kein Status',\n 'composites.status.label': 'Status: {status}',\n\n // Feature: settings tab, `/` commands, block action, toolbar.\n 'composites.tab': 'Bearbeiten',\n 'composites.slash.section': 'Abschnitt',\n 'composites.slash.group': 'Überschriften in Bausteine',\n 'composites.slash.groupAll': 'Überschriften in Bausteine (verschachtelt)',\n 'composites.slash.flatten': 'Bausteine in Überschriften',\n 'composites.slash.flattenAll': 'Bausteine in Überschriften (alle Ebenen)',\n 'composites.blockAction.export': 'Als Markdown exportieren',\n 'composites.toolbar.toKind': 'In Baustein umwandeln',\n 'composites.toolbar.structure': 'Gliederung umwandeln',\n 'composites.menu.kindHeading': 'Baustein',\n 'composites.menu.toComposites': 'Überschriften in Bausteine',\n 'composites.menu.toComposites.top': 'Nur oberste Ebene',\n 'composites.menu.toComposites.top.description': 'Nur die höchste Überschriftenebene wird zu Bausteinen',\n 'composites.menu.toComposites.all': 'Alle Ebenen (verschachtelt)',\n 'composites.menu.toComposites.all.description': 'Jede Überschriftenebene wird zu einem verschachtelten Baustein',\n 'composites.menu.toHeadings': 'Bausteine in Überschriften',\n 'composites.menu.toHeadings.top': 'Nur oberste Ebene',\n 'composites.menu.toHeadings.top.description': 'Die obersten Bausteine werden zu Überschriften; innere Bausteine bleiben',\n 'composites.menu.toHeadings.all': 'Alle Ebenen',\n 'composites.menu.toHeadings.all.description': 'Jeder Baustein wird zur Überschrift seiner Ebene; Beschreibung, Tags und Felder als Text',\n 'composites.menu.settings': 'Einstellungen…',\n 'composites.menu.preferred': 'Bevorzugt: {mode}',\n /** Conversion target label: the kind as a Baustein. */\n 'composites.convert.kind': '{kind} (Baustein)',\n\n // Chrome on the title line and the kind icon.\n 'composites.chrome.details': 'Art und Details: {kind}',\n 'composites.chrome.detailsDrag': 'Art und Details: {kind} · Ziehen zum Verschieben',\n 'composites.tag.remove': 'Tag #{tag} entfernen',\n 'composites.tag.add': 'Tag hinzufügen',\n\n // Tags editor (details popover, inspector).\n 'composites.tags.label': 'Tags',\n 'composites.tags.placeholder': 'Tags hinzufügen',\n 'composites.tags.create': '#{tag} erstellen',\n\n // Details popover.\n 'composites.details.confirmLost': 'Art wirklich ändern? Beim Wechsel zu „{kind}“ gehen diese Angaben verloren:',\n 'composites.details.confirm': 'Art wirklich ändern?',\n 'composites.details.cancel': 'Abbrechen',\n 'composites.details.change': 'Ändern',\n 'composites.details.summary': 'Zusammen\\u00ADfassung',\n\n // Summary and field editors.\n 'composites.summary.placeholder': 'Kurze Zusammenfassung des Bausteins',\n 'composites.summary.label': 'Zusammenfassung',\n 'composites.summary.none': 'Keine Zusammenfassung',\n 'composites.summary.formatted': 'Enthält Formatierung oder Erwähnungen und lässt sich nur im Text bearbeiten.',\n 'composites.field.choose': '{field} wählen',\n\n // Inspector.\n 'composites.inspector.label': 'Eigenschaften',\n 'composites.inspector.document': 'Dokument',\n 'composites.inspector.composites': 'Bausteine',\n 'composites.inspector.summarized': '{n} von {total} zusammengefasst',\n 'composites.inspector.none': 'Keine',\n 'composites.inspector.mentions': 'Erwähnungen',\n 'composites.inspector.composite': 'Baustein',\n 'composites.inspector.kind': 'Art',\n 'composites.inspector.title': 'Titel',\n 'composites.inspector.titleHelp': 'Im Dokument bearbeiten',\n 'composites.inspector.untitled': 'Ohne Titel',\n 'composites.inspector.description': 'Beschreibung',\n 'composites.inspector.descriptionHelp': 'Enthält Erwähnungen oder Tags – im Dokument bearbeiten',\n 'composites.inspector.aiStatus': 'KI-Status',\n 'composites.inspector.summaryPresent': 'Zusammenfassung vorhanden',\n 'composites.inspector.summaryMissing': 'Zusammenfassung fehlt',\n\n // Table.\n 'composites.table.label': 'Bausteine als Tabelle',\n 'composites.table.emptyTitle': 'Dieses Dokument enthält noch keine Bausteine',\n 'composites.table.emptyText': 'Bausteine gliedern ein Dokument in Abschnitte, Aufgaben oder Notizen mit Titel, Zusammenfassung und Tags. Füge im Text über „/“ einen Baustein ein, dann erscheint er hier mit allen Angaben.',\n 'composites.table.column.composite': 'Baustein',\n 'composites.table.column.kind': 'Art',\n 'composites.table.column.tags': 'Tags',\n 'composites.table.column.summary': 'Zusammenfassung',\n 'composites.table.search.placeholder': 'Titel, Zusammenfassung, Tags',\n 'composites.table.search.label': 'Bausteine durchsuchen',\n 'composites.table.search.clear': 'Suche leeren',\n 'composites.table.filter.all': 'Alle',\n 'composites.table.filter.reset': 'Filter zurücksetzen',\n 'composites.table.filter.byKind': 'Nach Art filtern',\n 'composites.table.filter.byTag': 'Nach Tag filtern',\n 'composites.table.filter.noMatch': 'Kein Baustein passt zu diesen Filtern.',\n 'composites.table.count.one': '{n} von {total} Baustein',\n 'composites.table.count.other': '{n} von {total} Bausteinen',\n 'composites.table.noValue': 'Kein Wert',\n 'composites.table.noTags': 'Keine Tags',\n 'composites.table.summaryPresent': 'Zusammenfassung vorhanden',\n\n // Settings tab „Bearbeiten“.\n 'composites.settings.structure.title': 'Gliederung',\n 'composites.settings.structure.legend': 'Bevorzugte Gliederung',\n 'composites.settings.structure.flat.label': 'Überschriften',\n 'composites.settings.structure.flat.description': 'Werkzeugleiste mit Überschrift 1–3. KI-Texte werden flach mit Überschriften (##, ###) gegliedert; Bausteine, die die KI dennoch schreibt, werden zu Überschriften.',\n 'composites.settings.structure.composite.label': 'Bausteine',\n 'composites.settings.structure.composite.description': 'Werkzeugleiste ohne Überschrift 1–3. KI-Texte werden als Bausteine gegliedert, Unterabschnitte als verschachtelte Bausteine; Überschriften, die die KI dennoch schreibt, werden zu Bausteinen.',\n 'composites.settings.scope.legend': '„Gliederung umwandeln“ ohne Markierung bezieht sich auf',\n 'composites.settings.scope.container.label': 'Umgebender Baustein',\n 'composites.settings.scope.container.description': 'Den Baustein, in dem der Cursor steht; außerhalb von Bausteinen das ganze Dokument.',\n 'composites.settings.scope.document.label': 'Gesamtes Dokument',\n 'composites.settings.scope.document.description': 'Immer alle Blöcke des Dokuments.',\n 'composites.settings.scope.heading.label': 'Überschrift oder Baustein am Cursor',\n 'composites.settings.scope.heading.description': 'Beim Umwandeln in Bausteine: die Überschrift am oder vor dem Cursor mit ihrem Inhalt. Beim Umwandeln in Überschriften: der innerste Baustein um den Cursor.',\n 'composites.settings.sidebar.title': 'Seitenleiste',\n 'composites.settings.treeRoot.legend': 'Baum der Dokumente',\n 'composites.settings.treeRoot.folders.label': 'Ordner und Dateien verschachteln',\n 'composites.settings.treeRoot.folders.description': 'Die Seitenleiste zeigt die Ordner mit ihren Dateien; die geöffnete Datei steht als Eintrag darin.',\n 'composites.settings.treeRoot.file.label': 'Wurzel ist eine einzelne Datei',\n 'composites.settings.treeRoot.file.description': 'Ist eine Baustein-Datei geöffnet, zeigt die Seitenleiste sie als Wurzel mit ihren Ordnern und Dokumenten. Ohne geöffnete Baustein-Datei sind es die Ordner.',\n 'composites.settings.composites.title': 'Bausteine',\n 'composites.settings.defaultKind.label': 'Standard-Baustein',\n 'composites.settings.defaultKind.description': 'Art der Bausteine, die die Werkzeugleiste, „/“-Befehle und „Überschriften in Bausteine“ anlegen.',\n 'composites.settings.kindIcon.legend': 'Art-Symbol',\n 'composites.settings.kindIcon.always.label': 'Immer anzeigen',\n 'composites.settings.kindIcon.always.description': 'Das Symbol der Bausteinart steht dauerhaft vor dem Baustein.',\n 'composites.settings.kindIcon.hover.label': 'Nur beim Überfahren',\n 'composites.settings.kindIcon.hover.description': 'Das Symbol erscheint, wenn die Maus über dem Baustein steht, er den Fokus hat oder seine Details geöffnet sind.',\n 'composites.settings.dragHandle.legend': 'Ziehgriff (Blöcke ohne Symbol)',\n 'composites.settings.dragHandle.hover.label': 'Nur beim Überfahren',\n 'composites.settings.dragHandle.hover.description': 'Der Ziehgriff erscheint am Block unter der Maus.',\n 'composites.settings.dragHandle.always.label': 'Immer anzeigen',\n 'composites.settings.dragHandle.always.description': 'Jeder Block ohne Symbol zeigt seinen Ziehgriff dauerhaft.',\n\n // Accepted children per kind (`AcceptedChildren`, `moveIntoVerdict`): the notice of a refused edit and why a block cannot move.\n 'composites.nesting.title': 'Verschachtelung nicht möglich',\n 'composites.nesting.refused': '{parent} nimmt keine {child} auf.',\n 'composites.move.blockGone': 'Der Block existiert nicht mehr.',\n 'composites.move.targetGone': 'Das Ziel existiert nicht mehr.',\n 'composites.move.targetNotBlock': 'Das Ziel ist kein Baustein.',\n 'composites.move.intoSelf': 'Ein Block kann nicht in sich selbst verschoben werden.',\n 'composites.move.intoOwn': 'Ein Block kann nicht in einen Baustein verschoben werden, den er selbst enthält.',\n} as const\n"],"mappings":";AAAA,MAAa,KAAK;CAEhB,uBAAuB;CAGvB,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;;CAEtC,0BAA0B;CAG1B,0BAA0B;CAC1B,2BAA2B;CAG3B,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;;CAE7B,2BAA2B;CAG3B,6BAA6B;CAC7B,iCAAiC;CACjC,yBAAyB;CACzB,sBAAsB;CAGtB,yBAAyB;CACzB,+BAA+B;CAC/B,0BAA0B;CAG1B,kCAAkC;CAClC,8BAA8B;CAC9B,6BAA6B;CAC7B,6BAA6B;CAC7B,8BAA8B;CAG9B,kCAAkC;CAClC,4BAA4B;CAC5B,2BAA2B;CAC3B,gCAAgC;CAChC,2BAA2B;CAG3B,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;CAGvC,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;CAGnC,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;CAGrD,4BAA4B;CAC5B,8BAA8B;CAC9B,6BAA6B;CAC7B,8BAA8B;CAC9B,kCAAkC;CAClC,4BAA4B;CAC5B,2BAA2B;AAC7B"}
|
|
1
|
+
{"version":3,"file":"composites.js","names":[],"sources":["../../../src/i18n/de/composites.ts"],"sourcesContent":["export const de = {\n // Fallback title of an untitled Baustein (outline, table).\n 'composites.untitled': '(ohne Titel)',\n\n // Built-in kinds (`defaultCompositeKinds`): label, placeholders of the empty title/description, fields and their choices.\n 'composites.kind.section.label': 'Abschnitt',\n 'composites.kind.section.title': 'Überschrift',\n 'composites.kind.section.description': 'Zusammenfassung',\n 'composites.kind.task.label': 'Aufgabe',\n 'composites.kind.task.title': 'Aufgabe',\n 'composites.kind.task.description': 'Beschreibung',\n 'composites.kind.task.field.status': 'Status',\n 'composites.kind.task.status.open': 'Offen',\n 'composites.kind.task.status.doing': 'In Arbeit',\n 'composites.kind.task.status.done': 'Erledigt',\n 'composites.kind.task.field.due': 'Fällig',\n 'composites.kind.task.field.assignee': 'Zuständig',\n 'composites.kind.note.label': 'Notiz',\n 'composites.kind.note.title': 'Titel',\n 'composites.kind.note.description': 'Kurzbeschreibung',\n 'composites.kind.document.label': 'Dokument',\n 'composites.kind.document.title': 'Dokumentname',\n 'composites.kind.document.description': 'Zusammenfassung',\n 'composites.kind.document.field.filename': 'Dateiname',\n 'composites.kind.document.field.mimeType': 'Typ',\n 'composites.kind.document.field.size': 'Größe (Bytes)',\n 'composites.kind.document.field.importedAt': 'Importiert',\n 'composites.kind.recording.label': 'Aufnahme',\n 'composites.kind.recording.title': 'Titel der Aufnahme',\n 'composites.kind.recording.description': 'Zusammenfassung',\n 'composites.kind.recording.field.filename': 'Dateiname',\n 'composites.kind.recording.field.mimeType': 'Typ',\n 'composites.kind.recording.field.size': 'Größe (Bytes)',\n 'composites.kind.recording.field.importedAt': 'Importiert',\n 'composites.kind.recording.field.recordedAt': 'Aufgenommen am',\n 'composites.kind.recording.field.participants': 'Beteiligte',\n 'composites.kind.recording.field.durationSeconds': 'Dauer (Sekunden)',\n 'composites.kind.paper.label': 'Paper',\n 'composites.kind.paper.title': 'Titel der Arbeit',\n 'composites.kind.paper.description': 'Zusammenfassung',\n 'composites.kind.paper.field.filename': 'Dateiname',\n 'composites.kind.paper.field.mimeType': 'Typ',\n 'composites.kind.paper.field.size': 'Größe (Bytes)',\n 'composites.kind.paper.field.importedAt': 'Importiert',\n 'composites.kind.paper.field.bib': 'Literaturangabe',\n 'composites.kind.paper.field.doi': 'DOI',\n 'composites.kind.book.label': 'Buch',\n 'composites.kind.book.title': 'Buchtitel',\n 'composites.kind.book.description': 'Zusammenfassung',\n 'composites.kind.book.field.filename': 'Dateiname',\n 'composites.kind.book.field.mimeType': 'Typ',\n 'composites.kind.book.field.size': 'Größe (Bytes)',\n 'composites.kind.book.field.importedAt': 'Importiert',\n 'composites.kind.book.field.bib': 'Literaturangabe',\n 'composites.kind.book.field.isbn': 'ISBN',\n 'composites.kind.figure.label': 'Bild',\n 'composites.kind.figure.title': 'Bildtitel',\n 'composites.kind.figure.description': 'Bildbeschreibung',\n 'composites.kind.figure.field.filename': 'Dateiname',\n 'composites.kind.figure.field.mimeType': 'Typ',\n 'composites.kind.figure.field.size': 'Größe (Bytes)',\n 'composites.kind.figure.field.importedAt': 'Importiert',\n 'composites.kind.figure.field.credit': 'Quellenangabe',\n 'composites.kind.rendition.label': 'Lesefassung',\n 'composites.kind.rendition.title': 'Transkript, Volltext, Beschreibung …',\n 'composites.kind.rendition.description': 'Hinweis zur Entstehung',\n 'composites.kind.rendition.field.derivation': 'Herkunft',\n 'composites.kind.rendition.field.language': 'Sprache',\n /** Literature types of a `bibliography` field (CSL-JSON `type`). */\n 'composites.bib.type.article-journal': 'Zeitschriftenartikel',\n 'composites.bib.type.book': 'Buch',\n 'composites.bib.type.chapter': 'Buchkapitel',\n 'composites.bib.type.paper-conference': 'Konferenzbeitrag',\n 'composites.bib.type.thesis': 'Abschlussarbeit',\n 'composites.bib.type.report': 'Bericht',\n 'composites.bib.type.webpage': 'Webseite',\n 'composites.bib.type.article': 'Artikel',\n 'composites.bib.type.dataset': 'Datensatz',\n /** The `bibliography` field editor. */\n 'composites.bib.field.type': 'Art',\n 'composites.bib.field.authors': 'Autorinnen und Autoren',\n 'composites.bib.field.authorsHelp': 'Eine Person pro Zeile: Nachname, Vorname',\n 'composites.bib.field.year': 'Jahr',\n 'composites.bib.field.containerTitle': 'Zeitschrift / Sammelwerk',\n 'composites.bib.field.volume': 'Band',\n 'composites.bib.field.issue': 'Heft',\n 'composites.bib.field.page': 'Seiten',\n 'composites.bib.field.publisher': 'Verlag',\n 'composites.bib.field.doi': 'DOI',\n 'composites.bib.field.isbn': 'ISBN',\n 'composites.bib.field.url': 'URL',\n 'composites.bib.field.abstract': 'Kurzfassung',\n 'composites.bib.copyBibtex': 'BibTeX kopieren',\n 'composites.bib.copied': 'BibTeX kopiert',\n 'composites.bib.fetchDoi': 'DOI abrufen',\n 'composites.kind.folder.label': 'Ordner',\n 'composites.kind.folder.title': 'Ordnername',\n 'composites.kind.folder.description': 'Beschreibung',\n /** The select that changes a Baustein's kind (details popover, inspector). */\n 'composites.kind.select': 'Art des Bausteins',\n\n // Status chip.\n 'composites.status.none': 'Kein Status',\n 'composites.status.label': 'Status: {status}',\n\n // Feature: settings tab, `/` commands, block action, toolbar.\n 'composites.tab': 'Bearbeiten',\n 'composites.slash.section': 'Abschnitt',\n 'composites.slash.group': 'Überschriften in Bausteine',\n 'composites.slash.groupAll': 'Überschriften in Bausteine (verschachtelt)',\n 'composites.slash.flatten': 'Bausteine in Überschriften',\n 'composites.slash.flattenAll': 'Bausteine in Überschriften (alle Ebenen)',\n 'composites.blockAction.export': 'Als Markdown exportieren',\n 'composites.blockAction.bibtex': 'Literaturangabe exportieren (BibTeX)',\n 'composites.toolbar.toKind': 'In Baustein umwandeln',\n 'composites.toolbar.structure': 'Gliederung umwandeln',\n 'composites.menu.kindHeading': 'Baustein',\n 'composites.menu.toComposites': 'Überschriften in Bausteine',\n 'composites.menu.toComposites.top': 'Nur oberste Ebene',\n 'composites.menu.toComposites.top.description': 'Nur die höchste Überschriftenebene wird zu Bausteinen',\n 'composites.menu.toComposites.all': 'Alle Ebenen (verschachtelt)',\n 'composites.menu.toComposites.all.description': 'Jede Überschriftenebene wird zu einem verschachtelten Baustein',\n 'composites.menu.toHeadings': 'Bausteine in Überschriften',\n 'composites.menu.toHeadings.top': 'Nur oberste Ebene',\n 'composites.menu.toHeadings.top.description': 'Die obersten Bausteine werden zu Überschriften; innere Bausteine bleiben',\n 'composites.menu.toHeadings.all': 'Alle Ebenen',\n 'composites.menu.toHeadings.all.description': 'Jeder Baustein wird zur Überschrift seiner Ebene; Beschreibung, Tags und Felder als Text',\n 'composites.menu.settings': 'Einstellungen…',\n 'composites.menu.preferred': 'Bevorzugt: {mode}',\n /** Conversion target label: the kind as a Baustein. */\n 'composites.convert.kind': '{kind} (Baustein)',\n\n // Chrome on the title line and the kind icon.\n 'composites.chrome.details': 'Art und Details: {kind}',\n 'composites.chrome.detailsDrag': 'Art und Details: {kind} · Ziehen zum Verschieben',\n 'composites.tag.remove': 'Tag #{tag} entfernen',\n 'composites.tag.add': 'Tag hinzufügen',\n\n // Tags editor (details popover, inspector).\n 'composites.tags.label': 'Tags',\n 'composites.tags.placeholder': 'Tags hinzufügen',\n 'composites.tags.create': '#{tag} erstellen',\n\n // Details popover.\n 'composites.details.confirmLost': 'Art wirklich ändern? Beim Wechsel zu „{kind}“ gehen diese Angaben verloren:',\n 'composites.details.confirm': 'Art wirklich ändern?',\n 'composites.details.cancel': 'Abbrechen',\n 'composites.details.change': 'Ändern',\n 'composites.details.summary': 'Zusammen\\u00ADfassung',\n\n // Reference chip (`[@`), locator and backlinks.\n 'composites.reference.insert': 'Verweis auf Baustein',\n 'composites.reference.empty': 'Keine passenden Bausteine',\n 'composites.reference.gone': 'Baustein gelöscht',\n 'composites.reference.locator': 'Stelle',\n 'composites.reference.locatorPlaceholder': 'Stelle, z. B. S. 12 oder 03:14',\n 'composites.reference.backlinks': 'Verweise',\n\n // Derived Bausteine (provenance badge, collapse toggle, details).\n 'composites.derivation.badge': 'abgeleitet',\n 'composites.derivation.stale': 'Quelle geändert',\n 'composites.derivation.edited': 'bearbeitet',\n 'composites.derivation.expand': 'Abgeleiteten Inhalt aufklappen',\n 'composites.derivation.collapse': 'Abgeleiteten Inhalt zuklappen',\n 'composites.derivation.method': 'Methode',\n 'composites.derivation.model': 'Modell',\n 'composites.derivation.createdAt': 'Erzeugt',\n 'composites.derivation.openOutput': 'Original öffnen',\n 'composites.derivation.method.transcription': 'Transkription',\n 'composites.derivation.method.pdf-text': 'PDF-Text',\n 'composites.derivation.method.ocr': 'Texterkennung (OCR)',\n 'composites.derivation.method.description': 'Bildbeschreibung',\n 'composites.derivation.method.bibliography': 'Literaturangaben',\n 'composites.derivation.method.ai': 'KI-Ableitung',\n\n // Summary and field editors.\n 'composites.summary.placeholder': 'Kurze Zusammenfassung des Bausteins',\n 'composites.summary.label': 'Zusammenfassung',\n 'composites.summary.none': 'Keine Zusammenfassung',\n 'composites.summary.formatted': 'Enthält Formatierung oder Erwähnungen und lässt sich nur im Text bearbeiten.',\n 'composites.field.choose': '{field} wählen',\n 'composites.field.none': 'Keine Auswahl',\n\n // Inspector.\n 'composites.inspector.label': 'Eigenschaften',\n 'composites.inspector.document': 'Dokument',\n 'composites.inspector.composites': 'Bausteine',\n 'composites.inspector.summarized': '{n} von {total} zusammengefasst',\n 'composites.inspector.none': 'Keine',\n 'composites.inspector.mentions': 'Erwähnungen',\n 'composites.inspector.composite': 'Baustein',\n 'composites.inspector.kind': 'Art',\n 'composites.inspector.title': 'Titel',\n 'composites.inspector.titleHelp': 'Im Dokument bearbeiten',\n 'composites.inspector.untitled': 'Ohne Titel',\n 'composites.inspector.description': 'Beschreibung',\n 'composites.inspector.descriptionHelp': 'Enthält Erwähnungen oder Tags – im Dokument bearbeiten',\n 'composites.inspector.aiStatus': 'KI-Status',\n 'composites.inspector.summaryPresent': 'Zusammenfassung vorhanden',\n 'composites.inspector.summaryMissing': 'Zusammenfassung fehlt',\n\n // Table.\n 'composites.table.label': 'Bausteine als Tabelle',\n 'composites.table.emptyTitle': 'Dieses Dokument enthält noch keine Bausteine',\n 'composites.table.emptyText': 'Bausteine gliedern ein Dokument in Abschnitte, Aufgaben oder Notizen mit Titel, Zusammenfassung und Tags. Füge im Text über „/“ einen Baustein ein, dann erscheint er hier mit allen Angaben.',\n 'composites.table.column.composite': 'Baustein',\n 'composites.table.column.kind': 'Art',\n 'composites.table.column.tags': 'Tags',\n 'composites.table.column.summary': 'Zusammenfassung',\n 'composites.table.search.placeholder': 'Titel, Zusammenfassung, Tags',\n 'composites.table.search.label': 'Bausteine durchsuchen',\n 'composites.table.search.clear': 'Suche leeren',\n 'composites.table.filter.all': 'Alle',\n 'composites.table.filter.reset': 'Filter zurücksetzen',\n 'composites.table.filter.byKind': 'Nach Art filtern',\n 'composites.table.filter.byTag': 'Nach Tag filtern',\n 'composites.table.filter.noMatch': 'Kein Baustein passt zu diesen Filtern.',\n 'composites.table.count.one': '{n} von {total} Baustein',\n 'composites.table.count.other': '{n} von {total} Bausteinen',\n 'composites.table.noValue': 'Kein Wert',\n 'composites.table.noTags': 'Keine Tags',\n 'composites.table.summaryPresent': 'Zusammenfassung vorhanden',\n\n // Settings tab „Bearbeiten“.\n 'composites.settings.structure.title': 'Gliederung',\n 'composites.settings.structure.legend': 'Bevorzugte Gliederung',\n 'composites.settings.structure.flat.label': 'Überschriften',\n 'composites.settings.structure.flat.description': 'Werkzeugleiste mit Überschrift 1–3. KI-Texte werden flach mit Überschriften (##, ###) gegliedert; Bausteine, die die KI dennoch schreibt, werden zu Überschriften.',\n 'composites.settings.structure.composite.label': 'Bausteine',\n 'composites.settings.structure.composite.description': 'Werkzeugleiste ohne Überschrift 1–3. KI-Texte werden als Bausteine gegliedert, Unterabschnitte als verschachtelte Bausteine; Überschriften, die die KI dennoch schreibt, werden zu Bausteinen.',\n 'composites.settings.scope.legend': '„Gliederung umwandeln“ ohne Markierung bezieht sich auf',\n 'composites.settings.scope.container.label': 'Umgebender Baustein',\n 'composites.settings.scope.container.description': 'Den Baustein, in dem der Cursor steht; außerhalb von Bausteinen das ganze Dokument.',\n 'composites.settings.scope.document.label': 'Gesamtes Dokument',\n 'composites.settings.scope.document.description': 'Immer alle Blöcke des Dokuments.',\n 'composites.settings.scope.heading.label': 'Überschrift oder Baustein am Cursor',\n 'composites.settings.scope.heading.description': 'Beim Umwandeln in Bausteine: die Überschrift am oder vor dem Cursor mit ihrem Inhalt. Beim Umwandeln in Überschriften: der innerste Baustein um den Cursor.',\n 'composites.settings.sidebar.title': 'Seitenleiste',\n 'composites.settings.treeRoot.legend': 'Baum der Dokumente',\n 'composites.settings.treeRoot.folders.label': 'Ordner und Dateien verschachteln',\n 'composites.settings.treeRoot.folders.description': 'Die Seitenleiste zeigt die Ordner mit ihren Dateien; die geöffnete Datei steht als Eintrag darin.',\n 'composites.settings.treeRoot.file.label': 'Wurzel ist eine einzelne Datei',\n 'composites.settings.treeRoot.file.description': 'Ist eine Baustein-Datei geöffnet, zeigt die Seitenleiste sie als Wurzel mit ihren Ordnern und Dokumenten. Ohne geöffnete Baustein-Datei sind es die Ordner.',\n 'composites.settings.composites.title': 'Bausteine',\n 'composites.settings.defaultKind.label': 'Standard-Baustein',\n 'composites.settings.defaultKind.description': 'Art der Bausteine, die die Werkzeugleiste, „/“-Befehle und „Überschriften in Bausteine“ anlegen.',\n 'composites.settings.kindIcon.legend': 'Art-Symbol',\n 'composites.settings.kindIcon.always.label': 'Immer anzeigen',\n 'composites.settings.kindIcon.always.description': 'Das Symbol der Bausteinart steht dauerhaft vor dem Baustein.',\n 'composites.settings.kindIcon.hover.label': 'Nur beim Überfahren',\n 'composites.settings.kindIcon.hover.description': 'Das Symbol erscheint, wenn die Maus über dem Baustein steht, er den Fokus hat oder seine Details geöffnet sind.',\n 'composites.settings.dragHandle.legend': 'Ziehgriff (Blöcke ohne Symbol)',\n 'composites.settings.dragHandle.hover.label': 'Nur beim Überfahren',\n 'composites.settings.dragHandle.hover.description': 'Der Ziehgriff erscheint am Block unter der Maus.',\n 'composites.settings.dragHandle.always.label': 'Immer anzeigen',\n 'composites.settings.dragHandle.always.description': 'Jeder Block ohne Symbol zeigt seinen Ziehgriff dauerhaft.',\n\n // Accepted children per kind (`AcceptedChildren`, `moveIntoVerdict`): the notice of a refused edit and why a block cannot move.\n 'composites.nesting.title': 'Verschachtelung nicht möglich',\n 'composites.nesting.refused': '{parent} nimmt keine {child} auf.',\n 'composites.move.blockGone': 'Der Block existiert nicht mehr.',\n 'composites.move.targetGone': 'Das Ziel existiert nicht mehr.',\n 'composites.move.targetNotBlock': 'Das Ziel ist kein Baustein.',\n 'composites.move.intoSelf': 'Ein Block kann nicht in sich selbst verschoben werden.',\n 'composites.move.intoOwn': 'Ein Block kann nicht in einen Baustein verschoben werden, den er selbst enthält.',\n} as const\n"],"mappings":"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"}
|
|
@@ -7,6 +7,15 @@ const de = {
|
|
|
7
7
|
"integrations.compositeFill.empty.description": "Der Baustein wurde nicht gefüllt.",
|
|
8
8
|
"integrations.compositeFill.gone.title": "Baustein nicht mehr gefunden",
|
|
9
9
|
"integrations.compositeFill.gone.description": "Der Baustein wurde nicht gefüllt.",
|
|
10
|
+
"integrations.compositeDerive.action": "Ableiten (KI)",
|
|
11
|
+
"integrations.compositeDerive.running": "{kind} wird abgeleitet…",
|
|
12
|
+
"integrations.compositeDerive.done": "{kind} abgeleitet",
|
|
13
|
+
"integrations.compositeDerive.failed": "Ableiten fehlgeschlagen",
|
|
14
|
+
"integrations.compositeDerive.notAccepted": "Dieser Baustein kann hier nicht eingefügt werden",
|
|
15
|
+
"integrations.compositeDerive.empty.title": "Leeres Ergebnis",
|
|
16
|
+
"integrations.compositeDerive.empty.description": "Es wurde kein Baustein abgeleitet.",
|
|
17
|
+
"integrations.compositeDerive.gone.title": "Baustein nicht mehr gefunden",
|
|
18
|
+
"integrations.compositeDerive.gone.description": "Das Ergebnis wurde nicht übernommen.",
|
|
10
19
|
"integrations.compositeSummary.action": "Zusammenfassung erzeugen (KI)",
|
|
11
20
|
"integrations.compositeSummary.failed": "Zusammenfassung fehlgeschlagen",
|
|
12
21
|
"integrations.compositeSummary.empty.title": "Leeres Ergebnis",
|
|
@@ -14,15 +23,47 @@ const de = {
|
|
|
14
23
|
"integrations.compositeSummary.gone.title": "Baustein nicht mehr gefunden",
|
|
15
24
|
"integrations.compositeSummary.gone.description": "Die Zusammenfassung wurde nicht übernommen.",
|
|
16
25
|
"integrations.compositeSummary.done": "Zusammenfassung erstellt",
|
|
17
|
-
"integrations.
|
|
18
|
-
"integrations.
|
|
19
|
-
"integrations.
|
|
20
|
-
"integrations.
|
|
21
|
-
"integrations.
|
|
22
|
-
"integrations.
|
|
23
|
-
"integrations.
|
|
24
|
-
"integrations.
|
|
26
|
+
"integrations.rendition.action": "Lesefassung erzeugen",
|
|
27
|
+
"integrations.rendition.regenerate": "Neu erzeugen (ersetzen)",
|
|
28
|
+
"integrations.rendition.running": "Lesefassung wird erzeugt…",
|
|
29
|
+
"integrations.rendition.done": "Lesefassung erstellt",
|
|
30
|
+
"integrations.rendition.failed": "Lesefassung fehlgeschlagen",
|
|
31
|
+
"integrations.rendition.noSource": "Der Baustein hat keine gespeicherte Quelle",
|
|
32
|
+
"integrations.rendition.notAccepted": "Eine Lesefassung kann hier nicht eingefügt werden",
|
|
33
|
+
"integrations.rendition.empty.title": "Leeres Ergebnis",
|
|
34
|
+
"integrations.rendition.empty.description": "Die Lesefassung wurde nicht übernommen.",
|
|
35
|
+
"integrations.rendition.gone.title": "Baustein nicht mehr gefunden",
|
|
36
|
+
"integrations.rendition.gone.description": "Die Lesefassung wurde nicht übernommen.",
|
|
37
|
+
"integrations.rendition.title.transcription": "Transkript",
|
|
38
|
+
"integrations.rendition.title.pdf-text": "Volltext",
|
|
39
|
+
"integrations.rendition.title.ocr": "Volltext (OCR)",
|
|
40
|
+
"integrations.rendition.title.description": "Beschreibung",
|
|
41
|
+
"integrations.rendition.editedWarning.title": "Lesefassung wurde bearbeitet",
|
|
42
|
+
"integrations.rendition.editedWarning.description": "Neu erzeugen ersetzt deine Änderungen.",
|
|
43
|
+
"integrations.rendition.editedWarning.confirm": "Trotzdem ersetzen",
|
|
44
|
+
"integrations.rendition.warnings.title": "Hinweise zur Lesefassung",
|
|
45
|
+
"integrations.rendition.warning.ocr-unavailable": "OCR ist nicht verfügbar, es wurde nur die Textebene des PDFs gelesen.",
|
|
46
|
+
"integrations.rendition.warning.crossref-unavailable": "Crossref war nicht erreichbar, die Literaturangabe stammt aus dem Modell.",
|
|
47
|
+
"integrations.rendition.warning.pages-truncated": "Nur die ersten Seiten wurden gelesen.",
|
|
48
|
+
"integrations.rendition.warning.ocr-truncated": "Die OCR hat nur die ersten Seiten gelesen (eine Modellabfrage je Seite); der Rest fehlt.",
|
|
49
|
+
"integrations.rendition.warning.bibliography-failed": "Für diese Quelle wurden keine Literaturangaben gefunden.",
|
|
50
|
+
"integrations.rendition.page": "S. {n}",
|
|
51
|
+
"integrations.bibliographyFetch.action": "Literaturangaben abrufen",
|
|
52
|
+
"integrations.bibliographyFetch.running": "Literaturangaben werden abgerufen…",
|
|
53
|
+
"integrations.bibliographyFetch.done": "Literaturangaben übernommen",
|
|
54
|
+
"integrations.bibliographyFetch.failed": "Literaturangaben konnten nicht abgerufen werden",
|
|
55
|
+
"integrations.bibliographyFetch.invalidDoi": "Die DOI ist ungültig",
|
|
56
|
+
"integrations.bibliographyFetch.noSource": "Der Baustein hat weder eine DOI noch ein gespeichertes PDF",
|
|
57
|
+
"integrations.bibliographyFetch.empty": "Es wurden keine Literaturangaben gefunden",
|
|
58
|
+
"integrations.bibliographyFetch.gone.title": "Baustein nicht mehr gefunden",
|
|
59
|
+
"integrations.bibliographyFetch.gone.description": "Die Literaturangaben wurden nicht übernommen.",
|
|
60
|
+
"integrations.bibliographyFetch.crossrefUnavailable.title": "Crossref nicht erreichbar",
|
|
61
|
+
"integrations.bibliographyFetch.crossrefUnavailable.description": "Die Literaturangaben stammen aus dem Modell und sollten geprüft werden.",
|
|
25
62
|
"integrations.compositeMedia.import": "Datei importieren",
|
|
63
|
+
"integrations.sourceReplace.action": "Quelle ersetzen",
|
|
64
|
+
"integrations.sourceReplace.done": "Quelle ersetzt",
|
|
65
|
+
"integrations.sourceReplace.failed": "Quelle konnte nicht ersetzt werden",
|
|
66
|
+
"integrations.sourceReplace.gone": "Baustein nicht mehr gefunden",
|
|
26
67
|
"integrations.transcriptCleanup.action": "Transkript bereinigen",
|
|
27
68
|
"integrations.transcriptCleanup.actionAi": "Transkript bereinigen (KI)",
|
|
28
69
|
"integrations.transcriptCleanup.noSegments": "Keine Sprechersegmente mit Text gefunden",
|