@q9labsai/chalk-ui 4.0.1 → 4.1.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.
package/dist/index.js CHANGED
@@ -34,8 +34,30 @@ __export(index_exports, {
34
34
  EMOJI_KEYWORDS: () => EMOJI_KEYWORDS,
35
35
  IconButton: () => IconButton,
36
36
  Input: () => Input,
37
+ Menu: () => Menu,
38
+ MenuContent: () => MenuContent,
39
+ MenuGroup: () => MenuGroup,
40
+ MenuGroupLabel: () => MenuGroupLabel,
41
+ MenuItem: () => MenuItem,
42
+ MenuRadioGroup: () => MenuRadioGroup,
43
+ MenuRadioItem: () => MenuRadioItem,
44
+ MenuSeparator: () => MenuSeparator,
45
+ MenuTrigger: () => MenuTrigger,
37
46
  ProgressBar: () => ProgressBar,
38
47
  Select: () => Select,
48
+ Sidebar: () => Sidebar,
49
+ SidebarContent: () => SidebarContent,
50
+ SidebarFooter: () => SidebarFooter,
51
+ SidebarGroup: () => SidebarGroup,
52
+ SidebarGroupLabel: () => SidebarGroupLabel,
53
+ SidebarHeader: () => SidebarHeader,
54
+ SidebarInset: () => SidebarInset,
55
+ SidebarMenu: () => SidebarMenu,
56
+ SidebarMenuButton: () => SidebarMenuButton,
57
+ SidebarMenuItem: () => SidebarMenuItem,
58
+ SidebarProvider: () => SidebarProvider,
59
+ SidebarRail: () => SidebarRail,
60
+ SidebarTrigger: () => SidebarTrigger,
39
61
  Skeleton: () => Skeleton,
40
62
  Spinner: () => Spinner,
41
63
  StatusBadge: () => StatusBadge,
@@ -59,9 +81,11 @@ __export(index_exports, {
59
81
  badgeVariants: () => badgeVariants,
60
82
  buttonVariants: () => buttonVariants,
61
83
  cn: () => cn,
84
+ sidebarMenuButtonVariants: () => sidebarMenuButtonVariants,
62
85
  toast: () => toast,
63
86
  toastManager: () => toastManager,
64
87
  toggleVariants: () => toggleVariants,
88
+ useSidebar: () => useSidebar,
65
89
  useToast: () => useToast
66
90
  });
67
91
 
@@ -259,16 +283,128 @@ function Input({ className, type, label, error, icon, iconPosition = "left", siz
259
283
  ] });
260
284
  }
261
285
 
286
+ // src/menu.tsx
287
+ import { Menu as MenuPrimitive } from "@base-ui/react/menu";
288
+ import { cva as cva3 } from "class-variance-authority";
289
+
290
+ // src/lib/use-portal-theme.ts
291
+ import { useSyncExternalStore } from "react";
292
+
293
+ // src/lib/theme.ts
294
+ var THEME_ATTRIBUTE_NAMES = ["data-chalk-theme", "data-theme"];
295
+ var THEME_CLASS_NAMES = ["dark", "light"];
296
+ var SYSTEM_DARK_QUERY = "(prefers-color-scheme: dark)";
297
+ var normalizeTheme = (value) => {
298
+ if (value === "dark" || value === "light") {
299
+ return value;
300
+ }
301
+ return null;
302
+ };
303
+ var resolveThemeFromElement = (element) => {
304
+ if (!element) return null;
305
+ const attributeTheme = THEME_ATTRIBUTE_NAMES.map((attributeName) => normalizeTheme(element.getAttribute(attributeName))).find((theme) => theme !== null);
306
+ const classTheme = THEME_CLASS_NAMES.find((theme) => element.classList.contains(theme));
307
+ return attributeTheme ?? classTheme ?? null;
308
+ };
309
+ var resolveSystemTheme = () => {
310
+ if (typeof window === "undefined" || typeof window.matchMedia !== "function") return null;
311
+ return window.matchMedia(SYSTEM_DARK_QUERY).matches ? "dark" : "light";
312
+ };
313
+ var resolveExplicitThemeFromDocument = () => {
314
+ if (typeof document === "undefined") return null;
315
+ return resolveThemeFromElement(document.documentElement) ?? resolveThemeFromElement(document.body);
316
+ };
317
+ var resolveFallbackTheme = ({ defaultTheme, allowSystem }) => {
318
+ if (!allowSystem) return defaultTheme;
319
+ return resolveSystemTheme() ?? defaultTheme;
320
+ };
321
+ var resolveThemeFromDocument = ({ defaultTheme = "light", allowSystem = true } = {}) => {
322
+ const explicitTheme = resolveExplicitThemeFromDocument();
323
+ return explicitTheme ?? resolveFallbackTheme({ defaultTheme, allowSystem });
324
+ };
325
+ var resolvePortalThemeFromDocument = ({ defaultTheme = "light", allowSystem = true } = {}) => {
326
+ if (typeof document === "undefined") return defaultTheme;
327
+ const portalTheme = normalizeTheme(document.querySelector("[data-chalk-theme]")?.getAttribute("data-chalk-theme"));
328
+ if (portalTheme) return portalTheme;
329
+ return resolveThemeFromDocument({ defaultTheme, allowSystem });
330
+ };
331
+
332
+ // src/lib/use-portal-theme.ts
333
+ var SYSTEM_DARK_QUERY2 = "(prefers-color-scheme: dark)";
334
+ var WATCHED_ATTRIBUTES = ["class", "data-chalk-theme", "data-theme"];
335
+ function subscribe(onChange) {
336
+ if (typeof document === "undefined") return () => {
337
+ };
338
+ const observer = new MutationObserver(onChange);
339
+ const options = { attributes: true, attributeFilter: [...WATCHED_ATTRIBUTES] };
340
+ observer.observe(document.documentElement, options);
341
+ if (document.body) observer.observe(document.body, options);
342
+ const media = typeof window.matchMedia === "function" ? window.matchMedia(SYSTEM_DARK_QUERY2) : null;
343
+ media?.addEventListener("change", onChange);
344
+ return () => {
345
+ observer.disconnect();
346
+ media?.removeEventListener("change", onChange);
347
+ };
348
+ }
349
+ function usePortalTheme(defaultTheme = "light") {
350
+ const read = () => resolvePortalThemeFromDocument({ defaultTheme });
351
+ return useSyncExternalStore(subscribe, read, () => defaultTheme);
352
+ }
353
+
354
+ // src/menu.tsx
355
+ import { jsx as jsx5, jsxs as jsxs3 } from "react/jsx-runtime";
356
+ function Menu(props) {
357
+ return /* @__PURE__ */ jsx5(MenuPrimitive.Root, { "data-slot": "menu", ...props });
358
+ }
359
+ function MenuTrigger(props) {
360
+ return /* @__PURE__ */ jsx5(MenuPrimitive.Trigger, { "data-slot": "menu-trigger", ...props });
361
+ }
362
+ var menuContentVariants = cva3("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", {
363
+ variants: {
364
+ tone: {
365
+ default: "bg-popover text-popover-foreground border-border shadow-[var(--chalk-shadow-md)]",
366
+ sidebar: "bg-sidebar text-sidebar-foreground border-sidebar-border shadow-[0_18px_50px_rgba(0,0,0,0.45)]"
367
+ }
368
+ },
369
+ defaultVariants: { tone: "default" }
370
+ });
371
+ function MenuContent({ className, tone, side = "bottom", sideOffset = 6, align = "start", alignOffset = 0, children, ...props }) {
372
+ const portalTheme = usePortalTheme();
373
+ return /* @__PURE__ */ jsx5(MenuPrimitive.Portal, { children: /* @__PURE__ */ jsx5(MenuPrimitive.Positioner, { className: "z-50", side, sideOffset, align, alignOffset, children: /* @__PURE__ */ jsx5(MenuPrimitive.Popup, { "data-chalk": true, "data-chalk-theme": portalTheme, "data-slot": "menu-content", className: cn("chalk-root", menuContentVariants({ tone }), className), ...props, children }) }) });
374
+ }
375
+ 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";
376
+ function MenuItem({ className, ...props }) {
377
+ return /* @__PURE__ */ jsx5(MenuPrimitive.Item, { "data-slot": "menu-item", className: cn(menuItemClassName, className), ...props });
378
+ }
379
+ function MenuRadioGroup(props) {
380
+ return /* @__PURE__ */ jsx5(MenuPrimitive.RadioGroup, { "data-slot": "menu-radio-group", ...props });
381
+ }
382
+ function MenuRadioItem({ className, children, ...props }) {
383
+ return /* @__PURE__ */ jsxs3(MenuPrimitive.RadioItem, { "data-slot": "menu-radio-item", className: cn(menuItemClassName, className), ...props, children: [
384
+ children,
385
+ /* @__PURE__ */ jsx5(MenuPrimitive.RadioItemIndicator, { className: "ml-auto flex size-4 shrink-0 items-center justify-center", children: /* @__PURE__ */ jsx5("svg", { viewBox: "0 0 24 24", "aria-hidden": "true", fill: "none", stroke: "currentColor", strokeWidth: "2.2", strokeLinecap: "round", strokeLinejoin: "round", children: /* @__PURE__ */ jsx5("path", { d: "m5 12.5 4.5 4.5L19 7.5" }) }) })
386
+ ] });
387
+ }
388
+ function MenuGroup(props) {
389
+ return /* @__PURE__ */ jsx5(MenuPrimitive.Group, { "data-slot": "menu-group", ...props });
390
+ }
391
+ function MenuGroupLabel({ className, ...props }) {
392
+ return /* @__PURE__ */ jsx5(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 });
393
+ }
394
+ function MenuSeparator({ className, ...props }) {
395
+ return /* @__PURE__ */ jsx5(MenuPrimitive.Separator, { "data-slot": "menu-separator", className: cn("bg-current/10 -mx-1 my-1 h-px", className), ...props });
396
+ }
397
+
262
398
  // src/select.tsx
