aboutsummaryrefslogtreecommitdiffstats
path: root/packages/instant/src/components/animations/position_animation.tsx
diff options
context:
space:
mode:
authorfragosti <francesco.agosti93@gmail.com>2018-10-31 06:21:58 +0800
committerfragosti <francesco.agosti93@gmail.com>2018-10-31 06:21:58 +0800
commita49bf353f85c22a029db3085a620f3c031b52d73 (patch)
tree305a18cbdb2b2c5eca2d73598a8024ec6b87dfc7 /packages/instant/src/components/animations/position_animation.tsx
parentd0a0af51306bf5e5b46fd8982c70b271212af42f (diff)
downloaddexon-sol-tools-a49bf353f85c22a029db3085a620f3c031b52d73.tar
dexon-sol-tools-a49bf353f85c22a029db3085a620f3c031b52d73.tar.gz
dexon-sol-tools-a49bf353f85c22a029db3085a620f3c031b52d73.tar.bz2
dexon-sol-tools-a49bf353f85c22a029db3085a620f3c031b52d73.tar.lz
dexon-sol-tools-a49bf353f85c22a029db3085a620f3c031b52d73.tar.xz
dexon-sol-tools-a49bf353f85c22a029db3085a620f3c031b52d73.tar.zst
dexon-sol-tools-a49bf353f85c22a029db3085a620f3c031b52d73.zip
feat: refactor animation code
Diffstat (limited to 'packages/instant/src/components/animations/position_animation.tsx')
-rw-r--r--packages/instant/src/components/animations/position_animation.tsx70
1 files changed, 70 insertions, 0 deletions
diff --git a/packages/instant/src/components/animations/position_animation.tsx b/packages/instant/src/components/animations/position_animation.tsx
new file mode 100644
index 000000000..de38ee30a
--- /dev/null
+++ b/packages/instant/src/components/animations/position_animation.tsx
@@ -0,0 +1,70 @@
+import * as React from 'react';
+import { Keyframes } from 'styled-components';
+
+import { css, keyframes, styled } from '../../style/theme';
+
+const generateTransitionInfoCss = (
+ key: keyof TransitionInfo,
+ top?: TransitionInfo,
+ bottom?: TransitionInfo,
+ left?: TransitionInfo,
+ right?: TransitionInfo,
+): string => {
+ const topStringIfExists = top ? `top: ${top[key]};` : '';
+ const bottomStringIfExists = bottom ? `bottom: ${bottom[key]};` : '';
+ const leftStringIfExists = left ? `left: ${left[key]};` : '';
+ const rightStringIfExists = right ? `right: ${right[key]};` : '';
+ return `
+ ${topStringIfExists}
+ ${bottomStringIfExists}
+ ${leftStringIfExists}
+ ${rightStringIfExists}
+ `;
+};
+
+const slideKeyframeGenerator = (
+ top?: TransitionInfo,
+ bottom?: TransitionInfo,
+ left?: TransitionInfo,
+ right?: TransitionInfo,
+) => keyframes`
+ from {
+ position: relative;
+ ${generateTransitionInfoCss('from', top, bottom, left, right)}
+ }
+
+ to {
+ position: relative;
+ ${generateTransitionInfoCss('to', top, bottom, left, right)}
+ }
+`;
+
+export interface TransitionInfo {
+ from: string;
+ to: string;
+}
+
+export interface PositionAnimationProps {
+ top?: TransitionInfo;
+ bottom?: TransitionInfo;
+ left?: TransitionInfo;
+ right?: TransitionInfo;
+ timingFunction: string;
+ direction?: string;
+}
+
+export const PositionAnimation =
+ styled.div <
+ PositionAnimationProps >
+ `
+ animation-name: ${props =>
+ css`
+ ${slideKeyframeGenerator(props.top, props.bottom, props.left, props.right)};
+ `};
+ animation-duration: 0.3s;
+ animation-timing-function: ${props => props.timingFunction};
+ animation-delay: 0s;
+ animation-iteration-count: 1;
+ animation-fill-mode: ${props => props.direction || 'none'};
+ position: relative;
+`;