@emara/ui 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/components/ui/.gitkeep +0 -0
- package/components/ui/accordion.stories.tsx +231 -0
- package/components/ui/accordion.tsx +250 -0
- package/components/ui/app-shell.stories.tsx +270 -0
- package/components/ui/app-shell.tsx +491 -0
- package/components/ui/avatar.stories.tsx +174 -0
- package/components/ui/avatar.tsx +257 -0
- package/components/ui/badge.stories.tsx +127 -0
- package/components/ui/badge.tsx +146 -0
- package/components/ui/breadcrumb.stories.tsx +92 -0
- package/components/ui/breadcrumb.tsx +302 -0
- package/components/ui/button.stories.tsx +186 -0
- package/components/ui/button.tsx +128 -0
- package/components/ui/card.stories.tsx +279 -0
- package/components/ui/card.tsx +250 -0
- package/components/ui/checkbox.stories.tsx +93 -0
- package/components/ui/checkbox.tsx +131 -0
- package/components/ui/combobox.stories.tsx +489 -0
- package/components/ui/combobox.tsx +874 -0
- package/components/ui/context-menu.stories.tsx +202 -0
- package/components/ui/context-menu.tsx +309 -0
- package/components/ui/data-table.stories.tsx +227 -0
- package/components/ui/data-table.tsx +539 -0
- package/components/ui/date-picker.stories.tsx +225 -0
- package/components/ui/date-picker.tsx +597 -0
- package/components/ui/dialog.stories.tsx +193 -0
- package/components/ui/dialog.tsx +262 -0
- package/components/ui/divider.stories.tsx +84 -0
- package/components/ui/divider.tsx +135 -0
- package/components/ui/drawer.stories.tsx +218 -0
- package/components/ui/drawer.tsx +329 -0
- package/components/ui/dropdown-menu.stories.tsx +270 -0
- package/components/ui/dropdown-menu.tsx +353 -0
- package/components/ui/empty-state.stories.tsx +121 -0
- package/components/ui/empty-state.tsx +289 -0
- package/components/ui/field-group.stories.tsx +201 -0
- package/components/ui/field-group.tsx +276 -0
- package/components/ui/form.stories.tsx +219 -0
- package/components/ui/form.tsx +542 -0
- package/components/ui/input.stories.tsx +154 -0
- package/components/ui/input.tsx +208 -0
- package/components/ui/label.stories.tsx +84 -0
- package/components/ui/label.tsx +98 -0
- package/components/ui/page-header.stories.tsx +136 -0
- package/components/ui/page-header.tsx +315 -0
- package/components/ui/pagination.stories.tsx +136 -0
- package/components/ui/pagination.tsx +427 -0
- package/components/ui/popover.stories.tsx +212 -0
- package/components/ui/popover.tsx +167 -0
- package/components/ui/radio-group.stories.tsx +96 -0
- package/components/ui/radio-group.tsx +250 -0
- package/components/ui/select.stories.tsx +203 -0
- package/components/ui/select.tsx +318 -0
- package/components/ui/sidebar.stories.tsx +186 -0
- package/components/ui/sidebar.tsx +623 -0
- package/components/ui/skeleton.stories.tsx +131 -0
- package/components/ui/skeleton.tsx +311 -0
- package/components/ui/switch.stories.tsx +74 -0
- package/components/ui/switch.tsx +186 -0
- package/components/ui/table.stories.tsx +107 -0
- package/components/ui/table.tsx +285 -0
- package/components/ui/tabs.stories.tsx +222 -0
- package/components/ui/tabs.tsx +287 -0
- package/components/ui/textarea.stories.tsx +96 -0
- package/components/ui/textarea.tsx +182 -0
- package/components/ui/toast.stories.tsx +169 -0
- package/components/ui/toast.tsx +250 -0
- package/components/ui/tooltip.stories.tsx +146 -0
- package/components/ui/tooltip.tsx +156 -0
- package/components/ui/top-bar.stories.tsx +182 -0
- package/components/ui/top-bar.tsx +155 -0
- package/dist/components/ui/accordion.d.ts +45 -0
- package/dist/components/ui/accordion.d.ts.map +1 -0
- package/dist/components/ui/accordion.js +99 -0
- package/dist/components/ui/accordion.js.map +1 -0
- package/dist/components/ui/app-shell.d.ts +70 -0
- package/dist/components/ui/app-shell.d.ts.map +1 -0
- package/dist/components/ui/app-shell.js +199 -0
- package/dist/components/ui/app-shell.js.map +1 -0
- package/dist/components/ui/avatar.d.ts +41 -0
- package/dist/components/ui/avatar.d.ts.map +1 -0
- package/dist/components/ui/avatar.js +104 -0
- package/dist/components/ui/avatar.js.map +1 -0
- package/dist/components/ui/badge.d.ts +27 -0
- package/dist/components/ui/badge.d.ts.map +1 -0
- package/dist/components/ui/badge.js +65 -0
- package/dist/components/ui/badge.js.map +1 -0
- package/dist/components/ui/breadcrumb.d.ts +35 -0
- package/dist/components/ui/breadcrumb.d.ts.map +1 -0
- package/dist/components/ui/breadcrumb.js +88 -0
- package/dist/components/ui/breadcrumb.js.map +1 -0
- package/dist/components/ui/button.d.ts +26 -0
- package/dist/components/ui/button.d.ts.map +1 -0
- package/dist/components/ui/button.js +73 -0
- package/dist/components/ui/button.js.map +1 -0
- package/dist/components/ui/card.d.ts +52 -0
- package/dist/components/ui/card.d.ts.map +1 -0
- package/dist/components/ui/card.js +96 -0
- package/dist/components/ui/card.js.map +1 -0
- package/dist/components/ui/checkbox.d.ts +18 -0
- package/dist/components/ui/checkbox.d.ts.map +1 -0
- package/dist/components/ui/checkbox.js +59 -0
- package/dist/components/ui/checkbox.js.map +1 -0
- package/dist/components/ui/combobox.d.ts +194 -0
- package/dist/components/ui/combobox.d.ts.map +1 -0
- package/dist/components/ui/combobox.js +361 -0
- package/dist/components/ui/combobox.js.map +1 -0
- package/dist/components/ui/context-menu.d.ts +46 -0
- package/dist/components/ui/context-menu.d.ts.map +1 -0
- package/dist/components/ui/context-menu.js +95 -0
- package/dist/components/ui/context-menu.js.map +1 -0
- package/dist/components/ui/data-table.d.ts +53 -0
- package/dist/components/ui/data-table.d.ts.map +1 -0
- package/dist/components/ui/data-table.js +163 -0
- package/dist/components/ui/data-table.js.map +1 -0
- package/dist/components/ui/date-picker.d.ts +103 -0
- package/dist/components/ui/date-picker.d.ts.map +1 -0
- package/dist/components/ui/date-picker.js +306 -0
- package/dist/components/ui/date-picker.js.map +1 -0
- package/dist/components/ui/dialog.d.ts +40 -0
- package/dist/components/ui/dialog.d.ts.map +1 -0
- package/dist/components/ui/dialog.js +110 -0
- package/dist/components/ui/dialog.js.map +1 -0
- package/dist/components/ui/divider.d.ts +30 -0
- package/dist/components/ui/divider.d.ts.map +1 -0
- package/dist/components/ui/divider.js +62 -0
- package/dist/components/ui/divider.js.map +1 -0
- package/dist/components/ui/drawer.d.ts +56 -0
- package/dist/components/ui/drawer.d.ts.map +1 -0
- package/dist/components/ui/drawer.js +147 -0
- package/dist/components/ui/drawer.js.map +1 -0
- package/dist/components/ui/dropdown-menu.d.ts +63 -0
- package/dist/components/ui/dropdown-menu.d.ts.map +1 -0
- package/dist/components/ui/dropdown-menu.js +116 -0
- package/dist/components/ui/dropdown-menu.js.map +1 -0
- package/dist/components/ui/empty-state.d.ts +43 -0
- package/dist/components/ui/empty-state.d.ts.map +1 -0
- package/dist/components/ui/empty-state.js +128 -0
- package/dist/components/ui/empty-state.js.map +1 -0
- package/dist/components/ui/field-group.d.ts +38 -0
- package/dist/components/ui/field-group.d.ts.map +1 -0
- package/dist/components/ui/field-group.js +107 -0
- package/dist/components/ui/field-group.js.map +1 -0
- package/dist/components/ui/form.d.ts +67 -0
- package/dist/components/ui/form.d.ts.map +1 -0
- package/dist/components/ui/form.js +286 -0
- package/dist/components/ui/form.js.map +1 -0
- package/dist/components/ui/input.d.ts +36 -0
- package/dist/components/ui/input.d.ts.map +1 -0
- package/dist/components/ui/input.js +99 -0
- package/dist/components/ui/input.js.map +1 -0
- package/dist/components/ui/label.d.ts +37 -0
- package/dist/components/ui/label.d.ts.map +1 -0
- package/dist/components/ui/label.js +34 -0
- package/dist/components/ui/label.js.map +1 -0
- package/dist/components/ui/page-header.d.ts +65 -0
- package/dist/components/ui/page-header.d.ts.map +1 -0
- package/dist/components/ui/page-header.js +140 -0
- package/dist/components/ui/page-header.js.map +1 -0
- package/dist/components/ui/pagination.d.ts +67 -0
- package/dist/components/ui/pagination.d.ts.map +1 -0
- package/dist/components/ui/pagination.js +109 -0
- package/dist/components/ui/pagination.js.map +1 -0
- package/dist/components/ui/popover.d.ts +28 -0
- package/dist/components/ui/popover.d.ts.map +1 -0
- package/dist/components/ui/popover.js +85 -0
- package/dist/components/ui/popover.js.map +1 -0
- package/dist/components/ui/radio-group.d.ts +35 -0
- package/dist/components/ui/radio-group.d.ts.map +1 -0
- package/dist/components/ui/radio-group.js +103 -0
- package/dist/components/ui/radio-group.js.map +1 -0
- package/dist/components/ui/select.d.ts +42 -0
- package/dist/components/ui/select.d.ts.map +1 -0
- package/dist/components/ui/select.js +86 -0
- package/dist/components/ui/select.js.map +1 -0
- package/dist/components/ui/sidebar.d.ts +59 -0
- package/dist/components/ui/sidebar.d.ts.map +1 -0
- package/dist/components/ui/sidebar.js +189 -0
- package/dist/components/ui/sidebar.js.map +1 -0
- package/dist/components/ui/skeleton.d.ts +77 -0
- package/dist/components/ui/skeleton.d.ts.map +1 -0
- package/dist/components/ui/skeleton.js +115 -0
- package/dist/components/ui/skeleton.js.map +1 -0
- package/dist/components/ui/switch.d.ts +26 -0
- package/dist/components/ui/switch.d.ts.map +1 -0
- package/dist/components/ui/switch.js +84 -0
- package/dist/components/ui/switch.js.map +1 -0
- package/dist/components/ui/table.d.ts +52 -0
- package/dist/components/ui/table.d.ts.map +1 -0
- package/dist/components/ui/table.js +109 -0
- package/dist/components/ui/table.js.map +1 -0
- package/dist/components/ui/tabs.d.ts +42 -0
- package/dist/components/ui/tabs.d.ts.map +1 -0
- package/dist/components/ui/tabs.js +163 -0
- package/dist/components/ui/tabs.js.map +1 -0
- package/dist/components/ui/textarea.d.ts +26 -0
- package/dist/components/ui/textarea.d.ts.map +1 -0
- package/dist/components/ui/textarea.js +96 -0
- package/dist/components/ui/textarea.js.map +1 -0
- package/dist/components/ui/toast.d.ts +77 -0
- package/dist/components/ui/toast.d.ts.map +1 -0
- package/dist/components/ui/toast.js +141 -0
- package/dist/components/ui/toast.js.map +1 -0
- package/dist/components/ui/tooltip.d.ts +31 -0
- package/dist/components/ui/tooltip.d.ts.map +1 -0
- package/dist/components/ui/tooltip.js +71 -0
- package/dist/components/ui/tooltip.js.map +1 -0
- package/dist/components/ui/top-bar.d.ts +30 -0
- package/dist/components/ui/top-bar.d.ts.map +1 -0
- package/dist/components/ui/top-bar.js +64 -0
- package/dist/components/ui/top-bar.js.map +1 -0
- package/dist/lib/utils.d.ts +3 -0
- package/dist/lib/utils.d.ts.map +1 -0
- package/dist/lib/utils.js +6 -0
- package/dist/lib/utils.js.map +1 -0
- package/lib/utils.ts +6 -0
- package/package.json +112 -0
- package/styles/globals.css +685 -0
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import * as DialogPrimitive from "@radix-ui/react-dialog";
|
|
2
|
+
import { type VariantProps } from "class-variance-authority";
|
|
3
|
+
declare const Drawer: import("react").FC<DialogPrimitive.DialogProps>;
|
|
4
|
+
declare const DrawerTrigger: import("react").ForwardRefExoticComponent<DialogPrimitive.DialogTriggerProps & import("react").RefAttributes<HTMLButtonElement>>;
|
|
5
|
+
declare const DrawerPortal: import("react").FC<DialogPrimitive.DialogPortalProps>;
|
|
6
|
+
declare const DrawerClose: import("react").ForwardRefExoticComponent<DialogPrimitive.DialogCloseProps & import("react").RefAttributes<HTMLButtonElement>>;
|
|
7
|
+
declare const DrawerOverlay: import("react").ForwardRefExoticComponent<Omit<DialogPrimitive.DialogOverlayProps & import("react").RefAttributes<HTMLDivElement>, "ref"> & import("react").RefAttributes<HTMLDivElement>>;
|
|
8
|
+
type DrawerPosition = "start" | "end" | "top" | "bottom";
|
|
9
|
+
declare const drawerContentVariants: (props?: ({
|
|
10
|
+
position?: "start" | "end" | "bottom" | "top" | null | undefined;
|
|
11
|
+
size?: "sm" | "md" | "lg" | "xs" | "xl" | "full" | null | undefined;
|
|
12
|
+
} & import("class-variance-authority/types").ClassProp) | undefined) => string;
|
|
13
|
+
type DrawerContentVariants = VariantProps<typeof drawerContentVariants>;
|
|
14
|
+
type DrawerContentProps = React.ComponentPropsWithoutRef<typeof DialogPrimitive.Content> & DrawerContentVariants & {
|
|
15
|
+
closeOnOverlayClick?: boolean;
|
|
16
|
+
closeOnEscape?: boolean;
|
|
17
|
+
confirmBeforeClose?: boolean | (() => boolean | Promise<boolean>);
|
|
18
|
+
loading?: boolean;
|
|
19
|
+
scrollable?: boolean;
|
|
20
|
+
hideCloseButton?: boolean;
|
|
21
|
+
/**
|
|
22
|
+
* When `false`, the drawer can only be closed programmatically:
|
|
23
|
+
* - hides the close X
|
|
24
|
+
* - blocks overlay click
|
|
25
|
+
* - blocks Escape
|
|
26
|
+
*/
|
|
27
|
+
dismissible?: boolean;
|
|
28
|
+
};
|
|
29
|
+
declare const DrawerContent: import("react").ForwardRefExoticComponent<Omit<DialogPrimitive.DialogContentProps & import("react").RefAttributes<HTMLDivElement>, "ref"> & DrawerContentVariants & {
|
|
30
|
+
closeOnOverlayClick?: boolean;
|
|
31
|
+
closeOnEscape?: boolean;
|
|
32
|
+
confirmBeforeClose?: boolean | (() => boolean | Promise<boolean>);
|
|
33
|
+
loading?: boolean;
|
|
34
|
+
scrollable?: boolean;
|
|
35
|
+
hideCloseButton?: boolean;
|
|
36
|
+
/**
|
|
37
|
+
* When `false`, the drawer can only be closed programmatically:
|
|
38
|
+
* - hides the close X
|
|
39
|
+
* - blocks overlay click
|
|
40
|
+
* - blocks Escape
|
|
41
|
+
*/
|
|
42
|
+
dismissible?: boolean;
|
|
43
|
+
} & import("react").RefAttributes<HTMLDivElement>>;
|
|
44
|
+
declare const DrawerHeader: import("react").ForwardRefExoticComponent<import("react").HTMLAttributes<HTMLDivElement> & import("react").RefAttributes<HTMLDivElement>>;
|
|
45
|
+
declare const DrawerTitle: import("react").ForwardRefExoticComponent<Omit<DialogPrimitive.DialogTitleProps & import("react").RefAttributes<HTMLHeadingElement>, "ref"> & import("react").RefAttributes<HTMLHeadingElement>>;
|
|
46
|
+
declare const DrawerDescription: import("react").ForwardRefExoticComponent<Omit<DialogPrimitive.DialogDescriptionProps & import("react").RefAttributes<HTMLParagraphElement>, "ref"> & import("react").RefAttributes<HTMLParagraphElement>>;
|
|
47
|
+
/**
|
|
48
|
+
* Scroll region between header and footer. Always flex-1; overflow behavior
|
|
49
|
+
* follows DrawerContent's `scrollable` flag (default true) — when false, the
|
|
50
|
+
* body sizes to its content and DrawerContent's own height controls overflow.
|
|
51
|
+
*/
|
|
52
|
+
declare const DrawerBody: import("react").ForwardRefExoticComponent<import("react").HTMLAttributes<HTMLDivElement> & import("react").RefAttributes<HTMLDivElement>>;
|
|
53
|
+
declare const DrawerFooter: import("react").ForwardRefExoticComponent<import("react").HTMLAttributes<HTMLDivElement> & import("react").RefAttributes<HTMLDivElement>>;
|
|
54
|
+
export { Drawer, DrawerTrigger, DrawerPortal, DrawerOverlay, DrawerContent, DrawerHeader, DrawerTitle, DrawerDescription, DrawerBody, DrawerFooter, DrawerClose, drawerContentVariants, };
|
|
55
|
+
export type { DrawerContentProps, DrawerPosition };
|
|
56
|
+
//# sourceMappingURL=drawer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"drawer.d.ts","sourceRoot":"","sources":["../../../components/ui/drawer.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,eAAe,MAAM,wBAAwB,CAAC;AAE1D,OAAO,EAAO,KAAK,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAelE,QAAA,MAAM,MAAM,iDAAuB,CAAC;AACpC,QAAA,MAAM,aAAa,kIAA0B,CAAC;AAC9C,QAAA,MAAM,YAAY,uDAAyB,CAAC;AAC5C,QAAA,MAAM,WAAW,gIAAwB,CAAC;AAM1C,QAAA,MAAM,aAAa,4LAgBjB,CAAC;AAOH,KAAK,cAAc,GAAG,OAAO,GAAG,KAAK,GAAG,KAAK,GAAG,QAAQ,CAAC;AAEzD,QAAA,MAAM,qBAAqB;;;8EAiE1B,CAAC;AAEF,KAAK,qBAAqB,GAAG,YAAY,CAAC,OAAO,qBAAqB,CAAC,CAAC;AAExE,KAAK,kBAAkB,GAAG,KAAK,CAAC,wBAAwB,CAAC,OAAO,eAAe,CAAC,OAAO,CAAC,GACtF,qBAAqB,GAAG;IACtB,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,kBAAkB,CAAC,EAAE,OAAO,GAAG,CAAC,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;IAClE,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B;;;;;OAKG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB,CAAC;AAEJ,QAAA,MAAM,aAAa;0BAfO,OAAO;oBACb,OAAO;yBACF,OAAO,GAAG,CAAC,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;cACvD,OAAO;iBACJ,OAAO;sBACF,OAAO;IACzB;;;;;OAKG;kBACW,OAAO;kDAkGvB,CAAC;AAOH,QAAA,MAAM,YAAY,2IAMjB,CAAC;AAGF,QAAA,MAAM,WAAW,kMAWf,CAAC;AAGH,QAAA,MAAM,iBAAiB,4MAWrB,CAAC;AAGH;;;;GAIG;AACH,QAAA,MAAM,UAAU,2IAWf,CAAC;AAGF,QAAA,MAAM,YAAY,2IAajB,CAAC;AAGF,OAAO,EACL,MAAM,EACN,aAAa,EACb,YAAY,EACZ,aAAa,EACb,aAAa,EACb,YAAY,EACZ,WAAW,EACX,iBAAiB,EACjB,UAAU,EACV,YAAY,EACZ,WAAW,EACX,qBAAqB,GACtB,CAAC;AACF,YAAY,EAAE,kBAAkB,EAAE,cAAc,EAAE,CAAC"}
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { createContext, forwardRef, useContext, useMemo } from "react";
|
|
4
|
+
import * as DialogPrimitive from "@radix-ui/react-dialog";
|
|
5
|
+
import { RiCloseLine } from "@remixicon/react";
|
|
6
|
+
import { cva } from "class-variance-authority";
|
|
7
|
+
import { cn } from "@/lib/utils";
|
|
8
|
+
import { Skeleton } from "./skeleton";
|
|
9
|
+
const DrawerContext = createContext({ scrollable: true });
|
|
10
|
+
const useDrawerContext = () => useContext(DrawerContext);
|
|
11
|
+
// Per docs/emara-ui-phase-3-components.md §2. Built on Radix Dialog (not Vaul)
|
|
12
|
+
// so the slide animation, focus trap, and Esc handling stay consistent with
|
|
13
|
+
// the rest of the system.
|
|
14
|
+
const Drawer = DialogPrimitive.Root;
|
|
15
|
+
const DrawerTrigger = DialogPrimitive.Trigger;
|
|
16
|
+
const DrawerPortal = DialogPrimitive.Portal;
|
|
17
|
+
const DrawerClose = DialogPrimitive.Close;
|
|
18
|
+
// ----------------------------------------------------------------------------
|
|
19
|
+
// DrawerOverlay — same as Dialog's overlay.
|
|
20
|
+
// ----------------------------------------------------------------------------
|
|
21
|
+
const DrawerOverlay = forwardRef(function DrawerOverlay({ className, ...props }, ref) {
|
|
22
|
+
return (_jsx(DialogPrimitive.Overlay, { ref: ref, className: cn("z-modal bg-foreground/50 fixed inset-0", "data-[state=open]:animate-[fade-in_var(--duration-normal)_var(--ease-out)]", "data-[state=closed]:animate-[fade-out_var(--duration-fast)_var(--ease-in)]", className), ...props }));
|
|
23
|
+
});
|
|
24
|
+
DrawerOverlay.displayName = "DrawerOverlay";
|
|
25
|
+
const drawerContentVariants = cva(["fixed z-modal flex flex-col bg-card text-card-foreground shadow-xl", "border-border"].join(" "), {
|
|
26
|
+
variants: {
|
|
27
|
+
position: {
|
|
28
|
+
// Logical sides — `start-0` is left in LTR, right in RTL.
|
|
29
|
+
start: "inset-y-0 start-0 h-full border-e " +
|
|
30
|
+
"data-[state=open]:animate-[slide-in-from-start_var(--duration-normal)_var(--ease-out)] " +
|
|
31
|
+
"data-[state=closed]:animate-[slide-in-from-start_var(--duration-fast)_var(--ease-in)_reverse]",
|
|
32
|
+
end: "inset-y-0 end-0 h-full border-s " +
|
|
33
|
+
"data-[state=open]:animate-[slide-in-from-end_var(--duration-normal)_var(--ease-out)] " +
|
|
34
|
+
"data-[state=closed]:animate-[slide-in-from-end_var(--duration-fast)_var(--ease-in)_reverse]",
|
|
35
|
+
top: "inset-x-0 top-0 w-full border-b " +
|
|
36
|
+
"data-[state=open]:animate-[slide-in-from-top_var(--duration-normal)_var(--ease-out)] " +
|
|
37
|
+
"data-[state=closed]:animate-[slide-in-from-top_var(--duration-fast)_var(--ease-in)_reverse]",
|
|
38
|
+
bottom: "inset-x-0 bottom-0 w-full border-t " +
|
|
39
|
+
"data-[state=open]:animate-[slide-in-from-bottom_var(--duration-normal)_var(--ease-out)] " +
|
|
40
|
+
"data-[state=closed]:animate-[slide-in-from-bottom_var(--duration-fast)_var(--ease-in)_reverse]",
|
|
41
|
+
},
|
|
42
|
+
size: {
|
|
43
|
+
xs: "",
|
|
44
|
+
sm: "",
|
|
45
|
+
md: "",
|
|
46
|
+
lg: "",
|
|
47
|
+
xl: "",
|
|
48
|
+
full: "",
|
|
49
|
+
},
|
|
50
|
+
},
|
|
51
|
+
compoundVariants: [
|
|
52
|
+
// Horizontal (start/end) — width scale (tokens in design-tokens §11b)
|
|
53
|
+
{ position: "start", size: "xs", class: "w-drawer-xs" },
|
|
54
|
+
{ position: "start", size: "sm", class: "w-drawer-sm" },
|
|
55
|
+
{ position: "start", size: "md", class: "w-drawer-md" },
|
|
56
|
+
{ position: "start", size: "lg", class: "w-drawer-lg" },
|
|
57
|
+
{ position: "start", size: "xl", class: "w-drawer-xl" },
|
|
58
|
+
{ position: "start", size: "full", class: "w-screen" },
|
|
59
|
+
{ position: "end", size: "xs", class: "w-drawer-xs" },
|
|
60
|
+
{ position: "end", size: "sm", class: "w-drawer-sm" },
|
|
61
|
+
{ position: "end", size: "md", class: "w-drawer-md" },
|
|
62
|
+
{ position: "end", size: "lg", class: "w-drawer-lg" },
|
|
63
|
+
{ position: "end", size: "xl", class: "w-drawer-xl" },
|
|
64
|
+
{ position: "end", size: "full", class: "w-screen" },
|
|
65
|
+
// Vertical (top/bottom) — height scale
|
|
66
|
+
{ position: "top", size: "xs", class: "h-drawer-xs" },
|
|
67
|
+
{ position: "top", size: "sm", class: "h-drawer-sm" },
|
|
68
|
+
{ position: "top", size: "md", class: "h-drawer-md" },
|
|
69
|
+
{ position: "top", size: "lg", class: "h-drawer-lg" },
|
|
70
|
+
{ position: "top", size: "xl", class: "h-drawer-xl" },
|
|
71
|
+
{ position: "top", size: "full", class: "h-screen" },
|
|
72
|
+
{ position: "bottom", size: "xs", class: "h-drawer-xs" },
|
|
73
|
+
{ position: "bottom", size: "sm", class: "h-drawer-sm" },
|
|
74
|
+
{ position: "bottom", size: "md", class: "h-drawer-md" },
|
|
75
|
+
{ position: "bottom", size: "lg", class: "h-drawer-lg" },
|
|
76
|
+
{ position: "bottom", size: "xl", class: "h-drawer-xl" },
|
|
77
|
+
{ position: "bottom", size: "full", class: "h-screen" },
|
|
78
|
+
],
|
|
79
|
+
defaultVariants: {
|
|
80
|
+
position: "end",
|
|
81
|
+
size: "md",
|
|
82
|
+
},
|
|
83
|
+
});
|
|
84
|
+
const DrawerContent = forwardRef(function DrawerContent({ className, position, size, closeOnOverlayClick = true, closeOnEscape = true, confirmBeforeClose, loading = false, scrollable = true, hideCloseButton = false, dismissible = true, onPointerDownOutside, onEscapeKeyDown, onInteractOutside, children, ...props }, ref) {
|
|
85
|
+
const guardedClose = async (e) => {
|
|
86
|
+
if (!confirmBeforeClose)
|
|
87
|
+
return;
|
|
88
|
+
if (typeof confirmBeforeClose === "function") {
|
|
89
|
+
const ok = await confirmBeforeClose();
|
|
90
|
+
if (!ok)
|
|
91
|
+
e.preventDefault();
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
const ok = window.confirm("Discard unsaved changes?");
|
|
95
|
+
if (!ok)
|
|
96
|
+
e.preventDefault();
|
|
97
|
+
};
|
|
98
|
+
const allowOverlayClose = dismissible && closeOnOverlayClick;
|
|
99
|
+
const allowEscape = dismissible && closeOnEscape;
|
|
100
|
+
const drawerCtx = useMemo(() => ({ scrollable }), [scrollable]);
|
|
101
|
+
return (_jsx(DrawerContext.Provider, { value: drawerCtx, children: _jsxs(DrawerPortal, { children: [_jsx(DrawerOverlay, {}), _jsxs(DialogPrimitive.Content, { ref: ref, onPointerDownOutside: (e) => {
|
|
102
|
+
if (!allowOverlayClose)
|
|
103
|
+
e.preventDefault();
|
|
104
|
+
onPointerDownOutside?.(e);
|
|
105
|
+
}, onEscapeKeyDown: (e) => {
|
|
106
|
+
if (!allowEscape)
|
|
107
|
+
e.preventDefault();
|
|
108
|
+
onEscapeKeyDown?.(e);
|
|
109
|
+
}, onInteractOutside: async (e) => {
|
|
110
|
+
if (confirmBeforeClose && allowOverlayClose) {
|
|
111
|
+
await guardedClose(e);
|
|
112
|
+
}
|
|
113
|
+
onInteractOutside?.(e);
|
|
114
|
+
}, className: cn(drawerContentVariants({ position, size }), className), ...props, children: [loading ? (_jsxs("div", { className: "space-y-3 p-6", "aria-busy": "true", "aria-live": "polite", children: [_jsx(Skeleton, { className: "h-6 w-2/5" }), _jsx(Skeleton, { className: "h-4 w-3/5" }), _jsx(Skeleton, { className: "h-4 w-full" }), _jsx(Skeleton, { className: "h-4 w-10/12" }), _jsx(Skeleton, { className: "h-4 w-4/5" })] })) : (children), dismissible && !hideCloseButton && !loading ? (_jsx(DialogPrimitive.Close, { "aria-label": "Close", className: cn("absolute end-3 top-3 inline-flex size-7 items-center justify-center rounded-md", "text-muted-foreground hover:bg-accent hover:text-accent-foreground", "focus-visible:ring-ring focus-visible:ring-offset-background focus-visible:ring-2 focus-visible:ring-offset-2 focus-visible:outline-none", "[&_svg]:size-4 [&_svg]:shrink-0"), children: _jsx(RiCloseLine, {}) })) : null] })] }) }));
|
|
115
|
+
});
|
|
116
|
+
DrawerContent.displayName = "DrawerContent";
|
|
117
|
+
// ----------------------------------------------------------------------------
|
|
118
|
+
// DrawerHeader / Title / Description / Body / Footer
|
|
119
|
+
// ----------------------------------------------------------------------------
|
|
120
|
+
const DrawerHeader = forwardRef(function DrawerHeader({ className, ...props }, ref) {
|
|
121
|
+
return (_jsx("div", { ref: ref, className: cn("space-y-1.5 p-6 pe-12 text-start", className), ...props }));
|
|
122
|
+
});
|
|
123
|
+
DrawerHeader.displayName = "DrawerHeader";
|
|
124
|
+
const DrawerTitle = forwardRef(function DrawerTitle({ className, ...props }, ref) {
|
|
125
|
+
return (_jsx(DialogPrimitive.Title, { ref: ref, className: cn("text-lg leading-snug font-semibold tracking-tight", className), ...props }));
|
|
126
|
+
});
|
|
127
|
+
DrawerTitle.displayName = "DrawerTitle";
|
|
128
|
+
const DrawerDescription = forwardRef(function DrawerDescription({ className, ...props }, ref) {
|
|
129
|
+
return (_jsx(DialogPrimitive.Description, { ref: ref, className: cn("text-muted-foreground text-sm", className), ...props }));
|
|
130
|
+
});
|
|
131
|
+
DrawerDescription.displayName = "DrawerDescription";
|
|
132
|
+
/**
|
|
133
|
+
* Scroll region between header and footer. Always flex-1; overflow behavior
|
|
134
|
+
* follows DrawerContent's `scrollable` flag (default true) — when false, the
|
|
135
|
+
* body sizes to its content and DrawerContent's own height controls overflow.
|
|
136
|
+
*/
|
|
137
|
+
const DrawerBody = forwardRef(function DrawerBody({ className, ...props }, ref) {
|
|
138
|
+
const { scrollable } = useDrawerContext();
|
|
139
|
+
return (_jsx("div", { ref: ref, className: cn("flex-1 px-6 pb-6", scrollable && "overflow-y-auto", className), ...props }));
|
|
140
|
+
});
|
|
141
|
+
DrawerBody.displayName = "DrawerBody";
|
|
142
|
+
const DrawerFooter = forwardRef(function DrawerFooter({ className, ...props }, ref) {
|
|
143
|
+
return (_jsx("div", { ref: ref, className: cn("border-border flex flex-col-reverse items-stretch gap-2 border-t p-4 sm:flex-row sm:items-center sm:justify-end", className), ...props }));
|
|
144
|
+
});
|
|
145
|
+
DrawerFooter.displayName = "DrawerFooter";
|
|
146
|
+
export { Drawer, DrawerTrigger, DrawerPortal, DrawerOverlay, DrawerContent, DrawerHeader, DrawerTitle, DrawerDescription, DrawerBody, DrawerFooter, DrawerClose, drawerContentVariants, };
|
|
147
|
+
//# sourceMappingURL=drawer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"drawer.js","sourceRoot":"","sources":["../../../components/ui/drawer.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import * as DropdownMenuPrimitive from "@radix-ui/react-dropdown-menu";
|
|
2
|
+
import { type VariantProps } from "class-variance-authority";
|
|
3
|
+
declare const DropdownMenu: import("react").FC<DropdownMenuPrimitive.DropdownMenuProps>;
|
|
4
|
+
declare const DropdownMenuTrigger: import("react").ForwardRefExoticComponent<DropdownMenuPrimitive.DropdownMenuTriggerProps & import("react").RefAttributes<HTMLButtonElement>>;
|
|
5
|
+
declare const DropdownMenuGroup: import("react").ForwardRefExoticComponent<DropdownMenuPrimitive.DropdownMenuGroupProps & import("react").RefAttributes<HTMLDivElement>>;
|
|
6
|
+
declare const DropdownMenuPortal: import("react").FC<DropdownMenuPrimitive.DropdownMenuPortalProps>;
|
|
7
|
+
declare const DropdownMenuSub: import("react").FC<DropdownMenuPrimitive.DropdownMenuSubProps>;
|
|
8
|
+
declare const DropdownMenuRadioGroup: import("react").ForwardRefExoticComponent<DropdownMenuPrimitive.DropdownMenuRadioGroupProps & import("react").RefAttributes<HTMLDivElement>>;
|
|
9
|
+
declare const dropdownContentVariants: (props?: ({
|
|
10
|
+
size?: "sm" | "md" | null | undefined;
|
|
11
|
+
} & import("class-variance-authority/types").ClassProp) | undefined) => string;
|
|
12
|
+
type DropdownWidth = "fit" | "trigger" | "sm" | "md" | "lg" | number;
|
|
13
|
+
type DropdownMenuContentProps = React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Content> & VariantProps<typeof dropdownContentVariants> & {
|
|
14
|
+
width?: DropdownWidth;
|
|
15
|
+
};
|
|
16
|
+
declare const DropdownMenuContent: import("react").ForwardRefExoticComponent<Omit<DropdownMenuPrimitive.DropdownMenuContentProps & import("react").RefAttributes<HTMLDivElement>, "ref"> & VariantProps<(props?: ({
|
|
17
|
+
size?: "sm" | "md" | null | undefined;
|
|
18
|
+
} & import("class-variance-authority/types").ClassProp) | undefined) => string> & {
|
|
19
|
+
width?: DropdownWidth;
|
|
20
|
+
} & import("react").RefAttributes<HTMLDivElement>>;
|
|
21
|
+
type DropdownMenuItemProps = React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Item> & {
|
|
22
|
+
variant?: "default" | "destructive";
|
|
23
|
+
icon?: React.ReactNode;
|
|
24
|
+
description?: React.ReactNode;
|
|
25
|
+
kbd?: string[];
|
|
26
|
+
loading?: boolean;
|
|
27
|
+
/**
|
|
28
|
+
* `true` keeps the menu open after selection (useful for filter-style menus
|
|
29
|
+
* that toggle multiple options). Default is `false` (menu closes).
|
|
30
|
+
*/
|
|
31
|
+
inset?: boolean;
|
|
32
|
+
};
|
|
33
|
+
declare const DropdownMenuItem: import("react").ForwardRefExoticComponent<Omit<DropdownMenuPrimitive.DropdownMenuItemProps & import("react").RefAttributes<HTMLDivElement>, "ref"> & {
|
|
34
|
+
variant?: "default" | "destructive";
|
|
35
|
+
icon?: React.ReactNode;
|
|
36
|
+
description?: React.ReactNode;
|
|
37
|
+
kbd?: string[];
|
|
38
|
+
loading?: boolean;
|
|
39
|
+
/**
|
|
40
|
+
* `true` keeps the menu open after selection (useful for filter-style menus
|
|
41
|
+
* that toggle multiple options). Default is `false` (menu closes).
|
|
42
|
+
*/
|
|
43
|
+
inset?: boolean;
|
|
44
|
+
} & import("react").RefAttributes<HTMLDivElement>>;
|
|
45
|
+
declare const DropdownMenuCheckboxItem: import("react").ForwardRefExoticComponent<Omit<DropdownMenuPrimitive.DropdownMenuCheckboxItemProps & import("react").RefAttributes<HTMLDivElement>, "ref"> & import("react").RefAttributes<HTMLDivElement>>;
|
|
46
|
+
declare const DropdownMenuRadioItem: import("react").ForwardRefExoticComponent<Omit<DropdownMenuPrimitive.DropdownMenuRadioItemProps & import("react").RefAttributes<HTMLDivElement>, "ref"> & import("react").RefAttributes<HTMLDivElement>>;
|
|
47
|
+
declare const DropdownMenuLabel: import("react").ForwardRefExoticComponent<Omit<DropdownMenuPrimitive.DropdownMenuLabelProps & import("react").RefAttributes<HTMLDivElement>, "ref"> & import("react").RefAttributes<HTMLDivElement>>;
|
|
48
|
+
declare const DropdownMenuSeparator: import("react").ForwardRefExoticComponent<Omit<DropdownMenuPrimitive.DropdownMenuSeparatorProps & import("react").RefAttributes<HTMLDivElement>, "ref"> & import("react").RefAttributes<HTMLDivElement>>;
|
|
49
|
+
/**
|
|
50
|
+
* DropdownMenuShortcut — display-only keyboard hint at the end of an item.
|
|
51
|
+
* Renders inline kbd-styled keys, separated by `+`. Stays LTR in RTL.
|
|
52
|
+
*/
|
|
53
|
+
declare function DropdownMenuShortcut({ keys, className }: {
|
|
54
|
+
keys: string[];
|
|
55
|
+
className?: string;
|
|
56
|
+
}): import("react/jsx-runtime").JSX.Element;
|
|
57
|
+
declare const DropdownMenuSubTrigger: import("react").ForwardRefExoticComponent<Omit<DropdownMenuPrimitive.DropdownMenuSubTriggerProps & import("react").RefAttributes<HTMLDivElement>, "ref"> & {
|
|
58
|
+
icon?: React.ReactNode;
|
|
59
|
+
} & import("react").RefAttributes<HTMLDivElement>>;
|
|
60
|
+
declare const DropdownMenuSubContent: import("react").ForwardRefExoticComponent<Omit<DropdownMenuPrimitive.DropdownMenuSubContentProps & import("react").RefAttributes<HTMLDivElement>, "ref"> & import("react").RefAttributes<HTMLDivElement>>;
|
|
61
|
+
export { DropdownMenu, DropdownMenuTrigger, DropdownMenuContent, DropdownMenuItem, DropdownMenuCheckboxItem, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuLabel, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuGroup, DropdownMenuPortal, DropdownMenuSub, DropdownMenuSubTrigger, DropdownMenuSubContent, dropdownContentVariants, };
|
|
62
|
+
export type { DropdownMenuContentProps, DropdownMenuItemProps };
|
|
63
|
+
//# sourceMappingURL=dropdown-menu.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dropdown-menu.d.ts","sourceRoot":"","sources":["../../../components/ui/dropdown-menu.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,qBAAqB,MAAM,+BAA+B,CAAC;AAEvE,OAAO,EAAO,KAAK,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAMlE,QAAA,MAAM,YAAY,6DAA6B,CAAC;AAChD,QAAA,MAAM,mBAAmB,8IAAgC,CAAC;AAC1D,QAAA,MAAM,iBAAiB,yIAA8B,CAAC;AACtD,QAAA,MAAM,kBAAkB,mEAA+B,CAAC;AACxD,QAAA,MAAM,eAAe,gEAA4B,CAAC;AAClD,QAAA,MAAM,sBAAsB,8IAAmC,CAAC;AAMhE,QAAA,MAAM,uBAAuB;;8EAe5B,CAAC;AAEF,KAAK,aAAa,GAAG,KAAK,GAAG,SAAS,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,MAAM,CAAC;AAgBrE,KAAK,wBAAwB,GAAG,KAAK,CAAC,wBAAwB,CAC5D,OAAO,qBAAqB,CAAC,OAAO,CACrC,GACC,YAAY,CAAC,OAAO,uBAAuB,CAAC,GAAG;IAC7C,KAAK,CAAC,EAAE,aAAa,CAAC;CACvB,CAAC;AAEJ,QAAA,MAAM,mBAAmB;;;YAHb,aAAa;kDAkBvB,CAAC;AAmBH,KAAK,qBAAqB,GAAG,KAAK,CAAC,wBAAwB,CAAC,OAAO,qBAAqB,CAAC,IAAI,CAAC,GAAG;IAC/F,OAAO,CAAC,EAAE,SAAS,GAAG,aAAa,CAAC;IACpC,IAAI,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACvB,WAAW,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC9B,GAAG,CAAC,EAAE,MAAM,EAAE,CAAC;IACf,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;;OAGG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB,CAAC;AAEF,QAAA,MAAM,gBAAgB;cAZV,SAAS,GAAG,aAAa;WAC5B,KAAK,CAAC,SAAS;kBACR,KAAK,CAAC,SAAS;UACvB,MAAM,EAAE;cACJ,OAAO;IACjB;;;OAGG;YACK,OAAO;kDA+Df,CAAC;AAOH,QAAA,MAAM,wBAAwB,6MAmB5B,CAAC;AAOH,QAAA,MAAM,qBAAqB,0MAmBzB,CAAC;AAOH,QAAA,MAAM,iBAAiB,sMAcrB,CAAC;AAGH,QAAA,MAAM,qBAAqB,0MAWzB,CAAC;AAGH;;;GAGG;AACH,iBAAS,oBAAoB,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE;IAAE,IAAI,EAAE,MAAM,EAAE,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,2CAmBxF;AAMD,QAAA,MAAM,sBAAsB;WAGjB,KAAK,CAAC,SAAS;kDAqBxB,CAAC;AAGH,QAAA,MAAM,sBAAsB,2MAgB1B,CAAC;AAGH,OAAO,EACL,YAAY,EACZ,mBAAmB,EACnB,mBAAmB,EACnB,gBAAgB,EAChB,wBAAwB,EACxB,sBAAsB,EACtB,qBAAqB,EACrB,iBAAiB,EACjB,qBAAqB,EACrB,oBAAoB,EACpB,iBAAiB,EACjB,kBAAkB,EAClB,eAAe,EACf,sBAAsB,EACtB,sBAAsB,EACtB,uBAAuB,GACxB,CAAC;AACF,YAAY,EAAE,wBAAwB,EAAE,qBAAqB,EAAE,CAAC"}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { forwardRef } from "react";
|
|
4
|
+
import * as DropdownMenuPrimitive from "@radix-ui/react-dropdown-menu";
|
|
5
|
+
import { RiArrowRightSLine, RiCheckLine, RiCircleFill, RiLoader2Line } from "@remixicon/react";
|
|
6
|
+
import { cva } from "class-variance-authority";
|
|
7
|
+
import { cn } from "@/lib/utils";
|
|
8
|
+
// Per docs/emara-ui-phase-3-components.md §5.
|
|
9
|
+
const DropdownMenu = DropdownMenuPrimitive.Root;
|
|
10
|
+
const DropdownMenuTrigger = DropdownMenuPrimitive.Trigger;
|
|
11
|
+
const DropdownMenuGroup = DropdownMenuPrimitive.Group;
|
|
12
|
+
const DropdownMenuPortal = DropdownMenuPrimitive.Portal;
|
|
13
|
+
const DropdownMenuSub = DropdownMenuPrimitive.Sub;
|
|
14
|
+
const DropdownMenuRadioGroup = DropdownMenuPrimitive.RadioGroup;
|
|
15
|
+
// ----------------------------------------------------------------------------
|
|
16
|
+
// DropdownMenuContent + size/width variants
|
|
17
|
+
// ----------------------------------------------------------------------------
|
|
18
|
+
const dropdownContentVariants = cva([
|
|
19
|
+
"z-popover min-w-32 overflow-hidden rounded-md border border-border bg-popover text-popover-foreground shadow-md",
|
|
20
|
+
"data-[state=open]:animate-[scale-in_var(--duration-fast)_var(--ease-out)]",
|
|
21
|
+
"data-[state=closed]:animate-[scale-out_var(--duration-fast)_var(--ease-in)]",
|
|
22
|
+
].join(" "), {
|
|
23
|
+
variants: {
|
|
24
|
+
size: {
|
|
25
|
+
sm: "py-1 text-xs [&_[data-slot=item]]:py-1 [&_[data-slot=item]]:ps-7 [&_[data-slot=item]]:pe-2",
|
|
26
|
+
md: "py-1 text-sm [&_[data-slot=item]]:py-1.5 [&_[data-slot=item]]:ps-8 [&_[data-slot=item]]:pe-2",
|
|
27
|
+
},
|
|
28
|
+
},
|
|
29
|
+
defaultVariants: { size: "md" },
|
|
30
|
+
});
|
|
31
|
+
const WIDTH_PX = {
|
|
32
|
+
sm: 192,
|
|
33
|
+
md: 256,
|
|
34
|
+
lg: 320,
|
|
35
|
+
};
|
|
36
|
+
function resolveWidthStyle(width) {
|
|
37
|
+
if (width === undefined)
|
|
38
|
+
return undefined;
|
|
39
|
+
if (width === "fit")
|
|
40
|
+
return { width: "max-content" };
|
|
41
|
+
if (width === "trigger")
|
|
42
|
+
return { width: "var(--radix-dropdown-menu-trigger-width)" };
|
|
43
|
+
if (typeof width === "number")
|
|
44
|
+
return { width: width };
|
|
45
|
+
return { width: WIDTH_PX[width] };
|
|
46
|
+
}
|
|
47
|
+
const DropdownMenuContent = forwardRef(function DropdownMenuContent({ className, size, width, sideOffset = 4, style, ...props }, ref) {
|
|
48
|
+
return (_jsx(DropdownMenuPortal, { children: _jsx(DropdownMenuPrimitive.Content, { ref: ref, sideOffset: sideOffset, style: { ...resolveWidthStyle(width), ...style }, className: cn(dropdownContentVariants({ size }), className), ...props }) }));
|
|
49
|
+
});
|
|
50
|
+
DropdownMenuContent.displayName = "DropdownMenuContent";
|
|
51
|
+
// ----------------------------------------------------------------------------
|
|
52
|
+
// Shared item visuals
|
|
53
|
+
// ----------------------------------------------------------------------------
|
|
54
|
+
const itemBase = [
|
|
55
|
+
"relative flex cursor-pointer select-none items-start gap-2 rounded-sm py-1.5 ps-8 pe-2 text-sm outline-none",
|
|
56
|
+
"transition-colors",
|
|
57
|
+
"focus:bg-accent focus:text-accent-foreground",
|
|
58
|
+
"data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
|
|
59
|
+
"aria-busy:cursor-progress",
|
|
60
|
+
].join(" ");
|
|
61
|
+
const DropdownMenuItem = forwardRef(function DropdownMenuItem({ className, variant = "default", icon, description, kbd, loading = false, inset = false, children, onSelect, ...props }, ref) {
|
|
62
|
+
return (_jsxs(DropdownMenuPrimitive.Item, { ref: ref, "data-slot": "item", "aria-busy": loading || undefined, onSelect: (e) => {
|
|
63
|
+
if (loading) {
|
|
64
|
+
e.preventDefault();
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
onSelect?.(e);
|
|
68
|
+
}, className: cn(itemBase, variant === "destructive" &&
|
|
69
|
+
"text-destructive focus:bg-destructive/10 focus:text-destructive", inset && "ps-2", className), ...props, children: [_jsx("span", { className: "absolute start-2 inline-flex h-4 w-4 items-center justify-center text-current", children: loading ? _jsx(RiLoader2Line, { className: "size-3.5 animate-spin" }) : (icon ?? null) }), _jsxs("span", { className: "flex flex-1 flex-col gap-0.5 leading-none", children: [_jsx("span", { children: children }), description ? _jsx("span", { className: "text-muted-foreground text-xs", children: description }) : null] }), kbd ? (_jsx("span", { className: "text-muted-foreground ms-auto inline-flex items-center gap-0.5 text-xs", children: kbd.map((k, i) => (_jsx("kbd", { className: "border-border bg-muted min-w-[1em] rounded border px-1 font-mono text-[10px] leading-tight", children: k }, `${k}-${i}`))) })) : null] }));
|
|
70
|
+
});
|
|
71
|
+
DropdownMenuItem.displayName = "DropdownMenuItem";
|
|
72
|
+
// ----------------------------------------------------------------------------
|
|
73
|
+
// DropdownMenuCheckboxItem
|
|
74
|
+
// ----------------------------------------------------------------------------
|
|
75
|
+
const DropdownMenuCheckboxItem = forwardRef(function DropdownMenuCheckboxItem({ className, children, ...props }, ref) {
|
|
76
|
+
return (_jsxs(DropdownMenuPrimitive.CheckboxItem, { ref: ref, "data-slot": "item", className: cn(itemBase, className), ...props, children: [_jsx("span", { className: "absolute start-2 inline-flex h-4 w-4 items-center justify-center", children: _jsx(DropdownMenuPrimitive.ItemIndicator, { children: _jsx(RiCheckLine, { className: "size-4" }) }) }), _jsx("span", { className: "flex-1", children: children })] }));
|
|
77
|
+
});
|
|
78
|
+
DropdownMenuCheckboxItem.displayName = "DropdownMenuCheckboxItem";
|
|
79
|
+
// ----------------------------------------------------------------------------
|
|
80
|
+
// DropdownMenuRadioItem
|
|
81
|
+
// ----------------------------------------------------------------------------
|
|
82
|
+
const DropdownMenuRadioItem = forwardRef(function DropdownMenuRadioItem({ className, children, ...props }, ref) {
|
|
83
|
+
return (_jsxs(DropdownMenuPrimitive.RadioItem, { ref: ref, "data-slot": "item", className: cn(itemBase, className), ...props, children: [_jsx("span", { className: "absolute start-2 inline-flex h-4 w-4 items-center justify-center", children: _jsx(DropdownMenuPrimitive.ItemIndicator, { children: _jsx(RiCircleFill, { className: "size-2 fill-current" }) }) }), _jsx("span", { className: "flex-1", children: children })] }));
|
|
84
|
+
});
|
|
85
|
+
DropdownMenuRadioItem.displayName = "DropdownMenuRadioItem";
|
|
86
|
+
// ----------------------------------------------------------------------------
|
|
87
|
+
// DropdownMenuLabel / Separator / Shortcut
|
|
88
|
+
// ----------------------------------------------------------------------------
|
|
89
|
+
const DropdownMenuLabel = forwardRef(function DropdownMenuLabel({ className, ...props }, ref) {
|
|
90
|
+
return (_jsx(DropdownMenuPrimitive.Label, { ref: ref, className: cn("text-muted-foreground px-2 py-1.5 text-xs font-semibold tracking-wide uppercase", className), ...props }));
|
|
91
|
+
});
|
|
92
|
+
DropdownMenuLabel.displayName = "DropdownMenuLabel";
|
|
93
|
+
const DropdownMenuSeparator = forwardRef(function DropdownMenuSeparator({ className, ...props }, ref) {
|
|
94
|
+
return (_jsx(DropdownMenuPrimitive.Separator, { ref: ref, className: cn("bg-border -mx-1 my-1 h-px", className), ...props }));
|
|
95
|
+
});
|
|
96
|
+
DropdownMenuSeparator.displayName = "DropdownMenuSeparator";
|
|
97
|
+
/**
|
|
98
|
+
* DropdownMenuShortcut — display-only keyboard hint at the end of an item.
|
|
99
|
+
* Renders inline kbd-styled keys, separated by `+`. Stays LTR in RTL.
|
|
100
|
+
*/
|
|
101
|
+
function DropdownMenuShortcut({ keys, className }) {
|
|
102
|
+
return (_jsx("span", { className: cn("text-muted-foreground ms-auto inline-flex items-center gap-0.5 text-xs", className), dir: "ltr", children: keys.map((k, i) => (_jsxs("span", { className: "inline-flex items-center gap-0.5", children: [i > 0 ? _jsx("span", { className: "opacity-70", children: "+" }) : null, _jsx("kbd", { className: "border-border bg-muted min-w-[1em] rounded border px-1 font-mono text-[10px] leading-tight", children: k })] }, `${k}-${i}`))) }));
|
|
103
|
+
}
|
|
104
|
+
// ----------------------------------------------------------------------------
|
|
105
|
+
// DropdownMenuSubTrigger / DropdownMenuSubContent
|
|
106
|
+
// ----------------------------------------------------------------------------
|
|
107
|
+
const DropdownMenuSubTrigger = forwardRef(function DropdownMenuSubTrigger({ className, icon, children, ...props }, ref) {
|
|
108
|
+
return (_jsxs(DropdownMenuPrimitive.SubTrigger, { ref: ref, "data-slot": "item", className: cn(itemBase, "data-[state=open]:bg-accent data-[state=open]:text-accent-foreground", className), ...props, children: [_jsx("span", { className: "absolute start-2 inline-flex h-4 w-4 items-center justify-center", children: icon ?? null }), _jsx("span", { className: "flex-1", children: children }), _jsx(RiArrowRightSLine, { className: "rtl-mirror ms-auto size-4", "aria-hidden": "true" })] }));
|
|
109
|
+
});
|
|
110
|
+
DropdownMenuSubTrigger.displayName = "DropdownMenuSubTrigger";
|
|
111
|
+
const DropdownMenuSubContent = forwardRef(function DropdownMenuSubContent({ className, ...props }, ref) {
|
|
112
|
+
return (_jsx(DropdownMenuPrimitive.SubContent, { ref: ref, className: cn("border-border bg-popover text-popover-foreground z-popover min-w-32 overflow-hidden rounded-md border py-1 text-sm shadow-md", "data-[state=open]:animate-[scale-in_var(--duration-fast)_var(--ease-out)]", "data-[state=closed]:animate-[scale-out_var(--duration-fast)_var(--ease-in)]", className), ...props }));
|
|
113
|
+
});
|
|
114
|
+
DropdownMenuSubContent.displayName = "DropdownMenuSubContent";
|
|
115
|
+
export { DropdownMenu, DropdownMenuTrigger, DropdownMenuContent, DropdownMenuItem, DropdownMenuCheckboxItem, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuLabel, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuGroup, DropdownMenuPortal, DropdownMenuSub, DropdownMenuSubTrigger, DropdownMenuSubContent, dropdownContentVariants, };
|
|
116
|
+
//# sourceMappingURL=dropdown-menu.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dropdown-menu.js","sourceRoot":"","sources":["../../../components/ui/dropdown-menu.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { type VariantProps } from "class-variance-authority";
|
|
2
|
+
declare const emptyStateVariants: (props?: ({
|
|
3
|
+
variant?: "default" | "compact" | "splash" | null | undefined;
|
|
4
|
+
size?: "sm" | "md" | "lg" | null | undefined;
|
|
5
|
+
} & import("class-variance-authority/types").ClassProp) | undefined) => string;
|
|
6
|
+
type EmptyStateRootVariants = VariantProps<typeof emptyStateVariants>;
|
|
7
|
+
type EmptyStateProps = React.HTMLAttributes<HTMLDivElement> & EmptyStateRootVariants & {
|
|
8
|
+
asChild?: boolean;
|
|
9
|
+
/** Convenience: provided icon is rendered inside Illustration. */
|
|
10
|
+
icon?: React.ReactNode;
|
|
11
|
+
/** Convenience: provided string is rendered as the Title. */
|
|
12
|
+
title?: React.ReactNode;
|
|
13
|
+
/** Convenience: provided node is rendered as the Description. */
|
|
14
|
+
description?: React.ReactNode;
|
|
15
|
+
/** Convenience: provided node is rendered inside Actions. */
|
|
16
|
+
actions?: React.ReactNode;
|
|
17
|
+
};
|
|
18
|
+
declare const EmptyState: import("react").ForwardRefExoticComponent<import("react").HTMLAttributes<HTMLDivElement> & EmptyStateRootVariants & {
|
|
19
|
+
asChild?: boolean;
|
|
20
|
+
/** Convenience: provided icon is rendered inside Illustration. */
|
|
21
|
+
icon?: React.ReactNode;
|
|
22
|
+
/** Convenience: provided string is rendered as the Title. */
|
|
23
|
+
title?: React.ReactNode;
|
|
24
|
+
/** Convenience: provided node is rendered as the Description. */
|
|
25
|
+
description?: React.ReactNode;
|
|
26
|
+
/** Convenience: provided node is rendered inside Actions. */
|
|
27
|
+
actions?: React.ReactNode;
|
|
28
|
+
} & import("react").RefAttributes<HTMLDivElement>>;
|
|
29
|
+
type EmptyStateIllustrationProps = React.HTMLAttributes<HTMLDivElement>;
|
|
30
|
+
declare const EmptyStateIllustration: import("react").ForwardRefExoticComponent<EmptyStateIllustrationProps & import("react").RefAttributes<HTMLDivElement>>;
|
|
31
|
+
type EmptyStateTitleProps = React.HTMLAttributes<HTMLHeadingElement> & {
|
|
32
|
+
as?: "h2" | "h3" | "h4" | "h5" | "h6";
|
|
33
|
+
};
|
|
34
|
+
declare const EmptyStateTitle: import("react").ForwardRefExoticComponent<import("react").HTMLAttributes<HTMLHeadingElement> & {
|
|
35
|
+
as?: "h2" | "h3" | "h4" | "h5" | "h6";
|
|
36
|
+
} & import("react").RefAttributes<HTMLHeadingElement>>;
|
|
37
|
+
type EmptyStateDescriptionProps = React.HTMLAttributes<HTMLParagraphElement>;
|
|
38
|
+
declare const EmptyStateDescription: import("react").ForwardRefExoticComponent<EmptyStateDescriptionProps & import("react").RefAttributes<HTMLParagraphElement>>;
|
|
39
|
+
type EmptyStateActionsProps = React.HTMLAttributes<HTMLDivElement>;
|
|
40
|
+
declare const EmptyStateActions: import("react").ForwardRefExoticComponent<EmptyStateActionsProps & import("react").RefAttributes<HTMLDivElement>>;
|
|
41
|
+
export { EmptyState, EmptyStateIllustration, EmptyStateTitle, EmptyStateDescription, EmptyStateActions, emptyStateVariants, };
|
|
42
|
+
export type { EmptyStateProps, EmptyStateIllustrationProps, EmptyStateTitleProps, EmptyStateDescriptionProps, EmptyStateActionsProps, };
|
|
43
|
+
//# sourceMappingURL=empty-state.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"empty-state.d.ts","sourceRoot":"","sources":["../../../components/ui/empty-state.tsx"],"names":[],"mappings":"AAIA,OAAO,EAAO,KAAK,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAwBlE,QAAA,MAAM,kBAAkB;;;8EAyBtB,CAAC;AAEH,KAAK,sBAAsB,GAAG,YAAY,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAEtE,KAAK,eAAe,GAAG,KAAK,CAAC,cAAc,CAAC,cAAc,CAAC,GACzD,sBAAsB,GAAG;IACvB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,kEAAkE;IAClE,IAAI,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACvB,6DAA6D;IAC7D,KAAK,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACxB,iEAAiE;IACjE,WAAW,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC9B,6DAA6D;IAC7D,OAAO,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CAC3B,CAAC;AAEJ,QAAA,MAAM,UAAU;cAXF,OAAO;IACjB,kEAAkE;WAC3D,KAAK,CAAC,SAAS;IACtB,6DAA6D;YACrD,KAAK,CAAC,SAAS;IACvB,iEAAiE;kBACnD,KAAK,CAAC,SAAS;IAC7B,6DAA6D;cACnD,KAAK,CAAC,SAAS;kDAoE3B,CAAC;AA8BH,KAAK,2BAA2B,GAAG,KAAK,CAAC,cAAc,CAAC,cAAc,CAAC,CAAC;AAExE,QAAA,MAAM,sBAAsB,wHAY3B,CAAC;AA0BF,KAAK,oBAAoB,GAAG,KAAK,CAAC,cAAc,CAAC,kBAAkB,CAAC,GAAG;IACrE,EAAE,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;CACvC,CAAC;AAEF,QAAA,MAAM,eAAe;SAHd,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI;sDActC,CAAC;AAgBF,KAAK,0BAA0B,GAAG,KAAK,CAAC,cAAc,CAAC,oBAAoB,CAAC,CAAC;AAE7E,QAAA,MAAM,qBAAqB,6HAW1B,CAAC;AAKF,KAAK,sBAAsB,GAAG,KAAK,CAAC,cAAc,CAAC,cAAc,CAAC,CAAC;AAEnE,QAAA,MAAM,iBAAiB,mHAetB,CAAC;AAGF,OAAO,EACL,UAAU,EACV,sBAAsB,EACtB,eAAe,EACf,qBAAqB,EACrB,iBAAiB,EACjB,kBAAkB,GACnB,CAAC;AACF,YAAY,EACV,eAAe,EACf,2BAA2B,EAC3B,oBAAoB,EACpB,0BAA0B,EAC1B,sBAAsB,GACvB,CAAC"}
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
3
|
+
import { createContext, forwardRef, useContext, useMemo } from "react";
|
|
4
|
+
import { Slot } from "@radix-ui/react-slot";
|
|
5
|
+
import { cva } from "class-variance-authority";
|
|
6
|
+
import { cn } from "@/lib/utils";
|
|
7
|
+
const EmptyStateContext = createContext(null);
|
|
8
|
+
function useEmptyStateContext() {
|
|
9
|
+
const ctx = useContext(EmptyStateContext);
|
|
10
|
+
if (!ctx)
|
|
11
|
+
throw new Error("EmptyState subcomponents must be used inside <EmptyState>");
|
|
12
|
+
return ctx;
|
|
13
|
+
}
|
|
14
|
+
// --- Root ------------------------------------------------------------------
|
|
15
|
+
const emptyStateVariants = cva("text-foreground", {
|
|
16
|
+
variants: {
|
|
17
|
+
variant: {
|
|
18
|
+
default: "flex w-full flex-col items-center text-center",
|
|
19
|
+
compact: "flex w-full items-start gap-3 text-start",
|
|
20
|
+
splash: "flex min-h-[60vh] w-full flex-col items-center justify-center text-center",
|
|
21
|
+
},
|
|
22
|
+
size: {
|
|
23
|
+
sm: "",
|
|
24
|
+
md: "",
|
|
25
|
+
lg: "",
|
|
26
|
+
},
|
|
27
|
+
},
|
|
28
|
+
compoundVariants: [
|
|
29
|
+
{ variant: "default", size: "sm", class: "py-6 gap-2" },
|
|
30
|
+
{ variant: "default", size: "md", class: "py-10 gap-3" },
|
|
31
|
+
{ variant: "default", size: "lg", class: "py-16 gap-4" },
|
|
32
|
+
{ variant: "compact", size: "sm", class: "p-3" },
|
|
33
|
+
{ variant: "compact", size: "md", class: "p-4" },
|
|
34
|
+
{ variant: "compact", size: "lg", class: "p-6" },
|
|
35
|
+
{ variant: "splash", size: "sm", class: "gap-4" },
|
|
36
|
+
{ variant: "splash", size: "md", class: "gap-6" },
|
|
37
|
+
{ variant: "splash", size: "lg", class: "gap-8" },
|
|
38
|
+
],
|
|
39
|
+
defaultVariants: { variant: "default", size: "md" },
|
|
40
|
+
});
|
|
41
|
+
const EmptyState = forwardRef(function EmptyState({ className, variant = "default", size = "md", asChild = false, icon, title, description, actions, children, ...props }, ref) {
|
|
42
|
+
const Comp = asChild ? Slot : "div";
|
|
43
|
+
const ctx = useMemo(() => ({ variant: variant ?? "default", size: size ?? "md" }), [variant, size]);
|
|
44
|
+
// When convenience props are used, render the composed structure
|
|
45
|
+
// automatically. Otherwise just render children.
|
|
46
|
+
const usingConvenience = icon !== undefined ||
|
|
47
|
+
title !== undefined ||
|
|
48
|
+
description !== undefined ||
|
|
49
|
+
actions !== undefined;
|
|
50
|
+
return (_jsx(EmptyStateContext.Provider, { value: ctx, children: _jsx(Comp, { ref: ref, role: "status", className: cn(emptyStateVariants({ variant, size }), className), ...props, children: usingConvenience ? (variant === "compact" ? (_jsxs(_Fragment, { children: [icon ? _jsx(EmptyStateIllustration, { children: icon }) : null, _jsxs("div", { className: "flex-1 min-w-0", children: [title ? _jsx(EmptyStateTitle, { children: title }) : null, description ? (_jsx(EmptyStateDescription, { children: description })) : null] }), actions ? _jsx(EmptyStateActions, { children: actions }) : null] })) : (_jsxs(_Fragment, { children: [icon ? _jsx(EmptyStateIllustration, { children: icon }) : null, title ? _jsx(EmptyStateTitle, { children: title }) : null, description ? (_jsx(EmptyStateDescription, { children: description })) : null, actions ? _jsx(EmptyStateActions, { children: actions }) : null] }))) : (children) }) }));
|
|
51
|
+
});
|
|
52
|
+
EmptyState.displayName = "EmptyState";
|
|
53
|
+
// --- Illustration ----------------------------------------------------------
|
|
54
|
+
const illustrationVariants = cva("text-muted-foreground [&_svg]:shrink-0", {
|
|
55
|
+
variants: {
|
|
56
|
+
variant: {
|
|
57
|
+
default: "[&_svg]:size-12",
|
|
58
|
+
compact: "[&_svg]:size-5 mt-0.5",
|
|
59
|
+
splash: "[&_svg]:size-20",
|
|
60
|
+
},
|
|
61
|
+
size: {
|
|
62
|
+
sm: "",
|
|
63
|
+
md: "",
|
|
64
|
+
lg: "",
|
|
65
|
+
},
|
|
66
|
+
},
|
|
67
|
+
compoundVariants: [
|
|
68
|
+
{ variant: "default", size: "sm", class: "[&_svg]:size-10" },
|
|
69
|
+
{ variant: "default", size: "lg", class: "[&_svg]:size-16" },
|
|
70
|
+
{ variant: "splash", size: "sm", class: "[&_svg]:size-16" },
|
|
71
|
+
{ variant: "splash", size: "lg", class: "[&_svg]:size-24" },
|
|
72
|
+
],
|
|
73
|
+
defaultVariants: { variant: "default", size: "md" },
|
|
74
|
+
});
|
|
75
|
+
const EmptyStateIllustration = forwardRef(function EmptyStateIllustration({ className, ...props }, ref) {
|
|
76
|
+
const { variant, size } = useEmptyStateContext();
|
|
77
|
+
return (_jsx("div", { ref: ref, "aria-hidden": "true", className: cn(illustrationVariants({ variant, size }), className), ...props }));
|
|
78
|
+
});
|
|
79
|
+
EmptyStateIllustration.displayName = "EmptyStateIllustration";
|
|
80
|
+
// --- Title ------------------------------------------------------------------
|
|
81
|
+
const titleVariants = cva("font-semibold text-foreground", {
|
|
82
|
+
variants: {
|
|
83
|
+
variant: {
|
|
84
|
+
default: "",
|
|
85
|
+
compact: "",
|
|
86
|
+
splash: "",
|
|
87
|
+
},
|
|
88
|
+
size: {
|
|
89
|
+
sm: "text-sm",
|
|
90
|
+
md: "text-base",
|
|
91
|
+
lg: "text-lg",
|
|
92
|
+
},
|
|
93
|
+
},
|
|
94
|
+
compoundVariants: [
|
|
95
|
+
{ variant: "splash", size: "sm", class: "text-lg" },
|
|
96
|
+
{ variant: "splash", size: "md", class: "text-2xl" },
|
|
97
|
+
{ variant: "splash", size: "lg", class: "text-3xl" },
|
|
98
|
+
],
|
|
99
|
+
defaultVariants: { variant: "default", size: "md" },
|
|
100
|
+
});
|
|
101
|
+
const EmptyStateTitle = forwardRef(function EmptyStateTitle({ as: Heading = "h3", className, ...props }, ref) {
|
|
102
|
+
const { variant, size } = useEmptyStateContext();
|
|
103
|
+
return (_jsx(Heading, { ref: ref, className: cn(titleVariants({ variant, size }), className), ...props }));
|
|
104
|
+
});
|
|
105
|
+
EmptyStateTitle.displayName = "EmptyStateTitle";
|
|
106
|
+
// --- Description ------------------------------------------------------------
|
|
107
|
+
const descriptionVariants = cva("text-muted-foreground", {
|
|
108
|
+
variants: {
|
|
109
|
+
size: {
|
|
110
|
+
sm: "text-xs",
|
|
111
|
+
md: "text-sm",
|
|
112
|
+
lg: "text-base",
|
|
113
|
+
},
|
|
114
|
+
},
|
|
115
|
+
defaultVariants: { size: "md" },
|
|
116
|
+
});
|
|
117
|
+
const EmptyStateDescription = forwardRef(function EmptyStateDescription({ className, ...props }, ref) {
|
|
118
|
+
const { size } = useEmptyStateContext();
|
|
119
|
+
return (_jsx("p", { ref: ref, className: cn(descriptionVariants({ size }), "max-w-prose", className), ...props }));
|
|
120
|
+
});
|
|
121
|
+
EmptyStateDescription.displayName = "EmptyStateDescription";
|
|
122
|
+
const EmptyStateActions = forwardRef(function EmptyStateActions({ className, ...props }, ref) {
|
|
123
|
+
const { variant } = useEmptyStateContext();
|
|
124
|
+
return (_jsx("div", { ref: ref, className: cn("flex flex-wrap items-center gap-2", variant === "compact" ? "ms-auto" : "justify-center mt-2", className), ...props }));
|
|
125
|
+
});
|
|
126
|
+
EmptyStateActions.displayName = "EmptyStateActions";
|
|
127
|
+
export { EmptyState, EmptyStateIllustration, EmptyStateTitle, EmptyStateDescription, EmptyStateActions, emptyStateVariants, };
|
|
128
|
+
//# sourceMappingURL=empty-state.js.map
|