@xsolla/xui-select 0.171.3-pr330.1781564486 → 0.172.0

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/native/index.js CHANGED
@@ -313,13 +313,7 @@ var isNative = true;
313
313
  // src/Select.tsx
314
314
  var import_xui_core = require("@xsolla/xui-core");
315
315
  var import_xui_icons_base = require("@xsolla/xui-icons-base");
316
-
317
- // src/Portal.native.tsx
318
316
  var import_jsx_runtime4 = require("react/jsx-runtime");
319
- var Portal = ({ children }) => /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(import_jsx_runtime4.Fragment, { children });
320
-
321
- // src/Select.tsx
322
- var import_jsx_runtime5 = require("react/jsx-runtime");
323
317
  var Select = ({
324
318
  value,
325
319
  placeholder = "Select",
@@ -345,30 +339,16 @@ var Select = ({
345
339
  themeProductContext
346
340
  }) => {
347
341
  const { theme } = (0, import_xui_core.useResolvedTheme)({ themeMode, themeProductContext });
348
- const modalId = (0, import_xui_core.useModalId)();
349
342
  const [isOpen, setIsOpen] = (0, import_react2.useState)(false);
350
343
  const [selectedValue, setSelectedValue] = (0, import_react2.useState)(value);
351
344
  const [searchValue, setSearchValue] = (0, import_react2.useState)("");
352
- const [dropdownPosition, setDropdownPosition] = (0, import_react2.useState)(null);
353
345
  const containerRef = (0, import_react2.useRef)(null);
354
- const triggerRef = (0, import_react2.useRef)(null);
355
346
  const dropdownRef = (0, import_react2.useRef)(null);
356
347
  const selectedItemRef = (0, import_react2.useRef)(null);
357
348
  const searchInputRef = (0, import_react2.useRef)(null);
358
- const sizeStyles = theme.sizing.input(size);
359
- const inputColors = theme.colors.control.input;
360
349
  const isDisable = externalState === "disable" || disabled;
361
350
  const isError = externalState === "error" || !!errorMessage;
362
351
  const isFocus = externalState === "focus" || isOpen;
363
- const updateDropdownPosition = (0, import_react2.useCallback)(() => {
364
- if (!isWeb || !triggerRef.current) return;
365
- const rect = triggerRef.current.getBoundingClientRect();
366
- setDropdownPosition({
367
- left: rect.left,
368
- top: rect.bottom + sizeStyles.fieldGap,
369
- width: rect.width
370
- });
371
- }, [sizeStyles.fieldGap]);
372
352
  import_react2.default.useEffect(() => {
373
353
  if (value !== void 0) {
374
354
  setSelectedValue(value);
@@ -385,16 +365,6 @@ var Select = ({
385
365
  return () => clearTimeout(timeoutId);
386
366
  }
387
367
  }, [isFocus]);
388
- (0, import_react2.useEffect)(() => {
389
- if (!isWeb || !isFocus) return;
390
- updateDropdownPosition();
391
- window.addEventListener("resize", updateDropdownPosition);
392
- window.addEventListener("scroll", updateDropdownPosition, true);
393
- return () => {
394
- window.removeEventListener("resize", updateDropdownPosition);
395
- window.removeEventListener("scroll", updateDropdownPosition, true);
396
- };
397
- }, [isFocus, updateDropdownPosition]);
398
368
  (0, import_react2.useEffect)(() => {
399
369
  if (isFocus && searchable) {
400
370
  searchInputRef.current?.focus();
@@ -408,8 +378,7 @@ var Select = ({
408
378
  (0, import_react2.useEffect)(() => {
409
379
  if (isNative || !isOpen) return;
410
380
  const handleClickOutside = (event) => {
411
- const target = event.target;
412
- if (containerRef.current && !containerRef.current.contains(target) && !dropdownRef.current?.contains(target)) {
381
+ if (containerRef.current && !containerRef.current.contains(event.target)) {
413
382
  setIsOpen(false);
414
383
  }
415
384
  };
@@ -432,6 +401,8 @@ var Select = ({
432
401
  const label2 = getOptionLabel(option);
433
402
  return label2.toLowerCase().includes(searchValue.toLowerCase());
434
403
  }) : options;
404
+ const sizeStyles = theme.sizing.input(size);
405
+ const inputColors = theme.colors.control.input;
435
406
  const handlePress = () => {
436
407
  if (!isDisable) {
437
408
  if (onPress) onPress();
@@ -468,145 +439,7 @@ var Select = ({
468
439
  ) : placeholder;
469
440
  const textColor = isDisable ? inputColors.textDisable : selectedValue ? inputColors.text : inputColors.placeholder;
470
441
  const iconColor = isDisable ? inputColors.textDisable : inputColors.text;
471
- const dropdownTop = sizeStyles.height + (label ? sizeStyles.fontSize + sizeStyles.fieldGap : 0) + sizeStyles.fieldGap;
472
- const dropdown = isFocus && options.length > 0 && (isNative || dropdownPosition) && /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(
473
- Box,
474
- {
475
- ref: dropdownRef,
476
- "data-modal-id": modalId,
477
- position: isNative ? "absolute" : "fixed",
478
- top: isNative ? dropdownTop : dropdownPosition?.top,
479
- left: isNative ? void 0 : dropdownPosition?.left,
480
- width: isNative ? "100%" : dropdownPosition?.width,
481
- backgroundColor: theme.colors.background.secondary,
482
- borderColor: theme.colors.border.secondary,
483
- borderWidth: 1,
484
- borderRadius: sizeStyles.radius,
485
- style: {
486
- zIndex: 2e3,
487
- ...isNative ? { elevation: 4 } : { boxShadow: "0 4px 12px rgba(0,0,0,0.1)" },
488
- minWidth: iconOnly ? sizeStyles.height * 3 : void 0
489
- },
490
- children: [
491
- searchable && !isNative && /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
492
- Box,
493
- {
494
- paddingHorizontal: sizeStyles.paddingHorizontal,
495
- paddingVertical: sizeStyles.paddingVertical,
496
- borderBottomWidth: 1,
497
- borderColor: theme.colors.border.secondary,
498
- children: /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(
499
- Box,
500
- {
501
- flexDirection: "row",
502
- alignItems: "center",
503
- gap: sizeStyles.paddingHorizontal / 2,
504
- paddingHorizontal: 4,
505
- children: [
506
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
507
- Icon,
508
- {
509
- size: sizeStyles.iconSize - 2,
510
- color: inputColors.placeholder,
511
- children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(import_xui_icons_base.Search, {})
512
- }
513
- ),
514
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
515
- Box,
516
- {
517
- as: "input",
518
- ref: searchInputRef,
519
- flex: 1,
520
- type: "text",
521
- value: searchValue,
522
- onChange: (e) => setSearchValue(e.target.value),
523
- placeholder: searchPlaceholder,
524
- style: {
525
- border: "none",
526
- outline: "none",
527
- background: "transparent",
528
- color: inputColors.text,
529
- fontSize: sizeStyles.fontSize,
530
- width: "100%"
531
- }
532
- }
533
- )
534
- ]
535
- }
536
- )
537
- }
538
- ),
539
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
540
- Box,
541
- {
542
- paddingVertical: 4,
543
- overflow: "scroll",
544
- style: {
545
- maxHeight: searchable ? maxHeight - 60 : maxHeight,
546
- ...isWeb ? { overflowY: "auto" } : {}
547
- },
548
- children: filteredOptions.length === 0 ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
549
- Box,
550
- {
551
- paddingVertical: sizeStyles.paddingVertical * 2,
552
- paddingHorizontal: sizeStyles.paddingHorizontal,
553
- alignItems: "center",
554
- children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
555
- Text,
556
- {
557
- color: theme.colors.content.tertiary,
558
- fontSize: sizeStyles.fontSize,
559
- children: noOptionsMessage
560
- }
561
- )
562
- }
563
- ) : filteredOptions.map((option, index) => {
564
- const optionValue = getOptionValue(option);
565
- const optionLabel = getOptionLabel(option);
566
- const isOptionDisabled = getOptionDisabled(option);
567
- const isSelected = optionValue === selectedValue;
568
- const brandColors = theme.colors.control.brand.primary;
569
- const contentColors = theme.colors.content;
570
- return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
571
- Box,
572
- {
573
- testID,
574
- ref: isSelected ? selectedItemRef : void 0,
575
- paddingVertical: sizeStyles.paddingVertical,
576
- paddingHorizontal: sizeStyles.paddingHorizontal,
577
- onPress: isOptionDisabled ? void 0 : () => handleSelect(option),
578
- flexDirection: "row",
579
- alignItems: "center",
580
- justifyContent: "space-between",
581
- backgroundColor: isSelected ? brandColors.bg : "transparent",
582
- style: {
583
- ...isWeb ? {
584
- cursor: isOptionDisabled ? "not-allowed" : "pointer"
585
- } : {},
586
- opacity: isOptionDisabled ? 0.5 : 1
587
- },
588
- hoverStyle: !isSelected && !isOptionDisabled ? {
589
- backgroundColor: theme.colors.control.input.bgHover
590
- } : void 0,
591
- children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
592
- Text,
593
- {
594
- color: isSelected ? contentColors.on.brand : theme.colors.content.secondary,
595
- fontSize: sizeStyles.fontSize,
596
- fontWeight: "400",
597
- children: optionLabel
598
- }
599
- )
600
- },
601
- index
602
- );
603
- })
604
- }
605
- )
606
- ]
607
- }
608
- );
609
- return /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(
442
+ return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(
610
443
  Box,
611
444
  {
612
445
  testID,
@@ -616,7 +449,7 @@ var Select = ({
616
449
  width: fullWidth ? "100%" : void 0,
617
450
  position: "relative",
618
451
  children: [
619
- label && /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
452
+ label && /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
620
453
  Text,
621
454
  {
622
455
  color: theme.colors.content.secondary,
@@ -625,10 +458,9 @@ var Select = ({
625
458
  children: label
626
459
  }
627
460
  ),
628
- /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(
461
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(
629
462
  Box,
630
463
  {
631
- ref: triggerRef,
632
464
  onPress: handlePress,
633
465
  backgroundColor,
634
466
  borderColor,
@@ -647,8 +479,8 @@ var Select = ({
647
479
  borderColor: inputColors.borderHover
648
480
  } : void 0,
649
481
  children: [
650
- iconLeft && /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(Box, { alignItems: "center", justifyContent: "center", children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(Icon, { size: sizeStyles.iconSize, color: iconColor, children: iconLeft }) }),
651
- !iconOnly && /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
482
+ iconLeft && /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(Box, { alignItems: "center", justifyContent: "center", children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(Icon, { size: sizeStyles.iconSize, color: iconColor, children: iconLeft }) }),
483
+ !iconOnly && /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
652
484
  Box,
653
485
  {
654
486
  flex: 1,
@@ -656,7 +488,7 @@ var Select = ({
656
488
  justifyContent: "center",
657
489
  overflow: "hidden",
658
490
  overflowX: "hidden",
659
- children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
491
+ children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
660
492
  Text,
661
493
  {
662
494
  color: textColor,
@@ -668,22 +500,156 @@ var Select = ({
668
500
  )
669
501
  }
670
502
  ),
671
- /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(Box, { flexDirection: "row", alignItems: "center", gap: 4, children: [
672
- isError && /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
503
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(Box, { flexDirection: "row", alignItems: "center", gap: 4, children: [
504
+ isError && /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
673
505
  Icon,
674
506
  {
675
507
  size: sizeStyles.iconSize,
676
508
  color: theme.colors.content.alert.primary,
677
- children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(import_xui_icons_base.ExclamationMarkCr, {})
509
+ children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(import_xui_icons_base.ExclamationMarkCr, {})
678
510
  }
679
511
  ),
680
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(Icon, { size: sizeStyles.iconSize, color: iconColor, children: iconRight !== void 0 ? iconRight : isFocus ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(import_xui_icons_base.ChevronUp, {}) : /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(import_xui_icons_base.ChevronDown, {}) })
512
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(Icon, { size: sizeStyles.iconSize, color: iconColor, children: iconRight !== void 0 ? iconRight : isFocus ? /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(import_xui_icons_base.ChevronUp, {}) : /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(import_xui_icons_base.ChevronDown, {}) })
681
513
  ] })
682
514
  ]
683
515
  }
684
516
  ),
685
- isNative ? dropdown : /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(Portal, { children: dropdown }),
686
- isError && errorMessage && /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
517
+ isFocus && options.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(
518
+ Box,
519
+ {
520
+ ref: dropdownRef,
521
+ position: "absolute",
522
+ top: sizeStyles.height + (label ? sizeStyles.fontSize + sizeStyles.fieldGap : 0) + sizeStyles.fieldGap,
523
+ width: "100%",
524
+ backgroundColor: theme.colors.background.secondary,
525
+ borderColor: theme.colors.border.secondary,
526
+ borderWidth: 1,
527
+ borderRadius: theme.shape.contextMenu[size].borderRadius,
528
+ style: {
529
+ zIndex: 1e3,
530
+ ...isNative ? { elevation: 4 } : { boxShadow: "0 4px 12px rgba(0,0,0,0.1)" },
531
+ minWidth: iconOnly ? sizeStyles.height * 3 : void 0
532
+ },
533
+ children: [
534
+ searchable && !isNative && /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
535
+ Box,
536
+ {
537
+ paddingHorizontal: sizeStyles.paddingHorizontal,
538
+ paddingVertical: sizeStyles.paddingVertical,
539
+ borderBottomWidth: 1,
540
+ borderColor: theme.colors.border.secondary,
541
+ children: /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(
542
+ Box,
543
+ {
544
+ flexDirection: "row",
545
+ alignItems: "center",
546
+ gap: sizeStyles.paddingHorizontal / 2,
547
+ paddingHorizontal: 4,
548
+ children: [
549
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
550
+ Icon,
551
+ {
552
+ size: sizeStyles.iconSize - 2,
553
+ color: inputColors.placeholder,
554
+ children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(import_xui_icons_base.Search, {})
555
+ }
556
+ ),
557
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
558
+ Box,
559
+ {
560
+ as: "input",
561
+ ref: searchInputRef,
562
+ flex: 1,
563
+ type: "text",
564
+ value: searchValue,
565
+ onChange: (e) => setSearchValue(e.target.value),
566
+ placeholder: searchPlaceholder,
567
+ style: {
568
+ border: "none",
569
+ outline: "none",
570
+ background: "transparent",
571
+ color: inputColors.text,
572
+ fontSize: sizeStyles.fontSize,
573
+ width: "100%"
574
+ }
575
+ }
576
+ )
577
+ ]
578
+ }
579
+ )
580
+ }
581
+ ),
582
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
583
+ Box,
584
+ {
585
+ paddingVertical: 4,
586
+ overflow: "scroll",
587
+ style: {
588
+ maxHeight: searchable ? maxHeight - 60 : maxHeight,
589
+ ...isWeb ? { overflowY: "auto" } : {}
590
+ },
591
+ children: filteredOptions.length === 0 ? /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
592
+ Box,
593
+ {
594
+ paddingVertical: sizeStyles.paddingVertical * 2,
595
+ paddingHorizontal: sizeStyles.paddingHorizontal,
596
+ alignItems: "center",
597
+ children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
598
+ Text,
599
+ {
600
+ color: theme.colors.content.tertiary,
601
+ fontSize: sizeStyles.fontSize,
602
+ children: noOptionsMessage
603
+ }
604
+ )
605
+ }
606
+ ) : filteredOptions.map((option, index) => {
607
+ const optionValue = getOptionValue(option);
608
+ const optionLabel = getOptionLabel(option);
609
+ const isOptionDisabled = getOptionDisabled(option);
610
+ const isSelected = optionValue === selectedValue;
611
+ const brandColors = theme.colors.control.brand.primary;
612
+ const contentColors = theme.colors.content;
613
+ return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
614
+ Box,
615
+ {
616
+ testID,
617
+ ref: isSelected ? selectedItemRef : void 0,
618
+ paddingVertical: sizeStyles.paddingVertical,
619
+ paddingHorizontal: sizeStyles.paddingHorizontal,
620
+ onPress: isOptionDisabled ? void 0 : () => handleSelect(option),
621
+ flexDirection: "row",
622
+ alignItems: "center",
623
+ justifyContent: "space-between",
624
+ backgroundColor: isSelected ? brandColors.bg : "transparent",
625
+ style: {
626
+ ...isWeb ? {
627
+ cursor: isOptionDisabled ? "not-allowed" : "pointer"
628
+ } : {},
629
+ opacity: isOptionDisabled ? 0.5 : 1
630
+ },
631
+ hoverStyle: !isSelected && !isOptionDisabled ? {
632
+ backgroundColor: theme.colors.control.input.bgHover
633
+ } : void 0,
634
+ children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
635
+ Text,
636
+ {
637
+ color: isSelected ? contentColors.on.brand : theme.colors.content.secondary,
638
+ fontSize: sizeStyles.fontSize,
639
+ fontWeight: "400",
640
+ children: optionLabel
641
+ }
642
+ )
643
+ },
644
+ index
645
+ );
646
+ })
647
+ }
648
+ )
649
+ ]
650
+ }
651
+ ),
652
+ isError && errorMessage && /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
687
653
  Text,
688
654
  {
689
655
  color: theme.colors.content.alert.primary,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/index.tsx","../../src/Select.tsx","../../../../foundation/primitives-native/src/Box.tsx","../../../../foundation/primitives-native/src/Text.tsx","../../../../foundation/primitives-native/src/Icon.tsx","../../../../foundation/primitives-native/src/index.tsx","../../src/Portal.native.tsx"],"sourcesContent":["export * from \"./Select\";\n","import React, { useState, useRef, useEffect, useCallback } from \"react\";\n// @ts-expect-error - this will be resolved at build time\nimport { Box, Text, Icon, isWeb, isNative } from \"@xsolla/xui-primitives\";\nimport {\n useModalId,\n useResolvedTheme,\n type ThemeOverrideProps,\n} from \"@xsolla/xui-core\";\nimport {\n ChevronDown,\n ChevronUp,\n ExclamationMarkCr,\n Search as SearchIcon,\n} from \"@xsolla/xui-icons-base\";\nimport { Portal } from \"./Portal\";\n\nexport interface SelectOption {\n label: string;\n value: any;\n disabled?: boolean;\n}\n\nexport interface SelectProps extends ThemeOverrideProps {\n value?: string;\n placeholder?: string;\n onPress?: () => void;\n size?: \"xl\" | \"lg\" | \"md\" | \"sm\" | \"xs\";\n state?: \"default\" | \"hover\" | \"focus\" | \"disable\" | \"error\";\n disabled?: boolean;\n label?: string;\n errorMessage?: string;\n iconLeft?: React.ReactNode;\n iconRight?: React.ReactNode;\n filled?: boolean;\n iconOnly?: boolean;\n options?: (string | SelectOption)[];\n onChange?: (value: string) => void;\n searchable?: boolean;\n searchPlaceholder?: string;\n noOptionsMessage?: string;\n maxHeight?: number;\n /** Whether the select should stretch to fill the full width of its container */\n fullWidth?: boolean;\n /** Test ID for testing frameworks */\n testID?: string;\n}\n\ninterface DropdownPosition {\n left: number;\n top: number;\n width: number;\n}\n\nexport const Select: React.FC<SelectProps> = ({\n value,\n placeholder = \"Select\",\n onPress,\n size = \"md\",\n state: externalState,\n disabled = false,\n label,\n errorMessage,\n iconLeft,\n iconRight,\n filled = true,\n iconOnly = false,\n options = [],\n onChange,\n searchable = false,\n searchPlaceholder = \"Search\",\n noOptionsMessage = \"No results\",\n maxHeight = 300,\n fullWidth = true,\n testID,\n themeMode,\n themeProductContext,\n}) => {\n const { theme } = useResolvedTheme({ themeMode, themeProductContext });\n const modalId = useModalId();\n const [isOpen, setIsOpen] = useState(false);\n const [selectedValue, setSelectedValue] = useState<string | undefined>(value);\n const [searchValue, setSearchValue] = useState(\"\");\n const [dropdownPosition, setDropdownPosition] =\n useState<DropdownPosition | null>(null);\n const containerRef = useRef<HTMLDivElement>(null);\n const triggerRef = useRef<HTMLDivElement>(null);\n const dropdownRef = useRef<HTMLDivElement>(null);\n const selectedItemRef = useRef<HTMLDivElement>(null);\n const searchInputRef = useRef<HTMLInputElement>(null);\n\n // 1. Resolve Config from Theme\n const sizeStyles = theme.sizing.input(size);\n const inputColors = theme.colors.control.input;\n\n const isDisable = externalState === \"disable\" || disabled;\n const isError = externalState === \"error\" || !!errorMessage;\n const isFocus = externalState === \"focus\" || isOpen;\n\n const updateDropdownPosition = useCallback(() => {\n if (!isWeb || !triggerRef.current) return;\n\n const rect = triggerRef.current.getBoundingClientRect();\n setDropdownPosition({\n left: rect.left,\n top: rect.bottom + sizeStyles.fieldGap,\n width: rect.width,\n });\n }, [sizeStyles.fieldGap]);\n\n // Sync selectedValue with value prop\n React.useEffect(() => {\n if (value !== undefined) {\n setSelectedValue(value);\n }\n }, [value]);\n\n // Auto-scroll to selected item when dropdown opens (show at top)\n useEffect(() => {\n if (isFocus && selectedItemRef.current && dropdownRef.current) {\n // Use setTimeout to ensure DOM has rendered\n const timeoutId = setTimeout(() => {\n const selectedItem = selectedItemRef.current;\n if (selectedItem && isWeb) {\n selectedItem.scrollIntoView({ block: \"nearest\" });\n }\n }, 0);\n return () => clearTimeout(timeoutId);\n }\n }, [isFocus]);\n\n useEffect(() => {\n if (!isWeb || !isFocus) return;\n\n updateDropdownPosition();\n window.addEventListener(\"resize\", updateDropdownPosition);\n window.addEventListener(\"scroll\", updateDropdownPosition, true);\n\n return () => {\n window.removeEventListener(\"resize\", updateDropdownPosition);\n window.removeEventListener(\"scroll\", updateDropdownPosition, true);\n };\n }, [isFocus, updateDropdownPosition]);\n\n // Focus search input when dropdown opens\n useEffect(() => {\n if (isFocus && searchable) {\n searchInputRef.current?.focus();\n }\n }, [isFocus, searchable]);\n\n // Reset search when dropdown closes\n useEffect(() => {\n if (!isFocus) {\n setSearchValue(\"\");\n }\n }, [isFocus]);\n\n // Close dropdown when clicking outside (web only)\n useEffect(() => {\n if (isNative || !isOpen) return;\n\n const handleClickOutside = (event: MouseEvent) => {\n const target = event.target as Node;\n if (\n containerRef.current &&\n !containerRef.current.contains(target) &&\n !dropdownRef.current?.contains(target)\n ) {\n setIsOpen(false);\n }\n };\n\n document.addEventListener(\"mousedown\", handleClickOutside);\n return () => document.removeEventListener(\"mousedown\", handleClickOutside);\n }, [isOpen]);\n\n const getOptionLabel = (option: string | SelectOption) => {\n if (typeof option === \"string\") return option;\n return option.label;\n };\n\n const getOptionValue = (option: string | SelectOption) => {\n if (typeof option === \"string\") return option;\n return option.value;\n };\n\n const getOptionDisabled = (option: string | SelectOption) => {\n if (typeof option === \"string\") return false;\n return option.disabled || false;\n };\n\n // Filter options based on search value\n const filteredOptions =\n searchable && searchValue\n ? options.filter((option) => {\n const label = getOptionLabel(option);\n return label.toLowerCase().includes(searchValue.toLowerCase());\n })\n : options;\n\n const handlePress = () => {\n if (!isDisable) {\n if (onPress) onPress();\n setIsOpen(!isOpen);\n }\n };\n\n const handleSelect = (option: string | SelectOption) => {\n if (getOptionDisabled(option)) return;\n const val = getOptionValue(option);\n setSelectedValue(val);\n setIsOpen(false);\n if (onChange) onChange(val);\n };\n\n // Resolve background and border colors based on state\n const isHover = externalState === \"hover\";\n let backgroundColor = inputColors.bg;\n let borderColor = inputColors.border;\n\n if (isDisable) {\n backgroundColor = inputColors.bgDisable;\n borderColor = inputColors.borderDisable;\n } else if (isFocus) {\n backgroundColor = theme.colors.control.focus.bg;\n borderColor = isError\n ? theme.colors.border.alert\n : theme.colors.border.brand;\n } else if (isError) {\n borderColor = theme.colors.border.alert;\n } else if (isHover) {\n backgroundColor = inputColors.bgHover;\n borderColor = inputColors.borderHover;\n }\n\n // Handle filled override if provided\n if (filled === false && !isFocus && !isError && !isHover) {\n backgroundColor = \"transparent\";\n }\n\n const currentLabel = selectedValue\n ? getOptionLabel(\n options.find((o) => getOptionValue(o) === selectedValue) ||\n selectedValue\n )\n : placeholder;\n\n const textColor = isDisable\n ? inputColors.textDisable\n : selectedValue\n ? inputColors.text\n : inputColors.placeholder;\n const iconColor = isDisable ? inputColors.textDisable : inputColors.text;\n const dropdownTop =\n sizeStyles.height +\n (label ? sizeStyles.fontSize + sizeStyles.fieldGap : 0) +\n sizeStyles.fieldGap;\n const dropdown = isFocus &&\n options.length > 0 &&\n (isNative || dropdownPosition) && (\n <Box\n ref={dropdownRef}\n data-modal-id={modalId}\n position={isNative ? \"absolute\" : \"fixed\"}\n top={isNative ? dropdownTop : dropdownPosition?.top}\n left={isNative ? undefined : dropdownPosition?.left}\n width={isNative ? \"100%\" : dropdownPosition?.width}\n backgroundColor={theme.colors.background.secondary}\n borderColor={theme.colors.border.secondary}\n borderWidth={1}\n borderRadius={sizeStyles.radius}\n style={{\n zIndex: 2000,\n ...(isNative\n ? { elevation: 4 }\n : { boxShadow: \"0 4px 12px rgba(0,0,0,0.1)\" }),\n minWidth: iconOnly ? sizeStyles.height * 3 : undefined,\n }}\n >\n {/* Search Input - Outside scrollable area (web only) */}\n {searchable && !isNative && (\n <Box\n paddingHorizontal={sizeStyles.paddingHorizontal}\n paddingVertical={sizeStyles.paddingVertical}\n borderBottomWidth={1}\n borderColor={theme.colors.border.secondary}\n >\n <Box\n flexDirection=\"row\"\n alignItems=\"center\"\n gap={sizeStyles.paddingHorizontal / 2}\n paddingHorizontal={4}\n >\n <Icon\n size={sizeStyles.iconSize - 2}\n color={inputColors.placeholder}\n >\n <SearchIcon />\n </Icon>\n <Box\n as=\"input\"\n ref={searchInputRef}\n flex={1}\n type=\"text\"\n value={searchValue}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) =>\n setSearchValue(e.target.value)\n }\n placeholder={searchPlaceholder}\n style={{\n border: \"none\",\n outline: \"none\",\n background: \"transparent\",\n color: inputColors.text,\n fontSize: sizeStyles.fontSize,\n width: \"100%\",\n }}\n />\n </Box>\n </Box>\n )}\n\n {/* Options List - Scrollable */}\n <Box\n paddingVertical={4}\n overflow=\"scroll\"\n style={{\n maxHeight: searchable ? maxHeight - 60 : maxHeight,\n ...(isWeb ? { overflowY: \"auto\" } : {}),\n }}\n >\n {filteredOptions.length === 0 ? (\n <Box\n paddingVertical={sizeStyles.paddingVertical * 2}\n paddingHorizontal={sizeStyles.paddingHorizontal}\n alignItems=\"center\"\n >\n <Text\n color={theme.colors.content.tertiary}\n fontSize={sizeStyles.fontSize}\n >\n {noOptionsMessage}\n </Text>\n </Box>\n ) : (\n filteredOptions.map((option, index) => {\n const optionValue = getOptionValue(option);\n const optionLabel = getOptionLabel(option);\n const isOptionDisabled = getOptionDisabled(option);\n const isSelected = optionValue === selectedValue;\n const brandColors = theme.colors.control.brand.primary;\n const contentColors = theme.colors.content;\n\n return (\n <Box\n testID={testID}\n key={index}\n ref={isSelected ? selectedItemRef : undefined}\n paddingVertical={sizeStyles.paddingVertical}\n paddingHorizontal={sizeStyles.paddingHorizontal}\n onPress={\n isOptionDisabled ? undefined : () => handleSelect(option)\n }\n flexDirection=\"row\"\n alignItems=\"center\"\n justifyContent=\"space-between\"\n backgroundColor={isSelected ? brandColors.bg : \"transparent\"}\n style={{\n ...(isWeb\n ? {\n cursor: isOptionDisabled ? \"not-allowed\" : \"pointer\",\n }\n : {}),\n opacity: isOptionDisabled ? 0.5 : 1,\n }}\n hoverStyle={\n !isSelected && !isOptionDisabled\n ? {\n backgroundColor: theme.colors.control.input.bgHover,\n }\n : undefined\n }\n >\n <Text\n color={\n isSelected\n ? contentColors.on.brand\n : theme.colors.content.secondary\n }\n fontSize={sizeStyles.fontSize}\n fontWeight=\"400\"\n >\n {optionLabel}\n </Text>\n </Box>\n );\n })\n )}\n </Box>\n </Box>\n );\n\n return (\n <Box\n testID={testID}\n ref={containerRef}\n flexDirection=\"column\"\n gap={sizeStyles.fieldGap}\n width={fullWidth ? \"100%\" : undefined}\n position=\"relative\"\n >\n {label && (\n <Text\n color={theme.colors.content.secondary}\n fontSize={sizeStyles.fontSize - 2}\n fontWeight=\"500\"\n >\n {label}\n </Text>\n )}\n <Box\n ref={triggerRef}\n onPress={handlePress}\n backgroundColor={backgroundColor}\n borderColor={borderColor}\n borderWidth={borderColor !== \"transparent\" ? 1 : 0}\n borderRadius={sizeStyles.radius}\n height={sizeStyles.height}\n width={iconOnly ? sizeStyles.height : \"100%\"}\n paddingHorizontal={iconOnly ? 0 : sizeStyles.paddingHorizontal}\n flexDirection=\"row\"\n alignItems=\"center\"\n justifyContent={iconOnly ? \"center\" : \"flex-start\"}\n gap={iconOnly ? 4 : 12}\n position=\"relative\"\n hoverStyle={\n !isDisable && !isFocus && !isError\n ? {\n backgroundColor: inputColors.bgHover,\n borderColor: inputColors.borderHover,\n }\n : undefined\n }\n >\n {iconLeft && (\n <Box alignItems=\"center\" justifyContent=\"center\">\n <Icon size={sizeStyles.iconSize} color={iconColor}>\n {iconLeft}\n </Icon>\n </Box>\n )}\n\n {!iconOnly && (\n <Box\n flex={1}\n height=\"100%\"\n justifyContent=\"center\"\n overflow=\"hidden\"\n overflowX=\"hidden\"\n >\n <Text\n color={textColor}\n fontSize={sizeStyles.fontSize}\n numberOfLines={1}\n style={{ whiteSpace: \"nowrap\" }}\n >\n {currentLabel}\n </Text>\n </Box>\n )}\n\n {/* Trailing controls */}\n <Box flexDirection=\"row\" alignItems=\"center\" gap={4}>\n {/* Error icon */}\n {isError && (\n <Icon\n size={sizeStyles.iconSize}\n color={theme.colors.content.alert.primary}\n >\n <ExclamationMarkCr />\n </Icon>\n )}\n\n {/* Right icon or default caret */}\n <Icon size={sizeStyles.iconSize} color={iconColor}>\n {iconRight !== undefined ? (\n iconRight\n ) : isFocus ? (\n <ChevronUp />\n ) : (\n <ChevronDown />\n )}\n </Icon>\n </Box>\n </Box>\n\n {/* Dropdown Menu */}\n {isNative ? dropdown : <Portal>{dropdown}</Portal>}\n\n {isError && errorMessage && (\n <Text\n color={theme.colors.content.alert.primary}\n fontSize={sizeStyles.fontSize - 2}\n style={{ lineHeight: sizeStyles.lineHeight + \"px\" }}\n >\n {errorMessage}\n </Text>\n )}\n </Box>\n );\n};\n","import React from \"react\";\nimport {\n View,\n Pressable,\n Image,\n ViewStyle,\n ImageStyle,\n DimensionValue,\n AnimatableNumericValue,\n} from \"react-native\";\nimport { BoxProps } from \"@xsolla/xui-primitives-core\";\n\nexport const Box: React.FC<BoxProps> = ({\n children,\n onPress,\n onLayout,\n onMoveShouldSetResponder,\n onResponderGrant,\n onResponderMove,\n onResponderRelease,\n onResponderTerminate,\n backgroundColor,\n borderColor,\n borderWidth,\n borderBottomWidth,\n borderBottomColor,\n borderTopWidth,\n borderTopColor,\n borderLeftWidth,\n borderLeftColor,\n borderRightWidth,\n borderRightColor,\n borderRadius,\n borderStyle,\n height,\n padding,\n paddingHorizontal,\n paddingVertical,\n margin,\n marginTop,\n marginBottom,\n marginLeft,\n marginRight,\n flexDirection,\n alignItems,\n justifyContent,\n position,\n top,\n bottom,\n left,\n right,\n width,\n minWidth,\n minHeight,\n maxWidth,\n maxHeight,\n flex,\n overflow,\n zIndex,\n hoverStyle,\n pressStyle,\n style,\n \"data-testid\": dataTestId,\n testID,\n as,\n src,\n alt,\n ...rest\n}) => {\n const getContainerStyle = (pressed?: boolean): ViewStyle => ({\n backgroundColor:\n pressed && pressStyle?.backgroundColor\n ? pressStyle.backgroundColor\n : backgroundColor,\n borderColor,\n borderWidth,\n borderBottomWidth,\n borderBottomColor,\n borderTopWidth,\n borderTopColor,\n borderLeftWidth,\n borderLeftColor,\n borderRightWidth,\n borderRightColor,\n borderRadius: borderRadius as AnimatableNumericValue,\n borderStyle: borderStyle as ViewStyle[\"borderStyle\"],\n overflow,\n zIndex,\n height: height as DimensionValue,\n width: width as DimensionValue,\n minWidth: minWidth as DimensionValue,\n minHeight: minHeight as DimensionValue,\n maxWidth: maxWidth as DimensionValue,\n maxHeight: maxHeight as DimensionValue,\n padding: padding as DimensionValue,\n paddingHorizontal: paddingHorizontal as DimensionValue,\n paddingVertical: paddingVertical as DimensionValue,\n margin: margin as DimensionValue,\n marginTop: marginTop as DimensionValue,\n marginBottom: marginBottom as DimensionValue,\n marginLeft: marginLeft as DimensionValue,\n marginRight: marginRight as DimensionValue,\n flexDirection,\n alignItems,\n justifyContent,\n position: position as ViewStyle[\"position\"],\n top: top as DimensionValue,\n bottom: bottom as DimensionValue,\n left: left as DimensionValue,\n right: right as DimensionValue,\n flex,\n ...(style as ViewStyle),\n });\n\n const finalTestID = dataTestId || testID;\n\n // Destructure and drop web-only props from rest before passing to RN components\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const {\n role,\n tabIndex,\n onKeyDown,\n onKeyUp,\n \"aria-label\": _ariaLabel,\n \"aria-labelledby\": _ariaLabelledBy,\n \"aria-current\": _ariaCurrent,\n \"aria-disabled\": _ariaDisabled,\n \"aria-live\": _ariaLive,\n className,\n \"data-testid\": _dataTestId,\n ...nativeRest\n } = rest as Record<string, unknown>;\n\n // Handle as=\"img\" for React Native\n if (as === \"img\" && src) {\n const imageStyle: ImageStyle = {\n width: width as DimensionValue,\n height: height as DimensionValue,\n borderRadius: borderRadius as number,\n position: position as ImageStyle[\"position\"],\n top: top as DimensionValue,\n bottom: bottom as DimensionValue,\n left: left as DimensionValue,\n right: right as DimensionValue,\n ...(style as ImageStyle),\n };\n\n return (\n <Image\n source={{ uri: src }}\n style={imageStyle}\n testID={finalTestID}\n resizeMode=\"cover\"\n {...nativeRest}\n />\n );\n }\n\n if (onPress) {\n return (\n <Pressable\n onPress={onPress}\n onLayout={onLayout}\n onMoveShouldSetResponder={onMoveShouldSetResponder}\n onResponderGrant={onResponderGrant}\n onResponderMove={onResponderMove}\n onResponderRelease={onResponderRelease}\n onResponderTerminate={onResponderTerminate}\n style={({ pressed }) => getContainerStyle(pressed)}\n testID={finalTestID}\n {...nativeRest}\n >\n {children}\n </Pressable>\n );\n }\n\n return (\n <View\n style={getContainerStyle()}\n testID={finalTestID}\n onLayout={onLayout}\n onMoveShouldSetResponder={onMoveShouldSetResponder}\n onResponderGrant={onResponderGrant}\n onResponderMove={onResponderMove}\n onResponderRelease={onResponderRelease}\n onResponderTerminate={onResponderTerminate}\n {...nativeRest}\n >\n {children}\n </View>\n );\n};\n","import React from \"react\";\nimport {\n Text as RNText,\n TextStyle,\n AccessibilityRole,\n StyleSheet,\n} from \"react-native\";\nimport { TextProps } from \"@xsolla/xui-primitives-core\";\n\nconst roleMap: Record<string, AccessibilityRole> = {\n alert: \"alert\",\n heading: \"header\",\n button: \"button\",\n link: \"link\",\n text: \"text\",\n};\n\nconst parseNumericValue = (\n value: string | number | undefined\n): number | undefined => {\n if (value === undefined) return undefined;\n if (typeof value === \"number\") return value;\n const parsed = parseFloat(value);\n return isNaN(parsed) ? undefined : parsed;\n};\n\nexport const Text: React.FC<TextProps> = ({\n children,\n color,\n fontSize,\n fontWeight,\n fontFamily,\n textAlign,\n lineHeight,\n numberOfLines,\n id,\n role,\n testID,\n \"data-testid\": dataTestId,\n style: styleProp,\n ...props\n}) => {\n let resolvedFontFamily = fontFamily\n ? fontFamily.split(\",\")[0].replace(/['\"]/g, \"\").trim()\n : undefined;\n\n if (\n resolvedFontFamily === \"Pilat Wide\" ||\n resolvedFontFamily === \"Pilat Wide Bold\" ||\n resolvedFontFamily === \"Aktiv Grotesk\"\n ) {\n resolvedFontFamily = undefined;\n }\n\n const incomingStyle = StyleSheet.flatten(styleProp) as TextStyle | undefined;\n\n const baseStyle: TextStyle = {\n color: color ?? incomingStyle?.color,\n fontSize: typeof fontSize === \"number\" ? fontSize : undefined,\n fontWeight: fontWeight as TextStyle[\"fontWeight\"],\n fontFamily: resolvedFontFamily,\n textDecorationLine: props.textDecoration as TextStyle[\"textDecorationLine\"],\n textAlign: textAlign ?? incomingStyle?.textAlign,\n lineHeight: parseNumericValue(lineHeight ?? incomingStyle?.lineHeight),\n marginTop: parseNumericValue(\n incomingStyle?.marginTop as number | string | undefined\n ),\n marginBottom: parseNumericValue(\n incomingStyle?.marginBottom as number | string | undefined\n ),\n };\n\n const accessibilityRole = role ? roleMap[role] : undefined;\n\n return (\n <RNText\n style={baseStyle}\n numberOfLines={numberOfLines}\n testID={dataTestId || testID || id}\n accessibilityRole={accessibilityRole}\n >\n {children}\n </RNText>\n );\n};\n","import React from \"react\";\nimport { View, ViewStyle } from \"react-native\";\nimport { IconProps } from \"@xsolla/xui-primitives-core\";\n\nexport const Icon: React.FC<IconProps> = ({\n children,\n color,\n size,\n testID,\n \"data-testid\": dataTestId,\n}) => {\n const style: ViewStyle = {\n width: typeof size === \"number\" ? size : undefined,\n height: typeof size === \"number\" ? size : undefined,\n alignItems: \"center\",\n justifyContent: \"center\",\n };\n\n // On native, we try to pass the color down to children (like Text primitives)\n // to mimic the CSS inheritance behavior of the web version.\n const childrenWithProps = React.Children.map(children, (child) => {\n if (React.isValidElement(child)) {\n return React.cloneElement(child, {\n color: child.props.color || color,\n // Also pass size if child seems to be an icon that needs it\n size: child.props.size || size,\n });\n }\n return child;\n });\n\n return (\n <View style={style} testID={dataTestId || testID}>\n {childrenWithProps}\n </View>\n );\n};\n","export * from \"./Box\";\nexport * from \"./Text\";\nexport * from \"./Spinner\";\nexport * from \"./Icon\";\nexport * from \"./Divider\";\nexport * from \"./Input\";\nexport * from \"./TextArea\";\nexport * from \"./LinearGradient\";\n\nexport const isWeb = false;\nexport const isNative = true;\n","import { ReactNode } from \"react\";\n\ninterface PortalProps {\n children: ReactNode;\n}\n\nexport const Portal = ({ children }: PortalProps) => <>{children}</>;\n"],"mappings":"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","names":["import_react","import_react_native","import_jsx_runtime","RNText","import_react_native","import_jsx_runtime","React","import_jsx_runtime","import_jsx_runtime","React","label","SearchIcon"]}
1
+ {"version":3,"sources":["../../src/index.tsx","../../src/Select.tsx","../../../../foundation/primitives-native/src/Box.tsx","../../../../foundation/primitives-native/src/Text.tsx","../../../../foundation/primitives-native/src/Icon.tsx","../../../../foundation/primitives-native/src/index.tsx"],"sourcesContent":["export * from \"./Select\";\n","import React, { useState, useRef, useEffect } from \"react\";\n// @ts-expect-error - this will be resolved at build time\nimport { Box, Text, Icon, isWeb, isNative } from \"@xsolla/xui-primitives\";\nimport { useResolvedTheme, type ThemeOverrideProps } from \"@xsolla/xui-core\";\nimport {\n ChevronDown,\n ChevronUp,\n ExclamationMarkCr,\n Search as SearchIcon,\n} from \"@xsolla/xui-icons-base\";\n\nexport interface SelectOption {\n label: string;\n value: any;\n disabled?: boolean;\n}\n\nexport interface SelectProps extends ThemeOverrideProps {\n value?: string;\n placeholder?: string;\n onPress?: () => void;\n size?: \"xl\" | \"lg\" | \"md\" | \"sm\" | \"xs\";\n state?: \"default\" | \"hover\" | \"focus\" | \"disable\" | \"error\";\n disabled?: boolean;\n label?: string;\n errorMessage?: string;\n iconLeft?: React.ReactNode;\n iconRight?: React.ReactNode;\n filled?: boolean;\n iconOnly?: boolean;\n options?: (string | SelectOption)[];\n onChange?: (value: string) => void;\n searchable?: boolean;\n searchPlaceholder?: string;\n noOptionsMessage?: string;\n maxHeight?: number;\n /** Whether the select should stretch to fill the full width of its container */\n fullWidth?: boolean;\n /** Test ID for testing frameworks */\n testID?: string;\n}\n\nexport const Select: React.FC<SelectProps> = ({\n value,\n placeholder = \"Select\",\n onPress,\n size = \"md\",\n state: externalState,\n disabled = false,\n label,\n errorMessage,\n iconLeft,\n iconRight,\n filled = true,\n iconOnly = false,\n options = [],\n onChange,\n searchable = false,\n searchPlaceholder = \"Search\",\n noOptionsMessage = \"No results\",\n maxHeight = 300,\n fullWidth = true,\n testID,\n themeMode,\n themeProductContext,\n}) => {\n const { theme } = useResolvedTheme({ themeMode, themeProductContext });\n const [isOpen, setIsOpen] = useState(false);\n const [selectedValue, setSelectedValue] = useState<string | undefined>(value);\n const [searchValue, setSearchValue] = useState(\"\");\n const containerRef = useRef<HTMLDivElement>(null);\n const dropdownRef = useRef<HTMLDivElement>(null);\n const selectedItemRef = useRef<HTMLDivElement>(null);\n const searchInputRef = useRef<HTMLInputElement>(null);\n\n const isDisable = externalState === \"disable\" || disabled;\n const isError = externalState === \"error\" || !!errorMessage;\n const isFocus = externalState === \"focus\" || isOpen;\n\n // Sync selectedValue with value prop\n React.useEffect(() => {\n if (value !== undefined) {\n setSelectedValue(value);\n }\n }, [value]);\n\n // Auto-scroll to selected item when dropdown opens (show at top)\n useEffect(() => {\n if (isFocus && selectedItemRef.current && dropdownRef.current) {\n // Use setTimeout to ensure DOM has rendered\n const timeoutId = setTimeout(() => {\n const selectedItem = selectedItemRef.current;\n if (selectedItem && isWeb) {\n selectedItem.scrollIntoView({ block: \"nearest\" });\n }\n }, 0);\n return () => clearTimeout(timeoutId);\n }\n }, [isFocus]);\n\n // Focus search input when dropdown opens\n useEffect(() => {\n if (isFocus && searchable) {\n searchInputRef.current?.focus();\n }\n }, [isFocus, searchable]);\n\n // Reset search when dropdown closes\n useEffect(() => {\n if (!isFocus) {\n setSearchValue(\"\");\n }\n }, [isFocus]);\n\n // Close dropdown when clicking outside (web only)\n useEffect(() => {\n if (isNative || !isOpen) return;\n\n const handleClickOutside = (event: MouseEvent) => {\n if (\n containerRef.current &&\n !containerRef.current.contains(event.target as Node)\n ) {\n setIsOpen(false);\n }\n };\n\n document.addEventListener(\"mousedown\", handleClickOutside);\n return () => document.removeEventListener(\"mousedown\", handleClickOutside);\n }, [isOpen]);\n\n const getOptionLabel = (option: string | SelectOption) => {\n if (typeof option === \"string\") return option;\n return option.label;\n };\n\n const getOptionValue = (option: string | SelectOption) => {\n if (typeof option === \"string\") return option;\n return option.value;\n };\n\n const getOptionDisabled = (option: string | SelectOption) => {\n if (typeof option === \"string\") return false;\n return option.disabled || false;\n };\n\n // Filter options based on search value\n const filteredOptions =\n searchable && searchValue\n ? options.filter((option) => {\n const label = getOptionLabel(option);\n return label.toLowerCase().includes(searchValue.toLowerCase());\n })\n : options;\n\n // 1. Resolve Config from Theme\n const sizeStyles = theme.sizing.input(size);\n const inputColors = theme.colors.control.input;\n\n const handlePress = () => {\n if (!isDisable) {\n if (onPress) onPress();\n setIsOpen(!isOpen);\n }\n };\n\n const handleSelect = (option: string | SelectOption) => {\n if (getOptionDisabled(option)) return;\n const val = getOptionValue(option);\n setSelectedValue(val);\n setIsOpen(false);\n if (onChange) onChange(val);\n };\n\n // Resolve background and border colors based on state\n const isHover = externalState === \"hover\";\n let backgroundColor = inputColors.bg;\n let borderColor = inputColors.border;\n\n if (isDisable) {\n backgroundColor = inputColors.bgDisable;\n borderColor = inputColors.borderDisable;\n } else if (isFocus) {\n backgroundColor = theme.colors.control.focus.bg;\n borderColor = isError\n ? theme.colors.border.alert\n : theme.colors.border.brand;\n } else if (isError) {\n borderColor = theme.colors.border.alert;\n } else if (isHover) {\n backgroundColor = inputColors.bgHover;\n borderColor = inputColors.borderHover;\n }\n\n // Handle filled override if provided\n if (filled === false && !isFocus && !isError && !isHover) {\n backgroundColor = \"transparent\";\n }\n\n const currentLabel = selectedValue\n ? getOptionLabel(\n options.find((o) => getOptionValue(o) === selectedValue) ||\n selectedValue\n )\n : placeholder;\n\n const textColor = isDisable\n ? inputColors.textDisable\n : selectedValue\n ? inputColors.text\n : inputColors.placeholder;\n const iconColor = isDisable ? inputColors.textDisable : inputColors.text;\n\n return (\n <Box\n testID={testID}\n ref={containerRef}\n flexDirection=\"column\"\n gap={sizeStyles.fieldGap}\n width={fullWidth ? \"100%\" : undefined}\n position=\"relative\"\n >\n {label && (\n <Text\n color={theme.colors.content.secondary}\n fontSize={sizeStyles.fontSize - 2}\n fontWeight=\"500\"\n >\n {label}\n </Text>\n )}\n <Box\n onPress={handlePress}\n backgroundColor={backgroundColor}\n borderColor={borderColor}\n borderWidth={borderColor !== \"transparent\" ? 1 : 0}\n borderRadius={sizeStyles.radius}\n height={sizeStyles.height}\n width={iconOnly ? sizeStyles.height : \"100%\"}\n paddingHorizontal={iconOnly ? 0 : sizeStyles.paddingHorizontal}\n flexDirection=\"row\"\n alignItems=\"center\"\n justifyContent={iconOnly ? \"center\" : \"flex-start\"}\n gap={iconOnly ? 4 : 12}\n position=\"relative\"\n hoverStyle={\n !isDisable && !isFocus && !isError\n ? {\n backgroundColor: inputColors.bgHover,\n borderColor: inputColors.borderHover,\n }\n : undefined\n }\n >\n {iconLeft && (\n <Box alignItems=\"center\" justifyContent=\"center\">\n <Icon size={sizeStyles.iconSize} color={iconColor}>\n {iconLeft}\n </Icon>\n </Box>\n )}\n\n {!iconOnly && (\n <Box\n flex={1}\n height=\"100%\"\n justifyContent=\"center\"\n overflow=\"hidden\"\n overflowX=\"hidden\"\n >\n <Text\n color={textColor}\n fontSize={sizeStyles.fontSize}\n numberOfLines={1}\n style={{ whiteSpace: \"nowrap\" }}\n >\n {currentLabel}\n </Text>\n </Box>\n )}\n\n {/* Trailing controls */}\n <Box flexDirection=\"row\" alignItems=\"center\" gap={4}>\n {/* Error icon */}\n {isError && (\n <Icon\n size={sizeStyles.iconSize}\n color={theme.colors.content.alert.primary}\n >\n <ExclamationMarkCr />\n </Icon>\n )}\n\n {/* Right icon or default caret */}\n <Icon size={sizeStyles.iconSize} color={iconColor}>\n {iconRight !== undefined ? (\n iconRight\n ) : isFocus ? (\n <ChevronUp />\n ) : (\n <ChevronDown />\n )}\n </Icon>\n </Box>\n </Box>\n\n {/* Dropdown Menu */}\n {isFocus && options.length > 0 && (\n <Box\n ref={dropdownRef}\n position=\"absolute\"\n top={\n sizeStyles.height +\n (label ? sizeStyles.fontSize + sizeStyles.fieldGap : 0) +\n sizeStyles.fieldGap\n }\n width=\"100%\"\n backgroundColor={theme.colors.background.secondary}\n borderColor={theme.colors.border.secondary}\n borderWidth={1}\n borderRadius={theme.shape.contextMenu[size].borderRadius}\n style={{\n zIndex: 1000,\n ...(isNative\n ? { elevation: 4 }\n : { boxShadow: \"0 4px 12px rgba(0,0,0,0.1)\" }),\n minWidth: iconOnly ? sizeStyles.height * 3 : undefined,\n }}\n >\n {/* Search Input - Outside scrollable area (web only) */}\n {searchable && !isNative && (\n <Box\n paddingHorizontal={sizeStyles.paddingHorizontal}\n paddingVertical={sizeStyles.paddingVertical}\n borderBottomWidth={1}\n borderColor={theme.colors.border.secondary}\n >\n <Box\n flexDirection=\"row\"\n alignItems=\"center\"\n gap={sizeStyles.paddingHorizontal / 2}\n paddingHorizontal={4}\n >\n <Icon\n size={sizeStyles.iconSize - 2}\n color={inputColors.placeholder}\n >\n <SearchIcon />\n </Icon>\n <Box\n as=\"input\"\n ref={searchInputRef}\n flex={1}\n type=\"text\"\n value={searchValue}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) =>\n setSearchValue(e.target.value)\n }\n placeholder={searchPlaceholder}\n style={{\n border: \"none\",\n outline: \"none\",\n background: \"transparent\",\n color: inputColors.text,\n fontSize: sizeStyles.fontSize,\n width: \"100%\",\n }}\n />\n </Box>\n </Box>\n )}\n\n {/* Options List - Scrollable */}\n <Box\n paddingVertical={4}\n overflow=\"scroll\"\n style={{\n maxHeight: searchable ? maxHeight - 60 : maxHeight,\n ...(isWeb ? { overflowY: \"auto\" } : {}),\n }}\n >\n {filteredOptions.length === 0 ? (\n <Box\n paddingVertical={sizeStyles.paddingVertical * 2}\n paddingHorizontal={sizeStyles.paddingHorizontal}\n alignItems=\"center\"\n >\n <Text\n color={theme.colors.content.tertiary}\n fontSize={sizeStyles.fontSize}\n >\n {noOptionsMessage}\n </Text>\n </Box>\n ) : (\n filteredOptions.map((option, index) => {\n const optionValue = getOptionValue(option);\n const optionLabel = getOptionLabel(option);\n const isOptionDisabled = getOptionDisabled(option);\n const isSelected = optionValue === selectedValue;\n const brandColors = theme.colors.control.brand.primary;\n const contentColors = theme.colors.content;\n\n return (\n <Box\n testID={testID}\n key={index}\n ref={isSelected ? selectedItemRef : undefined}\n paddingVertical={sizeStyles.paddingVertical}\n paddingHorizontal={sizeStyles.paddingHorizontal}\n onPress={\n isOptionDisabled ? undefined : () => handleSelect(option)\n }\n flexDirection=\"row\"\n alignItems=\"center\"\n justifyContent=\"space-between\"\n backgroundColor={\n isSelected ? brandColors.bg : \"transparent\"\n }\n style={{\n ...(isWeb\n ? {\n cursor: isOptionDisabled\n ? \"not-allowed\"\n : \"pointer\",\n }\n : {}),\n opacity: isOptionDisabled ? 0.5 : 1,\n }}\n hoverStyle={\n !isSelected && !isOptionDisabled\n ? {\n backgroundColor: theme.colors.control.input.bgHover,\n }\n : undefined\n }\n >\n <Text\n color={\n isSelected\n ? contentColors.on.brand\n : theme.colors.content.secondary\n }\n fontSize={sizeStyles.fontSize}\n fontWeight=\"400\"\n >\n {optionLabel}\n </Text>\n </Box>\n );\n })\n )}\n </Box>\n </Box>\n )}\n\n {isError && errorMessage && (\n <Text\n color={theme.colors.content.alert.primary}\n fontSize={sizeStyles.fontSize - 2}\n style={{ lineHeight: sizeStyles.lineHeight + \"px\" }}\n >\n {errorMessage}\n </Text>\n )}\n </Box>\n );\n};\n","import React from \"react\";\nimport {\n View,\n Pressable,\n Image,\n ViewStyle,\n ImageStyle,\n DimensionValue,\n AnimatableNumericValue,\n} from \"react-native\";\nimport { BoxProps } from \"@xsolla/xui-primitives-core\";\n\nexport const Box: React.FC<BoxProps> = ({\n children,\n onPress,\n onLayout,\n onMoveShouldSetResponder,\n onResponderGrant,\n onResponderMove,\n onResponderRelease,\n onResponderTerminate,\n backgroundColor,\n borderColor,\n borderWidth,\n borderBottomWidth,\n borderBottomColor,\n borderTopWidth,\n borderTopColor,\n borderLeftWidth,\n borderLeftColor,\n borderRightWidth,\n borderRightColor,\n borderRadius,\n borderStyle,\n height,\n padding,\n paddingHorizontal,\n paddingVertical,\n margin,\n marginTop,\n marginBottom,\n marginLeft,\n marginRight,\n flexDirection,\n alignItems,\n justifyContent,\n position,\n top,\n bottom,\n left,\n right,\n width,\n minWidth,\n minHeight,\n maxWidth,\n maxHeight,\n flex,\n overflow,\n zIndex,\n hoverStyle,\n pressStyle,\n style,\n \"data-testid\": dataTestId,\n testID,\n as,\n src,\n alt,\n ...rest\n}) => {\n const getContainerStyle = (pressed?: boolean): ViewStyle => ({\n backgroundColor:\n pressed && pressStyle?.backgroundColor\n ? pressStyle.backgroundColor\n : backgroundColor,\n borderColor,\n borderWidth,\n borderBottomWidth,\n borderBottomColor,\n borderTopWidth,\n borderTopColor,\n borderLeftWidth,\n borderLeftColor,\n borderRightWidth,\n borderRightColor,\n borderRadius: borderRadius as AnimatableNumericValue,\n borderStyle: borderStyle as ViewStyle[\"borderStyle\"],\n overflow,\n zIndex,\n height: height as DimensionValue,\n width: width as DimensionValue,\n minWidth: minWidth as DimensionValue,\n minHeight: minHeight as DimensionValue,\n maxWidth: maxWidth as DimensionValue,\n maxHeight: maxHeight as DimensionValue,\n padding: padding as DimensionValue,\n paddingHorizontal: paddingHorizontal as DimensionValue,\n paddingVertical: paddingVertical as DimensionValue,\n margin: margin as DimensionValue,\n marginTop: marginTop as DimensionValue,\n marginBottom: marginBottom as DimensionValue,\n marginLeft: marginLeft as DimensionValue,\n marginRight: marginRight as DimensionValue,\n flexDirection,\n alignItems,\n justifyContent,\n position: position as ViewStyle[\"position\"],\n top: top as DimensionValue,\n bottom: bottom as DimensionValue,\n left: left as DimensionValue,\n right: right as DimensionValue,\n flex,\n ...(style as ViewStyle),\n });\n\n const finalTestID = dataTestId || testID;\n\n // Destructure and drop web-only props from rest before passing to RN components\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const {\n role,\n tabIndex,\n onKeyDown,\n onKeyUp,\n \"aria-label\": _ariaLabel,\n \"aria-labelledby\": _ariaLabelledBy,\n \"aria-current\": _ariaCurrent,\n \"aria-disabled\": _ariaDisabled,\n \"aria-live\": _ariaLive,\n className,\n \"data-testid\": _dataTestId,\n ...nativeRest\n } = rest as Record<string, unknown>;\n\n // Handle as=\"img\" for React Native\n if (as === \"img\" && src) {\n const imageStyle: ImageStyle = {\n width: width as DimensionValue,\n height: height as DimensionValue,\n borderRadius: borderRadius as number,\n position: position as ImageStyle[\"position\"],\n top: top as DimensionValue,\n bottom: bottom as DimensionValue,\n left: left as DimensionValue,\n right: right as DimensionValue,\n ...(style as ImageStyle),\n };\n\n return (\n <Image\n source={{ uri: src }}\n style={imageStyle}\n testID={finalTestID}\n resizeMode=\"cover\"\n {...nativeRest}\n />\n );\n }\n\n if (onPress) {\n return (\n <Pressable\n onPress={onPress}\n onLayout={onLayout}\n onMoveShouldSetResponder={onMoveShouldSetResponder}\n onResponderGrant={onResponderGrant}\n onResponderMove={onResponderMove}\n onResponderRelease={onResponderRelease}\n onResponderTerminate={onResponderTerminate}\n style={({ pressed }) => getContainerStyle(pressed)}\n testID={finalTestID}\n {...nativeRest}\n >\n {children}\n </Pressable>\n );\n }\n\n return (\n <View\n style={getContainerStyle()}\n testID={finalTestID}\n onLayout={onLayout}\n onMoveShouldSetResponder={onMoveShouldSetResponder}\n onResponderGrant={onResponderGrant}\n onResponderMove={onResponderMove}\n onResponderRelease={onResponderRelease}\n onResponderTerminate={onResponderTerminate}\n {...nativeRest}\n >\n {children}\n </View>\n );\n};\n","import React from \"react\";\nimport {\n Text as RNText,\n TextStyle,\n AccessibilityRole,\n StyleSheet,\n} from \"react-native\";\nimport { TextProps } from \"@xsolla/xui-primitives-core\";\n\nconst roleMap: Record<string, AccessibilityRole> = {\n alert: \"alert\",\n heading: \"header\",\n button: \"button\",\n link: \"link\",\n text: \"text\",\n};\n\nconst parseNumericValue = (\n value: string | number | undefined\n): number | undefined => {\n if (value === undefined) return undefined;\n if (typeof value === \"number\") return value;\n const parsed = parseFloat(value);\n return isNaN(parsed) ? undefined : parsed;\n};\n\nexport const Text: React.FC<TextProps> = ({\n children,\n color,\n fontSize,\n fontWeight,\n fontFamily,\n textAlign,\n lineHeight,\n numberOfLines,\n id,\n role,\n testID,\n \"data-testid\": dataTestId,\n style: styleProp,\n ...props\n}) => {\n let resolvedFontFamily = fontFamily\n ? fontFamily.split(\",\")[0].replace(/['\"]/g, \"\").trim()\n : undefined;\n\n if (\n resolvedFontFamily === \"Pilat Wide\" ||\n resolvedFontFamily === \"Pilat Wide Bold\" ||\n resolvedFontFamily === \"Aktiv Grotesk\"\n ) {\n resolvedFontFamily = undefined;\n }\n\n const incomingStyle = StyleSheet.flatten(styleProp) as TextStyle | undefined;\n\n const baseStyle: TextStyle = {\n color: color ?? incomingStyle?.color,\n fontSize: typeof fontSize === \"number\" ? fontSize : undefined,\n fontWeight: fontWeight as TextStyle[\"fontWeight\"],\n fontFamily: resolvedFontFamily,\n textDecorationLine: props.textDecoration as TextStyle[\"textDecorationLine\"],\n textAlign: textAlign ?? incomingStyle?.textAlign,\n lineHeight: parseNumericValue(lineHeight ?? incomingStyle?.lineHeight),\n marginTop: parseNumericValue(\n incomingStyle?.marginTop as number | string | undefined\n ),\n marginBottom: parseNumericValue(\n incomingStyle?.marginBottom as number | string | undefined\n ),\n };\n\n const accessibilityRole = role ? roleMap[role] : undefined;\n\n return (\n <RNText\n style={baseStyle}\n numberOfLines={numberOfLines}\n testID={dataTestId || testID || id}\n accessibilityRole={accessibilityRole}\n >\n {children}\n </RNText>\n );\n};\n","import React from \"react\";\nimport { View, ViewStyle } from \"react-native\";\nimport { IconProps } from \"@xsolla/xui-primitives-core\";\n\nexport const Icon: React.FC<IconProps> = ({\n children,\n color,\n size,\n testID,\n \"data-testid\": dataTestId,\n}) => {\n const style: ViewStyle = {\n width: typeof size === \"number\" ? size : undefined,\n height: typeof size === \"number\" ? size : undefined,\n alignItems: \"center\",\n justifyContent: \"center\",\n };\n\n // On native, we try to pass the color down to children (like Text primitives)\n // to mimic the CSS inheritance behavior of the web version.\n const childrenWithProps = React.Children.map(children, (child) => {\n if (React.isValidElement(child)) {\n return React.cloneElement(child, {\n color: child.props.color || color,\n // Also pass size if child seems to be an icon that needs it\n size: child.props.size || size,\n });\n }\n return child;\n });\n\n return (\n <View style={style} testID={dataTestId || testID}>\n {childrenWithProps}\n </View>\n );\n};\n","export * from \"./Box\";\nexport * from \"./Text\";\nexport * from \"./Spinner\";\nexport * from \"./Icon\";\nexport * from \"./Divider\";\nexport * from \"./Input\";\nexport * from \"./TextArea\";\nexport * from \"./LinearGradient\";\n\nexport const isWeb = false;\nexport const isNative = true;\n"],"mappings":"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","names":["import_react","import_react_native","import_jsx_runtime","RNText","import_react_native","import_jsx_runtime","React","import_jsx_runtime","React","label","SearchIcon"]}