@itilite/lumina-ui 1.0.1 → 1.0.3-alpha

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 (122) hide show
  1. package/README.md +43 -10
  2. package/dist/AdvancedDateRangePicker-D7xn4So6.d.mts +59 -0
  3. package/dist/AdvancedDateRangePicker-D7xn4So6.d.ts +59 -0
  4. package/dist/AdvancedDateRangePicker-ozItnkhp.d.mts +57 -0
  5. package/dist/AdvancedDateRangePicker-ozItnkhp.d.ts +57 -0
  6. package/dist/Table-BOq-_9Nr.d.mts +121 -0
  7. package/dist/Table-BOq-_9Nr.d.ts +121 -0
  8. package/dist/atom/AdvancedDateRangePicker/AdvancedDateRangePicker.d.mts +2 -0
  9. package/dist/atom/AdvancedDateRangePicker/AdvancedDateRangePicker.d.ts +2 -0
  10. package/dist/atom/AdvancedDateRangePicker/AdvancedDateRangePicker.js +1610 -0
  11. package/dist/atom/AdvancedDateRangePicker/AdvancedDateRangePicker.mjs +15 -0
  12. package/dist/atom/AdvancedDateRangePicker/InternalCalendar.d.mts +17 -0
  13. package/dist/atom/AdvancedDateRangePicker/InternalCalendar.d.ts +17 -0
  14. package/dist/atom/AdvancedDateRangePicker/InternalCalendar.js +370 -0
  15. package/dist/atom/AdvancedDateRangePicker/InternalCalendar.mjs +8 -0
  16. package/dist/{Avatar.d.mts → atom/Avatar/Avatar.d.mts} +1 -9
  17. package/dist/{Avatar.d.ts → atom/Avatar/Avatar.d.ts} +1 -9
  18. package/dist/{Avatar.js → atom/Avatar/Avatar.js} +4 -2
  19. package/dist/{Avatar.mjs → atom/Avatar/Avatar.mjs} +2 -2
  20. package/dist/{Button.js → atom/Button/Button.js} +1 -1
  21. package/dist/{Button.mjs → atom/Button/Button.mjs} +2 -2
  22. package/dist/{Checkbox.mjs → atom/Checkbox/Checkbox.mjs} +2 -2
  23. package/dist/atom/LoadingSpinner/LoadingSpinner.d.mts +19 -0
  24. package/dist/atom/LoadingSpinner/LoadingSpinner.d.ts +19 -0
  25. package/dist/atom/LoadingSpinner/LoadingSpinner.js +90 -0
  26. package/dist/atom/LoadingSpinner/LoadingSpinner.mjs +9 -0
  27. package/dist/{Modal.d.mts → atom/Modal/Modal.d.mts} +1 -1
  28. package/dist/{Modal.d.ts → atom/Modal/Modal.d.ts} +1 -1
  29. package/dist/{Modal.js → atom/Modal/Modal.js} +1 -1
  30. package/dist/atom/Modal/Modal.mjs +10 -0
  31. package/dist/{Radio.mjs → atom/Radio/Radio.mjs} +2 -2
  32. package/dist/atom/RangePicker/Chevron.d.mts +13 -0
  33. package/dist/atom/RangePicker/Chevron.d.ts +13 -0
  34. package/dist/atom/RangePicker/Chevron.js +110 -0
  35. package/dist/atom/RangePicker/Chevron.mjs +7 -0
  36. package/dist/atom/RangePicker/RangePicker.d.mts +26 -0
  37. package/dist/atom/RangePicker/RangePicker.d.ts +26 -0
  38. package/dist/atom/RangePicker/RangePicker.js +1465 -0
  39. package/dist/atom/RangePicker/RangePicker.mjs +13 -0
  40. package/dist/atom/Select/Select.d.mts +40 -0
  41. package/dist/atom/Select/Select.d.ts +40 -0
  42. package/dist/atom/Select/Select.js +805 -0
  43. package/dist/atom/Select/Select.mjs +11 -0
  44. package/dist/atom/Slider/Slider.d.mts +34 -0
  45. package/dist/atom/Slider/Slider.d.ts +34 -0
  46. package/dist/atom/Slider/Slider.js +107 -0
  47. package/dist/atom/Slider/Slider.mjs +9 -0
  48. package/dist/{Switch.mjs → atom/Switch/Switch.mjs} +2 -2
  49. package/dist/atom/Table/Table.d.mts +3 -0
  50. package/dist/atom/Table/Table.d.ts +3 -0
  51. package/dist/atom/Table/Table.js +307 -0
  52. package/dist/atom/Table/Table.mjs +9 -0
  53. package/dist/atom/Tag/Tag.d.mts +6 -0
  54. package/dist/atom/Tag/Tag.d.ts +6 -0
  55. package/dist/atom/Tag/Tag.js +108 -0
  56. package/dist/atom/Tag/Tag.mjs +9 -0
  57. package/dist/{Tooltip.mjs → atom/Tooltip/Tooltip.mjs} +2 -2
  58. package/dist/chunk-27LRL4RO.mjs +428 -0
  59. package/dist/chunk-3HXZIFV6.mjs +438 -0
  60. package/dist/chunk-4JX54OKI.mjs +627 -0
  61. package/dist/chunk-4VZB2KR2.mjs +51 -0
  62. package/dist/chunk-53O7JM5I.mjs +424 -0
  63. package/dist/chunk-62VAYFZA.mjs +437 -0
  64. package/dist/chunk-6ON32H2N.mjs +431 -0
  65. package/dist/chunk-6XIT27XY.mjs +269 -0
  66. package/dist/chunk-772C454L.mjs +438 -0
  67. package/dist/chunk-7L267Y4P.mjs +429 -0
  68. package/dist/chunk-7WSVCE2C.mjs +269 -0
  69. package/dist/{chunk-HISCHZ5H.mjs → chunk-AF2RKLH6.mjs} +1 -1
  70. package/dist/chunk-BFFLWW7N.mjs +250 -0
  71. package/dist/chunk-D3N7VFER.mjs +73 -0
  72. package/dist/chunk-FTL3PFC2.mjs +438 -0
  73. package/dist/chunk-GU5F7Z7I.mjs +681 -0
  74. package/dist/chunk-GZ4P7OL3.mjs +429 -0
  75. package/dist/{chunk-X76GNSBB.mjs → chunk-IWO2Y5QX.mjs} +4 -2
  76. package/dist/chunk-J4YYP4IZ.mjs +0 -0
  77. package/dist/chunk-K2A4TWA3.mjs +430 -0
  78. package/dist/chunk-L3L42SIL.mjs +429 -0
  79. package/dist/chunk-MA23J4WQ.mjs +430 -0
  80. package/dist/chunk-N2WTNCQU.mjs +66 -0
  81. package/dist/chunk-N4DPPZVJ.mjs +269 -0
  82. package/dist/chunk-PQ3B2FEB.mjs +249 -0
  83. package/dist/chunk-QKTMWS4J.mjs +43 -0
  84. package/dist/chunk-QRGHJP7U.mjs +437 -0
  85. package/dist/chunk-RC6IGURJ.mjs +428 -0
  86. package/dist/chunk-TQDZWJZP.mjs +269 -0
  87. package/dist/{chunk-N355RJGH.mjs → chunk-UQJ3BDM4.mjs} +1 -1
  88. package/dist/chunk-V3CHJHUX.mjs +424 -0
  89. package/dist/chunk-ZGV6QMVM.mjs +437 -0
  90. package/dist/chunk-ZTRM4HZJ.mjs +53 -0
  91. package/dist/index.d.mts +18 -7
  92. package/dist/index.d.ts +18 -7
  93. package/dist/index.js +2470 -8
  94. package/dist/index.mjs +44 -10
  95. package/dist/molecules/UserProfile/UserProfile.d.mts +23 -0
  96. package/dist/molecules/UserProfile/UserProfile.d.ts +23 -0
  97. package/dist/molecules/UserProfile/UserProfile.js +243 -0
  98. package/dist/molecules/UserProfile/UserProfile.mjs +11 -0
  99. package/dist/styles.css +1891 -907
  100. package/dist/types-D4MD2w3_.d.mts +9 -0
  101. package/dist/types-D4MD2w3_.d.ts +9 -0
  102. package/dist/types-mhQmqhsR.d.mts +10 -0
  103. package/dist/types-mhQmqhsR.d.ts +10 -0
  104. package/package.json +9 -32
  105. package/dist/Modal.mjs +0 -10
  106. package/dist/chunk-2O2IH2FG.mjs +0 -83
  107. package/dist/styles.d.mts +0 -2
  108. package/dist/styles.d.ts +0 -2
  109. /package/dist/{Button.d.mts → atom/Button/Button.d.mts} +0 -0
  110. /package/dist/{Button.d.ts → atom/Button/Button.d.ts} +0 -0
  111. /package/dist/{Checkbox.d.mts → atom/Checkbox/Checkbox.d.mts} +0 -0
  112. /package/dist/{Checkbox.d.ts → atom/Checkbox/Checkbox.d.ts} +0 -0
  113. /package/dist/{Checkbox.js → atom/Checkbox/Checkbox.js} +0 -0
  114. /package/dist/{Radio.d.mts → atom/Radio/Radio.d.mts} +0 -0
  115. /package/dist/{Radio.d.ts → atom/Radio/Radio.d.ts} +0 -0
  116. /package/dist/{Radio.js → atom/Radio/Radio.js} +0 -0
  117. /package/dist/{Switch.d.mts → atom/Switch/Switch.d.mts} +0 -0
  118. /package/dist/{Switch.d.ts → atom/Switch/Switch.d.ts} +0 -0
  119. /package/dist/{Switch.js → atom/Switch/Switch.js} +0 -0
  120. /package/dist/{Tooltip.d.mts → atom/Tooltip/Tooltip.d.mts} +0 -0
  121. /package/dist/{Tooltip.d.ts → atom/Tooltip/Tooltip.d.ts} +0 -0
  122. /package/dist/{Tooltip.js → atom/Tooltip/Tooltip.js} +0 -0
