@blocknote/ariakit 0.24.2 → 0.25.1

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.
@@ -1003,4 +1003,187 @@ responsible for the majority of the styling. */
1003
1003
 
1004
1004
  .bn-ak-link:where(.dark, .dark *) {
1005
1005
  color: hsl(204 100% 64%);
1006
+ }
1007
+
1008
+ /* https://ariakit.org/components/hovercard */
1009
+ /*.bn-ak-button {*/
1010
+ /* --border: rgb(0 0 0/13%);*/
1011
+ /* --highlight: rgb(255 255 255/20%);*/
1012
+ /* --shadow: rgb(0 0 0/10%);*/
1013
+ /* display: flex;*/
1014
+ /* height: 2.5rem;*/
1015
+ /* user-select: none;*/
1016
+ /* align-items: center;*/
1017
+ /* justify-content: center;*/
1018
+ /* gap: 0.25rem;*/
1019
+ /* white-space: nowrap;*/
1020
+ /* border-style: none;*/
1021
+ /* background-color: white;*/
1022
+ /* padding-left: 1rem;*/
1023
+ /* padding-right: 1rem;*/
1024
+ /* font-size: 1rem;*/
1025
+ /* line-height: 1.5rem;*/
1026
+ /* color: black;*/
1027
+ /* text-decoration-line: none;*/
1028
+ /* outline-width: 2px;*/
1029
+ /* outline-offset: 2px;*/
1030
+ /* outline-color: hsl(204 100% 40%);*/
1031
+ /* box-shadow:*/
1032
+ /* inset 0 0 0 1px var(--border),*/
1033
+ /* inset 0 2px 0 var(--highlight),*/
1034
+ /* inset 0 -1px 0 var(--shadow),*/
1035
+ /* 0 1px 1px var(--shadow);*/
1036
+ /* position: absolute;*/
1037
+ /* top: 1rem;*/
1038
+ /* right: 1rem;*/
1039
+ /* border-radius: 9999px;*/
1040
+ /* font-weight: 600;*/
1041
+ /*}*/
1042
+
1043
+ /*.bn-ak-button:where(.dark, .dark *) {*/
1044
+ /* --border: rgb(255 255 255/10%);*/
1045
+ /* --highlight: rgb(255 255 255/5%);*/
1046
+ /* --shadow: rgb(0 0 0/25%);*/
1047
+ /* background-color: rgb(255 255 255 / 0.05);*/
1048
+ /* color: white;*/
1049
+ /* box-shadow:*/
1050
+ /* inset 0 0 0 1px var(--border),*/
1051
+ /* inset 0 -1px 0 1px var(--shadow),*/
1052
+ /* inset 0 1px 0 var(--highlight);*/
1053
+ /*}*/
1054
+
1055
+ /*.bn-ak-button:not(:active):hover {*/
1056
+ /* --border: rgb(0 0 0/33%);*/
1057
+ /*}*/
1058
+
1059
+ /*.bn-ak-button:where(.dark, .dark *):not(:active):hover {*/
1060
+ /* --border: rgb(255 255 255/25%);*/
1061
+ /*}*/
1062
+
1063
+ .bn-ak-primary {
1064
+ --border: rgba(0, 0, 0, 0.15);
1065
+ --highlight: rgba(255, 255, 255, 0.25);
1066
+ --shadow: rgba(0, 0, 0, 0.15);
1067
+ background-color: hsl(204 100% 40%);
1068
+ color: white;
1069
+ }
1070
+
1071
+ .bn-ak-primary:hover {
1072
+ --border: rgba(0, 0, 0, 0.35);
1073
+ background-color: hsl(204 100% 35%);
1074
+ }
1075
+
1076
+ .bn-ak-primary:where(.dark, .dark *) {
1077
+ --border: rgba(255, 255, 255, 0.25);
1078
+ --highlight: rgba(255, 255, 255, 0.1);
1079
+ --shadow: rgba(0, 0, 0, 0.25);
1080
+ background-color: hsl(204 100% 35%);
1081
+ }
1082
+
1083
+ .bn-ak-primary:hover:where(.dark, .dark *) {
1084
+ --border: rgba(255, 255, 255, 0.45);
1085
+ background-color: hsl(204 100% 40%);
1086
+ }
1087
+
1088
+ .bn-ak-button[aria-disabled="true"] {
1089
+ opacity: 0.5;
1090
+ }
1091
+
1092
+ .bn-ak-button[data-focus-visible] {
1093
+ outline-style: solid;
1094
+ }
1095
+
1096
+ .bn-ak-button:active,
1097
+ .bn-ak-button[data-active] {
1098
+ padding-top: 0.125rem;
1099
+ box-shadow:
1100
+ inset 0 0 0 1px var(--border),
1101
+ inset 0 2px 0 var(--border);
1102
+ }
1103
+
1104
+ @media (min-width: 640px) {
1105
+ .bn-ak-button {
1106
+ gap: 0.5rem;
1107
+ }
1108
+ }
1109
+
1110
+ .bn-ak-button:active:where(.dark, .dark *),
1111
+ .bn-ak-button[data-active]:where(.dark, .dark *) {
1112
+ box-shadow:
1113
+ inset 0 0 0 1px var(--border),
1114
+ inset 0 1px 1px 1px var(--shadow);
1115
+ }
1116
+
1117
+ .bn-ak-flat {
1118
+ box-shadow: none;
1119
+ }
1120
+
1121
+ .bn-ak-flat:where(.dark, .dark *) {
1122
+ box-shadow: none;
1123
+ }
1124
+
1125
+ .bn-ak-flat:active:where(.dark, .dark *),
1126
+ .bn-ak-flat[data-active]:where(.dark, .dark *) {
1127
+ box-shadow: none;
1128
+ }
1129
+
1130
+ .bn-ak-anchor {
1131
+ font-weight: 500;
1132
+ color: hsl(204 100% 35%);
1133
+ text-decoration-line: underline;
1134
+ text-underline-offset: 0.25em;
1135
+ text-decoration-skip-ink: none;
1136
+ }
1137
+
1138
+ .bn-ak-anchor:hover {
1139
+ text-decoration-thickness: 3px;
1140
+ }
1141
+
1142
+ .bn-ak-anchor:where(.dark, .dark *) {
1143
+ color: hsl(204 100% 64%);
1144
+ }
1145
+
1146
+ .bn-ak-hovercard {
1147
+ position: relative;
1148
+ z-index: 50;
1149
+ display: flex;
1150
+ width: 300px;
1151
+ flex-direction: column;
1152
+ gap: 0.5rem;
1153
+ border-radius: 0.5rem;
1154
+ border-width: 1px;
1155
+ border-style: solid;
1156
+ border-color: hsl(204 20% 88%);
1157
+ background-color: white;
1158
+ padding: 1rem;
1159
+ color: black;
1160
+ box-shadow:
1161
+ 0 10px 15px -3px rgb(0 0 0 / 0.1),
1162
+ 0 4px 6px -4px rgb(0 0 0 / 0.1);
1163
+ }
1164
+
1165
+ .bn-ak-hovercard:focus-visible,
1166
+ .bn-ak-hovercard[data-focus-visible] {
1167
+ outline: 2px solid hsl(204 100% 40%);
1168
+ outline-offset: 2px;
1169
+ }
1170
+
1171
+ .bn-ak-hovercard:where(.dark, .dark *) {
1172
+ border-color: hsl(204 4% 24%);
1173
+ background-color: hsl(204 4% 16%);
1174
+ color: white;
1175
+ box-shadow:
1176
+ 0 10px 15px -3px rgb(0 0 0 / 0.25),
1177
+ 0 4px 6px -4px rgb(0 0 0 / 0.1);
1178
+ }
1179
+
1180
+ .bn-ak-avatar {
1181
+ width: 4rem;
1182
+ border-radius: 9999px;
1183
+ }
1184
+
1185
+ .bn-ak-username {
1186
+ font-size: 1.125rem;
1187
+ line-height: 1.75rem;
1188
+ font-weight: 600;
1006
1189
  }
