@liveblocks/react-tiptap 2.17.0-usrnotsettings2 → 2.17.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.
Files changed (47) hide show
  1. package/dist/LiveblocksExtension.js +116 -21
  2. package/dist/LiveblocksExtension.js.map +1 -1
  3. package/dist/LiveblocksExtension.mjs +114 -19
  4. package/dist/LiveblocksExtension.mjs.map +1 -1
  5. package/dist/ai/AiExtension.js +382 -0
  6. package/dist/ai/AiExtension.js.map +1 -0
  7. package/dist/ai/AiExtension.mjs +378 -0
  8. package/dist/ai/AiExtension.mjs.map +1 -0
  9. package/dist/ai/AiToolbar.js +663 -0
  10. package/dist/ai/AiToolbar.js.map +1 -0
  11. package/dist/ai/AiToolbar.mjs +660 -0
  12. package/dist/ai/AiToolbar.mjs.map +1 -0
  13. package/dist/comments/CommentsExtension.js.map +1 -1
  14. package/dist/comments/CommentsExtension.mjs.map +1 -1
  15. package/dist/comments/FloatingComposer.js +2 -2
  16. package/dist/comments/FloatingComposer.js.map +1 -1
  17. package/dist/comments/FloatingComposer.mjs +2 -2
  18. package/dist/comments/FloatingComposer.mjs.map +1 -1
  19. package/dist/index.d.mts +107 -15
  20. package/dist/index.d.ts +107 -15
  21. package/dist/index.js +2 -0
  22. package/dist/index.js.map +1 -1
  23. package/dist/index.mjs +1 -0
  24. package/dist/index.mjs.map +1 -1
  25. package/dist/toolbar/FloatingToolbar.js +7 -0
  26. package/dist/toolbar/FloatingToolbar.js.map +1 -1
  27. package/dist/toolbar/FloatingToolbar.mjs +7 -0
  28. package/dist/toolbar/FloatingToolbar.mjs.map +1 -1
  29. package/dist/toolbar/Toolbar.js +35 -1
  30. package/dist/toolbar/Toolbar.js.map +1 -1
  31. package/dist/toolbar/Toolbar.mjs +36 -2
  32. package/dist/toolbar/Toolbar.mjs.map +1 -1
  33. package/dist/types.js.map +1 -1
  34. package/dist/types.mjs.map +1 -1
  35. package/dist/utils.js +118 -6
  36. package/dist/utils.js.map +1 -1
  37. package/dist/utils.mjs +116 -7
  38. package/dist/utils.mjs.map +1 -1
  39. package/dist/version.js +1 -1
  40. package/dist/version.js.map +1 -1
  41. package/dist/version.mjs +1 -1
  42. package/dist/version.mjs.map +1 -1
  43. package/package.json +7 -6
  44. package/src/styles/index.css +380 -3
  45. package/src/styles/utils.css +6 -0
  46. package/styles.css +1 -1
  47. 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(selection, editor) {
44
- const { from, to } = selection;
45
- const fromPos = editor.view.domAtPos(from);
46
- const endPos = editor.view.domAtPos(to);
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(fromPos.node, fromPos.offset);
49
- domRange.setEnd(endPos.node, endPos.offset);
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(selection, editor) {
42
- const { from, to } = selection;
43
- const fromPos = editor.view.domAtPos(from);
44
- const endPos = editor.view.domAtPos(to);
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(fromPos.node, fromPos.offset);
47
- domRange.setEnd(endPos.node, endPos.offset);
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
@@ -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.17.0-usrnotsettings2" === "string" && "2.17.0-usrnotsettings2";
4
+ const PKG_VERSION = typeof "2.17.0" === "string" && "2.17.0";
5
5
  const PKG_FORMAT = typeof "cjs" === "string" && "cjs";
6
6
 
7
7
  exports.PKG_FORMAT = PKG_FORMAT;
@@ -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,wBAAA,KAAgB,QAAY,IAAA,yBAAA;AACjD,MAAA,UAAA,GAAa,OAAO,KAAA,KAAkB,QAAY,IAAA;;;;;;"}
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.17.0-usrnotsettings2" === "string" && "2.17.0-usrnotsettings2";
2
+ const PKG_VERSION = typeof "2.17.0" === "string" && "2.17.0";
3
3
  const PKG_FORMAT = typeof "esm" === "string" && "esm";
4
4
 
5
5
  export { PKG_FORMAT, PKG_NAME, PKG_VERSION };
@@ -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,wBAAA,KAAgB,QAAY,IAAA,yBAAA;AACjD,MAAA,UAAA,GAAa,OAAO,KAAA,KAAkB,QAAY,IAAA;;;;"}
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.17.0-usrnotsettings2",
3
+ "version": "2.17.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.17.0-usrnotsettings2",
46
- "@liveblocks/core": "2.17.0-usrnotsettings2",
47
- "@liveblocks/react": "2.17.0-usrnotsettings2",
48
- "@liveblocks/react-ui": "2.17.0-usrnotsettings2",
49
- "@liveblocks/yjs": "2.17.0-usrnotsettings2",
45
+ "@liveblocks/client": "2.17.0",
46
+ "@liveblocks/core": "2.17.0",
47
+ "@liveblocks/react": "2.17.0",
48
+ "@liveblocks/react-ui": "2.17.0",
49
+ "@liveblocks/yjs": "2.17.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
  },