@liveblocks/react-tiptap 2.17.0-usrnotsettings3 → 2.18.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/dist/LiveblocksExtension.js +116 -21
- package/dist/LiveblocksExtension.js.map +1 -1
- package/dist/LiveblocksExtension.mjs +114 -19
- package/dist/LiveblocksExtension.mjs.map +1 -1
- package/dist/ai/AiExtension.js +382 -0
- package/dist/ai/AiExtension.js.map +1 -0
- package/dist/ai/AiExtension.mjs +378 -0
- package/dist/ai/AiExtension.mjs.map +1 -0
- package/dist/ai/AiToolbar.js +663 -0
- package/dist/ai/AiToolbar.js.map +1 -0
- package/dist/ai/AiToolbar.mjs +660 -0
- package/dist/ai/AiToolbar.mjs.map +1 -0
- package/dist/comments/CommentsExtension.js.map +1 -1
- package/dist/comments/CommentsExtension.mjs.map +1 -1
- package/dist/comments/FloatingComposer.js +2 -2
- package/dist/comments/FloatingComposer.js.map +1 -1
- package/dist/comments/FloatingComposer.mjs +2 -2
- package/dist/comments/FloatingComposer.mjs.map +1 -1
- package/dist/index.d.mts +107 -15
- package/dist/index.d.ts +107 -15
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +1 -0
- package/dist/index.mjs.map +1 -1
- package/dist/toolbar/FloatingToolbar.js +7 -0
- package/dist/toolbar/FloatingToolbar.js.map +1 -1
- package/dist/toolbar/FloatingToolbar.mjs +7 -0
- package/dist/toolbar/FloatingToolbar.mjs.map +1 -1
- package/dist/toolbar/Toolbar.js +35 -1
- package/dist/toolbar/Toolbar.js.map +1 -1
- package/dist/toolbar/Toolbar.mjs +36 -2
- package/dist/toolbar/Toolbar.mjs.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/types.mjs.map +1 -1
- package/dist/utils.js +118 -6
- package/dist/utils.js.map +1 -1
- package/dist/utils.mjs +116 -7
- package/dist/utils.mjs.map +1 -1
- package/dist/version.js +1 -1
- package/dist/version.js.map +1 -1
- package/dist/version.mjs +1 -1
- package/dist/version.mjs.map +1 -1
- package/package.json +7 -6
- package/src/styles/index.css +380 -3
- package/src/styles/utils.css +6 -0
- package/styles.css +1 -1
- package/styles.css.map +1 -1
package/dist/utils.js
CHANGED
|
@@ -1,8 +1,29 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
3
|
var model = require('@tiptap/pm/model');
|
|
4
|
+
var state = require('@tiptap/pm/state');
|
|
5
|
+
var yProsemirror = require('y-prosemirror');
|
|
4
6
|
var types = require('./types.js');
|
|
5
7
|
|
|
8
|
+
const CONTEXT_TRUNCATION = "[\u2026]";
|
|
9
|
+
const CONTEXT_BLOCK_SEPARATOR = "\n";
|
|
10
|
+
const getRelativeSelectionFromState = (state) => {
|
|
11
|
+
const pluginState = yProsemirror.ySyncPluginKey.getState(state);
|
|
12
|
+
if (!pluginState)
|
|
13
|
+
return null;
|
|
14
|
+
return yProsemirror.getRelativeSelection(pluginState.binding, state);
|
|
15
|
+
};
|
|
16
|
+
const getRangeFromRelativeSelections = (pos, state) => {
|
|
17
|
+
const pluginState = yProsemirror.ySyncPluginKey.getState(state);
|
|
18
|
+
if (!pluginState || !pluginState.binding)
|
|
19
|
+
return { from: 0, to: 0 };
|
|
20
|
+
const { doc, type, mapping } = pluginState.binding;
|
|
21
|
+
const anchor = yProsemirror.relativePositionToAbsolutePosition(doc, type, pos.anchor, mapping) ?? 0;
|
|
22
|
+
const head = yProsemirror.relativePositionToAbsolutePosition(doc, type, pos.head, mapping) ?? 0;
|
|
23
|
+
const from = anchor > head ? head : anchor;
|
|
24
|
+
const to = anchor > head ? anchor : head;
|
|
25
|
+
return { from, to };
|
|
26
|
+
};
|
|
6
27
|
const getRectFromCoords = (coords) => {
|
|
7
28
|
return {
|
|
8
29
|
...coords,
|
|
@@ -40,13 +61,22 @@ const mapFragment = (fragment, callback) => {
|
|
|
40
61
|
});
|
|
41
62
|
return model.Fragment.from(content);
|
|
42
63
|
};
|
|
43
|
-
function getDomRangeFromSelection(
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
64
|
+
function getDomRangeFromSelection(editor, selection) {
|
|
65
|
+
if (selection.from === selection.to) {
|
|
66
|
+
const { parent, parentOffset } = selection.$from;
|
|
67
|
+
if (parent.isBlock && parent.content.size === 0 || parent.isTextblock && parentOffset === parent.content.size) {
|
|
68
|
+
selection = state.TextSelection.create(
|
|
69
|
+
editor.state.doc,
|
|
70
|
+
selection.$from.before(),
|
|
71
|
+
selection.$from.after()
|
|
72
|
+
);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
const from = editor.view.domAtPos(selection.from);
|
|
76
|
+
const to = editor.view.domAtPos(selection.to);
|
|
47
77
|
const domRange = document.createRange();
|
|
48
|
-
domRange.setStart(
|
|
49
|
-
domRange.setEnd(
|
|
78
|
+
domRange.setStart(from.node, from.offset);
|
|
79
|
+
domRange.setEnd(to.node, to.offset);
|
|
50
80
|
return domRange;
|
|
51
81
|
}
|
|
52
82
|
function compareSelections(a, b) {
|
|
@@ -55,10 +85,92 @@ function compareSelections(a, b) {
|
|
|
55
85
|
}
|
|
56
86
|
return a.eq(b);
|
|
57
87
|
}
|
|
88
|
+
function getContextualPromptContext(editor, maxLength = 1e4) {
|
|
89
|
+
const { selection, doc } = editor.state;
|
|
90
|
+
const selectionLength = selection.to - selection.from;
|
|
91
|
+
if (maxLength >= doc.content.size) {
|
|
92
|
+
return {
|
|
93
|
+
beforeSelection: doc.textBetween(
|
|
94
|
+
0,
|
|
95
|
+
selection.from,
|
|
96
|
+
CONTEXT_BLOCK_SEPARATOR
|
|
97
|
+
),
|
|
98
|
+
selection: doc.textBetween(
|
|
99
|
+
selection.from,
|
|
100
|
+
selection.to,
|
|
101
|
+
CONTEXT_BLOCK_SEPARATOR
|
|
102
|
+
),
|
|
103
|
+
afterSelection: doc.textBetween(
|
|
104
|
+
selection.to,
|
|
105
|
+
doc.content.size,
|
|
106
|
+
CONTEXT_BLOCK_SEPARATOR
|
|
107
|
+
)
|
|
108
|
+
};
|
|
109
|
+
} else if (selectionLength > maxLength) {
|
|
110
|
+
const selectionStart = doc.textBetween(
|
|
111
|
+
selection.from,
|
|
112
|
+
selection.from + Math.floor(maxLength / 2) - CONTEXT_TRUNCATION.length,
|
|
113
|
+
CONTEXT_BLOCK_SEPARATOR
|
|
114
|
+
);
|
|
115
|
+
const selectionEnd = doc.textBetween(
|
|
116
|
+
selection.to - Math.floor(maxLength / 2) + CONTEXT_TRUNCATION.length,
|
|
117
|
+
selection.to,
|
|
118
|
+
CONTEXT_BLOCK_SEPARATOR
|
|
119
|
+
);
|
|
120
|
+
return {
|
|
121
|
+
beforeSelection: "",
|
|
122
|
+
selection: `${selectionStart}${CONTEXT_TRUNCATION}${selectionEnd}`,
|
|
123
|
+
afterSelection: ""
|
|
124
|
+
};
|
|
125
|
+
} else {
|
|
126
|
+
let beforeLength = Math.min(
|
|
127
|
+
selection.from,
|
|
128
|
+
Math.floor((maxLength - selectionLength) / 2)
|
|
129
|
+
);
|
|
130
|
+
const afterLength = Math.min(
|
|
131
|
+
doc.content.size - selection.to,
|
|
132
|
+
maxLength - selectionLength - beforeLength
|
|
133
|
+
);
|
|
134
|
+
if (beforeLength + afterLength + selectionLength < maxLength) {
|
|
135
|
+
beforeLength = Math.min(
|
|
136
|
+
selection.from,
|
|
137
|
+
maxLength - selectionLength - afterLength
|
|
138
|
+
);
|
|
139
|
+
}
|
|
140
|
+
let beforeSelection = doc.textBetween(
|
|
141
|
+
Math.max(0, selection.from - beforeLength),
|
|
142
|
+
selection.from,
|
|
143
|
+
CONTEXT_BLOCK_SEPARATOR
|
|
144
|
+
);
|
|
145
|
+
let afterSelection = doc.textBetween(
|
|
146
|
+
selection.to,
|
|
147
|
+
Math.min(doc.content.size, selection.to + afterLength),
|
|
148
|
+
CONTEXT_BLOCK_SEPARATOR
|
|
149
|
+
);
|
|
150
|
+
if (selection.from - beforeLength > 0) {
|
|
151
|
+
beforeSelection = `${CONTEXT_TRUNCATION}${beforeSelection}`;
|
|
152
|
+
}
|
|
153
|
+
if (selection.to + afterLength < doc.content.size) {
|
|
154
|
+
afterSelection = `${afterSelection}${CONTEXT_TRUNCATION}`;
|
|
155
|
+
}
|
|
156
|
+
return {
|
|
157
|
+
beforeSelection,
|
|
158
|
+
selection: doc.textBetween(
|
|
159
|
+
selection.from,
|
|
160
|
+
selection.to,
|
|
161
|
+
CONTEXT_BLOCK_SEPARATOR
|
|
162
|
+
),
|
|
163
|
+
afterSelection
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
}
|
|
58
167
|
|
|
59
168
|
exports.compareSelections = compareSelections;
|
|
169
|
+
exports.getContextualPromptContext = getContextualPromptContext;
|
|
60
170
|
exports.getDomRangeFromSelection = getDomRangeFromSelection;
|
|
61
171
|
exports.getMentionsFromNode = getMentionsFromNode;
|
|
172
|
+
exports.getRangeFromRelativeSelections = getRangeFromRelativeSelections;
|
|
62
173
|
exports.getRectFromCoords = getRectFromCoords;
|
|
174
|
+
exports.getRelativeSelectionFromState = getRelativeSelectionFromState;
|
|
63
175
|
exports.mapFragment = mapFragment;
|
|
64
176
|
//# sourceMappingURL=utils.js.map
|
package/dist/utils.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sources":["../src/utils.ts"],"sourcesContent":["import type { ClientRectObject } from \"@floating-ui/react-dom\";\nimport type { Editor, Range } from \"@tiptap/core\";\nimport type { Node as ProseMirrorNode } from \"@tiptap/pm/model\";\nimport { Fragment } from \"@tiptap/pm/model\";\nimport type { Selection } from \"@tiptap/pm/state\";\n\nimport { LIVEBLOCKS_MENTION_TYPE } from \"./types\";\n\nexport const getRectFromCoords = (coords: {\n top: number;\n left: number;\n right: number;\n bottom: number;\n}): ClientRectObject => {\n return {\n ...coords,\n x: coords.left,\n y: coords.top,\n width: coords.right - coords.left,\n height: coords.bottom - coords.top,\n };\n};\n\nexport const getMentionsFromNode = (\n node: ProseMirrorNode,\n range: Range\n): { notificationId: string; userId: string }[] => {\n const result: { notificationId: string; userId: string }[] = [];\n node.nodesBetween(range.from, range.to, (child) => {\n if (child.type.name === LIVEBLOCKS_MENTION_TYPE) {\n const mention = child.attrs as { id?: string; notificationId?: string };\n if (mention.id && mention.notificationId) {\n result.push({\n notificationId: mention.notificationId,\n userId: mention.id,\n });\n }\n }\n });\n return result;\n};\n\n// How to modify data in transformPasted, inspired by: https://discuss.prosemirror.net/t/modify-specific-node-on-copy-and-paste-in-clipboard/4901/4\nexport const mapFragment = (\n fragment: Fragment,\n callback: (\n node: ProseMirrorNode\n ) => ProseMirrorNode | ProseMirrorNode[] | Fragment | null\n): Fragment => {\n const content: ProseMirrorNode[] = [];\n fragment.forEach((node) => {\n if (node.content.childCount > 0) {\n content.push(\n node.type.create(node.attrs, mapFragment(node.content, callback))\n );\n return;\n }\n content.push(callback(node) as ProseMirrorNode);\n });\n\n return Fragment.from(content);\n};\n\nexport function getDomRangeFromSelection(selection: Selection, editor: Editor) {\n const { from, to } = selection;\n const fromPos = editor.view.domAtPos(from);\n const endPos = editor.view.domAtPos(to);\n\n const domRange = document.createRange();\n domRange.setStart(fromPos.node, fromPos.offset);\n domRange.setEnd(endPos.node, endPos.offset);\n\n return domRange;\n}\n\nexport function compareSelections(\n a: Selection | null | undefined,\n b: Selection | null | undefined\n) {\n if (!a || !b) {\n return false;\n }\n\n return a.eq(b);\n}\n"],"names":["LIVEBLOCKS_MENTION_TYPE","Fragment"],"mappings":";;;;;AAQa,MAAA,iBAAA,GAAoB,CAAC,MAKV,KAAA;AACtB,EAAO,OAAA;AAAA,IACL,GAAG,MAAA;AAAA,IACH,GAAG,MAAO,CAAA,IAAA;AAAA,IACV,GAAG,MAAO,CAAA,GAAA;AAAA,IACV,KAAA,EAAO,MAAO,CAAA,KAAA,GAAQ,MAAO,CAAA,IAAA;AAAA,IAC7B,MAAA,EAAQ,MAAO,CAAA,MAAA,GAAS,MAAO,CAAA,GAAA;AAAA,GACjC,CAAA;AACF,EAAA;AAEa,MAAA,mBAAA,GAAsB,CACjC,IAAA,EACA,KACiD,KAAA;AACjD,EAAA,MAAM,SAAuD,EAAC,CAAA;AAC9D,EAAA,IAAA,CAAK,aAAa,KAAM,CAAA,IAAA,EAAM,KAAM,CAAA,EAAA,EAAI,CAAC,KAAU,KAAA;AACjD,IAAI,IAAA,KAAA,CAAM,IAAK,CAAA,IAAA,KAASA,6BAAyB,EAAA;AAC/C,MAAA,MAAM,UAAU,KAAM,CAAA,KAAA,CAAA;AACtB,MAAI,IAAA,OAAA,CAAQ,EAAM,IAAA,OAAA,CAAQ,cAAgB,EAAA;AACxC,QAAA,MAAA,CAAO,IAAK,CAAA;AAAA,UACV,gBAAgB,OAAQ,CAAA,cAAA;AAAA,UACxB,QAAQ,OAAQ,CAAA,EAAA;AAAA,SACjB,CAAA,CAAA;AAAA,OACH;AAAA,KACF;AAAA,GACD,CAAA,CAAA;AACD,EAAO,OAAA,MAAA,CAAA;AACT,EAAA;AAGa,MAAA,WAAA,GAAc,CACzB,QAAA,EACA,QAGa,KAAA;AACb,EAAA,MAAM,UAA6B,EAAC,CAAA;AACpC,EAAS,QAAA,CAAA,OAAA,CAAQ,CAAC,IAAS,KAAA;AACzB,IAAI,IAAA,IAAA,CAAK,OAAQ,CAAA,UAAA,GAAa,CAAG,EAAA;AAC/B,MAAQ,OAAA,CAAA,IAAA;AAAA,QACN,IAAA,CAAK,KAAK,MAAO,CAAA,IAAA,CAAK,OAAO,WAAY,CAAA,IAAA,CAAK,OAAS,EAAA,QAAQ,CAAC,CAAA;AAAA,OAClE,CAAA;AACA,MAAA,OAAA;AAAA,KACF;AACA,IAAQ,OAAA,CAAA,IAAA,CAAK,QAAS,CAAA,IAAI,CAAoB,CAAA,CAAA;AAAA,GAC/C,CAAA,CAAA;AAED,EAAO,OAAAC,cAAA,CAAS,KAAK,OAAO,CAAA,CAAA;AAC9B,EAAA;AAEgB,SAAA,wBAAA,CAAyB,WAAsB,MAAgB,EAAA;AAC7E,EAAM,MAAA,EAAE,IAAM,EAAA,EAAA,EAAO,GAAA,SAAA,CAAA;AACrB,EAAA,MAAM,OAAU,GAAA,MAAA,CAAO,IAAK,CAAA,QAAA,CAAS,IAAI,CAAA,CAAA;AACzC,EAAA,MAAM,MAAS,GAAA,MAAA,CAAO,IAAK,CAAA,QAAA,CAAS,EAAE,CAAA,CAAA;AAEtC,EAAM,MAAA,QAAA,GAAW,SAAS,WAAY,EAAA,CAAA;AACtC,EAAA,QAAA,CAAS,QAAS,CAAA,OAAA,CAAQ,IAAM,EAAA,OAAA,CAAQ,MAAM,CAAA,CAAA;AAC9C,EAAA,QAAA,CAAS,MAAO,CAAA,MAAA,CAAO,IAAM,EAAA,MAAA,CAAO,MAAM,CAAA,CAAA;AAE1C,EAAO,OAAA,QAAA,CAAA;AACT,CAAA;AAEgB,SAAA,iBAAA,CACd,GACA,CACA,EAAA;AACA,EAAI,IAAA,CAAC,CAAK,IAAA,CAAC,CAAG,EAAA;AACZ,IAAO,OAAA,KAAA,CAAA;AAAA,GACT;AAEA,EAAO,OAAA,CAAA,CAAE,GAAG,CAAC,CAAA,CAAA;AACf;;;;;;;;"}
|
|
1
|
+
{"version":3,"file":"utils.js","sources":["../src/utils.ts"],"sourcesContent":["import type { ClientRectObject } from \"@floating-ui/react-dom\";\nimport type { ContextualPromptContext } from \"@liveblocks/core\";\nimport type { Editor, Range } from \"@tiptap/core\";\nimport type { Node as ProseMirrorNode } from \"@tiptap/pm/model\";\nimport { Fragment } from \"@tiptap/pm/model\";\nimport {\n type EditorState,\n type Selection,\n TextSelection,\n} from \"@tiptap/pm/state\";\nimport {\n getRelativeSelection,\n relativePositionToAbsolutePosition,\n ySyncPluginKey,\n} from \"y-prosemirror\";\nimport type { RelativePosition } from \"yjs\";\n\nimport type { YSyncPluginState } from \"./types\";\nimport { LIVEBLOCKS_MENTION_TYPE } from \"./types\";\n\nconst CONTEXT_TRUNCATION = \"[…]\";\nconst CONTEXT_BLOCK_SEPARATOR = \"\\n\";\n\nexport const getRelativeSelectionFromState = (state: EditorState) => {\n const pluginState = ySyncPluginKey.getState(state) as YSyncPluginState;\n if (!pluginState) return null;\n return getRelativeSelection(pluginState.binding, state);\n};\n\nexport const getRangeFromRelativeSelections = (\n pos: { anchor: RelativePosition; head: RelativePosition },\n state: EditorState\n) => {\n const pluginState = ySyncPluginKey.getState(state) as YSyncPluginState;\n if (!pluginState || !pluginState.binding) return { from: 0, to: 0 };\n const { doc, type, mapping } = pluginState.binding;\n const anchor =\n relativePositionToAbsolutePosition(doc, type, pos.anchor, mapping) ?? 0;\n const head =\n relativePositionToAbsolutePosition(doc, type, pos.head, mapping) ?? 0;\n\n const from = anchor > head ? head : anchor;\n const to = anchor > head ? anchor : head;\n return { from, to };\n};\n\nexport const getRectFromCoords = (coords: {\n top: number;\n left: number;\n right: number;\n bottom: number;\n}): ClientRectObject => {\n return {\n ...coords,\n x: coords.left,\n y: coords.top,\n width: coords.right - coords.left,\n height: coords.bottom - coords.top,\n };\n};\n\nexport const getMentionsFromNode = (\n node: ProseMirrorNode,\n range: Range\n): { notificationId: string; userId: string }[] => {\n const result: { notificationId: string; userId: string }[] = [];\n node.nodesBetween(range.from, range.to, (child) => {\n if (child.type.name === LIVEBLOCKS_MENTION_TYPE) {\n const mention = child.attrs as { id?: string; notificationId?: string };\n if (mention.id && mention.notificationId) {\n result.push({\n notificationId: mention.notificationId,\n userId: mention.id,\n });\n }\n }\n });\n return result;\n};\n\n// How to modify data in transformPasted, inspired by: https://discuss.prosemirror.net/t/modify-specific-node-on-copy-and-paste-in-clipboard/4901/4\nexport const mapFragment = (\n fragment: Fragment,\n callback: (\n node: ProseMirrorNode\n ) => ProseMirrorNode | ProseMirrorNode[] | Fragment | null\n): Fragment => {\n const content: ProseMirrorNode[] = [];\n fragment.forEach((node) => {\n if (node.content.childCount > 0) {\n content.push(\n node.type.create(node.attrs, mapFragment(node.content, callback))\n );\n return;\n }\n content.push(callback(node) as ProseMirrorNode);\n });\n\n return Fragment.from(content);\n};\n\nexport function getDomRangeFromSelection(editor: Editor, selection: Selection) {\n if (selection.from === selection.to) {\n const { parent, parentOffset } = selection.$from;\n\n // If the selection is collapsed and in an empty block node or at the end\n // of a text node, extend it to the entire node\n if (\n (parent.isBlock && parent.content.size === 0) ||\n (parent.isTextblock && parentOffset === parent.content.size)\n ) {\n selection = TextSelection.create(\n editor.state.doc,\n selection.$from.before(),\n selection.$from.after()\n );\n }\n }\n\n const from = editor.view.domAtPos(selection.from);\n const to = editor.view.domAtPos(selection.to);\n\n const domRange = document.createRange();\n domRange.setStart(from.node, from.offset);\n domRange.setEnd(to.node, to.offset);\n\n return domRange;\n}\n\nexport function compareSelections(\n a: Selection | null | undefined,\n b: Selection | null | undefined\n) {\n if (!a || !b) {\n return false;\n }\n\n return a.eq(b);\n}\n\nexport function getContextualPromptContext(\n editor: Editor,\n maxLength = 10_000\n): ContextualPromptContext {\n const { selection, doc } = editor.state;\n\n const selectionLength = selection.to - selection.from;\n\n if (maxLength >= doc.content.size) {\n // If the document is smaller than the maximum length, return the entire document\n return {\n beforeSelection: doc.textBetween(\n 0,\n selection.from,\n CONTEXT_BLOCK_SEPARATOR\n ),\n selection: doc.textBetween(\n selection.from,\n selection.to,\n CONTEXT_BLOCK_SEPARATOR\n ),\n afterSelection: doc.textBetween(\n selection.to,\n doc.content.size,\n CONTEXT_BLOCK_SEPARATOR\n ),\n };\n } else if (selectionLength > maxLength) {\n // If the selection is too large, truncate its middle to still allow continuations\n const selectionStart = doc.textBetween(\n selection.from,\n selection.from + Math.floor(maxLength / 2) - CONTEXT_TRUNCATION.length,\n CONTEXT_BLOCK_SEPARATOR\n );\n const selectionEnd = doc.textBetween(\n selection.to - Math.floor(maxLength / 2) + CONTEXT_TRUNCATION.length,\n selection.to,\n CONTEXT_BLOCK_SEPARATOR\n );\n\n return {\n beforeSelection: \"\",\n selection: `${selectionStart}${CONTEXT_TRUNCATION}${selectionEnd}`,\n afterSelection: \"\",\n };\n } else {\n // If the selection is smaller than (or equal to) the maximum length, extract as much as possible from the document around the selection\n\n // Start by taking as much as possible after the selection\n let beforeLength = Math.min(\n selection.from,\n Math.floor((maxLength - selectionLength) / 2)\n );\n const afterLength = Math.min(\n doc.content.size - selection.to,\n maxLength - selectionLength - beforeLength\n );\n\n // If needed (e.g. the selection is near the end), compensate before the selection\n if (beforeLength + afterLength + selectionLength < maxLength) {\n beforeLength = Math.min(\n selection.from,\n maxLength - selectionLength - afterLength\n );\n }\n\n let beforeSelection = doc.textBetween(\n Math.max(0, selection.from - beforeLength),\n selection.from,\n CONTEXT_BLOCK_SEPARATOR\n );\n let afterSelection = doc.textBetween(\n selection.to,\n Math.min(doc.content.size, selection.to + afterLength),\n CONTEXT_BLOCK_SEPARATOR\n );\n\n // Add leading truncation if `beforeSelection` doesn't contain the document's start\n if (selection.from - beforeLength > 0) {\n beforeSelection = `${CONTEXT_TRUNCATION}${beforeSelection}`;\n }\n\n // Add trailing truncation if `afterSelection` doesn't contain the document's end\n if (selection.to + afterLength < doc.content.size) {\n afterSelection = `${afterSelection}${CONTEXT_TRUNCATION}`;\n }\n\n return {\n beforeSelection,\n selection: doc.textBetween(\n selection.from,\n selection.to,\n CONTEXT_BLOCK_SEPARATOR\n ),\n afterSelection,\n };\n }\n}\n"],"names":["ySyncPluginKey","getRelativeSelection","relativePositionToAbsolutePosition","LIVEBLOCKS_MENTION_TYPE","Fragment","TextSelection"],"mappings":"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"}
|
package/dist/utils.mjs
CHANGED
|
@@ -1,6 +1,27 @@
|
|
|
1
1
|
import { Fragment } from '@tiptap/pm/model';
|
|
2
|
+
import { TextSelection } from '@tiptap/pm/state';
|
|
3
|
+
import { ySyncPluginKey, getRelativeSelection, relativePositionToAbsolutePosition } from 'y-prosemirror';
|
|
2
4
|
import { LIVEBLOCKS_MENTION_TYPE } from './types.mjs';
|
|
3
5
|
|
|
6
|
+
const CONTEXT_TRUNCATION = "[\u2026]";
|
|
7
|
+
const CONTEXT_BLOCK_SEPARATOR = "\n";
|
|
8
|
+
const getRelativeSelectionFromState = (state) => {
|
|
9
|
+
const pluginState = ySyncPluginKey.getState(state);
|
|
10
|
+
if (!pluginState)
|
|
11
|
+
return null;
|
|
12
|
+
return getRelativeSelection(pluginState.binding, state);
|
|
13
|
+
};
|
|
14
|
+
const getRangeFromRelativeSelections = (pos, state) => {
|
|
15
|
+
const pluginState = ySyncPluginKey.getState(state);
|
|
16
|
+
if (!pluginState || !pluginState.binding)
|
|
17
|
+
return { from: 0, to: 0 };
|
|
18
|
+
const { doc, type, mapping } = pluginState.binding;
|
|
19
|
+
const anchor = relativePositionToAbsolutePosition(doc, type, pos.anchor, mapping) ?? 0;
|
|
20
|
+
const head = relativePositionToAbsolutePosition(doc, type, pos.head, mapping) ?? 0;
|
|
21
|
+
const from = anchor > head ? head : anchor;
|
|
22
|
+
const to = anchor > head ? anchor : head;
|
|
23
|
+
return { from, to };
|
|
24
|
+
};
|
|
4
25
|
const getRectFromCoords = (coords) => {
|
|
5
26
|
return {
|
|
6
27
|
...coords,
|
|
@@ -38,13 +59,22 @@ const mapFragment = (fragment, callback) => {
|
|
|
38
59
|
});
|
|
39
60
|
return Fragment.from(content);
|
|
40
61
|
};
|
|
41
|
-
function getDomRangeFromSelection(
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
62
|
+
function getDomRangeFromSelection(editor, selection) {
|
|
63
|
+
if (selection.from === selection.to) {
|
|
64
|
+
const { parent, parentOffset } = selection.$from;
|
|
65
|
+
if (parent.isBlock && parent.content.size === 0 || parent.isTextblock && parentOffset === parent.content.size) {
|
|
66
|
+
selection = TextSelection.create(
|
|
67
|
+
editor.state.doc,
|
|
68
|
+
selection.$from.before(),
|
|
69
|
+
selection.$from.after()
|
|
70
|
+
);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
const from = editor.view.domAtPos(selection.from);
|
|
74
|
+
const to = editor.view.domAtPos(selection.to);
|
|
45
75
|
const domRange = document.createRange();
|
|
46
|
-
domRange.setStart(
|
|
47
|
-
domRange.setEnd(
|
|
76
|
+
domRange.setStart(from.node, from.offset);
|
|
77
|
+
domRange.setEnd(to.node, to.offset);
|
|
48
78
|
return domRange;
|
|
49
79
|
}
|
|
50
80
|
function compareSelections(a, b) {
|
|
@@ -53,6 +83,85 @@ function compareSelections(a, b) {
|
|
|
53
83
|
}
|
|
54
84
|
return a.eq(b);
|
|
55
85
|
}
|
|
86
|
+
function getContextualPromptContext(editor, maxLength = 1e4) {
|
|
87
|
+
const { selection, doc } = editor.state;
|
|
88
|
+
const selectionLength = selection.to - selection.from;
|
|
89
|
+
if (maxLength >= doc.content.size) {
|
|
90
|
+
return {
|
|
91
|
+
beforeSelection: doc.textBetween(
|
|
92
|
+
0,
|
|
93
|
+
selection.from,
|
|
94
|
+
CONTEXT_BLOCK_SEPARATOR
|
|
95
|
+
),
|
|
96
|
+
selection: doc.textBetween(
|
|
97
|
+
selection.from,
|
|
98
|
+
selection.to,
|
|
99
|
+
CONTEXT_BLOCK_SEPARATOR
|
|
100
|
+
),
|
|
101
|
+
afterSelection: doc.textBetween(
|
|
102
|
+
selection.to,
|
|
103
|
+
doc.content.size,
|
|
104
|
+
CONTEXT_BLOCK_SEPARATOR
|
|
105
|
+
)
|
|
106
|
+
};
|
|
107
|
+
} else if (selectionLength > maxLength) {
|
|
108
|
+
const selectionStart = doc.textBetween(
|
|
109
|
+
selection.from,
|
|
110
|
+
selection.from + Math.floor(maxLength / 2) - CONTEXT_TRUNCATION.length,
|
|
111
|
+
CONTEXT_BLOCK_SEPARATOR
|
|
112
|
+
);
|
|
113
|
+
const selectionEnd = doc.textBetween(
|
|
114
|
+
selection.to - Math.floor(maxLength / 2) + CONTEXT_TRUNCATION.length,
|
|
115
|
+
selection.to,
|
|
116
|
+
CONTEXT_BLOCK_SEPARATOR
|
|
117
|
+
);
|
|
118
|
+
return {
|
|
119
|
+
beforeSelection: "",
|
|
120
|
+
selection: `${selectionStart}${CONTEXT_TRUNCATION}${selectionEnd}`,
|
|
121
|
+
afterSelection: ""
|
|
122
|
+
};
|
|
123
|
+
} else {
|
|
124
|
+
let beforeLength = Math.min(
|
|
125
|
+
selection.from,
|
|
126
|
+
Math.floor((maxLength - selectionLength) / 2)
|
|
127
|
+
);
|
|
128
|
+
const afterLength = Math.min(
|
|
129
|
+
doc.content.size - selection.to,
|
|
130
|
+
maxLength - selectionLength - beforeLength
|
|
131
|
+
);
|
|
132
|
+
if (beforeLength + afterLength + selectionLength < maxLength) {
|
|
133
|
+
beforeLength = Math.min(
|
|
134
|
+
selection.from,
|
|
135
|
+
maxLength - selectionLength - afterLength
|
|
136
|
+
);
|
|
137
|
+
}
|
|
138
|
+
let beforeSelection = doc.textBetween(
|
|
139
|
+
Math.max(0, selection.from - beforeLength),
|
|
140
|
+
selection.from,
|
|
141
|
+
CONTEXT_BLOCK_SEPARATOR
|
|
142
|
+
);
|
|
143
|
+
let afterSelection = doc.textBetween(
|
|
144
|
+
selection.to,
|
|
145
|
+
Math.min(doc.content.size, selection.to + afterLength),
|
|
146
|
+
CONTEXT_BLOCK_SEPARATOR
|
|
147
|
+
);
|
|
148
|
+
if (selection.from - beforeLength > 0) {
|
|
149
|
+
beforeSelection = `${CONTEXT_TRUNCATION}${beforeSelection}`;
|
|
150
|
+
}
|
|
151
|
+
if (selection.to + afterLength < doc.content.size) {
|
|
152
|
+
afterSelection = `${afterSelection}${CONTEXT_TRUNCATION}`;
|
|
153
|
+
}
|
|
154
|
+
return {
|
|
155
|
+
beforeSelection,
|
|
156
|
+
selection: doc.textBetween(
|
|
157
|
+
selection.from,
|
|
158
|
+
selection.to,
|
|
159
|
+
CONTEXT_BLOCK_SEPARATOR
|
|
160
|
+
),
|
|
161
|
+
afterSelection
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
}
|
|
56
165
|
|
|
57
|
-
export { compareSelections, getDomRangeFromSelection, getMentionsFromNode, getRectFromCoords, mapFragment };
|
|
166
|
+
export { compareSelections, getContextualPromptContext, getDomRangeFromSelection, getMentionsFromNode, getRangeFromRelativeSelections, getRectFromCoords, getRelativeSelectionFromState, mapFragment };
|
|
58
167
|
//# sourceMappingURL=utils.mjs.map
|
package/dist/utils.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.mjs","sources":["../src/utils.ts"],"sourcesContent":["import type { ClientRectObject } from \"@floating-ui/react-dom\";\nimport type { Editor, Range } from \"@tiptap/core\";\nimport type { Node as ProseMirrorNode } from \"@tiptap/pm/model\";\nimport { Fragment } from \"@tiptap/pm/model\";\nimport type { Selection } from \"@tiptap/pm/state\";\n\nimport { LIVEBLOCKS_MENTION_TYPE } from \"./types\";\n\nexport const getRectFromCoords = (coords: {\n top: number;\n left: number;\n right: number;\n bottom: number;\n}): ClientRectObject => {\n return {\n ...coords,\n x: coords.left,\n y: coords.top,\n width: coords.right - coords.left,\n height: coords.bottom - coords.top,\n };\n};\n\nexport const getMentionsFromNode = (\n node: ProseMirrorNode,\n range: Range\n): { notificationId: string; userId: string }[] => {\n const result: { notificationId: string; userId: string }[] = [];\n node.nodesBetween(range.from, range.to, (child) => {\n if (child.type.name === LIVEBLOCKS_MENTION_TYPE) {\n const mention = child.attrs as { id?: string; notificationId?: string };\n if (mention.id && mention.notificationId) {\n result.push({\n notificationId: mention.notificationId,\n userId: mention.id,\n });\n }\n }\n });\n return result;\n};\n\n// How to modify data in transformPasted, inspired by: https://discuss.prosemirror.net/t/modify-specific-node-on-copy-and-paste-in-clipboard/4901/4\nexport const mapFragment = (\n fragment: Fragment,\n callback: (\n node: ProseMirrorNode\n ) => ProseMirrorNode | ProseMirrorNode[] | Fragment | null\n): Fragment => {\n const content: ProseMirrorNode[] = [];\n fragment.forEach((node) => {\n if (node.content.childCount > 0) {\n content.push(\n node.type.create(node.attrs, mapFragment(node.content, callback))\n );\n return;\n }\n content.push(callback(node) as ProseMirrorNode);\n });\n\n return Fragment.from(content);\n};\n\nexport function getDomRangeFromSelection(selection: Selection, editor: Editor) {\n const { from, to } = selection;\n const fromPos = editor.view.domAtPos(from);\n const endPos = editor.view.domAtPos(to);\n\n const domRange = document.createRange();\n domRange.setStart(fromPos.node, fromPos.offset);\n domRange.setEnd(endPos.node, endPos.offset);\n\n return domRange;\n}\n\nexport function compareSelections(\n a: Selection | null | undefined,\n b: Selection | null | undefined\n) {\n if (!a || !b) {\n return false;\n }\n\n return a.eq(b);\n}\n"],"names":[],"mappings":";;;AAQa,MAAA,iBAAA,GAAoB,CAAC,MAKV,KAAA;AACtB,EAAO,OAAA;AAAA,IACL,GAAG,MAAA;AAAA,IACH,GAAG,MAAO,CAAA,IAAA;AAAA,IACV,GAAG,MAAO,CAAA,GAAA;AAAA,IACV,KAAA,EAAO,MAAO,CAAA,KAAA,GAAQ,MAAO,CAAA,IAAA;AAAA,IAC7B,MAAA,EAAQ,MAAO,CAAA,MAAA,GAAS,MAAO,CAAA,GAAA;AAAA,GACjC,CAAA;AACF,EAAA;AAEa,MAAA,mBAAA,GAAsB,CACjC,IAAA,EACA,KACiD,KAAA;AACjD,EAAA,MAAM,SAAuD,EAAC,CAAA;AAC9D,EAAA,IAAA,CAAK,aAAa,KAAM,CAAA,IAAA,EAAM,KAAM,CAAA,EAAA,EAAI,CAAC,KAAU,KAAA;AACjD,IAAI,IAAA,KAAA,CAAM,IAAK,CAAA,IAAA,KAAS,uBAAyB,EAAA;AAC/C,MAAA,MAAM,UAAU,KAAM,CAAA,KAAA,CAAA;AACtB,MAAI,IAAA,OAAA,CAAQ,EAAM,IAAA,OAAA,CAAQ,cAAgB,EAAA;AACxC,QAAA,MAAA,CAAO,IAAK,CAAA;AAAA,UACV,gBAAgB,OAAQ,CAAA,cAAA;AAAA,UACxB,QAAQ,OAAQ,CAAA,EAAA;AAAA,SACjB,CAAA,CAAA;AAAA,OACH;AAAA,KACF;AAAA,GACD,CAAA,CAAA;AACD,EAAO,OAAA,MAAA,CAAA;AACT,EAAA;AAGa,MAAA,WAAA,GAAc,CACzB,QAAA,EACA,QAGa,KAAA;AACb,EAAA,MAAM,UAA6B,EAAC,CAAA;AACpC,EAAS,QAAA,CAAA,OAAA,CAAQ,CAAC,IAAS,KAAA;AACzB,IAAI,IAAA,IAAA,CAAK,OAAQ,CAAA,UAAA,GAAa,CAAG,EAAA;AAC/B,MAAQ,OAAA,CAAA,IAAA;AAAA,QACN,IAAA,CAAK,KAAK,MAAO,CAAA,IAAA,CAAK,OAAO,WAAY,CAAA,IAAA,CAAK,OAAS,EAAA,QAAQ,CAAC,CAAA;AAAA,OAClE,CAAA;AACA,MAAA,OAAA;AAAA,KACF;AACA,IAAQ,OAAA,CAAA,IAAA,CAAK,QAAS,CAAA,IAAI,CAAoB,CAAA,CAAA;AAAA,GAC/C,CAAA,CAAA;AAED,EAAO,OAAA,QAAA,CAAS,KAAK,OAAO,CAAA,CAAA;AAC9B,EAAA;AAEgB,SAAA,wBAAA,CAAyB,WAAsB,MAAgB,EAAA;AAC7E,EAAM,MAAA,EAAE,IAAM,EAAA,EAAA,EAAO,GAAA,SAAA,CAAA;AACrB,EAAA,MAAM,OAAU,GAAA,MAAA,CAAO,IAAK,CAAA,QAAA,CAAS,IAAI,CAAA,CAAA;AACzC,EAAA,MAAM,MAAS,GAAA,MAAA,CAAO,IAAK,CAAA,QAAA,CAAS,EAAE,CAAA,CAAA;AAEtC,EAAM,MAAA,QAAA,GAAW,SAAS,WAAY,EAAA,CAAA;AACtC,EAAA,QAAA,CAAS,QAAS,CAAA,OAAA,CAAQ,IAAM,EAAA,OAAA,CAAQ,MAAM,CAAA,CAAA;AAC9C,EAAA,QAAA,CAAS,MAAO,CAAA,MAAA,CAAO,IAAM,EAAA,MAAA,CAAO,MAAM,CAAA,CAAA;AAE1C,EAAO,OAAA,QAAA,CAAA;AACT,CAAA;AAEgB,SAAA,iBAAA,CACd,GACA,CACA,EAAA;AACA,EAAI,IAAA,CAAC,CAAK,IAAA,CAAC,CAAG,EAAA;AACZ,IAAO,OAAA,KAAA,CAAA;AAAA,GACT;AAEA,EAAO,OAAA,CAAA,CAAE,GAAG,CAAC,CAAA,CAAA;AACf;;;;"}
|
|
1
|
+
{"version":3,"file":"utils.mjs","sources":["../src/utils.ts"],"sourcesContent":["import type { ClientRectObject } from \"@floating-ui/react-dom\";\nimport type { ContextualPromptContext } from \"@liveblocks/core\";\nimport type { Editor, Range } from \"@tiptap/core\";\nimport type { Node as ProseMirrorNode } from \"@tiptap/pm/model\";\nimport { Fragment } from \"@tiptap/pm/model\";\nimport {\n type EditorState,\n type Selection,\n TextSelection,\n} from \"@tiptap/pm/state\";\nimport {\n getRelativeSelection,\n relativePositionToAbsolutePosition,\n ySyncPluginKey,\n} from \"y-prosemirror\";\nimport type { RelativePosition } from \"yjs\";\n\nimport type { YSyncPluginState } from \"./types\";\nimport { LIVEBLOCKS_MENTION_TYPE } from \"./types\";\n\nconst CONTEXT_TRUNCATION = \"[…]\";\nconst CONTEXT_BLOCK_SEPARATOR = \"\\n\";\n\nexport const getRelativeSelectionFromState = (state: EditorState) => {\n const pluginState = ySyncPluginKey.getState(state) as YSyncPluginState;\n if (!pluginState) return null;\n return getRelativeSelection(pluginState.binding, state);\n};\n\nexport const getRangeFromRelativeSelections = (\n pos: { anchor: RelativePosition; head: RelativePosition },\n state: EditorState\n) => {\n const pluginState = ySyncPluginKey.getState(state) as YSyncPluginState;\n if (!pluginState || !pluginState.binding) return { from: 0, to: 0 };\n const { doc, type, mapping } = pluginState.binding;\n const anchor =\n relativePositionToAbsolutePosition(doc, type, pos.anchor, mapping) ?? 0;\n const head =\n relativePositionToAbsolutePosition(doc, type, pos.head, mapping) ?? 0;\n\n const from = anchor > head ? head : anchor;\n const to = anchor > head ? anchor : head;\n return { from, to };\n};\n\nexport const getRectFromCoords = (coords: {\n top: number;\n left: number;\n right: number;\n bottom: number;\n}): ClientRectObject => {\n return {\n ...coords,\n x: coords.left,\n y: coords.top,\n width: coords.right - coords.left,\n height: coords.bottom - coords.top,\n };\n};\n\nexport const getMentionsFromNode = (\n node: ProseMirrorNode,\n range: Range\n): { notificationId: string; userId: string }[] => {\n const result: { notificationId: string; userId: string }[] = [];\n node.nodesBetween(range.from, range.to, (child) => {\n if (child.type.name === LIVEBLOCKS_MENTION_TYPE) {\n const mention = child.attrs as { id?: string; notificationId?: string };\n if (mention.id && mention.notificationId) {\n result.push({\n notificationId: mention.notificationId,\n userId: mention.id,\n });\n }\n }\n });\n return result;\n};\n\n// How to modify data in transformPasted, inspired by: https://discuss.prosemirror.net/t/modify-specific-node-on-copy-and-paste-in-clipboard/4901/4\nexport const mapFragment = (\n fragment: Fragment,\n callback: (\n node: ProseMirrorNode\n ) => ProseMirrorNode | ProseMirrorNode[] | Fragment | null\n): Fragment => {\n const content: ProseMirrorNode[] = [];\n fragment.forEach((node) => {\n if (node.content.childCount > 0) {\n content.push(\n node.type.create(node.attrs, mapFragment(node.content, callback))\n );\n return;\n }\n content.push(callback(node) as ProseMirrorNode);\n });\n\n return Fragment.from(content);\n};\n\nexport function getDomRangeFromSelection(editor: Editor, selection: Selection) {\n if (selection.from === selection.to) {\n const { parent, parentOffset } = selection.$from;\n\n // If the selection is collapsed and in an empty block node or at the end\n // of a text node, extend it to the entire node\n if (\n (parent.isBlock && parent.content.size === 0) ||\n (parent.isTextblock && parentOffset === parent.content.size)\n ) {\n selection = TextSelection.create(\n editor.state.doc,\n selection.$from.before(),\n selection.$from.after()\n );\n }\n }\n\n const from = editor.view.domAtPos(selection.from);\n const to = editor.view.domAtPos(selection.to);\n\n const domRange = document.createRange();\n domRange.setStart(from.node, from.offset);\n domRange.setEnd(to.node, to.offset);\n\n return domRange;\n}\n\nexport function compareSelections(\n a: Selection | null | undefined,\n b: Selection | null | undefined\n) {\n if (!a || !b) {\n return false;\n }\n\n return a.eq(b);\n}\n\nexport function getContextualPromptContext(\n editor: Editor,\n maxLength = 10_000\n): ContextualPromptContext {\n const { selection, doc } = editor.state;\n\n const selectionLength = selection.to - selection.from;\n\n if (maxLength >= doc.content.size) {\n // If the document is smaller than the maximum length, return the entire document\n return {\n beforeSelection: doc.textBetween(\n 0,\n selection.from,\n CONTEXT_BLOCK_SEPARATOR\n ),\n selection: doc.textBetween(\n selection.from,\n selection.to,\n CONTEXT_BLOCK_SEPARATOR\n ),\n afterSelection: doc.textBetween(\n selection.to,\n doc.content.size,\n CONTEXT_BLOCK_SEPARATOR\n ),\n };\n } else if (selectionLength > maxLength) {\n // If the selection is too large, truncate its middle to still allow continuations\n const selectionStart = doc.textBetween(\n selection.from,\n selection.from + Math.floor(maxLength / 2) - CONTEXT_TRUNCATION.length,\n CONTEXT_BLOCK_SEPARATOR\n );\n const selectionEnd = doc.textBetween(\n selection.to - Math.floor(maxLength / 2) + CONTEXT_TRUNCATION.length,\n selection.to,\n CONTEXT_BLOCK_SEPARATOR\n );\n\n return {\n beforeSelection: \"\",\n selection: `${selectionStart}${CONTEXT_TRUNCATION}${selectionEnd}`,\n afterSelection: \"\",\n };\n } else {\n // If the selection is smaller than (or equal to) the maximum length, extract as much as possible from the document around the selection\n\n // Start by taking as much as possible after the selection\n let beforeLength = Math.min(\n selection.from,\n Math.floor((maxLength - selectionLength) / 2)\n );\n const afterLength = Math.min(\n doc.content.size - selection.to,\n maxLength - selectionLength - beforeLength\n );\n\n // If needed (e.g. the selection is near the end), compensate before the selection\n if (beforeLength + afterLength + selectionLength < maxLength) {\n beforeLength = Math.min(\n selection.from,\n maxLength - selectionLength - afterLength\n );\n }\n\n let beforeSelection = doc.textBetween(\n Math.max(0, selection.from - beforeLength),\n selection.from,\n CONTEXT_BLOCK_SEPARATOR\n );\n let afterSelection = doc.textBetween(\n selection.to,\n Math.min(doc.content.size, selection.to + afterLength),\n CONTEXT_BLOCK_SEPARATOR\n );\n\n // Add leading truncation if `beforeSelection` doesn't contain the document's start\n if (selection.from - beforeLength > 0) {\n beforeSelection = `${CONTEXT_TRUNCATION}${beforeSelection}`;\n }\n\n // Add trailing truncation if `afterSelection` doesn't contain the document's end\n if (selection.to + afterLength < doc.content.size) {\n afterSelection = `${afterSelection}${CONTEXT_TRUNCATION}`;\n }\n\n return {\n beforeSelection,\n selection: doc.textBetween(\n selection.from,\n selection.to,\n CONTEXT_BLOCK_SEPARATOR\n ),\n afterSelection,\n };\n }\n}\n"],"names":[],"mappings":"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"}
|
package/dist/version.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
3
|
const PKG_NAME = "@liveblocks/react-tiptap";
|
|
4
|
-
const PKG_VERSION = typeof "2.
|
|
4
|
+
const PKG_VERSION = typeof "2.18.0" === "string" && "2.18.0";
|
|
5
5
|
const PKG_FORMAT = typeof "cjs" === "string" && "cjs";
|
|
6
6
|
|
|
7
7
|
exports.PKG_FORMAT = PKG_FORMAT;
|
package/dist/version.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"version.js","sources":["../src/version.ts"],"sourcesContent":["declare const __VERSION__: string;\ndeclare const ROLLUP_FORMAT: string;\n\nexport const PKG_NAME = \"@liveblocks/react-tiptap\";\nexport const PKG_VERSION = typeof __VERSION__ === \"string\" && __VERSION__;\nexport const PKG_FORMAT = typeof ROLLUP_FORMAT === \"string\" && ROLLUP_FORMAT;\n"],"names":[],"mappings":";;AAGO,MAAM,QAAW,GAAA,2BAAA;AACX,MAAA,WAAA,GAAc,OAAO,
|
|
1
|
+
{"version":3,"file":"version.js","sources":["../src/version.ts"],"sourcesContent":["declare const __VERSION__: string;\ndeclare const ROLLUP_FORMAT: string;\n\nexport const PKG_NAME = \"@liveblocks/react-tiptap\";\nexport const PKG_VERSION = typeof __VERSION__ === \"string\" && __VERSION__;\nexport const PKG_FORMAT = typeof ROLLUP_FORMAT === \"string\" && ROLLUP_FORMAT;\n"],"names":[],"mappings":";;AAGO,MAAM,QAAW,GAAA,2BAAA;AACX,MAAA,WAAA,GAAc,OAAO,QAAA,KAAgB,QAAY,IAAA,SAAA;AACjD,MAAA,UAAA,GAAa,OAAO,KAAA,KAAkB,QAAY,IAAA;;;;;;"}
|
package/dist/version.mjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
const PKG_NAME = "@liveblocks/react-tiptap";
|
|
2
|
-
const PKG_VERSION = typeof "2.
|
|
2
|
+
const PKG_VERSION = typeof "2.18.0" === "string" && "2.18.0";
|
|
3
3
|
const PKG_FORMAT = typeof "esm" === "string" && "esm";
|
|
4
4
|
|
|
5
5
|
export { PKG_FORMAT, PKG_NAME, PKG_VERSION };
|
package/dist/version.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"version.mjs","sources":["../src/version.ts"],"sourcesContent":["declare const __VERSION__: string;\ndeclare const ROLLUP_FORMAT: string;\n\nexport const PKG_NAME = \"@liveblocks/react-tiptap\";\nexport const PKG_VERSION = typeof __VERSION__ === \"string\" && __VERSION__;\nexport const PKG_FORMAT = typeof ROLLUP_FORMAT === \"string\" && ROLLUP_FORMAT;\n"],"names":[],"mappings":"AAGO,MAAM,QAAW,GAAA,2BAAA;AACX,MAAA,WAAA,GAAc,OAAO,
|
|
1
|
+
{"version":3,"file":"version.mjs","sources":["../src/version.ts"],"sourcesContent":["declare const __VERSION__: string;\ndeclare const ROLLUP_FORMAT: string;\n\nexport const PKG_NAME = \"@liveblocks/react-tiptap\";\nexport const PKG_VERSION = typeof __VERSION__ === \"string\" && __VERSION__;\nexport const PKG_FORMAT = typeof ROLLUP_FORMAT === \"string\" && ROLLUP_FORMAT;\n"],"names":[],"mappings":"AAGO,MAAM,QAAW,GAAA,2BAAA;AACX,MAAA,WAAA,GAAc,OAAO,QAAA,KAAgB,QAAY,IAAA,SAAA;AACjD,MAAA,UAAA,GAAa,OAAO,KAAA,KAAkB,QAAY,IAAA;;;;"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@liveblocks/react-tiptap",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.18.0",
|
|
4
4
|
"description": "A tiptap react plugin to enable collaboration, comments, live cursors, and more.",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"type": "commonjs",
|
|
@@ -42,16 +42,17 @@
|
|
|
42
42
|
},
|
|
43
43
|
"dependencies": {
|
|
44
44
|
"@floating-ui/react-dom": "^2.1.2",
|
|
45
|
-
"@liveblocks/client": "2.
|
|
46
|
-
"@liveblocks/core": "2.
|
|
47
|
-
"@liveblocks/react": "2.
|
|
48
|
-
"@liveblocks/react-ui": "2.
|
|
49
|
-
"@liveblocks/yjs": "2.
|
|
45
|
+
"@liveblocks/client": "2.18.0",
|
|
46
|
+
"@liveblocks/core": "2.18.0",
|
|
47
|
+
"@liveblocks/react": "2.18.0",
|
|
48
|
+
"@liveblocks/react-ui": "2.18.0",
|
|
49
|
+
"@liveblocks/yjs": "2.18.0",
|
|
50
50
|
"@radix-ui/react-select": "^2.1.2",
|
|
51
51
|
"@radix-ui/react-toggle": "^1.1.0",
|
|
52
52
|
"@tiptap/core": "^2.7.2",
|
|
53
53
|
"@tiptap/react": "^2.7.2",
|
|
54
54
|
"@tiptap/suggestion": "^2.7.2",
|
|
55
|
+
"cmdk": "^1.0.4",
|
|
55
56
|
"y-prosemirror": "^1.2.12",
|
|
56
57
|
"yjs": "^13.6.18"
|
|
57
58
|
},
|