@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.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +520 -158
- package/dist/lib/use-is-mobile.d.ts +7 -0
- package/dist/lib/use-is-mobile.d.ts.map +1 -0
- package/dist/lib/use-portal-theme.d.ts +3 -0
- package/dist/lib/use-portal-theme.d.ts.map +1 -0
- package/dist/menu.d.ts +18 -0
- package/dist/menu.d.ts.map +1 -0
- package/dist/menu.js +131 -0
- package/dist/sidebar.d.ts +57 -0
- package/dist/sidebar.d.ts.map +1 -0
- package/dist/sidebar.js +378 -0
- package/dist/styles.css +150 -47
- package/dist/toast.js +26 -1
- package/dist/tooltip.js +26 -1
- package/package.json +19 -5
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
|
|
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__ */
|
|
270
|
-
label ? /* @__PURE__ */
|
|
271
|
-
/* @__PURE__ */
|
|
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__ */
|
|
291
|
-
options.map((option) => /* @__PURE__ */
|
|
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__ */
|
|
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/
|
|
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
|
-
|
|
303
|
-
var
|
|
304
|
-
|
|
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__ */
|
|
308
|
-
label ? /* @__PURE__ */
|
|
309
|
-
/* @__PURE__ */
|
|
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__ */
|
|
330
|
-
/* @__PURE__ */
|
|
331
|
-
showCount && maxLength ? /* @__PURE__ */
|
|
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
|
|
768
|
+
import { jsx as jsx10 } from "react/jsx-runtime";
|
|
344
769
|
function Spinner({ size = "md", color, className }) {
|
|
345
|
-
return /* @__PURE__ */
|
|
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
|
|
783
|
+
import { jsx as jsx11 } from "react/jsx-runtime";
|
|
359
784
|
function Skeleton({ width, height, variant = "text", animation = "pulse", className }) {
|
|
360
|
-
return /* @__PURE__ */
|
|
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
|
|
372
|
-
import { jsx as
|
|
373
|
-
var IconButton =
|
|
374
|
-
return /* @__PURE__ */
|
|
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
|
|
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__ */
|
|
402
|
-
showLabel ? /* @__PURE__ */
|
|
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__ */
|
|
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
|
|
596
|
-
import { jsx as
|
|
597
|
-
var StatusBadge =
|
|
598
|
-
return /* @__PURE__ */
|
|
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
|
|
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__ */
|
|
1041
|
+
return /* @__PURE__ */ jsx15(ToastPrimitive.Provider, { toastManager: manager, ...props });
|
|
658
1042
|
}
|
|
659
|
-
var ToastRoot =
|
|
660
|
-
return /* @__PURE__ */
|
|
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 =
|
|
663
|
-
return /* @__PURE__ */
|
|
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 =
|
|
666
|
-
return /* @__PURE__ */
|
|
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 =
|
|
669
|
-
return /* @__PURE__ */
|
|
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 =
|
|
672
|
-
return /* @__PURE__ */
|
|
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 =
|
|
675
|
-
return /* @__PURE__ */
|
|
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 =
|
|
680
|
-
return /* @__PURE__ */
|
|
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__ */
|
|
686
|
-
/* @__PURE__ */
|
|
687
|
-
toastObject.title ? /* @__PURE__ */
|
|
688
|
-
toastObject.description ? /* @__PURE__ */
|
|
689
|
-
actionProps ? /* @__PURE__ */
|
|
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__ */
|
|
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
|
|
1095
|
+
import * as React14 from "react";
|
|
712
1096
|
import { Toggle as TogglePrimitive } from "@base-ui/react/toggle";
|
|
713
|
-
import { cva as
|
|
714
|
-
import { jsx as
|
|
715
|
-
var toggleVariants =
|
|
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 =
|
|
1121
|
+
const generatedId = React14.useId();
|
|
738
1122
|
const toggleId = id ?? (label ? `chalk-toggle-${generatedId.replace(/:/g, "")}` : void 0);
|
|
739
|
-
const toggle = /* @__PURE__ */
|
|
740
|
-
return label ? /* @__PURE__ */
|
|
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__ */
|
|
1126
|
+
/* @__PURE__ */ jsx16("label", { htmlFor: toggleId, children: label })
|
|
743
1127
|
] }) : toggle;
|
|
744
1128
|
}
|
|
745
1129
|
|
|
746
1130
|
// src/toggle-group.tsx
|
|
747
|
-
import * as
|
|
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
|
|
752
|
-
var ToggleGroupContext =
|
|
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__ */
|
|
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__ */
|
|
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 =
|
|
1167
|
+
const context = React15.useContext(ToggleGroupContext);
|
|
784
1168
|
const resolvedVariant = context.variant || variant;
|
|
785
1169
|
const resolvedSize = context.size || size;
|
|
786
|
-
return /* @__PURE__ */
|
|
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
|
};
|