@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,3 +1,4 @@
|
|
|
1
|
+
import { compositeKindsOf } from "../nodes.js";
|
|
1
2
|
import { useUiKit } from "../../../vue/kit/use-ui-kit.js";
|
|
2
3
|
import { useEditorI18n } from "../../../vue/use-editor-i18n.js";
|
|
3
4
|
import { FILTER_ALL, columnSpecsOf, fieldColumnsOf, fieldOf, fieldText, hasText, isLongText, sortRows, toggled } from "../table-model.js";
|
|
@@ -54,7 +55,15 @@ const _sfc_main = /*@__PURE__*/ defineComponent({
|
|
|
54
55
|
const { Badge: UBadge, Button: UButton, Icon: UIcon, Input: UInput, Select: USelect, Table: UTable } = useUiKit();
|
|
55
56
|
const { t } = useEditorI18n();
|
|
56
57
|
const { rows, tags, kinds } = useCompositeRows(() => props.editor);
|
|
57
|
-
const
|
|
58
|
+
const fieldContext = computed(() => {
|
|
59
|
+
rows.value;
|
|
60
|
+
return props.editor ? {
|
|
61
|
+
doc: props.editor.state.doc,
|
|
62
|
+
kinds: compositeKindsOf(props.editor),
|
|
63
|
+
t
|
|
64
|
+
} : void 0;
|
|
65
|
+
});
|
|
66
|
+
const fieldColumns = computed(() => fieldColumnsOf(rows.value, kinds.value, fieldContext.value));
|
|
58
67
|
const specs = computed(() => columnSpecsOf(fieldColumns.value, t));
|
|
59
68
|
const columns = computed(() => specs.value.map((spec) => ({
|
|
60
69
|
id: spec.id,
|
|
@@ -324,11 +333,11 @@ const _sfc_main = /*@__PURE__*/ defineComponent({
|
|
|
324
333
|
}), renderList(fieldColumns.value, (column) => {
|
|
325
334
|
return {
|
|
326
335
|
name: `${column.id}-cell`,
|
|
327
|
-
fn: withCtx(({ row }) => [unref(fieldText)(row.original, column.field.key) ? (openBlock(), createElementBlock("span", {
|
|
336
|
+
fn: withCtx(({ row }) => [unref(fieldText)(row.original, column.field.key, fieldContext.value) ? (openBlock(), createElementBlock("span", {
|
|
328
337
|
key: 0,
|
|
329
338
|
class: normalizeClass(["block", [column.field.type === "number" || column.field.type === "date" ? "tabular-nums" : "", unref(isLongText)(column.field) ? "max-w-64 truncate" : ""]]),
|
|
330
|
-
title: unref(isLongText)(column.field) ? unref(fieldText)(row.original, column.field.key) : void 0
|
|
331
|
-
}, toDisplayString(unref(fieldText)(row.original, column.field.key)), 11, _hoisted_14)) : (openBlock(), createElementBlock(Fragment, { key: 1 }, [_cache[4] || (_cache[4] = createElementVNode("span", {
|
|
339
|
+
title: unref(isLongText)(column.field) ? unref(fieldText)(row.original, column.field.key, fieldContext.value) : void 0
|
|
340
|
+
}, toDisplayString(unref(fieldText)(row.original, column.field.key, fieldContext.value)), 11, _hoisted_14)) : (openBlock(), createElementBlock(Fragment, { key: 1 }, [_cache[4] || (_cache[4] = createElementVNode("span", {
|
|
332
341
|
class: "text-[var(--sk-fg-dimmed)]",
|
|
333
342
|
"aria-hidden": "true"
|
|
334
343
|
}, "–", -1)), createElementVNode("span", _hoisted_15, toDisplayString(unref(t)("composites.table.noValue")), 1)], 64))])
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CompositeTable.js","names":["_openBlock","_createElementBlock","_unref","_createVNode","_createElementVNode","_toDisplayString","_Fragment","_createSlots","_withCtx","_renderList","_createBlock","_createCommentVNode","_normalizeStyle","_createTextVNode","_normalizeClass"],"sources":["../../../../src/features/composites/components/CompositeTable.vue"],"sourcesContent":["<script setup lang=\"ts\">\n// All Bausteine of an editor's document as a sortable, filterable table. Columns beyond the fixed ones derive from the\n// meta fields of the kinds present in the document, so a host kind with fields gets its columns without code changes.\nimport type { Editor } from '@tiptap/core'\nimport { computed, ref } from 'vue'\nimport type { TableColumn } from '../../../vue/kit/types'\nimport { useUiKit } from '../../../vue/kit/use-ui-kit'\nimport { useEditorI18n } from '../../../vue/use-editor-i18n'\nimport type { CompositeRow } from '../rows'\nimport { columnSpecsOf, FILTER_ALL, fieldColumnsOf, fieldOf, fieldText, hasText, isLongText, sortRows, toggled } from '../table-model'\nimport { useCompositeRows } from '../use-composite-rows'\n\nconst props = defineProps<{ editor?: Editor }>()\nconst emit = defineEmits<{ select: [row: CompositeRow] }>()\n\nconst { Badge: UBadge, Button: UButton, Icon: UIcon, Input: UInput, Select: USelect, Table: UTable } = useUiKit()\nconst { t } = useEditorI18n()\n\nconst { rows, tags, kinds } = useCompositeRows(() => props.editor)\n\n// --- Columns ----------------------------------------------------------------------------------------------------\n\nconst fieldColumns = computed(() => fieldColumnsOf(rows.value, kinds.value))\nconst specs = computed(() => columnSpecsOf(fieldColumns.value, t))\n\nconst columns = computed<TableColumn<CompositeRow>[]>(() => specs.value.map(spec => ({\n id: spec.id,\n header: spec.label,\n accessorFn: spec.sort,\n // The table reports `aria-sort` on the header cell only for columns that opt in.\n enableSorting: true,\n meta: { class: {\n th: [spec.id === 'title' ? 'min-w-56' : '', spec.align === 'end' ? 'text-right' : ''].join(' '),\n td: spec.align === 'end' ? 'text-right' : '',\n } },\n})))\n\n// --- Filter -----------------------------------------------------------------------------------------------------\n\nconst search = ref('')\nconst pickedKinds = ref<string[]>([])\nconst pickedTags = ref<string[]>([])\nconst pickedOptions = ref<Record<string, string>>({})\n\n/** One select per `select` field in use; its choices are the union of the options of all kinds that have the key. */\nconst selectFilters = computed(() => fieldColumns.value.flatMap((column) => {\n if (column.field.type !== 'select') return []\n const options = new Map<string, string>()\n for (const row of rows.value) {\n for (const option of fieldOf(row, column.field.key)?.options ?? []) if (!options.has(option.value)) options.set(option.value, option.label)\n }\n return [{\n key: column.field.key,\n label: column.field.label,\n items: [{ label: t('composites.table.filter.all'), value: FILTER_ALL }, ...[...options].map(([value, label]) => ({ label, value }))],\n }]\n}))\n\n// A kind, tag or option that vanished from the document can no longer be unpicked in the UI, so it must not filter either.\nconst activeKinds = computed(() => pickedKinds.value.filter(id => kinds.value.some(kind => kind.id === id)))\nconst activeTags = computed(() => pickedTags.value.filter(tag => tags.value.includes(tag)))\nconst activeOptions = computed(() => selectFilters.value.flatMap((filter) => {\n const value = pickedOptions.value[filter.key]\n return value && filter.items.some(item => item.value === value && value !== FILTER_ALL) ? [[filter.key, value] as const] : []\n}))\nconst needle = computed(() => search.value.trim().toLowerCase())\nconst filterActive = computed(() => activeKinds.value.length > 0 || activeTags.value.length > 0 || activeOptions.value.length > 0 || needle.value !== '')\n\nfunction resetFilters() {\n search.value = ''\n pickedKinds.value = []\n pickedTags.value = []\n pickedOptions.value = {}\n}\n\nconst filtered = computed(() => rows.value.filter((row) => {\n if (activeKinds.value.length && !activeKinds.value.includes(row.kind)) return false\n if (activeTags.value.length && !activeTags.value.every(tag => row.tags.includes(tag))) return false\n if (activeOptions.value.some(([key, value]) => row.meta[key] !== value)) return false\n if (needle.value) {\n const haystack = `${row.title}\\n${row.description}\\n${row.tags.map(tag => `#${tag}`).join(' ')}`.toLowerCase()\n if (!haystack.includes(needle.value)) return false\n }\n return true\n}))\n\n// --- Sorting (client side; the table only reports the state, so the data is ordered here) -------------------------\n\nconst sorting = ref<{ id: string, desc: boolean }[]>([])\nconst activeSort = computed(() => {\n const entry = sorting.value[0]\n const spec = entry && specs.value.find(item => item.id === entry.id)\n return entry && spec ? { id: entry.id, desc: entry.desc, sort: spec.sort } : null\n})\n\n/** Header click cycles ascending → descending → unsorted. */\nfunction cycleSort(id: string) {\n const current = sorting.value[0]\n if (current?.id !== id) sorting.value = [{ id, desc: false }]\n else sorting.value = current.desc ? [] : [{ id, desc: true }]\n}\nconst sortIcon = (id: string) => {\n const current = sorting.value[0]\n if (current?.id !== id) return 'i-lucide-chevrons-up-down'\n return current.desc ? 'i-lucide-arrow-down' : 'i-lucide-arrow-up'\n}\n\nconst sorted = computed(() => {\n const sort = activeSort.value\n return sort ? sortRows(filtered.value, sort.sort, sort.desc) : filtered.value\n})\n\nconst countLabel = computed(() => t(rows.value.length === 1 ? 'composites.table.count.one' : 'composites.table.count.other', { n: sorted.value.length, total: rows.value.length }))\n</script>\n\n<template>\n <section class=\"flex min-h-0 flex-col gap-3\" :aria-label=\"t('composites.table.label')\">\n <div v-if=\"!rows.length\" class=\"mx-auto flex max-w-sm flex-1 flex-col items-center justify-center gap-2 py-16 text-center\">\n <UIcon name=\"i-lucide-table-2\" class=\"size-8 text-[var(--sk-fg-dimmed)]\" />\n <p class=\"text-sm font-medium text-[var(--sk-fg-highlighted)]\">\n {{ t('composites.table.emptyTitle') }}\n </p>\n <p class=\"text-sm text-[var(--sk-muted)]\">\n {{ t('composites.table.emptyText') }}\n </p>\n </div>\n\n <template v-else>\n <div class=\"flex flex-col gap-2\">\n <div class=\"flex flex-wrap items-center gap-2\">\n <UInput\n v-model=\"search\"\n class=\"w-64\"\n size=\"sm\"\n icon=\"i-lucide-search\"\n :placeholder=\"t('composites.table.search.placeholder')\"\n :aria-label=\"t('composites.table.search.label')\"\n >\n <template v-if=\"search\" #trailing>\n <UButton\n color=\"neutral\"\n variant=\"link\"\n size=\"xs\"\n icon=\"i-lucide-x\"\n :aria-label=\"t('composites.table.search.clear')\"\n @click=\"search = ''\"\n />\n </template>\n </UInput>\n\n <div v-for=\"filter in selectFilters\" :key=\"filter.key\" class=\"flex items-center gap-1.5\">\n <span class=\"text-sm text-[var(--sk-muted)]\" aria-hidden=\"true\">{{ filter.label }}</span>\n <USelect\n :model-value=\"pickedOptions[filter.key] ?? FILTER_ALL\"\n class=\"w-36\"\n size=\"sm\"\n :items=\"filter.items\"\n :aria-label=\"filter.label\"\n @update:model-value=\"pickedOptions = { ...pickedOptions, [filter.key]: String($event) }\"\n />\n </div>\n\n <UButton\n v-if=\"filterActive\"\n size=\"sm\"\n color=\"neutral\"\n variant=\"ghost\"\n icon=\"i-lucide-filter-x\"\n :label=\"t('composites.table.filter.reset')\"\n @click=\"resetFilters\"\n />\n <span class=\"ml-auto text-xs tabular-nums text-[var(--sk-muted)]\" role=\"status\">{{ countLabel }}</span>\n </div>\n\n <div v-if=\"kinds.length > 1\" class=\"flex flex-wrap items-center gap-1\" role=\"group\" :aria-label=\"t('composites.table.filter.byKind')\">\n <UButton\n v-for=\"kind in kinds\"\n :key=\"kind.id\"\n size=\"xs\"\n color=\"neutral\"\n :variant=\"activeKinds.includes(kind.id) ? 'solid' : 'outline'\"\n :icon=\"kind.icon\"\n :label=\"kind.label\"\n :aria-pressed=\"activeKinds.includes(kind.id)\"\n @click=\"pickedKinds = toggled(pickedKinds, kind.id)\"\n />\n </div>\n\n <div v-if=\"tags.length\" class=\"flex flex-wrap items-center gap-1\" role=\"group\" :aria-label=\"t('composites.table.filter.byTag')\">\n <UButton\n v-for=\"tag in tags\"\n :key=\"tag\"\n size=\"xs\"\n color=\"neutral\"\n :variant=\"activeTags.includes(tag) ? 'solid' : 'outline'\"\n :label=\"`#${tag}`\"\n :aria-pressed=\"activeTags.includes(tag)\"\n @click=\"pickedTags = toggled(pickedTags, tag)\"\n />\n </div>\n </div>\n\n <UTable\n v-model:sorting=\"sorting\"\n :data=\"sorted\"\n :columns=\"columns\"\n :get-row-id=\"(row: CompositeRow) => row.key\"\n :ui=\"{ th: 'px-3 py-2 text-sm', td: 'px-3 py-2' }\"\n sticky\n class=\"min-h-0 flex-1 rounded-md border border-[var(--sk-border)]\"\n @select=\"(_event: Event, row: { original: CompositeRow }) => emit('select', row.original)\"\n >\n <template v-for=\"spec in specs\" :key=\"spec.id\" #[`${spec.id}-header`]>\n <button\n type=\"button\"\n class=\"-mx-1.5 inline-flex cursor-pointer items-center gap-1 rounded px-1.5 py-0.5 font-semibold hover:bg-[var(--sk-bg-elevated)] focus-visible:outline-2 focus-visible:outline-[var(--sk-primary)]\"\n @click=\"cycleSort(spec.id)\"\n >\n {{ spec.label }}\n <UIcon :name=\"sortIcon(spec.id)\" class=\"size-3.5\" :class=\"activeSort?.id === spec.id ? 'text-[var(--sk-fg-highlighted)]' : 'text-[var(--sk-fg-dimmed)]'\" />\n </button>\n </template>\n\n <template #title-cell=\"{ row }: { row: { original: CompositeRow } }\">\n <div class=\"flex min-w-0 items-center gap-1.5\" :style=\"{ paddingLeft: `${row.original.depth * 1.25}rem` }\">\n <UIcon :name=\"row.original.icon\" class=\"size-4 shrink-0 text-[var(--sk-muted)]\" />\n <span v-if=\"hasText(row.original.title)\" class=\"truncate font-medium text-[var(--sk-fg-highlighted)]\">{{ row.original.title }}</span>\n <span v-else class=\"truncate text-[var(--sk-muted)]\">{{ t('composites.untitled') }}</span>\n </div>\n </template>\n <template #kind-cell=\"{ row }: { row: { original: CompositeRow } }\">\n {{ row.original.kindLabel }}\n </template>\n <template v-for=\"column in fieldColumns\" :key=\"column.id\" #[`${column.id}-cell`]=\"{ row }: { row: { original: CompositeRow } }\">\n <span\n v-if=\"fieldText(row.original, column.field.key)\"\n class=\"block\"\n :class=\"[column.field.type === 'number' || column.field.type === 'date' ? 'tabular-nums' : '', isLongText(column.field) ? 'max-w-64 truncate' : '']\"\n :title=\"isLongText(column.field) ? fieldText(row.original, column.field.key) : undefined\"\n >{{ fieldText(row.original, column.field.key) }}</span>\n <template v-else>\n <span class=\"text-[var(--sk-fg-dimmed)]\" aria-hidden=\"true\">–</span>\n <span class=\"sr-only\">{{ t('composites.table.noValue') }}</span>\n </template>\n </template>\n <template #tags-cell=\"{ row }: { row: { original: CompositeRow } }\">\n <div v-if=\"row.original.tags.length\" class=\"flex flex-wrap gap-1\">\n <UBadge v-for=\"tag in row.original.tags\" :key=\"tag\" color=\"neutral\" variant=\"subtle\" size=\"sm\" :label=\"`#${tag}`\" />\n </div>\n <template v-else>\n <span class=\"text-[var(--sk-fg-dimmed)]\" aria-hidden=\"true\">–</span>\n <span class=\"sr-only\">{{ t('composites.table.noTags') }}</span>\n </template>\n </template>\n <template #summary-cell=\"{ row }: { row: { original: CompositeRow } }\">\n <template v-if=\"hasText(row.original.description)\">\n <span class=\"inline-block size-2 rounded-full bg-[var(--sk-primary)]\" aria-hidden=\"true\" :title=\"row.original.description\" />\n <span class=\"sr-only\">{{ t('composites.table.summaryPresent') }}</span>\n </template>\n <template v-else>\n <span class=\"text-[var(--sk-fg-dimmed)]\" aria-hidden=\"true\">–</span>\n <span class=\"sr-only\">{{ t('composites.summary.none') }}</span>\n </template>\n </template>\n\n <template #empty>\n <div class=\"flex flex-col items-center gap-2 py-6\">\n <p class=\"text-sm text-[var(--sk-muted)]\">\n {{ t('composites.table.filter.noMatch') }}\n </p>\n <UButton\n size=\"sm\"\n color=\"neutral\"\n variant=\"outline\"\n icon=\"i-lucide-filter-x\"\n :label=\"t('composites.table.filter.reset')\"\n @click=\"resetFilters\"\n />\n </div>\n </template>\n </UTable>\n </template>\n </section>\n</template>\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"CompositeTable.js","names":["_openBlock","_createElementBlock","_unref","_createVNode","_createElementVNode","_toDisplayString","_Fragment","_createSlots","_withCtx","_renderList","_createBlock","_createCommentVNode","_normalizeStyle","_createTextVNode","_normalizeClass"],"sources":["../../../../src/features/composites/components/CompositeTable.vue"],"sourcesContent":["<script setup lang=\"ts\">\n// All Bausteine of an editor's document as a sortable, filterable table. Columns beyond the fixed ones derive from the\n// meta fields of the kinds present in the document, so a host kind with fields gets its columns without code changes.\nimport type { Editor } from '@tiptap/core'\nimport { computed, ref } from 'vue'\nimport type { TableColumn } from '../../../vue/kit/types'\nimport { useUiKit } from '../../../vue/kit/use-ui-kit'\nimport { useEditorI18n } from '../../../vue/use-editor-i18n'\nimport { compositeKindsOf } from '../nodes'\nimport type { CompositeRow } from '../rows'\nimport { columnSpecsOf, type FieldContext, FILTER_ALL, fieldColumnsOf, fieldOf, fieldText, hasText, isLongText, sortRows, toggled } from '../table-model'\nimport { useCompositeRows } from '../use-composite-rows'\n\nconst props = defineProps<{ editor?: Editor }>()\nconst emit = defineEmits<{ select: [row: CompositeRow] }>()\n\nconst { Badge: UBadge, Button: UButton, Icon: UIcon, Input: UInput, Select: USelect, Table: UTable } = useUiKit()\nconst { t } = useEditorI18n()\n\nconst { rows, tags, kinds } = useCompositeRows(() => props.editor)\n\n// --- Columns ----------------------------------------------------------------------------------------------------\n\n// `reference` cells resolve their target in the document; re-read whenever the rows change.\nconst fieldContext = computed<FieldContext | undefined>(() => {\n void rows.value\n return props.editor ? { doc: props.editor.state.doc, kinds: compositeKindsOf(props.editor), t } : undefined\n})\nconst fieldColumns = computed(() => fieldColumnsOf(rows.value, kinds.value, fieldContext.value))\nconst specs = computed(() => columnSpecsOf(fieldColumns.value, t))\n\nconst columns = computed<TableColumn<CompositeRow>[]>(() => specs.value.map(spec => ({\n id: spec.id,\n header: spec.label,\n accessorFn: spec.sort,\n // The table reports `aria-sort` on the header cell only for columns that opt in.\n enableSorting: true,\n meta: { class: {\n th: [spec.id === 'title' ? 'min-w-56' : '', spec.align === 'end' ? 'text-right' : ''].join(' '),\n td: spec.align === 'end' ? 'text-right' : '',\n } },\n})))\n\n// --- Filter -----------------------------------------------------------------------------------------------------\n\nconst search = ref('')\nconst pickedKinds = ref<string[]>([])\nconst pickedTags = ref<string[]>([])\nconst pickedOptions = ref<Record<string, string>>({})\n\n/** One select per `select` field in use; its choices are the union of the options of all kinds that have the key. */\nconst selectFilters = computed(() => fieldColumns.value.flatMap((column) => {\n if (column.field.type !== 'select') return []\n const options = new Map<string, string>()\n for (const row of rows.value) {\n for (const option of fieldOf(row, column.field.key)?.options ?? []) if (!options.has(option.value)) options.set(option.value, option.label)\n }\n return [{\n key: column.field.key,\n label: column.field.label,\n items: [{ label: t('composites.table.filter.all'), value: FILTER_ALL }, ...[...options].map(([value, label]) => ({ label, value }))],\n }]\n}))\n\n// A kind, tag or option that vanished from the document can no longer be unpicked in the UI, so it must not filter either.\nconst activeKinds = computed(() => pickedKinds.value.filter(id => kinds.value.some(kind => kind.id === id)))\nconst activeTags = computed(() => pickedTags.value.filter(tag => tags.value.includes(tag)))\nconst activeOptions = computed(() => selectFilters.value.flatMap((filter) => {\n const value = pickedOptions.value[filter.key]\n return value && filter.items.some(item => item.value === value && value !== FILTER_ALL) ? [[filter.key, value] as const] : []\n}))\nconst needle = computed(() => search.value.trim().toLowerCase())\nconst filterActive = computed(() => activeKinds.value.length > 0 || activeTags.value.length > 0 || activeOptions.value.length > 0 || needle.value !== '')\n\nfunction resetFilters() {\n search.value = ''\n pickedKinds.value = []\n pickedTags.value = []\n pickedOptions.value = {}\n}\n\nconst filtered = computed(() => rows.value.filter((row) => {\n if (activeKinds.value.length && !activeKinds.value.includes(row.kind)) return false\n if (activeTags.value.length && !activeTags.value.every(tag => row.tags.includes(tag))) return false\n if (activeOptions.value.some(([key, value]) => row.meta[key] !== value)) return false\n if (needle.value) {\n const haystack = `${row.title}\\n${row.description}\\n${row.tags.map(tag => `#${tag}`).join(' ')}`.toLowerCase()\n if (!haystack.includes(needle.value)) return false\n }\n return true\n}))\n\n// --- Sorting (client side; the table only reports the state, so the data is ordered here) -------------------------\n\nconst sorting = ref<{ id: string, desc: boolean }[]>([])\nconst activeSort = computed(() => {\n const entry = sorting.value[0]\n const spec = entry && specs.value.find(item => item.id === entry.id)\n return entry && spec ? { id: entry.id, desc: entry.desc, sort: spec.sort } : null\n})\n\n/** Header click cycles ascending → descending → unsorted. */\nfunction cycleSort(id: string) {\n const current = sorting.value[0]\n if (current?.id !== id) sorting.value = [{ id, desc: false }]\n else sorting.value = current.desc ? [] : [{ id, desc: true }]\n}\nconst sortIcon = (id: string) => {\n const current = sorting.value[0]\n if (current?.id !== id) return 'i-lucide-chevrons-up-down'\n return current.desc ? 'i-lucide-arrow-down' : 'i-lucide-arrow-up'\n}\n\nconst sorted = computed(() => {\n const sort = activeSort.value\n return sort ? sortRows(filtered.value, sort.sort, sort.desc) : filtered.value\n})\n\nconst countLabel = computed(() => t(rows.value.length === 1 ? 'composites.table.count.one' : 'composites.table.count.other', { n: sorted.value.length, total: rows.value.length }))\n</script>\n\n<template>\n <section class=\"flex min-h-0 flex-col gap-3\" :aria-label=\"t('composites.table.label')\">\n <div v-if=\"!rows.length\" class=\"mx-auto flex max-w-sm flex-1 flex-col items-center justify-center gap-2 py-16 text-center\">\n <UIcon name=\"i-lucide-table-2\" class=\"size-8 text-[var(--sk-fg-dimmed)]\" />\n <p class=\"text-sm font-medium text-[var(--sk-fg-highlighted)]\">\n {{ t('composites.table.emptyTitle') }}\n </p>\n <p class=\"text-sm text-[var(--sk-muted)]\">\n {{ t('composites.table.emptyText') }}\n </p>\n </div>\n\n <template v-else>\n <div class=\"flex flex-col gap-2\">\n <div class=\"flex flex-wrap items-center gap-2\">\n <UInput\n v-model=\"search\"\n class=\"w-64\"\n size=\"sm\"\n icon=\"i-lucide-search\"\n :placeholder=\"t('composites.table.search.placeholder')\"\n :aria-label=\"t('composites.table.search.label')\"\n >\n <template v-if=\"search\" #trailing>\n <UButton\n color=\"neutral\"\n variant=\"link\"\n size=\"xs\"\n icon=\"i-lucide-x\"\n :aria-label=\"t('composites.table.search.clear')\"\n @click=\"search = ''\"\n />\n </template>\n </UInput>\n\n <div v-for=\"filter in selectFilters\" :key=\"filter.key\" class=\"flex items-center gap-1.5\">\n <span class=\"text-sm text-[var(--sk-muted)]\" aria-hidden=\"true\">{{ filter.label }}</span>\n <USelect\n :model-value=\"pickedOptions[filter.key] ?? FILTER_ALL\"\n class=\"w-36\"\n size=\"sm\"\n :items=\"filter.items\"\n :aria-label=\"filter.label\"\n @update:model-value=\"pickedOptions = { ...pickedOptions, [filter.key]: String($event) }\"\n />\n </div>\n\n <UButton\n v-if=\"filterActive\"\n size=\"sm\"\n color=\"neutral\"\n variant=\"ghost\"\n icon=\"i-lucide-filter-x\"\n :label=\"t('composites.table.filter.reset')\"\n @click=\"resetFilters\"\n />\n <span class=\"ml-auto text-xs tabular-nums text-[var(--sk-muted)]\" role=\"status\">{{ countLabel }}</span>\n </div>\n\n <div v-if=\"kinds.length > 1\" class=\"flex flex-wrap items-center gap-1\" role=\"group\" :aria-label=\"t('composites.table.filter.byKind')\">\n <UButton\n v-for=\"kind in kinds\"\n :key=\"kind.id\"\n size=\"xs\"\n color=\"neutral\"\n :variant=\"activeKinds.includes(kind.id) ? 'solid' : 'outline'\"\n :icon=\"kind.icon\"\n :label=\"kind.label\"\n :aria-pressed=\"activeKinds.includes(kind.id)\"\n @click=\"pickedKinds = toggled(pickedKinds, kind.id)\"\n />\n </div>\n\n <div v-if=\"tags.length\" class=\"flex flex-wrap items-center gap-1\" role=\"group\" :aria-label=\"t('composites.table.filter.byTag')\">\n <UButton\n v-for=\"tag in tags\"\n :key=\"tag\"\n size=\"xs\"\n color=\"neutral\"\n :variant=\"activeTags.includes(tag) ? 'solid' : 'outline'\"\n :label=\"`#${tag}`\"\n :aria-pressed=\"activeTags.includes(tag)\"\n @click=\"pickedTags = toggled(pickedTags, tag)\"\n />\n </div>\n </div>\n\n <UTable\n v-model:sorting=\"sorting\"\n :data=\"sorted\"\n :columns=\"columns\"\n :get-row-id=\"(row: CompositeRow) => row.key\"\n :ui=\"{ th: 'px-3 py-2 text-sm', td: 'px-3 py-2' }\"\n sticky\n class=\"min-h-0 flex-1 rounded-md border border-[var(--sk-border)]\"\n @select=\"(_event: Event, row: { original: CompositeRow }) => emit('select', row.original)\"\n >\n <template v-for=\"spec in specs\" :key=\"spec.id\" #[`${spec.id}-header`]>\n <button\n type=\"button\"\n class=\"-mx-1.5 inline-flex cursor-pointer items-center gap-1 rounded px-1.5 py-0.5 font-semibold hover:bg-[var(--sk-bg-elevated)] focus-visible:outline-2 focus-visible:outline-[var(--sk-primary)]\"\n @click=\"cycleSort(spec.id)\"\n >\n {{ spec.label }}\n <UIcon :name=\"sortIcon(spec.id)\" class=\"size-3.5\" :class=\"activeSort?.id === spec.id ? 'text-[var(--sk-fg-highlighted)]' : 'text-[var(--sk-fg-dimmed)]'\" />\n </button>\n </template>\n\n <template #title-cell=\"{ row }: { row: { original: CompositeRow } }\">\n <div class=\"flex min-w-0 items-center gap-1.5\" :style=\"{ paddingLeft: `${row.original.depth * 1.25}rem` }\">\n <UIcon :name=\"row.original.icon\" class=\"size-4 shrink-0 text-[var(--sk-muted)]\" />\n <span v-if=\"hasText(row.original.title)\" class=\"truncate font-medium text-[var(--sk-fg-highlighted)]\">{{ row.original.title }}</span>\n <span v-else class=\"truncate text-[var(--sk-muted)]\">{{ t('composites.untitled') }}</span>\n </div>\n </template>\n <template #kind-cell=\"{ row }: { row: { original: CompositeRow } }\">\n {{ row.original.kindLabel }}\n </template>\n <template v-for=\"column in fieldColumns\" :key=\"column.id\" #[`${column.id}-cell`]=\"{ row }: { row: { original: CompositeRow } }\">\n <span\n v-if=\"fieldText(row.original, column.field.key, fieldContext)\"\n class=\"block\"\n :class=\"[column.field.type === 'number' || column.field.type === 'date' ? 'tabular-nums' : '', isLongText(column.field) ? 'max-w-64 truncate' : '']\"\n :title=\"isLongText(column.field) ? fieldText(row.original, column.field.key, fieldContext) : undefined\"\n >{{ fieldText(row.original, column.field.key, fieldContext) }}</span>\n <template v-else>\n <span class=\"text-[var(--sk-fg-dimmed)]\" aria-hidden=\"true\">–</span>\n <span class=\"sr-only\">{{ t('composites.table.noValue') }}</span>\n </template>\n </template>\n <template #tags-cell=\"{ row }: { row: { original: CompositeRow } }\">\n <div v-if=\"row.original.tags.length\" class=\"flex flex-wrap gap-1\">\n <UBadge v-for=\"tag in row.original.tags\" :key=\"tag\" color=\"neutral\" variant=\"subtle\" size=\"sm\" :label=\"`#${tag}`\" />\n </div>\n <template v-else>\n <span class=\"text-[var(--sk-fg-dimmed)]\" aria-hidden=\"true\">–</span>\n <span class=\"sr-only\">{{ t('composites.table.noTags') }}</span>\n </template>\n </template>\n <template #summary-cell=\"{ row }: { row: { original: CompositeRow } }\">\n <template v-if=\"hasText(row.original.description)\">\n <span class=\"inline-block size-2 rounded-full bg-[var(--sk-primary)]\" aria-hidden=\"true\" :title=\"row.original.description\" />\n <span class=\"sr-only\">{{ t('composites.table.summaryPresent') }}</span>\n </template>\n <template v-else>\n <span class=\"text-[var(--sk-fg-dimmed)]\" aria-hidden=\"true\">–</span>\n <span class=\"sr-only\">{{ t('composites.summary.none') }}</span>\n </template>\n </template>\n\n <template #empty>\n <div class=\"flex flex-col items-center gap-2 py-6\">\n <p class=\"text-sm text-[var(--sk-muted)]\">\n {{ t('composites.table.filter.noMatch') }}\n </p>\n <UButton\n size=\"sm\"\n color=\"neutral\"\n variant=\"outline\"\n icon=\"i-lucide-filter-x\"\n :label=\"t('composites.table.filter.reset')\"\n @click=\"resetFilters\"\n />\n </div>\n </template>\n </UTable>\n </template>\n </section>\n</template>\n"],"mappings":"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"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { metadataOf } from "../../../core/metadata.js";
|
|
2
2
|
import { METADATA_LIST } from "../../../core/metadata-types.js";
|
|
3
|
+
import { normalizeTagName } from "../../../core/tag-name.js";
|
|
3
4
|
import { useUiKit } from "../../../vue/kit/use-ui-kit.js";
|
|
4
5
|
import { useEditorI18n } from "../../../vue/use-editor-i18n.js";
|
|
5
6
|
import { setCompositeTags } from "../rows.js";
|
|
6
|
-
import { normalizeTagName } from "../../../core/tag-name.js";
|
|
7
7
|
import { Fragment, createCommentVNode, createElementBlock, createTextVNode, createVNode, defineComponent, onBeforeUnmount, openBlock, ref, toDisplayString, unref, watch, withCtx } from "vue";
|
|
8
8
|
//#region src/features/composites/components/CompositeTagsEditor.vue
|
|
9
9
|
/** Tags of one Baustein as an input menu with suggestions from the metadata registry, writing through `setCompositeTags`. */
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import { compositeKind } from "../kinds.js";
|
|
2
|
+
import { derivationOf } from "../derivation.js";
|
|
2
3
|
import { compositeKindsOf } from "../nodes.js";
|
|
4
|
+
import { useStoreRef } from "../../../vue/store-ref.js";
|
|
3
5
|
import { computed, createBlock, createCommentVNode, createElementVNode, createVNode, defineComponent, normalizeClass, normalizeStyle, openBlock, unref, withCtx } from "vue";
|
|
4
6
|
import { NodeViewContent, NodeViewWrapper, nodeViewProps } from "@tiptap/vue-3";
|
|
5
7
|
//#region src/features/composites/components/CompositeView.vue
|
|
@@ -9,13 +11,21 @@ const _sfc_main = /*@__PURE__*/ defineComponent({
|
|
|
9
11
|
setup(__props) {
|
|
10
12
|
const props = __props;
|
|
11
13
|
const kind = computed(() => compositeKind(compositeKindsOf(props.editor), String(props.node.attrs.kind)));
|
|
14
|
+
const expanded = useStoreRef(() => props.editor.storage.composite.expanded);
|
|
15
|
+
const collapsed = computed(() => {
|
|
16
|
+
const id = props.node.attrs.id;
|
|
17
|
+
return typeof id === "string" && id !== "" && derivationOf(props.node) !== null && !expanded.value.has(id);
|
|
18
|
+
});
|
|
12
19
|
/** `text` as a CSS string literal (for `content:`). */
|
|
13
20
|
const cssString = (text) => `"${text.replace(/["\\]/g, "\\$&").replace(/\n/g, "\\a ")}"`;
|
|
14
21
|
const placeholderVars = computed(() => ({ "--composite-title-placeholder": cssString(kind.value.titlePlaceholder) }));
|
|
15
22
|
return (_ctx, _cache) => {
|
|
16
23
|
return openBlock(), createBlock(unref(NodeViewWrapper), {
|
|
17
24
|
as: "section",
|
|
18
|
-
class: normalizeClass(["composite", {
|
|
25
|
+
class: normalizeClass(["composite", {
|
|
26
|
+
"is-collapsed": collapsed.value,
|
|
27
|
+
"is-selected rounded-md ring-1 ring-[var(--sk-primary)]": _ctx.selected
|
|
28
|
+
}]),
|
|
19
29
|
"data-type": "composite",
|
|
20
30
|
"data-kind": _ctx.node.attrs.kind,
|
|
21
31
|
"data-id": _ctx.node.attrs.id || void 0,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CompositeView.js","names":["selected","node","_openBlock","_createBlock","_unref","_normalizeClass","_normalizeStyle","_withCtx","_createCommentVNode","_createElementVNode","_createVNode"],"sources":["../../../../src/features/composites/components/CompositeView.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { NodeViewContent, NodeViewWrapper, nodeViewProps } from '@tiptap/vue-3'\nimport { computed } from 'vue'\nimport { compositeKind } from '../kinds'\nimport { compositeKindsOf } from '../nodes'\n\nconst props = defineProps(nodeViewProps)\n\nconst kind = computed(() => compositeKind(compositeKindsOf(props.editor), String(props.node.attrs.kind)))\n\n/** `text` as a CSS string literal (for `content:`). */\nconst cssString = (text: string) => `\"${text.replace(/[\"\\\\]/g, '\\\\$&').replace(/\\n/g, '\\\\a ')}\"`\n// Placeholder of the empty title (composites.css `content: var(…)`); a nested composite sets its own.\nconst placeholderVars = computed(() => ({\n '--composite-title-placeholder': cssString(kind.value.titlePlaceholder),\n}))\n</script>\n\n<template>\n <NodeViewWrapper\n as=\"section\"\n :class=\"['composite', { 'is-selected rounded-md ring-1 ring-[var(--sk-primary)]': selected }]\"\n data-type=\"composite\"\n :data-kind=\"node.attrs.kind\"\n :data-id=\"node.attrs.id || undefined\"\n :style=\"placeholderVars\"\n >\n <!-- Anchor of the kind icon on the left border: it only takes the icon's place and size. The composite chrome overlay\n measures it and draws the icon as the button that opens the details popover and drags the composite. -->\n <span class=\"composite__toggle\" contenteditable=\"false\" aria-hidden=\"true\" />\n <NodeViewContent class=\"composite__content\" />\n </NodeViewWrapper>\n</template>\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"CompositeView.js","names":["selected","node","_openBlock","_createBlock","_unref","_normalizeClass","_normalizeStyle","_withCtx","_createCommentVNode","_createElementVNode","_createVNode"],"sources":["../../../../src/features/composites/components/CompositeView.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { NodeViewContent, NodeViewWrapper, nodeViewProps } from '@tiptap/vue-3'\nimport { computed } from 'vue'\nimport { compositeKind } from '../kinds'\nimport { compositeKindsOf } from '../nodes'\nimport { useStoreRef } from '../../../vue/store-ref'\nimport { derivationOf } from '../derivation'\n\nconst props = defineProps(nodeViewProps)\n\nconst kind = computed(() => compositeKind(compositeKindsOf(props.editor), String(props.node.attrs.kind)))\n\n// A derived Baustein (one with a `meta.derivation`) shows collapsed to a faded preview until it is opened; the content\n// stays laid out (CSS clips it), so editing positions are unaffected. The chrome's chevron and a caret inside open it.\nconst expanded = useStoreRef(() => props.editor.storage.composite.expanded)\nconst collapsed = computed(() => {\n const id: unknown = props.node.attrs.id\n return typeof id === 'string' && id !== '' && derivationOf(props.node) !== null && !expanded.value.has(id)\n})\n\n/** `text` as a CSS string literal (for `content:`). */\nconst cssString = (text: string) => `\"${text.replace(/[\"\\\\]/g, '\\\\$&').replace(/\\n/g, '\\\\a ')}\"`\n// Placeholder of the empty title (composites.css `content: var(…)`); a nested composite sets its own.\nconst placeholderVars = computed(() => ({\n '--composite-title-placeholder': cssString(kind.value.titlePlaceholder),\n}))\n</script>\n\n<template>\n <NodeViewWrapper\n as=\"section\"\n :class=\"['composite', { 'is-collapsed': collapsed, 'is-selected rounded-md ring-1 ring-[var(--sk-primary)]': selected }]\"\n data-type=\"composite\"\n :data-kind=\"node.attrs.kind\"\n :data-id=\"node.attrs.id || undefined\"\n :style=\"placeholderVars\"\n >\n <!-- Anchor of the kind icon on the left border: it only takes the icon's place and size. The composite chrome overlay\n measures it and draws the icon as the button that opens the details popover and drags the composite. -->\n <span class=\"composite__toggle\" contenteditable=\"false\" aria-hidden=\"true\" />\n <NodeViewContent class=\"composite__content\" />\n </NodeViewWrapper>\n</template>\n"],"mappings":";;;;;;;;;;;EAQA,MAAM,QAAQ;EAEd,MAAM,OAAO,eAAe,cAAc,iBAAiB,MAAM,MAAM,GAAG,OAAO,MAAM,KAAK,MAAM,IAAI,CAAC,CAAC;EAIxG,MAAM,WAAW,kBAAkB,MAAM,OAAO,QAAQ,UAAU,QAAQ;EAC1E,MAAM,YAAY,eAAe;GAC/B,MAAM,KAAc,MAAM,KAAK,MAAM;GACrC,OAAO,OAAO,OAAO,YAAY,OAAO,MAAM,aAAa,MAAM,IAAI,MAAM,QAAQ,CAAC,SAAS,MAAM,IAAI,EAAE;EAC3G,CAAC;;EAGD,MAAM,aAAa,SAAiB,IAAI,KAAK,QAAQ,UAAU,MAAM,CAAC,CAAC,QAAQ,OAAO,MAAM,EAAE;EAE9F,MAAM,kBAAkB,gBAAgB,EACtC,iCAAiC,UAAU,KAAK,MAAM,gBAAgB,EACxE,EAAE;;GAIA,OAAAE,UAAA,GAAAC,YAYkBC,MAAA,eAAA,GAAA;IAXhB,IAAG;IACF,OAAKC,eAAA,CAAA,aAAA;KAAA,gBAAkC,UAAA;KAAS,0DAA4DL,KAAAA;IAAQ,CAAA,CAAA;IACrH,aAAU;IACT,aAAWC,KAAAA,KAAK,MAAM;IACtB,WAASA,KAAAA,KAAK,MAAM,MAAM,KAAA;IAC1B,OAAKK,eAAE,gBAAA,KAAe;;IAEvB,SAAAC,cAC6G;KAD7GC,mBAAA,oOAAA;KAEA,OAAA,OAAA,OAAA,KAAAC,mBAA6E,QAAA;MAAvE,OAAM;MAAoB,iBAAgB;MAAQ,eAAY;;KACpEC,YAA8CN,MAAA,eAAA,GAAA,EAA7B,OAAM,qBAAoB,CAAA"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import { derivationOf } from "../derivation.js";
|
|
2
|
+
import { useUiKit } from "../../../vue/kit/use-ui-kit.js";
|
|
3
|
+
import { useEditorI18n } from "../../../vue/use-editor-i18n.js";
|
|
4
|
+
import { derivationDetailsOf, derivationMethodLabel } from "../derived-chrome.js";
|
|
5
|
+
import { formatDate } from "../meta-display.js";
|
|
6
|
+
import { Fragment, computed, createCommentVNode, createElementBlock, createElementVNode, createTextVNode, createVNode, defineComponent, normalizeClass, openBlock, toDisplayString, unref } from "vue";
|
|
7
|
+
//#region src/features/composites/components/DerivationBadge.vue
|
|
8
|
+
const _hoisted_1 = {
|
|
9
|
+
key: 0,
|
|
10
|
+
class: "flex min-w-0 items-center gap-1.5 text-xs text-[var(--sk-muted)]"
|
|
11
|
+
};
|
|
12
|
+
const _hoisted_2 = { class: "truncate" };
|
|
13
|
+
const _hoisted_3 = {
|
|
14
|
+
key: 1,
|
|
15
|
+
class: "flex flex-col gap-1.5 rounded-md p-2 text-xs ring ring-[var(--sk-border)]"
|
|
16
|
+
};
|
|
17
|
+
const _hoisted_4 = { class: "flex flex-wrap items-center gap-1" };
|
|
18
|
+
const _hoisted_5 = { class: "grid grid-cols-[auto_1fr] gap-x-2 gap-y-0.5" };
|
|
19
|
+
const _hoisted_6 = { class: "text-[var(--sk-muted)]" };
|
|
20
|
+
const _hoisted_7 = { class: "truncate text-[var(--sk-fg)]" };
|
|
21
|
+
const _hoisted_8 = { class: "text-[var(--sk-muted)]" };
|
|
22
|
+
const _hoisted_9 = ["title"];
|
|
23
|
+
const _hoisted_10 = { class: "text-[var(--sk-muted)]" };
|
|
24
|
+
const _hoisted_11 = { class: "text-[var(--sk-fg)]" };
|
|
25
|
+
const _hoisted_12 = ["href"];
|
|
26
|
+
/**
|
|
27
|
+
* Where a derived Baustein comes from. Compact (the `derivation` field type): the „abgeleitet“ badge with method and
|
|
28
|
+
* date. `detailed` (the details card): also the model, whether the source changed („Quelle geändert“), whether the body
|
|
29
|
+
* was edited since it was generated („bearbeitet“) and a link to the stored raw output. The detailed variant hashes
|
|
30
|
+
* the body, so it belongs only where one Baustein is shown.
|
|
31
|
+
*/
|
|
32
|
+
const chip = "inline-flex h-5 shrink-0 items-center gap-1 rounded-sm px-1.5 text-xs leading-none whitespace-nowrap";
|
|
33
|
+
const _sfc_main = /*@__PURE__*/ defineComponent({
|
|
34
|
+
__name: "DerivationBadge",
|
|
35
|
+
props: {
|
|
36
|
+
editor: {},
|
|
37
|
+
node: {},
|
|
38
|
+
detailed: { type: Boolean }
|
|
39
|
+
},
|
|
40
|
+
setup(__props) {
|
|
41
|
+
const props = __props;
|
|
42
|
+
const { Icon: UIcon } = useUiKit();
|
|
43
|
+
const { t } = useEditorI18n();
|
|
44
|
+
const derivation = computed(() => derivationOf(props.node));
|
|
45
|
+
const details = computed(() => props.detailed ? derivationDetailsOf(props.editor, props.node) : null);
|
|
46
|
+
const method = computed(() => derivation.value ? derivationMethodLabel(t, derivation.value.method) : "");
|
|
47
|
+
const created = computed(() => derivation.value?.createdAt ? formatDate(derivation.value.createdAt) : "");
|
|
48
|
+
return (_ctx, _cache) => {
|
|
49
|
+
return derivation.value && !__props.detailed ? (openBlock(), createElementBlock("div", _hoisted_1, [createVNode(unref(UIcon), {
|
|
50
|
+
name: "i-lucide-git-branch",
|
|
51
|
+
class: "size-3.5 shrink-0"
|
|
52
|
+
}), createElementVNode("span", _hoisted_2, toDisplayString([
|
|
53
|
+
unref(t)("composites.derivation.badge"),
|
|
54
|
+
method.value,
|
|
55
|
+
created.value
|
|
56
|
+
].filter(Boolean).join(" · ")), 1)])) : derivation.value && details.value ? (openBlock(), createElementBlock("div", _hoisted_3, [
|
|
57
|
+
createElementVNode("div", _hoisted_4, [
|
|
58
|
+
createElementVNode("span", { class: normalizeClass([chip, "text-[var(--sk-muted)]"]) }, [createVNode(unref(UIcon), {
|
|
59
|
+
name: "i-lucide-git-branch",
|
|
60
|
+
class: "size-3.5"
|
|
61
|
+
}), createTextVNode(toDisplayString(unref(t)("composites.derivation.badge")), 1)], 2),
|
|
62
|
+
details.value.stale ? (openBlock(), createElementBlock("span", {
|
|
63
|
+
key: 0,
|
|
64
|
+
class: normalizeClass([chip, "text-[var(--sk-warning)]"])
|
|
65
|
+
}, [createVNode(unref(UIcon), {
|
|
66
|
+
name: "i-lucide-triangle-alert",
|
|
67
|
+
class: "size-3.5"
|
|
68
|
+
}), createTextVNode(toDisplayString(unref(t)("composites.derivation.stale")), 1)], 2)) : createCommentVNode("v-if", true),
|
|
69
|
+
details.value.edited ? (openBlock(), createElementBlock("span", {
|
|
70
|
+
key: 1,
|
|
71
|
+
class: normalizeClass([chip, "text-[var(--sk-muted)]"])
|
|
72
|
+
}, [createVNode(unref(UIcon), {
|
|
73
|
+
name: "i-lucide-pencil",
|
|
74
|
+
class: "size-3.5"
|
|
75
|
+
}), createTextVNode(toDisplayString(unref(t)("composites.derivation.edited")), 1)], 2)) : createCommentVNode("v-if", true)
|
|
76
|
+
]),
|
|
77
|
+
createElementVNode("dl", _hoisted_5, [
|
|
78
|
+
createElementVNode("dt", _hoisted_6, toDisplayString(unref(t)("composites.derivation.method")), 1),
|
|
79
|
+
createElementVNode("dd", _hoisted_7, toDisplayString(method.value), 1),
|
|
80
|
+
derivation.value.model ? (openBlock(), createElementBlock(Fragment, { key: 0 }, [createElementVNode("dt", _hoisted_8, toDisplayString(unref(t)("composites.derivation.model")), 1), createElementVNode("dd", {
|
|
81
|
+
class: "truncate text-[var(--sk-fg)]",
|
|
82
|
+
title: derivation.value.model
|
|
83
|
+
}, toDisplayString(derivation.value.model), 9, _hoisted_9)], 64)) : createCommentVNode("v-if", true),
|
|
84
|
+
created.value ? (openBlock(), createElementBlock(Fragment, { key: 1 }, [createElementVNode("dt", _hoisted_10, toDisplayString(unref(t)("composites.derivation.createdAt")), 1), createElementVNode("dd", _hoisted_11, toDisplayString(created.value), 1)], 64)) : createCommentVNode("v-if", true)
|
|
85
|
+
]),
|
|
86
|
+
details.value.outputUrl ? (openBlock(), createElementBlock("a", {
|
|
87
|
+
key: 0,
|
|
88
|
+
href: details.value.outputUrl,
|
|
89
|
+
target: "_blank",
|
|
90
|
+
rel: "noopener",
|
|
91
|
+
class: "inline-flex w-fit items-center gap-1 text-[var(--sk-primary)] hover:underline"
|
|
92
|
+
}, [createVNode(unref(UIcon), {
|
|
93
|
+
name: "i-lucide-external-link",
|
|
94
|
+
class: "size-3.5"
|
|
95
|
+
}), createTextVNode(toDisplayString(unref(t)("composites.derivation.openOutput")), 1)], 8, _hoisted_12)) : createCommentVNode("v-if", true)
|
|
96
|
+
])) : createCommentVNode("v-if", true);
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
});
|
|
100
|
+
//#endregion
|
|
101
|
+
export { _sfc_main as default };
|
|
102
|
+
|
|
103
|
+
//# sourceMappingURL=DerivationBadge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DerivationBadge.js","names":["_openBlock","_createElementBlock","_createVNode","_unref","_createElementVNode","_toDisplayString","_normalizeClass","_createTextVNode","_createCommentVNode","_Fragment"],"sources":["../../../../src/features/composites/components/DerivationBadge.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport type { Node as ProseMirrorNode } from '@tiptap/pm/model'\nimport type { Editor } from '@tiptap/core'\nimport { computed } from 'vue'\nimport { useUiKit } from '../../../vue/kit/use-ui-kit'\nimport { useEditorI18n } from '../../../vue/use-editor-i18n'\nimport { derivationOf } from '../derivation'\nimport { derivationDetailsOf, derivationMethodLabel } from '../derived-chrome'\nimport { formatDate } from '../meta-display'\n\n/**\n * Where a derived Baustein comes from. Compact (the `derivation` field type): the „abgeleitet“ badge with method and\n * date. `detailed` (the details card): also the model, whether the source changed („Quelle geändert“), whether the body\n * was edited since it was generated („bearbeitet“) and a link to the stored raw output. The detailed variant hashes\n * the body, so it belongs only where one Baustein is shown.\n */\nconst props = defineProps<{ editor: Editor, node: ProseMirrorNode, detailed?: boolean }>()\n\nconst { Icon: UIcon } = useUiKit()\nconst { t } = useEditorI18n()\n\nconst derivation = computed(() => derivationOf(props.node))\nconst details = computed(() => props.detailed ? derivationDetailsOf(props.editor, props.node) : null)\nconst method = computed(() => derivation.value ? derivationMethodLabel(t, derivation.value.method) : '')\nconst created = computed(() => derivation.value?.createdAt ? formatDate(derivation.value.createdAt) : '')\n\nconst chip = 'inline-flex h-5 shrink-0 items-center gap-1 rounded-sm px-1.5 text-xs leading-none whitespace-nowrap'\n</script>\n\n<template>\n <div v-if=\"derivation && !detailed\" class=\"flex min-w-0 items-center gap-1.5 text-xs text-[var(--sk-muted)]\">\n <UIcon name=\"i-lucide-git-branch\" class=\"size-3.5 shrink-0\" />\n <span class=\"truncate\">{{ [t('composites.derivation.badge'), method, created].filter(Boolean).join(' · ') }}</span>\n </div>\n\n <div v-else-if=\"derivation && details\" class=\"flex flex-col gap-1.5 rounded-md p-2 text-xs ring ring-[var(--sk-border)]\">\n <div class=\"flex flex-wrap items-center gap-1\">\n <span :class=\"[chip, 'text-[var(--sk-muted)]']\">\n <UIcon name=\"i-lucide-git-branch\" class=\"size-3.5\" />{{ t('composites.derivation.badge') }}\n </span>\n <span v-if=\"details.stale\" :class=\"[chip, 'text-[var(--sk-warning)]']\">\n <UIcon name=\"i-lucide-triangle-alert\" class=\"size-3.5\" />{{ t('composites.derivation.stale') }}\n </span>\n <span v-if=\"details.edited\" :class=\"[chip, 'text-[var(--sk-muted)]']\">\n <UIcon name=\"i-lucide-pencil\" class=\"size-3.5\" />{{ t('composites.derivation.edited') }}\n </span>\n </div>\n <dl class=\"grid grid-cols-[auto_1fr] gap-x-2 gap-y-0.5\">\n <dt class=\"text-[var(--sk-muted)]\">{{ t('composites.derivation.method') }}</dt>\n <dd class=\"truncate text-[var(--sk-fg)]\">{{ method }}</dd>\n <template v-if=\"derivation.model\">\n <dt class=\"text-[var(--sk-muted)]\">{{ t('composites.derivation.model') }}</dt>\n <dd class=\"truncate text-[var(--sk-fg)]\" :title=\"derivation.model\">{{ derivation.model }}</dd>\n </template>\n <template v-if=\"created\">\n <dt class=\"text-[var(--sk-muted)]\">{{ t('composites.derivation.createdAt') }}</dt>\n <dd class=\"text-[var(--sk-fg)]\">{{ created }}</dd>\n </template>\n </dl>\n <a\n v-if=\"details.outputUrl\"\n :href=\"details.outputUrl\"\n target=\"_blank\"\n rel=\"noopener\"\n class=\"inline-flex w-fit items-center gap-1 text-[var(--sk-primary)] hover:underline\"\n >\n <UIcon name=\"i-lucide-external-link\" class=\"size-3.5\" />{{ t('composites.derivation.openOutput') }}\n </a>\n </div>\n</template>\n"],"mappings":"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"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { useUiKit } from "../../../vue/kit/use-ui-kit.js";
|
|
2
|
+
import { useEditorI18n } from "../../../vue/use-editor-i18n.js";
|
|
3
|
+
import { setCompositeMetaField } from "../rows.js";
|
|
4
|
+
import { metaText } from "../meta-display.js";
|
|
5
|
+
import { useCompositeRows } from "../use-composite-rows.js";
|
|
6
|
+
import { computed, createBlock, defineComponent, openBlock, unref } from "vue";
|
|
7
|
+
//#region src/features/composites/components/ReferenceFieldSelect.vue
|
|
8
|
+
/** The select of a `reference` field: the other Bausteine of the document (with a block ID, of the field's target kinds) by title. */
|
|
9
|
+
const NONE = "__none__";
|
|
10
|
+
const _sfc_main = /*@__PURE__*/ defineComponent({
|
|
11
|
+
__name: "ReferenceFieldSelect",
|
|
12
|
+
props: {
|
|
13
|
+
editor: {},
|
|
14
|
+
row: {},
|
|
15
|
+
field: {},
|
|
16
|
+
disabled: { type: Boolean },
|
|
17
|
+
size: {}
|
|
18
|
+
},
|
|
19
|
+
setup(__props) {
|
|
20
|
+
const props = __props;
|
|
21
|
+
/** Nuxt UI's select has no empty-string value: the "no reference" item travels as this sentinel. */
|
|
22
|
+
const { Select: USelect } = useUiKit();
|
|
23
|
+
const { t } = useEditorI18n();
|
|
24
|
+
const { rows } = useCompositeRows(() => props.editor);
|
|
25
|
+
const stored = computed(() => metaText(props.row, props.field));
|
|
26
|
+
const items = computed(() => [{
|
|
27
|
+
label: t("composites.field.none"),
|
|
28
|
+
value: NONE
|
|
29
|
+
}, ...rows.value.filter((candidate) => candidate.id !== null && candidate.id !== props.row.id && (!props.field.targets || props.field.targets.includes(candidate.kind))).map((candidate) => ({
|
|
30
|
+
label: `${candidate.title.trim() || t("composites.inspector.untitled")} · ${candidate.kindLabel}`,
|
|
31
|
+
value: candidate.id
|
|
32
|
+
}))]);
|
|
33
|
+
function onChoice(value) {
|
|
34
|
+
setCompositeMetaField(props.editor, props.row, props.field.key, typeof value === "string" && value !== NONE ? value : "");
|
|
35
|
+
}
|
|
36
|
+
return (_ctx, _cache) => {
|
|
37
|
+
return openBlock(), createBlock(unref(USelect), {
|
|
38
|
+
"model-value": stored.value || void 0,
|
|
39
|
+
items: items.value,
|
|
40
|
+
placeholder: unref(t)("composites.field.choose", { field: __props.field.label }),
|
|
41
|
+
"aria-label": __props.field.label,
|
|
42
|
+
disabled: __props.disabled,
|
|
43
|
+
size: __props.size,
|
|
44
|
+
class: "w-full",
|
|
45
|
+
"onUpdate:modelValue": onChoice
|
|
46
|
+
}, null, 8, [
|
|
47
|
+
"model-value",
|
|
48
|
+
"items",
|
|
49
|
+
"placeholder",
|
|
50
|
+
"aria-label",
|
|
51
|
+
"disabled",
|
|
52
|
+
"size"
|
|
53
|
+
]);
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
});
|
|
57
|
+
//#endregion
|
|
58
|
+
export { _sfc_main as default };
|
|
59
|
+
|
|
60
|
+
//# sourceMappingURL=ReferenceFieldSelect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ReferenceFieldSelect.js","names":["_openBlock","_createBlock","_unref"],"sources":["../../../../src/features/composites/components/ReferenceFieldSelect.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport type { Editor } from '@tiptap/core'\nimport { computed } from 'vue'\nimport { useUiKit } from '../../../vue/kit/use-ui-kit'\nimport { useEditorI18n } from '../../../vue/use-editor-i18n'\nimport type { CompositeMetaField } from '../kinds'\nimport { metaText } from '../meta-display'\nimport { type CompositeRow, setCompositeMetaField } from '../rows'\nimport { useCompositeRows } from '../use-composite-rows'\n\n/** The select of a `reference` field: the other Bausteine of the document (with a block ID, of the field's target kinds) by title. */\nconst props = defineProps<{\n editor: Editor\n row: CompositeRow\n field: CompositeMetaField\n disabled?: boolean\n size?: 'xs' | 'sm' | 'md'\n}>()\n\n/** Nuxt UI's select has no empty-string value: the \"no reference\" item travels as this sentinel. */\nconst NONE = '__none__'\n\nconst { Select: USelect } = useUiKit()\nconst { t } = useEditorI18n()\nconst { rows } = useCompositeRows(() => props.editor)\n\nconst stored = computed(() => metaText(props.row, props.field))\nconst items = computed(() => [\n { label: t('composites.field.none'), value: NONE },\n ...rows.value\n .filter(candidate => candidate.id !== null && candidate.id !== props.row.id && (!props.field.targets || props.field.targets.includes(candidate.kind)))\n .map(candidate => ({ label: `${candidate.title.trim() || t('composites.inspector.untitled')} · ${candidate.kindLabel}`, value: candidate.id as string })),\n])\n\nfunction onChoice(value: unknown) {\n setCompositeMetaField(props.editor, props.row, props.field.key, typeof value === 'string' && value !== NONE ? value : '')\n}\n</script>\n\n<template>\n <USelect\n :model-value=\"stored || undefined\"\n :items=\"items\"\n :placeholder=\"t('composites.field.choose', { field: field.label })\"\n :aria-label=\"field.label\"\n :disabled=\"disabled\"\n :size=\"size\"\n class=\"w-full\"\n @update:model-value=\"onChoice\"\n />\n</template>\n"],"mappings":";;;;;;;;AAoBA,MAAM,OAAO;;;;;;;;;;;EATb,MAAM,QAAQ;;EAWd,MAAM,EAAE,QAAQ,YAAY,SAAS;EACrC,MAAM,EAAE,MAAM,cAAc;EAC5B,MAAM,EAAE,SAAS,uBAAuB,MAAM,MAAM;EAEpD,MAAM,SAAS,eAAe,SAAS,MAAM,KAAK,MAAM,KAAK,CAAC;EAC9D,MAAM,QAAQ,eAAe,CAC3B;GAAE,OAAO,EAAE,uBAAuB;GAAG,OAAO;EAAK,GACjD,GAAG,KAAK,MACL,QAAO,cAAa,UAAU,OAAO,QAAQ,UAAU,OAAO,MAAM,IAAI,OAAO,CAAC,MAAM,MAAM,WAAW,MAAM,MAAM,QAAQ,SAAS,UAAU,IAAI,EAAE,CAAA,CACpJ,KAAI,eAAc;GAAE,OAAO,GAAG,UAAU,MAAM,KAAK,KAAK,EAAE,+BAA+B,EAAE,KAAK,UAAU;GAAa,OAAO,UAAU;EAAa,EAAE,CAC5J,CAAC;EAED,SAAS,SAAS,OAAgB;GAChC,sBAAsB,MAAM,QAAQ,MAAM,KAAK,MAAM,MAAM,KAAK,OAAO,UAAU,YAAY,UAAU,OAAO,QAAQ,EAAE;EAC1H;;GAIE,OAAAA,UAAA,GAAAC,YASEC,MAAA,OAAA,GAAA;IARC,eAAa,OAAA,SAAU,KAAA;IACvB,OAAO,MAAA;IACP,aAAaA,MAAA,CAAA,CAAC,CAAA,2BAAA,EAAA,OAAqC,QAAA,MAAM,MAAK,CAAA;IAC9D,cAAY,QAAA,MAAM;IAClB,UAAU,QAAA;IACV,MAAM,QAAA;IACP,OAAM;IACL,uBAAoB"}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import { useUiKit } from "../../../vue/kit/use-ui-kit.js";
|
|
2
|
+
import { useEditorI18n } from "../../../vue/use-editor-i18n.js";
|
|
3
|
+
import { referenceAttrsOf, resolveReference } from "../reference-label.js";
|
|
4
|
+
import { revealSource } from "../reveal-source.js";
|
|
5
|
+
import { computed, createBlock, createTextVNode, createVNode, defineComponent, normalizeClass, onBeforeUnmount, onMounted, openBlock, ref, shallowRef, toDisplayString, unref, withCtx, withKeys, withModifiers } from "vue";
|
|
6
|
+
import { NodeViewWrapper, nodeViewProps } from "@tiptap/vue-3";
|
|
7
|
+
//#region src/features/composites/components/ReferenceView.vue
|
|
8
|
+
/**
|
|
9
|
+
* The `reference` chip: the live short citation (or title) of the Baustein it points at, followed by its locator.
|
|
10
|
+
* A click reveals the target and, with a locator, opens its source there (page of a PDF, time of a recording); a
|
|
11
|
+
* target that no longer exists shows a greyed „gone“ label. Double click or right click opens a popover to set the
|
|
12
|
+
* locator („Stelle“) in an editable editor.
|
|
13
|
+
*/
|
|
14
|
+
const _sfc_main = /*@__PURE__*/ defineComponent({
|
|
15
|
+
__name: "ReferenceView",
|
|
16
|
+
props: nodeViewProps,
|
|
17
|
+
setup(__props) {
|
|
18
|
+
const props = __props;
|
|
19
|
+
const { Input: UInput, Popover: UPopover } = useUiKit();
|
|
20
|
+
const { t } = useEditorI18n();
|
|
21
|
+
const resolved = shallowRef(resolveReference(props.editor, referenceAttrsOf(props.node)));
|
|
22
|
+
let frame = 0;
|
|
23
|
+
function sync() {
|
|
24
|
+
cancelAnimationFrame(frame);
|
|
25
|
+
frame = requestAnimationFrame(() => {
|
|
26
|
+
if (props.editor.isDestroyed) return;
|
|
27
|
+
const next = resolveReference(props.editor, referenceAttrsOf(props.node));
|
|
28
|
+
const current = resolved.value;
|
|
29
|
+
if (next.label !== current.label || next.title !== current.title || next.gone !== current.gone) resolved.value = next;
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
onMounted(() => props.editor.on("update", sync));
|
|
33
|
+
onBeforeUnmount(() => {
|
|
34
|
+
cancelAnimationFrame(frame);
|
|
35
|
+
props.editor.off("update", sync);
|
|
36
|
+
});
|
|
37
|
+
const text = computed(() => {
|
|
38
|
+
const label = resolved.value.gone ? t("composites.reference.gone") : resolved.value.label;
|
|
39
|
+
const locator = props.node.attrs.locator;
|
|
40
|
+
return typeof locator === "string" && locator && !resolved.value.gone ? `${label}, ${locator}` : label;
|
|
41
|
+
});
|
|
42
|
+
function onClick() {
|
|
43
|
+
const target = String(props.node.attrs.target);
|
|
44
|
+
if (!props.editor.commands.revealBlock(target)) return;
|
|
45
|
+
const locator = props.node.attrs.locator;
|
|
46
|
+
if (typeof locator === "string" && locator) revealSource(props.editor, target, locator);
|
|
47
|
+
}
|
|
48
|
+
const root = ref(null);
|
|
49
|
+
const reference = { getBoundingClientRect: () => root.value?.$el.getBoundingClientRect() ?? new DOMRect() };
|
|
50
|
+
const open = ref(false);
|
|
51
|
+
const draft = ref("");
|
|
52
|
+
function openLocator() {
|
|
53
|
+
if (!props.editor.isEditable) return;
|
|
54
|
+
draft.value = typeof props.node.attrs.locator === "string" ? props.node.attrs.locator : "";
|
|
55
|
+
open.value = true;
|
|
56
|
+
}
|
|
57
|
+
function commit() {
|
|
58
|
+
open.value = false;
|
|
59
|
+
const pos = props.getPos();
|
|
60
|
+
if (typeof pos !== "number" || draft.value.trim() === (props.node.attrs.locator ?? "")) return;
|
|
61
|
+
props.editor.commands.setReferenceLocator(pos, draft.value);
|
|
62
|
+
}
|
|
63
|
+
return (_ctx, _cache) => {
|
|
64
|
+
return openBlock(), createBlock(unref(NodeViewWrapper), {
|
|
65
|
+
ref_key: "root",
|
|
66
|
+
ref: root,
|
|
67
|
+
as: "span",
|
|
68
|
+
class: normalizeClass(["reference", {
|
|
69
|
+
"is-gone": resolved.value.gone,
|
|
70
|
+
"is-selected": _ctx.selected
|
|
71
|
+
}]),
|
|
72
|
+
"data-type": "reference",
|
|
73
|
+
"data-target": _ctx.node.attrs.target,
|
|
74
|
+
title: resolved.value.gone ? void 0 : resolved.value.title,
|
|
75
|
+
role: "link",
|
|
76
|
+
onClick,
|
|
77
|
+
onDblclick: withModifiers(openLocator, ["prevent"]),
|
|
78
|
+
onContextmenu: withModifiers(openLocator, ["prevent"])
|
|
79
|
+
}, {
|
|
80
|
+
default: withCtx(() => [createTextVNode(toDisplayString(text.value) + " ", 1), createVNode(unref(UPopover), {
|
|
81
|
+
open: open.value,
|
|
82
|
+
reference,
|
|
83
|
+
content: {
|
|
84
|
+
side: "bottom",
|
|
85
|
+
align: "start",
|
|
86
|
+
sideOffset: 4,
|
|
87
|
+
onCloseAutoFocus: (event) => event.preventDefault()
|
|
88
|
+
},
|
|
89
|
+
ui: { content: "w-56 p-2" },
|
|
90
|
+
"onUpdate:open": _cache[1] || (_cache[1] = (value) => {
|
|
91
|
+
if (!value) commit();
|
|
92
|
+
})
|
|
93
|
+
}, {
|
|
94
|
+
content: withCtx(() => [createVNode(unref(UInput), {
|
|
95
|
+
modelValue: draft.value,
|
|
96
|
+
"onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => draft.value = $event),
|
|
97
|
+
size: "xs",
|
|
98
|
+
class: "w-full",
|
|
99
|
+
placeholder: unref(t)("composites.reference.locatorPlaceholder"),
|
|
100
|
+
"aria-label": unref(t)("composites.reference.locator"),
|
|
101
|
+
onKeydown: withKeys(withModifiers(commit, ["prevent"]), ["enter"])
|
|
102
|
+
}, null, 8, [
|
|
103
|
+
"modelValue",
|
|
104
|
+
"placeholder",
|
|
105
|
+
"aria-label",
|
|
106
|
+
"onKeydown"
|
|
107
|
+
])]),
|
|
108
|
+
_: 1
|
|
109
|
+
}, 8, ["open", "content"])]),
|
|
110
|
+
_: 1
|
|
111
|
+
}, 8, [
|
|
112
|
+
"class",
|
|
113
|
+
"data-target",
|
|
114
|
+
"title"
|
|
115
|
+
]);
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
});
|
|
119
|
+
//#endregion
|
|
120
|
+
export { _sfc_main as default };
|
|
121
|
+
|
|
122
|
+
//# sourceMappingURL=ReferenceView.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ReferenceView.js","names":["selected","node","_openBlock","_createBlock","_unref","_normalizeClass","_withModifiers","_withCtx","_createTextVNode","_toDisplayString","_createVNode","_withKeys"],"sources":["../../../../src/features/composites/components/ReferenceView.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { NodeViewWrapper, nodeViewProps } from '@tiptap/vue-3'\nimport { computed, onBeforeUnmount, onMounted, ref, shallowRef } from 'vue'\nimport { useUiKit } from '../../../vue/kit/use-ui-kit'\nimport { useEditorI18n } from '../../../vue/use-editor-i18n'\nimport { referenceAttrsOf, resolveReference } from '../reference-label'\nimport { revealSource } from '../reveal-source'\n\n/**\n * The `reference` chip: the live short citation (or title) of the Baustein it points at, followed by its locator.\n * A click reveals the target and, with a locator, opens its source there (page of a PDF, time of a recording); a\n * target that no longer exists shows a greyed „gone“ label. Double click or right click opens a popover to set the\n * locator („Stelle“) in an editable editor.\n */\nconst props = defineProps(nodeViewProps)\n\nconst { Input: UInput, Popover: UPopover } = useUiKit()\nconst { t } = useEditorI18n()\n\nconst resolved = shallowRef(resolveReference(props.editor, referenceAttrsOf(props.node)))\n\n// The target's title and bibliography edits change the label: re-resolve after document changes, once per frame.\nlet frame = 0\nfunction sync() {\n cancelAnimationFrame(frame)\n frame = requestAnimationFrame(() => {\n if (props.editor.isDestroyed) return\n const next = resolveReference(props.editor, referenceAttrsOf(props.node))\n const current = resolved.value\n if (next.label !== current.label || next.title !== current.title || next.gone !== current.gone) resolved.value = next\n })\n}\nonMounted(() => props.editor.on('update', sync))\nonBeforeUnmount(() => {\n cancelAnimationFrame(frame)\n props.editor.off('update', sync)\n})\n\nconst text = computed(() => {\n const label = resolved.value.gone ? t('composites.reference.gone') : resolved.value.label\n const locator = props.node.attrs.locator\n return typeof locator === 'string' && locator && !resolved.value.gone ? `${label}, ${locator}` : label\n})\n\nfunction onClick() {\n const target = String(props.node.attrs.target)\n if (!props.editor.commands.revealBlock(target)) return\n const locator = props.node.attrs.locator\n if (typeof locator === 'string' && locator) revealSource(props.editor, target, locator)\n}\n\nconst root = ref<{ $el: HTMLElement } | null>(null)\nconst reference = { getBoundingClientRect: () => root.value?.$el.getBoundingClientRect() ?? new DOMRect() }\n\nconst open = ref(false)\nconst draft = ref('')\n\nfunction openLocator() {\n if (!props.editor.isEditable) return\n draft.value = typeof props.node.attrs.locator === 'string' ? props.node.attrs.locator : ''\n open.value = true\n}\n\nfunction commit() {\n open.value = false\n const pos = props.getPos()\n if (typeof pos !== 'number' || draft.value.trim() === (props.node.attrs.locator ?? '')) return\n props.editor.commands.setReferenceLocator(pos, draft.value)\n}\n</script>\n\n<template>\n <NodeViewWrapper\n ref=\"root\"\n as=\"span\"\n :class=\"['reference', { 'is-gone': resolved.gone, 'is-selected': selected }]\"\n data-type=\"reference\"\n :data-target=\"node.attrs.target\"\n :title=\"resolved.gone ? undefined : resolved.title\"\n role=\"link\"\n @click=\"onClick\"\n @dblclick.prevent=\"openLocator\"\n @contextmenu.prevent=\"openLocator\"\n >\n {{ text }}\n <UPopover\n :open=\"open\"\n :reference=\"reference\"\n :content=\"{ side: 'bottom', align: 'start', sideOffset: 4, onCloseAutoFocus: (event: Event) => event.preventDefault() }\"\n :ui=\"{ content: 'w-56 p-2' }\"\n @update:open=\"(value: boolean) => { if (!value) commit() }\"\n >\n <template #content>\n <UInput\n v-model=\"draft\"\n size=\"xs\"\n class=\"w-full\"\n :placeholder=\"t('composites.reference.locatorPlaceholder')\"\n :aria-label=\"t('composites.reference.locator')\"\n @keydown.enter.prevent=\"commit\"\n />\n </template>\n </UPopover>\n </NodeViewWrapper>\n</template>\n"],"mappings":"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"}
|