@deepnoid/ui 0.0.89 → 0.0.90

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 (120) hide show
  1. package/dist/chunk-2ZFHB4JM.mjs +76 -0
  2. package/dist/chunk-75HLCORR.mjs +1 -0
  3. package/dist/{chunk-FPCP4OOL.mjs → chunk-EDEV4IK4.mjs} +3 -3
  4. package/dist/{chunk-HFVZFUC3.mjs → chunk-L7P6OBUX.mjs} +1 -1
  5. package/dist/chunk-N6IEGD4K.mjs +119 -0
  6. package/dist/chunk-P732YGHO.mjs +18 -0
  7. package/dist/chunk-S2VUKVCH.mjs +319 -0
  8. package/dist/{chunk-MOINJECK.mjs → chunk-S3O52LLG.mjs} +1 -2
  9. package/dist/chunk-WX32MAKV.mjs +219 -0
  10. package/dist/components/accordion/accordion.d.mts +2 -2
  11. package/dist/components/accordion/accordion.d.ts +2 -2
  12. package/dist/components/accordion/accordion.test.mjs +3 -3
  13. package/dist/components/accordion/accordionItem.d.mts +2 -2
  14. package/dist/components/accordion/accordionItem.d.ts +2 -2
  15. package/dist/components/button/button-group.d.mts +2 -2
  16. package/dist/components/button/button-group.d.ts +2 -2
  17. package/dist/components/button/button-group.test.mjs +3 -3
  18. package/dist/components/button/button.d.mts +2 -2
  19. package/dist/components/button/button.d.ts +2 -2
  20. package/dist/components/button/button.test.mjs +3 -3
  21. package/dist/components/card/card.d.mts +2 -2
  22. package/dist/components/card/card.d.ts +2 -2
  23. package/dist/components/checkbox/checkbox.d.mts +2 -2
  24. package/dist/components/checkbox/checkbox.d.ts +2 -2
  25. package/dist/components/checkbox/checkbox.test.mjs +3 -3
  26. package/dist/components/dateTimePicker/calendar.d.mts +118 -0
  27. package/dist/components/dateTimePicker/calendar.d.ts +118 -0
  28. package/dist/components/dateTimePicker/calendar.js +3854 -0
  29. package/dist/components/dateTimePicker/calendar.mjs +16 -0
  30. package/dist/components/dateTimePicker/dateTimePicker.d.mts +443 -0
  31. package/dist/components/dateTimePicker/dateTimePicker.d.ts +443 -0
  32. package/dist/components/dateTimePicker/dateTimePicker.js +4486 -0
  33. package/dist/components/dateTimePicker/dateTimePicker.mjs +22 -0
  34. package/dist/components/dateTimePicker/index.d.mts +5 -0
  35. package/dist/components/dateTimePicker/index.d.ts +5 -0
  36. package/dist/components/dateTimePicker/index.js +4487 -0
  37. package/dist/components/dateTimePicker/index.mjs +21 -0
  38. package/dist/components/dateTimePicker/timePicker.d.mts +10 -0
  39. package/dist/components/dateTimePicker/timePicker.d.ts +10 -0
  40. package/dist/components/dateTimePicker/timePicker.js +342 -0
  41. package/dist/components/dateTimePicker/timePicker.mjs +13 -0
  42. package/dist/components/dateTimePicker/useDateTimePicker.d.mts +31 -0
  43. package/dist/components/dateTimePicker/useDateTimePicker.d.ts +31 -0
  44. package/dist/components/dateTimePicker/useDateTimePicker.js +106 -0
  45. package/dist/components/dateTimePicker/useDateTimePicker.mjs +9 -0
  46. package/dist/components/dateTimePicker/util.d.mts +4 -0
  47. package/dist/components/dateTimePicker/util.d.ts +4 -0
  48. package/dist/components/dateTimePicker/util.js +42 -0
  49. package/dist/components/dateTimePicker/util.mjs +10 -0
  50. package/dist/components/input/input.d.mts +2 -2
  51. package/dist/components/input/input.d.ts +2 -2
  52. package/dist/components/input/input.test.mjs +1 -1
  53. package/dist/components/list/index.js +3 -3
  54. package/dist/components/list/index.mjs +1 -1
  55. package/dist/components/list/list.d.mts +2 -2
  56. package/dist/components/list/list.d.ts +2 -2
  57. package/dist/components/list/listItem.d.mts +3 -3
  58. package/dist/components/list/listItem.d.ts +3 -3
  59. package/dist/components/list/listItem.js +3 -3
  60. package/dist/components/list/listItem.mjs +1 -1
  61. package/dist/components/modal/index.js +1 -1
  62. package/dist/components/modal/index.mjs +1 -1
  63. package/dist/components/modal/modal.d.mts +2 -2
  64. package/dist/components/modal/modal.d.ts +2 -2
  65. package/dist/components/modal/modal.js +1 -1
  66. package/dist/components/modal/modal.mjs +1 -1
  67. package/dist/components/modal/modal.test.js +1 -1
  68. package/dist/components/modal/modal.test.mjs +2 -2
  69. package/dist/components/pagination/pagination.d.mts +2 -2
  70. package/dist/components/pagination/pagination.d.ts +2 -2
  71. package/dist/components/progress/progress.d.mts +2 -2
  72. package/dist/components/progress/progress.d.ts +2 -2
  73. package/dist/components/radio/radio.d.mts +2 -2
  74. package/dist/components/radio/radio.d.ts +2 -2
  75. package/dist/components/select/index.mjs +2 -2
  76. package/dist/components/select/select.d.mts +2 -2
  77. package/dist/components/select/select.d.ts +2 -2
  78. package/dist/components/select/select.mjs +2 -2
  79. package/dist/components/select/select.test.mjs +5 -5
  80. package/dist/components/select/useSelect.d.mts +3 -3
  81. package/dist/components/select/useSelect.d.ts +3 -3
  82. package/dist/components/slider/slider.d.mts +2 -2
  83. package/dist/components/slider/slider.d.ts +2 -2
  84. package/dist/components/switch/index.js +1 -2
  85. package/dist/components/switch/index.mjs +1 -1
  86. package/dist/components/switch/switch.d.mts +2 -2
  87. package/dist/components/switch/switch.d.ts +2 -2
  88. package/dist/components/switch/switch.js +1 -2
  89. package/dist/components/switch/switch.mjs +1 -1
  90. package/dist/components/switch/switch.test.js +1 -2
  91. package/dist/components/switch/switch.test.mjs +1 -1
  92. package/dist/components/table/table-body.d.mts +2 -2
  93. package/dist/components/table/table-body.d.ts +2 -2
  94. package/dist/components/table/table.d.mts +5 -5
  95. package/dist/components/table/table.d.ts +5 -5
  96. package/dist/components/tabs/tabs.d.mts +2 -2
  97. package/dist/components/tabs/tabs.d.ts +2 -2
  98. package/dist/components/tabs/tabs.test.mjs +3 -3
  99. package/dist/components/textarea/textarea.d.mts +2 -2
  100. package/dist/components/textarea/textarea.d.ts +2 -2
  101. package/dist/components/textarea/textarea.test.mjs +1 -1
  102. package/dist/components/toast/toast.d.mts +2 -2
  103. package/dist/components/toast/toast.d.ts +2 -2
  104. package/dist/components/tooltip/index.d.mts +1 -1
  105. package/dist/components/tooltip/index.d.ts +1 -1
  106. package/dist/components/tooltip/tooltip-utils.d.mts +1 -1
  107. package/dist/components/tooltip/tooltip-utils.d.ts +1 -1
  108. package/dist/components/tooltip/tooltip.d.mts +3 -3
  109. package/dist/components/tooltip/tooltip.d.ts +3 -3
  110. package/dist/components/tooltip/tooltip.test.mjs +3 -3
  111. package/dist/components/tooltip/useTooltip.d.mts +1 -1
  112. package/dist/components/tooltip/useTooltip.d.ts +1 -1
  113. package/dist/index.d.mts +2 -1
  114. package/dist/index.d.ts +2 -1
  115. package/dist/index.js +697 -6
  116. package/dist/index.mjs +62 -43
  117. package/dist/{tooltip-utils-DCKA5gnI.d.mts → tooltip-utils-CrCabndd.d.mts} +2 -2
  118. package/dist/{tooltip-utils-DCKA5gnI.d.ts → tooltip-utils-CrCabndd.d.ts} +2 -2
  119. package/package.json +1 -1
  120. package/dist/{chunk-JN7EGKJL.mjs → chunk-2BCJZILI.mjs} +3 -3
