Repository: hiteshchoudhary/Music-school-hindi Branch: main Commit: ba6c0536c041 Files: 34 Total size: 70.1 KB Directory structure: gitextract_j5k2gb1j/ ├── .eslintrc.json ├── .gitignore ├── README.md ├── next.config.mjs ├── package.json ├── postcss.config.js ├── src/ │ ├── app/ │ │ ├── contact/ │ │ │ └── page.tsx │ │ ├── courses/ │ │ │ └── page.tsx │ │ ├── globals.css │ │ ├── layout.tsx │ │ └── page.tsx │ ├── components/ │ │ ├── FeaturedCourses.tsx │ │ ├── Footer.tsx │ │ ├── HeroSection.tsx │ │ ├── Instructors.tsx │ │ ├── Navbar.tsx │ │ ├── TestimonialCards.tsx │ │ ├── UpcomingWebinars.tsx │ │ ├── WhyChooseUs.tsx │ │ └── ui/ │ │ ├── 3d-card.tsx │ │ ├── Spotlight.tsx │ │ ├── animated-tooltip.tsx │ │ ├── background-beams.tsx │ │ ├── background-gradient.tsx │ │ ├── card-hover-effect.tsx │ │ ├── infinite-moving-cards.tsx │ │ ├── moving-border.tsx │ │ ├── navbar-menu.tsx │ │ ├── sticky-scroll-reveal.tsx │ │ └── wavy-background.tsx │ ├── data/ │ │ └── music_courses.json │ └── utils/ │ └── cn.ts ├── tailwind.config.ts └── tsconfig.json ================================================ FILE CONTENTS ================================================ ================================================ FILE: .eslintrc.json ================================================ { "extends": "next/core-web-vitals" } ================================================ FILE: .gitignore ================================================ # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. # dependencies /node_modules /.pnp .pnp.js .yarn/install-state.gz # testing /coverage # next.js /.next/ /out/ # production /build # misc .DS_Store *.pem # debug npm-debug.log* yarn-debug.log* yarn-error.log* # local env files .env*.local # vercel .vercel # typescript *.tsbuildinfo next-env.d.ts ================================================ FILE: README.md ================================================ # A music school project in NextJS ## Description Seach "chai aur code" on youtube and watch it there ## contributon No need to make any PR in this repo. Specially DO NOT touch the README.md file ================================================ FILE: next.config.mjs ================================================ /** @type {import('next').NextConfig} */ const nextConfig = { images: { domains: ['images.unsplash.com', 'res.cloudinary.com'] } }; export default nextConfig; ================================================ FILE: package.json ================================================ { "name": "musicnextjs", "version": "0.1.0", "private": true, "scripts": { "dev": "next dev", "build": "next build", "start": "next start", "lint": "next lint" }, "dependencies": { "clsx": "^2.1.0", "framer-motion": "^11.0.3", "mini-svg-data-uri": "^1.4.4", "next": "14.1.0", "react": "^18", "react-dom": "^18", "simplex-noise": "^4.0.1", "tailwind-merge": "^2.2.1" }, "devDependencies": { "@types/node": "^20", "@types/react": "^18", "@types/react-dom": "^18", "autoprefixer": "^10.0.1", "eslint": "^8", "eslint-config-next": "14.1.0", "postcss": "^8", "tailwindcss": "^3.3.0", "typescript": "^5" } } ================================================ FILE: postcss.config.js ================================================ module.exports = { plugins: { tailwindcss: {}, autoprefixer: {}, }, }; ================================================ FILE: src/app/contact/page.tsx ================================================ 'use client'; import React, { FormEvent, useState } from 'react'; import { BackgroundBeams } from '@/components/ui/background-beams'; function MusicSchoolContactUs() { const [email, setEmail] = useState(''); const [message, setMessage] = useState(''); const handleSubmit = (event: FormEvent) => { event.preventDefault(); console.log('Submitted:', { email, message }); }; return (
{' '} {/* Ensure the container is relative */} {/* BackgroundBeams with adjusted z-index */} {/* Content with higher z-index */}
{' '} {/* Add relative and z-10 to bring content to the front */}

Contact Us

We're here to help with any questions about our courses, programs, or events. Reach out and let us know how we can assist you in your musical journey.

