@xsolla/xui-toggletip 0.64.0-pr78.1768542245 → 0.64.0-pr79.1768551885

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.
@@ -1,6 +1,6 @@
1
- import React, { ReactNode } from 'react';
1
+ import React, { ReactNode, CSSProperties } from 'react';
2
2
 
3
- type ToggletipPlacement = "top" | "top-left" | "top-right" | "bottom" | "bottom-left" | "bottom-right" | "left" | "right";
3
+ type ToggletipPlacement = "center" | "bottom-start" | "bottom-center" | "bottom-end" | "top-start" | "top-center" | "top-end" | "left-end" | "left-center" | "left-start" | "right-end" | "right-center" | "right-start";
4
4
  interface ToggletipProps {
5
5
  /**
6
6
  * Trigger element.
@@ -25,7 +25,7 @@ interface ToggletipProps {
25
25
  width?: string;
26
26
  /**
27
27
  * Placement relative to control.
28
- * @default "top"
28
+ * @default "top-center"
29
29
  */
30
30
  direction?: ToggletipPlacement;
31
31
  /**
@@ -37,6 +37,9 @@ interface ToggletipProps {
37
37
  * @default 12
38
38
  */
39
39
  offset?: number;
40
+ style?: CSSProperties;
41
+ "data-testid"?: string;
42
+ className?: string;
40
43
  }
41
44
 
42
45
  declare const Toggletip: React.ForwardRefExoticComponent<ToggletipProps & React.RefAttributes<any>>;
package/native/index.d.ts CHANGED
@@ -1,6 +1,6 @@
1
- import React, { ReactNode } from 'react';
1
+ import React, { ReactNode, CSSProperties } from 'react';
2
2
 
3
- type ToggletipPlacement = "top" | "top-left" | "top-right" | "bottom" | "bottom-left" | "bottom-right" | "left" | "right";
3
+ type ToggletipPlacement = "center" | "bottom-start" | "bottom-center" | "bottom-end" | "top-start" | "top-center" | "top-end" | "left-end" | "left-center" | "left-start" | "right-end" | "right-center" | "right-start";
4
4
  interface ToggletipProps {
5
5
  /**
6
6
  * Trigger element.
@@ -25,7 +25,7 @@ interface ToggletipProps {
25
25
  width?: string;
26
26
  /**
27
27
  * Placement relative to control.
28
- * @default "top"
28
+ * @default "top-center"
29
29
  */
30
30
  direction?: ToggletipPlacement;
31
31
  /**
@@ -37,6 +37,9 @@ interface ToggletipProps {
37
37
  * @default 12
38
38
  */
39
39
  offset?: number;
40
+ style?: CSSProperties;
41
+ "data-testid"?: string;
42
+ className?: string;
40
43
  }
41
44
 
42
45
  declare const Toggletip: React.ForwardRefExoticComponent<ToggletipProps & React.RefAttributes<any>>;
