@liveblocks/react-tiptap 2.15.1 → 2.15.2

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.
@@ -2,9 +2,9 @@ import { jsx, jsxs } from 'react/jsx-runtime';
2
2
  import { useFloating, flip, offset, hide, shift, limitShift, size, autoUpdate } from '@floating-ui/react-dom';
3
3
  import { createInboxNotificationId } from '@liveblocks/core';
4
4
  import { useUser, useRoom } from '@liveblocks/react';
5
- import { useMentionSuggestions } from '@liveblocks/react/_private';
5
+ import { useMentionSuggestions, useLayoutEffect } from '@liveblocks/react/_private';
6
6
  import { useOverrides } from '@liveblocks/react-ui';
7
- import { forwardRef, useState, useLayoutEffect, useEffect, useImperativeHandle } from 'react';
7
+ import { forwardRef, useState, useEffect, useImperativeHandle } from 'react';
8
8
  import { Avatar } from './Avatar.mjs';
9
9
 
10
10
  const User = forwardRef(
@@ -23,118 +23,128 @@ const User = forwardRef(
23
23
  }
24
24
  );
25
25
  const SUGGESTIONS_COLLISION_PADDING = 10;
26
- const MentionsList = forwardRef((props, ref) => {
27
- const [selectedIndex, setSelectedIndex] = useState(0);
28
- const room = useRoom();
29
- const suggestions = useMentionSuggestions(room.id, props.query);
30
- const { onMouseEnter, onClick } = props;
31
- const {
32
- refs: { setReference, setFloating },
33
- strategy,
34
- x,
35
- y
36
- } = useFloating({
37
- strategy: "fixed",
38
- placement: "top-start",
39
- middleware: [
40
- flip({ padding: SUGGESTIONS_COLLISION_PADDING, crossAxis: false }),
41
- offset(10),
42
- hide({ padding: SUGGESTIONS_COLLISION_PADDING }),
43
- shift({ padding: SUGGESTIONS_COLLISION_PADDING, limiter: limitShift() }),
44
- size({ padding: SUGGESTIONS_COLLISION_PADDING })
45
- ],
46
- whileElementsMounted: (...args) => {
47
- return autoUpdate(...args, {
48
- animationFrame: true
49
- });
50
- }
51
- });
52
- useLayoutEffect(() => {
53
- setReference({
54
- getBoundingClientRect: props.clientRect
55
- });
56
- }, [setReference, props.clientRect]);
57
- const selectItem = (index) => {
58
- const item = (suggestions ?? [])[index];
59
- if (item) {
60
- props.command({ id: item, notificationId: createInboxNotificationId() });
61
- }
62
- };
63
- const upHandler = () => {
64
- setSelectedIndex((selectedIndex + (suggestions?.length ?? 0) - 1) % (suggestions?.length ?? 0));
65
- };
66
- const downHandler = () => {
67
- setSelectedIndex((selectedIndex + 1) % (suggestions?.length ?? 0));
68
- };
69
- const enterHandler = () => {
70
- selectItem(selectedIndex);
71
- };
72
- useEffect(() => setSelectedIndex(0), [suggestions]);
73
- useImperativeHandle(ref, () => ({
74
- onKeyDown: ({ event }) => {
75
- if (event.key === "ArrowUp") {
76
- upHandler();
77
- return true;
26
+ const MentionsList = forwardRef(
27
+ (props, ref) => {
28
+ const [selectedIndex, setSelectedIndex] = useState(0);
29
+ const room = useRoom();
30
+ const suggestions = useMentionSuggestions(room.id, props.query);
31
+ const { onMouseEnter, onClick } = props;
32
+ const {
33
+ refs: { setReference, setFloating },
34
+ strategy,
35
+ x,
36
+ y
37
+ } = useFloating({
38
+ strategy: "fixed",
39
+ placement: "top-start",
40
+ middleware: [
41
+ flip({ padding: SUGGESTIONS_COLLISION_PADDING, crossAxis: false }),
42
+ offset(10),
43
+ hide({ padding: SUGGESTIONS_COLLISION_PADDING }),
44
+ shift({
45
+ padding: SUGGESTIONS_COLLISION_PADDING,
46
+ limiter: limitShift()
47
+ }),
48
+ size({ padding: SUGGESTIONS_COLLISION_PADDING })
49
+ ],
50
+ whileElementsMounted: (...args) => {
51
+ return autoUpdate(...args, {
52
+ animationFrame: true
53
+ });
78
54
  }
79
- if (event.key === "ArrowDown") {
80
- downHandler();
81
- return true;
55
+ });
56
+ useLayoutEffect(() => {
57
+ setReference({
58
+ getBoundingClientRect: props.clientRect
59
+ });
60
+ }, [setReference, props.clientRect]);
61
+ const selectItem = (index) => {
62
+ const item = (suggestions ?? [])[index];
63
+ if (item) {
64
+ props.command({
65
+ id: item,
66
+ notificationId: createInboxNotificationId()
67
+ });
82
68
  }
83
- if (event.key === "Enter") {
84
- enterHandler();
85
- return true;
69
+ };
70
+ const upHandler = () => {
71
+ setSelectedIndex(
72
+ (selectedIndex + (suggestions?.length ?? 0) - 1) % (suggestions?.length ?? 0)
73
+ );
74
+ };
75
+ const downHandler = () => {
76
+ setSelectedIndex((selectedIndex + 1) % (suggestions?.length ?? 0));
77
+ };
78
+ const enterHandler = () => {
79
+ selectItem(selectedIndex);
80
+ };
81
+ useEffect(() => setSelectedIndex(0), [suggestions]);
82
+ useImperativeHandle(ref, () => ({
83
+ onKeyDown: ({ event }) => {
84
+ if (event.key === "ArrowUp") {
85
+ upHandler();
86
+ return true;
87
+ }
88
+ if (event.key === "ArrowDown") {
89
+ downHandler();
90
+ return true;
91
+ }
92
+ if (event.key === "Enter") {
93
+ enterHandler();
94
+ return true;
95
+ }
96
+ return false;
86
97
  }
87
- return false;
98
+ }));
99
+ const handleClick = (index) => (event) => {
100
+ onClick?.(event);
101
+ if (event.isDefaultPrevented())
102
+ return;
103
+ selectItem(index);
104
+ };
105
+ const handleMouseEnter = (index) => (event) => {
106
+ onMouseEnter?.(event);
107
+ if (event.isDefaultPrevented())
108
+ return;
109
+ setSelectedIndex(index);
110
+ };
111
+ if (suggestions === void 0 || suggestions.length === 0) {
112
+ return null;
88
113
  }
89
- }));
90
- const handleClick = (index) => (event) => {
91
- onClick?.(event);
92
- if (event.isDefaultPrevented())
93
- return;
94
- selectItem(index);
95
- };
96
- const handleMouseEnter = (index) => (event) => {
97
- onMouseEnter?.(event);
98
- if (event.isDefaultPrevented())
99
- return;
100
- setSelectedIndex(index);
101
- };
102
- if (suggestions === void 0 || suggestions.length === 0) {
103
- return null;
114
+ return /* @__PURE__ */ jsx("div", {
115
+ className: "lb-root lb-portal lb-elevation lb-tiptap-suggestions lb-tiptap-mention-suggestions",
116
+ ref: setFloating,
117
+ style: {
118
+ position: strategy,
119
+ top: 0,
120
+ left: 0,
121
+ transform: `translate3d(${Math.round(x)}px, ${Math.round(y)}px, 0)`,
122
+ minWidth: "max-content",
123
+ display: props.hide ? "none" : "block"
124
+ },
125
+ children: /* @__PURE__ */ jsx("div", {
126
+ className: "lb-tiptap-suggestions-list lb-tiptap-mention-suggestions-list",
127
+ children: suggestions.map((item, index) => /* @__PURE__ */ jsxs("div", {
128
+ className: "lb-tiptap-suggestions-list-item lb-tiptap-mention-suggestion",
129
+ role: "option",
130
+ "data-highlighted": index === selectedIndex || void 0,
131
+ onMouseEnter: handleMouseEnter(index),
132
+ onClick: handleClick(index),
133
+ children: [
134
+ /* @__PURE__ */ jsx(Avatar, {
135
+ userId: item,
136
+ className: "lb-tiptap-mention-suggestion-avatar"
137
+ }),
138
+ /* @__PURE__ */ jsx(User, {
139
+ userId: item,
140
+ className: "lb-tiptap-mention-suggestion-user"
141
+ })
142
+ ]
143
+ }, index))
144
+ })
145
+ });
104
146
  }
105
- return /* @__PURE__ */ jsx("div", {
106
- className: "lb-root lb-portal lb-elevation lb-tiptap-suggestions lb-tiptap-mention-suggestions",
107
- ref: setFloating,
108
- style: {
109
- position: strategy,
110
- top: 0,
111
- left: 0,
112
- transform: `translate3d(${Math.round(x)}px, ${Math.round(y)}px, 0)`,
113
- minWidth: "max-content",
114
- display: props.hide ? "none" : "block"
115
- },
116
- children: /* @__PURE__ */ jsx("div", {
117
- className: "lb-tiptap-suggestions-list lb-tiptap-mention-suggestions-list",
118
- children: suggestions.map((item, index) => /* @__PURE__ */ jsxs("div", {
119
- className: "lb-tiptap-suggestions-list-item lb-tiptap-mention-suggestion",
120
- role: "option",
121
- "data-highlighted": index === selectedIndex || void 0,
122
- onMouseEnter: handleMouseEnter(index),
123
- onClick: handleClick(index),
124
- children: [
125
- /* @__PURE__ */ jsx(Avatar, {
126
- userId: item,
127
- className: "lb-tiptap-mention-suggestion-avatar"
128
- }),
129
- /* @__PURE__ */ jsx(User, {
130
- userId: item,
131
- className: "lb-tiptap-mention-suggestion-user"
132
- })
133
- ]
134
- }, index))
135
- })
136
- });
137
- });
147
+ );
138
148
 
139
149
  export { MentionsList, SUGGESTIONS_COLLISION_PADDING, User };
140
150
  //# sourceMappingURL=MentionsList.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"MentionsList.mjs","sources":["../../src/mentions/MentionsList.tsx"],"sourcesContent":["import {\n autoUpdate,\n flip,\n hide,\n limitShift,\n offset,\n shift,\n size,\n useFloating,\n} from \"@floating-ui/react-dom\";\nimport { createInboxNotificationId } from \"@liveblocks/core\";\nimport { useRoom, useUser } from \"@liveblocks/react\";\nimport { useMentionSuggestions } from \"@liveblocks/react/_private\";\nimport { useOverrides } from \"@liveblocks/react-ui\";\nimport type { HTMLAttributes, MouseEvent } from \"react\";\nimport {\n forwardRef,\n useEffect,\n useImperativeHandle,\n useLayoutEffect,\n useState,\n} from \"react\";\n\nimport { Avatar } from \"./Avatar\";\n\nexport interface UserProps\n extends Omit<HTMLAttributes<HTMLSpanElement>, \"children\"> {\n userId: string;\n}\n\nexport const User = forwardRef<HTMLSpanElement, UserProps>(\n function User(props, forwardedRef) {\n const { userId, className, ...spanProps } = props;\n\n const { user, isLoading } = useUser(userId);\n const $ = useOverrides();\n\n const name =\n user === undefined || user === null ? $.USER_UNKNOWN : user.name;\n\n return (\n <span\n className={className}\n data-loading={isLoading ? \"\" : undefined}\n ref={forwardedRef}\n {...spanProps}\n >\n {isLoading ? null : name}\n </span>\n );\n }\n);\n\n\nexport const SUGGESTIONS_COLLISION_PADDING = 10;\n\nexport interface MentionsListProps extends HTMLAttributes<HTMLDivElement> {\n query: string,\n command: (otps: { id: string, notificationId: string }) => void,\n clientRect: () => DOMRect,\n hide: boolean\n}\n\nexport type MentionsListHandle = {\n onKeyDown: ({ event }: { event: KeyboardEvent }) => boolean,\n};\n\nexport const MentionsList = forwardRef<MentionsListHandle, MentionsListProps>((props, ref) => {\n const [selectedIndex, setSelectedIndex] = useState(0);\n const room = useRoom();\n const suggestions = useMentionSuggestions(room.id, props.query);\n const { onMouseEnter, onClick } = props;\n const {\n refs: { setReference, setFloating },\n strategy,\n x,\n y,\n } = useFloating({\n strategy: \"fixed\",\n placement: \"top-start\",\n middleware: [\n flip({ padding: SUGGESTIONS_COLLISION_PADDING, crossAxis: false }),\n offset(10),\n hide({ padding: SUGGESTIONS_COLLISION_PADDING }),\n shift({ padding: SUGGESTIONS_COLLISION_PADDING, limiter: limitShift() }),\n size({ padding: SUGGESTIONS_COLLISION_PADDING }),\n ],\n whileElementsMounted: (...args) => {\n return autoUpdate(...args, {\n animationFrame: true,\n });\n },\n });\n\n useLayoutEffect(() => {\n setReference({\n getBoundingClientRect: props.clientRect,\n });\n }, [setReference, props.clientRect]);\n\n const selectItem = (index: number) => {\n const item = (suggestions ?? [])[index];\n if (item) {\n props.command({ id: item, notificationId: createInboxNotificationId() });\n }\n }\n\n const upHandler = () => {\n setSelectedIndex((selectedIndex + (suggestions?.length ?? 0) - 1) % (suggestions?.length ?? 0))\n }\n\n const downHandler = () => {\n setSelectedIndex((selectedIndex + 1) % (suggestions?.length ?? 0))\n }\n\n const enterHandler = () => {\n selectItem(selectedIndex)\n }\n\n useEffect(() => setSelectedIndex(0), [suggestions])\n\n useImperativeHandle(ref, () => ({\n onKeyDown: ({ event }: { event: KeyboardEvent }) => {\n if (event.key === \"ArrowUp\") {\n upHandler()\n return true\n }\n\n if (event.key === \"ArrowDown\") {\n downHandler()\n return true\n }\n\n if (event.key === \"Enter\") {\n enterHandler()\n return true\n }\n\n return false\n },\n }))\n\n const handleClick = (index: number) => (event: MouseEvent<HTMLDivElement>) => {\n onClick?.(event);\n\n if (event.isDefaultPrevented()) return;\n selectItem(index)\n }\n const handleMouseEnter = (index: number) => (event: MouseEvent<HTMLDivElement>) => {\n onMouseEnter?.(event);\n\n if (event.isDefaultPrevented()) return;\n\n setSelectedIndex(index);\n }\n\n if (suggestions === undefined || suggestions.length === 0) {\n return null\n }\n\n return (\n <div className=\"lb-root lb-portal lb-elevation lb-tiptap-suggestions lb-tiptap-mention-suggestions\" ref={setFloating}\n style={{\n position: strategy,\n top: 0,\n left: 0,\n transform: `translate3d(${Math.round(x)}px, ${Math.round(y)}px, 0)`,\n minWidth: \"max-content\",\n display: props.hide ? \"none\" : \"block\"\n }}>\n <div className=\"lb-tiptap-suggestions-list lb-tiptap-mention-suggestions-list\">\n {suggestions.map((item, index) => (\n <div className=\"lb-tiptap-suggestions-list-item lb-tiptap-mention-suggestion\"\n key={index}\n role=\"option\"\n data-highlighted={index === selectedIndex || undefined}\n\n onMouseEnter={handleMouseEnter(index)}\n onClick={handleClick(index)}>\n <Avatar\n userId={item}\n className=\"lb-tiptap-mention-suggestion-avatar\"\n />\n <User\n userId={item}\n className=\"lb-tiptap-mention-suggestion-user\"\n />\n </div>\n ))\n }\n </div>\n </div>\n )\n})"],"names":["User"],"mappings":"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"}
1
+ {"version":3,"file":"MentionsList.mjs","sources":["../../src/mentions/MentionsList.tsx"],"sourcesContent":["import {\n autoUpdate,\n flip,\n hide,\n limitShift,\n offset,\n shift,\n size,\n useFloating,\n} from \"@floating-ui/react-dom\";\nimport { createInboxNotificationId } from \"@liveblocks/core\";\nimport { useRoom, useUser } from \"@liveblocks/react\";\nimport {\n useLayoutEffect,\n useMentionSuggestions,\n} from \"@liveblocks/react/_private\";\nimport { useOverrides } from \"@liveblocks/react-ui\";\nimport type { HTMLAttributes, MouseEvent } from \"react\";\nimport { forwardRef, useEffect, useImperativeHandle, useState } from \"react\";\n\nimport { Avatar } from \"./Avatar\";\n\nexport interface UserProps\n extends Omit<HTMLAttributes<HTMLSpanElement>, \"children\"> {\n userId: string;\n}\n\nexport const User = forwardRef<HTMLSpanElement, UserProps>(\n function User(props, forwardedRef) {\n const { userId, className, ...spanProps } = props;\n\n const { user, isLoading } = useUser(userId);\n const $ = useOverrides();\n\n const name =\n user === undefined || user === null ? $.USER_UNKNOWN : user.name;\n\n return (\n <span\n className={className}\n data-loading={isLoading ? \"\" : undefined}\n ref={forwardedRef}\n {...spanProps}\n >\n {isLoading ? null : name}\n </span>\n );\n }\n);\n\nexport const SUGGESTIONS_COLLISION_PADDING = 10;\n\nexport interface MentionsListProps extends HTMLAttributes<HTMLDivElement> {\n query: string;\n command: (otps: { id: string; notificationId: string }) => void;\n clientRect: () => DOMRect;\n hide: boolean;\n}\n\nexport type MentionsListHandle = {\n onKeyDown: ({ event }: { event: KeyboardEvent }) => boolean;\n};\n\nexport const MentionsList = forwardRef<MentionsListHandle, MentionsListProps>(\n (props, ref) => {\n const [selectedIndex, setSelectedIndex] = useState(0);\n const room = useRoom();\n const suggestions = useMentionSuggestions(room.id, props.query);\n const { onMouseEnter, onClick } = props;\n const {\n refs: { setReference, setFloating },\n strategy,\n x,\n y,\n } = useFloating({\n strategy: \"fixed\",\n placement: \"top-start\",\n middleware: [\n flip({ padding: SUGGESTIONS_COLLISION_PADDING, crossAxis: false }),\n offset(10),\n hide({ padding: SUGGESTIONS_COLLISION_PADDING }),\n shift({\n padding: SUGGESTIONS_COLLISION_PADDING,\n limiter: limitShift(),\n }),\n size({ padding: SUGGESTIONS_COLLISION_PADDING }),\n ],\n whileElementsMounted: (...args) => {\n return autoUpdate(...args, {\n animationFrame: true,\n });\n },\n });\n\n useLayoutEffect(() => {\n setReference({\n getBoundingClientRect: props.clientRect,\n });\n }, [setReference, props.clientRect]);\n\n const selectItem = (index: number) => {\n const item = (suggestions ?? [])[index];\n if (item) {\n props.command({\n id: item,\n notificationId: createInboxNotificationId(),\n });\n }\n };\n\n const upHandler = () => {\n setSelectedIndex(\n (selectedIndex + (suggestions?.length ?? 0) - 1) %\n (suggestions?.length ?? 0)\n );\n };\n\n const downHandler = () => {\n setSelectedIndex((selectedIndex + 1) % (suggestions?.length ?? 0));\n };\n\n const enterHandler = () => {\n selectItem(selectedIndex);\n };\n\n useEffect(() => setSelectedIndex(0), [suggestions]);\n\n useImperativeHandle(ref, () => ({\n onKeyDown: ({ event }: { event: KeyboardEvent }) => {\n if (event.key === \"ArrowUp\") {\n upHandler();\n return true;\n }\n\n if (event.key === \"ArrowDown\") {\n downHandler();\n return true;\n }\n\n if (event.key === \"Enter\") {\n enterHandler();\n return true;\n }\n\n return false;\n },\n }));\n\n const handleClick =\n (index: number) => (event: MouseEvent<HTMLDivElement>) => {\n onClick?.(event);\n\n if (event.isDefaultPrevented()) return;\n selectItem(index);\n };\n const handleMouseEnter =\n (index: number) => (event: MouseEvent<HTMLDivElement>) => {\n onMouseEnter?.(event);\n\n if (event.isDefaultPrevented()) return;\n\n setSelectedIndex(index);\n };\n\n if (suggestions === undefined || suggestions.length === 0) {\n return null;\n }\n\n return (\n <div\n className=\"lb-root lb-portal lb-elevation lb-tiptap-suggestions lb-tiptap-mention-suggestions\"\n ref={setFloating}\n style={{\n position: strategy,\n top: 0,\n left: 0,\n transform: `translate3d(${Math.round(x)}px, ${Math.round(y)}px, 0)`,\n minWidth: \"max-content\",\n display: props.hide ? \"none\" : \"block\",\n }}\n >\n <div className=\"lb-tiptap-suggestions-list lb-tiptap-mention-suggestions-list\">\n {suggestions.map((item, index) => (\n <div\n className=\"lb-tiptap-suggestions-list-item lb-tiptap-mention-suggestion\"\n key={index}\n role=\"option\"\n data-highlighted={index === selectedIndex || undefined}\n onMouseEnter={handleMouseEnter(index)}\n onClick={handleClick(index)}\n >\n <Avatar\n userId={item}\n className=\"lb-tiptap-mention-suggestion-avatar\"\n />\n <User\n userId={item}\n className=\"lb-tiptap-mention-suggestion-user\"\n />\n </div>\n ))}\n </div>\n </div>\n );\n }\n);\n"],"names":["User"],"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.15.1" === "string" && "2.15.1";
4
+ const PKG_VERSION = typeof "2.15.2" === "string" && "2.15.2";
5
5
  const PKG_FORMAT = typeof "cjs" === "string" && "cjs";
6
6
 
7
7
  exports.PKG_FORMAT = PKG_FORMAT;
package/dist/version.mjs CHANGED
@@ -1,5 +1,5 @@
1
1
  const PKG_NAME = "@liveblocks/react-tiptap";
2
- const PKG_VERSION = typeof "2.15.1" === "string" && "2.15.1";
2
+ const PKG_VERSION = typeof "2.15.2" === "string" && "2.15.2";
3
3
  const PKG_FORMAT = typeof "esm" === "string" && "esm";
4
4
 
5
5
  export { PKG_FORMAT, PKG_NAME, PKG_VERSION };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@liveblocks/react-tiptap",
3
- "version": "2.15.1",
3
+ "version": "2.15.2",
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,11 +42,11 @@
42
42
  },
43
43
  "dependencies": {
44
44
  "@floating-ui/react-dom": "^2.1.2",
45
- "@liveblocks/client": "2.15.1",
46
- "@liveblocks/core": "2.15.1",
47
- "@liveblocks/react": "2.15.1",
48
- "@liveblocks/react-ui": "2.15.1",
49
- "@liveblocks/yjs": "2.15.1",
45
+ "@liveblocks/client": "2.15.2",
46
+ "@liveblocks/core": "2.15.2",
47
+ "@liveblocks/react": "2.15.2",
48
+ "@liveblocks/react-ui": "2.15.2",
49
+ "@liveblocks/yjs": "2.15.2",
50
50
  "@tiptap/core": "^2.7.2",
51
51
  "@tiptap/react": "^2.7.2",
52
52
  "@tiptap/suggestion": "^2.7.2",