@mdigital_ui/ui 0.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 (205) hide show
  1. package/README.md +296 -0
  2. package/dist/accordion/index.js +5 -0
  3. package/dist/accordion/index.js.map +1 -0
  4. package/dist/badge/index.js +5 -0
  5. package/dist/badge/index.js.map +1 -0
  6. package/dist/button/index.js +6 -0
  7. package/dist/button/index.js.map +1 -0
  8. package/dist/card/index.js +4 -0
  9. package/dist/card/index.js.map +1 -0
  10. package/dist/carousel/index.js +3 -0
  11. package/dist/carousel/index.js.map +1 -0
  12. package/dist/cascader/index.js +4 -0
  13. package/dist/cascader/index.js.map +1 -0
  14. package/dist/chart/index.js +4 -0
  15. package/dist/chart/index.js.map +1 -0
  16. package/dist/checkbox/index.js +5 -0
  17. package/dist/checkbox/index.js.map +1 -0
  18. package/dist/checkbox-group/index.js +4 -0
  19. package/dist/checkbox-group/index.js.map +1 -0
  20. package/dist/chunk-2JGAYDZR.js +181 -0
  21. package/dist/chunk-2JGAYDZR.js.map +1 -0
  22. package/dist/chunk-3PFA3YG6.js +228 -0
  23. package/dist/chunk-3PFA3YG6.js.map +1 -0
  24. package/dist/chunk-4OMLQCUV.js +96 -0
  25. package/dist/chunk-4OMLQCUV.js.map +1 -0
  26. package/dist/chunk-4P5EMRFI.js +298 -0
  27. package/dist/chunk-4P5EMRFI.js.map +1 -0
  28. package/dist/chunk-5UEWVFF6.js +212 -0
  29. package/dist/chunk-5UEWVFF6.js.map +1 -0
  30. package/dist/chunk-5VCGW53O.js +332 -0
  31. package/dist/chunk-5VCGW53O.js.map +1 -0
  32. package/dist/chunk-75XESYGN.js +49 -0
  33. package/dist/chunk-75XESYGN.js.map +1 -0
  34. package/dist/chunk-7AEGBABZ.js +1102 -0
  35. package/dist/chunk-7AEGBABZ.js.map +1 -0
  36. package/dist/chunk-AOITJRSV.js +134 -0
  37. package/dist/chunk-AOITJRSV.js.map +1 -0
  38. package/dist/chunk-AWPKZYHT.js +152 -0
  39. package/dist/chunk-AWPKZYHT.js.map +1 -0
  40. package/dist/chunk-BNILRB4T.js +37 -0
  41. package/dist/chunk-BNILRB4T.js.map +1 -0
  42. package/dist/chunk-BP434VYV.js +448 -0
  43. package/dist/chunk-BP434VYV.js.map +1 -0
  44. package/dist/chunk-C7SXY3ZV.js +65 -0
  45. package/dist/chunk-C7SXY3ZV.js.map +1 -0
  46. package/dist/chunk-CLLQDCDR.js +560 -0
  47. package/dist/chunk-CLLQDCDR.js.map +1 -0
  48. package/dist/chunk-CWHFK7ZC.js +128 -0
  49. package/dist/chunk-CWHFK7ZC.js.map +1 -0
  50. package/dist/chunk-D3JWPGCA.js +123 -0
  51. package/dist/chunk-D3JWPGCA.js.map +1 -0
  52. package/dist/chunk-DOKTHDG3.js +55 -0
  53. package/dist/chunk-DOKTHDG3.js.map +1 -0
  54. package/dist/chunk-DPOSWW22.js +126 -0
  55. package/dist/chunk-DPOSWW22.js.map +1 -0
  56. package/dist/chunk-E2CYDDYC.js +39 -0
  57. package/dist/chunk-E2CYDDYC.js.map +1 -0
  58. package/dist/chunk-EYTOKUBM.js +401 -0
  59. package/dist/chunk-EYTOKUBM.js.map +1 -0
  60. package/dist/chunk-FGWSUPVW.js +356 -0
  61. package/dist/chunk-FGWSUPVW.js.map +1 -0
  62. package/dist/chunk-FPOXTCYV.js +166 -0
  63. package/dist/chunk-FPOXTCYV.js.map +1 -0
  64. package/dist/chunk-FTJOSVTY.js +104 -0
  65. package/dist/chunk-FTJOSVTY.js.map +1 -0
  66. package/dist/chunk-FYHQDFKE.js +164 -0
  67. package/dist/chunk-FYHQDFKE.js.map +1 -0
  68. package/dist/chunk-H2HIBD5Y.js +158 -0
  69. package/dist/chunk-H2HIBD5Y.js.map +1 -0
  70. package/dist/chunk-J3G5WWGR.js +53 -0
  71. package/dist/chunk-J3G5WWGR.js.map +1 -0
  72. package/dist/chunk-JZCHZ4B3.js +487 -0
  73. package/dist/chunk-JZCHZ4B3.js.map +1 -0
  74. package/dist/chunk-KBCBVH7B.js +51 -0
  75. package/dist/chunk-KBCBVH7B.js.map +1 -0
  76. package/dist/chunk-KNQ7UQ2W.js +143 -0
  77. package/dist/chunk-KNQ7UQ2W.js.map +1 -0
  78. package/dist/chunk-KTBPIEP2.js +102 -0
  79. package/dist/chunk-KTBPIEP2.js.map +1 -0
  80. package/dist/chunk-L3SP7GHC.js +1023 -0
  81. package/dist/chunk-L3SP7GHC.js.map +1 -0
  82. package/dist/chunk-LBJG2UWT.js +100 -0
  83. package/dist/chunk-LBJG2UWT.js.map +1 -0
  84. package/dist/chunk-MLDX3Z67.js +470 -0
  85. package/dist/chunk-MLDX3Z67.js.map +1 -0
  86. package/dist/chunk-NNSS366W.js +331 -0
  87. package/dist/chunk-NNSS366W.js.map +1 -0
  88. package/dist/chunk-OQANRZPV.js +197 -0
  89. package/dist/chunk-OQANRZPV.js.map +1 -0
  90. package/dist/chunk-OW5A5IIF.js +175 -0
  91. package/dist/chunk-OW5A5IIF.js.map +1 -0
  92. package/dist/chunk-R225A5II.js +187 -0
  93. package/dist/chunk-R225A5II.js.map +1 -0
  94. package/dist/chunk-ROR4E6IE.js +119 -0
  95. package/dist/chunk-ROR4E6IE.js.map +1 -0
  96. package/dist/chunk-RPAQAZTI.js +54 -0
  97. package/dist/chunk-RPAQAZTI.js.map +1 -0
  98. package/dist/chunk-RQBXZKTH.js +452 -0
  99. package/dist/chunk-RQBXZKTH.js.map +1 -0
  100. package/dist/chunk-S5XJXU52.js +178 -0
  101. package/dist/chunk-S5XJXU52.js.map +1 -0
  102. package/dist/chunk-SAVE5ACL.js +324 -0
  103. package/dist/chunk-SAVE5ACL.js.map +1 -0
  104. package/dist/chunk-SERJ3TZE.js +640 -0
  105. package/dist/chunk-SERJ3TZE.js.map +1 -0
  106. package/dist/chunk-SK5ECBBK.js +175 -0
  107. package/dist/chunk-SK5ECBBK.js.map +1 -0
  108. package/dist/chunk-SOV4PE3P.js +218 -0
  109. package/dist/chunk-SOV4PE3P.js.map +1 -0
  110. package/dist/chunk-W7BQYIXF.js +687 -0
  111. package/dist/chunk-W7BQYIXF.js.map +1 -0
  112. package/dist/chunk-XMAH5PDW.js +59 -0
  113. package/dist/chunk-XMAH5PDW.js.map +1 -0
  114. package/dist/chunk-XOBGEMQY.js +94 -0
  115. package/dist/chunk-XOBGEMQY.js.map +1 -0
  116. package/dist/chunk-YNNAOXU5.js +57 -0
  117. package/dist/chunk-YNNAOXU5.js.map +1 -0
  118. package/dist/chunk-YZVSDRJD.js +253 -0
  119. package/dist/chunk-YZVSDRJD.js.map +1 -0
  120. package/dist/collapse/index.js +4 -0
  121. package/dist/collapse/index.js.map +1 -0
  122. package/dist/command/index.js +5 -0
  123. package/dist/command/index.js.map +1 -0
  124. package/dist/date-picker/index.js +5 -0
  125. package/dist/date-picker/index.js.map +1 -0
  126. package/dist/descriptions/index.js +4 -0
  127. package/dist/descriptions/index.js.map +1 -0
  128. package/dist/drawer/index.js +4 -0
  129. package/dist/drawer/index.js.map +1 -0
  130. package/dist/dropdown/index.js +5 -0
  131. package/dist/dropdown/index.js.map +1 -0
  132. package/dist/empty/index.js +4 -0
  133. package/dist/empty/index.js.map +1 -0
  134. package/dist/fetching-overlay/index.js +5 -0
  135. package/dist/fetching-overlay/index.js.map +1 -0
  136. package/dist/image/index.js +4 -0
  137. package/dist/image/index.js.map +1 -0
  138. package/dist/index.d.ts +2672 -0
  139. package/dist/index.js +976 -0
  140. package/dist/index.js.map +1 -0
  141. package/dist/input/index.js +5 -0
  142. package/dist/input/index.js.map +1 -0
  143. package/dist/input-group/index.js +4 -0
  144. package/dist/input-group/index.js.map +1 -0
  145. package/dist/input-otp/index.js +4 -0
  146. package/dist/input-otp/index.js.map +1 -0
  147. package/dist/input-password/index.js +6 -0
  148. package/dist/input-password/index.js.map +1 -0
  149. package/dist/kbd/index.js +4 -0
  150. package/dist/kbd/index.js.map +1 -0
  151. package/dist/modal/index.js +4 -0
  152. package/dist/modal/index.js.map +1 -0
  153. package/dist/multi-select/index.js +5 -0
  154. package/dist/multi-select/index.js.map +1 -0
  155. package/dist/notification/index.js +4 -0
  156. package/dist/notification/index.js.map +1 -0
  157. package/dist/pagination/index.js +4 -0
  158. package/dist/pagination/index.js.map +1 -0
  159. package/dist/popover/index.js +4 -0
  160. package/dist/popover/index.js.map +1 -0
  161. package/dist/progress/index.js +4 -0
  162. package/dist/progress/index.js.map +1 -0
  163. package/dist/radio/index.js +4 -0
  164. package/dist/radio/index.js.map +1 -0
  165. package/dist/radio-group/index.js +4 -0
  166. package/dist/radio-group/index.js.map +1 -0
  167. package/dist/rating/index.js +4 -0
  168. package/dist/rating/index.js.map +1 -0
  169. package/dist/ribbon/index.js +4 -0
  170. package/dist/ribbon/index.js.map +1 -0
  171. package/dist/select/index.js +6 -0
  172. package/dist/select/index.js.map +1 -0
  173. package/dist/skeleton/index.js +4 -0
  174. package/dist/skeleton/index.js.map +1 -0
  175. package/dist/slider/index.js +4 -0
  176. package/dist/slider/index.js.map +1 -0
  177. package/dist/spinner/index.js +4 -0
  178. package/dist/spinner/index.js.map +1 -0
  179. package/dist/stepper/index.js +4 -0
  180. package/dist/stepper/index.js.map +1 -0
  181. package/dist/styles/base.css +161 -0
  182. package/dist/styles/global.css +633 -0
  183. package/dist/styles/themes/dark.css +84 -0
  184. package/dist/styles/themes/light.css +84 -0
  185. package/dist/switch/index.js +4 -0
  186. package/dist/switch/index.js.map +1 -0
  187. package/dist/table/index.js +12 -0
  188. package/dist/table/index.js.map +1 -0
  189. package/dist/tabs/index.js +5 -0
  190. package/dist/tabs/index.js.map +1 -0
  191. package/dist/textarea/index.js +4 -0
  192. package/dist/textarea/index.js.map +1 -0
  193. package/dist/toggle/index.js +4 -0
  194. package/dist/toggle/index.js.map +1 -0
  195. package/dist/toggle-group/index.js +4 -0
  196. package/dist/toggle-group/index.js.map +1 -0
  197. package/dist/tooltip/index.js +4 -0
  198. package/dist/tooltip/index.js.map +1 -0
  199. package/dist/transfer/index.js +6 -0
  200. package/dist/transfer/index.js.map +1 -0
  201. package/dist/tree/index.js +4 -0
  202. package/dist/tree/index.js.map +1 -0
  203. package/dist/tree-select/index.js +6 -0
  204. package/dist/tree-select/index.js.map +1 -0
  205. package/package.json +107 -0
