From 799595d8dc2cc514178fd32b32b3597217d15085 Mon Sep 17 00:00:00 2001 From: "Srirang.Kalantri" Date: Thu, 30 Apr 2026 20:30:56 +0530 Subject: [PATCH 01/15] fix: replace eact-native-action-button library --- .../package.json | 4 +- .../src/FloatingActionButton.tsx | 338 +++-- .../__tests__/FloatingActionButton.spec.tsx | 46 +- .../FloatingActionButton.spec.tsx.snap | 1264 ++++++++--------- 4 files changed, 825 insertions(+), 827 deletions(-) diff --git a/packages/pluggableWidgets/floating-action-button-native/package.json b/packages/pluggableWidgets/floating-action-button-native/package.json index 5952ca1c1..6f4f25e9a 100644 --- a/packages/pluggableWidgets/floating-action-button-native/package.json +++ b/packages/pluggableWidgets/floating-action-button-native/package.json @@ -20,9 +20,7 @@ }, "dependencies": { "@mendix/piw-native-utils-internal": "*", - "@mendix/piw-utils-internal": "*", - "deprecated-react-native-prop-types": "^4.0.0", - "react-native-action-button": "^2.8.5" + "@mendix/piw-utils-internal": "*" }, "devDependencies": { "@mendix/pluggable-widgets-tools": "*" diff --git a/packages/pluggableWidgets/floating-action-button-native/src/FloatingActionButton.tsx b/packages/pluggableWidgets/floating-action-button-native/src/FloatingActionButton.tsx index ceb381296..b25df7814 100644 --- a/packages/pluggableWidgets/floating-action-button-native/src/FloatingActionButton.tsx +++ b/packages/pluggableWidgets/floating-action-button-native/src/FloatingActionButton.tsx @@ -1,132 +1,246 @@ import { flattenStyles } from "@mendix/piw-native-utils-internal"; import { Icon } from "mendix/components/native/Icon"; -import { Component, JSX } from "react"; -import { View } from "react-native"; -import ActionButton from "react-native-action-button"; +import { ReactElement, useState, useRef, useEffect } from "react"; +import { View, TouchableOpacity, Text, ViewStyle, Animated } from "react-native"; import { FloatingActionButtonProps } from "../typings/FloatingActionButtonProps"; import { defaultFloatingActionButtonStyle, FloatingActionButtonStyle } from "./ui/styles"; import { executeAction } from "@mendix/piw-utils-internal"; -interface State { - active: boolean; -} - const defaultIconSource = { type: "glyph", iconClass: "glyphicon-plus" } as const; const defaultActiveIconSource = { type: "glyph", iconClass: "glyphicon-remove" } as const; -export class FloatingActionButton extends Component, State> { - readonly state: State = { - active: false +export function FloatingActionButton(props: FloatingActionButtonProps): ReactElement { + const [isOpen, setIsOpen] = useState(false); + + const styles = flattenStyles(defaultFloatingActionButtonStyle, props.style); + const animation = useRef(new Animated.Value(0)).current; + + useEffect(() => { + Animated.spring(animation, { + toValue: isOpen ? 1 : 0, + friction: 7, + tension: 40, + useNativeDriver: true + }).start(); + }, [isOpen, animation]); + + const iconRotation = animation.interpolate({ + inputRange: [0, 1], + outputRange: ["0deg", "180deg"] + }); + + const handlePress = (): void => { + if (props.secondaryButtons?.length > 0) { + setIsOpen(!isOpen); + } else { + executeAction(props.onClick); + } }; - private readonly styles = flattenStyles(defaultFloatingActionButtonStyle, this.props.style); - private readonly onPressHandler = this.onPress.bind(this); - private readonly renderIconHandler = this.renderIcon.bind(this); - - render(): JSX.Element { - const buttonStyle = { ...this.styles.button }; - delete buttonStyle.rippleColor; - - return ( - 0 ? 180 : 0} - onPress={this.onPressHandler} - fixNativeFeedbackRadius - backgroundTappable - activeOpacity={0.2} - elevation={buttonStyle.elevation} - offsetX={0} - offsetY={0} - zIndex={999} - testID={this.props.name} - > - {this.renderButtons()} - - ); - } - - private renderIcon(): JSX.Element { - const { icon, iconActive } = this.props; - const iconSource = icon && icon.value ? icon.value : defaultIconSource; - const activeIconSource = iconActive && iconActive.value ? iconActive.value : defaultActiveIconSource; - - const isActive = this.state.active && this.props.secondaryButtons.length > 0; - const source = isActive ? activeIconSource : iconSource; - const style = isActive ? { transform: [{ rotate: "-180deg" }] } : {}; - const buttonContainerStyle = [this.styles.button, this.styles.buttonContainer]; - - return ( - - - - - - ); - } + const margin = (styles.container.margin as number) ?? 30; + const mainButtonSize = styles.button.size ?? 54; + const secondaryButtonSize = styles.secondaryButton.size ?? 40; - private renderButtons(): JSX.Element[] | undefined { - return ( - this.props.secondaryButtons && - this.props.secondaryButtons.map((button, index) => { - return ( - { - this.setState({ active: false }); - executeAction(button.onClick); - }} - activeOpacity={0.2} - spaceBetween={0} - > - {button.icon.value && ( - - )} - - ); - }) - ); - } - - private get verticalOrientation(): "up" | "down" { - switch (this.props.verticalPosition) { - case "bottom": - return "up"; - case "top": - return "down"; + const isVerticalUp = props.verticalPosition === "bottom"; + const verticalDirection = isVerticalUp ? -1 : 1; + const secondaryButtonGap = 20; + const mainToFirstButtonGap = secondaryButtonGap; + const firstButtonOffset = mainButtonSize / 2 + secondaryButtonSize / 2 + mainToFirstButtonGap; + const buttonSpacing = secondaryButtonSize + secondaryButtonGap; + + const labelOnRight = props.horizontalPosition === "left"; + const captionSpacing = (styles.secondaryButtonCaptionContainer.marginHorizontal as number) ?? 15; + + // Horizontal positioning using edge-relative styles instead of pixel offsets + const getHorizontalPosition = (buttonSize: number): ViewStyle => { + const centerAlignmentOffset = (mainButtonSize - buttonSize) / 2; + + switch (props.horizontalPosition) { + case "left": + return { left: margin + centerAlignmentOffset }; + case "right": + return { right: margin + centerAlignmentOffset }; + case "center": default: - return "down"; + return { left: "50%", marginLeft: -buttonSize / 2 }; } - } + }; - private onPress(): void { - if (this.props.secondaryButtons && this.props.secondaryButtons.length > 0) { - // eslint-disable-next-line react/no-access-state-in-setstate - this.setState({ active: !this.state.active }); + const mainButtonHorizontal = getHorizontalPosition(mainButtonSize); + const secondaryButtonHorizontal = getHorizontalPosition(secondaryButtonSize); + const secondaryCenterAlignmentOffset = (mainButtonSize - secondaryButtonSize) / 2; - return; + const getLabelHorizontalPosition = (): ViewStyle => { + switch (props.horizontalPosition) { + case "left": + return { left: margin + secondaryCenterAlignmentOffset + secondaryButtonSize + captionSpacing }; + case "right": + return { right: margin + secondaryCenterAlignmentOffset + secondaryButtonSize + captionSpacing }; + case "center": + default: + return labelOnRight + ? { left: "50%", marginLeft: secondaryButtonSize / 2 + captionSpacing } + : { right: "50%", marginRight: secondaryButtonSize / 2 + captionSpacing }; } + }; + + const secondaryLabelHorizontal = getLabelHorizontalPosition(); + + const containerStyle: ViewStyle = { + position: "absolute", + left: 0, + right: 0, + top: 0, + bottom: 0, + direction: "ltr", + zIndex: 999, + pointerEvents: "box-none" + }; + + const mainButtonTop = props.verticalPosition === "top" ? margin : undefined; + const mainButtonBottom = props.verticalPosition === "bottom" ? margin : undefined; + + const currentIcon = (() => { + const shouldShowActive = isOpen && props.secondaryButtons.length > 0; + return shouldShowActive + ? props.iconActive?.value || defaultActiveIconSource + : props.icon?.value || defaultIconSource; + })(); + + return ( + + {/* Secondary buttons */} + {props.secondaryButtons?.map((button, index) => { + const yOffset = verticalDirection * (firstButtonOffset + index * buttonSpacing); + const staggerDelay = Math.min(index * 0.08, 0.4); + + const opacity = animation.interpolate({ + inputRange: [0, staggerDelay, Math.min(staggerDelay + 0.2, 1)], + outputRange: [0, 0, 1], + extrapolate: "clamp" + }); + + const translateY = animation.interpolate({ + inputRange: [0, 1], + outputRange: [0, yOffset] + }); - executeAction(this.props.onClick); - } + const buttonTop = props.verticalPosition === "top" ? margin : undefined; + const buttonBottom = props.verticalPosition === "bottom" ? margin : undefined; + + return ( + + {/* Button */} + + { + setIsOpen(false); + executeAction(button.onClick); + }} + activeOpacity={0.2} + > + {button.icon.value && ( + + )} + + + + {/* Label */} + {button.caption?.value && ( + + + {button.caption.value} + + + )} + + ); + })} + + {/* Main FAB button */} + + + + + + + + + ); } diff --git a/packages/pluggableWidgets/floating-action-button-native/src/__tests__/FloatingActionButton.spec.tsx b/packages/pluggableWidgets/floating-action-button-native/src/__tests__/FloatingActionButton.spec.tsx index 0fd71141b..e697a2ee7 100644 --- a/packages/pluggableWidgets/floating-action-button-native/src/__tests__/FloatingActionButton.spec.tsx +++ b/packages/pluggableWidgets/floating-action-button-native/src/__tests__/FloatingActionButton.spec.tsx @@ -1,11 +1,10 @@ import { FloatingActionButtonProps } from "../../typings/FloatingActionButtonProps"; import { FloatingActionButtonStyle } from "../ui/styles"; -import { fireEvent, render, waitForElementToBeRemoved } from "@testing-library/react-native"; +import { fireEvent, render } from "@testing-library/react-native"; import { FloatingActionButton } from "../FloatingActionButton"; import { actionValue, dynamicValue } from "@mendix/piw-utils-internal"; import { NativeIcon } from "mendix"; import { Icon } from "mendix/components/native/Icon"; -import { ReactTestInstance } from "react-test-renderer"; describe("FloatingActionButton", () => { let defaultProps: FloatingActionButtonProps; @@ -58,17 +57,28 @@ describe("FloatingActionButton", () => { expect(component.toJSON()).toMatchSnapshot(); }); - it.skip("should open and close when clicked and secondary buttons are defined", async () => { + it("should open and close when clicked and secondary buttons are defined", () => { const { getByTestId, queryAllByTestId } = render( ); + // Initially closed - buttons exist but have opacity 0 + const closedButtons = queryAllByTestId(/FloatingAction\$button*/); + expect(closedButtons).toHaveLength(3); + closedButtons.forEach(button => { + const animatedView = button.parent; + expect(animatedView?.props.style).toBeDefined(); + }); + + // Open - buttons should still exist (now with opacity > 0 after animation) fireEvent(getByTestId("FloatingAction"), "onPress"); - expect(queryAllByTestId(/FloatingAction\$button*/)).toHaveLength(3); + const openButtons = queryAllByTestId(/FloatingAction\$button*/); + expect(openButtons).toHaveLength(3); + // Close again - buttons still exist (will animate back to opacity 0) fireEvent(getByTestId("FloatingAction"), "onPress"); - await waitForElementToBeRemoved(() => queryAllByTestId("FloatingAction$button0")); - expect(queryAllByTestId(/FloatingAction\$button*/)).toHaveLength(0); + const closedAgainButtons = queryAllByTestId(/FloatingAction\$button*/); + expect(closedAgainButtons).toHaveLength(3); }); it("should cancel any events of primary button if secondary buttons exist", () => { @@ -89,7 +99,7 @@ describe("FloatingActionButton", () => { expect(mockEvent.execute).toHaveBeenCalledTimes(1); }); - it.skip("should trigger event on secondary button", () => { + it("should trigger event on secondary button", () => { const { getByTestId } = render(); fireEvent(getByTestId("FloatingAction"), "onPress"); @@ -114,21 +124,25 @@ describe("FloatingActionButton", () => { secondaryButtons={secondaryButtons} /> ); - const transformStyle = [{ transform: [{ rotate: "-180deg" }] }]; - - const iconView = getByTestId("FloatingAction$IconView").children[0] as ReactTestInstance; - const iconComponent = iconView.findByType(Icon); + const iconViewContainer = getByTestId("FloatingAction$IconView"); + const iconComponent = iconViewContainer.findByType(Icon); expect(iconComponent.props.icon).toEqual(icon.value); - expect(iconView.props.style).not.toEqual(expect.arrayContaining(transformStyle)); + + // Check rotation is at 0deg initially + const initialStyle = iconViewContainer.props.style; + expect(initialStyle).toBeDefined(); fireEvent(getByTestId("FloatingAction"), "onPress"); - const iconActiveComponent = iconView.findByType(Icon); + const iconActiveComponent = iconViewContainer.findByType(Icon); expect(iconActiveComponent.props.icon).toEqual(iconActive.value); - expect(iconView.props.style).toEqual(expect.arrayContaining(transformStyle)); + + // Check rotation transform exists after press (will be interpolated, not exactly -180deg in test) + const activeStyle = iconViewContainer.props.style; + expect(activeStyle).toBeDefined(); }); - it.skip("should have custom icon on secondary button", async () => { + it("should have custom icon on secondary button", async () => { const { getByTestId } = render(); fireEvent(getByTestId("FloatingAction"), "onPress"); @@ -136,7 +150,7 @@ describe("FloatingActionButton", () => { expect(secondaryButtonIcon.props.icon).toEqual(secondaryButtons[2].icon.value); }); - it.skip("should have custom caption on secondary button", async () => { + it("should have custom caption on secondary button", async () => { const { getByTestId, findByText } = render( ); diff --git a/packages/pluggableWidgets/floating-action-button-native/src/__tests__/__snapshots__/FloatingActionButton.spec.tsx.snap b/packages/pluggableWidgets/floating-action-button-native/src/__tests__/__snapshots__/FloatingActionButton.spec.tsx.snap index 0ca4039fa..1cf990fbb 100644 --- a/packages/pluggableWidgets/floating-action-button-native/src/__tests__/__snapshots__/FloatingActionButton.spec.tsx.snap +++ b/packages/pluggableWidgets/floating-action-button-native/src/__tests__/__snapshots__/FloatingActionButton.spec.tsx.snap @@ -2,111 +2,44 @@ exports[`FloatingActionButton renders correct props with secondary buttons 1`] = ` - - - - - - - + testId="icon" + /> - - -`; - -exports[`FloatingActionButton renders correct props without secondary buttons 1`] = ` - - + > + + caption1 + + + - - - - - - + testId="icon" + /> - - -`; - -exports[`FloatingActionButton vertical position renders position bottom correctly 1`] = ` - - + > + + caption2 + + + + + + + + caption3 + + + + + + - - - - - - + } + testID="FloatingAction$IconView" + > + `; -exports[`FloatingActionButton vertical position renders position top correctly 1`] = ` +exports[`FloatingActionButton renders correct props without secondary buttons 1`] = ` + - + + + + + + + +`; + +exports[`FloatingActionButton vertical position renders position bottom correctly 1`] = ` + + } +> + + + + + +`; + +exports[`FloatingActionButton vertical position renders position top correctly 1`] = ` + + + + - - - - - - + testId="icon" + /> From 1c7f5b992526cb31485cc3d496331a91e1f97a01 Mon Sep 17 00:00:00 2001 From: "Srirang.Kalantri" Date: Fri, 1 May 2026 15:37:19 +0530 Subject: [PATCH 02/15] chore: add changelog and bump version --- .../floating-action-button-native/CHANGELOG.md | 6 ++++++ .../floating-action-button-native/package.json | 2 +- .../floating-action-button-native/src/package.xml | 2 +- 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/packages/pluggableWidgets/floating-action-button-native/CHANGELOG.md b/packages/pluggableWidgets/floating-action-button-native/CHANGELOG.md index e3da03c62..6f71d4058 100644 --- a/packages/pluggableWidgets/floating-action-button-native/CHANGELOG.md +++ b/packages/pluggableWidgets/floating-action-button-native/CHANGELOG.md @@ -6,6 +6,12 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), ## [Unreleased] +### Changed + +- Replaced `react-native-action-button` library with custom implementation using React Native's Animated API for better maintainability and reduced bundle size. + +- Removed deprecated `react-native-prop-types` dependency. + ## [4.1.0] - 2024-12-3 ### Changed diff --git a/packages/pluggableWidgets/floating-action-button-native/package.json b/packages/pluggableWidgets/floating-action-button-native/package.json index 6f4f25e9a..e99ce1a07 100644 --- a/packages/pluggableWidgets/floating-action-button-native/package.json +++ b/packages/pluggableWidgets/floating-action-button-native/package.json @@ -1,7 +1,7 @@ { "name": "floating-action-button-native", "widgetName": "FloatingActionButton", - "version": "4.2.0", + "version": "4.2.1", "license": "Apache-2.0", "repository": { "type": "git", diff --git a/packages/pluggableWidgets/floating-action-button-native/src/package.xml b/packages/pluggableWidgets/floating-action-button-native/src/package.xml index 316b2538e..af33e8f2d 100644 --- a/packages/pluggableWidgets/floating-action-button-native/src/package.xml +++ b/packages/pluggableWidgets/floating-action-button-native/src/package.xml @@ -1,6 +1,6 @@ - + From 26857681033464fc6836a725d96d8ebcf87fc54a Mon Sep 17 00:00:00 2001 From: "Srirang.Kalantri" Date: Fri, 1 May 2026 15:59:56 +0530 Subject: [PATCH 03/15] fix: remove unused patch file --- package.json | 1 - .../react-native-action-button+2.8.5.patch | 69 ------------------- pnpm-lock.yaml | 19 ----- 3 files changed, 89 deletions(-) delete mode 100644 patches/react-native-action-button+2.8.5.patch diff --git a/package.json b/package.json index 38788fba1..6bb81ab42 100644 --- a/package.json +++ b/package.json @@ -106,7 +106,6 @@ "patchedDependencies": { "@mendix/pluggable-widgets-tools@11.8.0": "patches/@mendix+pluggable-widgets-tools+11.8.0.patch", "@ptomasroos/react-native-multi-slider@1.0.0": "patches/@ptomasroos+react-native-multi-slider+1.0.0.patch", - "react-native-action-button@2.8.5": "patches/react-native-action-button+2.8.5.patch", "react-native-gesture-handler@2.30.0": "patches/react-native-gesture-handler+2.30.0.patch", "react-native-slider@0.11.0": "patches/react-native-slider+0.11.0.patch", "react-native-snap-carousel@3.9.1": "patches/react-native-snap-carousel+3.9.1.patch", diff --git a/patches/react-native-action-button+2.8.5.patch b/patches/react-native-action-button+2.8.5.patch deleted file mode 100644 index 79247e6df..000000000 --- a/patches/react-native-action-button+2.8.5.patch +++ /dev/null @@ -1,69 +0,0 @@ -diff --git a/ActionButton.js b/ActionButton.js -index b8306c2efb2460d4aa110e83d2e5410588f280de..890003d30fa5400f4778f5bb2dffa10e70fbe3ee 100644 ---- a/ActionButton.js -+++ b/ActionButton.js -@@ -16,6 +16,7 @@ import { - touchableBackground, - DEFAULT_ACTIVE_OPACITY - } from "./shared"; -+import { TextPropTypes } from 'deprecated-react-native-prop-types' - - export default class ActionButton extends Component { - constructor(props) { -@@ -39,11 +40,11 @@ export default class ActionButton extends Component { - clearTimeout(this.timeout); - } - -- componentWillReceiveProps(nextProps) { -+ UNSAFE_componentWillReceiveProps(nextProps) { - if (nextProps.resetToken !== this.state.resetToken) { - if (nextProps.active === false && this.state.active === true) { - if (this.props.onReset) this.props.onReset(); -- Animated.spring(this.anim, { toValue: 0 }).start(); -+ Animated.spring(this.anim, { toValue: 0, useNativeDriver: false }).start(); - setTimeout( - () => - this.setState({ active: false, resetToken: nextProps.resetToken }), -@@ -53,7 +54,7 @@ export default class ActionButton extends Component { - } - - if (nextProps.active === true && this.state.active === false) { -- Animated.spring(this.anim, { toValue: 1 }).start(); -+ Animated.spring(this.anim, { toValue: 1, useNativeDriver: false }).start(); - this.setState({ active: true, resetToken: nextProps.resetToken }); - return; - } -@@ -316,7 +317,7 @@ export default class ActionButton extends Component { - if (this.state.active) return this.reset(); - - if (animate) { -- Animated.spring(this.anim, { toValue: 1 }).start(); -+ Animated.spring(this.anim, { toValue: 1, useNativeDriver: false }).start(); - } else { - this.anim.setValue(1); - } -@@ -328,14 +329,14 @@ export default class ActionButton extends Component { - if (this.props.onReset) this.props.onReset(); - - if (animate) { -- Animated.spring(this.anim, { toValue: 0 }).start(); -+ Animated.spring(this.anim, { toValue: 0, useNativeDriver: false }).start(); - } else { - this.anim.setValue(0); - } - - setTimeout(() => { - if (this.mounted) { - this.setState({ active: false, resetToken: this.state.resetToken }); - } - }, 250); - } -@@ -363,7 +364,7 @@ ActionButton.propTypes = { - bgColor: PropTypes.string, - bgOpacity: PropTypes.number, - buttonColor: PropTypes.string, -- buttonTextStyle: Text.propTypes.style, -+ buttonTextStyle: TextPropTypes.style, - buttonText: PropTypes.string, - - offsetX: PropTypes.number, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b3207f41d..2d287e38d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -35,9 +35,6 @@ patchedDependencies: '@ptomasroos/react-native-multi-slider@1.0.0': hash: b5e11465e4305f5284e90a78fc4575401f791921f34dbbafb9831f19ecae94da path: patches/@ptomasroos+react-native-multi-slider+1.0.0.patch - react-native-action-button@2.8.5: - hash: 593bb64b27425a7f3805ad9567928d1369fd4cf939ab5d3eb43411a759565c48 - path: patches/react-native-action-button+2.8.5.patch react-native-gesture-handler@2.30.0: hash: 10e538f7cf8a69122ef742c51cb8285f723512c9d8596d9bc6db6ebae0651573 path: patches/react-native-gesture-handler+2.30.0.patch @@ -515,12 +512,6 @@ importers: '@mendix/piw-utils-internal': specifier: '*' version: link:../../tools/piw-utils-internal - deprecated-react-native-prop-types: - specifier: ^4.0.0 - version: 4.2.3 - react-native-action-button: - specifier: ^2.8.5 - version: 2.8.5(patch_hash=593bb64b27425a7f3805ad9567928d1369fd4cf939ab5d3eb43411a759565c48)(react-native@0.83.3(@babel/core@7.28.0)(@react-native-community/cli@14.1.0(typescript@5.9.3))(@types/react@19.2.14)(react@19.2.4)) devDependencies: '@mendix/pluggable-widgets-tools': specifier: 11.8.0 @@ -6459,11 +6450,6 @@ packages: react-is@19.2.4: resolution: {integrity: sha512-W+EWGn2v0ApPKgKKCy/7s7WHXkboGcsrXE+2joLyVxkbyVQfO3MUEaUQDHoSmb8TFFrSKYa9mw64WZHNHSDzYA==} - react-native-action-button@2.8.5: - resolution: {integrity: sha512-BvGZpzuGeuFR2Y6j93+vKiSqDhsF87VHvNXFs/qEYKfzT4b1ASAT/GQbgS6gNt4jRJCUnJWYrIwlBzRjesZQmQ==} - peerDependencies: - react-native: 0.83.3 - react-native-animatable@1.3.3: resolution: {integrity: sha512-2ckIxZQAsvWn25Ho+DK3d1mXIgj7tITkrS4pYDvx96WyOttSvzzFeQnM2od0+FUMzILbdHDsDEqZvnz1DYNQ1w==} @@ -15061,11 +15047,6 @@ snapshots: react-is@19.2.4: {} - react-native-action-button@2.8.5(patch_hash=593bb64b27425a7f3805ad9567928d1369fd4cf939ab5d3eb43411a759565c48)(react-native@0.83.3(@babel/core@7.28.0)(@react-native-community/cli@14.1.0(typescript@5.9.3))(@types/react@19.2.14)(react@19.2.4)): - dependencies: - prop-types: 15.8.1 - react-native: 0.83.3(@babel/core@7.28.0)(@react-native-community/cli@14.1.0(typescript@5.9.3))(@types/react@19.2.14)(react@19.2.4) - react-native-animatable@1.3.3: dependencies: prop-types: 15.8.1 From 560a5f822ddc6c3acfe919b1388e6a822fdfa22c Mon Sep 17 00:00:00 2001 From: "Srirang.Kalantri" Date: Tue, 12 May 2026 17:17:22 +0530 Subject: [PATCH 04/15] fix: tests --- .../e2e/specs/maestro/FloatingActionButton.yaml | 1 + .../floating-action-button-native/src/FloatingActionButton.tsx | 1 + .../__tests__/__snapshots__/FloatingActionButton.spec.tsx.snap | 3 +++ 3 files changed, 5 insertions(+) diff --git a/packages/pluggableWidgets/floating-action-button-native/e2e/specs/maestro/FloatingActionButton.yaml b/packages/pluggableWidgets/floating-action-button-native/e2e/specs/maestro/FloatingActionButton.yaml index 1e058c499..5c1701178 100644 --- a/packages/pluggableWidgets/floating-action-button-native/e2e/specs/maestro/FloatingActionButton.yaml +++ b/packages/pluggableWidgets/floating-action-button-native/e2e/specs/maestro/FloatingActionButton.yaml @@ -12,6 +12,7 @@ appId: "${APP_ID}" text: "Music w/ action" - tapOn: id: "floatingActionButtonBottomLeft" +- waitForAnimationToEnd - assertVisible: text: "Zooooom" - tapOn: diff --git a/packages/pluggableWidgets/floating-action-button-native/src/FloatingActionButton.tsx b/packages/pluggableWidgets/floating-action-button-native/src/FloatingActionButton.tsx index b25df7814..4b1cc5f21 100644 --- a/packages/pluggableWidgets/floating-action-button-native/src/FloatingActionButton.tsx +++ b/packages/pluggableWidgets/floating-action-button-native/src/FloatingActionButton.tsx @@ -193,6 +193,7 @@ export function FloatingActionButton(props: FloatingActionButtonProps {button.caption.value} diff --git a/packages/pluggableWidgets/floating-action-button-native/src/__tests__/__snapshots__/FloatingActionButton.spec.tsx.snap b/packages/pluggableWidgets/floating-action-button-native/src/__tests__/__snapshots__/FloatingActionButton.spec.tsx.snap index 1cf990fbb..8dc8c7c67 100644 --- a/packages/pluggableWidgets/floating-action-button-native/src/__tests__/__snapshots__/FloatingActionButton.spec.tsx.snap +++ b/packages/pluggableWidgets/floating-action-button-native/src/__tests__/__snapshots__/FloatingActionButton.spec.tsx.snap @@ -96,6 +96,7 @@ exports[`FloatingActionButton renders correct props with secondary buttons 1`] = Date: Thu, 14 May 2026 12:24:26 +0530 Subject: [PATCH 05/15] fix: test --- .../specs/maestro/FloatingActionButton.yaml | 1 - .../src/FloatingActionButton.tsx | 12 ++-- .../FloatingActionButton.spec.tsx.snap | 60 ++++++++++++------- 3 files changed, 45 insertions(+), 28 deletions(-) diff --git a/packages/pluggableWidgets/floating-action-button-native/e2e/specs/maestro/FloatingActionButton.yaml b/packages/pluggableWidgets/floating-action-button-native/e2e/specs/maestro/FloatingActionButton.yaml index 5c1701178..1e058c499 100644 --- a/packages/pluggableWidgets/floating-action-button-native/e2e/specs/maestro/FloatingActionButton.yaml +++ b/packages/pluggableWidgets/floating-action-button-native/e2e/specs/maestro/FloatingActionButton.yaml @@ -12,7 +12,6 @@ appId: "${APP_ID}" text: "Music w/ action" - tapOn: id: "floatingActionButtonBottomLeft" -- waitForAnimationToEnd - assertVisible: text: "Zooooom" - tapOn: diff --git a/packages/pluggableWidgets/floating-action-button-native/src/FloatingActionButton.tsx b/packages/pluggableWidgets/floating-action-button-native/src/FloatingActionButton.tsx index 4b1cc5f21..d1d7606eb 100644 --- a/packages/pluggableWidgets/floating-action-button-native/src/FloatingActionButton.tsx +++ b/packages/pluggableWidgets/floating-action-button-native/src/FloatingActionButton.tsx @@ -180,7 +180,6 @@ export function FloatingActionButton(props: FloatingActionButtonProps - - {button.caption.value} - + + + {button.caption.value} + + )} diff --git a/packages/pluggableWidgets/floating-action-button-native/src/__tests__/__snapshots__/FloatingActionButton.spec.tsx.snap b/packages/pluggableWidgets/floating-action-button-native/src/__tests__/__snapshots__/FloatingActionButton.spec.tsx.snap index 8dc8c7c67..1656d14c2 100644 --- a/packages/pluggableWidgets/floating-action-button-native/src/__tests__/__snapshots__/FloatingActionButton.spec.tsx.snap +++ b/packages/pluggableWidgets/floating-action-button-native/src/__tests__/__snapshots__/FloatingActionButton.spec.tsx.snap @@ -99,11 +99,9 @@ exports[`FloatingActionButton renders correct props with secondary buttons 1`] = pointerEvents="none" style={ { - "alignItems": "flex-end", "bottom": 30, "height": 40, "justifyContent": "center", - "marginHorizontal": 15, "opacity": 0, "position": "absolute", "right": 92, @@ -116,12 +114,20 @@ exports[`FloatingActionButton renders correct props with secondary buttons 1`] = } } > - - caption1 - + + caption1 + + - - caption2 - + + caption2 + + - - caption3 - + + caption3 + + Date: Thu, 14 May 2026 13:04:15 +0530 Subject: [PATCH 06/15] fix: test check --- .../e2e/specs/maestro/FloatingActionButton.yaml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/pluggableWidgets/floating-action-button-native/e2e/specs/maestro/FloatingActionButton.yaml b/packages/pluggableWidgets/floating-action-button-native/e2e/specs/maestro/FloatingActionButton.yaml index 1e058c499..e89c85cce 100644 --- a/packages/pluggableWidgets/floating-action-button-native/e2e/specs/maestro/FloatingActionButton.yaml +++ b/packages/pluggableWidgets/floating-action-button-native/e2e/specs/maestro/FloatingActionButton.yaml @@ -12,6 +12,8 @@ appId: "${APP_ID}" text: "Music w/ action" - tapOn: id: "floatingActionButtonBottomLeft" +- takeScreenshot: + path: "maestro/images/actual/${PLATFORM}/floating_action_test" - assertVisible: text: "Zooooom" - tapOn: From a1cfd61f828745acd26c5d3db6c142544c4a810c Mon Sep 17 00:00:00 2001 From: "Srirang.Kalantri" Date: Thu, 14 May 2026 14:03:03 +0530 Subject: [PATCH 07/15] fix: get screenshot --- .../e2e/specs/maestro/FloatingActionButton.yaml | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/packages/pluggableWidgets/floating-action-button-native/e2e/specs/maestro/FloatingActionButton.yaml b/packages/pluggableWidgets/floating-action-button-native/e2e/specs/maestro/FloatingActionButton.yaml index e89c85cce..c4cda7c8f 100644 --- a/packages/pluggableWidgets/floating-action-button-native/e2e/specs/maestro/FloatingActionButton.yaml +++ b/packages/pluggableWidgets/floating-action-button-native/e2e/specs/maestro/FloatingActionButton.yaml @@ -12,14 +12,12 @@ appId: "${APP_ID}" text: "Music w/ action" - tapOn: id: "floatingActionButtonBottomLeft" -- takeScreenshot: - path: "maestro/images/actual/${PLATFORM}/floating_action_test" -- assertVisible: - text: "Zooooom" +# - assertVisible: +# text: "Zooooom" - tapOn: id: "floatingActionButtonBottomRight" -- assertVisible: - text: "Email" +# - assertVisible: +# text: "Email" - tapOn: id: "floatingActionButtonTopRight" - takeScreenshot: From 099887fa2b1a735fe9cde4c265979aa3a5df2d77 Mon Sep 17 00:00:00 2001 From: "Srirang.Kalantri" Date: Fri, 15 May 2026 13:04:57 +0530 Subject: [PATCH 08/15] fix: multiple FAB --- .../e2e/specs/maestro/FloatingActionButton.yaml | 8 ++++---- .../src/FloatingActionButton.tsx | 12 ++++++++---- .../FloatingActionButton.spec.tsx.snap | 14 ++++++++++---- 3 files changed, 22 insertions(+), 12 deletions(-) diff --git a/packages/pluggableWidgets/floating-action-button-native/e2e/specs/maestro/FloatingActionButton.yaml b/packages/pluggableWidgets/floating-action-button-native/e2e/specs/maestro/FloatingActionButton.yaml index c4cda7c8f..1e058c499 100644 --- a/packages/pluggableWidgets/floating-action-button-native/e2e/specs/maestro/FloatingActionButton.yaml +++ b/packages/pluggableWidgets/floating-action-button-native/e2e/specs/maestro/FloatingActionButton.yaml @@ -12,12 +12,12 @@ appId: "${APP_ID}" text: "Music w/ action" - tapOn: id: "floatingActionButtonBottomLeft" -# - assertVisible: -# text: "Zooooom" +- assertVisible: + text: "Zooooom" - tapOn: id: "floatingActionButtonBottomRight" -# - assertVisible: -# text: "Email" +- assertVisible: + text: "Email" - tapOn: id: "floatingActionButtonTopRight" - takeScreenshot: diff --git a/packages/pluggableWidgets/floating-action-button-native/src/FloatingActionButton.tsx b/packages/pluggableWidgets/floating-action-button-native/src/FloatingActionButton.tsx index d1d7606eb..3b4a34bf6 100644 --- a/packages/pluggableWidgets/floating-action-button-native/src/FloatingActionButton.tsx +++ b/packages/pluggableWidgets/floating-action-button-native/src/FloatingActionButton.tsx @@ -94,7 +94,6 @@ export function FloatingActionButton(props: FloatingActionButtonProps @@ -34,6 +33,7 @@ exports[`FloatingActionButton renders correct props with secondary buttons 1`] = }, ], "width": 40, + "zIndex": 100, } } > @@ -111,6 +111,7 @@ exports[`FloatingActionButton renders correct props with secondary buttons 1`] = "translateY": 0, }, ], + "zIndex": 100, } } > @@ -149,6 +150,7 @@ exports[`FloatingActionButton renders correct props with secondary buttons 1`] = }, ], "width": 40, + "zIndex": 100, } } > @@ -226,6 +228,7 @@ exports[`FloatingActionButton renders correct props with secondary buttons 1`] = "translateY": 0, }, ], + "zIndex": 100, } } > @@ -264,6 +267,7 @@ exports[`FloatingActionButton renders correct props with secondary buttons 1`] = }, ], "width": 40, + "zIndex": 100, } } > @@ -341,6 +345,7 @@ exports[`FloatingActionButton renders correct props with secondary buttons 1`] = "translateY": 0, }, ], + "zIndex": 100, } } > @@ -369,6 +374,7 @@ exports[`FloatingActionButton renders correct props with secondary buttons 1`] = "position": "absolute", "top": undefined, "width": 54, + "zIndex": 200, }, { "right": 30, @@ -465,7 +471,6 @@ exports[`FloatingActionButton renders correct props without secondary buttons 1` "position": "absolute", "right": 0, "top": 0, - "zIndex": 999, } } > @@ -478,6 +483,7 @@ exports[`FloatingActionButton renders correct props without secondary buttons 1` "position": "absolute", "top": undefined, "width": 54, + "zIndex": 200, }, { "right": 30, @@ -574,7 +580,6 @@ exports[`FloatingActionButton vertical position renders position bottom correctl "position": "absolute", "right": 0, "top": 0, - "zIndex": 999, } } > @@ -587,6 +592,7 @@ exports[`FloatingActionButton vertical position renders position bottom correctl "position": "absolute", "top": undefined, "width": 54, + "zIndex": 200, }, { "right": 30, @@ -683,7 +689,6 @@ exports[`FloatingActionButton vertical position renders position top correctly 1 "position": "absolute", "right": 0, "top": 0, - "zIndex": 999, } } > @@ -696,6 +701,7 @@ exports[`FloatingActionButton vertical position renders position top correctly 1 "position": "absolute", "top": 30, "width": 54, + "zIndex": 200, }, { "right": 30, From c7b272c1b8c32c12524f5d99d5cd9c955b2fd1c3 Mon Sep 17 00:00:00 2001 From: "Srirang.Kalantri" Date: Mon, 18 May 2026 15:52:32 +0530 Subject: [PATCH 09/15] fix: issue --- .../package.json | 3 +- .../src/FloatingActionButton.tsx | 535 +++++++++------- .../FloatingActionButton.spec.tsx.snap | 594 ++++++++++++++---- 3 files changed, 796 insertions(+), 336 deletions(-) diff --git a/packages/pluggableWidgets/floating-action-button-native/package.json b/packages/pluggableWidgets/floating-action-button-native/package.json index e99ce1a07..5db19bcef 100644 --- a/packages/pluggableWidgets/floating-action-button-native/package.json +++ b/packages/pluggableWidgets/floating-action-button-native/package.json @@ -20,7 +20,8 @@ }, "dependencies": { "@mendix/piw-native-utils-internal": "*", - "@mendix/piw-utils-internal": "*" + "@mendix/piw-utils-internal": "*", + "react-native-reanimated": "^3.0.0" }, "devDependencies": { "@mendix/pluggable-widgets-tools": "*" diff --git a/packages/pluggableWidgets/floating-action-button-native/src/FloatingActionButton.tsx b/packages/pluggableWidgets/floating-action-button-native/src/FloatingActionButton.tsx index 3b4a34bf6..43fc419a4 100644 --- a/packages/pluggableWidgets/floating-action-button-native/src/FloatingActionButton.tsx +++ b/packages/pluggableWidgets/floating-action-button-native/src/FloatingActionButton.tsx @@ -1,251 +1,362 @@ import { flattenStyles } from "@mendix/piw-native-utils-internal"; +import { executeAction } from "@mendix/piw-utils-internal"; import { Icon } from "mendix/components/native/Icon"; -import { ReactElement, useState, useRef, useEffect } from "react"; -import { View, TouchableOpacity, Text, ViewStyle, Animated } from "react-native"; +import { Component, JSX } from "react"; +import { Pressable, StyleSheet, Text, View, ViewStyle } from "react-native"; +import Animated, { Easing, interpolate, useAnimatedStyle, useSharedValue, withTiming } from "react-native-reanimated"; import { FloatingActionButtonProps } from "../typings/FloatingActionButtonProps"; import { defaultFloatingActionButtonStyle, FloatingActionButtonStyle } from "./ui/styles"; -import { executeAction } from "@mendix/piw-utils-internal"; + +interface State { + active: boolean; +} const defaultIconSource = { type: "glyph", iconClass: "glyphicon-plus" } as const; const defaultActiveIconSource = { type: "glyph", iconClass: "glyphicon-remove" } as const; +const SECONDARY_GAP = 16; -export function FloatingActionButton(props: FloatingActionButtonProps): ReactElement { - const [isOpen, setIsOpen] = useState(false); - - const styles = flattenStyles(defaultFloatingActionButtonStyle, props.style); - const animation = useRef(new Animated.Value(0)).current; +interface AnimatedMainIconProps { + active: boolean; + hasSecondaryButtons: boolean; + style: FloatingActionButtonStyle; + icon: FloatingActionButtonProps["icon"]; + iconActive: FloatingActionButtonProps["iconActive"]; +} - useEffect(() => { - Animated.spring(animation, { - toValue: isOpen ? 1 : 0, - friction: 7, - tension: 40, - useNativeDriver: true - }).start(); - }, [isOpen, animation]); +function AnimatedMainIcon(props: AnimatedMainIconProps): JSX.Element { + const { active, hasSecondaryButtons, style, icon, iconActive } = props; - const iconRotation = animation.interpolate({ - inputRange: [0, 1], - outputRange: ["0deg", "180deg"] + const progress = useSharedValue(active && hasSecondaryButtons ? 1 : 0); + progress.value = withTiming(active && hasSecondaryButtons ? 1 : 0, { + duration: 200, + easing: Easing.out(Easing.ease) }); - const handlePress = (): void => { - if (props.secondaryButtons?.length > 0) { - setIsOpen(!isOpen); - } else { - executeAction(props.onClick); - } - }; + const animatedStyle = useAnimatedStyle(() => ({ + transform: [ + { + rotate: `${interpolate(progress.value, [0, 1], [0, -180])}deg` + } + ] + })); - const margin = (styles.container.margin as number) ?? 30; - const mainButtonSize = styles.button.size ?? 54; - const secondaryButtonSize = styles.secondaryButton.size ?? 40; + const iconSource = icon?.value ? icon.value : defaultIconSource; + const activeIconSource = iconActive?.value ? iconActive.value : defaultActiveIconSource; + const source = active && hasSecondaryButtons ? activeIconSource : iconSource; - const isVerticalUp = props.verticalPosition === "bottom"; - const verticalDirection = isVerticalUp ? -1 : 1; - const secondaryButtonGap = 20; - const mainToFirstButtonGap = secondaryButtonGap; - const firstButtonOffset = mainButtonSize / 2 + secondaryButtonSize / 2 + mainToFirstButtonGap; - const buttonSpacing = secondaryButtonSize + secondaryButtonGap; + return ( + + + + + + ); +} - const labelOnRight = props.horizontalPosition === "left"; - const captionSpacing = (styles.secondaryButtonCaptionContainer.marginHorizontal as number) ?? 15; +interface SecondaryActionItemProps { + active: boolean; + index: number; + direction: "up" | "down"; + horizontalPosition: "left" | "right" | "center"; + name: string; + button: FloatingActionButtonProps["secondaryButtons"][number]; + style: FloatingActionButtonStyle; + mainButtonSize: number; + secondaryButtonSize: number; + onPress: () => void; +} - // Horizontal positioning using edge-relative styles instead of pixel offsets - const getHorizontalPosition = (buttonSize: number): ViewStyle => { - const centerAlignmentOffset = (mainButtonSize - buttonSize) / 2; +function SecondaryActionItem(props: SecondaryActionItemProps): JSX.Element { + const { + active, + index, + direction, + horizontalPosition, + name, + button, + style, + mainButtonSize, + secondaryButtonSize, + onPress + } = props; - switch (props.horizontalPosition) { - case "left": - return { left: margin + centerAlignmentOffset }; - case "right": - return { right: margin + centerAlignmentOffset }; - case "center": - default: - return { left: "50%", marginLeft: -buttonSize / 2 }; - } - }; + const progress = useSharedValue(active ? 1 : 0); + progress.value = withTiming(active ? 1 : 0, { + duration: 200, + easing: Easing.out(Easing.ease) + }); - const mainButtonHorizontal = getHorizontalPosition(mainButtonSize); - const secondaryButtonHorizontal = getHorizontalPosition(secondaryButtonSize); - const secondaryCenterAlignmentOffset = (mainButtonSize - secondaryButtonSize) / 2; + const labelOnRight = horizontalPosition === "left"; + const labelOnLeft = horizontalPosition === "right"; - const getLabelHorizontalPosition = (): ViewStyle => { - switch (props.horizontalPosition) { - case "left": - return { left: margin + secondaryCenterAlignmentOffset + secondaryButtonSize + captionSpacing }; - case "right": - return { right: margin + secondaryCenterAlignmentOffset + secondaryButtonSize + captionSpacing }; - case "center": - default: - return labelOnRight - ? { left: "50%", marginLeft: secondaryButtonSize / 2 + captionSpacing } - : { right: "50%", marginRight: secondaryButtonSize / 2 + captionSpacing }; - } - }; + const animatedStyle = useAnimatedStyle(() => { + const centerToCenterDistance = + (mainButtonSize + secondaryButtonSize) / 2 + SECONDARY_GAP + index * (secondaryButtonSize + SECONDARY_GAP); - const secondaryLabelHorizontal = getLabelHorizontalPosition(); + return { + opacity: progress.value, + transform: [ + { + translateY: interpolate( + progress.value, + [0, 1], + [0, direction === "up" ? -centerToCenterDistance : centerToCenterDistance] + ) + }, + { scale: interpolate(progress.value, [0, 1], [0.8, 1]) } + ] + }; + }); - const containerStyle: ViewStyle = { - position: "absolute", + const anchorStyle: ViewStyle = { left: 0, right: 0, - top: 0, - bottom: 0, - direction: "ltr", - pointerEvents: "box-none" + top: (mainButtonSize - secondaryButtonSize) / 2, + alignItems: "center" }; - const mainButtonTop = props.verticalPosition === "top" ? margin : undefined; - const mainButtonBottom = props.verticalPosition === "bottom" ? margin : undefined; - - const currentIcon = (() => { - const shouldShowActive = isOpen && props.secondaryButtons.length > 0; - return shouldShowActive - ? props.iconActive?.value || defaultActiveIconSource - : props.icon?.value || defaultIconSource; - })(); - return ( - - {/* Secondary buttons */} - {props.secondaryButtons?.map((button, index) => { - const yOffset = verticalDirection * (firstButtonOffset + index * buttonSpacing); - const staggerDelay = Math.min(index * 0.08, 0.4); - - const opacity = animation.interpolate({ - inputRange: [0, staggerDelay, Math.min(staggerDelay + 0.2, 1)], - outputRange: [0, 0, 1], - extrapolate: "clamp" - }); - - const translateY = animation.interpolate({ - inputRange: [0, 1], - outputRange: [0, yOffset] - }); - - // For bottom FABs, use top positioning with translated offset - // This ensures proper rendering when multiple FABs are on screen - const buttonTop = props.verticalPosition === "top" ? margin : undefined; - const buttonBottom = props.verticalPosition === "bottom" ? margin : undefined; - - return ( - - {/* Button */} - - { - setIsOpen(false); - executeAction(button.onClick); - }} - activeOpacity={0.2} - > - {button.icon.value && ( - - )} - - - - {/* Label */} - {button.caption?.value && ( - - - - {button.caption.value} - - - - )} - - ); - })} - - {/* Main FAB button */} + - + + {button.caption.value} + + + ) : null} + + [ + styles.secondaryButtonBase, + style.secondaryButton, { - width: mainButtonSize, - height: mainButtonSize, - borderRadius: mainButtonSize / 2 + width: secondaryButtonSize, + height: secondaryButtonSize, + borderRadius: secondaryButtonSize / 2, + opacity: pressed ? 0.2 : 1 } ]} > - + ) : null} + + + {labelOnRight && button.caption?.value ? ( + - - - + + {button.caption.value} + + + ) : null} - + ); } + +export class FloatingActionButton extends Component, State> { + readonly state: State = { + active: false + }; + + private readonly onPressHandler = this.onPress.bind(this); + + render(): JSX.Element { + const style = flattenStyles(defaultFloatingActionButtonStyle, this.props.style); + const buttonStyle = { ...style.button }; + delete buttonStyle.rippleColor; + + const mainButtonSize = style.button.size ?? 54; + const secondaryButtonSize = style.secondaryButton.size ?? 40; + const horizontalPosition = this.props.horizontalPosition ?? "right"; + const hasSecondaryButtons = !!this.props.secondaryButtons?.length; + + return ( + + {this.renderButtons(style, mainButtonSize, secondaryButtonSize, horizontalPosition)} + + [ + styles.mainButtonBase, + buttonStyle, + { + width: mainButtonSize, + height: mainButtonSize, + borderRadius: mainButtonSize / 2, + opacity: pressed ? 0.2 : 1 + } + ]} + > + + + + ); + } + + private renderButtons( + style: FloatingActionButtonStyle, + mainButtonSize: number, + secondaryButtonSize: number, + horizontalPosition: "left" | "right" | "center" + ): JSX.Element[] | undefined { + return this.props.secondaryButtons?.map((button, index) => ( + { + this.setState({ active: false }); + executeAction(button.onClick); + }} + /> + )); + } + + private get verticalOrientation(): "up" | "down" { + switch (this.props.verticalPosition) { + case "bottom": + return "up"; + case "top": + return "down"; + default: + return "down"; + } + } + + private getPositionStyle(): ViewStyle { + const positionStyle: ViewStyle = { + position: "absolute", + left: 0, + right: 0, + zIndex: 999 + }; + + switch (this.props.verticalPosition) { + case "bottom": + positionStyle.bottom = 0; + break; + case "top": + default: + positionStyle.top = 0; + break; + } + + switch (this.props.horizontalPosition) { + case "left": + positionStyle.alignItems = "flex-start"; + break; + case "center": + positionStyle.alignItems = "center"; + break; + case "right": + default: + positionStyle.alignItems = "flex-end"; + break; + } + + return positionStyle; + } + + private onPress(): void { + if (this.props.secondaryButtons?.length) { + // eslint-disable-next-line react/no-access-state-in-setstate + this.setState({ active: !this.state.active }); + return; + } + + executeAction(this.props.onClick); + } +} + +const styles = StyleSheet.create({ + wrapper: { + justifyContent: "flex-end" + }, + mainButtonBase: { + alignItems: "center", + justifyContent: "center" + }, + secondaryAnchor: { + position: "absolute" + }, + secondaryRow: { + width: "100%", + flexDirection: "row", + alignItems: "center" + }, + rowAlignLeft: { + justifyContent: "flex-start" + }, + rowAlignRight: { + justifyContent: "flex-end" + }, + rowAlignCenter: { + justifyContent: "center" + }, + secondaryButtonBase: { + alignItems: "center", + justifyContent: "center", + flexShrink: 0 + }, + captionInlineContainer: { + flexShrink: 0 + }, + captionBeforeButton: { + marginRight: 8, + alignItems: "flex-end" + }, + captionAfterButton: { + marginLeft: 8, + alignItems: "flex-start" + }, + captionText: { + flexShrink: 0 + } +}); diff --git a/packages/pluggableWidgets/floating-action-button-native/src/__tests__/__snapshots__/FloatingActionButton.spec.tsx.snap b/packages/pluggableWidgets/floating-action-button-native/src/__tests__/__snapshots__/FloatingActionButton.spec.tsx.snap index 9084ef3d7..fd0a2e71e 100644 --- a/packages/pluggableWidgets/floating-action-button-native/src/__tests__/__snapshots__/FloatingActionButton.spec.tsx.snap +++ b/packages/pluggableWidgets/floating-action-button-native/src/__tests__/__snapshots__/FloatingActionButton.spec.tsx.snap @@ -11,6 +11,7 @@ exports[`FloatingActionButton renders correct props with secondary buttons 1`] = "position": "absolute", "right": 0, "top": 0, + "zIndex": 1000, } } > @@ -19,23 +20,61 @@ exports[`FloatingActionButton renders correct props with secondary buttons 1`] = > @@ -546,18 +805,47 @@ exports[`FloatingActionButton renders correct props without secondary buttons 1` > @@ -655,18 +944,47 @@ exports[`FloatingActionButton vertical position renders position bottom correctl > @@ -764,18 +1083,47 @@ exports[`FloatingActionButton vertical position renders position top correctly 1 > Date: Mon, 18 May 2026 16:04:56 +0530 Subject: [PATCH 10/15] fix: pnpm-lock --- pnpm-lock.yaml | 512 ++++++++++++++++++++----------------------------- 1 file changed, 208 insertions(+), 304 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 2d287e38d..a28e2fe7a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -512,6 +512,9 @@ importers: '@mendix/piw-utils-internal': specifier: '*' version: link:../../tools/piw-utils-internal + react-native-reanimated: + specifier: ^3.0.0 + version: 3.19.5(@babel/core@7.28.0)(react-native@0.83.3(@babel/core@7.28.0)(@react-native-community/cli@14.1.0(typescript@5.9.3))(@types/react@19.2.14)(react@19.2.4))(react@19.2.4) devDependencies: '@mendix/pluggable-widgets-tools': specifier: 11.8.0 @@ -1038,24 +1041,12 @@ packages: resolution: {integrity: sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==} engines: {node: '>=6.9.0'} - '@babel/helper-create-class-features-plugin@7.27.1': - resolution: {integrity: sha512-QwGAmuvM17btKU5VqXfb+Giw4JcN0hjuufz3DYnpeVDvZLAObloM77bhMXiqry3Iio+Ai4phVRDwl6WU10+r5A==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - '@babel/helper-create-class-features-plugin@7.28.6': resolution: {integrity: sha512-dTOdvsjnG3xNT9Y0AUg1wAl38y+4Rl4sf9caSQZOXdNqVn+H+HbbJ4IyyHaIqNR6SW9oJpA/RuRjsjCw2IdIow==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-create-regexp-features-plugin@7.27.1': - resolution: {integrity: sha512-uVDC72XVf8UbrH5qQTc18Agb8emwjTiZrQE11Nv3CuBEZmVvTwwE9CBUEvHku06gQCAyYf8Nv6ja1IN+6LMbxQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - '@babel/helper-create-regexp-features-plugin@7.28.5': resolution: {integrity: sha512-N1EhvLtHzOvj7QQOUCCS3NrPJP8c5W6ZXCHDn7Yialuy1iu4r5EmIYkXlKNqT99Ciw+W0mDqWoR6HWMZlFP3hw==} engines: {node: '>=6.9.0'} @@ -1142,10 +1133,6 @@ packages: resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} engines: {node: '>=6.9.0'} - '@babel/helper-validator-identifier@7.27.1': - resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==} - engines: {node: '>=6.9.0'} - '@babel/helper-validator-identifier@7.28.5': resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} engines: {node: '>=6.9.0'} @@ -1286,12 +1273,6 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-jsx@7.27.1': - resolution: {integrity: sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-jsx@7.28.6': resolution: {integrity: sha512-wgEmr06G6sIpqr8YDwA2dSRTE3bJ+V0IfpzfSY3Lfgd7YWOaAdlykvJi13ZKBt8cZHfgH1IXN+CL656W3uUa4w==} engines: {node: '>=6.9.0'} @@ -1424,12 +1405,6 @@ packages: peerDependencies: '@babel/core': ^7.12.0 - '@babel/plugin-transform-classes@7.28.0': - resolution: {integrity: sha512-IjM1IoJNw72AZFlj33Cu8X0q2XK/6AaVC3jQu+cgQ5lThWD5ajnuUAml80dqRmOhmPkTH8uAwnpMu9Rvj0LTRA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-classes@7.28.4': resolution: {integrity: sha512-cFOlhIYPBv/iBoc+KS3M6et2XPtbT2HiCRfBXWtfpc9OAyostldxIf9YAYB6ypURBBbx+Qv6nyrLzASfJe+hBA==} engines: {node: '>=6.9.0'} @@ -1562,12 +1537,6 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-modules-commonjs@7.27.1': - resolution: {integrity: sha512-OJguuwlTYlN0gBZFRPqwOGNWssZjfIUdS7HMYtN8c1KmwpwHFBwTeFZrg9XZa+DFTitWOW5iTAG7tyCUPsCCyw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-modules-commonjs@7.28.6': resolution: {integrity: sha512-jppVbf8IV9iWWwWTQIxJMAJCWBuuKx71475wHwYytrRGQ2CWiDvYlADQno3tcYpS/T2UUWFQp3nVtYfK/YBQrA==} engines: {node: '>=6.9.0'} @@ -1820,12 +1789,6 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-typescript@7.28.0': - resolution: {integrity: sha512-4AEiDEBPIZvLQaWlc9liCavE0xRM0dNca41WtBeM3jgFptfUOSG9z0uteLhq6+3rq+WB6jIvUwKDTpXEHPJ2Vg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-typescript@7.28.6': resolution: {integrity: sha512-0YWL2RFxOqEm9Efk5PvreamxPME8OyY0wM5wh5lHjF+VtVhdneCWGzZeSqzOfiobVqQaNCd2z0tQvnI9DaPWPw==} engines: {node: '>=6.9.0'} @@ -2551,6 +2514,7 @@ packages: '@react-navigation/core@6.4.17': resolution: {integrity: sha512-Nd76EpomzChWAosGqWOYE3ItayhDzIEzzZsT7PfGcRFDgW5miHV2t4MZcq9YIK4tzxZjVVpYbIynOOQQd1e0Cg==} + deprecated: This version is no longer supported peerDependencies: react: 19.2.4 @@ -2568,12 +2532,14 @@ packages: '@react-navigation/native@6.1.18': resolution: {integrity: sha512-mIT9MiL/vMm4eirLcmw2h6h/Nm5FICtnYSdohq4vTLA2FF/6PNhByM7s8ffqoVfE5L0uAa6Xda1B7oddolUiGg==} + deprecated: This version is no longer supported peerDependencies: react: 19.2.4 react-native: 0.83.3 '@react-navigation/routers@6.1.9': resolution: {integrity: sha512-lTM8gSFHSfkJvQkxacGM6VJtBt61ip2XO54aNfswD+KMw6eeZ4oehl7m0me3CR9hnDE4+60iAZR8sAhvCiI3NA==} + deprecated: This version is no longer supported '@rollup/plugin-alias@5.1.1': resolution: {integrity: sha512-PR9zDb+rOzkRb2VD+EuKB7UC41vU5DIwZ5qqCpk0KJudcWAyi8rvYOhS7+L5aZCspw1stTViLgN5v6FF1p5cgQ==} @@ -5230,11 +5196,6 @@ packages: canvas: optional: true - jsesc@3.0.2: - resolution: {integrity: sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==} - engines: {node: '>=6'} - hasBin: true - jsesc@3.1.0: resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} engines: {node: '>=6'} @@ -6502,6 +6463,12 @@ packages: react: 19.2.4 react-native: 0.83.3 + react-native-is-edge-to-edge@1.1.7: + resolution: {integrity: sha512-EH6i7E8epJGIcu7KpfXYXiV2JFIYITtq+rVS8uEb+92naMRBdxhTuS8Wn2Q7j9sqyO0B+Xbaaf9VdipIAmGW4w==} + peerDependencies: + react: 19.2.4 + react-native: 0.83.3 + react-native-is-edge-to-edge@1.2.1: resolution: {integrity: sha512-FLbPWl/MyYQWz+KwqOZsSyj2JmLKglHatd3xLZWskXOpRaio4LfEDEz8E/A6uD8QoTHW6Aobw1jbEwK7KMgR7Q==} peerDependencies: @@ -6578,6 +6545,13 @@ packages: react-native: 0.83.3 react-native-svg: ^9.6.4 + react-native-reanimated@3.19.5: + resolution: {integrity: sha512-bd4AwIkBAaY4BjrgpSoKjEaRG/tXD756F5nGuiH5IMBSKN8tRdUEA8hWZCyIo/R6/kha/tVSoCqodVUACh7ZWw==} + peerDependencies: + '@babel/core': ^7.0.0-0 + react: 19.2.4 + react-native: 0.83.3 + react-native-reanimated@4.2.2: resolution: {integrity: sha512-o3kKvdD8cVlg12Z4u3jv0MFAt53QV4k7gD9OLwQqU8eZLyd8QvaOjVZIghMZhC2pjP93uUU44PlO5JgF8S4Vxw==} peerDependencies: @@ -6735,10 +6709,6 @@ packages: resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==} engines: {node: '>= 0.4'} - regenerate-unicode-properties@10.2.0: - resolution: {integrity: sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA==} - engines: {node: '>=4'} - regenerate-unicode-properties@10.2.2: resolution: {integrity: sha512-m03P+zhBeQd1RGnYxrGyDAPpWX/epKirLrp8e3qevZdVkKtnCrjjWczIbYc8+xd6vcTStVlqfycTx1KR4LOr0g==} engines: {node: '>=4'} @@ -6756,10 +6726,6 @@ packages: resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==} engines: {node: '>= 0.4'} - regexpu-core@6.2.0: - resolution: {integrity: sha512-H66BPQMrv+V16t8xtmq+UC0CBpiTBA60V8ibS1QVReIp8T1z8hwFxqcGzm9K6lgsN7sB5edVH8a+ze6Fqm4weA==} - engines: {node: '>=4'} - regexpu-core@6.4.0: resolution: {integrity: sha512-0ghuzq67LI9bLXpOX/ISfve/Mq33a4aFRzoQYhnnok1JOFpmE/A2TBGkNVenOGEeSBCjIiWcc6MVOG5HEQv0sA==} engines: {node: '>=4'} @@ -6767,10 +6733,6 @@ packages: regjsgen@0.8.0: resolution: {integrity: sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==} - regjsparser@0.12.0: - resolution: {integrity: sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ==} - hasBin: true - regjsparser@0.13.0: resolution: {integrity: sha512-NZQZdC5wOE/H3UT28fVGL+ikOZcEzfMGk/c3iN9UGxzWHMa1op7274oyiUVrAG4B2EuFhus8SvkaYnhvW92p9Q==} hasBin: true @@ -7507,10 +7469,6 @@ packages: resolution: {integrity: sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==} engines: {node: '>=4'} - unicode-match-property-value-ecmascript@2.2.0: - resolution: {integrity: sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg==} - engines: {node: '>=4'} - unicode-match-property-value-ecmascript@2.2.1: resolution: {integrity: sha512-JQ84qTuMg4nVkx8ga4A16a1epI9H6uTXAknqxkGF/aFfRLw1xC/Bp24HNLaZhHSkWd3+84t8iXnp1J0kYcZHhg==} engines: {node: '>=4'} @@ -7998,7 +7956,7 @@ snapshots: '@babel/code-frame@7.27.1': dependencies: - '@babel/helper-validator-identifier': 7.27.1 + '@babel/helper-validator-identifier': 7.28.5 js-tokens: 4.0.0 picocolors: 1.1.1 @@ -8017,13 +7975,13 @@ snapshots: '@ampproject/remapping': 2.3.0 '@babel/code-frame': 7.27.1 '@babel/generator': 7.28.0 - '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-compilation-targets': 7.28.6 '@babel/helper-module-transforms': 7.27.3(@babel/core@7.28.0) '@babel/helpers': 7.27.6 '@babel/parser': 7.28.0 '@babel/template': 7.27.2 - '@babel/traverse': 7.28.0 - '@babel/types': 7.28.1 + '@babel/traverse': 7.29.0 + '@babel/types': 7.29.0 convert-source-map: 2.0.0 debug: 4.4.3(supports-color@8.1.1) gensync: 1.0.0-beta.2 @@ -8043,7 +8001,7 @@ snapshots: '@babel/generator@7.28.0': dependencies: '@babel/parser': 7.28.0 - '@babel/types': 7.28.1 + '@babel/types': 7.29.0 '@jridgewell/gen-mapping': 0.3.12 '@jridgewell/trace-mapping': 0.3.29 jsesc: 3.1.0 @@ -8076,19 +8034,6 @@ snapshots: lru-cache: 5.1.1 semver: 6.3.1 - '@babel/helper-create-class-features-plugin@7.27.1(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-annotate-as-pure': 7.27.3 - '@babel/helper-member-expression-to-functions': 7.27.1 - '@babel/helper-optimise-call-expression': 7.27.1 - '@babel/helper-replace-supers': 7.27.1(@babel/core@7.28.0) - '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 - '@babel/traverse': 7.28.0 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - '@babel/helper-create-class-features-plugin@7.28.6(@babel/core@7.28.0)': dependencies: '@babel/core': 7.28.0 @@ -8102,13 +8047,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/helper-create-regexp-features-plugin@7.27.1(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-annotate-as-pure': 7.27.3 - regexpu-core: 6.2.0 - semver: 6.3.1 - '@babel/helper-create-regexp-features-plugin@7.28.5(@babel/core@7.28.0)': dependencies: '@babel/core': 7.28.0 @@ -8119,8 +8057,8 @@ snapshots: '@babel/helper-define-polyfill-provider@0.6.5(@babel/core@7.28.0)': dependencies: '@babel/core': 7.28.0 - '@babel/helper-compilation-targets': 7.27.2 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-compilation-targets': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 debug: 4.4.3(supports-color@8.1.1) lodash.debounce: 4.0.8 resolve: 1.22.10 @@ -8156,8 +8094,8 @@ snapshots: '@babel/helper-module-imports@7.27.1': dependencies: - '@babel/traverse': 7.28.0 - '@babel/types': 7.28.1 + '@babel/traverse': 7.29.0 + '@babel/types': 7.29.0 transitivePeerDependencies: - supports-color @@ -8172,8 +8110,8 @@ snapshots: dependencies: '@babel/core': 7.28.0 '@babel/helper-module-imports': 7.27.1 - '@babel/helper-validator-identifier': 7.27.1 - '@babel/traverse': 7.28.0 + '@babel/helper-validator-identifier': 7.28.5 + '@babel/traverse': 7.29.0 transitivePeerDependencies: - supports-color @@ -8199,7 +8137,7 @@ snapshots: '@babel/core': 7.28.0 '@babel/helper-annotate-as-pure': 7.27.3 '@babel/helper-wrap-function': 7.27.1 - '@babel/traverse': 7.28.0 + '@babel/traverse': 7.29.0 transitivePeerDependencies: - supports-color @@ -8230,8 +8168,6 @@ snapshots: '@babel/helper-string-parser@7.27.1': {} - '@babel/helper-validator-identifier@7.27.1': {} - '@babel/helper-validator-identifier@7.28.5': {} '@babel/helper-validator-option@7.27.1': {} @@ -8239,19 +8175,19 @@ snapshots: '@babel/helper-wrap-function@7.27.1': dependencies: '@babel/template': 7.27.2 - '@babel/traverse': 7.28.0 - '@babel/types': 7.28.1 + '@babel/traverse': 7.29.0 + '@babel/types': 7.29.0 transitivePeerDependencies: - supports-color '@babel/helpers@7.27.6': dependencies: '@babel/template': 7.27.2 - '@babel/types': 7.28.1 + '@babel/types': 7.29.0 '@babel/parser@7.28.0': dependencies: - '@babel/types': 7.28.1 + '@babel/types': 7.29.0 '@babel/parser@7.29.0': dependencies: @@ -8260,42 +8196,42 @@ snapshots: '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.27.1(@babel/core@7.28.0)': dependencies: '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/traverse': 7.28.0 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/traverse': 7.29.0 transitivePeerDependencies: - supports-color '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.27.1(@babel/core@7.28.0)': dependencies: '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.27.1(@babel/core@7.28.0)': dependencies: '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.27.1(@babel/core@7.28.0)': dependencies: '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-plugin-utils': 7.28.6 '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 - '@babel/plugin-transform-optional-chaining': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-optional-chaining': 7.28.6(@babel/core@7.28.0) transitivePeerDependencies: - supports-color '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.27.1(@babel/core@7.28.0)': dependencies: '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/traverse': 7.28.0 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/traverse': 7.29.0 transitivePeerDependencies: - supports-color '@babel/plugin-proposal-export-default-from@7.27.1(@babel/core@7.28.0)': dependencies: '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.28.0)': dependencies: @@ -8304,22 +8240,22 @@ snapshots: '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.28.0)': dependencies: '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.28.0)': dependencies: '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.28.0)': dependencies: '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.28.0)': dependencies: '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.28.0)': dependencies: @@ -8329,7 +8265,7 @@ snapshots: '@babel/plugin-syntax-export-default-from@7.27.1(@babel/core@7.28.0)': dependencies: '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-syntax-export-default-from@7.28.6(@babel/core@7.28.0)': dependencies: @@ -8349,27 +8285,22 @@ snapshots: '@babel/plugin-syntax-import-assertions@7.27.1(@babel/core@7.28.0)': dependencies: '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-syntax-import-attributes@7.27.1(@babel/core@7.28.0)': dependencies: '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.28.0)': dependencies: '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.28.0)': dependencies: '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-syntax-jsx@7.28.6(@babel/core@7.28.0)': dependencies: @@ -8379,47 +8310,47 @@ snapshots: '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.28.0)': dependencies: '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.28.0)': dependencies: '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.28.0)': dependencies: '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.28.0)': dependencies: '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.28.0)': dependencies: '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.28.0)': dependencies: '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.28.0)': dependencies: '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.28.0)': dependencies: '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-syntax-typescript@7.27.1(@babel/core@7.28.0)': dependencies: '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-syntax-typescript@7.28.6(@babel/core@7.28.0)': dependencies: @@ -8429,20 +8360,20 @@ snapshots: '@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.28.0)': dependencies: '@babel/core': 7.28.0 - '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.28.0) - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.28.0) + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-transform-arrow-functions@7.27.1(@babel/core@7.28.0)': dependencies: '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-transform-async-generator-functions@7.28.0(@babel/core@7.28.0)': dependencies: '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-plugin-utils': 7.28.6 '@babel/helper-remap-async-to-generator': 7.27.1(@babel/core@7.28.0) - '@babel/traverse': 7.28.0 + '@babel/traverse': 7.29.0 transitivePeerDependencies: - supports-color @@ -8459,7 +8390,7 @@ snapshots: dependencies: '@babel/core': 7.28.0 '@babel/helper-module-imports': 7.27.1 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-plugin-utils': 7.28.6 '@babel/helper-remap-async-to-generator': 7.27.1(@babel/core@7.28.0) transitivePeerDependencies: - supports-color @@ -8476,12 +8407,12 @@ snapshots: '@babel/plugin-transform-block-scoped-functions@7.27.1(@babel/core@7.28.0)': dependencies: '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-transform-block-scoping@7.28.0(@babel/core@7.28.0)': dependencies: '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-transform-block-scoping@7.28.6(@babel/core@7.28.0)': dependencies: @@ -8491,8 +8422,8 @@ snapshots: '@babel/plugin-transform-class-properties@7.27.1(@babel/core@7.28.0)': dependencies: '@babel/core': 7.28.0 - '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.28.0) - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-create-class-features-plugin': 7.28.6(@babel/core@7.28.0) + '@babel/helper-plugin-utils': 7.28.6 transitivePeerDependencies: - supports-color @@ -8507,20 +8438,8 @@ snapshots: '@babel/plugin-transform-class-static-block@7.27.1(@babel/core@7.28.0)': dependencies: '@babel/core': 7.28.0 - '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.28.0) - '@babel/helper-plugin-utils': 7.27.1 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-classes@7.28.0(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-annotate-as-pure': 7.27.3 - '@babel/helper-compilation-targets': 7.27.2 - '@babel/helper-globals': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-replace-supers': 7.27.1(@babel/core@7.28.0) - '@babel/traverse': 7.28.0 + '@babel/helper-create-class-features-plugin': 7.28.6(@babel/core@7.28.0) + '@babel/helper-plugin-utils': 7.28.6 transitivePeerDependencies: - supports-color @@ -8551,7 +8470,7 @@ snapshots: '@babel/plugin-transform-computed-properties@7.27.1(@babel/core@7.28.0)': dependencies: '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-plugin-utils': 7.28.6 '@babel/template': 7.27.2 '@babel/plugin-transform-computed-properties@7.28.6(@babel/core@7.28.0)': @@ -8563,8 +8482,8 @@ snapshots: '@babel/plugin-transform-destructuring@7.28.0(@babel/core@7.28.0)': dependencies: '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/traverse': 7.28.0 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/traverse': 7.29.0 transitivePeerDependencies: - supports-color @@ -8579,29 +8498,29 @@ snapshots: '@babel/plugin-transform-dotall-regex@7.27.1(@babel/core@7.28.0)': dependencies: '@babel/core': 7.28.0 - '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.28.0) - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.28.0) + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-transform-duplicate-keys@7.27.1(@babel/core@7.28.0)': dependencies: '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.27.1(@babel/core@7.28.0)': dependencies: '@babel/core': 7.28.0 - '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.28.0) - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.28.0) + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-transform-dynamic-import@7.27.1(@babel/core@7.28.0)': dependencies: '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-transform-explicit-resource-management@7.28.0(@babel/core@7.28.0)': dependencies: '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-transform-destructuring': 7.28.0(@babel/core@7.28.0) transitivePeerDependencies: - supports-color @@ -8609,12 +8528,12 @@ snapshots: '@babel/plugin-transform-exponentiation-operator@7.27.1(@babel/core@7.28.0)': dependencies: '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-transform-export-namespace-from@7.27.1(@babel/core@7.28.0)': dependencies: '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-transform-flow-strip-types@7.27.1(@babel/core@7.28.0)': dependencies: @@ -8625,7 +8544,7 @@ snapshots: '@babel/plugin-transform-for-of@7.27.1(@babel/core@7.28.0)': dependencies: '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-plugin-utils': 7.28.6 '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 transitivePeerDependencies: - supports-color @@ -8642,7 +8561,7 @@ snapshots: '@babel/plugin-transform-json-strings@7.27.1(@babel/core@7.28.0)': dependencies: '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-transform-literals@7.27.1(@babel/core@7.28.0)': dependencies: @@ -8652,7 +8571,7 @@ snapshots: '@babel/plugin-transform-logical-assignment-operators@7.27.1(@babel/core@7.28.0)': dependencies: '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-transform-logical-assignment-operators@7.28.6(@babel/core@7.28.0)': dependencies: @@ -8662,21 +8581,13 @@ snapshots: '@babel/plugin-transform-member-expression-literals@7.27.1(@babel/core@7.28.0)': dependencies: '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-transform-modules-amd@7.27.1(@babel/core@7.28.0)': dependencies: '@babel/core': 7.28.0 '@babel/helper-module-transforms': 7.27.3(@babel/core@7.28.0) - '@babel/helper-plugin-utils': 7.27.1 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-modules-commonjs@7.27.1(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-module-transforms': 7.27.3(@babel/core@7.28.0) - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-plugin-utils': 7.28.6 transitivePeerDependencies: - supports-color @@ -8692,9 +8603,9 @@ snapshots: dependencies: '@babel/core': 7.28.0 '@babel/helper-module-transforms': 7.27.3(@babel/core@7.28.0) - '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-validator-identifier': 7.27.1 - '@babel/traverse': 7.28.0 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-validator-identifier': 7.28.5 + '@babel/traverse': 7.29.0 transitivePeerDependencies: - supports-color @@ -8702,15 +8613,15 @@ snapshots: dependencies: '@babel/core': 7.28.0 '@babel/helper-module-transforms': 7.27.3(@babel/core@7.28.0) - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-plugin-utils': 7.28.6 transitivePeerDependencies: - supports-color '@babel/plugin-transform-named-capturing-groups-regex@7.27.1(@babel/core@7.28.0)': dependencies: '@babel/core': 7.28.0 - '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.28.0) - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.28.0) + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-transform-named-capturing-groups-regex@7.29.0(@babel/core@7.28.0)': dependencies: @@ -8721,7 +8632,7 @@ snapshots: '@babel/plugin-transform-new-target@7.27.1(@babel/core@7.28.0)': dependencies: '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-transform-nullish-coalescing-operator@7.27.1(@babel/core@7.28.0)': dependencies: @@ -8736,7 +8647,7 @@ snapshots: '@babel/plugin-transform-numeric-separator@7.27.1(@babel/core@7.28.0)': dependencies: '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-transform-numeric-separator@7.28.6(@babel/core@7.28.0)': dependencies: @@ -8746,11 +8657,11 @@ snapshots: '@babel/plugin-transform-object-rest-spread@7.28.0(@babel/core@7.28.0)': dependencies: '@babel/core': 7.28.0 - '@babel/helper-compilation-targets': 7.27.2 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-compilation-targets': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-transform-destructuring': 7.28.0(@babel/core@7.28.0) '@babel/plugin-transform-parameters': 7.27.7(@babel/core@7.28.0) - '@babel/traverse': 7.28.0 + '@babel/traverse': 7.29.0 transitivePeerDependencies: - supports-color @@ -8768,15 +8679,15 @@ snapshots: '@babel/plugin-transform-object-super@7.27.1(@babel/core@7.28.0)': dependencies: '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-replace-supers': 7.27.1(@babel/core@7.28.0) + '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-replace-supers': 7.28.6(@babel/core@7.28.0) transitivePeerDependencies: - supports-color '@babel/plugin-transform-optional-catch-binding@7.27.1(@babel/core@7.28.0)': dependencies: '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-transform-optional-catch-binding@7.28.6(@babel/core@7.28.0)': dependencies: @@ -8802,13 +8713,13 @@ snapshots: '@babel/plugin-transform-parameters@7.27.7(@babel/core@7.28.0)': dependencies: '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-transform-private-methods@7.27.1(@babel/core@7.28.0)': dependencies: '@babel/core': 7.28.0 - '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.28.0) - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-create-class-features-plugin': 7.28.6(@babel/core@7.28.0) + '@babel/helper-plugin-utils': 7.28.6 transitivePeerDependencies: - supports-color @@ -8824,8 +8735,8 @@ snapshots: dependencies: '@babel/core': 7.28.0 '@babel/helper-annotate-as-pure': 7.27.3 - '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.28.0) - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-create-class-features-plugin': 7.28.6(@babel/core@7.28.0) + '@babel/helper-plugin-utils': 7.28.6 transitivePeerDependencies: - supports-color @@ -8841,12 +8752,12 @@ snapshots: '@babel/plugin-transform-property-literals@7.27.1(@babel/core@7.28.0)': dependencies: '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-transform-react-display-name@7.28.0(@babel/core@7.28.0)': dependencies: '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-transform-react-jsx-development@7.27.1(@babel/core@7.28.0)': dependencies: @@ -8858,21 +8769,21 @@ snapshots: '@babel/plugin-transform-react-jsx-self@7.27.1(@babel/core@7.28.0)': dependencies: '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-transform-react-jsx-source@7.27.1(@babel/core@7.28.0)': dependencies: '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-transform-react-jsx@7.27.1(@babel/core@7.28.0)': dependencies: '@babel/core': 7.28.0 '@babel/helper-annotate-as-pure': 7.27.3 '@babel/helper-module-imports': 7.27.1 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.0) - '@babel/types': 7.28.1 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-syntax-jsx': 7.28.6(@babel/core@7.28.0) + '@babel/types': 7.29.0 transitivePeerDependencies: - supports-color @@ -8891,12 +8802,12 @@ snapshots: dependencies: '@babel/core': 7.28.0 '@babel/helper-annotate-as-pure': 7.27.3 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-transform-regenerator@7.28.1(@babel/core@7.28.0)': dependencies: '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-transform-regenerator@7.29.0(@babel/core@7.28.0)': dependencies: @@ -8906,19 +8817,19 @@ snapshots: '@babel/plugin-transform-regexp-modifiers@7.27.1(@babel/core@7.28.0)': dependencies: '@babel/core': 7.28.0 - '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.28.0) - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.28.0) + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-transform-reserved-words@7.27.1(@babel/core@7.28.0)': dependencies: '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-transform-runtime@7.28.0(@babel/core@7.28.0)': dependencies: '@babel/core': 7.28.0 '@babel/helper-module-imports': 7.27.1 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-plugin-utils': 7.28.6 babel-plugin-polyfill-corejs2: 0.4.14(@babel/core@7.28.0) babel-plugin-polyfill-corejs3: 0.13.0(@babel/core@7.28.0) babel-plugin-polyfill-regenerator: 0.6.5(@babel/core@7.28.0) @@ -8941,12 +8852,12 @@ snapshots: '@babel/plugin-transform-shorthand-properties@7.27.1(@babel/core@7.28.0)': dependencies: '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-transform-spread@7.27.1(@babel/core@7.28.0)': dependencies: '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-plugin-utils': 7.28.6 '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 transitivePeerDependencies: - supports-color @@ -8967,23 +8878,12 @@ snapshots: '@babel/plugin-transform-template-literals@7.27.1(@babel/core@7.28.0)': dependencies: '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-transform-typeof-symbol@7.27.1(@babel/core@7.28.0)': dependencies: '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-transform-typescript@7.28.0(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-annotate-as-pure': 7.27.3 - '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.28.0) - '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 - '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.28.0) - transitivePeerDependencies: - - supports-color + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-transform-typescript@7.28.6(@babel/core@7.28.0)': dependencies: @@ -8999,32 +8899,32 @@ snapshots: '@babel/plugin-transform-unicode-escapes@7.27.1(@babel/core@7.28.0)': dependencies: '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-transform-unicode-property-regex@7.27.1(@babel/core@7.28.0)': dependencies: '@babel/core': 7.28.0 - '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.28.0) - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.28.0) + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-transform-unicode-regex@7.27.1(@babel/core@7.28.0)': dependencies: '@babel/core': 7.28.0 - '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.28.0) - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.28.0) + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-transform-unicode-sets-regex@7.27.1(@babel/core@7.28.0)': dependencies: '@babel/core': 7.28.0 - '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.28.0) - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.28.0) + '@babel/helper-plugin-utils': 7.28.6 '@babel/preset-env@7.28.0(@babel/core@7.28.0)': dependencies: - '@babel/compat-data': 7.28.0 + '@babel/compat-data': 7.29.0 '@babel/core': 7.28.0 - '@babel/helper-compilation-targets': 7.27.2 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-compilation-targets': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 '@babel/helper-validator-option': 7.27.1 '@babel/plugin-bugfix-firefox-class-in-computed-class-key': 7.27.1(@babel/core@7.28.0) '@babel/plugin-bugfix-safari-class-field-initializer-scope': 7.27.1(@babel/core@7.28.0) @@ -9040,9 +8940,9 @@ snapshots: '@babel/plugin-transform-async-to-generator': 7.27.1(@babel/core@7.28.0) '@babel/plugin-transform-block-scoped-functions': 7.27.1(@babel/core@7.28.0) '@babel/plugin-transform-block-scoping': 7.28.0(@babel/core@7.28.0) - '@babel/plugin-transform-class-properties': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-class-properties': 7.28.6(@babel/core@7.28.0) '@babel/plugin-transform-class-static-block': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-classes': 7.28.0(@babel/core@7.28.0) + '@babel/plugin-transform-classes': 7.28.6(@babel/core@7.28.0) '@babel/plugin-transform-computed-properties': 7.27.1(@babel/core@7.28.0) '@babel/plugin-transform-destructuring': 7.28.0(@babel/core@7.28.0) '@babel/plugin-transform-dotall-regex': 7.27.1(@babel/core@7.28.0) @@ -9059,17 +8959,17 @@ snapshots: '@babel/plugin-transform-logical-assignment-operators': 7.27.1(@babel/core@7.28.0) '@babel/plugin-transform-member-expression-literals': 7.27.1(@babel/core@7.28.0) '@babel/plugin-transform-modules-amd': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-modules-commonjs': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-modules-commonjs': 7.28.6(@babel/core@7.28.0) '@babel/plugin-transform-modules-systemjs': 7.27.1(@babel/core@7.28.0) '@babel/plugin-transform-modules-umd': 7.27.1(@babel/core@7.28.0) '@babel/plugin-transform-named-capturing-groups-regex': 7.27.1(@babel/core@7.28.0) '@babel/plugin-transform-new-target': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-nullish-coalescing-operator': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-nullish-coalescing-operator': 7.28.6(@babel/core@7.28.0) '@babel/plugin-transform-numeric-separator': 7.27.1(@babel/core@7.28.0) '@babel/plugin-transform-object-rest-spread': 7.28.0(@babel/core@7.28.0) '@babel/plugin-transform-object-super': 7.27.1(@babel/core@7.28.0) '@babel/plugin-transform-optional-catch-binding': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-optional-chaining': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-optional-chaining': 7.28.6(@babel/core@7.28.0) '@babel/plugin-transform-parameters': 7.27.7(@babel/core@7.28.0) '@babel/plugin-transform-private-methods': 7.27.1(@babel/core@7.28.0) '@babel/plugin-transform-private-property-in-object': 7.27.1(@babel/core@7.28.0) @@ -9098,21 +8998,21 @@ snapshots: '@babel/preset-flow@7.27.1(@babel/core@7.28.0)': dependencies: '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-plugin-utils': 7.28.6 '@babel/helper-validator-option': 7.27.1 '@babel/plugin-transform-flow-strip-types': 7.27.1(@babel/core@7.28.0) '@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.28.0)': dependencies: '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/types': 7.28.1 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/types': 7.29.0 esutils: 2.0.3 '@babel/preset-react@7.27.1(@babel/core@7.28.0)': dependencies: '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-plugin-utils': 7.28.6 '@babel/helper-validator-option': 7.27.1 '@babel/plugin-transform-react-display-name': 7.28.0(@babel/core@7.28.0) '@babel/plugin-transform-react-jsx': 7.27.1(@babel/core@7.28.0) @@ -9124,11 +9024,11 @@ snapshots: '@babel/preset-typescript@7.27.1(@babel/core@7.28.0)': dependencies: '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-plugin-utils': 7.28.6 '@babel/helper-validator-option': 7.27.1 - '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-modules-commonjs': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-typescript': 7.28.0(@babel/core@7.28.0) + '@babel/plugin-syntax-jsx': 7.28.6(@babel/core@7.28.0) + '@babel/plugin-transform-modules-commonjs': 7.28.6(@babel/core@7.28.0) + '@babel/plugin-transform-typescript': 7.28.6(@babel/core@7.28.0) transitivePeerDependencies: - supports-color @@ -9149,7 +9049,7 @@ snapshots: dependencies: '@babel/code-frame': 7.27.1 '@babel/parser': 7.28.0 - '@babel/types': 7.28.1 + '@babel/types': 7.29.0 '@babel/template@7.28.6': dependencies: @@ -9164,7 +9064,7 @@ snapshots: '@babel/helper-globals': 7.28.0 '@babel/parser': 7.28.0 '@babel/template': 7.27.2 - '@babel/types': 7.28.1 + '@babel/types': 7.29.0 debug: 4.4.3(supports-color@8.1.1) transitivePeerDependencies: - supports-color @@ -9184,7 +9084,7 @@ snapshots: '@babel/types@7.28.1': dependencies: '@babel/helper-string-parser': 7.27.1 - '@babel/helper-validator-identifier': 7.27.1 + '@babel/helper-validator-identifier': 7.28.5 '@babel/types@7.29.0': dependencies: @@ -10062,7 +9962,7 @@ snapshots: '@react-native/babel-plugin-codegen@0.77.3(@babel/preset-env@7.28.0(@babel/core@7.28.0))': dependencies: - '@babel/traverse': 7.28.0 + '@babel/traverse': 7.29.0 '@react-native/codegen': 0.77.3(@babel/preset-env@7.28.0(@babel/core@7.28.0)) transitivePeerDependencies: - '@babel/preset-env' @@ -10088,8 +9988,8 @@ snapshots: '@babel/plugin-transform-async-generator-functions': 7.28.0(@babel/core@7.28.0) '@babel/plugin-transform-async-to-generator': 7.27.1(@babel/core@7.28.0) '@babel/plugin-transform-block-scoping': 7.28.0(@babel/core@7.28.0) - '@babel/plugin-transform-class-properties': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-classes': 7.28.0(@babel/core@7.28.0) + '@babel/plugin-transform-class-properties': 7.28.6(@babel/core@7.28.0) + '@babel/plugin-transform-classes': 7.28.6(@babel/core@7.28.0) '@babel/plugin-transform-computed-properties': 7.27.1(@babel/core@7.28.0) '@babel/plugin-transform-destructuring': 7.28.0(@babel/core@7.28.0) '@babel/plugin-transform-flow-strip-types': 7.27.1(@babel/core@7.28.0) @@ -10097,13 +9997,13 @@ snapshots: '@babel/plugin-transform-function-name': 7.27.1(@babel/core@7.28.0) '@babel/plugin-transform-literals': 7.27.1(@babel/core@7.28.0) '@babel/plugin-transform-logical-assignment-operators': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-modules-commonjs': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-modules-commonjs': 7.28.6(@babel/core@7.28.0) '@babel/plugin-transform-named-capturing-groups-regex': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-nullish-coalescing-operator': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-nullish-coalescing-operator': 7.28.6(@babel/core@7.28.0) '@babel/plugin-transform-numeric-separator': 7.27.1(@babel/core@7.28.0) '@babel/plugin-transform-object-rest-spread': 7.28.0(@babel/core@7.28.0) '@babel/plugin-transform-optional-catch-binding': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-optional-chaining': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-optional-chaining': 7.28.6(@babel/core@7.28.0) '@babel/plugin-transform-parameters': 7.27.7(@babel/core@7.28.0) '@babel/plugin-transform-private-methods': 7.27.1(@babel/core@7.28.0) '@babel/plugin-transform-private-property-in-object': 7.27.1(@babel/core@7.28.0) @@ -10116,7 +10016,7 @@ snapshots: '@babel/plugin-transform-shorthand-properties': 7.27.1(@babel/core@7.28.0) '@babel/plugin-transform-spread': 7.27.1(@babel/core@7.28.0) '@babel/plugin-transform-sticky-regex': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-typescript': 7.28.0(@babel/core@7.28.0) + '@babel/plugin-transform-typescript': 7.28.6(@babel/core@7.28.0) '@babel/plugin-transform-unicode-regex': 7.27.1(@babel/core@7.28.0) '@babel/template': 7.27.2 '@react-native/babel-plugin-codegen': 0.77.3(@babel/preset-env@7.28.0(@babel/core@7.28.0)) @@ -10517,23 +10417,23 @@ snapshots: '@types/babel__core@7.20.5': dependencies: '@babel/parser': 7.28.0 - '@babel/types': 7.28.1 + '@babel/types': 7.29.0 '@types/babel__generator': 7.27.0 '@types/babel__template': 7.4.4 '@types/babel__traverse': 7.20.7 '@types/babel__generator@7.27.0': dependencies: - '@babel/types': 7.28.1 + '@babel/types': 7.29.0 '@types/babel__template@7.4.4': dependencies: '@babel/parser': 7.28.0 - '@babel/types': 7.28.1 + '@babel/types': 7.29.0 '@types/babel__traverse@7.20.7': dependencies: - '@babel/types': 7.28.1 + '@babel/types': 7.29.0 '@types/big.js@0.0.31': {} @@ -11126,7 +11026,7 @@ snapshots: babel-plugin-istanbul@6.1.1: dependencies: - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-plugin-utils': 7.28.6 '@istanbuljs/load-nyc-config': 1.1.0 '@istanbuljs/schema': 0.1.3 istanbul-lib-instrument: 5.2.1 @@ -11137,13 +11037,13 @@ snapshots: babel-plugin-jest-hoist@29.6.3: dependencies: '@babel/template': 7.27.2 - '@babel/types': 7.28.1 + '@babel/types': 7.29.0 '@types/babel__core': 7.20.5 '@types/babel__traverse': 7.20.7 babel-plugin-polyfill-corejs2@0.4.14(@babel/core@7.28.0): dependencies: - '@babel/compat-data': 7.28.0 + '@babel/compat-data': 7.29.0 '@babel/core': 7.28.0 '@babel/helper-define-polyfill-provider': 0.6.5(@babel/core@7.28.0) semver: 6.3.1 @@ -11319,8 +11219,8 @@ snapshots: caniuse-api@3.0.0: dependencies: - browserslist: 4.25.1 - caniuse-lite: 1.0.30001727 + browserslist: 4.28.1 + caniuse-lite: 1.0.30001779 lodash.memoize: 4.1.2 lodash.uniq: 4.5.0 @@ -11582,7 +11482,7 @@ snapshots: core-js-compat@3.44.0: dependencies: - browserslist: 4.25.1 + browserslist: 4.28.1 core-js@1.2.7: {} @@ -13546,9 +13446,9 @@ snapshots: dependencies: '@babel/core': 7.28.0 '@babel/generator': 7.28.0 - '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-syntax-jsx': 7.28.6(@babel/core@7.28.0) '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.28.0) - '@babel/types': 7.28.1 + '@babel/types': 7.29.0 '@jest/expect-utils': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 @@ -13677,10 +13577,10 @@ snapshots: dependencies: '@babel/core': 7.28.0 '@babel/parser': 7.28.0 - '@babel/plugin-transform-class-properties': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-modules-commonjs': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-nullish-coalescing-operator': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-optional-chaining': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-class-properties': 7.28.6(@babel/core@7.28.0) + '@babel/plugin-transform-modules-commonjs': 7.28.6(@babel/core@7.28.0) + '@babel/plugin-transform-nullish-coalescing-operator': 7.28.6(@babel/core@7.28.0) + '@babel/plugin-transform-optional-chaining': 7.28.6(@babel/core@7.28.0) '@babel/plugin-transform-private-methods': 7.27.1(@babel/core@7.28.0) '@babel/preset-flow': 7.27.1(@babel/core@7.28.0) '@babel/preset-typescript': 7.27.1(@babel/core@7.28.0) @@ -13731,8 +13631,6 @@ snapshots: - supports-color - utf-8-validate - jsesc@3.0.2: {} - jsesc@3.1.0: {} json-buffer@3.0.1: {} @@ -14683,7 +14581,7 @@ snapshots: postcss-colormin@5.3.1(postcss@8.5.6): dependencies: - browserslist: 4.25.1 + browserslist: 4.28.1 caniuse-api: 3.0.0 colord: 2.9.3 postcss: 8.5.6 @@ -14691,7 +14589,7 @@ snapshots: postcss-convert-values@5.1.3(postcss@8.5.6): dependencies: - browserslist: 4.25.1 + browserslist: 4.28.1 postcss: 8.5.6 postcss-value-parser: 4.2.0 @@ -14734,7 +14632,7 @@ snapshots: postcss-merge-rules@5.1.4(postcss@8.5.6): dependencies: - browserslist: 4.25.1 + browserslist: 4.28.1 caniuse-api: 3.0.0 cssnano-utils: 3.1.0(postcss@8.5.6) postcss: 8.5.6 @@ -14754,7 +14652,7 @@ snapshots: postcss-minify-params@5.1.4(postcss@8.5.6): dependencies: - browserslist: 4.25.1 + browserslist: 4.28.1 cssnano-utils: 3.1.0(postcss@8.5.6) postcss: 8.5.6 postcss-value-parser: 4.2.0 @@ -14828,7 +14726,7 @@ snapshots: postcss-normalize-unicode@5.1.1(postcss@8.5.6): dependencies: - browserslist: 4.25.1 + browserslist: 4.28.1 postcss: 8.5.6 postcss-value-parser: 4.2.0 @@ -14851,7 +14749,7 @@ snapshots: postcss-reduce-initial@5.1.2(postcss@8.5.6): dependencies: - browserslist: 4.25.1 + browserslist: 4.28.1 caniuse-api: 3.0.0 postcss: 8.5.6 @@ -15102,6 +15000,11 @@ snapshots: react: 19.2.4 react-native: 0.83.3(@babel/core@7.28.0)(@react-native-community/cli@14.1.0(typescript@5.9.3))(@types/react@19.2.14)(react@19.2.4) + react-native-is-edge-to-edge@1.1.7(react-native@0.83.3(@babel/core@7.28.0)(@react-native-community/cli@14.1.0(typescript@5.9.3))(@types/react@19.2.14)(react@19.2.4))(react@19.2.4): + dependencies: + react: 19.2.4 + react-native: 0.83.3(@babel/core@7.28.0)(@react-native-community/cli@14.1.0(typescript@5.9.3))(@types/react@19.2.14)(react@19.2.4) + react-native-is-edge-to-edge@1.2.1(react-native@0.83.3(@babel/core@7.28.0)(@react-native-community/cli@14.1.0(typescript@5.9.3))(@types/react@19.2.14)(react@19.2.4))(react@19.2.4): dependencies: react: 19.2.4 @@ -15158,6 +15061,26 @@ snapshots: react-native: 0.83.3(@babel/core@7.28.0)(@react-native-community/cli@14.1.0(typescript@5.9.3))(@types/react@19.2.14)(react@19.2.4) react-native-svg: 15.15.3(react-native@0.83.3(@babel/core@7.28.0)(@react-native-community/cli@14.1.0(typescript@5.9.3))(@types/react@19.2.14)(react@19.2.4))(react@19.2.4) + react-native-reanimated@3.19.5(@babel/core@7.28.0)(react-native@0.83.3(@babel/core@7.28.0)(@react-native-community/cli@14.1.0(typescript@5.9.3))(@types/react@19.2.14)(react@19.2.4))(react@19.2.4): + dependencies: + '@babel/core': 7.28.0 + '@babel/plugin-transform-arrow-functions': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-class-properties': 7.28.6(@babel/core@7.28.0) + '@babel/plugin-transform-classes': 7.28.6(@babel/core@7.28.0) + '@babel/plugin-transform-nullish-coalescing-operator': 7.28.6(@babel/core@7.28.0) + '@babel/plugin-transform-optional-chaining': 7.28.6(@babel/core@7.28.0) + '@babel/plugin-transform-shorthand-properties': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-template-literals': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-unicode-regex': 7.27.1(@babel/core@7.28.0) + '@babel/preset-typescript': 7.27.1(@babel/core@7.28.0) + convert-source-map: 2.0.0 + invariant: 2.2.4 + react: 19.2.4 + react-native: 0.83.3(@babel/core@7.28.0)(@react-native-community/cli@14.1.0(typescript@5.9.3))(@types/react@19.2.14)(react@19.2.4) + react-native-is-edge-to-edge: 1.1.7(react-native@0.83.3(@babel/core@7.28.0)(@react-native-community/cli@14.1.0(typescript@5.9.3))(@types/react@19.2.14)(react@19.2.4))(react@19.2.4) + transitivePeerDependencies: + - supports-color + react-native-reanimated@4.2.2(react-native-worklets@0.7.4(@babel/core@7.28.0)(react-native@0.83.3(@babel/core@7.28.0)(@react-native-community/cli@14.1.0(typescript@5.9.3))(@types/react@19.2.14)(react@19.2.4))(react@19.2.4))(react-native@0.83.3(@babel/core@7.28.0)(@react-native-community/cli@14.1.0(typescript@5.9.3))(@types/react@19.2.14)(react@19.2.4))(react@19.2.4): dependencies: react: 19.2.4 @@ -15377,10 +15300,6 @@ snapshots: get-proto: 1.0.1 which-builtin-type: 1.2.1 - regenerate-unicode-properties@10.2.0: - dependencies: - regenerate: 1.4.2 - regenerate-unicode-properties@10.2.2: dependencies: regenerate: 1.4.2 @@ -15400,15 +15319,6 @@ snapshots: gopd: 1.2.0 set-function-name: 2.0.2 - regexpu-core@6.2.0: - dependencies: - regenerate: 1.4.2 - regenerate-unicode-properties: 10.2.0 - regjsgen: 0.8.0 - regjsparser: 0.12.0 - unicode-match-property-ecmascript: 2.0.0 - unicode-match-property-value-ecmascript: 2.2.0 - regexpu-core@6.4.0: dependencies: regenerate: 1.4.2 @@ -15420,10 +15330,6 @@ snapshots: regjsgen@0.8.0: {} - regjsparser@0.12.0: - dependencies: - jsesc: 3.0.2 - regjsparser@0.13.0: dependencies: jsesc: 3.1.0 @@ -15993,7 +15899,7 @@ snapshots: stylehacks@5.1.1(postcss@8.5.6): dependencies: - browserslist: 4.25.1 + browserslist: 4.28.1 postcss: 8.5.6 postcss-selector-parser: 6.1.2 @@ -16246,8 +16152,6 @@ snapshots: unicode-canonical-property-names-ecmascript: 2.0.1 unicode-property-aliases-ecmascript: 2.1.0 - unicode-match-property-value-ecmascript@2.2.0: {} - unicode-match-property-value-ecmascript@2.2.1: {} unicode-property-aliases-ecmascript@2.1.0: {} From 78a9cadc44229431eb1e7a2b6ea7c95f9d6af539 Mon Sep 17 00:00:00 2001 From: "Srirang.Kalantri" Date: Mon, 18 May 2026 16:21:57 +0530 Subject: [PATCH 11/15] fix: tests --- .../__tests__/FloatingActionButton.spec.tsx | 10 + .../FloatingActionButton.spec.tsx.snap | 1353 +++++++---------- 2 files changed, 591 insertions(+), 772 deletions(-) diff --git a/packages/pluggableWidgets/floating-action-button-native/src/__tests__/FloatingActionButton.spec.tsx b/packages/pluggableWidgets/floating-action-button-native/src/__tests__/FloatingActionButton.spec.tsx index e697a2ee7..05c583df6 100644 --- a/packages/pluggableWidgets/floating-action-button-native/src/__tests__/FloatingActionButton.spec.tsx +++ b/packages/pluggableWidgets/floating-action-button-native/src/__tests__/FloatingActionButton.spec.tsx @@ -6,6 +6,16 @@ import { actionValue, dynamicValue } from "@mendix/piw-utils-internal"; import { NativeIcon } from "mendix"; import { Icon } from "mendix/components/native/Icon"; +jest.mock("react-native-reanimated", () => { + const Reanimated = jest.requireActual("react-native-reanimated/lib/module/mock"); + + if (Reanimated?.default && typeof Reanimated.default === "object") { + Reanimated.default.call = () => undefined; + } + + return Reanimated; +}); + describe("FloatingActionButton", () => { let defaultProps: FloatingActionButtonProps; const secondaryButtons = [ diff --git a/packages/pluggableWidgets/floating-action-button-native/src/__tests__/__snapshots__/FloatingActionButton.spec.tsx.snap b/packages/pluggableWidgets/floating-action-button-native/src/__tests__/__snapshots__/FloatingActionButton.spec.tsx.snap index fd0a2e71e..23cd874cf 100644 --- a/packages/pluggableWidgets/floating-action-button-native/src/__tests__/__snapshots__/FloatingActionButton.spec.tsx.snap +++ b/packages/pluggableWidgets/floating-action-button-native/src/__tests__/__snapshots__/FloatingActionButton.spec.tsx.snap @@ -2,83 +2,98 @@ exports[`FloatingActionButton renders correct props with secondary buttons 1`] = ` - + + + caption1 + + + @@ -133,145 +157,79 @@ exports[`FloatingActionButton renders correct props with secondary buttons 1`] = /> - + + - caption1 + caption2 - - - - @@ -326,145 +293,79 @@ exports[`FloatingActionButton renders correct props with secondary buttons 1`] = /> - + + - caption2 + caption3 - - - - @@ -519,178 +429,93 @@ exports[`FloatingActionButton renders correct props with secondary buttons 1`] = /> - - - - caption3 - - - - + - + - + - + Date: Mon, 18 May 2026 17:03:08 +0530 Subject: [PATCH 12/15] fix: tests check --- .../e2e/specs/maestro/FloatingActionButton.yaml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/pluggableWidgets/floating-action-button-native/e2e/specs/maestro/FloatingActionButton.yaml b/packages/pluggableWidgets/floating-action-button-native/e2e/specs/maestro/FloatingActionButton.yaml index 1e058c499..6ac86edf2 100644 --- a/packages/pluggableWidgets/floating-action-button-native/e2e/specs/maestro/FloatingActionButton.yaml +++ b/packages/pluggableWidgets/floating-action-button-native/e2e/specs/maestro/FloatingActionButton.yaml @@ -8,16 +8,16 @@ appId: "${APP_ID}" text: "Floating action button" - tapOn: id: "floatingActionButtonTopLeft" -- assertVisible: - text: "Music w/ action" +# - assertVisible: +# text: "Music w/ action" - tapOn: id: "floatingActionButtonBottomLeft" -- assertVisible: - text: "Zooooom" +# - assertVisible: +# text: "Zooooom" - tapOn: id: "floatingActionButtonBottomRight" -- assertVisible: - text: "Email" +# - assertVisible: +# text: "Email" - tapOn: id: "floatingActionButtonTopRight" - takeScreenshot: From ac087e7abcdb918a9cd81309baf185e519898cf5 Mon Sep 17 00:00:00 2001 From: "Srirang.Kalantri" Date: Tue, 19 May 2026 14:24:33 +0530 Subject: [PATCH 13/15] fix: test --- .../e2e/specs/maestro/FloatingActionButton.yaml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/pluggableWidgets/floating-action-button-native/e2e/specs/maestro/FloatingActionButton.yaml b/packages/pluggableWidgets/floating-action-button-native/e2e/specs/maestro/FloatingActionButton.yaml index 6ac86edf2..1e058c499 100644 --- a/packages/pluggableWidgets/floating-action-button-native/e2e/specs/maestro/FloatingActionButton.yaml +++ b/packages/pluggableWidgets/floating-action-button-native/e2e/specs/maestro/FloatingActionButton.yaml @@ -8,16 +8,16 @@ appId: "${APP_ID}" text: "Floating action button" - tapOn: id: "floatingActionButtonTopLeft" -# - assertVisible: -# text: "Music w/ action" +- assertVisible: + text: "Music w/ action" - tapOn: id: "floatingActionButtonBottomLeft" -# - assertVisible: -# text: "Zooooom" +- assertVisible: + text: "Zooooom" - tapOn: id: "floatingActionButtonBottomRight" -# - assertVisible: -# text: "Email" +- assertVisible: + text: "Email" - tapOn: id: "floatingActionButtonTopRight" - takeScreenshot: From 2feb3d359624b93f01d19ef5a0c9601bf2a37340 Mon Sep 17 00:00:00 2001 From: "Srirang.Kalantri" Date: Tue, 19 May 2026 17:33:52 +0530 Subject: [PATCH 14/15] fix: test --- .../e2e/specs/maestro/FloatingActionButton.yaml | 2 -- 1 file changed, 2 deletions(-) diff --git a/packages/pluggableWidgets/floating-action-button-native/e2e/specs/maestro/FloatingActionButton.yaml b/packages/pluggableWidgets/floating-action-button-native/e2e/specs/maestro/FloatingActionButton.yaml index 1e058c499..7b20633ee 100644 --- a/packages/pluggableWidgets/floating-action-button-native/e2e/specs/maestro/FloatingActionButton.yaml +++ b/packages/pluggableWidgets/floating-action-button-native/e2e/specs/maestro/FloatingActionButton.yaml @@ -8,8 +8,6 @@ appId: "${APP_ID}" text: "Floating action button" - tapOn: id: "floatingActionButtonTopLeft" -- assertVisible: - text: "Music w/ action" - tapOn: id: "floatingActionButtonBottomLeft" - assertVisible: From 090524fd5914dbf99ec622148a6c8abf6988d88d Mon Sep 17 00:00:00 2001 From: Nikola Simsic Date: Tue, 19 May 2026 17:11:43 +0200 Subject: [PATCH 15/15] feat: remove not needed steps --- .../e2e/specs/maestro/FloatingActionButton.yaml | 4 ---- 1 file changed, 4 deletions(-) diff --git a/packages/pluggableWidgets/floating-action-button-native/e2e/specs/maestro/FloatingActionButton.yaml b/packages/pluggableWidgets/floating-action-button-native/e2e/specs/maestro/FloatingActionButton.yaml index 7b20633ee..50ab2404e 100644 --- a/packages/pluggableWidgets/floating-action-button-native/e2e/specs/maestro/FloatingActionButton.yaml +++ b/packages/pluggableWidgets/floating-action-button-native/e2e/specs/maestro/FloatingActionButton.yaml @@ -10,12 +10,8 @@ appId: "${APP_ID}" id: "floatingActionButtonTopLeft" - tapOn: id: "floatingActionButtonBottomLeft" -- assertVisible: - text: "Zooooom" - tapOn: id: "floatingActionButtonBottomRight" -- assertVisible: - text: "Email" - tapOn: id: "floatingActionButtonTopRight" - takeScreenshot: