@ecsplico/editor 3.1.1 → 3.3.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 +42 -0
- package/dist/adapters/direct-ai.d.ts +36 -0
- package/dist/adapters/direct-ai.js +169 -0
- package/dist/adapters/direct-ai.js.map +1 -0
- package/dist/adapters/memory.js.map +1 -1
- package/dist/code/CodeSurface.vue.d.ts +1 -1
- package/dist/core/block-drag.js +3 -0
- package/dist/core/block-drag.js.map +1 -1
- package/dist/core/block-transfer.d.ts +44 -0
- package/dist/core/block-transfer.js +68 -0
- package/dist/core/block-transfer.js.map +1 -0
- package/dist/core/commands.js +5 -0
- package/dist/core/commands.js.map +1 -1
- package/dist/core/core-feature.d.ts +4 -1
- package/dist/core/core-feature.js +8 -3
- package/dist/core/core-feature.js.map +1 -1
- package/dist/core/editor-ui.d.ts +3 -1
- package/dist/core/editor-ui.js.map +1 -1
- package/dist/core/extension-points.d.ts +17 -1
- package/dist/core/feature.d.ts +6 -1
- package/dist/core/feature.js.map +1 -1
- package/dist/core/index.d.ts +4 -2
- package/dist/core/index.js +3 -2
- package/dist/core/schema/index.d.ts +24 -3
- package/dist/core/schema/index.js +21 -4
- package/dist/core/schema/index.js.map +1 -1
- package/dist/core/surface-session.js +3 -1
- package/dist/core/surface-session.js.map +1 -1
- package/dist/core/toolbar-items.js +1 -1
- package/dist/core/toolbar-items.js.map +1 -1
- package/dist/document/DocumentSurface.vue.d.ts +1 -1
- package/dist/features/ai/agent-op-review.js +1 -1
- package/dist/features/ai/agent-ops.js +2 -2
- package/dist/features/ai/ai-apply.js +1 -1
- package/dist/features/ai/assistant.js +1 -1
- package/dist/features/ai/components/AiSelectionMenu.js +2 -2
- package/dist/features/ai/components/AiSidebar.js +2 -2
- package/dist/features/ai/components/SettingsAiTab.js +1 -1
- package/dist/features/ai/components/SettingsModelProfiles.js +1 -1
- package/dist/features/ai/document-chat-model.js +1 -1
- package/dist/features/ai/document-chat.js +2 -2
- package/dist/features/ai/ghost-autocomplete.js +1 -1
- package/dist/features/ai/index.d.ts +4 -3
- package/dist/features/ai/index.js +6 -5
- package/dist/features/ai/protocol/complete.d.ts +19 -0
- package/dist/features/ai/protocol/complete.js +27 -1
- package/dist/features/ai/protocol/complete.js.map +1 -1
- package/dist/features/ai/protocol/generate.d.ts +95 -0
- package/dist/features/ai/protocol/generate.js +58 -0
- package/dist/features/ai/protocol/generate.js.map +1 -0
- package/dist/features/ai/protocol/index.d.ts +4 -3
- package/dist/features/ai/protocol/index.js +6 -5
- package/dist/features/ai/protocol/tasks.d.ts +3 -1
- package/dist/features/ai/protocol/tasks.js +74 -2
- package/dist/features/ai/protocol/tasks.js.map +1 -1
- package/dist/features/ai/react/AiSelectionMenu.js +2 -2
- package/dist/features/ai/react/AiSidebar.js +2 -2
- package/dist/features/ai/react/SettingsAiTab.js +1 -1
- package/dist/features/ai/react/SettingsModelProfiles.js +1 -1
- package/dist/features/ai/selection-flow.js +1 -1
- package/dist/features/ai/sidebar-flow.js +1 -1
- package/dist/features/block-ui/block-actions.d.ts +19 -3
- package/dist/features/block-ui/block-actions.js +49 -3
- package/dist/features/block-ui/block-actions.js.map +1 -1
- package/dist/features/block-ui/components/BlockActionsOverlay.js +24 -13
- package/dist/features/block-ui/components/BlockActionsOverlay.js.map +1 -1
- package/dist/features/block-ui/components/BlockActionsOverlay.vue.d.ts +12 -5
- package/dist/features/block-ui/components/BlockUi.js +52 -20
- package/dist/features/block-ui/components/BlockUi.js.map +1 -1
- package/dist/features/block-ui/components/BlockUi.vue.d.ts +6 -4
- package/dist/features/block-ui/feature.d.ts +8 -2
- package/dist/features/block-ui/feature.js +7 -2
- package/dist/features/block-ui/feature.js.map +1 -1
- package/dist/features/block-ui/index.d.ts +3 -2
- package/dist/features/block-ui/index.js +2 -2
- package/dist/features/block-ui/react/BlockActionsOverlay.d.ts +14 -7
- package/dist/features/block-ui/react/BlockActionsOverlay.js +25 -13
- package/dist/features/block-ui/react/BlockActionsOverlay.js.map +1 -1
- package/dist/features/block-ui/react/BlockUi.d.ts +6 -4
- package/dist/features/block-ui/react/BlockUi.js +43 -15
- package/dist/features/block-ui/react/BlockUi.js.map +1 -1
- package/dist/features/block-ui/react.d.ts +4 -2
- package/dist/features/block-ui/react.js +3 -3
- package/dist/features/block-ui/react.js.map +1 -1
- package/dist/features/block-ui/vue.d.ts +4 -2
- package/dist/features/block-ui/vue.js +3 -3
- package/dist/features/block-ui/vue.js.map +1 -1
- package/dist/features/composites/baskets.d.ts +27 -0
- package/dist/features/composites/baskets.js +46 -0
- package/dist/features/composites/baskets.js.map +1 -0
- package/dist/features/composites/components/CompositeBasketMenu.js +97 -0
- package/dist/features/composites/components/CompositeBasketMenu.js.map +1 -0
- package/dist/features/composites/components/CompositeChrome.js +79 -23
- package/dist/features/composites/components/CompositeChrome.js.map +1 -1
- package/dist/features/composites/components/CompositeView.js +21 -2
- package/dist/features/composites/components/CompositeView.js.map +1 -1
- package/dist/features/composites/components/DerivationBadge.js +12 -3
- package/dist/features/composites/components/DerivationBadge.js.map +1 -1
- package/dist/features/composites/components/FocusChip.js +53 -0
- package/dist/features/composites/components/FocusChip.js.map +1 -0
- package/dist/features/composites/components/FocusChip.vue.d.ts +14 -0
- package/dist/features/composites/components/SettingsEditingTab.js +40 -4
- package/dist/features/composites/components/SettingsEditingTab.js.map +1 -1
- package/dist/features/composites/derivation.d.ts +2 -1
- package/dist/features/composites/derivation.js +5 -1
- package/dist/features/composites/derivation.js.map +1 -1
- package/dist/features/composites/derived-chrome.js +13 -3
- package/dist/features/composites/derived-chrome.js.map +1 -1
- package/dist/features/composites/feature.d.ts +7 -1
- package/dist/features/composites/feature.js +107 -23
- package/dist/features/composites/feature.js.map +1 -1
- package/dist/features/composites/focus.d.ts +38 -0
- package/dist/features/composites/focus.js +86 -0
- package/dist/features/composites/focus.js.map +1 -0
- package/dist/features/composites/index.d.ts +7 -3
- package/dist/features/composites/index.js +7 -3
- package/dist/features/composites/kinds.d.ts +6 -1
- package/dist/features/composites/kinds.js.map +1 -1
- package/dist/features/composites/merge.d.ts +24 -0
- package/dist/features/composites/merge.js +47 -0
- package/dist/features/composites/merge.js.map +1 -0
- package/dist/features/composites/meta-keys.d.ts +4 -0
- package/dist/features/composites/meta-keys.js +8 -4
- package/dist/features/composites/meta-keys.js.map +1 -1
- package/dist/features/composites/nodes.d.ts +15 -2
- package/dist/features/composites/nodes.js +61 -5
- package/dist/features/composites/nodes.js.map +1 -1
- package/dist/features/composites/outline.d.ts +4 -0
- package/dist/features/composites/outline.js +3 -0
- package/dist/features/composites/outline.js.map +1 -1
- package/dist/features/composites/react/CompositeBasketMenu.js +88 -0
- package/dist/features/composites/react/CompositeBasketMenu.js.map +1 -0
- package/dist/features/composites/react/CompositeChrome.js +52 -4
- package/dist/features/composites/react/CompositeChrome.js.map +1 -1
- package/dist/features/composites/react/CompositeView.js +15 -2
- package/dist/features/composites/react/CompositeView.js.map +1 -1
- package/dist/features/composites/react/DerivationBadge.js +10 -1
- package/dist/features/composites/react/DerivationBadge.js.map +1 -1
- package/dist/features/composites/react/FocusChip.d.ts +11 -0
- package/dist/features/composites/react/FocusChip.js +50 -0
- package/dist/features/composites/react/FocusChip.js.map +1 -0
- package/dist/features/composites/react/SettingsEditingTab.js +36 -1
- package/dist/features/composites/react/SettingsEditingTab.js.map +1 -1
- package/dist/features/composites/react.d.ts +2 -1
- package/dist/features/composites/react.js +3 -1
- package/dist/features/composites/react.js.map +1 -1
- package/dist/features/composites/schema.d.ts +5 -3
- package/dist/features/composites/schema.js +8 -4
- package/dist/features/composites/schema.js.map +1 -1
- package/dist/features/composites/split.d.ts +62 -0
- package/dist/features/composites/split.js +172 -0
- package/dist/features/composites/split.js.map +1 -0
- package/dist/features/composites/vue.d.ts +4 -3
- package/dist/features/composites/vue.js +7 -5
- package/dist/features/composites/vue.js.map +1 -1
- package/dist/features/transfer/components/TransferMenu.js +93 -0
- package/dist/features/transfer/components/TransferMenu.js.map +1 -0
- package/dist/features/transfer/components/TransferMenu.vue.d.ts +15 -0
- package/dist/features/transfer/feature.d.ts +76 -0
- package/dist/features/transfer/feature.js +169 -0
- package/dist/features/transfer/feature.js.map +1 -0
- package/dist/features/transfer/index.d.ts +3 -0
- package/dist/features/transfer/index.js +3 -0
- package/dist/features/transfer/react/TransferMenu.d.ts +12 -0
- package/dist/features/transfer/react/TransferMenu.js +71 -0
- package/dist/features/transfer/react/TransferMenu.js.map +1 -0
- package/dist/features/transfer/react.d.ts +10 -0
- package/dist/features/transfer/react.js +11 -0
- package/dist/features/transfer/react.js.map +1 -0
- package/dist/features/transfer/transforms.d.ts +83 -0
- package/dist/features/transfer/transforms.js +137 -0
- package/dist/features/transfer/transforms.js.map +1 -0
- package/dist/features/transfer/vue.d.ts +9 -0
- package/dist/features/transfer/vue.js +11 -0
- package/dist/features/transfer/vue.js.map +1 -0
- package/dist/i18n/de/ai.js +4 -0
- package/dist/i18n/de/ai.js.map +1 -1
- package/dist/i18n/de/composites.js +21 -1
- package/dist/i18n/de/composites.js.map +1 -1
- package/dist/i18n/de/integrations.js +16 -0
- package/dist/i18n/de/integrations.js.map +1 -1
- package/dist/i18n/de/transfer.js +17 -0
- package/dist/i18n/de/transfer.js.map +1 -0
- package/dist/i18n/de/tree.js +7 -0
- package/dist/i18n/de/tree.js.map +1 -1
- package/dist/i18n/de.d.ts +57 -0
- package/dist/i18n/de.js +3 -1
- package/dist/i18n/de.js.map +1 -1
- package/dist/i18n/en/ai.js +4 -0
- package/dist/i18n/en/ai.js.map +1 -1
- package/dist/i18n/en/composites.js +21 -1
- package/dist/i18n/en/composites.js.map +1 -1
- package/dist/i18n/en/integrations.js +16 -0
- package/dist/i18n/en/integrations.js.map +1 -1
- package/dist/i18n/en/transfer.js +17 -0
- package/dist/i18n/en/transfer.js.map +1 -0
- package/dist/i18n/en/tree.js +7 -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/integrations/composite-ai/composite-fill.js +1 -1
- package/dist/integrations/composite-ai/composite-summary.js +1 -1
- package/dist/integrations/composite-ai/derive.d.ts +21 -0
- package/dist/integrations/composite-ai/derive.js +69 -47
- package/dist/integrations/composite-ai/derive.js.map +1 -1
- package/dist/integrations/composite-ai/index.d.ts +8 -3
- package/dist/integrations/composite-ai/index.js +50 -4
- package/dist/integrations/composite-ai/index.js.map +1 -1
- package/dist/integrations/composite-ai/outline-sanitize.d.ts +48 -0
- package/dist/integrations/composite-ai/outline-sanitize.js +175 -0
- package/dist/integrations/composite-ai/outline-sanitize.js.map +1 -0
- package/dist/integrations/composite-ai/split.d.ts +44 -0
- package/dist/integrations/composite-ai/split.js +187 -0
- package/dist/integrations/composite-ai/split.js.map +1 -0
- package/dist/integrations/composite-ai/transfer-transforms.d.ts +27 -0
- package/dist/integrations/composite-ai/transfer-transforms.js +153 -0
- package/dist/integrations/composite-ai/transfer-transforms.js.map +1 -0
- package/dist/integrations/transcript-ai/protocol.d.ts +13 -0
- package/dist/integrations/transcript-ai/protocol.js +49 -1
- package/dist/integrations/transcript-ai/protocol.js.map +1 -1
- package/dist/integrations/transcript-ai/transcript-cleanup.js +1 -1
- package/dist/markdown/MarkdownSurface.vue.d.ts +1 -1
- package/dist/nuxt/module.d.ts +114 -0
- package/dist/presets/compose.d.ts +24 -8
- package/dist/presets/compose.js +117 -58
- package/dist/presets/compose.js.map +1 -1
- package/dist/react/compose.js +5 -1
- package/dist/react/compose.js.map +1 -1
- package/dist/react/composed-surface.d.ts +9 -0
- package/dist/react/composed-surface.js +4 -1
- package/dist/react/composed-surface.js.map +1 -1
- package/dist/server/ai.d.ts +2 -5
- package/dist/server/ai.js.map +1 -1
- package/dist/server/handlers/ai.d.ts +4 -75
- package/dist/server/handlers/ai.js +30 -94
- package/dist/server/handlers/ai.js.map +1 -1
- package/dist/server/handlers/editor.d.ts +1 -0
- package/dist/server/handlers/index.d.ts +3 -1
- package/dist/server/handlers/index.js +3 -1
- package/dist/server/index.d.ts +2 -1
- package/dist/settings/index.d.ts +8 -0
- package/dist/settings/index.js +16 -4
- package/dist/settings/index.js.map +1 -1
- package/dist/styles/composites.css +41 -0
- package/dist/tree/DocumentTree.js +246 -80
- package/dist/tree/DocumentTree.js.map +1 -1
- package/dist/tree/drop-rules.js +8 -0
- package/dist/tree/drop-rules.js.map +1 -1
- package/dist/tree/react/DocumentTree.js +164 -32
- package/dist/tree/react/DocumentTree.js.map +1 -1
- package/dist/tree/tree-host.js +41 -2
- package/dist/tree/tree-host.js.map +1 -1
- package/dist/tree/tree-items.js +53 -5
- package/dist/tree/tree-items.js.map +1 -1
- package/dist/tree/tree-model.js +122 -10
- package/dist/tree/tree-model.js.map +1 -1
- package/dist/tree/tree-rows.js +20 -7
- package/dist/tree/tree-rows.js.map +1 -1
- package/dist/tree/tree-view-model.d.ts +5 -0
- package/dist/tree/tree-view-model.js +13 -0
- package/dist/tree/tree-view-model.js.map +1 -1
- package/dist/vue/AdvancedEditor.js +6 -0
- package/dist/vue/AdvancedEditor.js.map +1 -1
- package/dist/vue/AdvancedEditor.vue.d.ts +9 -1
- package/dist/vue/compose.js +5 -1
- package/dist/vue/compose.js.map +1 -1
- package/package.json +21 -1
|
@@ -2,6 +2,7 @@ import { createStore } from "../core/store.js";
|
|
|
2
2
|
import { FOLDER_KEY_PREFIX, folderKey, remapFolderPath } from "./folder-paths.js";
|
|
3
3
|
//#region src/tree/tree-view-model.ts
|
|
4
4
|
const NODE_FILTERS_KEY = "tip-tree:node-filters";
|
|
5
|
+
const BASKET_FILTER_KEY = "tip-tree:basket-filter";
|
|
5
6
|
function readStored(key, fallback, isValid) {
|
|
6
7
|
try {
|
|
7
8
|
const raw = localStorage.getItem(key);
|
|
@@ -18,6 +19,7 @@ function writeStored(key, value) {
|
|
|
18
19
|
} catch {}
|
|
19
20
|
}
|
|
20
21
|
const isNodeFilters = (value) => typeof value === "object" && value !== null && !Array.isArray(value) && Object.values(value).every((kinds) => Array.isArray(kinds) && kinds.every((kind) => typeof kind === "string"));
|
|
22
|
+
const isStringList = (value) => Array.isArray(value) && value.every((item) => typeof item === "string");
|
|
21
23
|
/**
|
|
22
24
|
* A view model of its own: `nodeFilters` is read from localStorage once and written back on every change (a model that
|
|
23
25
|
* is dropped takes its subscription with it, there is nothing to dispose).
|
|
@@ -25,9 +27,12 @@ const isNodeFilters = (value) => typeof value === "object" && value !== null &&
|
|
|
25
27
|
function createTreeView() {
|
|
26
28
|
const nodeFilters = createStore("window" in globalThis ? readStored(NODE_FILTERS_KEY, {}, isNodeFilters) : {});
|
|
27
29
|
nodeFilters.subscribe((value) => writeStored(NODE_FILTERS_KEY, value));
|
|
30
|
+
const basketFilter = createStore("window" in globalThis ? readStored(BASKET_FILTER_KEY, [], isStringList) : []);
|
|
31
|
+
basketFilter.subscribe((value) => writeStored(BASKET_FILTER_KEY, value));
|
|
28
32
|
const expanded = createStore([]);
|
|
29
33
|
return {
|
|
30
34
|
nodeFilters,
|
|
35
|
+
basketFilter,
|
|
31
36
|
expanded,
|
|
32
37
|
expand(keys) {
|
|
33
38
|
const current = expanded.get();
|
|
@@ -47,6 +52,14 @@ function createTreeView() {
|
|
|
47
52
|
const { [key]: _previous, ...others } = nodeFilters.get();
|
|
48
53
|
nodeFilters.set(others);
|
|
49
54
|
},
|
|
55
|
+
setBasketShown(id, shown) {
|
|
56
|
+
const current = basketFilter.get();
|
|
57
|
+
if (current.includes(id) === shown) return;
|
|
58
|
+
basketFilter.set(shown ? [...current, id] : current.filter((other) => other !== id));
|
|
59
|
+
},
|
|
60
|
+
clearBasketFilter() {
|
|
61
|
+
if (basketFilter.get().length) basketFilter.set([]);
|
|
62
|
+
},
|
|
50
63
|
clearAllFilters() {
|
|
51
64
|
nodeFilters.set({});
|
|
52
65
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tree-view-model.js","names":[],"sources":["../../src/tree/tree-view-model.ts"],"sourcesContent":["import type { EditorContext } from '../core/context'\nimport { createStore, type Store } from '../core/store'\nimport { FOLDER_KEY_PREFIX, folderKey, remapFolderPath } from './folder-paths'\n\nconst NODE_FILTERS_KEY = 'tip-tree:node-filters'\n\n/** Hidden kind ids per tree item key. */\nexport type NodeFilters = Record<string, string[]>\n\nfunction readStored<T>(key: string, fallback: T, isValid: (value: unknown) => value is T): T {\n try {\n const raw = localStorage.getItem(key)\n if (raw !== null) {\n const value: unknown = JSON.parse(raw)\n if (isValid(value)) return value\n }\n } catch { /* unavailable or corrupt storage: use the default */ }\n return fallback\n}\n\nfunction writeStored(key: string, value: unknown) {\n try {\n localStorage.setItem(key, JSON.stringify(value))\n } catch { /* storage full or blocked: the setting then lasts for this session only */ }\n}\n\nconst isNodeFilters = (value: unknown): value is NodeFilters =>\n typeof value === 'object' && value !== null && !Array.isArray(value)\n && Object.values(value).every(kinds => Array.isArray(kinds) && kinds.every(kind => typeof kind === 'string'))\n\n/** The view state of the file browser; see `createTreeView`. */\nexport interface TreeViewModel {\n /** The kinds hidden below each tree item, by item key. Persists in localStorage. Replace, never mutate. */\n nodeFilters: Store<NodeFilters>\n /** Keys of the open tree items; lasts for the session. Replace, never mutate. */\n expanded: Store<string[]>\n /** Opens the items (already open ones are left alone). */\n expand(keys: readonly string[]): void\n /** Hides (`hidden`) or shows `kind` below the item. */\n setKindHidden(key: string, kind: string, hidden: boolean): void\n clearFilter(key: string): void\n clearAllFilters(): void\n /** Follows a folder moved from `from` to `to`: open folder items of it and below it get the new path. */\n followFolderMove(from: string, to: string): void\n}\n\n/**\n * A view model of its own: `nodeFilters` is read from localStorage once and written back on every change (a model that\n * is dropped takes its subscription with it, there is nothing to dispose).\n */\nexport function createTreeView(): TreeViewModel {\n const nodeFilters = createStore<NodeFilters>('window' in globalThis ? readStored<NodeFilters>(NODE_FILTERS_KEY, {}, isNodeFilters) : {})\n nodeFilters.subscribe(value => writeStored(NODE_FILTERS_KEY, value))\n const expanded = createStore<string[]>([])\n return {\n nodeFilters,\n expanded,\n expand(keys) {\n const current = expanded.get()\n const missing = keys.filter(key => !current.includes(key))\n if (missing.length) expanded.set([...current, ...missing])\n },\n setKindHidden(key, kind, hidden) {\n const filters = nodeFilters.get()\n const rest = (filters[key] ?? []).filter(id => id !== kind)\n const { [key]: _previous, ...others } = filters\n nodeFilters.set(rest.length || hidden ? { ...others, [key]: hidden ? [...rest, kind] : rest } : others)\n },\n clearFilter(key) {\n const { [key]: _previous, ...others } = nodeFilters.get()\n nodeFilters.set(others)\n },\n clearAllFilters() {\n nodeFilters.set({})\n },\n followFolderMove(from, to) {\n expanded.set(expanded.get().map(key => (key.startsWith(FOLDER_KEY_PREFIX) ? folderKey(remapFolderPath(key.slice(FOLDER_KEY_PREFIX.length), from, to)) : key)))\n },\n }\n}\n\nconst views = new WeakMap<EditorContext, TreeViewModel>()\n\n/** The view model shared by every tree of one editor context (one app): created on first use, then cached. */\nexport function treeView(ctx: EditorContext): TreeViewModel {\n let view = views.get(ctx)\n if (!view) {\n view = createTreeView()\n views.set(ctx, view)\n }\n return view\n}\n"],"mappings":";;;AAIA,MAAM,mBAAmB;
|
|
1
|
+
{"version":3,"file":"tree-view-model.js","names":[],"sources":["../../src/tree/tree-view-model.ts"],"sourcesContent":["import type { EditorContext } from '../core/context'\nimport { createStore, type Store } from '../core/store'\nimport { FOLDER_KEY_PREFIX, folderKey, remapFolderPath } from './folder-paths'\n\nconst NODE_FILTERS_KEY = 'tip-tree:node-filters'\nconst BASKET_FILTER_KEY = 'tip-tree:basket-filter'\n\n/** Hidden kind ids per tree item key. */\nexport type NodeFilters = Record<string, string[]>\n\nfunction readStored<T>(key: string, fallback: T, isValid: (value: unknown) => value is T): T {\n try {\n const raw = localStorage.getItem(key)\n if (raw !== null) {\n const value: unknown = JSON.parse(raw)\n if (isValid(value)) return value\n }\n } catch { /* unavailable or corrupt storage: use the default */ }\n return fallback\n}\n\nfunction writeStored(key: string, value: unknown) {\n try {\n localStorage.setItem(key, JSON.stringify(value))\n } catch { /* storage full or blocked: the setting then lasts for this session only */ }\n}\n\nconst isNodeFilters = (value: unknown): value is NodeFilters =>\n typeof value === 'object' && value !== null && !Array.isArray(value)\n && Object.values(value).every(kinds => Array.isArray(kinds) && kinds.every(kind => typeof kind === 'string'))\n\nconst isStringList = (value: unknown): value is string[] => Array.isArray(value) && value.every(item => typeof item === 'string')\n\n/** The view state of the file browser; see `createTreeView`. */\nexport interface TreeViewModel {\n /** The kinds hidden below each tree item, by item key. Persists in localStorage. Replace, never mutate. */\n nodeFilters: Store<NodeFilters>\n /** The basket ids whose Bausteine the tree shows; `[]` = all of them. Persists in localStorage. Replace, never mutate. */\n basketFilter: Store<string[]>\n /** Keys of the open tree items; lasts for the session. Replace, never mutate. */\n expanded: Store<string[]>\n /** Opens the items (already open ones are left alone). */\n expand(keys: readonly string[]): void\n /** Hides (`hidden`) or shows `kind` below the item. */\n setKindHidden(key: string, kind: string, hidden: boolean): void\n clearFilter(key: string): void\n clearAllFilters(): void\n /** Shows (`shown`) or stops showing the Bausteine of the basket. */\n setBasketShown(id: string, shown: boolean): void\n clearBasketFilter(): void\n /** Follows a folder moved from `from` to `to`: open folder items of it and below it get the new path. */\n followFolderMove(from: string, to: string): void\n}\n\n/**\n * A view model of its own: `nodeFilters` is read from localStorage once and written back on every change (a model that\n * is dropped takes its subscription with it, there is nothing to dispose).\n */\nexport function createTreeView(): TreeViewModel {\n const nodeFilters = createStore<NodeFilters>('window' in globalThis ? readStored<NodeFilters>(NODE_FILTERS_KEY, {}, isNodeFilters) : {})\n nodeFilters.subscribe(value => writeStored(NODE_FILTERS_KEY, value))\n const basketFilter = createStore<string[]>('window' in globalThis ? readStored<string[]>(BASKET_FILTER_KEY, [], isStringList) : [])\n basketFilter.subscribe(value => writeStored(BASKET_FILTER_KEY, value))\n const expanded = createStore<string[]>([])\n return {\n nodeFilters,\n basketFilter,\n expanded,\n expand(keys) {\n const current = expanded.get()\n const missing = keys.filter(key => !current.includes(key))\n if (missing.length) expanded.set([...current, ...missing])\n },\n setKindHidden(key, kind, hidden) {\n const filters = nodeFilters.get()\n const rest = (filters[key] ?? []).filter(id => id !== kind)\n const { [key]: _previous, ...others } = filters\n nodeFilters.set(rest.length || hidden ? { ...others, [key]: hidden ? [...rest, kind] : rest } : others)\n },\n clearFilter(key) {\n const { [key]: _previous, ...others } = nodeFilters.get()\n nodeFilters.set(others)\n },\n setBasketShown(id, shown) {\n const current = basketFilter.get()\n if (current.includes(id) === shown) return\n basketFilter.set(shown ? [...current, id] : current.filter(other => other !== id))\n },\n clearBasketFilter() {\n if (basketFilter.get().length) basketFilter.set([])\n },\n clearAllFilters() {\n nodeFilters.set({})\n },\n followFolderMove(from, to) {\n expanded.set(expanded.get().map(key => (key.startsWith(FOLDER_KEY_PREFIX) ? folderKey(remapFolderPath(key.slice(FOLDER_KEY_PREFIX.length), from, to)) : key)))\n },\n }\n}\n\nconst views = new WeakMap<EditorContext, TreeViewModel>()\n\n/** The view model shared by every tree of one editor context (one app): created on first use, then cached. */\nexport function treeView(ctx: EditorContext): TreeViewModel {\n let view = views.get(ctx)\n if (!view) {\n view = createTreeView()\n views.set(ctx, view)\n }\n return view\n}\n"],"mappings":";;;AAIA,MAAM,mBAAmB;AACzB,MAAM,oBAAoB;AAK1B,SAAS,WAAc,KAAa,UAAa,SAA4C;CAC3F,IAAI;EACF,MAAM,MAAM,aAAa,QAAQ,GAAG;EACpC,IAAI,QAAQ,MAAM;GAChB,MAAM,QAAiB,KAAK,MAAM,GAAG;GACrC,IAAI,QAAQ,KAAK,GAAG,OAAO;EAC7B;CACF,QAAQ,CAAwD;CAChE,OAAO;AACT;AAEA,SAAS,YAAY,KAAa,OAAgB;CAChD,IAAI;EACF,aAAa,QAAQ,KAAK,KAAK,UAAU,KAAK,CAAC;CACjD,QAAQ,CAA8E;AACxF;AAEA,MAAM,iBAAiB,UACrB,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK,KAChE,OAAO,OAAO,KAAK,CAAC,CAAC,OAAM,UAAS,MAAM,QAAQ,KAAK,KAAK,MAAM,OAAM,SAAQ,OAAO,SAAS,QAAQ,CAAC;AAE9G,MAAM,gBAAgB,UAAsC,MAAM,QAAQ,KAAK,KAAK,MAAM,OAAM,SAAQ,OAAO,SAAS,QAAQ;;;;;AA2BhI,SAAgB,iBAAgC;CAC9C,MAAM,cAAc,YAAyB,YAAY,aAAa,WAAwB,kBAAkB,CAAC,GAAG,aAAa,IAAI,CAAC,CAAC;CACvI,YAAY,WAAU,UAAS,YAAY,kBAAkB,KAAK,CAAC;CACnE,MAAM,eAAe,YAAsB,YAAY,aAAa,WAAqB,mBAAmB,CAAC,GAAG,YAAY,IAAI,CAAC,CAAC;CAClI,aAAa,WAAU,UAAS,YAAY,mBAAmB,KAAK,CAAC;CACrE,MAAM,WAAW,YAAsB,CAAC,CAAC;CACzC,OAAO;EACL;EACA;EACA;EACA,OAAO,MAAM;GACX,MAAM,UAAU,SAAS,IAAI;GAC7B,MAAM,UAAU,KAAK,QAAO,QAAO,CAAC,QAAQ,SAAS,GAAG,CAAC;GACzD,IAAI,QAAQ,QAAQ,SAAS,IAAI,CAAC,GAAG,SAAS,GAAG,OAAO,CAAC;EAC3D;EACA,cAAc,KAAK,MAAM,QAAQ;GAC/B,MAAM,UAAU,YAAY,IAAI;GAChC,MAAM,QAAQ,QAAQ,QAAQ,CAAC,EAAA,CAAG,QAAO,OAAM,OAAO,IAAI;GAC1D,MAAM,GAAG,MAAM,WAAW,GAAG,WAAW;GACxC,YAAY,IAAI,KAAK,UAAU,SAAS;IAAE,GAAG;KAAS,MAAM,SAAS,CAAC,GAAG,MAAM,IAAI,IAAI;GAAK,IAAI,MAAM;EACxG;EACA,YAAY,KAAK;GACf,MAAM,GAAG,MAAM,WAAW,GAAG,WAAW,YAAY,IAAI;GACxD,YAAY,IAAI,MAAM;EACxB;EACA,eAAe,IAAI,OAAO;GACxB,MAAM,UAAU,aAAa,IAAI;GACjC,IAAI,QAAQ,SAAS,EAAE,MAAM,OAAO;GACpC,aAAa,IAAI,QAAQ,CAAC,GAAG,SAAS,EAAE,IAAI,QAAQ,QAAO,UAAS,UAAU,EAAE,CAAC;EACnF;EACA,oBAAoB;GAClB,IAAI,aAAa,IAAI,CAAC,CAAC,QAAQ,aAAa,IAAI,CAAC,CAAC;EACpD;EACA,kBAAkB;GAChB,YAAY,IAAI,CAAC,CAAC;EACpB;EACA,iBAAiB,MAAM,IAAI;GACzB,SAAS,IAAI,SAAS,IAAI,CAAC,CAAC,KAAI,QAAQ,IAAI,WAAA,SAA4B,IAAI,UAAU,gBAAgB,IAAI,MAAM,kBAAkB,MAAM,GAAG,MAAM,EAAE,CAAC,IAAI,GAAI,CAAC;EAC/J;CACF;AACF;AAEA,MAAM,wBAAQ,IAAI,QAAsC;;AAGxD,SAAgB,SAAS,KAAmC;CAC1D,IAAI,OAAO,MAAM,IAAI,GAAG;CACxB,IAAI,CAAC,MAAM;EACT,OAAO,eAAe;EACtB,MAAM,IAAI,KAAK,IAAI;CACrB;CACA,OAAO;AACT"}
|
|
@@ -14,6 +14,9 @@ const _sfc_main = /*@__PURE__*/ defineComponent({
|
|
|
14
14
|
extensions: {},
|
|
15
15
|
blockActions: {},
|
|
16
16
|
compositeKinds: {},
|
|
17
|
+
compositeBaskets: {},
|
|
18
|
+
blockUi: {},
|
|
19
|
+
coreContent: {},
|
|
17
20
|
content: { default: "rich" },
|
|
18
21
|
interaction: { default: "full" },
|
|
19
22
|
ai: {
|
|
@@ -64,6 +67,9 @@ const _sfc_main = /*@__PURE__*/ defineComponent({
|
|
|
64
67
|
backend: props.backend ?? app.backend,
|
|
65
68
|
collaboration: props.collaboration !== void 0,
|
|
66
69
|
...props.compositeKinds && { compositeKinds: props.compositeKinds },
|
|
70
|
+
...props.compositeBaskets && { compositeBaskets: props.compositeBaskets },
|
|
71
|
+
...props.blockUi && { blockUi: props.blockUi },
|
|
72
|
+
...props.coreContent && { coreContent: props.coreContent },
|
|
67
73
|
...props.add && { add: props.add },
|
|
68
74
|
...props.remove && { remove: props.remove }
|
|
69
75
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AdvancedEditor.js","names":["_useModel","_openBlock","_createBlock","EditorSurface","_unref"],"sources":["../../src/vue/AdvancedEditor.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport type { AnyExtension, Editor, JSONContent } from '@tiptap/vue-3'\nimport { type Component, computed, useTemplateRef } from 'vue'\nimport EditorSurface from './components/EditorSurface.vue'\nimport type { CommandDef } from '../core/commands'\nimport type { AbilitiesOptions, BlockAction } from '../core/extension-points'\nimport type { EditorBackend } from '../core/backend'\nimport type { CollaborationSession, EditorFeature } from '../core/feature'\nimport type { EditorMetadata, MetadataItem } from '../core/metadata-types'\nimport type { CompositeKind } from '../features/composites'\nimport type { ContentLevel, FeatureId, InteractionLevel } from '../presets/compose'\nimport { useEditorContext } from './context'\nimport { composeEditor } from './compose'\n\ndefineOptions({ inheritAttrs: false })\n\nconst props = withDefaults(defineProps<{\n /** Collaborative mode: the Y.Doc is the document; `provider` adds remote carets, labelled with `user`. Fixed at mount. */\n collaboration?: CollaborationSession\n /** Standalone mode (without `collaboration`): TipTap JSON via `v-model`; the editor keeps its own undo history. */\n modelValue?: JSONContent\n /** Host lists (`mentions`, `hashtags`, `speakers`, custom); missing ones fall back to the features' built-in lists. */\n metadata?: EditorMetadata\n /**\n * Deep-merged into the `Abilities` defaults (`configure()`): `root` replaces `ROOT_ABILITIES`, `rules` add to or\n * override `DEFAULT_ABILITY_RULES` per type. Read once at setup.\n */\n abilities?: Partial<AbilitiesOptions>\n /** Added after the built-in extensions; read once at setup. */\n extensions?: AnyExtension[]\n /** Hover actions shown after the defaults (AI, convert, duplicate, delete, composite actions), on blocks with their `ability`. */\n blockActions?: BlockAction[]\n /** Composite kinds („Bausteine“) offered in the editor (default: `defaultCompositeKinds(t)`); read once at setup. */\n compositeKinds?: CompositeKind[]\n /** Document model: a level (`basic`, `rich`) or the content feature ids to install; read once at setup. */\n content?: ContentLevel | readonly FeatureId[]\n /** Editing UX: a level (`minimal`, `full`) or the interaction feature ids; `[]` = no interaction (a viewer); read once at setup. */\n interaction?: InteractionLevel | readonly FeatureId[]\n /** Installs the AI feature and the integrations whose content is present; read once at setup. */\n ai?: boolean\n /** Host features, appended after the catalog; read once at setup. */\n add?: readonly EditorFeature<Component>[]\n /** Features (catalog or host) left out, with the features that require them; read once at setup. */\n remove?: readonly FeatureId[]\n /** The backend the composition is pruned by (default: the editor context's backend); read once at setup. */\n backend?: EditorBackend\n /**\n * Builds the final commands (toolbar, `/` menu) from the default ones (incl. one per composite kind); absent = the\n * defaults. Host commands with an `ability` are enabled only where the caret has it, like the defaults. Read once at setup.\n */\n commands?: (defaults: CommandDef[]) => CommandDef[]\n /** Document whose package stores the uploads (`backend.assets`); standalone editors use the shared `scratch` owner. Read once at setup. */\n documentId?: string\n editable?: boolean\n /** `internal`: the editor owns its settings modal; `external`: it emits `settingsOpen` and the host shows `EditorSettingsPanel`/`Modal`. */\n settingsUi?: 'internal' | 'external'\n}>(), { editable: true, settingsUi: 'internal', content: 'rich', interaction: 'full', ai: true })\n\nconst emit = defineEmits<{\n 'ready': [editor: Editor]\n 'update:modelValue': [content: JSONContent]\n 'metadataCreate': [list: string, item: MetadataItem]\n /** The JSON handed in (initially or later) does not fit the advanced schema; the last valid document stays. */\n 'contentError': [error: Error]\n /** `settingsUi: 'external'`: the editor asks the host to open its settings (on `tab` when given). */\n 'settingsOpen': [tab?: string]\n}>()\n\n/** Whether this editor's AI sidebar is open (`toggleSidebar`, Mod-Shift-k): hosts bind it (`v-model:sidebar-open`) and show their `AiSidebar` beside the editor while it is true. */\nconst sidebarOpen = defineModel<boolean>('sidebarOpen', { default: false })\n/** Whether this editor's comments margin is open (`toggleComments`, Mod-Shift-m; margin layout of a collaborative editor): hosts bind it (`v-model:comments-open`) and show their `CommentsMargin` beside the text while it is true. Opening it closes the AI sidebar and vice versa. */\nconst commentsOpen = defineModel<boolean>('commentsOpen', { default: false })\n\n// The preset is fixed at setup like the kinds it is built from; hosts remount (`key`) to change it.\nconst app = useEditorContext()\nconst preset = composeEditor({\n content: props.content,\n interaction: props.interaction,\n ai: props.ai,\n backend: props.backend ?? app.backend,\n // A `collaboration` session is the host's own: `collab` and `comments` stay whatever the backend offers.\n collaboration: props.collaboration !== undefined,\n ...(props.compositeKinds && { compositeKinds: props.compositeKinds }),\n ...(props.add && { add: props.add }),\n ...(props.remove && { remove: props.remove }),\n})\nconst surface = useTemplateRef<InstanceType<typeof EditorSurface>>('surface')\n\n/** `editor`: the surface's editor once mounted. `preset`: the composed preset (its `omitted` lists what the backend or `remove` dropped). */\ndefineExpose({ editor: computed(() => surface.value?.editor), preset })\n</script>\n\n<template>\n <EditorSurface\n ref=\"surface\"\n v-model:sidebar-open=\"sidebarOpen\"\n v-model:comments-open=\"commentsOpen\"\n :preset=\"preset\"\n :collaboration=\"props.collaboration\"\n :model-value=\"props.modelValue\"\n :metadata=\"props.metadata\"\n :abilities=\"props.abilities\"\n :extensions=\"props.extensions\"\n :block-actions=\"props.blockActions\"\n :commands=\"props.commands\"\n :document-id=\"props.documentId\"\n :editable=\"props.editable\"\n :settings-ui=\"props.settingsUi\"\n @ready=\"emit('ready', $event)\"\n @update:model-value=\"emit('update:modelValue', $event)\"\n @metadata-create=\"(list, item) => emit('metadataCreate', list, item)\"\n @content-error=\"emit('contentError', $event)\"\n @settings-open=\"emit('settingsOpen', $event)\"\n />\n</template>\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"AdvancedEditor.js","names":["_useModel","_openBlock","_createBlock","EditorSurface","_unref"],"sources":["../../src/vue/AdvancedEditor.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport type { AnyExtension, Editor, JSONContent } from '@tiptap/vue-3'\nimport { type Component, computed, useTemplateRef } from 'vue'\nimport EditorSurface from './components/EditorSurface.vue'\nimport type { CommandDef } from '../core/commands'\nimport type { AbilitiesOptions, BlockAction, BlockUiOptions } from '../core/extension-points'\nimport type { EditorBackend } from '../core/backend'\nimport type { CollaborationSession, EditorFeature } from '../core/feature'\nimport type { EditorMetadata, MetadataItem } from '../core/metadata-types'\nimport type { CoreContentOptions } from '../core/schema'\nimport type { Basket, CompositeKind } from '../features/composites'\nimport type { ContentLevel, FeatureId, InteractionLevel } from '../presets/compose'\nimport { useEditorContext } from './context'\nimport { composeEditor } from './compose'\n\ndefineOptions({ inheritAttrs: false })\n\nconst props = withDefaults(defineProps<{\n /** Collaborative mode: the Y.Doc is the document; `provider` adds remote carets, labelled with `user`. Fixed at mount. */\n collaboration?: CollaborationSession\n /** Standalone mode (without `collaboration`): TipTap JSON via `v-model`; the editor keeps its own undo history. */\n modelValue?: JSONContent\n /** Host lists (`mentions`, `hashtags`, `speakers`, custom); missing ones fall back to the features' built-in lists. */\n metadata?: EditorMetadata\n /**\n * Deep-merged into the `Abilities` defaults (`configure()`): `root` replaces `ROOT_ABILITIES`, `rules` add to or\n * override `DEFAULT_ABILITY_RULES` per type. Read once at setup.\n */\n abilities?: Partial<AbilitiesOptions>\n /** Added after the built-in extensions; read once at setup. */\n extensions?: AnyExtension[]\n /** Hover actions shown after the defaults (AI, convert, duplicate, delete, composite actions), on blocks with their `ability`. */\n blockActions?: BlockAction[]\n /** Composite kinds („Bausteine“) offered in the editor (default: `defaultCompositeKinds(t)`); read once at setup. */\n compositeKinds?: CompositeKind[]\n /** Colour baskets a Baustein can sit in (default: `defaultBaskets(t)`); read once at setup. */\n compositeBaskets?: Basket[]\n /** Which surfaces render block actions: the hover bar (default), the selected-block toolbar, `'both'` or `'none'` (`BlockUiOptions`); read once at setup. */\n blockUi?: BlockUiOptions\n /** Optional structures the content base drops from the schema: headings or heading levels, lists, blockquote, code block, rule (`CoreContentOptions`); read once at setup. */\n coreContent?: CoreContentOptions\n /** Document model: a level (`basic`, `rich`) or the content feature ids to install; read once at setup. */\n content?: ContentLevel | readonly FeatureId[]\n /** Editing UX: a level (`minimal`, `full`) or the interaction feature ids; `[]` = no interaction (a viewer); read once at setup. */\n interaction?: InteractionLevel | readonly FeatureId[]\n /** Installs the AI feature and the integrations whose content is present; read once at setup. */\n ai?: boolean\n /** Host features, appended after the catalog; read once at setup. */\n add?: readonly EditorFeature<Component>[]\n /** Features (catalog or host) left out, with the features that require them; read once at setup. */\n remove?: readonly FeatureId[]\n /** The backend the composition is pruned by (default: the editor context's backend); read once at setup. */\n backend?: EditorBackend\n /**\n * Builds the final commands (toolbar, `/` menu) from the default ones (incl. one per composite kind); absent = the\n * defaults. Host commands with an `ability` are enabled only where the caret has it, like the defaults. Read once at setup.\n */\n commands?: (defaults: CommandDef[]) => CommandDef[]\n /** Document whose package stores the uploads (`backend.assets`); standalone editors use the shared `scratch` owner. Read once at setup. */\n documentId?: string\n editable?: boolean\n /** `internal`: the editor owns its settings modal; `external`: it emits `settingsOpen` and the host shows `EditorSettingsPanel`/`Modal`. */\n settingsUi?: 'internal' | 'external'\n}>(), { editable: true, settingsUi: 'internal', content: 'rich', interaction: 'full', ai: true })\n\nconst emit = defineEmits<{\n 'ready': [editor: Editor]\n 'update:modelValue': [content: JSONContent]\n 'metadataCreate': [list: string, item: MetadataItem]\n /** The JSON handed in (initially or later) does not fit the advanced schema; the last valid document stays. */\n 'contentError': [error: Error]\n /** `settingsUi: 'external'`: the editor asks the host to open its settings (on `tab` when given). */\n 'settingsOpen': [tab?: string]\n}>()\n\n/** Whether this editor's AI sidebar is open (`toggleSidebar`, Mod-Shift-k): hosts bind it (`v-model:sidebar-open`) and show their `AiSidebar` beside the editor while it is true. */\nconst sidebarOpen = defineModel<boolean>('sidebarOpen', { default: false })\n/** Whether this editor's comments margin is open (`toggleComments`, Mod-Shift-m; margin layout of a collaborative editor): hosts bind it (`v-model:comments-open`) and show their `CommentsMargin` beside the text while it is true. Opening it closes the AI sidebar and vice versa. */\nconst commentsOpen = defineModel<boolean>('commentsOpen', { default: false })\n\n// The preset is fixed at setup like the kinds it is built from; hosts remount (`key`) to change it.\nconst app = useEditorContext()\nconst preset = composeEditor({\n content: props.content,\n interaction: props.interaction,\n ai: props.ai,\n backend: props.backend ?? app.backend,\n // A `collaboration` session is the host's own: `collab` and `comments` stay whatever the backend offers.\n collaboration: props.collaboration !== undefined,\n ...(props.compositeKinds && { compositeKinds: props.compositeKinds }),\n ...(props.compositeBaskets && { compositeBaskets: props.compositeBaskets }),\n ...(props.blockUi && { blockUi: props.blockUi }),\n ...(props.coreContent && { coreContent: props.coreContent }),\n ...(props.add && { add: props.add }),\n ...(props.remove && { remove: props.remove }),\n})\nconst surface = useTemplateRef<InstanceType<typeof EditorSurface>>('surface')\n\n/** `editor`: the surface's editor once mounted. `preset`: the composed preset (its `omitted` lists what the backend or `remove` dropped). */\ndefineExpose({ editor: computed(() => surface.value?.editor), preset })\n</script>\n\n<template>\n <EditorSurface\n ref=\"surface\"\n v-model:sidebar-open=\"sidebarOpen\"\n v-model:comments-open=\"commentsOpen\"\n :preset=\"preset\"\n :collaboration=\"props.collaboration\"\n :model-value=\"props.modelValue\"\n :metadata=\"props.metadata\"\n :abilities=\"props.abilities\"\n :extensions=\"props.extensions\"\n :block-actions=\"props.blockActions\"\n :commands=\"props.commands\"\n :document-id=\"props.documentId\"\n :editable=\"props.editable\"\n :settings-ui=\"props.settingsUi\"\n @ready=\"emit('ready', $event)\"\n @update:model-value=\"emit('update:modelValue', $event)\"\n @metadata-create=\"(list, item) => emit('metadataCreate', list, item)\"\n @content-error=\"emit('contentError', $event)\"\n @settings-open=\"emit('settingsOpen', $event)\"\n />\n</template>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAiBA,MAAM,QAAQ;EAgDd,MAAM,OAAO;;EAWb,MAAM,cAAcA,SAAoB,SAAC,aAAiC;;EAE1E,MAAM,eAAeA,SAAoB,SAAC,cAAkC;EAG5E,MAAM,MAAM,iBAAiB;EAC7B,MAAM,SAAS,cAAc;GAC3B,SAAS,MAAM;GACf,aAAa,MAAM;GACnB,IAAI,MAAM;GACV,SAAS,MAAM,WAAW,IAAI;GAE9B,eAAe,MAAM,kBAAkB,KAAA;GACvC,GAAI,MAAM,kBAAkB,EAAE,gBAAgB,MAAM,eAAe;GACnE,GAAI,MAAM,oBAAoB,EAAE,kBAAkB,MAAM,iBAAiB;GACzE,GAAI,MAAM,WAAW,EAAE,SAAS,MAAM,QAAQ;GAC9C,GAAI,MAAM,eAAe,EAAE,aAAa,MAAM,YAAY;GAC1D,GAAI,MAAM,OAAO,EAAE,KAAK,MAAM,IAAI;GAClC,GAAI,MAAM,UAAU,EAAE,QAAQ,MAAM,OAAO;EAC7C,CAAC;EACD,MAAM,UAAU,eAAmD,SAAS;;EAG5E,SAAa;GAAE,QAAQ,eAAe,QAAQ,OAAO,MAAM;GAAG;EAAO,CAAC;;GAIpE,OAAAC,UAAA,GAAAC,YAoBEC,aAAA;IAnBI,SAAA;IAAJ,KAAI;IACI,gBAAc,YAAA;IAAA,wBAAA,OAAA,OAAA,OAAA,MAAA,WAAA,YAAW,QAAA;IACzB,iBAAe,aAAA;IAAA,yBAAA,OAAA,OAAA,OAAA,MAAA,WAAA,aAAY,QAAA;IAClC,QAAQC,MAAA,MAAA;IACR,eAAe,MAAM;IACrB,eAAa,MAAM;IACnB,UAAU,MAAM;IAChB,WAAW,MAAM;IACjB,YAAY,MAAM;IAClB,iBAAe,MAAM;IACrB,UAAU,MAAM;IAChB,eAAa,MAAM;IACnB,UAAU,MAAM;IAChB,eAAa,MAAM;IACnB,SAAK,OAAA,OAAA,OAAA,MAAA,WAAE,KAAI,SAAU,MAAM;IAC3B,uBAAkB,OAAA,OAAA,OAAA,MAAA,WAAE,KAAI,qBAAsB,MAAM;IACpD,kBAAe,OAAA,OAAA,OAAA,MAAG,MAAM,SAAS,KAAI,kBAAmB,MAAM,IAAI;IAClE,gBAAa,OAAA,OAAA,OAAA,MAAA,WAAE,KAAI,gBAAiB,MAAM;IAC1C,gBAAa,OAAA,OAAA,OAAA,MAAA,WAAE,KAAI,gBAAiB,MAAM"}
|
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
import { EditorBackend } from "../core/backend.js";
|
|
2
2
|
import { CommandDef } from "../core/command-types.js";
|
|
3
|
-
import { AbilitiesOptions, BlockAction } from "../core/extension-points.js";
|
|
3
|
+
import { AbilitiesOptions, BlockAction, BlockUiOptions } from "../core/extension-points.js";
|
|
4
4
|
import { EditorMetadata, MetadataItem } from "../core/metadata-types.js";
|
|
5
5
|
import { CollaborationSession, EditorFeature } from "../core/feature.js";
|
|
6
|
+
import { CoreContentOptions } from "../core/schema/index.js";
|
|
6
7
|
import "../core/commands.js";
|
|
7
8
|
import { CompositeKind } from "../features/composites/kinds.js";
|
|
9
|
+
import { Basket } from "../features/composites/baskets.js";
|
|
8
10
|
import "../features/composites/index.js";
|
|
9
11
|
import { ComposedEditor, ContentLevel, FeatureId, InteractionLevel } from "../presets/compose.js";
|
|
10
12
|
import "./advanced.js";
|
|
@@ -29,6 +31,12 @@ type __VLS_Props = {
|
|
|
29
31
|
blockActions?: BlockAction[];
|
|
30
32
|
/** Composite kinds („Bausteine“) offered in the editor (default: `defaultCompositeKinds(t)`); read once at setup. */
|
|
31
33
|
compositeKinds?: CompositeKind[];
|
|
34
|
+
/** Colour baskets a Baustein can sit in (default: `defaultBaskets(t)`); read once at setup. */
|
|
35
|
+
compositeBaskets?: Basket[];
|
|
36
|
+
/** Which surfaces render block actions: the hover bar (default), the selected-block toolbar, `'both'` or `'none'` (`BlockUiOptions`); read once at setup. */
|
|
37
|
+
blockUi?: BlockUiOptions;
|
|
38
|
+
/** Optional structures the content base drops from the schema: headings or heading levels, lists, blockquote, code block, rule (`CoreContentOptions`); read once at setup. */
|
|
39
|
+
coreContent?: CoreContentOptions;
|
|
32
40
|
/** Document model: a level (`basic`, `rich`) or the content feature ids to install; read once at setup. */
|
|
33
41
|
content?: ContentLevel | readonly FeatureId[];
|
|
34
42
|
/** Editing UX: a level (`minimal`, `full`) or the interaction feature ids; `[]` = no interaction (a viewer); read once at setup. */
|
package/dist/vue/compose.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { coreUiFeature } from "../core/core-feature.js";
|
|
2
2
|
import { composeEditor as composeEditor$1 } from "../presets/compose.js";
|
|
3
|
+
import { bulletsTransform, summaryTransform } from "../integrations/composite-ai/transfer-transforms.js";
|
|
3
4
|
import { compositeAiFeature } from "../integrations/composite-ai/index.js";
|
|
4
5
|
import { transcriptAiFeature } from "../integrations/transcript-ai/index.js";
|
|
5
6
|
import { mediaFeature } from "../features/media/vue.js";
|
|
@@ -11,6 +12,7 @@ import { collabFeature } from "../features/collab/vue.js";
|
|
|
11
12
|
import { commentsFeature } from "../features/comments/vue.js";
|
|
12
13
|
import { compositeFeature } from "../features/composites/vue.js";
|
|
13
14
|
import { themesFeature } from "../features/themes/vue.js";
|
|
15
|
+
import { transferFeature } from "../features/transfer/vue.js";
|
|
14
16
|
import { transcriptFeature } from "../features/transcript/vue.js";
|
|
15
17
|
//#region src/vue/compose.ts
|
|
16
18
|
/** The Vue bindings of every UI-bound catalog feature. */
|
|
@@ -26,7 +28,9 @@ const VUE_BINDINGS = {
|
|
|
26
28
|
"transcript-ai": transcriptAiFeature,
|
|
27
29
|
"collab": collabFeature,
|
|
28
30
|
"block-ui": blockUiFeature,
|
|
29
|
-
"themes": themesFeature
|
|
31
|
+
"themes": themesFeature,
|
|
32
|
+
"transfer": transferFeature,
|
|
33
|
+
"transfer-ai": () => [summaryTransform, bulletsTransform]
|
|
30
34
|
};
|
|
31
35
|
/**
|
|
32
36
|
* `composeEditor` of `presets/compose` over the Vue bindings: the editor of the three dimensions (`content`,
|
package/dist/vue/compose.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compose.js","names":["EditorCommandPalette","compose"],"sources":["../../src/vue/compose.ts"],"sourcesContent":["import type { Component } from 'vue'\nimport { coreUiFeature } from '../core/core-feature'\nimport EditorCommandPalette from './components/EditorCommandPalette.vue'\nimport { aiFeature } from '../features/ai/vue'\nimport { authorsFeature } from '../features/authors/vue'\nimport { blockUiFeature } from '../features/block-ui/vue'\nimport { collabFeature } from '../features/collab/vue'\nimport { commentsFeature } from '../features/comments/vue'\nimport { compositeFeature } from '../features/composites/vue'\nimport { mediaFeature } from '../features/media/vue'\nimport { themesFeature } from '../features/themes/vue'\nimport { transcriptFeature } from '../features/transcript/vue'\nimport { compositeAiFeature } from '../integrations/composite-ai'\nimport { transcriptAiFeature } from '../integrations/transcript-ai'\nimport { type ComposedEditor, type ComposeOptions, composeEditor as compose, type UiBindings } from '../presets/compose'\n\n/** The Vue bindings of every UI-bound catalog feature. */\nconst VUE_BINDINGS = {\n 'core-ui': () => coreUiFeature<Component>({ palette: EditorCommandPalette }),\n 'media': mediaFeature,\n 'transcript': transcriptFeature,\n 'composites': compositeFeature,\n 'authors': authorsFeature,\n 'comments': commentsFeature,\n 'ai': aiFeature,\n 'composite-ai': compositeAiFeature,\n 'transcript-ai': transcriptAiFeature,\n 'collab': collabFeature,\n 'block-ui': blockUiFeature,\n 'themes': themesFeature,\n} satisfies UiBindings<Component>\n\n/**\n * `composeEditor` of `presets/compose` over the Vue bindings: the editor of the three dimensions (`content`,\n * `interaction`, `ai`), pruned by the capabilities of `options.backend`. Call during component setup (`themesFeature()`\n * reads the current Vue app to stop the theme runtime when it unmounts).\n */\nexport const composeEditor = (options: ComposeOptions<Component>): ComposedEditor<Component> => compose(VUE_BINDINGS, options)\n\n/**\n * The advanced editor on the Vue surface: `{ content: 'rich', interaction: 'full', ai: true }`, every dimension option\n * overridable (`compositeKinds`, `backend`, `add`, `remove`, ...). Collaboration is active only when a session is passed\n * to the surface.\n */\nexport const advancedEditor = (options: Partial<ComposeOptions<Component>> = {}): ComposedEditor<Component> => composeEditor({ content: 'rich', interaction: 'full', ai: true, ...options })\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"compose.js","names":["EditorCommandPalette","compose"],"sources":["../../src/vue/compose.ts"],"sourcesContent":["import type { Component } from 'vue'\nimport { coreUiFeature } from '../core/core-feature'\nimport EditorCommandPalette from './components/EditorCommandPalette.vue'\nimport { aiFeature } from '../features/ai/vue'\nimport { authorsFeature } from '../features/authors/vue'\nimport { blockUiFeature } from '../features/block-ui/vue'\nimport { collabFeature } from '../features/collab/vue'\nimport { commentsFeature } from '../features/comments/vue'\nimport { compositeFeature } from '../features/composites/vue'\nimport { mediaFeature } from '../features/media/vue'\nimport { themesFeature } from '../features/themes/vue'\nimport { transferFeature } from '../features/transfer/vue'\nimport { transcriptFeature } from '../features/transcript/vue'\nimport { bulletsTransform, compositeAiFeature, summaryTransform } from '../integrations/composite-ai'\nimport { transcriptAiFeature } from '../integrations/transcript-ai'\nimport { type ComposedEditor, type ComposeOptions, composeEditor as compose, type UiBindings } from '../presets/compose'\n\n/** The Vue bindings of every UI-bound catalog feature. */\nconst VUE_BINDINGS = {\n 'core-ui': () => coreUiFeature<Component>({ palette: EditorCommandPalette }),\n 'media': mediaFeature,\n 'transcript': transcriptFeature,\n 'composites': compositeFeature,\n 'authors': authorsFeature,\n 'comments': commentsFeature,\n 'ai': aiFeature,\n 'composite-ai': compositeAiFeature,\n 'transcript-ai': transcriptAiFeature,\n 'collab': collabFeature,\n 'block-ui': blockUiFeature,\n 'themes': themesFeature,\n 'transfer': transferFeature,\n 'transfer-ai': () => [summaryTransform, bulletsTransform],\n} satisfies UiBindings<Component>\n\n/**\n * `composeEditor` of `presets/compose` over the Vue bindings: the editor of the three dimensions (`content`,\n * `interaction`, `ai`), pruned by the capabilities of `options.backend`. Call during component setup (`themesFeature()`\n * reads the current Vue app to stop the theme runtime when it unmounts).\n */\nexport const composeEditor = (options: ComposeOptions<Component>): ComposedEditor<Component> => compose(VUE_BINDINGS, options)\n\n/**\n * The advanced editor on the Vue surface: `{ content: 'rich', interaction: 'full', ai: true }`, every dimension option\n * overridable (`compositeKinds`, `backend`, `add`, `remove`, ...). Collaboration is active only when a session is passed\n * to the surface.\n */\nexport const advancedEditor = (options: Partial<ComposeOptions<Component>> = {}): ComposedEditor<Component> => composeEditor({ content: 'rich', interaction: 'full', ai: true, ...options })\n"],"mappings":";;;;;;;;;;;;;;;;;;AAkBA,MAAM,eAAe;CACnB,iBAAiB,cAAyB,EAAE,SAASA,UAAqB,CAAC;CAC3E,SAAS;CACT,cAAc;CACd,cAAc;CACd,WAAW;CACX,YAAY;CACZ,MAAM;CACN,gBAAgB;CAChB,iBAAiB;CACjB,UAAU;CACV,YAAY;CACZ,UAAU;CACV,YAAY;CACZ,qBAAqB,CAAC,kBAAkB,gBAAgB;AAC1D;;;;;;AAOA,MAAa,iBAAiB,YAAkEC,gBAAQ,cAAc,OAAO;;;;;;AAO7H,MAAa,kBAAkB,UAA8C,CAAC,MAAiC,cAAc;CAAE,SAAS;CAAQ,aAAa;CAAQ,IAAI;CAAM,GAAG;AAAQ,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ecsplico/editor",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.3.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Vue and React editor library on TipTap v3 (Vue: Nuxt UI; React: shadcn/ui): framework-free features with Vue and React bindings, simple and advanced presets, tree-shakeable entries. Built ESM with type declarations.",
|
|
6
6
|
"license": "MIT",
|
|
@@ -274,6 +274,21 @@
|
|
|
274
274
|
"types": "./dist/features/themes/schema.d.ts",
|
|
275
275
|
"import": "./dist/features/themes/schema.js"
|
|
276
276
|
},
|
|
277
|
+
"./transfer": {
|
|
278
|
+
"skaile-source": "./src/features/transfer/index.ts",
|
|
279
|
+
"types": "./dist/features/transfer/index.d.ts",
|
|
280
|
+
"import": "./dist/features/transfer/index.js"
|
|
281
|
+
},
|
|
282
|
+
"./transfer/vue": {
|
|
283
|
+
"skaile-source": "./src/features/transfer/vue.ts",
|
|
284
|
+
"types": "./dist/features/transfer/vue.d.ts",
|
|
285
|
+
"import": "./dist/features/transfer/vue.js"
|
|
286
|
+
},
|
|
287
|
+
"./transfer/react": {
|
|
288
|
+
"skaile-source": "./src/features/transfer/react.ts",
|
|
289
|
+
"types": "./dist/features/transfer/react.d.ts",
|
|
290
|
+
"import": "./dist/features/transfer/react.js"
|
|
291
|
+
},
|
|
277
292
|
"./comments": {
|
|
278
293
|
"skaile-source": "./src/features/comments/index.ts",
|
|
279
294
|
"types": "./dist/features/comments/index.d.ts",
|
|
@@ -309,6 +324,11 @@
|
|
|
309
324
|
"types": "./dist/adapters/drizzle.d.ts",
|
|
310
325
|
"import": "./dist/adapters/drizzle.js"
|
|
311
326
|
},
|
|
327
|
+
"./adapters/direct-ai": {
|
|
328
|
+
"skaile-source": "./src/adapters/direct-ai.ts",
|
|
329
|
+
"types": "./dist/adapters/direct-ai.d.ts",
|
|
330
|
+
"import": "./dist/adapters/direct-ai.js"
|
|
331
|
+
},
|
|
312
332
|
"./adapters/forge": {
|
|
313
333
|
"skaile-source": "./src/adapters/forge.ts",
|
|
314
334
|
"types": "./dist/adapters/forge.d.ts",
|