setEmail(e.target.value)} placeholder="Your email address" className="rounded-lg border border-neutral-800 focus:ring-2 focus:ring-teal-500 w-full p-4 bg-neutral-950 placeholder:text-neutral-700" required />
); } export default MusicSchoolContactUs; ================================================ FILE: src/app/courses/page.tsx ================================================ 'use client' import Image from "next/image"; import React from "react"; import { CardBody, CardContainer, CardItem } from "@/components/ui/3d-card"; import courseData from "@/data/music_courses.json" function page() { return (

All courses ({courseData.courses.length})

{courseData.courses.map((course) => ( {course.title} {course.description} {course.title}
Try now → Sign up
))}
) } export default page ================================================ FILE: src/app/globals.css ================================================ @tailwind base; @tailwind components; @tailwind utilities; :root { --foreground-rgb: 0, 0, 0; --background-start-rgb: 214, 219, 220; --background-end-rgb: 255, 255, 255; } @media (prefers-color-scheme: dark) { :root { --foreground-rgb: 255, 255, 255; --background-start-rgb: 0, 0, 0; --background-end-rgb: 0, 0, 0; } } body { color: rgb(var(--foreground-rgb)); background: linear-gradient( to bottom, transparent, rgb(var(--background-end-rgb)) ) rgb(var(--background-start-rgb)); } @layer utilities { .text-balance { text-wrap: balance; } } ================================================ FILE: src/app/layout.tsx ================================================ import type { Metadata } from "next"; import { Inter } from "next/font/google"; import "./globals.css"; import Navbar from "@/components/Navbar"; const inter = Inter({ subsets: ["latin"] }); export const metadata: Metadata = { title: "Create Next App", description: "Generated by create next app", }; export default function RootLayout({ children, }: Readonly<{ children: React.ReactNode; }>) { return (
{children} ); } ================================================ FILE: src/app/page.tsx ================================================ import FeaturedCourses from "@/components/FeaturedCourses"; import Footer from "@/components/Footer"; import HeroSection from "@/components/HeroSection"; import Instructors from "@/components/Instructors"; import MusicSchoolTestimonials from "@/components/TestimonialCards"; import UpcomingWebinars from "@/components/UpcomingWebinars"; import WhyChooseUs from "@/components/WhyChooseUs"; export default function Home() { return (
); } ================================================ FILE: src/components/FeaturedCourses.tsx ================================================ 'use client' import Link from "next/link" import courseData from "../data/music_courses.json" import { BackgroundGradient } from "./ui/background-gradient" interface Course{ id: number, title: string, slug: string, description: string, price: number, instructor: string, isFeatured: boolean, } function FeaturedCourses() { const featuredCourses = courseData.courses.filter((course:Course) => course.isFeatured) return (

FEATURED COURSES

Learn With the Best

{featuredCourses.map((course:Course)=> (

{course.title}

{course.description}

Learn More
))}
View All courses
) } export default FeaturedCourses ================================================ FILE: src/components/Footer.tsx ================================================ function Footer() { return ( ) } export default Footer ================================================ FILE: src/components/HeroSection.tsx ================================================ import Link from "next/link" import { Spotlight } from "./ui/Spotlight" import { Button } from "./ui/moving-border"; function HeroSection() { return (

Master the art of music

Dive into our comprehensive music courses and transform your musical journey today. Whether you're a beginner or looking to refine your skills, join us to unlock your true potential.

) } export default HeroSection ================================================ FILE: src/components/Instructors.tsx ================================================ 'use client' import { WavyBackground } from "./ui/wavy-background" import { AnimatedTooltip } from "./ui/animated-tooltip"; const instructors = [ { id: 1, name: 'Elena Briggs', designation: 'Vocal Coach', image: 'https://images.unsplash.com/photo-1438761681033-6461ffad8d80?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxzZWFyY2h8MTB8fGF2YXRhcnxlbnwwfHwwfHx8MA%3D%3D&auto=format&fit=crop&w=800&q=60', }, { id: 2, name: 'Marcus Reid', designation: 'Guitar Instructor', image: 'https://images.unsplash.com/photo-1472099645785-5658abf4ff4e?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&w=3540&q=80', }, { id: 3, name: 'Julia Zhang', designation: 'Piano Teacher', image: 'https://images.unsplash.com/photo-1580489944761-15a19d654956?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxzZWFyY2h8NXx8YXZhdGFyfGVufDB8fDB8fHww&auto=format&fit=crop&w=800&q=60', }, { id: 4, name: 'Andre Gomez', designation: 'Drumming Expert', image: 'https://images.unsplash.com/photo-1535713875002-d1d0cf377fde?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxzZWFyY2h8Mnx8YXZhdGFyfGVufDB8fDB8fHww&auto=format&fit=crop&w=800&q=60', }, ]; function Instructors() { return (

Meet Our Instructors

Discover the talented professionals who will guide your musical journey

) } export default Instructors ================================================ FILE: src/components/Navbar.tsx ================================================ 'use client'; import React, { useState } from "react"; import { HoveredLink, Menu, MenuItem, ProductItem } from "./ui/navbar-menu"; import { cn } from "@/utils/cn"; import Link from "next/link"; function Navbar({ className }: { className?: string }) { const [active, setActive] = useState(null); return (
All Courses Basic Music Theory Advanced Composition Songwriting Music Production
) } export default Navbar ================================================ FILE: src/components/TestimonialCards.tsx ================================================ 'use client' import { InfiniteMovingCards } from "./ui/infinite-moving-cards"; const musicSchoolTestimonials = [ { quote: 'Joining the music school transformed my understanding of music and helped me to truly discover my own sound. The instructors are world-class!', name: 'Alex Johnson', title: 'Guitar Student', }, { quote: "The community and support at this school are unmatched. I've grown not just as a pianist, but also as a performer, thanks to their comprehensive approach.", name: 'Samantha Lee', title: 'Piano Student', }, { quote: "This school offered me the tools and confidence to take my singing to the next level. I'm endlessly grateful for the personalized coaching.", name: 'Michael Chen', title: 'Vocal Student', }, { quote: 'As a violinist, finding the right mentor can be challenging, but this school matched me with a teacher who truly understands my goals and challenges.', name: 'Emily Taylor', title: 'Violin Student', }, { quote: 'The production courses here opened my eyes to the intricacies of music production. Highly recommend for any aspiring producers!', name: 'Chris Morales', title: 'Music Production Student', }, ]; function MusicSchoolTestimonials() { return (

Hear our Harmony: Voices of success

) } export default MusicSchoolTestimonials ================================================ FILE: src/components/UpcomingWebinars.tsx ================================================ 'use client' import Link from "next/link" import { HoverEffect } from "./ui/card-hover-effect"; function UpcomingWebinars() { const featuredWebinars = [ { title: 'Understanding Music Theory', description: 'Dive deep into the fundamentals of music theory and enhance your musical skills.', slug: 'understanding-music-theory', isFeatured: true, }, { title: 'The Art of Songwriting', description: 'Learn the craft of songwriting from experienced musicians and songwriters.', slug: 'the-art-of-songwriting', isFeatured: true, }, { title: 'Mastering Your Instrument', description: 'Advanced techniques to master your musical instrument of choice.', slug: 'mastering-your-instrument', isFeatured: true, }, { title: 'Music Production Essentials', description: 'Get started with music production with this comprehensive overview.', slug: 'music-production-essentials', isFeatured: true, }, // Added two more webinars { title: 'Live Performance Techniques', description: 'Enhance your live performance skills with expert tips and strategies.', slug: 'live-performance-techniques', isFeatured: true, }, { title: 'Digital Music Marketing', description: 'Learn how to promote your music effectively in the digital age.', slug: 'digital-music-marketing', isFeatured: true, }, ]; return (

FEATURED WEBINARS

Enhance Your Musical Journey

( { title: webinar.title, description: webinar.description, link: '/' } ))} />
View All webinars
) } export default UpcomingWebinars ================================================ FILE: src/components/WhyChooseUs.tsx ================================================ "use client"; import React from "react"; import { StickyScroll } from "./ui/sticky-scroll-reveal"; const musicSchoolContent = [ { title: 'Discover Your Sound with Us: A Personal Journey in Music Mastery', description: 'Embark on a musical journey that’s uniquely yours. Our personalized instruction adapts to your individual needs, setting the stage for unparalleled growth and creativity. At our music school, your aspirations meet our dedicated support, creating a harmonious path to mastery.', }, { title: 'Discover Your Sound with Us: A Personal Journey in Music Mastery', description: 'Embark on a musical journey that’s uniquely yours. Our personalized instruction adapts to your individual needs, setting the stage for unparalleled growth and creativity. At our music school, your aspirations meet our dedicated support, creating a harmonious path to mastery.', }, { title: 'Discover Your Sound with Us: A Personal Journey in Music Mastery', description: 'Embark on a musical journey that’s uniquely yours. Our personalized instruction adapts to your individual needs, setting the stage for unparalleled growth and creativity. At our music school, your aspirations meet our dedicated support, creating a harmonious path to mastery.', }, { title: 'Live Feedback & Engagement', description: 'Immerse yourself in an interactive learning experience where feedback is immediate, just like real-time changes in a collaborative project. This approach enhances your understanding and mastery of music concepts and performance techniques.', }, { title: 'Cutting-Edge Curriculum', description: 'Our curriculum is continuously updated to include the latest music education trends and technologies, ensuring you’re always learning with the most current and effective methods. Say goodbye to outdated materials and welcome an education that evolves with the industry.', }, { title: 'Limitless Learning Opportunities', description: 'With our expansive resource library and dynamic course offerings, you’ll never find yourself without something new to explore. Our platform provides continuous opportunities for growth, ensuring your musical skills are always advancing.', }, ]; function WhyChooseUs() { return (
) } export default WhyChooseUs ================================================ FILE: src/components/ui/3d-card.tsx ================================================ "use client"; import { cn } from "@/utils/cn"; import Image from "next/image"; import React, { createContext, useState, useContext, useRef, useEffect, } from "react"; const MouseEnterContext = createContext< [boolean, React.Dispatch>] | undefined >(undefined); export const CardContainer = ({ children, className, containerClassName, }: { children?: React.ReactNode; className?: string; containerClassName?: string; }) => { const containerRef = useRef(null); const [isMouseEntered, setIsMouseEntered] = useState(false); const handleMouseMove = (e: React.MouseEvent) => { if (!containerRef.current) return; const { left, top, width, height } = containerRef.current.getBoundingClientRect(); const x = (e.clientX - left - width / 2) / 25; const y = (e.clientY - top - height / 2) / 25; containerRef.current.style.transform = `rotateY(${x}deg) rotateX(${y}deg)`; }; const handleMouseEnter = (e: React.MouseEvent) => { setIsMouseEntered(true); if (!containerRef.current) return; }; const handleMouseLeave = (e: React.MouseEvent) => { if (!containerRef.current) return; setIsMouseEntered(false); containerRef.current.style.transform = `rotateY(0deg) rotateX(0deg)`; }; return (
{children}
); }; export const CardBody = ({ children, className, }: { children: React.ReactNode; className?: string; }) => { return (
*]:[transform-style:preserve-3d]", className )} > {children}
); }; export const CardItem = ({ as: Tag = "div", children, className, translateX = 0, translateY = 0, translateZ = 0, rotateX = 0, rotateY = 0, rotateZ = 0, ...rest }: { as?: React.ElementType; children: React.ReactNode; className?: string; translateX?: number | string; translateY?: number | string; translateZ?: number | string; rotateX?: number | string; rotateY?: number | string; rotateZ?: number | string; }) => { const ref = useRef(null); const [isMouseEntered] = useMouseEnter(); useEffect(() => { handleAnimations(); }, [isMouseEntered]); const handleAnimations = () => { if (!ref.current) return; if (isMouseEntered) { ref.current.style.transform = `translateX(${translateX}px) translateY(${translateY}px) translateZ(${translateZ}px) rotateX(${rotateX}deg) rotateY(${rotateY}deg) rotateZ(${rotateZ}deg)`; } else { ref.current.style.transform = `translateX(0px) translateY(0px) translateZ(0px) rotateX(0deg) rotateY(0deg) rotateZ(0deg)`; } }; return ( {children} ); }; // Create a hook to use the context export const useMouseEnter = () => { const context = useContext(MouseEnterContext); if (context === undefined) { throw new Error("useMouseEnter must be used within a MouseEnterProvider"); } return context; }; ================================================ FILE: src/components/ui/Spotlight.tsx ================================================ import React from "react"; import { cn } from "@/utils/cn"; type SpotlightProps = { className?: string; fill?: string; }; export const Spotlight = ({ className, fill }: SpotlightProps) => { return ( ); }; ================================================ FILE: src/components/ui/animated-tooltip.tsx ================================================ "use client"; import Image from "next/image"; import React, { useState } from "react"; import { motion, useTransform, AnimatePresence, useMotionValue, useSpring, } from "framer-motion"; export const AnimatedTooltip = ({ items, }: { items: { id: number; name: string; designation: string; image: string; }[]; }) => { const [hoveredIndex, setHoveredIndex] = useState(null); const springConfig = { stiffness: 100, damping: 5 }; const x = useMotionValue(0); // going to set this value on mouse move // rotate the tooltip const rotate = useSpring( useTransform(x, [-100, 100], [-45, 45]), springConfig ); // translate the tooltip const translateX = useSpring( useTransform(x, [-100, 100], [-50, 50]), springConfig ); const handleMouseMove = (event: any) => { const halfWidth = event.target.offsetWidth / 2; x.set(event.nativeEvent.offsetX - halfWidth); // set the x value, which is then used in transform and rotate }; return ( <> {items.map((item, idx) => (
setHoveredIndex(item.id)} onMouseLeave={() => setHoveredIndex(null)} > {hoveredIndex === item.id && (
{item.name}
{item.designation}
)} {item.name}
))} ); }; ================================================ FILE: src/components/ui/background-beams.tsx ================================================ 'use client'; import React from 'react'; import { motion } from 'framer-motion'; import { cn } from '@/utils/cn'; export function BackgroundBeamsDemo() { return (

Join the waitlist

Welcome to MailJet, the best transactional email service on the web. We provide reliable, scalable, and customizable email solutions for your business. Whether you're sending order confirmations, password reset emails, or promotional campaigns, MailJet has got you covered.

); } export const BackgroundBeams = ({ className }: { className?: string }) => { const paths = [ 'M-380 -189C-380 -189 -312 216 152 343C616 470 684 875 684 875', 'M-373 -197C-373 -197 -305 208 159 335C623 462 691 867 691 867', 'M-366 -205C-366 -205 -298 200 166 327C630 454 698 859 698 859', 'M-359 -213C-359 -213 -291 192 173 319C637 446 705 851 705 851', 'M-352 -221C-352 -221 -284 184 180 311C644 438 712 843 712 843', 'M-345 -229C-345 -229 -277 176 187 303C651 430 719 835 719 835', 'M-338 -237C-338 -237 -270 168 194 295C658 422 726 827 726 827', 'M-331 -245C-331 -245 -263 160 201 287C665 414 733 819 733 819', 'M-324 -253C-324 -253 -256 152 208 279C672 406 740 811 740 811', 'M-317 -261C-317 -261 -249 144 215 271C679 398 747 803 747 803', 'M-310 -269C-310 -269 -242 136 222 263C686 390 754 795 754 795', 'M-303 -277C-303 -277 -235 128 229 255C693 382 761 787 761 787', 'M-296 -285C-296 -285 -228 120 236 247C700 374 768 779 768 779', 'M-289 -293C-289 -293 -221 112 243 239C707 366 775 771 775 771', 'M-282 -301C-282 -301 -214 104 250 231C714 358 782 763 782 763', 'M-275 -309C-275 -309 -207 96 257 223C721 350 789 755 789 755', 'M-268 -317C-268 -317 -200 88 264 215C728 342 796 747 796 747', 'M-261 -325C-261 -325 -193 80 271 207C735 334 803 739 803 739', 'M-254 -333C-254 -333 -186 72 278 199C742 326 810 731 810 731', 'M-247 -341C-247 -341 -179 64 285 191C749 318 817 723 817 723', 'M-240 -349C-240 -349 -172 56 292 183C756 310 824 715 824 715', 'M-233 -357C-233 -357 -165 48 299 175C763 302 831 707 831 707', 'M-226 -365C-226 -365 -158 40 306 167C770 294 838 699 838 699', 'M-219 -373C-219 -373 -151 32 313 159C777 286 845 691 845 691', 'M-212 -381C-212 -381 -144 24 320 151C784 278 852 683 852 683', 'M-205 -389C-205 -389 -137 16 327 143C791 270 859 675 859 675', 'M-198 -397C-198 -397 -130 8 334 135C798 262 866 667 866 667', 'M-191 -405C-191 -405 -123 0 341 127C805 254 873 659 873 659', 'M-184 -413C-184 -413 -116 -8 348 119C812 246 880 651 880 651', 'M-177 -421C-177 -421 -109 -16 355 111C819 238 887 643 887 643', 'M-170 -429C-170 -429 -102 -24 362 103C826 230 894 635 894 635', 'M-163 -437C-163 -437 -95 -32 369 95C833 222 901 627 901 627', 'M-156 -445C-156 -445 -88 -40 376 87C840 214 908 619 908 619', 'M-149 -453C-149 -453 -81 -48 383 79C847 206 915 611 915 611', 'M-142 -461C-142 -461 -74 -56 390 71C854 198 922 603 922 603', 'M-135 -469C-135 -469 -67 -64 397 63C861 190 929 595 929 595', 'M-128 -477C-128 -477 -60 -72 404 55C868 182 936 587 936 587', 'M-121 -485C-121 -485 -53 -80 411 47C875 174 943 579 943 579', 'M-114 -493C-114 -493 -46 -88 418 39C882 166 950 571 950 571', 'M-107 -501C-107 -501 -39 -96 425 31C889 158 957 563 957 563', 'M-100 -509C-100 -509 -32 -104 432 23C896 150 964 555 964 555', 'M-93 -517C-93 -517 -25 -112 439 15C903 142 971 547 971 547', 'M-86 -525C-86 -525 -18 -120 446 7C910 134 978 539 978 539', 'M-79 -533C-79 -533 -11 -128 453 -1C917 126 985 531 985 531', 'M-72 -541C-72 -541 -4 -136 460 -9C924 118 992 523 992 523', 'M-65 -549C-65 -549 3 -144 467 -17C931 110 999 515 999 515', 'M-58 -557C-58 -557 10 -152 474 -25C938 102 1006 507 1006 507', 'M-51 -565C-51 -565 17 -160 481 -33C945 94 1013 499 1013 499', 'M-44 -573C-44 -573 24 -168 488 -41C952 86 1020 491 1020 491', 'M-37 -581C-37 -581 31 -176 495 -49C959 78 1027 483 1027 483', ]; return (
{paths.map((path, index) => ( ))} {paths.map((path, index) => ( ))}
); }; ================================================ FILE: src/components/ui/background-gradient.tsx ================================================ import { cn } from "@/utils/cn"; import React from "react"; import { motion } from "framer-motion"; export const BackgroundGradient = ({ children, className, containerClassName, animate = true, }: { children?: React.ReactNode; className?: string; containerClassName?: string; animate?: boolean; }) => { const variants = { initial: { backgroundPosition: "0 50%", }, animate: { backgroundPosition: ["0, 50%", "100% 50%", "0 50%"], }, }; return (
{children}
); }; ================================================ FILE: src/components/ui/card-hover-effect.tsx ================================================ import { cn } from "@/utils/cn"; import { AnimatePresence, motion } from "framer-motion"; import Link from "next/link"; import { useState } from "react"; export const HoverEffect = ({ items, className, }: { items: { title: string; description: string; link: string; }[]; className?: string; }) => { let [hoveredIndex, setHoveredIndex] = useState(null); return (
{items.map((item, idx) => ( setHoveredIndex(idx)} onMouseLeave={() => setHoveredIndex(null)} > {hoveredIndex === idx && ( )} {item.title} {item.description} ))}
); }; export const Card = ({ className, children, }: { className?: string; children: React.ReactNode; }) => { return (
{children}
); }; export const CardTitle = ({ className, children, }: { className?: string; children: React.ReactNode; }) => { return (

{children}

); }; export const CardDescription = ({ className, children, }: { className?: string; children: React.ReactNode; }) => { return (

{children}

); }; ================================================ FILE: src/components/ui/infinite-moving-cards.tsx ================================================ "use client"; import { cn } from "@/utils/cn"; import React, { useEffect, useState } from "react"; export const InfiniteMovingCards = ({ items, direction = "left", speed = "fast", pauseOnHover = true, className, }: { items: { quote: string; name: string; title: string; }[]; direction?: "left" | "right"; speed?: "fast" | "normal" | "slow"; pauseOnHover?: boolean; className?: string; }) => { const containerRef = React.useRef(null); const scrollerRef = React.useRef(null); useEffect(() => { addAnimation(); }, []); const [start, setStart] = useState(false); function addAnimation() { if (containerRef.current && scrollerRef.current) { const scrollerContent = Array.from(scrollerRef.current.children); scrollerContent.forEach((item) => { const duplicatedItem = item.cloneNode(true); if (scrollerRef.current) { scrollerRef.current.appendChild(duplicatedItem); } }); getDirection(); getSpeed(); setStart(true); } } const getDirection = () => { if (containerRef.current) { if (direction === "left") { containerRef.current.style.setProperty( "--animation-direction", "forwards" ); } else { containerRef.current.style.setProperty( "--animation-direction", "reverse" ); } } }; const getSpeed = () => { if (containerRef.current) { if (speed === "fast") { containerRef.current.style.setProperty("--animation-duration", "20s"); } else if (speed === "normal") { containerRef.current.style.setProperty("--animation-duration", "40s"); } else { containerRef.current.style.setProperty("--animation-duration", "80s"); } } }; return (
    {items.map((item, idx) => (
  • {item.quote}
    {item.name} {item.title}
  • ))}
); }; ================================================ FILE: src/components/ui/moving-border.tsx ================================================ "use client"; import React from "react"; import { motion, useAnimationFrame, useMotionTemplate, useMotionValue, useTransform, } from "framer-motion"; import { useRef } from "react"; import { cn } from "@/utils/cn"; export function Button({ borderRadius = "1.75rem", children, as: Component = "button", containerClassName, borderClassName, duration, className, ...otherProps }: { borderRadius?: string; children: React.ReactNode; as?: any; containerClassName?: string; borderClassName?: string; duration?: number; className?: string; [key: string]: any; }) { return (
{children}
); } export const MovingBorder = ({ children, duration = 2000, rx, ry, ...otherProps }: { children: React.ReactNode; duration?: number; rx?: string; ry?: string; [key: string]: any; }) => { const pathRef = useRef(); const progress = useMotionValue(0); useAnimationFrame((time) => { const length = pathRef.current?.getTotalLength(); if (length) { const pxPerMillisecond = length / duration; progress.set((time * pxPerMillisecond) % length); } }); const x = useTransform( progress, (val) => pathRef.current?.getPointAtLength(val).x ); const y = useTransform( progress, (val) => pathRef.current?.getPointAtLength(val).y ); const transform = useMotionTemplate`translateX(${x}px) translateY(${y}px) translateX(-50%) translateY(-50%)`; return ( <> {children} ); }; ================================================ FILE: src/components/ui/navbar-menu.tsx ================================================ "use client"; import React from "react"; import { motion } from "framer-motion"; import Link from "next/link"; import Image from "next/image"; const transition = { type: "spring", mass: 0.5, damping: 11.5, stiffness: 100, restDelta: 0.001, restSpeed: 0.001, }; export const MenuItem = ({ setActive, active, item, children, }: { setActive: (item: string) => void; active: string | null; item: string; children?: React.ReactNode; }) => { return (
setActive(item)} className="relative "> {item} {active !== null && ( {active === item && children && (
{children}
)}
)}
); }; export const Menu = ({ setActive, children, }: { setActive: (item: string | null) => void; children: React.ReactNode; }) => { return ( ); }; export const ProductItem = ({ title, description, href, src, }: { title: string; description: string; href: string; src: string; }) => { return ( {title}

{title}

{description}

); }; export const HoveredLink = ({ children, ...rest }: any) => { return ( {children} ); }; ================================================ FILE: src/components/ui/sticky-scroll-reveal.tsx ================================================ "use client"; import React, { useRef } from "react"; import { useMotionValueEvent, useScroll } from "framer-motion"; import { motion } from "framer-motion"; export const StickyScroll = ({ content, }: { content: { title: string; description: string; }[]; }) => { const [activeCard, setActiveCard] = React.useState(0); const ref = useRef(null); const { scrollYProgress } = useScroll({ container: ref, offset: ["start start", "end start"], }); const cardLength = content.length; useMotionValueEvent(scrollYProgress, "change", (latest) => { const cardsBreakpoints = content.map((_, index) => index / cardLength); cardsBreakpoints.forEach((breakpoint, index) => { if (latest > breakpoint - 0.2 && latest <= breakpoint) { setActiveCard(() => index); } }); }); const backgroundColors = [ "var(--slate-900)", "var(--black)", "var(--neutral-900)", ]; const linearGradients = [ "linear-gradient(to bottom right, var(--cyan-500), var(--emerald-500))", "linear-gradient(to bottom right, var(--pink-500), var(--indigo-500))", "linear-gradient(to bottom right, var(--orange-500), var(--yellow-500))", ]; return (
{content.map((item, index) => (
{item.title} {item.description}
))}
); }; ================================================ FILE: src/components/ui/wavy-background.tsx ================================================ "use client"; import { cn } from "@/utils/cn"; import React, { useEffect, useRef } from "react"; import { createNoise3D } from "simplex-noise"; export const WavyBackground = ({ children, className, containerClassName, colors, waveWidth, backgroundFill, blur = 10, speed = "fast", waveOpacity = 0.5, ...props }: { children?: any; className?: string; containerClassName?: string; colors?: string[]; waveWidth?: number; backgroundFill?: string; blur?: number; speed?: "slow" | "fast"; waveOpacity?: number; [key: string]: any; }) => { const noise = createNoise3D(); let w: number, h: number, nt: number, i: number, x: number, ctx: any, canvas: any; const canvasRef = useRef(null); const getSpeed = () => { switch (speed) { case "slow": return 0.001; case "fast": return 0.002; default: return 0.001; } }; const init = () => { canvas = canvasRef.current; ctx = canvas.getContext("2d"); w = ctx.canvas.width = window.innerWidth; h = ctx.canvas.height = window.innerHeight; ctx.filter = `blur(${blur}px)`; nt = 0; window.onresize = function () { w = ctx.canvas.width = window.innerWidth; h = ctx.canvas.height = window.innerHeight; ctx.filter = `blur(${blur}px)`; }; render(); }; const waveColors = colors ?? [ "#38bdf8", "#818cf8", "#c084fc", "#e879f9", "#22d3ee", ]; const drawWave = (n: number) => { nt += getSpeed(); for (i = 0; i < n; i++) { ctx.beginPath(); ctx.lineWidth = waveWidth || 50; ctx.strokeStyle = waveColors[i % waveColors.length]; for (x = 0; x < w; x += 5) { var y = noise(x / 800, 0.3 * i, nt) * 100; ctx.lineTo(x, y + h * 0.5); // adjust for height, currently at 50% of the container } ctx.stroke(); ctx.closePath(); } }; let animationId: number; const render = () => { ctx.fillStyle = backgroundFill || "black"; ctx.globalAlpha = waveOpacity || 0.5; ctx.fillRect(0, 0, w, h); drawWave(5); animationId = requestAnimationFrame(render); }; useEffect(() => { init(); return () => { cancelAnimationFrame(animationId); }; }, []); return (
{children}
); }; ================================================ FILE: src/data/music_courses.json ================================================ { "courses": [ { "id": 1, "title": "Guitar Fundamentals", "slug": "guitar-fundamentals", "description": "Learn the basics of playing guitar with our comprehensive beginner's course.", "price": 99.99, "instructor": "John Doe", "isFeatured": true, "image": "/courses/guitar.jpg" }, { "id": 2, "title": "Piano for Beginners", "slug": "piano-for-beginners", "description": "Start your musical journey with foundational piano skills taught by expert instructors.", "price": 109.99, "instructor": "Jane Smith", "isFeatured": false, "image": "/courses/piano.jpg" }, { "id": 3, "title": "Advanced Vocal Techniques", "slug": "advanced-vocal-techniques", "description": "Enhance your singing with advanced vocal techniques for intermediate to advanced learners.", "price": 119.99, "instructor": "Emily Johnson", "isFeatured": true, "image": "/courses/vocalist.jpg" }, { "id": 4, "title": "Drumming Mastery", "slug": "drumming-mastery", "description": "Master the drums with our comprehensive course covering all skill levels.", "price": 129.99, "instructor": "Mike Brown", "isFeatured": false, "image": "/courses/drumming.jpg" }, { "id": 5, "title": "Jazz Improvisation", "slug": "jazz-improvisation", "description": "Learn the art of jazz improvisation with this course designed for all levels.", "price": 139.99, "instructor": "Chris Davis", "isFeatured": false, "image": "/courses/jazz.jpg" }, { "id": 6, "title": "Music Production Fundamentals", "slug": "music-production-fundamentals", "description": "Dive into music production with this introductory course on the basics of sound engineering and mixing.", "price": 149.99, "instructor": "Alex Wilson", "isFeatured": true, "image": "/courses/music-prod.jpg" }, { "id": 7, "title": "Songwriting Essentials", "slug": "songwriting-essentials", "description": "Learn the essentials of songwriting to express your musical creativity.", "price": 159.99, "instructor": "Samantha Miller", "isFeatured": false, "image": "/courses/song-writing.jpg" }, { "id": 8, "title": "Electronic Music Production", "slug": "electronic-music-production", "description": "Create compelling electronic music with our course designed for beginners to advanced users.", "price": 169.99, "instructor": "Luke Harris", "isFeatured": true, "image": "/courses/music-prod.jpg" }, { "id": 9, "title": "Classical Music History", "slug": "classical-music-history", "description": "Explore the rich history of classical music from its origins to the present day.", "price": 179.99, "instructor": "Grace Lee", "isFeatured": false, "image": "/courses/classical-music.jpg" }, { "id": 10, "title": "Blues Guitar Techniques", "slug": "blues-guitar-techniques", "description": "Discover the techniques of blues guitar to add soul and depth to your playing.", "price": 189.99, "instructor": "Ethan Moore", "isFeatured": true, "image": "/courses/blues.jpg" } ] } ================================================ FILE: src/utils/cn.ts ================================================ import { ClassValue, clsx } from "clsx"; import { twMerge } from "tailwind-merge"; export function cn(...inputs: ClassValue[]) { return twMerge(clsx(inputs)); } ================================================ FILE: tailwind.config.ts ================================================ import type { Config } from "tailwindcss"; const svgToDataUri = require("mini-svg-data-uri"); const colors = require("tailwindcss/colors"); const { default: flattenColorPalette, } = require("tailwindcss/lib/util/flattenColorPalette"); // Plugin to add each Tailwind color as a global CSS variable function addVariablesForColors({ addBase, theme }: any) { const allColors = flattenColorPalette(theme('colors')); const newVars = Object.fromEntries( Object.entries(allColors).map(([key, value]) => [`--${key}`, value]) ); addBase({ ':root': newVars, }); } function addSvgPatterns({ matchUtilities, theme }: any) { matchUtilities( { 'bg-grid': (value: any) => ({ backgroundImage: `url("${svgToDataUri( `` )}")`, }), 'bg-grid-small': (value: any) => ({ backgroundImage: `url("${svgToDataUri( `` )}")`, }), 'bg-dot': (value: any) => ({ backgroundImage: `url("${svgToDataUri( `` )}")`, }), }, { values: flattenColorPalette(theme('backgroundColor')), type: 'color' } ); } const config: Config = { content: [ "./src/pages/**/*.{js,ts,jsx,tsx,mdx}", "./src/components/**/*.{js,ts,jsx,tsx,mdx}", "./src/app/**/*.{js,ts,jsx,tsx,mdx}", ], darkMode: 'class', theme: { extend: { animation:{ spotlight: "spotlight 2s ease .75s 1 forwards", scroll: "scroll var(--animation-duration, 40s) var(--animation-direction, forwards) linear infinite" }, backgroundImage: { "gradient-radial": "radial-gradient(var(--tw-gradient-stops))", "gradient-conic": "conic-gradient(from 180deg at 50% 50%, var(--tw-gradient-stops))", }, keyframes:{ spotlight: { '0%': { opacity: '0', transform: 'translate(-72%, -62%) scale(0.5)' }, '100%': { opacity: '1', transform: 'translate(-50%,-40%) scale(1)' }, }, scroll: { to: { transform: "translate(calc(-50% - 0.5rem))", }, }, } }, }, plugins: [addVariablesForColors, addSvgPatterns], }; export default config; ================================================ FILE: tsconfig.json ================================================ { "compilerOptions": { "lib": ["dom", "dom.iterable", "esnext"], "allowJs": true, "skipLibCheck": true, "strict": true, "noEmit": true, "esModuleInterop": true, "module": "esnext", "moduleResolution": "bundler", "resolveJsonModule": true, "isolatedModules": true, "jsx": "preserve", "incremental": true, "plugins": [ { "name": "next" } ], "paths": { "@/*": ["./src/*"] } }, "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"], "exclude": ["node_modules"] }