@mieweb/ui 0.6.1-dev.168 → 0.6.1-dev.170

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 (95) hide show
  1. package/dist/brands/index.cjs +18 -18
  2. package/dist/brands/index.js +3 -3
  3. package/dist/chunk-3Q2VWPML.cjs +1802 -0
  4. package/dist/chunk-3Q2VWPML.cjs.map +1 -0
  5. package/dist/{chunk-67CEEDAP.cjs → chunk-3YRDZBW6.cjs} +7 -7
  6. package/dist/{chunk-67CEEDAP.cjs.map → chunk-3YRDZBW6.cjs.map} +1 -1
  7. package/dist/{chunk-UVQEHZRF.js → chunk-6VGXX6L6.js} +2 -2
  8. package/dist/{chunk-UVQEHZRF.js.map → chunk-6VGXX6L6.js.map} +1 -1
  9. package/dist/chunk-CH26CHPH.js +1776 -0
  10. package/dist/chunk-CH26CHPH.js.map +1 -0
  11. package/dist/{chunk-TXRQQMG5.js → chunk-CYMZ2QS5.js} +2 -2
  12. package/dist/{chunk-TXRQQMG5.js.map → chunk-CYMZ2QS5.js.map} +1 -1
  13. package/dist/chunk-FGP64Z24.js +131 -0
  14. package/dist/chunk-FGP64Z24.js.map +1 -0
  15. package/dist/chunk-FIWKHLWY.js +197 -0
  16. package/dist/chunk-FIWKHLWY.js.map +1 -0
  17. package/dist/chunk-GLXTVCHN.cjs +4 -0
  18. package/dist/chunk-GLXTVCHN.cjs.map +1 -0
  19. package/dist/chunk-J7KWQJOB.js +14 -0
  20. package/dist/chunk-J7KWQJOB.js.map +1 -0
  21. package/dist/{chunk-NINI4WVS.cjs → chunk-JC6Y3LGF.cjs} +297 -84
  22. package/dist/chunk-JC6Y3LGF.cjs.map +1 -0
  23. package/dist/chunk-JYZW2PZS.cjs +166 -0
  24. package/dist/chunk-JYZW2PZS.cjs.map +1 -0
  25. package/dist/chunk-LIH3IZYK.js +689 -0
  26. package/dist/chunk-LIH3IZYK.js.map +1 -0
  27. package/dist/{chunk-XVF472GT.js → chunk-NSLR3B7K.js} +2 -2
  28. package/dist/{chunk-XVF472GT.js.map → chunk-NSLR3B7K.js.map} +1 -1
  29. package/dist/chunk-NTYGCBCL.js +543 -0
  30. package/dist/chunk-NTYGCBCL.js.map +1 -0
  31. package/dist/chunk-RISZWWEQ.js +3 -0
  32. package/dist/chunk-RISZWWEQ.js.map +1 -0
  33. package/dist/chunk-S7JQ3FV5.cjs +16 -0
  34. package/dist/chunk-S7JQ3FV5.cjs.map +1 -0
  35. package/dist/{chunk-JWTCEWQ4.cjs → chunk-SNEQXSC5.cjs} +2 -2
  36. package/dist/{chunk-JWTCEWQ4.cjs.map → chunk-SNEQXSC5.cjs.map} +1 -1
  37. package/dist/chunk-SQHMGT4W.js +164 -0
  38. package/dist/chunk-SQHMGT4W.js.map +1 -0
  39. package/dist/chunk-UO3KEUYK.cjs +220 -0
  40. package/dist/chunk-UO3KEUYK.cjs.map +1 -0
  41. package/dist/{chunk-HUXOASEB.js → chunk-X763OLF2.js} +4 -4
  42. package/dist/{chunk-HUXOASEB.js.map → chunk-X763OLF2.js.map} +1 -1
  43. package/dist/{chunk-DKGUOMBC.cjs → chunk-X7J45FU5.cjs} +2 -2
  44. package/dist/{chunk-DKGUOMBC.cjs.map → chunk-X7J45FU5.cjs.map} +1 -1
  45. package/dist/chunk-Y4ESBDQ5.cjs +552 -0
  46. package/dist/chunk-Y4ESBDQ5.cjs.map +1 -0
  47. package/dist/{chunk-MJ7YITLN.cjs → chunk-Y65SK5Y2.cjs} +2 -2
  48. package/dist/{chunk-MJ7YITLN.cjs.map → chunk-Y65SK5Y2.cjs.map} +1 -1
  49. package/dist/chunk-YD23ZGRU.cjs +155 -0
  50. package/dist/chunk-YD23ZGRU.cjs.map +1 -0
  51. package/dist/components/DateInput/index.cjs +2 -2
  52. package/dist/components/DateInput/index.d.cts +8 -2
  53. package/dist/components/DateInput/index.d.ts +8 -2
  54. package/dist/components/DateInput/index.js +1 -1
  55. package/dist/components/Markdown/index.cjs +10 -10
  56. package/dist/components/Markdown/index.js +2 -2
  57. package/dist/components/MediaEditor/index.cjs +42 -0
  58. package/dist/components/MediaEditor/index.cjs.map +1 -0
  59. package/dist/components/MediaEditor/index.d.cts +151 -0
  60. package/dist/components/MediaEditor/index.d.ts +151 -0
  61. package/dist/components/MediaEditor/index.js +17 -0
  62. package/dist/components/MediaEditor/index.js.map +1 -0
  63. package/dist/components/MediaPlayer/index.cjs +24 -0
  64. package/dist/components/MediaPlayer/index.cjs.map +1 -0
  65. package/dist/components/MediaPlayer/index.d.cts +71 -0
  66. package/dist/components/MediaPlayer/index.d.ts +71 -0
  67. package/dist/components/MediaPlayer/index.js +7 -0
  68. package/dist/components/MediaPlayer/index.js.map +1 -0
  69. package/dist/components/TranscriptView/index.cjs +21 -0
  70. package/dist/components/TranscriptView/index.cjs.map +1 -0
  71. package/dist/components/TranscriptView/index.d.cts +55 -0
  72. package/dist/components/TranscriptView/index.d.ts +55 -0
  73. package/dist/components/TranscriptView/index.js +4 -0
  74. package/dist/components/TranscriptView/index.js.map +1 -0
  75. package/dist/esheet.cjs +6 -6
  76. package/dist/esheet.js +3 -3
  77. package/dist/hooks/index.cjs +49 -11
  78. package/dist/hooks/index.d.cts +88 -1
  79. package/dist/hooks/index.d.ts +88 -1
  80. package/dist/hooks/index.js +3 -1
  81. package/dist/index.cjs +380 -253
  82. package/dist/index.cjs.map +1 -1
  83. package/dist/index.d.cts +7 -2
  84. package/dist/index.d.ts +7 -2
  85. package/dist/index.js +89 -42
  86. package/dist/index.js.map +1 -1
  87. package/dist/styles.css +1 -1
  88. package/dist/transcript-oaWqY3yr.d.cts +81 -0
  89. package/dist/transcript-oaWqY3yr.d.ts +81 -0
  90. package/dist/useTranscriptEdits-BUylQFg0.d.cts +168 -0
  91. package/dist/useTranscriptEdits-CWYnjbGP.d.ts +168 -0
  92. package/package.json +1 -1
  93. package/dist/chunk-HYEJLKXI.js +0 -476
  94. package/dist/chunk-HYEJLKXI.js.map +0 -1
  95. package/dist/chunk-NINI4WVS.cjs.map +0 -1
