@schemavaults/ui 0.87.1 → 0.89.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/dist/components/ui/index.d.ts +4 -0
- package/dist/components/ui/index.js +2 -0
- package/dist/components/ui/index.js.map +1 -1
- package/dist/components/ui/scroll-to-top/index.d.ts +3 -0
- package/dist/components/ui/scroll-to-top/index.js +3 -0
- package/dist/components/ui/scroll-to-top/index.js.map +1 -0
- package/dist/components/ui/scroll-to-top/scroll-to-top.d.ts +69 -0
- package/dist/components/ui/scroll-to-top/scroll-to-top.js +129 -0
- package/dist/components/ui/scroll-to-top/scroll-to-top.js.map +1 -0
- package/dist/components/ui/toolbar/index.d.ts +2 -0
- package/dist/components/ui/toolbar/index.js +2 -0
- package/dist/components/ui/toolbar/index.js.map +1 -0
- package/dist/components/ui/toolbar/toolbar.d.ts +98 -0
- package/dist/components/ui/toolbar/toolbar.js +187 -0
- package/dist/components/ui/toolbar/toolbar.js.map +1 -0
- package/package.json +1 -1
|
@@ -200,6 +200,8 @@ export * from "./countdown";
|
|
|
200
200
|
export type * from "./countdown";
|
|
201
201
|
export * from "./floating-action-button";
|
|
202
202
|
export type * from "./floating-action-button";
|
|
203
|
+
export * from "./scroll-to-top";
|
|
204
|
+
export type * from "./scroll-to-top";
|
|
203
205
|
export * from "./notification-bell";
|
|
204
206
|
export type * from "./notification-bell";
|
|
205
207
|
export * from "./calendar";
|
|
@@ -224,3 +226,5 @@ export * from "./split-button";
|
|
|
224
226
|
export type * from "./split-button";
|
|
225
227
|
export * from "./ribbon";
|
|
226
228
|
export type * from "./ribbon";
|
|
229
|
+
export * from "./toolbar";
|
|
230
|
+
export type * from "./toolbar";
|
|
@@ -99,6 +99,7 @@ export * from "./tree-view";
|
|
|
99
99
|
export * from "./carousel";
|
|
100
100
|
export * from "./countdown";
|
|
101
101
|
export * from "./floating-action-button";
|
|
102
|
+
export * from "./scroll-to-top";
|
|
102
103
|
export * from "./notification-bell";
|
|
103
104
|
export * from "./calendar";
|
|
104
105
|
export * from "./date-picker";
|
|
@@ -111,4 +112,5 @@ export * from "./terminal-frame";
|
|
|
111
112
|
export * from "./inline-edit";
|
|
112
113
|
export * from "./split-button";
|
|
113
114
|
export * from "./ribbon";
|
|
115
|
+
export * from "./toolbar";
|
|
114
116
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/components/ui/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/components/ui/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/components/ui/scroll-to-top/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAGhC,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { type ButtonHTMLAttributes, type ReactElement, type ReactNode, type Ref, type RefObject } from "react";
|
|
2
|
+
import { type VariantProps } from "class-variance-authority";
|
|
3
|
+
export declare const scrollToTopVariantIds: ["primary", "secondary", "outline", "ghost", "brand"];
|
|
4
|
+
export type ScrollToTopVariantId = (typeof scrollToTopVariantIds)[number];
|
|
5
|
+
export declare const scrollToTopSizeIds: ["sm", "default", "lg"];
|
|
6
|
+
export type ScrollToTopSizeId = (typeof scrollToTopSizeIds)[number];
|
|
7
|
+
export declare const scrollToTopPositionIds: ["bottom-right", "bottom-left", "bottom-center", "static"];
|
|
8
|
+
export type ScrollToTopPositionId = (typeof scrollToTopPositionIds)[number];
|
|
9
|
+
declare const scrollToTopVariants: (props?: ({
|
|
10
|
+
variant?: "primary" | "outline" | "ghost" | "secondary" | "brand" | null | undefined;
|
|
11
|
+
size?: "sm" | "default" | "lg" | null | undefined;
|
|
12
|
+
position?: "static" | "bottom-right" | "bottom-left" | "bottom-center" | null | undefined;
|
|
13
|
+
extended?: boolean | null | undefined;
|
|
14
|
+
} & import("class-variance-authority/types").ClassProp) | undefined) => string;
|
|
15
|
+
export interface ScrollToTopProps extends Omit<ButtonHTMLAttributes<HTMLButtonElement>, "children">, VariantProps<typeof scrollToTopVariants> {
|
|
16
|
+
ref?: Ref<HTMLButtonElement>;
|
|
17
|
+
/**
|
|
18
|
+
* Pixel scroll offset at which the button becomes visible. Defaults to
|
|
19
|
+
* `320` — roughly a viewport of scroll on a laptop.
|
|
20
|
+
*/
|
|
21
|
+
threshold?: number;
|
|
22
|
+
/**
|
|
23
|
+
* Ref to a scroll container to observe and scroll. When omitted, the
|
|
24
|
+
* component tracks and scrolls `window`. Useful for embedded scroll
|
|
25
|
+
* areas such as dialogs, sheets, and split panes.
|
|
26
|
+
*/
|
|
27
|
+
containerRef?: RefObject<HTMLElement | null>;
|
|
28
|
+
/**
|
|
29
|
+
* Custom icon rendered inside the button. Defaults to lucide's `ArrowUp`.
|
|
30
|
+
*/
|
|
31
|
+
icon?: ReactNode;
|
|
32
|
+
/**
|
|
33
|
+
* Optional visible label. When provided, the button switches to its
|
|
34
|
+
* extended (pill) layout unless `extended` is explicitly overridden.
|
|
35
|
+
*/
|
|
36
|
+
label?: ReactNode;
|
|
37
|
+
/**
|
|
38
|
+
* Accessible label. Falls back to `label` (if string) or "Scroll to top".
|
|
39
|
+
*/
|
|
40
|
+
"aria-label"?: string;
|
|
41
|
+
/**
|
|
42
|
+
* Scroll behaviour used when the button is clicked. Defaults to `"smooth"`
|
|
43
|
+
* and is automatically downgraded to `"auto"` when the user has
|
|
44
|
+
* `prefers-reduced-motion: reduce`.
|
|
45
|
+
*/
|
|
46
|
+
behavior?: ScrollBehavior;
|
|
47
|
+
/**
|
|
48
|
+
* When `true`, the button is always rendered regardless of scroll position.
|
|
49
|
+
* Useful for testing/showcasing in Storybook.
|
|
50
|
+
*/
|
|
51
|
+
alwaysVisible?: boolean;
|
|
52
|
+
/**
|
|
53
|
+
* Called after the scroll-to-top action is invoked.
|
|
54
|
+
*/
|
|
55
|
+
onScrolledToTop?: () => void;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* A floating "back to top" button that appears once the user scrolls past a
|
|
59
|
+
* configurable threshold and smoothly scrolls the page (or an embedded
|
|
60
|
+
* container) back to the top when clicked.
|
|
61
|
+
*
|
|
62
|
+
* Respects `prefers-reduced-motion` by falling back to an instant scroll.
|
|
63
|
+
*/
|
|
64
|
+
declare function ScrollToTop({ className, variant, size, position, extended, threshold, containerRef, icon, label, behavior, alwaysVisible, onScrolledToTop, onClick, type, ref, ...props }: ScrollToTopProps): ReactElement | null;
|
|
65
|
+
declare namespace ScrollToTop {
|
|
66
|
+
var displayName: string;
|
|
67
|
+
}
|
|
68
|
+
export { ScrollToTop, scrollToTopVariants };
|
|
69
|
+
export default ScrollToTop;
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { useCallback, useEffect, useState, } from "react";
|
|
4
|
+
import { cva } from "class-variance-authority";
|
|
5
|
+
import { ArrowUp } from "lucide-react";
|
|
6
|
+
import { cn } from "../../../lib/utils";
|
|
7
|
+
export const scrollToTopVariantIds = [
|
|
8
|
+
"primary",
|
|
9
|
+
"secondary",
|
|
10
|
+
"outline",
|
|
11
|
+
"ghost",
|
|
12
|
+
"brand",
|
|
13
|
+
];
|
|
14
|
+
export const scrollToTopSizeIds = [
|
|
15
|
+
"sm",
|
|
16
|
+
"default",
|
|
17
|
+
"lg",
|
|
18
|
+
];
|
|
19
|
+
export const scrollToTopPositionIds = [
|
|
20
|
+
"bottom-right",
|
|
21
|
+
"bottom-left",
|
|
22
|
+
"bottom-center",
|
|
23
|
+
"static",
|
|
24
|
+
];
|
|
25
|
+
const scrollToTopVariants = cva("group/scroll-to-top inline-flex items-center justify-center gap-2 rounded-full font-medium shadow-lg ring-offset-background transition-[background-color,border-color,color,box-shadow,opacity,transform] hover:shadow-xl active:scale-95 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 disabled:shadow-none z-40", {
|
|
26
|
+
variants: {
|
|
27
|
+
variant: {
|
|
28
|
+
primary: "bg-primary text-primary-foreground hover:bg-primary/90 shadow-primary/25",
|
|
29
|
+
secondary: "bg-secondary text-secondary-foreground hover:bg-secondary/80 shadow-secondary/25",
|
|
30
|
+
outline: "border border-input bg-background text-foreground hover:bg-accent hover:text-accent-foreground",
|
|
31
|
+
ghost: "bg-background/70 text-foreground backdrop-blur-md border border-border/50 hover:bg-accent hover:text-accent-foreground",
|
|
32
|
+
brand: "bg-schemavaults-brand-blue text-primary-foreground hover:bg-schemavaults-brand-blue/90 shadow-schemavaults-brand-blue/30",
|
|
33
|
+
},
|
|
34
|
+
size: {
|
|
35
|
+
sm: "h-10 w-10 text-sm [&_svg]:size-4",
|
|
36
|
+
default: "h-12 w-12 text-base [&_svg]:size-5",
|
|
37
|
+
lg: "h-14 w-14 text-base [&_svg]:size-6",
|
|
38
|
+
},
|
|
39
|
+
position: {
|
|
40
|
+
"bottom-right": "fixed bottom-6 right-6",
|
|
41
|
+
"bottom-left": "fixed bottom-6 left-6",
|
|
42
|
+
"bottom-center": "fixed bottom-6 left-1/2 -translate-x-1/2",
|
|
43
|
+
static: "",
|
|
44
|
+
},
|
|
45
|
+
extended: {
|
|
46
|
+
true: "w-auto px-5",
|
|
47
|
+
false: "",
|
|
48
|
+
},
|
|
49
|
+
},
|
|
50
|
+
compoundVariants: [
|
|
51
|
+
{ extended: true, size: "sm", class: "h-10" },
|
|
52
|
+
{ extended: true, size: "default", class: "h-12" },
|
|
53
|
+
{ extended: true, size: "lg", class: "h-14" },
|
|
54
|
+
],
|
|
55
|
+
defaultVariants: {
|
|
56
|
+
variant: "primary",
|
|
57
|
+
size: "default",
|
|
58
|
+
position: "bottom-right",
|
|
59
|
+
extended: false,
|
|
60
|
+
},
|
|
61
|
+
});
|
|
62
|
+
function readScrollTop(container) {
|
|
63
|
+
if (container)
|
|
64
|
+
return container.scrollTop;
|
|
65
|
+
if (typeof window === "undefined")
|
|
66
|
+
return 0;
|
|
67
|
+
return window.scrollY ?? window.pageYOffset ?? 0;
|
|
68
|
+
}
|
|
69
|
+
function prefersReducedMotion() {
|
|
70
|
+
if (typeof window === "undefined" || !window.matchMedia)
|
|
71
|
+
return false;
|
|
72
|
+
return window.matchMedia("(prefers-reduced-motion: reduce)").matches;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* A floating "back to top" button that appears once the user scrolls past a
|
|
76
|
+
* configurable threshold and smoothly scrolls the page (or an embedded
|
|
77
|
+
* container) back to the top when clicked.
|
|
78
|
+
*
|
|
79
|
+
* Respects `prefers-reduced-motion` by falling back to an instant scroll.
|
|
80
|
+
*/
|
|
81
|
+
function ScrollToTop({ className, variant, size, position, extended, threshold = 320, containerRef, icon, label, behavior = "smooth", alwaysVisible = false, onScrolledToTop, onClick, type = "button", ref, ...props }) {
|
|
82
|
+
const [visible, setVisible] = useState(alwaysVisible);
|
|
83
|
+
useEffect(() => {
|
|
84
|
+
if (alwaysVisible) {
|
|
85
|
+
setVisible(true);
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
const container = containerRef?.current ?? null;
|
|
89
|
+
const target = container ?? (typeof window !== "undefined" ? window : null);
|
|
90
|
+
if (!target)
|
|
91
|
+
return;
|
|
92
|
+
function update() {
|
|
93
|
+
setVisible(readScrollTop(container) > threshold);
|
|
94
|
+
}
|
|
95
|
+
update();
|
|
96
|
+
target.addEventListener("scroll", update, { passive: true });
|
|
97
|
+
return () => {
|
|
98
|
+
target.removeEventListener("scroll", update);
|
|
99
|
+
};
|
|
100
|
+
}, [alwaysVisible, containerRef, threshold]);
|
|
101
|
+
const handleClick = useCallback((event) => {
|
|
102
|
+
onClick?.(event);
|
|
103
|
+
if (event.defaultPrevented)
|
|
104
|
+
return;
|
|
105
|
+
const resolvedBehavior = prefersReducedMotion()
|
|
106
|
+
? "auto"
|
|
107
|
+
: behavior;
|
|
108
|
+
const container = containerRef?.current ?? null;
|
|
109
|
+
if (container) {
|
|
110
|
+
container.scrollTo({ top: 0, left: 0, behavior: resolvedBehavior });
|
|
111
|
+
}
|
|
112
|
+
else if (typeof window !== "undefined") {
|
|
113
|
+
window.scrollTo({ top: 0, left: 0, behavior: resolvedBehavior });
|
|
114
|
+
}
|
|
115
|
+
onScrolledToTop?.();
|
|
116
|
+
}, [behavior, containerRef, onClick, onScrolledToTop]);
|
|
117
|
+
const isExtended = extended ?? Boolean(label);
|
|
118
|
+
const accessibleLabel = props["aria-label"] ??
|
|
119
|
+
(typeof label === "string" ? label : "Scroll to top");
|
|
120
|
+
const resolvedIcon = icon ?? _jsx(ArrowUp, { "aria-hidden": "true" });
|
|
121
|
+
if (!visible && position !== "static") {
|
|
122
|
+
return null;
|
|
123
|
+
}
|
|
124
|
+
return (_jsxs("button", { ref: ref, type: type, "data-slot": "scroll-to-top", "data-visible": visible ? "true" : "false", "data-extended": isExtended || undefined, "aria-label": accessibleLabel, onClick: handleClick, className: cn(scrollToTopVariants({ variant, size, position, extended: isExtended }), !visible && "pointer-events-none opacity-0", visible && "opacity-100", className), ...props, children: [_jsx("span", { "aria-hidden": "true", "data-slot": "scroll-to-top-icon", className: "inline-flex shrink-0 items-center justify-center transition-transform group-hover/scroll-to-top:-translate-y-0.5", children: resolvedIcon }), isExtended && label != null ? (_jsx("span", { "data-slot": "scroll-to-top-label", className: "truncate", children: label })) : null] }));
|
|
125
|
+
}
|
|
126
|
+
ScrollToTop.displayName = "ScrollToTop";
|
|
127
|
+
export { ScrollToTop, scrollToTopVariants };
|
|
128
|
+
export default ScrollToTop;
|
|
129
|
+
//# sourceMappingURL=scroll-to-top.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scroll-to-top.js","sourceRoot":"","sources":["../../../../src/components/ui/scroll-to-top/scroll-to-top.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,EACL,WAAW,EACX,SAAS,EACT,QAAQ,GAOT,MAAM,OAAO,CAAC;AACf,OAAO,EAAE,GAAG,EAAqB,MAAM,0BAA0B,CAAC;AAClE,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEvC,OAAO,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AAEjC,MAAM,CAAC,MAAM,qBAAqB,GAAG;IACnC,SAAS;IACT,WAAW;IACX,SAAS;IACT,OAAO;IACP,OAAO;CACoB,CAAC;AAI9B,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAChC,IAAI;IACJ,SAAS;IACT,IAAI;CACuB,CAAC;AAI9B,MAAM,CAAC,MAAM,sBAAsB,GAAG;IACpC,cAAc;IACd,aAAa;IACb,eAAe;IACf,QAAQ;CACmB,CAAC;AAI9B,MAAM,mBAAmB,GAAG,GAAG,CAC7B,0ZAA0Z,EAC1Z;IACE,QAAQ,EAAE;QACR,OAAO,EAAE;YACP,OAAO,EACL,0EAA0E;YAC5E,SAAS,EACP,kFAAkF;YACpF,OAAO,EACL,gGAAgG;YAClG,KAAK,EACH,wHAAwH;YAC1H,KAAK,EACH,0HAA0H;SAC9E;QAChD,IAAI,EAAE;YACJ,EAAE,EAAE,kCAAkC;YACtC,OAAO,EAAE,oCAAoC;YAC7C,EAAE,EAAE,oCAAoC;SACG;QAC7C,QAAQ,EAAE;YACR,cAAc,EAAE,wBAAwB;YACxC,aAAa,EAAE,uBAAuB;YACtC,eAAe,EACb,0CAA0C;YAC5C,MAAM,EAAE,EAAE;SACqC;QACjD,QAAQ,EAAE;YACR,IAAI,EAAE,aAAa;YACnB,KAAK,EAAE,EAAE;SACV;KACF;IACD,gBAAgB,EAAE;QAChB,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE;QAC7C,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE;QAClD,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE;KAC9C;IACD,eAAe,EAAE;QACf,OAAO,EAAE,SAAS;QAClB,IAAI,EAAE,SAAS;QACf,QAAQ,EAAE,cAAc;QACxB,QAAQ,EAAE,KAAK;KAChB;CACF,CACF,CAAC;AA+CF,SAAS,aAAa,CAAC,SAA6B;IAClD,IAAI,SAAS;QAAE,OAAO,SAAS,CAAC,SAAS,CAAC;IAC1C,IAAI,OAAO,MAAM,KAAK,WAAW;QAAE,OAAO,CAAC,CAAC;IAC5C,OAAO,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,WAAW,IAAI,CAAC,CAAC;AACnD,CAAC;AAED,SAAS,oBAAoB;IAC3B,IAAI,OAAO,MAAM,KAAK,WAAW,IAAI,CAAC,MAAM,CAAC,UAAU;QAAE,OAAO,KAAK,CAAC;IACtE,OAAO,MAAM,CAAC,UAAU,CAAC,kCAAkC,CAAC,CAAC,OAAO,CAAC;AACvE,CAAC;AAED;;;;;;GAMG;AACH,SAAS,WAAW,CAAC,EACnB,SAAS,EACT,OAAO,EACP,IAAI,EACJ,QAAQ,EACR,QAAQ,EACR,SAAS,GAAG,GAAG,EACf,YAAY,EACZ,IAAI,EACJ,KAAK,EACL,QAAQ,GAAG,QAAQ,EACnB,aAAa,GAAG,KAAK,EACrB,eAAe,EACf,OAAO,EACP,IAAI,GAAG,QAAQ,EACf,GAAG,EACH,GAAG,KAAK,EACS;IACjB,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAU,aAAa,CAAC,CAAC;IAE/D,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,aAAa,EAAE,CAAC;YAClB,UAAU,CAAC,IAAI,CAAC,CAAC;YACjB,OAAO;QACT,CAAC;QACD,MAAM,SAAS,GAAuB,YAAY,EAAE,OAAO,IAAI,IAAI,CAAC;QACpE,MAAM,MAAM,GACV,SAAS,IAAI,CAAC,OAAO,MAAM,KAAK,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAE,IAAc,CAAC,CAAC;QAE1E,IAAI,CAAC,MAAM;YAAE,OAAO;QAEpB,SAAS,MAAM;YACb,UAAU,CAAC,aAAa,CAAC,SAAS,CAAC,GAAG,SAAS,CAAC,CAAC;QACnD,CAAC;QAED,MAAM,EAAE,CAAC;QACT,MAAM,CAAC,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;QAC7D,OAAO,GAAG,EAAE;YACV,MAAM,CAAC,mBAAmB,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QAC/C,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,aAAa,EAAE,YAAY,EAAE,SAAS,CAAC,CAAC,CAAC;IAE7C,MAAM,WAAW,GAAG,WAAW,CAC7B,CAAC,KAAyC,EAAQ,EAAE;QAClD,OAAO,EAAE,CAAC,KAAK,CAAC,CAAC;QACjB,IAAI,KAAK,CAAC,gBAAgB;YAAE,OAAO;QAEnC,MAAM,gBAAgB,GAAmB,oBAAoB,EAAE;YAC7D,CAAC,CAAC,MAAM;YACR,CAAC,CAAC,QAAQ,CAAC;QAEb,MAAM,SAAS,GAAuB,YAAY,EAAE,OAAO,IAAI,IAAI,CAAC;QACpE,IAAI,SAAS,EAAE,CAAC;YACd,SAAS,CAAC,QAAQ,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,gBAAgB,EAAE,CAAC,CAAC;QACtE,CAAC;aAAM,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE,CAAC;YACzC,MAAM,CAAC,QAAQ,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,gBAAgB,EAAE,CAAC,CAAC;QACnE,CAAC;QAED,eAAe,EAAE,EAAE,CAAC;IACtB,CAAC,EACD,CAAC,QAAQ,EAAE,YAAY,EAAE,OAAO,EAAE,eAAe,CAAC,CACnD,CAAC;IAEF,MAAM,UAAU,GAAY,QAAQ,IAAI,OAAO,CAAC,KAAK,CAAC,CAAC;IACvD,MAAM,eAAe,GACnB,KAAK,CAAC,YAAY,CAAC;QACnB,CAAC,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC;IAExD,MAAM,YAAY,GAAc,IAAI,IAAI,KAAC,OAAO,mBAAa,MAAM,GAAG,CAAC;IAEvE,IAAI,CAAC,OAAO,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;QACtC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,CACL,kBACE,GAAG,EAAE,GAAG,EACR,IAAI,EAAE,IAAI,eACA,eAAe,kBACX,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,mBACzB,UAAU,IAAI,SAAS,gBAC1B,eAAe,EAC3B,OAAO,EAAE,WAAW,EACpB,SAAS,EAAE,EAAE,CACX,mBAAmB,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC,EACtE,CAAC,OAAO,IAAI,+BAA+B,EAC3C,OAAO,IAAI,aAAa,EACxB,SAAS,CACV,KACG,KAAK,aAET,8BACc,MAAM,eACR,oBAAoB,EAC9B,SAAS,EAAC,kHAAkH,YAE3H,YAAY,GACR,EACN,UAAU,IAAI,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,CAC7B,4BAAgB,qBAAqB,EAAC,SAAS,EAAC,UAAU,YACvD,KAAK,GACD,CACR,CAAC,CAAC,CAAC,IAAI,IACD,CACV,CAAC;AACJ,CAAC;AACD,WAAW,CAAC,WAAW,GAAG,aAAa,CAAC;AAExC,OAAO,EAAE,WAAW,EAAE,mBAAmB,EAAE,CAAC;AAE5C,eAAe,WAAW,CAAC"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export { Toolbar, Toolbar as default, ToolbarButton, ToolbarToggle, ToolbarLink, ToolbarSeparator, ToolbarGroup, ToolbarSpacer, toolbarVariants, toolbarItemVariants, toolbarOrientationIds, toolbarVariantIds, toolbarSizeIds, toolbarItemVariantIds, } from "./toolbar";
|
|
2
|
+
export type * from "./toolbar";
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export { Toolbar, Toolbar as default, ToolbarButton, ToolbarToggle, ToolbarLink, ToolbarSeparator, ToolbarGroup, ToolbarSpacer, toolbarVariants, toolbarItemVariants, toolbarOrientationIds, toolbarVariantIds, toolbarSizeIds, toolbarItemVariantIds, } from "./toolbar";
|
|
2
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/components/ui/toolbar/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,OAAO,EACP,OAAO,IAAI,OAAO,EAClB,aAAa,EACb,aAAa,EACb,WAAW,EACX,gBAAgB,EAChB,YAAY,EACZ,aAAa,EACb,eAAe,EACf,mBAAmB,EACnB,qBAAqB,EACrB,iBAAiB,EACjB,cAAc,EACd,qBAAqB,GACtB,MAAM,WAAW,CAAC"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import { type VariantProps } from "class-variance-authority";
|
|
2
|
+
import { type AnchorHTMLAttributes, type ButtonHTMLAttributes, type HTMLAttributes, type Ref, type ReactElement } from "react";
|
|
3
|
+
export declare const toolbarOrientationIds: readonly ["horizontal", "vertical"];
|
|
4
|
+
export type ToolbarOrientation = (typeof toolbarOrientationIds)[number];
|
|
5
|
+
export declare const toolbarVariantIds: readonly ["default", "muted", "floating", "ghost"];
|
|
6
|
+
export type ToolbarVariant = (typeof toolbarVariantIds)[number];
|
|
7
|
+
export declare const toolbarSizeIds: readonly ["sm", "default", "lg"];
|
|
8
|
+
export type ToolbarSize = (typeof toolbarSizeIds)[number];
|
|
9
|
+
declare const toolbarVariants: (props?: ({
|
|
10
|
+
variant?: "default" | "ghost" | "muted" | "floating" | null | undefined;
|
|
11
|
+
size?: "sm" | "default" | "lg" | null | undefined;
|
|
12
|
+
} & import("class-variance-authority/types").ClassProp) | undefined) => string;
|
|
13
|
+
export interface ToolbarProps extends HTMLAttributes<HTMLDivElement>, VariantProps<typeof toolbarVariants> {
|
|
14
|
+
orientation?: ToolbarOrientation;
|
|
15
|
+
/**
|
|
16
|
+
* Accessible label for the toolbar. Required by WAI-ARIA when the
|
|
17
|
+
* toolbar contains more than a single meaningful action. Prefer this
|
|
18
|
+
* over `aria-labelledby` when the label isn't already rendered on
|
|
19
|
+
* screen.
|
|
20
|
+
*/
|
|
21
|
+
"aria-label"?: string;
|
|
22
|
+
ref?: Ref<HTMLDivElement>;
|
|
23
|
+
}
|
|
24
|
+
declare function Toolbar({ className, variant, size, orientation, onKeyDown, ref, children, ...props }: ToolbarProps): ReactElement;
|
|
25
|
+
declare namespace Toolbar {
|
|
26
|
+
var displayName: string;
|
|
27
|
+
}
|
|
28
|
+
export declare const toolbarItemVariantIds: readonly ["default", "primary", "destructive"];
|
|
29
|
+
export type ToolbarItemVariant = (typeof toolbarItemVariantIds)[number];
|
|
30
|
+
declare const toolbarItemVariants: (props?: ({
|
|
31
|
+
variant?: "default" | "destructive" | "primary" | null | undefined;
|
|
32
|
+
} & import("class-variance-authority/types").ClassProp) | undefined) => string;
|
|
33
|
+
export interface ToolbarButtonProps extends ButtonHTMLAttributes<HTMLButtonElement>, VariantProps<typeof toolbarItemVariants> {
|
|
34
|
+
/**
|
|
35
|
+
* Optional visual/logical "active" state (e.g. the currently-selected
|
|
36
|
+
* tool in an editor). Semantically distinct from a toggle: use
|
|
37
|
+
* `ToolbarToggle` when you need `aria-pressed`.
|
|
38
|
+
*/
|
|
39
|
+
active?: boolean;
|
|
40
|
+
/**
|
|
41
|
+
* When true, render the button as the child element (via Radix `Slot`).
|
|
42
|
+
* This is what you use to graft external triggers such as
|
|
43
|
+
* `DropdownMenuTrigger asChild`, `PopoverTrigger asChild`, or
|
|
44
|
+
* `TooltipTrigger asChild` onto a `ToolbarButton` while keeping its
|
|
45
|
+
* roving-tabindex wiring (`data-toolbar-item`) and item styles.
|
|
46
|
+
*/
|
|
47
|
+
asChild?: boolean;
|
|
48
|
+
ref?: Ref<HTMLButtonElement>;
|
|
49
|
+
}
|
|
50
|
+
declare function ToolbarButton({ className, variant, active, disabled, type, asChild, ref, ...props }: ToolbarButtonProps): ReactElement;
|
|
51
|
+
declare namespace ToolbarButton {
|
|
52
|
+
var displayName: string;
|
|
53
|
+
}
|
|
54
|
+
export interface ToolbarToggleProps extends Omit<ButtonHTMLAttributes<HTMLButtonElement>, "onChange">, VariantProps<typeof toolbarItemVariants> {
|
|
55
|
+
pressed?: boolean;
|
|
56
|
+
onPressedChange?: (pressed: boolean) => void;
|
|
57
|
+
/**
|
|
58
|
+
* When true, render the toggle as the child element (via Radix `Slot`).
|
|
59
|
+
* Useful for hanging a `PopoverTrigger asChild` or similar off a
|
|
60
|
+
* pressed-state toolbar item while keeping the toolbar's roving-tabindex
|
|
61
|
+
* wiring intact.
|
|
62
|
+
*/
|
|
63
|
+
asChild?: boolean;
|
|
64
|
+
ref?: Ref<HTMLButtonElement>;
|
|
65
|
+
}
|
|
66
|
+
declare function ToolbarToggle({ className, variant, pressed, onPressedChange, onClick, disabled, type, asChild, ref, ...props }: ToolbarToggleProps): ReactElement;
|
|
67
|
+
declare namespace ToolbarToggle {
|
|
68
|
+
var displayName: string;
|
|
69
|
+
}
|
|
70
|
+
export interface ToolbarLinkProps extends AnchorHTMLAttributes<HTMLAnchorElement>, VariantProps<typeof toolbarItemVariants> {
|
|
71
|
+
ref?: Ref<HTMLAnchorElement>;
|
|
72
|
+
}
|
|
73
|
+
declare function ToolbarLink({ className, variant, children, ref, ...props }: ToolbarLinkProps): ReactElement;
|
|
74
|
+
declare namespace ToolbarLink {
|
|
75
|
+
var displayName: string;
|
|
76
|
+
}
|
|
77
|
+
export interface ToolbarSeparatorProps extends HTMLAttributes<HTMLDivElement> {
|
|
78
|
+
ref?: Ref<HTMLDivElement>;
|
|
79
|
+
}
|
|
80
|
+
declare function ToolbarSeparator({ className, ref, ...props }: ToolbarSeparatorProps): ReactElement;
|
|
81
|
+
declare namespace ToolbarSeparator {
|
|
82
|
+
var displayName: string;
|
|
83
|
+
}
|
|
84
|
+
export interface ToolbarGroupProps extends HTMLAttributes<HTMLDivElement> {
|
|
85
|
+
ref?: Ref<HTMLDivElement>;
|
|
86
|
+
}
|
|
87
|
+
declare function ToolbarGroup({ className, ref, ...props }: ToolbarGroupProps): ReactElement;
|
|
88
|
+
declare namespace ToolbarGroup {
|
|
89
|
+
var displayName: string;
|
|
90
|
+
}
|
|
91
|
+
export interface ToolbarSpacerProps extends HTMLAttributes<HTMLDivElement> {
|
|
92
|
+
ref?: Ref<HTMLDivElement>;
|
|
93
|
+
}
|
|
94
|
+
declare function ToolbarSpacer({ className, ref, ...props }: ToolbarSpacerProps): ReactElement;
|
|
95
|
+
declare namespace ToolbarSpacer {
|
|
96
|
+
var displayName: string;
|
|
97
|
+
}
|
|
98
|
+
export { Toolbar, ToolbarButton, ToolbarToggle, ToolbarLink, ToolbarSeparator, ToolbarGroup, ToolbarSpacer, toolbarVariants, toolbarItemVariants, };
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
3
|
+
import { Slot } from "@radix-ui/react-slot";
|
|
4
|
+
import { cva } from "class-variance-authority";
|
|
5
|
+
import { createContext, useCallback, useContext, useEffect, useRef, } from "react";
|
|
6
|
+
import { cn } from "../../../lib/utils";
|
|
7
|
+
export const toolbarOrientationIds = [
|
|
8
|
+
"horizontal",
|
|
9
|
+
"vertical",
|
|
10
|
+
];
|
|
11
|
+
export const toolbarVariantIds = [
|
|
12
|
+
"default",
|
|
13
|
+
"muted",
|
|
14
|
+
"floating",
|
|
15
|
+
"ghost",
|
|
16
|
+
];
|
|
17
|
+
export const toolbarSizeIds = [
|
|
18
|
+
"sm",
|
|
19
|
+
"default",
|
|
20
|
+
"lg",
|
|
21
|
+
];
|
|
22
|
+
const toolbarVariants = cva("flex items-center text-foreground data-[orientation=vertical]:flex-col data-[orientation=vertical]:items-stretch", {
|
|
23
|
+
variants: {
|
|
24
|
+
variant: {
|
|
25
|
+
default: "bg-card border border-border rounded-md shadow-sm",
|
|
26
|
+
muted: "bg-muted/60 border border-border/60 rounded-md",
|
|
27
|
+
floating: "bg-card border border-border rounded-lg shadow-lg backdrop-blur",
|
|
28
|
+
ghost: "bg-transparent",
|
|
29
|
+
},
|
|
30
|
+
size: {
|
|
31
|
+
sm: "gap-0.5 p-1",
|
|
32
|
+
default: "gap-1 p-1.5",
|
|
33
|
+
lg: "gap-1.5 p-2",
|
|
34
|
+
},
|
|
35
|
+
},
|
|
36
|
+
defaultVariants: {
|
|
37
|
+
variant: "default",
|
|
38
|
+
size: "default",
|
|
39
|
+
},
|
|
40
|
+
});
|
|
41
|
+
const TOOLBAR_ITEM_SELECTOR = '[data-toolbar-item]:not([data-disabled="true"]):not([data-disabled=""])';
|
|
42
|
+
const ToolbarContext = createContext(null);
|
|
43
|
+
function useToolbarContext(component) {
|
|
44
|
+
const ctx = useContext(ToolbarContext);
|
|
45
|
+
if (!ctx) {
|
|
46
|
+
throw new Error(`${component} must be rendered inside a <Toolbar>`);
|
|
47
|
+
}
|
|
48
|
+
return ctx;
|
|
49
|
+
}
|
|
50
|
+
function Toolbar({ className, variant, size, orientation = "horizontal", onKeyDown, ref, children, ...props }) {
|
|
51
|
+
const localRef = useRef(null);
|
|
52
|
+
const setRef = useCallback((node) => {
|
|
53
|
+
localRef.current = node;
|
|
54
|
+
if (typeof ref === "function") {
|
|
55
|
+
ref(node);
|
|
56
|
+
}
|
|
57
|
+
else if (ref && typeof ref === "object") {
|
|
58
|
+
ref.current = node;
|
|
59
|
+
}
|
|
60
|
+
}, [ref]);
|
|
61
|
+
const getItems = useCallback(() => {
|
|
62
|
+
const root = localRef.current;
|
|
63
|
+
if (!root)
|
|
64
|
+
return [];
|
|
65
|
+
return Array.from(root.querySelectorAll(TOOLBAR_ITEM_SELECTOR));
|
|
66
|
+
}, []);
|
|
67
|
+
useEffect(() => {
|
|
68
|
+
const items = getItems();
|
|
69
|
+
if (items.length === 0)
|
|
70
|
+
return;
|
|
71
|
+
const alreadyFocusable = items.some((item) => item.tabIndex === 0);
|
|
72
|
+
if (alreadyFocusable)
|
|
73
|
+
return;
|
|
74
|
+
items.forEach((item, index) => {
|
|
75
|
+
item.tabIndex = index === 0 ? 0 : -1;
|
|
76
|
+
});
|
|
77
|
+
});
|
|
78
|
+
const handleKeyDown = (event) => {
|
|
79
|
+
onKeyDown?.(event);
|
|
80
|
+
if (event.defaultPrevented)
|
|
81
|
+
return;
|
|
82
|
+
const items = getItems();
|
|
83
|
+
if (items.length === 0)
|
|
84
|
+
return;
|
|
85
|
+
const isHorizontal = (props["aria-orientation"] ?? orientation) === "horizontal";
|
|
86
|
+
const nextKey = isHorizontal ? "ArrowRight" : "ArrowDown";
|
|
87
|
+
const prevKey = isHorizontal ? "ArrowLeft" : "ArrowUp";
|
|
88
|
+
const currentIndex = items.indexOf(document.activeElement);
|
|
89
|
+
let targetIndex = -1;
|
|
90
|
+
if (event.key === nextKey) {
|
|
91
|
+
targetIndex =
|
|
92
|
+
currentIndex === -1 ? 0 : (currentIndex + 1) % items.length;
|
|
93
|
+
}
|
|
94
|
+
else if (event.key === prevKey) {
|
|
95
|
+
targetIndex =
|
|
96
|
+
currentIndex === -1
|
|
97
|
+
? items.length - 1
|
|
98
|
+
: (currentIndex - 1 + items.length) % items.length;
|
|
99
|
+
}
|
|
100
|
+
else if (event.key === "Home") {
|
|
101
|
+
targetIndex = 0;
|
|
102
|
+
}
|
|
103
|
+
else if (event.key === "End") {
|
|
104
|
+
targetIndex = items.length - 1;
|
|
105
|
+
}
|
|
106
|
+
if (targetIndex >= 0) {
|
|
107
|
+
event.preventDefault();
|
|
108
|
+
items[targetIndex]?.focus();
|
|
109
|
+
}
|
|
110
|
+
};
|
|
111
|
+
const handleFocus = (event) => {
|
|
112
|
+
const target = event.target;
|
|
113
|
+
if (!target || !target.hasAttribute("data-toolbar-item"))
|
|
114
|
+
return;
|
|
115
|
+
const items = getItems();
|
|
116
|
+
if (items.length === 0)
|
|
117
|
+
return;
|
|
118
|
+
items.forEach((item) => {
|
|
119
|
+
item.tabIndex = item === target ? 0 : -1;
|
|
120
|
+
});
|
|
121
|
+
};
|
|
122
|
+
return (_jsx(ToolbarContext.Provider, { value: { orientation, size: size ?? "default" }, children: _jsx("div", { ref: setRef, role: "toolbar", "aria-orientation": orientation, "data-slot": "toolbar", "data-orientation": orientation, "data-variant": variant ?? "default", "data-size": size ?? "default", onKeyDown: handleKeyDown, onFocusCapture: handleFocus, className: cn(toolbarVariants({ variant, size }), className), ...props, children: children }) }));
|
|
123
|
+
}
|
|
124
|
+
Toolbar.displayName = "Toolbar";
|
|
125
|
+
export const toolbarItemVariantIds = [
|
|
126
|
+
"default",
|
|
127
|
+
"primary",
|
|
128
|
+
"destructive",
|
|
129
|
+
];
|
|
130
|
+
const toolbarItemSizes = {
|
|
131
|
+
sm: "h-7 min-w-7 px-2 text-xs [&_svg]:size-3.5",
|
|
132
|
+
default: "h-8 min-w-8 px-2.5 text-sm [&_svg]:size-4",
|
|
133
|
+
lg: "h-9 min-w-9 px-3 text-sm [&_svg]:size-4",
|
|
134
|
+
};
|
|
135
|
+
const toolbarItemVariants = cva("inline-flex select-none items-center justify-center gap-1.5 rounded-sm font-medium leading-none whitespace-nowrap outline-none transition-colors focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-1 focus-visible:ring-offset-background disabled:pointer-events-none disabled:opacity-50 data-[disabled=true]:pointer-events-none data-[disabled=true]:opacity-50", {
|
|
136
|
+
variants: {
|
|
137
|
+
variant: {
|
|
138
|
+
default: "text-foreground hover:bg-accent hover:text-accent-foreground data-[pressed=true]:bg-accent data-[pressed=true]:text-accent-foreground data-[active=true]:bg-accent data-[active=true]:text-accent-foreground",
|
|
139
|
+
primary: "text-primary hover:bg-primary/10 data-[pressed=true]:bg-primary data-[pressed=true]:text-primary-foreground data-[active=true]:bg-primary data-[active=true]:text-primary-foreground",
|
|
140
|
+
destructive: "text-destructive hover:bg-destructive/10 data-[pressed=true]:bg-destructive data-[pressed=true]:text-destructive-foreground data-[active=true]:bg-destructive data-[active=true]:text-destructive-foreground",
|
|
141
|
+
},
|
|
142
|
+
},
|
|
143
|
+
defaultVariants: {
|
|
144
|
+
variant: "default",
|
|
145
|
+
},
|
|
146
|
+
});
|
|
147
|
+
function ToolbarButton({ className, variant, active, disabled, type = "button", asChild = false, ref, ...props }) {
|
|
148
|
+
const ctx = useToolbarContext("ToolbarButton");
|
|
149
|
+
const Comp = asChild ? Slot : "button";
|
|
150
|
+
return (_jsx(Comp, { ref: ref, type: type, disabled: disabled, "data-toolbar-item": "", "data-slot": "toolbar-button", "data-active": active ? "true" : undefined, "data-disabled": disabled ? "true" : undefined, tabIndex: -1, className: cn(toolbarItemVariants({ variant }), toolbarItemSizes[ctx.size], className), ...props }));
|
|
151
|
+
}
|
|
152
|
+
ToolbarButton.displayName = "ToolbarButton";
|
|
153
|
+
function ToolbarToggle({ className, variant, pressed = false, onPressedChange, onClick, disabled, type = "button", asChild = false, ref, ...props }) {
|
|
154
|
+
const ctx = useToolbarContext("ToolbarToggle");
|
|
155
|
+
const Comp = asChild ? Slot : "button";
|
|
156
|
+
return (_jsx(Comp, { ref: ref, type: type, disabled: disabled, "aria-pressed": pressed, "data-toolbar-item": "", "data-slot": "toolbar-toggle", "data-state": pressed ? "on" : "off", "data-pressed": pressed ? "true" : "false", "data-disabled": disabled ? "true" : undefined, tabIndex: -1, onClick: (event) => {
|
|
157
|
+
onClick?.(event);
|
|
158
|
+
if (event.defaultPrevented)
|
|
159
|
+
return;
|
|
160
|
+
onPressedChange?.(!pressed);
|
|
161
|
+
}, className: cn(toolbarItemVariants({ variant }), toolbarItemSizes[ctx.size], className), ...props }));
|
|
162
|
+
}
|
|
163
|
+
ToolbarToggle.displayName = "ToolbarToggle";
|
|
164
|
+
function ToolbarLink({ className, variant, children, ref, ...props }) {
|
|
165
|
+
const ctx = useToolbarContext("ToolbarLink");
|
|
166
|
+
return (_jsx("a", { ref: ref, "data-toolbar-item": "", "data-slot": "toolbar-link", tabIndex: -1, className: cn(toolbarItemVariants({ variant }), toolbarItemSizes[ctx.size], "underline-offset-2 hover:underline", className), ...props, children: children }));
|
|
167
|
+
}
|
|
168
|
+
ToolbarLink.displayName = "ToolbarLink";
|
|
169
|
+
function ToolbarSeparator({ className, ref, ...props }) {
|
|
170
|
+
const ctx = useToolbarContext("ToolbarSeparator");
|
|
171
|
+
const separatorOrientation = ctx.orientation === "horizontal" ? "vertical" : "horizontal";
|
|
172
|
+
return (_jsx("div", { ref: ref, role: "separator", "aria-orientation": separatorOrientation, "data-slot": "toolbar-separator", "data-orientation": separatorOrientation, className: cn("shrink-0 bg-border", separatorOrientation === "vertical"
|
|
173
|
+
? "mx-0.5 h-5 w-px"
|
|
174
|
+
: "my-0.5 h-px w-full", className), ...props }));
|
|
175
|
+
}
|
|
176
|
+
ToolbarSeparator.displayName = "ToolbarSeparator";
|
|
177
|
+
function ToolbarGroup({ className, ref, ...props }) {
|
|
178
|
+
const ctx = useToolbarContext("ToolbarGroup");
|
|
179
|
+
return (_jsx("div", { ref: ref, role: "group", "data-slot": "toolbar-group", "data-orientation": ctx.orientation, className: cn("flex items-center gap-0.5", ctx.orientation === "vertical" && "flex-col items-stretch", className), ...props }));
|
|
180
|
+
}
|
|
181
|
+
ToolbarGroup.displayName = "ToolbarGroup";
|
|
182
|
+
function ToolbarSpacer({ className, ref, ...props }) {
|
|
183
|
+
return (_jsx("div", { ref: ref, "aria-hidden": "true", "data-slot": "toolbar-spacer", className: cn("flex-1", className), ...props }));
|
|
184
|
+
}
|
|
185
|
+
ToolbarSpacer.displayName = "ToolbarSpacer";
|
|
186
|
+
export { Toolbar, ToolbarButton, ToolbarToggle, ToolbarLink, ToolbarSeparator, ToolbarGroup, ToolbarSpacer, toolbarVariants, toolbarItemVariants, };
|
|
187
|
+
//# sourceMappingURL=toolbar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"toolbar.js","sourceRoot":"","sources":["../../../../src/components/ui/toolbar/toolbar.tsx"],"names":[],"mappings":"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"}
|