263
399
  import * as React3 from "react";
264
- import { jsx as jsx5, jsxs as jsxs3 } from "react/jsx-runtime";
400
+ import { jsx as jsx6, jsxs as jsxs4 } from "react/jsx-runtime";
265
401
  var Select = React3.forwardRef(function Select2({ options, value, onChange, label, error, size = "md", fullWidth = false, placeholder = "Select\u2026", disabled = false, className, id }, ref) {
266
402
  const generatedId = React3.useId();
267
403
  const selectId = id ?? generatedId;
268
404
  const selectedOption = options.find((option) => option.value === value);
269
- return /* @__PURE__ */ jsxs3("label", { className: cn("flex flex-col gap-1", fullWidth && "w-full"), htmlFor: selectId, children: [
270
- label ? /* @__PURE__ */ jsx5("span", { className: "text-sm font-medium text-muted-foreground", children: label }) : null,
271
- /* @__PURE__ */ jsxs3(
405
+ return /* @__PURE__ */ jsxs4("label", { className: cn("flex flex-col gap-1", fullWidth && "w-full"), htmlFor: selectId, children: [
406
+ label ? /* @__PURE__ */ jsx6("span", { className: "text-sm font-medium text-muted-foreground", children: label }) : null,
407
+ /* @__PURE__ */ jsxs4(
272
408
  "select",
273
409
  {
274
410
  ref,
@@ -287,26 +423,315 @@ var Select = React3.forwardRef(function Select2({ options, value, onChange, labe
287
423
  className
288
424
  ),
289
425
  children: [
290
- /* @__PURE__ */ jsx5("option", { value: "", disabled: options.length > 0, children: placeholder }),
291
- options.map((option) => /* @__PURE__ */ jsx5("option", { value: option.value, disabled: option.disabled, children: option.label }, option.value))
426
+ /* @__PURE__ */ jsx6("option", { value: "", disabled: options.length > 0, children: placeholder }),
427
+ options.map((option) => /* @__PURE__ */ jsx6("option", { value: option.value, disabled: option.disabled, children: option.label }, option.value))
292
428
  ]
293
429
  }
294
430
  ),
295
- error ? /* @__PURE__ */ jsx5("span", { className: "text-sm text-destructive", children: error }) : null
431
+ error ? /* @__PURE__ */ jsx6("span", { className: "text-sm text-destructive", children: error }) : null
296
432
  ] });
297
433
  });
298
434
  Select.displayName = "Select";
299
435
 
300
- // src/textarea.tsx
436
+ // src/sidebar.tsx
437
+ import * as React6 from "react";
438
+ import { Drawer } from "@base-ui/react/drawer";
439
+ import { useRender as useRender2 } from "@base-ui/react/use-render";
440
+ import { cva as cva4 } from "class-variance-authority";
441
+
442
+ // src/lib/use-is-mobile.ts
301
443
  import * as React4 from "react";
302
- import { jsx as jsx6, jsxs as jsxs4 } from "react/jsx-runtime";
303
- var Textarea = React4.forwardRef(function Textarea2({ label, error, showCount = false, resize = "vertical", maxLength, value, className, id, ...props }, ref) {
304
- const generatedId = React4.useId();
444
+ var MOBILE_BREAKPOINT = 768;
445
+ var MOBILE_QUERY = `(max-width: ${MOBILE_BREAKPOINT - 1}px)`;
446
+ function matchMobileQuery() {
447
+ return typeof window.matchMedia === "function" ? window.matchMedia(MOBILE_QUERY) : null;
448
+ }
449
+ function useIsMobile() {
450
+ const subscribe2 = React4.useCallback((onChange) => {
451
+ const query = matchMobileQuery();
452
+ query?.addEventListener("change", onChange);
453
+ return () => query?.removeEventListener("change", onChange);
454
+ }, []);
455
+ return React4.useSyncExternalStore(
456
+ subscribe2,
457
+ () => matchMobileQuery()?.matches ?? false,
458
+ () => false
459
+ );
460
+ }
461
+
462
+ // src/tooltip.tsx
463
+ import "react";
464
+ import { Tooltip as TooltipPrimitive } from "@base-ui/react/tooltip";
465
+ import { jsx as jsx7, jsxs as jsxs5 } from "react/jsx-runtime";
466
+ function TooltipProvider({ delay = 0, ...props }) {
467
+ return /* @__PURE__ */ jsx7(TooltipPrimitive.Provider, { "data-slot": "tooltip-provider", delay, ...props });
468
+ }
469
+ function Tooltip({ content, children, position = "top", delay = 200, className, ...props }) {
470
+ if (content !== void 0) {
471
+ return /* @__PURE__ */ jsx7(TooltipProvider, { delay, children: /* @__PURE__ */ jsxs5(TooltipPrimitive.Root, { children: [
472
+ /* @__PURE__ */ jsx7(
473
+ TooltipPrimitive.Trigger,
474
+ {
475
+ render: (triggerProps) => /* @__PURE__ */ jsx7("span", { ...triggerProps, className: "inline-flex", children })
476
+ }
477
+ ),
478
+ /* @__PURE__ */ jsx7(TooltipContent, { className, side: position, children: content })
479
+ ] }) });
480
+ }
481
+ return /* @__PURE__ */ jsx7(TooltipProvider, { children: /* @__PURE__ */ jsx7(TooltipPrimitive.Root, { "data-slot": "tooltip", ...props }) });
482
+ }
483
+ function TooltipTrigger({ ...props }) {
484
+ return /* @__PURE__ */ jsx7(TooltipPrimitive.Trigger, { "data-slot": "tooltip-trigger", ...props });
485
+ }
486
+ function TooltipContent({ className, side = "top", sideOffset = 4, align = "center", alignOffset = 0, children, ...props }) {
487
+ const portalTheme = usePortalTheme();
488
+ return /* @__PURE__ */ jsx7(TooltipPrimitive.Portal, { children: /* @__PURE__ */ jsx7(TooltipPrimitive.Positioner, { align, alignOffset, side, sideOffset, className: "z-[9999]", children: /* @__PURE__ */ jsxs5(
489
+ TooltipPrimitive.Popup,
490
+ {
491
+ "data-chalk": true,
492
+ "data-chalk-theme": portalTheme,
493
+ "data-slot": "tooltip-content",
494
+ className: cn(
495
+ "chalk-root",
496
+ "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)",
497
+ className
498
+ ),
499
+ ...props,
500
+ children: [
501
+ children,
502
+ /* @__PURE__ */ jsx7(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" })
503
+ ]
504
+ }
505
+ ) }) });
506
+ }
507
+
508
+ // src/sidebar.tsx
509
+ import { jsx as jsx8, jsxs as jsxs6 } from "react/jsx-runtime";
510
+ var SIDEBAR_COOKIE_NAME = "chalk_sidebar_state";
511
+ var SIDEBAR_COOKIE_MAX_AGE = 60 * 60 * 24 * 7;
512
+ var SIDEBAR_KEYBOARD_SHORTCUT = "b";
513
+ var SidebarContext = React6.createContext(null);
514
+ function useSidebar() {
515
+ const context = React6.useContext(SidebarContext);
516
+ if (!context) throw new Error("useSidebar must be used inside a SidebarProvider");
517
+ return context;
518
+ }
519
+ function SidebarProvider({ defaultOpen = true, open: openProp, onOpenChange, className, children, ...props }) {
520
+ const isMobile = useIsMobile();
521
+ const [openMobile, setOpenMobile] = React6.useState(false);
522
+ const [uncontrolledOpen, setUncontrolledOpen] = React6.useState(defaultOpen);
523
+ const open = openProp ?? uncontrolledOpen;
524
+ const setOpen = React6.useCallback(
525
+ (value2) => {
526
+ if (onOpenChange) onOpenChange(value2);
527
+ else setUncontrolledOpen(value2);
528
+ document.cookie = `${SIDEBAR_COOKIE_NAME}=${value2}; path=/; max-age=${SIDEBAR_COOKIE_MAX_AGE}; samesite=lax`;
529
+ },
530
+ [onOpenChange]
531
+ );
532
+ const toggleSidebar = React6.useCallback(() => {
533
+ if (isMobile) setOpenMobile(!openMobile);
534
+ else setOpen(!open);
535
+ }, [isMobile, open, openMobile, setOpen]);
536
+ React6.useEffect(() => {
537
+ const toggleOnShortcut = (event) => {
538
+ if (event.key.toLowerCase() !== SIDEBAR_KEYBOARD_SHORTCUT || !(event.metaKey || event.ctrlKey)) return;
539
+ event.preventDefault();
540
+ toggleSidebar();
541
+ };
542
+ window.addEventListener("keydown", toggleOnShortcut);
543
+ return () => window.removeEventListener("keydown", toggleOnShortcut);
544
+ }, [toggleSidebar]);
545
+ const value = React6.useMemo(() => ({ state: open ? "expanded" : "collapsed", open, setOpen, openMobile, setOpenMobile, isMobile, toggleSidebar }), [isMobile, open, openMobile, setOpen, toggleSidebar]);
546
+ return /* @__PURE__ */ jsx8(SidebarContext.Provider, { value, children: /* @__PURE__ */ jsx8("div", { "data-slot": "sidebar-wrapper", className: cn("group/sidebar-wrapper flex min-h-svh w-full", className), ...props, children }) });
547
+ }
548
+ function Sidebar({ side = "left", variant = "sidebar", collapsible = "icon", title = "Navigation", className, children, ...props }) {
549
+ const { isMobile, state, openMobile, setOpenMobile } = useSidebar();
550
+ const portalTheme = usePortalTheme();
551
+ if (isMobile) {
552
+ return /* @__PURE__ */ jsx8(Drawer.Root, { open: openMobile, onOpenChange: setOpenMobile, swipeDirection: side, children: /* @__PURE__ */ jsxs6(Drawer.Portal, { children: [
553
+ /* @__PURE__ */ jsx8(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" }),
554
+ /* @__PURE__ */ jsx8(Drawer.Viewport, { className: cn("fixed inset-y-0 z-50 flex", side === "left" ? "left-0" : "right-0"), children: /* @__PURE__ */ jsxs6(
555
+ Drawer.Popup,
556
+ {
557
+ "data-chalk": true,
558
+ "data-chalk-theme": portalTheme,
559
+ "data-slot": "sidebar",
560
+ "data-mobile": "true",
561
+ className: cn(
562
+ "chalk-root bg-sidebar text-sidebar-foreground flex h-full w-(--sidebar-width-mobile) flex-col transition-transform duration-300 ease-out",
563
+ 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",
564
+ className
565
+ ),
566
+ children: [
567
+ /* @__PURE__ */ jsx8(Drawer.Title, { className: "sr-only", children: title }),
568
+ children
569
+ ]
570
+ }
571
+ ) })
572
+ ] }) });
573
+ }
574
+ if (collapsible === "none") {
575
+ return /* @__PURE__ */ jsx8("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 });
576
+ }
577
+ return /* @__PURE__ */ jsxs6("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: [
578
+ /* @__PURE__ */ jsx8(
579
+ "div",
580
+ {
581
+ className: cn(
582
+ "relative h-svh w-(--sidebar-width) bg-transparent transition-[width] duration-200 ease-linear",
583
+ "group-data-[collapsible=offcanvas]:w-0",
584
+ variant === "floating" ? "group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)+(--spacing(4)))]" : "group-data-[collapsible=icon]:w-(--sidebar-width-icon)"
585
+ )
586
+ }
587
+ ),
588
+ /* @__PURE__ */ jsx8(
589
+ "div",
590
+ {
591
+ className: cn(
592
+ "fixed inset-y-0 z-10 hidden h-svh w-(--sidebar-width) transition-[left,right,width] duration-200 ease-linear md:flex",
593
+ 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)]",
594
+ 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)",
595
+ className
596
+ ),
597
+ ...props,
598
+ children: /* @__PURE__ */ jsx8("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 })
599
+ }
600
+ )
601
+ ] });
602
+ }
603
+ function SidebarInset({ className, ...props }) {
604
+ return /* @__PURE__ */ jsx8("main", { "data-slot": "sidebar-inset", className: cn("relative flex w-full min-w-0 flex-1 flex-col", className), ...props });
605
+ }
606
+ function SidebarTrigger({ className, onClick, children, ...props }) {
607
+ const { toggleSidebar, isMobile, open } = useSidebar();
608
+ return /* @__PURE__ */ jsx8(
609
+ "button",
610
+ {
611
+ type: "button",
612
+ "data-slot": "sidebar-trigger",
613
+ "aria-label": isMobile || !open ? "Open navigation" : "Collapse navigation",
614
+ "aria-expanded": isMobile ? void 0 : open,
615
+ onClick: (event) => {
616
+ onClick?.(event);
617
+ toggleSidebar();
618
+ },
619
+ 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),
620
+ ...props,
621
+ children: children ?? /* @__PURE__ */ jsx8(PanelLeftIcon, {})
622
+ }
623
+ );
624
+ }
625
+ function SidebarRail({ className, ...props }) {
626
+ const { toggleSidebar } = useSidebar();
627
+ return /* @__PURE__ */ jsx8(
628
+ "button",
629
+ {
630
+ type: "button",
631
+ "data-slot": "sidebar-rail",
632
+ "aria-label": "Toggle navigation",
633
+ tabIndex: -1,
634
+ onClick: toggleSidebar,
635
+ title: "Toggle navigation",
636
+ className: cn(
637
+ "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",
638
+ "in-data-[side=left]:-right-4 in-data-[side=right]:left-0",
639
+ "in-data-[side=left]:cursor-w-resize in-data-[side=right]:cursor-e-resize",
640
+ "in-data-[collapsible=offcanvas]:hover:bg-sidebar in-data-[collapsible=offcanvas]:translate-x-0 in-data-[collapsible=offcanvas]:after:left-full",
641
+ className
642
+ ),
643
+ ...props
644
+ }
645
+ );
646
+ }
647
+ function SidebarHeader({ className, ...props }) {
648
+ return /* @__PURE__ */ jsx8("div", { "data-slot": "sidebar-header", "data-sidebar": "header", className: cn("flex flex-col gap-2 p-3", className), ...props });
649
+ }
650
+ function SidebarContent({ className, ...props }) {
651
+ return /* @__PURE__ */ jsx8("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 });
652
+ }
653
+ function SidebarFooter({ className, ...props }) {
654
+ return /* @__PURE__ */ jsx8("div", { "data-slot": "sidebar-footer", "data-sidebar": "footer", className: cn("border-sidebar-border flex flex-col gap-1 border-t p-3", className), ...props });
655
+ }
656
+ function SidebarGroup({ className, ...props }) {
657
+ return /* @__PURE__ */ jsx8("div", { "data-slot": "sidebar-group", "data-sidebar": "group", className: cn("relative flex w-full min-w-0 flex-col", className), ...props });
658
+ }
659
+ function SidebarGroupLabel({ className, ...props }) {
660
+ return /* @__PURE__ */ jsx8(
661
+ "div",
662
+ {
663
+ "data-slot": "sidebar-group-label",
664
+ "data-sidebar": "group-label",
665
+ className: cn(
666
+ "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",
667
+ "group-data-[collapsible=icon]:pointer-events-none group-data-[collapsible=icon]:-mt-8 group-data-[collapsible=icon]:opacity-0",
668
+ className
669
+ ),
670
+ ...props
671
+ }
672
+ );
673
+ }
674
+ function SidebarMenu({ className, ...props }) {
675
+ return /* @__PURE__ */ jsx8("ul", { "data-slot": "sidebar-menu", "data-sidebar": "menu", className: cn("flex w-full min-w-0 flex-col gap-0.5", className), ...props });
676
+ }
677
+ function SidebarMenuItem({ className, ...props }) {
678
+ return /* @__PURE__ */ jsx8("li", { "data-slot": "sidebar-menu-item", "data-sidebar": "menu-item", className: cn("group/menu-item relative", className), ...props });
679
+ }
680
+ var sidebarMenuButtonVariants = cva4(
681
+ "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",
682
+ {
683
+ variants: {
684
+ variant: {
685
+ default: "hover:bg-sidebar-accent/60 hover:text-sidebar-accent-foreground data-[active=true]:bg-sidebar-accent data-[active=true]:text-sidebar-accent-foreground",
686
+ outline: "border-sidebar-border hover:bg-sidebar-accent/60 hover:text-sidebar-accent-foreground border bg-transparent",
687
+ primary: "bg-sidebar-primary text-sidebar-primary-foreground hover:bg-sidebar-primary/90 justify-start"
688
+ },
689
+ size: {
690
+ default: "h-9",
691
+ lg: "h-12 group-data-[collapsible=icon]:p-0!"
692
+ }
693
+ },
694
+ defaultVariants: { variant: "default", size: "default" }
695
+ }
696
+ );
697
+ function SidebarMenuButton({ render, isActive = false, variant, size, tooltip, className, ...props }) {
698
+ const { isMobile, state } = useSidebar();
699
+ const element = useRender2({
700
+ render,
701
+ defaultTagName: "button",
702
+ state: {},
703
+ props: {
704
+ type: render ? void 0 : "button",
705
+ "data-slot": "sidebar-menu-button",
706
+ "data-sidebar": "menu-button",
707
+ "data-active": isActive,
708
+ className: cn(sidebarMenuButtonVariants({ variant, size }), className),
709
+ ...props
710
+ }
711
+ });
712
+ if (!tooltip || isMobile || state !== "collapsed") return element;
713
+ return /* @__PURE__ */ jsxs6(Tooltip, { children: [
714
+ /* @__PURE__ */ jsx8(TooltipTrigger, { render: element }),
715
+ /* @__PURE__ */ jsx8(TooltipContent, { side: "right", sideOffset: 10, children: tooltip })
716
+ ] });
717
+ }
718
+ function PanelLeftIcon() {
719
+ return /* @__PURE__ */ jsxs6("svg", { viewBox: "0 0 24 24", "aria-hidden": "true", fill: "none", stroke: "currentColor", strokeWidth: "1.7", strokeLinecap: "round", strokeLinejoin: "round", children: [
720
+ /* @__PURE__ */ jsx8("rect", { x: "3", y: "4", width: "18", height: "16", rx: "2.5" }),
721
+ /* @__PURE__ */ jsx8("path", { d: "M9.5 4v16" })
722
+ ] });
723
+ }
724
+
725
+ // src/textarea.tsx
726
+ import * as React7 from "react";
727
+ import { jsx as jsx9, jsxs as jsxs7 } from "react/jsx-runtime";
728
+ var Textarea = React7.forwardRef(function Textarea2({ label, error, showCount = false, resize = "vertical", maxLength, value, className, id, ...props }, ref) {
729
+ const generatedId = React7.useId();
305
730
  const textareaId = id ?? generatedId;
306
731
  const currentLength = typeof value === "string" ? value.length : 0;
307
- return /* @__PURE__ */ jsxs4("label", { className: "flex w-full flex-col gap-1.5", htmlFor: textareaId, children: [
308
- label ? /* @__PURE__ */ jsx6("span", { className: "text-sm font-medium text-muted-foreground", children: label }) : null,
309
- /* @__PURE__ */ jsx6(
732
+ return /* @__PURE__ */ jsxs7("label", { className: "flex w-full flex-col gap-1.5", htmlFor: textareaId, children: [
733
+ label ? /* @__PURE__ */ jsx9("span", { className: "text-sm font-medium text-muted-foreground", children: label }) : null,
734
+ /* @__PURE__ */ jsx9(
310
735
  "textarea",
311
736
  {
312
737
  ref,
@@ -326,9 +751,9 @@ var Textarea = React4.forwardRef(function Textarea2({ label, error, showCount =
326
751
  ...props
327
752
  }
328
753
  ),
329
- error || showCount && maxLength ? /* @__PURE__ */ jsxs4("span", { className: cn("flex justify-between text-xs text-muted-foreground", error && "text-destructive"), children: [
330
- /* @__PURE__ */ jsx6("span", { children: error }),
331
- showCount && maxLength ? /* @__PURE__ */ jsxs4("span", { children: [
754
+ error || showCount && maxLength ? /* @__PURE__ */ jsxs7("span", { className: cn("flex justify-between text-xs text-muted-foreground", error && "text-destructive"), children: [
755
+ /* @__PURE__ */ jsx9("span", { children: error }),
756
+ showCount && maxLength ? /* @__PURE__ */ jsxs7("span", { children: [
332
757
  currentLength,
333
758
  " / ",
334
759
  maxLength
@@ -340,9 +765,9 @@ Textarea.displayName = "Textarea";
340
765
 
341
766
  // src/spinner.tsx
342
767
  import "react";
343
- import { jsx as jsx7 } from "react/jsx-runtime";
768
+ import { jsx as jsx10 } from "react/jsx-runtime";
344
769
  function Spinner({ size = "md", color, className }) {
345
- return /* @__PURE__ */ jsx7(
770
+ return /* @__PURE__ */ jsx10(
346
771
  "span",
347
772
  {
348
773
  className: cn("inline-block animate-spin rounded-full border-2 border-current border-t-transparent text-primary", size === "sm" && "h-4 w-4", size === "md" && "h-6 w-6", size === "lg" && "h-8 w-8", size === "xl" && "h-12 w-12", className),
@@ -355,9 +780,9 @@ function Spinner({ size = "md", color, className }) {
355
780
 
356
781
  // src/skeleton.tsx
357
782
  import "react";
358
- import { jsx as jsx8 } from "react/jsx-runtime";
783
+ import { jsx as jsx11 } from "react/jsx-runtime";
359
784
  function Skeleton({ width, height, variant = "text", animation = "pulse", className }) {
360
- return /* @__PURE__ */ jsx8(
785
+ return /* @__PURE__ */ jsx11(
361
786
  "div",
362
787
  {
363
788
  className: cn("bg-muted", variant === "text" && "rounded-sm", variant === "circular" && "rounded-full", variant === "rounded" && "rounded-md", animation === "pulse" && "animate-pulse", animation === "wave" && "animate-pulse", className),
@@ -368,10 +793,10 @@ function Skeleton({ width, height, variant = "text", animation = "pulse", classN
368
793
  }
369
794
 
370
795
  // src/icon-button.tsx
371
- import * as React7 from "react";
372
- import { jsx as jsx9 } from "react/jsx-runtime";
373
- var IconButton = React7.forwardRef(function IconButton2({ icon, size = "md", variant = "default", className, type = "button", ...props }, ref) {
374
- return /* @__PURE__ */ jsx9(
796
+ import * as React10 from "react";
797
+ import { jsx as jsx12 } from "react/jsx-runtime";
798
+ var IconButton = React10.forwardRef(function IconButton2({ icon, size = "md", variant = "default", className, type = "button", ...props }, ref) {
799
+ return /* @__PURE__ */ jsx12(
375
800
  "button",
376
801
  {
377
802
  ref,
@@ -395,15 +820,15 @@ IconButton.displayName = "IconButton";
395
820
 
396
821
  // src/progress-bar.tsx
397
822
  import "react";
398
- import { jsx as jsx10, jsxs as jsxs5 } from "react/jsx-runtime";
823
+ import { jsx as jsx13, jsxs as jsxs8 } from "react/jsx-runtime";
399
824
  function ProgressBar({ value, max = 100, showLabel = false, variant = "default", size = "md", animated = false, className }) {
400
825
  const percentage = Math.min(100, Math.max(0, value / max * 100));
401
- return /* @__PURE__ */ jsxs5("div", { className: cn("w-full", className), children: [
402
- showLabel ? /* @__PURE__ */ jsx10("div", { className: "mb-1 flex justify-between text-xs text-muted-foreground", children: /* @__PURE__ */ jsxs5("span", { children: [
826
+ return /* @__PURE__ */ jsxs8("div", { className: cn("w-full", className), children: [
827
+ showLabel ? /* @__PURE__ */ jsx13("div", { className: "mb-1 flex justify-between text-xs text-muted-foreground", children: /* @__PURE__ */ jsxs8("span", { children: [
403
828
  Math.round(percentage),
404
829
  "%"
405
830
  ] }) }) : null,
406
- /* @__PURE__ */ jsx10("div", { className: cn("w-full overflow-hidden rounded-full bg-muted", size === "sm" && "h-1", size === "md" && "h-2", size === "lg" && "h-4"), children: /* @__PURE__ */ jsx10(
831
+ /* @__PURE__ */ jsx13("div", { className: cn("w-full overflow-hidden rounded-full bg-muted", size === "sm" && "h-1", size === "md" && "h-2", size === "lg" && "h-4"), children: /* @__PURE__ */ jsx13(
407
832
  "div",
408
833
  {
409
834
  role: "progressbar",
@@ -592,57 +1017,16 @@ var EMOJI_KEYWORDS = {
592
1017
  };
593
1018
 
594
1019
  // src/status-badge.tsx
595
- import * as React9 from "react";
596
- import { jsx as jsx11 } from "react/jsx-runtime";
597
- var StatusBadge = React9.forwardRef(function StatusBadge2({ children, className, label, status = "neutral", ...props }, ref) {
598
- return /* @__PURE__ */ jsx11("span", { ref, "data-slot": "status-badge", "data-status": status, className: cn("chalk-ui-status-badge", className), ...props, children: label ?? children ?? status });
1020
+ import * as React12 from "react";
1021
+ import { jsx as jsx14 } from "react/jsx-runtime";
1022
+ var StatusBadge = React12.forwardRef(function StatusBadge2({ children, className, label, status = "neutral", ...props }, ref) {
1023
+ return /* @__PURE__ */ jsx14("span", { ref, "data-slot": "status-badge", "data-status": status, className: cn("chalk-ui-status-badge", className), ...props, children: label ?? children ?? status });
599
1024
  });
600
1025
 
601
1026
  // src/toast.tsx
602
- import * as React10 from "react";
1027
+ import * as React13 from "react";
603
1028
  import { Toast as ToastPrimitive } from "@base-ui/react/toast";
604
-
605
- // src/lib/theme.ts
606
- var THEME_ATTRIBUTE_NAMES = ["data-chalk-theme", "data-theme"];
607
- var THEME_CLASS_NAMES = ["dark", "light"];
608
- var SYSTEM_DARK_QUERY = "(prefers-color-scheme: dark)";
609
- var normalizeTheme = (value) => {
610
- if (value === "dark" || value === "light") {
611
- return value;
612
- }
613
- return null;
614
- };
615
- var resolveThemeFromElement = (element) => {
616
- if (!element) return null;
617
- const attributeTheme = THEME_ATTRIBUTE_NAMES.map((attributeName) => normalizeTheme(element.getAttribute(attributeName))).find((theme) => theme !== null);
618
- const classTheme = THEME_CLASS_NAMES.find((theme) => element.classList.contains(theme));
619
- return attributeTheme ?? classTheme ?? null;
620
- };
621
- var resolveSystemTheme = () => {
622
- if (typeof window === "undefined" || typeof window.matchMedia !== "function") return null;
623
- return window.matchMedia(SYSTEM_DARK_QUERY).matches ? "dark" : "light";
624
- };
625
- var resolveExplicitThemeFromDocument = () => {
626
- if (typeof document === "undefined") return null;
627
- return resolveThemeFromElement(document.documentElement) ?? resolveThemeFromElement(document.body);
628
- };
629
- var resolveFallbackTheme = ({ defaultTheme, allowSystem }) => {
630
- if (!allowSystem) return defaultTheme;
631
- return resolveSystemTheme() ?? defaultTheme;
632
- };
633
- var resolveThemeFromDocument = ({ defaultTheme = "light", allowSystem = true } = {}) => {
634
- const explicitTheme = resolveExplicitThemeFromDocument();
635
- return explicitTheme ?? resolveFallbackTheme({ defaultTheme, allowSystem });
636
- };
637
- var resolvePortalThemeFromDocument = ({ defaultTheme = "light", allowSystem = true } = {}) => {
638
- if (typeof document === "undefined") return defaultTheme;
639
- const portalTheme = normalizeTheme(document.querySelector("[data-chalk-theme]")?.getAttribute("data-chalk-theme"));
640
- if (portalTheme) return portalTheme;
641
- return resolveThemeFromDocument({ defaultTheme, allowSystem });
642
- };
643
-
644
- // src/toast.tsx
645
- import { jsx as jsx12, jsxs as jsxs6 } from "react/jsx-runtime";
1029
+ import { jsx as jsx15, jsxs as jsxs9 } from "react/jsx-runtime";
646
1030
  var sharedToastManager = ToastPrimitive.createToastManager();
647
1031
  var toastManager = sharedToastManager;
648
1032
  var toast = Object.assign((options) => sharedToastManager.add(options), {
@@ -654,41 +1038,41 @@ var toast = Object.assign((options) => sharedToastManager.add(options), {
654
1038
  warning: (options) => sharedToastManager.add({ ...options, type: "warning" })
655
1039
  });
656
1040
  function ToastProvider({ toastManager: manager = sharedToastManager, ...props }) {
657
- return /* @__PURE__ */ jsx12(ToastPrimitive.Provider, { toastManager: manager, ...props });
1041
+ return /* @__PURE__ */ jsx15(ToastPrimitive.Provider, { toastManager: manager, ...props });
658
1042
  }
659
- var ToastRoot = React10.forwardRef(function ToastRoot2({ className, toast: toastObject, ...props }, ref) {
660
- return /* @__PURE__ */ jsx12(ToastPrimitive.Root, { ref, "data-slot": "toast", "data-type": toastObject.type ?? "neutral", toast: toastObject, className: cn("chalk-ui-toast", className), ...props });
1043
+ var ToastRoot = React13.forwardRef(function ToastRoot2({ className, toast: toastObject, ...props }, ref) {
1044
+ return /* @__PURE__ */ jsx15(ToastPrimitive.Root, { ref, "data-slot": "toast", "data-type": toastObject.type ?? "neutral", toast: toastObject, className: cn("chalk-ui-toast", className), ...props });
661
1045
  });
662
- var ToastContent = React10.forwardRef(function ToastContent2({ className, ...props }, ref) {
663
- return /* @__PURE__ */ jsx12(ToastPrimitive.Content, { ref, "data-slot": "toast-content", className: cn("chalk-ui-toast-content", className), ...props });
1046
+ var ToastContent = React13.forwardRef(function ToastContent2({ className, ...props }, ref) {
1047
+ return /* @__PURE__ */ jsx15(ToastPrimitive.Content, { ref, "data-slot": "toast-content", className: cn("chalk-ui-toast-content", className), ...props });
664
1048
  });
665
- var ToastTitle = React10.forwardRef(function ToastTitle2({ className, ...props }, ref) {
666
- return /* @__PURE__ */ jsx12(ToastPrimitive.Title, { ref, "data-slot": "toast-title", className: cn("chalk-ui-toast-title", className), ...props });
1049
+ var ToastTitle = React13.forwardRef(function ToastTitle2({ className, ...props }, ref) {
1050
+ return /* @__PURE__ */ jsx15(ToastPrimitive.Title, { ref, "data-slot": "toast-title", className: cn("chalk-ui-toast-title", className), ...props });
667
1051
  });
668
- var ToastDescription = React10.forwardRef(function ToastDescription2({ className, ...props }, ref) {
669
- return /* @__PURE__ */ jsx12(ToastPrimitive.Description, { ref, "data-slot": "toast-description", className: cn("chalk-ui-toast-description", className), ...props });
1052
+ var ToastDescription = React13.forwardRef(function ToastDescription2({ className, ...props }, ref) {
1053
+ return /* @__PURE__ */ jsx15(ToastPrimitive.Description, { ref, "data-slot": "toast-description", className: cn("chalk-ui-toast-description", className), ...props });
670
1054
  });
671
- var ToastClose = React10.forwardRef(function ToastClose2({ "aria-label": ariaLabel = "Dismiss notification", children = "\xD7", className, ...props }, ref) {
672
- return /* @__PURE__ */ jsx12(ToastPrimitive.Close, { ref, "aria-label": ariaLabel, "data-slot": "toast-close", className: cn("chalk-ui-toast-close chalk-ui-focusable", className), ...props, children });
1055
+ var ToastClose = React13.forwardRef(function ToastClose2({ "aria-label": ariaLabel = "Dismiss notification", children = "\xD7", className, ...props }, ref) {
1056
+ return /* @__PURE__ */ jsx15(ToastPrimitive.Close, { ref, "aria-label": ariaLabel, "data-slot": "toast-close", className: cn("chalk-ui-toast-close chalk-ui-focusable", className), ...props, children });
673
1057
  });
674
- var ToastAction = React10.forwardRef(function ToastAction2({ className, ...props }, ref) {
675
- return /* @__PURE__ */ jsx12(ToastPrimitive.Action, { ref, "data-slot": "toast-action", className: cn("chalk-ui-focusable", className), ...props });
1058
+ var ToastAction = React13.forwardRef(function ToastAction2({ className, ...props }, ref) {
1059
+ return /* @__PURE__ */ jsx15(ToastPrimitive.Action, { ref, "data-slot": "toast-action", className: cn("chalk-ui-focusable", className), ...props });
676
1060
  });
677
1061
  function ToastViewport({ className, children, ...props }) {
678
1062
  const { toasts } = ToastPrimitive.useToastManager();
679
- const portalTheme = resolvePortalThemeFromDocument();
680
- return /* @__PURE__ */ jsxs6(ToastPrimitive.Viewport, { "data-chalk": true, "data-chalk-theme": portalTheme, "data-slot": "toast-viewport", className: cn("chalk-ui-root chalk-ui-toast-viewport", className), ...props, children: [
1063
+ const portalTheme = usePortalTheme();
1064
+ return /* @__PURE__ */ jsxs9(ToastPrimitive.Viewport, { "data-chalk": true, "data-chalk-theme": portalTheme, "data-slot": "toast-viewport", className: cn("chalk-ui-root chalk-ui-toast-viewport", className), ...props, children: [
681
1065
  children,
682
1066
  toasts.map((toastObject) => {
683
1067
  const actionProps = toastObject.actionProps;
684
1068
  const { children: actionLabel, ...restActionProps } = actionProps ?? {};
685
- return /* @__PURE__ */ jsxs6(ToastPrimitive.Root, { "data-slot": "toast", "data-type": toastObject.type ?? "neutral", toast: toastObject, className: "chalk-ui-toast", children: [
686
- /* @__PURE__ */ jsxs6(ToastPrimitive.Content, { "data-slot": "toast-content", className: "chalk-ui-toast-content", children: [
687
- toastObject.title ? /* @__PURE__ */ jsx12(ToastPrimitive.Title, { "data-slot": "toast-title", className: "chalk-ui-toast-title", children: toastObject.title }) : null,
688
- toastObject.description ? /* @__PURE__ */ jsx12(ToastPrimitive.Description, { "data-slot": "toast-description", className: "chalk-ui-toast-description", children: toastObject.description }) : null,
689
- actionProps ? /* @__PURE__ */ jsx12(ToastPrimitive.Action, { "data-slot": "toast-action", className: "chalk-ui-focusable", ...restActionProps, children: actionLabel ?? "Action" }) : null
1069
+ return /* @__PURE__ */ jsxs9(ToastPrimitive.Root, { "data-slot": "toast", "data-type": toastObject.type ?? "neutral", toast: toastObject, className: "chalk-ui-toast", children: [
1070
+ /* @__PURE__ */ jsxs9(ToastPrimitive.Content, { "data-slot": "toast-content", className: "chalk-ui-toast-content", children: [
1071
+ toastObject.title ? /* @__PURE__ */ jsx15(ToastPrimitive.Title, { "data-slot": "toast-title", className: "chalk-ui-toast-title", children: toastObject.title }) : null,
1072
+ toastObject.description ? /* @__PURE__ */ jsx15(ToastPrimitive.Description, { "data-slot": "toast-description", className: "chalk-ui-toast-description", children: toastObject.description }) : null,
1073
+ actionProps ? /* @__PURE__ */ jsx15(ToastPrimitive.Action, { "data-slot": "toast-action", className: "chalk-ui-focusable", ...restActionProps, children: actionLabel ?? "Action" }) : null
690
1074
  ] }),
691
- /* @__PURE__ */ jsx12(ToastPrimitive.Close, { "aria-label": "Dismiss notification", "data-slot": "toast-close", className: "chalk-ui-toast-close chalk-ui-focusable", children: "\xD7" })
1075
+ /* @__PURE__ */ jsx15(ToastPrimitive.Close, { "aria-label": "Dismiss notification", "data-slot": "toast-close", className: "chalk-ui-toast-close chalk-ui-focusable", children: "\xD7" })
692
1076
  ] }, toastObject.id);
693
1077
  })
694
1078
  ] });
@@ -708,11 +1092,11 @@ var Toast = Object.assign(ToastRoot, {
708
1092
  });
709
1093
 
710
1094
  // src/toggle.tsx
711
- import * as React11 from "react";
1095
+ import * as React14 from "react";
712
1096
  import { Toggle as TogglePrimitive } from "@base-ui/react/toggle";
713
- import { cva as cva3 } from "class-variance-authority";
714
- import { jsx as jsx13, jsxs as jsxs7 } from "react/jsx-runtime";
715
- var toggleVariants = cva3(
1097
+ import { cva as cva5 } from "class-variance-authority";
1098
+ import { jsx as jsx16, jsxs as jsxs10 } from "react/jsx-runtime";
1099
+ var toggleVariants = cva5(
716
1100
  "hover:text-foreground aria-pressed:bg-accent focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive data-[state=on]:bg-accent data-[state=on]:text-accent-foreground gap-1 rounded-lg text-sm font-medium transition-colors [&_svg:not([class*='size-'])]:size-4 group/toggle hover:bg-accent inline-flex items-center justify-center whitespace-nowrap outline-none focus-visible:ring-[3px] disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0",
717
1101
  {
718
1102
  variants: {
@@ -734,22 +1118,22 @@ var toggleVariants = cva3(
734
1118
  );
735
1119
  function Toggle({ className, variant = "default", size = "default", checked, enabled, onChange, label, ariaLabel, ariaLabelledby, pressed, onPressedChange, id, ...props }) {
736
1120
  const resolvedPressed = checked ?? enabled ?? pressed;
737
- const generatedId = React11.useId();
1121
+ const generatedId = React14.useId();
738
1122
  const toggleId = id ?? (label ? `chalk-toggle-${generatedId.replace(/:/g, "")}` : void 0);
739
- const toggle = /* @__PURE__ */ jsx13(TogglePrimitive, { id: toggleId, "data-slot": "toggle", className: cn(toggleVariants({ variant, size, className })), pressed: resolvedPressed, onPressedChange: onPressedChange ?? onChange, "aria-label": ariaLabel, "aria-labelledby": ariaLabelledby, ...props });
740
- return label ? /* @__PURE__ */ jsxs7("span", { className: "inline-flex items-center gap-2", children: [
1123
+ const toggle = /* @__PURE__ */ jsx16(TogglePrimitive, { id: toggleId, "data-slot": "toggle", className: cn(toggleVariants({ variant, size, className })), pressed: resolvedPressed, onPressedChange: onPressedChange ?? onChange, "aria-label": ariaLabel, "aria-labelledby": ariaLabelledby, ...props });
1124
+ return label ? /* @__PURE__ */ jsxs10("span", { className: "inline-flex items-center gap-2", children: [
741
1125
  toggle,
742
- /* @__PURE__ */ jsx13("label", { htmlFor: toggleId, children: label })
1126
+ /* @__PURE__ */ jsx16("label", { htmlFor: toggleId, children: label })
743
1127
  ] }) : toggle;
744
1128
  }
745
1129
 
746
1130
  // src/toggle-group.tsx
747
- import * as React12 from "react";
1131
+ import * as React15 from "react";
748
1132
  import { Toggle as TogglePrimitive2 } from "@base-ui/react/toggle";
749
1133
  import { ToggleGroup as ToggleGroupPrimitive } from "@base-ui/react/toggle-group";
750
1134
  import "class-variance-authority";
751
- import { jsx as jsx14 } from "react/jsx-runtime";
752
- var ToggleGroupContext = React12.createContext({
1135
+ import { jsx as jsx17 } from "react/jsx-runtime";
1136
+ var ToggleGroupContext = React15.createContext({
753
1137
  size: "default",
754
1138
  variant: "default",
755
1139
  spacing: 0,
@@ -764,7 +1148,7 @@ function ToggleGroup({
764
1148
  children,
765
1149
  ...props
766
1150
  }) {
767
- return /* @__PURE__ */ jsx14(
1151
+ return /* @__PURE__ */ jsx17(
768
1152
  ToggleGroupPrimitive,
769
1153
  {
770
1154
  "data-slot": "toggle-group",
@@ -775,15 +1159,15 @@ function ToggleGroup({
775
1159
  style: { "--gap": spacing },
776
1160
  className: cn("rounded-lg data-[size=sm]:rounded-[min(var(--radius-md),10px)] group/toggle-group flex w-fit flex-row items-center gap-[--spacing(var(--gap))] data-[orientation=vertical]:flex-col data-[orientation=vertical]:items-stretch", className),
777
1161
  ...props,
778
- children: /* @__PURE__ */ jsx14(ToggleGroupContext.Provider, { value: { variant, size, spacing, orientation }, children })
1162
+ children: /* @__PURE__ */ jsx17(ToggleGroupContext.Provider, { value: { variant, size, spacing, orientation }, children })
779
1163
  }
780
1164
  );
781
1165
  }
782
1166
  function ToggleGroupItem({ className, children, variant = "default", size = "default", ...props }) {
783
- const context = React12.useContext(ToggleGroupContext);
1167
+ const context = React15.useContext(ToggleGroupContext);
784
1168
  const resolvedVariant = context.variant || variant;
785
1169
  const resolvedSize = context.size || size;
786
- return /* @__PURE__ */ jsx14(
1170
+ return /* @__PURE__ */ jsx17(
787
1171
  TogglePrimitive2,
788
1172
  {
789
1173
  "data-slot": "toggle-group-item",
@@ -803,52 +1187,6 @@ function ToggleGroupItem({ className, children, variant = "default", size = "def
803
1187
  }
804
1188
  );
805
1189
  }
806
-
807
- // src/tooltip.tsx
808
- import "react";
809
- import { Tooltip as TooltipPrimitive } from "@base-ui/react/tooltip";
810
- import { jsx as jsx15, jsxs as jsxs8 } from "react/jsx-runtime";
811
- function TooltipProvider({ delay = 0, ...props }) {
812
- return /* @__PURE__ */ jsx15(TooltipPrimitive.Provider, { "data-slot": "tooltip-provider", delay, ...props });
813
- }
814
- function Tooltip({ content, children, position = "top", delay = 200, className, ...props }) {
815
- if (content !== void 0) {
816
- return /* @__PURE__ */ jsx15(TooltipProvider, { delay, children: /* @__PURE__ */ jsxs8(TooltipPrimitive.Root, { children: [
817
- /* @__PURE__ */ jsx15(
818
- TooltipPrimitive.Trigger,
819
- {
820
- render: (triggerProps) => /* @__PURE__ */ jsx15("span", { ...triggerProps, className: "inline-flex", children })
821
- }
822
- ),
823
- /* @__PURE__ */ jsx15(TooltipContent, { className, side: position, children: content })
824
- ] }) });
825
- }
826
- return /* @__PURE__ */ jsx15(TooltipProvider, { children: /* @__PURE__ */ jsx15(TooltipPrimitive.Root, { "data-slot": "tooltip", ...props }) });
827
- }
828
- function TooltipTrigger({ ...props }) {
829
- return /* @__PURE__ */ jsx15(TooltipPrimitive.Trigger, { "data-slot": "tooltip-trigger", ...props });
830
- }
831
- function TooltipContent({ className, side = "top", sideOffset = 4, align = "center", alignOffset = 0, children, ...props }) {
832
- const portalTheme = resolvePortalThemeFromDocument();
833
- return /* @__PURE__ */ jsx15(TooltipPrimitive.Portal, { children: /* @__PURE__ */ jsx15(TooltipPrimitive.Positioner, { align, alignOffset, side, sideOffset, className: "z-[9999]", children: /* @__PURE__ */ jsxs8(
834
- TooltipPrimitive.Popup,
835
- {
836
- "data-chalk": true,
837
- "data-chalk-theme": portalTheme,
838
- "data-slot": "tooltip-content",
839
- className: cn(
840
- "chalk-root",
841
- "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)",
842
- className
843
- ),
844
- ...props,
845
- children: [
846
- children,
847
- /* @__PURE__ */ jsx15(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" })
848
- ]
849
- }
850
- ) }) });
851
- }
852
1190
  export {
853
1191
  Badge,
854
1192
  Button,
@@ -865,8 +1203,30 @@ export {
865
1203
  EMOJI_KEYWORDS,
866
1204
  IconButton,
867
1205
  Input,
1206
+ Menu,
1207
+ MenuContent,
1208
+ MenuGroup,
1209
+ MenuGroupLabel,
1210
+ MenuItem,
1211
+ MenuRadioGroup,
1212
+ MenuRadioItem,
1213
+ MenuSeparator,
1214
+ MenuTrigger,
868
1215
  ProgressBar,
869
1216
  Select,
1217
+ Sidebar,
1218
+ SidebarContent,
1219
+ SidebarFooter,
1220
+ SidebarGroup,
1221
+ SidebarGroupLabel,
1222
+ SidebarHeader,
1223
+ SidebarInset,
1224
+ SidebarMenu,
1225
+ SidebarMenuButton,
1226
+ SidebarMenuItem,
1227
+ SidebarProvider,
1228
+ SidebarRail,
1229
+ SidebarTrigger,
870
1230
  Skeleton,
871
1231
  Spinner,
872
1232
  StatusBadge,
@@ -890,8 +1250,10 @@ export {
890
1250
  badgeVariants,
891
1251
  buttonVariants,
892
1252
  cn,
1253
+ sidebarMenuButtonVariants,
893
1254
  toast,
894
1255
  toastManager,
895
1256
  toggleVariants,
1257
+ useSidebar,
896
1258
  useToast
897
1259
  };