@razorpay/blade-mcp
Version:
Model Context Protocol server for Blade
329 lines (286 loc) • 9.46 kB
Markdown
AnimateInteractions
AnimateInteractions is a component that allows you to animate child components based on interactions with the parent element. It acts similar to the CSS pattern `.parent:hover .child {}`, enabling effects like revealing elements, adding movement, or scaling components when a user interacts with a container.
The following types represent the props that the AnimateInteractions component accepts. These types allow you to properly configure the component according to your needs.
```typescript
// Type for motion triggers used in entry/exit animations
type MotionTriggerEntryExitType = 'mount' | 'in-view' | 'focus' | 'on-animate-interactions';
// Full motion triggers type including interactive triggers
type MotionTriggersType = MotionTriggerEntryExitType | 'hover' | 'tap';
type AnimateInteractionsProps = {
/**
* The child element to be wrapped by AnimateInteractions.
* Child components using 'on-animate-interactions' in their motionTriggers
* will animate when the parent AnimateInteractions is triggered.
*/
children: React.ReactElement;
/**
* Determines what interactions will trigger the animations of children.
*
* Possible values:
* - 'hover': Animations trigger when the parent is hovered
* - 'focus': Animations trigger when the parent receives focus
* - 'tap': Animations trigger when the parent is tapped/clicked
* - 'mount': Animations trigger when the component mounts
* - 'in-view': Animations trigger when the component enters the viewport
*
* @default ['hover']
*/
motionTriggers?: MotionTriggersType[];
};
```
This example shows a card that reveals action buttons when hovered.
```tsx
import React from 'react';
import {
AnimateInteractions,
Move,
Card,
CardBody,
Box,
Heading,
Text,
Button,
ExternalLinkIcon,
} from '@razorpay/blade/components';
const AnimatedCardExample = () => {
return (
<AnimateInteractions motionTriggers={['hover']}>
<Card width="400px" padding="spacing.0" backgroundColor="surface.background.gray.moderate">
<CardBody>
<Box overflow="auto">
<Box padding="spacing.6">
<Heading as="h2" weight="regular">
Payment Pages
</Heading>
<Heading marginY="spacing.4" size="large" as="h3">
Accept payments{' '}
<Heading size="large" as="span" color="surface.text.primary.normal">
without coding on a custom branded store
</Heading>
</Heading>
<Text>Hover over this card to see the buttons animate in from below</Text>
</Box>
<Move motionTriggers={['on-animate-interactions']}>
<Box
display="flex"
gap="spacing.4"
justifyContent="flex-end"
padding="spacing.4"
elevation="highRaised"
>
<Button variant="secondary" icon={ExternalLinkIcon} iconPosition="right">
Know More
</Button>
<Button>Sign Up</Button>
</Box>
</Move>
</Box>
</CardBody>
</Card>
</AnimateInteractions>
);
};
export default AnimatedCardExample;
```
This example demonstrates an image that reveals an overlay with a button when hovered.
```tsx
import React from 'react';
import {
AnimateInteractions,
Fade,
Box,
Button,
ExternalLinkIcon,
} from '@razorpay/blade/components';
const AnimatedImageOverlayExample = () => {
return (
<AnimateInteractions motionTriggers={['hover']}>
<Box
position="relative"
width="300px"
height="300px"
borderRadius="medium"
elevation="midRaised"
overflow="hidden"
>
<img
src="https://example.com/your-image.jpg"
width="100%"
height="300px"
alt="Image description"
/>
<Fade motionTriggers={['on-animate-interactions']}>
<Box
display="flex"
position="absolute"
top="spacing.0"
left="spacing.0"
width="100%"
height="100%"
alignItems="center"
justifyContent="center"
backgroundColor="overlay.background.subtle"
>
<Button
icon={ExternalLinkIcon}
iconPosition="right"
target="_blank"
href="https://example.com"
>
View Details
</Button>
</Box>
</Fade>
</Box>
</AnimateInteractions>
);
};
export default AnimatedImageOverlayExample;
```
This example shows a card that responds to both hover and focus interactions, using scale animation.
```tsx
import React from 'react';
import {
AnimateInteractions,
Scale,
Card,
CardBody,
Box,
Heading,
Text,
} from '@razorpay/blade/components';
const MultiTriggerAnimationExample = () => {
return (
<AnimateInteractions motionTriggers={['hover', 'focus']}>
<Card
width="400px"
padding="spacing.5"
backgroundColor="surface.background.gray.moderate"
onClick={() => console.log('Card clicked')}
>
<CardBody>
<Box overflow="auto">
<Box padding="spacing.6">
<Heading as="h2" size="large">
Interactive Card
</Heading>
<Box display="flex" gap="spacing.4" marginTop="spacing.4">
<Box flex="2">
<Text>
This card responds to both hover and keyboard focus. Try hovering over it or
pressing Tab to focus on it.
</Text>
</Box>
<Box>
<Scale motionTriggers={['on-animate-interactions']}>
<img
src="https://example.com/your-image.jpg"
width="140px"
height="140px"
alt="Feature image"
/>
</Scale>
</Box>
</Box>
</Box>
</Box>
</CardBody>
</Card>
</AnimateInteractions>
);
};
export default MultiTriggerAnimationExample;
```
This example shows content that is revealed when the user clicks/taps on a card.
```tsx
import React from 'react';
import {
AnimateInteractions,
Fade,
Card,
CardBody,
Box,
Heading,
Text,
Button,
} from '@razorpay/blade/components';
const TapRevealExample = () => {
return (
<AnimateInteractions motionTriggers={['tap']}>
<Card width="400px" padding="spacing.7" backgroundColor="surface.background.gray.moderate">
<CardBody>
<Heading as="h2" size="large" marginBottom="spacing.4">
Click me to reveal more
</Heading>
<Text>This card reveals additional information when clicked/tapped.</Text>
<Fade motionTriggers={['on-animate-interactions']}>
<Box
marginTop="spacing.6"
padding="spacing.4"
backgroundColor="surface.background.gray.subtle"
>
<Text weight="semibold">Additional Information</Text>
<Text marginTop="spacing.2">
This content is revealed when the user interacts with the card by clicking or
tapping. The 'tap' trigger works well for mobile experiences.
</Text>
<Button marginTop="spacing.4">Take Action</Button>
</Box>
</Fade>
</CardBody>
</Card>
</AnimateInteractions>
);
};
export default TapRevealExample;
```
This example shows content that animates when it scrolls into the viewport.
```tsx
import React from 'react';
import { AnimateInteractions, Move, Box, Heading, Text } from '@razorpay/blade/components';
const ScrollInViewExample = () => {
return (
<AnimateInteractions motionTriggers={['in-view']}>
<Box
padding="spacing.6"
backgroundColor="surface.background.gray.moderate"
borderRadius="medium"
width="100%"
maxWidth="600px"
>
<Heading as="h2" size="large">
Scroll-triggered Animation
</Heading>
<Text marginTop="spacing.4">
This content animates when it scrolls into the viewport. Useful for creating engaging
scroll experiences on landing pages and long-form content.
</Text>
<Move motionTriggers={['on-animate-interactions']}>
<Box
marginTop="spacing.6"
padding="spacing.4"
backgroundColor="surface.background.primary.subtle"
borderRadius="medium"
>
<Text weight="semibold">I animate when scrolled into view!</Text>
<Text marginTop="spacing.2">
The 'in-view' trigger is perfect for creating scroll-based animations that engage
users as they move down the page.
</Text>
</Box>
</Move>
</Box>
</AnimateInteractions>
);
};
export default ScrollInViewExample;
```