@blocknote/ariakit 0.13.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/LICENSE +373 -0
- package/dist/blocknote-ariakit.js +1146 -0
- package/dist/blocknote-ariakit.js.map +1 -0
- package/dist/blocknote-ariakit.umd.cjs +28 -0
- package/dist/blocknote-ariakit.umd.cjs.map +1 -0
- package/dist/style.css +1 -0
- package/dist/webpack-stats.json +1 -0
- package/package.json +84 -0
- package/src/ariakitStyles.css +1005 -0
- package/src/index.tsx +103 -0
- package/src/input/Form.tsx +12 -0
- package/src/input/TextInput.tsx +48 -0
- package/src/menu/Menu.tsx +130 -0
- package/src/panel/Panel.tsx +55 -0
- package/src/panel/PanelButton.tsx +24 -0
- package/src/panel/PanelFileInput.tsx +28 -0
- package/src/panel/PanelTab.tsx +18 -0
- package/src/panel/PanelTextInput.tsx +29 -0
- package/src/popover/Popover.tsx +47 -0
- package/src/sideMenu/SideMenu.tsx +20 -0
- package/src/sideMenu/SideMenuButton.tsx +44 -0
- package/src/style.css +136 -0
- package/src/suggestionMenu/SuggestionMenu.tsx +24 -0
- package/src/suggestionMenu/SuggestionMenuEmptyItem.tsx +20 -0
- package/src/suggestionMenu/SuggestionMenuItem.tsx +43 -0
- package/src/suggestionMenu/SuggestionMenuLabel.tsx +20 -0
- package/src/suggestionMenu/SuggestionMenuLoader.tsx +18 -0
- package/src/tableHandle/TableHandle.tsx +42 -0
- package/src/toolbar/Toolbar.tsx +26 -0
- package/src/toolbar/ToolbarButton.tsx +73 -0
- package/src/toolbar/ToolbarSelect.tsx +47 -0
- package/types/src/index.d.ts +6 -0
- package/types/src/input/Form.d.ts +2 -0
- package/types/src/input/TextInput.d.ts +13 -0
- package/types/src/menu/Menu.d.ts +24 -0
- package/types/src/panel/Panel.d.ts +12 -0
- package/types/src/panel/PanelButton.d.ts +11 -0
- package/types/src/panel/PanelFileInput.d.ts +7 -0
- package/types/src/panel/PanelTab.d.ts +5 -0
- package/types/src/panel/PanelTextInput.d.ts +8 -0
- package/types/src/popover/Popover.d.ts +11 -0
- package/types/src/sideMenu/SideMenu.d.ts +5 -0
- package/types/src/sideMenu/SideMenuButton.d.ts +15 -0
- package/types/src/suggestionMenu/SuggestionMenu.d.ts +6 -0
- package/types/src/suggestionMenu/SuggestionMenuEmptyItem.d.ts +5 -0
- package/types/src/suggestionMenu/SuggestionMenuItem.d.ts +8 -0
- package/types/src/suggestionMenu/SuggestionMenuLabel.d.ts +5 -0
- package/types/src/suggestionMenu/SuggestionMenuLoader.d.ts +5 -0
- package/types/src/tableHandle/TableHandle.d.ts +14 -0
- package/types/src/toolbar/Toolbar.d.ts +10 -0
- package/types/src/toolbar/ToolbarButton.d.ts +8 -0
- package/types/src/toolbar/ToolbarSelect.d.ts +12 -0
package/src/index.tsx
ADDED
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import { BlockSchema, InlineContentSchema, StyleSchema } from "@blocknote/core";
|
|
2
|
+
import {
|
|
3
|
+
BlockNoteViewRaw,
|
|
4
|
+
Components,
|
|
5
|
+
ComponentsContext,
|
|
6
|
+
} from "@blocknote/react";
|
|
7
|
+
import { ComponentProps } from "react";
|
|
8
|
+
|
|
9
|
+
import { Form } from "./input/Form";
|
|
10
|
+
import { TextInput } from "./input/TextInput";
|
|
11
|
+
import {
|
|
12
|
+
Menu,
|
|
13
|
+
MenuDivider,
|
|
14
|
+
MenuDropdown,
|
|
15
|
+
MenuItem,
|
|
16
|
+
MenuLabel,
|
|
17
|
+
MenuTrigger,
|
|
18
|
+
} from "./menu/Menu";
|
|
19
|
+
import { Panel } from "./panel/Panel";
|
|
20
|
+
import { PanelButton } from "./panel/PanelButton";
|
|
21
|
+
import { PanelFileInput } from "./panel/PanelFileInput";
|
|
22
|
+
import { PanelTab } from "./panel/PanelTab";
|
|
23
|
+
import { PanelTextInput } from "./panel/PanelTextInput";
|
|
24
|
+
import { Popover, PopoverContent, PopoverTrigger } from "./popover/Popover";
|
|
25
|
+
import { SideMenu } from "./sideMenu/SideMenu";
|
|
26
|
+
import { SideMenuButton } from "./sideMenu/SideMenuButton";
|
|
27
|
+
import { SuggestionMenu } from "./suggestionMenu/SuggestionMenu";
|
|
28
|
+
import { SuggestionMenuItem } from "./suggestionMenu/SuggestionMenuItem";
|
|
29
|
+
import { SuggestionMenuEmptyItem } from "./suggestionMenu/SuggestionMenuEmptyItem";
|
|
30
|
+
import { SuggestionMenuLabel } from "./suggestionMenu/SuggestionMenuLabel";
|
|
31
|
+
import { SuggestionMenuLoader } from "./suggestionMenu/SuggestionMenuLoader";
|
|
32
|
+
import { TableHandle } from "./tableHandle/TableHandle";
|
|
33
|
+
import { Toolbar } from "./toolbar/Toolbar";
|
|
34
|
+
import { ToolbarButton } from "./toolbar/ToolbarButton";
|
|
35
|
+
import { ToolbarSelect } from "./toolbar/ToolbarSelect";
|
|
36
|
+
|
|
37
|
+
import "./style.css";
|
|
38
|
+
|
|
39
|
+
export const components: Components = {
|
|
40
|
+
FormattingToolbar: {
|
|
41
|
+
Root: Toolbar,
|
|
42
|
+
Button: ToolbarButton,
|
|
43
|
+
Select: ToolbarSelect,
|
|
44
|
+
},
|
|
45
|
+
ImagePanel: {
|
|
46
|
+
Root: Panel,
|
|
47
|
+
Button: PanelButton,
|
|
48
|
+
FileInput: PanelFileInput,
|
|
49
|
+
TabPanel: PanelTab,
|
|
50
|
+
TextInput: PanelTextInput,
|
|
51
|
+
},
|
|
52
|
+
LinkToolbar: {
|
|
53
|
+
Root: Toolbar,
|
|
54
|
+
Button: ToolbarButton,
|
|
55
|
+
},
|
|
56
|
+
SideMenu: {
|
|
57
|
+
Root: SideMenu,
|
|
58
|
+
Button: SideMenuButton,
|
|
59
|
+
},
|
|
60
|
+
SuggestionMenu: {
|
|
61
|
+
Root: SuggestionMenu,
|
|
62
|
+
Item: SuggestionMenuItem,
|
|
63
|
+
EmptyItem: SuggestionMenuEmptyItem,
|
|
64
|
+
Label: SuggestionMenuLabel,
|
|
65
|
+
Loader: SuggestionMenuLoader,
|
|
66
|
+
},
|
|
67
|
+
TableHandle: {
|
|
68
|
+
Root: TableHandle,
|
|
69
|
+
},
|
|
70
|
+
Generic: {
|
|
71
|
+
Form: {
|
|
72
|
+
Root: Form,
|
|
73
|
+
TextInput: TextInput,
|
|
74
|
+
},
|
|
75
|
+
Menu: {
|
|
76
|
+
Root: Menu,
|
|
77
|
+
Trigger: MenuTrigger,
|
|
78
|
+
Dropdown: MenuDropdown,
|
|
79
|
+
Divider: MenuDivider,
|
|
80
|
+
Label: MenuLabel,
|
|
81
|
+
Item: MenuItem,
|
|
82
|
+
},
|
|
83
|
+
Popover: {
|
|
84
|
+
Root: Popover,
|
|
85
|
+
Trigger: PopoverTrigger,
|
|
86
|
+
Content: PopoverContent,
|
|
87
|
+
},
|
|
88
|
+
},
|
|
89
|
+
};
|
|
90
|
+
|
|
91
|
+
export const BlockNoteView = <
|
|
92
|
+
BSchema extends BlockSchema,
|
|
93
|
+
ISchema extends InlineContentSchema,
|
|
94
|
+
SSchema extends StyleSchema
|
|
95
|
+
>(
|
|
96
|
+
props: ComponentProps<typeof BlockNoteViewRaw<BSchema, ISchema, SSchema>>
|
|
97
|
+
) => {
|
|
98
|
+
return (
|
|
99
|
+
<ComponentsContext.Provider value={components}>
|
|
100
|
+
<BlockNoteViewRaw {...props} />
|
|
101
|
+
</ComponentsContext.Provider>
|
|
102
|
+
);
|
|
103
|
+
};
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import * as Ariakit from "@ariakit/react";
|
|
2
|
+
import { assertEmpty } from "@blocknote/core";
|
|
3
|
+
|
|
4
|
+
import { ComponentProps } from "@blocknote/react";
|
|
5
|
+
|
|
6
|
+
export const Form = (props: ComponentProps["Generic"]["Form"]["Root"]) => {
|
|
7
|
+
const { children, ...rest } = props;
|
|
8
|
+
|
|
9
|
+
assertEmpty(rest);
|
|
10
|
+
|
|
11
|
+
return <Ariakit.FormProvider>{children}</Ariakit.FormProvider>;
|
|
12
|
+
};
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import * as Ariakit from "@ariakit/react";
|
|
2
|
+
|
|
3
|
+
import { assertEmpty, mergeCSSClasses } from "@blocknote/core";
|
|
4
|
+
import { ComponentProps } from "@blocknote/react";
|
|
5
|
+
import { forwardRef } from "react";
|
|
6
|
+
|
|
7
|
+
export const TextInput = forwardRef<
|
|
8
|
+
HTMLInputElement,
|
|
9
|
+
ComponentProps["Generic"]["Form"]["TextInput"]
|
|
10
|
+
>((props, ref) => {
|
|
11
|
+
const {
|
|
12
|
+
className,
|
|
13
|
+
name,
|
|
14
|
+
label,
|
|
15
|
+
icon,
|
|
16
|
+
value,
|
|
17
|
+
autoFocus,
|
|
18
|
+
placeholder,
|
|
19
|
+
onKeyDown,
|
|
20
|
+
onChange,
|
|
21
|
+
onSubmit,
|
|
22
|
+
...rest
|
|
23
|
+
} = props;
|
|
24
|
+
|
|
25
|
+
assertEmpty(rest);
|
|
26
|
+
|
|
27
|
+
return (
|
|
28
|
+
<>
|
|
29
|
+
{props.label && (
|
|
30
|
+
<Ariakit.FormLabel name={name}>{label}</Ariakit.FormLabel>
|
|
31
|
+
)}
|
|
32
|
+
<div className="bn-ak-input-wrapper">
|
|
33
|
+
{icon}
|
|
34
|
+
<Ariakit.FormInput
|
|
35
|
+
className={mergeCSSClasses("bn-ak-input", className || "")}
|
|
36
|
+
ref={ref}
|
|
37
|
+
name={name}
|
|
38
|
+
value={value}
|
|
39
|
+
autoFocus={autoFocus}
|
|
40
|
+
placeholder={placeholder}
|
|
41
|
+
onKeyDown={onKeyDown}
|
|
42
|
+
onChange={onChange}
|
|
43
|
+
onSubmit={onSubmit}
|
|
44
|
+
/>
|
|
45
|
+
</div>
|
|
46
|
+
</>
|
|
47
|
+
);
|
|
48
|
+
});
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
import * as Ariakit from "@ariakit/react";
|
|
2
|
+
|
|
3
|
+
import { assertEmpty, mergeCSSClasses } from "@blocknote/core";
|
|
4
|
+
import { ComponentProps } from "@blocknote/react";
|
|
5
|
+
import { forwardRef } from "react";
|
|
6
|
+
|
|
7
|
+
export const Menu = (props: ComponentProps["Generic"]["Menu"]["Root"]) => {
|
|
8
|
+
const {
|
|
9
|
+
children,
|
|
10
|
+
onOpenChange,
|
|
11
|
+
position,
|
|
12
|
+
sub, // unused
|
|
13
|
+
...rest
|
|
14
|
+
} = props;
|
|
15
|
+
|
|
16
|
+
assertEmpty(rest);
|
|
17
|
+
|
|
18
|
+
return (
|
|
19
|
+
<Ariakit.MenuProvider
|
|
20
|
+
placement={position}
|
|
21
|
+
setOpen={onOpenChange}
|
|
22
|
+
virtualFocus={true}>
|
|
23
|
+
{children}
|
|
24
|
+
</Ariakit.MenuProvider>
|
|
25
|
+
);
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
export const MenuDropdown = forwardRef<
|
|
29
|
+
HTMLDivElement,
|
|
30
|
+
ComponentProps["Generic"]["Menu"]["Dropdown"]
|
|
31
|
+
>((props, ref) => {
|
|
32
|
+
const {
|
|
33
|
+
className,
|
|
34
|
+
children,
|
|
35
|
+
sub, // unused
|
|
36
|
+
...rest
|
|
37
|
+
} = props;
|
|
38
|
+
|
|
39
|
+
assertEmpty(rest);
|
|
40
|
+
|
|
41
|
+
return (
|
|
42
|
+
<Ariakit.Menu
|
|
43
|
+
className={mergeCSSClasses("bn-ak-menu", className || "")}
|
|
44
|
+
ref={ref}>
|
|
45
|
+
{children}
|
|
46
|
+
</Ariakit.Menu>
|
|
47
|
+
);
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
export const MenuItem = forwardRef<
|
|
51
|
+
HTMLDivElement,
|
|
52
|
+
ComponentProps["Generic"]["Menu"]["Item"]
|
|
53
|
+
>((props, ref) => {
|
|
54
|
+
const { className, children, icon, checked, subTrigger, onClick, ...rest } =
|
|
55
|
+
props;
|
|
56
|
+
|
|
57
|
+
assertEmpty(rest);
|
|
58
|
+
|
|
59
|
+
if (subTrigger) {
|
|
60
|
+
return (
|
|
61
|
+
<Ariakit.MenuButton
|
|
62
|
+
render={<Ariakit.MenuItem />}
|
|
63
|
+
className={mergeCSSClasses("bn-ak-menu-item", className || "")}
|
|
64
|
+
ref={ref}
|
|
65
|
+
onClick={onClick}>
|
|
66
|
+
{icon}
|
|
67
|
+
{children}
|
|
68
|
+
<Ariakit.MenuButtonArrow />
|
|
69
|
+
{checked !== undefined && <Ariakit.CheckboxCheck checked={checked} />}
|
|
70
|
+
</Ariakit.MenuButton>
|
|
71
|
+
);
|
|
72
|
+
}
|
|
73
|
+
return (
|
|
74
|
+
<Ariakit.MenuItem
|
|
75
|
+
className={mergeCSSClasses("bn-ak-menu-item", className || "")}
|
|
76
|
+
ref={ref}
|
|
77
|
+
onClick={onClick}>
|
|
78
|
+
{icon}
|
|
79
|
+
{children}
|
|
80
|
+
{checked !== undefined && <Ariakit.CheckboxCheck checked={checked} />}
|
|
81
|
+
</Ariakit.MenuItem>
|
|
82
|
+
);
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
export const MenuLabel = forwardRef<
|
|
86
|
+
HTMLDivElement,
|
|
87
|
+
ComponentProps["Generic"]["Menu"]["Label"]
|
|
88
|
+
>((props, ref) => {
|
|
89
|
+
const { className, children, ...rest } = props;
|
|
90
|
+
|
|
91
|
+
assertEmpty(rest);
|
|
92
|
+
|
|
93
|
+
return (
|
|
94
|
+
<Ariakit.MenuGroupLabel
|
|
95
|
+
className={mergeCSSClasses("bn-ak-group-label", className || "")}
|
|
96
|
+
ref={ref}>
|
|
97
|
+
{children}
|
|
98
|
+
</Ariakit.MenuGroupLabel>
|
|
99
|
+
);
|
|
100
|
+
});
|
|
101
|
+
|
|
102
|
+
export const MenuTrigger = (
|
|
103
|
+
props: ComponentProps["Generic"]["Menu"]["Trigger"]
|
|
104
|
+
) => {
|
|
105
|
+
const { children, sub, ...rest } = props;
|
|
106
|
+
|
|
107
|
+
assertEmpty(rest);
|
|
108
|
+
|
|
109
|
+
if (sub) {
|
|
110
|
+
return children;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
return <Ariakit.MenuButton render={children as any}></Ariakit.MenuButton>;
|
|
114
|
+
};
|
|
115
|
+
|
|
116
|
+
export const MenuDivider = forwardRef<
|
|
117
|
+
HTMLHRElement,
|
|
118
|
+
ComponentProps["Generic"]["Menu"]["Divider"]
|
|
119
|
+
>((props, ref) => {
|
|
120
|
+
const { className, ...rest } = props;
|
|
121
|
+
|
|
122
|
+
assertEmpty(rest);
|
|
123
|
+
|
|
124
|
+
return (
|
|
125
|
+
<Ariakit.MenuSeparator
|
|
126
|
+
className={mergeCSSClasses("bn-ak-separator", className || "")}
|
|
127
|
+
ref={ref}
|
|
128
|
+
/>
|
|
129
|
+
);
|
|
130
|
+
});
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import * as Ariakit from "@ariakit/react";
|
|
2
|
+
|
|
3
|
+
import { assertEmpty, mergeCSSClasses } from "@blocknote/core";
|
|
4
|
+
import { ComponentProps } from "@blocknote/react";
|
|
5
|
+
import { forwardRef } from "react";
|
|
6
|
+
|
|
7
|
+
export const Panel = forwardRef<
|
|
8
|
+
HTMLDivElement,
|
|
9
|
+
ComponentProps["ImagePanel"]["Root"]
|
|
10
|
+
>((props, ref) => {
|
|
11
|
+
const {
|
|
12
|
+
className,
|
|
13
|
+
tabs,
|
|
14
|
+
defaultOpenTab,
|
|
15
|
+
openTab,
|
|
16
|
+
setOpenTab,
|
|
17
|
+
loading, // TODO: implement loading
|
|
18
|
+
...rest
|
|
19
|
+
} = props;
|
|
20
|
+
|
|
21
|
+
assertEmpty(rest);
|
|
22
|
+
|
|
23
|
+
return (
|
|
24
|
+
<div
|
|
25
|
+
className={mergeCSSClasses("bn-ak-wrapper", className || "")}
|
|
26
|
+
ref={ref}>
|
|
27
|
+
<Ariakit.TabProvider
|
|
28
|
+
defaultSelectedId={defaultOpenTab}
|
|
29
|
+
selectedId={openTab}
|
|
30
|
+
setActiveId={(activeId) => {
|
|
31
|
+
if (activeId) {
|
|
32
|
+
setOpenTab(activeId);
|
|
33
|
+
}
|
|
34
|
+
}}>
|
|
35
|
+
{/*{loading && <LoadingOverlay visible={loading} />}*/}
|
|
36
|
+
|
|
37
|
+
<Ariakit.TabList className={"bn-ak-tab-list"}>
|
|
38
|
+
{tabs.map((tab) => (
|
|
39
|
+
<Ariakit.Tab className={"bn-ak-tab"} id={tab.name} key={tab.name}>
|
|
40
|
+
{tab.name}
|
|
41
|
+
</Ariakit.Tab>
|
|
42
|
+
))}
|
|
43
|
+
</Ariakit.TabList>
|
|
44
|
+
|
|
45
|
+
<div className={"bn-ak-panels"}>
|
|
46
|
+
{tabs.map((tab) => (
|
|
47
|
+
<Ariakit.TabPanel tabId={tab.name} key={tab.name}>
|
|
48
|
+
{tab.tabPanel}
|
|
49
|
+
</Ariakit.TabPanel>
|
|
50
|
+
))}
|
|
51
|
+
</div>
|
|
52
|
+
</Ariakit.TabProvider>
|
|
53
|
+
</div>
|
|
54
|
+
);
|
|
55
|
+
});
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import * as Ariakit from "@ariakit/react";
|
|
2
|
+
|
|
3
|
+
import { assertEmpty, mergeCSSClasses } from "@blocknote/core";
|
|
4
|
+
import { ComponentProps } from "@blocknote/react";
|
|
5
|
+
import { forwardRef } from "react";
|
|
6
|
+
|
|
7
|
+
export const PanelButton = forwardRef<
|
|
8
|
+
HTMLButtonElement,
|
|
9
|
+
ComponentProps["ImagePanel"]["Button"]
|
|
10
|
+
>((props, ref) => {
|
|
11
|
+
const { className, children, onClick, label, ...rest } = props;
|
|
12
|
+
|
|
13
|
+
assertEmpty(rest);
|
|
14
|
+
|
|
15
|
+
return (
|
|
16
|
+
<Ariakit.Button
|
|
17
|
+
className={mergeCSSClasses("bn-ak-button", className || "")}
|
|
18
|
+
onClick={onClick}
|
|
19
|
+
aria-label={label}
|
|
20
|
+
ref={ref}>
|
|
21
|
+
{children}
|
|
22
|
+
</Ariakit.Button>
|
|
23
|
+
);
|
|
24
|
+
});
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import * as Ariakit from "@ariakit/react";
|
|
2
|
+
import { assertEmpty } from "@blocknote/core";
|
|
3
|
+
|
|
4
|
+
import { ComponentProps } from "@blocknote/react";
|
|
5
|
+
import { forwardRef } from "react";
|
|
6
|
+
|
|
7
|
+
export const PanelFileInput = forwardRef<
|
|
8
|
+
HTMLInputElement,
|
|
9
|
+
ComponentProps["ImagePanel"]["FileInput"]
|
|
10
|
+
>((props, ref) => {
|
|
11
|
+
const { className, value, placeholder, onChange, ...rest } = props;
|
|
12
|
+
|
|
13
|
+
assertEmpty(rest);
|
|
14
|
+
|
|
15
|
+
return (
|
|
16
|
+
<Ariakit.FormProvider>
|
|
17
|
+
<Ariakit.FormInput
|
|
18
|
+
className={className}
|
|
19
|
+
ref={ref}
|
|
20
|
+
name={"panel-input"}
|
|
21
|
+
type={"file"}
|
|
22
|
+
value={value ? value.name : undefined}
|
|
23
|
+
onChange={async (e) => onChange?.(e.target.files![0])}
|
|
24
|
+
placeholder={placeholder}
|
|
25
|
+
/>
|
|
26
|
+
</Ariakit.FormProvider>
|
|
27
|
+
);
|
|
28
|
+
});
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { assertEmpty } from "@blocknote/core";
|
|
2
|
+
import { ComponentProps } from "@blocknote/react";
|
|
3
|
+
import { forwardRef } from "react";
|
|
4
|
+
|
|
5
|
+
export const PanelTab = forwardRef<
|
|
6
|
+
HTMLDivElement,
|
|
7
|
+
ComponentProps["ImagePanel"]["TabPanel"]
|
|
8
|
+
>((props, ref) => {
|
|
9
|
+
const { className, children, ...rest } = props;
|
|
10
|
+
|
|
11
|
+
assertEmpty(rest);
|
|
12
|
+
|
|
13
|
+
return (
|
|
14
|
+
<div className={className} ref={ref}>
|
|
15
|
+
{children}
|
|
16
|
+
</div>
|
|
17
|
+
);
|
|
18
|
+
});
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import * as Ariakit from "@ariakit/react";
|
|
2
|
+
|
|
3
|
+
import { assertEmpty, mergeCSSClasses } from "@blocknote/core";
|
|
4
|
+
import { ComponentProps } from "@blocknote/react";
|
|
5
|
+
import { forwardRef } from "react";
|
|
6
|
+
|
|
7
|
+
export const PanelTextInput = forwardRef<
|
|
8
|
+
HTMLInputElement,
|
|
9
|
+
ComponentProps["ImagePanel"]["TextInput"]
|
|
10
|
+
>((props, ref) => {
|
|
11
|
+
const { className, value, placeholder, onKeyDown, onChange, ...rest } = props;
|
|
12
|
+
|
|
13
|
+
assertEmpty(rest);
|
|
14
|
+
|
|
15
|
+
return (
|
|
16
|
+
<Ariakit.FormProvider>
|
|
17
|
+
<Ariakit.FormInput
|
|
18
|
+
className={mergeCSSClasses("bn-ak-input", className || "")}
|
|
19
|
+
name={"panel-input"}
|
|
20
|
+
value={value}
|
|
21
|
+
placeholder={placeholder}
|
|
22
|
+
onChange={onChange}
|
|
23
|
+
onKeyDown={onKeyDown}
|
|
24
|
+
data-test={"embed-input"}
|
|
25
|
+
ref={ref}
|
|
26
|
+
/>
|
|
27
|
+
</Ariakit.FormProvider>
|
|
28
|
+
);
|
|
29
|
+
});
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import * as Ariakit from "@ariakit/react";
|
|
2
|
+
|
|
3
|
+
import { assertEmpty, mergeCSSClasses } from "@blocknote/core";
|
|
4
|
+
import { ComponentProps } from "@blocknote/react";
|
|
5
|
+
import { forwardRef } from "react";
|
|
6
|
+
|
|
7
|
+
export const PopoverTrigger = forwardRef<
|
|
8
|
+
HTMLButtonElement,
|
|
9
|
+
ComponentProps["Generic"]["Popover"]["Trigger"]
|
|
10
|
+
>((props, ref) => {
|
|
11
|
+
const { children, ...rest } = props;
|
|
12
|
+
|
|
13
|
+
assertEmpty(rest);
|
|
14
|
+
|
|
15
|
+
return <Ariakit.PopoverDisclosure render={children as any} ref={ref} />;
|
|
16
|
+
});
|
|
17
|
+
|
|
18
|
+
export const PopoverContent = forwardRef<
|
|
19
|
+
HTMLDivElement,
|
|
20
|
+
ComponentProps["Generic"]["Popover"]["Content"]
|
|
21
|
+
>((props, ref) => {
|
|
22
|
+
const { className, children, variant, ...rest } = props;
|
|
23
|
+
|
|
24
|
+
assertEmpty(rest);
|
|
25
|
+
|
|
26
|
+
return (
|
|
27
|
+
<Ariakit.Popover
|
|
28
|
+
className={mergeCSSClasses("bn-ak-popover", className || "")}
|
|
29
|
+
ref={ref}>
|
|
30
|
+
{children}
|
|
31
|
+
</Ariakit.Popover>
|
|
32
|
+
);
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
export const Popover = (
|
|
36
|
+
props: ComponentProps["Generic"]["Popover"]["Root"]
|
|
37
|
+
) => {
|
|
38
|
+
const { children, opened, position, ...rest } = props;
|
|
39
|
+
|
|
40
|
+
assertEmpty(rest);
|
|
41
|
+
|
|
42
|
+
return (
|
|
43
|
+
<Ariakit.PopoverProvider open={opened} placement={position}>
|
|
44
|
+
{children}
|
|
45
|
+
</Ariakit.PopoverProvider>
|
|
46
|
+
);
|
|
47
|
+
};
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import * as Ariakit from "@ariakit/react";
|
|
2
|
+
import { assertEmpty } from "@blocknote/core";
|
|
3
|
+
|
|
4
|
+
import { ComponentProps } from "@blocknote/react";
|
|
5
|
+
import { forwardRef } from "react";
|
|
6
|
+
|
|
7
|
+
export const SideMenu = forwardRef<
|
|
8
|
+
HTMLDivElement,
|
|
9
|
+
ComponentProps["SideMenu"]["Root"]
|
|
10
|
+
>((props, ref) => {
|
|
11
|
+
const { className, children, ...rest } = props;
|
|
12
|
+
|
|
13
|
+
assertEmpty(rest);
|
|
14
|
+
|
|
15
|
+
return (
|
|
16
|
+
<Ariakit.Group className={className} ref={ref}>
|
|
17
|
+
{children}
|
|
18
|
+
</Ariakit.Group>
|
|
19
|
+
);
|
|
20
|
+
});
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import * as Ariakit from "@ariakit/react";
|
|
2
|
+
|
|
3
|
+
import { assertEmpty, mergeCSSClasses } from "@blocknote/core";
|
|
4
|
+
import { ComponentProps } from "@blocknote/react";
|
|
5
|
+
import { forwardRef } from "react";
|
|
6
|
+
|
|
7
|
+
export const SideMenuButton = forwardRef<
|
|
8
|
+
HTMLButtonElement,
|
|
9
|
+
ComponentProps["SideMenu"]["Button"]
|
|
10
|
+
>((props, ref) => {
|
|
11
|
+
const {
|
|
12
|
+
className,
|
|
13
|
+
children,
|
|
14
|
+
icon,
|
|
15
|
+
onClick,
|
|
16
|
+
label,
|
|
17
|
+
onDragEnd,
|
|
18
|
+
onDragStart,
|
|
19
|
+
draggable,
|
|
20
|
+
...rest
|
|
21
|
+
} = props;
|
|
22
|
+
|
|
23
|
+
// false, because rest props can be added by ariakit when button is used as a trigger
|
|
24
|
+
// assertEmpty in this case is only used at typescript level, not runtime level
|
|
25
|
+
assertEmpty(rest, false);
|
|
26
|
+
|
|
27
|
+
return (
|
|
28
|
+
<Ariakit.Button
|
|
29
|
+
onDragEnd={onDragEnd}
|
|
30
|
+
onDragStart={onDragStart}
|
|
31
|
+
draggable={draggable}
|
|
32
|
+
aria-label={label}
|
|
33
|
+
className={mergeCSSClasses(
|
|
34
|
+
"bn-ak-button bn-ak-secondary",
|
|
35
|
+
className || ""
|
|
36
|
+
)}
|
|
37
|
+
ref={ref}
|
|
38
|
+
onClick={onClick}
|
|
39
|
+
{...rest}>
|
|
40
|
+
{icon}
|
|
41
|
+
{children}
|
|
42
|
+
</Ariakit.Button>
|
|
43
|
+
);
|
|
44
|
+
});
|
package/src/style.css
ADDED
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
@import url("@blocknote/react/style.css");
|
|
2
|
+
|
|
3
|
+
/* This file contains BlockNote-specific fixes for the styles in
|
|
4
|
+
ariakitStyles.css. */
|
|
5
|
+
|
|
6
|
+
@import "./ariakitStyles.css";
|
|
7
|
+
|
|
8
|
+
.bn-ak-input-wrapper {
|
|
9
|
+
align-items: center;
|
|
10
|
+
display: flex;
|
|
11
|
+
gap: 0.5rem;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
.bn-toolbar .bn-ak-button {
|
|
15
|
+
width: unset;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
.bn-toolbar .bn-ak-button[data-selected] {
|
|
19
|
+
padding-top: 0.125rem;
|
|
20
|
+
box-shadow: inset 0 0 0 1px var(--border), inset 0 2px 0 var(--border);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
.bn-toolbar .bn-ak-button[data-selected]:where(.dark, .dark *) {
|
|
24
|
+
box-shadow: inset 0 0 0 1px var(--border), inset 0 1px 1px 1px var(--shadow);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
.bn-toolbar .bn-ak-popover {
|
|
28
|
+
gap: 0.5rem;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
.bn-tab-panel {
|
|
32
|
+
align-items: center;
|
|
33
|
+
display: flex;
|
|
34
|
+
flex-direction: column;
|
|
35
|
+
gap: 0.5rem;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
.bn-file-input {
|
|
39
|
+
max-width: 100%;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
.bn-ak-button {
|
|
43
|
+
outline-style: none;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
.bn-ak-menu-item[aria-selected="true"],
|
|
47
|
+
.bn-ak-menu-item:hover {
|
|
48
|
+
background-color: hsl(204 100% 40%);
|
|
49
|
+
color: hsl(204 20% 100%);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
.bn-ak-menu-item {
|
|
53
|
+
display: flex;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
.bn-dropdown {
|
|
57
|
+
overflow: visible;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
.bn-suggestion-menu,
|
|
61
|
+
.bn-color-picker-dropdown {
|
|
62
|
+
overflow: scroll;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
.bn-ak-suggestion-menu-item-body {
|
|
66
|
+
flex: 1;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
.bn-ak-suggestion-menu-item-subtitle {
|
|
70
|
+
font-size: 0.7rem;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
.bn-ak-suggestion-menu-item-section[data-position="left"] {
|
|
74
|
+
padding: 8px;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
.bn-ak-suggestion-menu-item-section[data-position="right"] {
|
|
78
|
+
--border: rgb(0 0 0/13%);
|
|
79
|
+
--highlight: rgb(255 255 255/20%);
|
|
80
|
+
--shadow: rgb(0 0 0/10%);
|
|
81
|
+
box-shadow: inset 0 0 0 1px var(--border), inset 0 2px 0 var(--highlight),
|
|
82
|
+
inset 0 -1px 0 var(--shadow), 0 1px 1px var(--shadow);
|
|
83
|
+
font-size: 0.7rem;
|
|
84
|
+
border-radius: 4px;
|
|
85
|
+
padding-inline: 4px;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
.bn-side-menu {
|
|
89
|
+
align-items: center;
|
|
90
|
+
display: flex;
|
|
91
|
+
justify-content: center;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
.bn-side-menu .bn-ak-button {
|
|
95
|
+
height: fit-content;
|
|
96
|
+
padding: 0;
|
|
97
|
+
width: fit-content;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
.bn-panel-popover {
|
|
101
|
+
background-color: transparent;
|
|
102
|
+
border: none;
|
|
103
|
+
box-shadow: none;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
.bn-table-handle {
|
|
107
|
+
height: fit-content;
|
|
108
|
+
padding: 0;
|
|
109
|
+
width: fit-content;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
.bn-side-menu,
|
|
113
|
+
.bn-table-handle {
|
|
114
|
+
color: gray;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
.bn-ak-button:where(.dark, .dark *) {
|
|
118
|
+
color: hsl(204 20% 100%);
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
.bn-ak-tab,
|
|
122
|
+
.bn-file-input {
|
|
123
|
+
background-color: transparent;
|
|
124
|
+
color: black;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
.bn-ak-tab:where(.dark, .dark *),
|
|
128
|
+
.bn-file-input:where(.dark, .dark *) {
|
|
129
|
+
color: white;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
.bn-ak-tooltip {
|
|
133
|
+
align-items: center;
|
|
134
|
+
display: flex;
|
|
135
|
+
flex-direction: column;
|
|
136
|
+
}
|