@@ -0,0 +1,1102 @@
1
+ import { Popover, PopoverTrigger, PopoverContent } from './chunk-3PFA3YG6.js';
2
+ import { cn, iconSizes } from './chunk-YNNAOXU5.js';
3
+ import React from 'react';
4
+ import ReactDatePicker from 'react-datepicker';
5
+ import 'react-datepicker/dist/react-datepicker.css';
6
+ import { Calendar, X, Clock, ChevronsLeft, ChevronsRight, ChevronLeft, ChevronRight } from 'lucide-react';
7
+ import { cva } from 'class-variance-authority';
8
+ import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
9
+
10
+ var pickerInputVariants = cva(
11
+ "w-full focus:border-primary placeholder:text-text-muted disabled:opacity-50 disabled:cursor-not-allowed outline-none text-text-primary transition-colors",
12
+ {
13
+ variants: {
14
+ variant: {
15
+ outline: "bg-background border rounded-md",
16
+ filled: "bg-surface border border-transparent rounded-md"
17
+ },
18
+ status: {
19
+ default: "border-border hover:border-primary/50",
20
+ error: "border-error",
21
+ warning: "border-warning",
22
+ info: "border-info",
23
+ success: "border-success"
24
+ },
25
+ size: {
26
+ xs: "h-8 px-2.5 text-xs",
27
+ sm: "h-[var(--input-height-sm)] px-3 text-sm",
28
+ md: "h-[var(--input-height-md)] px-4 text-base",
29
+ lg: "h-[var(--input-height-lg)] px-5 text-lg"
30
+ },
31
+ fullWidth: {
32
+ true: "w-full",
33
+ false: "max-w-full"
34
+ }
35
+ },
36
+ defaultVariants: {
37
+ variant: "outline",
38
+ status: "default",
39
+ size: "md",
40
+ fullWidth: true
41
+ }
42
+ }
43
+ );
44
+ var datePickerStyles = `
45
+ [&_.react-datepicker]:!bg-background
46
+ [&_.react-datepicker]:!border-border
47
+ [&_.react-datepicker]:!text-text-primary
48
+ [&_.react-datepicker]:!flex
49
+ [&_.react-datepicker]:!gap-0
50
+ [&_.react-datepicker__header]:!bg-transparent
51
+ [&_.react-datepicker__header]:!border-none
52
+ [&_.react-datepicker__header]:!p-0
53
+ [&_.react-datepicker__month-container]:!flex
54
+ [&_.react-datepicker__month-container]:!flex-col
55
+ [&_.react-datepicker__day--selected]:!bg-primary
56
+ [&_.react-datepicker__day--keyboard-selected]:!bg-primary/50
57
+ [&_.react-datepicker__day]:hover:!bg-surface
58
+ [&_.react-datepicker__day-name]:!text-text-muted
59
+ [&_.react-datepicker__current-month]:!hidden
60
+ [&_.react-datepicker__navigation]:!hidden
61
+ [&_.react-datepicker__time-container]:!border-border
62
+ [&_.react-datepicker__time-list-item--selected]:!bg-primary
63
+ [&_.react-datepicker__time-list-item--selected]:!text-white
64
+ [&_.react-datepicker__time-list-item]:hover:!bg-surface
65
+ [&_.react-datepicker__time-list]:!bg-background
66
+ [&_.react-datepicker__day--in-selecting-range]:!bg-primary/30
67
+ [&_.react-datepicker__day--in-range]:!bg-primary/10
68
+ `;
69
+ var YearSelector = ({
70
+ date,
71
+ onYearSelect,
72
+ onDecadeChange
73
+ }) => {
74
+ const currentYear = date.getFullYear();
75
+ const startYear = Math.floor(currentYear / 10) * 10;
76
+ const years = Array.from({ length: 12 }, (_, i) => startYear - 1 + i);
77
+ return /* @__PURE__ */ jsxs("div", { className: "p-4 bg-background", children: [
78
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between mb-4", children: [
79
+ /* @__PURE__ */ jsx(
80
+ "button",
81
+ {
82
+ type: "button",
83
+ onClick: () => onDecadeChange(currentYear - 10),
84
+ className: "p-1 rounded hover:bg-muted text-text-primary transition-colors",
85
+ "aria-label": "Previous decade",
86
+ children: /* @__PURE__ */ jsx(ChevronsLeft, { className: iconSizes.sm })
87
+ }
88
+ ),
89
+ /* @__PURE__ */ jsxs("div", { className: "text-sm font-medium text-text-primary", children: [
90
+ startYear,
91
+ "-",
92
+ startYear + 9
93
+ ] }),
94
+ /* @__PURE__ */ jsx(
95
+ "button",
96
+ {
97
+ type: "button",
98
+ onClick: () => onDecadeChange(currentYear + 10),
99
+ className: "p-1 rounded hover:bg-muted text-text-primary transition-colors",
100
+ "aria-label": "Next decade",
101
+ children: /* @__PURE__ */ jsx(ChevronsRight, { className: iconSizes.sm })
102
+ }
103
+ )
104
+ ] }),
105
+ /* @__PURE__ */ jsx("div", { className: "grid grid-cols-3 gap-2", children: years.map((year) => /* @__PURE__ */ jsx(
106
+ "button",
107
+ {
108
+ type: "button",
109
+ onClick: () => onYearSelect(year),
110
+ className: cn(
111
+ "px-4 py-2 rounded text-sm font-medium transition-colors",
112
+ year === currentYear ? "bg-primary text-white" : year < startYear || year > startYear + 9 ? "text-text-muted opacity-50" : "text-text-primary hover:bg-surface"
113
+ ),
114
+ children: year
115
+ },
116
+ year
117
+ )) })
118
+ ] });
119
+ };
120
+ var MonthSelector = ({
121
+ date,
122
+ onMonthSelect,
123
+ onYearClick,
124
+ onYearChange
125
+ }) => {
126
+ const months = [
127
+ "Jan",
128
+ "Feb",
129
+ "Mar",
130
+ "Apr",
131
+ "May",
132
+ "Jun",
133
+ "Jul",
134
+ "Aug",
135
+ "Sep",
136
+ "Oct",
137
+ "Nov",
138
+ "Dec"
139
+ ];
140
+ const currentMonth = date.getMonth();
141
+ const currentYear = date.getFullYear();
142
+ return /* @__PURE__ */ jsxs("div", { className: "p-4 bg-background", children: [
143
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between mb-4", children: [
144
+ /* @__PURE__ */ jsx(
145
+ "button",
146
+ {
147
+ type: "button",
148
+ onClick: () => onYearChange(currentYear - 1),
149
+ className: "p-1 rounded hover:bg-muted text-text-primary transition-colors",
150
+ "aria-label": "Previous year",
151
+ children: /* @__PURE__ */ jsx(ChevronsLeft, { className: iconSizes.sm })
152
+ }
153
+ ),
154
+ /* @__PURE__ */ jsx(
155
+ "button",
156
+ {
157
+ type: "button",
158
+ onClick: onYearClick,
159
+ className: "text-sm font-medium text-text-primary hover:text-primary transition-colors",
160
+ children: currentYear
161
+ }
162
+ ),
163
+ /* @__PURE__ */ jsx(
164
+ "button",
165
+ {
166
+ type: "button",
167
+ onClick: () => onYearChange(currentYear + 1),
168
+ className: "p-1 rounded hover:bg-muted text-text-primary transition-colors",
169
+ "aria-label": "Next year",
170
+ children: /* @__PURE__ */ jsx(ChevronsRight, { className: iconSizes.sm })
171
+ }
172
+ )
173
+ ] }),
174
+ /* @__PURE__ */ jsx("div", { className: "grid grid-cols-3 gap-2", children: months.map((month, index) => /* @__PURE__ */ jsx(
175
+ "button",
176
+ {
177
+ type: "button",
178
+ onClick: () => onMonthSelect(index),
179
+ className: cn(
180
+ "px-4 py-2 rounded text-sm font-medium transition-colors",
181
+ index === currentMonth ? "bg-primary text-white" : "text-text-primary hover:bg-surface"
182
+ ),
183
+ children: month
184
+ },
185
+ month
186
+ )) })
187
+ ] });
188
+ };
189
+ var CustomCalendarHeader = ({
190
+ date,
191
+ decreaseMonth,
192
+ increaseMonth,
193
+ decreaseYear,
194
+ increaseYear,
195
+ prevMonthButtonDisabled,
196
+ nextMonthButtonDisabled,
197
+ prevYearButtonDisabled,
198
+ nextYearButtonDisabled,
199
+ showMonthSelector = false,
200
+ onMonthClick,
201
+ onYearClick
202
+ }) => {
203
+ const monthName = date.toLocaleDateString("en-US", { month: "long" });
204
+ const year = date.getFullYear();
205
+ return /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between px-4 py-3 bg-surface border-b border-border", children: [
206
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-1", children: [
207
+ /* @__PURE__ */ jsx(
208
+ "button",
209
+ {
210
+ type: "button",
211
+ onClick: decreaseYear,
212
+ disabled: prevYearButtonDisabled || showMonthSelector,
213
+ className: "p-1 rounded hover:bg-muted text-text-primary disabled:opacity-30 disabled:cursor-not-allowed transition-colors",
214
+ "aria-label": "Previous year",
215
+ children: /* @__PURE__ */ jsx(ChevronsLeft, { className: iconSizes.sm })
216
+ }
217
+ ),
218
+ /* @__PURE__ */ jsx(
219
+ "button",
220
+ {
221
+ type: "button",
222
+ onClick: decreaseMonth,
223
+ disabled: prevMonthButtonDisabled || showMonthSelector,
224
+ className: "p-1 rounded hover:bg-muted text-text-primary disabled:opacity-30 disabled:cursor-not-allowed transition-colors",
225
+ "aria-label": "Previous month",
226
+ children: /* @__PURE__ */ jsx(ChevronLeft, { className: iconSizes.sm })
227
+ }
228
+ )
229
+ ] }),
230
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
231
+ /* @__PURE__ */ jsx(
232
+ "button",
233
+ {
234
+ type: "button",
235
+ onClick: onMonthClick,
236
+ className: "text-sm font-medium text-text-primary hover:text-primary transition-colors",
237
+ children: monthName
238
+ }
239
+ ),
240
+ /* @__PURE__ */ jsx(
241
+ "button",
242
+ {
243
+ type: "button",
244
+ onClick: onYearClick,
245
+ className: "text-sm font-medium text-text-primary hover:text-primary transition-colors",
246
+ children: year
247
+ }
248
+ )
249
+ ] }),
250
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-1", children: [
251
+ /* @__PURE__ */ jsx(
252
+ "button",
253
+ {
254
+ type: "button",
255
+ onClick: increaseMonth,
256
+ disabled: nextMonthButtonDisabled || showMonthSelector,
257
+ className: "p-1 rounded hover:bg-muted text-text-primary disabled:opacity-30 disabled:cursor-not-allowed transition-colors",
258
+ "aria-label": "Next month",
259
+ children: /* @__PURE__ */ jsx(ChevronRight, { className: iconSizes.sm })
260
+ }
261
+ ),
262
+ /* @__PURE__ */ jsx(
263
+ "button",
264
+ {
265
+ type: "button",
266
+ onClick: increaseYear,
267
+ disabled: nextYearButtonDisabled || showMonthSelector,
268
+ className: "p-1 rounded hover:bg-muted text-text-primary disabled:opacity-30 disabled:cursor-not-allowed transition-colors",
269
+ "aria-label": "Next year",
270
+ children: /* @__PURE__ */ jsx(ChevronsRight, { className: iconSizes.sm })
271
+ }
272
+ )
273
+ ] })
274
+ ] });
275
+ };
276
+ var PickerWrapper = ({
277
+ label,
278
+ error,
279
+ warning,
280
+ info,
281
+ success,
282
+ helperText,
283
+ messagePosition = "bottom",
284
+ required = false,
285
+ fullWidth = true,
286
+ children
287
+ }) => {
288
+ let status = "default";
289
+ const helperMessage = error || warning || info || success || helperText;
290
+ if (error) {
291
+ status = "error";
292
+ } else if (warning) {
293
+ status = "warning";
294
+ } else if (success) {
295
+ status = "success";
296
+ } else if (info) {
297
+ status = "info";
298
+ }
299
+ if (!label && !helperMessage) return /* @__PURE__ */ jsx(Fragment, { children });
300
+ return /* @__PURE__ */ jsxs(
301
+ "div",
302
+ {
303
+ className: cn(
304
+ "w-full flex flex-col relative",
305
+ !fullWidth && "inline-block"
306
+ ),
307
+ children: [
308
+ /* @__PURE__ */ jsxs("div", { className: "flex gap-2 items-center relative mb-0.5", children: [
309
+ label && /* @__PURE__ */ jsxs("p", { className: "text-sm font-medium text-text-muted", children: [
310
+ label,
311
+ required && /* @__PURE__ */ jsx("span", { className: "text-error ml-1", children: "*" })
312
+ ] }),
313
+ helperMessage && messagePosition === "top" && /* @__PURE__ */ jsx(
314
+ "p",
315
+ {
316
+ id: `picker-helper-${status}`,
317
+ className: cn(
318
+ "text-xs",
319
+ status === "error" && "text-error",
320
+ status === "warning" && "text-warning",
321
+ status === "info" && "text-info",
322
+ status === "success" && "text-success",
323
+ status === "default" && "text-text-muted"
324
+ ),
325
+ children: helperMessage
326
+ }
327
+ )
328
+ ] }),
329
+ children,
330
+ helperMessage && messagePosition === "bottom" && /* @__PURE__ */ jsx(
331
+ "p",
332
+ {
333
+ id: `picker-helper-${status}`,
334
+ className: cn(
335
+ "text-xs mt-0.5",
336
+ status === "error" && "text-error",
337
+ status === "warning" && "text-warning",
338
+ status === "info" && "text-info",
339
+ status === "success" && "text-success",
340
+ status === "default" && "text-text-muted"
341
+ ),
342
+ children: helperMessage
343
+ }
344
+ )
345
+ ]
346
+ }
347
+ );
348
+ };
349
+ var DatePickerComponent = React.memo(
350
+ ({
351
+ variant = "outline",
352
+ size = "md",
353
+ label,
354
+ error,
355
+ warning,
356
+ info,
357
+ success,
358
+ helperText,
359
+ messagePosition = "bottom",
360
+ placeholder = "Select date...",
361
+ disabled = false,
362
+ required = false,
363
+ clearable = false,
364
+ fullWidth = true,
365
+ className,
366
+ value,
367
+ defaultValue,
368
+ onChange,
369
+ minDate,
370
+ maxDate,
371
+ dateFormat = "MM/dd/yyyy"
372
+ }) => {
373
+ const [internalValue, setInternalValue] = React.useState(
374
+ defaultValue || null
375
+ );
376
+ const currentValue = value !== void 0 ? value : internalValue;
377
+ const [isOpen, setIsOpen] = React.useState(false);
378
+ const [showMonthSelector, setShowMonthSelector] = React.useState(false);
379
+ const [showYearSelector, setShowYearSelector] = React.useState(false);
380
+ const [viewDate, setViewDate] = React.useState(currentValue || /* @__PURE__ */ new Date());
381
+ const [hoverDate, setHoverDate] = React.useState(null);
382
+ const datePickerRef = React.useRef(null);
383
+ let status = "default";
384
+ if (error) status = "error";
385
+ else if (warning) status = "warning";
386
+ else if (success) status = "success";
387
+ else if (info) status = "info";
388
+ const handleDateChange = (date) => {
389
+ if (value === void 0) {
390
+ setInternalValue(date);
391
+ }
392
+ onChange?.(date);
393
+ setHoverDate(null);
394
+ setIsOpen(false);
395
+ setShowMonthSelector(false);
396
+ setShowYearSelector(false);
397
+ };
398
+ const handleClear = (e) => {
399
+ e.stopPropagation();
400
+ if (value === void 0) {
401
+ setInternalValue(null);
402
+ }
403
+ onChange?.(null);
404
+ };
405
+ const handleMonthSelect = (month) => {
406
+ const newDate = new Date(viewDate);
407
+ newDate.setMonth(month);
408
+ setViewDate(newDate);
409
+ setShowMonthSelector(false);
410
+ };
411
+ const handleYearSelect = (year) => {
412
+ const newDate = new Date(viewDate);
413
+ newDate.setFullYear(year);
414
+ setViewDate(newDate);
415
+ setShowYearSelector(false);
416
+ setShowMonthSelector(true);
417
+ };
418
+ const handleYearChange = (year) => {
419
+ const newDate = new Date(viewDate);
420
+ newDate.setFullYear(year);
421
+ setViewDate(newDate);
422
+ };
423
+ const handleDecadeChange = (year) => {
424
+ const newDate = new Date(viewDate);
425
+ newDate.setFullYear(year);
426
+ setViewDate(newDate);
427
+ };
428
+ const showClear = clearable && currentValue && !disabled;
429
+ const formatDate = (date) => {
430
+ return new Date(date).toLocaleDateString("en-US", {
431
+ month: "2-digit",
432
+ day: "2-digit",
433
+ year: "numeric"
434
+ });
435
+ };
436
+ const getDisplayValue = () => {
437
+ if (hoverDate) {
438
+ return { confirmed: "", preview: formatDate(hoverDate) };
439
+ }
440
+ if (currentValue) {
441
+ return { confirmed: formatDate(currentValue), preview: "" };
442
+ }
443
+ return { confirmed: "", preview: "" };
444
+ };
445
+ const { confirmed, preview } = getDisplayValue();
446
+ const customHeader = (props) => /* @__PURE__ */ jsx(
447
+ CustomCalendarHeader,
448
+ {
449
+ ...props,
450
+ showMonthSelector,
451
+ onMonthClick: () => setShowMonthSelector(!showMonthSelector),
452
+ onYearClick: () => setShowYearSelector(true)
453
+ }
454
+ );
455
+ const triggerButton = /* @__PURE__ */ jsx(
456
+ "button",
457
+ {
458
+ type: "button",
459
+ disabled,
460
+ onClick: () => setIsOpen(!isOpen),
461
+ className: cn(
462
+ pickerInputVariants({ variant, status, size, fullWidth }),
463
+ "pl-10 flex items-center justify-start cursor-pointer",
464
+ showClear && "pr-10",
465
+ className
466
+ ),
467
+ children: confirmed || preview ? /* @__PURE__ */ jsxs(Fragment, { children: [
468
+ confirmed && /* @__PURE__ */ jsx("span", { children: confirmed }),
469
+ preview && /* @__PURE__ */ jsx("span", { className: "text-text-muted", children: preview })
470
+ ] }) : /* @__PURE__ */ jsx("span", { className: "text-text-muted", children: placeholder })
471
+ }
472
+ );
473
+ return /* @__PURE__ */ jsx(
474
+ PickerWrapper,
475
+ {
476
+ label,
477
+ error,
478
+ warning,
479
+ info,
480
+ success,
481
+ helperText,
482
+ messagePosition,
483
+ required,
484
+ fullWidth,
485
+ children: /* @__PURE__ */ jsxs("div", { className: "relative w-full", children: [
486
+ /* @__PURE__ */ jsx("div", { className: "absolute left-3 flex items-center h-full top-0 text-text-muted pointer-events-none z-10", children: /* @__PURE__ */ jsx(Calendar, { className: iconSizes[size] }) }),
487
+ /* @__PURE__ */ jsxs(
488
+ Popover,
489
+ {
490
+ open: isOpen,
491
+ onOpenChange: (open) => {
492
+ setIsOpen(open);
493
+ if (!open) {
494
+ setShowMonthSelector(false);
495
+ setShowYearSelector(false);
496
+ setHoverDate(null);
497
+ }
498
+ },
499
+ children: [
500
+ /* @__PURE__ */ jsx(PopoverTrigger, { asChild: true, children: triggerButton }),
501
+ /* @__PURE__ */ jsx(
502
+ PopoverContent,
503
+ {
504
+ className: "p-0 w-auto",
505
+ align: "start",
506
+ sideOffset: 4,
507
+ onOpenAutoFocus: (e) => e.preventDefault(),
508
+ children: /* @__PURE__ */ jsx(Fragment, { children: showYearSelector ? /* @__PURE__ */ jsx(
509
+ YearSelector,
510
+ {
511
+ date: viewDate,
512
+ onYearSelect: handleYearSelect,
513
+ onDecadeChange: handleDecadeChange
514
+ }
515
+ ) : showMonthSelector ? /* @__PURE__ */ jsx(
516
+ MonthSelector,
517
+ {
518
+ date: viewDate,
519
+ onMonthSelect: handleMonthSelect,
520
+ onYearClick: () => setShowYearSelector(true),
521
+ onYearChange: handleYearChange
522
+ }
523
+ ) : /* @__PURE__ */ jsx("div", { className: datePickerStyles, children: /* @__PURE__ */ jsx(
524
+ ReactDatePicker,
525
+ {
526
+ ref: datePickerRef,
527
+ selected: currentValue,
528
+ onChange: handleDateChange,
529
+ disabled,
530
+ minDate,
531
+ maxDate,
532
+ dateFormat,
533
+ renderCustomHeader: customHeader,
534
+ openToDate: viewDate,
535
+ onMonthChange: setViewDate,
536
+ onDayMouseEnter: setHoverDate,
537
+ inline: true
538
+ }
539
+ ) }) })
540
+ }
541
+ )
542
+ ]
543
+ }
544
+ ),
545
+ showClear && /* @__PURE__ */ jsx(
546
+ "button",
547
+ {
548
+ type: "button",
549
+ onClick: handleClear,
550
+ className: "absolute right-3 flex items-center h-full top-0 text-text-muted hover:text-text-primary z-10",
551
+ "aria-label": "Clear date",
552
+ children: /* @__PURE__ */ jsx(X, { className: iconSizes[size] })
553
+ }
554
+ )
555
+ ] })
556
+ }
557
+ );
558
+ }
559
+ );
560
+ DatePickerComponent.displayName = "DatePicker";
561
+ var RangePickerComponent = React.memo(
562
+ ({
563
+ variant = "outline",
564
+ size = "md",
565
+ label,
566
+ error,
567
+ warning,
568
+ info,
569
+ success,
570
+ helperText,
571
+ messagePosition = "bottom",
572
+ placeholder = "Select date range...",
573
+ disabled = false,
574
+ required = false,
575
+ clearable = false,
576
+ fullWidth = true,
577
+ className,
578
+ startDate,
579
+ endDate,
580
+ defaultStartDate,
581
+ defaultEndDate,
582
+ onChange,
583
+ minDate,
584
+ maxDate,
585
+ dateFormat = "MM/dd/yyyy"
586
+ }) => {
587
+ const [internalStartDate, setInternalStartDate] = React.useState(defaultStartDate || null);
588
+ const [internalEndDate, setInternalEndDate] = React.useState(
589
+ defaultEndDate || null
590
+ );
591
+ const currentStartDate = startDate !== void 0 ? startDate : internalStartDate;
592
+ const currentEndDate = endDate !== void 0 ? endDate : internalEndDate;
593
+ const [isOpen, setIsOpen] = React.useState(false);
594
+ const [showMonthSelector, setShowMonthSelector] = React.useState(false);
595
+ const [showYearSelector, setShowYearSelector] = React.useState(false);
596
+ const [viewDate, setViewDate] = React.useState(
597
+ currentStartDate || /* @__PURE__ */ new Date()
598
+ );
599
+ const [hoverDate, setHoverDate] = React.useState(null);
600
+ const datePickerRef = React.useRef(null);
601
+ let status = "default";
602
+ if (error) status = "error";
603
+ else if (warning) status = "warning";
604
+ else if (success) status = "success";
605
+ else if (info) status = "info";
606
+ const handleChange = (dates) => {
607
+ if (startDate === void 0 && endDate === void 0) {
608
+ setInternalStartDate(dates[0]);
609
+ setInternalEndDate(dates[1]);
610
+ }
611
+ onChange?.(dates);
612
+ setHoverDate(null);
613
+ if (dates[0] && dates[1]) {
614
+ setIsOpen(false);
615
+ setShowMonthSelector(false);
616
+ setShowYearSelector(false);
617
+ }
618
+ };
619
+ const handleClear = (e) => {
620
+ e.stopPropagation();
621
+ if (startDate === void 0 && endDate === void 0) {
622
+ setInternalStartDate(null);
623
+ setInternalEndDate(null);
624
+ }
625
+ onChange?.([null, null]);
626
+ };
627
+ const handleMonthSelect = (month) => {
628
+ const newDate = new Date(viewDate);
629
+ newDate.setMonth(month);
630
+ setViewDate(newDate);
631
+ setShowMonthSelector(false);
632
+ };
633
+ const handleYearSelect = (year) => {
634
+ const newDate = new Date(viewDate);
635
+ newDate.setFullYear(year);
636
+ setViewDate(newDate);
637
+ setShowYearSelector(false);
638
+ setShowMonthSelector(true);
639
+ };
640
+ const handleYearChange = (year) => {
641
+ const newDate = new Date(viewDate);
642
+ newDate.setFullYear(year);
643
+ setViewDate(newDate);
644
+ };
645
+ const handleDecadeChange = (year) => {
646
+ const newDate = new Date(viewDate);
647
+ newDate.setFullYear(year);
648
+ setViewDate(newDate);
649
+ };
650
+ const showClear = clearable && (currentStartDate || currentEndDate) && !disabled;
651
+ const formatDate = (date) => {
652
+ return new Date(date).toLocaleDateString("en-US", {
653
+ month: "2-digit",
654
+ day: "2-digit",
655
+ year: "numeric"
656
+ });
657
+ };
658
+ const getDisplayValue = () => {
659
+ if (hoverDate && currentStartDate && !currentEndDate) {
660
+ const start2 = formatDate(currentStartDate);
661
+ const hover = formatDate(hoverDate);
662
+ return { confirmed: `${start2} - `, preview: hover };
663
+ }
664
+ if (hoverDate && !currentStartDate && !currentEndDate) {
665
+ const hover = formatDate(hoverDate);
666
+ return { confirmed: "", preview: hover };
667
+ }
668
+ if (!currentStartDate && !currentEndDate) {
669
+ return { confirmed: "", preview: "" };
670
+ }
671
+ const start = currentStartDate ? formatDate(currentStartDate) : "";
672
+ const end = currentEndDate ? formatDate(currentEndDate) : "";
673
+ if (start && end) {
674
+ return { confirmed: `${start} - ${end}`, preview: "" };
675
+ }
676
+ if (start) {
677
+ return { confirmed: `${start}`, preview: " - ..." };
678
+ }
679
+ return { confirmed: "", preview: "" };
680
+ };
681
+ const { confirmed: rangeConfirmed, preview: rangePreview } = getDisplayValue();
682
+ const customHeader = (props) => /* @__PURE__ */ jsx(
683
+ CustomCalendarHeader,
684
+ {
685
+ ...props,
686
+ showMonthSelector,
687
+ onMonthClick: () => setShowMonthSelector(!showMonthSelector),
688
+ onYearClick: () => setShowYearSelector(true)
689
+ }
690
+ );
691
+ const rangeTriggerButton = /* @__PURE__ */ jsx(
692
+ "button",
693
+ {
694
+ type: "button",
695
+ disabled,
696
+ onClick: () => setIsOpen(!isOpen),
697
+ className: cn(
698
+ pickerInputVariants({ variant, status, size, fullWidth }),
699
+ "pl-10 flex items-center justify-start cursor-pointer",
700
+ showClear && "pr-10",
701
+ className
702
+ ),
703
+ children: rangeConfirmed || rangePreview ? /* @__PURE__ */ jsxs(Fragment, { children: [
704
+ rangeConfirmed && /* @__PURE__ */ jsx("span", { children: rangeConfirmed }),
705
+ rangePreview && /* @__PURE__ */ jsx("span", { className: "text-text-muted", children: rangePreview })
706
+ ] }) : /* @__PURE__ */ jsx("span", { className: "text-text-muted", children: placeholder })
707
+ }
708
+ );
709
+ return /* @__PURE__ */ jsx(
710
+ PickerWrapper,
711
+ {
712
+ label,
713
+ error,
714
+ warning,
715
+ info,
716
+ success,
717
+ helperText,
718
+ messagePosition,
719
+ required,
720
+ fullWidth,
721
+ children: /* @__PURE__ */ jsxs("div", { className: "relative w-full", children: [
722
+ /* @__PURE__ */ jsx("div", { className: "absolute left-3 flex items-center h-full top-0 text-text-muted pointer-events-none z-10", children: /* @__PURE__ */ jsx(Calendar, { className: iconSizes[size] }) }),
723
+ /* @__PURE__ */ jsxs(
724
+ Popover,
725
+ {
726
+ open: isOpen,
727
+ onOpenChange: (open) => {
728
+ setIsOpen(open);
729
+ if (!open) {
730
+ setShowMonthSelector(false);
731
+ setShowYearSelector(false);
732
+ setHoverDate(null);
733
+ }
734
+ },
735
+ children: [
736
+ /* @__PURE__ */ jsx(PopoverTrigger, { asChild: true, children: rangeTriggerButton }),
737
+ /* @__PURE__ */ jsx(
738
+ PopoverContent,
739
+ {
740
+ className: "p-0 w-auto",
741
+ align: "start",
742
+ sideOffset: 4,
743
+ onOpenAutoFocus: (e) => e.preventDefault(),
744
+ children: /* @__PURE__ */ jsx(Fragment, { children: showYearSelector ? /* @__PURE__ */ jsx(
745
+ YearSelector,
746
+ {
747
+ date: viewDate,
748
+ onYearSelect: handleYearSelect,
749
+ onDecadeChange: handleDecadeChange
750
+ }
751
+ ) : showMonthSelector ? /* @__PURE__ */ jsx(
752
+ MonthSelector,
753
+ {
754
+ date: viewDate,
755
+ onMonthSelect: handleMonthSelect,
756
+ onYearClick: () => setShowYearSelector(true),
757
+ onYearChange: handleYearChange
758
+ }
759
+ ) : /* @__PURE__ */ jsx("div", { className: datePickerStyles, children: /* @__PURE__ */ jsx(
760
+ ReactDatePicker,
761
+ {
762
+ ref: datePickerRef,
763
+ selectsRange: true,
764
+ startDate: currentStartDate,
765
+ endDate: currentEndDate,
766
+ onChange: handleChange,
767
+ disabled,
768
+ minDate,
769
+ maxDate,
770
+ dateFormat,
771
+ renderCustomHeader: customHeader,
772
+ openToDate: viewDate,
773
+ onMonthChange: setViewDate,
774
+ monthsShown: 2,
775
+ onDayMouseEnter: setHoverDate,
776
+ inline: true
777
+ }
778
+ ) }) })
779
+ }
780
+ )
781
+ ]
782
+ }
783
+ ),
784
+ showClear && /* @__PURE__ */ jsx(
785
+ "button",
786
+ {
787
+ type: "button",
788
+ onClick: handleClear,
789
+ className: "absolute right-3 flex items-center h-full top-0 text-text-muted hover:text-text-primary z-10",
790
+ "aria-label": "Clear date range",
791
+ children: /* @__PURE__ */ jsx(X, { className: iconSizes[size] })
792
+ }
793
+ )
794
+ ] })
795
+ }
796
+ );
797
+ }
798
+ );
799
+ RangePickerComponent.displayName = "RangePicker";
800
+ var TimeColumn = React.memo(({ items, selected, onSelect, onHover, onLeave }) => /* @__PURE__ */ jsx(
801
+ "div",
802
+ {
803
+ className: "flex flex-col h-[240px] overflow-y-auto scrollbar-thin scrollbar-thumb-border scrollbar-track-background",
804
+ onMouseLeave: onLeave,
805
+ children: items.map((item) => /* @__PURE__ */ jsx(
806
+ "button",
807
+ {
808
+ type: "button",
809
+ onClick: () => onSelect(item),
810
+ onMouseEnter: () => onHover?.(item),
811
+ className: cn(
812
+ "px-4 py-2 text-sm font-medium transition-colors text-center min-h-[40px] flex items-center justify-center",
813
+ item === selected ? "bg-surface text-text-primary font-semibold" : "text-text-muted hover:bg-surface/50"
814
+ ),
815
+ children: typeof item === "number" ? String(item).padStart(2, "0") : item
816
+ },
817
+ item
818
+ ))
819
+ }
820
+ ));
821
+ TimeColumn.displayName = "TimeColumn";
822
+ var TimeColumnPicker = ({
823
+ value,
824
+ onChange,
825
+ onPreview,
826
+ timeFormat = "h:mm aa"
827
+ }) => {
828
+ const is12Hour = timeFormat.includes("aa");
829
+ const currentDate = value || /* @__PURE__ */ new Date();
830
+ const currentHour = currentDate.getHours();
831
+ const currentMinute = currentDate.getMinutes();
832
+ const [selectedHour, setSelectedHour] = React.useState(
833
+ is12Hour ? currentHour % 12 || 12 : currentHour
834
+ );
835
+ const [selectedMinute, setSelectedMinute] = React.useState(currentMinute);
836
+ const [selectedPeriod, setSelectedPeriod] = React.useState(
837
+ currentHour >= 12 ? "PM" : "AM"
838
+ );
839
+ const [hoverHour, setHoverHour] = React.useState(null);
840
+ const [hoverMinute, setHoverMinute] = React.useState(null);
841
+ const [hoverPeriod, setHoverPeriod] = React.useState(null);
842
+ const hours = is12Hour ? Array.from({ length: 12 }, (_, i) => i + 1) : Array.from({ length: 24 }, (_, i) => i);
843
+ const minutes = Array.from({ length: 60 }, (_, i) => i);
844
+ const periods = ["AM", "PM"];
845
+ React.useEffect(() => {
846
+ if (hoverHour !== null || hoverMinute !== null || hoverPeriod !== null) {
847
+ const previewHour = hoverHour ?? selectedHour;
848
+ const previewMinute = hoverMinute ?? selectedMinute;
849
+ const previewPeriod = hoverPeriod ?? selectedPeriod;
850
+ const formattedHour = String(previewHour).padStart(2, "0");
851
+ const formattedMinute = String(previewMinute).padStart(2, "0");
852
+ const previewString = is12Hour ? `${previewHour}:${formattedMinute} ${previewPeriod}` : `${formattedHour}:${formattedMinute}`;
853
+ onPreview?.(previewString);
854
+ } else {
855
+ onPreview?.("");
856
+ }
857
+ }, [
858
+ hoverHour,
859
+ hoverMinute,
860
+ hoverPeriod,
861
+ selectedHour,
862
+ selectedMinute,
863
+ selectedPeriod,
864
+ is12Hour,
865
+ onPreview
866
+ ]);
867
+ const handleOkClick = () => {
868
+ const newDate = new Date(currentDate);
869
+ let finalHour = selectedHour;
870
+ if (is12Hour) {
871
+ if (selectedPeriod === "PM" && selectedHour !== 12) {
872
+ finalHour = selectedHour + 12;
873
+ } else if (selectedPeriod === "AM" && selectedHour === 12) {
874
+ finalHour = 0;
875
+ }
876
+ }
877
+ newDate.setHours(finalHour);
878
+ newDate.setMinutes(selectedMinute);
879
+ newDate.setSeconds(0);
880
+ onPreview?.("");
881
+ onChange(newDate);
882
+ };
883
+ const handleNowClick = () => {
884
+ const now = /* @__PURE__ */ new Date();
885
+ const nowHour = now.getHours();
886
+ const nowMinute = now.getMinutes();
887
+ setSelectedHour(is12Hour ? nowHour % 12 || 12 : nowHour);
888
+ setSelectedMinute(nowMinute);
889
+ setSelectedPeriod(nowHour >= 12 ? "PM" : "AM");
890
+ onPreview?.("");
891
+ onChange(now);
892
+ };
893
+ return /* @__PURE__ */ jsxs("div", { className: "flex flex-col bg-background", children: [
894
+ /* @__PURE__ */ jsxs("div", { className: "flex gap-0", children: [
895
+ /* @__PURE__ */ jsx(
896
+ TimeColumn,
897
+ {
898
+ items: hours,
899
+ selected: selectedHour,
900
+ onSelect: setSelectedHour,
901
+ onHover: setHoverHour,
902
+ onLeave: () => setHoverHour(null)
903
+ }
904
+ ),
905
+ /* @__PURE__ */ jsx(
906
+ TimeColumn,
907
+ {
908
+ items: minutes,
909
+ selected: selectedMinute,
910
+ onSelect: setSelectedMinute,
911
+ onHover: setHoverMinute,
912
+ onLeave: () => setHoverMinute(null)
913
+ }
914
+ ),
915
+ is12Hour && /* @__PURE__ */ jsx(
916
+ TimeColumn,
917
+ {
918
+ items: periods,
919
+ selected: selectedPeriod,
920
+ onSelect: setSelectedPeriod,
921
+ onHover: setHoverPeriod,
922
+ onLeave: () => setHoverPeriod(null)
923
+ }
924
+ )
925
+ ] }),
926
+ /* @__PURE__ */ jsxs("div", { className: "p-3 border-t border-border flex gap-2", children: [
927
+ /* @__PURE__ */ jsx(
928
+ "button",
929
+ {
930
+ type: "button",
931
+ onClick: handleNowClick,
932
+ className: "flex-1 px-4 py-2 bg-surface text-text-primary rounded-md hover:bg-surface/80 transition-colors font-medium text-sm border border-border",
933
+ children: "Now"
934
+ }
935
+ ),
936
+ /* @__PURE__ */ jsx(
937
+ "button",
938
+ {
939
+ type: "button",
940
+ onClick: handleOkClick,
941
+ className: "flex-1 px-4 py-2 bg-primary text-white rounded-md hover:bg-primary/90 transition-colors font-medium text-sm",
942
+ children: "OK"
943
+ }
944
+ )
945
+ ] })
946
+ ] });
947
+ };
948
+ var TimePickerComponent = React.memo(
949
+ ({
950
+ variant = "outline",
951
+ size = "md",
952
+ label,
953
+ error,
954
+ warning,
955
+ info,
956
+ success,
957
+ helperText,
958
+ messagePosition = "bottom",
959
+ placeholder = "Select time...",
960
+ disabled = false,
961
+ required = false,
962
+ clearable = false,
963
+ fullWidth = true,
964
+ className,
965
+ value,
966
+ defaultValue,
967
+ onChange,
968
+ timeFormat = "h:mm aa"
969
+ }) => {
970
+ const [internalValue, setInternalValue] = React.useState(
971
+ defaultValue || null
972
+ );
973
+ const currentValue = value !== void 0 ? value : internalValue;
974
+ const [isOpen, setIsOpen] = React.useState(false);
975
+ const [previewTime, setPreviewTime] = React.useState("");
976
+ let status = "default";
977
+ if (error) status = "error";
978
+ else if (warning) status = "warning";
979
+ else if (success) status = "success";
980
+ else if (info) status = "info";
981
+ const handleTimeChange = (date) => {
982
+ if (value === void 0) {
983
+ setInternalValue(date);
984
+ }
985
+ onChange?.(date);
986
+ setPreviewTime("");
987
+ setIsOpen(false);
988
+ };
989
+ const handleClear = (e) => {
990
+ e.stopPropagation();
991
+ if (value === void 0) {
992
+ setInternalValue(null);
993
+ }
994
+ onChange?.(null);
995
+ };
996
+ const showClear = clearable && currentValue && !disabled;
997
+ const formatTime = (date) => {
998
+ return new Date(date).toLocaleTimeString("en-US", {
999
+ hour: "numeric",
1000
+ minute: "2-digit",
1001
+ hour12: timeFormat.includes("aa")
1002
+ });
1003
+ };
1004
+ const getDisplayValue = () => {
1005
+ if (previewTime) {
1006
+ return { confirmed: "", preview: previewTime };
1007
+ }
1008
+ if (currentValue) {
1009
+ return { confirmed: formatTime(currentValue), preview: "" };
1010
+ }
1011
+ return { confirmed: "", preview: "" };
1012
+ };
1013
+ const { confirmed: timeConfirmed, preview: timePreview } = getDisplayValue();
1014
+ const timeTriggerButton = /* @__PURE__ */ jsx(
1015
+ "button",
1016
+ {
1017
+ type: "button",
1018
+ disabled,
1019
+ onClick: () => setIsOpen(!isOpen),
1020
+ className: cn(
1021
+ pickerInputVariants({ variant, status, size, fullWidth }),
1022
+ "pl-10 flex items-center justify-start cursor-pointer",
1023
+ showClear && "pr-10",
1024
+ className
1025
+ ),
1026
+ children: timeConfirmed || timePreview ? /* @__PURE__ */ jsxs(Fragment, { children: [
1027
+ timeConfirmed && /* @__PURE__ */ jsx("span", { children: timeConfirmed }),
1028
+ timePreview && /* @__PURE__ */ jsx("span", { className: "text-text-muted", children: timePreview })
1029
+ ] }) : /* @__PURE__ */ jsx("span", { className: "text-text-muted", children: placeholder })
1030
+ }
1031
+ );
1032
+ return /* @__PURE__ */ jsx(
1033
+ PickerWrapper,
1034
+ {
1035
+ label,
1036
+ error,
1037
+ warning,
1038
+ info,
1039
+ success,
1040
+ helperText,
1041
+ messagePosition,
1042
+ required,
1043
+ fullWidth,
1044
+ children: /* @__PURE__ */ jsxs("div", { className: "relative w-full", children: [
1045
+ /* @__PURE__ */ jsx("div", { className: "absolute left-3 flex items-center h-full top-0 text-text-muted pointer-events-none z-10", children: /* @__PURE__ */ jsx(Clock, { className: iconSizes[size] }) }),
1046
+ /* @__PURE__ */ jsxs(
1047
+ Popover,
1048
+ {
1049
+ open: isOpen,
1050
+ onOpenChange: (open) => {
1051
+ setIsOpen(open);
1052
+ if (!open) {
1053
+ setPreviewTime("");
1054
+ }
1055
+ },
1056
+ children: [
1057
+ /* @__PURE__ */ jsx(PopoverTrigger, { asChild: true, children: timeTriggerButton }),
1058
+ /* @__PURE__ */ jsx(
1059
+ PopoverContent,
1060
+ {
1061
+ className: "p-0 w-auto",
1062
+ align: "start",
1063
+ sideOffset: 4,
1064
+ onOpenAutoFocus: (e) => e.preventDefault(),
1065
+ children: /* @__PURE__ */ jsx(
1066
+ TimeColumnPicker,
1067
+ {
1068
+ value: currentValue,
1069
+ onChange: handleTimeChange,
1070
+ onPreview: setPreviewTime,
1071
+ timeFormat
1072
+ }
1073
+ )
1074
+ }
1075
+ )
1076
+ ]
1077
+ }
1078
+ ),
1079
+ showClear && /* @__PURE__ */ jsx(
1080
+ "button",
1081
+ {
1082
+ type: "button",
1083
+ onClick: handleClear,
1084
+ className: "absolute right-3 flex items-center h-full top-0 text-text-muted hover:text-text-primary z-10",
1085
+ "aria-label": "Clear time",
1086
+ children: /* @__PURE__ */ jsx(X, { className: iconSizes[size] })
1087
+ }
1088
+ )
1089
+ ] })
1090
+ }
1091
+ );
1092
+ }
1093
+ );
1094
+ TimePickerComponent.displayName = "TimePicker";
1095
+ var DatePicker = Object.assign(DatePickerComponent, {
1096
+ RangePicker: RangePickerComponent,
1097
+ TimePicker: TimePickerComponent
1098
+ });
1099
+
1100
+ export { DatePicker, RangePickerComponent, TimePickerComponent };
1101
+ //# sourceMappingURL=chunk-7AEGBABZ.js.map
1102
+ //# sourceMappingURL=chunk-7AEGBABZ.js.map