@q9labsai/chalk-ui 4.0.1 → 4.1.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.
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Tracks whether the viewport is narrower than the `md` breakpoint, so layouts
3
+ * can swap a persistent panel for a drawer. Returns `false` until mounted, which
4
+ * keeps the first client render aligned with server-rendered markup.
5
+ */
6
+ export declare function useIsMobile(): boolean;
7
+ //# sourceMappingURL=use-is-mobile.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-is-mobile.d.ts","sourceRoot":"","sources":["../../src/lib/use-is-mobile.ts"],"names":[],"mappings":"AAUA;;;;GAIG;AACH,wBAAgB,WAAW,IAAI,OAAO,CAYrC"}
package/dist/menu.d.ts ADDED
@@ -0,0 +1,16 @@
1
+ import { Menu as MenuPrimitive } from "@base-ui/react/menu";
2
+ import { type VariantProps } from "class-variance-authority";
3
+ declare function Menu(props: MenuPrimitive.Root.Props): import("react/jsx-runtime").JSX.Element;
4
+ declare function MenuTrigger(props: MenuPrimitive.Trigger.Props): import("react/jsx-runtime").JSX.Element;
5
+ declare const menuContentVariants: (props?: ({
6
+ tone?: "default" | "sidebar" | null | undefined;
7
+ } & import("class-variance-authority/types").ClassProp) | undefined) => string;
8
+ type MenuContentProps = MenuPrimitive.Popup.Props & Pick<MenuPrimitive.Positioner.Props, "align" | "alignOffset" | "side" | "sideOffset"> & VariantProps<typeof menuContentVariants>;
9
+ declare function MenuContent({ className, tone, side, sideOffset, align, alignOffset, children, ...props }: MenuContentProps): import("react/jsx-runtime").JSX.Element;
10
+ declare function MenuItem({ className, ...props }: MenuPrimitive.Item.Props): import("react/jsx-runtime").JSX.Element;
11
+ declare function MenuRadioGroup(props: MenuPrimitive.RadioGroup.Props): import("react/jsx-runtime").JSX.Element;
12
+ declare function MenuRadioItem({ className, children, ...props }: MenuPrimitive.RadioItem.Props): import("react/jsx-runtime").JSX.Element;
13
+ declare function MenuGroupLabel({ className, ...props }: MenuPrimitive.GroupLabel.Props): import("react/jsx-runtime").JSX.Element;
14
+ declare function MenuSeparator({ className, ...props }: MenuPrimitive.Separator.Props): import("react/jsx-runtime").JSX.Element;
15
+ export { Menu, MenuContent, MenuGroupLabel, MenuItem, MenuRadioGroup, MenuRadioItem, MenuSeparator, MenuTrigger };
16
+ //# sourceMappingURL=menu.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"menu.d.ts","sourceRoot":"","sources":["../src/menu.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,IAAI,IAAI,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAO,KAAK,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAKlE,iBAAS,IAAI,CAAC,KAAK,EAAE,aAAa,CAAC,IAAI,CAAC,KAAK,2CAE5C;AAED,iBAAS,WAAW,CAAC,KAAK,EAAE,aAAa,CAAC,OAAO,CAAC,KAAK,2CAEtD;AAED,QAAA,MAAM,mBAAmB;;8EAQvB,CAAC;AAEH,KAAK,gBAAgB,GAAG,aAAa,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,aAAa,GAAG,MAAM,GAAG,YAAY,CAAC,GAAG,YAAY,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAErL,iBAAS,WAAW,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,IAAe,EAAE,UAAc,EAAE,KAAe,EAAE,WAAe,EAAE,QAAQ,EAAE,GAAG,KAAK,EAAE,EAAE,gBAAgB,2CAYhJ;AAKD,iBAAS,QAAQ,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,aAAa,CAAC,IAAI,CAAC,KAAK,2CAElE;AAED,iBAAS,cAAc,CAAC,KAAK,EAAE,aAAa,CAAC,UAAU,CAAC,KAAK,2CAE5D;AAED,iBAAS,aAAa,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,KAAK,EAAE,EAAE,aAAa,CAAC,SAAS,CAAC,KAAK,2CAWtF;AAED,iBAAS,cAAc,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,aAAa,CAAC,UAAU,CAAC,KAAK,2CAE9E;AAED,iBAAS,aAAa,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,aAAa,CAAC,SAAS,CAAC,KAAK,2CAE5E;AAED,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,cAAc,EAAE,QAAQ,EAAE,cAAc,EAAE,aAAa,EAAE,aAAa,EAAE,WAAW,EAAE,CAAC"}
package/dist/menu.js ADDED
@@ -0,0 +1,102 @@
1
+ "use client";
2
+
3
+ // src/menu.tsx
4
+ import { Menu as MenuPrimitive } from "@base-ui/react/menu";
5
+ import { cva } from "class-variance-authority";
6
+
7
+ // src/lib/utils.ts
8
+ import { clsx } from "clsx";
9
+ import { twMerge } from "tailwind-merge";
10
+ function cn(...inputs) {
11
+ return twMerge(clsx(inputs));
12
+ }
13
+
14
+ // src/lib/theme.ts
15
+ var THEME_ATTRIBUTE_NAMES = ["data-chalk-theme", "data-theme"];
16
+ var THEME_CLASS_NAMES = ["dark", "light"];
17
+ var SYSTEM_DARK_QUERY = "(prefers-color-scheme: dark)";
18
+ var normalizeTheme = (value) => {
19
+ if (value === "dark" || value === "light") {
20
+ return value;
21
+ }
22
+ return null;
23
+ };
24
+ var resolveThemeFromElement = (element) => {
25
+ if (!element) return null;
26
+ const attributeTheme = THEME_ATTRIBUTE_NAMES.map((attributeName) => normalizeTheme(element.getAttribute(attributeName))).find((theme) => theme !== null);
27
+ const classTheme = THEME_CLASS_NAMES.find((theme) => element.classList.contains(theme));
28
+ return attributeTheme ?? classTheme ?? null;
29
+ };
30
+ var resolveSystemTheme = () => {
31
+ if (typeof window === "undefined" || typeof window.matchMedia !== "function") return null;
32
+ return window.matchMedia(SYSTEM_DARK_QUERY).matches ? "dark" : "light";
33
+ };
34
+ var resolveExplicitThemeFromDocument = () => {
35
+ if (typeof document === "undefined") return null;
36
+ return resolveThemeFromElement(document.documentElement) ?? resolveThemeFromElement(document.body);
37
+ };
38
+ var resolveFallbackTheme = ({ defaultTheme, allowSystem }) => {
39
+ if (!allowSystem) return defaultTheme;
40
+ return resolveSystemTheme() ?? defaultTheme;
41
+ };
42
+ var resolveThemeFromDocument = ({ defaultTheme = "light", allowSystem = true } = {}) => {
43
+ const explicitTheme = resolveExplicitThemeFromDocument();
44
+ return explicitTheme ?? resolveFallbackTheme({ defaultTheme, allowSystem });
45
+ };
46
+ var resolvePortalThemeFromDocument = ({ defaultTheme = "light", allowSystem = true } = {}) => {
47
+ if (typeof document === "undefined") return defaultTheme;
48
+ const portalTheme = normalizeTheme(document.querySelector("[data-chalk-theme]")?.getAttribute("data-chalk-theme"));
49
+ if (portalTheme) return portalTheme;
50
+ return resolveThemeFromDocument({ defaultTheme, allowSystem });
51
+ };
52
+
53
+ // src/menu.tsx
54
+ import { jsx, jsxs } from "react/jsx-runtime";
55
+ function Menu(props) {
56
+ return /* @__PURE__ */ jsx(MenuPrimitive.Root, { "data-slot": "menu", ...props });
57
+ }
58
+ function MenuTrigger(props) {
59
+ return /* @__PURE__ */ jsx(MenuPrimitive.Trigger, { "data-slot": "menu-trigger", ...props });
60
+ }
61
+ var menuContentVariants = cva("z-50 min-w-(--anchor-width) origin-(--transform-origin) overflow-hidden rounded-xl border p-1 outline-none data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95", {
62
+ variants: {
63
+ tone: {
64
+ default: "bg-popover text-popover-foreground border-border shadow-[var(--chalk-shadow-md)]",
65
+ sidebar: "bg-sidebar text-sidebar-foreground border-sidebar-border shadow-[0_18px_50px_rgba(0,0,0,0.45)]"
66
+ }
67
+ },
68
+ defaultVariants: { tone: "default" }
69
+ });
70
+ function MenuContent({ className, tone, side = "bottom", sideOffset = 6, align = "start", alignOffset = 0, children, ...props }) {
71
+ const portalTheme = resolvePortalThemeFromDocument();
72
+ return /* @__PURE__ */ jsx(MenuPrimitive.Portal, { children: /* @__PURE__ */ jsx(MenuPrimitive.Positioner, { className: "z-50", side, sideOffset, align, alignOffset, children: /* @__PURE__ */ jsx(MenuPrimitive.Popup, { "data-chalk": true, "data-chalk-theme": portalTheme, "data-slot": "menu-content", className: cn("chalk-root", menuContentVariants({ tone }), className), ...props, children }) }) });
73
+ }
74
+ var menuItemClassName = "data-highlighted:bg-current/8 relative flex w-full cursor-default items-center gap-2.5 rounded-lg px-2 py-1.5 text-sm outline-none select-none data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:size-4 [&_svg]:shrink-0";
75
+ function MenuItem({ className, ...props }) {
76
+ return /* @__PURE__ */ jsx(MenuPrimitive.Item, { "data-slot": "menu-item", className: cn(menuItemClassName, className), ...props });
77
+ }
78
+ function MenuRadioGroup(props) {
79
+ return /* @__PURE__ */ jsx(MenuPrimitive.RadioGroup, { "data-slot": "menu-radio-group", ...props });
80
+ }
81
+ function MenuRadioItem({ className, children, ...props }) {
82
+ return /* @__PURE__ */ jsxs(MenuPrimitive.RadioItem, { "data-slot": "menu-radio-item", className: cn(menuItemClassName, className), ...props, children: [
83
+ children,
84
+ /* @__PURE__ */ jsx(MenuPrimitive.RadioItemIndicator, { className: "ml-auto flex size-4 shrink-0 items-center justify-center", children: /* @__PURE__ */ jsx("svg", { viewBox: "0 0 24 24", "aria-hidden": "true", fill: "none", stroke: "currentColor", strokeWidth: "2.2", strokeLinecap: "round", strokeLinejoin: "round", children: /* @__PURE__ */ jsx("path", { d: "m5 12.5 4.5 4.5L19 7.5" }) }) })
85
+ ] });
86
+ }
87
+ function MenuGroupLabel({ className, ...props }) {
88
+ return /* @__PURE__ */ jsx(MenuPrimitive.GroupLabel, { "data-slot": "menu-group-label", className: cn("px-2 pt-1.5 pb-1 font-mono text-[10px] tracking-[0.08em] uppercase opacity-60", className), ...props });
89
+ }
90
+ function MenuSeparator({ className, ...props }) {
91
+ return /* @__PURE__ */ jsx(MenuPrimitive.Separator, { "data-slot": "menu-separator", className: cn("bg-current/10 -mx-1 my-1 h-px", className), ...props });
92
+ }
93
+ export {
94
+ Menu,
95
+ MenuContent,
96
+ MenuGroupLabel,
97
+ MenuItem,
98
+ MenuRadioGroup,
99
+ MenuRadioItem,
100
+ MenuSeparator,
101
+ MenuTrigger
102
+ };
@@ -0,0 +1,57 @@
1
+ import * as React from "react";
2
+ import { useRender } from "@base-ui/react/use-render";
3
+ import { type VariantProps } from "class-variance-authority";
4
+ type SidebarState = "expanded" | "collapsed";
5
+ type SidebarSide = "left" | "right";
6
+ type SidebarVariant = "sidebar" | "floating";
7
+ type SidebarCollapsible = "offcanvas" | "icon" | "none";
8
+ interface SidebarContextValue {
9
+ readonly state: SidebarState;
10
+ readonly open: boolean;
11
+ readonly setOpen: (open: boolean) => void;
12
+ readonly openMobile: boolean;
13
+ readonly setOpenMobile: (open: boolean) => void;
14
+ readonly isMobile: boolean;
15
+ readonly toggleSidebar: () => void;
16
+ }
17
+ declare function useSidebar(): SidebarContextValue;
18
+ interface SidebarProviderProps extends React.ComponentPropsWithRef<"div"> {
19
+ /** Initial expanded state when the sidebar is uncontrolled. */
20
+ readonly defaultOpen?: boolean;
21
+ readonly open?: boolean;
22
+ readonly onOpenChange?: (open: boolean) => void;
23
+ }
24
+ declare function SidebarProvider({ defaultOpen, open: openProp, onOpenChange, className, children, ...props }: SidebarProviderProps): import("react/jsx-runtime").JSX.Element;
25
+ interface SidebarProps extends React.ComponentPropsWithRef<"div"> {
26
+ readonly side?: SidebarSide;
27
+ readonly variant?: SidebarVariant;
28
+ readonly collapsible?: SidebarCollapsible;
29
+ /** Accessible name for the mobile drawer. */
30
+ readonly title?: string;
31
+ }
32
+ declare function Sidebar({ side, variant, collapsible, title, className, children, ...props }: SidebarProps): import("react/jsx-runtime").JSX.Element;
33
+ declare function SidebarInset({ className, ...props }: React.ComponentPropsWithRef<"main">): import("react/jsx-runtime").JSX.Element;
34
+ declare function SidebarTrigger({ className, onClick, children, ...props }: React.ComponentPropsWithRef<"button">): import("react/jsx-runtime").JSX.Element;
35
+ /** The hairline hit area on the sidebar's edge; drag-to-toggle affordance. */
36
+ declare function SidebarRail({ className, ...props }: React.ComponentPropsWithRef<"button">): import("react/jsx-runtime").JSX.Element;
37
+ declare function SidebarHeader({ className, ...props }: React.ComponentPropsWithRef<"div">): import("react/jsx-runtime").JSX.Element;
38
+ declare function SidebarContent({ className, ...props }: React.ComponentPropsWithRef<"div">): import("react/jsx-runtime").JSX.Element;
39
+ declare function SidebarFooter({ className, ...props }: React.ComponentPropsWithRef<"div">): import("react/jsx-runtime").JSX.Element;
40
+ declare function SidebarGroup({ className, ...props }: React.ComponentPropsWithRef<"div">): import("react/jsx-runtime").JSX.Element;
41
+ declare function SidebarGroupLabel({ className, ...props }: React.ComponentPropsWithRef<"div">): import("react/jsx-runtime").JSX.Element;
42
+ declare function SidebarMenu({ className, ...props }: React.ComponentPropsWithRef<"ul">): import("react/jsx-runtime").JSX.Element;
43
+ declare function SidebarMenuItem({ className, ...props }: React.ComponentPropsWithRef<"li">): import("react/jsx-runtime").JSX.Element;
44
+ declare const sidebarMenuButtonVariants: (props?: ({
45
+ variant?: "default" | "outline" | "primary" | null | undefined;
46
+ size?: "default" | "lg" | null | undefined;
47
+ } & import("class-variance-authority/types").ClassProp) | undefined) => string;
48
+ interface SidebarMenuButtonProps extends React.ComponentPropsWithRef<"button">, VariantProps<typeof sidebarMenuButtonVariants> {
49
+ readonly isActive?: boolean;
50
+ /** Shown as a tooltip while the sidebar is collapsed to icons. */
51
+ readonly tooltip?: React.ReactNode;
52
+ /** Renders a different element — a router link, for instance — with the button's props. */
53
+ readonly render?: useRender.RenderProp;
54
+ }
55
+ declare function SidebarMenuButton({ render, isActive, variant, size, tooltip, className, ...props }: SidebarMenuButtonProps): import("react/jsx-runtime").JSX.Element;
56
+ export { Sidebar, SidebarContent, SidebarFooter, SidebarGroup, SidebarGroupLabel, SidebarHeader, SidebarInset, SidebarMenu, SidebarMenuButton, SidebarMenuItem, SidebarProvider, SidebarRail, SidebarTrigger, sidebarMenuButtonVariants, useSidebar };
57
+ //# sourceMappingURL=sidebar.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sidebar.d.ts","sourceRoot":"","sources":["../src/sidebar.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,353 @@
1
+ "use client";
2
+
3
+ // src/sidebar.tsx
4
+ import * as React3 from "react";
5
+ import { Drawer } from "@base-ui/react/drawer";
6
+ import { useRender } from "@base-ui/react/use-render";
7
+ import { cva } from "class-variance-authority";
8
+
9
+ // src/lib/utils.ts
10
+ import { clsx } from "clsx";
11
+ import { twMerge } from "tailwind-merge";
12
+ function cn(...inputs) {
13
+ return twMerge(clsx(inputs));
14
+ }
15
+
16
+ // src/lib/use-is-mobile.ts
17
+ import * as React from "react";
18
+ var MOBILE_BREAKPOINT = 768;
19
+ var MOBILE_QUERY = `(max-width: ${MOBILE_BREAKPOINT - 1}px)`;
20
+ function matchMobileQuery() {
21
+ return typeof window.matchMedia === "function" ? window.matchMedia(MOBILE_QUERY) : null;
22
+ }
23
+ function useIsMobile() {
24
+ const subscribe = React.useCallback((onChange) => {
25
+ const query = matchMobileQuery();
26
+ query?.addEventListener("change", onChange);
27
+ return () => query?.removeEventListener("change", onChange);
28
+ }, []);
29
+ return React.useSyncExternalStore(
30
+ subscribe,
31
+ () => matchMobileQuery()?.matches ?? false,
32
+ () => false
33
+ );
34
+ }
35
+
36
+ // src/lib/theme.ts
37
+ var THEME_ATTRIBUTE_NAMES = ["data-chalk-theme", "data-theme"];
38
+ var THEME_CLASS_NAMES = ["dark", "light"];
39
+ var SYSTEM_DARK_QUERY = "(prefers-color-scheme: dark)";
40
+ var normalizeTheme = (value) => {
41
+ if (value === "dark" || value === "light") {
42
+ return value;
43
+ }
44
+ return null;
45
+ };
46
+ var resolveThemeFromElement = (element) => {
47
+ if (!element) return null;
48
+ const attributeTheme = THEME_ATTRIBUTE_NAMES.map((attributeName) => normalizeTheme(element.getAttribute(attributeName))).find((theme) => theme !== null);
49
+ const classTheme = THEME_CLASS_NAMES.find((theme) => element.classList.contains(theme));
50
+ return attributeTheme ?? classTheme ?? null;
51
+ };
52
+ var resolveSystemTheme = () => {
53
+ if (typeof window === "undefined" || typeof window.matchMedia !== "function") return null;
54
+ return window.matchMedia(SYSTEM_DARK_QUERY).matches ? "dark" : "light";
55
+ };
56
+ var resolveExplicitThemeFromDocument = () => {
57
+ if (typeof document === "undefined") return null;
58
+ return resolveThemeFromElement(document.documentElement) ?? resolveThemeFromElement(document.body);
59
+ };
60
+ var resolveFallbackTheme = ({ defaultTheme, allowSystem }) => {
61
+ if (!allowSystem) return defaultTheme;
62
+ return resolveSystemTheme() ?? defaultTheme;
63
+ };
64
+ var resolveThemeFromDocument = ({ defaultTheme = "light", allowSystem = true } = {}) => {
65
+ const explicitTheme = resolveExplicitThemeFromDocument();
66
+ return explicitTheme ?? resolveFallbackTheme({ defaultTheme, allowSystem });
67
+ };
68
+ var resolvePortalThemeFromDocument = ({ defaultTheme = "light", allowSystem = true } = {}) => {
69
+ if (typeof document === "undefined") return defaultTheme;
70
+ const portalTheme = normalizeTheme(document.querySelector("[data-chalk-theme]")?.getAttribute("data-chalk-theme"));
71
+ if (portalTheme) return portalTheme;
72
+ return resolveThemeFromDocument({ defaultTheme, allowSystem });
73
+ };
74
+
75
+ // src/tooltip.tsx
76
+ import "react";
77
+ import { Tooltip as TooltipPrimitive } from "@base-ui/react/tooltip";
78
+ import { jsx, jsxs } from "react/jsx-runtime";
79
+ function TooltipProvider({ delay = 0, ...props }) {
80
+ return /* @__PURE__ */ jsx(TooltipPrimitive.Provider, { "data-slot": "tooltip-provider", delay, ...props });
81
+ }
82
+ function Tooltip({ content, children, position = "top", delay = 200, className, ...props }) {
83
+ if (content !== void 0) {
84
+ return /* @__PURE__ */ jsx(TooltipProvider, { delay, children: /* @__PURE__ */ jsxs(TooltipPrimitive.Root, { children: [
85
+ /* @__PURE__ */ jsx(
86
+ TooltipPrimitive.Trigger,
87
+ {
88
+ render: (triggerProps) => /* @__PURE__ */ jsx("span", { ...triggerProps, className: "inline-flex", children })
89
+ }
90
+ ),
91
+ /* @__PURE__ */ jsx(TooltipContent, { className, side: position, children: content })
92
+ ] }) });
93
+ }
94
+ return /* @__PURE__ */ jsx(TooltipProvider, { children: /* @__PURE__ */ jsx(TooltipPrimitive.Root, { "data-slot": "tooltip", ...props }) });
95
+ }
96
+ function TooltipTrigger({ ...props }) {
97
+ return /* @__PURE__ */ jsx(TooltipPrimitive.Trigger, { "data-slot": "tooltip-trigger", ...props });
98
+ }
99
+ function TooltipContent({ className, side = "top", sideOffset = 4, align = "center", alignOffset = 0, children, ...props }) {
100
+ const portalTheme = resolvePortalThemeFromDocument();
101
+ return /* @__PURE__ */ jsx(TooltipPrimitive.Portal, { children: /* @__PURE__ */ jsx(TooltipPrimitive.Positioner, { align, alignOffset, side, sideOffset, className: "z-[9999]", children: /* @__PURE__ */ jsxs(
102
+ TooltipPrimitive.Popup,
103
+ {
104
+ "data-chalk": true,
105
+ "data-chalk-theme": portalTheme,
106
+ "data-slot": "tooltip-content",
107
+ className: cn(
108
+ "chalk-root",
109
+ "data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-[state=delayed-open]:animate-in data-[state=delayed-open]:fade-in-0 data-[state=delayed-open]:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 rounded-lg px-3 py-1.5 text-xs data-[side=inline-start]:slide-in-from-right-2 data-[side=inline-end]:slide-in-from-left-2 bg-foreground text-background shadow-[var(--chalk-shadow-sm)] z-50 w-fit max-w-xs origin-(--transform-origin)",
110
+ className
111
+ ),
112
+ ...props,
113
+ children: [
114
+ children,
115
+ /* @__PURE__ */ jsx(TooltipPrimitive.Arrow, { className: "size-2.5 translate-y-[calc(-50%_-_2px)] rotate-45 rounded-[2px] data-[side=inline-end]:top-1/2! data-[side=inline-end]:-left-1 data-[side=inline-end]:-translate-y-1/2 data-[side=inline-start]:top-1/2! data-[side=inline-start]:-right-1 data-[side=inline-start]:-translate-y-1/2 bg-foreground fill-foreground z-50 data-[side=bottom]:top-1 data-[side=left]:top-1/2! data-[side=left]:-right-1 data-[side=left]:-translate-y-1/2 data-[side=right]:top-1/2! data-[side=right]:-left-1 data-[side=right]:-translate-y-1/2 data-[side=top]:-bottom-2.5" })
116
+ ]
117
+ }
118
+ ) }) });
119
+ }
120
+
121
+ // src/sidebar.tsx
122
+ import { jsx as jsx2, jsxs as jsxs2 } from "react/jsx-runtime";
123
+ var SIDEBAR_COOKIE_NAME = "chalk_sidebar_state";
124
+ var SIDEBAR_COOKIE_MAX_AGE = 60 * 60 * 24 * 7;
125
+ var SIDEBAR_KEYBOARD_SHORTCUT = "b";
126
+ var SidebarContext = React3.createContext(null);
127
+ function useSidebar() {
128
+ const context = React3.useContext(SidebarContext);
129
+ if (!context) throw new Error("useSidebar must be used inside a SidebarProvider");
130
+ return context;
131
+ }
132
+ function SidebarProvider({ defaultOpen = true, open: openProp, onOpenChange, className, children, ...props }) {
133
+ const isMobile = useIsMobile();
134
+ const [openMobile, setOpenMobile] = React3.useState(false);
135
+ const [uncontrolledOpen, setUncontrolledOpen] = React3.useState(defaultOpen);
136
+ const open = openProp ?? uncontrolledOpen;
137
+ const setOpen = React3.useCallback(
138
+ (value2) => {
139
+ if (onOpenChange) onOpenChange(value2);
140
+ else setUncontrolledOpen(value2);
141
+ document.cookie = `${SIDEBAR_COOKIE_NAME}=${value2}; path=/; max-age=${SIDEBAR_COOKIE_MAX_AGE}; samesite=lax`;
142
+ },
143
+ [onOpenChange]
144
+ );
145
+ const toggleSidebar = React3.useCallback(() => {
146
+ if (isMobile) setOpenMobile(!openMobile);
147
+ else setOpen(!open);
148
+ }, [isMobile, open, openMobile, setOpen]);
149
+ React3.useEffect(() => {
150
+ const toggleOnShortcut = (event) => {
151
+ if (event.key.toLowerCase() !== SIDEBAR_KEYBOARD_SHORTCUT || !(event.metaKey || event.ctrlKey)) return;
152
+ event.preventDefault();
153
+ toggleSidebar();
154
+ };
155
+ window.addEventListener("keydown", toggleOnShortcut);
156
+ return () => window.removeEventListener("keydown", toggleOnShortcut);
157
+ }, [toggleSidebar]);
158
+ const value = React3.useMemo(() => ({ state: open ? "expanded" : "collapsed", open, setOpen, openMobile, setOpenMobile, isMobile, toggleSidebar }), [isMobile, open, openMobile, setOpen, toggleSidebar]);
159
+ return /* @__PURE__ */ jsx2(SidebarContext.Provider, { value, children: /* @__PURE__ */ jsx2("div", { "data-slot": "sidebar-wrapper", className: cn("group/sidebar-wrapper flex min-h-svh w-full", className), ...props, children }) });
160
+ }
161
+ function Sidebar({ side = "left", variant = "sidebar", collapsible = "icon", title = "Navigation", className, children, ...props }) {
162
+ const { isMobile, state, openMobile, setOpenMobile } = useSidebar();
163
+ if (isMobile) {
164
+ const portalTheme = resolvePortalThemeFromDocument();
165
+ return /* @__PURE__ */ jsx2(Drawer.Root, { open: openMobile, onOpenChange: setOpenMobile, swipeDirection: side, children: /* @__PURE__ */ jsxs2(Drawer.Portal, { children: [
166
+ /* @__PURE__ */ jsx2(Drawer.Backdrop, { className: "fixed inset-0 z-50 bg-black/50 transition-opacity duration-200 data-ending-style:opacity-0 data-starting-style:opacity-0" }),
167
+ /* @__PURE__ */ jsx2(Drawer.Viewport, { className: cn("fixed inset-y-0 z-50 flex", side === "left" ? "left-0" : "right-0"), children: /* @__PURE__ */ jsxs2(
168
+ Drawer.Popup,
169
+ {
170
+ "data-chalk": true,
171
+ "data-chalk-theme": portalTheme,
172
+ "data-slot": "sidebar",
173
+ "data-mobile": "true",
174
+ className: cn(
175
+ "chalk-root bg-sidebar text-sidebar-foreground flex h-full w-(--sidebar-width-mobile) flex-col transition-transform duration-300 ease-out",
176
+ side === "left" ? "data-ending-style:-translate-x-full data-starting-style:-translate-x-full" : "data-ending-style:translate-x-full data-starting-style:translate-x-full",
177
+ className
178
+ ),
179
+ children: [
180
+ /* @__PURE__ */ jsx2(Drawer.Title, { className: "sr-only", children: title }),
181
+ children
182
+ ]
183
+ }
184
+ ) })
185
+ ] }) });
186
+ }
187
+ if (collapsible === "none") {
188
+ return /* @__PURE__ */ jsx2("div", { "data-chalk": true, "data-slot": "sidebar", className: cn("bg-sidebar text-sidebar-foreground flex h-full w-(--sidebar-width) flex-col", className), ...props, children });
189
+ }
190
+ return /* @__PURE__ */ jsxs2("div", { "data-chalk": true, "data-slot": "sidebar", "data-state": state, "data-collapsible": state === "collapsed" ? collapsible : "", "data-variant": variant, "data-side": side, className: "group peer text-sidebar-foreground hidden bg-transparent md:block", children: [
191
+ /* @__PURE__ */ jsx2(
192
+ "div",
193
+ {
194
+ className: cn(
195
+ "relative h-svh w-(--sidebar-width) bg-transparent transition-[width] duration-200 ease-linear",
196
+ "group-data-[collapsible=offcanvas]:w-0",
197
+ variant === "floating" ? "group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)+(--spacing(4)))]" : "group-data-[collapsible=icon]:w-(--sidebar-width-icon)"
198
+ )
199
+ }
200
+ ),
201
+ /* @__PURE__ */ jsx2(
202
+ "div",
203
+ {
204
+ className: cn(
205
+ "fixed inset-y-0 z-10 hidden h-svh w-(--sidebar-width) transition-[left,right,width] duration-200 ease-linear md:flex",
206
+ side === "left" ? "left-0 group-data-[collapsible=offcanvas]:left-[calc(var(--sidebar-width)*-1)]" : "right-0 group-data-[collapsible=offcanvas]:right-[calc(var(--sidebar-width)*-1)]",
207
+ variant === "floating" ? "p-2 group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)+(--spacing(4))+2px)]" : "group-data-[collapsible=icon]:w-(--sidebar-width-icon)",
208
+ className
209
+ ),
210
+ ...props,
211
+ children: /* @__PURE__ */ jsx2("div", { "data-sidebar": "sidebar", className: cn("bg-sidebar flex h-full w-full flex-col", variant === "floating" ? "border-sidebar-border rounded-xl border shadow-[var(--chalk-shadow-lg)]" : ""), children })
212
+ }
213
+ )
214
+ ] });
215
+ }
216
+ function SidebarInset({ className, ...props }) {
217
+ return /* @__PURE__ */ jsx2("main", { "data-slot": "sidebar-inset", className: cn("relative flex w-full min-w-0 flex-1 flex-col", className), ...props });
218
+ }
219
+ function SidebarTrigger({ className, onClick, children, ...props }) {
220
+ const { toggleSidebar, isMobile, open } = useSidebar();
221
+ return /* @__PURE__ */ jsx2(
222
+ "button",
223
+ {
224
+ type: "button",
225
+ "data-slot": "sidebar-trigger",
226
+ "aria-label": isMobile || !open ? "Open navigation" : "Collapse navigation",
227
+ "aria-expanded": isMobile ? void 0 : open,
228
+ onClick: (event) => {
229
+ onClick?.(event);
230
+ toggleSidebar();
231
+ },
232
+ className: cn("text-foreground/70 hover:bg-accent hover:text-accent-foreground focus-visible:ring-ring/50 inline-flex size-8 shrink-0 items-center justify-center rounded-lg outline-none transition-colors focus-visible:ring-[3px] [&_svg]:size-4.5", className),
233
+ ...props,
234
+ children: children ?? /* @__PURE__ */ jsx2(PanelLeftIcon, {})
235
+ }
236
+ );
237
+ }
238
+ function SidebarRail({ className, ...props }) {
239
+ const { toggleSidebar } = useSidebar();
240
+ return /* @__PURE__ */ jsx2(
241
+ "button",
242
+ {
243
+ type: "button",
244
+ "data-slot": "sidebar-rail",
245
+ "aria-label": "Toggle navigation",
246
+ tabIndex: -1,
247
+ onClick: toggleSidebar,
248
+ title: "Toggle navigation",
249
+ className: cn(
250
+ "hover:after:bg-sidebar-border absolute inset-y-0 z-20 hidden w-4 -translate-x-1/2 transition-all ease-linear after:absolute after:inset-y-0 after:left-1/2 after:w-[2px] sm:flex",
251
+ "in-data-[side=left]:-right-4 in-data-[side=right]:left-0",
252
+ "in-data-[side=left]:cursor-w-resize in-data-[side=right]:cursor-e-resize",
253
+ "in-data-[collapsible=offcanvas]:hover:bg-sidebar in-data-[collapsible=offcanvas]:translate-x-0 in-data-[collapsible=offcanvas]:after:left-full",
254
+ className
255
+ ),
256
+ ...props
257
+ }
258
+ );
259
+ }
260
+ function SidebarHeader({ className, ...props }) {
261
+ return /* @__PURE__ */ jsx2("div", { "data-slot": "sidebar-header", "data-sidebar": "header", className: cn("flex flex-col gap-2 p-3", className), ...props });
262
+ }
263
+ function SidebarContent({ className, ...props }) {
264
+ return /* @__PURE__ */ jsx2("div", { "data-slot": "sidebar-content", "data-sidebar": "content", className: cn("flex min-h-0 flex-1 flex-col gap-4 overflow-x-hidden overflow-y-auto p-3 group-data-[collapsible=icon]:overflow-hidden", className), ...props });
265
+ }
266
+ function SidebarFooter({ className, ...props }) {
267
+ return /* @__PURE__ */ jsx2("div", { "data-slot": "sidebar-footer", "data-sidebar": "footer", className: cn("border-sidebar-border flex flex-col gap-1 border-t p-3", className), ...props });
268
+ }
269
+ function SidebarGroup({ className, ...props }) {
270
+ return /* @__PURE__ */ jsx2("div", { "data-slot": "sidebar-group", "data-sidebar": "group", className: cn("relative flex w-full min-w-0 flex-col", className), ...props });
271
+ }
272
+ function SidebarGroupLabel({ className, ...props }) {
273
+ return /* @__PURE__ */ jsx2(
274
+ "div",
275
+ {
276
+ "data-slot": "sidebar-group-label",
277
+ "data-sidebar": "group-label",
278
+ className: cn(
279
+ "text-sidebar-foreground/55 flex h-8 shrink-0 items-center rounded-md px-2 font-mono text-[10px] tracking-[0.09em] uppercase transition-[margin,opacity] duration-200 ease-linear",
280
+ "group-data-[collapsible=icon]:pointer-events-none group-data-[collapsible=icon]:-mt-8 group-data-[collapsible=icon]:opacity-0",
281
+ className
282
+ ),
283
+ ...props
284
+ }
285
+ );
286
+ }
287
+ function SidebarMenu({ className, ...props }) {
288
+ return /* @__PURE__ */ jsx2("ul", { "data-slot": "sidebar-menu", "data-sidebar": "menu", className: cn("flex w-full min-w-0 flex-col gap-0.5", className), ...props });
289
+ }
290
+ function SidebarMenuItem({ className, ...props }) {
291
+ return /* @__PURE__ */ jsx2("li", { "data-slot": "sidebar-menu-item", "data-sidebar": "menu-item", className: cn("group/menu-item relative", className), ...props });
292
+ }
293
+ var sidebarMenuButtonVariants = cva(
294
+ "peer/menu-button ring-sidebar-ring flex w-full items-center gap-3 overflow-hidden rounded-lg px-2.5 text-left text-sm font-medium outline-none transition-colors focus-visible:ring-2 disabled:pointer-events-none disabled:opacity-50 aria-disabled:pointer-events-none aria-disabled:opacity-50 group-data-[collapsible=icon]:size-9! group-data-[collapsible=icon]:justify-center group-data-[collapsible=icon]:p-0! [&>span:last-child]:truncate [&>svg]:size-4.5 [&>svg]:shrink-0",
295
+ {
296
+ variants: {
297
+ variant: {
298
+ default: "hover:bg-sidebar-accent/60 hover:text-sidebar-accent-foreground data-[active=true]:bg-sidebar-accent data-[active=true]:text-sidebar-accent-foreground",
299
+ outline: "border-sidebar-border hover:bg-sidebar-accent/60 hover:text-sidebar-accent-foreground border bg-transparent",
300
+ primary: "bg-sidebar-primary text-sidebar-primary-foreground hover:bg-sidebar-primary/90 justify-start"
301
+ },
302
+ size: {
303
+ default: "h-9",
304
+ lg: "h-12 group-data-[collapsible=icon]:p-0!"
305
+ }
306
+ },
307
+ defaultVariants: { variant: "default", size: "default" }
308
+ }
309
+ );
310
+ function SidebarMenuButton({ render, isActive = false, variant, size, tooltip, className, ...props }) {
311
+ const { isMobile, state } = useSidebar();
312
+ const element = useRender({
313
+ render,
314
+ defaultTagName: "button",
315
+ state: {},
316
+ props: {
317
+ type: render ? void 0 : "button",
318
+ "data-slot": "sidebar-menu-button",
319
+ "data-sidebar": "menu-button",
320
+ "data-active": isActive,
321
+ className: cn(sidebarMenuButtonVariants({ variant, size }), className),
322
+ ...props
323
+ }
324
+ });
325
+ if (!tooltip || isMobile || state !== "collapsed") return element;
326
+ return /* @__PURE__ */ jsxs2(Tooltip, { children: [
327
+ /* @__PURE__ */ jsx2(TooltipTrigger, { render: element }),
328
+ /* @__PURE__ */ jsx2(TooltipContent, { side: "right", sideOffset: 10, children: tooltip })
329
+ ] });
330
+ }
331
+ function PanelLeftIcon() {
332
+ return /* @__PURE__ */ jsxs2("svg", { viewBox: "0 0 24 24", "aria-hidden": "true", fill: "none", stroke: "currentColor", strokeWidth: "1.7", strokeLinecap: "round", strokeLinejoin: "round", children: [
333
+ /* @__PURE__ */ jsx2("rect", { x: "3", y: "4", width: "18", height: "16", rx: "2.5" }),
334
+ /* @__PURE__ */ jsx2("path", { d: "M9.5 4v16" })
335
+ ] });
336
+ }
337
+ export {
338
+ Sidebar,
339
+ SidebarContent,
340
+ SidebarFooter,
341
+ SidebarGroup,
342
+ SidebarGroupLabel,
343
+ SidebarHeader,
344
+ SidebarInset,
345
+ SidebarMenu,
346
+ SidebarMenuButton,
347
+ SidebarMenuItem,
348
+ SidebarProvider,
349
+ SidebarRail,
350
+ SidebarTrigger,
351
+ sidebarMenuButtonVariants,
352
+ useSidebar
353
+ };
package/dist/styles.css CHANGED
@@ -33,6 +33,14 @@
33
33
  --color-border: var(--border);
