@xsolla/xui-toggletip 0.64.0-pr78.1768542245 → 0.64.0-pr78.1768543904

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/native/index.js CHANGED
@@ -527,7 +527,8 @@ var getScrollParent = (element) => {
527
527
  return document.body;
528
528
  }
529
529
  const { overflow, overflowX, overflowY } = window.getComputedStyle(element);
530
- const isScrollable = /(auto|scroll)/.test(overflow) || /(auto|scroll)/.test(overflowX) || /(auto|scroll)/.test(overflowY);
530
+ const scrollRegex = /(auto|scroll)/;
531
+ const isScrollable = scrollRegex.test(overflow) || scrollRegex.test(overflowX) || scrollRegex.test(overflowY);
531
532
  if (isScrollable && (element.scrollHeight > element.clientHeight || element.scrollWidth > element.clientWidth)) {
532
533
  return element;
533
534
  }
@@ -564,17 +565,19 @@ var checkCollision = (triggerRect, toggletipRect, placement, offset, triggerElem
564
565
  left: triggerRect.left - viewport.left,
565
566
  right: viewport.right - triggerRect.right
566
567
  };
567
- const triggerCenterY = triggerRect.top + triggerRect.height / 2;
568
- const triggerCenterX = triggerRect.left + triggerRect.width / 2;
568
+ const centerY = triggerRect.top + triggerRect.height / 2;
569
+ const centerX = triggerRect.left + triggerRect.width / 2;
570
+ const halfWidth = toggletipRect.width / 2;
571
+ const halfHeight = toggletipRect.height / 2;
572
+ const minSpace = offset + buffer;
569
573
  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
+ top: space.top >= toggletipRect.height + minSpace && centerX - halfWidth >= viewport.left + buffer && centerX + halfWidth <= viewport.right - buffer,
575
+ bottom: space.bottom >= toggletipRect.height + minSpace && centerX - halfWidth >= viewport.left + buffer && centerX + halfWidth <= viewport.right - buffer,
576
+ left: space.left >= toggletipRect.width + minSpace && centerY - halfHeight >= viewport.top + buffer && centerY + halfHeight <= viewport.bottom - buffer,
577
+ right: space.right >= toggletipRect.width + minSpace && centerY - halfHeight >= viewport.top + buffer && centerY + halfHeight <= viewport.bottom - buffer
574
578
  };
575
579
  const [primary, secondary] = placement.split("-");
576
- const primaryFits = fits[primary];
577
- if (primaryFits) {
580
+ if (fits[primary]) {
578
581
  return placement;
579
582
  }
580
583
  const opposites = {
@@ -628,26 +631,39 @@ var useToggletip = ({
628
631
  offset,
629
632
  referenceRef.current
630
633
  );
631
- setNewDirection((prev) => {
632
- if (prev === calculatedDirection) return prev;
633
- return calculatedDirection;
634
- });
634
+ setNewDirection(
635
+ (prev) => prev === calculatedDirection ? prev : calculatedDirection
636
+ );
635
637
  };
636
638
  const scheduleUpdate = () => {
637
639
  if (rafId != null) return;
638
640
  rafId = requestAnimationFrame(updatePlacement);
639
641
  };
640
642
  updatePlacement();
641
- window.addEventListener("scroll", scheduleUpdate, true);
643
+ const scrollParent = getScrollParent(referenceRef.current);
644
+ const scrollTarget = scrollParent === document.body ? window : scrollParent;
645
+ scrollTarget.addEventListener("scroll", scheduleUpdate, {
646
+ capture: true,
647
+ passive: true
648
+ });
642
649
  window.addEventListener("resize", scheduleUpdate);
643
- const resizeObserver = new ResizeObserver(scheduleUpdate);
644
- resizeObserver.observe(referenceRef.current);
645
- resizeObserver.observe(floatingRef.current);
650
+ let resizeObserver = null;
651
+ if (typeof ResizeObserver !== "undefined") {
652
+ resizeObserver = new ResizeObserver(scheduleUpdate);
653
+ if (referenceRef.current) {
654
+ resizeObserver.observe(referenceRef.current);
655
+ }
656
+ if (floatingRef.current) {
657
+ resizeObserver.observe(floatingRef.current);
658
+ }
659
+ }
646
660
  return () => {
647
661
  if (rafId != null) cancelAnimationFrame(rafId);
648
- window.removeEventListener("scroll", scheduleUpdate, true);
662
+ scrollTarget.removeEventListener("scroll", scheduleUpdate, {
663
+ capture: true
664
+ });
649
665
  window.removeEventListener("resize", scheduleUpdate);
650
- resizeObserver.disconnect();
666
+ if (resizeObserver) resizeObserver.disconnect();
651
667
  };
652
668
  }, [open, autoDirection, direction, offset]);