@@ -4,6 +4,7 @@ var chunkMSRU3XBH_cjs = require('./chunk-MSRU3XBH.cjs');
4
4
  var chunkCW75IKA6_cjs = require('./chunk-CW75IKA6.cjs');
5
5
  var chunkOR5DRJCW_cjs = require('./chunk-OR5DRJCW.cjs');
6
6
  var React = require('react');
7
+ var reactDom = require('react-dom');
7
8
  var lucideReact = require('lucide-react');
8
9
  var jsxRuntime = require('react/jsx-runtime');
9
10
 
@@ -38,6 +39,70 @@ var sizeClasses = {
38
39
  md: "h-10 text-base",
39
40
  lg: "h-12 text-lg"
40
41
  };
42
+ var MONTH_NAMES = [
43
+ "January",
44
+ "February",
45
+ "March",
46
+ "April",
47
+ "May",
48
+ "June",
49
+ "July",
50
+ "August",
51
+ "September",
52
+ "October",
53
+ "November",
54
+ "December"
55
+ ];
56
+ function isValidPickerDate(year, month, day) {
57
+ return Number.isFinite(year) && month >= 1 && month <= 12 && day >= 1 && day <= new Date(year, month, 0).getDate();
58
+ }
59
+ function parsePickerDate(value, inputType) {
60
+ if (inputType === "datetime-local") {
61
+ const match = /^(\d{4})-(\d{2})-(\d{2})T\d{2}:\d{2}$/.exec(value);
62
+ if (!match) return void 0;
63
+ const year2 = Number(match[1]);
64
+ const month2 = Number(match[2]);
65
+ const day2 = Number(match[3]);
66
+ const [hour, minute] = value.slice(-5).split(":").map(Number);
67
+ if (!isValidPickerDate(year2, month2, day2) || hour > 23 || minute > 59) {
68
+ return void 0;
69
+ }
70
+ return {
71
+ year: year2,
72
+ month: month2 - 1,
73
+ day: day2
74
+ };
75
+ }
76
+ if (inputType === "month") {
77
+ const match = /^(\d{4})-(\d{2})$/.exec(value);
78
+ if (!match) return void 0;
79
+ const year2 = Number(match[1]);
80
+ const month2 = Number(match[2]);
81
+ if (!Number.isFinite(year2) || month2 < 1 || month2 > 12) return void 0;
82
+ return { year: year2, month: month2 - 1, day: null };
83
+ }
84
+ if (!chunkCW75IKA6_cjs.isValidDate(value)) return void 0;
85
+ const [month, day, year] = value.split("/").map(Number);
86
+ return { month: month - 1, year, day };
87
+ }
88
+ function formatPickerValue(value, inputType, timeFormat) {
89
+ if (inputType === "datetime-local") {
90
+ const match = /^(\d{4})-(\d{2})-(\d{2})T(\d{2}:\d{2})$/.exec(value);
91
+ if (!match) return "";
92
+ if (timeFormat === "12-hour") {
93
+ const [hour, minute] = match[4].split(":").map(Number);
94
+ const displayHour = hour % 12 || 12;
95
+ const meridiem = hour >= 12 ? "PM" : "AM";
96
+ return `${match[2]}/${match[3]}/${match[1]} ${displayHour}:${String(minute).padStart(2, "0")} ${meridiem}`;
97
+ }
98
+ return `${match[2]}/${match[3]}/${match[1]} ${match[4]}`;
99
+ }
100
+ if (inputType === "month") {
101
+ const date = parsePickerDate(value, inputType);
102
+ return date ? `${MONTH_NAMES[date.month]} ${date.year}` : "";
103
+ }
104
+ return value;
105
+ }
41
106
  function getValidationError(value, mode, minAge, maxAge) {
42
107
  if (!value || value.replace(/\D/g, "").length === 0) {
43
108
  return void 0;
@@ -83,6 +148,8 @@ var DateInput = React__namespace.forwardRef(
83
148
  ({
84
149
  value = "",
85
150
  onChange,
151
+ inputType = "date",
152
+ timeFormat = "24-hour",
86
153
  mode = "default",
87
154
  minAge,
88
155
  maxAge,
@@ -91,17 +158,19 @@ var DateInput = React__namespace.forwardRef(
91
158
  width = "full",
92
159
  className,
93
160
  onBlur,
161
+ onClick,
94
162
  hasError,
95
163
  error,
96
164
  ...props
97
165
  }, ref) => {
166
+ const isFormattedDate = inputType === "date";
98
167
  const [displayValue, setDisplayValue] = React__namespace.useState(
99
- () => chunkCW75IKA6_cjs.formatDateValue(value)
168
+ () => isFormattedDate ? chunkCW75IKA6_cjs.formatDateValue(value) : value
100
169
  );
101
170
  const [localError, setLocalError] = React__namespace.useState();
102
171
  React__namespace.useEffect(() => {
103
- setDisplayValue(chunkCW75IKA6_cjs.formatDateValue(value));
104
- }, [value]);
172
+ setDisplayValue(isFormattedDate ? chunkCW75IKA6_cjs.formatDateValue(value) : value);
173
+ }, [isFormattedDate, value]);
105
174
  const handleChange = (e) => {
106
175
  const formatted = chunkCW75IKA6_cjs.formatDateValue(e.target.value);
107
176
  setDisplayValue(formatted);
@@ -128,26 +197,49 @@ var DateInput = React__namespace.forwardRef(
128
197
  const [isCalendarOpen, setIsCalendarOpen] = React__namespace.useState(false);
129
198
  const calendarRef = React__namespace.useRef(null);
130
199
  const buttonRef = React__namespace.useRef(null);
200
+ const [calendarStyle, setCalendarStyle] = React__namespace.useState();
201
+ const updateCalendarPosition = React__namespace.useCallback(() => {
202
+ if (!buttonRef.current) return;
203
+ const rect = buttonRef.current.getBoundingClientRect();
204
+ setCalendarStyle({
205
+ position: "fixed",
206
+ top: rect.bottom + 4,
207
+ left: Math.max(8, rect.right - 288),
208
+ zIndex: 9999
209
+ });
210
+ }, []);
211
+ React__namespace.useEffect(() => {
212
+ if (!isCalendarOpen) return;
213
+ updateCalendarPosition();
214
+ window.addEventListener("scroll", updateCalendarPosition, true);
215
+ window.addEventListener("resize", updateCalendarPosition);
216
+ return () => {
217
+ window.removeEventListener("scroll", updateCalendarPosition, true);
218
+ window.removeEventListener("resize", updateCalendarPosition);
219
+ };
220
+ }, [isCalendarOpen, updateCalendarPosition]);
131
221
  const parsedDate = React__namespace.useMemo(() => {
132
- if (!displayValue || !chunkCW75IKA6_cjs.isValidDate(displayValue)) {
133
- return {
134
- month: (/* @__PURE__ */ new Date()).getMonth(),
135
- year: (/* @__PURE__ */ new Date()).getFullYear(),
136
- day: null
137
- };
138
- }
139
- const [month, day, year] = displayValue.split("/").map(Number);
140
- return { month: month - 1, year, day };
141
- }, [displayValue]);
222
+ const fallback = /* @__PURE__ */ new Date();
223
+ return parsePickerDate(displayValue, inputType) ?? {
224
+ month: fallback.getMonth(),
225
+ year: fallback.getFullYear(),
226
+ day: null
227
+ };
228
+ }, [displayValue, inputType]);
142
229
  const [calendarMonth, setCalendarMonth] = React__namespace.useState(parsedDate.month);
143
230
  const [calendarYear, setCalendarYear] = React__namespace.useState(parsedDate.year);
231
+ const [selectedTime, setSelectedTime] = React__namespace.useState(
232
+ () => inputType === "datetime-local" && /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}$/.test(value) ? value.slice(-5) : "00:00"
233
+ );
144
234
  React__namespace.useEffect(() => {
145
- if (displayValue && chunkCW75IKA6_cjs.isValidDate(displayValue)) {
146
- const [month, , year] = displayValue.split("/").map(Number);
147
- setCalendarMonth(month - 1);
148
- setCalendarYear(year);
235
+ const date = parsePickerDate(displayValue, inputType);
236
+ if (!date) return;
237
+ setCalendarMonth(date.month);
238
+ setCalendarYear(date.year);
239
+ if (inputType === "datetime-local") {
240
+ setSelectedTime(displayValue.slice(-5));
149
241
  }
150
- }, [displayValue]);
242
+ }, [displayValue, inputType]);
151
243
  React__namespace.useEffect(() => {
152
244
  const handleClickOutside = (event) => {
153
245
  if (calendarRef.current && !calendarRef.current.contains(event.target) && buttonRef.current && !buttonRef.current.contains(event.target)) {
@@ -175,11 +267,13 @@ var DateInput = React__namespace.forwardRef(
175
267
  const month = String(calendarMonth + 1).padStart(2, "0");
176
268
  const dayStr = String(day).padStart(2, "0");
177
269
  const year = String(calendarYear);
178
- const formatted = `${month}/${dayStr}/${year}`;
270
+ const formatted = inputType === "datetime-local" ? `${year}-${month}-${dayStr}T${selectedTime}` : `${month}/${dayStr}/${year}`;
179
271
  setDisplayValue(formatted);
180
272
  onChange?.(formatted);
181
- setIsCalendarOpen(false);
182
- if (validateOnBlur) {
273
+ if (inputType === "date") {
274
+ setIsCalendarOpen(false);
275
+ }
276
+ if (inputType === "date" && validateOnBlur) {
183
277
  const validationError = getValidationError(
184
278
  formatted,
185
279
  mode,
@@ -189,6 +283,28 @@ var DateInput = React__namespace.forwardRef(
189
283
  setLocalError(validationError);
190
284
  }
191
285
  };
286
+ const handleMonthSelect = (month) => {
287
+ const formatted = `${calendarYear}-${String(month + 1).padStart(2, "0")}`;
288
+ setDisplayValue(formatted);
289
+ onChange?.(formatted);
290
+ setIsCalendarOpen(false);
291
+ };
292
+ const handleTimeChange = (part, nextValue) => {
293
+ const [hour, minute] = selectedTime.split(":");
294
+ const nextTime = part === "hour" ? `${nextValue}:${minute}` : `${hour}:${nextValue}`;
295
+ setSelectedTime(nextTime);
296
+ if (parsedDate.day === null) return;
297
+ const month = String(parsedDate.month + 1).padStart(2, "0");
298
+ const day = String(parsedDate.day).padStart(2, "0");
299
+ const formatted = `${parsedDate.year}-${month}-${day}T${nextTime}`;
300
+ setDisplayValue(formatted);
301
+ onChange?.(formatted);
302
+ };
303
+ const handleMeridiemChange = (meridiem) => {
304
+ const [hour] = selectedTime.split(":").map(Number);
305
+ const nextHour = hour % 12 + (meridiem === "PM" ? 12 : 0);
306
+ handleTimeChange("hour", String(nextHour).padStart(2, "0"));
307
+ };
192
308
  const getDaysInMonth = (month, year) => {
193
309
  return new Date(year, month + 1, 0).getDate();
194
310
  };
@@ -205,20 +321,6 @@ var DateInput = React__namespace.forwardRef(
205
321
  for (let i = 1; i <= daysInMonth; i++) {
206
322
  days.push(i);
207
323
  }
208
- const monthNames = [
209
- "January",
210
- "February",
211
- "March",
212
- "April",
213
- "May",
214
- "June",
215
- "July",
216
- "August",
217
- "September",
218
- "October",
219
- "November",
220
- "December"
221
- ];
222
324
  const isSelectedDay = (day) => {
223
325
  return parsedDate.day === day && parsedDate.month === calendarMonth && parsedDate.year === calendarYear;
224
326
  };
@@ -231,12 +333,12 @@ var DateInput = React__namespace.forwardRef(
231
333
  {
232
334
  ref: calendarRef,
233
335
  className: chunkOR5DRJCW_cjs.cn(
234
- "absolute top-full left-0 z-50 mt-1",
235
336
  "bg-background border-border rounded-lg border shadow-lg",
236
337
  "w-72 p-3"
237
338
  ),
339
+ style: calendarStyle,
238
340
  role: "dialog",
239
- "aria-label": "Choose date",
341
+ "aria-label": inputType === "month" ? "Choose month" : inputType === "datetime-local" ? "Choose date and time" : "Choose date",
240
342
  children: [
241
343
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mb-3 flex items-center justify-between", children: [
242
344
  /* @__PURE__ */ jsxRuntime.jsx(
@@ -244,7 +346,9 @@ var DateInput = React__namespace.forwardRef(
244
346
  {
245
347
  type: "button",
246
348
  onClick: () => {
247
- if (calendarMonth === 0) {
349
+ if (inputType === "month") {
350
+ setCalendarYear(calendarYear - 1);
351
+ } else if (calendarMonth === 0) {
248
352
  setCalendarMonth(11);
249
353
  setCalendarYear(calendarYear - 1);
250
354
  } else {
@@ -252,19 +356,19 @@ var DateInput = React__namespace.forwardRef(
252
356
  }
253
357
  },
254
358
  className: "hover:bg-muted rounded-md p-1 transition-colors",
255
- "aria-label": "Previous month",
359
+ "aria-label": inputType === "month" ? "Previous year" : "Previous month",
256
360
  children: /* @__PURE__ */ jsxRuntime.jsx(ChevronLeftIcon, {})
257
361
  }
258
362
  ),
259
363
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2", children: [
260
- /* @__PURE__ */ jsxRuntime.jsx(
364
+ inputType !== "month" && /* @__PURE__ */ jsxRuntime.jsx(
261
365
  "select",
262
366
  {
263
367
  value: calendarMonth,
264
368
  onChange: (e) => setCalendarMonth(Number(e.target.value)),
265
369
  className: "bg-background border-border rounded border px-2 py-1 text-sm",
266
370
  "aria-label": "Select month",
267
- children: monthNames.map((name, i) => /* @__PURE__ */ jsxRuntime.jsx("option", { value: i, children: name }, name))
371
+ children: MONTH_NAMES.map((name, i) => /* @__PURE__ */ jsxRuntime.jsx("option", { value: i, children: name }, name))
268
372
  }
269
373
  ),
270
374
  /* @__PURE__ */ jsxRuntime.jsx(
@@ -286,7 +390,9 @@ var DateInput = React__namespace.forwardRef(
286
390
  {
287
391
  type: "button",
288
392
  onClick: () => {
289
- if (calendarMonth === 11) {
393
+ if (inputType === "month") {
394
+ setCalendarYear(calendarYear + 1);
395
+ } else if (calendarMonth === 11) {
290
396
  setCalendarMonth(0);
291
397
  setCalendarYear(calendarYear + 1);
292
398
  } else {
@@ -294,56 +400,158 @@ var DateInput = React__namespace.forwardRef(
294
400
  }
295
401
  },
296
402
  className: "hover:bg-muted rounded-md p-1 transition-colors",
297
- "aria-label": "Next month",
403
+ "aria-label": inputType === "month" ? "Next year" : "Next month",
298
404
  children: /* @__PURE__ */ jsxRuntime.jsx(ChevronRightIcon, {})
299
405
  }
300
406
  )
301
407
  ] }),
302
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mb-1 grid grid-cols-7 gap-1", children: ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"].map((day) => /* @__PURE__ */ jsxRuntime.jsx(
303
- "div",
304
- {
305
- className: "text-muted-foreground py-1 text-center text-xs font-medium",
306
- children: day
307
- },
308
- day
309
- )) }),
310
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "grid grid-cols-7 gap-1", children: days.map((day, index) => /* @__PURE__ */ jsxRuntime.jsx(
408
+ inputType === "month" ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "grid grid-cols-3 gap-1", children: MONTH_NAMES.map((name, month) => /* @__PURE__ */ jsxRuntime.jsx(
311
409
  "button",
312
410
  {
313
411
  type: "button",
314
- disabled: day === null,
315
- onClick: () => day && handleDateSelect(day),
412
+ onClick: () => handleMonthSelect(month),
316
413
  className: chunkOR5DRJCW_cjs.cn(
317
- "h-8 w-8 rounded-md text-sm transition-colors",
414
+ "rounded-md px-2 py-2 text-sm transition-colors",
318
415
  "focus:ring-ring focus:ring-2 focus:outline-none",
319
- day === null && "invisible",
320
- day !== null && "hover:bg-muted",
321
- isSelectedDay(day) && "bg-primary-800 hover:bg-primary-900 text-white",
322
- isToday(day) && !isSelectedDay(day) && "border-primary-800 text-primary-800 border"
416
+ "hover:bg-muted",
417
+ parsedDate.month === month && parsedDate.year === calendarYear && "bg-primary-800 hover:bg-primary-900 text-white"
323
418
  ),
324
- children: day
419
+ children: name.slice(0, 3)
325
420
  },
326
- index
327
- )) }),
328
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "border-border mt-3 border-t pt-3", children: /* @__PURE__ */ jsxRuntime.jsx(
329
- "button",
330
- {
331
- type: "button",
332
- onClick: () => {
333
- const today = /* @__PURE__ */ new Date();
334
- setCalendarMonth(today.getMonth());
335
- setCalendarYear(today.getFullYear());
336
- handleDateSelect(today.getDate());
421
+ name
422
+ )) }) : /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
423
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mb-1 grid grid-cols-7 gap-1", children: ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"].map((day) => /* @__PURE__ */ jsxRuntime.jsx(
424
+ "div",
425
+ {
426
+ className: "text-muted-foreground py-1 text-center text-xs font-medium",
427
+ children: day
428
+ },
429
+ day
430
+ )) }),
431
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "grid grid-cols-7 gap-1", children: days.map((day, index) => /* @__PURE__ */ jsxRuntime.jsx(
432
+ "button",
433
+ {
434
+ type: "button",
435
+ disabled: day === null,
436
+ onClick: () => day && handleDateSelect(day),
437
+ className: chunkOR5DRJCW_cjs.cn(
438
+ "h-8 w-8 rounded-md text-sm transition-colors",
439
+ "focus:ring-ring focus:ring-2 focus:outline-none",
440
+ day === null && "invisible",
441
+ day !== null && "hover:bg-muted",
442
+ isSelectedDay(day) && "bg-primary-800 hover:bg-primary-900 text-white",
443
+ isToday(day) && !isSelectedDay(day) && "border-primary-800 text-primary-800 border"
444
+ ),
445
+ children: day
337
446
  },
338
- className: "text-primary-800 w-full text-sm hover:underline",
339
- children: "Today"
340
- }
341
- ) })
447
+ index
448
+ )) })
449
+ ] }),
450
+ inputType === "datetime-local" && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "border-border mt-3 flex items-center gap-2 border-t pt-3", children: [
451
+ /* @__PURE__ */ jsxRuntime.jsx(
452
+ "select",
453
+ {
454
+ value: timeFormat === "12-hour" ? String(
455
+ Number(selectedTime.slice(0, 2)) % 12 || 12
456
+ ).padStart(2, "0") : selectedTime.slice(0, 2),
457
+ onChange: (event) => {
458
+ const hour = Number(event.target.value);
459
+ const isPm = Number(selectedTime.slice(0, 2)) >= 12;
460
+ handleTimeChange(
461
+ "hour",
462
+ String(
463
+ timeFormat === "12-hour" ? hour % 12 + (isPm ? 12 : 0) : hour
464
+ ).padStart(2, "0")
465
+ );
466
+ },
467
+ className: "bg-background border-border rounded border px-2 py-1 text-sm",
468
+ "aria-label": "Select hour",
469
+ children: Array.from(
470
+ { length: timeFormat === "12-hour" ? 12 : 24 },
471
+ (_, index) => timeFormat === "12-hour" ? index + 1 : index
472
+ ).map((hour) => /* @__PURE__ */ jsxRuntime.jsx("option", { value: String(hour).padStart(2, "0"), children: String(hour).padStart(2, "0") }, hour))
473
+ }
474
+ ),
475
+ /* @__PURE__ */ jsxRuntime.jsx("span", { "aria-hidden": "true", children: ":" }),
476
+ /* @__PURE__ */ jsxRuntime.jsx(
477
+ "select",
478
+ {
479
+ value: selectedTime.slice(3),
480
+ onChange: (event) => handleTimeChange("minute", event.target.value),
481
+ className: "bg-background border-border rounded border px-2 py-1 text-sm",
482
+ "aria-label": "Select minute",
483
+ children: Array.from({ length: 60 }, (_, minute) => /* @__PURE__ */ jsxRuntime.jsx("option", { value: String(minute).padStart(2, "0"), children: String(minute).padStart(2, "0") }, minute))
484
+ }
485
+ ),
486
+ timeFormat === "12-hour" && /* @__PURE__ */ jsxRuntime.jsxs(
487
+ "select",
488
+ {
489
+ value: Number(selectedTime.slice(0, 2)) >= 12 ? "PM" : "AM",
490
+ onChange: (event) => handleMeridiemChange(event.target.value),
491
+ className: "bg-background border-border rounded border px-2 py-1 text-sm",
492
+ "aria-label": "Select AM or PM",
493
+ children: [
494
+ /* @__PURE__ */ jsxRuntime.jsx("option", { value: "AM", children: "AM" }),
495
+ /* @__PURE__ */ jsxRuntime.jsx("option", { value: "PM", children: "PM" })
496
+ ]
497
+ }
498
+ )
499
+ ] }),
500
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "border-border mt-3 flex gap-2 border-t pt-3", children: [
501
+ /* @__PURE__ */ jsxRuntime.jsx(
502
+ "button",
503
+ {
504
+ type: "button",
505
+ onClick: () => {
506
+ const today = /* @__PURE__ */ new Date();
507
+ setCalendarMonth(today.getMonth());
508
+ setCalendarYear(today.getFullYear());
509
+ if (inputType === "month") {
510
+ handleMonthSelect(today.getMonth());
511
+ } else {
512
+ handleDateSelect(today.getDate());
513
+ }
514
+ },
515
+ className: "text-primary-800 flex-1 text-sm hover:underline",
516
+ children: "Today"
517
+ }
518
+ ),
519
+ inputType === "datetime-local" && /* @__PURE__ */ jsxRuntime.jsx(
520
+ "button",
521
+ {
522
+ type: "button",
523
+ onClick: () => setIsCalendarOpen(false),
524
+ className: "text-primary-800 flex-1 text-sm hover:underline",
525
+ children: "Done"
526
+ }
527
+ )
528
+ ] })
342
529
  ]
