Skip to content

Commit fe8fb9f

Browse files
fix: Emoji picker issues (#2092)
* Emoji picker fixes * Fixed Mantine focus handling * Fixed build * Implemented PR feedback
1 parent 9ef3394 commit fe8fb9f

File tree

13 files changed

+63
-23
lines changed

13 files changed

+63
-23
lines changed

examples/07-collaboration/05-comments/src/style.css

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,3 +40,8 @@
4040
line-height: 12px;
4141
padding-left: 14px;
4242
}
43+
44+
.bn-thread {
45+
max-height: 200px;
46+
overflow: auto !important;
47+
}

examples/07-collaboration/06-comments-with-sidebar/src/style.css

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
flex-direction: column;
2424
gap: 10px;
2525
max-height: 100%;
26+
min-width: 350px;
2627
width: 0;
2728
}
2829

@@ -47,11 +48,6 @@
4748
max-width: 700px;
4849
}
4950

50-
.sidebar-comments-main-container .threads-sidebar-section,
51-
.sidebar-comments-main-container .bn-threads-sidebar .bn-thread {
52-
min-width: 0;
53-
}
54-
5551
.sidebar-comments-main-container .settings {
5652
display: flex;
5753
flex-wrap: wrap;

packages/ariakit/src/comments/Comment.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ export const Comment = forwardRef<
5858
actions,
5959
children,
6060
edited,
61+
emojiPickerOpen, // Unused
6162
...rest
6263
} = props;
6364

packages/ariakit/src/style.css

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,10 @@
3838
inset 0 1px 1px 1px var(--shadow);
3939
}
4040

41+
.bn-ak-popover {
42+
z-index: 10000;
43+
}
44+
4145
.bn-toolbar .bn-ak-popover {
4246
gap: 0.5rem;
4347
}

packages/mantine/src/blocknoteStyles.css

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,11 +74,13 @@
7474
}
7575

7676
/* Mantine Popover component base styles */
77-
.bn-mantine .mantine-Popover-dropdown:not(.bn-menu-dropdown) {
77+
.bn-mantine .bn-panel-popover,
78+
.bn-mantine .bn-emoji-picker-popover {
7879
background-color: transparent;
7980
border: none;
8081
border-radius: 0;
8182
box-shadow: none;
83+
display: flex;
8284
padding: 0;
8385
}
8486

packages/mantine/src/comments/Comment.tsx

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { assertEmpty } from "@blocknote/core";
22
import { ComponentProps, mergeRefs, useDictionary } from "@blocknote/react";
33
import { Avatar, Group, Skeleton, Text } from "@mantine/core";
4-
import { useFocusWithin, useHover } from "@mantine/hooks";
4+
import { useHover } from "@mantine/hooks";
55
import { forwardRef } from "react";
66

77
const AuthorInfo = forwardRef<
@@ -59,12 +59,12 @@ export const Comment = forwardRef<
5959
timeString,
6060
edited,
6161
actions,
62+
emojiPickerOpen,
6263
children,
6364
...rest
6465
} = props;
6566

6667
const { hovered, ref: hoverRef } = useHover();
67-
const { focused, ref: focusRef } = useFocusWithin();
6868
const mergedRef = mergeRefs([ref, hoverRef]);
6969
assertEmpty(rest, false);
7070

@@ -73,13 +73,12 @@ export const Comment = forwardRef<
7373
(showActions === true ||
7474
showActions === undefined ||
7575
(showActions === "hover" && hovered) ||
76-
focused);
76+
emojiPickerOpen);
7777