653
669
  (0, import_react4.useLayoutEffect)(() => {
@@ -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","../../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: 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":["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"]}
package/native/index.mjs CHANGED
@@ -495,7 +495,8 @@ var getScrollParent = (element) => {
495
495
  return document.body;
496
496
  }
497
497
  const { overflow, overflowX, overflowY } = window.getComputedStyle(element);
498
- const isScrollable = /(auto|scroll)/.test(overflow) || /(auto|scroll)/.test(overflowX) || /(auto|scroll)/.test(overflowY);
498
+ const scrollRegex = /(auto|scroll)/;
499
+ const isScrollable = scrollRegex.test(overflow) || scrollRegex.test(overflowX) || scrollRegex.test(overflowY);
499
500
  if (isScrollable && (element.scrollHeight > element.clientHeight || element.scrollWidth > element.clientWidth)) {
500
501
  return element;
501
502
  }
@@ -532,17 +533,19 @@ var checkCollision = (triggerRect, toggletipRect, placement, offset, triggerElem
532
533
  left: triggerRect.left - viewport.left,
533
534
  right: viewport.right - triggerRect.right
534
535
  };
535
- const triggerCenterY = triggerRect.top + triggerRect.height / 2;
536
- const triggerCenterX = triggerRect.left + triggerRect.width / 2;
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;
537
541
  const fits = {
538
- top: space.top >= toggletipRect.height + offset + buffer && triggerCenterX - toggletipRect.width / 2 >= viewport.left + buffer && triggerCenterX + toggletipRect.width / 2 <= viewport.right - buffer,
539
- bottom: space.bottom >= toggletipRect.height + offset + buffer && triggerCenterX - toggletipRect.width / 2 >= viewport.left + buffer && triggerCenterX + toggletipRect.width / 2 <= viewport.right - buffer,
540
- left: space.left >= toggletipRect.width + offset + buffer && triggerCenterY - toggletipRect.height / 2 >= viewport.top + buffer && triggerCenterY + toggletipRect.height / 2 <= viewport.bottom - buffer,
541
- right: space.right >= toggletipRect.width + offset + buffer && triggerCenterY - toggletipRect.height / 2 >= viewport.top + buffer && triggerCenterY + toggletipRect.height / 2 <= viewport.bottom - buffer
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
542
546
  };
543
547
  const [primary, secondary] = placement.split("-");
544
- const primaryFits = fits[primary];
545
- if (primaryFits) {
548
+ if (fits[primary]) {
546
549
  return placement;
547
550
  }
548
551
  const opposites = {
@@ -596,26 +599,39 @@ var useToggletip = ({
596
599
  offset,
597
600
  referenceRef.current
598
601
  );
599
- setNewDirection((prev) => {
600
- if (prev === calculatedDirection) return prev;
601
- return calculatedDirection;
602
- });
602
+ setNewDirection(
603
+ (prev) => prev === calculatedDirection ? prev : calculatedDirection
604
+ );
603
605
  };
604
606
  const scheduleUpdate = () => {
605
607
  if (rafId != null) return;
606
608
  rafId = requestAnimationFrame(updatePlacement);
607
609
  };
608
610
  updatePlacement();
609
- window.addEventListener("scroll", scheduleUpdate, true);
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
+ });
610
617
  window.addEventListener("resize", scheduleUpdate);
611
- const resizeObserver = new ResizeObserver(scheduleUpdate);
612
- resizeObserver.observe(referenceRef.current);
613
- resizeObserver.observe(floatingRef.current);
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
+ }
614
628
  return () => {
615
629
  if (rafId != null) cancelAnimationFrame(rafId);
616
- window.removeEventListener("scroll", scheduleUpdate, true);
630
+ scrollTarget.removeEventListener("scroll", scheduleUpdate, {
631
+ capture: true
632
+ });
617
633
  window.removeEventListener("resize", scheduleUpdate);
618
- resizeObserver.disconnect();
634
+ if (resizeObserver) resizeObserver.disconnect();
619
635
  };
620
636
  }, [open, autoDirection, direction, offset]);
621
637
  useLayoutEffect(() => {
@@ -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","../../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 } 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":["forwardRef","useState","useRef","jsx","View","jsx","View","jsx","View","jsx","jsx","forwardRef","RNTextInput","jsx","jsx","forwardRef","useState","useRef"]}
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 } 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: 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"]}