Skip to content

Commit ba5971d

Browse files
fix: More Notion-like side menu positioning (#812)
* Made side menu position at first line of block * Improved attribute naming
1 parent 9c8029d commit ba5971d

File tree

8 files changed

+65
-9
lines changed

8 files changed

+65
-9
lines changed

packages/ariakit/src/menu/Menu.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ export const MenuDropdown = forwardRef<
4040

4141
return (
4242
<Ariakit.Menu
43+
unmountOnHide={true}
4344
className={mergeCSSClasses("bn-ak-menu", className || "")}
4445
ref={ref}>
4546
{children}

packages/ariakit/src/sideMenu/SideMenu.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,10 @@ export const SideMenu = forwardRef<
1010
>((props, ref) => {
1111
const { className, children, ...rest } = props;
1212

13-
assertEmpty(rest);
13+
assertEmpty(rest, false);
1414

1515
return (
16-
<Ariakit.Group className={className} ref={ref}>
16+
<Ariakit.Group className={className} ref={ref} {...rest}>
1717
{children}
1818
</Ariakit.Group>
1919
);

packages/mantine/src/sideMenu/SideMenu.tsx

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,15 @@ export const SideMenu = forwardRef<
1010
>((props, ref) => {
1111
const { className, children, ...rest } = props;
1212

13-
assertEmpty(rest);
13+
assertEmpty(rest, false);
1414

1515
return (
16-
<Mantine.Group align={"center"} gap={0} className={className} ref={ref}>
16+
<Mantine.Group
17+
align={"center"}
18+
gap={0}
19+
className={className}
20+
ref={ref}
21+
{...rest}>
1722
{children}
1823
</Mantine.Group>
1924
);

packages/react/src/components/SideMenu/SideMenu.tsx

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import {
66
InlineContentSchema,
77
StyleSchema,
88
} from "@blocknote/core";
9-
import { ReactNode } from "react";
9+
import { ReactNode, useMemo } from "react";
1010

1111
import { AddBlockButton } from "./DefaultButtons/AddBlockButton";
1212
import { DragHandleButton } from "./DefaultButtons/DragHandleButton";
@@ -33,8 +33,28 @@ export const SideMenu = <
3333

3434
const { addBlock, ...rest } = props;
3535

36+
const dataAttributes = useMemo(() => {
37+
const attrs: Record<string, string> = {
38+
"data-block-type": props.block.type,
39+
};
40+
41+
if (props.block.type === "heading") {
42+
attrs["data-level"] = props.block.props.level.toString();
43+
}
44+
45+
if (props.editor.schema.blockSchema[props.block.type].isFileBlock) {
46+
if (props.block.props.url) {
47+
attrs["data-url"] = "true";
48+
} else {
49+
attrs["data-url"] = "false";
50+
}
51+
}
52+
53+
return attrs;
54+
}, [props.block, props.editor.schema.blockSchema]);
55+
3656
return (
37-
<Components.SideMenu.Root className={"bn-side-menu"}>
57+
<Components.SideMenu.Root className={"bn-side-menu"} {...dataAttributes}>
3858
{props.children || (
3959
<>
4060
<AddBlockButton addBlock={addBlock} />

packages/react/src/components/SideMenu/SideMenuController.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ export const SideMenuController = <
3939
state?.referencePos || null,
4040
1000,
4141
{
42-
placement: "left",
42+
placement: "left-start",
4343
}
4444
);
4545

packages/react/src/editor/styles.css

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -210,3 +210,32 @@
210210
[data-background-color="pink"] {
211211
background-color: var(--bn-colors-highlights-pink-background);
212212
}
213+
214+
/* Matching Side Menu height to block line height */
215+
.bn-side-menu {
216+
height: 30px;
217+
}
218+
219+
.bn-side-menu[data-block-type="heading"][data-level="1"] {
220+
height: 78px;
221+
}
222+
223+
.bn-side-menu[data-block-type="heading"][data-level="2"] {
224+
height: 54px;
225+
}
226+
227+
.bn-side-menu[data-block-type="heading"][data-level="3"] {
228+
height: 37px;
229+
}
230+
231+
.bn-side-menu[data-block-type="file"] {
232+
height: 38px;
233+
}
234+
235+
.bn-side-menu[data-block-type="audio"] {
236+
height: 60px;
237+
}
238+
239+
.bn-side-menu[data-url="false"] {
240+
height: 54px;
241+
}

packages/shadcn/src/sideMenu/SideMenu.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,10 @@ export const SideMenu = forwardRef<
88
>((props, ref) => {
99
const { className, children, ...rest } = props;
1010

11-
assertEmpty(rest);
11+
assertEmpty(rest, false);
1212

1313
return (
14-
<div className={className} ref={ref}>
14+
<div className={className} ref={ref} {...rest}>
1515
{children}
1616
</div>
1717
);

packages/shadcn/src/style.css

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,7 @@
8282
}
8383

8484
.bn-side-menu {
85+
align-items: center;
8586
display: flex;
8687
justify-content: center;
8788
}

0 commit comments

Comments
 (0)