7878
return (
7979
<Group pos="relative" ref={mergedRef} className={className}>
8080
{doShowActions ? (
8181
<Group
82-
ref={focusRef}
8382
style={{
8483
position: "absolute",
8584
right: 0,

packages/mantine/src/popover/Popover.tsx

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,13 @@ export const Popover = (
1616
assertEmpty(rest);
1717

1818
return (
19-
<MantinePopover withinPortal={false} opened={opened} position={position}>
19+
<MantinePopover
20+
middlewares={{ size: { padding: 20 } }}
21+
withinPortal={false}
22+
opened={opened}
23+
position={position}
24+
zIndex={10000}
25+
>
2026
{children}
2127
</MantinePopover>
2228
);

packages/react/src/components/Comments/Comment.tsx

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@ export const Comment = ({
6969
const Components = useComponentsContext()!;
7070

7171
const [isEditing, setEditing] = useState(false);
72+
const [emojiPickerOpen, setEmojiPickerOpen] = useState(false);
7273

7374
if (!editor.comments) {
7475
throw new Error("Comments plugin not found");
@@ -166,6 +167,7 @@ export const Comment = ({
166167
onEmojiSelect={(emoji: { native: string }) =>
167168
onReactionSelect(emoji.native)
168169
}
170+
onOpenChange={setEmojiPickerOpen}
169171
>
170172
<Components.Generic.Toolbar.Button
171173
key={"add-reaction"}
@@ -250,6 +252,7 @@ export const Comment = ({
250252
showActions={"hover"}
251253
actions={actions}
252254
className={"bn-thread-comment"}
255+
emojiPickerOpen={emojiPickerOpen}
253256
>
254257
<CommentEditor
255258
autoFocus={isEditing}
@@ -279,6 +282,7 @@ export const Comment = ({
279282
onEmojiSelect={(emoji: { native: string }) =>
280283
onReactionSelect(emoji.native)
281284
}
285+
onOpenChange={setEmojiPickerOpen}
282286
>
283287
<Components.Generic.Badge.Root
284288
className={mergeCSSClasses(

packages/react/src/components/Comments/EmojiPicker.tsx

Lines changed: 26 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,18 @@ import { ReactNode, useState } from "react";
33
import { useComponentsContext } from "../../editor/ComponentsContext.js";
44
import { useBlockNoteContext } from "../../editor/BlockNoteContext.js";
55
import Picker from "./EmojiMartPicker.js";
6+
import { createPortal } from "react-dom";
7+
import { useBlockNoteEditor } from "../../hooks/useBlockNoteEditor.js";
68

79
export const EmojiPicker = (props: {
810
onEmojiSelect: (emoji: { native: string }) => void;
11+
onOpenChange?: (open: boolean) => void;
912
children: ReactNode;
1013
}) => {
1114
const [open, setOpen] = useState(false);
1215

1316
const Components = useComponentsContext()!;
17+
const editor = useBlockNoteEditor();
1418
const blockNoteContext = useBlockNoteContext();
1519

1620
return (
@@ -24,6 +28,7 @@ export const EmojiPicker = (props: {
2428
event.preventDefault();
2529
event.stopPropagation();
2630
setOpen(!open);
31+
props.onOpenChange?.(!open);
2732
}}
2833
style={{
2934
display: "flex",
@@ -34,17 +39,27 @@ export const EmojiPicker = (props: {
3439
{props.children}
3540
</div>
3641
</Components.Generic.Popover.Trigger>
37-
<Components.Generic.Popover.Content variant={"panel-popover"}>
38-
<Picker
39-
perLine={7}
40-
onClickOutside={() => setOpen(false)}
41-
onEmojiSelect={(emoji: { native: string }) => {
42-
props.onEmojiSelect(emoji);
43-
setOpen(false);
44-
}}
45-
theme={blockNoteContext?.colorSchemePreference}
46-
/>
47-
</Components.Generic.Popover.Content>
42+
{createPortal(
43+
<Components.Generic.Popover.Content
44+
className={"bn-emoji-picker-popover"}
45+
variant={"panel-popover"}
46+
>
47+
<Picker
48+
perLine={7}
49+
onClickOutside={() => {
50+
setOpen(false);
51+
props.onOpenChange?.(false);
52+
}}
53+
onEmojiSelect={(emoji: { native: string }) => {
54+
props.onEmojiSelect(emoji);
55+
setOpen(false);
56+
props.onOpenChange?.(false);
57+
}}
58+
theme={blockNoteContext?.colorSchemePreference}
59+
/>
60+
</Components.Generic.Popover.Content>,
61+
editor.domElement!.parentElement!,
62+
)}
4863
</Components.Generic.Popover.Root>
4964
);
5065
};

packages/react/src/editor/ComponentsContext.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -233,6 +233,7 @@ export type ComponentProps = {
233233
edited: boolean;
234234
actions?: ReactNode;
235235
showActions?: boolean | "hover";
236+
emojiPickerOpen?: boolean;
236237
};
237238
};
238239
// TODO: We should try to make everything as generic as we can

0 commit comments

Comments
 (0)