@@ -0,0 +1,77 @@
1
+ import {
2
+ Button as AriakitButton,
3
+ Group as AriakitGroup,
4
+ Tooltip as AriakitTooltip,
5
+ TooltipAnchor as AriakitTooltipAnchor,
6
+ TooltipProvider as AriakitTooltipProvider,
7
+ } from "@ariakit/react";
8
+
9
+ import { assertEmpty, mergeCSSClasses } from "@blocknote/core";
10
+ import { ComponentProps } from "@blocknote/react";
11
+ import { forwardRef } from "react";
12
+
13
+ export const Badge = forwardRef<
14
+ HTMLButtonElement,
15
+ ComponentProps["Generic"]["Badge"]["Root"]
16
+ >((props, ref) => {
17
+ const {
18
+ className,
19
+ text,
20
+ icon,
21
+ isSelected,
22
+ mainTooltip,
23
+ secondaryTooltip,
24
+ onClick,
25
+ onMouseEnter,
26
+ ...rest
27
+ } = props;
28
+
29
+ assertEmpty(rest, false);
30
+
31
+ const badge = (
32
+ <AriakitButton
33
+ className={mergeCSSClasses(
34
+ className,
35
+ "bn-ak-badge bn-ak-button",
36
+ isSelected && "bn-ak-primary"
37
+ )}
38
+ aria-selected={isSelected === true}
39
+ onClick={(event) => onClick?.(event)}
40
+ onMouseEnter={onMouseEnter}
41
+ ref={ref}>
42
+ <span>{icon}</span>
43
+ <span>{text}</span>
44
+ </AriakitButton>
45
+ );
46
+
47
+ if (!mainTooltip) {
48
+ return badge;
49
+ }
50
+
51
+ return (
52
+ <AriakitTooltipProvider>
53
+ <AriakitTooltipAnchor render={badge} />
54
+ <AriakitTooltip className="bn-ak-tooltip" portal={false}>
55
+ <span>{mainTooltip}</span>
56
+ {secondaryTooltip && <span>{secondaryTooltip}</span>}
57
+ </AriakitTooltip>
58
+ </AriakitTooltipProvider>
59
+ );
60
+ });
61
+
62
+ export const BadgeGroup = forwardRef<
63
+ HTMLDivElement,
64
+ ComponentProps["Generic"]["Badge"]["Group"]
65
+ >((props, ref) => {
66
+ const { className, children, ...rest } = props;
67
+
68
+ assertEmpty(rest);
69
+
70
+ return (
71
+ <AriakitGroup
72
+ className={mergeCSSClasses(className, "bn-ak-badge-group")}
73
+ ref={ref}>
74
+ {children}
75
+ </AriakitGroup>
76
+ );
77
+ });
@@ -0,0 +1,39 @@
1
+ import { Group as AriakitGroup } 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 Card = forwardRef<
8
+ HTMLDivElement,
9
+ ComponentProps["Comments"]["Card"]
10
+ >((props, ref) => {
11
+ const { className, children, ...rest } = props;
12
+
13
+ assertEmpty(rest, false);
14
+
15
+ return (
16
+ <AriakitGroup
17
+ className={mergeCSSClasses(className, "bn-ak-hovercard")}
18
+ ref={ref}>
19
+ {children}
20
+ </AriakitGroup>
21
+ );
22
+ });
23
+
24
+ export const CardSection = forwardRef<
25
+ HTMLDivElement,
26
+ ComponentProps["Comments"]["CardSection"]
27
+ >((props, ref) => {
28
+ const { className, children, ...rest } = props;
29
+
30
+ assertEmpty(rest, false);
31
+
32
+ return (
33
+ <AriakitGroup
34
+ className={mergeCSSClasses(className, "bn-ak-card-section")}
35
+ ref={ref}>
36
+ {children}
37
+ </AriakitGroup>
38
+ );
39
+ });
@@ -0,0 +1,87 @@
1
+ import { Group as AriakitGroup } from "@ariakit/react";
2
+
3
+ import { assertEmpty } from "@blocknote/core";
4
+ import { ComponentProps, useFocusWithin } from "@blocknote/react";
5
+ import { forwardRef, useState } from "react";
6
+
7
+ const AuthorInfo = forwardRef<
8
+ HTMLDivElement,
9
+ Pick<ComponentProps["Comments"]["Comment"], "authorInfo" | "timeString">
10
+ >((props, _ref) => {
11
+ const { authorInfo, timeString, ...rest } = props;
12
+
13
+ assertEmpty(rest, false);
14
+
15
+ if (authorInfo === "loading") {
16
+ return (
17
+ <AriakitGroup className={"bn-ak-author-info"}>
18
+ <div className={"bn-ak-avatar bn-ak-skeleton"} />
19
+ <div className={"bn-ak-username bn-ak-skeleton"} />
20
+ </AriakitGroup>
21
+ );
22
+ }
23
+
24
+ return (
25
+ <AriakitGroup className={"bn-ak-author-info"}>
26
+ <img
27
+ src={authorInfo.avatarUrl}
28
+ alt={authorInfo.username}
29
+ className={"bn-ak-avatar"}
30
+ />
31
+ <div className={"bn-ak-username"}>
32
+ {authorInfo.username}
33
+ <span>{timeString}</span>
34
+ </div>
35
+ </AriakitGroup>
36
+ );
37
+ });
38
+
39
+ export const Comment = forwardRef<
40
+ HTMLDivElement,
41
+ ComponentProps["Comments"]["Comment"]
42
+ >((props, ref) => {
43
+ const {
44
+ className,
45
+ showActions,
46
+ authorInfo,
47
+ timeString,
48
+ actions,
49
+ children,
50
+ ...rest
51
+ } = props;
52
+
53
+ assertEmpty(rest, false);
54
+
55
+ const [hovered, setHovered] = useState(false);
56
+ const { focused, ref: focusRef } = useFocusWithin();
57
+
58
+ const doShowActions =
59
+ actions &&
60
+ (showActions === true ||
61
+ showActions === undefined ||
62
+ (showActions === "hover" && hovered) ||
63
+ focused);
64
+
65
+ return (
66
+ <AriakitGroup
67
+ ref={ref}
68
+ className={className}
69
+ onMouseEnter={() => setHovered(true)}
70
+ onMouseLeave={() => setHovered(false)}>
71
+ {doShowActions ? (
72
+ <AriakitGroup
73
+ ref={focusRef}
74
+ style={{
75
+ position: "absolute",
76
+ right: 0,
77
+ top: 0,
78
+ zIndex: 10,
79
+ }}>
80
+ {actions}
81
+ </AriakitGroup>
82
+ ) : null}
83
+ <AuthorInfo {...props} />
84
+ {children}
85
+ </AriakitGroup>
86
+ );
87
+ });
@@ -0,0 +1,47 @@
1
+ import { assertEmpty } from "@blocknote/core";
2
+ import {
3
+ ComponentProps,
4
+ FormattingToolbar,
5
+ FormattingToolbarController,
6
+ getFormattingToolbarItems,
7
+ } from "@blocknote/react";
8
+ import { forwardRef } from "react";
9
+ import { BlockNoteView } from "../BlockNoteView.js";
10
+
11
+ export const Editor = forwardRef<
12
+ HTMLDivElement,
13
+ ComponentProps["Comments"]["Editor"]
14
+ >((props, ref) => {
15
+ const { className, onFocus, onBlur, editor, editable, ...rest } = props;
16
+
17
+ assertEmpty(rest, false);
18
+
19
+ return (
20
+ <BlockNoteView
21
+ autoFocus={true}
22
+ className={className}
23
+ editor={props.editor}
24
+ sideMenu={false}
25
+ slashMenu={false}
26
+ tableHandles={false}
27
+ filePanel={false}
28
+ formattingToolbar={false}
29
+ editable={editable}
30
+ ref={ref}
31
+ onFocus={onFocus}
32
+ onBlur={onBlur}>
33
+ <FormattingToolbarController
34
+ formattingToolbar={CustomFormattingToolbar}
35
+ />
36
+ </BlockNoteView>
37
+ );
38
+ });
39
+
40
+ const CustomFormattingToolbar = () => {
41
+ const items = getFormattingToolbarItems([]).filter(
42
+ (el) => el.key !== "nestBlockButton" && el.key !== "unnestBlockButton"
43
+ );
44
+ return (
45
+ <FormattingToolbar blockTypeSelectItems={[]}>{items}</FormattingToolbar>
46
+ );
47
+ };
package/src/components.ts CHANGED
@@ -10,6 +10,7 @@ import {
10
10
  MenuLabel,
11
11
  MenuTrigger,
12
12
  } from "./menu/Menu.js";
