@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,70 @@
1
+ import { type ReactNode } from "react";
2
+ import { type VariantProps } from "class-variance-authority";
3
+ type AppShellVariant = "default" | "header-only" | "sidebar-only" | "minimal";
4
+ type SidebarPosition = "start" | "end";
5
+ type SidebarWidthToken = "sm" | "md" | "lg";
6
+ type HeaderHeightToken = "sm" | "md" | "lg";
7
+ type Breakpoint = "sm" | "md" | "lg";
8
+ interface AppShellContextValue {
9
+ variant: AppShellVariant;
10
+ sidebarPosition: SidebarPosition;
11
+ sidebarWidthPx: number;
12
+ collapsedWidthPx: number;
13
+ headerHeightPx: number;
14
+ sidebarBreakpoint: Breakpoint;
15
+ stickyHeader: boolean;
16
+ bordered: boolean;
17
+ /** True when inline sidebar is in icon-only mode (desktop). */
18
+ sidebarCollapsed: boolean;
19
+ setSidebarCollapsed: (collapsed: boolean) => void;
20
+ /** True when mobile drawer is open. */
21
+ sidebarOpen: boolean;
22
+ setSidebarOpen: (open: boolean) => void;
23
+ mainId: string;
24
+ }
25
+ /** Read AppShell state from any descendant. */
26
+ declare function useAppShell(): AppShellContextValue;
27
+ declare const appShellRootVariants: (props?: ({
28
+ bordered?: boolean | null | undefined;
29
+ } & import("class-variance-authority/types").ClassProp) | undefined) => string;
30
+ type AppShellRootVariants = VariantProps<typeof appShellRootVariants>;
31
+ type AppShellProps = Omit<React.HTMLAttributes<HTMLDivElement>, "children"> & AppShellRootVariants & {
32
+ variant?: AppShellVariant;
33
+ sidebarPosition?: SidebarPosition;
34
+ sidebarWidth?: SidebarWidthToken | number;
35
+ headerHeight?: HeaderHeightToken | number;
36
+ sidebarCollapsed?: boolean;
37
+ defaultSidebarCollapsed?: boolean;
38
+ onSidebarCollapsedChange?: (collapsed: boolean) => void;
39
+ sidebarBreakpoint?: Breakpoint;
40
+ stickyHeader?: boolean;
41
+ /** aria-label for the auto-injected hamburger button. Default "Open navigation". */
42
+ sidebarOpenLabel?: string;
43
+ /** Localized text for the skip link. Default "Skip to main content". */
44
+ skipLinkLabel?: string;
45
+ children?: ReactNode;
46
+ };
47
+ declare const AppShell: import("react").ForwardRefExoticComponent<Omit<import("react").HTMLAttributes<HTMLDivElement>, "children"> & AppShellRootVariants & {
48
+ variant?: AppShellVariant;
49
+ sidebarPosition?: SidebarPosition;
50
+ sidebarWidth?: SidebarWidthToken | number;
51
+ headerHeight?: HeaderHeightToken | number;
52
+ sidebarCollapsed?: boolean;
53
+ defaultSidebarCollapsed?: boolean;
54
+ onSidebarCollapsedChange?: (collapsed: boolean) => void;
55
+ sidebarBreakpoint?: Breakpoint;
56
+ stickyHeader?: boolean;
57
+ /** aria-label for the auto-injected hamburger button. Default "Open navigation". */
58
+ sidebarOpenLabel?: string;
59
+ /** Localized text for the skip link. Default "Skip to main content". */
60
+ skipLinkLabel?: string;
61
+ children?: ReactNode;
62
+ } & import("react").RefAttributes<HTMLDivElement>>;
63
+ declare const AppShellHeader: import("react").ForwardRefExoticComponent<import("react").HTMLAttributes<HTMLElement> & import("react").RefAttributes<HTMLElement>>;
64
+ declare const AppShellSidebar: import("react").ForwardRefExoticComponent<import("react").HTMLAttributes<HTMLElement> & import("react").RefAttributes<HTMLElement>>;
65
+ declare const AppShellMain: import("react").ForwardRefExoticComponent<import("react").HTMLAttributes<HTMLElement> & import("react").RefAttributes<HTMLElement>>;
66
+ declare const AppShellFooter: import("react").ForwardRefExoticComponent<import("react").HTMLAttributes<HTMLElement> & import("react").RefAttributes<HTMLElement>>;
67
+ declare const AppShellLayout: import("react").ForwardRefExoticComponent<import("react").HTMLAttributes<HTMLDivElement> & import("react").RefAttributes<HTMLDivElement>>;
68
+ export { AppShell, AppShellHeader, AppShellSidebar, AppShellMain, AppShellFooter, AppShellLayout, useAppShell, };
69
+ export type { AppShellProps, AppShellVariant, SidebarPosition, AppShellContextValue };
70
+ //# sourceMappingURL=app-shell.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app-shell.d.ts","sourceRoot":"","sources":["../../../components/ui/app-shell.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,199 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
+ import { createContext, forwardRef, useCallback, useContext, useEffect, useId, useMemo, useState, } from "react";
4
+ import { RiMenuLine } from "@remixicon/react";
5
+ import { cva } from "class-variance-authority";
6
+ import { cn } from "@/lib/utils";
7
+ import { Button } from "./button";
8
+ import { Drawer, DrawerContent, DrawerOverlay, DrawerPortal } from "./drawer";
9
+ import { TooltipProvider } from "./tooltip";
10
+ // Resolved px sizes (kept in TS so we can drive CSS variables for use in
11
+ // transitions and Drawer fallback width).
12
+ const SIDEBAR_WIDTH_PX = {
13
+ sm: 200,
14
+ md: 240,
15
+ lg: 280,
16
+ };
17
+ const SIDEBAR_COLLAPSED_WIDTH_PX = 64;
18
+ const HEADER_HEIGHT_PX = {
19
+ sm: 48,
20
+ md: 56,
21
+ lg: 64,
22
+ };
23
+ // Tailwind class fragments for each breakpoint (typed to keep `min-w-` arbitrary
24
+ // values out so the JIT only emits what we use).
25
+ const BREAKPOINT_MIN_WIDTH_CLASS = {
26
+ sm: "min-[640px]:flex",
27
+ md: "min-[768px]:flex",
28
+ lg: "min-[1024px]:flex",
29
+ };
30
+ const BREAKPOINT_HIDE_BELOW_CLASS = {
31
+ sm: "max-[639px]:hidden",
32
+ md: "max-[767px]:hidden",
33
+ lg: "max-[1023px]:hidden",
34
+ };
35
+ const BREAKPOINT_SHOW_TRIGGER_BELOW_CLASS = {
36
+ // Hamburger button appears below the breakpoint.
37
+ sm: "min-[640px]:hidden",
38
+ md: "min-[768px]:hidden",
39
+ lg: "min-[1024px]:hidden",
40
+ };
41
+ const AppShellContext = createContext(null);
42
+ /** Read AppShell state from any descendant. */
43
+ function useAppShell() {
44
+ const ctx = useContext(AppShellContext);
45
+ if (!ctx)
46
+ throw new Error("useAppShell must be used inside <AppShell>");
47
+ return ctx;
48
+ }
49
+ // ===========================================================================
50
+ // Skip link
51
+ // ===========================================================================
52
+ function SkipLink({ targetId, label = "Skip to main content", }) {
53
+ return (_jsx("a", { href: `#${targetId}`, className: cn("sr-only focus:not-sr-only", "focus:z-overlay focus:fixed focus:inset-s-2 focus:top-2", "focus:bg-primary focus:rounded-md focus:px-3 focus:py-2", "focus:text-primary-foreground focus:shadow-md", "focus:ring-ring focus:ring-offset-background focus:ring-2 focus:ring-offset-2 focus:outline-none"), children: label }));
54
+ }
55
+ // ===========================================================================
56
+ // Root
57
+ // ===========================================================================
58
+ const appShellRootVariants = cva("min-h-dvh w-full bg-background text-foreground", {
59
+ variants: {
60
+ bordered: { true: "", false: "" },
61
+ },
62
+ defaultVariants: { bordered: false },
63
+ });
64
+ const AppShell = forwardRef(function AppShell({ className, variant = "default", sidebarPosition = "start", sidebarWidth = "md", headerHeight = "md", sidebarCollapsed: controlledCollapsed, defaultSidebarCollapsed = false, onSidebarCollapsedChange, sidebarBreakpoint = "md", stickyHeader = true, bordered = false, sidebarOpenLabel = "Open navigation", skipLinkLabel = "Skip to main content", children, ...props }, ref) {
65
+ const mainId = useId();
66
+ // Collapsed state (controlled / uncontrolled)
67
+ const [uncontrolledCollapsed, setUncontrolledCollapsed] = useState(defaultSidebarCollapsed);
68
+ const collapsedIsControlled = controlledCollapsed !== undefined;
69
+ const sidebarCollapsed = collapsedIsControlled ? controlledCollapsed : uncontrolledCollapsed;
70
+ const setSidebarCollapsed = useCallback((next) => {
71
+ if (!collapsedIsControlled)
72
+ setUncontrolledCollapsed(next);
73
+ onSidebarCollapsedChange?.(next);
74
+ }, [collapsedIsControlled, onSidebarCollapsedChange]);
75
+ // Mobile drawer open state
76
+ const [sidebarOpen, setSidebarOpen] = useState(false);
77
+ // Resolve widths/heights to px values
78
+ const sidebarWidthPx = typeof sidebarWidth === "number" ? sidebarWidth : SIDEBAR_WIDTH_PX[sidebarWidth];
79
+ const headerHeightPx = typeof headerHeight === "number" ? headerHeight : HEADER_HEIGHT_PX[headerHeight];
80
+ const ctx = useMemo(() => ({
81
+ variant,
82
+ sidebarPosition,
83
+ sidebarWidthPx,
84
+ collapsedWidthPx: SIDEBAR_COLLAPSED_WIDTH_PX,
85
+ headerHeightPx,
86
+ sidebarBreakpoint,
87
+ stickyHeader,
88
+ bordered: Boolean(bordered),
89
+ sidebarCollapsed,
90
+ setSidebarCollapsed,
91
+ sidebarOpen,
92
+ setSidebarOpen,
93
+ mainId,
94
+ }), [
95
+ variant,
96
+ sidebarPosition,
97
+ sidebarWidthPx,
98
+ headerHeightPx,
99
+ sidebarBreakpoint,
100
+ stickyHeader,
101
+ bordered,
102
+ sidebarCollapsed,
103
+ setSidebarCollapsed,
104
+ sidebarOpen,
105
+ mainId,
106
+ ]);
107
+ // Auto-close the mobile drawer when the viewport widens above the breakpoint.
108
+ useEffect(() => {
109
+ if (typeof window === "undefined" || typeof window.matchMedia !== "function")
110
+ return;
111
+ const min = sidebarBreakpoint === "sm" ? 640 : sidebarBreakpoint === "md" ? 768 : 1024;
112
+ const mql = window.matchMedia(`(min-width: ${min}px)`);
113
+ const onChange = () => {
114
+ if (mql.matches)
115
+ setSidebarOpen(false);
116
+ };
117
+ mql.addEventListener("change", onChange);
118
+ return () => mql.removeEventListener("change", onChange);
119
+ }, [sidebarBreakpoint]);
120
+ const hasSidebar = variant === "default" || variant === "sidebar-only";
121
+ const hasHeader = variant === "default" || variant === "header-only";
122
+ // Style: CSS variables for inline sidebar/header sizing so children can
123
+ // refer to them (e.g. drawer fallback width, content offset).
124
+ const style = {
125
+ "--app-shell-sidebar-width": `${sidebarWidthPx}px`,
126
+ "--app-shell-sidebar-collapsed-width": `${SIDEBAR_COLLAPSED_WIDTH_PX}px`,
127
+ "--app-shell-header-height": `${headerHeightPx}px`,
128
+ ...props.style,
129
+ };
130
+ return (_jsx(AppShellContext.Provider, { value: ctx, children: _jsx(TooltipProvider, { delayDuration: 200, children: _jsxs("div", { ref: ref, "data-slot": "app-shell", "data-variant": variant, "data-sidebar-position": hasSidebar ? sidebarPosition : undefined, className: cn(appShellRootVariants({ bordered }), className), style: style, ...props, children: [_jsx(SkipLink, { targetId: mainId, label: skipLinkLabel }), children, hasSidebar && hasHeader ? (_jsx(Button, { variant: "ghost", size: "icon-sm", "aria-label": sidebarOpenLabel, onClick: () => setSidebarOpen(true), className: cn("z-fixed fixed top-2", sidebarPosition === "start" ? "inset-s-2" : "inset-e-2", BREAKPOINT_SHOW_TRIGGER_BELOW_CLASS[sidebarBreakpoint]), children: _jsx(RiMenuLine, {}) })) : null] }) }) }));
131
+ });
132
+ AppShell.displayName = "AppShell";
133
+ // ===========================================================================
134
+ // Slots
135
+ // ===========================================================================
136
+ const AppShellHeader = forwardRef(function AppShellHeader({ className, ...props }, ref) {
137
+ const { stickyHeader, bordered, headerHeightPx, variant } = useAppShell();
138
+ if (variant === "sidebar-only" || variant === "minimal")
139
+ return null;
140
+ return (_jsx("header", { ref: ref, role: "banner", "data-slot": "app-shell-header", className: cn("bg-background z-sticky flex w-full items-center", stickyHeader && "sticky top-0", bordered && "border-border border-b", className), style: { height: headerHeightPx }, ...props }));
141
+ });
142
+ AppShellHeader.displayName = "AppShellHeader";
143
+ const AppShellSidebar = forwardRef(function AppShellSidebar({ className, children, ...props }, ref) {
144
+ const { variant, sidebarPosition, sidebarCollapsed, sidebarBreakpoint, bordered, sidebarWidthPx, collapsedWidthPx, sidebarOpen, setSidebarOpen, headerHeightPx, stickyHeader, } = useAppShell();
145
+ if (variant === "header-only" || variant === "minimal")
146
+ return null;
147
+ const widthPx = sidebarCollapsed ? collapsedWidthPx : sidebarWidthPx;
148
+ const showInlineAtClass = BREAKPOINT_MIN_WIDTH_CLASS[sidebarBreakpoint];
149
+ const hideBelowClass = BREAKPOINT_HIDE_BELOW_CLASS[sidebarBreakpoint];
150
+ return (_jsxs(_Fragment, { children: [_jsx("aside", { ref: ref, "data-slot": "app-shell-sidebar", "data-position": sidebarPosition, className: cn("hidden flex-col",
151
+ // Show inline only above the breakpoint.
152
+ showInlineAtClass, hideBelowClass,
153
+ // Pinned to the side; respects sticky header by offsetting top.
154
+ stickyHeader ? "sticky" : "", bordered &&
155
+ (sidebarPosition === "start" ? "border-border border-e" : "border-border border-s"), className), style: {
156
+ width: widthPx,
157
+ transition: "width var(--duration-normal)",
158
+ ...(stickyHeader
159
+ ? { top: headerHeightPx, height: `calc(100dvh - ${headerHeightPx}px)` }
160
+ : { height: "100dvh" }),
161
+ // Use logical order to put sidebar on the start/end side.
162
+ order: sidebarPosition === "start" ? 0 : 2,
163
+ }, ...props, children: children }), _jsx(MobileSidebarPortal, { open: sidebarOpen, onOpenChange: setSidebarOpen, position: sidebarPosition, children: children })] }));
164
+ });
165
+ AppShellSidebar.displayName = "AppShellSidebar";
166
+ function MobileSidebarPortal({ open, onOpenChange, position, children, }) {
167
+ return (_jsx(Drawer, { open: open, onOpenChange: onOpenChange, children: _jsxs(DrawerPortal, { children: [_jsx(DrawerOverlay, {}), _jsx(DrawerContent, { position: position, size: "sm", "aria-label": "Navigation", className: "p-0", children: children })] }) }));
168
+ }
169
+ const AppShellMain = forwardRef(function AppShellMain({ className, ...props }, ref) {
170
+ const { mainId, sidebarPosition, variant } = useAppShell();
171
+ const hasSidebar = variant === "default" || variant === "sidebar-only";
172
+ return (_jsx("main", { ref: ref, id: mainId, role: "main", "data-slot": "app-shell-main", className: cn("min-w-0 flex-1 overflow-x-hidden focus:outline-none", className), style: hasSidebar ? { order: sidebarPosition === "start" ? 1 : 1 } : undefined,
173
+ // Focus the main on programmatic navigation (skip link target).
174
+ tabIndex: -1, ...props }));
175
+ });
176
+ AppShellMain.displayName = "AppShellMain";
177
+ const AppShellFooter = forwardRef(function AppShellFooter({ className, ...props }, ref) {
178
+ const { variant, bordered } = useAppShell();
179
+ if (variant === "minimal") {
180
+ // Minimal still allows a footer.
181
+ }
182
+ return (_jsx("footer", { ref: ref, role: "contentinfo", "data-slot": "app-shell-footer", className: cn("bg-background w-full", bordered && "border-border border-t", className), style: { order: 3 }, ...props }));
183
+ });
184
+ AppShellFooter.displayName = "AppShellFooter";
185
+ // ===========================================================================
186
+ // Layout container (auto-injected: when AppShell variants need it, consumers
187
+ // can wrap their Header+Sidebar+Main+Footer in <AppShellLayout> for proper
188
+ // flex/grid composition).
189
+ // ===========================================================================
190
+ const AppShellLayout = forwardRef(function AppShellLayout({ className, ...props }, ref) {
191
+ const { variant } = useAppShell();
192
+ // For default/sidebar-only: lay out header on top + (sidebar | main) row.
193
+ // We use a simple flex column with header sticky and a row inside via order tricks.
194
+ // Easiest: grid template based on variant.
195
+ return (_jsx("div", { ref: ref, "data-slot": "app-shell-layout", className: cn("flex w-full", variant === "header-only" || variant === "minimal" ? "min-h-dvh flex-col" : "min-h-dvh", className), ...props }));
196
+ });
197
+ AppShellLayout.displayName = "AppShellLayout";
198
+ export { AppShell, AppShellHeader, AppShellSidebar, AppShellMain, AppShellFooter, AppShellLayout, useAppShell, };
199
+ //# sourceMappingURL=app-shell.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app-shell.js","sourceRoot":"","sources":["../../../components/ui/app-shell.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ import * as AvatarPrimitive from "@radix-ui/react-avatar";
2
+ import { type VariantProps } from "class-variance-authority";
3
+ type Size = "xs" | "sm" | "md" | "lg" | "xl" | "2xl";
4
+ declare const avatarVariants: (props?: ({
5
+ shape?: "circle" | "rounded" | null | undefined;
6
+ } & import("class-variance-authority/types").ClassProp) | undefined) => string;
7
+ type Status = "online" | "offline" | "busy" | "away" | "none";
8
+ type AvatarProps = Omit<React.ComponentPropsWithoutRef<typeof AvatarPrimitive.Root>, "asChild"> & VariantProps<typeof avatarVariants> & {
9
+ size?: Size;
10
+ status?: Status;
11
+ statusPosition?: "top-end" | "bottom-end";
12
+ };
13
+ declare const Avatar: import("react").ForwardRefExoticComponent<Omit<Omit<AvatarPrimitive.AvatarProps & import("react").RefAttributes<HTMLSpanElement>, "ref">, "asChild"> & VariantProps<(props?: ({
14
+ shape?: "circle" | "rounded" | null | undefined;
15
+ } & import("class-variance-authority/types").ClassProp) | undefined) => string> & {
16
+ size?: Size;
17
+ status?: Status;
18
+ statusPosition?: "top-end" | "bottom-end";
19
+ } & import("react").RefAttributes<HTMLSpanElement>>;
20
+ declare const AvatarImage: import("react").ForwardRefExoticComponent<Omit<AvatarPrimitive.AvatarImageProps & import("react").RefAttributes<HTMLImageElement>, "ref"> & import("react").RefAttributes<HTMLImageElement>>;
21
+ type AvatarFallbackProps = React.ComponentPropsWithoutRef<typeof AvatarPrimitive.Fallback> & {
22
+ size?: Size;
23
+ };
24
+ declare const AvatarFallback: import("react").ForwardRefExoticComponent<Omit<AvatarPrimitive.AvatarFallbackProps & import("react").RefAttributes<HTMLSpanElement>, "ref"> & {
25
+ size?: Size;
26
+ } & import("react").RefAttributes<HTMLSpanElement>>;
27
+ type AvatarGroupProps = Omit<React.HTMLAttributes<HTMLDivElement>, "children"> & {
28
+ size?: Size;
29
+ spacing?: "tight" | "normal" | "loose";
30
+ max?: number;
31
+ children: React.ReactNode;
32
+ };
33
+ declare const AvatarGroup: import("react").ForwardRefExoticComponent<Omit<import("react").HTMLAttributes<HTMLDivElement>, "children"> & {
34
+ size?: Size;
35
+ spacing?: "tight" | "normal" | "loose";
36
+ max?: number;
37
+ children: React.ReactNode;
38
+ } & import("react").RefAttributes<HTMLDivElement>>;
39
+ export { Avatar, AvatarImage, AvatarFallback, AvatarGroup };
40
+ export type { AvatarProps, AvatarFallbackProps, AvatarGroupProps };
41
+ //# sourceMappingURL=avatar.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"avatar.d.ts","sourceRoot":"","sources":["../../../components/ui/avatar.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,eAAe,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAO,KAAK,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAWlE,KAAK,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,KAAK,CAAC;AAwDrD,QAAA,MAAM,cAAc;;8EAanB,CAAC;AAEF,KAAK,MAAM,GAAG,QAAQ,GAAG,SAAS,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;AAgB9D,KAAK,WAAW,GAAG,IAAI,CACrB,KAAK,CAAC,wBAAwB,CAAC,OAAO,eAAe,CAAC,IAAI,CAAC,EAC3D,SAAS,CACV,GACC,YAAY,CAAC,OAAO,cAAc,CAAC,GAAG;IACpC,IAAI,CAAC,EAAE,IAAI,CAAC;IACZ,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,cAAc,CAAC,EAAE,SAAS,GAAG,YAAY,CAAC;CAC3C,CAAC;AAEJ,QAAA,MAAM,MAAM;;;WALD,IAAI;aACF,MAAM;qBACE,SAAS,GAAG,YAAY;mDA0C3C,CAAC;AAOH,QAAA,MAAM,WAAW,8LAYf,CAAC;AAGH,KAAK,mBAAmB,GAAG,KAAK,CAAC,wBAAwB,CAAC,OAAO,eAAe,CAAC,QAAQ,CAAC,GAAG;IAC3F,IAAI,CAAC,EAAE,IAAI,CAAC;CACb,CAAC;AAEF,QAAA,MAAM,cAAc;WAHX,IAAI;mDAoBX,CAAC;AAOH,KAAK,gBAAgB,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,cAAc,CAAC,EAAE,UAAU,CAAC,GAAG;IAC/E,IAAI,CAAC,EAAE,IAAI,CAAC;IACZ,OAAO,CAAC,EAAE,OAAO,GAAG,QAAQ,GAAG,OAAO,CAAC;IACvC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;CAC3B,CAAC;AASF,QAAA,MAAM,WAAW;WAbR,IAAI;cACD,OAAO,GAAG,QAAQ,GAAG,OAAO;UAChC,MAAM;cACF,KAAK,CAAC,SAAS;kDA+CzB,CAAC;AAGH,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,cAAc,EAAE,WAAW,EAAE,CAAC;AAC5D,YAAY,EAAE,WAAW,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,CAAC"}
@@ -0,0 +1,104 @@
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 AvatarPrimitive from "@radix-ui/react-avatar";
5
+ import { cva } from "class-variance-authority";
6
+ import { cn } from "@/lib/utils";
7
+ const SIZE_TO_DIM = {
8
+ xs: 24,
9
+ sm: 32,
10
+ md: 40,
11
+ lg: 48,
12
+ xl: 64,
13
+ "2xl": 96,
14
+ };
15
+ const avatarSizeClass = {
16
+ xs: "size-6",
17
+ sm: "size-8",
18
+ md: "size-10",
19
+ lg: "size-12",
20
+ xl: "size-16",
21
+ "2xl": "size-24",
22
+ };
23
+ const statusDotSize = {
24
+ xs: "size-1.5",
25
+ sm: "size-2",
26
+ md: "size-2.5",
27
+ lg: "size-3",
28
+ xl: "size-3.5",
29
+ "2xl": "size-4",
30
+ };
31
+ const fallbackTextSize = {
32
+ xs: "text-[10px]",
33
+ sm: "text-xs",
34
+ md: "text-sm",
35
+ lg: "text-base",
36
+ xl: "text-lg",
37
+ "2xl": "text-2xl",
38
+ };
39
+ const AvatarGroupContext = createContext(null);
40
+ function useAvatarGroupSize() {
41
+ return useContext(AvatarGroupContext)?.size;
42
+ }
43
+ // ----------------------------------------------------------------------------
44
+ // Avatar (root)
45
+ // ----------------------------------------------------------------------------
46
+ const avatarVariants = cva("relative inline-flex shrink-0 overflow-hidden border-2 border-background bg-muted text-muted-foreground", {
47
+ variants: {
48
+ shape: {
49
+ circle: "rounded-full",
50
+ rounded: "rounded-md",
51
+ },
52
+ },
53
+ defaultVariants: {
54
+ shape: "circle",
55
+ },
56
+ });
57
+ const statusLabel = {
58
+ online: "Online",
59
+ offline: "Offline",
60
+ busy: "Busy",
61
+ away: "Away",
62
+ };
63
+ const statusBgClass = {
64
+ online: "bg-success",
65
+ offline: "bg-muted-foreground",
66
+ busy: "bg-destructive",
67
+ away: "bg-warning",
68
+ };
69
+ const Avatar = forwardRef(function Avatar({ className, size, shape, status = "none", statusPosition = "bottom-end", children, ...props }, ref) {
70
+ const groupSize = useAvatarGroupSize();
71
+ const resolvedSize = size ?? groupSize ?? "md";
72
+ return (_jsxs(AvatarPrimitive.Root, { ref: ref, className: cn(avatarVariants({ shape }), avatarSizeClass[resolvedSize], className), ...props, children: [children, status !== "none" ? (_jsx("span", { "aria-hidden": "true", className: cn("absolute block rounded-full ring-2 ring-background", statusBgClass[status], statusDotSize[resolvedSize], statusPosition === "top-end" ? "top-0 end-0" : "bottom-0 end-0") })) : null, status !== "none" ? _jsx("span", { className: "sr-only", children: statusLabel[status] }) : null] }));
73
+ });
74
+ Avatar.displayName = "Avatar";
75
+ // ----------------------------------------------------------------------------
76
+ // AvatarImage / AvatarFallback — thin Radix wrappers with default classes.
77
+ // ----------------------------------------------------------------------------
78
+ const AvatarImage = forwardRef(function AvatarImage({ className, alt, ...props }, ref) {
79
+ return (_jsx(AvatarPrimitive.Image, { ref: ref, alt: alt, className: cn("aspect-square h-full w-full object-cover", className), ...props }));
80
+ });
81
+ AvatarImage.displayName = "AvatarImage";
82
+ const AvatarFallback = forwardRef(function AvatarFallback({ className, size, ...props }, ref) {
83
+ const groupSize = useAvatarGroupSize();
84
+ const resolved = size ?? groupSize ?? "md";
85
+ return (_jsx(AvatarPrimitive.Fallback, { ref: ref, className: cn("flex h-full w-full items-center justify-center bg-muted font-medium text-muted-foreground select-none", fallbackTextSize[resolved], className), ...props }));
86
+ });
87
+ AvatarFallback.displayName = "AvatarFallback";
88
+ const spacingMargin = {
89
+ // Negative margin-inline-start — RTL flips automatically.
90
+ tight: "[&>*+*]:-ms-3",
91
+ normal: "[&>*+*]:-ms-2",
92
+ loose: "[&>*+*]:-ms-1",
93
+ };
94
+ const AvatarGroup = forwardRef(function AvatarGroup({ className, size, spacing = "normal", max, children, ...props }, ref) {
95
+ const ctx = useMemo(() => ({ size }), [size]);
96
+ const items = (Array.isArray(children) ? children : [children]).filter(Boolean);
97
+ const visible = max !== undefined ? items.slice(0, max) : items;
98
+ const hidden = max !== undefined ? Math.max(0, items.length - max) : 0;
99
+ const dim = SIZE_TO_DIM[size ?? "md"];
100
+ return (_jsx(AvatarGroupContext.Provider, { value: ctx, children: _jsxs("div", { ref: ref, className: cn("inline-flex isolate", spacingMargin[spacing], className), ...props, children: [visible, hidden > 0 ? (_jsxs("span", { role: "status", "aria-label": `${hidden} more`, className: cn("relative inline-flex shrink-0 items-center justify-center rounded-full", "border-2 border-background bg-muted text-muted-foreground font-medium", avatarSizeClass[size ?? "md"], fallbackTextSize[size ?? "md"]), style: { width: dim, height: dim }, children: ["+", hidden] })) : null] }) }));
101
+ });
102
+ AvatarGroup.displayName = "AvatarGroup";
103
+ export { Avatar, AvatarImage, AvatarFallback, AvatarGroup };
104
+ //# sourceMappingURL=avatar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"avatar.js","sourceRoot":"","sources":["../../../components/ui/avatar.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ import { type VariantProps } from "class-variance-authority";
2
+ declare const badgeVariants: (props?: ({
3
+ variant?: "default" | "secondary" | "outline" | "destructive" | "success" | "warning" | "info" | null | undefined;
4
+ size?: "sm" | "md" | "lg" | "xs" | null | undefined;
5
+ } & import("class-variance-authority/types").ClassProp) | undefined) => string;
6
+ type BadgeVariants = VariantProps<typeof badgeVariants>;
7
+ type BadgeProps = Omit<React.HTMLAttributes<HTMLSpanElement>, "children"> & BadgeVariants & {
8
+ asChild?: boolean;
9
+ dot?: boolean;
10
+ icon?: React.ReactNode;
11
+ removable?: boolean;
12
+ onRemove?: () => void;
13
+ pulse?: boolean;
14
+ children?: React.ReactNode;
15
+ };
16
+ declare const Badge: import("react").ForwardRefExoticComponent<Omit<import("react").HTMLAttributes<HTMLSpanElement>, "children"> & BadgeVariants & {
17
+ asChild?: boolean;
18
+ dot?: boolean;
19
+ icon?: React.ReactNode;
20
+ removable?: boolean;
21
+ onRemove?: () => void;
22
+ pulse?: boolean;
23
+ children?: React.ReactNode;
24
+ } & import("react").RefAttributes<HTMLSpanElement>>;
25
+ export { Badge, badgeVariants };
26
+ export type { BadgeProps };
27
+ //# sourceMappingURL=badge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"badge.d.ts","sourceRoot":"","sources":["../../../components/ui/badge.tsx"],"names":[],"mappings":"AAKA,OAAO,EAAO,KAAK,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAMlE,QAAA,MAAM,aAAa;;;8EA0BlB,CAAC;AAyBF,KAAK,aAAa,GAAG,YAAY,CAAC,OAAO,aAAa,CAAC,CAAC;AAExD,KAAK,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,eAAe,CAAC,EAAE,UAAU,CAAC,GACvE,aAAa,GAAG;IACd,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,IAAI,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACvB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CAC5B,CAAC;AAEJ,QAAA,MAAM,KAAK;cATG,OAAO;UACX,OAAO;WACN,KAAK,CAAC,SAAS;gBACV,OAAO;eACR,MAAM,IAAI;YACb,OAAO;eACJ,KAAK,CAAC,SAAS;mDAqE5B,CAAC;AAGH,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,CAAC;AAChC,YAAY,EAAE,UAAU,EAAE,CAAC"}
@@ -0,0 +1,65 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
+ import { forwardRef } from "react";
4
+ import { Slot } from "@radix-ui/react-slot";
5
+ import { RiCloseLine } from "@remixicon/react";
6
+ import { cva } from "class-variance-authority";
7
+ import { cn } from "@/lib/utils";
8
+ // Per docs/emara-ui-phase-1-components.md §6.
9
+ const badgeVariants = cva([
10
+ "inline-flex items-center gap-1 font-medium select-none",
11
+ "rounded-full border whitespace-nowrap",
12
+ "transition-colors",
13
+ ].join(" "), {
14
+ variants: {
15
+ variant: {
16
+ default: "border-transparent bg-primary text-primary-foreground",
17
+ secondary: "border-transparent bg-secondary text-secondary-foreground",
18
+ destructive: "border-transparent bg-destructive text-destructive-foreground",
19
+ outline: "border-border text-foreground",
20
+ success: "border-transparent bg-success text-primary-foreground",
21
+ warning: "border-transparent bg-warning text-primary-foreground",
22
+ info: "border-transparent bg-info text-primary-foreground",
23
+ },
24
+ size: {
25
+ xs: "h-4 px-1.5 text-[10px] leading-none",
26
+ sm: "h-5 px-2 text-xs leading-none",
27
+ md: "h-6 px-2.5 text-xs leading-none",
28
+ lg: "h-7 px-3 text-sm leading-none",
29
+ },
30
+ },
31
+ defaultVariants: { variant: "default", size: "md" },
32
+ });
33
+ // Per-variant dot color (the dot inherits the variant's foreground for
34
+ // outline; otherwise uses currentColor at full opacity).
35
+ const dotVariants = cva("inline-block size-1.5 rounded-full me-1", {
36
+ variants: {
37
+ variant: {
38
+ default: "bg-primary-foreground/90",
39
+ secondary: "bg-secondary-foreground/80",
40
+ destructive: "bg-destructive-foreground/90",
41
+ outline: "bg-foreground/80",
42
+ success: "bg-primary-foreground/90",
43
+ warning: "bg-primary-foreground/90",
44
+ info: "bg-primary-foreground/90",
45
+ },
46
+ size: {
47
+ xs: "size-1",
48
+ sm: "size-1.5",
49
+ md: "size-1.5",
50
+ lg: "size-2",
51
+ },
52
+ },
53
+ defaultVariants: { variant: "default", size: "md" },
54
+ });
55
+ const Badge = forwardRef(function Badge({ className, variant, size, asChild = false, dot = false, icon, removable = false, onRemove, pulse = false, children, ...props }, ref) {
56
+ const Comp = asChild ? Slot : "span";
57
+ const innerContent = (_jsxs(_Fragment, { children: [dot ? (_jsxs("span", { "aria-hidden": "true", className: "relative inline-flex", children: [_jsx("span", { className: cn(dotVariants({ variant, size })) }), pulse ? (_jsx("span", { "aria-hidden": "true", className: cn(dotVariants({ variant, size }), "absolute inset-0 me-0 animate-ping opacity-75") })) : null] })) : null, icon ? (_jsx("span", { "aria-hidden": "true", className: "me-1 inline-flex [&_svg]:size-3.5 [&_svg]:shrink-0", children: icon })) : null, _jsx("span", { children: children }), removable ? (_jsx("button", { type: "button", "aria-label": "Remove", onClick: (e) => {
58
+ e.stopPropagation();
59
+ onRemove?.();
60
+ }, className: cn("ms-1 inline-flex items-center justify-center rounded-full p-0.5", "hover:bg-foreground/10", "focus-visible:ring-ring focus-visible:ring-offset-background focus-visible:ring-2 focus-visible:ring-offset-2 focus-visible:outline-none", "[&_svg]:size-3 [&_svg]:shrink-0"), children: _jsx(RiCloseLine, {}) })) : null] }));
61
+ return (_jsx(Comp, { ref: ref, className: cn(badgeVariants({ variant, size }), className), ...props, children: asChild ? children : innerContent }));
62
+ });
63
+ Badge.displayName = "Badge";
64
+ export { Badge, badgeVariants };
65
+ //# sourceMappingURL=badge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"badge.js","sourceRoot":"","sources":["../../../components/ui/badge.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AACnC,OAAO,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,GAAG,EAAqB,MAAM,0BAA0B,CAAC;AAElE,OAAO,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AAEjC,8CAA8C;AAE9C,MAAM,aAAa,GAAG,GAAG,CACvB;IACE,wDAAwD;IACxD,uCAAuC;IACvC,mBAAmB;CACpB,CAAC,IAAI,CAAC,GAAG,CAAC,EACX;IACE,QAAQ,EAAE;QACR,OAAO,EAAE;YACP,OAAO,EAAE,uDAAuD;YAChE,SAAS,EAAE,2DAA2D;YACtE,WAAW,EAAE,+DAA+D;YAC5E,OAAO,EAAE,+BAA+B;YACxC,OAAO,EAAE,uDAAuD;YAChE,OAAO,EAAE,uDAAuD;YAChE,IAAI,EAAE,oDAAoD;SAC3D;QACD,IAAI,EAAE;YACJ,EAAE,EAAE,qCAAqC;YACzC,EAAE,EAAE,+BAA+B;YACnC,EAAE,EAAE,iCAAiC;YACrC,EAAE,EAAE,+BAA+B;SACpC;KACF;IACD,eAAe,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE;CACpD,CACF,CAAC;AAEF,uEAAuE;AACvE,yDAAyD;AACzD,MAAM,WAAW,GAAG,GAAG,CAAC,yCAAyC,EAAE;IACjE,QAAQ,EAAE;QACR,OAAO,EAAE;YACP,OAAO,EAAE,0BAA0B;YACnC,SAAS,EAAE,4BAA4B;YACvC,WAAW,EAAE,8BAA8B;YAC3C,OAAO,EAAE,kBAAkB;YAC3B,OAAO,EAAE,0BAA0B;YACnC,OAAO,EAAE,0BAA0B;YACnC,IAAI,EAAE,0BAA0B;SACjC;QACD,IAAI,EAAE;YACJ,EAAE,EAAE,QAAQ;YACZ,EAAE,EAAE,UAAU;YACd,EAAE,EAAE,UAAU;YACd,EAAE,EAAE,QAAQ;SACb;KACF;IACD,eAAe,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE;CACpD,CAAC,CAAC;AAeH,MAAM,KAAK,GAAG,UAAU,CAA8B,SAAS,KAAK,CAClE,EACE,SAAS,EACT,OAAO,EACP,IAAI,EACJ,OAAO,GAAG,KAAK,EACf,GAAG,GAAG,KAAK,EACX,IAAI,EACJ,SAAS,GAAG,KAAK,EACjB,QAAQ,EACR,KAAK,GAAG,KAAK,EACb,QAAQ,EACR,GAAG,KAAK,EACT,EACD,GAAG;IAEH,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC;IAErC,MAAM,YAAY,GAAG,CACnB,8BACG,GAAG,CAAC,CAAC,CAAC,CACL,+BAAkB,MAAM,EAAC,SAAS,EAAC,sBAAsB,aACvD,eAAM,SAAS,EAAE,EAAE,CAAC,WAAW,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,GAAI,EACtD,KAAK,CAAC,CAAC,CAAC,CACP,8BACc,MAAM,EAClB,SAAS,EAAE,EAAE,CACX,WAAW,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,EAC9B,+CAA+C,CAChD,GACD,CACH,CAAC,CAAC,CAAC,IAAI,IACH,CACR,CAAC,CAAC,CAAC,IAAI,EACP,IAAI,CAAC,CAAC,CAAC,CACN,8BAAkB,MAAM,EAAC,SAAS,EAAC,oDAAoD,YACpF,IAAI,GACA,CACR,CAAC,CAAC,CAAC,IAAI,EACR,yBAAO,QAAQ,GAAQ,EACtB,SAAS,CAAC,CAAC,CAAC,CACX,iBACE,IAAI,EAAC,QAAQ,gBACF,QAAQ,EACnB,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE;oBACb,CAAC,CAAC,eAAe,EAAE,CAAC;oBACpB,QAAQ,EAAE,EAAE,CAAC;gBACf,CAAC,EACD,SAAS,EAAE,EAAE,CACX,iEAAiE,EACjE,wBAAwB,EACxB,0IAA0I,EAC1I,iCAAiC,CAClC,YAED,KAAC,WAAW,KAAG,GACR,CACV,CAAC,CAAC,CAAC,IAAI,IACP,CACJ,CAAC;IAEF,OAAO,CACL,KAAC,IAAI,IAAC,GAAG,EAAE,GAAG,EAAE,SAAS,EAAE,EAAE,CAAC,aAAa,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,SAAS,CAAC,KAAM,KAAK,YAClF,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,YAAY,GAC7B,CACR,CAAC;AACJ,CAAC,CAAC,CAAC;AACH,KAAK,CAAC,WAAW,GAAG,OAAO,CAAC;AAE5B,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,CAAC"}
@@ -0,0 +1,35 @@
1
+ import { type VariantProps } from "class-variance-authority";
2
+ declare const breadcrumbVariants: (props?: ({
3
+ size?: "sm" | "md" | "lg" | null | undefined;
4
+ } & import("class-variance-authority/types").ClassProp) | undefined) => string;
5
+ type BreadcrumbVariants = VariantProps<typeof breadcrumbVariants>;
6
+ type BreadcrumbProps = React.HTMLAttributes<HTMLElement> & BreadcrumbVariants;
7
+ declare const Breadcrumb: import("react").ForwardRefExoticComponent<import("react").HTMLAttributes<HTMLElement> & BreadcrumbVariants & import("react").RefAttributes<HTMLElement>>;
8
+ declare const BreadcrumbList: import("react").ForwardRefExoticComponent<import("react").OlHTMLAttributes<HTMLOListElement> & import("react").RefAttributes<HTMLOListElement>>;
9
+ declare const BreadcrumbItem: import("react").ForwardRefExoticComponent<import("react").LiHTMLAttributes<HTMLLIElement> & import("react").RefAttributes<HTMLLIElement>>;
10
+ type BreadcrumbLinkProps = React.AnchorHTMLAttributes<HTMLAnchorElement> & {
11
+ asChild?: boolean;
12
+ };
13
+ declare const BreadcrumbLink: import("react").ForwardRefExoticComponent<import("react").AnchorHTMLAttributes<HTMLAnchorElement> & {
14
+ asChild?: boolean;
15
+ } & import("react").RefAttributes<HTMLAnchorElement>>;
16
+ declare const BreadcrumbPage: import("react").ForwardRefExoticComponent<import("react").HTMLAttributes<HTMLSpanElement> & import("react").RefAttributes<HTMLSpanElement>>;
17
+ declare const BreadcrumbSeparator: import("react").ForwardRefExoticComponent<import("react").HTMLAttributes<HTMLLIElement> & import("react").RefAttributes<HTMLLIElement>>;
18
+ declare const BreadcrumbEllipsis: import("react").ForwardRefExoticComponent<import("react").HTMLAttributes<HTMLSpanElement> & import("react").RefAttributes<HTMLSpanElement>>;
19
+ interface BreadcrumbsItem {
20
+ label: React.ReactNode;
21
+ href?: string;
22
+ icon?: React.ReactNode;
23
+ }
24
+ interface BreadcrumbsProps extends BreadcrumbVariants {
25
+ items: BreadcrumbsItem[];
26
+ separator?: React.ReactNode;
27
+ maxItems?: number;
28
+ itemsBeforeCollapse?: number;
29
+ itemsAfterCollapse?: number;
30
+ className?: string;
31
+ }
32
+ declare const Breadcrumbs: import("react").ForwardRefExoticComponent<BreadcrumbsProps & import("react").RefAttributes<HTMLElement>>;
33
+ export { Breadcrumb, BreadcrumbList, BreadcrumbItem, BreadcrumbLink, BreadcrumbPage, BreadcrumbSeparator, BreadcrumbEllipsis, Breadcrumbs, breadcrumbVariants, };
34
+ export type { BreadcrumbProps, BreadcrumbLinkProps, BreadcrumbsItem, BreadcrumbsProps, };
35
+ //# sourceMappingURL=breadcrumb.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"breadcrumb.d.ts","sourceRoot":"","sources":["../../../components/ui/breadcrumb.tsx"],"names":[],"mappings":"AAKA,OAAO,EAAO,KAAK,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAgBlE,QAAA,MAAM,kBAAkB;;8EAStB,CAAC;AAEH,KAAK,kBAAkB,GAAG,YAAY,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAElE,KAAK,eAAe,GAAG,KAAK,CAAC,cAAc,CAAC,WAAW,CAAC,GAAG,kBAAkB,CAAC;AAE9E,QAAA,MAAM,UAAU,0JAYd,CAAC;AAGH,QAAA,MAAM,cAAc,iJAanB,CAAC;AAGF,QAAA,MAAM,cAAc,2IAUnB,CAAC;AAGF,KAAK,mBAAmB,GAAG,KAAK,CAAC,oBAAoB,CAAC,iBAAiB,CAAC,GAAG;IACzE,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,CAAC;AAEF,QAAA,MAAM,cAAc;cAHR,OAAO;qDAkBlB,CAAC;AAGF,QAAA,MAAM,cAAc,6IAiBnB,CAAC;AAGF,QAAA,MAAM,mBAAmB,yIAiBxB,CAAC;AAGF,QAAA,MAAM,kBAAkB,6IAkBvB,CAAC;AAOF,UAAU,eAAe;IACvB,KAAK,EAAE,KAAK,CAAC,SAAS,CAAC;IACvB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CACxB;AAED,UAAU,gBAAiB,SAAQ,kBAAkB;IACnD,KAAK,EAAE,eAAe,EAAE,CAAC;IACzB,SAAS,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC5B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,QAAA,MAAM,WAAW,0GAoGf,CAAC;AAGH,OAAO,EACL,UAAU,EACV,cAAc,EACd,cAAc,EACd,cAAc,EACd,cAAc,EACd,mBAAmB,EACnB,kBAAkB,EAClB,WAAW,EACX,kBAAkB,GACnB,CAAC;AACF,YAAY,EACV,eAAe,EACf,mBAAmB,EACnB,eAAe,EACf,gBAAgB,GACjB,CAAC"}