@@ -0,0 +1,681 @@
1
+ import {
2
+ Tooltip_default
3
+ } from "./chunk-MLCMZRUC.mjs";
4
+ import {
5
+ LoadingSpinner_default
6
+ } from "./chunk-QKTMWS4J.mjs";
7
+ import {
8
+ __objRest,
9
+ __spreadProps,
10
+ __spreadValues
11
+ } from "./chunk-FWCSY2DS.mjs";
12
+
13
+ // src/atom/Select/Select.tsx
14
+ import { useCallback, useEffect, useMemo, useRef, useState, memo as memo3 } from "react";
15
+ import clsx from "clsx";
16
+
17
+ // src/icons/Chevron.tsx
18
+ import * as React from "react";
19
+ import { jsx } from "react/jsx-runtime";
20
+ var Chevron = React.memo(
21
+ (_a) => {
22
+ var _b = _a, { size = 16, color = "#6b7280", className } = _b, rest = __objRest(_b, ["size", "color", "className"]);
23
+ return /* @__PURE__ */ jsx(
24
+ "svg",
25
+ __spreadProps(__spreadValues({
26
+ xmlns: "http://www.w3.org/2000/svg",
27
+ width: size,
28
+ height: size,
29
+ fill: "none",
30
+ viewBox: "0 0 16 16",
31
+ className
32
+ }, rest), {
33
+ children: /* @__PURE__ */ jsx(
34
+ "path",
35
+ {
36
+ fill: color,
37
+ 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"
38
+ }
39
+ )
40
+ })
41
+ );
42
+ }
43
+ );
44
+ Chevron.displayName = "Chevron";
45
+
46
+ // src/icons/CrossV2.tsx
47
+ import * as React2 from "react";
48
+ import { jsx as jsx2 } from "react/jsx-runtime";
49
+ var CrossV2 = React2.memo(
50
+ (_a) => {
51
+ var _b = _a, { size = 16, color = "#111827", className } = _b, rest = __objRest(_b, ["size", "color", "className"]);
52
+ return /* @__PURE__ */ jsx2(
53
+ "svg",
54
+ __spreadProps(__spreadValues({
55
+ xmlns: "http://www.w3.org/2000/svg",
56
+ width: size,
57
+ height: size,
58
+ fill: "none",
59
+ viewBox: "0 0 20 20"
60
+ }, rest), {
61
+ children: /* @__PURE__ */ jsx2(
62
+ "path",
63
+ {
64
+ fill: color,
65
+ d: "M4.411 4.41a.833.833 0 0 1 1.179 0L10 8.822l4.411-4.41a.833.833 0 1 1 1.179 1.178L11.179 10l4.41 4.41a.833.833 0 0 1-1.178 1.18l-4.41-4.411-4.411 4.41a.833.833 0 1 1-1.179-1.178L8.821 10l-4.41-4.41a.833.833 0 0 1 0-1.18"
66
+ }
67
+ )
68
+ })
69
+ );
70
+ }
71
+ );
72
+ CrossV2.displayName = "CrossV2";
73
+
74
+ // src/icons/Lock.tsx
75
+ import React3 from "react";
76
+ import { jsx as jsx3 } from "react/jsx-runtime";
77
+ var Lock = React3.memo((_a) => {
78
+ var _b = _a, { size = 16, color = "#000" } = _b, rest = __objRest(_b, ["size", "color"]);
79
+ return /* @__PURE__ */ jsx3(
80
+ "svg",
81
+ __spreadProps(__spreadValues({
82
+ xmlns: "http://www.w3.org/2000/svg",
83
+ width: size,
84
+ height: size,
85
+ fill: "none",
86
+ viewBox: "0 0 16 16"
87
+ }, rest), {
88
+ children: /* @__PURE__ */ jsx3(
89
+ "path",
90
+ {
91
+ fill: color,
92
+ d: "M9 9a1 1 0 11-2 0 1 1 0 012 0zM5 4h-.5A2.5 2.5 0 002 6.5v5A2.5 2.5 0 004.5 14h7a2.5 2.5 0 002.5-2.5v-5A2.5 2.5 0 0011.5 4H11v-.5a3 3 0 00-6 0V4zm1-.5a2 2 0 114 0V4H6v-.5zM11.5 5A1.5 1.5 0 0113 6.5v5a1.5 1.5 0 01-1.5 1.5h-7A1.5 1.5 0 013 11.5v-5A1.5 1.5 0 014.5 5h7z"
93
+ }
94
+ )
95
+ })
96
+ );
97
+ });
98
+
99
+ // src/atom/Select/Select.tsx
100
+ import { Fragment, jsx as jsx4, jsxs } from "react/jsx-runtime";
101
+ var InputWrapper = memo3(({ children, disabled, disabledTooltip }) => {
102
+ if (disabled && disabledTooltip)
103
+ return /* @__PURE__ */ jsx4(Tooltip_default, { title: disabledTooltip, children });
104
+ return /* @__PURE__ */ jsx4(Fragment, { children });
105
+ });
106
+ var OptionItem = memo3(({
107
+ option,
108
+ index,
109
+ isSelected,
110
+ isHighlighted,
111
+ experience,
112
+ size,
113
+ optionClassName,
114
+ onSelectHandler,
115
+ onMouseEnterHandler
116
+ }) => {
117
+ return /* @__PURE__ */ jsx4(
118
+ "div",
119
+ {
120
+ onClick: () => onSelectHandler(option),
121
+ onMouseEnter: () => onMouseEnterHandler(index),
122
+ className: clsx(
123
+ "tw-transition-all tw-duration-150",
124
+ { "tw-typography-body2": size !== "small" },
125
+ { "tw-typography-caption1": size === "small" },
126
+ optionClassName
127
+ ),
128
+ children: /* @__PURE__ */ jsx4(
129
+ "div",
130
+ {
131
+ className: clsx(
132
+ "tw-px-4 tw-cursor-pointer tw-py-2 tw-mx-0.5 tw-rounded-xl",
133
+ isSelected ? experience === "personal" ? "tw-bg-[#f1e8fa]" : "tw-bg-[#fff1e1]" : isHighlighted ? "tw-bg-[#f3f4f6] tw-text-gray-900" : "tw-text-gray-900 hover:tw-bg-[#1118270a]"
134
+ ),
135
+ children: option.label
136
+ }
137
+ )
138
+ }
139
+ );
140
+ });
141
+ var Select = ({
142
+ label,
143
+ mandatory = false,
144
+ error = false,
145
+ options = [],
146
+ valueSelected = "",
147
+ // Keep for backward compatibility
148
+ value: _valueProp,
149
+ // Rename to avoid potential conflicts with native value attribute
150
+ onChange,
151
+ onSearch,
152
+ isLoading = false,
153
+ disabled = false,
154
+ disabledTooltip = "",
155
+ className = "",
156
+ dropdownClassName = "",
157
+ optionClassName = "",
158
+ style = {},
159
+ showDisplayValue = false,
160
+ // New prop to show displayValue instead of label
161
+ allowClear = true,
162
+ enableSearch = true,
163
+ doubleCharSearch = false,
164
+ id,
165
+ name,
166
+ tabIndex,
167
+ // Add tabIndex prop
168
+ // Additional styling props
169
+ size = "default",
170
+ // 'small', 'default', 'large'
171
+ variant = "default",
172
+ // 'default', 'filled', 'outlined'
173
+ wrapperClassName = "",
174
+ inputClassName = "",
175
+ // Custom class for input element specifically
176
+ labelClassName = "",
177
+ // Custom class for label element specifically
178
+ height = "tw-h-12",
179
+ // Custom height
180
+ experience = "business"
181
+ }) => {
182
+ const normalizeValue = useCallback(
183
+ (val) => {
184
+ if (val === null || val === void 0) return "";
185
+ return String(val);
186
+ },
187
+ []
188
+ );
189
+ const validatedOptions = useMemo(() => {
190
+ if (!Array.isArray(options)) return [];
191
+ return options.filter(
192
+ (opt) => opt && typeof opt === "object" && opt.value !== void 0 && opt.value !== null && opt.label !== void 0
193
+ );
194
+ }, [options]);
195
+ const [isOpen, setIsOpen] = useState(false);
196
+ const [isFocused, setIsFocused] = useState(false);
197
+ const [searchTerm, setSearchTerm] = useState("");
198
+ const [isHovering, setIsHovering] = useState(false);
199
+ const [highlightedIndex, setHighlightedIndex] = useState(-1);
200
+ const [selectedValue, setSelectedValue] = useState(() => {
201
+ const initialValue = valueSelected;
202
+ if (initialValue === null || initialValue === void 0) return "";
203
+ return String(initialValue);
204
+ });
205
+ const inputRef = useRef(null);
206
+ const inputValueRef = useRef("");
207
+ const dropdownRef = useRef(null);
208
+ const optionRefs = useRef([]);
209
+ const optionListRef = useRef(null);
210
+ const blurTimeoutRef = useRef(null);
211
+ const hoverTimeoutRef = useRef(null);
212
+ const isActive = isFocused || Boolean(selectedValue) || Boolean(valueSelected) || Boolean(searchTerm);
213
+ const sizeClasses = useMemo(() => {
214
+ switch (size) {
215
+ case "small":
216
+ return {
217
+ input: "tw-h-6 tw-typography-caption1Bold !tw-rounded-lg",
218
+ padding: "tw-px-2 tw-py-1",
219
+ labelActive: "tw-top-0.5 tw-typography-caption2",
220
+ labelInactive: "tw-top-1.5 tw-typography-caption3"
221
+ };
222
+ case "medium":
223
+ return {
224
+ input: "tw-h-10 tw-px-4 tw-typography-body2",
225
+ padding: label ? "tw-pt-4 tw-pb-1" : "tw-py-2",
226
+ labelActive: "tw-top-1 tw-typography-caption3",
227
+ labelInactive: "tw-top-2.5 tw-typography-body2"
228
+ };
229
+ case "large":
230
+ return {
231
+ input: "tw-h-16 tw-px-5 tw-typography-bodyLarge",
232
+ padding: label ? "tw-pt-8 tw-pb-4" : "tw-py-5",
233
+ labelActive: "tw-top-1 tw-typography-caption2",
234
+ labelInactive: "tw-top-5 tw-typography-body1"
235
+ };
236
+ default:
237
+ return {
238
+ input: height + " tw-px-4 tw-typography-bodyLarge",
239
+ padding: label ? "tw-pt-6 tw-pb-3" : "tw-py-3",
240
+ labelActive: "tw-top-1 tw-typography-caption3",
241
+ labelInactive: "tw-top-3.5 tw-typography-body2"
242
+ };
243
+ }
244
+ }, [size, label, height]);
245
+ const variantClasses = useMemo(() => {
246
+ switch (variant) {
247
+ case "filled":
248
+ return "tw-bg-gray-50 tw-border-transparent";
249
+ case "outlined":
250
+ return "tw-bg-transparent tw-border-2";
251
+ default:
252
+ return " tw-border";
253
+ }
254
+ }, [variant]);
255
+ const handleBlur = useCallback(() => {
256
+ blurTimeoutRef.current = setTimeout(() => {
257
+ setIsOpen(false);
258
+ setSearchTerm("");
259
+ setHighlightedIndex(-1);
260
+ blurTimeoutRef.current = null;
261
+ setIsFocused(false);
262
+ }, 150);
263
+ }, []);
264
+ const handleSearchChange = useCallback(
265
+ (e) => {
266
+ var _a;
267
+ const searchValue = doubleCharSearch ? e.target.value.slice(0, 2) || "" : e.target.value;
268
+ if (doubleCharSearch) {
269
+ setSearchTerm(searchValue);
270
+ } else {
271
+ setSearchTerm(searchValue);
272
+ }
273
+ setIsOpen(true);
274
+ setHighlightedIndex(-1);
275
+ if (onSearch && typeof onSearch === "function") {
276
+ onSearch(searchValue);
277
+ }
278
+ (_a = optionListRef == null ? void 0 : optionListRef.current) == null ? void 0 : _a.scrollTo({
279
+ top: 0,
280
+ behavior: "smooth"
281
+ });
282
+ },
283
+ [doubleCharSearch, onSearch]
284
+ );
285
+ const handleOptionSelect = useCallback(
286
+ (option) => {
287
+ var _a;
288
+ if (blurTimeoutRef.current) {
289
+ clearTimeout(blurTimeoutRef.current);
290
+ blurTimeoutRef.current = null;
291
+ }
292
+ inputValueRef.current = option.label;
293
+ const normalizedValue = normalizeValue(option.value);
294
+ setSelectedValue(normalizedValue);
295
+ setSearchTerm("");
296
+ setIsOpen(false);
297
+ if (enableSearch) {
298
+ setIsFocused(false);
299
+ }
300
+ setIsHovering(false);
301
+ if (onChange) onChange(option.value);
302
+ if (enableSearch) (_a = inputRef.current) == null ? void 0 : _a.blur();
303
+ },
304
+ [normalizeValue, onChange, enableSearch]
305
+ );
306
+ const handleClear = useCallback(
307
+ (e) => {
308
+ var _a;
309
+ inputValueRef.current = "";
310
+ e.stopPropagation();
311
+ e.preventDefault();
312
+ setSelectedValue("");
313
+ setSearchTerm("");
314
+ if (enableSearch) {
315
+ setIsOpen(true);
316
+ setIsFocused(true);
317
+ (_a = inputRef.current) == null ? void 0 : _a.focus();
318
+ } else {
319
+ setIsOpen(false);
320
+ setIsFocused(false);
321
+ }
322
+ if (onChange) onChange(null);
323
+ },
324
+ [onChange, enableSearch]
325
+ );
326
+ useEffect(() => {
327
+ if (!validatedOptions.length) {
328
+ setSelectedValue("");
329
+ setSearchTerm("");
330
+ inputValueRef.current = "";
331
+ }
332
+ }, [validatedOptions.length]);
333
+ useEffect(() => {
334
+ const externalValue = _valueProp !== void 0 ? _valueProp : valueSelected;
335
+ const newValue = normalizeValue(externalValue);
336
+ setSelectedValue((prevValue) => {
337
+ const prevNormalized = normalizeValue(prevValue);
338
+ return prevNormalized !== newValue ? newValue : prevValue;
339
+ });
340
+ }, [valueSelected, _valueProp, normalizeValue]);
341
+ useEffect(() => {
342
+ const handleClickOutside = (event) => {
343
+ if (dropdownRef.current && !dropdownRef.current.contains(event.target)) {
344
+ if (blurTimeoutRef.current) {
345
+ clearTimeout(blurTimeoutRef.current);
346
+ blurTimeoutRef.current = null;
347
+ }
348
+ setIsOpen(false);
349
+ setIsFocused(false);
350
+ setSearchTerm("");
351
+ setHighlightedIndex(-1);
352
+ }
353
+ };
354
+ document.addEventListener("mousedown", handleClickOutside);
355
+ return () => {
356
+ document.removeEventListener("mousedown", handleClickOutside);
357
+ if (blurTimeoutRef.current) {
358
+ clearTimeout(blurTimeoutRef.current);
359
+ }
360
+ if (hoverTimeoutRef.current) {
361
+ clearTimeout(hoverTimeoutRef.current);
362
+ }
363
+ };
364
+ }, []);
365
+ const getDisplayValue = useCallback(() => {
366
+ if (selectedValue && (validatedOptions == null ? void 0 : validatedOptions.length) > 0) {
367
+ const selected = validatedOptions.find(
368
+ (opt) => normalizeValue(opt.value) === normalizeValue(selectedValue)
369
+ );
370
+ if (selected) {
371
+ return showDisplayValue && selected.displayValue ? selected.displayValue : selected.label;
372
+ }
373
+ }
374
+ if (selectedValue && (!validatedOptions || validatedOptions.length === 0)) {
375
+ return selectedValue;
376
+ }
377
+ return "";
378
+ }, [selectedValue, validatedOptions, showDisplayValue, normalizeValue]);
379
+ const displayValue = useMemo(() => getDisplayValue(), [getDisplayValue]);
380
+ const inputClasses = useMemo(() => {
381
+ return clsx(
382
+ "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",
383
+ sizeClasses.input,
384
+ sizeClasses.padding,
385
+ variantClasses,
386
+ {
387
+ "tw-bg-white": valueSelected || displayValue || isFocused,
388
+ "tw-bg-color-gray-5": !valueSelected || !displayValue,
389
+ "!tw-bg-[#F8F7F6] tw-cursor-not-allowed tw-pointer-events-none": disabled
390
+ },
391
+ !label && "tw-flex tw-items-center",
392
+ {
393
+ "!tw-border-color-primary": isFocused && experience === "business"
394
+ },
395
+ {
396
+ "!tw-border-[#804D7B]": isFocused && experience === "personal"
397
+ },
398
+ error ? "!tw-border-color-text-critical " : "tw-border-[#EBE3DD] hover:tw-border-[#C5B7AC]",
399
+ "focus:tw-shadow-sm focus:tw-ring-offset-1",
400
+ className,
401
+ inputClassName
402
+ );
403
+ }, [sizeClasses, variantClasses, valueSelected, displayValue, isFocused, disabled, label, experience, error, className, inputClassName]);
404
+ const filteredOptions = useMemo(() => {
405
+ var _a;
406
+ if (!enableSearch) {
407
+ return validatedOptions;
408
+ }
409
+ (_a = dropdownRef.current) == null ? void 0 : _a.scrollTo(0, 0);
410
+ const updatedFilteredOptions = validatedOptions.filter((option) => {
411
+ var _a2;
412
+ return (_a2 = option == null ? void 0 : option.label) == null ? void 0 : _a2.toLowerCase().includes(searchTerm == null ? void 0 : searchTerm.toLowerCase());
413
+ });
414
+ return updatedFilteredOptions;
415
+ }, [validatedOptions, searchTerm, enableSearch]);
416
+ const getSelectedOptionIndex = useCallback(() => {
417
+ if (!selectedValue || !filteredOptions.length) {
418
+ return 0;
419
+ }
420
+ const index = filteredOptions.findIndex(
421
+ (option) => normalizeValue(option.value) === normalizeValue(selectedValue)
422
+ );
423
+ return index >= 0 ? index : 0;
424
+ }, [selectedValue, filteredOptions, normalizeValue]);
425
+ const handleInputInteraction = useCallback(
426
+ (_e) => {
427
+ var _a;
428
+ if (blurTimeoutRef.current) {
429
+ clearTimeout(blurTimeoutRef.current);
430
+ blurTimeoutRef.current = null;
431
+ }
432
+ if (isOpen) {
433
+ setIsOpen(false);
434
+ setIsFocused(false);
435
+ setSearchTerm("");
436
+ setHighlightedIndex(-1);
437
+ (_a = inputRef.current) == null ? void 0 : _a.blur();
438
+ return;
439
+ }
440
+ setIsFocused(true);
441
+ setIsOpen(true);
442
+ setHighlightedIndex(getSelectedOptionIndex());
443
+ if (inputRef.current) {
444
+ inputRef.current.focus();
445
+ }
446
+ },
447
+ [isOpen, getSelectedOptionIndex]
448
+ );
449
+ const handleKeyDown = useCallback(
450
+ (e) => {
451
+ var _a;
452
+ if (!isOpen) return;
453
+ switch (e.key) {
454
+ case "ArrowDown":
455
+ e.preventDefault();
456
+ setHighlightedIndex((prev) => {
457
+ const nextIndex = prev < filteredOptions.length - 1 ? prev + 1 : prev;
458
+ return nextIndex;
459
+ });
460
+ break;
461
+ case "ArrowUp":
462
+ e.preventDefault();
463
+ setHighlightedIndex((prev) => {
464
+ const nextIndex = prev > 0 ? prev - 1 : prev;
465
+ return nextIndex;
466
+ });
467
+ break;
468
+ case "Enter":
469
+ e.preventDefault();
470
+ if (highlightedIndex >= 0 && filteredOptions[highlightedIndex]) {
471
+ handleOptionSelect(filteredOptions[highlightedIndex]);
472
+ }
473
+ break;
474
+ case "Escape":
475
+ e.preventDefault();
476
+ setIsOpen(false);
477
+ setIsFocused(false);
478
+ setSearchTerm("");
479
+ setHighlightedIndex(-1);
480
+ (_a = inputRef.current) == null ? void 0 : _a.blur();
481
+ break;
482
+ default:
483
+ break;
484
+ }
485
+ },
486
+ [isOpen, highlightedIndex, filteredOptions, handleOptionSelect]
487
+ );
488
+ useEffect(() => {
489
+ if (highlightedIndex >= 0 && optionRefs.current[highlightedIndex]) {
490
+ optionRefs.current[highlightedIndex].scrollIntoView({
491
+ block: "nearest",
492
+ behavior: "smooth"
493
+ });
494
+ }
495
+ }, [highlightedIndex]);
496
+ useEffect(() => {
497
+ optionRefs.current = [];
498
+ }, [filteredOptions.length]);
499
+ const handleMouseEnter = useCallback(() => {
500
+ if (hoverTimeoutRef.current) {
501
+ clearTimeout(hoverTimeoutRef.current);
502
+ }
503
+ if (!isHovering) {
504
+ setIsHovering(true);
505
+ }
506
+ }, [isHovering]);
507
+ const handleMouseLeave = useCallback(() => {
508
+ hoverTimeoutRef.current = setTimeout(() => {
509
+ setIsHovering(false);
510
+ }, 50);
511
+ }, []);
512
+ const handleChevronClick = useCallback(
513
+ (e) => {
514
+ var _a;
515
+ e.preventDefault();
516
+ if (blurTimeoutRef.current) {
517
+ clearTimeout(blurTimeoutRef.current);
518
+ blurTimeoutRef.current = null;
519
+ }
520
+ if (isOpen) {
521
+ setIsOpen(false);
522
+ setIsFocused(false);
523
+ setSearchTerm("");
524
+ setHighlightedIndex(-1);
525
+ (_a = inputRef.current) == null ? void 0 : _a.blur();
526
+ } else {
527
+ if (inputRef.current) {
528
+ inputRef.current.focus();
529
+ }
530
+ handleInputInteraction();
531
+ }
532
+ },
533
+ [isOpen, handleInputInteraction]
534
+ );
535
+ const handleChevronMouseDown = useCallback(
536
+ (e) => {
537
+ if (isHovering && selectedValue && allowClear) {
538
+ handleClear(e);
539
+ } else {
540
+ handleChevronClick(e);
541
+ }
542
+ },
543
+ [isHovering, selectedValue, allowClear, handleClear, handleChevronClick]
544
+ );
545
+ const handleOptionClick = useCallback((option) => {
546
+ handleOptionSelect(option);
547
+ }, [handleOptionSelect]);
548
+ const handleOptionMouseEnter = useCallback((index) => {
549
+ setHighlightedIndex(index);
550
+ }, []);
551
+ return /* @__PURE__ */ jsx4(InputWrapper, { disabled, disabledTooltip, children: /* @__PURE__ */ jsxs(
552
+ "div",
553
+ {
554
+ style,
555
+ className: clsx("tw-relative tw-w-full", wrapperClassName, {
556
+ "tw-cursor-not-allowed": disabled
557
+ }),
558
+ ref: dropdownRef,
559
+ onMouseEnter: handleMouseEnter,
560
+ onMouseLeave: handleMouseLeave,
561
+ children: [
562
+ /* @__PURE__ */ jsxs("div", { className: "tw-relative", children: [
563
+ /* @__PURE__ */ jsx4(
564
+ "input",
565
+ {
566
+ ref: inputRef,
567
+ type: "text",
568
+ id,
569
+ name,
570
+ tabIndex,
571
+ autoComplete: "off",
572
+ autoCorrect: "off",
573
+ autoCapitalize: "off",
574
+ spellCheck: "false",
575
+ value: isFocused && enableSearch ? searchTerm : displayValue,
576
+ onChange: enableSearch ? handleSearchChange : void 0,
577
+ onClick: handleInputInteraction,
578
+ onKeyDown: handleKeyDown,
579
+ className: inputClasses,
580
+ readOnly: !isFocused || !enableSearch
581
+ }
582
+ ),
583
+ label && size !== "small" && /* @__PURE__ */ jsxs(
584
+ "label",
585
+ {
586
+ htmlFor: id,
587
+ className: clsx(
588
+ "tw-absolute tw-left-[18px] tw-pointer-events-none tw-transition-all tw-duration-200 tw-ease-out tw-text-gray-500",
589
+ isActive ? sizeClasses.labelActive : sizeClasses.labelInactive,
590
+ error && "tw-text-color-text-critical",
591
+ labelClassName
592
+ ),
593
+ children: [
594
+ label,
595
+ mandatory && /* @__PURE__ */ jsx4("span", { className: "tw-text-color-text-critical tw-ml-1", children: "*" })
596
+ ]
597
+ }
598
+ ),
599
+ /* @__PURE__ */ jsxs(
600
+ "div",
601
+ {
602
+ className: clsx(
603
+ "tw-absolute tw-right-3 tw--translate-y-1/2 tw-flex tw-items-center",
604
+ {
605
+ "!tw-right-[5px]": doubleCharSearch && !(isHovering && selectedValue && allowClear),
606
+ "tw-top-3 !tw-right-2": size === "small",
607
+ "tw-top-1/2": size !== "small"
608
+ }
609
+ ),
610
+ children: [
611
+ disabled && /* @__PURE__ */ jsx4("div", { className: "tw-absolute tw-right-0 -tw-top-2", children: /* @__PURE__ */ jsx4(Lock, { size: 16 }) }),
612
+ isLoading ? /* @__PURE__ */ jsx4("div", { children: /* @__PURE__ */ jsx4(LoadingSpinner_default, { size: "xs" }) }) : /* @__PURE__ */ jsx4(
613
+ "div",
614
+ {
615
+ className: clsx(
616
+ "tw-transition-all tw-duration-200 tw-cursor-pointer tw-flex tw-items-center",
617
+ // Only rotate chevron when open and not showing clear icon
618
+ isOpen && !(isHovering && selectedValue && allowClear) && "-tw-rotate-180"
619
+ ),
620
+ onMouseDown: handleChevronMouseDown,
621
+ children: disabled ? null : isHovering && selectedValue && allowClear ? /* @__PURE__ */ jsx4(
622
+ CrossV2,
623
+ {
624
+ color: "#111827",
625
+ className: clsx({ "tw-mr-1": size !== "small" }),
626
+ size: size === "small" ? 12 : 16
627
+ }
628
+ ) : /* @__PURE__ */ jsx4(
629
+ Chevron,
630
+ {
631
+ className: clsx("tw-text-gray-400"),
632
+ color: "#6B7280"
633
+ }
634
+ )
635
+ }
636
+ )
637
+ ]
638
+ }
639
+ )
640
+ ] }),
641
+ isOpen && /* @__PURE__ */ jsx4(
642
+ "div",
643
+ {
644
+ className: clsx(
645
+ "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",
646
+ { "tw-max-h-60": !doubleCharSearch },
647
+ { "tw-max-h-44": doubleCharSearch },
648
+ dropdownClassName
649
+ ),
650
+ ref: optionListRef,
651
+ children: filteredOptions.length > 0 ? filteredOptions.map((option, index) => {
652
+ const isSelected = normalizeValue(selectedValue) === normalizeValue(option.value);
653
+ const isHighlighted = index === highlightedIndex;
654
+ return /* @__PURE__ */ jsx4("div", { ref: (el) => optionRefs.current[index] = el, children: /* @__PURE__ */ jsx4(
655
+ OptionItem,
656
+ {
657
+ option,
658
+ index,
659
+ isSelected,
660
+ isHighlighted,
661
+ experience,
662
+ size,
663
+ optionClassName,
664
+ onSelectHandler: handleOptionClick,
665
+ onMouseEnterHandler: handleOptionMouseEnter
666
+ }
667
+ ) }, doubleCharSearch ? option.label : option.value);
668
+ }) : /* @__PURE__ */ jsx4("div", { className: "tw-px-4 tw-py-3 tw-text-gray-500 tw-text-sm", children: "No options found" })
669
+ }
670
+ )
671
+ ]
672
+ }
673
+ ) });
674
+ };
675
+ Select.displayName = "Select";
676
+ var Select_default = Select;
677
+
678
+ export {
679
+ Select,
680
+ Select_default
681
+ };