@itilite/lumina-ui 1.1.4 → 1.1.6

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 (181) hide show
  1. package/dist/atom/LoadingSpinner/LoadingSpinner.d.mts +19 -0
  2. package/dist/atom/LoadingSpinner/LoadingSpinner.d.ts +19 -0
  3. package/dist/atom/LoadingSpinner/LoadingSpinner.js +90 -0
  4. package/dist/atom/LoadingSpinner/LoadingSpinner.mjs +9 -0
  5. package/dist/atom/RangePicker/Chevron.d.mts +13 -0
  6. package/dist/atom/RangePicker/Chevron.d.ts +13 -0
  7. package/dist/atom/RangePicker/Chevron.js +110 -0
  8. package/dist/atom/RangePicker/Chevron.mjs +7 -0
  9. package/dist/atom/RangePicker/RangePicker.d.mts +26 -0
  10. package/dist/atom/RangePicker/RangePicker.d.ts +26 -0
  11. package/dist/atom/RangePicker/RangePicker.js +1451 -0
  12. package/dist/atom/RangePicker/RangePicker.mjs +13 -0
  13. package/dist/atom/Select/Select.d.mts +43 -0
  14. package/dist/atom/Select/Select.d.ts +43 -0
  15. package/dist/atom/Select/Select.js +800 -0
  16. package/dist/atom/Select/Select.mjs +11 -0
  17. package/dist/chunk-22VF7AVT.mjs +618 -0
  18. package/dist/chunk-2BNAAOBU.mjs +670 -0
  19. package/dist/chunk-2IMRLK6M.mjs +44 -0
  20. package/dist/chunk-2JIINZEK.mjs +618 -0
  21. package/dist/chunk-2LBFKQDZ.mjs +660 -0
  22. package/dist/chunk-2ZJBF5C4.mjs +618 -0
  23. package/dist/chunk-33JITG5Y.mjs +621 -0
  24. package/dist/chunk-3IMCN4K3.mjs +670 -0
  25. package/dist/chunk-3K2RTVMH.mjs +584 -0
  26. package/dist/chunk-3KBQQCET.mjs +674 -0
  27. package/dist/chunk-3KUHXNFH.mjs +678 -0
  28. package/dist/chunk-3PPNOIXN.mjs +618 -0
  29. package/dist/chunk-3XFY3TXJ.mjs +611 -0
  30. package/dist/chunk-3XW7HS5W.mjs +618 -0
  31. package/dist/chunk-3YDCRJYV.mjs +618 -0
  32. package/dist/chunk-447HZYZ4.mjs +612 -0
  33. package/dist/chunk-46F3B4U6.mjs +618 -0
  34. package/dist/chunk-4K5RZHL4.mjs +618 -0
  35. package/dist/chunk-4QHFP4YD.mjs +666 -0
  36. package/dist/chunk-4TFX4DHY.mjs +702 -0
  37. package/dist/chunk-4TWO6JES.mjs +666 -0
  38. package/dist/chunk-4UQVJ3ZU.mjs +666 -0
  39. package/dist/chunk-5247J65D.mjs +670 -0
  40. package/dist/chunk-66H5WSEJ.mjs +618 -0
  41. package/dist/chunk-6NZEDJ2M.mjs +582 -0
  42. package/dist/chunk-6OGEXG5U.mjs +618 -0
  43. package/dist/chunk-6ROQXYVN.mjs +672 -0
  44. package/dist/chunk-6WNI6X5Q.mjs +618 -0
  45. package/dist/chunk-72PPCN6D.mjs +675 -0
  46. package/dist/chunk-74EGXFNN.mjs +618 -0
  47. package/dist/chunk-77NCDGJA.mjs +707 -0
  48. package/dist/chunk-7NGBIPZT.mjs +618 -0
  49. package/dist/chunk-7NM4FNMQ.mjs +666 -0
  50. package/dist/chunk-7YBBSVUA.mjs +672 -0
  51. package/dist/chunk-7Z52UP7P.mjs +618 -0
  52. package/dist/chunk-B3LDL3KD.mjs +670 -0
  53. package/dist/chunk-B65LGQ47.mjs +666 -0
  54. package/dist/chunk-B6MTRO54.mjs +618 -0
  55. package/dist/chunk-BJBP5XYB.mjs +618 -0
  56. package/dist/chunk-BLLSWPCC.mjs +618 -0
  57. package/dist/chunk-BOYB7REJ.mjs +670 -0
  58. package/dist/chunk-BP2D64XI.mjs +618 -0
  59. package/dist/chunk-BP4XS2GF.mjs +585 -0
  60. package/dist/chunk-BRT5IPGQ.mjs +618 -0
  61. package/dist/chunk-BTIIO2CP.mjs +582 -0
  62. package/dist/chunk-C2J3VBFZ.mjs +670 -0
  63. package/dist/chunk-CDOR7GQP.mjs +618 -0
  64. package/dist/chunk-CI2RMA4V.mjs +612 -0
  65. package/dist/chunk-CNUIZOQJ.mjs +669 -0
  66. package/dist/chunk-CPBXPEST.mjs +672 -0
  67. package/dist/chunk-CVOLXLMU.mjs +618 -0
  68. package/dist/chunk-CWUCNC36.mjs +666 -0
  69. package/dist/chunk-CZBGN6GS.mjs +612 -0
  70. package/dist/chunk-D3APB62N.mjs +618 -0
  71. package/dist/chunk-D5B2TUSL.mjs +591 -0
  72. package/dist/chunk-D7TWXVL2.mjs +674 -0
  73. package/dist/chunk-DAZ53AD7.mjs +671 -0
  74. package/dist/chunk-DBY5U6IU.mjs +618 -0
  75. package/dist/chunk-DXTVU4M5.mjs +618 -0
  76. package/dist/chunk-DZBTD6QK.mjs +666 -0
  77. package/dist/chunk-E6UPDTDY.mjs +611 -0
  78. package/dist/chunk-EAK2IMM4.mjs +37 -0
  79. package/dist/chunk-EQT2Q2LW.mjs +610 -0
  80. package/dist/chunk-EWMCELQV.mjs +670 -0
  81. package/dist/chunk-EYKWBEHX.mjs +612 -0
  82. package/dist/chunk-FHLCFUP6.mjs +666 -0
  83. package/dist/chunk-FMPFLQZV.mjs +670 -0
  84. package/dist/chunk-G25YXZ74.mjs +618 -0
  85. package/dist/chunk-G6P5MKL3.mjs +582 -0
  86. package/dist/chunk-GSG6ZC3R.mjs +37 -0
  87. package/dist/chunk-H3MQUFTJ.mjs +618 -0
  88. package/dist/chunk-HKZRLVBX.mjs +618 -0
  89. package/dist/chunk-HQALJGVT.mjs +618 -0
  90. package/dist/chunk-I5GBZ3UX.mjs +676 -0
  91. package/dist/chunk-IUTUCRDD.mjs +611 -0
  92. package/dist/chunk-IV4V55OA.mjs +672 -0
  93. package/dist/chunk-J2RAFKAD.mjs +618 -0
  94. package/dist/chunk-JCMSG75Q.mjs +51 -0
  95. package/dist/chunk-JL34UFI7.mjs +670 -0
  96. package/dist/chunk-JTKSGGQM.mjs +611 -0
  97. package/dist/chunk-JZC2RRDH.mjs +618 -0
  98. package/dist/chunk-JZCHXA6R.mjs +585 -0
  99. package/dist/chunk-K3Y7VKT6.mjs +670 -0
  100. package/dist/chunk-KEVXNUFG.mjs +672 -0
  101. package/dist/chunk-KH7D4ESJ.mjs +584 -0
  102. package/dist/chunk-KQBCWIIM.mjs +618 -0
  103. package/dist/chunk-KRYAP7NG.mjs +670 -0
  104. package/dist/chunk-KU655POK.mjs +657 -0
  105. package/dist/chunk-L55SLVNX.mjs +618 -0
  106. package/dist/chunk-LCRYOZEV.mjs +618 -0
  107. package/dist/chunk-LH7PP6V2.mjs +618 -0
  108. package/dist/chunk-LJMMYKE2.mjs +618 -0
  109. package/dist/chunk-LK5TROLL.mjs +666 -0
  110. package/dist/chunk-MDR7DAKM.mjs +618 -0
  111. package/dist/chunk-MJZLCWZ5.mjs +666 -0
  112. package/dist/chunk-MKZTEJLS.mjs +612 -0
  113. package/dist/chunk-MQCOQHHP.mjs +618 -0
  114. package/dist/chunk-MSM4KUBM.mjs +618 -0
  115. package/dist/chunk-MTIUER63.mjs +676 -0
  116. package/dist/chunk-NBLV3UX5.mjs +618 -0
  117. package/dist/chunk-NLADSOJS.mjs +618 -0
  118. package/dist/chunk-NPMTWR3Y.mjs +618 -0
  119. package/dist/chunk-NQ6GKEO7.mjs +670 -0
  120. package/dist/chunk-NZSFYNUK.mjs +618 -0
  121. package/dist/chunk-OCNF4O5U.mjs +612 -0
  122. package/dist/chunk-OCW5QSWA.mjs +618 -0
  123. package/dist/chunk-OQF7JZFS.mjs +670 -0
  124. package/dist/chunk-OT675HGC.mjs +670 -0
  125. package/dist/chunk-P47TCYKN.mjs +618 -0
  126. package/dist/chunk-P7TOGXPI.mjs +672 -0
  127. package/dist/chunk-PCAXXEEQ.mjs +618 -0
  128. package/dist/chunk-PDHMG7OZ.mjs +672 -0
  129. package/dist/chunk-PFGVOZGM.mjs +618 -0
  130. package/dist/chunk-PGAAFJOG.mjs +576 -0
  131. package/dist/chunk-PQSSDK3E.mjs +618 -0
  132. package/dist/chunk-PST7W3NG.mjs +618 -0
  133. package/dist/chunk-QGPBZ2YV.mjs +664 -0
  134. package/dist/chunk-QKTMWS4J.mjs +43 -0
  135. package/dist/chunk-QOPCJITC.mjs +618 -0
  136. package/dist/chunk-QSE52CRC.mjs +618 -0
  137. package/dist/chunk-QTP2QMPL.mjs +669 -0
  138. package/dist/chunk-QUZAACW5.mjs +585 -0
  139. package/dist/chunk-R47XX6IW.mjs +611 -0
  140. package/dist/chunk-RL6AEU6E.mjs +612 -0
  141. package/dist/chunk-RZ7V2KQZ.mjs +621 -0
  142. package/dist/chunk-S3CUYIE3.mjs +585 -0
  143. package/dist/chunk-T7T4HCHH.mjs +618 -0
  144. package/dist/chunk-TED2WCDG.mjs +618 -0
  145. package/dist/chunk-TENXL4LK.mjs +107 -0
  146. package/dist/chunk-TJLIMMMB.mjs +612 -0
  147. package/dist/chunk-TNOJDLON.mjs +611 -0
  148. package/dist/chunk-TOR67IHH.mjs +672 -0
  149. package/dist/chunk-TOV7NVKM.mjs +618 -0
  150. package/dist/chunk-TSYMIRRN.mjs +618 -0
  151. package/dist/chunk-TTSRI4V7.mjs +708 -0
  152. package/dist/chunk-UBS3DTE5.mjs +672 -0
  153. package/dist/chunk-UBW6RYVF.mjs +670 -0
  154. package/dist/chunk-UFAFA6RV.mjs +585 -0
  155. package/dist/chunk-UJNUFKR5.mjs +43 -0
  156. package/dist/chunk-VAZZJOSJ.mjs +618 -0
  157. package/dist/chunk-VCWXOX2B.mjs +618 -0
  158. package/dist/chunk-VHCLEOHZ.mjs +618 -0
  159. package/dist/chunk-VTZSCGME.mjs +666 -0
  160. package/dist/chunk-W33KZ2XR.mjs +618 -0
  161. package/dist/chunk-WOVMTYDV.mjs +612 -0
  162. package/dist/chunk-WR3USBWK.mjs +672 -0
  163. package/dist/chunk-WXYQARQ6.mjs +618 -0
  164. package/dist/chunk-XE4LPYOW.mjs +581 -0
  165. package/dist/chunk-Y6XKW4NG.mjs +618 -0
  166. package/dist/chunk-YQSNJFZE.mjs +618 -0
  167. package/dist/chunk-Z6VG6AG7.mjs +678 -0
  168. package/dist/chunk-ZAPKQ4C3.mjs +678 -0
  169. package/dist/chunk-ZCWDQNHL.mjs +618 -0
  170. package/dist/chunk-ZF5JBNCI.mjs +618 -0
  171. package/dist/chunk-ZN7BHWOF.mjs +672 -0
  172. package/dist/chunk-ZTRM4HZJ.mjs +53 -0
  173. package/dist/chunk-ZUMHWVMV.mjs +585 -0
  174. package/dist/chunk-ZUQJKA5J.mjs +666 -0
  175. package/dist/chunk-ZWHWIGYQ.mjs +618 -0
  176. package/dist/index.d.mts +4 -0
  177. package/dist/index.d.ts +4 -0
  178. package/dist/index.js +1350 -0
  179. package/dist/index.mjs +22 -9
  180. package/dist/styles.css +845 -228
  181. package/package.json +4 -2