13
+ import { MenuButton } from "./menu/Button.js";
13
14
  import { Panel } from "./panel/Panel.js";
14
15
  import { PanelButton } from "./panel/PanelButton.js";
15
16
  import { PanelFileInput } from "./panel/PanelFileInput.js";
@@ -32,6 +33,10 @@ import { TableHandle } from "./tableHandle/TableHandle.js";
32
33
  import { Toolbar } from "./toolbar/Toolbar.js";
33
34
  import { ToolbarButton } from "./toolbar/ToolbarButton.js";
34
35
  import { ToolbarSelect } from "./toolbar/ToolbarSelect.js";
36
+ import { Card, CardSection } from "./comments/Card.js";
37
+ import { Comment } from "./comments/Comment.js";
38
+ import { Editor } from "./comments/Editor.js";
39
+ import { Badge, BadgeGroup } from "./badge/Badge.js";
35
40
 
36
41
  export const components: Components = {
37
42
  FormattingToolbar: {
@@ -71,7 +76,17 @@ export const components: Components = {
71
76
  Root: TableHandle,
72
77
  ExtendButton: ExtendButton,
73
78
  },
79
+ Comments: {
80
+ Comment: Comment,
81
+ Editor: Editor,
82
+ Card: Card,
83
+ CardSection: CardSection,
84
+ },
74
85
  Generic: {
86
+ Badge: {
87
+ Root: Badge,
88
+ Group: BadgeGroup,
89
+ },
75
90
  Toolbar: {
76
91
  Root: Toolbar,
77
92
  Button: ToolbarButton,
@@ -87,6 +102,7 @@ export const components: Components = {
87
102
  Divider: MenuDivider,
88
103
  Label: MenuLabel,
89
104
  Item: MenuItem,
105
+ Button: MenuButton,
90
106
  },
91
107
  Popover: {
92
108
  Root: Popover,
@@ -0,0 +1,44 @@
1
+ import { Button as AriakitButton } 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 MenuButton = forwardRef<
8
+ HTMLButtonElement,
9
+ ComponentProps["Generic"]["Menu"]["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
+ <AriakitButton
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
+ </AriakitButton>
43
+ );
44
+ });
@@ -29,7 +29,11 @@ export const PopoverContent = forwardRef<
29
29
 
30
30
  return (
31
31
  <AriakitPopover
32
- className={mergeCSSClasses("bn-ak-popover", className || "")}
32
+ className={mergeCSSClasses(
33
+ "bn-ak-popover",
34
+ className || "",
35
+ variant === "panel-popover" ? "bn-ak-panel-popover" : ""
36
+ )}
33
37
  ref={ref}>
34
38
  {children}
35
39
  </AriakitPopover>
package/src/style.css CHANGED
@@ -11,10 +11,12 @@
11
11
  gap: 0.5rem;
12
12
  }
13
13
 
14
- .bn-toolbar.bn-ak-toolbar {
15
- overflow-x: auto;
14
+ .bn-ak-toolbar {
15
+ height: fit-content;
16
+ overflow: scroll;
16
17
  max-width: 100vw;
17
18
  }
19
+
18
20
  .bn-toolbar .bn-ak-button {
19
21
  width: unset;
20
22
  }
@@ -45,6 +47,7 @@
45
47
 
46
48
  .bn-ak-button {
47
49
  outline-style: none;
50
+ cursor: pointer;
48
51
  }
49
52
 
50
53
  .bn-ak-menu-item[aria-selected="true"],
@@ -157,7 +160,8 @@
157
160
  box-shadow: none;
158
161
  }
159
162
 
160
- .bn-ariakit .bn-table-handle {
163
+ .bn-ariakit .bn-table-handle,
164
+ .bn-ariakit .bn-table-cell-handle {
161
165
  height: fit-content;
162
166
  padding: 0;
163
167
  width: fit-content;
@@ -165,7 +169,8 @@
165
169
 
166
170
  .bn-ariakit .bn-side-menu,
167
171
  .bn-ariakit .bn-table-handle,
168
- .bn-ariakit .bn-extend-button {
172
+ .bn-ariakit .bn-extend-button,
173
+ .bn-ariakit .bn-table-cell-handle {
169
174
  color: gray;
170
175
  }
171
176
 
@@ -212,4 +217,103 @@
212
217
  align-items: center;
213
218
  display: flex;
214
219
  flex-direction: column;
220
+ white-space: pre-wrap;
221
+ }
222
+
223
+ .bn-ariakit .bn-thread-comments {
224
+ display: flex;
225
+ flex-direction: column;
226
+ gap: 16px;
215
227
  }
228
+
229
+ .bn-ak-avatar {
230
+ height: 24px;
231
+ width: 24px;
232
+ }
233
+
234
+ .bn-ak-username {
235
+ align-items: center;
236
+ display: flex;
237
+ font-size: 14px;
238
+ gap: 8px;
239
+ line-height: 1rem;
240
+ }
241
+
242
+ .bn-ak-username > span {
243
+ font-size: 10px;
244
+ }
245
+
246
+ .bn-ak-author-info {
247
+ align-items: center;
248
+ display: flex;
249
+ gap: 16px
250
+ }
251
+
252
+ .bn-ariakit .bn-comment-editor .bn-editor {
253
+ background-color: transparent;
254
+ }
255
+
256
+ .bn-ak-badge {
257
+ align-items: center;
258
+ border-radius: 12px;
259
+ display: flex;
260
+ gap: 4px;
261
+ height: fit-content;
262
+ padding: 2px 10px;
263
+ position: relative;
264
+ width: fit-content;
265
+ }
266
+
267
+ .bn-ak-badge span {
268
+ align-items: center;
269
+ display: flex;
270
+ height: fit-content;
271
+ }
272
+
273
+ .bn-ak-badge-group {
274
+ align-items: center;
275
+ display: flex;
276
+ gap: 4px;
277
+ flex-wrap: wrap;
278
+ width: 100%;
279
+ }
280
+
281
+ .bn-ariakit .bn-thread-comment {
282
+ position: relative;
283
+ display: flex;
284
+ flex-direction: column;
285
+ gap: 4px;
286
+ }
287
+
288
+ .bn-ariakit .bn-action-toolbar .bn-ak-button {
289
+ height: 1.5rem;
290
+ padding: 8px;
291
+ width: fit-content;
292
+ }
293
+
294
+ .bn-ak-hovercard {
295
+ z-index: 0;
296
+ }
297
+
298
+ .bn-ak-panel-popover {
299
+ background-color: transparent;
300
+ border: none;
301
+ box-shadow: none;
302
+ padding: 0;
303
+ }
304
+
305
+ .bn-ariakit .bn-comment-actions-wrapper {
306
+ align-items: start;
307
+ display: flex;
308
+ justify-content: flex-end;
309
+ }
310
+
311
+ .bn-ak-skeleton {
312
+ background-color: rgb(255 255 255/25%);
313
+ }
314
+
315
+ .bn-ak-username.bn-ak-skeleton {
316
+ border-radius: 8px;
317
+ height: 16px;
318
+ width: 100px;
319
+ }
@@ -9,7 +9,14 @@ type ToolbarProps = ComponentProps["FormattingToolbar"]["Root"] &
9
9
 
10
10
  export const Toolbar = forwardRef<HTMLDivElement, ToolbarProps>(
11
11
  (props, ref) => {
12
- const { className, children, onMouseEnter, onMouseLeave, ...rest } = props;
12
+ const {
13
+ className,
14
+ children,
15
+ onMouseEnter,
16
+ onMouseLeave,
17
+ variant,
18
+ ...rest
19
+ } = props;
13
20
 
14
21
  assertEmpty(rest);
15
22