@fountain-ui/core 2.0.0-beta.87 → 2.0.0-beta.88

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -28,6 +28,7 @@ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj &&
28
28
  function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
29
29
 
30
30
  const DIALOG_MAX_WIDTH = 328;
31
+ const TOP_ELEMENT_OFFSET = 20;
31
32
 
32
33
  const useStyles = function () {
33
34
  const theme = (0, _styles2.useTheme)();
@@ -85,6 +86,25 @@ function Dialog(props) {
85
86
  const {
86
87
  height: screenHeight
87
88
  } = (0, _reactNative.useWindowDimensions)();
89
+ const [topElementHeight, setTopElementHeight] = (0, _react.useState)(0);
90
+
91
+ const handleTopElementLayout = event => {
92
+ const {
93
+ height
94
+ } = event.nativeEvent.layout;
95
+ setTopElementHeight(height);
96
+ };
97
+
98
+ const offsetAnimation = (0, _react.useMemo)(() => {
99
+ if (topElementHeight === 0) {
100
+ return [];
101
+ }
102
+
103
+ return [{
104
+ toValue: (topElementHeight - TOP_ELEMENT_OFFSET) / 2,
105
+ type: _Modal.ANIMATION_TYPE.SLIDE
106
+ }];
107
+ }, [topElementHeight]);
88
108
  const closeAnimation = (0, _react.useMemo)(() => {
89
109
  if (animationType === _Modal.ANIMATION_TYPE.FADE) {
90
110
  return [{
@@ -140,12 +160,14 @@ function Dialog(props) {
140
160
  initialTranslateY: initialTranslateY,
141
161
  onClose: onClose,
142
162
  openAnimation: openAnimation,
163
+ offsetAnimation: offsetAnimation,
143
164
  visible: visible,
144
165
  style: styles.root
145
166
  }, otherProps), /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, topElement ? /*#__PURE__*/_react.default.createElement(_Column.default, {
146
167
  style: fullScreen ? undefined : styles.topElementSize
147
168
  }, /*#__PURE__*/_react.default.createElement(_Column.default, {
148
- style: styles.topElementPosition
169
+ style: styles.topElementPosition,
170
+ onLayout: handleTopElementLayout
149
171
  }, topElement)) : null, /*#__PURE__*/_react.default.createElement(_Paper.default, {
150
172
  elevation: 6,
151
173
  square: fullScreen,
@@ -1 +1 @@
1
- {"version":3,"names":["DIALOG_MAX_WIDTH","useStyles","theme","useTheme","width","useWindowDimensions","margin","spacing","dialogWidth","root","alignItems","justifyContent","zIndex","dialog","paper","borderRadius","shape","roundnessExtra","maxWidth","overflow","paperFullScreen","flexGrow","animation","animationFullScreen","height","topElementSize","marginHorizontal","topElementPosition","position","bottom","Dialog","props","animationType","ANIMATION_TYPE","SLIDE","children","fullScreen","onClose","style","visible","topElement","otherProps","styles","screenHeight","closeAnimation","useMemo","FADE","toValue","type","duration","openAnimation","delay","initialOpacity","undefined","initialTranslateY","css"],"sources":["Dialog.tsx"],"sourcesContent":["import React, { useMemo } from 'react';\nimport { useWindowDimensions } from 'react-native';\nimport { css, NamedStylesStringUnion, UseStyles } from '@fountain-ui/styles';\nimport Column from '../Column';\nimport Modal, { ANIMATION_TYPE, AnimationUnit } from '../Modal';\nimport Paper from '../Paper';\nimport { useTheme } from '../styles';\nimport type DialogProps from './DialogProps';\n\ntype DialogStyleKeys =\n | 'root'\n | 'paper'\n | 'paperFullScreen'\n | 'animation'\n | 'animationFullScreen'\n | 'topElementSize'\n | 'topElementPosition';\n\ntype DialogStyles = NamedStylesStringUnion<DialogStyleKeys>;\n\nconst DIALOG_MAX_WIDTH = 328;\n\nconst useStyles: UseStyles<DialogStyles> = function (): DialogStyles {\n const theme = useTheme();\n\n const { width } = useWindowDimensions();\n\n const margin = theme.spacing(4);\n const dialogWidth = width - margin * 2;\n\n return {\n root: {\n alignItems: 'center',\n justifyContent: 'center',\n zIndex: theme.zIndex.dialog,\n },\n paper: {\n borderRadius: theme.shape.roundnessExtra,\n margin,\n maxWidth: DIALOG_MAX_WIDTH,\n overflow: 'hidden',\n width: dialogWidth,\n },\n paperFullScreen: {\n flexGrow: 1,\n },\n animation: {},\n animationFullScreen: {\n width: '100%',\n height: '100%',\n },\n topElementSize: {\n marginHorizontal: margin,\n maxWidth: DIALOG_MAX_WIDTH,\n width: dialogWidth,\n },\n topElementPosition: {\n position: 'absolute',\n bottom: -1 * theme.spacing(4),\n width: '100%',\n },\n };\n};\n\nexport default function Dialog(props: DialogProps) {\n const {\n animationType = ANIMATION_TYPE.SLIDE,\n children,\n fullScreen = false,\n onClose,\n style = {},\n visible,\n topElement,\n ...otherProps\n } = props;\n\n const styles = useStyles();\n\n const { height: screenHeight } = useWindowDimensions();\n\n const closeAnimation = useMemo<AnimationUnit[]>(() => {\n if (animationType === ANIMATION_TYPE.FADE) {\n return [{\n toValue: 0,\n type: ANIMATION_TYPE.FADE,\n }];\n } else if (animationType === ANIMATION_TYPE.SLIDE && !fullScreen) {\n return [\n {\n toValue: screenHeight,\n type: ANIMATION_TYPE.SLIDE,\n },\n {\n duration: 150,\n toValue: 0,\n type: ANIMATION_TYPE.FADE,\n },\n ];\n }\n\n return [{\n duration: 150,\n toValue: screenHeight,\n type: ANIMATION_TYPE.SLIDE,\n }];\n }, [animationType, fullScreen, screenHeight]);\n\n const openAnimation = useMemo<AnimationUnit[]>(() => {\n if (animationType === ANIMATION_TYPE.FADE) {\n return [{\n toValue: 1,\n type: ANIMATION_TYPE.FADE,\n }];\n } else if (animationType === ANIMATION_TYPE.SLIDE && !fullScreen) {\n return [\n {\n toValue: 0,\n type: ANIMATION_TYPE.SLIDE,\n },\n {\n delay: 50,\n duration: 150,\n toValue: 1,\n type: ANIMATION_TYPE.FADE,\n },\n ];\n }\n\n return [{\n toValue: 0,\n type: ANIMATION_TYPE.SLIDE,\n }];\n }, [animationType, fullScreen]);\n\n const initialOpacity = animationType === ANIMATION_TYPE.SLIDE && fullScreen ? 1 : undefined;\n\n const initialTranslateY = animationType === ANIMATION_TYPE.FADE ? 0 : undefined;\n\n return (\n <Modal\n animationStyle={fullScreen ? styles.animationFullScreen : styles.animation}\n closeAnimation={closeAnimation}\n initialOpacity={initialOpacity}\n initialTranslateY={initialTranslateY}\n onClose={onClose}\n openAnimation={openAnimation}\n visible={visible}\n style={styles.root}\n {...otherProps}\n >\n <React.Fragment>\n {topElement ? (\n <Column style={fullScreen ? undefined : styles.topElementSize}>\n <Column style={styles.topElementPosition}>\n {topElement}\n </Column>\n </Column>\n ) : null}\n\n <Paper\n elevation={6}\n square={fullScreen}\n style={css([\n fullScreen ? styles.paperFullScreen : styles.paper,\n style,\n ])}\n >\n {children}\n </Paper>\n </React.Fragment>\n </Modal>\n );\n};\n"],"mappings":"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"}
1
+ {"version":3,"names":["DIALOG_MAX_WIDTH","TOP_ELEMENT_OFFSET","useStyles","theme","useTheme","width","useWindowDimensions","margin","spacing","dialogWidth","root","alignItems","justifyContent","zIndex","dialog","paper","borderRadius","shape","roundnessExtra","maxWidth","overflow","paperFullScreen","flexGrow","animation","animationFullScreen","height","topElementSize","marginHorizontal","topElementPosition","position","bottom","Dialog","props","animationType","ANIMATION_TYPE","SLIDE","children","fullScreen","onClose","style","visible","topElement","otherProps","styles","screenHeight","topElementHeight","setTopElementHeight","useState","handleTopElementLayout","event","nativeEvent","layout","offsetAnimation","useMemo","toValue","type","closeAnimation","FADE","duration","openAnimation","delay","initialOpacity","undefined","initialTranslateY","css"],"sources":["Dialog.tsx"],"sourcesContent":["import React, { useMemo, useState } from 'react';\nimport { LayoutChangeEvent, useWindowDimensions } from 'react-native';\nimport { css, NamedStylesStringUnion, UseStyles } from '@fountain-ui/styles';\nimport Column from '../Column';\nimport Modal, { ANIMATION_TYPE, AnimationUnit } from '../Modal';\nimport Paper from '../Paper';\nimport { useTheme } from '../styles';\nimport type DialogProps from './DialogProps';\n\ntype DialogStyleKeys =\n | 'root'\n | 'paper'\n | 'paperFullScreen'\n | 'animation'\n | 'animationFullScreen'\n | 'topElementSize'\n | 'topElementPosition';\n\ntype DialogStyles = NamedStylesStringUnion<DialogStyleKeys>;\n\nconst DIALOG_MAX_WIDTH = 328;\n\nconst TOP_ELEMENT_OFFSET = 20;\n\nconst useStyles: UseStyles<DialogStyles> = function (): DialogStyles {\n const theme = useTheme();\n\n const { width } = useWindowDimensions();\n\n const margin = theme.spacing(4);\n const dialogWidth = width - margin * 2;\n\n return {\n root: {\n alignItems: 'center',\n justifyContent: 'center',\n zIndex: theme.zIndex.dialog,\n },\n paper: {\n borderRadius: theme.shape.roundnessExtra,\n margin,\n maxWidth: DIALOG_MAX_WIDTH,\n overflow: 'hidden',\n width: dialogWidth,\n },\n paperFullScreen: {\n flexGrow: 1,\n },\n animation: {},\n animationFullScreen: {\n width: '100%',\n height: '100%',\n },\n topElementSize: {\n marginHorizontal: margin,\n maxWidth: DIALOG_MAX_WIDTH,\n width: dialogWidth,\n },\n topElementPosition: {\n position: 'absolute',\n bottom: -1 * theme.spacing(4),\n width: '100%',\n },\n };\n};\n\nexport default function Dialog(props: DialogProps) {\n const {\n animationType = ANIMATION_TYPE.SLIDE,\n children,\n fullScreen = false,\n onClose,\n style = {},\n visible,\n topElement,\n ...otherProps\n } = props;\n\n const styles = useStyles();\n\n const { height: screenHeight } = useWindowDimensions();\n\n const [topElementHeight, setTopElementHeight] = useState(0);\n const handleTopElementLayout = (event: LayoutChangeEvent) => {\n const { height } = event.nativeEvent.layout;\n setTopElementHeight(height);\n };\n\n const offsetAnimation = useMemo<AnimationUnit[]>(() => {\n if (topElementHeight === 0) {\n return [];\n }\n\n return [{\n toValue: (topElementHeight - TOP_ELEMENT_OFFSET) / 2,\n type: ANIMATION_TYPE.SLIDE,\n }]\n }, [topElementHeight]);\n\n const closeAnimation = useMemo<AnimationUnit[]>(() => {\n if (animationType === ANIMATION_TYPE.FADE) {\n return [{\n toValue: 0,\n type: ANIMATION_TYPE.FADE,\n }];\n } else if (animationType === ANIMATION_TYPE.SLIDE && !fullScreen) {\n return [\n {\n toValue: screenHeight,\n type: ANIMATION_TYPE.SLIDE,\n },\n {\n duration: 150,\n toValue: 0,\n type: ANIMATION_TYPE.FADE,\n },\n ];\n }\n\n return [{\n duration: 150,\n toValue: screenHeight,\n type: ANIMATION_TYPE.SLIDE,\n }];\n }, [animationType, fullScreen, screenHeight]);\n\n const openAnimation = useMemo<AnimationUnit[]>(() => {\n if (animationType === ANIMATION_TYPE.FADE) {\n return [{\n toValue: 1,\n type: ANIMATION_TYPE.FADE,\n }];\n } else if (animationType === ANIMATION_TYPE.SLIDE && !fullScreen) {\n return [\n {\n toValue: 0,\n type: ANIMATION_TYPE.SLIDE,\n },\n {\n delay: 50,\n duration: 150,\n toValue: 1,\n type: ANIMATION_TYPE.FADE,\n },\n ];\n }\n\n return [{\n toValue: 0,\n type: ANIMATION_TYPE.SLIDE,\n }];\n }, [animationType, fullScreen]);\n\n const initialOpacity = animationType === ANIMATION_TYPE.SLIDE && fullScreen ? 1 : undefined;\n\n const initialTranslateY = animationType === ANIMATION_TYPE.FADE ? 0 : undefined;\n\n return (\n <Modal\n animationStyle={fullScreen ? styles.animationFullScreen : styles.animation}\n closeAnimation={closeAnimation}\n initialOpacity={initialOpacity}\n initialTranslateY={initialTranslateY}\n onClose={onClose}\n openAnimation={openAnimation}\n offsetAnimation={offsetAnimation}\n visible={visible}\n style={styles.root}\n {...otherProps}\n >\n <React.Fragment>\n {topElement ? (\n <Column style={fullScreen ? undefined : styles.topElementSize}>\n <Column\n style={styles.topElementPosition}\n onLayout={handleTopElementLayout}\n >\n {topElement}\n </Column>\n </Column>\n ) : null}\n\n <Paper\n elevation={6}\n square={fullScreen}\n style={css([\n fullScreen ? styles.paperFullScreen : styles.paper,\n style,\n ])}\n >\n {children}\n </Paper>\n </React.Fragment>\n </Modal>\n );\n};\n"],"mappings":"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"}
@@ -37,6 +37,7 @@ function AnimatedContainer(props) {
37
37
  onExit,
38
38
  onExited,
39
39
  openAnimation,
40
+ offsetAnimation,
40
41
  style,
41
42
  visible
42
43
  } = props;
@@ -139,6 +140,18 @@ function AnimatedContainer(props) {
139
140
  }
140
141
  }
141
142
  }, [convertToCompositeAnimation, visible]);
143
+ (0, _react.useEffect)(() => {
144
+ if (visible && offsetAnimation && offsetAnimation.length > 0) {
145
+ opacity.setValue(1);
146
+ const convertedAnimation = offsetAnimation.map(animationUnit => {
147
+ return convertToCompositeAnimation({ ...DEFAULT_ANIMATION_CONFIG,
148
+ ...animationUnit
149
+ });
150
+ });
151
+
152
+ _reactNative.Animated.parallel(convertedAnimation).start();
153
+ }
154
+ }, [visible, offsetAnimation, convertToCompositeAnimation]);
142
155
  const animatedStyle = {
143
156
  opacity,
144
157
  transform: [{
@@ -1 +1 @@
1
- {"version":3,"names":["DEFAULT_ANIMATION_CONFIG","duration","useNativeDriver","isNotAndroid12","AnimatedContainer","props","children","closeAnimation","initialOpacity","initialTranslateY","onEnter","onEntered","onExit","onExited","openAnimation","style","visible","height","screenHeight","useWindowDimensions","opacity","useAnimatedValue","translateY","convertToCompositeAnimation","useCallback","animationUnit","type","others","ANIMATION_TYPE","FADE","Animated","timing","SLIDE","easing","toValue","Easing","in","ease","Platform","OS","bezier","out","exp","useEffect","R","isNil","setValue","start","finished","convertedAnimation","map","parallel","animatedStyle","transform"],"sources":["index.tsx"],"sourcesContent":["import React, { useCallback, useEffect } from 'react';\nimport { Animated, Easing, Platform, useWindowDimensions } from 'react-native';\nimport * as R from 'ramda';\nimport { useAnimatedValue } from '../../hooks';\nimport { isNotAndroid12 } from '../../utils';\nimport type ModalProps from '../ModalProps';\nimport { ANIMATION_TYPE, AnimationUnit } from '../ModalProps';\n\ntype AnimatedContainerProps = Pick<ModalProps,\n | 'children'\n | 'closeAnimation'\n | 'initialOpacity'\n | 'initialTranslateY'\n | 'onEnter'\n | 'onEntered'\n | 'onExit'\n | 'onExited'\n | 'openAnimation'\n | 'style'\n | 'visible'>\n\nconst DEFAULT_ANIMATION_CONFIG = {\n duration: 300,\n useNativeDriver: isNotAndroid12,\n};\n\nexport default function AnimatedContainer(props: AnimatedContainerProps) {\n const {\n children,\n closeAnimation,\n initialOpacity,\n initialTranslateY,\n onEnter,\n onEntered,\n onExit,\n onExited,\n openAnimation,\n style,\n visible,\n } = props;\n\n const { height: screenHeight } = useWindowDimensions();\n\n const opacity = useAnimatedValue(initialOpacity ?? 0);\n\n const translateY = useAnimatedValue(initialTranslateY ?? screenHeight);\n\n const convertToCompositeAnimation = useCallback((animationUnit: AnimationUnit) => {\n const {\n type,\n ...others\n } = animationUnit;\n\n switch (type) {\n case ANIMATION_TYPE.FADE:\n return Animated.timing(opacity, {\n ...others,\n useNativeDriver: isNotAndroid12,\n });\n case ANIMATION_TYPE.SLIDE:\n default:\n const easing = others.toValue === screenHeight\n ? Easing.in(Easing.ease)\n : Platform.OS === 'web'\n ? Easing.bezier(0.16, 1, 0.3, 1)\n : Easing.out(Easing.exp);\n\n return Animated.timing(translateY, {\n ...others,\n easing,\n useNativeDriver: isNotAndroid12,\n });\n }\n }, [screenHeight]);\n\n useEffect(() => {\n if (visible) {\n onEnter?.();\n\n if (R.isNil(openAnimation)) {\n opacity.setValue(1);\n\n Animated.timing(translateY, {\n ...DEFAULT_ANIMATION_CONFIG,\n easing: Platform.OS === 'web'\n ? Easing.bezier(0.16, 1, 0.3, 1)\n : Easing.out(Easing.exp),\n toValue: 0,\n }).start(({ finished }) => {\n if (finished) {\n onEntered?.();\n }\n });\n } else {\n const convertedAnimation = openAnimation.map((animationUnit) => {\n return convertToCompositeAnimation({\n ...DEFAULT_ANIMATION_CONFIG,\n ...animationUnit,\n });\n });\n\n Animated.parallel(convertedAnimation).start(({ finished }) => {\n if (finished) {\n onEntered?.();\n }\n });\n }\n } else {\n onExit?.();\n\n if (R.isNil(closeAnimation)) {\n opacity.setValue(1);\n\n Animated.timing(translateY, {\n ...DEFAULT_ANIMATION_CONFIG,\n easing: Easing.in(Easing.ease),\n toValue: screenHeight,\n }).start(({ finished }) => {\n if (finished) {\n onExited?.();\n }\n });\n } else {\n const convertedAnimation = closeAnimation.map((animationUnit) => {\n return convertToCompositeAnimation({\n ...DEFAULT_ANIMATION_CONFIG,\n ...animationUnit,\n });\n });\n\n Animated.parallel(convertedAnimation).start(({ finished }) => {\n if (finished) {\n onExited?.();\n }\n });\n }\n }\n }, [convertToCompositeAnimation, visible]);\n\n const animatedStyle = {\n opacity,\n transform: [{ translateY }],\n };\n\n return (\n <Animated.View\n needsOffscreenAlphaCompositing={true}\n pointerEvents={'box-none'}\n style={[\n animatedStyle,\n style,\n ]}\n >\n {children}\n </Animated.View>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"names":["DEFAULT_ANIMATION_CONFIG","duration","useNativeDriver","isNotAndroid12","AnimatedContainer","props","children","closeAnimation","initialOpacity","initialTranslateY","onEnter","onEntered","onExit","onExited","openAnimation","offsetAnimation","style","visible","height","screenHeight","useWindowDimensions","opacity","useAnimatedValue","translateY","convertToCompositeAnimation","useCallback","animationUnit","type","others","ANIMATION_TYPE","FADE","Animated","timing","SLIDE","easing","toValue","Easing","in","ease","Platform","OS","bezier","out","exp","useEffect","R","isNil","setValue","start","finished","convertedAnimation","map","parallel","length","animatedStyle","transform"],"sources":["index.tsx"],"sourcesContent":["import React, { useCallback, useEffect } from 'react';\nimport { Animated, Easing, Platform, useWindowDimensions } from 'react-native';\nimport * as R from 'ramda';\nimport { useAnimatedValue } from '../../hooks';\nimport { isNotAndroid12 } from '../../utils';\nimport type ModalProps from '../ModalProps';\nimport { ANIMATION_TYPE, AnimationUnit } from '../ModalProps';\n\ntype AnimatedContainerProps = Pick<ModalProps,\n | 'children'\n | 'closeAnimation'\n | 'initialOpacity'\n | 'initialTranslateY'\n | 'onEnter'\n | 'onEntered'\n | 'onExit'\n | 'onExited'\n | 'openAnimation'\n | 'offsetAnimation'\n | 'style'\n | 'visible'>\n\nconst DEFAULT_ANIMATION_CONFIG = {\n duration: 300,\n useNativeDriver: isNotAndroid12,\n};\n\nexport default function AnimatedContainer(props: AnimatedContainerProps) {\n const {\n children,\n closeAnimation,\n initialOpacity,\n initialTranslateY,\n onEnter,\n onEntered,\n onExit,\n onExited,\n openAnimation,\n offsetAnimation,\n style,\n visible,\n } = props;\n\n const { height: screenHeight } = useWindowDimensions();\n\n const opacity = useAnimatedValue(initialOpacity ?? 0);\n\n const translateY = useAnimatedValue(initialTranslateY ?? screenHeight);\n\n const convertToCompositeAnimation = useCallback((animationUnit: AnimationUnit) => {\n const {\n type,\n ...others\n } = animationUnit;\n\n switch (type) {\n case ANIMATION_TYPE.FADE:\n return Animated.timing(opacity, {\n ...others,\n useNativeDriver: isNotAndroid12,\n });\n case ANIMATION_TYPE.SLIDE:\n default:\n const easing = others.toValue === screenHeight\n ? Easing.in(Easing.ease)\n : Platform.OS === 'web'\n ? Easing.bezier(0.16, 1, 0.3, 1)\n : Easing.out(Easing.exp);\n\n return Animated.timing(translateY, {\n ...others,\n easing,\n useNativeDriver: isNotAndroid12,\n });\n }\n }, [screenHeight]);\n\n useEffect(() => {\n if (visible) {\n onEnter?.();\n\n if (R.isNil(openAnimation)) {\n opacity.setValue(1);\n\n Animated.timing(translateY, {\n ...DEFAULT_ANIMATION_CONFIG,\n easing: Platform.OS === 'web'\n ? Easing.bezier(0.16, 1, 0.3, 1)\n : Easing.out(Easing.exp),\n toValue: 0,\n }).start(({ finished }) => {\n if (finished) {\n onEntered?.();\n }\n });\n } else {\n const convertedAnimation = openAnimation.map((animationUnit) => {\n return convertToCompositeAnimation({\n ...DEFAULT_ANIMATION_CONFIG,\n ...animationUnit,\n });\n });\n\n Animated.parallel(convertedAnimation).start(({ finished }) => {\n if (finished) {\n onEntered?.();\n }\n });\n }\n } else {\n onExit?.();\n\n if (R.isNil(closeAnimation)) {\n opacity.setValue(1);\n\n Animated.timing(translateY, {\n ...DEFAULT_ANIMATION_CONFIG,\n easing: Easing.in(Easing.ease),\n toValue: screenHeight,\n }).start(({ finished }) => {\n if (finished) {\n onExited?.();\n }\n });\n } else {\n const convertedAnimation = closeAnimation.map((animationUnit) => {\n return convertToCompositeAnimation({\n ...DEFAULT_ANIMATION_CONFIG,\n ...animationUnit,\n });\n });\n\n Animated.parallel(convertedAnimation).start(({ finished }) => {\n if (finished) {\n onExited?.();\n }\n });\n }\n }\n }, [convertToCompositeAnimation, visible]);\n\n useEffect(() => {\n if (visible && offsetAnimation && offsetAnimation.length > 0) {\n opacity.setValue(1);\n const convertedAnimation = offsetAnimation.map((animationUnit) => {\n return convertToCompositeAnimation({\n ...DEFAULT_ANIMATION_CONFIG,\n ...animationUnit\n });\n });\n Animated.parallel(convertedAnimation).start();\n }\n }, [visible, offsetAnimation, convertToCompositeAnimation]);\n\n const animatedStyle = {\n opacity,\n transform: [{ translateY }],\n };\n\n return (\n <Animated.View\n needsOffscreenAlphaCompositing={true}\n pointerEvents={'box-none'}\n style={[\n animatedStyle,\n style,\n ]}\n >\n {children}\n </Animated.View>\n );\n}\n"],"mappings":";;;;;;;AAAA;;AACA;;AACA;;AACA;;AACA;;AAEA;;;;;;AAgBA,MAAMA,wBAAwB,GAAG;EAC7BC,QAAQ,EAAE,GADmB;EAE7BC,eAAe,EAAEC;AAFY,CAAjC;;AAKe,SAASC,iBAAT,CAA2BC,KAA3B,EAA0D;EACrE,MAAM;IACFC,QADE;IAEFC,cAFE;IAGFC,cAHE;IAIFC,iBAJE;IAKFC,OALE;IAMFC,SANE;IAOFC,MAPE;IAQFC,QARE;IASFC,aATE;IAUFC,eAVE;IAWFC,KAXE;IAYFC;EAZE,IAaFZ,KAbJ;EAeA,MAAM;IAAEa,MAAM,EAAEC;EAAV,IAA2B,IAAAC,gCAAA,GAAjC;EAEA,MAAMC,OAAO,GAAG,IAAAC,uBAAA,EAAiBd,cAAc,IAAI,CAAnC,CAAhB;EAEA,MAAMe,UAAU,GAAG,IAAAD,uBAAA,EAAiBb,iBAAiB,IAAIU,YAAtC,CAAnB;EAEA,MAAMK,2BAA2B,GAAG,IAAAC,kBAAA,EAAaC,aAAD,IAAkC;IAC9E,MAAM;MACFC,IADE;MAEF,GAAGC;IAFD,IAGFF,aAHJ;;IAKA,QAAQC,IAAR;MACI,KAAKE,0BAAA,CAAeC,IAApB;QACI,OAAOC,qBAAA,CAASC,MAAT,CAAgBX,OAAhB,EAAyB,EAC5B,GAAGO,MADyB;UAE5B1B,eAAe,EAAEC;QAFW,CAAzB,CAAP;;MAIJ,KAAK0B,0BAAA,CAAeI,KAApB;MACA;QACI,MAAMC,MAAM,GAAGN,MAAM,CAACO,OAAP,KAAmBhB,YAAnB,GACTiB,mBAAA,CAAOC,EAAP,CAAUD,mBAAA,CAAOE,IAAjB,CADS,GAETC,qBAAA,CAASC,EAAT,KAAgB,KAAhB,GACIJ,mBAAA,CAAOK,MAAP,CAAc,IAAd,EAAoB,CAApB,EAAuB,GAAvB,EAA4B,CAA5B,CADJ,GAEIL,mBAAA,CAAOM,GAAP,CAAWN,mBAAA,CAAOO,GAAlB,CAJV;QAMA,OAAOZ,qBAAA,CAASC,MAAT,CAAgBT,UAAhB,EAA4B,EAC/B,GAAGK,MAD4B;UAE/BM,MAF+B;UAG/BhC,eAAe,EAAEC;QAHc,CAA5B,CAAP;IAdR;EAoBH,CA1BmC,EA0BjC,CAACgB,YAAD,CA1BiC,CAApC;EA4BA,IAAAyB,gBAAA,EAAU,MAAM;IACZ,IAAI3B,OAAJ,EAAa;MACTP,OAAO,SAAP,IAAAA,OAAO,WAAP,YAAAA,OAAO;;MAEP,IAAImC,CAAC,CAACC,KAAF,CAAQhC,aAAR,CAAJ,EAA4B;QACxBO,OAAO,CAAC0B,QAAR,CAAiB,CAAjB;;QAEAhB,qBAAA,CAASC,MAAT,CAAgBT,UAAhB,EAA4B,EACxB,GAAGvB,wBADqB;UAExBkC,MAAM,EAAEK,qBAAA,CAASC,EAAT,KAAgB,KAAhB,GACFJ,mBAAA,CAAOK,MAAP,CAAc,IAAd,EAAoB,CAApB,EAAuB,GAAvB,EAA4B,CAA5B,CADE,GAEFL,mBAAA,CAAOM,GAAP,CAAWN,mBAAA,CAAOO,GAAlB,CAJkB;UAKxBR,OAAO,EAAE;QALe,CAA5B,EAMGa,KANH,CAMS,QAAkB;UAAA,IAAjB;YAAEC;UAAF,CAAiB;;UACvB,IAAIA,QAAJ,EAAc;YACVtC,SAAS,SAAT,IAAAA,SAAS,WAAT,YAAAA,SAAS;UACZ;QACJ,CAVD;MAWH,CAdD,MAcO;QACH,MAAMuC,kBAAkB,GAAGpC,aAAa,CAACqC,GAAd,CAAmBzB,aAAD,IAAmB;UAC5D,OAAOF,2BAA2B,CAAC,EAC/B,GAAGxB,wBAD4B;YAE/B,GAAG0B;UAF4B,CAAD,CAAlC;QAIH,CAL0B,CAA3B;;QAOAK,qBAAA,CAASqB,QAAT,CAAkBF,kBAAlB,EAAsCF,KAAtC,CAA4C,SAAkB;UAAA,IAAjB;YAAEC;UAAF,CAAiB;;UAC1D,IAAIA,QAAJ,EAAc;YACVtC,SAAS,SAAT,IAAAA,SAAS,WAAT,YAAAA,SAAS;UACZ;QACJ,CAJD;MAKH;IACJ,CA/BD,MA+BO;MACHC,MAAM,SAAN,IAAAA,MAAM,WAAN,YAAAA,MAAM;;MAEN,IAAIiC,CAAC,CAACC,KAAF,CAAQvC,cAAR,CAAJ,EAA6B;QACzBc,OAAO,CAAC0B,QAAR,CAAiB,CAAjB;;QAEAhB,qBAAA,CAASC,MAAT,CAAgBT,UAAhB,EAA4B,EACxB,GAAGvB,wBADqB;UAExBkC,MAAM,EAAEE,mBAAA,CAAOC,EAAP,CAAUD,mBAAA,CAAOE,IAAjB,CAFgB;UAGxBH,OAAO,EAAEhB;QAHe,CAA5B,EAIG6B,KAJH,CAIS,SAAkB;UAAA,IAAjB;YAAEC;UAAF,CAAiB;;UACvB,IAAIA,QAAJ,EAAc;YACVpC,QAAQ,SAAR,IAAAA,QAAQ,WAAR,YAAAA,QAAQ;UACX;QACJ,CARD;MASH,CAZD,MAYO;QACH,MAAMqC,kBAAkB,GAAG3C,cAAc,CAAC4C,GAAf,CAAoBzB,aAAD,IAAmB;UAC7D,OAAOF,2BAA2B,CAAC,EAC/B,GAAGxB,wBAD4B;YAE/B,GAAG0B;UAF4B,CAAD,CAAlC;QAIH,CAL0B,CAA3B;;QAOAK,qBAAA,CAASqB,QAAT,CAAkBF,kBAAlB,EAAsCF,KAAtC,CAA4C,SAAkB;UAAA,IAAjB;YAAEC;UAAF,CAAiB;;UAC1D,IAAIA,QAAJ,EAAc;YACVpC,QAAQ,SAAR,IAAAA,QAAQ,WAAR,YAAAA,QAAQ;UACX;QACJ,CAJD;MAKH;IACJ;EACJ,CA9DD,EA8DG,CAACW,2BAAD,EAA8BP,OAA9B,CA9DH;EAgEA,IAAA2B,gBAAA,EAAU,MAAM;IACZ,IAAI3B,OAAO,IAAIF,eAAX,IAA8BA,eAAe,CAACsC,MAAhB,GAAyB,CAA3D,EAA8D;MAC1DhC,OAAO,CAAC0B,QAAR,CAAiB,CAAjB;MACA,MAAMG,kBAAkB,GAAGnC,eAAe,CAACoC,GAAhB,CAAqBzB,aAAD,IAAmB;QAC9D,OAAOF,2BAA2B,CAAC,EAC/B,GAAGxB,wBAD4B;UAE/B,GAAG0B;QAF4B,CAAD,CAAlC;MAIH,CAL0B,CAA3B;;MAMAK,qBAAA,CAASqB,QAAT,CAAkBF,kBAAlB,EAAsCF,KAAtC;IACH;EACJ,CAXD,EAWG,CAAC/B,OAAD,EAAUF,eAAV,EAA2BS,2BAA3B,CAXH;EAaA,MAAM8B,aAAa,GAAG;IAClBjC,OADkB;IAElBkC,SAAS,EAAE,CAAC;MAAEhC;IAAF,CAAD;EAFO,CAAtB;EAKA,oBACI,6BAAC,qBAAD,CAAU,IAAV;IACI,8BAA8B,EAAE,IADpC;IAEI,aAAa,EAAE,UAFnB;IAGI,KAAK,EAAE,CACH+B,aADG,EAEHtC,KAFG;EAHX,GAQKV,QARL,CADJ;AAYH"}
@@ -46,6 +46,7 @@ function Modal(props) {
46
46
  onExit: onExitProp,
47
47
  onExited: onExitedProp,
48
48
  openAnimation,
49
+ offsetAnimation,
49
50
  style,
50
51
  visible,
51
52
  ...otherProps
@@ -100,6 +101,7 @@ function Modal(props) {
100
101
  onExit: onExit,
101
102
  onExited: onExited,
102
103
  openAnimation: openAnimation,
104
+ offsetAnimation: offsetAnimation,
103
105
  style: animationStyle,
104
106
  visible: visible
105
107
  }) : children);
@@ -1 +1 @@
1
- {"version":3,"names":["createModalCloseEvent","reason","metadata","Modal","props","animationStyle","backdropOpacity","children","closeAnimation","disableAnimation","hideBackdrop","initialOpacity","initialTranslateY","onClose","onEnter","onEnterProp","onEntered","onEnteredProp","onExit","onExitProp","onExited","onExitedProp","openAnimation","style","visible","otherProps","handleBackdropPress","exited","setExited","React","useState","elevationStyle","useElevationStyle","css","StyleSheet","absoluteFill"],"sources":["Modal.tsx"],"sourcesContent":["import React from 'react';\nimport { View } from 'react-native';\nimport { css, StyleSheet } from '../styles';\nimport { useElevationStyle } from '../hooks';\nimport type ModalProps from './ModalProps';\nimport AnimatedContainer from './AnimatedContainer';\nimport SimpleBackdrop from './SimpleBackdrop';\n\nexport type ModalCloseReasonType = 'OUTSIDE_PRESS' | 'HARDWARE_BACK_PRESS' | 'CLOSE_BUTTON_PRESS' | 'UNKNOWN';\n\nexport interface ModalCloseEvent {\n metadata: {\n reason: ModalCloseReasonType\n };\n}\n\nexport const createModalCloseEvent = (reason: ModalCloseReasonType) => ({\n metadata: {\n reason,\n },\n});\n\nexport default function Modal(props: ModalProps) {\n const {\n animationStyle,\n backdropOpacity = 0.5,\n children,\n closeAnimation,\n disableAnimation = false,\n hideBackdrop = false,\n initialOpacity,\n initialTranslateY,\n onClose,\n onEnter: onEnterProp,\n onEntered: onEnteredProp,\n onExit: onExitProp,\n onExited: onExitedProp,\n openAnimation,\n style,\n visible,\n ...otherProps\n } = props;\n\n const handleBackdropPress = () => {\n if (onClose) {\n onClose(createModalCloseEvent('OUTSIDE_PRESS'));\n }\n };\n\n const [exited, setExited] = React.useState(true);\n\n const elevationStyle = useElevationStyle(6);\n\n const onEnter = () => {\n setExited(false);\n onEnterProp?.();\n };\n\n const onEntered = () => {\n onEnteredProp?.();\n };\n\n const onExit = () => {\n onExitProp?.();\n };\n\n const onExited = () => {\n setExited(true);\n onExitedProp?.();\n };\n\n if (!visible) {\n if (disableAnimation || exited) {\n return null;\n }\n }\n\n return (\n <View\n style={css([\n StyleSheet.absoluteFill,\n elevationStyle,\n style,\n ])}\n {...otherProps}\n >\n {(!hideBackdrop && visible) ? (\n <SimpleBackdrop\n onPress={handleBackdropPress}\n opacity={backdropOpacity}\n />\n ) : null}\n\n {!disableAnimation ? (\n <AnimatedContainer\n children={children}\n closeAnimation={closeAnimation}\n initialOpacity={initialOpacity}\n initialTranslateY={initialTranslateY}\n onEnter={onEnter}\n onEntered={onEntered}\n onExit={onExit}\n onExited={onExited}\n openAnimation={openAnimation}\n style={animationStyle}\n visible={visible}\n />\n ) : children}\n </View>\n );\n};\n"],"mappings":";;;;;;;;AAAA;;AACA;;AACA;;AACA;;AAEA;;AACA;;;;;;AAUO,MAAMA,qBAAqB,GAAIC,MAAD,KAAmC;EACpEC,QAAQ,EAAE;IACND;EADM;AAD0D,CAAnC,CAA9B;;;;AAMQ,SAASE,KAAT,CAAeC,KAAf,EAAkC;EAC7C,MAAM;IACFC,cADE;IAEFC,eAAe,GAAG,GAFhB;IAGFC,QAHE;IAIFC,cAJE;IAKFC,gBAAgB,GAAG,KALjB;IAMFC,YAAY,GAAG,KANb;IAOFC,cAPE;IAQFC,iBARE;IASFC,OATE;IAUFC,OAAO,EAAEC,WAVP;IAWFC,SAAS,EAAEC,aAXT;IAYFC,MAAM,EAAEC,UAZN;IAaFC,QAAQ,EAAEC,YAbR;IAcFC,aAdE;IAeFC,KAfE;IAgBFC,OAhBE;IAiBF,GAAGC;EAjBD,IAkBFrB,KAlBJ;;EAoBA,MAAMsB,mBAAmB,GAAG,MAAM;IAC9B,IAAIb,OAAJ,EAAa;MACTA,OAAO,CAACb,qBAAqB,CAAC,eAAD,CAAtB,CAAP;IACH;EACJ,CAJD;;EAMA,MAAM,CAAC2B,MAAD,EAASC,SAAT,IAAsBC,cAAA,CAAMC,QAAN,CAAe,IAAf,CAA5B;;EAEA,MAAMC,cAAc,GAAG,IAAAC,wBAAA,EAAkB,CAAlB,CAAvB;;EAEA,MAAMlB,OAAO,GAAG,MAAM;IAClBc,SAAS,CAAC,KAAD,CAAT;IACAb,WAAW,SAAX,IAAAA,WAAW,WAAX,YAAAA,WAAW;EACd,CAHD;;EAKA,MAAMC,SAAS,GAAG,MAAM;IACpBC,aAAa,SAAb,IAAAA,aAAa,WAAb,YAAAA,aAAa;EAChB,CAFD;;EAIA,MAAMC,MAAM,GAAG,MAAM;IACjBC,UAAU,SAAV,IAAAA,UAAU,WAAV,YAAAA,UAAU;EACb,CAFD;;EAIA,MAAMC,QAAQ,GAAG,MAAM;IACnBQ,SAAS,CAAC,IAAD,CAAT;IACAP,YAAY,SAAZ,IAAAA,YAAY,WAAZ,YAAAA,YAAY;EACf,CAHD;;EAKA,IAAI,CAACG,OAAL,EAAc;IACV,IAAIf,gBAAgB,IAAIkB,MAAxB,EAAgC;MAC5B,OAAO,IAAP;IACH;EACJ;;EAED,oBACI,6BAAC,iBAAD;IACI,KAAK,EAAE,IAAAM,WAAA,EAAI,CACPC,kBAAA,CAAWC,YADJ,EAEPJ,cAFO,EAGPR,KAHO,CAAJ;EADX,GAMQE,UANR,GAQM,CAACf,YAAD,IAAiBc,OAAlB,gBACG,6BAAC,uBAAD;IACI,OAAO,EAAEE,mBADb;IAEI,OAAO,EAAEpB;EAFb,EADH,GAKG,IAbR,EAeK,CAACG,gBAAD,gBACG,6BAAC,0BAAD;IACI,QAAQ,EAAEF,QADd;IAEI,cAAc,EAAEC,cAFpB;IAGI,cAAc,EAAEG,cAHpB;IAII,iBAAiB,EAAEC,iBAJvB;IAKI,OAAO,EAAEE,OALb;IAMI,SAAS,EAAEE,SANf;IAOI,MAAM,EAAEE,MAPZ;IAQI,QAAQ,EAAEE,QARd;IASI,aAAa,EAAEE,aATnB;IAUI,KAAK,EAAEjB,cAVX;IAWI,OAAO,EAAEmB;EAXb,EADH,GAcGjB,QA7BR,CADJ;AAiCH;;AAAA"}
1
+ {"version":3,"names":["createModalCloseEvent","reason","metadata","Modal","props","animationStyle","backdropOpacity","children","closeAnimation","disableAnimation","hideBackdrop","initialOpacity","initialTranslateY","onClose","onEnter","onEnterProp","onEntered","onEnteredProp","onExit","onExitProp","onExited","onExitedProp","openAnimation","offsetAnimation","style","visible","otherProps","handleBackdropPress","exited","setExited","React","useState","elevationStyle","useElevationStyle","css","StyleSheet","absoluteFill"],"sources":["Modal.tsx"],"sourcesContent":["import React from 'react';\nimport { View } from 'react-native';\nimport { css, StyleSheet } from '../styles';\nimport { useElevationStyle } from '../hooks';\nimport type ModalProps from './ModalProps';\nimport AnimatedContainer from './AnimatedContainer';\nimport SimpleBackdrop from './SimpleBackdrop';\n\nexport type ModalCloseReasonType = 'OUTSIDE_PRESS' | 'HARDWARE_BACK_PRESS' | 'CLOSE_BUTTON_PRESS' | 'UNKNOWN';\n\nexport interface ModalCloseEvent {\n metadata: {\n reason: ModalCloseReasonType\n };\n}\n\nexport const createModalCloseEvent = (reason: ModalCloseReasonType) => ({\n metadata: {\n reason,\n },\n});\n\nexport default function Modal(props: ModalProps) {\n const {\n animationStyle,\n backdropOpacity = 0.5,\n children,\n closeAnimation,\n disableAnimation = false,\n hideBackdrop = false,\n initialOpacity,\n initialTranslateY,\n onClose,\n onEnter: onEnterProp,\n onEntered: onEnteredProp,\n onExit: onExitProp,\n onExited: onExitedProp,\n openAnimation,\n offsetAnimation,\n style,\n visible,\n ...otherProps\n } = props;\n\n const handleBackdropPress = () => {\n if (onClose) {\n onClose(createModalCloseEvent('OUTSIDE_PRESS'));\n }\n };\n\n const [exited, setExited] = React.useState(true);\n\n const elevationStyle = useElevationStyle(6);\n\n const onEnter = () => {\n setExited(false);\n onEnterProp?.();\n };\n\n const onEntered = () => {\n onEnteredProp?.();\n };\n\n const onExit = () => {\n onExitProp?.();\n };\n\n const onExited = () => {\n setExited(true);\n onExitedProp?.();\n };\n\n if (!visible) {\n if (disableAnimation || exited) {\n return null;\n }\n }\n\n return (\n <View\n style={css([\n StyleSheet.absoluteFill,\n elevationStyle,\n style,\n ])}\n {...otherProps}\n >\n {(!hideBackdrop && visible) ? (\n <SimpleBackdrop\n onPress={handleBackdropPress}\n opacity={backdropOpacity}\n />\n ) : null}\n\n {!disableAnimation ? (\n <AnimatedContainer\n children={children}\n closeAnimation={closeAnimation}\n initialOpacity={initialOpacity}\n initialTranslateY={initialTranslateY}\n onEnter={onEnter}\n onEntered={onEntered}\n onExit={onExit}\n onExited={onExited}\n openAnimation={openAnimation}\n offsetAnimation={offsetAnimation}\n style={animationStyle}\n visible={visible}\n />\n ) : children}\n </View>\n );\n};\n"],"mappings":";;;;;;;;AAAA;;AACA;;AACA;;AACA;;AAEA;;AACA;;;;;;AAUO,MAAMA,qBAAqB,GAAIC,MAAD,KAAmC;EACpEC,QAAQ,EAAE;IACND;EADM;AAD0D,CAAnC,CAA9B;;;;AAMQ,SAASE,KAAT,CAAeC,KAAf,EAAkC;EAC7C,MAAM;IACFC,cADE;IAEFC,eAAe,GAAG,GAFhB;IAGFC,QAHE;IAIFC,cAJE;IAKFC,gBAAgB,GAAG,KALjB;IAMFC,YAAY,GAAG,KANb;IAOFC,cAPE;IAQFC,iBARE;IASFC,OATE;IAUFC,OAAO,EAAEC,WAVP;IAWFC,SAAS,EAAEC,aAXT;IAYFC,MAAM,EAAEC,UAZN;IAaFC,QAAQ,EAAEC,YAbR;IAcFC,aAdE;IAeFC,eAfE;IAgBFC,KAhBE;IAiBFC,OAjBE;IAkBF,GAAGC;EAlBD,IAmBFtB,KAnBJ;;EAqBA,MAAMuB,mBAAmB,GAAG,MAAM;IAC9B,IAAId,OAAJ,EAAa;MACTA,OAAO,CAACb,qBAAqB,CAAC,eAAD,CAAtB,CAAP;IACH;EACJ,CAJD;;EAMA,MAAM,CAAC4B,MAAD,EAASC,SAAT,IAAsBC,cAAA,CAAMC,QAAN,CAAe,IAAf,CAA5B;;EAEA,MAAMC,cAAc,GAAG,IAAAC,wBAAA,EAAkB,CAAlB,CAAvB;;EAEA,MAAMnB,OAAO,GAAG,MAAM;IAClBe,SAAS,CAAC,KAAD,CAAT;IACAd,WAAW,SAAX,IAAAA,WAAW,WAAX,YAAAA,WAAW;EACd,CAHD;;EAKA,MAAMC,SAAS,GAAG,MAAM;IACpBC,aAAa,SAAb,IAAAA,aAAa,WAAb,YAAAA,aAAa;EAChB,CAFD;;EAIA,MAAMC,MAAM,GAAG,MAAM;IACjBC,UAAU,SAAV,IAAAA,UAAU,WAAV,YAAAA,UAAU;EACb,CAFD;;EAIA,MAAMC,QAAQ,GAAG,MAAM;IACnBS,SAAS,CAAC,IAAD,CAAT;IACAR,YAAY,SAAZ,IAAAA,YAAY,WAAZ,YAAAA,YAAY;EACf,CAHD;;EAKA,IAAI,CAACI,OAAL,EAAc;IACV,IAAIhB,gBAAgB,IAAImB,MAAxB,EAAgC;MAC5B,OAAO,IAAP;IACH;EACJ;;EAED,oBACI,6BAAC,iBAAD;IACI,KAAK,EAAE,IAAAM,WAAA,EAAI,CACPC,kBAAA,CAAWC,YADJ,EAEPJ,cAFO,EAGPR,KAHO,CAAJ;EADX,GAMQE,UANR,GAQM,CAAChB,YAAD,IAAiBe,OAAlB,gBACG,6BAAC,uBAAD;IACI,OAAO,EAAEE,mBADb;IAEI,OAAO,EAAErB;EAFb,EADH,GAKG,IAbR,EAeK,CAACG,gBAAD,gBACG,6BAAC,0BAAD;IACI,QAAQ,EAAEF,QADd;IAEI,cAAc,EAAEC,cAFpB;IAGI,cAAc,EAAEG,cAHpB;IAII,iBAAiB,EAAEC,iBAJvB;IAKI,OAAO,EAAEE,OALb;IAMI,SAAS,EAAEE,SANf;IAOI,MAAM,EAAEE,MAPZ;IAQI,QAAQ,EAAEE,QARd;IASI,aAAa,EAAEE,aATnB;IAUI,eAAe,EAAEC,eAVrB;IAWI,KAAK,EAAElB,cAXX;IAYI,OAAO,EAAEoB;EAZb,EADH,GAeGlB,QA9BR,CADJ;AAkCH;;AAAA"}
@@ -1 +1 @@
1
- {"version":3,"names":["ANIMATION_TYPE"],"sources":["ModalProps.ts"],"sourcesContent":["import React from 'react';\nimport type { ViewProps } from 'react-native';\nimport { Animated } from 'react-native';\nimport type { ComponentProps, OverridableComponentProps } from '../types';\nimport { ModalCloseEvent } from './Modal';\n\nexport const enum ANIMATION_TYPE {\n SLIDE = 'slide',\n FADE = 'fade',\n}\n\nexport type AnimationUnit = Omit<Animated.TimingAnimationConfig, 'useNativeDriver'> & {\n /**\n * Type of animation used when the dialog opens and closes.\n */\n type: ANIMATION_TYPE;\n}\n\nexport default interface ModalProps extends OverridableComponentProps<ViewProps, {\n /**\n * Style object provided to animation component.\n */\n animationStyle?: ComponentProps['style'];\n\n /**\n * Opacity for backdrop.\n * @default 0.5\n */\n backdropOpacity?: number;\n\n /**\n * A single child content element.\n */\n children: React.ReactElement;\n\n /**\n * If `true`, the animation is disabled.\n * @default false\n */\n disableAnimation?: boolean;\n\n /**\n * Animation used when the modal closes.\n */\n closeAnimation?: AnimationUnit[] | undefined;\n\n /**\n * If `true`, the backdrop is not rendered.\n * @default false\n */\n hideBackdrop?: boolean;\n\n /**\n * Set the initial value of opacity for animating.\n */\n initialOpacity?: number | undefined;\n\n /**\n * Set the initial value of transition y for animating.\n */\n initialTranslateY?: number | undefined;\n\n /**\n * Callback fired when the component requests to be closed.\n */\n onClose?: (event?: ModalCloseEvent) => void;\n\n /**\n * Callback fired when the enter animation will start.\n */\n onEnter?: () => void | undefined;\n\n /**\n * Callback fired when the enter animation is completed.\n */\n onEntered?: () => void | undefined;\n\n /**\n * Callback fired when the exit animation will start.\n */\n onExit?: () => void | undefined;\n\n /**\n * Callback fired when the exit animation is completed.\n */\n onExited?: () => void | undefined;\n\n /**\n * Animation used when the modal opens.\n */\n openAnimation?: AnimationUnit[] | undefined;\n\n /**\n * If `true`, the modal is visible.\n */\n visible: boolean;\n}> {}\n"],"mappings":";;;;;;IAMkBA,c;;;WAAAA,c;EAAAA,c;EAAAA,c;GAAAA,c,8BAAAA,c"}
1
+ {"version":3,"names":["ANIMATION_TYPE"],"sources":["ModalProps.ts"],"sourcesContent":["import React from 'react';\nimport type { ViewProps } from 'react-native';\nimport { Animated } from 'react-native';\nimport type { ComponentProps, OverridableComponentProps } from '../types';\nimport { ModalCloseEvent } from './Modal';\n\nexport const enum ANIMATION_TYPE {\n SLIDE = 'slide',\n FADE = 'fade',\n}\n\nexport type AnimationUnit = Omit<Animated.TimingAnimationConfig, 'useNativeDriver'> & {\n /**\n * Type of animation used when the dialog opens and closes.\n */\n type: ANIMATION_TYPE;\n}\n\nexport default interface ModalProps extends OverridableComponentProps<ViewProps, {\n /**\n * Style object provided to animation component.\n */\n animationStyle?: ComponentProps['style'];\n\n /**\n * Opacity for backdrop.\n * @default 0.5\n */\n backdropOpacity?: number;\n\n /**\n * A single child content element.\n */\n children: React.ReactElement;\n\n /**\n * If `true`, the animation is disabled.\n * @default false\n */\n disableAnimation?: boolean;\n\n /**\n * Animation used when the modal closes.\n */\n closeAnimation?: AnimationUnit[] | undefined;\n\n /**\n * If `true`, the backdrop is not rendered.\n * @default false\n */\n hideBackdrop?: boolean;\n\n /**\n * Set the initial value of opacity for animating.\n */\n initialOpacity?: number | undefined;\n\n /**\n * Set the initial value of transition y for animating.\n */\n initialTranslateY?: number | undefined;\n\n /**\n * Callback fired when the component requests to be closed.\n */\n onClose?: (event?: ModalCloseEvent) => void;\n\n /**\n * Callback fired when the enter animation will start.\n */\n onEnter?: () => void | undefined;\n\n /**\n * Callback fired when the enter animation is completed.\n */\n onEntered?: () => void | undefined;\n\n /**\n * Callback fired when the exit animation will start.\n */\n onExit?: () => void | undefined;\n\n /**\n * Callback fired when the exit animation is completed.\n */\n onExited?: () => void | undefined;\n\n /**\n * Animation used when the modal opens.\n */\n openAnimation?: AnimationUnit[] | undefined;\n\n /**\n * Additional offset animation applied when the modal opens.\n */\n offsetAnimation?: AnimationUnit[] | undefined;\n\n /**\n * If `true`, the modal is visible.\n */\n visible: boolean;\n}> {}\n"],"mappings":";;;;;;IAMkBA,c;;;WAAAA,c;EAAAA,c;EAAAA,c;GAAAA,c,8BAAAA,c"}
@@ -1,6 +1,6 @@
1
1
  function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
2
2
 
3
- import React, { useMemo } from 'react';
3
+ import React, { useMemo, useState } from 'react';
4
4
  import { useWindowDimensions } from 'react-native';
5
5
  import { css } from '@fountain-ui/styles';
6
6
  import Column from '../Column';
@@ -8,6 +8,7 @@ import Modal, { ANIMATION_TYPE } from '../Modal';
8
8
  import Paper from '../Paper';
9
9
  import { useTheme } from '../styles';
10
10
  const DIALOG_MAX_WIDTH = 328;
11
+ const TOP_ELEMENT_OFFSET = 20;
11
12
 
12
13
  const useStyles = function () {
13
14
  const theme = useTheme();
@@ -65,6 +66,25 @@ export default function Dialog(props) {
65
66
  const {
66
67
  height: screenHeight
67
68
  } = useWindowDimensions();
69
+ const [topElementHeight, setTopElementHeight] = useState(0);
70
+
71
+ const handleTopElementLayout = event => {
72
+ const {
73
+ height
74
+ } = event.nativeEvent.layout;
75
+ setTopElementHeight(height);
76
+ };
77
+
78
+ const offsetAnimation = useMemo(() => {
79
+ if (topElementHeight === 0) {
80
+ return [];
81
+ }
82
+
83
+ return [{
84
+ toValue: (topElementHeight - TOP_ELEMENT_OFFSET) / 2,
85
+ type: ANIMATION_TYPE.SLIDE
86
+ }];
87
+ }, [topElementHeight]);
68
88
  const closeAnimation = useMemo(() => {
69
89
  if (animationType === ANIMATION_TYPE.FADE) {
70
90
  return [{
@@ -120,12 +140,14 @@ export default function Dialog(props) {
120
140
  initialTranslateY: initialTranslateY,
121
141
  onClose: onClose,
122
142
  openAnimation: openAnimation,
143
+ offsetAnimation: offsetAnimation,
123
144
  visible: visible,
124
145
  style: styles.root
125
146
  }, otherProps), /*#__PURE__*/React.createElement(React.Fragment, null, topElement ? /*#__PURE__*/React.createElement(Column, {
126
147
  style: fullScreen ? undefined : styles.topElementSize
127
148
  }, /*#__PURE__*/React.createElement(Column, {
128
- style: styles.topElementPosition
149
+ style: styles.topElementPosition,
150
+ onLayout: handleTopElementLayout
129
151
  }, topElement)) : null, /*#__PURE__*/React.createElement(Paper, {
130
152
  elevation: 6,
131
153
  square: fullScreen,
@@ -1 +1 @@
1
- {"version":3,"names":["React","useMemo","useWindowDimensions","css","Column","Modal","ANIMATION_TYPE","Paper","useTheme","DIALOG_MAX_WIDTH","useStyles","theme","width","margin","spacing","dialogWidth","root","alignItems","justifyContent","zIndex","dialog","paper","borderRadius","shape","roundnessExtra","maxWidth","overflow","paperFullScreen","flexGrow","animation","animationFullScreen","height","topElementSize","marginHorizontal","topElementPosition","position","bottom","Dialog","props","animationType","SLIDE","children","fullScreen","onClose","style","visible","topElement","otherProps","styles","screenHeight","closeAnimation","FADE","toValue","type","duration","openAnimation","delay","initialOpacity","undefined","initialTranslateY"],"sources":["Dialog.tsx"],"sourcesContent":["import React, { useMemo } from 'react';\nimport { useWindowDimensions } from 'react-native';\nimport { css, NamedStylesStringUnion, UseStyles } from '@fountain-ui/styles';\nimport Column from '../Column';\nimport Modal, { ANIMATION_TYPE, AnimationUnit } from '../Modal';\nimport Paper from '../Paper';\nimport { useTheme } from '../styles';\nimport type DialogProps from './DialogProps';\n\ntype DialogStyleKeys =\n | 'root'\n | 'paper'\n | 'paperFullScreen'\n | 'animation'\n | 'animationFullScreen'\n | 'topElementSize'\n | 'topElementPosition';\n\ntype DialogStyles = NamedStylesStringUnion<DialogStyleKeys>;\n\nconst DIALOG_MAX_WIDTH = 328;\n\nconst useStyles: UseStyles<DialogStyles> = function (): DialogStyles {\n const theme = useTheme();\n\n const { width } = useWindowDimensions();\n\n const margin = theme.spacing(4);\n const dialogWidth = width - margin * 2;\n\n return {\n root: {\n alignItems: 'center',\n justifyContent: 'center',\n zIndex: theme.zIndex.dialog,\n },\n paper: {\n borderRadius: theme.shape.roundnessExtra,\n margin,\n maxWidth: DIALOG_MAX_WIDTH,\n overflow: 'hidden',\n width: dialogWidth,\n },\n paperFullScreen: {\n flexGrow: 1,\n },\n animation: {},\n animationFullScreen: {\n width: '100%',\n height: '100%',\n },\n topElementSize: {\n marginHorizontal: margin,\n maxWidth: DIALOG_MAX_WIDTH,\n width: dialogWidth,\n },\n topElementPosition: {\n position: 'absolute',\n bottom: -1 * theme.spacing(4),\n width: '100%',\n },\n };\n};\n\nexport default function Dialog(props: DialogProps) {\n const {\n animationType = ANIMATION_TYPE.SLIDE,\n children,\n fullScreen = false,\n onClose,\n style = {},\n visible,\n topElement,\n ...otherProps\n } = props;\n\n const styles = useStyles();\n\n const { height: screenHeight } = useWindowDimensions();\n\n const closeAnimation = useMemo<AnimationUnit[]>(() => {\n if (animationType === ANIMATION_TYPE.FADE) {\n return [{\n toValue: 0,\n type: ANIMATION_TYPE.FADE,\n }];\n } else if (animationType === ANIMATION_TYPE.SLIDE && !fullScreen) {\n return [\n {\n toValue: screenHeight,\n type: ANIMATION_TYPE.SLIDE,\n },\n {\n duration: 150,\n toValue: 0,\n type: ANIMATION_TYPE.FADE,\n },\n ];\n }\n\n return [{\n duration: 150,\n toValue: screenHeight,\n type: ANIMATION_TYPE.SLIDE,\n }];\n }, [animationType, fullScreen, screenHeight]);\n\n const openAnimation = useMemo<AnimationUnit[]>(() => {\n if (animationType === ANIMATION_TYPE.FADE) {\n return [{\n toValue: 1,\n type: ANIMATION_TYPE.FADE,\n }];\n } else if (animationType === ANIMATION_TYPE.SLIDE && !fullScreen) {\n return [\n {\n toValue: 0,\n type: ANIMATION_TYPE.SLIDE,\n },\n {\n delay: 50,\n duration: 150,\n toValue: 1,\n type: ANIMATION_TYPE.FADE,\n },\n ];\n }\n\n return [{\n toValue: 0,\n type: ANIMATION_TYPE.SLIDE,\n }];\n }, [animationType, fullScreen]);\n\n const initialOpacity = animationType === ANIMATION_TYPE.SLIDE && fullScreen ? 1 : undefined;\n\n const initialTranslateY = animationType === ANIMATION_TYPE.FADE ? 0 : undefined;\n\n return (\n <Modal\n animationStyle={fullScreen ? styles.animationFullScreen : styles.animation}\n closeAnimation={closeAnimation}\n initialOpacity={initialOpacity}\n initialTranslateY={initialTranslateY}\n onClose={onClose}\n openAnimation={openAnimation}\n visible={visible}\n style={styles.root}\n {...otherProps}\n >\n <React.Fragment>\n {topElement ? (\n <Column style={fullScreen ? undefined : styles.topElementSize}>\n <Column style={styles.topElementPosition}>\n {topElement}\n </Column>\n </Column>\n ) : null}\n\n <Paper\n elevation={6}\n square={fullScreen}\n style={css([\n fullScreen ? styles.paperFullScreen : styles.paper,\n style,\n ])}\n >\n {children}\n </Paper>\n </React.Fragment>\n </Modal>\n );\n};\n"],"mappings":"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"}
1
+ {"version":3,"names":["React","useMemo","useState","useWindowDimensions","css","Column","Modal","ANIMATION_TYPE","Paper","useTheme","DIALOG_MAX_WIDTH","TOP_ELEMENT_OFFSET","useStyles","theme","width","margin","spacing","dialogWidth","root","alignItems","justifyContent","zIndex","dialog","paper","borderRadius","shape","roundnessExtra","maxWidth","overflow","paperFullScreen","flexGrow","animation","animationFullScreen","height","topElementSize","marginHorizontal","topElementPosition","position","bottom","Dialog","props","animationType","SLIDE","children","fullScreen","onClose","style","visible","topElement","otherProps","styles","screenHeight","topElementHeight","setTopElementHeight","handleTopElementLayout","event","nativeEvent","layout","offsetAnimation","toValue","type","closeAnimation","FADE","duration","openAnimation","delay","initialOpacity","undefined","initialTranslateY"],"sources":["Dialog.tsx"],"sourcesContent":["import React, { useMemo, useState } from 'react';\nimport { LayoutChangeEvent, useWindowDimensions } from 'react-native';\nimport { css, NamedStylesStringUnion, UseStyles } from '@fountain-ui/styles';\nimport Column from '../Column';\nimport Modal, { ANIMATION_TYPE, AnimationUnit } from '../Modal';\nimport Paper from '../Paper';\nimport { useTheme } from '../styles';\nimport type DialogProps from './DialogProps';\n\ntype DialogStyleKeys =\n | 'root'\n | 'paper'\n | 'paperFullScreen'\n | 'animation'\n | 'animationFullScreen'\n | 'topElementSize'\n | 'topElementPosition';\n\ntype DialogStyles = NamedStylesStringUnion<DialogStyleKeys>;\n\nconst DIALOG_MAX_WIDTH = 328;\n\nconst TOP_ELEMENT_OFFSET = 20;\n\nconst useStyles: UseStyles<DialogStyles> = function (): DialogStyles {\n const theme = useTheme();\n\n const { width } = useWindowDimensions();\n\n const margin = theme.spacing(4);\n const dialogWidth = width - margin * 2;\n\n return {\n root: {\n alignItems: 'center',\n justifyContent: 'center',\n zIndex: theme.zIndex.dialog,\n },\n paper: {\n borderRadius: theme.shape.roundnessExtra,\n margin,\n maxWidth: DIALOG_MAX_WIDTH,\n overflow: 'hidden',\n width: dialogWidth,\n },\n paperFullScreen: {\n flexGrow: 1,\n },\n animation: {},\n animationFullScreen: {\n width: '100%',\n height: '100%',\n },\n topElementSize: {\n marginHorizontal: margin,\n maxWidth: DIALOG_MAX_WIDTH,\n width: dialogWidth,\n },\n topElementPosition: {\n position: 'absolute',\n bottom: -1 * theme.spacing(4),\n width: '100%',\n },\n };\n};\n\nexport default function Dialog(props: DialogProps) {\n const {\n animationType = ANIMATION_TYPE.SLIDE,\n children,\n fullScreen = false,\n onClose,\n style = {},\n visible,\n topElement,\n ...otherProps\n } = props;\n\n const styles = useStyles();\n\n const { height: screenHeight } = useWindowDimensions();\n\n const [topElementHeight, setTopElementHeight] = useState(0);\n const handleTopElementLayout = (event: LayoutChangeEvent) => {\n const { height } = event.nativeEvent.layout;\n setTopElementHeight(height);\n };\n\n const offsetAnimation = useMemo<AnimationUnit[]>(() => {\n if (topElementHeight === 0) {\n return [];\n }\n\n return [{\n toValue: (topElementHeight - TOP_ELEMENT_OFFSET) / 2,\n type: ANIMATION_TYPE.SLIDE,\n }]\n }, [topElementHeight]);\n\n const closeAnimation = useMemo<AnimationUnit[]>(() => {\n if (animationType === ANIMATION_TYPE.FADE) {\n return [{\n toValue: 0,\n type: ANIMATION_TYPE.FADE,\n }];\n } else if (animationType === ANIMATION_TYPE.SLIDE && !fullScreen) {\n return [\n {\n toValue: screenHeight,\n type: ANIMATION_TYPE.SLIDE,\n },\n {\n duration: 150,\n toValue: 0,\n type: ANIMATION_TYPE.FADE,\n },\n ];\n }\n\n return [{\n duration: 150,\n toValue: screenHeight,\n type: ANIMATION_TYPE.SLIDE,\n }];\n }, [animationType, fullScreen, screenHeight]);\n\n const openAnimation = useMemo<AnimationUnit[]>(() => {\n if (animationType === ANIMATION_TYPE.FADE) {\n return [{\n toValue: 1,\n type: ANIMATION_TYPE.FADE,\n }];\n } else if (animationType === ANIMATION_TYPE.SLIDE && !fullScreen) {\n return [\n {\n toValue: 0,\n type: ANIMATION_TYPE.SLIDE,\n },\n {\n delay: 50,\n duration: 150,\n toValue: 1,\n type: ANIMATION_TYPE.FADE,\n },\n ];\n }\n\n return [{\n toValue: 0,\n type: ANIMATION_TYPE.SLIDE,\n }];\n }, [animationType, fullScreen]);\n\n const initialOpacity = animationType === ANIMATION_TYPE.SLIDE && fullScreen ? 1 : undefined;\n\n const initialTranslateY = animationType === ANIMATION_TYPE.FADE ? 0 : undefined;\n\n return (\n <Modal\n animationStyle={fullScreen ? styles.animationFullScreen : styles.animation}\n closeAnimation={closeAnimation}\n initialOpacity={initialOpacity}\n initialTranslateY={initialTranslateY}\n onClose={onClose}\n openAnimation={openAnimation}\n offsetAnimation={offsetAnimation}\n visible={visible}\n style={styles.root}\n {...otherProps}\n >\n <React.Fragment>\n {topElement ? (\n <Column style={fullScreen ? undefined : styles.topElementSize}>\n <Column\n style={styles.topElementPosition}\n onLayout={handleTopElementLayout}\n >\n {topElement}\n </Column>\n </Column>\n ) : null}\n\n <Paper\n elevation={6}\n square={fullScreen}\n style={css([\n fullScreen ? styles.paperFullScreen : styles.paper,\n style,\n ])}\n >\n {children}\n </Paper>\n </React.Fragment>\n </Modal>\n );\n};\n"],"mappings":"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"}
@@ -19,6 +19,7 @@ export default function AnimatedContainer(props) {
19
19
  onExit,
20
20
  onExited,
21
21
  openAnimation,
22
+ offsetAnimation,
22
23
  style,
23
24
  visible
24
25
  } = props;
@@ -117,6 +118,17 @@ export default function AnimatedContainer(props) {
117
118
  }
118
119
  }
119
120
  }, [convertToCompositeAnimation, visible]);
121
+ useEffect(() => {
122
+ if (visible && offsetAnimation && offsetAnimation.length > 0) {
123
+ opacity.setValue(1);
124
+ const convertedAnimation = offsetAnimation.map(animationUnit => {
125
+ return convertToCompositeAnimation({ ...DEFAULT_ANIMATION_CONFIG,
126
+ ...animationUnit
127
+ });
128
+ });
129
+ Animated.parallel(convertedAnimation).start();
130
+ }
131
+ }, [visible, offsetAnimation, convertToCompositeAnimation]);
120
132
  const animatedStyle = {
121
133
  opacity,
122
134
  transform: [{
@@ -1 +1 @@
1
- {"version":3,"names":["React","useCallback","useEffect","Animated","Easing","Platform","useWindowDimensions","R","useAnimatedValue","isNotAndroid12","ANIMATION_TYPE","DEFAULT_ANIMATION_CONFIG","duration","useNativeDriver","AnimatedContainer","props","children","closeAnimation","initialOpacity","initialTranslateY","onEnter","onEntered","onExit","onExited","openAnimation","style","visible","height","screenHeight","opacity","translateY","convertToCompositeAnimation","animationUnit","type","others","FADE","timing","SLIDE","easing","toValue","in","ease","OS","bezier","out","exp","isNil","setValue","start","finished","convertedAnimation","map","parallel","animatedStyle","transform"],"sources":["index.tsx"],"sourcesContent":["import React, { useCallback, useEffect } from 'react';\nimport { Animated, Easing, Platform, useWindowDimensions } from 'react-native';\nimport * as R from 'ramda';\nimport { useAnimatedValue } from '../../hooks';\nimport { isNotAndroid12 } from '../../utils';\nimport type ModalProps from '../ModalProps';\nimport { ANIMATION_TYPE, AnimationUnit } from '../ModalProps';\n\ntype AnimatedContainerProps = Pick<ModalProps,\n | 'children'\n | 'closeAnimation'\n | 'initialOpacity'\n | 'initialTranslateY'\n | 'onEnter'\n | 'onEntered'\n | 'onExit'\n | 'onExited'\n | 'openAnimation'\n | 'style'\n | 'visible'>\n\nconst DEFAULT_ANIMATION_CONFIG = {\n duration: 300,\n useNativeDriver: isNotAndroid12,\n};\n\nexport default function AnimatedContainer(props: AnimatedContainerProps) {\n const {\n children,\n closeAnimation,\n initialOpacity,\n initialTranslateY,\n onEnter,\n onEntered,\n onExit,\n onExited,\n openAnimation,\n style,\n visible,\n } = props;\n\n const { height: screenHeight } = useWindowDimensions();\n\n const opacity = useAnimatedValue(initialOpacity ?? 0);\n\n const translateY = useAnimatedValue(initialTranslateY ?? screenHeight);\n\n const convertToCompositeAnimation = useCallback((animationUnit: AnimationUnit) => {\n const {\n type,\n ...others\n } = animationUnit;\n\n switch (type) {\n case ANIMATION_TYPE.FADE:\n return Animated.timing(opacity, {\n ...others,\n useNativeDriver: isNotAndroid12,\n });\n case ANIMATION_TYPE.SLIDE:\n default:\n const easing = others.toValue === screenHeight\n ? Easing.in(Easing.ease)\n : Platform.OS === 'web'\n ? Easing.bezier(0.16, 1, 0.3, 1)\n : Easing.out(Easing.exp);\n\n return Animated.timing(translateY, {\n ...others,\n easing,\n useNativeDriver: isNotAndroid12,\n });\n }\n }, [screenHeight]);\n\n useEffect(() => {\n if (visible) {\n onEnter?.();\n\n if (R.isNil(openAnimation)) {\n opacity.setValue(1);\n\n Animated.timing(translateY, {\n ...DEFAULT_ANIMATION_CONFIG,\n easing: Platform.OS === 'web'\n ? Easing.bezier(0.16, 1, 0.3, 1)\n : Easing.out(Easing.exp),\n toValue: 0,\n }).start(({ finished }) => {\n if (finished) {\n onEntered?.();\n }\n });\n } else {\n const convertedAnimation = openAnimation.map((animationUnit) => {\n return convertToCompositeAnimation({\n ...DEFAULT_ANIMATION_CONFIG,\n ...animationUnit,\n });\n });\n\n Animated.parallel(convertedAnimation).start(({ finished }) => {\n if (finished) {\n onEntered?.();\n }\n });\n }\n } else {\n onExit?.();\n\n if (R.isNil(closeAnimation)) {\n opacity.setValue(1);\n\n Animated.timing(translateY, {\n ...DEFAULT_ANIMATION_CONFIG,\n easing: Easing.in(Easing.ease),\n toValue: screenHeight,\n }).start(({ finished }) => {\n if (finished) {\n onExited?.();\n }\n });\n } else {\n const convertedAnimation = closeAnimation.map((animationUnit) => {\n return convertToCompositeAnimation({\n ...DEFAULT_ANIMATION_CONFIG,\n ...animationUnit,\n });\n });\n\n Animated.parallel(convertedAnimation).start(({ finished }) => {\n if (finished) {\n onExited?.();\n }\n });\n }\n }\n }, [convertToCompositeAnimation, visible]);\n\n const animatedStyle = {\n opacity,\n transform: [{ translateY }],\n };\n\n return (\n <Animated.View\n needsOffscreenAlphaCompositing={true}\n pointerEvents={'box-none'}\n style={[\n animatedStyle,\n style,\n ]}\n >\n {children}\n </Animated.View>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"names":["React","useCallback","useEffect","Animated","Easing","Platform","useWindowDimensions","R","useAnimatedValue","isNotAndroid12","ANIMATION_TYPE","DEFAULT_ANIMATION_CONFIG","duration","useNativeDriver","AnimatedContainer","props","children","closeAnimation","initialOpacity","initialTranslateY","onEnter","onEntered","onExit","onExited","openAnimation","offsetAnimation","style","visible","height","screenHeight","opacity","translateY","convertToCompositeAnimation","animationUnit","type","others","FADE","timing","SLIDE","easing","toValue","in","ease","OS","bezier","out","exp","isNil","setValue","start","finished","convertedAnimation","map","parallel","length","animatedStyle","transform"],"sources":["index.tsx"],"sourcesContent":["import React, { useCallback, useEffect } from 'react';\nimport { Animated, Easing, Platform, useWindowDimensions } from 'react-native';\nimport * as R from 'ramda';\nimport { useAnimatedValue } from '../../hooks';\nimport { isNotAndroid12 } from '../../utils';\nimport type ModalProps from '../ModalProps';\nimport { ANIMATION_TYPE, AnimationUnit } from '../ModalProps';\n\ntype AnimatedContainerProps = Pick<ModalProps,\n | 'children'\n | 'closeAnimation'\n | 'initialOpacity'\n | 'initialTranslateY'\n | 'onEnter'\n | 'onEntered'\n | 'onExit'\n | 'onExited'\n | 'openAnimation'\n | 'offsetAnimation'\n | 'style'\n | 'visible'>\n\nconst DEFAULT_ANIMATION_CONFIG = {\n duration: 300,\n useNativeDriver: isNotAndroid12,\n};\n\nexport default function AnimatedContainer(props: AnimatedContainerProps) {\n const {\n children,\n closeAnimation,\n initialOpacity,\n initialTranslateY,\n onEnter,\n onEntered,\n onExit,\n onExited,\n openAnimation,\n offsetAnimation,\n style,\n visible,\n } = props;\n\n const { height: screenHeight } = useWindowDimensions();\n\n const opacity = useAnimatedValue(initialOpacity ?? 0);\n\n const translateY = useAnimatedValue(initialTranslateY ?? screenHeight);\n\n const convertToCompositeAnimation = useCallback((animationUnit: AnimationUnit) => {\n const {\n type,\n ...others\n } = animationUnit;\n\n switch (type) {\n case ANIMATION_TYPE.FADE:\n return Animated.timing(opacity, {\n ...others,\n useNativeDriver: isNotAndroid12,\n });\n case ANIMATION_TYPE.SLIDE:\n default:\n const easing = others.toValue === screenHeight\n ? Easing.in(Easing.ease)\n : Platform.OS === 'web'\n ? Easing.bezier(0.16, 1, 0.3, 1)\n : Easing.out(Easing.exp);\n\n return Animated.timing(translateY, {\n ...others,\n easing,\n useNativeDriver: isNotAndroid12,\n });\n }\n }, [screenHeight]);\n\n useEffect(() => {\n if (visible) {\n onEnter?.();\n\n if (R.isNil(openAnimation)) {\n opacity.setValue(1);\n\n Animated.timing(translateY, {\n ...DEFAULT_ANIMATION_CONFIG,\n easing: Platform.OS === 'web'\n ? Easing.bezier(0.16, 1, 0.3, 1)\n : Easing.out(Easing.exp),\n toValue: 0,\n }).start(({ finished }) => {\n if (finished) {\n onEntered?.();\n }\n });\n } else {\n const convertedAnimation = openAnimation.map((animationUnit) => {\n return convertToCompositeAnimation({\n ...DEFAULT_ANIMATION_CONFIG,\n ...animationUnit,\n });\n });\n\n Animated.parallel(convertedAnimation).start(({ finished }) => {\n if (finished) {\n onEntered?.();\n }\n });\n }\n } else {\n onExit?.();\n\n if (R.isNil(closeAnimation)) {\n opacity.setValue(1);\n\n Animated.timing(translateY, {\n ...DEFAULT_ANIMATION_CONFIG,\n easing: Easing.in(Easing.ease),\n toValue: screenHeight,\n }).start(({ finished }) => {\n if (finished) {\n onExited?.();\n }\n });\n } else {\n const convertedAnimation = closeAnimation.map((animationUnit) => {\n return convertToCompositeAnimation({\n ...DEFAULT_ANIMATION_CONFIG,\n ...animationUnit,\n });\n });\n\n Animated.parallel(convertedAnimation).start(({ finished }) => {\n if (finished) {\n onExited?.();\n }\n });\n }\n }\n }, [convertToCompositeAnimation, visible]);\n\n useEffect(() => {\n if (visible && offsetAnimation && offsetAnimation.length > 0) {\n opacity.setValue(1);\n const convertedAnimation = offsetAnimation.map((animationUnit) => {\n return convertToCompositeAnimation({\n ...DEFAULT_ANIMATION_CONFIG,\n ...animationUnit\n });\n });\n Animated.parallel(convertedAnimation).start();\n }\n }, [visible, offsetAnimation, convertToCompositeAnimation]);\n\n const animatedStyle = {\n opacity,\n transform: [{ translateY }],\n };\n\n return (\n <Animated.View\n needsOffscreenAlphaCompositing={true}\n pointerEvents={'box-none'}\n style={[\n animatedStyle,\n style,\n ]}\n >\n {children}\n </Animated.View>\n );\n}\n"],"mappings":"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"}
@@ -27,6 +27,7 @@ export default function Modal(props) {
27
27
  onExit: onExitProp,
28
28
  onExited: onExitedProp,
29
29
  openAnimation,
30
+ offsetAnimation,
30
31
  style,
31
32
  visible,
32
33
  ...otherProps
@@ -80,6 +81,7 @@ export default function Modal(props) {
80
81
  onExit: onExit,
81
82
  onExited: onExited,
82
83
  openAnimation: openAnimation,
84
+ offsetAnimation: offsetAnimation,
83
85
  style: animationStyle,
84
86
  visible: visible
85
87
  }) : children);
@@ -1 +1 @@
1
- {"version":3,"names":["React","View","css","StyleSheet","useElevationStyle","AnimatedContainer","SimpleBackdrop","createModalCloseEvent","reason","metadata","Modal","props","animationStyle","backdropOpacity","children","closeAnimation","disableAnimation","hideBackdrop","initialOpacity","initialTranslateY","onClose","onEnter","onEnterProp","onEntered","onEnteredProp","onExit","onExitProp","onExited","onExitedProp","openAnimation","style","visible","otherProps","handleBackdropPress","exited","setExited","useState","elevationStyle","absoluteFill"],"sources":["Modal.tsx"],"sourcesContent":["import React from 'react';\nimport { View } from 'react-native';\nimport { css, StyleSheet } from '../styles';\nimport { useElevationStyle } from '../hooks';\nimport type ModalProps from './ModalProps';\nimport AnimatedContainer from './AnimatedContainer';\nimport SimpleBackdrop from './SimpleBackdrop';\n\nexport type ModalCloseReasonType = 'OUTSIDE_PRESS' | 'HARDWARE_BACK_PRESS' | 'CLOSE_BUTTON_PRESS' | 'UNKNOWN';\n\nexport interface ModalCloseEvent {\n metadata: {\n reason: ModalCloseReasonType\n };\n}\n\nexport const createModalCloseEvent = (reason: ModalCloseReasonType) => ({\n metadata: {\n reason,\n },\n});\n\nexport default function Modal(props: ModalProps) {\n const {\n animationStyle,\n backdropOpacity = 0.5,\n children,\n closeAnimation,\n disableAnimation = false,\n hideBackdrop = false,\n initialOpacity,\n initialTranslateY,\n onClose,\n onEnter: onEnterProp,\n onEntered: onEnteredProp,\n onExit: onExitProp,\n onExited: onExitedProp,\n openAnimation,\n style,\n visible,\n ...otherProps\n } = props;\n\n const handleBackdropPress = () => {\n if (onClose) {\n onClose(createModalCloseEvent('OUTSIDE_PRESS'));\n }\n };\n\n const [exited, setExited] = React.useState(true);\n\n const elevationStyle = useElevationStyle(6);\n\n const onEnter = () => {\n setExited(false);\n onEnterProp?.();\n };\n\n const onEntered = () => {\n onEnteredProp?.();\n };\n\n const onExit = () => {\n onExitProp?.();\n };\n\n const onExited = () => {\n setExited(true);\n onExitedProp?.();\n };\n\n if (!visible) {\n if (disableAnimation || exited) {\n return null;\n }\n }\n\n return (\n <View\n style={css([\n StyleSheet.absoluteFill,\n elevationStyle,\n style,\n ])}\n {...otherProps}\n >\n {(!hideBackdrop && visible) ? (\n <SimpleBackdrop\n onPress={handleBackdropPress}\n opacity={backdropOpacity}\n />\n ) : null}\n\n {!disableAnimation ? (\n <AnimatedContainer\n children={children}\n closeAnimation={closeAnimation}\n initialOpacity={initialOpacity}\n initialTranslateY={initialTranslateY}\n onEnter={onEnter}\n onEntered={onEntered}\n onExit={onExit}\n onExited={onExited}\n openAnimation={openAnimation}\n style={animationStyle}\n visible={visible}\n />\n ) : children}\n </View>\n );\n};\n"],"mappings":";;AAAA,OAAOA,KAAP,MAAkB,OAAlB;AACA,SAASC,IAAT,QAAqB,cAArB;AACA,SAASC,GAAT,EAAcC,UAAd,QAAgC,WAAhC;AACA,SAASC,iBAAT,QAAkC,UAAlC;AAEA,OAAOC,iBAAP,MAA8B,qBAA9B;AACA,OAAOC,cAAP,MAA2B,kBAA3B;AAUA,OAAO,MAAMC,qBAAqB,GAAIC,MAAD,KAAmC;EACpEC,QAAQ,EAAE;IACND;EADM;AAD0D,CAAnC,CAA9B;AAMP,eAAe,SAASE,KAAT,CAAeC,KAAf,EAAkC;EAC7C,MAAM;IACFC,cADE;IAEFC,eAAe,GAAG,GAFhB;IAGFC,QAHE;IAIFC,cAJE;IAKFC,gBAAgB,GAAG,KALjB;IAMFC,YAAY,GAAG,KANb;IAOFC,cAPE;IAQFC,iBARE;IASFC,OATE;IAUFC,OAAO,EAAEC,WAVP;IAWFC,SAAS,EAAEC,aAXT;IAYFC,MAAM,EAAEC,UAZN;IAaFC,QAAQ,EAAEC,YAbR;IAcFC,aAdE;IAeFC,KAfE;IAgBFC,OAhBE;IAiBF,GAAGC;EAjBD,IAkBFrB,KAlBJ;;EAoBA,MAAMsB,mBAAmB,GAAG,MAAM;IAC9B,IAAIb,OAAJ,EAAa;MACTA,OAAO,CAACb,qBAAqB,CAAC,eAAD,CAAtB,CAAP;IACH;EACJ,CAJD;;EAMA,MAAM,CAAC2B,MAAD,EAASC,SAAT,IAAsBnC,KAAK,CAACoC,QAAN,CAAe,IAAf,CAA5B;EAEA,MAAMC,cAAc,GAAGjC,iBAAiB,CAAC,CAAD,CAAxC;;EAEA,MAAMiB,OAAO,GAAG,MAAM;IAClBc,SAAS,CAAC,KAAD,CAAT;IACAb,WAAW,SAAX,IAAAA,WAAW,WAAX,YAAAA,WAAW;EACd,CAHD;;EAKA,MAAMC,SAAS,GAAG,MAAM;IACpBC,aAAa,SAAb,IAAAA,aAAa,WAAb,YAAAA,aAAa;EAChB,CAFD;;EAIA,MAAMC,MAAM,GAAG,MAAM;IACjBC,UAAU,SAAV,IAAAA,UAAU,WAAV,YAAAA,UAAU;EACb,CAFD;;EAIA,MAAMC,QAAQ,GAAG,MAAM;IACnBQ,SAAS,CAAC,IAAD,CAAT;IACAP,YAAY,SAAZ,IAAAA,YAAY,WAAZ,YAAAA,YAAY;EACf,CAHD;;EAKA,IAAI,CAACG,OAAL,EAAc;IACV,IAAIf,gBAAgB,IAAIkB,MAAxB,EAAgC;MAC5B,OAAO,IAAP;IACH;EACJ;;EAED,oBACI,oBAAC,IAAD;IACI,KAAK,EAAEhC,GAAG,CAAC,CACPC,UAAU,CAACmC,YADJ,EAEPD,cAFO,EAGPP,KAHO,CAAD;EADd,GAMQE,UANR,GAQM,CAACf,YAAD,IAAiBc,OAAlB,gBACG,oBAAC,cAAD;IACI,OAAO,EAAEE,mBADb;IAEI,OAAO,EAAEpB;EAFb,EADH,GAKG,IAbR,EAeK,CAACG,gBAAD,gBACG,oBAAC,iBAAD;IACI,QAAQ,EAAEF,QADd;IAEI,cAAc,EAAEC,cAFpB;IAGI,cAAc,EAAEG,cAHpB;IAII,iBAAiB,EAAEC,iBAJvB;IAKI,OAAO,EAAEE,OALb;IAMI,SAAS,EAAEE,SANf;IAOI,MAAM,EAAEE,MAPZ;IAQI,QAAQ,EAAEE,QARd;IASI,aAAa,EAAEE,aATnB;IAUI,KAAK,EAAEjB,cAVX;IAWI,OAAO,EAAEmB;EAXb,EADH,GAcGjB,QA7BR,CADJ;AAiCH;AAAA"}
1
+ {"version":3,"names":["React","View","css","StyleSheet","useElevationStyle","AnimatedContainer","SimpleBackdrop","createModalCloseEvent","reason","metadata","Modal","props","animationStyle","backdropOpacity","children","closeAnimation","disableAnimation","hideBackdrop","initialOpacity","initialTranslateY","onClose","onEnter","onEnterProp","onEntered","onEnteredProp","onExit","onExitProp","onExited","onExitedProp","openAnimation","offsetAnimation","style","visible","otherProps","handleBackdropPress","exited","setExited","useState","elevationStyle","absoluteFill"],"sources":["Modal.tsx"],"sourcesContent":["import React from 'react';\nimport { View } from 'react-native';\nimport { css, StyleSheet } from '../styles';\nimport { useElevationStyle } from '../hooks';\nimport type ModalProps from './ModalProps';\nimport AnimatedContainer from './AnimatedContainer';\nimport SimpleBackdrop from './SimpleBackdrop';\n\nexport type ModalCloseReasonType = 'OUTSIDE_PRESS' | 'HARDWARE_BACK_PRESS' | 'CLOSE_BUTTON_PRESS' | 'UNKNOWN';\n\nexport interface ModalCloseEvent {\n metadata: {\n reason: ModalCloseReasonType\n };\n}\n\nexport const createModalCloseEvent = (reason: ModalCloseReasonType) => ({\n metadata: {\n reason,\n },\n});\n\nexport default function Modal(props: ModalProps) {\n const {\n animationStyle,\n backdropOpacity = 0.5,\n children,\n closeAnimation,\n disableAnimation = false,\n hideBackdrop = false,\n initialOpacity,\n initialTranslateY,\n onClose,\n onEnter: onEnterProp,\n onEntered: onEnteredProp,\n onExit: onExitProp,\n onExited: onExitedProp,\n openAnimation,\n offsetAnimation,\n style,\n visible,\n ...otherProps\n } = props;\n\n const handleBackdropPress = () => {\n if (onClose) {\n onClose(createModalCloseEvent('OUTSIDE_PRESS'));\n }\n };\n\n const [exited, setExited] = React.useState(true);\n\n const elevationStyle = useElevationStyle(6);\n\n const onEnter = () => {\n setExited(false);\n onEnterProp?.();\n };\n\n const onEntered = () => {\n onEnteredProp?.();\n };\n\n const onExit = () => {\n onExitProp?.();\n };\n\n const onExited = () => {\n setExited(true);\n onExitedProp?.();\n };\n\n if (!visible) {\n if (disableAnimation || exited) {\n return null;\n }\n }\n\n return (\n <View\n style={css([\n StyleSheet.absoluteFill,\n elevationStyle,\n style,\n ])}\n {...otherProps}\n >\n {(!hideBackdrop && visible) ? (\n <SimpleBackdrop\n onPress={handleBackdropPress}\n opacity={backdropOpacity}\n />\n ) : null}\n\n {!disableAnimation ? (\n <AnimatedContainer\n children={children}\n closeAnimation={closeAnimation}\n initialOpacity={initialOpacity}\n initialTranslateY={initialTranslateY}\n onEnter={onEnter}\n onEntered={onEntered}\n onExit={onExit}\n onExited={onExited}\n openAnimation={openAnimation}\n offsetAnimation={offsetAnimation}\n style={animationStyle}\n visible={visible}\n />\n ) : children}\n </View>\n );\n};\n"],"mappings":";;AAAA,OAAOA,KAAP,MAAkB,OAAlB;AACA,SAASC,IAAT,QAAqB,cAArB;AACA,SAASC,GAAT,EAAcC,UAAd,QAAgC,WAAhC;AACA,SAASC,iBAAT,QAAkC,UAAlC;AAEA,OAAOC,iBAAP,MAA8B,qBAA9B;AACA,OAAOC,cAAP,MAA2B,kBAA3B;AAUA,OAAO,MAAMC,qBAAqB,GAAIC,MAAD,KAAmC;EACpEC,QAAQ,EAAE;IACND;EADM;AAD0D,CAAnC,CAA9B;AAMP,eAAe,SAASE,KAAT,CAAeC,KAAf,EAAkC;EAC7C,MAAM;IACFC,cADE;IAEFC,eAAe,GAAG,GAFhB;IAGFC,QAHE;IAIFC,cAJE;IAKFC,gBAAgB,GAAG,KALjB;IAMFC,YAAY,GAAG,KANb;IAOFC,cAPE;IAQFC,iBARE;IASFC,OATE;IAUFC,OAAO,EAAEC,WAVP;IAWFC,SAAS,EAAEC,aAXT;IAYFC,MAAM,EAAEC,UAZN;IAaFC,QAAQ,EAAEC,YAbR;IAcFC,aAdE;IAeFC,eAfE;IAgBFC,KAhBE;IAiBFC,OAjBE;IAkBF,GAAGC;EAlBD,IAmBFtB,KAnBJ;;EAqBA,MAAMuB,mBAAmB,GAAG,MAAM;IAC9B,IAAId,OAAJ,EAAa;MACTA,OAAO,CAACb,qBAAqB,CAAC,eAAD,CAAtB,CAAP;IACH;EACJ,CAJD;;EAMA,MAAM,CAAC4B,MAAD,EAASC,SAAT,IAAsBpC,KAAK,CAACqC,QAAN,CAAe,IAAf,CAA5B;EAEA,MAAMC,cAAc,GAAGlC,iBAAiB,CAAC,CAAD,CAAxC;;EAEA,MAAMiB,OAAO,GAAG,MAAM;IAClBe,SAAS,CAAC,KAAD,CAAT;IACAd,WAAW,SAAX,IAAAA,WAAW,WAAX,YAAAA,WAAW;EACd,CAHD;;EAKA,MAAMC,SAAS,GAAG,MAAM;IACpBC,aAAa,SAAb,IAAAA,aAAa,WAAb,YAAAA,aAAa;EAChB,CAFD;;EAIA,MAAMC,MAAM,GAAG,MAAM;IACjBC,UAAU,SAAV,IAAAA,UAAU,WAAV,YAAAA,UAAU;EACb,CAFD;;EAIA,MAAMC,QAAQ,GAAG,MAAM;IACnBS,SAAS,CAAC,IAAD,CAAT;IACAR,YAAY,SAAZ,IAAAA,YAAY,WAAZ,YAAAA,YAAY;EACf,CAHD;;EAKA,IAAI,CAACI,OAAL,EAAc;IACV,IAAIhB,gBAAgB,IAAImB,MAAxB,EAAgC;MAC5B,OAAO,IAAP;IACH;EACJ;;EAED,oBACI,oBAAC,IAAD;IACI,KAAK,EAAEjC,GAAG,CAAC,CACPC,UAAU,CAACoC,YADJ,EAEPD,cAFO,EAGPP,KAHO,CAAD;EADd,GAMQE,UANR,GAQM,CAAChB,YAAD,IAAiBe,OAAlB,gBACG,oBAAC,cAAD;IACI,OAAO,EAAEE,mBADb;IAEI,OAAO,EAAErB;EAFb,EADH,GAKG,IAbR,EAeK,CAACG,gBAAD,gBACG,oBAAC,iBAAD;IACI,QAAQ,EAAEF,QADd;IAEI,cAAc,EAAEC,cAFpB;IAGI,cAAc,EAAEG,cAHpB;IAII,iBAAiB,EAAEC,iBAJvB;IAKI,OAAO,EAAEE,OALb;IAMI,SAAS,EAAEE,SANf;IAOI,MAAM,EAAEE,MAPZ;IAQI,QAAQ,EAAEE,QARd;IASI,aAAa,EAAEE,aATnB;IAUI,eAAe,EAAEC,eAVrB;IAWI,KAAK,EAAElB,cAXX;IAYI,OAAO,EAAEoB;EAZb,EADH,GAeGlB,QA9BR,CADJ;AAkCH;AAAA"}
@@ -1 +1 @@
1
- {"version":3,"names":["ANIMATION_TYPE"],"sources":["ModalProps.ts"],"sourcesContent":["import React from 'react';\nimport type { ViewProps } from 'react-native';\nimport { Animated } from 'react-native';\nimport type { ComponentProps, OverridableComponentProps } from '../types';\nimport { ModalCloseEvent } from './Modal';\n\nexport const enum ANIMATION_TYPE {\n SLIDE = 'slide',\n FADE = 'fade',\n}\n\nexport type AnimationUnit = Omit<Animated.TimingAnimationConfig, 'useNativeDriver'> & {\n /**\n * Type of animation used when the dialog opens and closes.\n */\n type: ANIMATION_TYPE;\n}\n\nexport default interface ModalProps extends OverridableComponentProps<ViewProps, {\n /**\n * Style object provided to animation component.\n */\n animationStyle?: ComponentProps['style'];\n\n /**\n * Opacity for backdrop.\n * @default 0.5\n */\n backdropOpacity?: number;\n\n /**\n * A single child content element.\n */\n children: React.ReactElement;\n\n /**\n * If `true`, the animation is disabled.\n * @default false\n */\n disableAnimation?: boolean;\n\n /**\n * Animation used when the modal closes.\n */\n closeAnimation?: AnimationUnit[] | undefined;\n\n /**\n * If `true`, the backdrop is not rendered.\n * @default false\n */\n hideBackdrop?: boolean;\n\n /**\n * Set the initial value of opacity for animating.\n */\n initialOpacity?: number | undefined;\n\n /**\n * Set the initial value of transition y for animating.\n */\n initialTranslateY?: number | undefined;\n\n /**\n * Callback fired when the component requests to be closed.\n */\n onClose?: (event?: ModalCloseEvent) => void;\n\n /**\n * Callback fired when the enter animation will start.\n */\n onEnter?: () => void | undefined;\n\n /**\n * Callback fired when the enter animation is completed.\n */\n onEntered?: () => void | undefined;\n\n /**\n * Callback fired when the exit animation will start.\n */\n onExit?: () => void | undefined;\n\n /**\n * Callback fired when the exit animation is completed.\n */\n onExited?: () => void | undefined;\n\n /**\n * Animation used when the modal opens.\n */\n openAnimation?: AnimationUnit[] | undefined;\n\n /**\n * If `true`, the modal is visible.\n */\n visible: boolean;\n}> {}\n"],"mappings":"AAMA,WAAkBA,cAAlB;;WAAkBA,c;EAAAA,c;EAAAA,c;GAAAA,c,KAAAA,c"}
1
+ {"version":3,"names":["ANIMATION_TYPE"],"sources":["ModalProps.ts"],"sourcesContent":["import React from 'react';\nimport type { ViewProps } from 'react-native';\nimport { Animated } from 'react-native';\nimport type { ComponentProps, OverridableComponentProps } from '../types';\nimport { ModalCloseEvent } from './Modal';\n\nexport const enum ANIMATION_TYPE {\n SLIDE = 'slide',\n FADE = 'fade',\n}\n\nexport type AnimationUnit = Omit<Animated.TimingAnimationConfig, 'useNativeDriver'> & {\n /**\n * Type of animation used when the dialog opens and closes.\n */\n type: ANIMATION_TYPE;\n}\n\nexport default interface ModalProps extends OverridableComponentProps<ViewProps, {\n /**\n * Style object provided to animation component.\n */\n animationStyle?: ComponentProps['style'];\n\n /**\n * Opacity for backdrop.\n * @default 0.5\n */\n backdropOpacity?: number;\n\n /**\n * A single child content element.\n */\n children: React.ReactElement;\n\n /**\n * If `true`, the animation is disabled.\n * @default false\n */\n disableAnimation?: boolean;\n\n /**\n * Animation used when the modal closes.\n */\n closeAnimation?: AnimationUnit[] | undefined;\n\n /**\n * If `true`, the backdrop is not rendered.\n * @default false\n */\n hideBackdrop?: boolean;\n\n /**\n * Set the initial value of opacity for animating.\n */\n initialOpacity?: number | undefined;\n\n /**\n * Set the initial value of transition y for animating.\n */\n initialTranslateY?: number | undefined;\n\n /**\n * Callback fired when the component requests to be closed.\n */\n onClose?: (event?: ModalCloseEvent) => void;\n\n /**\n * Callback fired when the enter animation will start.\n */\n onEnter?: () => void | undefined;\n\n /**\n * Callback fired when the enter animation is completed.\n */\n onEntered?: () => void | undefined;\n\n /**\n * Callback fired when the exit animation will start.\n */\n onExit?: () => void | undefined;\n\n /**\n * Callback fired when the exit animation is completed.\n */\n onExited?: () => void | undefined;\n\n /**\n * Animation used when the modal opens.\n */\n openAnimation?: AnimationUnit[] | undefined;\n\n /**\n * Additional offset animation applied when the modal opens.\n */\n offsetAnimation?: AnimationUnit[] | undefined;\n\n /**\n * If `true`, the modal is visible.\n */\n visible: boolean;\n}> {}\n"],"mappings":"AAMA,WAAkBA,cAAlB;;WAAkBA,c;EAAAA,c;EAAAA,c;GAAAA,c,KAAAA,c"}
@@ -1,5 +1,5 @@
1
1
  /// <reference types="react" />
2
2
  import type ModalProps from '../ModalProps';
3
- declare type AnimatedContainerProps = Pick<ModalProps, 'children' | 'closeAnimation' | 'initialOpacity' | 'initialTranslateY' | 'onEnter' | 'onEntered' | 'onExit' | 'onExited' | 'openAnimation' | 'style' | 'visible'>;
3
+ declare type AnimatedContainerProps = Pick<ModalProps, 'children' | 'closeAnimation' | 'initialOpacity' | 'initialTranslateY' | 'onEnter' | 'onEntered' | 'onExit' | 'onExited' | 'openAnimation' | 'offsetAnimation' | 'style' | 'visible'>;
4
4
  export default function AnimatedContainer(props: AnimatedContainerProps): JSX.Element;
5
5
  export {};
@@ -73,6 +73,10 @@ export default interface ModalProps extends OverridableComponentProps<ViewProps,
73
73
  * Animation used when the modal opens.
74
74
  */
75
75
  openAnimation?: AnimationUnit[] | undefined;
76
+ /**
77
+ * Additional offset animation applied when the modal opens.
78
+ */
79
+ offsetAnimation?: AnimationUnit[] | undefined;
76
80
  /**
77
81
  * If `true`, the modal is visible.
78
82
  */
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fountain-ui/core",
3
- "version": "2.0.0-beta.87",
3
+ "version": "2.0.0-beta.88",
4
4
  "author": "Fountain-UI Team",
5
5
  "description": "React components that implement Tappytoon's Fountain Design.",
6
6
  "license": "MIT",
@@ -67,5 +67,5 @@
67
67
  "publishConfig": {
68
68
  "access": "public"
69
69
  },
70
- "gitHead": "dfa417385224924740cfd4438d32a3fbff88cb9c"
70
+ "gitHead": "1e4ddae2ed33082685a31df6cc1ecf2b2ae12273"
71
71
  }
@@ -1,5 +1,5 @@
1
- import React, { useMemo } from 'react';
2
- import { useWindowDimensions } from 'react-native';
1
+ import React, { useMemo, useState } from 'react';
2
+ import { LayoutChangeEvent, useWindowDimensions } from 'react-native';
3
3
  import { css, NamedStylesStringUnion, UseStyles } from '@fountain-ui/styles';
4
4
  import Column from '../Column';
5
5
  import Modal, { ANIMATION_TYPE, AnimationUnit } from '../Modal';
@@ -20,6 +20,8 @@ type DialogStyles = NamedStylesStringUnion<DialogStyleKeys>;
20
20
 
21
21
  const DIALOG_MAX_WIDTH = 328;
22
22
 
23
+ const TOP_ELEMENT_OFFSET = 20;
24
+
23
25
  const useStyles: UseStyles<DialogStyles> = function (): DialogStyles {
24
26
  const theme = useTheme();
25
27
 
@@ -78,6 +80,23 @@ export default function Dialog(props: DialogProps) {
78
80
 
79
81
  const { height: screenHeight } = useWindowDimensions();
80
82
 
83
+ const [topElementHeight, setTopElementHeight] = useState(0);
84
+ const handleTopElementLayout = (event: LayoutChangeEvent) => {
85
+ const { height } = event.nativeEvent.layout;
86
+ setTopElementHeight(height);
87
+ };
88
+
89
+ const offsetAnimation = useMemo<AnimationUnit[]>(() => {
90
+ if (topElementHeight === 0) {
91
+ return [];
92
+ }
93
+
94
+ return [{
95
+ toValue: (topElementHeight - TOP_ELEMENT_OFFSET) / 2,
96
+ type: ANIMATION_TYPE.SLIDE,
97
+ }]
98
+ }, [topElementHeight]);
99
+
81
100
  const closeAnimation = useMemo<AnimationUnit[]>(() => {
82
101
  if (animationType === ANIMATION_TYPE.FADE) {
83
102
  return [{
@@ -144,6 +163,7 @@ export default function Dialog(props: DialogProps) {
144
163
  initialTranslateY={initialTranslateY}
145
164
  onClose={onClose}
146
165
  openAnimation={openAnimation}
166
+ offsetAnimation={offsetAnimation}
147
167
  visible={visible}
148
168
  style={styles.root}
149
169
  {...otherProps}
@@ -151,7 +171,10 @@ export default function Dialog(props: DialogProps) {
151
171
  <React.Fragment>
152
172
  {topElement ? (
153
173
  <Column style={fullScreen ? undefined : styles.topElementSize}>
154
- <Column style={styles.topElementPosition}>
174
+ <Column
175
+ style={styles.topElementPosition}
176
+ onLayout={handleTopElementLayout}
177
+ >
155
178
  {topElement}
156
179
  </Column>
157
180
  </Column>
@@ -16,6 +16,7 @@ type AnimatedContainerProps = Pick<ModalProps,
16
16
  | 'onExit'
17
17
  | 'onExited'
18
18
  | 'openAnimation'
19
+ | 'offsetAnimation'
19
20
  | 'style'
20
21
  | 'visible'>
21
22
 
@@ -35,6 +36,7 @@ export default function AnimatedContainer(props: AnimatedContainerProps) {
35
36
  onExit,
36
37
  onExited,
37
38
  openAnimation,
39
+ offsetAnimation,
38
40
  style,
39
41
  visible,
40
42
  } = props;
@@ -137,6 +139,19 @@ export default function AnimatedContainer(props: AnimatedContainerProps) {
137
139
  }
138
140
  }, [convertToCompositeAnimation, visible]);
139
141
 
142
+ useEffect(() => {
143
+ if (visible && offsetAnimation && offsetAnimation.length > 0) {
144
+ opacity.setValue(1);
145
+ const convertedAnimation = offsetAnimation.map((animationUnit) => {
146
+ return convertToCompositeAnimation({
147
+ ...DEFAULT_ANIMATION_CONFIG,
148
+ ...animationUnit
149
+ });
150
+ });
151
+ Animated.parallel(convertedAnimation).start();
152
+ }
153
+ }, [visible, offsetAnimation, convertToCompositeAnimation]);
154
+
140
155
  const animatedStyle = {
141
156
  opacity,
142
157
  transform: [{ translateY }],
@@ -36,6 +36,7 @@ export default function Modal(props: ModalProps) {
36
36
  onExit: onExitProp,
37
37
  onExited: onExitedProp,
38
38
  openAnimation,
39
+ offsetAnimation,
39
40
  style,
40
41
  visible,
41
42
  ...otherProps
@@ -102,6 +103,7 @@ export default function Modal(props: ModalProps) {
102
103
  onExit={onExit}
103
104
  onExited={onExited}
104
105
  openAnimation={openAnimation}
106
+ offsetAnimation={offsetAnimation}
105
107
  style={animationStyle}
106
108
  visible={visible}
107
109
  />
@@ -90,6 +90,11 @@ export default interface ModalProps extends OverridableComponentProps<ViewProps,
90
90
  */
91
91
  openAnimation?: AnimationUnit[] | undefined;
92
92
 
93
+ /**
94
+ * Additional offset animation applied when the modal opens.
95
+ */
96
+ offsetAnimation?: AnimationUnit[] | undefined;
97
+
93
98
  /**
94
99
  * If `true`, the modal is visible.
95
100
  */