@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,189 @@
1
+ "use client";
2
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { Children, cloneElement, createContext, forwardRef, isValidElement, useContext, useMemo, useState, } from "react";
4
+ import * as CollapsiblePrimitive from "@radix-ui/react-collapsible";
5
+ import { Slot } from "@radix-ui/react-slot";
6
+ import { RiArrowDownSLine, RiArrowLeftSLine, RiArrowRightSLine } from "@remixicon/react";
7
+ import { cva } from "class-variance-authority";
8
+ import { cn } from "@/lib/utils";
9
+ import { Popover, PopoverContent, PopoverTrigger } from "./popover";
10
+ import { Tooltip, TooltipContent, TooltipTrigger } from "./tooltip";
11
+ const SidebarContext = createContext(null);
12
+ function useSidebar() {
13
+ const ctx = useContext(SidebarContext);
14
+ if (!ctx)
15
+ throw new Error("Sidebar subcomponents must be used inside <Sidebar>");
16
+ return ctx;
17
+ }
18
+ // ---- Root ------------------------------------------------------------------
19
+ // Width is driven by tokens (--sidebar-w-{sm,md,lg,collapsed}) defined in
20
+ // design-tokens §11b.3. Collapsed width is fixed across sizes.
21
+ const sidebarVariants = cva("flex h-full flex-col text-foreground transition-[width] duration-normal", {
22
+ variants: {
23
+ variant: {
24
+ filled: "bg-muted",
25
+ outline: "bg-background border-e border-border",
26
+ floating: "bg-card rounded-lg shadow-md m-2",
27
+ },
28
+ size: {
29
+ sm: "",
30
+ md: "",
31
+ lg: "",
32
+ },
33
+ collapsed: {
34
+ true: "w-sidebar-collapsed",
35
+ false: "",
36
+ },
37
+ },
38
+ compoundVariants: [
39
+ // Expanded width — driven by `size` only when not collapsed.
40
+ { collapsed: false, size: "sm", class: "w-sidebar-sm" },
41
+ { collapsed: false, size: "md", class: "w-sidebar-md" },
42
+ { collapsed: false, size: "lg", class: "w-sidebar-lg" },
43
+ ],
44
+ defaultVariants: {
45
+ variant: "filled",
46
+ size: "md",
47
+ collapsed: false,
48
+ },
49
+ });
50
+ const Sidebar = forwardRef(function Sidebar({ className, variant = "filled", size = "md", collapsed = false, asChild = false, ...props }, ref) {
51
+ const Comp = (asChild ? Slot : "aside");
52
+ const ctx = useMemo(() => ({
53
+ variant: variant ?? "filled",
54
+ collapsed: collapsed ?? false,
55
+ }), [variant, collapsed]);
56
+ return (_jsx(SidebarContext.Provider, { value: ctx, children: _jsx(Comp, { ref: ref, "data-collapsed": collapsed || undefined, "data-variant": variant, "data-size": size, className: cn(sidebarVariants({ variant, size, collapsed }), className), ...props }) }));
57
+ });
58
+ Sidebar.displayName = "Sidebar";
59
+ // ---- Brand / Header / Body / Footer ---------------------------------------
60
+ const SidebarBrand = forwardRef(function SidebarBrand({ className, ...props }, ref) {
61
+ const { collapsed } = useSidebar();
62
+ return (_jsx("div", { ref: ref, className: cn("text-foreground flex h-14 shrink-0 items-center gap-2 px-3 font-semibold", "[&_svg]:size-6 [&_svg]:shrink-0", collapsed && "justify-center", className), ...props }));
63
+ });
64
+ SidebarBrand.displayName = "SidebarBrand";
65
+ const SidebarHeader = forwardRef(function SidebarHeader({ className, ...props }, ref) {
66
+ return _jsx("div", { ref: ref, className: cn("shrink-0 px-3 pb-2", className), ...props });
67
+ });
68
+ SidebarHeader.displayName = "SidebarHeader";
69
+ const SidebarBody = forwardRef(function SidebarBody({ className, ...props }, ref) {
70
+ return (_jsx("div", { ref: ref, className: cn("flex-1 space-y-3 overflow-x-hidden overflow-y-auto px-2 py-2", className), ...props }));
71
+ });
72
+ SidebarBody.displayName = "SidebarBody";
73
+ const SidebarFooter = forwardRef(function SidebarFooter({ className, ...props }, ref) {
74
+ return (_jsx("div", { ref: ref, className: cn("border-border/60 shrink-0 border-t px-2 py-2", className), ...props }));
75
+ });
76
+ SidebarFooter.displayName = "SidebarFooter";
77
+ // ---- Group -----------------------------------------------------------------
78
+ const SidebarGroup = forwardRef(function SidebarGroup({ className, ...props }, ref) {
79
+ return _jsx("div", { ref: ref, className: cn("space-y-1", className), ...props });
80
+ });
81
+ SidebarGroup.displayName = "SidebarGroup";
82
+ const SidebarGroupLabel = forwardRef(function SidebarGroupLabel({ className, ...props }, ref) {
83
+ const { collapsed } = useSidebar();
84
+ if (collapsed) {
85
+ return _jsx("div", { ref: ref, "aria-hidden": "true", className: "h-2" });
86
+ }
87
+ return (_jsx("div", { ref: ref, className: cn("text-muted-foreground px-3 pb-1 text-xs font-medium tracking-wider uppercase", className), ...props }));
88
+ });
89
+ SidebarGroupLabel.displayName = "SidebarGroupLabel";
90
+ // ---- Item visual ----------------------------------------------------------
91
+ const itemVariants = cva([
92
+ "group flex w-full items-center gap-2 rounded-md ps-3 pe-2 text-sm cursor-pointer",
93
+ "text-foreground transition-colors select-none",
94
+ "hover:bg-accent hover:text-accent-foreground",
95
+ "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",
96
+ "[&_svg]:size-4 [&_svg]:shrink-0",
97
+ "data-[active=true]:bg-accent data-[active=true]:text-accent-foreground data-[active=true]:font-medium",
98
+ "data-[disabled=true]:pointer-events-none data-[disabled=true]:opacity-50",
99
+ ].join(" "), {
100
+ variants: {
101
+ collapsed: {
102
+ true: "justify-center px-0 h-10 w-10 mx-auto",
103
+ false: "h-9",
104
+ },
105
+ },
106
+ defaultVariants: { collapsed: false },
107
+ });
108
+ // Inner item content — used by both flat Items and the trigger of expandable Items
109
+ function ItemContent({ icon, label, badge, kbd, expandable, expanded, collapsed, }) {
110
+ return (_jsxs(_Fragment, { children: [icon ? _jsx("span", { className: "shrink-0", children: icon }) : null, _jsx("span", { className: cn("flex-1 truncate text-start", collapsed && "sr-only"), children: label }), !collapsed && badge ? _jsx("span", { className: "ms-1 shrink-0", children: badge }) : null, !collapsed && kbd && kbd.length > 0 ? (_jsx("kbd", { className: "border-border bg-muted text-muted-foreground ms-1 inline-flex items-center gap-0.5 rounded border px-1.5 py-0.5 text-[10px] font-medium", children: kbd.map((k, i) => (_jsx("span", { children: k }, i))) })) : null, !collapsed && expandable ? (_jsx("span", { "aria-hidden": "true", className: cn("text-muted-foreground ms-1 shrink-0 transition-transform", expanded && "rotate-180"), children: _jsx(RiArrowDownSLine, {}) })) : null] }));
111
+ }
112
+ const SidebarItem = forwardRef(function SidebarItem({ className, icon, label, badge, kbd, tooltip, active = false, disabled = false, asChild = false, children, ...rest }, ref) {
113
+ const expandable = "expandable" in rest && rest.expandable === true;
114
+ const defaultExpanded = "defaultExpanded" in rest && rest.defaultExpanded ? Boolean(rest.defaultExpanded) : false;
115
+ // Strip discriminator keys before spreading onto DOM.
116
+ const domProps = { ...rest };
117
+ delete domProps.expandable;
118
+ delete domProps.defaultExpanded;
119
+ const { collapsed } = useSidebar();
120
+ // Use label as accessible tooltip text when none provided + collapsed mode.
121
+ const tooltipText = tooltip ?? (typeof label === "string" ? label : undefined);
122
+ // --- Expandable ----------------------------------------------------------
123
+ if (expandable) {
124
+ return (_jsx(ExpandableItem, { ref: ref, defaultExpanded: defaultExpanded, active: active, disabled: disabled, collapsed: collapsed, ...(icon !== undefined ? { icon } : {}), label: label, ...(badge !== undefined ? { badge } : {}), ...(kbd !== undefined ? { kbd } : {}), ...(tooltipText !== undefined ? { tooltip: tooltipText } : {}), ...(className !== undefined ? { className } : {}), ...domProps, children: children }));
125
+ }
126
+ // --- Flat item -----------------------------------------------------------
127
+ const sharedProps = {
128
+ "data-active": active || undefined,
129
+ "data-disabled": disabled || undefined,
130
+ ...(disabled ? { "aria-disabled": true, tabIndex: -1 } : {}),
131
+ ...(active ? { "aria-current": "page" } : {}),
132
+ className: cn(itemVariants({ collapsed }), className),
133
+ ...domProps,
134
+ };
135
+ const itemContent = (_jsx(ItemContent, { ...(icon !== undefined ? { icon } : {}), label: label, ...(badge !== undefined ? { badge } : {}), ...(kbd !== undefined ? { kbd } : {}), collapsed: collapsed }));
136
+ let triggerEl;
137
+ if (asChild) {
138
+ // Clone the consumer's single child (an `<a>`, Next `<Link>`, etc.),
139
+ // merge our props onto it, and inject ItemContent as its body. Any
140
+ // existing children on the consumer's element are preserved before
141
+ // ItemContent so consumers can compose if they want.
142
+ const child = Children.only(children);
143
+ if (!isValidElement(child)) {
144
+ throw new Error("SidebarItem with asChild expects a single valid React element.");
145
+ }
146
+ triggerEl = cloneElement(child, {
147
+ ...sharedProps,
148
+ className: cn(sharedProps.className, child.props.className),
149
+ ref,
150
+ }, child.props.children ?? itemContent);
151
+ }
152
+ else {
153
+ triggerEl = (_jsx("button", { ref: ref, type: "button", ...sharedProps, children: itemContent }));
154
+ }
155
+ if (collapsed && tooltipText) {
156
+ // `side="right"` is correct for a start-positioned sidebar in both
157
+ // LTR (toward content on the right) and RTL (Radix auto-flips to
158
+ // "left", which is toward content). For an end-positioned sidebar
159
+ // the tooltip would point off-screen — a known limitation tracked
160
+ // for v1.x once Sidebar can read its parent AppShell's position.
161
+ return (_jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: triggerEl }), _jsx(TooltipContent, { side: "right", children: tooltipText })] }));
162
+ }
163
+ return triggerEl;
164
+ });
165
+ SidebarItem.displayName = "SidebarItem";
166
+ // ---- ExpandableItem (internal) --------------------------------------------
167
+ const ExpandableItem = forwardRef(function ExpandableItem({ defaultExpanded, icon, label, badge, kbd, tooltip, active, disabled, className, collapsed, children, ...props }, ref) {
168
+ const [open, setOpen] = useState(defaultExpanded);
169
+ // Collapsed mode: open as a popover instead of inline collapsible.
170
+ if (collapsed) {
171
+ return (_jsxs(Popover, { children: [_jsx(PopoverTrigger, { asChild: true, children: _jsx("button", { ref: ref, type: "button", "data-active": active || undefined, "data-disabled": disabled || undefined, ...(disabled ? { "aria-disabled": true, tabIndex: -1 } : {}), className: cn(itemVariants({ collapsed: true }), className), children: _jsx(ItemContent, { ...(icon !== undefined ? { icon } : {}), label: label, ...(badge !== undefined ? { badge } : {}), ...(kbd !== undefined ? { kbd } : {}), expandable: true, collapsed: true }) }) }), _jsxs(PopoverContent, { side: "right", align: "start", className: "w-56 p-1", children: [tooltip ? (_jsx("div", { className: "text-muted-foreground px-2 py-1.5 text-xs font-medium", children: tooltip })) : null, _jsx("div", { className: "space-y-0.5", children: children })] })] }));
172
+ }
173
+ return (_jsx(CollapsiblePrimitive.Root, { open: open, onOpenChange: setOpen, asChild: true, children: _jsxs("div", { ref: ref, className: "contents", children: [_jsx(CollapsiblePrimitive.Trigger, { asChild: true, children: _jsx("button", { type: "button", "data-active": active || undefined, "data-disabled": disabled || undefined, ...(disabled ? { "aria-disabled": true, tabIndex: -1 } : {}), className: cn(itemVariants({ collapsed: false }), className), ...props, children: _jsx(ItemContent, { ...(icon !== undefined ? { icon } : {}), label: label, ...(badge !== undefined ? { badge } : {}), ...(kbd !== undefined ? { kbd } : {}), expandable: true, expanded: open, collapsed: false }) }) }), _jsx(CollapsiblePrimitive.Content, { className: cn("overflow-hidden", "data-[state=open]:animate-[collapse-down_var(--duration-fast,150ms)_var(--ease-out,ease-out)]", "data-[state=closed]:animate-[collapse-up_var(--duration-fast,150ms)_var(--ease-in,ease-in)]", "[--collapsible-content-height:var(--radix-collapsible-content-height)]"), children: _jsx("div", { className: "border-border ms-3 mt-0.5 space-y-0.5 border-s ps-3", children: children }) })] }) }));
174
+ });
175
+ ExpandableItem.displayName = "ExpandableItem";
176
+ const SidebarSubItem = forwardRef(function SidebarSubItem({ className, icon, label, badge, kbd, active = false, disabled = false, asChild = false, ...rest }, ref) {
177
+ const Comp = (asChild ? Slot : "button");
178
+ return (_jsxs(Comp, { ref: ref, "data-active": active || undefined, "data-disabled": disabled || undefined, ...(disabled ? { "aria-disabled": true, tabIndex: -1 } : {}), ...(active ? { "aria-current": "page" } : {}), ...(!asChild ? { type: "button" } : {}), className: cn(
179
+ // Slightly smaller indent; reuses item variants for color logic.
180
+ "group flex h-8 w-full cursor-pointer items-center gap-2 rounded-md ps-3 pe-2 text-sm", "text-muted-foreground transition-colors select-none", "hover:bg-accent hover:text-accent-foreground", "focus-visible:ring-ring focus-visible:ring-2 focus-visible:outline-none", "[&_svg]:size-4 [&_svg]:shrink-0", "data-[active=true]:bg-accent data-[active=true]:text-accent-foreground data-[active=true]:font-medium", "data-[disabled=true]:pointer-events-none data-[disabled=true]:opacity-50", className), ...rest, children: [icon ? _jsx("span", { className: "shrink-0", children: icon }) : null, _jsx("span", { className: "flex-1 truncate text-start", children: label }), badge ? _jsx("span", { className: "ms-1 shrink-0", children: badge }) : null, kbd && kbd.length > 0 ? (_jsx("kbd", { className: "border-border bg-muted text-muted-foreground ms-1 inline-flex items-center gap-0.5 rounded border px-1.5 py-0.5 text-[10px] font-medium", children: kbd.map((k, i) => (_jsx("span", { children: k }, i))) })) : null] }));
181
+ });
182
+ SidebarSubItem.displayName = "SidebarSubItem";
183
+ const SidebarCollapseToggle = forwardRef(function SidebarCollapseToggle({ className, expandLabel = "Expand sidebar", collapseLabel = "Collapse sidebar", ...props }, ref) {
184
+ const { collapsed } = useSidebar();
185
+ return (_jsx("button", { ref: ref, type: "button", "aria-label": collapsed ? expandLabel : collapseLabel, className: cn("inline-flex h-8 w-full cursor-pointer items-center justify-center rounded-md", "text-muted-foreground hover:bg-accent hover:text-accent-foreground", "focus-visible:ring-ring focus-visible:ring-2 focus-visible:outline-none", "[&_svg]:size-4 [&_svg]:shrink-0", className), ...props, children: collapsed ? (_jsx(RiArrowRightSLine, { className: "rtl-mirror" })) : (_jsx(RiArrowLeftSLine, { className: "rtl-mirror" })) }));
186
+ });
187
+ SidebarCollapseToggle.displayName = "SidebarCollapseToggle";
188
+ export { Sidebar, SidebarBrand, SidebarHeader, SidebarBody, SidebarFooter, SidebarGroup, SidebarGroupLabel, SidebarItem, SidebarSubItem, SidebarCollapseToggle, sidebarVariants, };
189
+ //# sourceMappingURL=sidebar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sidebar.js","sourceRoot":"","sources":["../../../components/ui/sidebar.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,77 @@
1
+ import { type VariantProps } from "class-variance-authority";
2
+ declare const skeletonVariants: (props?: ({
3
+ animation?: "none" | "pulse" | "shimmer" | null | undefined;
4
+ } & import("class-variance-authority/types").ClassProp) | undefined) => string;
5
+ type SkeletonVariants = VariantProps<typeof skeletonVariants>;
6
+ type SkeletonProps = React.HTMLAttributes<HTMLDivElement> & SkeletonVariants & {
7
+ asChild?: boolean;
8
+ };
9
+ declare const Skeleton: import("react").ForwardRefExoticComponent<import("react").HTMLAttributes<HTMLDivElement> & SkeletonVariants & {
10
+ asChild?: boolean;
11
+ } & import("react").RefAttributes<HTMLDivElement>>;
12
+ type SkeletonTextProps = Omit<SkeletonProps, "asChild"> & {
13
+ lines?: number;
14
+ /** Width of the last line as a fraction of full width. Default 0.6. */
15
+ lastLineWidth?: number;
16
+ };
17
+ declare const SkeletonText: import("react").ForwardRefExoticComponent<Omit<SkeletonProps, "asChild"> & {
18
+ lines?: number;
19
+ /** Width of the last line as a fraction of full width. Default 0.6. */
20
+ lastLineWidth?: number;
21
+ } & import("react").RefAttributes<HTMLDivElement>>;
22
+ type SkeletonCircleSize = "xs" | "sm" | "md" | "lg" | "xl" | "2xl";
23
+ type SkeletonCircleProps = Omit<React.HTMLAttributes<HTMLDivElement>, "children"> & {
24
+ size?: SkeletonCircleSize;
25
+ animation?: SkeletonVariants["animation"];
26
+ };
27
+ declare const SkeletonCircle: import("react").ForwardRefExoticComponent<Omit<import("react").HTMLAttributes<HTMLDivElement>, "children"> & {
28
+ size?: SkeletonCircleSize;
29
+ animation?: SkeletonVariants["animation"];
30
+ } & import("react").RefAttributes<HTMLDivElement>>;
31
+ type SkeletonButtonSize = "xs" | "sm" | "default" | "lg" | "xl";
32
+ type SkeletonButtonProps = Omit<React.HTMLAttributes<HTMLDivElement>, "children"> & {
33
+ size?: SkeletonButtonSize;
34
+ width?: "auto" | "full";
35
+ animation?: SkeletonVariants["animation"];
36
+ };
37
+ declare const SkeletonButton: import("react").ForwardRefExoticComponent<Omit<import("react").HTMLAttributes<HTMLDivElement>, "children"> & {
38
+ size?: SkeletonButtonSize;
39
+ width?: "auto" | "full";
40
+ animation?: SkeletonVariants["animation"];
41
+ } & import("react").RefAttributes<HTMLDivElement>>;
42
+ type SkeletonInputSize = "xs" | "sm" | "md" | "lg" | "xl";
43
+ type SkeletonInputProps = Omit<React.HTMLAttributes<HTMLDivElement>, "children"> & {
44
+ size?: SkeletonInputSize;
45
+ animation?: SkeletonVariants["animation"];
46
+ };
47
+ declare const SkeletonInput: import("react").ForwardRefExoticComponent<Omit<import("react").HTMLAttributes<HTMLDivElement>, "children"> & {
48
+ size?: SkeletonInputSize;
49
+ animation?: SkeletonVariants["animation"];
50
+ } & import("react").RefAttributes<HTMLDivElement>>;
51
+ type SkeletonCardProps = Omit<React.HTMLAttributes<HTMLDivElement>, "children"> & {
52
+ /** Show the header section (title + description). Default true. */
53
+ header?: boolean;
54
+ /** Number of body lines. Default 3. */
55
+ lines?: number;
56
+ animation?: SkeletonVariants["animation"];
57
+ };
58
+ declare const SkeletonCard: import("react").ForwardRefExoticComponent<Omit<import("react").HTMLAttributes<HTMLDivElement>, "children"> & {
59
+ /** Show the header section (title + description). Default true. */
60
+ header?: boolean;
61
+ /** Number of body lines. Default 3. */
62
+ lines?: number;
63
+ animation?: SkeletonVariants["animation"];
64
+ } & import("react").RefAttributes<HTMLDivElement>>;
65
+ type SkeletonTableProps = Omit<React.HTMLAttributes<HTMLDivElement>, "children"> & {
66
+ rows?: number;
67
+ cols?: number;
68
+ animation?: SkeletonVariants["animation"];
69
+ };
70
+ declare const SkeletonTable: import("react").ForwardRefExoticComponent<Omit<import("react").HTMLAttributes<HTMLDivElement>, "children"> & {
71
+ rows?: number;
72
+ cols?: number;
73
+ animation?: SkeletonVariants["animation"];
74
+ } & import("react").RefAttributes<HTMLDivElement>>;
75
+ export { Skeleton, SkeletonText, SkeletonCircle, SkeletonButton, SkeletonInput, SkeletonCard, SkeletonTable, skeletonVariants, };
76
+ export type { SkeletonProps, SkeletonTextProps, SkeletonCircleProps, SkeletonButtonProps, SkeletonInputProps, SkeletonCardProps, SkeletonTableProps, };
77
+ //# sourceMappingURL=skeleton.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skeleton.d.ts","sourceRoot":"","sources":["../../../components/ui/skeleton.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,115 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { forwardRef } from "react";
4
+ import { Slot } from "@radix-ui/react-slot";
5
+ import { cva } from "class-variance-authority";
6
+ import { cn } from "@/lib/utils";
7
+ // Per docs/emara-ui-phase-1-components.md §9.
8
+ const skeletonVariants = cva("rounded-md bg-foreground/10", {
9
+ variants: {
10
+ animation: {
11
+ pulse: "animate-pulse",
12
+ shimmer: [
13
+ "relative overflow-hidden isolate",
14
+ // Sliding band — a contrasting tone sweeps across the base fill.
15
+ // Base is `bg-foreground/10`; the band is `foreground/35` so it's
16
+ // visibly darker in light mode and visibly lighter in dark mode.
17
+ // The keyframe `shimmer-slide` (in globals.css) animates translateX
18
+ // and the cascade flips direction for RTL.
19
+ "before:absolute before:inset-0 before:content-[''] before:z-10 before:pointer-events-none",
20
+ "before:bg-gradient-to-r before:from-transparent before:via-foreground/35 before:to-transparent",
21
+ "before:animate-[shimmer-slide_1.2s_linear_infinite]",
22
+ ].join(" "),
23
+ none: "",
24
+ },
25
+ },
26
+ defaultVariants: {
27
+ animation: "pulse",
28
+ },
29
+ });
30
+ const Skeleton = forwardRef(function Skeleton({ className, animation, asChild = false, ...props }, ref) {
31
+ const Comp = asChild ? Slot : "div";
32
+ return (_jsx(Comp, { ref: ref, "aria-hidden": "true", className: cn(skeletonVariants({ animation }), className), ...props }));
33
+ });
34
+ Skeleton.displayName = "Skeleton";
35
+ // Pre-computed "realistic" widths for paragraphs. Repeats after this many lines.
36
+ const TEXT_LINE_WIDTHS = ["w-full", "w-11/12", "w-full", "w-10/12", "w-full"];
37
+ const SkeletonText = forwardRef(function SkeletonText({ className, animation, lines = 3, lastLineWidth = 0.6, ...props }, ref) {
38
+ const lastWidthStyle = { width: `${Math.round(lastLineWidth * 100)}%` };
39
+ return (_jsx("div", { ref: ref, "aria-hidden": "true", className: cn("space-y-2", className), ...props, children: Array.from({ length: Math.max(1, lines) }, (_, i) => {
40
+ const isLast = i === lines - 1 && lines > 1;
41
+ const widthClass = isLast
42
+ ? ""
43
+ : (TEXT_LINE_WIDTHS[i % TEXT_LINE_WIDTHS.length] ?? "w-full");
44
+ return (_jsx(Skeleton, { animation: animation, className: cn("h-4", widthClass), style: isLast ? lastWidthStyle : undefined }, i));
45
+ }) }));
46
+ });
47
+ SkeletonText.displayName = "SkeletonText";
48
+ // Note: animation is intentionally NOT part of this variant set — the parent
49
+ // <Skeleton> already supplies the right classes for pulse / shimmer / none
50
+ // (including the relative+overflow-hidden+::before band that shimmer needs).
51
+ // Duplicating animation here used to strip the shimmer styling, so the audit
52
+ // flagged "shimmer doesn't work on SkeletonCircle".
53
+ const skeletonCircleVariants = cva("rounded-full", {
54
+ variants: {
55
+ size: {
56
+ xs: "size-6",
57
+ sm: "size-8",
58
+ md: "size-10",
59
+ lg: "size-12",
60
+ xl: "size-16",
61
+ "2xl": "size-24",
62
+ },
63
+ },
64
+ defaultVariants: { size: "md" },
65
+ });
66
+ const SkeletonCircle = forwardRef(function SkeletonCircle({ className, size, animation = "pulse", ...props }, ref) {
67
+ return (_jsx(Skeleton, { ref: ref, animation: animation, className: cn(skeletonCircleVariants({ size }), className), ...props }));
68
+ });
69
+ SkeletonCircle.displayName = "SkeletonCircle";
70
+ const skeletonButtonVariants = cva("rounded-md bg-foreground/10", {
71
+ variants: {
72
+ size: {
73
+ xs: "h-7",
74
+ sm: "h-8",
75
+ default: "h-9",
76
+ lg: "h-10",
77
+ xl: "h-12",
78
+ },
79
+ width: {
80
+ auto: "w-24",
81
+ full: "w-full",
82
+ },
83
+ },
84
+ defaultVariants: { size: "default", width: "auto" },
85
+ });
86
+ const SkeletonButton = forwardRef(function SkeletonButton({ className, size, width, animation = "pulse", ...props }, ref) {
87
+ return (_jsx(Skeleton, { ref: ref, animation: animation, className: cn(skeletonButtonVariants({ size, width }), className), ...props }));
88
+ });
89
+ SkeletonButton.displayName = "SkeletonButton";
90
+ const skeletonInputVariants = cva("rounded-md bg-foreground/10 w-full", {
91
+ variants: {
92
+ size: {
93
+ xs: "h-7",
94
+ sm: "h-8",
95
+ md: "h-9",
96
+ lg: "h-10",
97
+ xl: "h-12",
98
+ },
99
+ },
100
+ defaultVariants: { size: "md" },
101
+ });
102
+ const SkeletonInput = forwardRef(function SkeletonInput({ className, size, animation = "pulse", ...props }, ref) {
103
+ return (_jsx(Skeleton, { ref: ref, animation: animation, className: cn(skeletonInputVariants({ size }), className), ...props }));
104
+ });
105
+ SkeletonInput.displayName = "SkeletonInput";
106
+ const SkeletonCard = forwardRef(function SkeletonCard({ className, header = true, lines = 3, animation = "pulse", ...props }, ref) {
107
+ return (_jsxs("div", { ref: ref, "aria-hidden": "true", className: cn("border-border space-y-4 rounded-md border p-4", className), ...props, children: [header ? (_jsxs("div", { className: "space-y-2", children: [_jsx(Skeleton, { animation: animation, className: "h-5 w-2/5" }), _jsx(Skeleton, { animation: animation, className: "h-4 w-3/5" })] })) : null, _jsx(SkeletonText, { animation: animation, lines: lines })] }));
108
+ });
109
+ SkeletonCard.displayName = "SkeletonCard";
110
+ const SkeletonTable = forwardRef(function SkeletonTable({ className, rows = 5, cols = 4, animation = "pulse", ...props }, ref) {
111
+ return (_jsxs("div", { ref: ref, "aria-hidden": "true", className: cn("space-y-2", className), ...props, children: [_jsx("div", { className: "grid gap-3", style: { gridTemplateColumns: `repeat(${cols}, minmax(0, 1fr))` }, children: Array.from({ length: cols }, (_, c) => (_jsx(Skeleton, { animation: animation, className: "h-4" }, `h-${c}`))) }), Array.from({ length: rows }, (_, r) => (_jsx("div", { className: "grid gap-3", style: { gridTemplateColumns: `repeat(${cols}, minmax(0, 1fr))` }, children: Array.from({ length: cols }, (_, c) => (_jsx(Skeleton, { animation: animation, className: "h-4" }, `${r}-${c}`))) }, r)))] }));
112
+ });
113
+ SkeletonTable.displayName = "SkeletonTable";
114
+ export { Skeleton, SkeletonText, SkeletonCircle, SkeletonButton, SkeletonInput, SkeletonCard, SkeletonTable, skeletonVariants, };
115
+ //# sourceMappingURL=skeleton.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skeleton.js","sourceRoot":"","sources":["../../../components/ui/skeleton.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ import * as SwitchPrimitive from "@radix-ui/react-switch";
2
+ import { type VariantProps } from "class-variance-authority";
3
+ declare const switchRootVariants: (props?: ({
4
+ size?: "sm" | "md" | "lg" | null | undefined;
5
+ } & import("class-variance-authority/types").ClassProp) | undefined) => string;
6
+ declare const switchThumbVariants: (props?: ({
7
+ size?: "sm" | "md" | "lg" | null | undefined;
8
+ } & import("class-variance-authority/types").ClassProp) | undefined) => string;
9
+ type SwitchVariants = VariantProps<typeof switchRootVariants>;
10
+ type SwitchProps = Omit<React.ComponentPropsWithoutRef<typeof SwitchPrimitive.Root>, "size"> & SwitchVariants & {
11
+ loading?: boolean;
12
+ onIcon?: React.ReactNode;
13
+ offIcon?: React.ReactNode;
14
+ onLabel?: string;
15
+ offLabel?: string;
16
+ };
17
+ declare const Switch: import("react").ForwardRefExoticComponent<Omit<Omit<SwitchPrimitive.SwitchProps & import("react").RefAttributes<HTMLButtonElement>, "ref">, "size"> & SwitchVariants & {
18
+ loading?: boolean;
19
+ onIcon?: React.ReactNode;
20
+ offIcon?: React.ReactNode;
21
+ onLabel?: string;
22
+ offLabel?: string;
23
+ } & import("react").RefAttributes<HTMLButtonElement>>;
24
+ export { Switch, switchRootVariants, switchThumbVariants };
25
+ export type { SwitchProps };
26
+ //# sourceMappingURL=switch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"switch.d.ts","sourceRoot":"","sources":["../../../components/ui/switch.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,eAAe,MAAM,wBAAwB,CAAC;AAE1D,OAAO,EAAO,KAAK,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAMlE,QAAA,MAAM,kBAAkB;;8EAuBvB,CAAC;AAEF,QAAA,MAAM,mBAAmB;;8EAsBxB,CAAC;AAoBF,KAAK,cAAc,GAAG,YAAY,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAE9D,KAAK,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,wBAAwB,CAAC,OAAO,eAAe,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,GAC1F,cAAc,GAAG;IACf,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACzB,OAAO,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AAEJ,QAAA,MAAM,MAAM;cAPE,OAAO;aACR,KAAK,CAAC,SAAS;cACd,KAAK,CAAC,SAAS;cACf,MAAM;eACL,MAAM;qDA+FpB,CAAC;AAGF,OAAO,EAAE,MAAM,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,CAAC;AAC3D,YAAY,EAAE,WAAW,EAAE,CAAC"}
@@ -0,0 +1,84 @@
1
+ "use client";
2
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { forwardRef } from "react";
4
+ import * as SwitchPrimitive from "@radix-ui/react-switch";
5
+ import { RiLoader2Line } from "@remixicon/react";
6
+ import { cva } from "class-variance-authority";
7
+ import { cn } from "@/lib/utils";
8
+ // Per docs/emara-ui-phase-2-components.md §3.
9
+ const switchRootVariants = cva([
10
+ "peer inline-flex shrink-0 cursor-pointer items-center rounded-full",
11
+ "border border-transparent transition-colors",
12
+ "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background",
13
+ "disabled:cursor-not-allowed disabled:opacity-50",
14
+ "data-[state=checked]:bg-primary",
15
+ "data-[state=unchecked]:bg-input",
16
+ "aria-busy:cursor-progress",
17
+ ].join(" "), {
18
+ variants: {
19
+ size: {
20
+ // [track width × height], thumb size handled via the thumb's variants.
21
+ // Track widths leave enough room for short side-labels in the empty
22
+ // half (~22px at md, ~26px at lg).
23
+ sm: "h-5 w-10 px-0.5",
24
+ md: "h-6 w-12 px-0.5",
25
+ lg: "h-7 w-16 px-0.5",
26
+ },
27
+ },
28
+ defaultVariants: { size: "md" },
29
+ });
30
+ const switchThumbVariants = cva([
31
+ "pointer-events-none block rounded-full bg-background shadow-sm",
32
+ "transition-transform duration-fast",
33
+ // RTL: in `dir="rtl"` the "checked" position is on the visual start
34
+ // (LTR right == RTL left). Use a CSS variable so the transform flips.
35
+ "translate-x-0",
36
+ ].join(" "), {
37
+ variants: {
38
+ size: {
39
+ // Translation = (track width - thumb size - 2 × px-0.5).
40
+ // sm: 40 - 16 - 4 = 20 → translate-x-5
41
+ // md: 48 - 20 - 4 = 24 → translate-x-6
42
+ // lg: 64 - 24 - 4 = 36 → translate-x-9
43
+ sm: "size-4 data-[state=checked]:translate-x-5 rtl:data-[state=checked]:-translate-x-5",
44
+ md: "size-5 data-[state=checked]:translate-x-6 rtl:data-[state=checked]:-translate-x-6",
45
+ lg: "size-6 data-[state=checked]:translate-x-9 rtl:data-[state=checked]:-translate-x-9",
46
+ },
47
+ },
48
+ defaultVariants: { size: "md" },
49
+ });
50
+ const thumbIconSize = {
51
+ sm: "size-2.5",
52
+ md: "size-3",
53
+ lg: "size-3.5",
54
+ };
55
+ // Side-label sizes are intentionally **sub-canonical** (below the type-scale's
56
+ // `--text-2xs` step at 11px) — they're decorative micro-labels that sit inside
57
+ // the empty half of the track, not body text. Per design-tokens §4.2's note on
58
+ // sub-canonical micro-labels: arbitrary px values are allowed here precisely
59
+ // because these aren't part of the readable type scale. No `tracking-wide`
60
+ // — it would expand the text and clip it against the track edge.
61
+ const sideLabelSize = {
62
+ sm: "text-[8px]",
63
+ md: "text-[9px]",
64
+ lg: "text-[10px]",
65
+ };
66
+ const Switch = forwardRef(function Switch({ className, size = "md", loading = false, onIcon, offIcon, onLabel, offLabel, disabled, checked, defaultChecked, ...props }, ref) {
67
+ const resolvedSize = size ?? "md";
68
+ const isDisabled = disabled || loading;
69
+ // exactOptionalPropertyTypes: explicitly omit `checked`/`defaultChecked`
70
+ // when undefined rather than passing through.
71
+ const controlProps = {};
72
+ if (checked !== undefined)
73
+ controlProps.checked = checked;
74
+ if (defaultChecked !== undefined)
75
+ controlProps.defaultChecked = defaultChecked;
76
+ return (_jsxs(SwitchPrimitive.Root, { ref: ref, disabled: isDisabled, "aria-busy": loading || undefined, ...controlProps, className: cn(switchRootVariants({ size }), "relative", className), ...props, children: [onLabel ? (_jsx("span", { "aria-hidden": "true", className: cn(
77
+ // Sit at the start side (empty when on), vertically centered.
78
+ "text-primary-foreground pointer-events-none absolute inset-y-0 start-1 inline-flex items-center leading-none font-semibold uppercase select-none", sideLabelSize[resolvedSize], "opacity-0 in-data-[state=checked]:opacity-100"), children: onLabel })) : null, offLabel ? (_jsx("span", { "aria-hidden": "true", className: cn(
79
+ // Sit at the end side (empty when off), vertically centered.
80
+ "text-muted-foreground pointer-events-none absolute inset-y-0 end-1 inline-flex items-center leading-none font-semibold uppercase select-none", sideLabelSize[resolvedSize], "opacity-100 in-data-[state=checked]:opacity-0"), children: offLabel })) : null, _jsx(SwitchPrimitive.Thumb, { className: cn(switchThumbVariants({ size })), children: _jsx("span", { className: "text-foreground/70 flex h-full w-full items-center justify-center [&_svg]:size-3 [&_svg]:shrink-0", children: loading ? (_jsx(RiLoader2Line, { className: cn(thumbIconSize[resolvedSize], "animate-spin") })) : (_jsxs(_Fragment, { children: [onIcon ? (_jsx("span", { className: "hidden in-data-[state=checked]:inline-flex", children: onIcon })) : null, offIcon ? (_jsx("span", { className: "inline-flex in-data-[state=checked]:hidden", children: offIcon })) : null] })) }) })] }));
81
+ });
82
+ Switch.displayName = "Switch";
83
+ export { Switch, switchRootVariants, switchThumbVariants };
84
+ //# sourceMappingURL=switch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"switch.js","sourceRoot":"","sources":["../../../components/ui/switch.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,52 @@
1
+ import { type VariantProps } from "class-variance-authority";
2
+ type TableDensity = "warm" | "dense";
3
+ declare const tableVariants: (props?: ({
4
+ bordered?: boolean | null | undefined;
5
+ } & import("class-variance-authority/types").ClassProp) | undefined) => string;
6
+ type TableRootVariants = VariantProps<typeof tableVariants>;
7
+ type TableProps = React.HTMLAttributes<HTMLTableElement> & TableRootVariants & {
8
+ density?: TableDensity;
9
+ striped?: boolean;
10
+ bordered?: boolean;
11
+ hoverable?: boolean;
12
+ stickyHeader?: boolean;
13
+ /** Wraps the table in an overflow container. Default true. */
14
+ wrap?: boolean;
15
+ };
16
+ declare const Table: import("react").ForwardRefExoticComponent<import("react").HTMLAttributes<HTMLTableElement> & TableRootVariants & {
17
+ density?: TableDensity;
18
+ striped?: boolean;
19
+ bordered?: boolean;
20
+ hoverable?: boolean;
21
+ stickyHeader?: boolean;
22
+ /** Wraps the table in an overflow container. Default true. */
23
+ wrap?: boolean;
24
+ } & import("react").RefAttributes<HTMLTableElement>>;
25
+ declare const TableHeader: import("react").ForwardRefExoticComponent<import("react").HTMLAttributes<HTMLTableSectionElement> & import("react").RefAttributes<HTMLTableSectionElement>>;
26
+ declare const TableBody: import("react").ForwardRefExoticComponent<import("react").HTMLAttributes<HTMLTableSectionElement> & import("react").RefAttributes<HTMLTableSectionElement>>;
27
+ declare const TableFooter: import("react").ForwardRefExoticComponent<import("react").HTMLAttributes<HTMLTableSectionElement> & import("react").RefAttributes<HTMLTableSectionElement>>;
28
+ declare const TableRow: import("react").ForwardRefExoticComponent<import("react").HTMLAttributes<HTMLTableRowElement> & import("react").RefAttributes<HTMLTableRowElement>>;
29
+ declare const tableHeadVariants: (props?: ({
30
+ density?: "dense" | "warm" | null | undefined;
31
+ bordered?: boolean | null | undefined;
32
+ } & import("class-variance-authority/types").ClassProp) | undefined) => string;
33
+ type TableHeadProps = React.ThHTMLAttributes<HTMLTableCellElement> & {
34
+ density?: TableDensity;
35
+ };
36
+ declare const TableHead: import("react").ForwardRefExoticComponent<import("react").ThHTMLAttributes<HTMLTableCellElement> & {
37
+ density?: TableDensity;
38
+ } & import("react").RefAttributes<HTMLTableCellElement>>;
39
+ declare const tableCellVariants: (props?: ({
40
+ density?: "dense" | "warm" | null | undefined;
41
+ bordered?: boolean | null | undefined;
42
+ } & import("class-variance-authority/types").ClassProp) | undefined) => string;
43
+ type TableCellProps = React.TdHTMLAttributes<HTMLTableCellElement> & {
44
+ density?: TableDensity;
45
+ };
46
+ declare const TableCell: import("react").ForwardRefExoticComponent<import("react").TdHTMLAttributes<HTMLTableCellElement> & {
47
+ density?: TableDensity;
48
+ } & import("react").RefAttributes<HTMLTableCellElement>>;
49
+ declare const TableCaption: import("react").ForwardRefExoticComponent<import("react").HTMLAttributes<HTMLTableCaptionElement> & import("react").RefAttributes<HTMLTableCaptionElement>>;
50
+ export { Table, TableHeader, TableBody, TableFooter, TableRow, TableHead, TableCell, TableCaption, tableVariants, tableHeadVariants, tableCellVariants, };
51
+ export type { TableProps, TableHeadProps, TableCellProps, TableDensity };
52
+ //# sourceMappingURL=table.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"table.d.ts","sourceRoot":"","sources":["../../../components/ui/table.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAO,KAAK,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAMlE,KAAK,YAAY,GAAG,MAAM,GAAG,OAAO,CAAC;AA0BrC,QAAA,MAAM,aAAa;;8EAQjB,CAAC;AAEH,KAAK,iBAAiB,GAAG,YAAY,CAAC,OAAO,aAAa,CAAC,CAAC;AAE5D,KAAK,UAAU,GAAG,KAAK,CAAC,cAAc,CAAC,gBAAgB,CAAC,GACtD,iBAAiB,GAAG;IAClB,OAAO,CAAC,EAAE,YAAY,CAAC;IACvB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,8DAA8D;IAC9D,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB,CAAC;AAEJ,QAAA,MAAM,KAAK;cATG,YAAY;cACZ,OAAO;eACN,OAAO;gBACN,OAAO;mBACJ,OAAO;IACtB,8DAA8D;WACvD,OAAO;oDAmDhB,CAAC;AAKH,QAAA,MAAM,WAAW,6JAgBf,CAAC;AAKH,QAAA,MAAM,SAAS,6JAKb,CAAC;AAKH,QAAA,MAAM,WAAW,6JAcf,CAAC;AAKH,QAAA,MAAM,QAAQ,qJAiBb,CAAC;AAKF,QAAA,MAAM,iBAAiB;;;8EAkBtB,CAAC;AAEF,KAAK,cAAc,GAAG,KAAK,CAAC,gBAAgB,CAAC,oBAAoB,CAAC,GAAG;IACnE,OAAO,CAAC,EAAE,YAAY,CAAC;CACxB,CAAC;AAEF,QAAA,MAAM,SAAS;cAHH,YAAY;wDAgBtB,CAAC;AAKH,QAAA,MAAM,iBAAiB;;;8EAYrB,CAAC;AAEH,KAAK,cAAc,GAAG,KAAK,CAAC,gBAAgB,CAAC,oBAAoB,CAAC,GAAG;IACnE,OAAO,CAAC,EAAE,YAAY,CAAC;CACxB,CAAC;AAEF,QAAA,MAAM,SAAS;cAHH,YAAY;wDAgBtB,CAAC;AAKH,QAAA,MAAM,YAAY,6JAOhB,CAAC;AAGH,OAAO,EACL,KAAK,EACL,WAAW,EACX,SAAS,EACT,WAAW,EACX,QAAQ,EACR,SAAS,EACT,SAAS,EACT,YAAY,EACZ,aAAa,EACb,iBAAiB,EACjB,iBAAiB,GAClB,CAAC;AACF,YAAY,EAAE,UAAU,EAAE,cAAc,EAAE,cAAc,EAAE,YAAY,EAAE,CAAC"}