@itilite/lumina-ui 1.2.2 → 1.2.21

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 (91) hide show
  1. package/dist/atom/AdvancedDateRangePicker/AdvancedDateRangePicker.mjs +1 -1
  2. package/dist/atom/Switch/Switch.d.mts +1 -1
  3. package/dist/atom/Switch/Switch.d.ts +1 -1
  4. package/dist/atom/Switch/Switch.js +2 -2
  5. package/dist/atom/Switch/Switch.mjs +1 -1
  6. package/dist/{chunk-TMSPSGSS.mjs → chunk-IIJUGDEJ.mjs} +3 -3
  7. package/dist/{chunk-E27NPVR4.mjs → chunk-LTP5I3GX.mjs} +3 -3
  8. package/dist/chunk-O6PQFAXN.mjs +47 -0
  9. package/dist/index.js +2 -2
  10. package/dist/index.mjs +6 -6
  11. package/dist/styles.css +847 -824
  12. package/package.json +28 -27
  13. package/dist/AdvancedDateRangePicker-D7xn4So6.d.mts +0 -59
  14. package/dist/AdvancedDateRangePicker-D7xn4So6.d.ts +0 -59
  15. package/dist/AdvancedDateRangePicker-D9Sdk4rK.d.mts +0 -64
  16. package/dist/AdvancedDateRangePicker-D9Sdk4rK.d.ts +0 -64
  17. package/dist/AdvancedDateRangePicker-DGg-rucL.d.mts +0 -62
  18. package/dist/AdvancedDateRangePicker-DGg-rucL.d.ts +0 -62
  19. package/dist/AdvancedDateRangePicker-Di3rHxqf.d.mts +0 -64
  20. package/dist/AdvancedDateRangePicker-Di3rHxqf.d.ts +0 -64
  21. package/dist/AdvancedDateRangePicker-Dxug2Mcf.d.mts +0 -60
  22. package/dist/AdvancedDateRangePicker-Dxug2Mcf.d.ts +0 -60
  23. package/dist/AdvancedDateRangePicker-ozItnkhp.d.mts +0 -57
  24. package/dist/AdvancedDateRangePicker-ozItnkhp.d.ts +0 -57
  25. package/dist/Table-BOq-_9Nr.d.mts +0 -121
  26. package/dist/Table-BOq-_9Nr.d.ts +0 -121
  27. package/dist/Table-BxaCiQmh.d.mts +0 -82
  28. package/dist/Table-BxaCiQmh.d.ts +0 -82
  29. package/dist/Table-CnzP9dkc.d.mts +0 -82
  30. package/dist/Table-CnzP9dkc.d.ts +0 -82
  31. package/dist/Table-DNvoh2P8.d.mts +0 -127
  32. package/dist/Table-DNvoh2P8.d.ts +0 -127
  33. package/dist/Table-DSFYzrpU.d.mts +0 -129
  34. package/dist/Table-DSFYzrpU.d.ts +0 -129
  35. package/dist/Table-DmfNNnuD.d.mts +0 -86
  36. package/dist/Table-DmfNNnuD.d.ts +0 -86
  37. package/dist/Table-DoCPt3ri.d.mts +0 -129
  38. package/dist/Table-DoCPt3ri.d.ts +0 -129
  39. package/dist/chunk-27LRL4RO.mjs +0 -428
  40. package/dist/chunk-2IT3XM7C.mjs +0 -473
  41. package/dist/chunk-3HXZIFV6.mjs +0 -438
  42. package/dist/chunk-4JX54OKI.mjs +0 -627
  43. package/dist/chunk-53O7JM5I.mjs +0 -424
  44. package/dist/chunk-5JXIJTAS.mjs +0 -448
  45. package/dist/chunk-5OUMKJWI.mjs +0 -301
  46. package/dist/chunk-5PMUTA6S.mjs +0 -303
  47. package/dist/chunk-5PQ43JFX.mjs +0 -440
  48. package/dist/chunk-62VAYFZA.mjs +0 -437
  49. package/dist/chunk-6ON32H2N.mjs +0 -431
  50. package/dist/chunk-6RIZXTFP.mjs +0 -290
  51. package/dist/chunk-6XIT27XY.mjs +0 -269
  52. package/dist/chunk-772C454L.mjs +0 -438
  53. package/dist/chunk-7L267Y4P.mjs +0 -429
  54. package/dist/chunk-7WSVCE2C.mjs +0 -269
  55. package/dist/chunk-ANJI6SPV.mjs +0 -283
  56. package/dist/chunk-BFFLWW7N.mjs +0 -250
  57. package/dist/chunk-C5VYFNVC.mjs +0 -441
  58. package/dist/chunk-CDYPIUWU.mjs +0 -681
  59. package/dist/chunk-DL7BZMGE.mjs +0 -295
  60. package/dist/chunk-DXPVJNGY.mjs +0 -284
  61. package/dist/chunk-FTL3PFC2.mjs +0 -438
  62. package/dist/chunk-G4P6XGQX.mjs +0 -278
  63. package/dist/chunk-GGWY2SYX.mjs +0 -452
  64. package/dist/chunk-GZ4P7OL3.mjs +0 -429
  65. package/dist/chunk-I6GLPWHS.mjs +0 -278
  66. package/dist/chunk-IPVJEGDI.mjs +0 -476
  67. package/dist/chunk-J4YYP4IZ.mjs +0 -0
  68. package/dist/chunk-J5JDQ4R6.mjs +0 -278
  69. package/dist/chunk-K2A4TWA3.mjs +0 -430
  70. package/dist/chunk-L3L42SIL.mjs +0 -429
  71. package/dist/chunk-LRNKIRH3.mjs +0 -289
  72. package/dist/chunk-MA23J4WQ.mjs +0 -430
  73. package/dist/chunk-N4DPPZVJ.mjs +0 -269
  74. package/dist/chunk-PQ3B2FEB.mjs +0 -249
  75. package/dist/chunk-QQA7KWAJ.mjs +0 -477
  76. package/dist/chunk-QRGHJP7U.mjs +0 -437
  77. package/dist/chunk-QU73KNTT.mjs +0 -452
  78. package/dist/chunk-RC6IGURJ.mjs +0 -428
  79. package/dist/chunk-SKPCOHON.mjs +0 -473
  80. package/dist/chunk-SRKN7WS7.mjs +0 -448
  81. package/dist/chunk-T43CWNOG.mjs +0 -283
  82. package/dist/chunk-TE5EOIIW.mjs +0 -301
  83. package/dist/chunk-TQDZWJZP.mjs +0 -269
  84. package/dist/chunk-UAGSPM3T.mjs +0 -288
  85. package/dist/chunk-UC4NTBDH.mjs +0 -439
  86. package/dist/chunk-UPSQTJJ4.mjs +0 -294
  87. package/dist/chunk-V3CHJHUX.mjs +0 -424
  88. package/dist/chunk-X3NDICAU.mjs +0 -284
  89. package/dist/chunk-XECXKSTC.mjs +0 -453
  90. package/dist/chunk-XIVTXS3Y.mjs +0 -439
  91. package/dist/chunk-ZGV6QMVM.mjs +0 -437
@@ -1,681 +0,0 @@
1
- import {
2
- LoadingSpinner_default
3
- } from "./chunk-QKTMWS4J.mjs";
4
- import {
5
- Tooltip_default
6
- } from "./chunk-MLCMZRUC.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
- };