@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,306 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { forwardRef, useId, useMemo, useState } from "react";
4
+ import * as PopoverPrimitive from "@radix-ui/react-popover";
5
+ import { RiArrowLeftSLine, RiArrowRightSLine, RiCalendar2Line, RiCloseLine, } from "@remixicon/react";
6
+ import { format as fnsFormat, parse as fnsParse } from "date-fns";
7
+ import { ar, enUS, fr } from "date-fns/locale";
8
+ import { DayPicker } from "react-day-picker";
9
+ import { cva } from "class-variance-authority";
10
+ import { cn } from "@/lib/utils";
11
+ /**
12
+ * Build a Intl.NumberFormat configured for a given locale + numbering system.
13
+ * Used to translate day numbers, week numbers, and year labels when the
14
+ * consumer asks for non-Latin numerals (e.g. ar/arab → ٠١٢٣٤٥٦٧٨٩).
15
+ */
16
+ function buildNumberFormatter(locale, system) {
17
+ // BCP-47 extension subtag `-u-nu-<system>` is the standard way to attach
18
+ // a numbering system. Works even when the base locale isn't recognized.
19
+ const base = locale ?? "en-US";
20
+ try {
21
+ return new Intl.NumberFormat(`${base}-u-nu-${system}`);
22
+ }
23
+ catch {
24
+ return new Intl.NumberFormat("en-US");
25
+ }
26
+ }
27
+ /** Replace ASCII digits 0-9 in `s` with the equivalents from `nf`. */
28
+ function translateDigits(s, nf) {
29
+ return s.replace(/[0-9]/g, (d) => nf.format(Number(d)));
30
+ }
31
+ // ----------------------------------------------------------------------------
32
+ // Locale registry — small built-in set; consumers can extend via the
33
+ // `localeObject` prop when they need a locale not listed here.
34
+ // ----------------------------------------------------------------------------
35
+ const BUILT_IN_LOCALES = {
36
+ "en-US": enUS,
37
+ fr: fr,
38
+ "fr-FR": fr,
39
+ "fr-MA": fr,
40
+ ar: ar,
41
+ "ar-MA": ar,
42
+ };
43
+ function resolveLocale(locale, override) {
44
+ if (override)
45
+ return override;
46
+ if (locale && BUILT_IN_LOCALES[locale])
47
+ return BUILT_IN_LOCALES[locale];
48
+ // Fall back to a 2-letter prefix lookup (e.g. "fr-CA" → fr).
49
+ if (locale) {
50
+ const prefix = locale.slice(0, 2);
51
+ if (BUILT_IN_LOCALES[prefix])
52
+ return BUILT_IN_LOCALES[prefix];
53
+ }
54
+ return enUS;
55
+ }
56
+ // ----------------------------------------------------------------------------
57
+ // Trigger styling — mirrors Input's height + padding scale.
58
+ // ----------------------------------------------------------------------------
59
+ const triggerVariants = cva([
60
+ "flex items-center justify-between w-full gap-2",
61
+ "rounded-md border border-input bg-background text-foreground",
62
+ "transition-colors",
63
+ "focus:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background",
64
+ "disabled:cursor-not-allowed disabled:opacity-50",
65
+ ].join(" "), {
66
+ variants: {
67
+ size: {
68
+ xs: "h-7 ps-2.5 pe-2 text-xs",
69
+ sm: "h-8 ps-3 pe-2 text-xs",
70
+ md: "h-9 ps-3 pe-2 text-sm",
71
+ lg: "h-10 ps-3.5 pe-2.5 text-base",
72
+ xl: "h-12 ps-4 pe-3 text-base",
73
+ },
74
+ invalid: {
75
+ true: "border-destructive focus-visible:ring-destructive",
76
+ false: "",
77
+ },
78
+ },
79
+ defaultVariants: { size: "md", invalid: false },
80
+ });
81
+ const DatePicker = forwardRef(function DatePicker(props, ref) {
82
+ // Extract the mode-specific props (value / defaultValue / onValueChange /
83
+ // mode) explicitly so they don't leak into the underlying <button> via
84
+ // `...rest`. We cast through `any` because TS can't narrow the union without
85
+ // a runtime discriminant, and the spreads below are mode-safe.
86
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
87
+ const propsAny = props;
88
+ const { className, size, invalid, open: openProp, defaultOpen, onOpenChange, placeholder = "Pick a date", rangeEndPlaceholder = "Pick end date", format = "PP", locale, localeObject, min, max, clearable = false, disabledDates, weekStartsOn, showOutsideDays = true, showWeekNumbers = false, numberingSystem = "latn", inline = false, presets, disabled, mode: _mode, value: _value, defaultValue: _defaultValue, onValueChange: _onValueChange, ...rest } = propsAny;
89
+ void _mode;
90
+ void _value;
91
+ void _defaultValue;
92
+ void _onValueChange;
93
+ const mode = (props.mode ?? "single");
94
+ const maxVisibleDates = mode === "multiple" ? (props.maxVisibleDates ?? 2) : 0;
95
+ const isOpenControlled = openProp !== undefined;
96
+ const [openInternal, setOpenInternal] = useState(defaultOpen ?? false);
97
+ const open = isOpenControlled ? openProp : openInternal;
98
+ const setOpen = (next) => {
99
+ if (!isOpenControlled)
100
+ setOpenInternal(next);
101
+ onOpenChange?.(next);
102
+ };
103
+ // ---- Single-mode value state ----
104
+ const singleValueProp = mode === "single" ? props.value : undefined;
105
+ const singleDefault = mode === "single" ? (props.defaultValue ?? null) : null;
106
+ const isSingleControlled = mode === "single" && singleValueProp !== undefined;
107
+ const [singleInternal, setSingleInternal] = useState(singleDefault);
108
+ const singleValue = isSingleControlled ? (singleValueProp ?? null) : singleInternal;
109
+ const setSingleValue = (next) => {
110
+ if (!isSingleControlled)
111
+ setSingleInternal(next);
112
+ if (mode === "single")
113
+ props.onValueChange?.(next);
114
+ };
115
+ // ---- Range-mode value state ----
116
+ const rangeValueProp = mode === "range" ? props.value : undefined;
117
+ const rangeDefault = mode === "range" ? (props.defaultValue ?? null) : null;
118
+ const isRangeControlled = mode === "range" && rangeValueProp !== undefined;
119
+ const [rangeInternal, setRangeInternal] = useState(rangeDefault);
120
+ const rangeValue = isRangeControlled ? (rangeValueProp ?? null) : rangeInternal;
121
+ const setRangeValue = (next) => {
122
+ if (!isRangeControlled)
123
+ setRangeInternal(next);
124
+ if (mode === "range")
125
+ props.onValueChange?.(next);
126
+ };
127
+ // ---- Multiple-mode value state ----
128
+ const multipleValueProp = mode === "multiple" ? props.value : undefined;
129
+ const multipleDefault = mode === "multiple" ? (props.defaultValue ?? []) : [];
130
+ const isMultipleControlled = mode === "multiple" && multipleValueProp !== undefined;
131
+ const [multipleInternal, setMultipleInternal] = useState(multipleDefault ?? []);
132
+ const multipleValue = isMultipleControlled ? (multipleValueProp ?? []) : multipleInternal;
133
+ const setMultipleValue = (next) => {
134
+ if (!isMultipleControlled)
135
+ setMultipleInternal(next);
136
+ if (mode === "multiple")
137
+ props.onValueChange?.(next);
138
+ };
139
+ const resolved = resolveLocale(locale, localeObject);
140
+ const numberFormatter = useMemo(() => buildNumberFormatter(locale, numberingSystem), [locale, numberingSystem]);
141
+ // Display string per mode. For range, format both ends; show
142
+ // `rangeEndPlaceholder` while the second pick is pending.
143
+ const fmtOne = (d) => {
144
+ const raw = fnsFormat(d, format, { locale: resolved });
145
+ return numberingSystem !== "latn" ? translateDigits(raw, numberFormatter) : raw;
146
+ };
147
+ let display = null;
148
+ if (mode === "single") {
149
+ display = singleValue ? fmtOne(singleValue) : null;
150
+ }
151
+ else if (mode === "range") {
152
+ if (rangeValue?.from && rangeValue.to) {
153
+ display = `${fmtOne(rangeValue.from)} — ${fmtOne(rangeValue.to)}`;
154
+ }
155
+ else if (rangeValue?.from) {
156
+ display = `${fmtOne(rangeValue.from)} — ${rangeEndPlaceholder}`;
157
+ }
158
+ }
159
+ else if (mode === "multiple") {
160
+ if (multipleValue.length > 0) {
161
+ const visible = multipleValue.slice(0, maxVisibleDates).map(fmtOne).join(", ");
162
+ const overflow = multipleValue.length - maxVisibleDates;
163
+ display = overflow > 0 ? `${visible} +${overflow} more` : visible;
164
+ }
165
+ }
166
+ const contentId = useId();
167
+ const consumerLabelled = rest["aria-label"] !== undefined || rest["aria-labelledby"] !== undefined;
168
+ const ariaLabelFallback = consumerLabelled ? undefined : (display ?? placeholder);
169
+ const disabledList = (() => {
170
+ const parts = [];
171
+ if (min)
172
+ parts.push({ before: min });
173
+ if (max)
174
+ parts.push({ after: max });
175
+ if (disabledDates)
176
+ parts.push(disabledDates);
177
+ return parts.length === 0 ? undefined : parts;
178
+ })();
179
+ const handleSingleSelect = (date) => {
180
+ setSingleValue(date ?? null);
181
+ if (date && !inline)
182
+ setOpen(false);
183
+ };
184
+ const handleRangeSelect = (range) => {
185
+ setRangeValue(range ?? null);
186
+ // Auto-close only when a complete range is set (both endpoints).
187
+ if (range?.from && range.to && !inline)
188
+ setOpen(false);
189
+ };
190
+ const handleMultipleSelect = (dates) => {
191
+ setMultipleValue(dates ?? []);
192
+ // No auto-close — picking individual dates is open-ended in multiple mode.
193
+ };
194
+ const applyPreset = (preset) => {
195
+ const v = preset.value;
196
+ if (mode === "single" && v instanceof Date) {
197
+ setSingleValue(v);
198
+ if (!inline)
199
+ setOpen(false);
200
+ return;
201
+ }
202
+ if (mode === "range" && !Array.isArray(v) && !(v instanceof Date)) {
203
+ setRangeValue(v);
204
+ if (!inline && v.from && v.to)
205
+ setOpen(false);
206
+ return;
207
+ }
208
+ if (mode === "multiple" && Array.isArray(v)) {
209
+ setMultipleValue(v);
210
+ // Multiple mode never auto-closes — matches handleMultipleSelect.
211
+ return;
212
+ }
213
+ // Shape mismatch — silently ignore. Consumers see no effect and can
214
+ // notice in dev via the visual no-op; we don't throw to keep the
215
+ // component permissive (per the JSDoc note on DatePickerPreset).
216
+ };
217
+ // Has-value flag for the clear button + a11y fallback.
218
+ const hasValue = mode === "single"
219
+ ? Boolean(singleValue)
220
+ : mode === "range"
221
+ ? Boolean(rangeValue?.from)
222
+ : multipleValue.length > 0;
223
+ const buttonProps = rest;
224
+ // The DayPicker JSX is reused in both popover and inline branches. Extracted
225
+ // so we don't duplicate the (sizable) classNames + formatters config.
226
+ // Shared DayPicker config across modes / branches.
227
+ const sharedDayPickerProps = {
228
+ locale: resolved,
229
+ disabled: disabledList,
230
+ weekStartsOn,
231
+ showOutsideDays,
232
+ showWeekNumber: showWeekNumbers,
233
+ ...(numberingSystem !== "latn" && {
234
+ formatters: {
235
+ formatDay: (date) => numberFormatter.format(date.getDate()),
236
+ formatWeekNumber: (week) => numberFormatter.format(week),
237
+ formatYearDropdown: (year) => numberFormatter.format(year.getFullYear()),
238
+ formatMonthDropdown: (month) => new Intl.DateTimeFormat(locale ?? "en-US", { month: "long" }).format(month),
239
+ },
240
+ }),
241
+ classNames: {
242
+ months: "flex flex-col sm:flex-row gap-4",
243
+ month: "space-y-3",
244
+ month_caption: "flex justify-center pt-1 relative items-center h-7",
245
+ caption_label: "text-sm font-medium",
246
+ nav: "absolute inset-x-0 top-1 flex items-center justify-between px-1",
247
+ button_previous: "inline-flex h-7 w-7 items-center justify-center rounded-md border border-input bg-background text-foreground hover:bg-accent hover:text-accent-foreground disabled:opacity-50",
248
+ button_next: "inline-flex h-7 w-7 items-center justify-center rounded-md border border-input bg-background text-foreground hover:bg-accent hover:text-accent-foreground disabled:opacity-50",
249
+ month_grid: "w-full border-collapse",
250
+ weekdays: "flex",
251
+ weekday: "text-muted-foreground rounded-md w-9 font-normal text-xs uppercase",
252
+ week: "flex w-full mt-1",
253
+ day: "h-9 w-9 text-center text-sm p-0 relative",
254
+ day_button: "inline-flex h-9 w-9 items-center justify-center rounded-md text-sm font-normal hover:bg-accent hover:text-accent-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",
255
+ selected: "[&_button]:bg-primary [&_button]:text-primary-foreground [&_button]:hover:bg-primary/90 [&_button]:hover:text-primary-foreground",
256
+ // Range modifiers — endpoints stay primary (same as selected), the
257
+ // middle days get a softer accent fill so the range is visible.
258
+ range_start: "[&_button]:bg-primary [&_button]:text-primary-foreground rounded-s-md rounded-e-none",
259
+ range_end: "[&_button]:bg-primary [&_button]:text-primary-foreground rounded-e-md rounded-s-none",
260
+ range_middle: "[&_button]:bg-accent/40 [&_button]:text-foreground [&_button]:rounded-none rounded-none",
261
+ today: "[&_button]:ring-1 [&_button]:ring-ring",
262
+ outside: "[&_button]:text-muted-foreground [&_button]:opacity-50",
263
+ disabled: "[&_button]:text-muted-foreground [&_button]:opacity-40 [&_button]:pointer-events-none",
264
+ hidden: "invisible",
265
+ },
266
+ components: {
267
+ Chevron: ({ orientation }) => orientation === "left" ? (_jsx(RiArrowLeftSLine, { className: "rtl-mirror size-4", "aria-hidden": "true" })) : (_jsx(RiArrowRightSLine, { className: "rtl-mirror size-4", "aria-hidden": "true" })),
268
+ },
269
+ };
270
+ const rawDayPicker = mode === "range" ? (_jsx(DayPicker, { mode: "range", selected: (rangeValue ?? undefined), onSelect: handleRangeSelect, ...sharedDayPickerProps })) : mode === "multiple" ? (_jsx(DayPicker, { mode: "multiple", selected: multipleValue, onSelect: handleMultipleSelect, ...sharedDayPickerProps })) : (_jsx(DayPicker, { mode: "single", selected: singleValue ?? undefined, onSelect: handleSingleSelect, ...sharedDayPickerProps }));
271
+ const presetsList = presets && presets.length > 0 ? (_jsx("ul", { "aria-label": "Quick options", className: "border-border me-1 flex shrink-0 flex-col gap-1 border-e pe-3", children: presets.map((preset, idx) => (_jsx("li", { children: _jsx("button", { type: "button", onClick: () => applyPreset(preset), className: cn("inline-flex w-full items-center rounded-md px-3 py-1.5 text-sm", "text-foreground hover:bg-accent hover:text-accent-foreground", "focus-visible:ring-ring focus-visible:ring-2 focus-visible:outline-none"), children: preset.label }) }, idx))) })) : null;
272
+ const dayPicker = presetsList ? (_jsxs("div", { className: "flex items-start", children: [presetsList, _jsx("div", { children: rawDayPicker })] })) : (rawDayPicker);
273
+ if (inline) {
274
+ // Inline: no Popover, no trigger button. Render the calendar in a
275
+ // panel-styled wrapper so it looks consistent with the popover mode.
276
+ // `ref` is the consumer's button-shaped ref in popover mode; for the
277
+ // inline div we forward to a div via cast since the component's
278
+ // primary contract is the button trigger. Consumers needing a ref in
279
+ // inline mode should use `useRef<HTMLDivElement>()`.
280
+ return (_jsx("div", { ref: ref, id: contentId, className: cn("border-border bg-popover text-popover-foreground inline-block rounded-md border p-3 shadow-sm", className), children: dayPicker }));
281
+ }
282
+ return (_jsxs(PopoverPrimitive.Root, { open: open, onOpenChange: setOpen, children: [_jsx(PopoverPrimitive.Trigger, { asChild: true, children: _jsxs("button", { ref: ref, type: "button",
283
+ // role="combobox" so aria-invalid is accepted (WAI-ARIA forbids
284
+ // it on `role="button"`). Matches Combobox's trigger semantics:
285
+ // the button represents a value and opens a panel.
286
+ role: "combobox", "aria-haspopup": "dialog", "aria-expanded": open, "aria-controls": open ? contentId : undefined, "aria-invalid": invalid || undefined, "aria-label": ariaLabelFallback, disabled: disabled, className: cn(triggerVariants({ size, invalid }), className), ...buttonProps, children: [_jsx(RiCalendar2Line, { className: "text-muted-foreground size-4 shrink-0", "aria-hidden": "true" }), _jsx("span", { className: cn("flex-1 truncate text-start", !display && "text-muted-foreground"), children: display ?? placeholder }), clearable && hasValue && !disabled ? (_jsx("button", { type: "button", "aria-label": "Clear", onClick: (e) => {
287
+ e.preventDefault();
288
+ e.stopPropagation();
289
+ if (mode === "range")
290
+ setRangeValue(null);
291
+ else if (mode === "multiple")
292
+ setMultipleValue([]);
293
+ else
294
+ setSingleValue(null);
295
+ }, className: cn("inline-flex shrink-0 items-center justify-center rounded p-0.5", "text-muted-foreground hover:text-foreground", "focus-visible:ring-ring focus-visible:ring-2 focus-visible:outline-none"), children: _jsx(RiCloseLine, { className: "size-4" }) })) : null] }) }), _jsx(PopoverPrimitive.Portal, { children: _jsx(PopoverPrimitive.Content, { id: contentId, align: "start", sideOffset: 4, className: cn("z-popover border-border bg-popover text-popover-foreground rounded-md border p-3 shadow-md outline-none", "data-[state=open]:animate-[scale-in_var(--duration-fast)_var(--ease-out)]", "data-[state=closed]:animate-[scale-out_var(--duration-fast)_var(--ease-in)]"), children: dayPicker }) })] }));
296
+ });
297
+ DatePicker.displayName = "DatePicker";
298
+ export { DatePicker };
299
+ /**
300
+ * Utility export — re-exports date-fns' `format` + `parse` so consumers don't
301
+ * have to import them separately for adapter glue. Pulls in date-fns
302
+ * tree-shakably.
303
+ */
304
+ export const dateFormat = fnsFormat;
305
+ export const dateParse = fnsParse;
306
+ //# sourceMappingURL=date-picker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"date-picker.js","sourceRoot":"","sources":["../../../components/ui/date-picker.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ import * as DialogPrimitive from "@radix-ui/react-dialog";
2
+ import { type VariantProps } from "class-variance-authority";
3
+ declare const Dialog: import("react").FC<DialogPrimitive.DialogProps>;
4
+ declare const DialogTrigger: import("react").ForwardRefExoticComponent<DialogPrimitive.DialogTriggerProps & import("react").RefAttributes<HTMLButtonElement>>;
5
+ declare const DialogPortal: import("react").FC<DialogPrimitive.DialogPortalProps>;
6
+ declare const DialogClose: import("react").ForwardRefExoticComponent<DialogPrimitive.DialogCloseProps & import("react").RefAttributes<HTMLButtonElement>>;
7
+ declare const DialogOverlay: import("react").ForwardRefExoticComponent<Omit<DialogPrimitive.DialogOverlayProps & import("react").RefAttributes<HTMLDivElement>, "ref"> & import("react").RefAttributes<HTMLDivElement>>;
8
+ declare const dialogContentVariants: (props?: ({
9
+ size?: "sm" | "md" | "lg" | "xs" | "xl" | "full" | null | undefined;
10
+ } & import("class-variance-authority/types").ClassProp) | undefined) => string;
11
+ type DialogContentVariants = VariantProps<typeof dialogContentVariants>;
12
+ type DialogContentProps = React.ComponentPropsWithoutRef<typeof DialogPrimitive.Content> & DialogContentVariants & {
13
+ closeOnOverlayClick?: boolean;
14
+ closeOnEscape?: boolean;
15
+ confirmBeforeClose?: boolean | (() => boolean | Promise<boolean>);
16
+ loading?: boolean;
17
+ scrollable?: boolean;
18
+ hideCloseButton?: boolean;
19
+ };
20
+ declare const DialogContent: import("react").ForwardRefExoticComponent<Omit<DialogPrimitive.DialogContentProps & import("react").RefAttributes<HTMLDivElement>, "ref"> & DialogContentVariants & {
21
+ closeOnOverlayClick?: boolean;
22
+ closeOnEscape?: boolean;
23
+ confirmBeforeClose?: boolean | (() => boolean | Promise<boolean>);
24
+ loading?: boolean;
25
+ scrollable?: boolean;
26
+ hideCloseButton?: boolean;
27
+ } & import("react").RefAttributes<HTMLDivElement>>;
28
+ declare const DialogHeader: import("react").ForwardRefExoticComponent<import("react").HTMLAttributes<HTMLDivElement> & import("react").RefAttributes<HTMLDivElement>>;
29
+ declare const DialogTitle: import("react").ForwardRefExoticComponent<Omit<DialogPrimitive.DialogTitleProps & import("react").RefAttributes<HTMLHeadingElement>, "ref"> & import("react").RefAttributes<HTMLHeadingElement>>;
30
+ declare const DialogDescription: import("react").ForwardRefExoticComponent<Omit<DialogPrimitive.DialogDescriptionProps & import("react").RefAttributes<HTMLParagraphElement>, "ref"> & import("react").RefAttributes<HTMLParagraphElement>>;
31
+ /**
32
+ * Emara addition — explicit body slot that owns padding + scroll behavior.
33
+ * Use inside DialogContent so the header and footer stay fixed while the body
34
+ * scrolls when content overflows.
35
+ */
36
+ declare const DialogBody: import("react").ForwardRefExoticComponent<import("react").HTMLAttributes<HTMLDivElement> & import("react").RefAttributes<HTMLDivElement>>;
37
+ declare const DialogFooter: import("react").ForwardRefExoticComponent<import("react").HTMLAttributes<HTMLDivElement> & import("react").RefAttributes<HTMLDivElement>>;
38
+ export { Dialog, DialogTrigger, DialogPortal, DialogOverlay, DialogContent, DialogHeader, DialogTitle, DialogDescription, DialogBody, DialogFooter, DialogClose, dialogContentVariants, };
39
+ export type { DialogContentProps };
40
+ //# sourceMappingURL=dialog.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dialog.d.ts","sourceRoot":"","sources":["../../../components/ui/dialog.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,eAAe,MAAM,wBAAwB,CAAC;AAE1D,OAAO,EAAO,KAAK,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAOlE,QAAA,MAAM,MAAM,iDAAuB,CAAC;AACpC,QAAA,MAAM,aAAa,kIAA0B,CAAC;AAC9C,QAAA,MAAM,YAAY,uDAAyB,CAAC;AAC5C,QAAA,MAAM,WAAW,gIAAwB,CAAC;AAM1C,QAAA,MAAM,aAAa,4LAgBjB,CAAC;AAOH,QAAA,MAAM,qBAAqB;;8EAsB1B,CAAC;AAEF,KAAK,qBAAqB,GAAG,YAAY,CAAC,OAAO,qBAAqB,CAAC,CAAC;AAExE,KAAK,kBAAkB,GAAG,KAAK,CAAC,wBAAwB,CAAC,OAAO,eAAe,CAAC,OAAO,CAAC,GACtF,qBAAqB,GAAG;IACtB,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,kBAAkB,CAAC,EAAE,OAAO,GAAG,CAAC,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;IAClE,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B,CAAC;AAEJ,QAAA,MAAM,aAAa;0BARO,OAAO;oBACb,OAAO;yBACF,OAAO,GAAG,CAAC,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;cACvD,OAAO;iBACJ,OAAO;sBACF,OAAO;kDAgG3B,CAAC;AAOH,QAAA,MAAM,YAAY,2IAMjB,CAAC;AAGF,QAAA,MAAM,WAAW,kMAWf,CAAC;AAGH,QAAA,MAAM,iBAAiB,4MAWrB,CAAC;AAGH;;;;GAIG;AACH,QAAA,MAAM,UAAU,2IAMf,CAAC;AAGF,QAAA,MAAM,YAAY,2IAajB,CAAC;AAGF,OAAO,EACL,MAAM,EACN,aAAa,EACb,YAAY,EACZ,aAAa,EACb,aAAa,EACb,YAAY,EACZ,WAAW,EACX,iBAAiB,EACjB,UAAU,EACV,YAAY,EACZ,WAAW,EACX,qBAAqB,GACtB,CAAC;AACF,YAAY,EAAE,kBAAkB,EAAE,CAAC"}
@@ -0,0 +1,110 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { forwardRef } from "react";
4
+ import * as DialogPrimitive from "@radix-ui/react-dialog";
5
+ import { RiCloseLine } from "@remixicon/react";
6
+ import { cva } from "class-variance-authority";
7
+ import { cn } from "@/lib/utils";
8
+ import { Skeleton } from "./skeleton";
9
+ // Per docs/emara-ui-phase-3-components.md §1.
10
+ const Dialog = DialogPrimitive.Root;
11
+ const DialogTrigger = DialogPrimitive.Trigger;
12
+ const DialogPortal = DialogPrimitive.Portal;
13
+ const DialogClose = DialogPrimitive.Close;
14
+ // ----------------------------------------------------------------------------
15
+ // DialogOverlay
16
+ // ----------------------------------------------------------------------------
17
+ const DialogOverlay = forwardRef(function DialogOverlay({ className, ...props }, ref) {
18
+ return (_jsx(DialogPrimitive.Overlay, { ref: ref, className: cn("z-modal bg-foreground/50 fixed inset-0", "data-[state=open]:animate-[fade-in_var(--duration-normal)_var(--ease-out)]", "data-[state=closed]:animate-[fade-out_var(--duration-fast)_var(--ease-in)]", className), ...props }));
19
+ });
20
+ DialogOverlay.displayName = "DialogOverlay";
21
+ // ----------------------------------------------------------------------------
22
+ // DialogContent
23
+ // ----------------------------------------------------------------------------
24
+ const dialogContentVariants = cva([
25
+ "fixed start-1/2 top-1/2 z-modal grid w-full -translate-x-1/2 -translate-y-1/2 gap-0",
26
+ "rounded-lg border border-border bg-card text-card-foreground shadow-xl",
27
+ "data-[state=open]:animate-[scale-in_var(--duration-normal)_var(--ease-out)]",
28
+ "data-[state=closed]:animate-[scale-out_var(--duration-fast)_var(--ease-in)]",
29
+ // The start/-translate-x trick centers via logical start in LTR. RTL flips:
30
+ "rtl:start-auto rtl:end-1/2 rtl:translate-x-1/2",
31
+ ].join(" "), {
32
+ variants: {
33
+ size: {
34
+ xs: "max-w-dialog-xs",
35
+ sm: "max-w-dialog-sm",
36
+ md: "max-w-dialog-md",
37
+ lg: "max-w-dialog-lg",
38
+ xl: "max-w-dialog-xl",
39
+ full: "max-w-[calc(100vw-2rem)] max-h-[calc(100vh-2rem)]",
40
+ },
41
+ },
42
+ defaultVariants: { size: "md" },
43
+ });
44
+ const DialogContent = forwardRef(function DialogContent({ className, size, closeOnOverlayClick = true, closeOnEscape = true, confirmBeforeClose, loading = false, scrollable = false, hideCloseButton = false, onPointerDownOutside, onEscapeKeyDown, onInteractOutside, children, ...props }, ref) {
45
+ const guardedClose = async (e) => {
46
+ if (!confirmBeforeClose)
47
+ return false;
48
+ if (typeof confirmBeforeClose === "function") {
49
+ const ok = await confirmBeforeClose();
50
+ if (!ok) {
51
+ e.preventDefault();
52
+ return true;
53
+ }
54
+ return false;
55
+ }
56
+ const ok = window.confirm("Discard unsaved changes?");
57
+ if (!ok) {
58
+ e.preventDefault();
59
+ return true;
60
+ }
61
+ return false;
62
+ };
63
+ return (_jsxs(DialogPortal, { children: [_jsx(DialogOverlay, {}), _jsxs(DialogPrimitive.Content, { ref: ref, onPointerDownOutside: (e) => {
64
+ if (!closeOnOverlayClick)
65
+ e.preventDefault();
66
+ onPointerDownOutside?.(e);
67
+ }, onEscapeKeyDown: (e) => {
68
+ if (!closeOnEscape)
69
+ e.preventDefault();
70
+ onEscapeKeyDown?.(e);
71
+ }, onInteractOutside: async (e) => {
72
+ if (confirmBeforeClose)
73
+ await guardedClose(e);
74
+ onInteractOutside?.(e);
75
+ }, className: cn(dialogContentVariants({ size }),
76
+ // Optional internal scroll. When scrollable, the body slot becomes
77
+ // the overflow region (see DialogBody).
78
+ scrollable ? "max-h-[85vh]" : "", className), ...props, children: [loading ? (_jsxs("div", { className: "space-y-3 p-6", "aria-busy": "true", "aria-live": "polite", children: [_jsx(Skeleton, { className: "h-6 w-2/5" }), _jsx(Skeleton, { className: "h-4 w-3/5" }), _jsx(Skeleton, { className: "h-4 w-full" }), _jsx(Skeleton, { className: "h-4 w-10/12" }), _jsx(Skeleton, { className: "h-4 w-4/5" })] })) : (children), !hideCloseButton && !loading ? (_jsx(DialogPrimitive.Close, { "aria-label": "Close", className: cn("absolute end-3 top-3 inline-flex size-7 items-center justify-center rounded-md", "text-muted-foreground hover:bg-accent hover:text-accent-foreground", "focus-visible:ring-ring focus-visible:ring-offset-background focus-visible:ring-2 focus-visible:ring-offset-2 focus-visible:outline-none", "[&_svg]:size-4 [&_svg]:shrink-0"), children: _jsx(RiCloseLine, {}) })) : null] })] }));
79
+ });
80
+ DialogContent.displayName = "DialogContent";
81
+ // ----------------------------------------------------------------------------
82
+ // DialogHeader / DialogTitle / DialogDescription / DialogBody / DialogFooter
83
+ // ----------------------------------------------------------------------------
84
+ const DialogHeader = forwardRef(function DialogHeader({ className, ...props }, ref) {
85
+ return (_jsx("div", { ref: ref, className: cn("space-y-1.5 p-6 pe-12 text-start", className), ...props }));
86
+ });
87
+ DialogHeader.displayName = "DialogHeader";
88
+ const DialogTitle = forwardRef(function DialogTitle({ className, ...props }, ref) {
89
+ return (_jsx(DialogPrimitive.Title, { ref: ref, className: cn("text-lg leading-snug font-semibold tracking-tight", className), ...props }));
90
+ });
91
+ DialogTitle.displayName = "DialogTitle";
92
+ const DialogDescription = forwardRef(function DialogDescription({ className, ...props }, ref) {
93
+ return (_jsx(DialogPrimitive.Description, { ref: ref, className: cn("text-muted-foreground text-sm", className), ...props }));
94
+ });
95
+ DialogDescription.displayName = "DialogDescription";
96
+ /**
97
+ * Emara addition — explicit body slot that owns padding + scroll behavior.
98
+ * Use inside DialogContent so the header and footer stay fixed while the body
99
+ * scrolls when content overflows.
100
+ */
101
+ const DialogBody = forwardRef(function DialogBody({ className, ...props }, ref) {
102
+ return (_jsx("div", { ref: ref, className: cn("flex-1 overflow-y-auto px-6 pb-6", className), ...props }));
103
+ });
104
+ DialogBody.displayName = "DialogBody";
105
+ const DialogFooter = forwardRef(function DialogFooter({ className, ...props }, ref) {
106
+ return (_jsx("div", { ref: ref, className: cn("border-border flex flex-col-reverse items-stretch gap-2 border-t p-4 sm:flex-row sm:items-center sm:justify-end", className), ...props }));
107
+ });
108
+ DialogFooter.displayName = "DialogFooter";
109
+ export { Dialog, DialogTrigger, DialogPortal, DialogOverlay, DialogContent, DialogHeader, DialogTitle, DialogDescription, DialogBody, DialogFooter, DialogClose, dialogContentVariants, };
110
+ //# sourceMappingURL=dialog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dialog.js","sourceRoot":"","sources":["../../../components/ui/dialog.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ import * as SeparatorPrimitive from "@radix-ui/react-separator";
2
+ import { type VariantProps } from "class-variance-authority";
3
+ declare const lineVariants: (props?: ({
4
+ orientation?: "horizontal" | "vertical" | null | undefined;
5
+ variant?: "dashed" | "dotted" | "solid" | null | undefined;
6
+ } & import("class-variance-authority/types").ClassProp) | undefined) => string;
7
+ declare const spacingVariants: (props?: ({
8
+ orientation?: "horizontal" | "vertical" | null | undefined;
9
+ spacing?: "sm" | "md" | "lg" | "none" | null | undefined;
10
+ } & import("class-variance-authority/types").ClassProp) | undefined) => string;
11
+ type DividerVariants = VariantProps<typeof lineVariants> & VariantProps<typeof spacingVariants>;
12
+ type DividerProps = Omit<React.ComponentPropsWithoutRef<typeof SeparatorPrimitive.Root>, "orientation" | "decorative"> & DividerVariants & {
13
+ decorative?: boolean;
14
+ label?: React.ReactNode;
15
+ labelPosition?: "start" | "center" | "end";
16
+ };
17
+ declare const Divider: import("react").ForwardRefExoticComponent<Omit<Omit<SeparatorPrimitive.SeparatorProps & import("react").RefAttributes<HTMLDivElement>, "ref">, "orientation" | "decorative"> & VariantProps<(props?: ({
18
+ orientation?: "horizontal" | "vertical" | null | undefined;
19
+ variant?: "dashed" | "dotted" | "solid" | null | undefined;
20
+ } & import("class-variance-authority/types").ClassProp) | undefined) => string> & VariantProps<(props?: ({
21
+ orientation?: "horizontal" | "vertical" | null | undefined;
22
+ spacing?: "sm" | "md" | "lg" | "none" | null | undefined;
23
+ } & import("class-variance-authority/types").ClassProp) | undefined) => string> & {
24
+ decorative?: boolean;
25
+ label?: React.ReactNode;
26
+ labelPosition?: "start" | "center" | "end";
27
+ } & import("react").RefAttributes<HTMLDivElement>>;
28
+ export { Divider, lineVariants };
29
+ export type { DividerProps };
30
+ //# sourceMappingURL=divider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"divider.d.ts","sourceRoot":"","sources":["../../../components/ui/divider.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,kBAAkB,MAAM,2BAA2B,CAAC;AAChE,OAAO,EAAO,KAAK,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAMlE,QAAA,MAAM,YAAY;;;8EAgBhB,CAAC;AAEH,QAAA,MAAM,eAAe;;;8EAyBnB,CAAC;AAEH,KAAK,eAAe,GAAG,YAAY,CAAC,OAAO,YAAY,CAAC,GAAG,YAAY,CAAC,OAAO,eAAe,CAAC,CAAC;AAEhG,KAAK,YAAY,GAAG,IAAI,CACtB,KAAK,CAAC,wBAAwB,CAAC,OAAO,kBAAkB,CAAC,IAAI,CAAC,EAC9D,aAAa,GAAG,YAAY,CAC7B,GACC,eAAe,GAAG;IAChB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,KAAK,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACxB,aAAa,CAAC,EAAE,OAAO,GAAG,QAAQ,GAAG,KAAK,CAAC;CAC5C,CAAC;AAEJ,QAAA,MAAM,OAAO;;;;;;;iBALI,OAAO;YACZ,KAAK,CAAC,SAAS;oBACP,OAAO,GAAG,QAAQ,GAAG,KAAK;kDAkE5C,CAAC;AAGH,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,CAAC;AACjC,YAAY,EAAE,YAAY,EAAE,CAAC"}
@@ -0,0 +1,62 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { forwardRef } from "react";
4
+ import * as SeparatorPrimitive from "@radix-ui/react-separator";
5
+ import { cva } from "class-variance-authority";
6
+ import { cn } from "@/lib/utils";
7
+ // Per docs/emara-ui-phase-1-components.md §8.
8
+ const lineVariants = cva("shrink-0 bg-transparent", {
9
+ variants: {
10
+ orientation: {
11
+ horizontal: "w-full h-px border-t",
12
+ vertical: "h-full w-px border-s",
13
+ },
14
+ variant: {
15
+ solid: "border-solid border-border",
16
+ dashed: "border-dashed border-border",
17
+ dotted: "border-dotted border-border",
18
+ },
19
+ },
20
+ defaultVariants: {
21
+ orientation: "horizontal",
22
+ variant: "solid",
23
+ },
24
+ });
25
+ const spacingVariants = cva("", {
26
+ variants: {
27
+ orientation: {
28
+ horizontal: "",
29
+ vertical: "",
30
+ },
31
+ spacing: {
32
+ none: "",
33
+ sm: "",
34
+ md: "",
35
+ lg: "",
36
+ },
37
+ },
38
+ compoundVariants: [
39
+ { orientation: "horizontal", spacing: "sm", class: "my-2" },
40
+ { orientation: "horizontal", spacing: "md", class: "my-4" },
41
+ { orientation: "horizontal", spacing: "lg", class: "my-6" },
42
+ { orientation: "vertical", spacing: "sm", class: "mx-2" },
43
+ { orientation: "vertical", spacing: "md", class: "mx-4" },
44
+ { orientation: "vertical", spacing: "lg", class: "mx-6" },
45
+ ],
46
+ defaultVariants: {
47
+ orientation: "horizontal",
48
+ spacing: "none",
49
+ },
50
+ });
51
+ const Divider = forwardRef(function Divider({ className, orientation = "horizontal", variant = "solid", spacing = "none", decorative = true, label, labelPosition = "center", ...props }, ref) {
52
+ const hasLabel = label !== undefined && label !== null && orientation === "horizontal";
53
+ if (!hasLabel) {
54
+ return (_jsx(SeparatorPrimitive.Root, { ref: ref, orientation: orientation ?? "horizontal", decorative: decorative, className: cn(lineVariants({ orientation, variant }), spacingVariants({ orientation, spacing }), className), ...props }));
55
+ }
56
+ // Labeled divider — render label between two flex-grown lines. We provide
57
+ // role/aria ourselves because we're no longer a single <hr>/<div role=separator>.
58
+ return (_jsxs("div", { ref: ref, role: decorative ? "presentation" : "separator", "aria-orientation": decorative ? undefined : "horizontal", className: cn("flex w-full items-center gap-3 text-sm text-muted-foreground", spacingVariants({ orientation: "horizontal", spacing }), className), ...props, children: [labelPosition !== "start" ? (_jsx("span", { "aria-hidden": "true", className: cn(lineVariants({ orientation: "horizontal", variant }), "flex-1") })) : null, _jsx("span", { children: label }), labelPosition !== "end" ? (_jsx("span", { "aria-hidden": "true", className: cn(lineVariants({ orientation: "horizontal", variant }), "flex-1") })) : null] }));
59
+ });
60
+ Divider.displayName = "Divider";
61
+ export { Divider, lineVariants };
62
+ //# sourceMappingURL=divider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"divider.js","sourceRoot":"","sources":["../../../components/ui/divider.tsx"],"names":[],"mappings":"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"}