@xsolla/xui-autocomplete 0.64.0-pr56.1768440195

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.
package/web/index.mjs ADDED
@@ -0,0 +1,752 @@
1
+ // src/Autocomplete.tsx
2
+ import { useState, useRef, useEffect } from "react";
3
+
4
+ // ../primitives-web/src/Box.tsx
5
+ import React from "react";
6
+ import styled from "styled-components";
7
+ import { jsx } from "react/jsx-runtime";
8
+ var StyledBox = styled.div`
9
+ display: flex;
10
+ box-sizing: border-box;
11
+ background-color: ${(props) => props.backgroundColor || "transparent"};
12
+ border-color: ${(props) => props.borderColor || "transparent"};
13
+ border-width: ${(props) => typeof props.borderWidth === "number" ? `${props.borderWidth}px` : props.borderWidth || 0};
14
+
15
+ ${(props) => props.borderBottomWidth !== void 0 && `
16
+ border-bottom-width: ${typeof props.borderBottomWidth === "number" ? `${props.borderBottomWidth}px` : props.borderBottomWidth};
17
+ border-bottom-color: ${props.borderBottomColor || props.borderColor || "transparent"};
18
+ border-bottom-style: solid;
19
+ `}
20
+ ${(props) => props.borderTopWidth !== void 0 && `
21
+ border-top-width: ${typeof props.borderTopWidth === "number" ? `${props.borderTopWidth}px` : props.borderTopWidth};
22
+ border-top-color: ${props.borderTopColor || props.borderColor || "transparent"};
23
+ border-top-style: solid;
24
+ `}
25
+ ${(props) => props.borderLeftWidth !== void 0 && `
26
+ border-left-width: ${typeof props.borderLeftWidth === "number" ? `${props.borderLeftWidth}px` : props.borderLeftWidth};
27
+ border-left-color: ${props.borderLeftColor || props.borderColor || "transparent"};
28
+ border-left-style: solid;
29
+ `}
30
+ ${(props) => props.borderRightWidth !== void 0 && `
31
+ border-right-width: ${typeof props.borderRightWidth === "number" ? `${props.borderRightWidth}px` : props.borderRightWidth};
32
+ border-right-color: ${props.borderRightColor || props.borderColor || "transparent"};
33
+ border-right-style: solid;
34
+ `}
35
+
36
+ border-style: ${(props) => props.borderStyle || (props.borderWidth || props.borderBottomWidth || props.borderTopWidth || props.borderLeftWidth || props.borderRightWidth ? "solid" : "none")};
37
+ border-radius: ${(props) => typeof props.borderRadius === "number" ? `${props.borderRadius}px` : props.borderRadius || 0};
38
+ height: ${(props) => typeof props.height === "number" ? `${props.height}px` : props.height || "auto"};
39
+ width: ${(props) => typeof props.width === "number" ? `${props.width}px` : props.width || "auto"};
40
+ min-width: ${(props) => typeof props.minWidth === "number" ? `${props.minWidth}px` : props.minWidth || "auto"};
41
+ min-height: ${(props) => typeof props.minHeight === "number" ? `${props.minHeight}px` : props.minHeight || "auto"};
42
+
43
+ padding: ${(props) => typeof props.padding === "number" ? `${props.padding}px` : props.padding || 0};
44
+ ${(props) => props.paddingHorizontal && `
45
+ padding-left: ${typeof props.paddingHorizontal === "number" ? `${props.paddingHorizontal}px` : props.paddingHorizontal};
46
+ padding-right: ${typeof props.paddingHorizontal === "number" ? `${props.paddingHorizontal}px` : props.paddingHorizontal};
47
+ `}
48
+ ${(props) => props.paddingVertical && `
49
+ padding-top: ${typeof props.paddingVertical === "number" ? `${props.paddingVertical}px` : props.paddingVertical};
50
+ padding-bottom: ${typeof props.paddingVertical === "number" ? `${props.paddingVertical}px` : props.paddingVertical};
51
+ `}
52
+ ${(props) => props.paddingTop !== void 0 && `padding-top: ${typeof props.paddingTop === "number" ? `${props.paddingTop}px` : props.paddingTop};`}
53
+ ${(props) => props.paddingBottom !== void 0 && `padding-bottom: ${typeof props.paddingBottom === "number" ? `${props.paddingBottom}px` : props.paddingBottom};`}
54
+ ${(props) => props.paddingLeft !== void 0 && `padding-left: ${typeof props.paddingLeft === "number" ? `${props.paddingLeft}px` : props.paddingLeft};`}
55
+ ${(props) => props.paddingRight !== void 0 && `padding-right: ${typeof props.paddingRight === "number" ? `${props.paddingRight}px` : props.paddingRight};`}
56
+
57
+ margin: ${(props) => typeof props.margin === "number" ? `${props.margin}px` : props.margin || 0};
58
+ ${(props) => props.marginTop !== void 0 && `margin-top: ${typeof props.marginTop === "number" ? `${props.marginTop}px` : props.marginTop};`}
59
+ ${(props) => props.marginBottom !== void 0 && `margin-bottom: ${typeof props.marginBottom === "number" ? `${props.marginBottom}px` : props.marginBottom};`}
60
+ ${(props) => props.marginLeft !== void 0 && `margin-left: ${typeof props.marginLeft === "number" ? `${props.marginLeft}px` : props.marginLeft};`}
61
+ ${(props) => props.marginRight !== void 0 && `margin-right: ${typeof props.marginRight === "number" ? `${props.marginRight}px` : props.marginRight};`}
62
+
63
+ flex-direction: ${(props) => props.flexDirection || "column"};
64
+ flex-wrap: ${(props) => props.flexWrap || "nowrap"};
65
+ align-items: ${(props) => props.alignItems || "stretch"};
66
+ justify-content: ${(props) => props.justifyContent || "flex-start"};
67
+ cursor: ${(props) => props.cursor ? props.cursor : props.onClick || props.onPress ? "pointer" : "inherit"};
68
+ position: ${(props) => props.position || "static"};
69
+ top: ${(props) => typeof props.top === "number" ? `${props.top}px` : props.top};
70
+ bottom: ${(props) => typeof props.bottom === "number" ? `${props.bottom}px` : props.bottom};
71
+ left: ${(props) => typeof props.left === "number" ? `${props.left}px` : props.left};
72
+ right: ${(props) => typeof props.right === "number" ? `${props.right}px` : props.right};
73
+ flex: ${(props) => props.flex};
74
+ flex-shrink: ${(props) => props.flexShrink ?? 1};
75
+ gap: ${(props) => typeof props.gap === "number" ? `${props.gap}px` : props.gap || 0};
76
+ align-self: ${(props) => props.alignSelf || "auto"};
77
+ overflow: ${(props) => props.overflow || "visible"};
78
+ overflow-x: ${(props) => props.overflowX || "visible"};
79
+ overflow-y: ${(props) => props.overflowY || "visible"};
80
+ z-index: ${(props) => props.zIndex};
81
+ opacity: ${(props) => props.disabled ? 0.5 : 1};
82
+ pointer-events: ${(props) => props.disabled ? "none" : "auto"};
83
+
84
+ &:hover {
85
+ ${(props) => props.hoverStyle?.backgroundColor && `background-color: ${props.hoverStyle.backgroundColor};`}
86
+ ${(props) => props.hoverStyle?.borderColor && `border-color: ${props.hoverStyle.borderColor};`}
87
+ }
88
+
89
+ &:active {
90
+ ${(props) => props.pressStyle?.backgroundColor && `background-color: ${props.pressStyle.backgroundColor};`}
91
+ }
92
+ `;
93
+ var Box = React.forwardRef(
94
+ ({
95
+ children,
96
+ onPress,
97
+ onKeyDown,
98
+ onKeyUp,
99
+ role,
100
+ "aria-label": ariaLabel,
101
+ "aria-labelledby": ariaLabelledBy,
102
+ "aria-current": ariaCurrent,
103
+ "aria-disabled": ariaDisabled,
104
+ "aria-live": ariaLive,
105
+ "aria-busy": ariaBusy,
106
+ "aria-describedby": ariaDescribedBy,
107
+ "aria-expanded": ariaExpanded,
108
+ "aria-haspopup": ariaHasPopup,
109
+ "aria-pressed": ariaPressed,
110
+ "aria-controls": ariaControls,
111
+ tabIndex,
112
+ as,
113
+ src,
114
+ alt,
115
+ type,
116
+ disabled,
117
+ id,
118
+ ...props
119
+ }, ref) => {
120
+ if (as === "img" && src) {
121
+ return /* @__PURE__ */ jsx(
122
+ "img",
123
+ {
124
+ src,
125
+ alt: alt || "",
126
+ style: {
127
+ display: "block",
128
+ objectFit: "cover",
129
+ width: typeof props.width === "number" ? `${props.width}px` : props.width,
130
+ height: typeof props.height === "number" ? `${props.height}px` : props.height,
131
+ borderRadius: typeof props.borderRadius === "number" ? `${props.borderRadius}px` : props.borderRadius,
132
+ position: props.position,
133
+ top: typeof props.top === "number" ? `${props.top}px` : props.top,
134
+ left: typeof props.left === "number" ? `${props.left}px` : props.left,
135
+ right: typeof props.right === "number" ? `${props.right}px` : props.right,
136
+ bottom: typeof props.bottom === "number" ? `${props.bottom}px` : props.bottom
137
+ }
138
+ }
139
+ );
140
+ }
141
+ return /* @__PURE__ */ jsx(
142
+ StyledBox,
143
+ {
144
+ ref,
145
+ as,
146
+ id,
147
+ type: as === "button" ? type || "button" : void 0,
148
+ disabled: as === "button" ? disabled : void 0,
149
+ onClick: onPress,
150
+ onKeyDown,
151
+ onKeyUp,
152
+ role,
153
+ "aria-label": ariaLabel,
154
+ "aria-labelledby": ariaLabelledBy,
155
+ "aria-current": ariaCurrent,
156
+ "aria-disabled": ariaDisabled,
157
+ "aria-busy": ariaBusy,
158
+ "aria-describedby": ariaDescribedBy,
159
+ "aria-expanded": ariaExpanded,
160
+ "aria-haspopup": ariaHasPopup,
161
+ "aria-pressed": ariaPressed,
162
+ "aria-controls": ariaControls,
163
+ "aria-live": ariaLive,
164
+ tabIndex: tabIndex !== void 0 ? tabIndex : void 0,
165
+ ...props,
166
+ children
167
+ }
168
+ );
169
+ }
170
+ );
171
+ Box.displayName = "Box";
172
+
173
+ // ../primitives-web/src/Text.tsx
174
+ import styled2 from "styled-components";
175
+ import { jsx as jsx2 } from "react/jsx-runtime";
176
+ var StyledText = styled2.span`
177
+ color: ${(props) => props.color || "inherit"};
178
+ font-size: ${(props) => typeof props.fontSize === "number" ? `${props.fontSize}px` : props.fontSize || "inherit"};
179
+ font-weight: ${(props) => props.fontWeight || "normal"};
180
+ font-family: ${(props) => props.fontFamily || '"Pilat Wide Bold", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif !important'};
181
+ line-height: ${(props) => typeof props.lineHeight === "number" ? `${props.lineHeight}px` : props.lineHeight || "inherit"};
182
+ white-space: ${(props) => props.whiteSpace || "normal"};
183
+ text-align: ${(props) => props.textAlign || "inherit"};
184
+ text-decoration: ${(props) => props.textDecoration || "none"};
185
+ `;
186
+ var Text = ({
187
+ style,
188
+ className,
189
+ id,
190
+ role,
191
+ ...props
192
+ }) => {
193
+ return /* @__PURE__ */ jsx2(
194
+ StyledText,
195
+ {
196
+ ...props,
197
+ style,
198
+ className,
199
+ id,
200
+ role
201
+ }
202
+ );
203
+ };
204
+
205
+ // ../primitives-web/src/Spinner.tsx
206
+ import styled3, { keyframes } from "styled-components";
207
+ import { jsx as jsx3 } from "react/jsx-runtime";
208
+ var rotate = keyframes`
209
+ from {
210
+ transform: rotate(0deg);
211
+ }
212
+ to {
213
+ transform: rotate(360deg);
214
+ }
215
+ `;
216
+ var StyledSpinner = styled3.div`
217
+ width: ${(props) => typeof props.size === "number" ? `${props.size}px` : props.size || "24px"};
218
+ height: ${(props) => typeof props.size === "number" ? `${props.size}px` : props.size || "24px"};
219
+ border: ${(props) => props.strokeWidth || 2}px solid
220
+ ${(props) => props.color || "currentColor"};
221
+ border-bottom-color: transparent;
222
+ border-radius: 50%;
223
+ display: inline-block;
224
+ box-sizing: border-box;
225
+ animation: ${rotate} 1s linear infinite;
226
+ `;
227
+ var Spinner = ({
228
+ role = "status",
229
+ "aria-label": ariaLabel,
230
+ "aria-live": ariaLive = "polite",
231
+ "aria-describedby": ariaDescribedBy,
232
+ testID,
233
+ ...props
234
+ }) => {
235
+ return /* @__PURE__ */ jsx3(
236
+ StyledSpinner,
237
+ {
238
+ role,
239
+ "aria-label": ariaLabel,
240
+ "aria-live": ariaLive,
241
+ "aria-describedby": ariaDescribedBy,
242
+ "data-testid": testID,
243
+ ...props
244
+ }
245
+ );
246
+ };
247
+ Spinner.displayName = "Spinner";
248
+
249
+ // ../primitives-web/src/Icon.tsx
250
+ import styled4 from "styled-components";
251
+ import { jsx as jsx4 } from "react/jsx-runtime";
252
+ var StyledIcon = styled4.div`
253
+ display: flex;
254
+ align-items: center;
255
+ justify-content: center;
256
+ width: ${(props) => typeof props.size === "number" ? `${props.size}px` : props.size || "24px"};
257
+ height: ${(props) => typeof props.size === "number" ? `${props.size}px` : props.size || "24px"};
258
+ color: ${(props) => props.color || "currentColor"};
259
+
260
+ svg {
261
+ width: 100%;
262
+ height: 100%;
263
+ fill: none;
264
+ stroke: currentColor;
265
+ }
266
+ `;
267
+ var Icon = ({ children, ...props }) => {
268
+ return /* @__PURE__ */ jsx4(StyledIcon, { ...props, children });
269
+ };
270
+
271
+ // ../primitives-web/src/Divider.tsx
272
+ import styled5 from "styled-components";
273
+ import { jsx as jsx5 } from "react/jsx-runtime";
274
+ var StyledDivider = styled5.div`
275
+ background-color: ${(props) => props.dashStroke ? "transparent" : props.color || "rgba(255, 255, 255, 0.15)"};
276
+ width: ${(props) => props.vertical ? typeof props.width === "number" ? `${props.width}px` : props.width || "1px" : "100%"};
277
+ height: ${(props) => props.vertical ? "100%" : typeof props.height === "number" ? `${props.height}px` : props.height || "1px"};
278
+
279
+ ${(props) => props.dashStroke && `
280
+ border-style: dashed;
281
+ border-color: ${props.color || "rgba(255, 255, 255, 0.15)"};
282
+ border-width: 0;
283
+ ${props.vertical ? `
284
+ border-left-width: ${typeof props.width === "number" ? `${props.width}px` : props.width || "1px"};
285
+ height: 100%;
286
+ ` : `
287
+ border-top-width: ${typeof props.height === "number" ? `${props.height}px` : props.height || "1px"};
288
+ width: 100%;
289
+ `}
290
+ `}
291
+ `;
292
+
293
+ // ../primitives-web/src/Input.tsx
294
+ import { forwardRef } from "react";
295
+ import styled6 from "styled-components";
296
+ import { jsx as jsx6 } from "react/jsx-runtime";
297
+ var StyledInput = styled6.input`
298
+ background: transparent;
299
+ border: none;
300
+ outline: none;
301
+ width: 100%;
302
+ height: 100%;
303
+ padding: 0;
304
+ margin: 0;
305
+ color: ${(props) => props.color || "inherit"};
306
+ font-size: ${(props) => typeof props.fontSize === "number" ? `${props.fontSize}px` : props.fontSize || "inherit"};
307
+ font-family: inherit;
308
+ text-align: inherit;
309
+
310
+ &::placeholder {
311
+ color: ${(props) => props.placeholderTextColor || "rgba(255, 255, 255, 0.5)"};
312
+ }
313
+
314
+ &:disabled {
315
+ cursor: not-allowed;
316
+ }
317
+ `;
318
+ var InputPrimitive = forwardRef(
319
+ ({
320
+ value,
321
+ placeholder,
322
+ onChange,
323
+ onChangeText,
324
+ onFocus,
325
+ onBlur,
326
+ onKeyDown,
327
+ disabled,
328
+ secureTextEntry,
329
+ style,
330
+ color,
331
+ fontSize,
332
+ placeholderTextColor,
333
+ maxLength,
334
+ name,
335
+ type,
336
+ inputMode,
337
+ autoComplete,
338
+ id,
339
+ "aria-invalid": ariaInvalid,
340
+ "aria-describedby": ariaDescribedBy,
341
+ "aria-labelledby": ariaLabelledBy,
342
+ "aria-label": ariaLabel,
343
+ "aria-disabled": ariaDisabled,
344
+ "data-testid": dataTestId,
345
+ ...rest
346
+ }, ref) => {
347
+ const handleChange = (e) => {
348
+ if (onChange) {
349
+ onChange(e);
350
+ }
351
+ if (onChangeText) {
352
+ onChangeText(e.target.value);
353
+ }
354
+ };
355
+ const inputValue = value !== void 0 ? value : "";
356
+ return /* @__PURE__ */ jsx6(
357
+ StyledInput,
358
+ {
359
+ ref,
360
+ id,
361
+ value: inputValue,
362
+ name,
363
+ placeholder,
364
+ onChange: handleChange,
365
+ onFocus,
366
+ onBlur,
367
+ onKeyDown,
368
+ disabled,
369
+ type: secureTextEntry ? "password" : type || "text",
370
+ inputMode,
371
+ autoComplete,
372
+ style,
373
+ color,
374
+ fontSize,
375
+ placeholderTextColor,
376
+ maxLength,
377
+ "aria-invalid": ariaInvalid,
378
+ "aria-describedby": ariaDescribedBy,
379
+ "aria-labelledby": ariaLabelledBy,
380
+ "aria-label": ariaLabel,
381
+ "aria-disabled": ariaDisabled,
382
+ "data-testid": dataTestId,
383
+ ...rest
384
+ }
385
+ );
386
+ }
387
+ );
388
+ InputPrimitive.displayName = "InputPrimitive";
389
+
390
+ // ../primitives-web/src/TextArea.tsx
391
+ import { forwardRef as forwardRef2 } from "react";
392
+ import styled7 from "styled-components";
393
+ import { jsx as jsx7 } from "react/jsx-runtime";
394
+ var StyledTextArea = styled7.textarea`
395
+ background: transparent;
396
+ border: none;
397
+ outline: none;
398
+ width: 100%;
399
+ height: 100%;
400
+ padding: 0;
401
+ margin: 0;
402
+ color: ${(props) => props.color || "inherit"};
403
+ font-size: ${(props) => typeof props.fontSize === "number" ? `${props.fontSize}px` : props.fontSize || "inherit"};
404
+ font-family: inherit;
405
+ text-align: inherit;
406
+ resize: none;
407
+
408
+ &::placeholder {
409
+ color: ${(props) => props.placeholderTextColor || "rgba(255, 255, 255, 0.5)"};
410
+ }
411
+
412
+ &:disabled {
413
+ cursor: not-allowed;
414
+ }
415
+ `;
416
+ var TextAreaPrimitive = forwardRef2(
417
+ ({
418
+ value,
419
+ placeholder,
420
+ onChangeText,
421
+ onFocus,
422
+ onBlur,
423
+ onKeyDown,
424
+ disabled,
425
+ style,
426
+ color,
427
+ fontSize,
428
+ placeholderTextColor,
429
+ maxLength,
430
+ rows
431
+ }, ref) => {
432
+ return /* @__PURE__ */ jsx7(
433
+ StyledTextArea,
434
+ {
435
+ ref,
436
+ value,
437
+ placeholder,
438
+ onChange: (e) => onChangeText?.(e.target.value),
439
+ onFocus,
440
+ onBlur,
441
+ onKeyDown,
442
+ disabled,
443
+ style,
444
+ color,
445
+ fontSize,
446
+ placeholderTextColor,
447
+ maxLength,
448
+ rows
449
+ }
450
+ );
451
+ }
452
+ );
453
+ TextAreaPrimitive.displayName = "TextAreaPrimitive";
454
+
455
+ // src/Autocomplete.tsx
456
+ import { useDesignSystem } from "@xsolla/xui-core";
457
+ import { jsx as jsx8, jsxs } from "react/jsx-runtime";
458
+ var SearchIcon = () => /* @__PURE__ */ jsxs(
459
+ "svg",
460
+ {
461
+ width: "100%",
462
+ height: "100%",
463
+ viewBox: "0 0 18 18",
464
+ fill: "none",
465
+ xmlns: "http://www.w3.org/2000/svg",
466
+ children: [
467
+ /* @__PURE__ */ jsx8(
468
+ "path",
469
+ {
470
+ d: "M8.25 14.25C11.5637 14.25 14.25 11.5637 14.25 8.25C14.25 4.93629 11.5637 2.25 8.25 2.25C4.93629 2.25 2.25 4.93629 2.25 8.25C2.25 11.5637 4.93629 14.25 8.25 14.25Z",
471
+ stroke: "currentColor",
472
+ strokeWidth: "1.5",
473
+ strokeLinecap: "round",
474
+ strokeLinejoin: "round"
475
+ }
476
+ ),
477
+ /* @__PURE__ */ jsx8(
478
+ "path",
479
+ {
480
+ d: "M15.75 15.75L12.4875 12.4875",
481
+ stroke: "currentColor",
482
+ strokeWidth: "1.5",
483
+ strokeLinecap: "round",
484
+ strokeLinejoin: "round"
485
+ }
486
+ )
487
+ ]
488
+ }
489
+ );
490
+ var ChevronDown = () => /* @__PURE__ */ jsx8(
491
+ "svg",
492
+ {
493
+ width: "100%",
494
+ height: "100%",
495
+ viewBox: "0 0 18 18",
496
+ fill: "none",
497
+ xmlns: "http://www.w3.org/2000/svg",
498
+ children: /* @__PURE__ */ jsx8(
499
+ "path",
500
+ {
501
+ d: "M4.5 6.75L9 11.25L13.5 6.75",
502
+ stroke: "currentColor",
503
+ strokeWidth: "1.5",
504
+ strokeLinecap: "round",
505
+ strokeLinejoin: "round"
506
+ }
507
+ )
508
+ }
509
+ );
510
+ var ChevronUp = () => /* @__PURE__ */ jsx8(
511
+ "svg",
512
+ {
513
+ width: "100%",
514
+ height: "100%",
515
+ viewBox: "0 0 18 18",
516
+ fill: "none",
517
+ xmlns: "http://www.w3.org/2000/svg",
518
+ children: /* @__PURE__ */ jsx8(
519
+ "path",
520
+ {
521
+ d: "M13.5 11.25L9 6.75L4.5 11.25",
522
+ stroke: "currentColor",
523
+ strokeWidth: "1.5",
524
+ strokeLinecap: "round",
525
+ strokeLinejoin: "round"
526
+ }
527
+ )
528
+ }
529
+ );
530
+ var CloseIcon = () => /* @__PURE__ */ jsxs(
531
+ "svg",
532
+ {
533
+ width: "100%",
534
+ height: "100%",
535
+ viewBox: "0 0 18 18",
536
+ fill: "none",
537
+ xmlns: "http://www.w3.org/2000/svg",
538
+ children: [
539
+ /* @__PURE__ */ jsx8(
540
+ "path",
541
+ {
542
+ d: "M13.5 4.5L4.5 13.5",
543
+ stroke: "currentColor",
544
+ strokeWidth: "1.5",
545
+ strokeLinecap: "round",
546
+ strokeLinejoin: "round"
547
+ }
548
+ ),
549
+ /* @__PURE__ */ jsx8(
550
+ "path",
551
+ {
552
+ d: "M4.5 4.5L13.5 13.5",
553
+ stroke: "currentColor",
554
+ strokeWidth: "1.5",
555
+ strokeLinecap: "round",
556
+ strokeLinejoin: "round"
557
+ }
558
+ )
559
+ ]
560
+ }
561
+ );
562
+ var Autocomplete = ({
563
+ value: propValue,
564
+ placeholder = "Search...",
565
+ onValueChange,
566
+ onSelect,
567
+ options = [],
568
+ isLoading = false,
569
+ size = "m",
570
+ state: externalState,
571
+ label,
572
+ errorLabel,
573
+ iconLeft = /* @__PURE__ */ jsx8(SearchIcon, {}),
574
+ chevronRight = true,
575
+ filled = true
576
+ }) => {
577
+ const { theme } = useDesignSystem();
578
+ const [internalValue, setInternalValue] = useState(propValue || "");
579
+ const [isFocused, setIsFocused] = useState(false);
580
+ const containerRef = useRef(null);
581
+ const value = propValue !== void 0 ? propValue : internalValue;
582
+ const state = externalState || (isFocused ? "focus" : "default");
583
+ const isDisable = state === "disable";
584
+ const isError = state === "error";
585
+ const isFocus = state === "focus";
586
+ const sizeStyles = theme.sizing.input(size);
587
+ const inputColors = theme.colors.control.input;
588
+ useEffect(() => {
589
+ const handleClickOutside = (event) => {
590
+ if (containerRef.current && !containerRef.current.contains(event.target)) {
591
+ setIsFocused(false);
592
+ }
593
+ };
594
+ if (isFocused) {
595
+ document.addEventListener("mousedown", handleClickOutside);
596
+ }
597
+ return () => {
598
+ document.removeEventListener("mousedown", handleClickOutside);
599
+ };
600
+ }, [isFocused]);
601
+ const handleInputChange = (text) => {
602
+ if (!isDisable) {
603
+ setInternalValue(text);
604
+ if (onValueChange) onValueChange(text);
605
+ setIsFocused(true);
606
+ }
607
+ };
608
+ const handleSelect = (option) => {
609
+ setInternalValue(option);
610
+ setIsFocused(false);
611
+ if (onSelect) onSelect(option);
612
+ if (onValueChange) onValueChange(option);
613
+ };
614
+ const handleClear = (e) => {
615
+ e.stopPropagation();
616
+ handleInputChange("");
617
+ };
618
+ let backgroundColor = inputColors.bg;
619
+ let borderColor = inputColors.border;
620
+ if (isDisable) {
621
+ backgroundColor = inputColors.bgDisable;
622
+ borderColor = inputColors.borderDisable;
623
+ } else if (isError) {
624
+ borderColor = theme.colors.border.alert;
625
+ } else if (isFocus) {
626
+ backgroundColor = theme.colors.control.focus.bg;
627
+ borderColor = inputColors.borderHover;
628
+ } else if (state === "hover") {
629
+ backgroundColor = inputColors.bgHover;
630
+ borderColor = inputColors.borderHover;
631
+ }
632
+ if (filled === false && !isFocus && !isError && state !== "hover") {
633
+ backgroundColor = "transparent";
634
+ }
635
+ const textColor = isDisable ? inputColors.textDisable : inputColors.text;
636
+ const placeholderColor = inputColors.placeholder;
637
+ const iconColor = isDisable ? inputColors.textDisable : inputColors.text;
638
+ return /* @__PURE__ */ jsxs(
639
+ Box,
640
+ {
641
+ ref: containerRef,
642
+ flexDirection: "column",
643
+ gap: 4,
644
+ width: "100%",
645
+ position: "relative",
646
+ children: [
647
+ label && /* @__PURE__ */ jsx8(
648
+ Text,
649
+ {
650
+ color: theme.colors.content.secondary,
651
+ fontSize: sizeStyles.fontSize - 2,
652
+ fontWeight: "500",
653
+ marginBottom: 4,
654
+ children: label
655
+ }
656
+ ),
657
+ /* @__PURE__ */ jsxs(
658
+ Box,
659
+ {
660
+ backgroundColor,
661
+ borderColor,
662
+ borderWidth: borderColor !== "transparent" ? 1 : 0,
663
+ borderRadius: theme.radius.button,
664
+ height: sizeStyles.height,
665
+ paddingHorizontal: sizeStyles.padding,
666
+ flexDirection: "row",
667
+ alignItems: "center",
668
+ gap: 10,
669
+ position: "relative",
670
+ hoverStyle: !isDisable && !isFocus && !isError ? {
671
+ backgroundColor: inputColors.bgHover,
672
+ borderColor: inputColors.borderHover
673
+ } : void 0,
674
+ children: [
675
+ iconLeft && /* @__PURE__ */ jsx8(Box, { alignItems: "center", justifyContent: "center", children: /* @__PURE__ */ jsx8(Icon, { size: sizeStyles.iconSize, color: iconColor, children: iconLeft }) }),
676
+ /* @__PURE__ */ jsx8(Box, { flex: 1, height: "100%", justifyContent: "center", children: /* @__PURE__ */ jsx8(
677
+ InputPrimitive,
678
+ {
679
+ value,
680
+ placeholder,
681
+ onChangeText: handleInputChange,
682
+ onFocus: () => !isDisable && setIsFocused(true),
683
+ disabled: isDisable,
684
+ color: textColor,
685
+ fontSize: sizeStyles.fontSize,
686
+ placeholderTextColor: placeholderColor
687
+ }
688
+ ) }),
689
+ /* @__PURE__ */ jsxs(Box, { flexDirection: "row", alignItems: "center", gap: 4, children: [
690
+ value.length > 0 && !isDisable && /* @__PURE__ */ jsx8(Box, { onPress: handleClear, padding: 2, children: /* @__PURE__ */ jsx8(Icon, { size: sizeStyles.iconSize - 2, color: iconColor, children: /* @__PURE__ */ jsx8(CloseIcon, {}) }) }),
691
+ isLoading ? /* @__PURE__ */ jsx8(Spinner, { size: sizeStyles.iconSize, color: iconColor }) : chevronRight && /* @__PURE__ */ jsx8(Box, { alignItems: "center", justifyContent: "center", children: /* @__PURE__ */ jsx8(Icon, { size: sizeStyles.iconSize, color: iconColor, children: isFocus ? /* @__PURE__ */ jsx8(ChevronUp, {}) : /* @__PURE__ */ jsx8(ChevronDown, {}) }) })
692
+ ] })
693
+ ]
694
+ }
695
+ ),
696
+ isFocus && (options.length > 0 || isLoading) && /* @__PURE__ */ jsx8(
697
+ Box,
698
+ {
699
+ position: "absolute",
700
+ top: sizeStyles.height + (label ? 28 : 0) + 4,
701
+ left: 0,
702
+ right: 0,
703
+ backgroundColor: theme.colors.background.secondary,
704
+ borderColor: theme.colors.border.secondary,
705
+ borderWidth: 1,
706
+ borderRadius: theme.radius.button,
707
+ paddingVertical: 4,
708
+ style: {
709
+ zIndex: 1e3,
710
+ boxShadow: "0 4px 12px rgba(0,0,0,0.1)",
711
+ maxHeight: 250,
712
+ overflowY: "auto"
713
+ },
714
+ children: isLoading && options.length === 0 ? /* @__PURE__ */ jsx8(Box, { padding: 12, alignItems: "center", children: /* @__PURE__ */ jsx8(Spinner, { size: 24, color: theme.colors.content.secondary }) }) : options.map((option, index) => /* @__PURE__ */ jsx8(
715
+ Box,
716
+ {
717
+ paddingHorizontal: sizeStyles.padding,
718
+ paddingVertical: 8,
719
+ onPress: () => handleSelect(option),
720
+ hoverStyle: {
721
+ backgroundColor: theme.colors.control.input.bgHover
722
+ },
723
+ children: /* @__PURE__ */ jsx8(
724
+ Text,
725
+ {
726
+ color: theme.colors.content.primary,
727
+ fontSize: sizeStyles.fontSize,
728
+ children: option
729
+ }
730
+ )
731
+ },
732
+ index
733
+ ))
734
+ }
735
+ ),
736
+ isError && errorLabel && /* @__PURE__ */ jsx8(
737
+ Text,
738
+ {
739
+ color: theme.colors.content.alert.primary,
740
+ fontSize: sizeStyles.fontSize - 2,
741
+ marginTop: 4,
742
+ children: errorLabel
743
+ }
744
+ )
745
+ ]
746
+ }
747
+ );
748
+ };
749
+ export {
750
+ Autocomplete
751
+ };
752
+ //# sourceMappingURL=index.mjs.map