@xsolla/xui-toggletip 0.65.0-pr73.1768528688 → 0.65.0-pr79.1768620075

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.mjs CHANGED
@@ -1,5 +1,5 @@
1
1
  // src/Toggletip.tsx
2
- import { forwardRef as forwardRef3, useState, useRef, useEffect, useMemo } from "react";
2
+ import { forwardRef as forwardRef3, useState as useState2, useRef as useRef2, useEffect, useMemo } from "react";
3
3
 
4
4
  // ../primitives-native/src/Box.tsx
5
5
  import {
@@ -486,51 +486,204 @@ var TextAreaPrimitive = forwardRef2(
486
486
  TextAreaPrimitive.displayName = "TextAreaPrimitive";
487
487
 
488
488
  // src/Toggletip.tsx
489
- import { useDesignSystem } from "@xsolla/xui-core";
490
- import { Fragment, jsx as jsx8, jsxs } from "react/jsx-runtime";
489
+ import { useDesignSystem, isNative } from "@xsolla/xui-core";
490
+
491
+ // src/useToggletip.ts
492
+ import { useState, useRef, useLayoutEffect, useCallback } from "react";
493
+ var getScrollParent = (element) => {
494
+ if (!element || element === document.body) {
495
+ return document.body;
496
+ }
497
+ const { overflow, overflowX, overflowY } = window.getComputedStyle(element);
498
+ const scrollRegex = /(auto|scroll)/;
499
+ const isScrollable = scrollRegex.test(overflow) || scrollRegex.test(overflowX) || scrollRegex.test(overflowY);
500
+ if (isScrollable && (element.scrollHeight > element.clientHeight || element.scrollWidth > element.clientWidth)) {
501
+ return element;
502
+ }
503
+ return getScrollParent(element.parentElement);
504
+ };
505
+ var getViewportBounds = (triggerElement) => {
506
+ const scrollParent = getScrollParent(triggerElement);
507
+ if (scrollParent === document.body) {
508
+ return {
509
+ top: 0,
510
+ left: 0,
511
+ right: window.visualViewport?.width || window.innerWidth,
512
+ bottom: window.visualViewport?.height || window.innerHeight,
513
+ width: window.visualViewport?.width || window.innerWidth,
514
+ height: window.visualViewport?.height || window.innerHeight
515
+ };
516
+ }
517
+ const rect = scrollParent.getBoundingClientRect();
518
+ return {
519
+ top: rect.top,
520
+ left: rect.left,
521
+ right: rect.right,
522
+ bottom: rect.bottom,
523
+ width: rect.width,
524
+ height: rect.height
525
+ };
526
+ };
527
+ var checkCollision = (triggerRect, toggletipRect, placement, offset, triggerElement) => {
528
+ const viewport = getViewportBounds(triggerElement);
529
+ const buffer = 10;
530
+ const space = {
531
+ top: triggerRect.top - viewport.top,
532
+ bottom: viewport.bottom - triggerRect.bottom,
533
+ left: triggerRect.left - viewport.left,
534
+ right: viewport.right - triggerRect.right
535
+ };
536
+ const centerY = triggerRect.top + triggerRect.height / 2;
537
+ const centerX = triggerRect.left + triggerRect.width / 2;
538
+ const halfWidth = toggletipRect.width / 2;
539
+ const halfHeight = toggletipRect.height / 2;
540
+ const minSpace = offset + buffer;
541
+ const fits = {
542
+ top: space.top >= toggletipRect.height + minSpace && centerX - halfWidth >= viewport.left + buffer && centerX + halfWidth <= viewport.right - buffer,
543
+ bottom: space.bottom >= toggletipRect.height + minSpace && centerX - halfWidth >= viewport.left + buffer && centerX + halfWidth <= viewport.right - buffer,
544
+ left: space.left >= toggletipRect.width + minSpace && centerY - halfHeight >= viewport.top + buffer && centerY + halfHeight <= viewport.bottom - buffer,
545
+ right: space.right >= toggletipRect.width + minSpace && centerY - halfHeight >= viewport.top + buffer && centerY + halfHeight <= viewport.bottom - buffer
546
+ };
547
+ const [primary, secondary] = placement.split("-");
548
+ if (fits[primary]) {
549
+ return placement;
550
+ }
551
+ const opposites = {
552
+ top: "bottom",
553
+ bottom: "top",
554
+ left: "right",
555
+ right: "left"
556
+ };
557
+ const opposite = opposites[primary];
558
+ if (opposite && fits[opposite]) {
559
+ return secondary ? `${opposite}-${secondary}` : opposite;
560
+ }
561
+ const perpendicular = primary === "top" || primary === "bottom" ? ["right", "left"] : ["bottom", "top"];
562
+ for (const dir of perpendicular) {
563
+ if (fits[dir]) {
564
+ return dir;
565
+ }
566
+ }
567
+ const best = Object.entries(space).sort(([, a], [, b]) => b - a)[0];
568
+ return best[0];
569
+ };
570
+ var useToggletip = ({
571
+ open,
572
+ direction,
573
+ offset,
574
+ autoDirection = true
575
+ }) => {
576
+ const [newDirection, setNewDirection] = useState(direction);
577
+ const referenceRef = useRef(null);
578
+ const floatingRef = useRef(null);
579
+ const setReference = useCallback((node) => {
580
+ referenceRef.current = node;
581
+ }, []);
582
+ const setFloating = useCallback((node) => {
583
+ floatingRef.current = node;
584
+ }, []);
585
+ useLayoutEffect(() => {
586
+ if (!open || !autoDirection || !referenceRef.current || !floatingRef.current) {
587
+ return;
588
+ }
589
+ let rafId = null;
590
+ const updatePlacement = () => {
591
+ rafId = null;
592
+ if (!referenceRef.current || !floatingRef.current) return;
593
+ const triggerRect = referenceRef.current.getBoundingClientRect();
594
+ const toggletipRect = floatingRef.current.getBoundingClientRect();
595
+ const calculatedDirection = checkCollision(
596
+ triggerRect,
597
+ toggletipRect,
598
+ direction,
599
+ offset,
600
+ referenceRef.current
601
+ );
602
+ setNewDirection(
603
+ (prev) => prev === calculatedDirection ? prev : calculatedDirection
604
+ );
605
+ };
606
+ const scheduleUpdate = () => {
607
+ if (rafId != null) return;
608
+ rafId = requestAnimationFrame(updatePlacement);
609
+ };
610
+ updatePlacement();
611
+ const scrollParent = getScrollParent(referenceRef.current);
612
+ const scrollTarget = scrollParent === document.body ? window : scrollParent;
613
+ scrollTarget.addEventListener("scroll", scheduleUpdate, {
614
+ capture: true,
615
+ passive: true
616
+ });
617
+ window.addEventListener("resize", scheduleUpdate);
618
+ let resizeObserver = null;
619
+ if (typeof ResizeObserver !== "undefined") {
620
+ resizeObserver = new ResizeObserver(scheduleUpdate);
621
+ if (referenceRef.current) {
622
+ resizeObserver.observe(referenceRef.current);
623
+ }
624
+ if (floatingRef.current) {
625
+ resizeObserver.observe(floatingRef.current);
626
+ }
627
+ }
628
+ return () => {
629
+ if (rafId != null) cancelAnimationFrame(rafId);
630
+ scrollTarget.removeEventListener("scroll", scheduleUpdate, {
631
+ capture: true
632
+ });
633
+ window.removeEventListener("resize", scheduleUpdate);
634
+ if (resizeObserver) resizeObserver.disconnect();
635
+ };
636
+ }, [open, autoDirection, direction, offset]);
637
+ useLayoutEffect(() => {
638
+ if (!open) {
639
+ setNewDirection(direction);
640
+ }
641
+ }, [open, direction]);
642
+ return {
643
+ refs: {
644
+ setReference,
645
+ setFloating
646
+ },
647
+ direction: newDirection
648
+ };
649
+ };
650
+
651
+ // src/Toggletip.tsx
652
+ import { jsx as jsx8, jsxs } from "react/jsx-runtime";
491
653
  var getPositionStyles = (placement, offset) => {
492
654
  switch (placement) {
493
- case "bottom-center":
494
- case "center":
655
+ case "bottom":
495
656
  return {
496
657
  top: `calc(100% + ${offset}px)`,
497
658
  left: "50%",
498
659
  transform: "translateX(-50%)"
499
660
  };
500
- case "bottom-start":
661
+ case "bottom-left":
501
662
  return { top: `calc(100% + ${offset}px)`, left: 0 };
502
- case "bottom-end":
663
+ case "bottom-right":
503
664
  return { top: `calc(100% + ${offset}px)`, right: 0 };
504
- case "top-center":
665
+ case "top":
505
666
  return {
506
667
  bottom: `calc(100% + ${offset}px)`,
507
668
  left: "50%",
508
669
  transform: "translateX(-50%)"
509
670
  };
510
- case "top-start":
671
+ case "top-left":
511
672
  return { bottom: `calc(100% + ${offset}px)`, left: 0 };
512
- case "top-end":
673
+ case "top-right":
513
674
  return { bottom: `calc(100% + ${offset}px)`, right: 0 };
514
- case "left-center":
675
+ case "left":
515
676
  return {
516
677
  right: `calc(100% + ${offset}px)`,
517
678
  top: "50%",
518
679
  transform: "translateY(-50%)"
519
680
  };
520
- case "left-start":
521
- return { right: `calc(100% + ${offset}px)`, top: 0 };
522
- case "left-end":
523
- return { right: `calc(100% + ${offset}px)`, bottom: 0 };
524
- case "right-center":
681
+ case "right":
525
682
  return {
526
683
  left: `calc(100% + ${offset}px)`,
527
684
  top: "50%",
528
685
  transform: "translateY(-50%)"
529
686
  };
530
- case "right-start":
531
- return { left: `calc(100% + ${offset}px)`, top: 0 };
532
- case "right-end":
533
- return { left: `calc(100% + ${offset}px)`, bottom: 0 };
534
687
  default:
535
688
  return {
536
689
  bottom: `calc(100% + ${offset}px)`,
@@ -546,62 +699,74 @@ var Toggletip = forwardRef3(
546
699
  content,
547
700
  footer,
548
701
  width = "288px",
549
- direction = "top-center",
702
+ direction = "top",
550
703
  autoDirection = true,
551
704
  offset = 12,
552
- style,
553
- "data-testid": dataTestId,
554
- className,
555
- ...props
705
+ "data-testid": dataTestId
556
706
  }, ref) => {
557
- const [isOpen, setOpen] = useState(false);
558
- const containerRef = useRef(null);
707
+ const [isOpen, setOpen] = useState2(false);
708
+ const containerRef = useRef2(null);
559
709
  const { theme } = useDesignSystem();
710
+ const { refs, direction: newDirection } = useToggletip({
711
+ open: isOpen,
712
+ direction,
713
+ offset,
714
+ autoDirection
715
+ });
560
716
  const toggleOpen = () => setOpen(!isOpen);
561
717
  useEffect(() => {
718
+ if (!isOpen || isNative) return;
562
719
  const handleClickOutside = (event) => {
563
- if (containerRef.current && !containerRef.current.contains(event.target)) {
720
+ if (containerRef.current && event.target instanceof Node && !containerRef.current.contains(event.target)) {
564
721
  setOpen(false);
565
722
  }
566
723
  };
567
- if (isOpen) {
568
- document.addEventListener("mousedown", handleClickOutside);
569
- }
570
- return () => document.removeEventListener("mousedown", handleClickOutside);
724
+ const handleEscape = (event) => {
725
+ if (event.key === "Escape") {
726
+ setOpen(false);
727
+ }
728
+ };
729
+ document.addEventListener("mousedown", handleClickOutside);
730
+ document.addEventListener("keydown", handleEscape);
731
+ return () => {
732
+ document.removeEventListener("mousedown", handleClickOutside);
733
+ document.removeEventListener("keydown", handleEscape);
734
+ };
571
735
  }, [isOpen]);
572
736
  const positionStyles = useMemo(
573
- () => getPositionStyles(direction, offset),
574
- [direction, offset]
737
+ () => getPositionStyles(newDirection, offset),
738
+ [newDirection, offset]
575
739
  );
576
740
  return /* @__PURE__ */ jsxs(
577
741
  Box,
578
742
  {
579
- ref: containerRef,
743
+ ref: (node) => {
744
+ containerRef.current = node;
745
+ refs.setReference(node);
746
+ },
580
747
  display: "inline-flex",
581
748
  position: "relative",
582
- className,
583
749
  style: { height: "fit-content" },
584
750
  children: [
585
751
  /* @__PURE__ */ jsx8(Box, { onPress: toggleOpen, style: { cursor: "pointer" }, children }),
586
752
  isOpen && /* @__PURE__ */ jsxs(
587
753
  Box,
588
754
  {
755
+ ref: refs.setFloating,
589
756
  "data-testid": dataTestId,
590
757
  position: "absolute",
591
- backgroundColor: theme.colors.background.secondary,
592
- borderRadius: 12,
593
- borderWidth: 1,
758
+ backgroundColor: theme.colors.background.primary,
759
+ borderRadius: 4,
594
760
  borderColor: theme.colors.border.secondary,
595
761
  padding: 12,
596
762
  width,
597
763
  zIndex: 2e3,
598
764
  style: {
599
765
  ...positionStyles,
600
- boxShadow: "0 4px 12px rgba(0, 36, 77, 0.2)",
601
- ...style
766
+ boxShadow: theme.shadow.popover
602
767
  },
603
768
  children: [
604
- title && /* @__PURE__ */ jsxs(Fragment, { children: [
769
+ title && /* @__PURE__ */ jsxs(Box, { gap: 8, children: [
605
770
  /* @__PURE__ */ jsx8(
606
771
  Text,
607
772
  {
@@ -609,13 +774,12 @@ var Toggletip = forwardRef3(
609
774
  fontSize: 24,
610
775
  lineHeight: "28px",
611
776
  fontWeight: "500",
612
- marginBottom: 8,
613
777
  children: title
614
778
  }
615
779
  ),
616
- /* @__PURE__ */ jsx8(Divider, { marginBottom: 12 })
780
+ /* @__PURE__ */ jsx8(Divider, { color: theme.colors.border.secondary })
617
781
  ] }),
618
- content && /* @__PURE__ */ jsx8(Box, { marginVertical: 16, children: typeof content === "string" || typeof content === "number" ? /* @__PURE__ */ jsx8(
782
+ content && /* @__PURE__ */ jsx8(Box, { marginBottom: 16, marginTop: 16, children: typeof content === "string" || typeof content === "number" ? /* @__PURE__ */ jsx8(
619
783
  Text,
620
784
  {
621
785
  color: theme.colors.content.primary,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../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":["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":["forwardRef","jsx","View","jsx","View","jsx","View","jsx","jsx","forwardRef","RNTextInput","jsx","jsx","forwardRef"]}
1
+ {"version":3,"sources":["../../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":["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, isNative } 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 \"data-testid\": dataTestId,\n },\n ref\n ) => {\n const [isOpen, setOpen] = useState(false);\n const containerRef = useRef<HTMLElement | null>(null);\n const { theme } = useDesignSystem();\n\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 if (!isOpen || isNative) return;\n\n const handleClickOutside = (event: MouseEvent) => {\n if (\n containerRef.current &&\n event.target instanceof Node &&\n !containerRef.current.contains(event.target)\n ) {\n setOpen(false);\n }\n };\n\n const handleEscape = (event: KeyboardEvent) => {\n if (event.key === \"Escape\") {\n setOpen(false);\n }\n };\n\n document.addEventListener(\"mousedown\", handleClickOutside);\n document.addEventListener(\"keydown\", handleEscape);\n\n return () => {\n document.removeEventListener(\"mousedown\", handleClickOutside);\n document.removeEventListener(\"keydown\", handleEscape);\n };\n }, [isOpen]);\n\n const positionStyles = useMemo(\n () => getPositionStyles(newDirection, offset),\n [newDirection, offset]\n );\n\n return (\n <Box\n ref={(node: HTMLElement | null) => {\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 data-testid={dataTestId}\n position=\"absolute\"\n backgroundColor={theme.colors.background.primary}\n borderRadius={4}\n borderColor={theme.colors.border.secondary}\n padding={12}\n width={width}\n zIndex={2000}\n style={{\n ...positionStyles,\n boxShadow: theme.shadow.popover,\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: HTMLElement | null) => void;\n setFloating: (node: HTMLElement | null) => void;\n };\n direction: ToggletipPlacement;\n}\n\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 scrollRegex = /(auto|scroll)/;\n const isScrollable =\n scrollRegex.test(overflow) ||\n scrollRegex.test(overflowX) ||\n scrollRegex.test(overflowY);\n\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\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\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 centerY = triggerRect.top + triggerRect.height / 2;\n const centerX = triggerRect.left + triggerRect.width / 2;\n const halfWidth = toggletipRect.width / 2;\n const halfHeight = toggletipRect.height / 2;\n const minSpace = offset + buffer;\n\n const fits = {\n top:\n space.top >= toggletipRect.height + minSpace &&\n centerX - halfWidth >= viewport.left + buffer &&\n centerX + halfWidth <= viewport.right - buffer,\n bottom:\n space.bottom >= toggletipRect.height + minSpace &&\n centerX - halfWidth >= viewport.left + buffer &&\n centerX + halfWidth <= viewport.right - buffer,\n left:\n space.left >= toggletipRect.width + minSpace &&\n centerY - halfHeight >= viewport.top + buffer &&\n centerY + halfHeight <= viewport.bottom - buffer,\n right:\n space.right >= toggletipRect.width + minSpace &&\n centerY - halfHeight >= viewport.top + buffer &&\n centerY + halfHeight <= viewport.bottom - buffer,\n };\n\n const [primary, secondary] = placement.split(\"-\");\n\n // If current placement fits, keep it\n if (fits[primary as keyof typeof fits]) {\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<HTMLElement | null>(null);\n const floatingRef = useRef<HTMLElement | null>(null);\n\n const setReference = useCallback((node: HTMLElement | null) => {\n referenceRef.current = node;\n }, []);\n\n const setFloating = useCallback((node: HTMLElement | null) => {\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 prev === calculatedDirection ? prev : calculatedDirection\n );\n };\n\n const scheduleUpdate = () => {\n if (rafId != null) return;\n rafId = requestAnimationFrame(updatePlacement);\n };\n\n updatePlacement();\n\n // Attach scroll listener to the actual scroll parent for better performance\n const scrollParent = getScrollParent(referenceRef.current);\n const scrollTarget = scrollParent === document.body ? window : scrollParent;\n\n scrollTarget.addEventListener(\"scroll\", scheduleUpdate, {\n capture: true,\n passive: true,\n });\n window.addEventListener(\"resize\", scheduleUpdate);\n\n // Safe ResizeObserver usage for SSR compatibility\n let resizeObserver: ResizeObserver | null = null;\n if (typeof ResizeObserver !== \"undefined\") {\n resizeObserver = new ResizeObserver(scheduleUpdate);\n if (referenceRef.current) {\n resizeObserver.observe(referenceRef.current);\n }\n if (floatingRef.current) {\n resizeObserver.observe(floatingRef.current);\n }\n }\n\n return () => {\n if (rafId != null) cancelAnimationFrame(rafId);\n scrollTarget.removeEventListener(\"scroll\", scheduleUpdate, {\n capture: true,\n } as EventListenerOptions);\n window.removeEventListener(\"resize\", scheduleUpdate);\n if (resizeObserver) 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":["forwardRef","useState","useRef","jsx","View","jsx","View","jsx","View","jsx","jsx","forwardRef","RNTextInput","jsx","jsx","forwardRef","useState","useRef"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@xsolla/xui-toggletip",
3
- "version": "0.65.0-pr73.1768528688",
3
+ "version": "0.65.0-pr79.1768620075",
4
4
  "main": "./web/index.js",
5
5
  "module": "./web/index.mjs",
6
6
  "types": "./web/index.d.ts",
@@ -10,9 +10,9 @@
10
10
  "build:native": "PLATFORM=native tsup"
11
11
  },
12
12
  "dependencies": {
13
- "@xsolla/xui-button": "0.65.0-pr73.1768528688",
14
- "@xsolla/xui-core": "0.65.0-pr73.1768528688",
15
- "@xsolla/xui-primitives-core": "0.65.0-pr73.1768528688"
13
+ "@xsolla/xui-button": "0.65.0-pr79.1768620075",
14
+ "@xsolla/xui-core": "0.65.0-pr79.1768620075",
15
+ "@xsolla/xui-primitives-core": "0.65.0-pr79.1768620075"
16
16
  },
17
17
  "peerDependencies": {
18
18
  "react": ">=16.8.0",
package/web/index.d.mts CHANGED
@@ -1,6 +1,6 @@
1
- import React, { ReactNode, CSSProperties } from 'react';
1
+ import React, { ReactNode } from 'react';
2
2
 
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";
3
+ type ToggletipPlacement = "top" | "top-left" | "top-right" | "bottom" | "bottom-left" | "bottom-right" | "left" | "right";
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-center"
28
+ * @default "top"
29
29
  */
30
30
  direction?: ToggletipPlacement;
31
31
  /**
@@ -37,9 +37,7 @@ interface ToggletipProps {
37
37
  * @default 12
38
38
  */
39
39
  offset?: number;
40
- style?: CSSProperties;
41
40
  "data-testid"?: string;
42
- className?: string;
43
41
  }
44
42
 
45
43
  declare const Toggletip: React.ForwardRefExoticComponent<ToggletipProps & React.RefAttributes<any>>;
package/web/index.d.ts CHANGED
@@ -1,6 +1,6 @@
1
- import React, { ReactNode, CSSProperties } from 'react';
1
+ import React, { ReactNode } from 'react';
2
2
 
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";
3
+ type ToggletipPlacement = "top" | "top-left" | "top-right" | "bottom" | "bottom-left" | "bottom-right" | "left" | "right";
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-center"
28
+ * @default "top"
29
29
  */
30
30
  direction?: ToggletipPlacement;
31
31
  /**
@@ -37,9 +37,7 @@ interface ToggletipProps {
37
37
  * @default 12
38
38
  */
39
39
  offset?: number;
40
- style?: CSSProperties;
41
40
  "data-testid"?: string;
42
- className?: string;
43
41
  }
44
42
 
45
43
  declare const Toggletip: React.ForwardRefExoticComponent<ToggletipProps & React.RefAttributes<any>>;