@@ -0,0 +1,618 @@
1
+ import {
2
+ __objRest,
3
+ __spreadProps,
4
+ __spreadValues
5
+ } from "./chunk-FWCSY2DS.mjs";
6
+
7
+ // src/atom/Select/Select.tsx
8
+ import { memo as memo3, useCallback, useEffect, useMemo, useRef, useState } from "react";
9
+ import clsx from "clsx";
10
+
11
+ // src/icons/Chevron.tsx
12
+ import * as React from "react";
13
+ import { jsx } from "react/jsx-runtime";
14
+ var Chevron = React.memo(
15
+ (_a) => {
16
+ var _b = _a, { size = 16, color = "#6b7280", className } = _b, rest = __objRest(_b, ["size", "color", "className"]);
17
+ return /* @__PURE__ */ jsx(
18
+ "svg",
19
+ __spreadProps(__spreadValues({
20
+ xmlns: "http://www.w3.org/2000/svg",
21
+ width: size,
22
+ height: size,
23
+ fill: "none",
24
+ viewBox: "0 0 16 16",
25
+ className
26
+ }, rest), {
27
+ children: /* @__PURE__ */ jsx(
28
+ "path",
29
+ {
30
+ fill: color,
31
+ d: "M11.78 6.22a.75.75 0 00-1.06 0L8 8.94 5.28 6.22a.75.75 0 00-1.06 1.06l3.25 3.25a.75.75 0 001.06 0l3.25-3.25a.75.75 0 000-1.06z"
32
+ }
33
+ )
34
+ })
35
+ );
36
+ }
37
+ );
38
+ Chevron.displayName = "Chevron";
39
+
40
+ // src/icons/CrossV2.tsx
41
+ import * as React2 from "react";
42
+ import { jsx as jsx2 } from "react/jsx-runtime";
43
+ var CrossV2 = React2.memo(
44
+ (_a) => {
45
+ var _b = _a, { size = 16, color = "#111827", className } = _b, rest = __objRest(_b, ["size", "color", "className"]);
46
+ return /* @__PURE__ */ jsx2(
47
+ "svg",
48
+ __spreadProps(__spreadValues({
49
+ xmlns: "http://www.w3.org/2000/svg",
50
+ width: size,
51
+ height: size,
52
+ fill: "none",
53
+ viewBox: "0 0 16 16",
54
+ className
55
+ }, rest), {
56
+ children: /* @__PURE__ */ jsx2(
57
+ "path",
58
+ {
59
+ fill: color,
60
+ fillRule: "evenodd",
61
+ d: "M4.293 4.293a1 1 0 011.414 0L8 6.586l2.293-2.293a1 1 0 111.414 1.414L9.414 8l2.293 2.293a1 1 0 01-1.414 1.414L8 9.414l-2.293 2.293a1 1 0 01-1.414-1.414L6.586 8 4.293 5.707a1 1 0 010-1.414z",
62
+ clipRule: "evenodd"
63
+ }
64
+ )
65
+ })
66
+ );
67
+ }
68
+ );
69
+ CrossV2.displayName = "CrossV2";
70
+
71
+ // src/atom/Select/Select.tsx
72
+ import { jsx as jsx3, jsxs } from "react/jsx-runtime";
73
+ var SelectV2 = ({
74
+ label,
75
+ mandatory = false,
76
+ error = false,
77
+ options = [],
78
+ valueSelected = "",
79
+ // Keep for backward compatibility
80
+ value: _valueProp,
81
+ // Rename to avoid potential conflicts with native value attribute
82
+ onChange,
83
+ className = "",
84
+ dropdownClassName = "",
85
+ optionClassName = "",
86
+ style = {},
87
+ showDisplayValue = false,
88
+ // New prop to show displayValue instead of label
89
+ allowClear = true,
90
+ enableSearch = true,
91
+ // New prop to control search functionality, default true
92
+ doubleCharSearch = false,
93
+ id,
94
+ name,
95
+ tabIndex,
96
+ // Add tabIndex prop
97
+ // Additional styling props
98
+ size = "default",
99
+ // 'small', 'default', 'large'
100
+ variant = "default",
101
+ // 'default', 'filled', 'outlined'
102
+ wrapperClassName = "",
103
+ inputClassName = "",
104
+ // Custom class for input element specifically
105
+ labelClassName = "",
106
+ // Custom class for label element specifically
107
+ height = "tw-h-12",
108
+ // Custom height
109
+ experience = "business"
110
+ }) => {
111
+ const normalizeValue = useCallback((val) => {
112
+ if (val === null || val === void 0) return "";
113
+ return String(val);
114
+ }, []);
115
+ const validatedOptions = useMemo(() => {
116
+ if (!Array.isArray(options)) return [];
117
+ return options.filter(
118
+ (opt) => opt && typeof opt === "object" && opt.value !== void 0 && opt.value !== null && opt.label !== void 0
119
+ );
120
+ }, [options]);
121
+ const [isOpen, setIsOpen] = useState(false);
122
+ const [isFocused, setIsFocused] = useState(false);
123
+ const [searchTerm, setSearchTerm] = useState("");
124
+ const [isHovering, setIsHovering] = useState(false);
125
+ const [highlightedIndex, setHighlightedIndex] = useState(-1);
126
+ const [selectedValue, setSelectedValue] = useState(() => {
127
+ const initialValue = valueSelected;
128
+ if (initialValue === null || initialValue === void 0) return "";
129
+ return String(initialValue);
130
+ });
131
+ const inputRef = useRef(null);
132
+ const inputValueRef = useRef("");
133
+ const dropdownRef = useRef(null);
134
+ const optionRefs = useRef([]);
135
+ const optionListRef = useRef(null);
136
+ const blurTimeoutRef = useRef(null);
137
+ const hoverTimeoutRef = useRef(null);
138
+ const isActive = isFocused || Boolean(selectedValue) || Boolean(valueSelected) || Boolean(searchTerm);
139
+ const sizeClasses = useMemo(() => {
140
+ switch (size) {
141
+ case "small":
142
+ return {
143
+ input: "tw-h-8 tw-px-3 tw-typography-body2",
144
+ padding: label ? "tw-pt-4 tw-pb-1" : "tw-py-2",
145
+ labelActive: "tw-top-0 tw-typography-caption4",
146
+ labelInactive: "tw-top-2 tw-typography-caption3"
147
+ };
148
+ case "medium":
149
+ return {
150
+ input: "tw-h-10 tw-px-4 tw-typography-body2",
151
+ padding: label ? "tw-pt-4 tw-pb-1" : "tw-py-2",
152
+ labelActive: "tw-top-1 tw-typography-caption3",
153
+ labelInactive: "tw-top-2.5 tw-typography-body2"
154
+ };
155
+ case "large":
156
+ return {
157
+ input: "tw-h-16 tw-px-5 tw-typography-bodyLarge",
158
+ padding: label ? "tw-pt-8 tw-pb-4" : "tw-py-5",
159
+ labelActive: "tw-top-1 tw-typography-caption2",
160
+ labelInactive: "tw-top-5 tw-typography-body1"
161
+ };
162
+ default:
163
+ return {
164
+ input: height + " tw-px-4 tw-typography-bodyLarge",
165
+ padding: label ? "tw-pt-6 tw-pb-3" : "tw-py-3",
166
+ labelActive: "tw-top-1 tw-typography-caption3",
167
+ labelInactive: "tw-top-3.5 tw-typography-body2"
168
+ };
169
+ }
170
+ }, [size, label, height]);
171
+ const variantClasses = useMemo(() => {
172
+ switch (variant) {
173
+ case "filled":
174
+ return "tw-bg-gray-50 tw-border-transparent";
175
+ case "outlined":
176
+ return "tw-bg-transparent tw-border-2";
177
+ default:
178
+ return " tw-border";
179
+ }
180
+ }, [variant]);
181
+ const handleBlur = useCallback(() => {
182
+ blurTimeoutRef.current = setTimeout(() => {
183
+ setIsOpen(false);
184
+ setSearchTerm("");
185
+ setHighlightedIndex(-1);
186
+ blurTimeoutRef.current = null;
187
+ setIsFocused(false);
188
+ }, 150);
189
+ }, []);
190
+ const handleSearchChange = useCallback(
191
+ (e) => {
192
+ var _a;
193
+ if (doubleCharSearch) {
194
+ setSearchTerm(e.target.value.slice(0, 2) || "");
195
+ } else {
196
+ setSearchTerm(e.target.value);
197
+ }
198
+ setIsOpen(true);
199
+ setHighlightedIndex(-1);
200
+ (_a = optionListRef == null ? void 0 : optionListRef.current) == null ? void 0 : _a.scrollTo({
201
+ top: 0,
202
+ behavior: "smooth"
203
+ });
204
+ },
205
+ [doubleCharSearch]
206
+ );
207
+ const handleOptionSelect = useCallback(
208
+ (option) => {
209
+ var _a;
210
+ if (blurTimeoutRef.current) {
211
+ clearTimeout(blurTimeoutRef.current);
212
+ blurTimeoutRef.current = null;
213
+ }
214
+ inputValueRef.current = option.label;
215
+ const normalizedValue = normalizeValue(option.value);
216
+ setSelectedValue(normalizedValue);
217
+ setSearchTerm("");
218
+ setIsOpen(false);
219
+ if (enableSearch) {
220
+ setIsFocused(false);
221
+ }
222
+ setIsHovering(false);
223
+ if (onChange) onChange(option.value);
224
+ if (enableSearch) (_a = inputRef.current) == null ? void 0 : _a.blur();
225
+ },
226
+ [normalizeValue, onChange, enableSearch]
227
+ );
228
+ const handleClear = useCallback(
229
+ (e) => {
230
+ var _a;
231
+ inputValueRef.current = "";
232
+ e.stopPropagation();
233
+ e.preventDefault();
234
+ setSelectedValue("");
235
+ setSearchTerm("");
236
+ if (enableSearch) {
237
+ setIsOpen(true);
238
+ setIsFocused(true);
239
+ (_a = inputRef.current) == null ? void 0 : _a.focus();
240
+ } else {
241
+ setIsOpen(false);
242
+ setIsFocused(false);
243
+ }
244
+ if (onChange) onChange(null);
245
+ },
246
+ [onChange, enableSearch]
247
+ );
248
+ useEffect(() => {
249
+ if (!validatedOptions.length) {
250
+ setSelectedValue("");
251
+ setSearchTerm("");
252
+ inputValueRef.current = "";
253
+ }
254
+ }, [validatedOptions.length]);
255
+ useEffect(() => {
256
+ const newValue = normalizeValue(valueSelected);
257
+ setSelectedValue((prevValue) => {
258
+ const prevNormalized = normalizeValue(prevValue);
259
+ return prevNormalized !== newValue ? newValue : prevValue;
260
+ });
261
+ }, [valueSelected, normalizeValue]);
262
+ useEffect(() => {
263
+ const handleClickOutside = (event) => {
264
+ if (dropdownRef.current && !dropdownRef.current.contains(event.target)) {
265
+ if (blurTimeoutRef.current) {
266
+ clearTimeout(blurTimeoutRef.current);
267
+ blurTimeoutRef.current = null;
268
+ }
269
+ setIsOpen(false);
270
+ setIsFocused(false);
271
+ setSearchTerm("");
272
+ setHighlightedIndex(-1);
273
+ }
274
+ };
275
+ document.addEventListener("mousedown", handleClickOutside);
276
+ return () => {
277
+ document.removeEventListener("mousedown", handleClickOutside);
278
+ if (blurTimeoutRef.current) {
279
+ clearTimeout(blurTimeoutRef.current);
280
+ }
281
+ if (hoverTimeoutRef.current) {
282
+ clearTimeout(hoverTimeoutRef.current);
283
+ }
284
+ };
285
+ }, []);
286
+ const getDisplayValue = useCallback(() => {
287
+ if (selectedValue && (validatedOptions == null ? void 0 : validatedOptions.length) > 0) {
288
+ const selected = validatedOptions.find(
289
+ (opt) => normalizeValue(opt.value) === normalizeValue(selectedValue)
290
+ );
291
+ if (selected) {
292
+ return showDisplayValue && selected.displayValue ? selected.displayValue : selected.label;
293
+ }
294
+ }
295
+ if (selectedValue && (!validatedOptions || validatedOptions.length === 0)) {
296
+ return selectedValue;
297
+ }
298
+ return "";
299
+ }, [selectedValue, validatedOptions, showDisplayValue, normalizeValue]);
300
+ const filteredOptions = useMemo(() => {
301
+ var _a;
302
+ if (!enableSearch) {
303
+ return validatedOptions;
304
+ }
305
+ (_a = dropdownRef.current) == null ? void 0 : _a.scrollTo(0, 0);
306
+ const updatedFilteredOptions = validatedOptions.filter((option) => {
307
+ var _a2;
308
+ return (_a2 = option == null ? void 0 : option.label) == null ? void 0 : _a2.toLowerCase().includes(searchTerm == null ? void 0 : searchTerm.toLowerCase());
309
+ });
310
+ return updatedFilteredOptions;
311
+ }, [validatedOptions, searchTerm, enableSearch]);
312
+ const getSelectedOptionIndex = useCallback(() => {
313
+ if (!selectedValue || !filteredOptions.length) {
314
+ return 0;
315
+ }
316
+ const index = filteredOptions.findIndex(
317
+ (option) => normalizeValue(option.value) === normalizeValue(selectedValue)
318
+ );
319
+ return index >= 0 ? index : 0;
320
+ }, [selectedValue, filteredOptions, normalizeValue]);
321
+ const handleInputInteraction = useCallback(
322
+ (_e) => {
323
+ var _a;
324
+ if (blurTimeoutRef.current) {
325
+ clearTimeout(blurTimeoutRef.current);
326
+ blurTimeoutRef.current = null;
327
+ }
328
+ if (isOpen) {
329
+ setIsOpen(false);
330
+ setIsFocused(false);
331
+ setSearchTerm("");
332
+ setHighlightedIndex(-1);
333
+ (_a = inputRef.current) == null ? void 0 : _a.blur();
334
+ return;
335
+ }
336
+ setIsFocused(true);
337
+ setIsOpen(true);
338
+ setHighlightedIndex(getSelectedOptionIndex());
339
+ if (inputRef.current) {
340
+ inputRef.current.focus();
341
+ }
342
+ },
343
+ [isOpen, getSelectedOptionIndex]
344
+ );
345
+ const handleKeyDown = useCallback(
346
+ (e) => {
347
+ var _a;
348
+ if (!isOpen) return;
349
+ switch (e.key) {
350
+ case "ArrowDown":
351
+ e.preventDefault();
352
+ setHighlightedIndex((prev) => {
353
+ const nextIndex = prev < filteredOptions.length - 1 ? prev + 1 : prev;
354
+ return nextIndex;
355
+ });
356
+ break;
357
+ case "ArrowUp":
358
+ e.preventDefault();
359
+ setHighlightedIndex((prev) => {
360
+ const nextIndex = prev > 0 ? prev - 1 : prev;
361
+ return nextIndex;
362
+ });
363
+ break;
364
+ case "Enter":
365
+ e.preventDefault();
366
+ if (highlightedIndex >= 0 && filteredOptions[highlightedIndex]) {
367
+ handleOptionSelect(filteredOptions[highlightedIndex]);
368
+ }
369
+ break;
370
+ case "Escape":
371
+ e.preventDefault();
372
+ setIsOpen(false);
373
+ setIsFocused(false);
374
+ setSearchTerm("");
375
+ setHighlightedIndex(-1);
376
+ (_a = inputRef.current) == null ? void 0 : _a.blur();
377
+ break;
378
+ default:
379
+ break;
380
+ }
381
+ },
382
+ [isOpen, highlightedIndex, filteredOptions, handleOptionSelect]
383
+ );
384
+ useEffect(() => {
385
+ if (highlightedIndex >= 0 && optionRefs.current[highlightedIndex]) {
386
+ optionRefs.current[highlightedIndex].scrollIntoView({
387
+ block: "nearest",
388
+ behavior: "smooth"
389
+ });
390
+ }
391
+ }, [highlightedIndex]);
392
+ useEffect(() => {
393
+ optionRefs.current = [];
394
+ }, [filteredOptions]);
395
+ const handleMouseEnter = useCallback(() => {
396
+ if (hoverTimeoutRef.current) {
397
+ clearTimeout(hoverTimeoutRef.current);
398
+ }
399
+ if (!isHovering) {
400
+ setIsHovering(true);
401
+ }
402
+ }, [isHovering]);
403
+ const handleMouseLeave = useCallback(() => {
404
+ hoverTimeoutRef.current = setTimeout(() => {
405
+ setIsHovering(false);
406
+ }, 50);
407
+ }, []);
408
+ const handleChevronClick = useCallback(
409
+ (e) => {
410
+ var _a;
411
+ e.preventDefault();
412
+ if (blurTimeoutRef.current) {
413
+ clearTimeout(blurTimeoutRef.current);
414
+ blurTimeoutRef.current = null;
415
+ }
416
+ if (isOpen) {
417
+ setIsOpen(false);
418
+ setIsFocused(false);
419
+ setSearchTerm("");
420
+ setHighlightedIndex(-1);
421
+ (_a = inputRef.current) == null ? void 0 : _a.blur();
422
+ } else {
423
+ if (inputRef.current) {
424
+ inputRef.current.focus();
425
+ }
426
+ handleInputInteraction();
427
+ }
428
+ },
429
+ [isOpen, handleInputInteraction]
430
+ );
431
+ return /* @__PURE__ */ jsxs(
432
+ "div",
433
+ {
434
+ style,
435
+ className: clsx("tw-relative tw-w-full", wrapperClassName),
436
+ ref: dropdownRef,
437
+ onMouseEnter: handleMouseEnter,
438
+ onMouseLeave: handleMouseLeave,
439
+ children: [
440
+ /* @__PURE__ */ jsxs("div", { className: "tw-relative", children: [
441
+ /* @__PURE__ */ jsx3(
442
+ "input",
443
+ {
444
+ ref: inputRef,
445
+ type: "text",
446
+ id,
447
+ name,
448
+ tabIndex,
449
+ autoComplete: "off",
450
+ autoCorrect: "off",
451
+ autoCapitalize: "off",
452
+ spellCheck: "false",
453
+ value: isFocused && enableSearch ? searchTerm : getDisplayValue(),
454
+ onChange: enableSearch ? handleSearchChange : void 0,
455
+ onClick: handleInputInteraction,
456
+ onKeyDown: handleKeyDown,
457
+ className: clsx(
458
+ "tw-w-full tw-rounded-xl tw-outline-none tw-transition-all tw-duration-200 tw-cursor-pointer tw-border-solid tw-text-color-text-default",
459
+ sizeClasses.input,
460
+ sizeClasses.padding,
461
+ variantClasses,
462
+ {
463
+ "tw-bg-white": valueSelected || getDisplayValue() || isFocused,
464
+ "tw-bg-color-gray-5": !valueSelected || !getDisplayValue()
465
+ },
466
+ // Conditional padding based on label presence
467
+ !label && "tw-flex tw-items-center",
468
+ {
469
+ "!tw-border-color-primary": isFocused && experience === "business"
470
+ },
471
+ {
472
+ "!tw-border-[#804D7B]": isFocused && experience === "personal"
473
+ },
474
+ error ? "!tw-border-color-text-critical " : "tw-border-[#EBE3DD] hover:tw-border-[#C5B7AC]",
475
+ // Add focus state styling
476
+ "focus:tw-shadow-sm focus:tw-ring-offset-1",
477
+ className,
478
+ inputClassName
479
+ // Put inputClassName last so it can override default classes
480
+ ),
481
+ readOnly: !isFocused || !enableSearch
482
+ }
483
+ ),
484
+ label && /* @__PURE__ */ jsxs(
485
+ "label",
486
+ {
487
+ htmlFor: id,
488
+ className: clsx(
489
+ "tw-absolute tw-left-[18px] tw-pointer-events-none tw-transition-all tw-duration-200 tw-ease-out tw-text-gray-500",
490
+ isActive ? sizeClasses.labelActive : sizeClasses.labelInactive,
491
+ error && "tw-text-color-text-critical",
492
+ labelClassName
493
+ ),
494
+ children: [
495
+ label,
496
+ mandatory && /* @__PURE__ */ jsx3("span", { className: "tw-text-color-text-critical tw-ml-1", children: "*" })
497
+ ]
498
+ }
499
+ ),
500
+ /* @__PURE__ */ jsx3(
501
+ "div",
502
+ {
503
+ className: clsx(
504
+ "tw-absolute tw-right-3 tw-top-1/2 tw--translate-y-1/2 tw-flex tw-items-center",
505
+ {
506
+ "!tw-right-[5px]": doubleCharSearch && !(isHovering && selectedValue && allowClear)
507
+ }
508
+ ),
509
+ children: /* @__PURE__ */ jsx3(
510
+ "div",
511
+ {
512
+ className: clsx(
513
+ "tw-transition-all tw-duration-200 tw-cursor-pointer tw-flex tw-items-center",
514
+ // Only rotate chevron when open and not showing clear icon
515
+ isOpen && !(isHovering && selectedValue && allowClear) && "-tw-rotate-180"
516
+ ),
517
+ onMouseDown: (e) => {
518
+ if (isHovering && selectedValue && allowClear) {
519
+ handleClear(e);
520
+ } else {
521
+ handleChevronClick(e);
522
+ }
523
+ },
524
+ children: isHovering && selectedValue && allowClear ? /* @__PURE__ */ jsx3(CrossV2, { color: "#111827", className: "tw-mr-1" }) : /* @__PURE__ */ jsx3(
525
+ Chevron,
526
+ {
527
+ className: clsx(
528
+ "tw-text-gray-400 -tw-rotate-90"
529
+ ),
530
+ color: "#6B7280"
531
+ }
532
+ )
533
+ }
534
+ )
535
+ }
536
+ )
537
+ ] }),
538
+ isOpen && /* @__PURE__ */ jsx3(
539
+ "div",
540
+ {
541
+ className: clsx(
542
+ "tw-absolute tw-z-[100] tw-w-full tw-mt-0 tw-bg-white tw-border tw-border-[#ebe3dd] tw-border-solid tw-rounded-xl tw-shadow-lg tw-overflow-y-auto tw-py-1",
543
+ { "tw-max-h-60": !doubleCharSearch },
544
+ { "tw-max-h-44": doubleCharSearch },
545
+ dropdownClassName
546
+ ),
547
+ ref: optionListRef,
548
+ children: filteredOptions.length > 0 ? filteredOptions.map((option, index) => /* @__PURE__ */ jsx3(
549
+ "div",
550
+ {
551
+ ref: (el) => optionRefs.current[index] = el,
552
+ onClick: () => handleOptionSelect(option),
553
+ onMouseEnter: () => setHighlightedIndex(index),
554
+ className: clsx(
555
+ "tw-transition-all tw-duration-150 tw-typography-body2",
556
+ // Selected option styling
557
+ optionClassName
558
+ ),
559
+ children: /* @__PURE__ */ jsx3(
560
+ "div",
561
+ {
562
+ className: clsx(
563
+ "tw-px-4 tw-cursor-pointer tw-py-2 tw-mx-0.5 tw-rounded-xl",
564
+ normalizeValue(selectedValue) === normalizeValue(option.value) ? experience === "personal" ? "tw-bg-[#f1e8fa]" : "tw-bg-[#fff1e1]" : (
565
+ // Highlighted option styling (keyboard navigation)
566
+ index === highlightedIndex ? "tw-bg-[#f3f4f6] tw-text-gray-900" : (
567
+ // Default option styling
568
+ "tw-text-gray-900 hover:tw-bg-[#1118270a]"
569
+ )
570
+ )
571
+ ),
572
+ children: option.label
573
+ }
574
+ )
575
+ },
576
+ doubleCharSearch ? option.label : option.value
577
+ )) : /* @__PURE__ */ jsx3("div", { className: "tw-px-4 tw-py-3 tw-text-gray-500 tw-text-sm", children: "No options found" })
578
+ }
579
+ )
580
+ ]
581
+ }
582
+ );
583
+ };
584
+ var arePropsEqual = (prevProps, nextProps) => {
585
+ var _a, _b;
586
+ const criticalProps = [
587
+ "value",
588
+ "valueSelected",
589
+ "options",
590
+ "error",
591
+ "disabled",
592
+ "label",
593
+ "mandatory"
594
+ ];
595
+ for (const prop of criticalProps) {
596
+ if (prevProps[prop] !== nextProps[prop]) {
597
+ return false;
598
+ }
599
+ }
600
+ if (((_a = prevProps.options) == null ? void 0 : _a.length) !== ((_b = nextProps.options) == null ? void 0 : _b.length)) {
601
+ return false;
602
+ }
603
+ if (prevProps.options && nextProps.options) {
604
+ for (let i = 0; i < prevProps.options.length; i++) {
605
+ const prevOpt = prevProps.options[i];
606
+ const nextOpt = nextProps.options[i];
607
+ if ((prevOpt == null ? void 0 : prevOpt.value) !== (nextOpt == null ? void 0 : nextOpt.value) || (prevOpt == null ? void 0 : prevOpt.label) !== (nextOpt == null ? void 0 : nextOpt.label)) {
608
+ return false;
609
+ }
610
+ }
611
+ }
612
+ return true;
613
+ };
614
+ var Select_default = memo3(SelectV2, arePropsEqual);
615
+
616
+ export {
617
+ Select_default
618
+ };