343
530
  }
344
531
  );
345
532
  };
346
- if (showCalendar) {
533
+ if (inputType === "year") {
534
+ return /* @__PURE__ */ jsxRuntime.jsx(
535
+ chunkMSRU3XBH_cjs.Input,
536
+ {
537
+ ref,
538
+ type: inputType === "year" ? "text" : inputType,
539
+ inputMode: inputType === "year" ? "numeric" : void 0,
540
+ pattern: inputType === "year" ? "[0-9]{4}" : void 0,
541
+ maxLength: inputType === "year" ? 4 : void 0,
542
+ placeholder: inputType === "year" ? "YYYY" : void 0,
543
+ value: value.replace(/\D/g, "").slice(0, 4),
544
+ onChange: (event) => onChange?.(event.target.value.replace(/\D/g, "").slice(0, 4)),
545
+ onBlur,
546
+ onClick,
547
+ hasError,
548
+ error,
549
+ className: chunkOR5DRJCW_cjs.cn(widthClasses[width], className),
550
+ ...props
551
+ }
552
+ );
553
+ }
554
+ if (showCalendar || inputType !== "date") {
347
555
  const { label, helperText, hideLabel, required, size, ...inputProps } = props;
348
556
  const resolvedSize = size ?? "md";
349
557
  const inputId = inputProps.id || generatedId;
@@ -381,12 +589,17 @@ var DateInput = React__namespace.forwardRef(
381
589
  ref,
382
590
  id: inputId,
383
591
  type: "text",
384
- inputMode: "numeric",
592
+ inputMode: inputType === "date" ? "numeric" : void 0,
385
593
  autoComplete,
386
- placeholder,
387
- value: displayValue,
594
+ placeholder: inputType === "month" ? "Select month" : inputType === "datetime-local" ? "Select date and time" : placeholder,
595
+ value: formatPickerValue(displayValue, inputType, timeFormat),
388
596
  onChange: handleChange,
389
- onBlur: handleBlur,
597
+ onBlur: inputType === "date" ? handleBlur : onBlur,
598
+ onClick: (event) => {
599
+ onClick?.(event);
600
+ setIsCalendarOpen(true);
601
+ },
602
+ readOnly: !isFormattedDate,
390
603
  "aria-invalid": showError,
391
604
  "aria-describedby": [errorMessage ? errorId : null, helperText ? helperId : null].filter(Boolean).join(" ") || void 0,
392
605
  className: chunkOR5DRJCW_cjs.cn(
@@ -422,9 +635,9 @@ var DateInput = React__namespace.forwardRef(
422
635
  "aria-haspopup": "dialog",
423
636
  children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Calendar, { size: 18 })
424
637
  }
425
- ),
426
- isCalendarOpen && renderCalendar()
638
+ )
427
639
  ] }),
640
+ isCalendarOpen && reactDom.createPortal(renderCalendar(), document.body),
428
641
  errorMessage && /* @__PURE__ */ jsxRuntime.jsx(
429
642
  "p",
430
643
  {
@@ -494,5 +707,5 @@ function ChevronRightIcon() {
494
707
  }
495
708
 
496
709
  exports.DateInput = DateInput;
497
- //# sourceMappingURL=chunk-NINI4WVS.cjs.map
498
- //# sourceMappingURL=chunk-NINI4WVS.cjs.map
710
+ //# sourceMappingURL=chunk-JC6Y3LGF.cjs.map
711
+ //# sourceMappingURL=chunk-JC6Y3LGF.cjs.map