├── src
├── vite-env.d.ts
├── icon.png
├── reactwind.png
├── types
│ ├── three-jsx.d.ts
│ └── index.ts
├── lib
│ └── utils.ts
├── assets
│ └── animations
│ │ ├── feature.json
│ │ ├── analytics.json
│ │ └── web-dev.json
├── components
│ ├── ui
│ │ ├── icons.tsx
│ │ ├── button.tsx
│ │ ├── badge.tsx
│ │ ├── button-variants.ts
│ │ ├── background-gradient.tsx
│ │ ├── sidebar.tsx
│ │ └── animated-beam.tsx
│ ├── FullWidth.tsx
│ ├── Header
│ │ ├── Logo.tsx
│ │ ├── index.tsx
│ │ ├── MobileMenu.tsx
│ │ └── Navigation.tsx
│ ├── Footer
│ │ ├── index.tsx
│ │ ├── SocialLinks.tsx
│ │ ├── FooterLinks.tsx
│ │ ├── FooterSimple.tsx
│ │ ├── FooterMinimal.tsx
│ │ ├── FooterApp.tsx
│ │ └── FooterNewsletter.tsx
│ ├── ThemeToggle.tsx
│ ├── MarqueeSlider.tsx
│ ├── Marquee
│ │ └── MarqueeContainer.tsx
│ ├── sections
│ │ ├── SocialLinks.tsx
│ │ ├── MarqueeExamples.tsx
│ │ ├── MarqueeText.tsx
│ │ ├── SparklesText.tsx
│ │ ├── DemoSection.tsx
│ │ ├── FooterMinimal.tsx
│ │ ├── HeroImages.tsx
│ │ ├── Ecommerce1.tsx
│ │ ├── FeatureSection.tsx
│ │ ├── CardHoverEffect.tsx
│ │ ├── GradientBlob.tsx
│ │ ├── FooterApp2.tsx
│ │ ├── HeroVideo.tsx
│ │ ├── FooterNewsletter.tsx
│ │ ├── ThreeDCard.tsx
│ │ ├── AnimatedBeamSection.tsx
│ │ ├── SaasHero.tsx
│ │ ├── PricingTables.tsx
│ │ ├── MarqueeImages2.tsx
│ │ ├── EcommerceSlider.tsx
│ │ ├── LogoTicker.tsx
│ │ ├── ParticleField.tsx
│ │ ├── MarqueeLogo.tsx
│ │ ├── WavyBackground.tsx
│ │ ├── GridGallery.tsx
│ │ ├── GalleryExamples.tsx
│ │ ├── Ecommerce2.tsx
│ │ ├── HeaderExamples.tsx
│ │ ├── Pricing2.tsx
│ │ └── HeroSection.tsx
│ ├── MarqueeSlider2.tsx
│ ├── ScrollToTop.tsx
│ ├── ErrorBoundary.tsx
│ ├── ComponentSections.tsx
│ ├── Hero
│ │ ├── LottieAnimation.tsx
│ │ └── index.tsx
│ ├── CodeBlock.tsx
│ ├── ComponentSection.tsx
│ ├── CursorEffect.tsx
│ └── ComponentSidebar.tsx
├── main.tsx
├── hooks
│ └── useTheme.ts
├── pages
│ └── Error404
│ │ ├── ErrorContent.tsx
│ │ ├── index.tsx
│ │ ├── ErrorActionButton.tsx
│ │ ├── ErrorActions.tsx
│ │ └── ErrorAnimation.tsx
├── context
│ ├── ThemeContext.tsx
│ └── ComponentThemeContext.tsx
├── styles
│ └── darkMode.css
├── App.tsx
└── index.css
├── reactwind.png
├── public
├── Demo1.gif
├── Demo2.gif
└── Herowithvideo.png
├── vercel.json
├── postcss.config.js
├── .gitignore
├── vite.config.ts
├── components.json
├── tsconfig.node.json
├── tsconfig.app.json
├── tsconfig.json
├── eslint.config.js
├── index.html
├── package.json
├── README.md
└── tailwind.config.js
/src/vite-env.d.ts:
--------------------------------------------------------------------------------
1 | ///
2 |
--------------------------------------------------------------------------------
/src/icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/GaneshVarma1/ReactWind/HEAD/src/icon.png
--------------------------------------------------------------------------------
/reactwind.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/GaneshVarma1/ReactWind/HEAD/reactwind.png
--------------------------------------------------------------------------------
/public/Demo1.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/GaneshVarma1/ReactWind/HEAD/public/Demo1.gif
--------------------------------------------------------------------------------
/public/Demo2.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/GaneshVarma1/ReactWind/HEAD/public/Demo2.gif
--------------------------------------------------------------------------------
/src/reactwind.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/GaneshVarma1/ReactWind/HEAD/src/reactwind.png
--------------------------------------------------------------------------------
/vercel.json:
--------------------------------------------------------------------------------
1 | {
2 | "rewrites": [{ "source": "/(.*)", "destination": "/index.html" }]
3 | }
4 |
--------------------------------------------------------------------------------
/public/Herowithvideo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/GaneshVarma1/ReactWind/HEAD/public/Herowithvideo.png
--------------------------------------------------------------------------------
/postcss.config.js:
--------------------------------------------------------------------------------
1 | export default {
2 | plugins: {
3 | 'postcss-import': {},
4 | 'tailwindcss/nesting': {},
5 | tailwindcss: {},
6 | autoprefixer: {},
7 | },
8 | };
9 |
--------------------------------------------------------------------------------
/src/types/three-jsx.d.ts:
--------------------------------------------------------------------------------
1 | import { ThreeElements } from '@react-three/fiber'
2 |
3 | declare global {
4 | namespace JSX {
5 | interface IntrinsicElements extends ThreeElements {}
6 | }
7 | }
--------------------------------------------------------------------------------
/src/lib/utils.ts:
--------------------------------------------------------------------------------
1 | import { type ClassValue, clsx } from "clsx"
2 | import { twMerge } from "tailwind-merge"
3 |
4 | export function cn(...inputs: ClassValue[]) {
5 | return twMerge(clsx(inputs))
6 | }
7 |
--------------------------------------------------------------------------------
/src/assets/animations/feature.json:
--------------------------------------------------------------------------------
1 | {"v":"5.7.1","fr":29.9700012207031,"ip":0,"op":180.00000733155,"w":800,"h":600,"nm":"Feature Animation","ddd":0,"assets":[{"id":"comp_0","layers":[]}],"layers":[],"markers":[]}
--------------------------------------------------------------------------------
/src/components/ui/icons.tsx:
--------------------------------------------------------------------------------
1 | export const Icons = {
2 | notion: () => (
3 | // ... Notion SVG code
4 | ),
5 | openai: () => (
6 | // ... OpenAI SVG code
7 | ),
8 | // ... rest of the icons
9 | };
--------------------------------------------------------------------------------
/src/assets/animations/analytics.json:
--------------------------------------------------------------------------------
1 | {"v":"5.7.1","fr":29.9700012207031,"ip":0,"op":180.00000733155,"w":800,"h":600,"nm":"Analytics Animation","ddd":0,"assets":[{"id":"comp_0","layers":[]}],"layers":[],"markers":[]}
--------------------------------------------------------------------------------
/src/main.tsx:
--------------------------------------------------------------------------------
1 | import { StrictMode } from 'react';
2 | import { createRoot } from 'react-dom/client';
3 | import App from './App.tsx';
4 | import './index.css';
5 |
6 | createRoot(document.getElementById('root')!).render(
7 |
8 |
9 |
10 | );
11 |
--------------------------------------------------------------------------------
/src/types/index.ts:
--------------------------------------------------------------------------------
1 | export interface NavItem {
2 | title: string;
3 | href: string;
4 | }
5 |
6 | export interface FooterLink {
7 | title: string;
8 | items: {
9 | title: string;
10 | href: string;
11 | }[];
12 | }
13 |
14 | export interface SocialLink {
15 | platform: string;
16 | href: string;
17 | icon: React.ComponentType;
18 | }
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # Logs
2 | logs
3 | *.log
4 | npm-debug.log*
5 | yarn-debug.log*
6 | yarn-error.log*
7 | pnpm-debug.log*
8 | lerna-debug.log*
9 |
10 | node_modules
11 | dist
12 | dist-ssr
13 | *.local
14 |
15 | # Editor directories and files
16 | .vscode/*
17 | !.vscode/extensions.json
18 | .idea
19 | .DS_Store
20 | *.suo
21 | *.ntvs*
22 | *.njsproj
23 | *.sln
24 | *.sw?
25 | .vercel
26 |
--------------------------------------------------------------------------------
/vite.config.ts:
--------------------------------------------------------------------------------
1 | import { defineConfig } from "vite";
2 | import react from "@vitejs/plugin-react";
3 | import path from "path";
4 |
5 | // https://vitejs.dev/config/
6 | export default defineConfig({
7 | plugins: [react()],
8 | optimizeDeps: {
9 | exclude: ["lucide-react"],
10 | },
11 | css: {
12 | postcss: './postcss.config.js',
13 | },
14 | resolve: {
15 | alias: {
16 | "@": path.resolve(__dirname, "./src"),
17 | },
18 | },
19 | });
20 |
--------------------------------------------------------------------------------
/src/components/FullWidth.tsx:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import styled from 'styled-components';
3 |
4 | const FullWidthWrapper = styled.div`
5 | width: 100vw;
6 | position: relative;
7 | left: 50%;
8 | right: 50%;
9 | margin-left: -50vw;
10 | margin-right: -50vw;
11 | padding: 0 20px;
12 | `;
13 |
14 | const FullWidth: React.FC<{ children: React.ReactNode }> = ({ children }) => {
15 | return {children} ;
16 | };
17 |
18 | export default FullWidth;
--------------------------------------------------------------------------------
/src/hooks/useTheme.ts:
--------------------------------------------------------------------------------
1 | import { useState, useEffect } from 'react';
2 |
3 | export const useTheme = () => {
4 | const [theme] = useState<'dark'>('dark');
5 |
6 | useEffect(() => {
7 | const root = window.document.documentElement;
8 | root.classList.remove('light');
9 | root.classList.add('dark');
10 | localStorage.setItem('theme', 'dark');
11 | }, []);
12 |
13 | // Keep toggleTheme function but make it do nothing
14 | const toggleTheme = () => {};
15 |
16 | return { theme, toggleTheme };
17 | };
--------------------------------------------------------------------------------
/components.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "https://ui.shadcn.com/schema.json",
3 | "style": "new-york",
4 | "rsc": false,
5 | "tsx": true,
6 | "tailwind": {
7 | "config": "tailwind.config.js",
8 | "css": "src/index.css",
9 | "baseColor": "zinc",
10 | "cssVariables": true,
11 | "prefix": ""
12 | },
13 | "aliases": {
14 | "components": "@/components",
15 | "utils": "@/lib/utils",
16 | "ui": "@/components/ui",
17 | "lib": "@/lib",
18 | "hooks": "@/hooks"
19 | },
20 | "iconLibrary": "lucide"
21 | }
--------------------------------------------------------------------------------
/src/components/Header/Logo.tsx:
--------------------------------------------------------------------------------
1 | import { Link } from "react-router-dom";
2 |
3 | export const Logo = () => {
4 | return (
5 | (window.location.href = "/")}
9 | >
10 |
11 | ReactWind
12 |
13 |
14 | );
15 | };
16 |
--------------------------------------------------------------------------------
/src/components/Footer/index.tsx:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import { FooterMinimal } from './FooterMinimal';
3 | import { FooterApp } from './FooterApp';
4 | import { FooterNewsletter } from './FooterNewsletter';
5 |
6 | export const Footer = () => {
7 | const isComponentsPage = window.location.pathname === '/components';
8 |
9 | if (isComponentsPage) {
10 | return (
11 |
12 |
13 |
14 |
15 |
16 | );
17 | }
18 |
19 | return ;
20 | };
--------------------------------------------------------------------------------
/tsconfig.node.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | "composite": true,
4 | "skipLibCheck": true,
5 | "module": "ESNext",
6 | "moduleResolution": "bundler",
7 | "allowSyntheticDefaultImports": true,
8 |
9 | /* Bundler mode */
10 | "allowImportingTsExtensions": true,
11 | "isolatedModules": true,
12 | "moduleDetection": "force",
13 | "noEmit": false,
14 | "outDir": "dist",
15 |
16 | /* Linting */
17 | "strict": true,
18 | "noUnusedLocals": true,
19 | "noUnusedParameters": true,
20 | "noFallthroughCasesInSwitch": true
21 | },
22 | "include": ["vite.config.ts"]
23 | }
24 |
--------------------------------------------------------------------------------
/src/components/Header/index.tsx:
--------------------------------------------------------------------------------
1 | import { Logo } from './Logo';
2 | import { Navigation } from './Navigation';
3 | import { MobileMenu } from './MobileMenu';
4 |
5 | export const Header = () => {
6 | return (
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 | );
19 | };
--------------------------------------------------------------------------------
/src/components/ThemeToggle.tsx:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import { Moon, Sun } from 'lucide-react';
3 | import { useTheme } from '../hooks/useTheme';
4 |
5 | export const ThemeToggle = () => {
6 | const { theme, toggleTheme } = useTheme();
7 |
8 | return (
9 |
14 | {theme === 'dark' ? (
15 |
16 | ) : (
17 |
18 | )}
19 |
20 | );
21 | };
--------------------------------------------------------------------------------
/src/components/MarqueeSlider.tsx:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 |
3 | interface MarqueeSliderProps {
4 | items: React.ReactNode[];
5 | reverse?: boolean;
6 | }
7 |
8 | export const MarqueeSlider = ({ items, reverse = false }: MarqueeSliderProps) => {
9 | const content = [...items, ...items]; // Duplicate items for seamless loop
10 |
11 | return (
12 |
13 |
14 | {content.map((item, index) => (
15 |
16 | {item}
17 |
18 | ))}
19 |
20 |
21 | );
22 | };
--------------------------------------------------------------------------------
/tsconfig.app.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | "target": "ES2020",
4 | "useDefineForClassFields": true,
5 | "lib": ["ES2020", "DOM", "DOM.Iterable"],
6 | "module": "ESNext",
7 | "skipLibCheck": true,
8 | "baseUrl": ".",
9 | "paths": {
10 | "@/*": ["./src/*"]
11 | },
12 |
13 | /* Bundler mode */
14 | "moduleResolution": "bundler",
15 | "allowImportingTsExtensions": true,
16 | "isolatedModules": true,
17 | "moduleDetection": "force",
18 | "noEmit": true,
19 | "jsx": "react-jsx",
20 |
21 | /* Linting */
22 | "strict": true,
23 | "noUnusedLocals": true,
24 | "noUnusedParameters": true,
25 | "noFallthroughCasesInSwitch": true
26 | },
27 | "include": ["src"]
28 | }
29 |
--------------------------------------------------------------------------------
/src/pages/Error404/ErrorContent.tsx:
--------------------------------------------------------------------------------
1 | import { motion } from 'framer-motion';
2 |
3 | export const ErrorContent = () => {
4 | return (
5 |
11 |
12 | 404
13 |
14 |
15 | Page Not Found
16 |
17 |
18 | Oops! The page you're looking for seems to have wandered off into the digital wilderness. 🌲
19 |
20 |
21 | );
22 | };
--------------------------------------------------------------------------------
/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | "target": "ES2020",
4 | "useDefineForClassFields": true,
5 | "lib": ["ES2020", "DOM", "DOM.Iterable"],
6 | "module": "ESNext",
7 | "skipLibCheck": true,
8 | "baseUrl": ".",
9 | "paths": {
10 | "@/*": ["src/*"]
11 | },
12 |
13 | /* Bundler mode */
14 | "moduleResolution": "bundler",
15 | "allowImportingTsExtensions": true,
16 | "resolveJsonModule": true,
17 | "isolatedModules": true,
18 | "noEmit": true,
19 | "jsx": "react-jsx",
20 |
21 | /* Linting */
22 | "strict": true,
23 | "noUnusedLocals": true,
24 | "noUnusedParameters": true,
25 | "noFallthroughCasesInSwitch": true
26 | },
27 | "include": ["src"],
28 | "references": [{ "path": "./tsconfig.node.json" }]
29 | }
30 |
--------------------------------------------------------------------------------
/src/pages/Error404/index.tsx:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import { ErrorContent } from './ErrorContent';
3 | import { ErrorActions } from './ErrorActions';
4 | import { ErrorAnimation } from './ErrorAnimation';
5 |
6 | export const Error404 = () => {
7 | return (
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 | );
20 | };
--------------------------------------------------------------------------------
/eslint.config.js:
--------------------------------------------------------------------------------
1 | import js from '@eslint/js';
2 | import globals from 'globals';
3 | import reactHooks from 'eslint-plugin-react-hooks';
4 | import reactRefresh from 'eslint-plugin-react-refresh';
5 | import tseslint from 'typescript-eslint';
6 |
7 | export default tseslint.config(
8 | { ignores: ['dist'] },
9 | {
10 | extends: [js.configs.recommended, ...tseslint.configs.recommended],
11 | files: ['**/*.{ts,tsx}'],
12 | languageOptions: {
13 | ecmaVersion: 2020,
14 | globals: globals.browser,
15 | },
16 | plugins: {
17 | 'react-hooks': reactHooks,
18 | 'react-refresh': reactRefresh,
19 | },
20 | rules: {
21 | ...reactHooks.configs.recommended.rules,
22 | 'react-refresh/only-export-components': [
23 | 'warn',
24 | { allowConstantExport: true },
25 | ],
26 | },
27 | }
28 | );
29 |
--------------------------------------------------------------------------------
/src/components/ui/button.tsx:
--------------------------------------------------------------------------------
1 | import * as React from "react";
2 | import { Slot } from "@radix-ui/react-slot";
3 | import { type VariantProps } from "class-variance-authority";
4 | import { cn } from "../../lib/utils";
5 | import { buttonVariants } from "./button-variants";
6 |
7 | export interface ButtonProps
8 | extends React.ButtonHTMLAttributes,
9 | VariantProps {
10 | asChild?: boolean;
11 | }
12 |
13 | const Button = React.forwardRef(
14 | ({ className, variant, size, asChild = false, ...props }, ref) => {
15 | const Comp = asChild ? Slot : "button";
16 | return (
17 |
22 | );
23 | }
24 | );
25 | Button.displayName = "Button";
26 |
27 | export { Button };
28 |
--------------------------------------------------------------------------------
/src/components/Marquee/MarqueeContainer.tsx:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import { motion } from 'framer-motion';
3 |
4 | interface MarqueeContainerProps {
5 | children: React.ReactNode;
6 | direction?: 'left' | 'right';
7 | duration?: number;
8 | className?: string;
9 | }
10 |
11 | export const MarqueeContainer = ({
12 | children,
13 | direction = 'left',
14 | duration = 25,
15 | className = '',
16 | }: MarqueeContainerProps) => {
17 | return (
18 |
19 |
33 | {children}
34 |
35 |
36 | );
37 | };
--------------------------------------------------------------------------------
/src/pages/Error404/ErrorActionButton.tsx:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import { motion } from 'framer-motion';
3 |
4 | interface ErrorActionButtonProps {
5 | icon: React.ReactNode;
6 | label: string;
7 | onClick: () => void;
8 | primary?: boolean;
9 | }
10 |
11 | export const ErrorActionButton = ({ icon, label, onClick, primary }: ErrorActionButtonProps) => {
12 | return (
13 |
25 | {icon}
26 | {label}
27 |
28 | );
29 | };
--------------------------------------------------------------------------------
/src/pages/Error404/ErrorActions.tsx:
--------------------------------------------------------------------------------
1 | import { motion } from 'framer-motion';
2 | import { useNavigate } from 'react-router-dom';
3 | import { Home, HelpCircle } from 'lucide-react';
4 | import { ErrorActionButton } from './ErrorActionButton';
5 |
6 | export const ErrorActions = () => {
7 | const navigate = useNavigate();
8 |
9 | const actions = [
10 | {
11 | icon: ,
12 | label: 'Go Home',
13 | onClick: () => navigate('/'),
14 | primary: true
15 | },
16 | {
17 | icon: ,
18 | label: 'Help',
19 | onClick: () => navigate('/docs'),
20 | }
21 | ];
22 |
23 | return (
24 |
30 | {actions.map((action) => (
31 |
32 | ))}
33 |
34 | );
35 | };
--------------------------------------------------------------------------------
/src/components/sections/SocialLinks.tsx:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import { Github, Twitter, Linkedin } from 'lucide-react';
3 | import { motion } from 'framer-motion';
4 |
5 | export const SocialLinks = () => {
6 | const socialLinks = [
7 | { icon: Github, href: 'https://github.com/buildeasy', label: 'GitHub' },
8 | { icon: Twitter, href: 'https://twitter.com/buildeasy', label: 'Twitter' },
9 | { icon: Linkedin, href: 'https://linkedin.com/company/buildeasy', label: 'LinkedIn' },
10 | ];
11 |
12 | return (
13 |
14 | {socialLinks.map(({ icon: Icon, href, label }) => (
15 |
24 |
25 |
26 | ))}
27 |
28 | );
29 | };
--------------------------------------------------------------------------------
/src/components/MarqueeSlider2.tsx:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import { motion } from 'framer-motion';
3 |
4 | interface MarqueeSlider2Props {
5 | items: React.ReactNode[];
6 | direction?: 'left' | 'right';
7 | speed?: number;
8 | }
9 |
10 | export const MarqueeSlider2: React.FC = ({
11 | items,
12 | direction = 'left',
13 | speed = 25,
14 | }) => {
15 | const marqueeVariants = {
16 | animate: {
17 | x: direction === 'left' ? [0, -1035],
18 | transition: {
19 | x: {
20 | repeat: Infinity,
21 | repeatType: "loop",
22 | duration: 50/speed,
23 | ease: "linear",
24 | },
25 | },
26 | },
27 | };
28 |
29 | return (
30 |
31 |
36 | {[...items, ...items].map((item, index) => (
37 |
38 | {item}
39 |
40 | ))}
41 |
42 |
43 | );
44 | };
--------------------------------------------------------------------------------
/src/components/ScrollToTop.tsx:
--------------------------------------------------------------------------------
1 | import { useState, useEffect } from "react";
2 | import { ArrowUp } from "lucide-react";
3 |
4 | export const ScrollToTop = () => {
5 | const [isVisible, setIsVisible] = useState(false);
6 |
7 | useEffect(() => {
8 | const toggleVisibility = () => {
9 | if (window.pageYOffset > 300) {
10 | setIsVisible(true);
11 | } else {
12 | setIsVisible(false);
13 | }
14 | };
15 |
16 | window.addEventListener("scroll", toggleVisibility);
17 | return () => window.removeEventListener("scroll", toggleVisibility);
18 | }, []);
19 |
20 | const scrollToTop = () => {
21 | window.scrollTo({
22 | top: 0,
23 | behavior: "smooth",
24 | });
25 | };
26 |
27 | return (
28 | <>
29 | {isVisible && (
30 |
35 |
36 |
37 | )}
38 | >
39 | );
40 | };
41 |
--------------------------------------------------------------------------------
/src/components/Footer/SocialLinks.tsx:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import { Github, Twitter, Linkedin } from 'lucide-react';
3 | import { SocialLink } from '../../types';
4 |
5 | const socialLinks: SocialLink[] = [
6 | {
7 | platform: 'GitHub',
8 | href: 'https://github.com/buildeasy/components',
9 | icon: Github,
10 | },
11 | {
12 | platform: 'Twitter',
13 | href: 'https://twitter.com/buildeasy',
14 | icon: Twitter,
15 | },
16 | {
17 | platform: 'LinkedIn',
18 | href: 'https://linkedin.com/company/buildeasy',
19 | icon: Linkedin,
20 | },
21 | ];
22 |
23 | export const SocialLinks = () => {
24 | return (
25 |
26 |
27 | {socialLinks.map(({ platform, href, icon: Icon }) => (
28 |
36 |
37 |
38 | ))}
39 |
40 | );
41 | };
42 |
--------------------------------------------------------------------------------
/src/pages/Error404/ErrorAnimation.tsx:
--------------------------------------------------------------------------------
1 | import { motion } from 'framer-motion';
2 | import Lottie from 'lottie-react';
3 | // Import Lottie JSON
4 | import lottieAnimation from '../../assets/lwlERW6itQ.json';
5 | export const ErrorAnimation = () => {
6 | return (
7 |
13 |
14 |
15 |
16 |
17 |
28 |
29 |
30 |
31 | );
32 | };
--------------------------------------------------------------------------------
/src/components/ui/badge.tsx:
--------------------------------------------------------------------------------
1 | import * as React from "react";
2 | import { cva, type VariantProps } from "class-variance-authority";
3 |
4 | import { cn } from "../../lib/utils";
5 |
6 | const badgeVariants = cva(
7 | "inline-flex items-center rounded-full border px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2",
8 | {
9 | variants: {
10 | variant: {
11 | default:
12 | "border-transparent bg-primary text-primary-foreground hover:bg-primary/80",
13 | secondary:
14 | "border-transparent bg-secondary text-secondary-foreground hover:bg-secondary/80",
15 | destructive:
16 | "border-transparent bg-destructive text-destructive-foreground hover:bg-destructive/80",
17 | outline: "text-foreground",
18 | },
19 | },
20 | defaultVariants: {
21 | variant: "default",
22 | },
23 | }
24 | );
25 |
26 | export interface BadgeProps
27 | extends React.HTMLAttributes,
28 | VariantProps {}
29 |
30 | function Badge({ className, variant, ...props }: BadgeProps) {
31 | return (
32 |
33 | );
34 | }
35 |
36 | export { Badge };
37 |
--------------------------------------------------------------------------------
/src/components/sections/MarqueeExamples.tsx:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import { MarqueeImages2 } from './MarqueeImages2';
3 | import { MarqueeText } from './MarqueeText';
4 | import { MarqueeLogo } from './MarqueeLogo';
5 |
6 | export const MarqueeExamples = () => {
7 | return (
8 |
9 |
10 |
11 | Marquee Examples ✨
12 |
13 |
14 | {/* Text Marquee */}
15 |
16 |
17 | Text Marquee 📝
18 |
19 |
20 |
21 |
22 | {/* Logo Marquee */}
23 |
24 |
25 | Logo Marquee 🎯
26 |
27 |
28 |
29 |
30 | {/* Image Marquee */}
31 |
32 |
33 | Image Marquee 🖼️
34 |
35 |
36 |
37 |
38 |
39 | );
40 | };
--------------------------------------------------------------------------------
/src/components/sections/MarqueeText.tsx:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import { motion } from 'framer-motion';
3 |
4 | const texts = [
5 | "Beautiful React Components ✨",
6 | "Production Ready 🚀",
7 | "Fully Customizable 🎨",
8 | "Dark Mode Support 🌙",
9 | "Responsive Design 📱",
10 | "Modern & Clean UI 💅",
11 | ];
12 |
13 | export const MarqueeText = () => {
14 | return (
15 |
18 |
19 |
33 | {[...texts, ...texts].map((text, index) => (
34 |
38 | {text}
39 |
40 | ))}
41 |
42 |
43 |
44 | );
45 | }
--------------------------------------------------------------------------------
/src/context/ThemeContext.tsx:
--------------------------------------------------------------------------------
1 | import React, { createContext, useContext, useEffect, useState } from 'react';
2 |
3 | interface ThemeContextType {
4 | theme: 'light' | 'dark';
5 | toggleTheme: () => void;
6 | }
7 |
8 | const ThemeContext = createContext(undefined);
9 |
10 | export const ThemeProvider: React.FC<{ children: React.ReactNode }> = ({ children }) => {
11 | const [theme, setTheme] = useState<'light' | 'dark'>('light');
12 |
13 | useEffect(() => {
14 | const savedTheme = localStorage.getItem('theme') as 'light' | 'dark';
15 | if (savedTheme) {
16 | setTheme(savedTheme);
17 | document.documentElement.classList.toggle('dark', savedTheme === 'dark');
18 | } else if (window.matchMedia('(prefers-color-scheme: dark)').matches) {
19 | setTheme('dark');
20 | document.documentElement.classList.add('dark');
21 | }
22 | }, []);
23 |
24 | const toggleTheme = () => {
25 | const newTheme = theme === 'light' ? 'dark' : 'light';
26 | setTheme(newTheme);
27 | localStorage.setItem('theme', newTheme);
28 | document.documentElement.classList.toggle('dark');
29 | };
30 |
31 | return (
32 |
33 | {children}
34 |
35 | );
36 | };
37 |
38 | export const useComponentTheme = () => {
39 | const context = useContext(ThemeContext);
40 | if (context === undefined) {
41 | throw new Error('useComponentTheme must be used within a ThemeProvider');
42 | }
43 | return context;
44 | };
--------------------------------------------------------------------------------
/src/context/ComponentThemeContext.tsx:
--------------------------------------------------------------------------------
1 | import { createContext, useContext, useState, ReactNode, useEffect } from 'react';
2 |
3 | type Theme = 'dark' | 'light';
4 |
5 | interface ComponentThemeContextType {
6 | theme: Theme;
7 | toggleTheme: () => void;
8 | }
9 |
10 | const ComponentThemeContext = createContext(undefined);
11 |
12 | export function ComponentThemeProvider({ children }: { children: ReactNode }) {
13 | const [theme, setTheme] = useState('dark');
14 |
15 | const toggleTheme = () => {
16 | setTheme(prev => {
17 | const newTheme = prev === 'dark' ? 'light' : 'dark';
18 | // Add or remove 'dark' class from HTML element
19 | if (newTheme === 'dark') {
20 | document.documentElement.classList.add('dark');
21 | } else {
22 | document.documentElement.classList.remove('dark');
23 | }
24 | return newTheme;
25 | });
26 | };
27 |
28 | // Set initial dark mode class
29 | useEffect(() => {
30 | if (theme === 'dark') {
31 | document.documentElement.classList.add('dark');
32 | }
33 | }, []);
34 |
35 | return (
36 |
37 | {children}
38 |
39 | );
40 | }
41 |
42 | export const useComponentTheme = () => {
43 | const context = useContext(ComponentThemeContext);
44 | if (context === undefined) {
45 | throw new Error('useComponentTheme must be used within a ComponentThemeProvider');
46 | }
47 | return context;
48 | };
--------------------------------------------------------------------------------
/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 | ReactWind - By Sri
9 |
13 |
14 |
15 |
16 |
20 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
34 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
--------------------------------------------------------------------------------
/src/components/ErrorBoundary.tsx:
--------------------------------------------------------------------------------
1 | import React, { Component, ErrorInfo, ReactNode } from 'react';
2 |
3 | interface Props {
4 | children: ReactNode;
5 | }
6 |
7 | interface State {
8 | hasError: boolean;
9 | error?: Error;
10 | }
11 |
12 | export class ErrorBoundary extends Component {
13 | public state: State = {
14 | hasError: false
15 | };
16 |
17 | public static getDerivedStateFromError(error: Error): State {
18 | return { hasError: true, error };
19 | }
20 |
21 | public componentDidCatch(error: Error, errorInfo: ErrorInfo) {
22 | console.error('Uncaught error:', error, errorInfo);
23 | }
24 |
25 | public render() {
26 | if (this.state.hasError) {
27 | return (
28 |
29 |
30 |
31 | Oops! Something went wrong
32 |
33 |
34 | {this.state.error?.message || 'An unexpected error occurred'}
35 |
36 |
window.location.reload()}
38 | className="px-4 py-2 bg-blue-500 text-white rounded hover:bg-blue-600 transition-colors"
39 | >
40 | Refresh Page
41 |
42 |
43 |
44 | );
45 | }
46 |
47 | return this.props.children;
48 | }
49 | }
--------------------------------------------------------------------------------
/src/components/ComponentSections.tsx:
--------------------------------------------------------------------------------
1 | import React, { useState } from "react";
2 | import { Code2 } from "lucide-react";
3 | import { motion, AnimatePresence } from "framer-motion";
4 | import { CodeBlock } from "./CodeBlock";
5 |
6 | interface ComponentSectionProps {
7 | title: string;
8 | children: React.ReactNode;
9 | code: string;
10 | }
11 |
12 | export const ComponentSection = ({
13 | title,
14 | children,
15 | code,
16 | }: ComponentSectionProps) => {
17 | const [showCode, setShowCode] = useState(false);
18 |
19 | return (
20 |
21 |
22 |
23 | {title}
24 |
25 | setShowCode(!showCode)}
27 | className="flex items-center gap-2 px-4 py-2 bg-gray-100 dark:bg-gray-800 rounded-lg hover:bg-gray-200 dark:hover:bg-gray-700 transition-colors"
28 | >
29 |
30 | {showCode ? "Hide Code" : "View Code"}
31 |
32 |
33 |
34 |
35 | {showCode ? (
36 |
42 |
43 |
44 | ) : null}
45 |
46 |
47 | {children}
48 |
49 | );
50 | };
51 |
--------------------------------------------------------------------------------
/src/styles/darkMode.css:
--------------------------------------------------------------------------------
1 | @layer utilities {
2 | .dark {
3 | color-scheme: dark;
4 | }
5 |
6 | .dark .dark-card {
7 | @apply bg-gray-800 text-white border-gray-700;
8 | }
9 |
10 | .dark .text-gray-900 {
11 | @apply text-white;
12 | }
13 |
14 | .dark .text-gray-800 {
15 | @apply text-gray-100;
16 | }
17 |
18 | .dark .text-gray-700 {
19 | @apply text-gray-200;
20 | }
21 |
22 | .dark .text-gray-600 {
23 | @apply text-gray-300;
24 | }
25 |
26 | .dark .bg-white {
27 | @apply bg-gray-900;
28 | }
29 |
30 | .dark .border-gray-200 {
31 | @apply border-gray-700;
32 | }
33 | }
34 |
35 | /* Mouse gradient effect */
36 | :root {
37 | --mouse-x: 50vw;
38 | --mouse-y: 50vh;
39 | }
40 |
41 | .mouse-gradient {
42 | background: radial-gradient(
43 | 800px circle at var(--mouse-x) var(--mouse-y),
44 | rgba(129, 140, 248, 0.15),
45 | transparent 40%
46 | );
47 | }
48 |
49 | .dark .mouse-gradient {
50 | background: radial-gradient(
51 | 800px circle at var(--mouse-x) var(--mouse-y),
52 | rgba(129, 140, 248, 0.1),
53 | transparent 40%
54 | );
55 | }
56 |
57 | /* Gradient text effect */
58 | .gradient-text {
59 | @apply bg-clip-text text-transparent bg-gradient-to-r from-primary-500 to-secondary-500;
60 | }
61 |
62 | /* Button effects */
63 | .fancy-button {
64 | @apply relative overflow-hidden transition-all duration-300
65 | bg-gradient-to-r from-primary-500 to-secondary-500
66 | hover:from-primary-600 hover:to-secondary-600
67 | text-white font-semibold rounded-lg
68 | transform hover:scale-105 hover:shadow-lg
69 | active:scale-95;
70 | }
71 |
--------------------------------------------------------------------------------
/src/components/Header/MobileMenu.tsx:
--------------------------------------------------------------------------------
1 | import React, { useState } from 'react';
2 | import { Menu, X } from 'lucide-react';
3 | import { NavLink } from 'react-router-dom';
4 | import { NavItem } from '../../types';
5 |
6 | const navItems: NavItem[] = [
7 | { title: 'Home', href: '/' },
8 | { title: 'Components', href: '/components' },
9 | { title: 'Documentation', href: '/docs' },
10 | { title: 'GitHub', href: 'https://github.com/buildeasy/components' },
11 | ];
12 |
13 | export const MobileMenu = () => {
14 | const [isOpen, setIsOpen] = useState(false);
15 |
16 | return (
17 |
18 |
setIsOpen(!isOpen)}
20 | className="p-2 text-gray-600 dark:text-gray-300"
21 | aria-label="Toggle menu"
22 | >
23 | {isOpen ? : }
24 |
25 |
26 | {isOpen && (
27 |
28 |
29 | {navItems.map((item) => (
30 | setIsOpen(false)}
34 | className={({ isActive }) =>
35 | `text-sm font-medium transition-colors hover:text-primary-600 dark:hover:text-primary-400
36 | ${isActive ? 'text-primary-600 dark:text-primary-400' : 'text-gray-600 dark:text-gray-300'}`
37 | }
38 | >
39 | {item.title}
40 |
41 | ))}
42 |
43 |
44 | )}
45 |
46 | );
47 | };
--------------------------------------------------------------------------------
/src/components/Footer/FooterLinks.tsx:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import { Link } from 'react-router-dom';
3 | import { FooterLink } from '../../types';
4 |
5 | const footerLinks: FooterLink[] = [
6 | {
7 | title: 'Product',
8 | items: [
9 | { title: 'Components', href: '/components' },
10 | { title: 'Documentation', href: '/docs' },
11 | { title: 'Changelog', href: '/changelog' },
12 | ],
13 | },
14 | {
15 | title: 'Resources',
16 | items: [
17 | { title: 'GitHub', href: 'https://github.com/buildeasy/components' },
18 | { title: 'Examples', href: '/examples' },
19 | { title: 'Templates', href: '/templates' },
20 | ],
21 | },
22 | {
23 | title: 'Company',
24 | items: [
25 | { title: 'About', href: '/about' },
26 | { title: 'Blog', href: '/blog' },
27 | { title: 'Contact', href: '/contact' },
28 | ],
29 | },
30 | ];
31 |
32 | export const FooterLinks = () => {
33 | return (
34 |
35 | {footerLinks.map((section) => (
36 |
37 |
38 | {section.title}
39 |
40 |
41 | {section.items.map((item) => (
42 |
43 |
47 | {item.title}
48 |
49 |
50 | ))}
51 |
52 |
53 | ))}
54 |
55 | );
56 | };
--------------------------------------------------------------------------------
/src/components/ui/button-variants.ts:
--------------------------------------------------------------------------------
1 | import { cva } from "class-variance-authority";
2 |
3 | export const buttonVariants = cva(
4 | "inline-flex items-center justify-center rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50",
5 | {
6 | variants: {
7 | variant: {
8 | default:
9 | "bg-primary text-primary-foreground shadow hover:bg-primary/90",
10 | destructive:
11 | "bg-destructive text-destructive-foreground shadow-sm hover:bg-destructive/90",
12 | outline:
13 | "border border-input bg-background shadow-sm hover:bg-accent hover:text-accent-foreground",
14 | secondary:
15 | "bg-secondary text-secondary-foreground shadow-sm hover:bg-secondary/80",
16 | ghost: "hover:bg-accent hover:text-accent-foreground",
17 | link: "text-primary underline-offset-4 hover:underline",
18 | success: "bg-green-500 text-white shadow-sm hover:bg-green-600",
19 | warning: "bg-yellow-500 text-black shadow-sm hover:bg-yellow-600",
20 | info: "bg-blue-500 text-white shadow-sm hover:bg-blue-600",
21 | subtle: "bg-muted text-muted-foreground hover:bg-muted/80",
22 | transparent: "bg-transparent text-primary hover:bg-primary/10",
23 | whiteOutline:
24 | "bg-transparent border border-white text-white hover:bg-white/10", // New variant
25 | },
26 | size: {
27 | default: "h-9 px-4 py-2",
28 | sm: "h-8 rounded-md px-3 text-xs",
29 | lg: "h-10 rounded-md px-8",
30 | xl: "h-12 rounded-lg px-10 text-lg",
31 | xs: "h-7 rounded px-2 text-xs",
32 | icon: "h-9 w-9",
33 | wide: "h-9 px-6 py-2",
34 | },
35 | },
36 | defaultVariants: {
37 | variant: "default",
38 | size: "default",
39 | },
40 | }
41 | );
42 |
--------------------------------------------------------------------------------
/src/components/sections/SparklesText.tsx:
--------------------------------------------------------------------------------
1 | import { useEffect, useState } from "react";
2 | import { motion } from "framer-motion";
3 |
4 | const Sparkles = ({ children }: { children: React.ReactNode }) => {
5 | const [sparkles, setSparkles] = useState<
6 | Array<{ id: number; x: number; y: number }>
7 | >([]);
8 |
9 | useEffect(() => {
10 | const interval = setInterval(() => {
11 | const sparkle = {
12 | id: Date.now(),
13 | x: Math.random() * 100,
14 | y: Math.random() * 100,
15 | };
16 | setSparkles((prev) => [...prev, sparkle]);
17 | }, 500);
18 |
19 | return () => clearInterval(interval);
20 | }, []);
21 |
22 | useEffect(() => {
23 | const timeout = setTimeout(() => {
24 | setSparkles((prev) => prev.slice(1));
25 | }, 1000);
26 |
27 | return () => clearTimeout(timeout);
28 | }, [sparkles]);
29 |
30 | return (
31 |
32 | {sparkles.map((sparkle) => (
33 |
45 | ))}
46 | {children}
47 |
48 | );
49 | };
50 |
51 | export const SparklesPreview = () => {
52 | return (
53 |
54 |
55 |
56 |
57 | Magical Text ✨
58 |
59 |
60 |
61 |
62 | );
63 | };
64 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "buildeasy",
3 | "private": true,
4 | "version": "0.0.0",
5 | "type": "module",
6 | "scripts": {
7 | "dev": "vite",
8 | "build": "vite build",
9 | "lint": "eslint .",
10 | "preview": "vite preview"
11 | },
12 | "dependencies": {
13 | "@headlessui/react": "^2.2.0",
14 | "@heroicons/react": "^2.2.0",
15 | "@lottiefiles/react-lottie-player": "^3.5.3",
16 | "@radix-ui/react-slot": "^1.1.1",
17 | "@react-three/drei": "^9.99.5",
18 | "@react-three/fiber": "^8.15.16",
19 | "@react-three/postprocessing": "^2.15.1",
20 | "@vercel/analytics": "^1.4.1",
21 | "class-variance-authority": "^0.7.1",
22 | "framer-motion": "^11.18.1",
23 | "lottie-react": "^2.4.0",
24 | "lottie-web": "^5.12.2",
25 | "lucide-react": "^0.473.0",
26 | "ogl": "^1.0.11",
27 | "react": "^18.3.1",
28 | "react-dom": "^18.3.1",
29 | "react-router-dom": "^6.22.3",
30 | "react-scroll": "^1.9.0",
31 | "react-syntax-highlighter": "^15.6.1",
32 | "shadcn-ui": "^0.9.4",
33 | "three": "^0.161.0"
34 | },
35 | "optionalDependencies": {
36 | "@rollup/rollup-darwin-arm64": "^4.28.1"
37 | },
38 | "devDependencies": {
39 | "@eslint/js": "^9.9.1",
40 | "@shadcn/ui": "^0.0.4",
41 | "@types/node": "^22.10.7",
42 | "@types/react": "^18.3.5",
43 | "@types/react-dom": "^18.3.0",
44 | "@types/react-scroll": "^1.8.10",
45 | "@types/react-syntax-highlighter": "^15.5.13",
46 | "@vitejs/plugin-react": "^4.3.1",
47 | "autoprefixer": "^10.4.20",
48 | "clsx": "^2.1.1",
49 | "eslint": "^9.9.1",
50 | "eslint-plugin-react-hooks": "^5.1.0-rc.0",
51 | "eslint-plugin-react-refresh": "^0.4.11",
52 | "globals": "^15.9.0",
53 | "postcss": "^8.5.1",
54 | "postcss-import": "^16.1.0",
55 | "tailwind-merge": "^2.6.0",
56 | "tailwindcss": "^3.4.1",
57 | "tailwindcss-animate": "^1.0.7",
58 | "typescript": "^5.5.3",
59 | "typescript-eslint": "^8.3.0",
60 | "vite": "^5.4.2"
61 | }
62 | }
63 |
--------------------------------------------------------------------------------
/src/components/Footer/FooterSimple.tsx:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import { motion } from 'framer-motion';
3 | import { Heart, Github, Twitter, Linkedin } from 'lucide-react';
4 | import { Logo } from '../Header/Logo';
5 |
6 | export const FooterSimple = () => {
7 | return (
8 |
9 |
10 |
11 |
12 |
13 | Beautiful React components made with ✨ love ✨ for your next project
14 |
15 |
16 |
21 |
22 |
23 |
28 |
29 |
30 |
35 |
36 |
37 |
38 |
39 | Made with
40 |
41 | by Buildeasy Team
42 |
43 |
44 |
45 |
46 | );
47 | };
--------------------------------------------------------------------------------
/src/components/sections/DemoSection.tsx:
--------------------------------------------------------------------------------
1 | import { motion } from "framer-motion";
2 |
3 | export const DemoSection = () => {
4 | return (
5 |
6 |
7 |
14 |
15 | See ReactWind in Action
16 |
17 |
18 | Watch how easy it is to build beautiful interfaces with our components
19 |
20 |
21 |
22 |
29 |
39 |
54 |
55 |
56 |
57 |
58 | );
59 | };
--------------------------------------------------------------------------------
/src/components/Hero/LottieAnimation.tsx:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import Lottie from 'lottie-react';
3 |
4 | const lottieAnimation = {
5 | v: "5.7.1",
6 | fr: 30,
7 | ip: 0,
8 | op: 180,
9 | w: 800,
10 | h: 600,
11 | nm: "Buildeasy Animation",
12 | ddd: 0,
13 | assets: [],
14 | layers: [
15 | {
16 | ddd: 0,
17 | ind: 1,
18 | ty: 4,
19 | nm: "Code Window",
20 | sr: 1,
21 | ks: {
22 | o: { a: 0, k: 100 },
23 | r: { a: 0, k: 0 },
24 | p: { a: 0, k: [400, 300, 0] },
25 | a: { a: 0, k: [0, 0, 0] },
26 | s: {
27 | a: 1,
28 | k: [
29 | {
30 | t: 0,
31 | s: [100, 100, 100],
32 | h: 1
33 | },
34 | {
35 | t: 90,
36 | s: [105, 105, 100],
37 | h: 1
38 | },
39 | {
40 | t: 180,
41 | s: [100, 100, 100],
42 | h: 1
43 | }
44 | ]
45 | }
46 | },
47 | shapes: [
48 | {
49 | ty: "gr",
50 | it: [
51 | {
52 | ty: "rc",
53 | d: 1,
54 | s: { a: 0, k: [300, 200] },
55 | p: { a: 0, k: [0, 0] },
56 | r: { a: 0, k: 10 }
57 | },
58 | {
59 | ty: "fl",
60 | c: { a: 0, k: [0.2, 0.4, 1, 1] },
61 | o: { a: 0, k: 100 }
62 | }
63 | ]
64 | }
65 | ]
66 | }
67 | ]
68 | };
69 |
70 | export const HeroLottie: React.FC = () => {
71 | return (
72 |
84 | );
85 | };
--------------------------------------------------------------------------------
/src/components/CodeBlock.tsx:
--------------------------------------------------------------------------------
1 | import { useState } from "react";
2 | import { Check, Copy } from "lucide-react";
3 | import { Prism as SyntaxHighlighter } from "react-syntax-highlighter";
4 | import { oneDark } from "react-syntax-highlighter/dist/esm/styles/prism";
5 |
6 | interface CodeBlockProps {
7 | code: string;
8 | }
9 |
10 | export const CodeBlock = ({ code }: CodeBlockProps) => {
11 | const [copied, setCopied] = useState(false);
12 | const files = code.split(/\/\/ [a-zA-Z-]+\.tsx/).filter(Boolean);
13 | const fileNames = code.match(/\/\/ [a-zA-Z-]+\.tsx/g) || [];
14 | const [activeTab, setActiveTab] = useState(0);
15 |
16 | const copyToClipboard = () => {
17 | navigator.clipboard.writeText(files[activeTab]);
18 | setCopied(true);
19 | setTimeout(() => setCopied(false), 2000);
20 | };
21 |
22 | return (
23 |
24 |
25 | {fileNames.map((fileName, index) => (
26 | setActiveTab(index)}
34 | >
35 | {fileName.replace("// ", "")}
36 |
37 | ))}
38 |
39 |
40 |
44 | {copied ? (
45 |
46 | ) : (
47 |
48 | )}
49 |
50 |
58 | {files[activeTab].trim()}
59 |
60 |
61 |
62 | );
63 | };
64 |
--------------------------------------------------------------------------------
/src/components/sections/FooterMinimal.tsx:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import { motion } from 'framer-motion';
3 | import { Github, Instagram, Linkedin, Heart } from 'lucide-react';
4 | import { Logo } from '../Header/Logo';
5 |
6 | export const FooterMinimal = () => {
7 | return (
8 |
9 |
10 |
11 |
12 |
13 |
14 | Made with by Sri Shiamshetty
15 |
16 |
17 |
18 |
25 |
26 |
27 |
34 |
35 |
36 |
43 |
44 |
45 |
46 |
47 |
48 |
49 | );
50 | };
--------------------------------------------------------------------------------
/src/components/Footer/FooterMinimal.tsx:
--------------------------------------------------------------------------------
1 | import { motion } from 'framer-motion';
2 | import { Github, Instagram, Linkedin, Heart } from 'lucide-react';
3 | import { Logo } from '../Header/Logo';
4 |
5 | export const FooterMinimal = () => {
6 | return (
7 |
8 |
9 |
10 |
24 |
25 |
32 |
33 |
34 |
41 |
42 |
43 |
50 |
51 |
52 |
53 |
54 |
55 |
56 | );
57 | };
--------------------------------------------------------------------------------
/src/components/Header/Navigation.tsx:
--------------------------------------------------------------------------------
1 | import { NavLink, useNavigate } from "react-router-dom";
2 | import { NavItem } from "../../types";
3 |
4 | const navItems: NavItem[] = [
5 | { title: "Components", href: "/components" },
6 | { title: "Templates", href: "/templates" },
7 | { title: "Documentation", href: "/docs" },
8 | { title: "GitHub", href: "https://github.com/GaneshVarma1" },
9 | ];
10 |
11 | export const Navigation = () => {
12 | const navigate = useNavigate();
13 |
14 | const handleClick = (e: React.MouseEvent, href: string) => {
15 | e.preventDefault();
16 | if (href.startsWith('#')) {
17 | // First navigate to the components page if we're not already there
18 | navigate('/');
19 |
20 | // Then scroll to the section after a small delay to ensure the page is loaded
21 | setTimeout(() => {
22 | const element = document.getElementById(href.substring(1));
23 | if (element) {
24 | const yOffset = -100;
25 | const y = element.getBoundingClientRect().top + window.pageYOffset + yOffset;
26 | window.scrollTo({ top: y, behavior: 'smooth' });
27 | }
28 | }, 100);
29 | } else {
30 | window.location.href = href;
31 | }
32 | };
33 |
34 | return (
35 |
36 |
62 |
63 | );
64 | };
65 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # ReactWind
2 |
3 | Welcome to **ReactWind**! This guide will help you get started quickly by setting up your environment and installing the necessary packages for your project.
4 |
5 | ## Getting Started 🚀
6 |
7 | ### Prerequisites
8 | Before proceeding, ensure you have the following installed:
9 | - **Node.js** (v14 or later)
10 | - **npm** or **yarn** (npm comes with Node.js)
11 |
12 | ### Steps to Set Up
13 | Follow the steps below to set up your project environment:
14 |
15 | ---
16 |
17 | ### 1. Install Lottie Files
18 | Lottie enables you to add animations seamlessly into your project.
19 |
20 | Run the following command:
21 | ```bash
22 | npm install lottie-react
23 | ```
24 |
25 | For more information about Lottie, check out their [documentation](https://lottiefiles.com/).
26 |
27 | ---
28 |
29 | ### 2. Install Lucide Icons
30 | Lucide provides a modern and customizable set of icons.
31 |
32 | Run the following command:
33 | ```bash
34 | npm install lucide-react
35 | ```
36 |
37 | Explore the full icon set and usage on the [Lucide website](https://lucide.dev/).
38 |
39 | ---
40 |
41 | ### 3. Install TailwindCSS
42 | TailwindCSS is a utility-first CSS framework that helps you design rapidly.
43 |
44 | 1. Install TailwindCSS and its peer dependencies:
45 | ```bash
46 | npm install -D tailwindcss postcss autoprefixer
47 | ```
48 |
49 | 2. Initialize TailwindCSS configuration:
50 | ```bash
51 | npx tailwindcss init
52 | ```
53 |
54 | 3. Configure your `tailwind.config.js` file and include Tailwind in your CSS. For detailed setup instructions, visit the [TailwindCSS Documentation](https://tailwindcss.com/docs/installation).
55 |
56 | ---
57 |
58 | ### 4. Install Framer Motion
59 | Framer Motion is a powerful library for animations and transitions in React.
60 |
61 | Run the following command:
62 | ```bash
63 | npm install framer-motion
64 | ```
65 |
66 | Learn more about its features from the [Framer Motion documentation](https://www.framer.com/motion/).
67 |
68 | ---
69 |
70 | ### Project Setup Complete!
71 | With the above steps, your environment is ready for development with **ReactWind**. Happy coding!
72 |
73 | ## Feedback
74 | If you encounter any issues or have suggestions for improvement, feel free to open an issue or contribute to the project.
75 |
76 | ---
77 |
78 | Made with ❤️ using React, TailwindCSS, and more!
79 |
80 |
--------------------------------------------------------------------------------
/src/assets/animations/web-dev.json:
--------------------------------------------------------------------------------
1 | {
2 | "v": "5.7.1",
3 | "fr": 30,
4 | "ip": 0,
5 | "op": 180,
6 | "w": 800,
7 | "h": 600,
8 | "nm": "Web Development",
9 | "ddd": 0,
10 | "assets": [],
11 | "layers": [
12 | {
13 | "ddd": 0,
14 | "ind": 1,
15 | "ty": 4,
16 | "nm": "Code Window",
17 | "sr": 1,
18 | "ks": {
19 | "o": { "a": 0, "k": 100 },
20 | "r": { "a": 0, "k": 0 },
21 | "p": { "a": 0, "k": [400, 300, 0] },
22 | "a": { "a": 0, "k": [0, 0, 0] },
23 | "s": {
24 | "a": 1,
25 | "k": [
26 | {
27 | "t": 0,
28 | "s": [100, 100, 100],
29 | "h": 1
30 | },
31 | {
32 | "t": 90,
33 | "s": [105, 105, 100],
34 | "h": 1
35 | },
36 | {
37 | "t": 180,
38 | "s": [100, 100, 100],
39 | "h": 1
40 | }
41 | ]
42 | }
43 | },
44 | "shapes": [
45 | {
46 | "ty": "rc",
47 | "d": 1,
48 | "s": { "a": 0, "k": [300, 200] },
49 | "p": { "a": 0, "k": [0, 0] },
50 | "r": { "a": 0, "k": 10 },
51 | "nm": "Rectangle Path",
52 | "mn": "ADBE Vector Shape - Rect"
53 | },
54 | {
55 | "ty": "fl",
56 | "c": { "a": 0, "k": [0.2, 0.4, 1, 1] },
57 | "o": { "a": 0, "k": 100 },
58 | "r": 1,
59 | "nm": "Fill 1",
60 | "mn": "ADBE Vector Graphic - Fill"
61 | }
62 | ]
63 | },
64 | {
65 | "ddd": 0,
66 | "ind": 2,
67 | "ty": 4,
68 | "nm": "Code Lines",
69 | "sr": 1,
70 | "ks": {
71 | "o": { "a": 0, "k": 100 },
72 | "r": { "a": 0, "k": 0 },
73 | "p": { "a": 0, "k": [400, 300, 0] },
74 | "a": { "a": 0, "k": [0, 0, 0] },
75 | "s": { "a": 0, "k": [100, 100, 100] }
76 | },
77 | "shapes": [
78 | {
79 | "ty": "rc",
80 | "d": 1,
81 | "s": { "a": 0, "k": [200, 10] },
82 | "p": { "a": 0, "k": [-20, -50] },
83 | "r": { "a": 0, "k": 5 },
84 | "nm": "Code Line 1",
85 | "mn": "ADBE Vector Shape - Rect"
86 | },
87 | {
88 | "ty": "fl",
89 | "c": { "a": 0, "k": [1, 1, 1, 0.5] },
90 | "o": { "a": 0, "k": 100 },
91 | "r": 1,
92 | "nm": "Fill 1",
93 | "mn": "ADBE Vector Graphic - Fill"
94 | }
95 | ]
96 | }
97 | ]
98 | }
--------------------------------------------------------------------------------
/src/components/sections/HeroImages.tsx:
--------------------------------------------------------------------------------
1 | import { MoveRight, PhoneCall } from "lucide-react";
2 | import { Button } from "../ui/button";
3 |
4 | function HeroImages() {
5 | return (
6 |
7 | {/* Content */}
8 |
9 |
10 |
11 |
12 | Start your celebration with us!
13 |
14 |
15 | Running a chocolate business is a labor of love. Skip the hassle
16 | of traditional wholesale methods and focus on what matters -
17 | creating delicious confections. We make it easier for artisan
18 | chocolatiers to connect, sell, and grow their sweet business.
19 |
20 |
21 |
22 | Call to order
23 |
24 |
25 | Sign up here
26 |
27 |
28 |
29 |
30 |
31 |
36 |
37 |
38 |
43 |
44 |
45 |
50 |
51 |
52 |
53 |
54 |
55 | );
56 | }
57 |
58 | export { HeroImages };
59 |
--------------------------------------------------------------------------------
/src/components/ui/background-gradient.tsx:
--------------------------------------------------------------------------------
1 | import { cn } from "../../lib/utils";
2 | import React from "react";
3 | import { motion } from "framer-motion";
4 |
5 | export const BackgroundGradient = ({
6 | children,
7 | className,
8 | containerClassName,
9 | animate = true,
10 | }: {
11 | children?: React.ReactNode;
12 | className?: string;
13 | containerClassName?: string;
14 | animate?: boolean;
15 | }) => {
16 | const variants = {
17 | initial: {
18 | backgroundPosition: "0 50%",
19 | },
20 | animate: {
21 | backgroundPosition: ["0, 50%", "100% 50%", "0 50%"],
22 | },
23 | };
24 | return (
25 |
26 |
47 |
68 |
69 |
{children}
70 |
71 | );
72 | };
73 |
--------------------------------------------------------------------------------
/src/components/Hero/index.tsx:
--------------------------------------------------------------------------------
1 | import { useNavigate } from "react-router-dom";
2 | import { motion } from "framer-motion";
3 | import { Player } from "@lottiefiles/react-lottie-player";
4 |
5 | export const Hero = () => {
6 | const navigate = useNavigate();
7 |
8 | return (
9 |
13 |
14 |
15 |
16 |
21 |
22 | Beautiful React Components
23 | Made Easy ✨
24 |
25 |
26 | Production-ready components for your next React project. Free,
27 | open-source, and fully customizable. 🚀
28 |
29 | navigate("/components")}
33 | className="fancy-button px-8 py-4 shadow-lg"
34 | >
35 | Get Free Components 🎁
36 |
37 |
38 |
44 |
45 |
59 |
60 |
61 |
62 |
63 | );
64 | };
65 |
--------------------------------------------------------------------------------
/src/components/sections/Ecommerce1.tsx:
--------------------------------------------------------------------------------
1 | const products = [
2 | {
3 | id: 1,
4 | name: "Milk Chocolate Bar",
5 | href: "",
6 | imageSrc:
7 | "https://plus.unsplash.com/premium_photo-1675283825474-390ea83c0703?q=80&w=2940&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D",
8 | imageAlt: "Delicious milk chocolate bar.",
9 | price: "$5",
10 | color: "Milk Chocolate",
11 | },
12 | {
13 | id: 2,
14 | name: "Dark Chocolate Truffles",
15 | href: "",
16 | imageSrc:
17 | "https://www.happyfoodstube.com/wp-content/uploads/2016/12/dark-chocolate-truffles-6.jpg",
18 | imageAlt: "Gourmet dark chocolate truffles.",
19 | price: "$12",
20 | color: "Dark Chocolate",
21 | },
22 | {
23 | id: 3,
24 | name: "White Chocolate Bark",
25 | href: "",
26 | imageSrc:
27 | "https://milkhousechocolates.net/cdn/shop/files/WhiteChocolatePeppermintBarkforweb4_1200x1200.jpg?v=1695243013",
28 | imageAlt: "White chocolate bark with nuts and fruits.",
29 | price: "$8",
30 | color: "White Chocolate",
31 | },
32 | {
33 | id: 4,
34 | name: "Assorted Chocolate Box",
35 | href: "",
36 | imageSrc:
37 | "https://www.li-lacchocolates.com/cdn/shop/files/ThanksgivingBox20_2000x1500_8a31c1a6-8b5b-4f4b-91d1-891dfb183e45.jpg?v=1695077708",
38 | imageAlt: "Premium assorted chocolate box.",
39 | price: "$25",
40 | color: "Assorted",
41 | },
42 | ];
43 |
44 | export default function Ecommerce1() {
45 | return (
46 |
47 |
48 |
49 | Customers also purchased
50 |
51 |
52 |
53 | {products.map((product) => (
54 |
55 |
60 |
61 |
62 |
68 |
{product.color}
69 |
70 |
71 | {product.price}
72 |
73 |
74 |
75 | ))}
76 |
77 |
78 |
79 | );
80 | }
81 |
--------------------------------------------------------------------------------
/src/App.tsx:
--------------------------------------------------------------------------------
1 | import { BrowserRouter as Router, Routes, Route } from "react-router-dom";
2 | import { Analytics } from "@vercel/analytics/react";
3 | import { Header } from "./components/Header";
4 | import { FooterMinimal } from "./components/Footer/FooterMinimal";
5 | import { Error404 } from "./pages/Error404";
6 | import { useEffect, useCallback } from "react";
7 | import { ScrollToTop } from "./components/ScrollToTop";
8 | import { ErrorBoundary } from "./components/ErrorBoundary";
9 | import { ThemeProvider } from "./context/ThemeContext";
10 | import { Suspense, lazy } from "react";
11 | // import CustomCursor from './components/CustomCursor'; // if it exists
12 |
13 | // Lazy load pages for better performance
14 | const LazyHome = lazy(() => import("./pages/Home").then(module => ({ default: module.Home })));
15 | const LazyComponents = lazy(() => import("./pages/Components").then(module => ({ default: module.Components })));
16 | const LazyDocumentation = lazy(() => import("./pages/Documentation").then(module => ({ default: module.Documentation })));
17 | const LazyTemplates = lazy(() => import("./pages/Templates").then(module => ({ default: module.Templates })));
18 |
19 | // Loading component for suspense fallback
20 | const PageLoader = () => (
21 |
24 | );
25 |
26 | export const App = () => {
27 | const handleMouseMove = useCallback((e: MouseEvent) => {
28 | document.documentElement.style.setProperty("--mouse-x", `${e.clientX}px`);
29 | document.documentElement.style.setProperty("--mouse-y", `${e.clientY}px`);
30 | }, []);
31 |
32 | useEffect(() => {
33 | window.addEventListener("mousemove", handleMouseMove);
34 | return () => window.removeEventListener("mousemove", handleMouseMove);
35 | }, [handleMouseMove]);
36 |
37 | return (
38 |
39 |
40 |
41 |
42 |
43 |
44 | }>
45 |
46 | } />
47 | } />
48 | } />
49 | } />
50 | } />
51 |
52 |
53 |
54 |
55 |
56 |
57 | {/* Remove or comment out the cursor component if it exists */}
58 | {/*
*/}
59 |
60 |
61 |
62 |
63 | );
64 | };
65 |
66 | export default App;
67 |
--------------------------------------------------------------------------------
/src/components/sections/FeatureSection.tsx:
--------------------------------------------------------------------------------
1 | import { motion } from "framer-motion";
2 | import Lottie from "lottie-react";
3 | import { Shield, Zap, BarChart } from "lucide-react";
4 |
5 | // Import the local Lottie JSON
6 | import featureAnimationData from "../../assets/bike.json";
7 |
8 | export const FeatureSection = () => {
9 | const features = [
10 | {
11 | icon: ,
12 | title: "Enterprise Security",
13 | description:
14 | "Bank-grade security with end-to-end encryption and compliance.",
15 | },
16 | {
17 | icon: ,
18 | title: "Lightning Fast",
19 | description: "Optimized performance with sub-second response times.",
20 | },
21 | {
22 | icon: ,
23 | title: "Advanced Analytics",
24 | description: "Deep insights with customizable dashboards and reports.",
25 | },
26 | ];
27 |
28 | return (
29 |
30 |
31 |
32 |
38 | Powerful Features for Your Business
39 |
40 |
41 | Everything you need to scale your business effectively
42 |
43 |
44 |
45 |
46 | {features.map((feature, index) => (
47 |
54 |
55 | {feature.icon}
56 |
57 | {feature.title}
58 |
59 | {feature.description}
60 |
61 |
62 | ))}
63 |
64 |
65 |
71 |
72 |
76 |
77 |
78 |
79 |
80 | );
81 | };
82 |
--------------------------------------------------------------------------------
/src/components/sections/CardHoverEffect.tsx:
--------------------------------------------------------------------------------
1 | import { motion } from "framer-motion";
2 |
3 | const cards = [
4 | {
5 | title: "Mountain Retreat",
6 | description: "Discover peaceful solitude in nature's embrace",
7 | image:
8 | "https://images.unsplash.com/photo-1519681393784-d120267933ba?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&w=2070&q=80",
9 | },
10 | {
11 | title: "Ocean Waves",
12 | description: "Let the rhythm of the waves calm your soul",
13 | image:
14 | "https://images.unsplash.com/photo-1505118380757-91f5f5632de0?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&w=2076&q=80",
15 | },
16 | {
17 | title: "Forest Magic",
18 | description: "Explore the mystical depths of ancient woods",
19 | image:
20 | "https://images.unsplash.com/photo-1441974231531-c6227db76b6e?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&w=2071&q=80",
21 | },
22 | ];
23 |
24 | export const CardHoverEffect = () => {
25 | return (
26 |
27 | {cards.map((card, index) => (
28 |
34 | {/* Shining border effect */}
35 |
36 |
37 |
40 |
41 | {/* Card content */}
42 |
43 |
44 |
49 |
50 |
51 |
52 |
53 | {card.title}
54 |
55 |
{card.description}
56 |
57 |
61 | →
62 |
63 |
64 |
65 | ))}
66 |
67 | );
68 | };
69 |
--------------------------------------------------------------------------------
/src/components/sections/GradientBlob.tsx:
--------------------------------------------------------------------------------
1 | import { useEffect, useRef } from "react";
2 | import { motion } from "framer-motion";
3 |
4 | export const GradientBlob = () => {
5 | const canvasRef = useRef(null);
6 |
7 | useEffect(() => {
8 | const canvas = canvasRef.current;
9 | if (!canvas) return;
10 |
11 | const ctx = canvas.getContext("2d");
12 | if (!ctx) return;
13 |
14 | let animationFrameId: number;
15 | let time = 0;
16 |
17 | const resize = () => {
18 | canvas.width = canvas.offsetWidth;
19 | canvas.height = canvas.offsetHeight;
20 | };
21 |
22 | const drawBlob = (x: number, y: number, radius: number, color: string) => {
23 | ctx.beginPath();
24 | ctx.arc(x, y, radius, 0, Math.PI * 2);
25 | ctx.fillStyle = color;
26 | ctx.fill();
27 | };
28 |
29 | const animate = () => {
30 | time += 0.01;
31 | ctx.clearRect(0, 0, canvas.width, canvas.height);
32 |
33 | const centerX = canvas.width / 2;
34 | const centerY = canvas.height / 2;
35 |
36 | // Primary blob (white)
37 | drawBlob(
38 | centerX + Math.sin(time) * 50,
39 | centerY + Math.cos(time * 0.8) * 50,
40 | 150,
41 | "rgba(255, 255, 255, 0.15)"
42 | );
43 |
44 | // Secondary blob (light grey)
45 | drawBlob(
46 | centerX + Math.cos(time * 1.2) * 60,
47 | centerY + Math.sin(time * 0.9) * 60,
48 | 120,
49 | "rgba(229, 229, 229, 0.12)"
50 | );
51 |
52 | // Tertiary blob (medium grey)
53 | drawBlob(
54 | centerX + Math.sin(time * 0.7) * 70,
55 | centerY + Math.cos(time * 1.1) * 70,
56 | 100,
57 | "rgba(212, 212, 212, 0.1)"
58 | );
59 |
60 | animationFrameId = requestAnimationFrame(animate);
61 | };
62 |
63 | resize();
64 | animate();
65 |
66 | window.addEventListener("resize", resize);
67 |
68 | return () => {
69 | window.removeEventListener("resize", resize);
70 | cancelAnimationFrame(animationFrameId);
71 | };
72 | }, []);
73 |
74 | return (
75 |
76 |
77 |
78 |
79 |
85 | Gradient Blobs
86 |
87 |
93 | Smooth animated gradient blobs that create an organic, fluid
94 | background effect
95 |
96 |
97 |
98 | );
99 | };
100 |
--------------------------------------------------------------------------------
/src/index.css:
--------------------------------------------------------------------------------
1 | @import "./styles/darkMode.css";
2 |
3 | @tailwind base;
4 | @tailwind components;
5 | @tailwind utilities;
6 |
7 | @layer base {
8 | :root {
9 | --background: 0 0% 100%;
10 | --foreground: 240 10% 3.9%;
11 | --card: 0 0% 100%;
12 | --card-foreground: 240 10% 3.9%;
13 | --popover: 0 0% 100%;
14 | --popover-foreground: 240 10% 3.9%;
15 | --primary: 240 5.9% 10%;
16 | --primary-foreground: 0 0% 98%;
17 | --secondary: 240 4.8% 95.9%;
18 | --secondary-foreground: 240 5.9% 10%;
19 | --muted: 240 4.8% 95.9%;
20 | --muted-foreground: 240 3.8% 46.1%;
21 | --accent: 240 4.8% 95.9%;
22 | --accent-foreground: 240 5.9% 10%;
23 | --destructive: 0 84.2% 60.2%;
24 | --destructive-foreground: 0 0% 98%;
25 | --border: 240 5.9% 90%;
26 | --input: 240 5.9% 90%;
27 | --ring: 240 10% 3.9%;
28 | --chart-1: 12 76% 61%;
29 | --chart-2: 173 58% 39%;
30 | --chart-3: 197 37% 24%;
31 | --chart-4: 43 74% 66%;
32 | --chart-5: 27 87% 67%;
33 | --radius: 0.5rem;
34 | }
35 |
36 | .dark {
37 | --background: 240 10% 3.9%;
38 | --foreground: 0 0% 98%;
39 | --card: 240 10% 3.9%;
40 | --card-foreground: 0 0% 98%;
41 | --popover: 240 10% 3.9%;
42 | --popover-foreground: 0 0% 98%;
43 | --primary: 0 0% 98%;
44 | --primary-foreground: 240 5.9% 10%;
45 | --secondary: 240 3.7% 15.9%;
46 | --secondary-foreground: 0 0% 98%;
47 | --muted: 240 3.7% 15.9%;
48 | --muted-foreground: 240 5% 64.9%;
49 | --accent: 240 3.7% 15.9%;
50 | --accent-foreground: 0 0% 98%;
51 | --destructive: 0 62.8% 30.6%;
52 | --destructive-foreground: 0 0% 98%;
53 | --border: 240 3.7% 15.9%;
54 | --input: 240 3.7% 15.9%;
55 | --ring: 240 4.9% 83.9%;
56 | --chart-1: 220 70% 50%;
57 | --chart-2: 160 60% 45%;
58 | --chart-3: 30 80% 55%;
59 | --chart-4: 280 65% 60%;
60 | --chart-5: 340 75% 55%;
61 | }
62 | }
63 |
64 | @layer components {
65 | .gradient-text {
66 | @apply bg-clip-text text-transparent bg-gradient-to-r from-primary-500 to-secondary-500;
67 | }
68 |
69 | .hover-card {
70 | @apply transition-all duration-300 hover:shadow-xl hover:-translate-y-1;
71 | }
72 |
73 | .mouse-gradient {
74 | background: radial-gradient(
75 | 600px circle at var(--mouse-x) var(--mouse-y),
76 | rgba(var(--gradient-color), 0.15),
77 | transparent 40%
78 | );
79 | }
80 | .hiring-badge {
81 | background: linear-gradient(
82 | 135deg,
83 | rgba(124, 58, 237, 0.1) 0%,
84 | rgba(124, 58, 237, 0.2) 100%
85 | );
86 | backdrop-filter: blur(8px);
87 | border: 1px solid rgba(124, 58, 237, 0.2);
88 | animation: pulse 2s infinite;
89 | }
90 |
91 | .fancy-button {
92 | @apply relative overflow-hidden transition-all duration-300
93 | bg-gradient-to-r from-primary-500 to-secondary-500
94 | hover:from-primary-600 hover:to-secondary-600
95 | text-white font-semibold rounded-lg
96 | transform hover:scale-105 hover:shadow-lg
97 | active:scale-95;
98 | }
99 | }
100 |
101 | html {
102 | scroll-behavior: smooth;
103 | }
104 |
105 | @layer base {
106 | * {
107 | @apply border-border;
108 | }
109 | body {
110 | @apply bg-background text-foreground;
111 | }
112 | }
113 |
--------------------------------------------------------------------------------
/src/components/sections/FooterApp2.tsx:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import { motion } from 'framer-motion';
3 | import { Download, Star, Heart } from 'lucide-react';
4 | import { Logo } from '../Header/Logo';
5 |
6 | export const FooterApp2 = () => {
7 | return (
8 |
9 |
10 |
11 |
12 |
13 |
14 | Beautiful React components for your next project ✨ Made with love for developers 💖
15 |
16 |
17 |
22 |
23 | Download Now
24 |
25 |
26 |
27 |
28 |
Resources 📚
29 |
34 |
35 |
43 |
44 |
45 |
46 |
47 | Made with
48 |
49 | by Buildeasy Team
50 |
51 |
52 |
53 | 5.0/5 from 1000+ reviews
54 |
55 |
56 |
57 |
58 |
59 | );
60 | };
--------------------------------------------------------------------------------
/src/components/sections/HeroVideo.tsx:
--------------------------------------------------------------------------------
1 | import { MoveRight, PhoneCall } from "lucide-react";
2 | import { Button } from "../ui/button";
3 | import { Badge } from "../ui/badge";
4 |
5 | function HeroVideo() {
6 | return (
7 |
8 | {/* Grid Background */}
9 |
21 |
22 | {/* Dark Mode Grid Overlay */}
23 |
35 |
36 | {/* Radial Gradient */}
37 |
38 |
39 | {/* Content */}
40 |
41 |
42 |
43 |
54 |
55 |
56 | Innovate with Cutting-Edge Technology!
57 |
58 |
59 | Embrace the future of business with our solutions. We simplify
60 | and accelerate SMB trade, making your operations smoother and
61 | more efficient.
62 |
63 |
64 |
65 |
66 | Lets talk
67 |
68 |
69 | Member Login
70 |
71 |
72 |
73 |
74 |
82 |
83 |
84 |
85 |
86 | );
87 | }
88 |
89 | export { HeroVideo };
90 |
--------------------------------------------------------------------------------
/src/components/sections/FooterNewsletter.tsx:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import { motion } from 'framer-motion';
3 | import { Mail, ArrowRight } from 'lucide-react';
4 | import { Logo } from '../Header/Logo';
5 | import { SocialLinks } from './SocialLinks';
6 |
7 | export const FooterNewsletter = () => {
8 | return (
9 |
10 |
11 |
Footer Sections
12 |
13 |
14 |
15 |
16 | Join 10,000+ developers 👩💻 who get our weekly newsletter with new components, tips, and resources! ✨
17 |
18 |
35 |
36 |
54 |
55 |
56 |
57 | © {new Date().getFullYear()} Buildeasy. All rights reserved. 🔒
58 |
59 |
60 |
61 |
62 |
63 | );
64 | };
--------------------------------------------------------------------------------
/src/components/Footer/FooterApp.tsx:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import { motion } from 'framer-motion';
3 | import { Download, Star } from 'lucide-react';
4 | import { Logo } from '../Header/Logo';
5 |
6 | export const FooterApp = () => {
7 | return (
8 |
9 |
10 |
11 |
12 |
13 |
14 | Download our mobile app to access beautiful components on the go! 📱✨
15 |
16 |
17 |
22 |
23 | App Store
24 |
25 |
30 |
31 | Play Store
32 |
33 |
34 |
35 |
36 |
37 |
Features ⭐
38 |
43 |
44 |
52 |
53 |
54 |
55 |
56 |
57 | © {new Date().getFullYear()} Buildeasy. Made with 💖 for developers
58 |
59 |
60 |
61 | 4.9/5 from 1000+ reviews
62 |
63 |
64 |
65 |
66 |
67 | );
68 | };
--------------------------------------------------------------------------------
/src/components/ComponentSection.tsx:
--------------------------------------------------------------------------------
1 | import { useState, useRef } from "react";
2 | import { motion, AnimatePresence } from "framer-motion";
3 | import { Code, Copy, Check } from "lucide-react";
4 | import { useComponentTheme } from '../context/ComponentThemeContext';
5 |
6 | interface ComponentSectionProps {
7 | title: string;
8 | code: string;
9 | children: React.ReactNode;
10 | }
11 |
12 | export const ComponentSection = ({ title, code, children }: ComponentSectionProps) => {
13 | const { theme } = useComponentTheme();
14 | const [isCodeVisible, setIsCodeVisible] = useState(false);
15 | const [isCopied, setIsCopied] = useState(false);
16 | const codeRef = useRef(null);
17 |
18 | const copyToClipboard = async () => {
19 | try {
20 | await navigator.clipboard.writeText(code);
21 | setIsCopied(true);
22 | setTimeout(() => setIsCopied(false), 2000);
23 | } catch (err) {
24 | console.error('Failed to copy:', err);
25 | }
26 | };
27 |
28 | const toggleCode = () => {
29 | setIsCodeVisible(!isCodeVisible);
30 | // Scroll to code section when showing
31 | if (!isCodeVisible) {
32 | setTimeout(() => {
33 | codeRef.current?.scrollIntoView({
34 | behavior: 'smooth',
35 | block: 'center'
36 | });
37 | }, 100);
38 | }
39 | };
40 |
41 | return (
42 |
43 |
44 |
47 | {title}
48 |
49 |
57 |
58 | {isCodeVisible ? "Hide Code" : "View Code"}
59 |
60 |
61 |
62 | {/* Component Preview */}
63 |
68 |
69 | {children}
70 |
71 |
72 |
73 | {/* Code Section */}
74 |
75 | {isCodeVisible && (
76 |
84 |
85 |
89 | {isCopied ? (
90 |
91 | ) : (
92 |
93 | )}
94 |
95 |
96 |
97 |
98 | {code}
99 |
100 |
101 |
102 | )}
103 |
104 |
105 | );
106 | };
--------------------------------------------------------------------------------
/src/components/sections/ThreeDCard.tsx:
--------------------------------------------------------------------------------
1 | import { motion } from "framer-motion";
2 | import { useState } from "react";
3 |
4 | export const ThreeDCardDemo = () => {
5 | const [rotateX, setRotateX] = useState(0);
6 | const [rotateY, setRotateY] = useState(0);
7 |
8 | const handleMouseMove = (e: React.MouseEvent) => {
9 | const card = e.currentTarget;
10 | const box = card.getBoundingClientRect();
11 | const x = e.clientX - box.left;
12 | const y = e.clientY - box.top;
13 | const centerX = box.width / 2;
14 | const centerY = box.height / 2;
15 | const rotateX = ((y - centerY) / centerY) * 20;
16 | const rotateY = ((centerX - x) / centerX) * 20;
17 |
18 | setRotateX(rotateX);
19 | setRotateY(rotateY);
20 | };
21 |
22 | const handleMouseLeave = () => {
23 | setRotateX(0);
24 | setRotateY(0);
25 | };
26 |
27 | return (
28 |
29 |
30 | {/* Animated border gradient */}
31 |
32 |
33 |
34 | {/* Shiny border effect */}
35 |
38 |
39 | {/* Card content */}
40 |
49 |
50 |
51 |
56 | {/* Image overlay gradient */}
57 |
58 |
59 |
60 | Aurora Borealis
61 |
62 |
63 | Experience the magical dance of the Northern Lights in this
64 | stunning capture of nature's most spectacular light show.
65 |
66 |
67 |
71 | →
72 |
73 |
74 |
75 |
76 |
77 |
78 | );
79 | };
80 |
--------------------------------------------------------------------------------
/src/components/sections/AnimatedBeamSection.tsx:
--------------------------------------------------------------------------------
1 | import React, { forwardRef, useRef } from "react";
2 | import { cn } from "../../lib/utils";
3 | import { AnimatedBeam } from "../ui/animated-beam";
4 |
5 | const Circle = forwardRef<
6 | HTMLDivElement,
7 | { className?: string; children?: React.ReactNode }
8 | >(({ className, children }, ref) => {
9 | return (
10 |
17 | {children}
18 |
19 | );
20 | });
21 |
22 | Circle.displayName = "Circle";
23 |
24 | function AnimatedBeamSection() {
25 | const containerRef = useRef(null);
26 | const div1Ref = useRef(null);
27 | const div2Ref = useRef(null);
28 | const div3Ref = useRef(null);
29 | const div4Ref = useRef(null);
30 | const div5Ref = useRef(null);
31 | const div6Ref = useRef(null);
32 | const div7Ref = useRef(null);
33 |
34 | return (
35 |
36 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 |
60 |
61 |
62 |
63 |
64 |
65 |
66 |
67 |
68 |
69 |
70 |
77 |
82 |
89 |
97 |
103 |
111 |
112 |
113 | );
114 | }
115 |
116 | export { AnimatedBeamSection, Icons };
117 |
--------------------------------------------------------------------------------
/src/components/sections/SaasHero.tsx:
--------------------------------------------------------------------------------
1 | import { motion } from "framer-motion";
2 | import Lottie from "lottie-react";
3 | import { ArrowRight, CheckCircle } from "lucide-react";
4 |
5 | // Import Lottie JSON locally
6 | import analyticsAnimationLight from "../../assets/saas.json";
7 | import analyticsAnimationDark from "../../assets/saasdark.json";
8 |
9 | export const SaasHero = () => {
10 | const features = [
11 | "Real-time analytics dashboard",
12 | "Team collaboration tools",
13 | "Advanced reporting features",
14 | ];
15 |
16 | return (
17 |
18 |
19 |
20 | {/* Left Side Content */}
21 |
26 |
27 | New Features Available
28 |
29 |
30 | Transform Your Business with{" "}
31 | Advanced Analytics
32 |
33 |
34 | Get actionable insights and make data-driven decisions with our
35 | powerful analytics platform.
36 |
37 |
38 | {features.map((feature) => (
39 |
40 |
41 |
42 | {feature}
43 |
44 |
45 | ))}
46 |
47 |
48 |
53 | Get Started
54 |
55 |
56 |
57 | Watch Demo
58 |
59 |
60 |
61 |
62 | {/* Right Side Lottie Animation */}
63 |
69 | {/* Lottie Animation */}
70 |
71 | {/* Light mode Lottie */}
72 |
73 |
77 |
78 |
79 | {/* Dark mode Lottie */}
80 |
81 |
85 |
86 |
87 |
88 |
89 |
90 |
91 | );
92 | };
93 |
--------------------------------------------------------------------------------
/src/components/Footer/FooterNewsletter.tsx:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import { motion } from 'framer-motion';
3 | import { Mail, ArrowRight, Heart } from 'lucide-react';
4 | import { Logo } from '../Header/Logo';
5 |
6 | export const FooterNewsletter = () => {
7 | return (
8 |
9 |
10 |
11 |
12 |
13 |
14 | Join 10,000+ developers who get our weekly newsletter with new components and resources! ✨
15 |
16 |
36 |
37 |
55 |
56 |
57 |
58 | Made with by Buildeasy Team
59 |
60 |
68 |
69 |
70 |
71 | );
72 | };
--------------------------------------------------------------------------------
/tailwind.config.js:
--------------------------------------------------------------------------------
1 | /** @type {import('tailwindcss').Config} */
2 | export default {
3 | content: ["./index.html", "./src/**/*.{ts,tsx,js,jsx}"],
4 | darkMode: 'class',
5 | theme: {
6 | container: {
7 | center: true,
8 | padding: "2rem",
9 | screens: {
10 | "2xl": "1400px",
11 | },
12 | },
13 | extend: {
14 | colors: {
15 | border: "color-mix(in srgb, var(--border) 100%, transparent)",
16 | input: "color-mix(in srgb, var(--input) 100%, transparent)",
17 | ring: "color-mix(in srgb, var(--ring) 100%, transparent)",
18 | background: "color-mix(in srgb, var(--background) 100%, transparent)",
19 | foreground: "color-mix(in srgb, var(--foreground) 100%, transparent)",
20 | primary: {
21 | DEFAULT: "color-mix(in srgb, var(--primary) 100%, transparent)",
22 | foreground: "color-mix(in srgb, var(--primary-foreground) 100%, transparent)",
23 | 50: "#f0f9ff",
24 | 100: "#e0f2fe",
25 | 200: "#bae6fd",
26 | 300: "#7dd3fc",
27 | 400: "#38bdf8",
28 | 500: "#0ea5e9",
29 | 600: "#0284c7",
30 | 700: "#0369a1",
31 | 800: "#075985",
32 | 900: "#0c4a6e",
33 | },
34 | secondary: {
35 | DEFAULT: "color-mix(in srgb, var(--secondary) 100%, transparent)",
36 | foreground: "color-mix(in srgb, var(--secondary-foreground) 100%, transparent)",
37 | 50: "#f5f3ff",
38 | 100: "#ede9fe",
39 | 200: "#ddd6fe",
40 | 300: "#c4b5fd",
41 | 400: "#a78bfa",
42 | 500: "#8b5cf6",
43 | 600: "#7c3aed",
44 | 700: "#6d28d9",
45 | 800: "#5b21b6",
46 | 900: "#4c1d95",
47 | },
48 | destructive: {
49 | DEFAULT: "color-mix(in srgb, var(--destructive) 100%, transparent)",
50 | foreground: "color-mix(in srgb, var(--destructive-foreground) 100%, transparent)",
51 | },
52 | muted: {
53 | DEFAULT: "color-mix(in srgb, var(--muted) 100%, transparent)",
54 | foreground: "color-mix(in srgb, var(--muted-foreground) 100%, transparent)",
55 | },
56 | accent: {
57 | DEFAULT: "color-mix(in srgb, var(--accent) 100%, transparent)",
58 | foreground: "color-mix(in srgb, var(--accent-foreground) 100%, transparent)",
59 | },
60 | popover: {
61 | DEFAULT: "color-mix(in srgb, var(--popover) 100%, transparent)",
62 | foreground: "color-mix(in srgb, var(--popover-foreground) 100%, transparent)",
63 | },
64 | card: {
65 | DEFAULT: "color-mix(in srgb, var(--card) 100%, transparent)",
66 | foreground: "color-mix(in srgb, var(--card-foreground) 100%, transparent)",
67 | },
68 | },
69 | borderRadius: {
70 | lg: "var(--radius)",
71 | md: "calc(var(--radius) - 2px)",
72 | sm: "calc(var(--radius) - 4px)",
73 | },
74 | animation: {
75 | marquee: "marquee 25s linear infinite",
76 | "marquee-reverse": "marquee-reverse 25s linear infinite",
77 | gradient: "gradient 8s linear infinite",
78 | "spin-gradient": "spin-gradient 6s linear infinite",
79 | },
80 | keyframes: {
81 | marquee: {
82 | "0%": { transform: "translateX(0%)" },
83 | "100%": { transform: "translateX(-100%)" },
84 | },
85 | "marquee-reverse": {
86 | "0%": { transform: "translateX(-100%)" },
87 | "100%": { transform: "translateX(0%)" },
88 | },
89 | gradient: {
90 | "0%, 100%": {
91 | "background-size": "200% 200%",
92 | "background-position": "left center",
93 | },
94 | "50%": {
95 | "background-size": "200% 200%",
96 | "background-position": "right center",
97 | },
98 | },
99 | "spin-gradient": {
100 | "0%": {
101 | backgroundPosition: "0% 50%",
102 | },
103 | "100%": {
104 | backgroundPosition: "100% 50%",
105 | },
106 | },
107 | },
108 | },
109 | },
110 | plugins: [],
111 | };
112 |
--------------------------------------------------------------------------------
/src/components/sections/PricingTables.tsx:
--------------------------------------------------------------------------------
1 | import { motion } from 'framer-motion';
2 | import { Check } from 'lucide-react';
3 |
4 | export const PricingTables = () => {
5 | return (
6 |
7 |
8 |
Pricing Tables
9 |
10 | {/* Modern Pricing Grid */}
11 |
12 | {/* Basic Plan */}
13 |
19 | Basic
20 |
21 | $9
22 | /month
23 |
24 |
25 | {['5 Projects', '10GB Storage', 'Basic Support'].map((feature) => (
26 |
27 |
28 | {feature}
29 |
30 | ))}
31 |
32 |
33 | Get Started
34 |
35 |
36 |
37 | {/* Pro Plan */}
38 |
44 |
45 | Popular
46 |
47 | Pro
48 |
49 | $29
50 | /month
51 |
52 |
53 | {['15 Projects', '50GB Storage', 'Priority Support', 'Advanced Features'].map((feature) => (
54 |
55 |
56 | {feature}
57 |
58 | ))}
59 |
60 |
61 | Get Started
62 |
63 |
64 |
65 | {/* Enterprise Plan */}
66 |
72 | Enterprise
73 |
74 | $99
75 | /month
76 |
77 |
78 | {['Unlimited Projects', 'Unlimited Storage', '24/7 Support', 'Custom Features'].map((feature) => (
79 |
80 |
81 | {feature}
82 |
83 | ))}
84 |
85 |
86 | Contact Sales
87 |
88 |
89 |
90 |
91 |
92 | );
93 | };
--------------------------------------------------------------------------------
/src/components/sections/MarqueeImages2.tsx:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import { motion } from 'framer-motion';
3 |
4 | const images = [
5 | "https://images.unsplash.com/photo-1531297484001-80022131f5a1?w=800&h=400&fit=crop",
6 | "https://images.unsplash.com/photo-1488590528505-98d2b5aba04b?w=800&h=400&fit=crop",
7 | "https://images.unsplash.com/photo-1498050108023-c5249f4df085?w=800&h=400&fit=crop",
8 | "https://images.unsplash.com/photo-1504639725590-34d0984388bd?w=800&h=400&fit=crop",
9 | "https://images.unsplash.com/photo-1461749280684-dccba630e2f6?w=800&h=400&fit=crop",
10 | "https://images.unsplash.com/photo-1504384308090-c894fdcc538d?w=800&h=400&fit=crop",
11 | "https://images.unsplash.com/photo-1531297484001-80022131f5a1?w=800&h=400&fit=crop",
12 | "https://images.unsplash.com/photo-1488590528505-98d2b5aba04b?w=800&h=400&fit=crop",
13 | "https://images.unsplash.com/photo-1498050108023-c5249f4df085?w=800&h=400&fit=crop",
14 | "https://images.unsplash.com/photo-1504639725590-34d0984388bd?w=800&h=400&fit=crop",
15 | "https://images.unsplash.com/photo-1461749280684-dccba630e2f6?w=800&h=400&fit=crop",
16 | "https://images.unsplash.com/photo-1504384308090-c894fdcc538d?w=800&h=400&fit=crop",
17 | "https://images.unsplash.com/photo-1531297484001-80022131f5a1?w=800&h=400&fit=crop",
18 | "https://images.unsplash.com/photo-1488590528505-98d2b5aba04b?w=800&h=400&fit=crop",
19 | "https://images.unsplash.com/photo-1498050108023-c5249f4df085?w=800&h=400&fit=crop",
20 | "https://images.unsplash.com/photo-1504639725590-34d0984388bd?w=800&h=400&fit=crop",
21 | "https://images.unsplash.com/photo-1461749280684-dccba630e2f6?w=800&h=400&fit=crop",
22 | "https://images.unsplash.com/photo-1504384308090-c894fdcc538d?w=800&h=400&fit=crop",
23 | ];
24 |
25 | const ImageComponent = ({ src, alt }: { src: string; alt: string }) => (
26 |
30 |
37 |
38 | );
39 |
40 | export const MarqueeImages2 = () => {
41 | return (
42 |
45 |
46 | {/* First row */}
47 |
48 |
62 | {[...images, ...images, ...images].map((image, index) => (
63 |
68 | ))}
69 |
70 |
71 |
72 | {/* Second row - reverse direction */}
73 |
74 |
88 | {[...images, ...images, ...images].map((image, index) => (
89 |
94 | ))}
95 |
96 |
97 |
98 |
99 | );
100 | }
--------------------------------------------------------------------------------
/src/components/sections/EcommerceSlider.tsx:
--------------------------------------------------------------------------------
1 | import { useRef } from "react";
2 |
3 | const products = [
4 | {
5 | id: 1,
6 | name: "Milk Chocolate Bar",
7 | href: "",
8 | imageSrc:
9 | "https://plus.unsplash.com/premium_photo-1675283825474-390ea83c0703?q=80&w=2940&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D",
10 | imageAlt: "Delicious milk chocolate bar.",
11 | price: "$5",
12 | color: "Milk Chocolate",
13 | },
14 | {
15 | id: 2,
16 | name: "Dark Chocolate Truffles",
17 | href: "",
18 | imageSrc:
19 | "https://www.happyfoodstube.com/wp-content/uploads/2016/12/dark-chocolate-truffles-6.jpg",
20 | imageAlt: "Gourmet dark chocolate truffles.",
21 | price: "$12",
22 | color: "Dark Chocolate",
23 | },
24 | {
25 | id: 3,
26 | name: "White Chocolate Bark",
27 | href: "",
28 | imageSrc:
29 | "https://milkhousechocolates.net/cdn/shop/files/WhiteChocolatePeppermintBarkforweb4_1200x1200.jpg?v=1695243013",
30 | imageAlt: "White chocolate bark with nuts and fruits.",
31 | price: "$8",
32 | color: "White Chocolate",
33 | },
34 | {
35 | id: 4,
36 | name: "Assorted Chocolate Box",
37 | href: "",
38 | imageSrc:
39 | "https://www.li-lacchocolates.com/cdn/shop/files/ThanksgivingBox20_2000x1500_8a31c1a6-8b5b-4f4b-91d1-891dfb183e45.jpg?v=1695077708",
40 | imageAlt: "Premium assorted chocolate box.",
41 | price: "$25",
42 | color: "Assorted",
43 | },
44 | {
45 | id: 5,
46 | name: "Hazelnut Chocolate",
47 | href: "",
48 | imageSrc:
49 | "https://harvestcraftchocolate.com/cdn/shop/files/IMG_3158.heic?v=1725981510&width=1445",
50 | imageAlt: "Creamy hazelnut chocolate bar.",
51 | price: "$7",
52 | color: "Hazelnut Chocolate",
53 | },
54 | {
55 | id: 6,
56 | name: "Belgian Chocolate Box",
57 | href: "",
58 | imageSrc:
59 | "https://media-cdn2.greatbritishchefs.com/media/5t2bqaen/history-of-belgian-chocolate-guylian.whqc_1426x713q80.jpg",
60 | imageAlt: "Assorted Belgian chocolate box.",
61 | price: "$30",
62 | color: "Belgian Chocolate",
63 | },
64 | {
65 | id: 7,
66 | name: "Caramel Chocolate Bar",
67 | href: "",
68 | imageSrc:
69 | "https://itsallgoodvegan.com/wp-content/uploads/2020/05/IMG_4365.jpg",
70 | imageAlt: "Caramel-filled chocolate bar.",
71 | price: "$10",
72 | color: "Caramel Chocolate",
73 | },
74 | {
75 | id: 8,
76 | name: "Mint Chocolate Bar",
77 | href: "",
78 | imageSrc:
79 | "https://robard.com/wp-content/uploads/2024/08/ChocolateMintBar-wCocolate.jpg.webp",
80 | imageAlt: "Refreshing mint chocolate bar.",
81 | price: "$9",
82 | color: "Mint Chocolate",
83 | },
84 | ];
85 |
86 | export default function EcommerceCarousel() {
87 | return (
88 |
89 |
90 |
91 | Customers also purchased
92 |
93 |
94 | {/* Carousel Container */}
95 |
96 | {products.map((product) => (
97 |
101 |
106 |
107 |
110 |
{product.color}
111 |
112 | {product.price}
113 |
114 |
115 |
116 | ))}
117 |
118 |
119 | Slide to see more
120 |
121 |
122 |
123 |
124 | );
125 | }
126 |
--------------------------------------------------------------------------------
/src/components/sections/LogoTicker.tsx:
--------------------------------------------------------------------------------
1 | type LogoProps = {
2 | src: string;
3 | alt: string;
4 | };
5 |
6 | function Logo({ src, alt }: LogoProps) {
7 | if (!src) return null;
8 | return (
9 |
15 | );
16 | }
17 |
18 | export default function LogoSlider() {
19 | const logos = [
20 | "https://purepng.com/public/uploads/large/purepng.com-mcdonalds-logologobrand-logoiconslogos-251519940596lmu2a.png",
21 | "https://purepng.com/public/uploads/large/purepng.com-mcdonalds-logologobrand-logoiconslogos-251519940596lmu2a.png",
22 | "https://purepng.com/public/uploads/large/purepng.com-mcdonalds-logologobrand-logoiconslogos-251519940596lmu2a.png",
23 | "https://purepng.com/public/uploads/large/purepng.com-mcdonalds-logologobrand-logoiconslogos-251519940596lmu2a.png",
24 | "https://purepng.com/public/uploads/large/purepng.com-mcdonalds-logologobrand-logoiconslogos-251519940596lmu2a.png",
25 | "https://purepng.com/public/uploads/large/purepng.com-mcdonalds-logologobrand-logoiconslogos-251519940596lmu2a.png",
26 | "https://purepng.com/public/uploads/large/purepng.com-mcdonalds-logologobrand-logoiconslogos-251519940596lmu2a.png",
27 | "https://purepng.com/public/uploads/large/purepng.com-mcdonalds-logologobrand-logoiconslogos-251519940596lmu2a.png",
28 | "https://purepng.com/public/uploads/large/purepng.com-mcdonalds-logologobrand-logoiconslogos-251519940596lmu2a.png",
29 | "https://purepng.com/public/uploads/large/purepng.com-mcdonalds-logologobrand-logoiconslogos-251519940596lmu2a.png",
30 | "https://purepng.com/public/uploads/large/purepng.com-mcdonalds-logologobrand-logoiconslogos-251519940596lmu2a.png",
31 | "https://purepng.com/public/uploads/large/purepng.com-mcdonalds-logologobrand-logoiconslogos-251519940596lmu2a.png",
32 | "https://purepng.com/public/uploads/large/purepng.com-mcdonalds-logologobrand-logoiconslogos-251519940596lmu2a.png",
33 | "https://purepng.com/public/uploads/large/purepng.com-mcdonalds-logologobrand-logoiconslogos-251519940596lmu2a.png",
34 | "https://purepng.com/public/uploads/large/purepng.com-mcdonalds-logologobrand-logoiconslogos-251519940596lmu2a.png",
35 | "https://purepng.com/public/uploads/large/purepng.com-mcdonalds-logologobrand-logoiconslogos-251519940596lmu2a.png",
36 | "https://purepng.com/public/uploads/large/purepng.com-mcdonalds-logologobrand-logoiconslogos-251519940596lmu2a.png",
37 | "https://purepng.com/public/uploads/large/purepng.com-mcdonalds-logologobrand-logoiconslogos-251519940596lmu2a.png",
38 | "https://purepng.com/public/uploads/large/purepng.com-mcdonalds-logologobrand-logoiconslogos-251519940596lmu2a.png",
39 | "https://purepng.com/public/uploads/large/purepng.com-mcdonalds-logologobrand-logoiconslogos-251519940596lmu2a.png",
40 | "https://purepng.com/public/uploads/large/purepng.com-mcdonalds-logologobrand-logoiconslogos-251519940596lmu2a.png",
41 | ];
42 |
43 | const repeatedLogos = [...Array(2)].flatMap(() => logos);
44 |
45 | return (
46 |
47 |
48 |
49 | Trusted by
50 |
51 |
52 | {/* Slider 1: Left to Right */}
53 |
57 |
58 | {repeatedLogos.map((src, index) => (
59 |
64 | ))}
65 |
66 |
67 |
68 | {/* Slider 2: Right to Left */}
69 |
73 |
74 | {repeatedLogos.map((src, index) => (
75 |
80 | ))}
81 |
82 |
83 |
84 |
85 | );
86 | }
87 |
--------------------------------------------------------------------------------
/src/components/sections/ParticleField.tsx:
--------------------------------------------------------------------------------
1 | import { useEffect, useRef } from "react";
2 | import { motion } from "framer-motion";
3 |
4 | interface Particle {
5 | x: number;
6 | y: number;
7 | radius: number;
8 | vx: number;
9 | vy: number;
10 | color: string;
11 | }
12 |
13 | export const ParticleField = () => {
14 | const canvasRef = useRef(null);
15 |
16 | useEffect(() => {
17 | const canvas = canvasRef.current;
18 | if (!canvas) return;
19 |
20 | const ctx = canvas.getContext("2d");
21 | if (!ctx) return;
22 |
23 | let animationFrameId: number;
24 | let particles: Particle[] = [];
25 | const particleCount = 50;
26 | const colors = ["#ffffff", "#e5e5e5", "#d4d4d4"];
27 | const maxDistance = 150;
28 |
29 | const resize = () => {
30 | canvas.width = canvas.offsetWidth;
31 | canvas.height = canvas.offsetHeight;
32 | initParticles();
33 | };
34 |
35 | const initParticles = () => {
36 | particles = [];
37 | for (let i = 0; i < particleCount; i++) {
38 | particles.push({
39 | x: Math.random() * canvas.width,
40 | y: Math.random() * canvas.height,
41 | radius: Math.random() * 2 + 1,
42 | vx: (Math.random() - 0.5) * 0.5,
43 | vy: (Math.random() - 0.5) * 0.5,
44 | color: colors[Math.floor(Math.random() * colors.length)],
45 | });
46 | }
47 | };
48 |
49 | const drawParticle = (particle: Particle) => {
50 | ctx.beginPath();
51 | ctx.arc(particle.x, particle.y, particle.radius, 0, Math.PI * 2);
52 | ctx.fillStyle = particle.color;
53 | ctx.fill();
54 | };
55 |
56 | const drawConnections = () => {
57 | for (let i = 0; i < particles.length; i++) {
58 | for (let j = i + 1; j < particles.length; j++) {
59 | const dx = particles[i].x - particles[j].x;
60 | const dy = particles[i].y - particles[j].y;
61 | const distance = Math.sqrt(dx * dx + dy * dy);
62 |
63 | if (distance < maxDistance) {
64 | ctx.beginPath();
65 | ctx.strokeStyle = `rgba(255, 255, 255, ${
66 | (1 - distance / maxDistance) * 0.15
67 | })`;
68 | ctx.lineWidth = 0.5;
69 | ctx.moveTo(particles[i].x, particles[i].y);
70 | ctx.lineTo(particles[j].x, particles[j].y);
71 | ctx.stroke();
72 | }
73 | }
74 | }
75 | };
76 |
77 | const animate = () => {
78 | ctx.clearRect(0, 0, canvas.width, canvas.height);
79 |
80 | particles.forEach((particle) => {
81 | particle.x += particle.vx;
82 | particle.y += particle.vy;
83 |
84 | if (particle.x < 0 || particle.x > canvas.width) particle.vx *= -1;
85 | if (particle.y < 0 || particle.y > canvas.height) particle.vy *= -1;
86 |
87 | drawParticle(particle);
88 | });
89 |
90 | drawConnections();
91 | animationFrameId = requestAnimationFrame(animate);
92 | };
93 |
94 | resize();
95 | animate();
96 |
97 | window.addEventListener("resize", resize);
98 |
99 | return () => {
100 | window.removeEventListener("resize", resize);
101 | cancelAnimationFrame(animationFrameId);
102 | };
103 | }, []);
104 |
105 | return (
106 |
107 |
111 |
112 |
118 | Particle Field
119 |
120 |
126 | Interactive particle system with dynamic connections and smooth
127 | animations
128 |
129 |
130 |
131 | );
132 | };
133 |
--------------------------------------------------------------------------------
/src/components/sections/MarqueeLogo.tsx:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import { motion } from 'framer-motion';
3 |
4 | const logos = [
5 | "https://upload.wikimedia.org/wikipedia/commons/thumb/0/08/Netflix_2015_logo.svg/1024px-Netflix_2015_logo.svg.png",
6 | "https://upload.wikimedia.org/wikipedia/commons/thumb/2/2f/Google_2015_logo.svg/1200px-Google_2015_logo.svg.png",
7 | "https://www.logo.wine/a/logo/Instagram/Instagram-Wordmark-Logo.wine.svg",
8 | "https://upload.wikimedia.org/wikipedia/commons/thumb/e/e1/Logo_of_YouTube_%282015-2017%29.svg/2560px-Logo_of_YouTube_%282015-2017%29.svg.png",
9 | "https://cdn.freelogovectors.net/wp-content/uploads/2023/09/next-js-logo-freelogovectors.net_.png",
10 | "https://1000logos.net/wp-content/uploads/2017/03/Nike-Logo-1971-now.png",
11 | "https://download.logo.wine/logo/Porsche/Porsche-Logo.wine.png",
12 | "https://upload.wikimedia.org/wikipedia/commons/thumb/0/08/Netflix_2015_logo.svg/1024px-Netflix_2015_logo.svg.png",
13 | "https://upload.wikimedia.org/wikipedia/commons/thumb/2/2f/Google_2015_logo.svg/1200px-Google_2015_logo.svg.png",
14 | "https://www.logo.wine/a/logo/Instagram/Instagram-Wordmark-Logo.wine.svg",
15 | "https://upload.wikimedia.org/wikipedia/commons/thumb/e/e1/Logo_of_YouTube_%282015-2017%29.svg/2560px-Logo_of_YouTube_%282015-2017%29.svg.png",
16 | "https://cdn.freelogovectors.net/wp-content/uploads/2023/09/next-js-logo-freelogovectors.net_.png",
17 | "https://1000logos.net/wp-content/uploads/2017/03/Nike-Logo-1971-now.png",
18 | "https://download.logo.wine/logo/Porsche/Porsche-Logo.wine.png",
19 | "https://upload.wikimedia.org/wikipedia/commons/thumb/0/08/Netflix_2015_logo.svg/1024px-Netflix_2015_logo.svg.png",
20 | "https://upload.wikimedia.org/wikipedia/commons/thumb/2/2f/Google_2015_logo.svg/1200px-Google_2015_logo.svg.png",
21 | "https://www.logo.wine/a/logo/Instagram/Instagram-Wordmark-Logo.wine.svg",
22 | "https://upload.wikimedia.org/wikipedia/commons/thumb/e/e1/Logo_of_YouTube_%282015-2017%29.svg/2560px-Logo_of_YouTube_%282015-2017%29.svg.png",
23 | "https://cdn.freelogovectors.net/wp-content/uploads/2023/09/next-js-logo-freelogovectors.net_.png",
24 | "https://1000logos.net/wp-content/uploads/2017/03/Nike-Logo-1971-now.png",
25 | "https://download.logo.wine/logo/Porsche/Porsche-Logo.wine.png",
26 | ];
27 |
28 | const LogoComponent = ({ src, index }: { src: string; index: number }) => (
29 |
33 |
39 |
40 | );
41 |
42 | export const MarqueeLogo = () => {
43 | return (
44 |
47 |
48 | {/* First row */}
49 |
50 |
64 | {[...logos, ...logos, ...logos].map((logo, index) => (
65 |
66 | ))}
67 |
68 |
69 |
70 | {/* Second row - reverse direction */}
71 |
72 |
86 | {[...logos, ...logos, ...logos].map((logo, index) => (
87 |
88 | ))}
89 |
90 |
91 |
92 |
93 | );
94 | }
--------------------------------------------------------------------------------
/src/components/sections/WavyBackground.tsx:
--------------------------------------------------------------------------------
1 | import { useEffect, useRef } from "react";
2 | import { motion } from "framer-motion";
3 |
4 | export const WavyBackground = () => {
5 | const canvasRef = useRef(null);
6 |
7 | useEffect(() => {
8 | const canvas = canvasRef.current;
9 | if (!canvas) return;
10 |
11 | const ctx = canvas.getContext("2d");
12 | if (!ctx) return;
13 |
14 | let animationFrameId: number;
15 | let time = 0;
16 |
17 | const resize = () => {
18 | canvas.width = canvas.offsetWidth;
19 | canvas.height = canvas.offsetHeight;
20 | };
21 |
22 | const drawWave = (
23 | offset: number,
24 | amplitude: number,
25 | frequency: number,
26 | color: string,
27 | blur: number = 4
28 | ) => {
29 | ctx.beginPath();
30 | ctx.moveTo(0, canvas.height / 2);
31 |
32 | // Create more complex wave pattern
33 | for (let x = 0; x < canvas.width; x++) {
34 | const mainWave =
35 | Math.sin((x * frequency + time + offset) * 0.02) * amplitude;
36 | const secondaryWave =
37 | Math.sin((x * frequency * 2 + time) * 0.01) * (amplitude * 0.3);
38 | const y = mainWave + secondaryWave + canvas.height / 2;
39 | ctx.lineTo(x, y);
40 | }
41 |
42 | // Main wave
43 | ctx.strokeStyle = color;
44 | ctx.lineWidth = 1.5;
45 | ctx.stroke();
46 |
47 | // Glow effect
48 | ctx.save();
49 | ctx.filter = `blur(${blur}px)`;
50 | ctx.globalAlpha = 0.2;
51 | ctx.strokeStyle = color;
52 | ctx.lineWidth = 2;
53 | ctx.stroke();
54 |
55 | // Additional glow layer
56 | ctx.globalAlpha = 0.1;
57 | ctx.filter = `blur(${blur * 2}px)`;
58 | ctx.stroke();
59 | ctx.restore();
60 | };
61 |
62 | const animate = () => {
63 | time += 0.3; // Slower, more graceful movement
64 | ctx.clearRect(0, 0, canvas.width, canvas.height);
65 |
66 | // Background waves (subtle)
67 | drawWave(0, 40, 1.2, "rgba(255, 255, 255, 0.03)", 8);
68 | drawWave(3, 35, 1.3, "rgba(255, 255, 255, 0.04)", 7);
69 |
70 | // Middle layer waves
71 | drawWave(2, 30, 1.5, "rgba(255, 255, 255, 0.08)", 6);
72 | drawWave(4, 25, 1.7, "rgba(255, 255, 255, 0.12)", 5);
73 |
74 | // Foreground waves (more prominent)
75 | drawWave(6, 20, 2.0, "rgba(255, 255, 255, 0.16)", 4);
76 | drawWave(8, 15, 2.2, "rgba(255, 255, 255, 0.20)", 3);
77 |
78 | // Highlight waves
79 | drawWave(10, 10, 2.5, "rgba(255, 255, 255, 0.25)", 2);
80 |
81 | animationFrameId = requestAnimationFrame(animate);
82 | };
83 |
84 | resize();
85 | animate();
86 |
87 | window.addEventListener("resize", resize);
88 |
89 | return () => {
90 | window.removeEventListener("resize", resize);
91 | cancelAnimationFrame(animationFrameId);
92 | };
93 | }, []);
94 |
95 | return (
96 |
97 | {/* Gradient overlays for depth */}
98 |
99 |
100 |
101 | {/* Subtle radial gradient for center focus */}
102 |
103 |
104 |
105 |
106 |
107 |
113 | Wavy Background
114 |
115 |
121 | A beautiful animated background effect that adds depth and movement to
122 | your designs
123 |
124 |
125 |
126 | );
127 | };
128 |
--------------------------------------------------------------------------------
/src/components/sections/GridGallery.tsx:
--------------------------------------------------------------------------------
1 | import { motion } from "framer-motion";
2 | import { Image as LucideImage } from "lucide-react";
3 | import { useState } from "react";
4 | import { cn } from "../../lib/utils";
5 |
6 | interface GalleryImage {
7 | src: string;
8 | aspect: string;
9 | alt?: string;
10 | }
11 |
12 | interface GalleryProps {
13 | images?: GalleryImage[];
14 | title?: string;
15 | className?: string;
16 | }
17 |
18 | const defaultImages: GalleryImage[] = [
19 | {
20 | src: "https://images.unsplash.com/photo-1541336032412-2048a678540d?q=80&w=2787&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D",
21 | aspect: "aspect-[9/16]",
22 | alt: "City skyline at sunset",
23 | },
24 | {
25 | src: "https://plus.unsplash.com/premium_photo-1672082422409-879d79636902?q=80&w=2865&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D",
26 | aspect: "aspect-[9/16]",
27 | alt: "Mountain landscape",
28 | },
29 | {
30 | src: "https://images.unsplash.com/photo-1480714378408-67cf0d13bc1b?q=80&w=2940&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D",
31 | aspect: "aspect-[9/16]",
32 | alt: "Urban architecture",
33 | },
34 | {
35 | src: "https://plus.unsplash.com/premium_photo-1680836316227-ef17dbbcfb27?q=80&w=3027&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D",
36 | aspect: "aspect-[9/16]",
37 | alt: "Nature scene",
38 | },
39 | {
40 | src: "https://images.unsplash.com/photo-1480714378408-67cf0d13bc1b?q=80&w=2940&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D",
41 | aspect: "aspect-[4/3]",
42 | alt: "City view",
43 | },
44 | {
45 | src: "https://images.unsplash.com/photo-1496442226666-8d4d0e62e6e9?q=80&w=2940&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D",
46 | aspect: "aspect-[4/3]",
47 | alt: "Urban landscape",
48 | },
49 | {
50 | src: "https://images.unsplash.com/photo-1485871981521-5b1fd3805eee?q=80&w=2940&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D",
51 | aspect: "aspect-[4/3]",
52 | alt: "City panorama",
53 | },
54 | {
55 | src: "https://images.unsplash.com/photo-1440330033336-7dcff4630cef?q=80&w=2879&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D",
56 | aspect: "aspect-[4/3]",
57 | alt: "Architectural view",
58 | },
59 | ];
60 |
61 | const GalleryImage = ({ image, index }: { image: GalleryImage; index: number }) => {
62 | const [isLoading, setIsLoading] = useState(true);
63 | const [error, setError] = useState(false);
64 |
65 | return (
66 |
75 | {isLoading && (
76 |
77 | )}
78 | {error ? (
79 |
80 |
Failed to load image
81 |
82 | ) : (
83 | setIsLoading(false)}
91 | onError={() => {
92 | setIsLoading(false);
93 | setError(true);
94 | }}
95 | />
96 | )}
97 |
98 | );
99 | };
100 |
101 | export const Gallery = ({ images = defaultImages, title = "Photo Gallery", className }: GalleryProps) => {
102 | return (
103 |
104 |
105 | {title}
106 |
107 |
108 |
109 | {images.map((image, index) => (
110 |
111 | ))}
112 |
113 |
114 | );
115 | };
116 |
117 | export default Gallery;
118 |
--------------------------------------------------------------------------------
/src/components/sections/GalleryExamples.tsx:
--------------------------------------------------------------------------------
1 | "use client";
2 | import { useEffect, useState } from "react";
3 | import { motion, MotionConfig, useMotionTemplate, useSpring } from "framer-motion";
4 | import { ChevronLeft, ChevronRight } from "lucide-react";
5 |
6 |
7 | // Image list for galleries
8 | const images = [
9 | "https://images.unsplash.com/photo-1506744038136-46273834b3fb?w=500&h=300&fit=crop",
10 | "https://images.unsplash.com/photo-1511884642898-4c92249e20b6?w=500&h=300&fit=crop",
11 | "https://images.unsplash.com/photo-1469474968028-56623f02e42e?w=500&h=300&fit=crop",
12 | "https://images.unsplash.com/photo-1501785888041-af3ef285b470?w=500&h=300&fit=crop",
13 | "https://images.unsplash.com/photo-1470071459604-3b5ec3a7fe05?w=500&h=300&fit=crop",
14 | "https://images.unsplash.com/photo-1472214103451-9374bd1c798e?w=500&h=300&fit=crop",
15 | ];
16 |
17 | export const GalleryExamples = () => {
18 | return (
19 |
20 |
21 |
Gallery Examples
22 |
23 | {/* Grid Gallery */}
24 |
25 |
Grid Gallery
26 |
27 | {images.map((image, index) => (
28 |
36 |
41 |
42 | ))}
43 |
44 |
45 |
46 | {/* Masonry Gallery */}
47 |
48 |
Masonry Gallery
49 |
50 | {images.map((image, index) => (
51 |
58 |
63 |
64 | ))}
65 |
66 |
67 |
68 | {/* Carousel */}
69 |
70 |
Image Carousel
71 |
72 |
73 |
74 |
75 | );
76 | };
77 |
78 | // CAROUSEL COMPONENT
79 | function Carousel() {
80 | let [index, setIndex] = useState(0);
81 |
82 | let x = index * 100;
83 | let xSpring = useSpring(x, { bounce: 0 });
84 | let xPercentage = useMotionTemplate`-${xSpring}%`;
85 |
86 | useEffect(() => {
87 | xSpring.set(x);
88 | }, [x, xSpring]);
89 |
90 | return (
91 |
92 |
93 |
94 | {images.map((image, i) => (
95 |
101 | ))}
102 |
103 |
104 | {/* Navigation */}
105 | {index > 0 && (
106 | setIndex(index - 1)}
109 | >
110 |
111 |
112 | )}
113 | {index < images.length - 1 && (
114 | setIndex(index + 1)}
117 | >
118 |
119 |
120 | )}
121 |
122 |
123 | );
124 | }
125 |
--------------------------------------------------------------------------------
/src/components/sections/Ecommerce2.tsx:
--------------------------------------------------------------------------------
1 | import { ShoppingCart } from "lucide-react";
2 |
3 | const products = [
4 | {
5 | id: 1,
6 | name: "Milk Chocolate Bar",
7 | href: "",
8 | imageSrc:
9 | "https://plus.unsplash.com/premium_photo-1675283825474-390ea83c0703?q=80&w=2940&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D",
10 | imageAlt: "Delicious milk chocolate bar.",
11 | price: "$5",
12 | color: "Milk Chocolate",
13 | },
14 | {
15 | id: 2,
16 | name: "Dark Chocolate Truffles",
17 | href: "",
18 | imageSrc:
19 | "https://www.happyfoodstube.com/wp-content/uploads/2016/12/dark-chocolate-truffles-6.jpg",
20 | imageAlt: "Gourmet dark chocolate truffles.",
21 | price: "$12",
22 | color: "Dark Chocolate",
23 | },
24 | {
25 | id: 3,
26 | name: "White Chocolate Bark",
27 | href: "",
28 | imageSrc:
29 | "https://milkhousechocolates.net/cdn/shop/files/WhiteChocolatePeppermintBarkforweb4_1200x1200.jpg?v=1695243013",
30 | imageAlt: "White chocolate bark with nuts and fruits.",
31 | price: "$8",
32 | color: "White Chocolate",
33 | },
34 | {
35 | id: 4,
36 | name: "Assorted Chocolate Box",
37 | href: "",
38 | imageSrc:
39 | "https://www.li-lacchocolates.com/cdn/shop/files/ThanksgivingBox20_2000x1500_8a31c1a6-8b5b-4f4b-91d1-891dfb183e45.jpg?v=1695077708",
40 | imageAlt: "Premium assorted chocolate box.",
41 | price: "$25",
42 | color: "Assorted",
43 | },
44 | {
45 | id: 5,
46 | name: "Hazelnut Chocolate",
47 | href: "",
48 | imageSrc:
49 | "https://harvestcraftchocolate.com/cdn/shop/files/IMG_3158.heic?v=1725981510&width=1445",
50 | imageAlt: "Creamy hazelnut chocolate bar.",
51 | price: "$7",
52 | color: "Hazelnut Chocolate",
53 | },
54 | {
55 | id: 6,
56 | name: "Belgian Chocolate Box",
57 | href: "",
58 | imageSrc:
59 | "https://media-cdn2.greatbritishchefs.com/media/5t2bqaen/history-of-belgian-chocolate-guylian.whqc_1426x713q80.jpg",
60 | imageAlt: "Assorted Belgian chocolate box.",
61 | price: "$30",
62 | color: "Belgian Chocolate",
63 | },
64 | {
65 | id: 7,
66 | name: "Caramel Chocolate Bar",
67 | href: "",
68 | imageSrc:
69 | "https://itsallgoodvegan.com/wp-content/uploads/2020/05/IMG_4365.jpg",
70 | imageAlt: "Caramel-filled chocolate bar.",
71 | price: "$10",
72 | color: "Caramel Chocolate",
73 | },
74 | {
75 | id: 8,
76 | name: "Mint Chocolate Bar",
77 | href: "",
78 | imageSrc:
79 | "https://robard.com/wp-content/uploads/2024/08/ChocolateMintBar-wCocolate.jpg.webp",
80 | imageAlt: "Refreshing mint chocolate bar.",
81 | price: "$9",
82 | color: "Mint Chocolate",
83 | },
84 | ];
85 |
86 | export default function Ecommerce2() {
87 | return (
88 |
89 |
90 |
101 |
102 |
103 | {products.map((product) => (
104 |
105 |
110 |
111 |
112 |
118 |
{product.color}
119 |
120 |
121 | {product.price}
122 |
123 |
124 |
125 |
126 | Add to Cart
127 |
128 |
129 | ))}
130 |
131 |
132 |
133 | );
134 | }
135 |
--------------------------------------------------------------------------------
/src/components/sections/HeaderExamples.tsx:
--------------------------------------------------------------------------------
1 | import { Menu, Search, ShoppingCart, User } from "lucide-react";
2 |
3 | export const HeaderExamples = () => {
4 | return (
5 |
116 | );
117 | };
118 |
--------------------------------------------------------------------------------
/src/components/CursorEffect.tsx:
--------------------------------------------------------------------------------
1 | import { useEffect, useState } from "react";
2 | import { motion, AnimatePresence } from "framer-motion";
3 |
4 | export const CursorEffect = () => {
5 | const [mousePosition, setMousePosition] = useState({ x: 0, y: 0 });
6 | const [particles, setParticles] = useState>([]);
13 |
14 | useEffect(() => {
15 | const updateMousePosition = (e: MouseEvent) => {
16 | setMousePosition({ x: e.clientX, y: e.clientY });
17 | createParticles(e.clientX, e.clientY);
18 | };
19 |
20 | window.addEventListener("mousemove", updateMousePosition);
21 | return () => window.removeEventListener("mousemove", updateMousePosition);
22 | }, []);
23 |
24 | const createParticles = (x: number, y: number) => {
25 | const newParticles = Array.from({ length: 3 }).map(() => ({
26 | x,
27 | y,
28 | angle: Math.random() * Math.PI * 2,
29 | speed: Math.random() * 2 + 1,
30 | id: Date.now() + Math.random(),
31 | }));
32 |
33 | setParticles((prev) => [...prev.slice(-25), ...newParticles]);
34 | };
35 |
36 | return (
37 |
38 | {/* Outer glow */}
39 |
63 |
64 | {/* Main cursor ring */}
65 |
84 |
85 | {/* Inner cursor dot */}
86 |
104 |
105 | {/* Particle effects */}
106 |
107 | {particles.map((particle) => (
108 |
137 | ))}
138 |
139 |
140 | {/* Magnetic field effect */}
141 |
180 |
181 | );
182 | };
--------------------------------------------------------------------------------
/src/components/ui/sidebar.tsx:
--------------------------------------------------------------------------------
1 | "use client";
2 |
3 | import { cn } from "../../lib/utils";
4 | import { Link, LinkProps } from "react-router-dom";
5 | import React, { useState, createContext, useContext } from "react";
6 | import { AnimatePresence, motion } from "framer-motion";
7 | import { Menu, X } from "lucide-react";
8 |
9 | interface Links {
10 | label: string;
11 | href: string;
12 | icon: React.JSX.Element | React.ReactNode;
13 | }
14 |
15 | interface SidebarContextProps {
16 | open: boolean;
17 | setOpen: React.Dispatch>;
18 | animate: boolean;
19 | }
20 |
21 | const SidebarContext = createContext(
22 | undefined
23 | );
24 |
25 | export const useSidebar = () => {
26 | const context = useContext(SidebarContext);
27 | if (!context) {
28 | throw new Error("useSidebar must be used within a SidebarProvider");
29 | }
30 | return context;
31 | };
32 |
33 | export const SidebarProvider = ({
34 | children,
35 | open: openProp,
36 | setOpen: setOpenProp,
37 | animate = true,
38 | }: {
39 | children: React.ReactNode;
40 | open?: boolean;
41 | setOpen?: React.Dispatch>;
42 | animate?: boolean;
43 | }) => {
44 | const [openState, setOpenState] = useState(false);
45 |
46 | const open = openProp !== undefined ? openProp : openState;
47 | const setOpen = setOpenProp !== undefined ? setOpenProp : setOpenState;
48 |
49 | return (
50 |
51 | {children}
52 |
53 | );
54 | };
55 |
56 | export const Sidebar = ({
57 | children,
58 | open,
59 | setOpen,
60 | animate,
61 | }: {
62 | children: React.ReactNode;
63 | open?: boolean;
64 | setOpen?: React.Dispatch>;
65 | animate?: boolean;
66 | }) => {
67 | return (
68 |
69 | {children}
70 |
71 | );
72 | };
73 |
74 | export const SidebarBody = (props: React.ComponentProps) => {
75 | return (
76 | <>
77 |
78 | )} />
79 | >
80 | );
81 | };
82 |
83 | export const DesktopSidebar = ({
84 | className,
85 | children,
86 | ...props
87 | }: React.ComponentProps) => {
88 | const { open, setOpen, animate } = useSidebar();
89 | return (
90 | setOpen(true)}
99 | onMouseLeave={() => setOpen(false)}
100 | {...props}
101 | >
102 | {children}
103 |
104 | );
105 | };
106 |
107 | export const MobileSidebar = ({
108 | className,
109 | children,
110 | ...props
111 | }: React.ComponentProps<"div">) => {
112 | const { open, setOpen } = useSidebar();
113 | return (
114 | <>
115 |
121 |
122 |
setOpen(!open)}
125 | />
126 |
127 |
128 | {open && (
129 |
142 | setOpen(!open)}
145 | >
146 |
147 |
148 | {children}
149 |
150 | )}
151 |
152 |
153 | >
154 | );
155 | };
156 |
157 | export const SidebarLink = ({
158 | link,
159 | className,
160 | ...props
161 | }: {
162 | link: Links;
163 | className?: string;
164 | props?: LinkProps;
165 | }) => {
166 | const { open, animate } = useSidebar();
167 | return (
168 |
176 | {link.icon}
177 |
184 | {link.label}
185 |
186 |
187 | );
188 | };
--------------------------------------------------------------------------------
/src/components/ComponentSidebar.tsx:
--------------------------------------------------------------------------------
1 | import { useState } from "react";
2 | import { Search } from "lucide-react";
3 | import { Link } from "react-router-dom";
4 | import { motion, AnimatePresence } from "framer-motion";
5 |
6 | interface SidebarProps {
7 | components: { title: string }[];
8 | activeSection: string;
9 | }
10 |
11 | export const ComponentSidebar = ({
12 | components,
13 | activeSection,
14 | }: SidebarProps) => {
15 | const [searchQuery, setSearchQuery] = useState("");
16 | const [isMobileOpen, setIsMobileOpen] = useState(false);
17 |
18 | const filteredComponents = components.filter(component =>
19 | component.title.toLowerCase().includes(searchQuery.toLowerCase())
20 | );
21 |
22 | const normalizeTitle = (title: string) =>
23 | title.replace(/\s+/g, "-").toLowerCase();
24 |
25 | const handleComponentClick = (e: React.MouseEvent, title: string) => {
26 | e.preventDefault();
27 | const targetId = normalizeTitle(title);
28 | const element = document.getElementById(targetId);
29 |
30 | if (element) {
31 | const yOffset = -100; // Adjust this value based on your header height
32 | const y = element.getBoundingClientRect().top + window.pageYOffset + yOffset;
33 | window.scrollTo({ top: y, behavior: "smooth" });
34 | setIsMobileOpen(false);
35 | }
36 | };
37 |
38 | const SidebarContent = () => (
39 | <>
40 | {/* Header */}
41 |
42 |
46 |
47 | {/* Search */}
48 |
49 |
50 | setSearchQuery(e.target.value)}
55 | className="w-full pl-10 pr-4 py-2 bg-gray-100 dark:bg-gray-900/50 border border-gray-200 dark:border-gray-800/50 rounded-xl text-gray-900 dark:text-gray-300 placeholder-gray-400 dark:placeholder-gray-500 focus:outline-none focus:ring-2 focus:ring-primary-500/20"
56 | />
57 |
58 |
59 |
60 | {/* Navigation */}
61 |
79 |
80 | {/* Footer */}
81 |
82 | setIsMobileOpen(false)}
85 | className="block px-4 py-2 rounded-lg text-gray-600 hover:text-gray-900 dark:text-gray-400 dark:hover:text-gray-200 hover:bg-gray-100 dark:hover:bg-gray-800/50 transition-all duration-200"
86 | >
87 | Documentation
88 |
89 |
90 | >
91 | );
92 |
93 | return (
94 | <>
95 | {/* Mobile Menu Button */}
96 | setIsMobileOpen(true)}
98 | className="lg:hidden fixed right-4 top-20 z-50 p-3 rounded-xl bg-white dark:bg-gray-900 border border-gray-200 dark:border-gray-800 shadow-lg"
99 | >
100 |
101 |
102 |
103 | {/* Mobile Sidebar */}
104 |
105 | {isMobileOpen && (
106 | <>
107 | setIsMobileOpen(false)}
113 | />
114 |
120 |
121 |
122 | >
123 | )}
124 |
125 |
126 | {/* Desktop Sidebar */}
127 |
132 |
133 |
134 | >
135 | );
136 | };
137 |
--------------------------------------------------------------------------------
/src/components/ui/animated-beam.tsx:
--------------------------------------------------------------------------------
1 | "use client";
2 |
3 | import { motion } from "framer-motion";
4 | import { RefObject, useEffect, useId, useState } from "react";
5 |
6 | import { cn } from "../../lib/utils";
7 |
8 | export interface AnimatedBeamProps {
9 | className?: string;
10 | containerRef: RefObject; // Container ref
11 | fromRef: RefObject;
12 | toRef: RefObject;
13 | curvature?: number;
14 | reverse?: boolean;
15 | pathColor?: string;
16 | pathWidth?: number;
17 | pathOpacity?: number;
18 | gradientStartColor?: string;
19 | gradientStopColor?: string;
20 | delay?: number;
21 | duration?: number;
22 | startXOffset?: number;
23 | startYOffset?: number;
24 | endXOffset?: number;
25 | endYOffset?: number;
26 | }
27 |
28 | export const AnimatedBeam: React.FC = ({
29 | className,
30 | containerRef,
31 | fromRef,
32 | toRef,
33 | curvature = 0,
34 | reverse = false, // Include the reverse prop
35 | duration = Math.random() * 3 + 4,
36 | delay = 0,
37 | pathColor = "gray",
38 | pathWidth = 2,
39 | pathOpacity = 0.2,
40 | gradientStartColor = "#ffaa40",
41 | gradientStopColor = "#9c40ff",
42 | startXOffset = 0,
43 | startYOffset = 0,
44 | endXOffset = 0,
45 | endYOffset = 0,
46 | }) => {
47 | const id = useId();
48 | const [pathD, setPathD] = useState("");
49 | const [svgDimensions, setSvgDimensions] = useState({ width: 0, height: 0 });
50 |
51 | // Calculate the gradient coordinates based on the reverse prop
52 | const gradientCoordinates = reverse
53 | ? {
54 | x1: ["90%", "-10%"],
55 | x2: ["100%", "0%"],
56 | y1: ["0%", "0%"],
57 | y2: ["0%", "0%"],
58 | }
59 | : {
60 | x1: ["10%", "110%"],
61 | x2: ["0%", "100%"],
62 | y1: ["0%", "0%"],
63 | y2: ["0%", "0%"],
64 | };
65 |
66 | useEffect(() => {
67 | const updatePath = () => {
68 | if (containerRef.current && fromRef.current && toRef.current) {
69 | const containerRect = containerRef.current.getBoundingClientRect();
70 | const rectA = fromRef.current.getBoundingClientRect();
71 | const rectB = toRef.current.getBoundingClientRect();
72 |
73 | const svgWidth = containerRect.width;
74 | const svgHeight = containerRect.height;
75 | setSvgDimensions({ width: svgWidth, height: svgHeight });
76 |
77 | const startX =
78 | rectA.left - containerRect.left + rectA.width / 2 + startXOffset;
79 | const startY =
80 | rectA.top - containerRect.top + rectA.height / 2 + startYOffset;
81 | const endX =
82 | rectB.left - containerRect.left + rectB.width / 2 + endXOffset;
83 | const endY =
84 | rectB.top - containerRect.top + rectB.height / 2 + endYOffset;
85 |
86 | const controlY = startY - curvature;
87 | const d = `M ${startX},${startY} Q ${
88 | (startX + endX) / 2
89 | },${controlY} ${endX},${endY}`;
90 | setPathD(d);
91 | }
92 | };
93 |
94 | // Initialize ResizeObserver
95 | const resizeObserver = new ResizeObserver(() => {
96 | // Just call updatePath directly since we don't need the entries
97 | updatePath();
98 | });
99 |
100 | // Observe the container element
101 | if (containerRef.current) {
102 | resizeObserver.observe(containerRef.current);
103 | }
104 |
105 | // Call the updatePath initially to set the initial path
106 | updatePath();
107 |
108 | // Clean up the observer on component unmount
109 | return () => {
110 | resizeObserver.disconnect();
111 | };
112 | }, [
113 | containerRef,
114 | fromRef,
115 | toRef,
116 | curvature,
117 | startXOffset,
118 | startYOffset,
119 | endXOffset,
120 | endYOffset,
121 | ]);
122 |
123 | return (
124 |
135 |
142 |
149 |
150 |
174 |
175 |
176 |
177 |
182 |
183 |
184 |
185 | );
186 | };
187 |
--------------------------------------------------------------------------------
/src/components/sections/Pricing2.tsx:
--------------------------------------------------------------------------------
1 | import { Check } from "lucide-react";
2 |
3 | const tiers = [
4 | {
5 | name: "Hobby",
6 | id: "tier-hobby",
7 | href: "https://buymeacoffee.com/sriganeshshiram",
8 | priceMonthly: "$10",
9 | description: "The perfect plan if you're getting started.",
10 | features: [
11 | "10 products",
12 | "Free Guide",
13 | "Access to links",
14 | "24-hour support response time",
15 | ],
16 | featured: false,
17 | },
18 | {
19 | name: "Enterprise",
20 | id: "tier-enterprise",
21 | href: "https://buymeacoffee.com/sriganeshshiram",
22 | priceMonthly: "$99",
23 | description: "Dedicated support and infrastructure for your company.",
24 | features: [
25 | "Unlimited Components",
26 | "Unlimited Access",
27 | "Advanced Support",
28 | "Dedicated support Person",
29 | "Git Acess",
30 | ],
31 | featured: true,
32 | },
33 | ];
34 |
35 | function classNames(...classes: string[]) {
36 | return classes.filter(Boolean).join(" ");
37 | }
38 |
39 | export const Pricing2 = () => {
40 | return (
41 |
42 |
54 |
55 |
Pricing
56 |
57 | Find the perfect plan tailored to your needs🚀.
58 |
59 |
60 |
61 | Select a plan tailored to your needs, packed with powerful features to
62 | captivate your audience, build lasting customer loyalty, and boost your
63 | sales.
64 |
65 |
66 | {tiers.map((tier, tierIdx) => (
67 |
81 |
88 | {tier.name}
89 |
90 |
91 |
97 | {tier.priceMonthly}
98 |
99 |
105 | /month
106 |
107 |
108 |
114 | {tier.description}
115 |
116 |
123 | {tier.features.map((feature) => (
124 |
125 |
132 | {feature}
133 |
134 | ))}
135 |
136 |
146 | Lets Get Started
147 |
148 |
149 | ))}
150 |
151 |
152 | );
153 | };
154 |
--------------------------------------------------------------------------------
/src/components/sections/HeroSection.tsx:
--------------------------------------------------------------------------------
1 | import React from "react";
2 |
3 | const App: React.FC = () => {
4 | return (
5 |
6 | {/* Navigation */}
7 |
8 |
11 |
25 |
33 |
34 |
35 | {/* Hero Section */}
36 |
37 |
38 |
39 |
40 |
41 | {/* Text Content */}
42 |
43 |
44 | We're changing the way people connect.
45 |
46 |
47 | Anim aute id magna aliqua ad ad non deserunt sunt. Qui irure
48 | qui lorem cupidatat commodo. Elit sunt amet fugiat veniam
49 | occaecat fugiat aliqua. Anim aute id magna aliqua ad ad non
50 | deserunt sunt.
51 |
52 |
70 |
71 |
72 | {/* Image Grid */}
73 |
74 |
75 |
76 | {/* Left Column */}
77 |
78 |
79 |
84 |
85 |
86 |
91 |
92 |
93 |
94 | {/* Right Column */}
95 |
96 |
97 |
102 |
103 |
104 |
109 |
110 |
111 |
112 |
113 |
114 |
115 |
116 |
117 |
118 |
119 |
120 | );
121 | };
122 |
123 | export default App;
124 |
--------------------------------------------------------------------------------