package/native/index.js CHANGED
@@ -35,7 +35,7 @@ __export(index_exports, {
35
35
  module.exports = __toCommonJS(index_exports);
36
36
 
37
37
  // src/Toggletip.tsx
38
- var import_react5 = require("react");
38
+ var import_react4 = require("react");
39
39
 
40
40
  // ../primitives-native/src/Box.tsx
41
41
  var import_react_native = require("react-native");
@@ -519,187 +519,50 @@ TextAreaPrimitive.displayName = "TextAreaPrimitive";
519
519
 
520
520
  // src/Toggletip.tsx
521
521
  var import_xui_core = require("@xsolla/xui-core");
522
-
523
- // src/useToggletip.ts
524
- var import_react4 = require("react");
525
- var getScrollParent = (element) => {
526
- if (!element || element === document.body) {
527
- return document.body;
528
- }
529
- const { overflow, overflowX, overflowY } = window.getComputedStyle(element);
530
- const isScrollable = /(auto|scroll)/.test(overflow) || /(auto|scroll)/.test(overflowX) || /(auto|scroll)/.test(overflowY);
531
- if (isScrollable && (element.scrollHeight > element.clientHeight || element.scrollWidth > element.clientWidth)) {
532
- return element;
533
- }
534
- return getScrollParent(element.parentElement);
535
- };
536
- var getViewportBounds = (triggerElement) => {
537
- const scrollParent = getScrollParent(triggerElement);
538
- if (scrollParent === document.body) {
539
- return {
540
- top: 0,
541
- left: 0,
542
- right: window.visualViewport?.width || window.innerWidth,
543
- bottom: window.visualViewport?.height || window.innerHeight,
544
- width: window.visualViewport?.width || window.innerWidth,
545
- height: window.visualViewport?.height || window.innerHeight
546
- };
547
- }
548
- const rect = scrollParent.getBoundingClientRect();
549
- return {
550
- top: rect.top,
551
- left: rect.left,
552
- right: rect.right,
553
- bottom: rect.bottom,
554
- width: rect.width,
555
- height: rect.height
556
- };
557
- };
558
- var checkCollision = (triggerRect, toggletipRect, placement, offset, triggerElement) => {
559
- const viewport = getViewportBounds(triggerElement);
560
- const buffer = 10;
561
- const space = {
562
- top: triggerRect.top - viewport.top,
563
- bottom: viewport.bottom - triggerRect.bottom,
564
- left: triggerRect.left - viewport.left,
565
- right: viewport.right - triggerRect.right
566
- };
567
- const triggerCenterY = triggerRect.top + triggerRect.height / 2;
568
- const triggerCenterX = triggerRect.left + triggerRect.width / 2;
569
- const fits = {
570
- top: space.top >= toggletipRect.height + offset + buffer && triggerCenterX - toggletipRect.width / 2 >= viewport.left + buffer && triggerCenterX + toggletipRect.width / 2 <= viewport.right - buffer,
571
- bottom: space.bottom >= toggletipRect.height + offset + buffer && triggerCenterX - toggletipRect.width / 2 >= viewport.left + buffer && triggerCenterX + toggletipRect.width / 2 <= viewport.right - buffer,
572
- left: space.left >= toggletipRect.width + offset + buffer && triggerCenterY - toggletipRect.height / 2 >= viewport.top + buffer && triggerCenterY + toggletipRect.height / 2 <= viewport.bottom - buffer,
573
- right: space.right >= toggletipRect.width + offset + buffer && triggerCenterY - toggletipRect.height / 2 >= viewport.top + buffer && triggerCenterY + toggletipRect.height / 2 <= viewport.bottom - buffer
574
- };
575
- const [primary, secondary] = placement.split("-");
576
- const primaryFits = fits[primary];
577
- if (primaryFits) {
578
- return placement;
579
- }
580
- const opposites = {
581
- top: "bottom",
582
- bottom: "top",
583
- left: "right",
584
- right: "left"
585
- };
586
- const opposite = opposites[primary];
587
- if (opposite && fits[opposite]) {
588
- return secondary ? `${opposite}-${secondary}` : opposite;
589
- }
590
- const perpendicular = primary === "top" || primary === "bottom" ? ["right", "left"] : ["bottom", "top"];
591
- for (const dir of perpendicular) {
592
- if (fits[dir]) {
593
- return dir;
594
- }
595
- }
596
- const best = Object.entries(space).sort(([, a], [, b]) => b - a)[0];
597
- return best[0];
598
- };
599
- var useToggletip = ({
600
- open,
601
- direction,
602
- offset,
603
- autoDirection = true
604
- }) => {
605
- const [newDirection, setNewDirection] = (0, import_react4.useState)(direction);
606
- const referenceRef = (0, import_react4.useRef)(null);
607
- const floatingRef = (0, import_react4.useRef)(null);
608
- const setReference = (0, import_react4.useCallback)((node) => {
609
- referenceRef.current = node;
610
- }, []);
611
- const setFloating = (0, import_react4.useCallback)((node) => {
612
- floatingRef.current = node;
613
- }, []);
614
- (0, import_react4.useLayoutEffect)(() => {
615
- if (!open || !autoDirection || !referenceRef.current || !floatingRef.current) {
616
- return;
617
- }
618
- let rafId = null;
619
- const updatePlacement = () => {
620
- rafId = null;
621
- if (!referenceRef.current || !floatingRef.current) return;
622
- const triggerRect = referenceRef.current.getBoundingClientRect();
623
- const toggletipRect = floatingRef.current.getBoundingClientRect();
624
- const calculatedDirection = checkCollision(
625
- triggerRect,
626
- toggletipRect,
627
- direction,
628
- offset,
629
- referenceRef.current
630
- );
631
- setNewDirection((prev) => {
632
- if (prev === calculatedDirection) return prev;
633
- return calculatedDirection;
634
- });
635
- };
636
- const scheduleUpdate = () => {
637
- if (rafId != null) return;
638
- rafId = requestAnimationFrame(updatePlacement);
639
- };
640
- updatePlacement();
641
- window.addEventListener("scroll", scheduleUpdate, true);
642
- window.addEventListener("resize", scheduleUpdate);
643
- const resizeObserver = new ResizeObserver(scheduleUpdate);
644
- resizeObserver.observe(referenceRef.current);
645
- resizeObserver.observe(floatingRef.current);
646
- return () => {
647
- if (rafId != null) cancelAnimationFrame(rafId);
648
- window.removeEventListener("scroll", scheduleUpdate, true);
649
- window.removeEventListener("resize", scheduleUpdate);
650
- resizeObserver.disconnect();
651
- };
652
- }, [open, autoDirection, direction, offset]);
653
- (0, import_react4.useLayoutEffect)(() => {
654
- if (!open) {
655
- setNewDirection(direction);
656
- }
657
- }, [open, direction]);
658
- return {
659
- refs: {
660
- setReference,
661
- setFloating
662
- },
663
- direction: newDirection
664
- };
665
- };
666
-
667
- // src/Toggletip.tsx
668
522
  var import_jsx_runtime8 = require("react/jsx-runtime");
669
523
  var getPositionStyles = (placement, offset) => {
670
524
  switch (placement) {
671
- case "bottom":
525
+ case "bottom-center":
526
+ case "center":
672
527
  return {
673
528
  top: `calc(100% + ${offset}px)`,
674
529
  left: "50%",
675
530
  transform: "translateX(-50%)"
676
531
  };
677
- case "bottom-left":
532
+ case "bottom-start":
678
533
  return { top: `calc(100% + ${offset}px)`, left: 0 };
679
- case "bottom-right":
534
+ case "bottom-end":
680
535
  return { top: `calc(100% + ${offset}px)`, right: 0 };
681
- case "top":
536
+ case "top-center":
682
537
  return {
683
538
  bottom: `calc(100% + ${offset}px)`,
684
539
  left: "50%",
685
540
  transform: "translateX(-50%)"
686
541
  };
687
- case "top-left":
542
+ case "top-start":
688
543
  return { bottom: `calc(100% + ${offset}px)`, left: 0 };
689
- case "top-right":
544
+ case "top-end":
690
545
  return { bottom: `calc(100% + ${offset}px)`, right: 0 };
691
- case "left":
546
+ case "left-center":
692
547
  return {
693
548
  right: `calc(100% + ${offset}px)`,
694
549
  top: "50%",
695
550
  transform: "translateY(-50%)"
696
551
  };
697
- case "right":
552
+ case "left-start":
553
+ return { right: `calc(100% + ${offset}px)`, top: 0 };
554
+ case "left-end":
555
+ return { right: `calc(100% + ${offset}px)`, bottom: 0 };
556
+ case "right-center":
698
557
  return {
699
558
  left: `calc(100% + ${offset}px)`,
700
559
  top: "50%",
701
560
  transform: "translateY(-50%)"
702
561
  };
562
+ case "right-start":
563
+ return { left: `calc(100% + ${offset}px)`, top: 0 };
564
+ case "right-end":
565
+ return { left: `calc(100% + ${offset}px)`, bottom: 0 };
703
566
  default:
704
567
  return {
705
568
  bottom: `calc(100% + ${offset}px)`,
@@ -708,28 +571,26 @@ var getPositionStyles = (placement, offset) => {
708
571
  };
709
572
  }
710
573
  };
711
- var Toggletip = (0, import_react5.forwardRef)(
574
+ var Toggletip = (0, import_react4.forwardRef)(
712
575
  ({
713
576
  children,
714
577
  title,
715
578
  content,
716
579
  footer,
717
580
  width = "288px",
718
- direction = "top",
581
+ direction = "top-center",
719
582
  autoDirection = true,
720
- offset = 12
583
+ offset = 12,
584
+ style,
585
+ "data-testid": dataTestId,
586
+ className,
587
+ ...props
721
588
  }, ref) => {
722
- const [isOpen, setOpen] = (0, import_react5.useState)(false);
723
- const containerRef = (0, import_react5.useRef)(null);
589
+ const [isOpen, setOpen] = (0, import_react4.useState)(false);
590
+ const containerRef = (0, import_react4.useRef)(null);
724
591
  const { theme } = (0, import_xui_core.useDesignSystem)();
725
- const { refs, direction: newDirection } = useToggletip({
726
- open: isOpen,
727
- direction,
728
- offset,
729
- autoDirection
730
- });
731
592
  const toggleOpen = () => setOpen(!isOpen);
732
- (0, import_react5.useEffect)(() => {
593
+ (0, import_react4.useEffect)(() => {
733
594
  const handleClickOutside = (event) => {
734
595
  if (containerRef.current && !containerRef.current.contains(event.target)) {
735
596
  setOpen(false);
@@ -740,29 +601,27 @@ var Toggletip = (0, import_react5.forwardRef)(
740
601
  }
741
602
  return () => document.removeEventListener("mousedown", handleClickOutside);
742
603
  }, [isOpen]);
743
- const positionStyles = (0, import_react5.useMemo)(
744
- () => getPositionStyles(newDirection, offset),
745
- [newDirection, offset]
604
+ const positionStyles = (0, import_react4.useMemo)(
605
+ () => getPositionStyles(direction, offset),
606
+ [direction, offset]
746
607
  );
747
608
  return /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(
748
609
  Box,
749
610
  {
750
- ref: (node) => {
751
- containerRef.current = node;
752
- refs.setReference(node);
753
- },
611
+ ref: containerRef,
754
612
  display: "inline-flex",
755
613
  position: "relative",
614
+ className,
756
615
  style: { height: "fit-content" },
757
616
  children: [
758
617
  /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(Box, { onPress: toggleOpen, style: { cursor: "pointer" }, children }),
759
618
  isOpen && /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(
760
619
  Box,
761
620
  {
762
- ref: refs.setFloating,
621
+ "data-testid": dataTestId,
763
622
  position: "absolute",
764
- backgroundColor: theme.colors.background.primary,
765
- borderRadius: theme.radius.card,
623
+ backgroundColor: theme.colors.background.secondary,
624
+ borderRadius: 12,
766
625
  borderWidth: 1,
767
626
  borderColor: theme.colors.border.secondary,
768
627
  padding: 12,
@@ -770,10 +629,11 @@ var Toggletip = (0, import_react5.forwardRef)(
770
629
  zIndex: 2e3,
771
630
  style: {
772
631
  ...positionStyles,
773
- boxShadow: "0 4px 12px rgba(0, 36, 77, 0.2)"
632
+ boxShadow: "0 4px 12px rgba(0, 36, 77, 0.2)",
633
+ ...style
774
634
  },
775
635
  children: [
776
- title && /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(Box, { gap: 8, children: [
636
+ title && /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(import_jsx_runtime8.Fragment, { children: [
777
637
  /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
778
638
  Text,
779
639
  {
@@ -781,12 +641,13 @@ var Toggletip = (0, import_react5.forwardRef)(
781
641
  fontSize: 24,
782
642
  lineHeight: "28px",
783
643
  fontWeight: "500",
644
+ marginBottom: 8,
784
645
  children: title
785
646
  }
786
647
  ),
787
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(Divider, { color: theme.colors.border.secondary })
648
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(Divider, { marginBottom: 12 })
788
649
  ] }),
789
- content && /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(Box, { marginBottom: 16, marginTop: 16, children: typeof content === "string" || typeof content === "number" ? /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
650
+ content && /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(Box, { marginVertical: 16, children: typeof content === "string" || typeof content === "number" ? /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
790
651
  Text,
791
652
  {
792
653
  color: theme.colors.content.primary,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/index.tsx","../../src/Toggletip.tsx","../../../primitives-native/src/Box.tsx","../../../primitives-native/src/Text.tsx","../../../primitives-native/src/Spinner.tsx","../../../primitives-native/src/Icon.tsx","../../../primitives-native/src/Divider.tsx","../../../primitives-native/src/Input.tsx","../../../primitives-native/src/TextArea.tsx","../../src/useToggletip.ts"],"sourcesContent":["export * from \"./Toggletip\";\nexport * from \"./types\";\n","import React, { forwardRef, useState, useRef, useEffect, useMemo } from \"react\";\n// @ts-ignore - this will be resolved at build time\nimport { Box, Text, Divider } from \"@xsolla/xui-primitives\";\nimport { useDesignSystem } from \"@xsolla/xui-core\";\nimport { useToggletip } from \"./useToggletip\";\nimport type { ToggletipPlacement, ToggletipProps } from \"./types\";\n\nconst getPositionStyles = (placement: ToggletipPlacement, offset: number) => {\n switch (placement) {\n case \"bottom\":\n return {\n top: `calc(100% + ${offset}px)`,\n left: \"50%\",\n transform: \"translateX(-50%)\",\n };\n case \"bottom-left\":\n return { top: `calc(100% + ${offset}px)`, left: 0 };\n case \"bottom-right\":\n return { top: `calc(100% + ${offset}px)`, right: 0 };\n case \"top\":\n return {\n bottom: `calc(100% + ${offset}px)`,\n left: \"50%\",\n transform: \"translateX(-50%)\",\n };\n case \"top-left\":\n return { bottom: `calc(100% + ${offset}px)`, left: 0 };\n case \"top-right\":\n return { bottom: `calc(100% + ${offset}px)`, right: 0 };\n case \"left\":\n return {\n right: `calc(100% + ${offset}px)`,\n top: \"50%\",\n transform: \"translateY(-50%)\",\n };\n case \"right\":\n return {\n left: `calc(100% + ${offset}px)`,\n top: \"50%\",\n transform: \"translateY(-50%)\",\n };\n default:\n return {\n bottom: `calc(100% + ${offset}px)`,\n left: \"50%\",\n transform: \"translateX(-50%)\",\n };\n }\n};\n\nexport const Toggletip = forwardRef<any, ToggletipProps>(\n (\n {\n children,\n title,\n content,\n footer,\n width = \"288px\",\n direction = \"top\",\n autoDirection = true,\n offset = 12,\n },\n ref\n ) => {\n const [isOpen, setOpen] = useState(false);\n const containerRef = useRef<any>(null);\n const { theme } = useDesignSystem();\n\n // Use custom hook for positioning (similar to Floating UI's useFloating)\n const { refs, direction: newDirection } = useToggletip({\n open: isOpen,\n direction,\n offset,\n autoDirection,\n });\n\n const toggleOpen = () => setOpen(!isOpen);\n\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (\n containerRef.current &&\n !containerRef.current.contains(event.target)\n ) {\n setOpen(false);\n }\n };\n if (isOpen) {\n document.addEventListener(\"mousedown\", handleClickOutside);\n }\n return () =>\n document.removeEventListener(\"mousedown\", handleClickOutside);\n }, [isOpen]);\n\n const positionStyles = useMemo(\n () => getPositionStyles(newDirection, offset),\n [newDirection, offset]\n );\n\n return (\n <Box\n ref={(node: any) => {\n containerRef.current = node;\n refs.setReference(node);\n }}\n display=\"inline-flex\"\n position=\"relative\"\n style={{ height: \"fit-content\" }}\n >\n <Box onPress={toggleOpen} style={{ cursor: \"pointer\" }}>\n {children}\n </Box>\n {isOpen && (\n <Box\n ref={refs.setFloating}\n position=\"absolute\"\n backgroundColor={theme.colors.background.primary}\n borderRadius={theme.radius.card}\n borderWidth={1}\n borderColor={theme.colors.border.secondary}\n padding={12}\n width={width}\n zIndex={2000}\n style={{\n ...positionStyles,\n boxShadow: \"0 4px 12px rgba(0, 36, 77, 0.2)\",\n }}\n >\n {title && (\n <Box gap={8}>\n <Text\n color={theme.colors.content.primary}\n fontSize={24}\n lineHeight=\"28px\"\n fontWeight=\"500\"\n >\n {title}\n </Text>\n <Divider color={theme.colors.border.secondary} />\n </Box>\n )}\n {content && (\n <Box marginBottom={16} marginTop={16}>\n {typeof content === \"string\" || typeof content === \"number\" ? (\n <Text\n color={theme.colors.content.primary}\n fontSize={14}\n fontWeight=\"400\"\n >\n {content}\n </Text>\n ) : (\n content\n )}\n </Box>\n )}\n {footer && (\n <Box\n marginTop={20}\n flexDirection=\"row\"\n justifyContent=\"flex-end\"\n gap={12}\n >\n {footer}\n </Box>\n )}\n </Box>\n )}\n </Box>\n );\n }\n);\n\nToggletip.displayName = \"Toggletip\";\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 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 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 { Text as RNText, TextStyle, AccessibilityRole } from \"react-native\";\nimport { TextProps } from \"@xsolla/xui-primitives-core\";\n\n// Map web roles to React Native accessibility roles\nconst roleMap: Record<string, AccessibilityRole> = {\n alert: \"alert\",\n heading: \"header\",\n button: \"button\",\n link: \"link\",\n text: \"text\",\n};\n\nexport const Text: React.FC<TextProps> = ({\n children,\n color,\n fontSize,\n fontWeight,\n fontFamily,\n id,\n role,\n ...props\n}) => {\n // Extract the first font name from a comma-separated list (e.g. for web-style font stacks)\n let resolvedFontFamily = fontFamily\n ? fontFamily.split(\",\")[0].replace(/['\"]/g, \"\").trim()\n : undefined;\n\n // On native, if we don't have the custom font loaded, it's better to use the system font\n // to avoid rendering issues or missing text.\n if (resolvedFontFamily === \"Pilat Wide Bold\") {\n resolvedFontFamily = undefined;\n }\n\n const style: TextStyle = {\n 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 };\n\n // Map role to React Native accessibilityRole\n const accessibilityRole = role ? roleMap[role] : undefined;\n\n return (\n <RNText style={style} testID={id} accessibilityRole={accessibilityRole}>\n {children}\n </RNText>\n );\n};\n","import type React from \"react\";\nimport { ActivityIndicator, View } from \"react-native\";\nimport type { SpinnerProps } from \"@xsolla/xui-primitives-core\";\n\nexport const Spinner: React.FC<SpinnerProps> = ({\n color,\n size,\n role,\n \"aria-label\": ariaLabel,\n \"aria-live\": ariaLive,\n \"aria-describedby\": ariaDescribedBy,\n testID,\n}) => {\n return (\n <View\n accessible={true}\n accessibilityRole={role === \"status\" ? \"none\" : undefined}\n accessibilityLabel={ariaLabel}\n accessibilityLiveRegion={\n ariaLive === \"polite\"\n ? \"polite\"\n : ariaLive === \"assertive\"\n ? \"assertive\"\n : \"none\"\n }\n testID={testID}\n >\n <ActivityIndicator\n color={color}\n size={typeof size === \"number\" ? size : \"small\"}\n />\n </View>\n );\n};\n\nSpinner.displayName = \"Spinner\";\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> = ({ children, color, size }) => {\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 // @ts-ignore - passing color down to potential Text/Icon children\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 <View style={style}>{childrenWithProps}</View>;\n};\n","import React from \"react\";\nimport { View, ViewStyle } from \"react-native\";\nimport { DividerProps } from \"@xsolla/xui-primitives-core\";\n\nexport const Divider: React.FC<DividerProps> = ({\n color,\n height,\n width,\n vertical,\n dashStroke,\n}) => {\n const style: ViewStyle = {\n backgroundColor: dashStroke\n ? \"transparent\"\n : color || \"rgba(255, 255, 255, 0.15)\",\n width: vertical ? (typeof width === \"number\" ? width : 1) : \"100%\",\n height: vertical ? \"100%\" : typeof height === \"number\" ? height : 1,\n ...(dashStroke && {\n borderStyle: \"dashed\",\n borderColor: color || \"rgba(255, 255, 255, 0.15)\",\n borderWidth: 0,\n ...(vertical\n ? { borderLeftWidth: typeof width === \"number\" ? width : 1 }\n : { borderTopWidth: typeof height === \"number\" ? height : 1 }),\n }),\n };\n\n return <View style={style} />;\n};\n","import React, { forwardRef } from \"react\";\nimport { TextInput as RNTextInput } from \"react-native\";\nimport { InputPrimitiveProps } from \"@xsolla/xui-primitives-core\";\n\n// Map web input types to React Native keyboard types\nconst keyboardTypeMap: Record<string, any> = {\n text: \"default\",\n number: \"numeric\",\n email: \"email-address\",\n tel: \"phone-pad\",\n url: \"url\",\n decimal: \"decimal-pad\",\n};\n\n// Map web inputMode to React Native keyboard types\nconst inputModeToKeyboardType: Record<string, any> = {\n none: \"default\",\n text: \"default\",\n decimal: \"decimal-pad\",\n numeric: \"number-pad\",\n tel: \"phone-pad\",\n search: \"default\",\n email: \"email-address\",\n url: \"url\",\n};\n\n// Map web autoComplete to React Native textContentType (iOS)\nconst autoCompleteToTextContentType: Record<string, any> = {\n \"one-time-code\": \"oneTimeCode\",\n email: \"emailAddress\",\n username: \"username\",\n password: \"password\",\n \"new-password\": \"newPassword\",\n tel: \"telephoneNumber\",\n \"postal-code\": \"postalCode\",\n name: \"name\",\n};\n\nexport const InputPrimitive = forwardRef<RNTextInput, InputPrimitiveProps>(\n (\n {\n value,\n placeholder,\n onChange,\n onChangeText,\n onFocus,\n onBlur,\n onKeyDown,\n disabled,\n secureTextEntry,\n style,\n color,\n fontSize,\n placeholderTextColor,\n maxLength,\n name,\n type,\n inputMode,\n autoComplete,\n id,\n \"aria-invalid\": ariaInvalid,\n \"aria-describedby\": ariaDescribedBy,\n \"aria-labelledby\": ariaLabelledBy,\n \"aria-label\": ariaLabel,\n \"aria-disabled\": ariaDisabled,\n \"data-testid\": dataTestId,\n },\n ref\n ) => {\n const handleChangeText = (text: string) => {\n onChangeText?.(text);\n\n // Create a synthetic event for onChange compatibility\n // Include nativeEvent and no-op methods to prevent runtime errors\n // when consumers expect DOM-like event behavior\n if (onChange) {\n const syntheticEvent = {\n target: { value: text },\n currentTarget: { value: text },\n type: \"change\",\n nativeEvent: { text },\n preventDefault: () => {},\n stopPropagation: () => {},\n isTrusted: false,\n } as unknown as React.ChangeEvent<HTMLInputElement>;\n onChange(syntheticEvent);\n }\n };\n\n // Determine keyboard type - inputMode takes precedence over type\n const keyboardType = inputMode\n ? inputModeToKeyboardType[inputMode] || \"default\"\n : type\n ? keyboardTypeMap[type] || \"default\"\n : \"default\";\n\n // Determine textContentType for iOS autofill\n const textContentType = autoComplete\n ? autoCompleteToTextContentType[autoComplete]\n : undefined;\n\n return (\n <RNTextInput\n ref={ref}\n value={value}\n placeholder={placeholder}\n onChangeText={handleChangeText}\n onFocus={onFocus}\n onBlur={onBlur}\n onKeyPress={(e) => {\n // Map onKeyPress to onKeyDown for cross-platform compatibility\n // Include preventDefault to avoid runtime errors when consumers call it\n if (onKeyDown) {\n onKeyDown({\n key: e.nativeEvent.key,\n preventDefault: () => {},\n } as any);\n }\n }}\n editable={!disabled}\n secureTextEntry={secureTextEntry || type === \"password\"}\n keyboardType={keyboardType}\n textContentType={textContentType}\n style={[\n {\n color,\n fontSize: typeof fontSize === \"number\" ? fontSize : undefined,\n flex: 1,\n padding: 0,\n textAlign: (style as any)?.textAlign || \"left\",\n },\n style as any,\n ]}\n placeholderTextColor={placeholderTextColor}\n maxLength={maxLength}\n // React Native accessibility props\n testID={dataTestId || id}\n accessibilityLabel={ariaLabel}\n accessibilityHint={ariaDescribedBy}\n accessibilityState={{\n disabled: disabled || ariaDisabled,\n }}\n accessible={true}\n />\n );\n }\n);\n\nInputPrimitive.displayName = \"InputPrimitive\";\n","import React, { forwardRef } from \"react\";\nimport { TextInput as RNTextInput } from \"react-native\";\nimport { TextAreaPrimitiveProps } from \"@xsolla/xui-primitives-core\";\n\nexport const TextAreaPrimitive = forwardRef<\n RNTextInput,\n TextAreaPrimitiveProps\n>(\n (\n {\n value,\n placeholder,\n onChange,\n onChangeText,\n onFocus,\n onBlur,\n onKeyDown,\n disabled,\n style,\n color,\n fontSize,\n placeholderTextColor,\n maxLength,\n rows,\n id,\n \"aria-invalid\": ariaInvalid,\n \"aria-describedby\": ariaDescribedBy,\n \"aria-labelledby\": ariaLabelledBy,\n \"aria-label\": ariaLabel,\n \"aria-disabled\": ariaDisabled,\n \"data-testid\": dataTestId,\n },\n ref\n ) => {\n const handleChangeText = (text: string) => {\n onChangeText?.(text);\n\n if (onChange) {\n const syntheticEvent = {\n target: { value: text },\n currentTarget: { value: text },\n type: \"change\",\n nativeEvent: { text },\n preventDefault: () => {},\n stopPropagation: () => {},\n isTrusted: false,\n } as unknown as React.ChangeEvent<HTMLTextAreaElement>;\n onChange(syntheticEvent);\n }\n };\n\n return (\n <RNTextInput\n ref={ref}\n value={value}\n placeholder={placeholder}\n onChangeText={handleChangeText}\n onFocus={onFocus}\n onBlur={onBlur}\n onKeyPress={(e) => {\n if (onKeyDown) {\n onKeyDown({\n key: e.nativeEvent.key,\n preventDefault: () => {},\n } as any);\n }\n }}\n editable={!disabled}\n multiline={true}\n numberOfLines={rows || 4}\n style={[\n {\n color,\n fontSize: typeof fontSize === \"number\" ? fontSize : undefined,\n flex: 1,\n padding: 0,\n textAlignVertical: \"top\",\n textAlign: (style as any)?.textAlign || \"left\",\n },\n style as any,\n ]}\n placeholderTextColor={placeholderTextColor}\n maxLength={maxLength}\n testID={dataTestId || id}\n accessibilityLabel={ariaLabel}\n accessibilityHint={ariaDescribedBy}\n accessibilityState={{\n disabled: disabled || ariaDisabled,\n }}\n accessible={true}\n />\n );\n }\n);\n\nTextAreaPrimitive.displayName = \"TextAreaPrimitive\";\n","import { useState, useRef, useLayoutEffect, useCallback } from \"react\";\nimport type { ToggletipPlacement } from \"./types\";\n\ninterface UseToggletipOptions {\n open: boolean;\n direction: ToggletipPlacement;\n offset: number;\n autoDirection?: boolean;\n}\n\ninterface UseToggletipReturn {\n refs: {\n setReference: (node: any) => void;\n setFloating: (node: any) => void;\n };\n direction: ToggletipPlacement;\n}\n\n// Find scrollable parent\nconst getScrollParent = (element: HTMLElement | null): HTMLElement => {\n if (!element || element === document.body) {\n return document.body;\n }\n\n const { overflow, overflowX, overflowY } = window.getComputedStyle(element);\n const isScrollable =\n /(auto|scroll)/.test(overflow) ||\n /(auto|scroll)/.test(overflowX) ||\n /(auto|scroll)/.test(overflowY);\n\n // Check both vertical and horizontal scroll\n if (\n isScrollable &&\n (element.scrollHeight > element.clientHeight ||\n element.scrollWidth > element.clientWidth)\n ) {\n return element;\n }\n\n return getScrollParent(element.parentElement);\n};\n\n// Get viewport bounds\nconst getViewportBounds = (triggerElement: HTMLElement) => {\n const scrollParent = getScrollParent(triggerElement);\n\n if (scrollParent === document.body) {\n return {\n top: 0,\n left: 0,\n right: window.visualViewport?.width || window.innerWidth,\n bottom: window.visualViewport?.height || window.innerHeight,\n width: window.visualViewport?.width || window.innerWidth,\n height: window.visualViewport?.height || window.innerHeight,\n };\n }\n\n const rect = scrollParent.getBoundingClientRect();\n return {\n top: rect.top,\n left: rect.left,\n right: rect.right,\n bottom: rect.bottom,\n width: rect.width,\n height: rect.height,\n };\n};\n\n// Collision detection\nconst checkCollision = (\n triggerRect: DOMRect,\n toggletipRect: DOMRect,\n placement: ToggletipPlacement,\n offset: number,\n triggerElement: HTMLElement\n): ToggletipPlacement => {\n const viewport = getViewportBounds(triggerElement);\n const buffer = 10;\n\n const space = {\n top: triggerRect.top - viewport.top,\n bottom: viewport.bottom - triggerRect.bottom,\n left: triggerRect.left - viewport.left,\n right: viewport.right - triggerRect.right,\n };\n\n const triggerCenterY = triggerRect.top + triggerRect.height / 2;\n const triggerCenterX = triggerRect.left + triggerRect.width / 2;\n\n const fits = {\n top:\n space.top >= toggletipRect.height + offset + buffer &&\n triggerCenterX - toggletipRect.width / 2 >= viewport.left + buffer &&\n triggerCenterX + toggletipRect.width / 2 <= viewport.right - buffer,\n bottom:\n space.bottom >= toggletipRect.height + offset + buffer &&\n triggerCenterX - toggletipRect.width / 2 >= viewport.left + buffer &&\n triggerCenterX + toggletipRect.width / 2 <= viewport.right - buffer,\n left:\n space.left >= toggletipRect.width + offset + buffer &&\n triggerCenterY - toggletipRect.height / 2 >= viewport.top + buffer &&\n triggerCenterY + toggletipRect.height / 2 <= viewport.bottom - buffer,\n right:\n space.right >= toggletipRect.width + offset + buffer &&\n triggerCenterY - toggletipRect.height / 2 >= viewport.top + buffer &&\n triggerCenterY + toggletipRect.height / 2 <= viewport.bottom - buffer,\n };\n\n const [primary, secondary] = placement.split(\"-\");\n const primaryFits = fits[primary as keyof typeof fits];\n\n if (primaryFits) {\n return placement;\n }\n\n const opposites: Record<string, string> = {\n top: \"bottom\",\n bottom: \"top\",\n left: \"right\",\n right: \"left\",\n };\n\n const opposite = opposites[primary];\n if (opposite && fits[opposite as keyof typeof fits]) {\n return secondary\n ? (`${opposite}-${secondary}` as ToggletipPlacement)\n : (opposite as ToggletipPlacement);\n }\n\n const perpendicular =\n primary === \"top\" || primary === \"bottom\"\n ? [\"right\", \"left\"]\n : [\"bottom\", \"top\"];\n\n for (const dir of perpendicular) {\n if (fits[dir as keyof typeof fits]) {\n return dir as ToggletipPlacement;\n }\n }\n\n const best = Object.entries(space).sort(([, a], [, b]) => b - a)[0];\n return best[0] as ToggletipPlacement;\n};\n\nexport const useToggletip = ({\n open,\n direction,\n offset,\n autoDirection = true,\n}: UseToggletipOptions): UseToggletipReturn => {\n const [newDirection, setNewDirection] = useState(direction);\n const referenceRef = useRef<any>(null);\n const floatingRef = useRef<any>(null);\n\n const setReference = useCallback((node: any) => {\n referenceRef.current = node;\n }, []);\n\n const setFloating = useCallback((node: any) => {\n floatingRef.current = node;\n }, []);\n\n // Collision detection + continuous updates\n useLayoutEffect(() => {\n if (\n !open ||\n !autoDirection ||\n !referenceRef.current ||\n !floatingRef.current\n ) {\n return;\n }\n\n let rafId: number | null = null;\n\n const updatePlacement = () => {\n rafId = null;\n if (!referenceRef.current || !floatingRef.current) return;\n\n const triggerRect = referenceRef.current.getBoundingClientRect();\n const toggletipRect = floatingRef.current.getBoundingClientRect();\n const calculatedDirection = checkCollision(\n triggerRect,\n toggletipRect,\n direction,\n offset,\n referenceRef.current\n );\n\n setNewDirection((prev) => {\n if (prev === calculatedDirection) return prev;\n return calculatedDirection;\n });\n };\n\n const scheduleUpdate = () => {\n if (rafId != null) return;\n rafId = requestAnimationFrame(updatePlacement);\n };\n\n updatePlacement();\n\n window.addEventListener(\"scroll\", scheduleUpdate, true);\n window.addEventListener(\"resize\", scheduleUpdate);\n\n const resizeObserver = new ResizeObserver(scheduleUpdate);\n resizeObserver.observe(referenceRef.current);\n resizeObserver.observe(floatingRef.current);\n\n return () => {\n if (rafId != null) cancelAnimationFrame(rafId);\n window.removeEventListener(\"scroll\", scheduleUpdate, true);\n window.removeEventListener(\"resize\", scheduleUpdate);\n resizeObserver.disconnect();\n };\n }, [open, autoDirection, direction, offset]);\n\n // Reset direction when closed\n useLayoutEffect(() => {\n if (!open) {\n setNewDirection(direction);\n }\n }, [open, direction]);\n\n return {\n refs: {\n setReference,\n setFloating,\n },\n direction: newDirection,\n };\n};\n"],"mappings":"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","names":["import_react","import_react_native","import_jsx_runtime","RNText","import_react_native","import_jsx_runtime","import_react_native","import_jsx_runtime","import_react_native","import_jsx_runtime","import_react","import_react_native","import_jsx_runtime","RNTextInput","import_react","import_react_native","import_jsx_runtime","RNTextInput","import_react","import_jsx_runtime"]}
1
+ {"version":3,"sources":["../../src/index.tsx","../../src/Toggletip.tsx","../../../primitives-native/src/Box.tsx","../../../primitives-native/src/Text.tsx","../../../primitives-native/src/Spinner.tsx","../../../primitives-native/src/Icon.tsx","../../../primitives-native/src/Divider.tsx","../../../primitives-native/src/Input.tsx","../../../primitives-native/src/TextArea.tsx"],"sourcesContent":["export * from \"./Toggletip\";\nexport * from \"./types\";\n","import React, { forwardRef, useState, useRef, useEffect, useMemo } from \"react\";\n// @ts-ignore - this will be resolved at build time\nimport { Box, Text, Divider } from \"@xsolla/xui-primitives\";\nimport { useDesignSystem } from \"@xsolla/xui-core\";\nimport type { ToggletipPlacement, ToggletipProps } from \"./types\";\n\nconst getPositionStyles = (placement: ToggletipPlacement, offset: number) => {\n switch (placement) {\n case \"bottom-center\":\n case \"center\":\n return {\n top: `calc(100% + ${offset}px)`,\n left: \"50%\",\n transform: \"translateX(-50%)\",\n };\n case \"bottom-start\":\n return { top: `calc(100% + ${offset}px)`, left: 0 };\n case \"bottom-end\":\n return { top: `calc(100% + ${offset}px)`, right: 0 };\n case \"top-center\":\n return {\n bottom: `calc(100% + ${offset}px)`,\n left: \"50%\",\n transform: \"translateX(-50%)\",\n };\n case \"top-start\":\n return { bottom: `calc(100% + ${offset}px)`, left: 0 };\n case \"top-end\":\n return { bottom: `calc(100% + ${offset}px)`, right: 0 };\n case \"left-center\":\n return {\n right: `calc(100% + ${offset}px)`,\n top: \"50%\",\n transform: \"translateY(-50%)\",\n };\n case \"left-start\":\n return { right: `calc(100% + ${offset}px)`, top: 0 };\n case \"left-end\":\n return { right: `calc(100% + ${offset}px)`, bottom: 0 };\n case \"right-center\":\n return {\n left: `calc(100% + ${offset}px)`,\n top: \"50%\",\n transform: \"translateY(-50%)\",\n };\n case \"right-start\":\n return { left: `calc(100% + ${offset}px)`, top: 0 };\n case \"right-end\":\n return { left: `calc(100% + ${offset}px)`, bottom: 0 };\n default:\n return {\n bottom: `calc(100% + ${offset}px)`,\n left: \"50%\",\n transform: \"translateX(-50%)\",\n };\n }\n};\n\nexport const Toggletip = forwardRef<any, ToggletipProps>(\n (\n {\n children,\n title,\n content,\n footer,\n width = \"288px\",\n direction = \"top-center\",\n autoDirection = true,\n offset = 12,\n style,\n \"data-testid\": dataTestId,\n className,\n ...props\n },\n ref\n ) => {\n const [isOpen, setOpen] = useState(false);\n const containerRef = useRef<any>(null);\n const { theme } = useDesignSystem();\n\n const toggleOpen = () => setOpen(!isOpen);\n\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (\n containerRef.current &&\n !containerRef.current.contains(event.target)\n ) {\n setOpen(false);\n }\n };\n if (isOpen) {\n document.addEventListener(\"mousedown\", handleClickOutside);\n }\n return () =>\n document.removeEventListener(\"mousedown\", handleClickOutside);\n }, [isOpen]);\n\n const positionStyles = useMemo(\n () => getPositionStyles(direction, offset),\n [direction, offset]\n );\n\n return (\n <Box\n ref={containerRef}\n display=\"inline-flex\"\n position=\"relative\"\n className={className}\n style={{ height: \"fit-content\" }}\n >\n <Box onPress={toggleOpen} style={{ cursor: \"pointer\" }}>\n {children}\n </Box>\n {isOpen && (\n <Box\n data-testid={dataTestId}\n position=\"absolute\"\n backgroundColor={theme.colors.background.secondary}\n borderRadius={12}\n borderWidth={1}\n borderColor={theme.colors.border.secondary}\n padding={12}\n width={width}\n zIndex={2000}\n style={{\n ...positionStyles,\n boxShadow: \"0 4px 12px rgba(0, 36, 77, 0.2)\",\n ...style,\n }}\n >\n {title && (\n <>\n <Text\n color={theme.colors.content.primary}\n fontSize={24}\n lineHeight=\"28px\"\n fontWeight=\"500\"\n marginBottom={8}\n >\n {title}\n </Text>\n <Divider marginBottom={12} />\n </>\n )}\n {content && (\n <Box marginVertical={16}>\n {typeof content === \"string\" || typeof content === \"number\" ? (\n <Text\n color={theme.colors.content.primary}\n fontSize={14}\n fontWeight=\"400\"\n >\n {content}\n </Text>\n ) : (\n content\n )}\n </Box>\n )}\n {footer && (\n <Box\n marginTop={20}\n flexDirection=\"row\"\n justifyContent=\"flex-end\"\n gap={12}\n >\n {footer}\n </Box>\n )}\n </Box>\n )}\n </Box>\n );\n }\n);\n\nToggletip.displayName = \"Toggletip\";\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 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 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 { Text as RNText, TextStyle, AccessibilityRole } from \"react-native\";\nimport { TextProps } from \"@xsolla/xui-primitives-core\";\n\n// Map web roles to React Native accessibility roles\nconst roleMap: Record<string, AccessibilityRole> = {\n alert: \"alert\",\n heading: \"header\",\n button: \"button\",\n link: \"link\",\n text: \"text\",\n};\n\nexport const Text: React.FC<TextProps> = ({\n children,\n color,\n fontSize,\n fontWeight,\n fontFamily,\n id,\n role,\n ...props\n}) => {\n // Extract the first font name from a comma-separated list (e.g. for web-style font stacks)\n let resolvedFontFamily = fontFamily\n ? fontFamily.split(\",\")[0].replace(/['\"]/g, \"\").trim()\n : undefined;\n\n // On native, if we don't have the custom font loaded, it's better to use the system font\n // to avoid rendering issues or missing text.\n if (resolvedFontFamily === \"Pilat Wide Bold\") {\n resolvedFontFamily = undefined;\n }\n\n const style: TextStyle = {\n 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 };\n\n // Map role to React Native accessibilityRole\n const accessibilityRole = role ? roleMap[role] : undefined;\n\n return (\n <RNText style={style} testID={id} accessibilityRole={accessibilityRole}>\n {children}\n </RNText>\n );\n};\n","import type React from \"react\";\nimport { ActivityIndicator, View } from \"react-native\";\nimport type { SpinnerProps } from \"@xsolla/xui-primitives-core\";\n\nexport const Spinner: React.FC<SpinnerProps> = ({\n color,\n size,\n role,\n \"aria-label\": ariaLabel,\n \"aria-live\": ariaLive,\n \"aria-describedby\": ariaDescribedBy,\n testID,\n}) => {\n return (\n <View\n accessible={true}\n accessibilityRole={role === \"status\" ? \"none\" : undefined}\n accessibilityLabel={ariaLabel}\n accessibilityLiveRegion={\n ariaLive === \"polite\"\n ? \"polite\"\n : ariaLive === \"assertive\"\n ? \"assertive\"\n : \"none\"\n }\n testID={testID}\n >\n <ActivityIndicator\n color={color}\n size={typeof size === \"number\" ? size : \"small\"}\n />\n </View>\n );\n};\n\nSpinner.displayName = \"Spinner\";\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> = ({ children, color, size }) => {\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 // @ts-ignore - passing color down to potential Text/Icon children\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 <View style={style}>{childrenWithProps}</View>;\n};\n","import React from \"react\";\nimport { View, ViewStyle } from \"react-native\";\nimport { DividerProps } from \"@xsolla/xui-primitives-core\";\n\nexport const Divider: React.FC<DividerProps> = ({\n color,\n height,\n width,\n vertical,\n dashStroke,\n}) => {\n const style: ViewStyle = {\n backgroundColor: dashStroke\n ? \"transparent\"\n : color || \"rgba(255, 255, 255, 0.15)\",\n width: vertical ? (typeof width === \"number\" ? width : 1) : \"100%\",\n height: vertical ? \"100%\" : typeof height === \"number\" ? height : 1,\n ...(dashStroke && {\n borderStyle: \"dashed\",\n borderColor: color || \"rgba(255, 255, 255, 0.15)\",\n borderWidth: 0,\n ...(vertical\n ? { borderLeftWidth: typeof width === \"number\" ? width : 1 }\n : { borderTopWidth: typeof height === \"number\" ? height : 1 }),\n }),\n };\n\n return <View style={style} />;\n};\n","import React, { forwardRef } from \"react\";\nimport { TextInput as RNTextInput } from \"react-native\";\nimport { InputPrimitiveProps } from \"@xsolla/xui-primitives-core\";\n\n// Map web input types to React Native keyboard types\nconst keyboardTypeMap: Record<string, any> = {\n text: \"default\",\n number: \"numeric\",\n email: \"email-address\",\n tel: \"phone-pad\",\n url: \"url\",\n decimal: \"decimal-pad\",\n};\n\n// Map web inputMode to React Native keyboard types\nconst inputModeToKeyboardType: Record<string, any> = {\n none: \"default\",\n text: \"default\",\n decimal: \"decimal-pad\",\n numeric: \"number-pad\",\n tel: \"phone-pad\",\n search: \"default\",\n email: \"email-address\",\n url: \"url\",\n};\n\n// Map web autoComplete to React Native textContentType (iOS)\nconst autoCompleteToTextContentType: Record<string, any> = {\n \"one-time-code\": \"oneTimeCode\",\n email: \"emailAddress\",\n username: \"username\",\n password: \"password\",\n \"new-password\": \"newPassword\",\n tel: \"telephoneNumber\",\n \"postal-code\": \"postalCode\",\n name: \"name\",\n};\n\nexport const InputPrimitive = forwardRef<RNTextInput, InputPrimitiveProps>(\n (\n {\n value,\n placeholder,\n onChange,\n onChangeText,\n onFocus,\n onBlur,\n onKeyDown,\n disabled,\n secureTextEntry,\n style,\n color,\n fontSize,\n placeholderTextColor,\n maxLength,\n name,\n type,\n inputMode,\n autoComplete,\n id,\n \"aria-invalid\": ariaInvalid,\n \"aria-describedby\": ariaDescribedBy,\n \"aria-labelledby\": ariaLabelledBy,\n \"aria-label\": ariaLabel,\n \"aria-disabled\": ariaDisabled,\n \"data-testid\": dataTestId,\n },\n ref\n ) => {\n const handleChangeText = (text: string) => {\n onChangeText?.(text);\n\n // Create a synthetic event for onChange compatibility\n // Include nativeEvent and no-op methods to prevent runtime errors\n // when consumers expect DOM-like event behavior\n if (onChange) {\n const syntheticEvent = {\n target: { value: text },\n currentTarget: { value: text },\n type: \"change\",\n nativeEvent: { text },\n preventDefault: () => {},\n stopPropagation: () => {},\n isTrusted: false,\n } as unknown as React.ChangeEvent<HTMLInputElement>;\n onChange(syntheticEvent);\n }\n };\n\n // Determine keyboard type - inputMode takes precedence over type\n const keyboardType = inputMode\n ? inputModeToKeyboardType[inputMode] || \"default\"\n : type\n ? keyboardTypeMap[type] || \"default\"\n : \"default\";\n\n // Determine textContentType for iOS autofill\n const textContentType = autoComplete\n ? autoCompleteToTextContentType[autoComplete]\n : undefined;\n\n return (\n <RNTextInput\n ref={ref}\n value={value}\n placeholder={placeholder}\n onChangeText={handleChangeText}\n onFocus={onFocus}\n onBlur={onBlur}\n onKeyPress={(e) => {\n // Map onKeyPress to onKeyDown for cross-platform compatibility\n // Include preventDefault to avoid runtime errors when consumers call it\n if (onKeyDown) {\n onKeyDown({\n key: e.nativeEvent.key,\n preventDefault: () => {},\n } as any);\n }\n }}\n editable={!disabled}\n secureTextEntry={secureTextEntry || type === \"password\"}\n keyboardType={keyboardType}\n textContentType={textContentType}\n style={[\n {\n color,\n fontSize: typeof fontSize === \"number\" ? fontSize : undefined,\n flex: 1,\n padding: 0,\n textAlign: (style as any)?.textAlign || \"left\",\n },\n style as any,\n ]}\n placeholderTextColor={placeholderTextColor}\n maxLength={maxLength}\n // React Native accessibility props\n testID={dataTestId || id}\n accessibilityLabel={ariaLabel}\n accessibilityHint={ariaDescribedBy}\n accessibilityState={{\n disabled: disabled || ariaDisabled,\n }}\n accessible={true}\n />\n );\n }\n);\n\nInputPrimitive.displayName = \"InputPrimitive\";\n","import React, { forwardRef } from \"react\";\nimport { TextInput as RNTextInput } from \"react-native\";\nimport { TextAreaPrimitiveProps } from \"@xsolla/xui-primitives-core\";\n\nexport const TextAreaPrimitive = forwardRef<\n RNTextInput,\n TextAreaPrimitiveProps\n>(\n (\n {\n value,\n placeholder,\n onChange,\n onChangeText,\n onFocus,\n onBlur,\n onKeyDown,\n disabled,\n style,\n color,\n fontSize,\n placeholderTextColor,\n maxLength,\n rows,\n id,\n \"aria-invalid\": ariaInvalid,\n \"aria-describedby\": ariaDescribedBy,\n \"aria-labelledby\": ariaLabelledBy,\n \"aria-label\": ariaLabel,\n \"aria-disabled\": ariaDisabled,\n \"data-testid\": dataTestId,\n },\n ref\n ) => {\n const handleChangeText = (text: string) => {\n onChangeText?.(text);\n\n if (onChange) {\n const syntheticEvent = {\n target: { value: text },\n currentTarget: { value: text },\n type: \"change\",\n nativeEvent: { text },\n preventDefault: () => {},\n stopPropagation: () => {},\n isTrusted: false,\n } as unknown as React.ChangeEvent<HTMLTextAreaElement>;\n onChange(syntheticEvent);\n }\n };\n\n return (\n <RNTextInput\n ref={ref}\n value={value}\n placeholder={placeholder}\n onChangeText={handleChangeText}\n onFocus={onFocus}\n onBlur={onBlur}\n onKeyPress={(e) => {\n if (onKeyDown) {\n onKeyDown({\n key: e.nativeEvent.key,\n preventDefault: () => {},\n } as any);\n }\n }}\n editable={!disabled}\n multiline={true}\n numberOfLines={rows || 4}\n style={[\n {\n color,\n fontSize: typeof fontSize === \"number\" ? fontSize : undefined,\n flex: 1,\n padding: 0,\n textAlignVertical: \"top\",\n textAlign: (style as any)?.textAlign || \"left\",\n },\n style as any,\n ]}\n placeholderTextColor={placeholderTextColor}\n maxLength={maxLength}\n testID={dataTestId || id}\n accessibilityLabel={ariaLabel}\n accessibilityHint={ariaDescribedBy}\n accessibilityState={{\n disabled: disabled || ariaDisabled,\n }}\n accessible={true}\n />\n );\n }\n);\n\nTextAreaPrimitive.displayName = \"TextAreaPrimitive\";\n"],"mappings":"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","names":["import_react","import_react_native","import_jsx_runtime","RNText","import_react_native","import_jsx_runtime","import_react_native","import_jsx_runtime","import_react_native","import_jsx_runtime","import_react","import_react_native","import_jsx_runtime","RNTextInput","import_react","import_react_native","import_jsx_runtime","RNTextInput","import_jsx_runtime"]}