@ecsplico/editor 2.0.0 → 2.1.1
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 +37 -0
- package/README.md +4 -3
- package/dist/adapters/anchors.d.ts +80 -0
- package/dist/adapters/anchors.js +270 -0
- package/dist/adapters/anchors.js.map +1 -0
- package/dist/adapters/comments/client.d.ts +64 -0
- package/dist/adapters/comments/client.js +536 -0
- package/dist/adapters/comments/client.js.map +1 -0
- package/dist/adapters/comments/drizzle.d.ts +430 -0
- package/dist/adapters/comments/drizzle.js +236 -0
- package/dist/adapters/comments/drizzle.js.map +1 -0
- package/dist/adapters/comments/errors.d.ts +9 -0
- package/dist/adapters/comments/errors.js +19 -0
- package/dist/adapters/comments/errors.js.map +1 -0
- package/dist/adapters/comments/json.d.ts +19 -0
- package/dist/adapters/comments/json.js +94 -0
- package/dist/adapters/comments/json.js.map +1 -0
- package/dist/adapters/comments/record.js +78 -0
- package/dist/adapters/comments/record.js.map +1 -0
- package/dist/adapters/comments/server.d.ts +23 -0
- package/dist/adapters/comments/server.js +102 -0
- package/dist/adapters/comments/server.js.map +1 -0
- package/dist/adapters/comments/types.d.ts +109 -0
- package/dist/adapters/documents.js +108 -0
- package/dist/adapters/documents.js.map +1 -0
- package/dist/adapters/drizzle.d.ts +293 -0
- package/dist/adapters/drizzle.js +157 -0
- package/dist/adapters/drizzle.js.map +1 -0
- package/dist/adapters/files.js +30 -0
- package/dist/adapters/files.js.map +1 -0
- package/dist/adapters/forge.d.ts +58 -0
- package/dist/adapters/forge.js +91 -0
- package/dist/adapters/forge.js.map +1 -0
- package/dist/adapters/index.d.ts +13 -0
- package/dist/adapters/index.js +0 -0
- package/dist/adapters/json.d.ts +24 -0
- package/dist/adapters/json.js +128 -0
- package/dist/adapters/json.js.map +1 -0
- package/dist/adapters/nitro.d.ts +61 -0
- package/dist/adapters/nitro.js +212 -0
- package/dist/adapters/nitro.js.map +1 -0
- package/dist/adapters/routes.js +16 -0
- package/dist/adapters/routes.js.map +1 -0
- package/dist/adapters/shared.d.ts +37 -0
- package/dist/adapters/shared.js +32 -0
- package/dist/adapters/shared.js.map +1 -0
- package/dist/adapters/vue.d.ts +67 -0
- package/dist/adapters/vue.js +187 -0
- package/dist/adapters/vue.js.map +1 -0
- package/dist/code/CodeSurface.vue.d.ts +3 -3
- package/dist/core/doc-anchors.d.ts +5 -0
- package/dist/core/doc-anchors.js +4 -3
- package/dist/core/doc-anchors.js.map +1 -1
- package/dist/core/editor-ui.js +57 -1
- package/dist/core/editor-ui.js.map +1 -1
- package/dist/core/surface-session.js +139 -0
- package/dist/core/surface-session.js.map +1 -0
- package/dist/document/DocumentSurface.d.ts +1 -1
- package/dist/document/DocumentSurface.vue.d.ts +3 -3
- package/dist/features/ai/agent-op-review.d.ts +2 -2
- package/dist/features/ai/agent-op-review.js.map +1 -1
- package/dist/features/ai/agent-ops.d.ts +1 -1
- package/dist/features/ai/agent-ops.js +9 -6
- package/dist/features/ai/agent-ops.js.map +1 -1
- package/dist/features/ai/ai-apply.d.ts +1 -1
- package/dist/features/ai/ai-review.js +10 -1
- package/dist/features/ai/ai-review.js.map +1 -1
- package/dist/features/ai/components/AiSelectionMenu.js +78 -252
- package/dist/features/ai/components/AiSelectionMenu.js.map +1 -1
- package/dist/features/ai/components/AiSelectionMenu.vue.d.ts +2 -1
- package/dist/features/ai/components/AiSidebar.js +2 -2
- package/dist/features/ai/components/DocumentChatAnswer.js +1 -1
- package/dist/features/ai/components/DocumentChatOps.js +1 -0
- package/dist/features/ai/components/DocumentChatOps.js.map +1 -1
- package/dist/features/ai/components/ModelQuickSwitch.js +1 -1
- package/dist/features/ai/components/SettingsAiTab.js +1 -1
- package/dist/features/ai/components/SettingsModelProfiles.js +1 -1
- package/dist/features/ai/document-chat.d.ts +3 -2
- package/dist/features/ai/document-chat.js +16 -19
- package/dist/features/ai/document-chat.js.map +1 -1
- package/dist/features/ai/index.d.ts +5 -3
- package/dist/features/ai/index.js +4 -2
- package/dist/features/ai/protocol/agent-ops.d.ts +22 -17
- package/dist/features/ai/protocol/agent-ops.js +65 -39
- package/dist/features/ai/protocol/agent-ops.js.map +1 -1
- package/dist/features/ai/protocol/block-lines.d.ts +89 -0
- package/dist/features/ai/protocol/block-lines.js +177 -0
- package/dist/features/ai/protocol/block-lines.js.map +1 -0
- package/dist/features/ai/protocol/chat.js +10 -10
- 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/index.js +3 -2
- package/dist/features/ai/react/AiSelectionMenu.d.ts +3 -2
- package/dist/features/ai/react/AiSelectionMenu.js +64 -255
- package/dist/features/ai/react/AiSelectionMenu.js.map +1 -1
- package/dist/features/ai/react/AiSidebar.js +2 -2
- package/dist/features/ai/react/DocumentChatAnswer.js +1 -1
- package/dist/features/ai/react/DocumentChatOps.js +1 -0
- package/dist/features/ai/react/DocumentChatOps.js.map +1 -1
- package/dist/features/ai/react/ModelQuickSwitch.js +1 -1
- package/dist/features/ai/react/SettingsAiTab.js +1 -1
- package/dist/features/ai/react/SettingsModelProfiles.js +1 -1
- package/dist/features/ai/react/use-ai-selection-flow.js +34 -0
- package/dist/features/ai/react/use-ai-selection-flow.js.map +1 -0
- package/dist/features/ai/selection-flow.d.ts +133 -0
- package/dist/features/ai/selection-flow.js +283 -0
- package/dist/features/ai/selection-flow.js.map +1 -0
- package/dist/features/ai/use-ai-assistant.d.ts +1 -1
- package/dist/features/ai/use-document-chat.d.ts +1 -1
- package/dist/features/authors/components/AuthorColorsPanel.js +1 -1
- package/dist/features/authors/feature.js +1 -1
- package/dist/features/authors/index.js +1 -1
- package/dist/features/authors/react/AuthorColorsPanel.js +1 -1
- package/dist/features/comments/components/CommentBubble.js +1 -1
- package/dist/features/comments/components/CommentComposer.js +1 -1
- package/dist/features/comments/components/CommentThreadView.js +5 -2
- package/dist/features/comments/components/CommentThreadView.js.map +1 -1
- package/dist/features/comments/components/CommentsMargin.js +108 -230
- package/dist/features/comments/components/CommentsMargin.js.map +1 -1
- package/dist/features/comments/components/CommentsOverlay.js +1 -1
- package/dist/features/comments/feature.js +1 -1
- package/dist/features/comments/index.d.ts +4 -2
- package/dist/features/comments/index.js +4 -2
- package/dist/features/comments/margin-controller.d.ts +44 -0
- package/dist/features/comments/margin-controller.js +132 -0
- package/dist/features/comments/margin-controller.js.map +1 -0
- package/dist/features/comments/margin-layout.d.ts +55 -0
- package/dist/features/comments/margin-layout.js +79 -0
- package/dist/features/comments/margin-layout.js.map +1 -0
- package/dist/features/comments/model.d.ts +8 -0
- package/dist/features/comments/model.js +60 -34
- package/dist/features/comments/model.js.map +1 -1
- package/dist/features/comments/react/CommentBubble.js +1 -1
- package/dist/features/comments/react/CommentComposer.js +1 -1
- package/dist/features/comments/react/CommentThreadView.js +2 -2
- package/dist/features/comments/react/CommentThreadView.js.map +1 -1
- package/dist/features/comments/react/CommentsMargin.d.ts +0 -5
- package/dist/features/comments/react/CommentsMargin.js +85 -251
- package/dist/features/comments/react/CommentsMargin.js.map +1 -1
- package/dist/features/comments/react/CommentsOverlay.js +1 -1
- package/dist/features/comments/react/use-comments.js +1 -1
- package/dist/features/comments/react/use-margin-layout.js +45 -0
- package/dist/features/comments/react/use-margin-layout.js.map +1 -0
- package/dist/features/comments/react.d.ts +1 -1
- package/dist/features/comments/schema.d.ts +23 -0
- package/dist/features/comments/schema.js.map +1 -1
- package/dist/features/comments/snapshot-equality.js +40 -0
- package/dist/features/comments/snapshot-equality.js.map +1 -0
- package/dist/features/comments/thread-anchor.js +33 -0
- package/dist/features/comments/thread-anchor.js.map +1 -0
- package/dist/features/comments/use-comments.d.ts +3 -1
- package/dist/features/comments/use-comments.js +1 -0
- package/dist/features/comments/use-comments.js.map +1 -1
- package/dist/features/comments/use-margin-layout.js +29 -0
- package/dist/features/comments/use-margin-layout.js.map +1 -0
- package/dist/features/comments/vue.d.ts +1 -1
- package/dist/features/composites/accepted-children.d.ts +21 -0
- package/dist/features/composites/accepted-children.js +126 -0
- package/dist/features/composites/accepted-children.js.map +1 -0
- package/dist/features/composites/components/CompositeDetails.js +1 -1
- package/dist/features/composites/components/CompositeInspector.js +38 -164
- package/dist/features/composites/components/CompositeInspector.js.map +1 -1
- package/dist/features/composites/feature.d.ts +2 -1
- package/dist/features/composites/feature.js +8 -2
- package/dist/features/composites/feature.js.map +1 -1
- package/dist/features/composites/index.d.ts +5 -3
- package/dist/features/composites/index.js +8 -6
- package/dist/features/composites/inspector-model.d.ts +97 -0
- package/dist/features/composites/inspector-model.js +255 -0
- package/dist/features/composites/inspector-model.js.map +1 -0
- package/dist/features/composites/kinds.d.ts +11 -0
- package/dist/features/composites/kinds.js +17 -2
- package/dist/features/composites/kinds.js.map +1 -1
- package/dist/features/composites/outline.d.ts +18 -5
- package/dist/features/composites/outline.js +44 -12
- package/dist/features/composites/outline.js.map +1 -1
- package/dist/features/composites/react/CompositeDetails.js +1 -1
- package/dist/features/composites/react/CompositeInspector.d.ts +1 -1
- package/dist/features/composites/react/CompositeInspector.js +21 -180
- package/dist/features/composites/react/CompositeInspector.js.map +1 -1
- package/dist/features/composites/react/CompositeStatusMenu.d.ts +1 -1
- package/dist/features/composites/react/CompositeView.js +1 -1
- package/dist/features/composites/react/use-composite-inspector.js +29 -0
- package/dist/features/composites/react/use-composite-inspector.js.map +1 -0
- package/dist/features/composites/schema.d.ts +2 -2
- package/dist/features/composites/schema.js +2 -2
- package/dist/features/composites/schema.js.map +1 -1
- package/dist/features/composites/use-composite-anchors.d.ts +1 -1
- package/dist/features/composites/use-composite-inspector.js +41 -0
- package/dist/features/composites/use-composite-inspector.js.map +1 -0
- package/dist/features/composites/use-composite-rows.d.ts +1 -1
- package/dist/features/media/index.d.ts +1 -1
- package/dist/features/media/vue.d.ts +1 -1
- package/dist/features/mentions/index.d.ts +3 -3
- package/dist/features/mentions/index.js +3 -3
- package/dist/features/mentions/schema.d.ts +1 -1
- package/dist/features/mentions/schema.js +1 -1
- package/dist/features/themes/index.d.ts +1 -1
- package/dist/features/themes/index.js +1 -1
- package/dist/features/transcript/feature.js +1 -1
- package/dist/features/transcript/index.js +2 -2
- package/dist/i18n/de/ai.js +2 -0
- package/dist/i18n/de/ai.js.map +1 -1
- package/dist/i18n/de/composites.js +8 -1
- package/dist/i18n/de/composites.js.map +1 -1
- package/dist/i18n/de/tree.js +14 -1
- package/dist/i18n/de/tree.js.map +1 -1
- package/dist/i18n/de.d.ts +22 -0
- package/dist/i18n/en/ai.js +2 -0
- package/dist/i18n/en/ai.js.map +1 -1
- package/dist/i18n/en/composites.js +8 -1
- package/dist/i18n/en/composites.js.map +1 -1
- package/dist/i18n/en/tree.js +14 -1
- package/dist/i18n/en/tree.js.map +1 -1
- package/dist/integrations/composite-ai/composite-fill.js +2 -2
- package/dist/integrations/composite-ai/composite-summary.js +2 -2
- package/dist/integrations/composite-ai/index.js +2 -2
- package/dist/integrations/transcript-ai/transcript-cleanup.js +1 -1
- package/dist/markdown/MarkdownSurface.d.ts +1 -1
- package/dist/markdown/MarkdownSurface.js +2 -2
- package/dist/markdown/MarkdownSurface.vue.d.ts +9 -9
- package/dist/markdown/index.d.ts +2 -2
- package/dist/nuxt/runtime/server/routes/collab/[id].js +1 -1
- package/dist/react/EditorSurface.d.ts +1 -1
- package/dist/react/EditorSurface.js +43 -149
- package/dist/react/EditorSurface.js.map +1 -1
- package/dist/react/EditorToolbar.js +3 -40
- package/dist/react/EditorToolbar.js.map +1 -1
- package/dist/schema/advanced.js +2 -2
- package/dist/server/adapter.d.ts +2 -2
- package/dist/server/collab.js +1 -1
- package/dist/server/handlers/ai.d.ts +4 -2
- package/dist/server/handlers/ai.js +11 -9
- package/dist/server/handlers/ai.js.map +1 -1
- package/dist/server/handlers/context.d.ts +1 -1
- package/dist/server/handlers/editor.d.ts +1 -1
- package/dist/server/handlers/editor.js +2 -2
- package/dist/server/host.d.ts +1 -1
- package/dist/server/index.d.ts +2 -2
- package/dist/settings/index.d.ts +1 -1
- package/dist/styles/tokens.css +1 -1
- package/dist/tree/DocumentTree.js +159 -387
- package/dist/tree/DocumentTree.js.map +1 -1
- package/dist/tree/drop-rules.js +37 -0
- package/dist/tree/drop-rules.js.map +1 -0
- package/dist/tree/react/DocumentTree.d.ts +2 -2
- package/dist/tree/react/DocumentTree.js +135 -397
- package/dist/tree/react/DocumentTree.js.map +1 -1
- package/dist/tree/react/use-tree-model.js +129 -0
- package/dist/tree/react/use-tree-model.js.map +1 -0
- package/dist/tree/react.js +1 -1
- package/dist/tree/tree-host.js +100 -0
- package/dist/tree/tree-host.js.map +1 -0
- package/dist/tree/tree-items.js +22 -43
- package/dist/tree/tree-items.js.map +1 -1
- package/dist/tree/tree-model.js +580 -0
- package/dist/tree/tree-model.js.map +1 -0
- package/dist/tree/tree-rows.js +77 -0
- package/dist/tree/tree-rows.js.map +1 -0
- package/dist/tree/use-tree-model.js +94 -0
- package/dist/tree/use-tree-model.js.map +1 -0
- package/dist/tree/vue.js +1 -1
- package/dist/vue/AdvancedEditor.vue.d.ts +6 -6
- package/dist/vue/SimpleEditor.vue.d.ts +2 -2
- package/dist/vue/components/EditorSurface.js +27 -87
- package/dist/vue/components/EditorSurface.js.map +1 -1
- package/dist/vue/components/EditorSurface.vue.d.ts +6 -6
- package/dist/vue/components/EditorToolbar.js +7 -44
- package/dist/vue/components/EditorToolbar.js.map +1 -1
- package/dist/vue/context.d.ts +1 -1
- package/dist/vue/context.js +1 -1
- package/dist/vue/context.js.map +1 -1
- package/dist/vue/use-editor-ui.d.ts +1 -1
- package/dist/vue/use-notifier.d.ts +1 -1
- package/docs/integration.md +97 -4
- package/docs/llms.md +9 -1
- package/docs/usage.md +10 -5
- package/package.json +67 -5
package/dist/i18n/en/ai.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ai.js","names":[],"sources":["../../../src/i18n/en/ai.ts"],"sourcesContent":["import type { de } from '../de/ai'\n\nexport const en: { [K in keyof typeof de]: string } = {\n // Tasks (menus, sidebar chips, prompt hints, result headings)\n 'ai.task.reformulate.label': 'Rephrase',\n 'ai.task.reformulate.promptLabel': 'Hint (optional), e.g. “shorter” or “more formal”',\n 'ai.task.generate.label': 'Generate text',\n 'ai.task.generate.promptLabel': 'What should be written?',\n 'ai.task.transcript.promptLabel': 'Hint (optional), e.g. “decisions only” or “in German”',\n 'ai.task.transcriptSummary.heading': 'Summary',\n 'ai.task.transcriptMinutes.heading': 'Minutes',\n 'ai.task.transcriptActionItems.heading': 'Action items',\n 'ai.task.fix.label': 'Fix',\n 'ai.task.shorter.label': 'Shorter',\n 'ai.task.formal.label': 'More formal',\n 'ai.task.casual.label': 'More casual',\n 'ai.task.translate.label': 'Translate',\n 'ai.task.summarize.label': 'Summarize',\n 'ai.task.custom.label': 'Custom instruction',\n 'ai.task.custom.promptLabel': 'Instruction for the AI, e.g. “as a bullet list”',\n 'ai.task.continue.label': 'Continue writing',\n 'ai.task.fillBlock.label': 'Fill block',\n 'ai.task.fillBlock.promptLabel': 'Hint (optional)',\n\n // Model slots and target languages\n 'ai.slot.complete.label': 'Suggestions while typing',\n 'ai.slot.complete.description': 'Fast model; must support assistant prefill.',\n 'ai.slot.rewrite.label': 'Text in a block',\n 'ai.slot.rewrite.description': 'Rephrase, fix, translate, summarize, clean up transcript.',\n 'ai.slot.generate.label': 'Generate blocks & chat',\n 'ai.slot.generate.description': 'New blocks, minutes, chat agent (needs tool calling).',\n 'ai.slot.ariaLabel': 'Model for “{slot}”',\n 'ai.slot.manage': 'Manage models…',\n 'ai.language.de': 'German',\n 'ai.language.en': 'English',\n 'ai.language.fr': 'French',\n 'ai.language.es': 'Spanish',\n 'ai.language.it': 'Italian',\n\n // Feature entry points (toolbar, block action, slash command, settings tab)\n 'ai.tab': 'AI',\n 'ai.toolbar.sidebar': 'AI sidebar',\n 'ai.toolbar.autocomplete': 'AI suggestions while typing (Tab accepts, Esc dismisses)',\n 'ai.blockAction.label': 'Edit with AI',\n 'ai.slash.label': 'AI',\n\n // Notices\n 'ai.rateLimited': 'Too many AI requests, please wait a moment',\n 'ai.sse.unknownError': 'Unknown error',\n 'ai.sse.httpError': 'Error {status}',\n 'ai.sse.aborted': 'Connection interrupted',\n 'ai.chat.emptyScope': 'The selection contains no editable blocks.',\n 'ai.apply.missing.title': 'Text passage not found anymore',\n 'ai.apply.missing.description': 'The result was not applied.',\n 'ai.apply.empty.title': 'Empty result',\n 'ai.apply.empty.description': 'The result was not applied.',\n 'ai.apply.unchanged.title': 'No changes',\n 'ai.apply.unchanged.description': 'The result matches the existing text.',\n 'ai.apply.overlap.title': 'Text passage is already under review',\n 'ai.apply.overlap.description': 'Accept or discard the open AI changes first.',\n\n // In-document review\n 'ai.review.accept': 'Accept',\n 'ai.review.discard': 'Discard',\n 'ai.review.acceptAll': 'Accept all',\n 'ai.review.rejectAll': 'Discard all',\n 'ai.review.barLabel': 'Review AI changes',\n 'ai.review.count.one': '1 AI change',\n 'ai.review.count.other': '{n} AI changes',\n 'ai.review.previous': 'Previous change',\n 'ai.review.next': 'Next change',\n 'ai.review.invalid.one': 'AI change discarded',\n 'ai.review.invalid.other': '{n} AI changes discarded',\n 'ai.review.invalid.description': 'The original text has been changed in the meantime.',\n\n // Selection / caret menu\n 'ai.menu.trigger': 'AI',\n 'ai.menu.model': 'Model',\n 'ai.menu.targetLanguage': 'Target language',\n 'ai.menu.sendInstruction': 'Send instruction',\n 'ai.menu.requestWithLanguage': '{task} – {language}',\n 'ai.menu.cancel': 'Cancel',\n 'ai.menu.discard': 'Discard',\n 'ai.menu.retry': 'Try again',\n 'ai.menu.insert': 'Insert',\n 'ai.menu.insertBelow': 'Insert below',\n 'ai.menu.replace': 'Replace',\n 'ai.menu.missing.selection': 'The selected text was deleted.',\n 'ai.menu.missing.line': 'The line was deleted.',\n 'ai.menu.missing.insert': 'The result was not inserted.',\n\n // Sidebar\n 'ai.sidebar.label': 'AI sidebar',\n 'ai.sidebar.title': 'AI',\n 'ai.sidebar.newConversation': 'New conversation',\n 'ai.sidebar.close': 'Close',\n 'ai.sidebar.selection.one': 'Selection: {n} block',\n 'ai.sidebar.selection.other': 'Selection: {n} blocks',\n 'ai.sidebar.selection.title': 'Changes only affect the selected blocks',\n 'ai.sidebar.selection.clear': 'Clear selection',\n 'ai.sidebar.intro': 'Ask a question about the content, e.g. “Who said the budget isn’t enough?”, or ask for a change, e.g. “Shorten section 2”. With text selected, changes only affect the selected blocks. The quick actions below generate new blocks, e.g. minutes.',\n 'ai.sidebar.stop': 'Stop',\n 'ai.sidebar.discard': 'Discard',\n 'ai.sidebar.apply': 'Accept',\n 'ai.sidebar.generateGroup': 'Generate blocks',\n 'ai.sidebar.generate': 'Generate',\n 'ai.sidebar.placeholder': 'Question or change request…',\n 'ai.sidebar.messageLabel': 'Message about the document',\n 'ai.sidebar.send': 'Send',\n 'ai.sidebar.revealMissing': 'Text passage no longer in the document',\n\n // Chat edit operations\n 'ai.op.addAtStart': 'Insert at the start of the document',\n 'ai.op.addAfter': 'Insert after “{snippet}”',\n 'ai.op.convert': 'Convert to {target}: “{snippet}”',\n 'ai.op.update': 'Change: “{snippet}”',\n 'ai.op.delete': 'Delete: “{snippet}”',\n 'ai.op.accept': 'Accept',\n 'ai.op.discard': 'Discard',\n 'ai.op.problems.one': '1 suggestion discarded',\n 'ai.op.problems.other': '{n} suggestions discarded',\n 'ai.op.problems.description': 'The AI referred to blocks or block types that do not exist or that are outside the selection.',\n 'ai.op.invalid.title': 'Change no longer applicable',\n 'ai.op.invalid.description': 'The text has been changed differently in the meantime.',\n 'ai.op.snippet.documentStart': 'Start of document',\n 'ai.op.snippet.missing': 'Block no longer exists',\n 'ai.op.snippet.emptyBlock': 'Empty block',\n 'ai.op.snippet.image': 'Image',\n 'ai.op.snippet.audio': 'Audio',\n 'ai.op.snippet.video': 'Video',\n 'ai.op.snippet.file': 'File',\n 'ai.opBadge.pending': 'Open',\n 'ai.opBadge.accepted': 'Accepted',\n 'ai.opBadge.rejected': 'Rejected',\n 'ai.opBadge.partial': 'Partial',\n 'ai.opBadge.invalid': 'Expired',\n 'ai.opBadge.unchanged': 'No change',\n 'ai.opBadge.missing': 'Block missing',\n 'ai.opBadge.overlap': 'Spot occupied',\n 'ai.opBadge.empty': 'Empty',\n 'ai.opBadge.blocked': 'Outside the selection',\n 'ai.opTitle.pending': 'Suggestion not decided yet',\n 'ai.opTitle.accepted': 'Suggestion accepted',\n 'ai.opTitle.rejected': 'Suggestion rejected',\n 'ai.opTitle.partial': 'Suggestion partially accepted',\n 'ai.opTitle.invalid': 'Suggestion expired because the text has been changed differently in the meantime',\n 'ai.opTitle.unchanged': 'Suggestion not shown because it matches the existing text',\n 'ai.opTitle.missing': 'Suggestion not shown because the block no longer exists',\n 'ai.opTitle.overlap': 'Suggestion not shown because other AI changes are still open at that spot',\n 'ai.opTitle.empty': 'Suggestion not shown because its content is empty',\n 'ai.opTitle.blocked': 'Suggestion blocked because it lies outside the permitted area',\n\n // Settings tab\n 'ai.settings.writing.title': 'While writing',\n 'ai.settings.autocomplete.label': 'AI suggestions while typing',\n 'ai.settings.autocomplete.description': 'Grey text after the cursor; Tab accepts, Esc dismisses.',\n 'ai.settings.language.label': 'Target language for translating',\n 'ai.settings.language.description': 'Preselected; can be changed per call in the AI menu.',\n 'ai.settings.slots.title': 'Model per task',\n 'ai.settings.slots.description': 'Which profile the individual AI functions use.',\n 'ai.settings.profiles.title': 'Model profiles',\n 'ai.settings.profiles.description': 'Server presets are preconfigured. Your own profiles are stored in this browser only; their API key is sent with every request and not stored on the server.',\n 'ai.profiles.server': 'From the server',\n 'ai.profiles.noPresets': 'No presets loaded.',\n 'ai.profiles.serverBadge': 'Server',\n 'ai.profiles.own': 'Own profiles',\n 'ai.profiles.add': 'Add profile',\n 'ai.profiles.edit': 'Edit',\n 'ai.profiles.delete': 'Delete',\n 'ai.profiles.name': 'Name',\n 'ai.profiles.namePlaceholder': 'e.g. Local',\n 'ai.profiles.endpoint': 'Endpoint',\n 'ai.profiles.endpointHelp': 'OpenAI-compatible base URL.',\n 'ai.profiles.endpointPlaceholder': 'https://openrouter.ai/api/v1',\n 'ai.profiles.model': 'Model',\n 'ai.profiles.modelPlaceholder': 'google/gemini-2.5-flash',\n 'ai.profiles.apiKey': 'API key',\n 'ai.profiles.testOk': 'Connection works',\n 'ai.profiles.test': 'Test',\n 'ai.profiles.cancel': 'Cancel',\n 'ai.profiles.save': 'Save',\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ai.js","names":[],"sources":["../../../src/i18n/en/ai.ts"],"sourcesContent":["import type { de } from '../de/ai'\n\nexport const en: { [K in keyof typeof de]: string } = {\n // Tasks (menus, sidebar chips, prompt hints, result headings)\n 'ai.task.reformulate.label': 'Rephrase',\n 'ai.task.reformulate.promptLabel': 'Hint (optional), e.g. “shorter” or “more formal”',\n 'ai.task.generate.label': 'Generate text',\n 'ai.task.generate.promptLabel': 'What should be written?',\n 'ai.task.transcript.promptLabel': 'Hint (optional), e.g. “decisions only” or “in German”',\n 'ai.task.transcriptSummary.heading': 'Summary',\n 'ai.task.transcriptMinutes.heading': 'Minutes',\n 'ai.task.transcriptActionItems.heading': 'Action items',\n 'ai.task.fix.label': 'Fix',\n 'ai.task.shorter.label': 'Shorter',\n 'ai.task.formal.label': 'More formal',\n 'ai.task.casual.label': 'More casual',\n 'ai.task.translate.label': 'Translate',\n 'ai.task.summarize.label': 'Summarize',\n 'ai.task.custom.label': 'Custom instruction',\n 'ai.task.custom.promptLabel': 'Instruction for the AI, e.g. “as a bullet list”',\n 'ai.task.continue.label': 'Continue writing',\n 'ai.task.fillBlock.label': 'Fill block',\n 'ai.task.fillBlock.promptLabel': 'Hint (optional)',\n\n // Model slots and target languages\n 'ai.slot.complete.label': 'Suggestions while typing',\n 'ai.slot.complete.description': 'Fast model; must support assistant prefill.',\n 'ai.slot.rewrite.label': 'Text in a block',\n 'ai.slot.rewrite.description': 'Rephrase, fix, translate, summarize, clean up transcript.',\n 'ai.slot.generate.label': 'Generate blocks & chat',\n 'ai.slot.generate.description': 'New blocks, minutes, chat agent (needs tool calling).',\n 'ai.slot.ariaLabel': 'Model for “{slot}”',\n 'ai.slot.manage': 'Manage models…',\n 'ai.language.de': 'German',\n 'ai.language.en': 'English',\n 'ai.language.fr': 'French',\n 'ai.language.es': 'Spanish',\n 'ai.language.it': 'Italian',\n\n // Feature entry points (toolbar, block action, slash command, settings tab)\n 'ai.tab': 'AI',\n 'ai.toolbar.sidebar': 'AI sidebar',\n 'ai.toolbar.autocomplete': 'AI suggestions while typing (Tab accepts, Esc dismisses)',\n 'ai.blockAction.label': 'Edit with AI',\n 'ai.slash.label': 'AI',\n\n // Notices\n 'ai.rateLimited': 'Too many AI requests, please wait a moment',\n 'ai.sse.unknownError': 'Unknown error',\n 'ai.sse.httpError': 'Error {status}',\n 'ai.sse.aborted': 'Connection interrupted',\n 'ai.chat.emptyScope': 'The selection contains no editable blocks.',\n 'ai.apply.missing.title': 'Text passage not found anymore',\n 'ai.apply.missing.description': 'The result was not applied.',\n 'ai.apply.empty.title': 'Empty result',\n 'ai.apply.empty.description': 'The result was not applied.',\n 'ai.apply.unchanged.title': 'No changes',\n 'ai.apply.unchanged.description': 'The result matches the existing text.',\n 'ai.apply.overlap.title': 'Text passage is already under review',\n 'ai.apply.overlap.description': 'Accept or discard the open AI changes first.',\n\n // In-document review\n 'ai.review.accept': 'Accept',\n 'ai.review.discard': 'Discard',\n 'ai.review.acceptAll': 'Accept all',\n 'ai.review.rejectAll': 'Discard all',\n 'ai.review.barLabel': 'Review AI changes',\n 'ai.review.count.one': '1 AI change',\n 'ai.review.count.other': '{n} AI changes',\n 'ai.review.previous': 'Previous change',\n 'ai.review.next': 'Next change',\n 'ai.review.invalid.one': 'AI change discarded',\n 'ai.review.invalid.other': '{n} AI changes discarded',\n 'ai.review.invalid.description': 'The original text has been changed in the meantime.',\n\n // Selection / caret menu\n 'ai.menu.trigger': 'AI',\n 'ai.menu.model': 'Model',\n 'ai.menu.targetLanguage': 'Target language',\n 'ai.menu.sendInstruction': 'Send instruction',\n 'ai.menu.requestWithLanguage': '{task} – {language}',\n 'ai.menu.cancel': 'Cancel',\n 'ai.menu.discard': 'Discard',\n 'ai.menu.retry': 'Try again',\n 'ai.menu.insert': 'Insert',\n 'ai.menu.insertBelow': 'Insert below',\n 'ai.menu.replace': 'Replace',\n 'ai.menu.missing.selection': 'The selected text was deleted.',\n 'ai.menu.missing.line': 'The line was deleted.',\n 'ai.menu.missing.insert': 'The result was not inserted.',\n\n // Sidebar\n 'ai.sidebar.label': 'AI sidebar',\n 'ai.sidebar.title': 'AI',\n 'ai.sidebar.newConversation': 'New conversation',\n 'ai.sidebar.close': 'Close',\n 'ai.sidebar.selection.one': 'Selection: {n} block',\n 'ai.sidebar.selection.other': 'Selection: {n} blocks',\n 'ai.sidebar.selection.title': 'Changes only affect the selected blocks',\n 'ai.sidebar.selection.clear': 'Clear selection',\n 'ai.sidebar.intro': 'Ask a question about the content, e.g. “Who said the budget isn’t enough?”, or ask for a change, e.g. “Shorten section 2”. With text selected, changes only affect the selected blocks. The quick actions below generate new blocks, e.g. minutes.',\n 'ai.sidebar.stop': 'Stop',\n 'ai.sidebar.discard': 'Discard',\n 'ai.sidebar.apply': 'Accept',\n 'ai.sidebar.generateGroup': 'Generate blocks',\n 'ai.sidebar.generate': 'Generate',\n 'ai.sidebar.placeholder': 'Question or change request…',\n 'ai.sidebar.messageLabel': 'Message about the document',\n 'ai.sidebar.send': 'Send',\n 'ai.sidebar.revealMissing': 'Text passage no longer in the document',\n\n // Chat edit operations\n 'ai.op.addAtStart': 'Insert at the start of the document',\n 'ai.op.addAfter': 'Insert after “{snippet}”',\n 'ai.op.convert': 'Convert to {target}: “{snippet}”',\n 'ai.op.update': 'Change: “{snippet}”',\n 'ai.op.delete': 'Delete: “{snippet}”',\n 'ai.op.accept': 'Accept',\n 'ai.op.discard': 'Discard',\n 'ai.op.problems.one': '1 suggestion discarded',\n 'ai.op.problems.other': '{n} suggestions discarded',\n 'ai.op.problems.description': 'The AI referred to blocks or block types that do not exist or that are outside the selection.',\n 'ai.op.invalid.title': 'Change no longer applicable',\n 'ai.op.invalid.description': 'The text has been changed differently in the meantime.',\n 'ai.op.snippet.documentStart': 'Start of document',\n 'ai.op.snippet.missing': 'Block no longer exists',\n 'ai.op.snippet.emptyBlock': 'Empty block',\n 'ai.op.snippet.image': 'Image',\n 'ai.op.snippet.audio': 'Audio',\n 'ai.op.snippet.video': 'Video',\n 'ai.op.snippet.file': 'File',\n 'ai.opBadge.pending': 'Open',\n 'ai.opBadge.accepted': 'Accepted',\n 'ai.opBadge.rejected': 'Rejected',\n 'ai.opBadge.partial': 'Partial',\n 'ai.opBadge.invalid': 'Expired',\n 'ai.opBadge.unchanged': 'No change',\n 'ai.opBadge.missing': 'Block missing',\n 'ai.opBadge.stale': 'Block deleted',\n 'ai.opBadge.overlap': 'Spot occupied',\n 'ai.opBadge.empty': 'Empty',\n 'ai.opBadge.blocked': 'Outside the selection',\n 'ai.opTitle.pending': 'Suggestion not decided yet',\n 'ai.opTitle.accepted': 'Suggestion accepted',\n 'ai.opTitle.rejected': 'Suggestion rejected',\n 'ai.opTitle.partial': 'Suggestion partially accepted',\n 'ai.opTitle.invalid': 'Suggestion expired because the text has been changed differently in the meantime',\n 'ai.opTitle.unchanged': 'Suggestion not shown because it matches the existing text',\n 'ai.opTitle.missing': 'Suggestion not shown because the block no longer exists',\n 'ai.opTitle.stale': 'Suggestion not shown: the block was deleted in the meantime',\n 'ai.opTitle.overlap': 'Suggestion not shown because other AI changes are still open at that spot',\n 'ai.opTitle.empty': 'Suggestion not shown because its content is empty',\n 'ai.opTitle.blocked': 'Suggestion blocked because it lies outside the permitted area',\n\n // Settings tab\n 'ai.settings.writing.title': 'While writing',\n 'ai.settings.autocomplete.label': 'AI suggestions while typing',\n 'ai.settings.autocomplete.description': 'Grey text after the cursor; Tab accepts, Esc dismisses.',\n 'ai.settings.language.label': 'Target language for translating',\n 'ai.settings.language.description': 'Preselected; can be changed per call in the AI menu.',\n 'ai.settings.slots.title': 'Model per task',\n 'ai.settings.slots.description': 'Which profile the individual AI functions use.',\n 'ai.settings.profiles.title': 'Model profiles',\n 'ai.settings.profiles.description': 'Server presets are preconfigured. Your own profiles are stored in this browser only; their API key is sent with every request and not stored on the server.',\n 'ai.profiles.server': 'From the server',\n 'ai.profiles.noPresets': 'No presets loaded.',\n 'ai.profiles.serverBadge': 'Server',\n 'ai.profiles.own': 'Own profiles',\n 'ai.profiles.add': 'Add profile',\n 'ai.profiles.edit': 'Edit',\n 'ai.profiles.delete': 'Delete',\n 'ai.profiles.name': 'Name',\n 'ai.profiles.namePlaceholder': 'e.g. Local',\n 'ai.profiles.endpoint': 'Endpoint',\n 'ai.profiles.endpointHelp': 'OpenAI-compatible base URL.',\n 'ai.profiles.endpointPlaceholder': 'https://openrouter.ai/api/v1',\n 'ai.profiles.model': 'Model',\n 'ai.profiles.modelPlaceholder': 'google/gemini-2.5-flash',\n 'ai.profiles.apiKey': 'API key',\n 'ai.profiles.testOk': 'Connection works',\n 'ai.profiles.test': 'Test',\n 'ai.profiles.cancel': 'Cancel',\n 'ai.profiles.save': 'Save',\n}\n"],"mappings":"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"}
|
|
@@ -137,7 +137,14 @@ const en = {
|
|
|
137
137
|
"composites.settings.dragHandle.hover.label": "Only on hover",
|
|
138
138
|
"composites.settings.dragHandle.hover.description": "The drag handle appears on the block under the mouse.",
|
|
139
139
|
"composites.settings.dragHandle.always.label": "Always show",
|
|
140
|
-
"composites.settings.dragHandle.always.description": "Every block without an icon permanently shows its drag handle."
|
|
140
|
+
"composites.settings.dragHandle.always.description": "Every block without an icon permanently shows its drag handle.",
|
|
141
|
+
"composites.nesting.title": "Nesting not possible",
|
|
142
|
+
"composites.nesting.refused": "{parent} does not accept {child}.",
|
|
143
|
+
"composites.move.blockGone": "The block no longer exists.",
|
|
144
|
+
"composites.move.targetGone": "The target no longer exists.",
|
|
145
|
+
"composites.move.targetNotBlock": "The target is not a building block.",
|
|
146
|
+
"composites.move.intoSelf": "A block cannot be moved into itself.",
|
|
147
|
+
"composites.move.intoOwn": "A block cannot be moved into a building block it contains itself."
|
|
141
148
|
};
|
|
142
149
|
//#endregion
|
|
143
150
|
export { en };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"composites.js","names":[],"sources":["../../../src/i18n/en/composites.ts"],"sourcesContent":["import type { de } from '../de/composites'\n\nexport const en: { [K in keyof typeof de]: string } = {\n 'composites.untitled': '(untitled)',\n\n 'composites.kind.section.label': 'Section',\n 'composites.kind.section.title': 'Heading',\n 'composites.kind.section.description': 'Summary',\n 'composites.kind.task.label': 'Task',\n 'composites.kind.task.title': 'Task',\n 'composites.kind.task.description': 'Description',\n 'composites.kind.task.field.status': 'Status',\n 'composites.kind.task.status.open': 'Open',\n 'composites.kind.task.status.doing': 'In progress',\n 'composites.kind.task.status.done': 'Done',\n 'composites.kind.task.field.due': 'Due',\n 'composites.kind.task.field.assignee': 'Assignee',\n 'composites.kind.note.label': 'Note',\n 'composites.kind.note.title': 'Title',\n 'composites.kind.note.description': 'Short description',\n 'composites.kind.document.label': 'Document',\n 'composites.kind.document.title': 'Document name',\n 'composites.kind.document.description': 'Summary',\n 'composites.kind.document.field.filename': 'File name',\n 'composites.kind.document.field.mimeType': 'Type',\n 'composites.kind.document.field.size': 'Size (bytes)',\n 'composites.kind.document.field.importedAt': 'Imported',\n 'composites.kind.document.field.transcript': 'Transcript',\n 'composites.kind.folder.label': 'Folder',\n 'composites.kind.folder.title': 'Folder name',\n 'composites.kind.folder.description': 'Description',\n 'composites.kind.select': 'Kind of building block',\n\n 'composites.status.none': 'No status',\n 'composites.status.label': 'Status: {status}',\n\n 'composites.tab': 'Editing',\n 'composites.slash.section': 'Section',\n 'composites.slash.group': 'Headings to building blocks',\n 'composites.slash.groupAll': 'Headings to building blocks (nested)',\n 'composites.slash.flatten': 'Building blocks to headings',\n 'composites.slash.flattenAll': 'Building blocks to headings (all levels)',\n 'composites.blockAction.export': 'Export as Markdown',\n 'composites.toolbar.toKind': 'Convert to building block',\n 'composites.toolbar.structure': 'Convert structure',\n 'composites.menu.kindHeading': 'Building block',\n 'composites.menu.toComposites': 'Headings to building blocks',\n 'composites.menu.toComposites.top': 'Top level only',\n 'composites.menu.toComposites.top.description': 'Only the highest heading level becomes building blocks',\n 'composites.menu.toComposites.all': 'All levels (nested)',\n 'composites.menu.toComposites.all.description': 'Every heading level becomes a nested building block',\n 'composites.menu.toHeadings': 'Building blocks to headings',\n 'composites.menu.toHeadings.top': 'Top level only',\n 'composites.menu.toHeadings.top.description': 'The top building blocks become headings; inner building blocks stay',\n 'composites.menu.toHeadings.all': 'All levels',\n 'composites.menu.toHeadings.all.description': 'Every building block becomes a heading of its level; description, tags and fields as text',\n 'composites.menu.settings': 'Settings…',\n 'composites.menu.preferred': 'Preferred: {mode}',\n 'composites.convert.kind': '{kind} (building block)',\n\n 'composites.chrome.details': 'Kind and details: {kind}',\n 'composites.chrome.detailsDrag': 'Kind and details: {kind} · Drag to move',\n 'composites.tag.remove': 'Remove tag #{tag}',\n 'composites.tag.add': 'Add tag',\n\n 'composites.tags.label': 'Tags',\n 'composites.tags.placeholder': 'Add tags',\n 'composites.tags.create': 'Create #{tag}',\n\n 'composites.details.confirmLost': 'Really change the kind? Switching to “{kind}” discards this information:',\n 'composites.details.confirm': 'Really change the kind?',\n 'composites.details.cancel': 'Cancel',\n 'composites.details.change': 'Change',\n 'composites.details.summary': 'Summary',\n\n 'composites.summary.placeholder': 'Short summary of the building block',\n 'composites.summary.label': 'Summary',\n 'composites.summary.none': 'No summary',\n 'composites.summary.formatted': 'Contains formatting or mentions and can only be edited in the text.',\n 'composites.field.choose': 'Choose {field}',\n\n 'composites.inspector.label': 'Properties',\n 'composites.inspector.document': 'Document',\n 'composites.inspector.composites': 'Building blocks',\n 'composites.inspector.summarized': '{n} of {total} summarized',\n 'composites.inspector.none': 'None',\n 'composites.inspector.mentions': 'Mentions',\n 'composites.inspector.composite': 'Building block',\n 'composites.inspector.kind': 'Kind',\n 'composites.inspector.title': 'Title',\n 'composites.inspector.titleHelp': 'Edit in the document',\n 'composites.inspector.untitled': 'Untitled',\n 'composites.inspector.description': 'Description',\n 'composites.inspector.descriptionHelp': 'Contains mentions or tags – edit in the document',\n 'composites.inspector.aiStatus': 'AI status',\n 'composites.inspector.summaryPresent': 'Summary present',\n 'composites.inspector.summaryMissing': 'Summary missing',\n\n 'composites.table.label': 'Building blocks as table',\n 'composites.table.emptyTitle': 'This document has no building blocks yet',\n 'composites.table.emptyText': 'Building blocks divide a document into sections, tasks or notes with a title, summary and tags. Insert one in the text with “/” and it appears here with all its details.',\n 'composites.table.column.composite': 'Building block',\n 'composites.table.column.kind': 'Kind',\n 'composites.table.column.tags': 'Tags',\n 'composites.table.column.summary': 'Summary',\n 'composites.table.search.placeholder': 'Title, summary, tags',\n 'composites.table.search.label': 'Search building blocks',\n 'composites.table.search.clear': 'Clear search',\n 'composites.table.filter.all': 'All',\n 'composites.table.filter.reset': 'Reset filters',\n 'composites.table.filter.byKind': 'Filter by kind',\n 'composites.table.filter.byTag': 'Filter by tag',\n 'composites.table.filter.noMatch': 'No building block matches these filters.',\n 'composites.table.count.one': '{n} of {total} building block',\n 'composites.table.count.other': '{n} of {total} building blocks',\n 'composites.table.noValue': 'No value',\n 'composites.table.noTags': 'No tags',\n 'composites.table.summaryPresent': 'Summary present',\n\n 'composites.settings.structure.title': 'Structure',\n 'composites.settings.structure.legend': 'Preferred structure',\n 'composites.settings.structure.flat.label': 'Headings',\n 'composites.settings.structure.flat.description': 'Toolbar with Heading 1–3. AI texts are structured flat with headings (##, ###); building blocks the AI writes anyway become headings.',\n 'composites.settings.structure.composite.label': 'Building blocks',\n 'composites.settings.structure.composite.description': 'Toolbar without Heading 1–3. AI texts are structured as building blocks, subsections as nested building blocks; headings the AI writes anyway become building blocks.',\n 'composites.settings.scope.legend': '“Convert structure” without a selection applies to',\n 'composites.settings.scope.container.label': 'Enclosing building block',\n 'composites.settings.scope.container.description': 'The building block the cursor is in; the whole document outside of building blocks.',\n 'composites.settings.scope.document.label': 'Whole document',\n 'composites.settings.scope.document.description': 'Always all blocks of the document.',\n 'composites.settings.scope.heading.label': 'Heading or building block at the cursor',\n 'composites.settings.scope.heading.description': 'Converting to building blocks: the heading at or before the cursor with its content. Converting to headings: the innermost building block around the cursor.',\n 'composites.settings.sidebar.title': 'Sidebar',\n 'composites.settings.treeRoot.legend': 'Document tree',\n 'composites.settings.treeRoot.folders.label': 'Nest folders and files',\n 'composites.settings.treeRoot.folders.description': 'The sidebar shows the folders with their files; the open file is an entry within them.',\n 'composites.settings.treeRoot.file.label': 'Root is a single file',\n 'composites.settings.treeRoot.file.description': 'While a building block file is open, the sidebar shows it as the root with its folders and documents. Without an open building block file it shows the folders.',\n 'composites.settings.composites.title': 'Building blocks',\n 'composites.settings.defaultKind.label': 'Default building block',\n 'composites.settings.defaultKind.description': 'Kind of the building blocks the toolbar, “/” commands and “Headings to building blocks” create.',\n 'composites.settings.kindIcon.legend': 'Kind icon',\n 'composites.settings.kindIcon.always.label': 'Always show',\n 'composites.settings.kindIcon.always.description': 'The kind icon is permanently shown in front of the building block.',\n 'composites.settings.kindIcon.hover.label': 'Only on hover',\n 'composites.settings.kindIcon.hover.description': 'The icon appears when the mouse is over the building block, it has focus or its details are open.',\n 'composites.settings.dragHandle.legend': 'Drag handle (blocks without icon)',\n 'composites.settings.dragHandle.hover.label': 'Only on hover',\n 'composites.settings.dragHandle.hover.description': 'The drag handle appears on the block under the mouse.',\n 'composites.settings.dragHandle.always.label': 'Always show',\n 'composites.settings.dragHandle.always.description': 'Every block without an icon permanently shows its drag handle.',\n}\n"],"mappings":";AAEA,MAAa,KAAyC;CACpD,uBAAuB;CAEvB,iCAAiC;CACjC,iCAAiC;CACjC,uCAAuC;CACvC,8BAA8B;CAC9B,8BAA8B;CAC9B,oCAAoC;CACpC,qCAAqC;CACrC,oCAAoC;CACpC,qCAAqC;CACrC,oCAAoC;CACpC,kCAAkC;CAClC,uCAAuC;CACvC,8BAA8B;CAC9B,8BAA8B;CAC9B,oCAAoC;CACpC,kCAAkC;CAClC,kCAAkC;CAClC,wCAAwC;CACxC,2CAA2C;CAC3C,2CAA2C;CAC3C,uCAAuC;CACvC,6CAA6C;CAC7C,6CAA6C;CAC7C,gCAAgC;CAChC,gCAAgC;CAChC,sCAAsC;CACtC,0BAA0B;CAE1B,0BAA0B;CAC1B,2BAA2B;CAE3B,kBAAkB;CAClB,4BAA4B;CAC5B,0BAA0B;CAC1B,6BAA6B;CAC7B,4BAA4B;CAC5B,+BAA+B;CAC/B,iCAAiC;CACjC,6BAA6B;CAC7B,gCAAgC;CAChC,+BAA+B;CAC/B,gCAAgC;CAChC,oCAAoC;CACpC,gDAAgD;CAChD,oCAAoC;CACpC,gDAAgD;CAChD,8BAA8B;CAC9B,kCAAkC;CAClC,8CAA8C;CAC9C,kCAAkC;CAClC,8CAA8C;CAC9C,4BAA4B;CAC5B,6BAA6B;CAC7B,2BAA2B;CAE3B,6BAA6B;CAC7B,iCAAiC;CACjC,yBAAyB;CACzB,sBAAsB;CAEtB,yBAAyB;CACzB,+BAA+B;CAC/B,0BAA0B;CAE1B,kCAAkC;CAClC,8BAA8B;CAC9B,6BAA6B;CAC7B,6BAA6B;CAC7B,8BAA8B;CAE9B,kCAAkC;CAClC,4BAA4B;CAC5B,2BAA2B;CAC3B,gCAAgC;CAChC,2BAA2B;CAE3B,8BAA8B;CAC9B,iCAAiC;CACjC,mCAAmC;CACnC,mCAAmC;CACnC,6BAA6B;CAC7B,iCAAiC;CACjC,kCAAkC;CAClC,6BAA6B;CAC7B,8BAA8B;CAC9B,kCAAkC;CAClC,iCAAiC;CACjC,oCAAoC;CACpC,wCAAwC;CACxC,iCAAiC;CACjC,uCAAuC;CACvC,uCAAuC;CAEvC,0BAA0B;CAC1B,+BAA+B;CAC/B,8BAA8B;CAC9B,qCAAqC;CACrC,gCAAgC;CAChC,gCAAgC;CAChC,mCAAmC;CACnC,uCAAuC;CACvC,iCAAiC;CACjC,iCAAiC;CACjC,+BAA+B;CAC/B,iCAAiC;CACjC,kCAAkC;CAClC,iCAAiC;CACjC,mCAAmC;CACnC,8BAA8B;CAC9B,gCAAgC;CAChC,4BAA4B;CAC5B,2BAA2B;CAC3B,mCAAmC;CAEnC,uCAAuC;CACvC,wCAAwC;CACxC,4CAA4C;CAC5C,kDAAkD;CAClD,iDAAiD;CACjD,uDAAuD;CACvD,oCAAoC;CACpC,6CAA6C;CAC7C,mDAAmD;CACnD,4CAA4C;CAC5C,kDAAkD;CAClD,2CAA2C;CAC3C,iDAAiD;CACjD,qCAAqC;CACrC,uCAAuC;CACvC,8CAA8C;CAC9C,oDAAoD;CACpD,2CAA2C;CAC3C,iDAAiD;CACjD,wCAAwC;CACxC,yCAAyC;CACzC,+CAA+C;CAC/C,uCAAuC;CACvC,6CAA6C;CAC7C,mDAAmD;CACnD,4CAA4C;CAC5C,kDAAkD;CAClD,yCAAyC;CACzC,8CAA8C;CAC9C,oDAAoD;CACpD,+CAA+C;CAC/C,qDAAqD;AACvD"}
|
|
1
|
+
{"version":3,"file":"composites.js","names":[],"sources":["../../../src/i18n/en/composites.ts"],"sourcesContent":["import type { de } from '../de/composites'\n\nexport const en: { [K in keyof typeof de]: string } = {\n 'composites.untitled': '(untitled)',\n\n 'composites.kind.section.label': 'Section',\n 'composites.kind.section.title': 'Heading',\n 'composites.kind.section.description': 'Summary',\n 'composites.kind.task.label': 'Task',\n 'composites.kind.task.title': 'Task',\n 'composites.kind.task.description': 'Description',\n 'composites.kind.task.field.status': 'Status',\n 'composites.kind.task.status.open': 'Open',\n 'composites.kind.task.status.doing': 'In progress',\n 'composites.kind.task.status.done': 'Done',\n 'composites.kind.task.field.due': 'Due',\n 'composites.kind.task.field.assignee': 'Assignee',\n 'composites.kind.note.label': 'Note',\n 'composites.kind.note.title': 'Title',\n 'composites.kind.note.description': 'Short description',\n 'composites.kind.document.label': 'Document',\n 'composites.kind.document.title': 'Document name',\n 'composites.kind.document.description': 'Summary',\n 'composites.kind.document.field.filename': 'File name',\n 'composites.kind.document.field.mimeType': 'Type',\n 'composites.kind.document.field.size': 'Size (bytes)',\n 'composites.kind.document.field.importedAt': 'Imported',\n 'composites.kind.document.field.transcript': 'Transcript',\n 'composites.kind.folder.label': 'Folder',\n 'composites.kind.folder.title': 'Folder name',\n 'composites.kind.folder.description': 'Description',\n 'composites.kind.select': 'Kind of building block',\n\n 'composites.status.none': 'No status',\n 'composites.status.label': 'Status: {status}',\n\n 'composites.tab': 'Editing',\n 'composites.slash.section': 'Section',\n 'composites.slash.group': 'Headings to building blocks',\n 'composites.slash.groupAll': 'Headings to building blocks (nested)',\n 'composites.slash.flatten': 'Building blocks to headings',\n 'composites.slash.flattenAll': 'Building blocks to headings (all levels)',\n 'composites.blockAction.export': 'Export as Markdown',\n 'composites.toolbar.toKind': 'Convert to building block',\n 'composites.toolbar.structure': 'Convert structure',\n 'composites.menu.kindHeading': 'Building block',\n 'composites.menu.toComposites': 'Headings to building blocks',\n 'composites.menu.toComposites.top': 'Top level only',\n 'composites.menu.toComposites.top.description': 'Only the highest heading level becomes building blocks',\n 'composites.menu.toComposites.all': 'All levels (nested)',\n 'composites.menu.toComposites.all.description': 'Every heading level becomes a nested building block',\n 'composites.menu.toHeadings': 'Building blocks to headings',\n 'composites.menu.toHeadings.top': 'Top level only',\n 'composites.menu.toHeadings.top.description': 'The top building blocks become headings; inner building blocks stay',\n 'composites.menu.toHeadings.all': 'All levels',\n 'composites.menu.toHeadings.all.description': 'Every building block becomes a heading of its level; description, tags and fields as text',\n 'composites.menu.settings': 'Settings…',\n 'composites.menu.preferred': 'Preferred: {mode}',\n 'composites.convert.kind': '{kind} (building block)',\n\n 'composites.chrome.details': 'Kind and details: {kind}',\n 'composites.chrome.detailsDrag': 'Kind and details: {kind} · Drag to move',\n 'composites.tag.remove': 'Remove tag #{tag}',\n 'composites.tag.add': 'Add tag',\n\n 'composites.tags.label': 'Tags',\n 'composites.tags.placeholder': 'Add tags',\n 'composites.tags.create': 'Create #{tag}',\n\n 'composites.details.confirmLost': 'Really change the kind? Switching to “{kind}” discards this information:',\n 'composites.details.confirm': 'Really change the kind?',\n 'composites.details.cancel': 'Cancel',\n 'composites.details.change': 'Change',\n 'composites.details.summary': 'Summary',\n\n 'composites.summary.placeholder': 'Short summary of the building block',\n 'composites.summary.label': 'Summary',\n 'composites.summary.none': 'No summary',\n 'composites.summary.formatted': 'Contains formatting or mentions and can only be edited in the text.',\n 'composites.field.choose': 'Choose {field}',\n\n 'composites.inspector.label': 'Properties',\n 'composites.inspector.document': 'Document',\n 'composites.inspector.composites': 'Building blocks',\n 'composites.inspector.summarized': '{n} of {total} summarized',\n 'composites.inspector.none': 'None',\n 'composites.inspector.mentions': 'Mentions',\n 'composites.inspector.composite': 'Building block',\n 'composites.inspector.kind': 'Kind',\n 'composites.inspector.title': 'Title',\n 'composites.inspector.titleHelp': 'Edit in the document',\n 'composites.inspector.untitled': 'Untitled',\n 'composites.inspector.description': 'Description',\n 'composites.inspector.descriptionHelp': 'Contains mentions or tags – edit in the document',\n 'composites.inspector.aiStatus': 'AI status',\n 'composites.inspector.summaryPresent': 'Summary present',\n 'composites.inspector.summaryMissing': 'Summary missing',\n\n 'composites.table.label': 'Building blocks as table',\n 'composites.table.emptyTitle': 'This document has no building blocks yet',\n 'composites.table.emptyText': 'Building blocks divide a document into sections, tasks or notes with a title, summary and tags. Insert one in the text with “/” and it appears here with all its details.',\n 'composites.table.column.composite': 'Building block',\n 'composites.table.column.kind': 'Kind',\n 'composites.table.column.tags': 'Tags',\n 'composites.table.column.summary': 'Summary',\n 'composites.table.search.placeholder': 'Title, summary, tags',\n 'composites.table.search.label': 'Search building blocks',\n 'composites.table.search.clear': 'Clear search',\n 'composites.table.filter.all': 'All',\n 'composites.table.filter.reset': 'Reset filters',\n 'composites.table.filter.byKind': 'Filter by kind',\n 'composites.table.filter.byTag': 'Filter by tag',\n 'composites.table.filter.noMatch': 'No building block matches these filters.',\n 'composites.table.count.one': '{n} of {total} building block',\n 'composites.table.count.other': '{n} of {total} building blocks',\n 'composites.table.noValue': 'No value',\n 'composites.table.noTags': 'No tags',\n 'composites.table.summaryPresent': 'Summary present',\n\n 'composites.settings.structure.title': 'Structure',\n 'composites.settings.structure.legend': 'Preferred structure',\n 'composites.settings.structure.flat.label': 'Headings',\n 'composites.settings.structure.flat.description': 'Toolbar with Heading 1–3. AI texts are structured flat with headings (##, ###); building blocks the AI writes anyway become headings.',\n 'composites.settings.structure.composite.label': 'Building blocks',\n 'composites.settings.structure.composite.description': 'Toolbar without Heading 1–3. AI texts are structured as building blocks, subsections as nested building blocks; headings the AI writes anyway become building blocks.',\n 'composites.settings.scope.legend': '“Convert structure” without a selection applies to',\n 'composites.settings.scope.container.label': 'Enclosing building block',\n 'composites.settings.scope.container.description': 'The building block the cursor is in; the whole document outside of building blocks.',\n 'composites.settings.scope.document.label': 'Whole document',\n 'composites.settings.scope.document.description': 'Always all blocks of the document.',\n 'composites.settings.scope.heading.label': 'Heading or building block at the cursor',\n 'composites.settings.scope.heading.description': 'Converting to building blocks: the heading at or before the cursor with its content. Converting to headings: the innermost building block around the cursor.',\n 'composites.settings.sidebar.title': 'Sidebar',\n 'composites.settings.treeRoot.legend': 'Document tree',\n 'composites.settings.treeRoot.folders.label': 'Nest folders and files',\n 'composites.settings.treeRoot.folders.description': 'The sidebar shows the folders with their files; the open file is an entry within them.',\n 'composites.settings.treeRoot.file.label': 'Root is a single file',\n 'composites.settings.treeRoot.file.description': 'While a building block file is open, the sidebar shows it as the root with its folders and documents. Without an open building block file it shows the folders.',\n 'composites.settings.composites.title': 'Building blocks',\n 'composites.settings.defaultKind.label': 'Default building block',\n 'composites.settings.defaultKind.description': 'Kind of the building blocks the toolbar, “/” commands and “Headings to building blocks” create.',\n 'composites.settings.kindIcon.legend': 'Kind icon',\n 'composites.settings.kindIcon.always.label': 'Always show',\n 'composites.settings.kindIcon.always.description': 'The kind icon is permanently shown in front of the building block.',\n 'composites.settings.kindIcon.hover.label': 'Only on hover',\n 'composites.settings.kindIcon.hover.description': 'The icon appears when the mouse is over the building block, it has focus or its details are open.',\n 'composites.settings.dragHandle.legend': 'Drag handle (blocks without icon)',\n 'composites.settings.dragHandle.hover.label': 'Only on hover',\n 'composites.settings.dragHandle.hover.description': 'The drag handle appears on the block under the mouse.',\n 'composites.settings.dragHandle.always.label': 'Always show',\n 'composites.settings.dragHandle.always.description': 'Every block without an icon permanently shows its drag handle.',\n\n 'composites.nesting.title': 'Nesting not possible',\n 'composites.nesting.refused': '{parent} does not accept {child}.',\n 'composites.move.blockGone': 'The block no longer exists.',\n 'composites.move.targetGone': 'The target no longer exists.',\n 'composites.move.targetNotBlock': 'The target is not a building block.',\n 'composites.move.intoSelf': 'A block cannot be moved into itself.',\n 'composites.move.intoOwn': 'A block cannot be moved into a building block it contains itself.',\n}\n"],"mappings":";AAEA,MAAa,KAAyC;CACpD,uBAAuB;CAEvB,iCAAiC;CACjC,iCAAiC;CACjC,uCAAuC;CACvC,8BAA8B;CAC9B,8BAA8B;CAC9B,oCAAoC;CACpC,qCAAqC;CACrC,oCAAoC;CACpC,qCAAqC;CACrC,oCAAoC;CACpC,kCAAkC;CAClC,uCAAuC;CACvC,8BAA8B;CAC9B,8BAA8B;CAC9B,oCAAoC;CACpC,kCAAkC;CAClC,kCAAkC;CAClC,wCAAwC;CACxC,2CAA2C;CAC3C,2CAA2C;CAC3C,uCAAuC;CACvC,6CAA6C;CAC7C,6CAA6C;CAC7C,gCAAgC;CAChC,gCAAgC;CAChC,sCAAsC;CACtC,0BAA0B;CAE1B,0BAA0B;CAC1B,2BAA2B;CAE3B,kBAAkB;CAClB,4BAA4B;CAC5B,0BAA0B;CAC1B,6BAA6B;CAC7B,4BAA4B;CAC5B,+BAA+B;CAC/B,iCAAiC;CACjC,6BAA6B;CAC7B,gCAAgC;CAChC,+BAA+B;CAC/B,gCAAgC;CAChC,oCAAoC;CACpC,gDAAgD;CAChD,oCAAoC;CACpC,gDAAgD;CAChD,8BAA8B;CAC9B,kCAAkC;CAClC,8CAA8C;CAC9C,kCAAkC;CAClC,8CAA8C;CAC9C,4BAA4B;CAC5B,6BAA6B;CAC7B,2BAA2B;CAE3B,6BAA6B;CAC7B,iCAAiC;CACjC,yBAAyB;CACzB,sBAAsB;CAEtB,yBAAyB;CACzB,+BAA+B;CAC/B,0BAA0B;CAE1B,kCAAkC;CAClC,8BAA8B;CAC9B,6BAA6B;CAC7B,6BAA6B;CAC7B,8BAA8B;CAE9B,kCAAkC;CAClC,4BAA4B;CAC5B,2BAA2B;CAC3B,gCAAgC;CAChC,2BAA2B;CAE3B,8BAA8B;CAC9B,iCAAiC;CACjC,mCAAmC;CACnC,mCAAmC;CACnC,6BAA6B;CAC7B,iCAAiC;CACjC,kCAAkC;CAClC,6BAA6B;CAC7B,8BAA8B;CAC9B,kCAAkC;CAClC,iCAAiC;CACjC,oCAAoC;CACpC,wCAAwC;CACxC,iCAAiC;CACjC,uCAAuC;CACvC,uCAAuC;CAEvC,0BAA0B;CAC1B,+BAA+B;CAC/B,8BAA8B;CAC9B,qCAAqC;CACrC,gCAAgC;CAChC,gCAAgC;CAChC,mCAAmC;CACnC,uCAAuC;CACvC,iCAAiC;CACjC,iCAAiC;CACjC,+BAA+B;CAC/B,iCAAiC;CACjC,kCAAkC;CAClC,iCAAiC;CACjC,mCAAmC;CACnC,8BAA8B;CAC9B,gCAAgC;CAChC,4BAA4B;CAC5B,2BAA2B;CAC3B,mCAAmC;CAEnC,uCAAuC;CACvC,wCAAwC;CACxC,4CAA4C;CAC5C,kDAAkD;CAClD,iDAAiD;CACjD,uDAAuD;CACvD,oCAAoC;CACpC,6CAA6C;CAC7C,mDAAmD;CACnD,4CAA4C;CAC5C,kDAAkD;CAClD,2CAA2C;CAC3C,iDAAiD;CACjD,qCAAqC;CACrC,uCAAuC;CACvC,8CAA8C;CAC9C,oDAAoD;CACpD,2CAA2C;CAC3C,iDAAiD;CACjD,wCAAwC;CACxC,yCAAyC;CACzC,+CAA+C;CAC/C,uCAAuC;CACvC,6CAA6C;CAC7C,mDAAmD;CACnD,4CAA4C;CAC5C,kDAAkD;CAClD,yCAAyC;CACzC,8CAA8C;CAC9C,oDAAoD;CACpD,+CAA+C;CAC/C,qDAAqD;CAErD,4BAA4B;CAC5B,8BAA8B;CAC9B,6BAA6B;CAC7B,8BAA8B;CAC9B,kCAAkC;CAClC,4BAA4B;CAC5B,2BAA2B;AAC7B"}
|
package/dist/i18n/en/tree.js
CHANGED
|
@@ -23,7 +23,20 @@ const en = {
|
|
|
23
23
|
"tree.folder.placeholderIn": "New folder in {parent}",
|
|
24
24
|
"tree.folder.renameFailed": "Folder not renamed",
|
|
25
25
|
"tree.removed": "Document deleted",
|
|
26
|
-
"tree.undo": "Undo"
|
|
26
|
+
"tree.undo": "Undo",
|
|
27
|
+
"tree.filterText.placeholder": "Filter by title",
|
|
28
|
+
"tree.filterText.clear": "Clear title filter",
|
|
29
|
+
"tree.noMatches": "No matches",
|
|
30
|
+
"tree.drop.nothing": "Nothing is being dragged.",
|
|
31
|
+
"tree.drop.noDocumentMove": "Documents and folders cannot be moved inside the open document.",
|
|
32
|
+
"tree.drop.foldersOnly": "Only folders accept entries.",
|
|
33
|
+
"tree.drop.documentInFolder": "The document is already in this folder.",
|
|
34
|
+
"tree.drop.folderIntoSelf": "A folder cannot be moved into itself or one of its subfolders.",
|
|
35
|
+
"tree.drop.folderInFolder": "The folder is already in this folder.",
|
|
36
|
+
"tree.drop.blocksOnlyInDocument": "Building blocks can only be moved within the open document.",
|
|
37
|
+
"tree.drop.noBlocksHere": "Building blocks cannot be dropped here.",
|
|
38
|
+
"tree.drop.blockWithoutId": "This building block has no ID yet and cannot be addressed as a target.",
|
|
39
|
+
"tree.drop.editorClosed": "The editor is no longer open."
|
|
27
40
|
};
|
|
28
41
|
//#endregion
|
|
29
42
|
export { en };
|
package/dist/i18n/en/tree.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tree.js","names":[],"sources":["../../../src/i18n/en/tree.ts"],"sourcesContent":["import type { de } from '../de/tree'\n\nexport const en: { [K in keyof typeof de]: string } = {\n 'tree.aria': 'Documents',\n 'tree.loading': 'Loading…',\n 'tree.loadFailed': 'Documents could not be loaded',\n 'tree.empty': 'No documents yet',\n 'tree.rootFallback': 'Document',\n 'tree.untitled': '(untitled)',\n 'tree.summary': 'Has a summary',\n 'tree.filter.show': 'Show',\n 'tree.filter.title': 'Filter view',\n 'tree.filter.reset': 'Reset filter',\n 'tree.add': 'Add',\n 'tree.delete': 'Delete',\n 'tree.menu.newDocument': 'New document',\n 'tree.menu.newFolder': 'New folder',\n 'tree.menu.newSubfolder': 'New subfolder',\n 'tree.menu.newCompositeFolder': 'New folder block',\n 'tree.menu.importFile': 'Import file…',\n 'tree.menu.rename': 'Rename',\n 'tree.folder.name': 'Folder name',\n 'tree.folder.placeholder': 'New folder',\n 'tree.folder.placeholderIn': 'New folder in {parent}',\n 'tree.folder.renameFailed': 'Folder not renamed',\n 'tree.removed': 'Document deleted',\n 'tree.undo': 'Undo',\n}\n"],"mappings":";AAEA,MAAa,KAAyC;CACpD,aAAa;CACb,gBAAgB;CAChB,mBAAmB;CACnB,cAAc;CACd,qBAAqB;CACrB,iBAAiB;CACjB,gBAAgB;CAChB,oBAAoB;CACpB,qBAAqB;CACrB,qBAAqB;CACrB,YAAY;CACZ,eAAe;CACf,yBAAyB;CACzB,uBAAuB;CACvB,0BAA0B;CAC1B,gCAAgC;CAChC,wBAAwB;CACxB,oBAAoB;CACpB,oBAAoB;CACpB,2BAA2B;CAC3B,6BAA6B;CAC7B,4BAA4B;CAC5B,gBAAgB;CAChB,aAAa;
|
|
1
|
+
{"version":3,"file":"tree.js","names":[],"sources":["../../../src/i18n/en/tree.ts"],"sourcesContent":["import type { de } from '../de/tree'\n\nexport const en: { [K in keyof typeof de]: string } = {\n 'tree.aria': 'Documents',\n 'tree.loading': 'Loading…',\n 'tree.loadFailed': 'Documents could not be loaded',\n 'tree.empty': 'No documents yet',\n 'tree.rootFallback': 'Document',\n 'tree.untitled': '(untitled)',\n 'tree.summary': 'Has a summary',\n 'tree.filter.show': 'Show',\n 'tree.filter.title': 'Filter view',\n 'tree.filter.reset': 'Reset filter',\n 'tree.add': 'Add',\n 'tree.delete': 'Delete',\n 'tree.menu.newDocument': 'New document',\n 'tree.menu.newFolder': 'New folder',\n 'tree.menu.newSubfolder': 'New subfolder',\n 'tree.menu.newCompositeFolder': 'New folder block',\n 'tree.menu.importFile': 'Import file…',\n 'tree.menu.rename': 'Rename',\n 'tree.folder.name': 'Folder name',\n 'tree.folder.placeholder': 'New folder',\n 'tree.folder.placeholderIn': 'New folder in {parent}',\n 'tree.folder.renameFailed': 'Folder not renamed',\n 'tree.removed': 'Document deleted',\n 'tree.undo': 'Undo',\n 'tree.filterText.placeholder': 'Filter by title',\n 'tree.filterText.clear': 'Clear title filter',\n 'tree.noMatches': 'No matches',\n\n 'tree.drop.nothing': 'Nothing is being dragged.',\n 'tree.drop.noDocumentMove': 'Documents and folders cannot be moved inside the open document.',\n 'tree.drop.foldersOnly': 'Only folders accept entries.',\n 'tree.drop.documentInFolder': 'The document is already in this folder.',\n 'tree.drop.folderIntoSelf': 'A folder cannot be moved into itself or one of its subfolders.',\n 'tree.drop.folderInFolder': 'The folder is already in this folder.',\n 'tree.drop.blocksOnlyInDocument': 'Building blocks can only be moved within the open document.',\n 'tree.drop.noBlocksHere': 'Building blocks cannot be dropped here.',\n 'tree.drop.blockWithoutId': 'This building block has no ID yet and cannot be addressed as a target.',\n 'tree.drop.editorClosed': 'The editor is no longer open.',\n}\n"],"mappings":";AAEA,MAAa,KAAyC;CACpD,aAAa;CACb,gBAAgB;CAChB,mBAAmB;CACnB,cAAc;CACd,qBAAqB;CACrB,iBAAiB;CACjB,gBAAgB;CAChB,oBAAoB;CACpB,qBAAqB;CACrB,qBAAqB;CACrB,YAAY;CACZ,eAAe;CACf,yBAAyB;CACzB,uBAAuB;CACvB,0BAA0B;CAC1B,gCAAgC;CAChC,wBAAwB;CACxB,oBAAoB;CACpB,oBAAoB;CACpB,2BAA2B;CAC3B,6BAA6B;CAC7B,4BAA4B;CAC5B,gBAAgB;CAChB,aAAa;CACb,+BAA+B;CAC/B,yBAAyB;CACzB,kBAAkB;CAElB,qBAAqB;CACrB,4BAA4B;CAC5B,yBAAyB;CACzB,8BAA8B;CAC9B,4BAA4B;CAC5B,4BAA4B;CAC5B,kCAAkC;CAClC,0BAA0B;CAC1B,4BAA4B;CAC5B,0BAA0B;AAC5B"}
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import { aiBlockDataOf, aiContextOf } from "../../core/pipeline.js";
|
|
2
2
|
import { captureRange, releaseRanges, resolveRange } from "../../core/doc-anchors.js";
|
|
3
|
+
import "../../features/composites/nodes.js";
|
|
4
|
+
import { compositeAiBrief } from "../../features/composites/ai-brief.js";
|
|
3
5
|
import { AI_LIMITS } from "../../features/ai/protocol/tasks.js";
|
|
4
6
|
import { aiApplyFailure, documentMarkdown } from "../../features/ai/ai-apply.js";
|
|
5
7
|
import { startAiReview } from "../../features/ai/ai-review.js";
|
|
6
8
|
import { notifyAiRateLimited } from "../../features/ai/rate-limit.js";
|
|
7
9
|
import { postAiSse } from "../../features/ai/ai-sse.js";
|
|
8
|
-
import "../../features/composites/nodes.js";
|
|
9
|
-
import { compositeAiBrief } from "../../features/composites/ai-brief.js";
|
|
10
10
|
//#region src/integrations/composite-ai/composite-fill.ts
|
|
11
11
|
/** Entries of `aiBlockData` that travel with a request (the server accepts at most as many). */
|
|
12
12
|
const MAX_BLOCK_DATA = 10;
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { parseBlocks } from "../../core/pipeline.js";
|
|
2
2
|
import { captureRange, releaseRanges, resolveRange } from "../../core/doc-anchors.js";
|
|
3
|
+
import "../../features/composites/nodes.js";
|
|
4
|
+
import { assetRefOf } from "../../features/media/assets.js";
|
|
3
5
|
import { AI_LIMITS } from "../../features/ai/protocol/tasks.js";
|
|
4
6
|
import { notifyAiRateLimited } from "../../features/ai/rate-limit.js";
|
|
5
7
|
import { postAiSse } from "../../features/ai/ai-sse.js";
|
|
6
|
-
import "../../features/composites/nodes.js";
|
|
7
|
-
import { assetRefOf } from "../../features/media/assets.js";
|
|
8
8
|
import { Fragment } from "@tiptap/pm/model";
|
|
9
9
|
//#region src/integrations/composite-ai/composite-summary.ts
|
|
10
10
|
/** Index of a composite's first body block, after `compositeTitle`, `compositeDescription` and `compositeTags`. */
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { ABILITY } from "../../core/schema/abilities.js";
|
|
2
|
-
import { withHeading } from "../../features/ai/protocol/tasks.js";
|
|
3
|
-
import { modelProfiles } from "../../features/ai/model-profiles.js";
|
|
4
2
|
import { compositeKind } from "../../features/composites/kinds.js";
|
|
5
3
|
import { compositeFence } from "../../features/composites/fences.js";
|
|
6
4
|
import { compositeKindsOf } from "../../features/composites/nodes.js";
|
|
5
|
+
import { withHeading } from "../../features/ai/protocol/tasks.js";
|
|
6
|
+
import { modelProfiles } from "../../features/ai/model-profiles.js";
|
|
7
7
|
import { structureOf } from "../../features/composites/structure.js";
|
|
8
8
|
import { fillComposite } from "./composite-fill.js";
|
|
9
9
|
import { COMPOSITE_BODY_START, compositeSourceText, mediaAssetOf, summarizeComposite } from "./composite-summary.js";
|
|
@@ -2,9 +2,9 @@ import { blockIdOf, findBlockById } from "../../core/schema/block-ids.js";
|
|
|
2
2
|
import { createStore } from "../../core/store.js";
|
|
3
3
|
import { captureRange, releaseRanges } from "../../core/doc-anchors.js";
|
|
4
4
|
import { fetchErrorMessage } from "../../core/fetch-error.js";
|
|
5
|
+
import { TRANSCRIPT_CLEANUP_LIMITS } from "./protocol.js";
|
|
5
6
|
import { startAiReview } from "../../features/ai/ai-review.js";
|
|
6
7
|
import { isRateLimited, notifyAiRateLimited } from "../../features/ai/rate-limit.js";
|
|
7
|
-
import { TRANSCRIPT_CLEANUP_LIMITS } from "./protocol.js";
|
|
8
8
|
//#region src/integrations/transcript-ai/transcript-cleanup.ts
|
|
9
9
|
const SEGMENT = "transcriptSegment";
|
|
10
10
|
/** Calls `visit` for every speaker segment overlapping `scope`; `visit` returns true to stop. */
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { EditorSurfaceHandle, EditorSurfaceProps } from "../react/EditorSurface.js";
|
|
2
1
|
import { MarkdownDiagnostic, MarkdownPolicy } from "./policy.js";
|
|
2
|
+
import { EditorSurfaceHandle, EditorSurfaceProps } from "../react/EditorSurface.js";
|
|
3
3
|
import { Editor } from "@tiptap/core";
|
|
4
4
|
//#region src/markdown/MarkdownSurface.d.ts
|
|
5
5
|
export interface MarkdownSurfaceProps extends Omit<EditorSurfaceProps, 'value' | 'onChange' | 'onReady'> {
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { useEditorI18n } from "../react/use-editor-i18n.js";
|
|
2
|
-
import { EditorSurface } from "../react/EditorSurface.js";
|
|
3
1
|
import { contentToMarkdown, markdownToContent } from "./document.js";
|
|
4
2
|
import { MarkdownClipboard } from "./clipboard.js";
|
|
5
3
|
import { joinFrontmatter, splitFrontmatter } from "./frontmatter.js";
|
|
4
|
+
import { useEditorI18n } from "../react/use-editor-i18n.js";
|
|
5
|
+
import { EditorSurface } from "../react/EditorSurface.js";
|
|
6
6
|
import { forwardRef, useEffect, useMemo, useRef, useState } from "react";
|
|
7
7
|
import { jsx } from "react/jsx-runtime";
|
|
8
8
|
//#region src/markdown/MarkdownSurface.tsx
|
|
@@ -40,28 +40,28 @@ declare const __VLS_base: import("vue").DefineComponent<__VLS_PublicProps, {
|
|
|
40
40
|
settingsOpen: import("vue").WritableComputedRef<boolean, boolean>;
|
|
41
41
|
settingsTab: import("vue").WritableComputedRef<string | undefined, string | undefined>;
|
|
42
42
|
}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
|
|
43
|
+
"update:modelValue": (markdown: string) => any;
|
|
44
|
+
ready: (editor: Editor) => any;
|
|
45
|
+
settingsOpen: (tab?: string | undefined) => any;
|
|
43
46
|
"update:sidebarOpen": (value: boolean) => any;
|
|
44
47
|
"update:commentsOpen": (value: boolean) => any;
|
|
45
|
-
|
|
46
|
-
"update:modelValue": (markdown: string) => any;
|
|
48
|
+
frontmatter: (frontmatter: string | null) => any;
|
|
47
49
|
metadataCreate: (list: string, item: MetadataItem) => any;
|
|
48
50
|
contentError: (error: Error) => any;
|
|
49
|
-
settingsOpen: (tab?: string | undefined) => any;
|
|
50
|
-
frontmatter: (frontmatter: string | null) => any;
|
|
51
51
|
diagnostics: (diagnostics: MarkdownDiagnostic[]) => any;
|
|
52
52
|
}, string, import("vue").PublicProps, Readonly<__VLS_PublicProps> & Readonly<{
|
|
53
|
+
"onUpdate:modelValue"?: ((markdown: string) => any) | undefined;
|
|
54
|
+
onReady?: ((editor: Editor) => any) | undefined;
|
|
55
|
+
onSettingsOpen?: ((tab?: string | undefined) => any) | undefined;
|
|
53
56
|
"onUpdate:sidebarOpen"?: ((value: boolean) => any) | undefined;
|
|
54
57
|
"onUpdate:commentsOpen"?: ((value: boolean) => any) | undefined;
|
|
55
|
-
|
|
56
|
-
"onUpdate:modelValue"?: ((markdown: string) => any) | undefined;
|
|
58
|
+
onFrontmatter?: ((frontmatter: string | null) => any) | undefined;
|
|
57
59
|
onMetadataCreate?: ((list: string, item: MetadataItem) => any) | undefined;
|
|
58
60
|
onContentError?: ((error: Error) => any) | undefined;
|
|
59
|
-
onSettingsOpen?: ((tab?: string | undefined) => any) | undefined;
|
|
60
|
-
onFrontmatter?: ((frontmatter: string | null) => any) | undefined;
|
|
61
61
|
onDiagnostics?: ((diagnostics: MarkdownDiagnostic[]) => any) | undefined;
|
|
62
62
|
}>, {
|
|
63
|
-
modelValue: string;
|
|
64
63
|
editable: boolean;
|
|
64
|
+
modelValue: string;
|
|
65
65
|
settingsUi: "internal" | "external";
|
|
66
66
|
}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
|
|
67
67
|
declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
|
package/dist/markdown/index.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { MarkdownDiagnostic, MarkdownDiagnosticCode, MarkdownPolicy, hasFatalDiagnostics } from "./policy.js";
|
|
2
|
-
import { MarkdownContent, contentToMarkdown, markdownToContent } from "./document.js";
|
|
3
|
-
import { SourceMode, SourceModeOptions, SourceModeState, createSourceMode } from "./source-mode.js";
|
|
4
2
|
import { MarkdownClipboard, MarkdownClipboardOptions } from "./clipboard.js";
|
|
3
|
+
import { MarkdownContent, contentToMarkdown, markdownToContent } from "./document.js";
|
|
5
4
|
import { SplitMarkdown, joinFrontmatter, splitFrontmatter } from "./frontmatter.js";
|
|
5
|
+
import { SourceMode, SourceModeOptions, SourceModeState, createSourceMode } from "./source-mode.js";
|
|
6
6
|
export { MarkdownClipboard, type MarkdownClipboardOptions, type MarkdownContent, type MarkdownDiagnostic, type MarkdownDiagnosticCode, type MarkdownPolicy, type SourceMode, type SourceModeOptions, type SourceModeState, type SplitMarkdown, contentToMarkdown, createSourceMode, hasFatalDiagnostics, joinFrontmatter, markdownToContent, splitFrontmatter };
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { useCollabServer, useEditorAdapter } from "../../../../../server/host.js";
|
|
2
|
-
import { useRuntimeConfig } from "nitropack/runtime";
|
|
3
2
|
import { defineWebSocketHandler } from "h3";
|
|
3
|
+
import { useRuntimeConfig } from "nitropack/runtime";
|
|
4
4
|
//#region src/nuxt/runtime/server/routes/collab/[id].ts
|
|
5
5
|
var _id__default = defineWebSocketHandler({
|
|
6
6
|
async upgrade(request) {
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { AbilitiesOptions, BlockAction, SlashCommandItem } from "../core/extension-points.js";
|
|
2
2
|
import { EditorMetadata, MetadataItem } from "../core/metadata-types.js";
|
|
3
3
|
import { CollaborationSession, EditorFeature, EditorPreset, UploadFn } from "../core/feature.js";
|
|
4
|
-
import { ComponentType } from "react";
|
|
5
4
|
import { AnyExtension, Editor, JSONContent } from "@tiptap/core";
|
|
5
|
+
import { ComponentType } from "react";
|
|
6
6
|
//#region src/react/EditorSurface.d.ts
|
|
7
7
|
export type ReactFeature = EditorFeature<ComponentType<{
|
|
8
8
|
editor: Editor;
|
|
@@ -1,18 +1,12 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { createMetadataRegistry } from "../core/metadata.js";
|
|
3
|
-
import { SuggestionPopup } from "../core/suggestion-popup.js";
|
|
4
|
-
import { contributions, settingsTabsOf } from "../core/define-editor.js";
|
|
5
|
-
import { registerEditor } from "../core/editor-ui.js";
|
|
6
|
-
import { blockActionsOf, createFeatureContext } from "../core/feature-context.js";
|
|
1
|
+
import { settingsTabsOf } from "../core/define-editor.js";
|
|
7
2
|
import { useEditorContext } from "./context.js";
|
|
8
|
-
import {
|
|
3
|
+
import { createSurfaceSession } from "../core/surface-session.js";
|
|
9
4
|
import { EditorSettingsModal } from "./EditorSettingsModal.js";
|
|
10
5
|
import { EditorUiContext } from "./editor-ui.js";
|
|
11
6
|
import { reactNotifier } from "./notify.js";
|
|
12
7
|
import { reactSuggestionRenderer } from "./suggestion-renderer.js";
|
|
13
8
|
import { forwardRef, useCallback, useEffect, useImperativeHandle, useRef, useState } from "react";
|
|
14
9
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
15
|
-
import { getSchema } from "@tiptap/core";
|
|
16
10
|
import { EditorContent, useEditor } from "@tiptap/react";
|
|
17
11
|
//#region src/react/EditorSurface.tsx
|
|
18
12
|
/** A boolean that is the host's (`value` given) or the component's own (`value` undefined); the setter is stable. */
|
|
@@ -42,10 +36,12 @@ function useOpenState(value, onChange) {
|
|
|
42
36
|
latest
|
|
43
37
|
};
|
|
44
38
|
}
|
|
45
|
-
/**
|
|
39
|
+
/**
|
|
40
|
+
* Everything fixed at mount: the chrome handle and the framework-free session (preset, context, extensions, content
|
|
41
|
+
* check, setup lifecycle); callbacks are read from the surface's latest props.
|
|
42
|
+
*/
|
|
46
43
|
function createSurface(props, app, parts) {
|
|
47
|
-
const { preset, collaboration } = props.current;
|
|
48
|
-
if (collaboration && !preset.features.some((feature) => feature.id === "collab")) throw new Error("@ecsplico/editor: `collaboration` needs a preset with the collaboration feature");
|
|
44
|
+
const { preset, collaboration, value, editable, metadata, documentId, upload, abilities, slashCommands, extensions, blockActions } = props.current;
|
|
49
45
|
const ui = {
|
|
50
46
|
openSettings: parts.openSettings,
|
|
51
47
|
toggleSidebar: () => parts.sidebar.set(!parts.sidebar.latest.current.open),
|
|
@@ -54,76 +50,31 @@ function createSurface(props, app, parts) {
|
|
|
54
50
|
return parts.comments.latest.current.open;
|
|
55
51
|
}
|
|
56
52
|
};
|
|
57
|
-
const registry = createMetadataRegistry({ onCreate: (list, item) => props.current.onMetadataCreate?.(list, item) });
|
|
58
|
-
registry.replace({ ...props.current.metadata });
|
|
59
|
-
const ctx = createFeatureContext({
|
|
60
|
-
app,
|
|
61
|
-
preset,
|
|
62
|
-
ui,
|
|
63
|
-
metadata: registry,
|
|
64
|
-
notify: reactNotifier,
|
|
65
|
-
getEditor: () => parts.editor.current ?? void 0,
|
|
66
|
-
...props.current.documentId !== void 0 && { documentId: props.current.documentId },
|
|
67
|
-
...props.current.upload && { upload: props.current.upload },
|
|
68
|
-
...collaboration && { collaboration },
|
|
69
|
-
...props.current.abilities && { abilities: props.current.abilities },
|
|
70
|
-
...props.current.slashCommands && { slashCommands: props.current.slashCommands }
|
|
71
|
-
});
|
|
72
|
-
const extensions = [
|
|
73
|
-
presetExtension(preset),
|
|
74
|
-
SuggestionPopup.configure({ renderer: reactSuggestionRenderer }),
|
|
75
|
-
...contributions(preset, "extensions").flatMap((factory) => factory(ctx)),
|
|
76
|
-
...props.current.extensions ?? []
|
|
77
|
-
];
|
|
78
|
-
const schema = getSchema(extensions);
|
|
79
|
-
const overlays = preset.features.flatMap((feature) => [...feature.overlays ?? []]);
|
|
80
|
-
const blockActions = blockActionsOf(preset, ctx, props.current.blockActions);
|
|
81
|
-
/** `json` migrated by the preset and checked against the installed schema: unknown nodes/marks or a broken structure are errors. */
|
|
82
|
-
const validated = (json) => {
|
|
83
|
-
try {
|
|
84
|
-
const migrated = preset.pipeline.migrateContent(json);
|
|
85
|
-
schema.nodeFromJSON(migrated).check();
|
|
86
|
-
return { json: migrated };
|
|
87
|
-
} catch (error) {
|
|
88
|
-
return { error: error instanceof Error ? error : new Error(String(error)) };
|
|
89
|
-
}
|
|
90
|
-
};
|
|
91
|
-
let lastEmitted;
|
|
92
|
-
let content;
|
|
93
|
-
let initialError;
|
|
94
|
-
if (!collaboration) {
|
|
95
|
-
const initial = props.current.value ? validated(props.current.value) : { json: EMPTY_EDITOR_CONTENT };
|
|
96
|
-
if ("error" in initial) initialError = initial.error;
|
|
97
|
-
content = "json" in initial ? initial.json : EMPTY_EDITOR_CONTENT;
|
|
98
|
-
}
|
|
99
53
|
return {
|
|
100
54
|
preset,
|
|
101
|
-
collaboration,
|
|
102
55
|
ui,
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
errorReported: false,
|
|
126
|
-
announced: null
|
|
56
|
+
session: createSurfaceSession({
|
|
57
|
+
app,
|
|
58
|
+
preset,
|
|
59
|
+
ui,
|
|
60
|
+
notify: reactNotifier,
|
|
61
|
+
suggestionRenderer: reactSuggestionRenderer,
|
|
62
|
+
getEditor: () => parts.editor.current ?? void 0,
|
|
63
|
+
collaboration,
|
|
64
|
+
value,
|
|
65
|
+
editable,
|
|
66
|
+
metadata,
|
|
67
|
+
documentId,
|
|
68
|
+
upload,
|
|
69
|
+
abilities,
|
|
70
|
+
slashCommands,
|
|
71
|
+
extensions,
|
|
72
|
+
blockActions,
|
|
73
|
+
onChange: (content) => props.current.onChange?.(content),
|
|
74
|
+
onMetadataCreate: (list, item) => props.current.onMetadataCreate?.(list, item),
|
|
75
|
+
onContentError: (error) => props.current.onContentError?.(error),
|
|
76
|
+
onReady: (editor) => props.current.onReady?.(editor)
|
|
77
|
+
})
|
|
127
78
|
};
|
|
128
79
|
}
|
|
129
80
|
const EditorSurface = forwardRef(function EditorSurface(props, ref) {
|
|
@@ -149,91 +100,34 @@ const EditorSurface = forwardRef(function EditorSurface(props, ref) {
|
|
|
149
100
|
tab: tab ?? state.tab
|
|
150
101
|
}));
|
|
151
102
|
}, []);
|
|
152
|
-
const [
|
|
103
|
+
const [{ preset, ui, session }] = useState(() => createSurface(latest, app, {
|
|
153
104
|
editor: editorRef,
|
|
154
105
|
sidebar,
|
|
155
106
|
comments,
|
|
156
107
|
openSettings
|
|
157
108
|
}));
|
|
158
|
-
const { preset, collaboration } = surface;
|
|
159
109
|
const editor = useEditor({
|
|
160
|
-
|
|
161
|
-
...!collaboration && {
|
|
162
|
-
content: surface.content,
|
|
163
|
-
onUpdate: ({ editor: instance }) => {
|
|
164
|
-
const json = instance.getJSON();
|
|
165
|
-
surface.lastEmitted = json;
|
|
166
|
-
latest.current.onChange?.(json);
|
|
167
|
-
}
|
|
168
|
-
},
|
|
169
|
-
editable,
|
|
110
|
+
...session.editorOptions,
|
|
170
111
|
immediatelyRender: true,
|
|
171
|
-
shouldRerenderOnTransaction: false
|
|
172
|
-
editorProps: { attributes: { class: "tiptap" } }
|
|
112
|
+
shouldRerenderOnTransaction: false
|
|
173
113
|
});
|
|
174
114
|
editorRef.current = editor;
|
|
175
115
|
useEffect(() => {
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
for (const teardown of surface.teardowns.splice(0)) teardown();
|
|
182
|
-
};
|
|
183
|
-
}, [surface, preset]);
|
|
184
|
-
useEffect(() => {
|
|
185
|
-
if (surface.initialError && !surface.errorReported) {
|
|
186
|
-
surface.errorReported = true;
|
|
187
|
-
latest.current.onContentError?.(surface.initialError);
|
|
188
|
-
}
|
|
189
|
-
const unregister = registerEditor(editor, {
|
|
190
|
-
ui: surface.ui,
|
|
191
|
-
preset,
|
|
192
|
-
ctx: surface.ctx,
|
|
193
|
-
blockActions: surface.blockActions
|
|
194
|
-
});
|
|
195
|
-
if (surface.announced !== editor) {
|
|
196
|
-
surface.announced = editor;
|
|
197
|
-
latest.current.onReady?.(editor);
|
|
198
|
-
}
|
|
199
|
-
return unregister;
|
|
200
|
-
}, [
|
|
201
|
-
editor,
|
|
202
|
-
surface,
|
|
203
|
-
preset
|
|
204
|
-
]);
|
|
205
|
-
useEffect(() => {
|
|
206
|
-
if (value === surface.applied.value) return;
|
|
207
|
-
surface.applied.value = value;
|
|
208
|
-
if (collaboration || !value || editor.isDestroyed || value === surface.lastEmitted) return;
|
|
209
|
-
const checked = surface.validated(value);
|
|
210
|
-
if ("error" in checked) {
|
|
211
|
-
latest.current.onContentError?.(checked.error);
|
|
212
|
-
return;
|
|
213
|
-
}
|
|
214
|
-
editor.commands.setContent(checked.json, { emitUpdate: false });
|
|
215
|
-
}, [
|
|
116
|
+
session.activate();
|
|
117
|
+
return () => session.deactivate();
|
|
118
|
+
}, [session]);
|
|
119
|
+
useEffect(() => session.register(editor), [editor, session]);
|
|
120
|
+
useEffect(() => session.setValue(value), [
|
|
216
121
|
value,
|
|
217
122
|
editor,
|
|
218
|
-
|
|
219
|
-
collaboration
|
|
123
|
+
session
|
|
220
124
|
]);
|
|
221
|
-
useEffect(() =>
|
|
222
|
-
if (editable === surface.applied.editable) return;
|
|
223
|
-
surface.applied.editable = editable;
|
|
224
|
-
if (editor.isDestroyed) return;
|
|
225
|
-
editor.setEditable(editable, false);
|
|
226
|
-
editor.view.dispatch(editor.state.tr.setMeta("addToHistory", false));
|
|
227
|
-
}, [
|
|
125
|
+
useEffect(() => session.setEditable(editable), [
|
|
228
126
|
editable,
|
|
229
127
|
editor,
|
|
230
|
-
|
|
128
|
+
session
|
|
231
129
|
]);
|
|
232
|
-
useEffect(() =>
|
|
233
|
-
if (metadata === surface.applied.metadata) return;
|
|
234
|
-
surface.applied.metadata = metadata;
|
|
235
|
-
surface.registry.replace({ ...metadata });
|
|
236
|
-
}, [metadata, surface]);
|
|
130
|
+
useEffect(() => session.setMetadata(metadata), [metadata, session]);
|
|
237
131
|
useEffect(() => {
|
|
238
132
|
if (sidebar.open) comments.set(false);
|
|
239
133
|
}, [sidebar.open, comments.set]);
|
|
@@ -245,7 +139,7 @@ const EditorSurface = forwardRef(function EditorSurface(props, ref) {
|
|
|
245
139
|
openSettings
|
|
246
140
|
}), [editor, openSettings]);
|
|
247
141
|
return /* @__PURE__ */ jsxs(EditorUiContext.Provider, {
|
|
248
|
-
value:
|
|
142
|
+
value: ui,
|
|
249
143
|
children: [
|
|
250
144
|
/* @__PURE__ */ jsx("div", {
|
|
251
145
|
className: "relative",
|
|
@@ -254,7 +148,7 @@ const EditorSurface = forwardRef(function EditorSurface(props, ref) {
|
|
|
254
148
|
className: "relative"
|
|
255
149
|
})
|
|
256
150
|
}),
|
|
257
|
-
|
|
151
|
+
session.overlays.map((Overlay, index) => /* @__PURE__ */ jsx(Overlay, { editor }, index)),
|
|
258
152
|
(props.settingsUi ?? "internal") === "internal" && /* @__PURE__ */ jsx(EditorSettingsModal, {
|
|
259
153
|
preset,
|
|
260
154
|
open: settingsState.open,
|