34
34
  --color-input: var(--input);
35
35
  --color-ring: var(--ring);
36
+ --color-sidebar: var(--sidebar);
37
+ --color-sidebar-foreground: var(--sidebar-foreground);
38
+ --color-sidebar-primary: var(--sidebar-primary);
39
+ --color-sidebar-primary-foreground: var(--sidebar-primary-foreground);
40
+ --color-sidebar-accent: var(--sidebar-accent);
41
+ --color-sidebar-accent-foreground: var(--sidebar-accent-foreground);
42
+ --color-sidebar-border: var(--sidebar-border);
43
+ --color-sidebar-ring: var(--sidebar-ring);
36
44
  --radius-sm: calc(var(--radius) - 4px);
37
45
  --radius-md: calc(var(--radius) - 2px);
38
46
  --radius-lg: var(--radius);
@@ -70,6 +78,19 @@
70
78
  --ring: #0f1115;
71
79
  --radius: 0.5rem;
72
80
 
81
+ /* Sidebar: a chalkboard slate that anchors the paper canvas beside it. */
82
+ --sidebar: #171a18;
83
+ --sidebar-foreground: #b9c0ba;
84
+ --sidebar-primary: #f7f6f2;
85
+ --sidebar-primary-foreground: #121512;
86
+ --sidebar-accent: #2b302c;
87
+ --sidebar-accent-foreground: #ffffff;
88
+ --sidebar-border: #2c312d;
89
+ --sidebar-ring: #8fbf87;
90
+ --sidebar-width: 16rem;
91
+ --sidebar-width-icon: 3.25rem;
92
+ --sidebar-width-mobile: 18rem;
93
+
73
94
  --chalk-paper: #ffffff;
74
95
  --chalk-ink: #0f1115;
75
96
  --chalk-ink-2: #4b5563;
@@ -394,6 +415,14 @@
394
415
  --border: #313a3f;
395
416
  --input: #3d484e;
396
417
  --ring: #ffffff;
418
+ --sidebar: #121719;
419
+ --sidebar-foreground: #a4b0b5;
420
+ --sidebar-primary: #dde3e6;
421
+ --sidebar-primary-foreground: #0f1115;
422
+ --sidebar-accent: #232a2e;
423
+ --sidebar-accent-foreground: #ffffff;
424
+ --sidebar-border: #232a2e;
425
+ --sidebar-ring: #8fbf87;
397
426
  --chalk-paper: #1b2023;
398
427
  --chalk-ink: #dde3e6;
399
428
  --chalk-ink-2: #8b979d;