package/dist/index.js CHANGED
@@ -108,6 +108,7 @@ __export(src_exports, {
108
108
  ButtonGroup: () => button_group_default,
109
109
  Card: () => card_default,
110
110
  CheckBox: () => checkbox_default,
111
+ DateTimePicker: () => dateTimePicker_default,
111
112
  Icon: () => Icon_default,
112
113
  Input: () => input_default,
113
114
  List: () => list_default,
@@ -6317,8 +6318,7 @@ var toggle = (0, import_tailwind_variants12.tv)({
6317
6318
  "bg-neutral-soft",
6318
6319
  "overflow-hidden",
6319
6320
  "rounded-full",
6320
- "px-[2px]",
6321
- "hover:bg-primary-main/20"
6321
+ "px-[2px]"
6322
6322
  ],
6323
6323
  wrapper: [
6324
6324
  "relative",
@@ -7276,7 +7276,7 @@ Modal.displayName = "Modal";
7276
7276
  var modal_default = Modal;
7277
7277
  var modal = tv({
7278
7278
  slots: {
7279
- backdrop: ["relative w-screen h-screen fixed inset-0 bg-black/60", "z-[9999]"],
7279
+ backdrop: ["relative w-screen h-screen fixed inset-0 bg-black/60", "z-[900]"],
7280
7280
  modalWrapper: ["group/modal", "absolute", "top-1/2", "-translate-y-1/2", "left-1/2", "-translate-x-1/2"],
7281
7281
  icon: ["absolute", "top-[20px]", "left-1/2", "-translate-x-1/2", "z-10"],
7282
7282
  closeIcon: [
@@ -7711,13 +7711,13 @@ var listItem = tv({
7711
7711
  },
7712
7712
  size: {
7713
7713
  sm: {
7714
- base: "h-[30px] text-sm"
7714
+ base: "min-h-[30px] text-sm"
7715
7715
  },
7716
7716
  md: {
7717
- base: "h-[40px] text-md"
7717
+ base: "min-h-[40px] text-md"
7718
7718
  },
7719
7719
  lg: {
7720
- base: "h-[50px] text-lg"
7720
+ base: "min-h-[50px] text-lg"
7721
7721
  }
7722
7722
  },
7723
7723
  color: {
@@ -7974,6 +7974,686 @@ var ToastProvider = ({
7974
7974
  ] });
7975
7975
  };
7976
7976
 
7977
+ // src/components/dateTimePicker/dateTimePicker.tsx
7978
+ var import_react33 = __toESM(require("react"));
7979
+ var import_react_dom4 = require("react-dom");
7980
+
7981
+ // src/components/dateTimePicker/useDateTimePicker.tsx
7982
+ var import_react30 = require("react");
7983
+
7984
+ // src/components/dateTimePicker/util.ts
7985
+ var formatDateToString = (date) => {
7986
+ const year = date.getFullYear();
7987
+ const month = String(date.getMonth() + 1).padStart(2, "0");
7988
+ const day = String(date.getDate()).padStart(2, "0");
7989
+ return `${year}-${month}-${day}`;
7990
+ };
7991
+ var formatStringToDate = (date) => {
7992
+ const formattedDate = new Date(date);
7993
+ return formattedDate;
7994
+ };
7995
+
7996
+ // src/components/dateTimePicker/useDateTimePicker.tsx
7997
+ var useDatePicker = ({ initialDate, initialTime }) => {
7998
+ const [selectedDate, setSelectedDate] = (0, import_react30.useState)(
7999
+ initialDate ? formatDateToString(initialDate) : ""
8000
+ );
8001
+ const [selectedTime, setSelectedTime] = (0, import_react30.useState)(initialTime ? initialTime : "");
8002
+ const [targetRect, setTargetRect] = (0, import_react30.useState)(null);
8003
+ const [popupWidth, setPopupWidth] = (0, import_react30.useState)(0);
8004
+ const [popupHeight, setPopupHeight] = (0, import_react30.useState)(0);
8005
+ const dateInputRef = (0, import_react30.useRef)(null);
8006
+ const datePickerWrapperRef = (0, import_react30.useRef)(null);
8007
+ const datePickerRef = (0, import_react30.useRef)(null);
8008
+ const dataPickerGap = 4;
8009
+ const calculatePositionWithScroll = (targetRect2, popupHeight2) => {
8010
+ if (popupWidth === 0 || popupHeight2 === 0) return;
8011
+ const scrollTop = window.scrollY || document.documentElement.scrollTop || document.body.scrollTop;
8012
+ const scrollLeft = window.scrollX || document.documentElement.scrollLeft || document.body.scrollLeft;
8013
+ const spaceBelow = window.innerHeight - (targetRect2.y + targetRect2.height + dataPickerGap);
8014
+ const spaceAbove = targetRect2.y - dataPickerGap;
8015
+ const top = spaceBelow < popupHeight2 && spaceAbove > popupHeight2 ? targetRect2.y - popupHeight2 - dataPickerGap : targetRect2.y + targetRect2.height + dataPickerGap;
8016
+ return {
8017
+ top: top + scrollTop,
8018
+ left: targetRect2.x + targetRect2.width - popupWidth + scrollLeft
8019
+ };
8020
+ };
8021
+ const handleToggleDatePicker = () => {
8022
+ if (datePickerRef.current) {
8023
+ const rect = datePickerRef.current.getBoundingClientRect();
8024
+ setTargetRect((prevRect) => prevRect ? null : { x: rect.x, y: rect.y, width: rect.width, height: rect.height });
8025
+ }
8026
+ };
8027
+ const handleChangeDate = (date) => {
8028
+ setSelectedDate(date);
8029
+ };
8030
+ const handleChangeTime = (time) => {
8031
+ setSelectedTime(time);
8032
+ };
8033
+ (0, import_react30.useEffect)(() => {
8034
+ const onClickOutside = (e) => {
8035
+ if (datePickerRef.current && !datePickerRef.current.contains(e.target) && datePickerWrapperRef.current && !datePickerWrapperRef.current.contains(e.target)) {
8036
+ setTargetRect(null);
8037
+ }
8038
+ };
8039
+ window.addEventListener("mousedown", onClickOutside);
8040
+ return () => window.removeEventListener("mousedown", onClickOutside);
8041
+ }, []);
8042
+ (0, import_react30.useEffect)(() => {
8043
+ if (datePickerWrapperRef.current) {
8044
+ setPopupHeight(datePickerWrapperRef.current.getBoundingClientRect().height);
8045
+ setPopupWidth(datePickerWrapperRef.current.getBoundingClientRect().width);
8046
+ }
8047
+ }, [targetRect]);
8048
+ return {
8049
+ selectedDate,
8050
+ selectedTime,
8051
+ targetRect,
8052
+ popupHeight,
8053
+ dateInputRef,
8054
+ datePickerWrapperRef,
8055
+ datePickerRef,
8056
+ handleToggleDatePicker,
8057
+ handleChangeDate,
8058
+ handleChangeTime,
8059
+ calculatePositionWithScroll
8060
+ };
8061
+ };
8062
+
8063
+ // src/components/dateTimePicker/calendar.tsx
8064
+ var import_react31 = __toESM(require("react"));
8065
+ var import_jsx_runtime28 = require("react/jsx-runtime");
8066
+ var Calendar = (0, import_react31.forwardRef)((originalProps, ref) => {
8067
+ const [props, variantProps] = mapPropsVariants(originalProps, calendarStyle.variantKeys);
8068
+ const { selectedDate, classNames, highlightWeekend = true, onChangeDate, ...inputProps } = props;
8069
+ const [currentDate, setCurrentDate] = (0, import_react31.useState)(selectedDate ? new Date(selectedDate) : /* @__PURE__ */ new Date());
8070
+ const daysOfWeek = ["S", "M", "T", "W", "T", "F", "S"];
8071
+ (0, import_react31.useEffect)(() => {
8072
+ if (selectedDate) {
8073
+ setCurrentDate(new Date(selectedDate));
8074
+ }
8075
+ }, [selectedDate]);
8076
+ const getCalendarDates = (0, import_react31.useCallback)(() => {
8077
+ const year = currentDate.getFullYear();
8078
+ const month = currentDate.getMonth();
8079
+ const firstDayOfMonth = new Date(year, month, 1).getDay();
8080
+ const lastDateOfMonth = new Date(year, month + 1, 0).getDate();
8081
+ const lastDateOfPrevMonth = new Date(year, month, 0).getDate();
8082
+ let dates = [];
8083
+ for (let i = firstDayOfMonth - 1; i >= 0; i--) {
8084
+ dates.push({
8085
+ date: lastDateOfPrevMonth - i,
8086
+ currentMonth: false
8087
+ });
8088
+ }
8089
+ for (let date = 1; date <= lastDateOfMonth; date++) {
8090
+ dates.push({
8091
+ date,
8092
+ currentMonth: true
8093
+ });
8094
+ }
8095
+ const remainingDays = 42 - dates.length;
8096
+ for (let i = 1; i <= remainingDays; i++) {
8097
+ dates.push({
8098
+ date: i,
8099
+ currentMonth: false
8100
+ });
8101
+ }
8102
+ const weeks = [];
8103
+ for (let i = 0; i < dates.length; i += 7) {
8104
+ weeks.push(dates.slice(i, i + 7));
8105
+ }
8106
+ return weeks;
8107
+ }, [currentDate]);
8108
+ const handlePrevMonth = () => {
8109
+ setCurrentDate(new Date(currentDate.getFullYear(), currentDate.getMonth() - 1));
8110
+ };
8111
+ const handleNextMonth = () => {
8112
+ setCurrentDate(new Date(currentDate.getFullYear(), currentDate.getMonth() + 1));
8113
+ };
8114
+ const handleDateSelect = (date, isCurrentMonth) => {
8115
+ if (!isCurrentMonth) return;
8116
+ if (onChangeDate) {
8117
+ const selected = new Date(currentDate.getFullYear(), currentDate.getMonth(), date);
8118
+ const formatted = formatDateToString(selected);
8119
+ onChangeDate(formatted);
8120
+ }
8121
+ };
8122
+ (0, import_react31.useImperativeHandle)(ref, () => ({
8123
+ getSelectedDate: () => selectedDate
8124
+ }));
8125
+ const slots = (0, import_react31.useMemo)(() => calendarStyle({ ...variantProps }), [variantProps]);
8126
+ const getBaseProps = (0, import_react31.useCallback)(
8127
+ () => ({
8128
+ className: `${slots.base({ class: classNames == null ? void 0 : classNames.base })}`
8129
+ }),
8130
+ [slots, classNames]
8131
+ );
8132
+ const getDateTitleProps = (0, import_react31.useCallback)(
8133
+ (index) => {
8134
+ return {
8135
+ className: `${slots.dateTitle({
8136
+ class: classNames == null ? void 0 : classNames.date
8137
+ })}`,
8138
+ "data-saturday": highlightWeekend && index === 6,
8139
+ "data-sunday": highlightWeekend && index === 0
8140
+ };
8141
+ },
8142
+ [slots, classNames, highlightWeekend]
8143
+ );
8144
+ const getDateProps = (0, import_react31.useCallback)(
8145
+ (dateObj) => {
8146
+ const today = /* @__PURE__ */ new Date();
8147
+ const isToday = today.getDate() === dateObj.date && today.getMonth() === currentDate.getMonth() && today.getFullYear() === currentDate.getFullYear();
8148
+ const formatted = selectedDate ? formatStringToDate(selectedDate) : "";
8149
+ const isSelected = formatted ? formatted.getDate() === dateObj.date && formatted.getMonth() === currentDate.getMonth() && formatted.getFullYear() === currentDate.getFullYear() : false;
8150
+ const dayOfWeek = new Date(currentDate.getFullYear(), currentDate.getMonth(), dateObj.date).getDay();
8151
+ return {
8152
+ className: `${slots.date({
8153
+ class: classNames == null ? void 0 : classNames.date
8154
+ })}`,
8155
+ "data-today": dateObj.currentMonth && isToday,
8156
+ "data-selected": dateObj.currentMonth && isSelected,
8157
+ "data-disabled": !dateObj.currentMonth,
8158
+ "data-saturday": highlightWeekend && dayOfWeek === 6,
8159
+ "data-sunday": highlightWeekend && dayOfWeek === 0,
8160
+ onClick: () => handleDateSelect(dateObj.date, dateObj.currentMonth)
8161
+ };
8162
+ },
8163
+ [slots, classNames, selectedDate, currentDate, highlightWeekend]
8164
+ );
8165
+ const calendarDates = getCalendarDates();
8166
+ return /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(import_jsx_runtime28.Fragment, { children: /* @__PURE__ */ (0, import_jsx_runtime28.jsxs)("div", { ...getBaseProps(), children: [
8167
+ /* @__PURE__ */ (0, import_jsx_runtime28.jsxs)("div", { className: "calendar-header flex justify-between items-center mb-4", children: [
8168
+ /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(Icon_default, { name: "brace-left", size: "md", className: "cursor-pointer", onClick: handlePrevMonth }),
8169
+ /* @__PURE__ */ (0, import_jsx_runtime28.jsx)("span", { className: "text-h6 font-semibold", children: currentDate.toLocaleString("default", { year: "numeric", month: "2-digit" }) }),
8170
+ /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(Icon_default, { name: "brace-right", size: "md", className: "cursor-pointer", onClick: handleNextMonth })
8171
+ ] }),
8172
+ /* @__PURE__ */ (0, import_jsx_runtime28.jsx)("div", { className: "grid grid-cols-7 gap-2 text-center", children: daysOfWeek.map((day, index) => /* @__PURE__ */ (0, import_jsx_runtime28.jsx)("div", { ...getDateTitleProps(index), children: day }, `${day}-${index}`)) }),
8173
+ /* @__PURE__ */ (0, import_jsx_runtime28.jsx)("div", { className: "grid grid-cols-7 gap-[5px] text-center mt-2", children: calendarDates.map((week, weekIndex) => {
8174
+ const hasCurrentMonthDates = week.some((dateObj) => dateObj.currentMonth);
8175
+ if (!hasCurrentMonthDates) return null;
8176
+ return /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(import_react31.default.Fragment, { children: week.map((dateObj, index) => {
8177
+ return /* @__PURE__ */ (0, import_jsx_runtime28.jsx)("div", { ...getDateProps(dateObj), children: dateObj.date }, index);
8178
+ }) }, weekIndex);
8179
+ }) })
8180
+ ] }) });
8181
+ });
8182
+ Calendar.displayName = "Calendar";
8183
+ var calendar_default = Calendar;
8184
+ var calendarStyle = tv({
8185
+ slots: {
8186
+ base: [
8187
+ "flex",
8188
+ "flex-col",
8189
+ "w-[240px]",
8190
+ "border",
8191
+ "border-neutral-main",
8192
+ "bg-background",
8193
+ "rounded-md",
8194
+ "p-4",
8195
+ "shadow-lg",
8196
+ "select-none"
8197
+ ],
8198
+ dateTitle: ["text-sm", "font-[500]", "data-[saturday=true]:text-[#1E7EEE]", "data-[sunday=true]:text-[#FF4684]"],
8199
+ date: [
8200
+ "flex",
8201
+ "justify-center",
8202
+ "items-center",
8203
+ "h-[25px]",
8204
+ "text-sm",
8205
+ "rounded-full",
8206
+ "cursor-pointer",
8207
+ "data-[today=true]:border",
8208
+ "data-[today=true]:border-foreground",
8209
+ "data-[saturday=true]:text-[#1E7EEE]",
8210
+ "data-[saturday=true]:!border-[#1E7EEE]",
8211
+ "data-[sunday=true]:text-[#FF4684]",
8212
+ "data-[sunday=true]:!border-[#FF4684]",
8213
+ "data-[selected=true]:!text-white",
8214
+ "data-[selected=true]:border-none",
8215
+ "data-[disabled=true]:!text-neutral-main",
8216
+ "data-[disabled=true]:cursor-default",
8217
+ "data-[disabled=true]:hover:bg-transparent"
8218
+ ]
8219
+ },
8220
+ variants: {
8221
+ variant: {
8222
+ solid: {}
8223
+ },
8224
+ color: {
8225
+ primary: {
8226
+ date: [
8227
+ "hover:text-primary-main",
8228
+ "hover:bg-primary-soft",
8229
+ "data-[selected=true]:!border-primary-main",
8230
+ "data-[selected=true]:bg-primary-main"
8231
+ ]
8232
+ },
8233
+ secondary: {
8234
+ date: [
8235
+ "hover:text-secondary-main",
8236
+ "hover:bg-secondary-soft",
8237
+ "data-[selected=true]:!border-secondary-main",
8238
+ "data-[selected=true]:bg-secondary-main"
8239
+ ]
8240
+ }
8241
+ }
8242
+ },
8243
+ defaultVariants: {
8244
+ variant: "solid",
8245
+ color: "primary"
8246
+ },
8247
+ compoundVariants: [
8248
+ {
8249
+ isDisabled: true,
8250
+ isRequired: true,
8251
+ class: {}
8252
+ }
8253
+ ]
8254
+ });
8255
+
8256
+ // src/components/dateTimePicker/timePicker.tsx
8257
+ var import_react32 = require("react");
8258
+ var import_jsx_runtime29 = require("react/jsx-runtime");
8259
+ var TimePicker = ({ color = "primary", selectedTime, onChangeTime }) => {
8260
+ const TOTAL_HOURS = 12;
8261
+ const TOTAL_MINUTES = 60;
8262
+ const ITEM_HEIGHT = 30;
8263
+ const PERIODS = ["AM", "PM"];
8264
+ const [selectedHour, setSelectedHour] = (0, import_react32.useState)("01");
8265
+ const [selectedMinute, setSelectedMinute] = (0, import_react32.useState)("00");
8266
+ const [selectedPeriod, setSelectedPeriod] = (0, import_react32.useState)("AM");
8267
+ const hourRef = (0, import_react32.useRef)(null);
8268
+ const minuteRef = (0, import_react32.useRef)(null);
8269
+ const periodRef = (0, import_react32.useRef)(null);
8270
+ const hoursArray = [...Array(TOTAL_HOURS).keys()].map((i) => (i + 1).toString().padStart(2, "0"));
8271
+ const minutesArray = [...Array(TOTAL_MINUTES).keys()].map((i) => i.toString().padStart(2, "0"));
8272
+ (0, import_react32.useEffect)(() => {
8273
+ if (selectedTime) {
8274
+ const { formattedHour, minute, period } = parseAndFormatTime(selectedTime);
8275
+ setSelectedHour(formattedHour);
8276
+ setSelectedMinute(minute);
8277
+ setSelectedPeriod(period);
8278
+ }
8279
+ }, [selectedTime]);
8280
+ (0, import_react32.useEffect)(() => {
8281
+ scrollToSelectedTime();
8282
+ }, []);
8283
+ const parseAndFormatTime = (time) => {
8284
+ const [hour, minute] = time.split(":").map((part) => part.padStart(2, "0"));
8285
+ const parsedHour = parseInt(hour, 10);
8286
+ const period = parsedHour >= 12 ? "PM" : "AM";
8287
+ const formattedHour = parsedHour % 12 === 0 ? "12" : (parsedHour % 12).toString().padStart(2, "0");
8288
+ return { formattedHour, minute, period };
8289
+ };
8290
+ const scrollToSelectedTime = () => {
8291
+ if (selectedTime) {
8292
+ const { formattedHour, minute, period } = parseAndFormatTime(selectedTime);
8293
+ if (hourRef.current) {
8294
+ hourRef.current.scrollTop = (parseInt(formattedHour) - 1) * ITEM_HEIGHT;
8295
+ }
8296
+ if (minuteRef.current) {
8297
+ minuteRef.current.scrollTop = parseInt(minute) * ITEM_HEIGHT;
8298
+ }
8299
+ if (periodRef.current) {
8300
+ periodRef.current.scrollTop = period === "AM" ? 0 : ITEM_HEIGHT;
8301
+ }
8302
+ }
8303
+ };
8304
+ const handleTimeChange = (hour, minute, period) => {
8305
+ const parsedHour = parseInt(hour);
8306
+ let hour24 = parsedHour;
8307
+ if (period === "PM" && parsedHour !== 12) {
8308
+ hour24 = parsedHour + 12;
8309
+ } else if (period === "AM" && parsedHour === 12) {
8310
+ hour24 = 0;
8311
+ }
8312
+ const formattedTime = `${hour24.toString().padStart(2, "0")}:${minute}`;
8313
+ if (onChangeTime) {
8314
+ onChangeTime(formattedTime);
8315
+ }
8316
+ };
8317
+ return /* @__PURE__ */ (0, import_jsx_runtime29.jsxs)("div", { className: "flex h-[200px] p-[10px] gap-[5px] border border-neutral-main rounded-md bg-background shadow-lg", children: [
8318
+ /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(list_default, { ref: periodRef, classNames: { base: "overflow-y-auto scrollbar-hide" }, children: PERIODS.map((period, index) => /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(
8319
+ listItem_default,
8320
+ {
8321
+ color,
8322
+ selected: period === selectedPeriod,
8323
+ title: period,
8324
+ size: "sm",
8325
+ classNames: { base: "w-[50px] min-h-[30px]", titleWrapper: "flex justify-center" },
8326
+ onClick: () => {
8327
+ handleTimeChange(selectedHour, selectedMinute, period);
8328
+ }
8329
+ },
8330
+ `${period}-${index}`
8331
+ )) }),
8332
+ /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(list_default, { ref: hourRef, classNames: { base: "overflow-y-auto scrollbar-hide" }, children: hoursArray.map((hour, index) => /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(
8333
+ listItem_default,
8334
+ {
8335
+ color,
8336
+ selected: hour === selectedHour,
8337
+ title: hour,
8338
+ size: "sm",
8339
+ classNames: { base: "w-[50px] min-h-[30px]", titleWrapper: "flex justify-center" },
8340
+ onClick: () => {
8341
+ handleTimeChange(hour, selectedMinute, selectedPeriod);
8342
+ }
8343
+ },
8344
+ `${hour}-${index}`
8345
+ )) }),
8346
+ /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(list_default, { ref: minuteRef, classNames: { base: "overflow-y-auto scrollbar-hide" }, children: minutesArray.map((minute, index) => /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(
8347
+ listItem_default,
8348
+ {
8349
+ color,
8350
+ selected: minute === selectedMinute,
8351
+ title: minute,
8352
+ size: "sm",
8353
+ classNames: { base: "w-[50px] min-h-[30px]", titleWrapper: "flex justify-center" },
8354
+ onClick: () => {
8355
+ handleTimeChange(selectedHour, minute, selectedPeriod);
8356
+ }
8357
+ },
8358
+ `${minute}-${index}`
8359
+ )) })
8360
+ ] });
8361
+ };
8362
+ var timePicker_default = TimePicker;
8363
+
8364
+ // src/components/dateTimePicker/dateTimePicker.tsx
8365
+ var import_jsx_runtime30 = require("react/jsx-runtime");
8366
+ var DatePicker = (0, import_react33.forwardRef)((originalProps, ref) => {
8367
+ const [props, variantProps] = mapPropsVariants(originalProps, dateTimePickerStyle.variantKeys);
8368
+ const { classNames, label, errorMessage, startContent, endContent, type = "date", ...inputProps } = props;
8369
+ const slots = (0, import_react33.useMemo)(() => dateTimePickerStyle({ ...variantProps }), [variantProps]);
8370
+ const {
8371
+ selectedDate,
8372
+ selectedTime,
8373
+ targetRect,
8374
+ popupHeight,
8375
+ datePickerRef,
8376
+ dateInputRef,
8377
+ datePickerWrapperRef,
8378
+ handleToggleDatePicker,
8379
+ handleChangeDate,
8380
+ handleChangeTime,
8381
+ calculatePositionWithScroll
8382
+ } = useDatePicker({
8383
+ initialDate: void 0
8384
+ });
8385
+ const position = targetRect ? calculatePositionWithScroll(targetRect, popupHeight) : null;
8386
+ const getBaseProps = (0, import_react33.useCallback)(
8387
+ () => ({
8388
+ className: slots.base({ class: classNames == null ? void 0 : classNames.base })
8389
+ }),
8390
+ [slots, classNames]
8391
+ );
8392
+ const getLabelProps = (0, import_react33.useCallback)(
8393
+ () => ({
8394
+ className: slots.label({ class: classNames == null ? void 0 : classNames.label })
8395
+ }),
8396
+ [slots, classNames]
8397
+ );
8398
+ const getInnerWrapperProps = (0, import_react33.useCallback)(
8399
+ () => ({
8400
+ className: slots.innerWrapper({ class: classNames == null ? void 0 : classNames.innerWrapper })
8401
+ }),
8402
+ [slots, classNames]
8403
+ );
8404
+ const getInputWrapperProps = (0, import_react33.useCallback)(
8405
+ () => ({
8406
+ className: slots.inputWrapper({ class: classNames == null ? void 0 : classNames.inputWrapper }),
8407
+ ref: datePickerRef
8408
+ }),
8409
+ [slots, classNames]
8410
+ );
8411
+ const getInputProps = (0, import_react33.useCallback)(
8412
+ () => ({
8413
+ ...inputProps,
8414
+ ref: ref || dateInputRef,
8415
+ className: slots.input({ class: classNames == null ? void 0 : classNames.input }),
8416
+ size: 0,
8417
+ type,
8418
+ value: type === "date" ? selectedDate || "" : type === "time" ? selectedTime || "" : "",
8419
+ onChange: (e) => {
8420
+ if (type === "date") {
8421
+ handleChangeDate(e.target.value);
8422
+ } else if (type === "time") {
8423
+ handleChangeTime(e.target.value);
8424
+ }
8425
+ },
8426
+ max: "9999-12-31"
8427
+ }),
8428
+ [inputProps, ref, dateInputRef, slots, classNames == null ? void 0 : classNames.input, selectedDate]
8429
+ );
8430
+ const getContentProps = (0, import_react33.useCallback)(
8431
+ () => ({
8432
+ className: slots.content({ class: classNames == null ? void 0 : classNames.content }),
8433
+ size: originalProps.size
8434
+ }),
8435
+ [slots, classNames, originalProps.size]
8436
+ );
8437
+ const getErrorMessageProps = (0, import_react33.useCallback)(
8438
+ () => ({
8439
+ className: slots.errorMessage({ class: classNames == null ? void 0 : classNames.errorMessage })
8440
+ }),
8441
+ [slots, classNames]
8442
+ );
8443
+ const renderStartContent = () => {
8444
+ if (import_react33.default.isValidElement(startContent)) {
8445
+ const existingProps = startContent.props;
8446
+ const mergedProps = {
8447
+ ...getContentProps(),
8448
+ className: `${getContentProps().className || ""} ${existingProps.className || ""}`.trim()
8449
+ };
8450
+ return import_react33.default.cloneElement(startContent, mergedProps);
8451
+ } else {
8452
+ const contentProps = getContentProps();
8453
+ return /* @__PURE__ */ (0, import_jsx_runtime30.jsx)("div", { ...contentProps, children: startContent });
8454
+ }
8455
+ };
8456
+ const renderDateTimePickerIcon = () => /* @__PURE__ */ (0, import_jsx_runtime30.jsx)("div", { ...getContentProps(), onClick: handleToggleDatePicker, children: /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(
8457
+ Icon_default,
8458
+ {
8459
+ name: type === "time" ? "clock" : "calendar",
8460
+ size: originalProps.size,
8461
+ className: "cursor-pointer",
8462
+ fill: type === "date"
8463
+ }
8464
+ ) });
8465
+ const renderContentWithIcon = () => {
8466
+ if (import_react33.default.isValidElement(endContent)) {
8467
+ const existingProps = endContent.props;
8468
+ const mergedProps = {
8469
+ ...getContentProps(),
8470
+ className: `${getContentProps().className || ""} ${existingProps.className || ""}`.trim()
8471
+ };
8472
+ return import_react33.default.cloneElement(endContent, mergedProps);
8473
+ } else if (errorMessage) {
8474
+ const iconProps = { ...getContentProps(), className: getContentProps().className };
8475
+ return /* @__PURE__ */ (0, import_jsx_runtime30.jsx)("div", { ...iconProps, children: /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(Icon_default, { name: "exclamation-circle", fill: true, size: originalProps.size }) });
8476
+ } else {
8477
+ return /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(import_jsx_runtime30.Fragment, {});
8478
+ }
8479
+ };
8480
+ const renderEndContent = () => {
8481
+ switch (type) {
8482
+ case "date":
8483
+ case "datetime-local":
8484
+ case "month":
8485
+ case "week":
8486
+ case "time":
8487
+ return renderDateTimePickerIcon();
8488
+ default:
8489
+ return renderContentWithIcon();
8490
+ }
8491
+ };
8492
+ return /* @__PURE__ */ (0, import_jsx_runtime30.jsxs)(import_jsx_runtime30.Fragment, { children: [
8493
+ /* @__PURE__ */ (0, import_jsx_runtime30.jsxs)("div", { ...getBaseProps(), children: [
8494
+ label && /* @__PURE__ */ (0, import_jsx_runtime30.jsx)("label", { ...getLabelProps(), children: label }),
8495
+ /* @__PURE__ */ (0, import_jsx_runtime30.jsxs)("div", { ...getInnerWrapperProps(), children: [
8496
+ /* @__PURE__ */ (0, import_jsx_runtime30.jsxs)("div", { ...getInputWrapperProps(), children: [
8497
+ startContent && renderStartContent(),
8498
+ /* @__PURE__ */ (0, import_jsx_runtime30.jsx)("input", { ...getInputProps() }),
8499
+ renderEndContent()
8500
+ ] }),
8501
+ errorMessage && /* @__PURE__ */ (0, import_jsx_runtime30.jsx)("p", { ...getErrorMessageProps(), children: errorMessage })
8502
+ ] })
8503
+ ] }),
8504
+ targetRect && /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(import_jsx_runtime30.Fragment, { children: (0, import_react_dom4.createPortal)(
8505
+ /* @__PURE__ */ (0, import_jsx_runtime30.jsxs)(
8506
+ "div",
8507
+ {
8508
+ ref: datePickerWrapperRef,
8509
+ style: {
8510
+ position: "absolute",
8511
+ top: position == null ? void 0 : position.top,
8512
+ left: position == null ? void 0 : position.left,
8513
+ zIndex: 1e3
8514
+ },
8515
+ children: [
8516
+ type === "date" && /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(
8517
+ calendar_default,
8518
+ {
8519
+ color: originalProps.color,
8520
+ selectedDate,
8521
+ highlightWeekend: originalProps.highlightWeekend,
8522
+ onChangeDate: handleChangeDate
8523
+ }
8524
+ ),
8525
+ type === "time" && /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(timePicker_default, { color: originalProps.color, selectedTime, onChangeTime: handleChangeTime })
8526
+ ]
8527
+ }
8528
+ ),
8529
+ document.body
8530
+ ) })
8531
+ ] });
8532
+ });
8533
+ DatePicker.displayName = "DatePicker";
8534
+ var dateTimePicker_default = DatePicker;
8535
+ var dateTimePickerStyle = tv({
8536
+ slots: {
8537
+ base: ["group/input", "flex", "flex-col", "inline-block"],
8538
+ label: ["flex", "items-center"],
8539
+ innerWrapper: ["flex", "flex-col"],
8540
+ inputWrapper: [
8541
+ "flex",
8542
+ "items-center",
8543
+ "transition",
8544
+ "duration-200",
8545
+ "group-has-[p]/input:border-danger-main",
8546
+ "group-has-[p]/input:bg-danger-soft"
8547
+ ],
8548
+ input: ["w-full", "h-full", "bg-transparent", "placeholder:text-neutral-main", "focus-visible:outline-none"],
8549
+ content: ["flex", "items-center", "select-none", "group-has-[p]/input:text-danger-main"],
8550
+ errorMessage: ["text-danger-main"]
8551
+ },
8552
+ variants: {
8553
+ variant: {
8554
+ solid: {
8555
+ inputWrapper: ["bg-trans-soft", "hover:bg-trans-light", "has-[:focus]:bg-trans-light"]
8556
+ },
8557
+ normal: {
8558
+ inputWrapper: [
8559
+ "bg-transparent",
8560
+ "border",
8561
+ "border-neutral-main",
8562
+ "hover:bg-trans-soft",
8563
+ "has-[:focus]:bg-trans-soft"
8564
+ ]
8565
+ },
8566
+ line: {
8567
+ inputWrapper: [
8568
+ "bg-transparent",
8569
+ "border-b",
8570
+ "border-neutral-main",
8571
+ "!rounded-none",
8572
+ "hover:bg-trans-soft",
8573
+ "has-[:focus]:bg-trans-soft"
8574
+ ]
8575
+ }
8576
+ },
8577
+ color: {
8578
+ primary: {
8579
+ inputWrapper: ["has-[:focus]:border-primary-main"],
8580
+ content: ["text-primary-main"]
8581
+ },
8582
+ secondary: {
8583
+ inputWrapper: ["has-[:focus]:border-secondary-main"],
8584
+ content: ["text-secondary-main"]
8585
+ }
8586
+ },
8587
+ size: {
8588
+ sm: {
8589
+ base: ["text-sm", "gap-[6px]"],
8590
+ innerWrapper: ["group-has-[p]/input:gap-[6px]"],
8591
+ inputWrapper: ["w-[240px]", "h-[24px]", "rounded-sm", "px-[6px]", "py-[4.5px]", "gap-[6px]"],
8592
+ errorMessage: ["text-sm"]
8593
+ },
8594
+ md: {
8595
+ base: ["text-md", "gap-[8px]"],
8596
+ innerWrapper: ["group-has-[p]/input:gap-[8px]"],
8597
+ inputWrapper: ["w-[240px]", "h-[30px]", "rounded-md", "px-[8px]", "py-[6.5px]", "gap-[8px]"],
8598
+ errorMessage: ["text-md"]
8599
+ },
8600
+ lg: {
8601
+ base: ["text-lg", "gap-[10px]"],
8602
+ innerWrapper: ["group-has-[p]/input:gap-[10px]"],
8603
+ inputWrapper: ["w-[240px]", "h-[36px]", "rounded-lg", "px-[10px]", "py-[8px]", "gap-[10px]"],
8604
+ errorMessage: ["text-lg"]
8605
+ }
8606
+ },
8607
+ radius: {
8608
+ default: "",
8609
+ none: {
8610
+ inputWrapper: ["rounded-none"]
8611
+ },
8612
+ full: {
8613
+ inputWrapper: ["rounded-full"]
8614
+ }
8615
+ },
8616
+ fullWidth: {
8617
+ true: {
8618
+ base: ["w-full"],
8619
+ innerWrapper: ["flex-1"],
8620
+ inputWrapper: ["w-full"]
8621
+ }
8622
+ },
8623
+ isDisabled: {
8624
+ true: {
8625
+ label: ["text-neutral-light"],
8626
+ inputWrapper: ["bg-neutral-soft", "border-neutral-light", "pointer-events-none"],
8627
+ input: ["text-neutral-light", "placeholder:text-neutral-light"],
8628
+ content: ["text-neutral-light"],
8629
+ errorMessage: ["text-danger-light"]
8630
+ }
8631
+ },
8632
+ isRequired: {
8633
+ true: {
8634
+ label: ["after:content-['*']", "after:text-danger-main", "after:ml-0.5"]
8635
+ }
8636
+ }
8637
+ },
8638
+ defaultVariants: {
8639
+ variant: "solid",
8640
+ color: "primary",
8641
+ size: "md",
8642
+ fullWidth: false,
8643
+ isDisabled: false,
8644
+ isRequired: false
8645
+ },
8646
+ compoundVariants: [
8647
+ {
8648
+ isDisabled: true,
8649
+ isRequired: true,
8650
+ class: {
8651
+ label: ["after:text-danger-light"]
8652
+ }
8653
+ }
8654
+ ]
8655
+ });
8656
+
7977
8657
  // ../tailwind-config/src/plugin.ts
7978
8658
  var import_plugin = __toESM(require_plugin());
7979
8659
 
@@ -8537,6 +9217,16 @@ var resolveConfig = (themes = {}, defaultTheme, prefix = "deepnoidUi") => {
8537
9217
  }
8538
9218
  }
8539
9219
  }
9220
+ resolved.utilities = {
9221
+ ...resolved.utilities,
9222
+ ".scrollbar-hide": {
9223
+ "-ms-overflow-style": "none",
9224
+ "scrollbar-width": "none",
9225
+ "&::-webkit-scrollbar": {
9226
+ display: "none"
9227
+ }
9228
+ }
9229
+ };
8540
9230
  return resolved;
8541
9231
  };
8542
9232
  var deepnoidUi = (colorChip = {}, defaultTheme = "light") => {
@@ -8611,6 +9301,7 @@ var deepnoidUi = (colorChip = {}, defaultTheme = "light") => {
8611
9301
  ButtonGroup,
8612
9302
  Card,
8613
9303
  CheckBox,
9304
+ DateTimePicker,
8614
9305
  Icon,
8615
9306
  Input,
8616
9307
  List,