forked from TypeCellOS/BlockNote
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathBlockNoteView.tsx
More file actions
106 lines (97 loc) · 2.81 KB
/
BlockNoteView.tsx
File metadata and controls
106 lines (97 loc) · 2.81 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
import {
BlockSchema,
InlineContentSchema,
mergeCSSClasses,
StyleSchema,
} from "@blocknote/core";
import {
BlockNoteViewProps,
BlockNoteViewRaw,
ComponentsContext,
useBlockNoteContext,
usePrefersColorScheme,
} from "@blocknote/react";
import { MantineProvider } from "@mantine/core";
import { useCallback } from "react";
import {
applyBlockNoteCSSVariablesFromTheme,
removeBlockNoteCSSVariables,
Theme,
} from "./BlockNoteTheme.js";
import { components } from "./components.js";
import "./style.css";
const mantineTheme = {
// Removes button press effect
activeClassName: "",
};
export const BlockNoteView = <
BSchema extends BlockSchema,
ISchema extends InlineContentSchema,
SSchema extends StyleSchema
>(
props: Omit<BlockNoteViewProps<BSchema, ISchema, SSchema>, "theme"> & {
theme?:
| "light"
| "dark"
| Theme
| {
light: Theme;
dark: Theme;
};
}
) => {
const { className, theme, ...rest } = props;
const existingContext = useBlockNoteContext();
const systemColorScheme = usePrefersColorScheme();
const defaultColorScheme =
existingContext?.colorSchemePreference || systemColorScheme;
const ref = useCallback(
(node: HTMLDivElement | null) => {
if (!node) {
// todo: clean variables?
return;
}
removeBlockNoteCSSVariables(node);
if (typeof theme === "object") {
if ("light" in theme && "dark" in theme) {
applyBlockNoteCSSVariablesFromTheme(
theme[defaultColorScheme === "dark" ? "dark" : "light"],
node
);
return;
}
applyBlockNoteCSSVariablesFromTheme(theme, node);
return;
}
},
[defaultColorScheme, theme]
);
const finalTheme =
typeof theme === "string"
? theme
: defaultColorScheme !== "no-preference"
? defaultColorScheme
: "light";
return (
<ComponentsContext.Provider value={components}>
<MantineProvider
theme={mantineTheme}
// Scopes Mantine CSS variables to only the editor, as proposed here:
// https://github.com/orgs/mantinedev/discussions/5685
cssVariablesSelector=".bn-mantine"
// This gets the element to set `data-mantine-color-scheme` on. This
// element needs to already be rendered, so we can't set it to the
// editor container element. Instead, we set it to `undefined` and set it
// manually in `BlockNoteViewRaw`.
getRootElement={() => undefined}>
<BlockNoteViewRaw
data-mantine-color-scheme={finalTheme}
className={mergeCSSClasses("bn-mantine", className || "")}
theme={typeof theme === "object" ? undefined : theme}
{...rest}
ref={ref}
/>
</MantineProvider>
</ComponentsContext.Provider>
);
};