Eunary UI, a modern component library built with React, Tailwind CSS, and Motion, providing accessible and animated components
Build your
website with
Eunary

modern

Beautiful, accessible, and highly customizable React components that help you build modern interfaces with extraordinary speed.

Ready-to-use Components

Simply copy the code into your ui folder and start importing components right away — no extra setup

Copy & Paste
or
CLI Command
Component Preview
EUNARY UI

Copy the component

Select and copy the component code.

Drop into your UI folder

Paste it into your components directory.

Start using immediately

Import and use in your projects.

OR USE CLI

Even simpler with CLI

Install components directly from your terminal with a single command

Terminal
$npx ui-components add testimonial-card
✓ Component installed successfully

One-Click Copy

Copy any component with a single click and paste it directly into your project.

Zero Setup

No complex installation or configuration. Just drop and go.

Ready to Use

Every component is production-ready with proper styling and functionality.

UI Components

Discover a collection of beautifully crafted, interactive UI components built with React, Framer Motion, and modern design principles.

Scrolling MacBook

Interactive 3D MacBook with scroll-triggered animations and hover effects.

Flip Words

Animated text that cycles through words with smooth transitions in a sentence.

Make your product

Amazing

File Upload

Drag & drop file upload with animations.

iOS Notifications

Stack of notifications with iOS-style animations.

Click to expand

Notifications

Fully Customizable Components

Tailor every component to match your brand’s style with ease—change colors, sizes, and behavior without touching the core functionality.

Customize Your Component

Expandable card component main context image

Nike Air 3

$249

Jordan Air Jordan 1 High OG "Shadow 2.0" Sneakers - Grey

floating-elements-card.tsx
'use client';

import { cn } from '@/lib/utils';
import { motion } from 'motion/react';

const SPRING_CONFIG = {
    type: 'spring' as const,
    stiffness: 500,
    damping: 25,
};

const ICON_SPRING_CONFIG = {
    type: 'spring' as const,
    stiffness: 500,
    damping: 30,
};

const cardParentVariant = {
    initial: {},
    animate: {
        transition: {
            staggerChildren: 0.01,
        },
    },
};

// Generate card variants dynamically
const createCardVariant = (yOffset: number, scale = 1) => ({
    initial: { y: 0, scale: scale === 1 ? undefined : 0.9 },
    animate: {
        y: yOffset,
        scale,
        transition: SPRING_CONFIG,
    },
});

const cardVariants = [
    createCardVariant(210),
    createCardVariant(190, 1),
    createCardVariant(170, 1),
];

const iconParentVariant = {
    initial: { y: 0 },
    animate: {
        transition: {
            staggerChildren: 0.1,
        },
    },
};

const createIconVariant = (x: number, y: number, rotate: number) => ({
    initial: {
        y: 0,
        x: 0,
        opacity: 0,
        filter: 'blur(8px)',
        scale: 0.5,
    },
    animate: {
        y,
        x,
        opacity: 1,
        filter: 'blur(0px)',
        scale: 1,
        rotate,
        transition: ICON_SPRING_CONFIG,
    },
});

// Card configuration
const cardConfigs = [
    { width: 'w-[27rem]', zIndex: 'z-20', hasContent: true },
    { width: 'w-[25rem]', zIndex: 'z-10', hasContent: false },
    { width: 'w-[23rem]', zIndex: 'z-0', hasContent: false },
];

type iconLink = {
    icon: React.ReactNode;
    link: string;
};

interface Props {
    children: React.ReactNode;
    icons: iconLink[];
}

export const FloatingElementsCard = ({ children, icons = [] }: Props) => {
    const iconConfigs = [
        {
            variant: createIconVariant(-180, -120, -30),
            ...icons[0],
            key: '0',
        },
        {
            variant: createIconVariant(-65, -160, -15),
            ...icons[1],
            key: '1',
        },
        {
            variant: createIconVariant(65, -160, 15),
            ...icons[2],
            key: '2',
        },
        {
            variant: createIconVariant(180, -120, 30),
            ...icons[3],
            key: '3',
        },
    ].filter(Boolean);

    return (
        <motion.div
            initial="initial"
            whileHover="animate"
            className="group relative flex h-[30rem] w-[32rem] flex-col items-center justify-center gap-4 overflow-hidden px-20"
        >
            <motion.div
                variants={cardParentVariant}
                className="relative flex items-center justify-center"
            >
                {cardConfigs.map((config, index) => (
                    <motion.div
                        key={`card-${index}`}
                        variants={cardVariants[index]}
                        className={cn(
                            'absolute h-[25rem] rounded-3xl border border-neutral-300/50 bg-gradient-to-br from-neutral-50 to-neutral-100 shadow-[0_0_10px_2px_rgba(83,83,83,0.15)] backdrop-blur-xl group-hover:shadow-[0_-5px_10px_2px_rgba(83,83,83,0.15)] dark:border-neutral-700/50 dark:from-neutral-800/90 dark:to-neutral-900/90',
                            config.width,
                            config.zIndex,
                            config.hasContent ? 'p-4' : ''
                        )}
                    >
                        {config.hasContent && children}
                    </motion.div>
                ))}
            </motion.div>

            <motion.div
                className="relative inset-0 flex items-center justify-center gap-6"
                variants={iconParentVariant}
            >
                {iconConfigs.map(({ icon, link, variant, key }) => (
                    <motion.div
                        key={key}
                        className="absolute"
                        variants={variant}
                    >
                        <a
                            href={link || 'https://ui.eunary.com'}
                            target="_blank"
                            className={cn(
                                'flex h-22 w-22 items-center justify-center rounded-full border border-slate-200 bg-gradient-to-br from-white to-slate-100 shadow-lg shadow-neutral-900/50 backdrop-blur-sm dark:border-neutral-600/50 dark:from-neutral-700 dark:to-neutral-800 dark:shadow-neutral-600/50',
                                'origin-center transition-all duration-200 ease-out hover:scale-110'
                            )}
                        >
                            {icon}
                        </a>
                    </motion.div>
                ))}
            </motion.div>
            <div className="absolute bottom-0 z-50 hidden h-24 w-full bg-gradient-to-t from-white to-transparent group-hover:block dark:from-black"></div>
        </motion.div>
    );
};

Why developers love Eunary UI

Built for modern web development with performance, accessibility, and developer experience at its core.

Lightning Fast

Optimized animations that run at 60fps with minimal performance impact on your applications.

Fully Customizable

Every component is built with customization in mind. Change colors, timing, and behavior easily.

Developer Friendly

Pre build components with intuitive usage, strong TypeScript support, and easy integration.

Accessibility First

Built with accessibility in mind, supporting screen readers and respecting user preferences.

Mobile Optimized

Touch-friendly interactions and responsive animations that work perfectly on all devices.

Dark Mode Ready

Built-in dark mode support with seamless theme transitions and proper contrast ratios.

Powered by industry-leading tools

Next.js
React
TailwindCSS
Framer Motion
Eunary UI, a modern component library built with React, Tailwind CSS, and Motion, providing accessible and animated components

Eunary

UI

Product by Eunary

Building in public by Hemant Sharma