@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.
Files changed (218) hide show
  1. package/components/ui/.gitkeep +0 -0
  2. package/components/ui/accordion.stories.tsx +231 -0
  3. package/components/ui/accordion.tsx +250 -0
  4. package/components/ui/app-shell.stories.tsx +270 -0
  5. package/components/ui/app-shell.tsx +491 -0
  6. package/components/ui/avatar.stories.tsx +174 -0
  7. package/components/ui/avatar.tsx +257 -0
  8. package/components/ui/badge.stories.tsx +127 -0
  9. package/components/ui/badge.tsx +146 -0
  10. package/components/ui/breadcrumb.stories.tsx +92 -0
  11. package/components/ui/breadcrumb.tsx +302 -0
  12. package/components/ui/button.stories.tsx +186 -0
  13. package/components/ui/button.tsx +128 -0
  14. package/components/ui/card.stories.tsx +279 -0
  15. package/components/ui/card.tsx +250 -0
  16. package/components/ui/checkbox.stories.tsx +93 -0
  17. package/components/ui/checkbox.tsx +131 -0
  18. package/components/ui/combobox.stories.tsx +489 -0
  19. package/components/ui/combobox.tsx +874 -0
  20. package/components/ui/context-menu.stories.tsx +202 -0
  21. package/components/ui/context-menu.tsx +309 -0
  22. package/components/ui/data-table.stories.tsx +227 -0
  23. package/components/ui/data-table.tsx +539 -0
  24. package/components/ui/date-picker.stories.tsx +225 -0
  25. package/components/ui/date-picker.tsx +597 -0
  26. package/components/ui/dialog.stories.tsx +193 -0
  27. package/components/ui/dialog.tsx +262 -0
  28. package/components/ui/divider.stories.tsx +84 -0
  29. package/components/ui/divider.tsx +135 -0
  30. package/components/ui/drawer.stories.tsx +218 -0
  31. package/components/ui/drawer.tsx +329 -0
  32. package/components/ui/dropdown-menu.stories.tsx +270 -0
  33. package/components/ui/dropdown-menu.tsx +353 -0
  34. package/components/ui/empty-state.stories.tsx +121 -0
  35. package/components/ui/empty-state.tsx +289 -0
  36. package/components/ui/field-group.stories.tsx +201 -0
  37. package/components/ui/field-group.tsx +276 -0
  38. package/components/ui/form.stories.tsx +219 -0
  39. package/components/ui/form.tsx +542 -0
  40. package/components/ui/input.stories.tsx +154 -0
  41. package/components/ui/input.tsx +208 -0
  42. package/components/ui/label.stories.tsx +84 -0
  43. package/components/ui/label.tsx +98 -0
  44. package/components/ui/page-header.stories.tsx +136 -0
  45. package/components/ui/page-header.tsx +315 -0
  46. package/components/ui/pagination.stories.tsx +136 -0
  47. package/components/ui/pagination.tsx +427 -0
  48. package/components/ui/popover.stories.tsx +212 -0
  49. package/components/ui/popover.tsx +167 -0
  50. package/components/ui/radio-group.stories.tsx +96 -0
  51. package/components/ui/radio-group.tsx +250 -0
  52. package/components/ui/select.stories.tsx +203 -0
  53. package/components/ui/select.tsx +318 -0
  54. package/components/ui/sidebar.stories.tsx +186 -0
  55. package/components/ui/sidebar.tsx +623 -0
  56. package/components/ui/skeleton.stories.tsx +131 -0
  57. package/components/ui/skeleton.tsx +311 -0
  58. package/components/ui/switch.stories.tsx +74 -0
  59. package/components/ui/switch.tsx +186 -0
  60. package/components/ui/table.stories.tsx +107 -0
  61. package/components/ui/table.tsx +285 -0
  62. package/components/ui/tabs.stories.tsx +222 -0
  63. package/components/ui/tabs.tsx +287 -0
  64. package/components/ui/textarea.stories.tsx +96 -0
  65. package/components/ui/textarea.tsx +182 -0
  66. package/components/ui/toast.stories.tsx +169 -0
  67. package/components/ui/toast.tsx +250 -0
  68. package/components/ui/tooltip.stories.tsx +146 -0
  69. package/components/ui/tooltip.tsx +156 -0
  70. package/components/ui/top-bar.stories.tsx +182 -0
  71. package/components/ui/top-bar.tsx +155 -0
  72. package/dist/components/ui/accordion.d.ts +45 -0
  73. package/dist/components/ui/accordion.d.ts.map +1 -0
  74. package/dist/components/ui/accordion.js +99 -0
  75. package/dist/components/ui/accordion.js.map +1 -0
  76. package/dist/components/ui/app-shell.d.ts +70 -0
  77. package/dist/components/ui/app-shell.d.ts.map +1 -0
  78. package/dist/components/ui/app-shell.js +199 -0
  79. package/dist/components/ui/app-shell.js.map +1 -0
  80. package/dist/components/ui/avatar.d.ts +41 -0
  81. package/dist/components/ui/avatar.d.ts.map +1 -0
  82. package/dist/components/ui/avatar.js +104 -0
  83. package/dist/components/ui/avatar.js.map +1 -0
  84. package/dist/components/ui/badge.d.ts +27 -0
  85. package/dist/components/ui/badge.d.ts.map +1 -0
  86. package/dist/components/ui/badge.js +65 -0
  87. package/dist/components/ui/badge.js.map +1 -0
  88. package/dist/components/ui/breadcrumb.d.ts +35 -0
  89. package/dist/components/ui/breadcrumb.d.ts.map +1 -0
  90. package/dist/components/ui/breadcrumb.js +88 -0
  91. package/dist/components/ui/breadcrumb.js.map +1 -0
  92. package/dist/components/ui/button.d.ts +26 -0
  93. package/dist/components/ui/button.d.ts.map +1 -0
  94. package/dist/components/ui/button.js +73 -0
  95. package/dist/components/ui/button.js.map +1 -0
  96. package/dist/components/ui/card.d.ts +52 -0
  97. package/dist/components/ui/card.d.ts.map +1 -0
  98. package/dist/components/ui/card.js +96 -0
  99. package/dist/components/ui/card.js.map +1 -0
  100. package/dist/components/ui/checkbox.d.ts +18 -0
  101. package/dist/components/ui/checkbox.d.ts.map +1 -0
  102. package/dist/components/ui/checkbox.js +59 -0
  103. package/dist/components/ui/checkbox.js.map +1 -0
  104. package/dist/components/ui/combobox.d.ts +194 -0
  105. package/dist/components/ui/combobox.d.ts.map +1 -0
  106. package/dist/components/ui/combobox.js +361 -0
  107. package/dist/components/ui/combobox.js.map +1 -0
  108. package/dist/components/ui/context-menu.d.ts +46 -0
  109. package/dist/components/ui/context-menu.d.ts.map +1 -0
  110. package/dist/components/ui/context-menu.js +95 -0
  111. package/dist/components/ui/context-menu.js.map +1 -0
  112. package/dist/components/ui/data-table.d.ts +53 -0
  113. package/dist/components/ui/data-table.d.ts.map +1 -0
  114. package/dist/components/ui/data-table.js +163 -0
  115. package/dist/components/ui/data-table.js.map +1 -0
  116. package/dist/components/ui/date-picker.d.ts +103 -0
  117. package/dist/components/ui/date-picker.d.ts.map +1 -0
  118. package/dist/components/ui/date-picker.js +306 -0
  119. package/dist/components/ui/date-picker.js.map +1 -0
  120. package/dist/components/ui/dialog.d.ts +40 -0
  121. package/dist/components/ui/dialog.d.ts.map +1 -0
  122. package/dist/components/ui/dialog.js +110 -0
  123. package/dist/components/ui/dialog.js.map +1 -0
  124. package/dist/components/ui/divider.d.ts +30 -0
  125. package/dist/components/ui/divider.d.ts.map +1 -0
  126. package/dist/components/ui/divider.js +62 -0
  127. package/dist/components/ui/divider.js.map +1 -0
  128. package/dist/components/ui/drawer.d.ts +56 -0
  129. package/dist/components/ui/drawer.d.ts.map +1 -0
  130. package/dist/components/ui/drawer.js +147 -0
  131. package/dist/components/ui/drawer.js.map +1 -0
  132. package/dist/components/ui/dropdown-menu.d.ts +63 -0
  133. package/dist/components/ui/dropdown-menu.d.ts.map +1 -0
  134. package/dist/components/ui/dropdown-menu.js +116 -0
  135. package/dist/components/ui/dropdown-menu.js.map +1 -0
  136. package/dist/components/ui/empty-state.d.ts +43 -0
  137. package/dist/components/ui/empty-state.d.ts.map +1 -0
  138. package/dist/components/ui/empty-state.js +128 -0
  139. package/dist/components/ui/empty-state.js.map +1 -0
  140. package/dist/components/ui/field-group.d.ts +38 -0
  141. package/dist/components/ui/field-group.d.ts.map +1 -0
  142. package/dist/components/ui/field-group.js +107 -0
  143. package/dist/components/ui/field-group.js.map +1 -0
  144. package/dist/components/ui/form.d.ts +67 -0
  145. package/dist/components/ui/form.d.ts.map +1 -0
  146. package/dist/components/ui/form.js +286 -0
  147. package/dist/components/ui/form.js.map +1 -0
  148. package/dist/components/ui/input.d.ts +36 -0
  149. package/dist/components/ui/input.d.ts.map +1 -0
  150. package/dist/components/ui/input.js +99 -0
  151. package/dist/components/ui/input.js.map +1 -0
  152. package/dist/components/ui/label.d.ts +37 -0
  153. package/dist/components/ui/label.d.ts.map +1 -0
  154. package/dist/components/ui/label.js +34 -0
  155. package/dist/components/ui/label.js.map +1 -0
  156. package/dist/components/ui/page-header.d.ts +65 -0
  157. package/dist/components/ui/page-header.d.ts.map +1 -0
  158. package/dist/components/ui/page-header.js +140 -0
  159. package/dist/components/ui/page-header.js.map +1 -0
  160. package/dist/components/ui/pagination.d.ts +67 -0
  161. package/dist/components/ui/pagination.d.ts.map +1 -0
  162. package/dist/components/ui/pagination.js +109 -0
  163. package/dist/components/ui/pagination.js.map +1 -0
  164. package/dist/components/ui/popover.d.ts +28 -0
  165. package/dist/components/ui/popover.d.ts.map +1 -0
  166. package/dist/components/ui/popover.js +85 -0
  167. package/dist/components/ui/popover.js.map +1 -0
  168. package/dist/components/ui/radio-group.d.ts +35 -0
  169. package/dist/components/ui/radio-group.d.ts.map +1 -0
  170. package/dist/components/ui/radio-group.js +103 -0
  171. package/dist/components/ui/radio-group.js.map +1 -0
  172. package/dist/components/ui/select.d.ts +42 -0
  173. package/dist/components/ui/select.d.ts.map +1 -0
  174. package/dist/components/ui/select.js +86 -0
  175. package/dist/components/ui/select.js.map +1 -0
  176. package/dist/components/ui/sidebar.d.ts +59 -0
  177. package/dist/components/ui/sidebar.d.ts.map +1 -0
  178. package/dist/components/ui/sidebar.js +189 -0
  179. package/dist/components/ui/sidebar.js.map +1 -0
  180. package/dist/components/ui/skeleton.d.ts +77 -0
  181. package/dist/components/ui/skeleton.d.ts.map +1 -0
  182. package/dist/components/ui/skeleton.js +115 -0
  183. package/dist/components/ui/skeleton.js.map +1 -0
  184. package/dist/components/ui/switch.d.ts +26 -0
  185. package/dist/components/ui/switch.d.ts.map +1 -0
  186. package/dist/components/ui/switch.js +84 -0
  187. package/dist/components/ui/switch.js.map +1 -0
  188. package/dist/components/ui/table.d.ts +52 -0
  189. package/dist/components/ui/table.d.ts.map +1 -0
  190. package/dist/components/ui/table.js +109 -0
  191. package/dist/components/ui/table.js.map +1 -0
  192. package/dist/components/ui/tabs.d.ts +42 -0
  193. package/dist/components/ui/tabs.d.ts.map +1 -0
  194. package/dist/components/ui/tabs.js +163 -0
  195. package/dist/components/ui/tabs.js.map +1 -0
  196. package/dist/components/ui/textarea.d.ts +26 -0
  197. package/dist/components/ui/textarea.d.ts.map +1 -0
  198. package/dist/components/ui/textarea.js +96 -0
  199. package/dist/components/ui/textarea.js.map +1 -0
  200. package/dist/components/ui/toast.d.ts +77 -0
  201. package/dist/components/ui/toast.d.ts.map +1 -0
  202. package/dist/components/ui/toast.js +141 -0
  203. package/dist/components/ui/toast.js.map +1 -0
  204. package/dist/components/ui/tooltip.d.ts +31 -0
  205. package/dist/components/ui/tooltip.d.ts.map +1 -0
  206. package/dist/components/ui/tooltip.js +71 -0
  207. package/dist/components/ui/tooltip.js.map +1 -0
  208. package/dist/components/ui/top-bar.d.ts +30 -0
  209. package/dist/components/ui/top-bar.d.ts.map +1 -0
  210. package/dist/components/ui/top-bar.js +64 -0
  211. package/dist/components/ui/top-bar.js.map +1 -0
  212. package/dist/lib/utils.d.ts +3 -0
  213. package/dist/lib/utils.d.ts.map +1 -0
  214. package/dist/lib/utils.js +6 -0
  215. package/dist/lib/utils.js.map +1 -0
  216. package/lib/utils.ts +6 -0
  217. package/package.json +112 -0
  218. 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":"AAAA,YAAY,CAAC;;AAEb,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AACvE,OAAO,KAAK,eAAe,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,GAAG,EAAqB,MAAM,0BAA0B,CAAC;AAElE,OAAO,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AACjC,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAKtC,MAAM,aAAa,GAAG,aAAa,CAAqB,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC;AAC9E,MAAM,gBAAgB,GAAG,GAAG,EAAE,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;AAEzD,+EAA+E;AAC/E,4EAA4E;AAC5E,0BAA0B;AAE1B,MAAM,MAAM,GAAG,eAAe,CAAC,IAAI,CAAC;AACpC,MAAM,aAAa,GAAG,eAAe,CAAC,OAAO,CAAC;AAC9C,MAAM,YAAY,GAAG,eAAe,CAAC,MAAM,CAAC;AAC5C,MAAM,WAAW,GAAG,eAAe,CAAC,KAAK,CAAC;AAE1C,+EAA+E;AAC/E,4CAA4C;AAC5C,+EAA+E;AAE/E,MAAM,aAAa,GAAG,UAAU,CAG9B,SAAS,aAAa,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,GAAG;IACnD,OAAO,CACL,KAAC,eAAe,CAAC,OAAO,IACtB,GAAG,EAAE,GAAG,EACR,SAAS,EAAE,EAAE,CACX,wCAAwC,EACxC,4EAA4E,EAC5E,4EAA4E,EAC5E,SAAS,CACV,KACG,KAAK,GACT,CACH,CAAC;AACJ,CAAC,CAAC,CAAC;AACH,aAAa,CAAC,WAAW,GAAG,eAAe,CAAC;AAQ5C,MAAM,qBAAqB,GAAG,GAAG,CAC/B,CAAC,oEAAoE,EAAE,eAAe,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EACjG;IACE,QAAQ,EAAE;QACR,QAAQ,EAAE;YACR,0DAA0D;YAC1D,KAAK,EACH,oCAAoC;gBACpC,yFAAyF;gBACzF,+FAA+F;YACjG,GAAG,EACD,kCAAkC;gBAClC,uFAAuF;gBACvF,6FAA6F;YAC/F,GAAG,EACD,kCAAkC;gBAClC,uFAAuF;gBACvF,6FAA6F;YAC/F,MAAM,EACJ,qCAAqC;gBACrC,0FAA0F;gBAC1F,gGAAgG;SACnG;QACD,IAAI,EAAE;YACJ,EAAE,EAAE,EAAE;YACN,EAAE,EAAE,EAAE;YACN,EAAE,EAAE,EAAE;YACN,EAAE,EAAE,EAAE;YACN,EAAE,EAAE,EAAE;YACN,IAAI,EAAE,EAAE;SACT;KACF;IACD,gBAAgB,EAAE;QAChB,sEAAsE;QACtE,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,aAAa,EAAE;QACvD,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,aAAa,EAAE;QACvD,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,aAAa,EAAE;QACvD,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,aAAa,EAAE;QACvD,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,aAAa,EAAE;QACvD,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE;QACtD,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,aAAa,EAAE;QACrD,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,aAAa,EAAE;QACrD,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,aAAa,EAAE;QACrD,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,aAAa,EAAE;QACrD,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,aAAa,EAAE;QACrD,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE;QACpD,uCAAuC;QACvC,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,aAAa,EAAE;QACrD,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,aAAa,EAAE;QACrD,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,aAAa,EAAE;QACrD,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,aAAa,EAAE;QACrD,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,aAAa,EAAE;QACrD,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE;QACpD,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,aAAa,EAAE;QACxD,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,aAAa,EAAE;QACxD,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,aAAa,EAAE;QACxD,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,aAAa,EAAE;QACxD,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,aAAa,EAAE;QACxD,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE;KACxD;IACD,eAAe,EAAE;QACf,QAAQ,EAAE,KAAK;QACf,IAAI,EAAE,IAAI;KACX;CACF,CACF,CAAC;AAqBF,MAAM,aAAa,GAAG,UAAU,CAG9B,SAAS,aAAa,CACtB,EACE,SAAS,EACT,QAAQ,EACR,IAAI,EACJ,mBAAmB,GAAG,IAAI,EAC1B,aAAa,GAAG,IAAI,EACpB,kBAAkB,EAClB,OAAO,GAAG,KAAK,EACf,UAAU,GAAG,IAAI,EACjB,eAAe,GAAG,KAAK,EACvB,WAAW,GAAG,IAAI,EAClB,oBAAoB,EACpB,eAAe,EACf,iBAAiB,EACjB,QAAQ,EACR,GAAG,KAAK,EACT,EACD,GAAG;IAEH,MAAM,YAAY,GAAG,KAAK,EAAE,CAAQ,EAAiB,EAAE;QACrD,IAAI,CAAC,kBAAkB;YAAE,OAAO;QAChC,IAAI,OAAO,kBAAkB,KAAK,UAAU,EAAE,CAAC;YAC7C,MAAM,EAAE,GAAG,MAAM,kBAAkB,EAAE,CAAC;YACtC,IAAI,CAAC,EAAE;gBAAE,CAAC,CAAC,cAAc,EAAE,CAAC;YAC5B,OAAO;QACT,CAAC;QACD,MAAM,EAAE,GAAG,MAAM,CAAC,OAAO,CAAC,0BAA0B,CAAC,CAAC;QACtD,IAAI,CAAC,EAAE;YAAE,CAAC,CAAC,cAAc,EAAE,CAAC;IAC9B,CAAC,CAAC;IAEF,MAAM,iBAAiB,GAAG,WAAW,IAAI,mBAAmB,CAAC;IAC7D,MAAM,WAAW,GAAG,WAAW,IAAI,aAAa,CAAC;IAEjD,MAAM,SAAS,GAAG,OAAO,CAAqB,GAAG,EAAE,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC;IAEpF,OAAO,CACL,KAAC,aAAa,CAAC,QAAQ,IAAC,KAAK,EAAE,SAAS,YACtC,MAAC,YAAY,eACX,KAAC,aAAa,KAAG,EACjB,MAAC,eAAe,CAAC,OAAO,IACtB,GAAG,EAAE,GAAG,EACR,oBAAoB,EAAE,CAAC,CAAC,EAAE,EAAE;wBAC1B,IAAI,CAAC,iBAAiB;4BAAE,CAAC,CAAC,cAAc,EAAE,CAAC;wBAC3C,oBAAoB,EAAE,CAAC,CAAC,CAAC,CAAC;oBAC5B,CAAC,EACD,eAAe,EAAE,CAAC,CAAC,EAAE,EAAE;wBACrB,IAAI,CAAC,WAAW;4BAAE,CAAC,CAAC,cAAc,EAAE,CAAC;wBACrC,eAAe,EAAE,CAAC,CAAC,CAAC,CAAC;oBACvB,CAAC,EACD,iBAAiB,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;wBAC7B,IAAI,kBAAkB,IAAI,iBAAiB,EAAE,CAAC;4BAC5C,MAAM,YAAY,CAAC,CAAqB,CAAC,CAAC;wBAC5C,CAAC;wBACD,iBAAiB,EAAE,CAAC,CAAC,CAAC,CAAC;oBACzB,CAAC,EACD,SAAS,EAAE,EAAE,CAAC,qBAAqB,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,EAAE,SAAS,CAAC,KAC/D,KAAK,aAER,OAAO,CAAC,CAAC,CAAC,CACT,eAAK,SAAS,EAAC,eAAe,eAAW,MAAM,eAAW,QAAQ,aAChE,KAAC,QAAQ,IAAC,SAAS,EAAC,WAAW,GAAG,EAClC,KAAC,QAAQ,IAAC,SAAS,EAAC,WAAW,GAAG,EAClC,KAAC,QAAQ,IAAC,SAAS,EAAC,YAAY,GAAG,EACnC,KAAC,QAAQ,IAAC,SAAS,EAAC,aAAa,GAAG,EACpC,KAAC,QAAQ,IAAC,SAAS,EAAC,WAAW,GAAG,IAC9B,CACP,CAAC,CAAC,CAAC,CACF,QAAQ,CACT,EAEA,WAAW,IAAI,CAAC,eAAe,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAC7C,KAAC,eAAe,CAAC,KAAK,kBACT,OAAO,EAClB,SAAS,EAAE,EAAE,CACX,gFAAgF,EAChF,oEAAoE,EACpE,0IAA0I,EAC1I,iCAAiC,CAClC,YAED,KAAC,WAAW,KAAG,GACO,CACzB,CAAC,CAAC,CAAC,IAAI,IAKgB,IACb,GACQ,CAC1B,CAAC;AACJ,CAAC,CAAC,CAAC;AACH,aAAa,CAAC,WAAW,GAAG,eAAe,CAAC;AAE5C,+EAA+E;AAC/E,qDAAqD;AACrD,+EAA+E;AAE/E,MAAM,YAAY,GAAG,UAAU,CAC7B,SAAS,YAAY,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,GAAG;IAChD,OAAO,CACL,cAAK,GAAG,EAAE,GAAG,EAAE,SAAS,EAAE,EAAE,CAAC,kCAAkC,EAAE,SAAS,CAAC,KAAM,KAAK,GAAI,CAC3F,CAAC;AACJ,CAAC,CACF,CAAC;AACF,YAAY,CAAC,WAAW,GAAG,cAAc,CAAC;AAE1C,MAAM,WAAW,GAAG,UAAU,CAG5B,SAAS,WAAW,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,GAAG;IACjD,OAAO,CACL,KAAC,eAAe,CAAC,KAAK,IACpB,GAAG,EAAE,GAAG,EACR,SAAS,EAAE,EAAE,CAAC,mDAAmD,EAAE,SAAS,CAAC,KACzE,KAAK,GACT,CACH,CAAC;AACJ,CAAC,CAAC,CAAC;AACH,WAAW,CAAC,WAAW,GAAG,aAAa,CAAC;AAExC,MAAM,iBAAiB,GAAG,UAAU,CAGlC,SAAS,iBAAiB,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,GAAG;IACvD,OAAO,CACL,KAAC,eAAe,CAAC,WAAW,IAC1B,GAAG,EAAE,GAAG,EACR,SAAS,EAAE,EAAE,CAAC,+BAA+B,EAAE,SAAS,CAAC,KACrD,KAAK,GACT,CACH,CAAC;AACJ,CAAC,CAAC,CAAC;AACH,iBAAiB,CAAC,WAAW,GAAG,mBAAmB,CAAC;AAEpD;;;;GAIG;AACH,MAAM,UAAU,GAAG,UAAU,CAC3B,SAAS,UAAU,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,GAAG;IAC9C,MAAM,EAAE,UAAU,EAAE,GAAG,gBAAgB,EAAE,CAAC;IAC1C,OAAO,CACL,cACE,GAAG,EAAE,GAAG,EACR,SAAS,EAAE,EAAE,CAAC,kBAAkB,EAAE,UAAU,IAAI,iBAAiB,EAAE,SAAS,CAAC,KACzE,KAAK,GACT,CACH,CAAC;AACJ,CAAC,CACF,CAAC;AACF,UAAU,CAAC,WAAW,GAAG,YAAY,CAAC;AAEtC,MAAM,YAAY,GAAG,UAAU,CAC7B,SAAS,YAAY,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,GAAG;IAChD,OAAO,CACL,cACE,GAAG,EAAE,GAAG,EACR,SAAS,EAAE,EAAE,CACX,iHAAiH,EACjH,SAAS,CACV,KACG,KAAK,GACT,CACH,CAAC;AACJ,CAAC,CACF,CAAC;AACF,YAAY,CAAC,WAAW,GAAG,cAAc,CAAC;AAE1C,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"}
@@ -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