diff --git a/app/resources/component/resource-card.tsx b/app/resources/component/resource-card.tsx new file mode 100644 index 0000000..45653f7 --- /dev/null +++ b/app/resources/component/resource-card.tsx @@ -0,0 +1,23 @@ +interface ResourceCardProps { + title: string + description: string + isComingSoon?: boolean + buttonColor?: string +} + +export function ResourceCard({ title, description, isComingSoon, buttonColor = "bg-blue-500" }: ResourceCardProps) { + return ( +
+

{title}

+

{description}

+ +
+ ) +} + diff --git a/app/resources/component/ripple.tsx b/app/resources/component/ripple.tsx new file mode 100644 index 0000000..fca6e0a --- /dev/null +++ b/app/resources/component/ripple.tsx @@ -0,0 +1,61 @@ +import React, { ComponentPropsWithoutRef, CSSProperties } from "react"; +import { cn } from "@/lib/utils"; + +interface RippleProps extends ComponentPropsWithoutRef<"div"> { + mainCircleSize?: number; + mainCircleOpacity?: number; + numCircles?: number; +} + +export const Ripple = React.memo(function Ripple({ + mainCircleSize = 210, + mainCircleOpacity = 0.24, + numCircles = 8, + className, + ...props +}: RippleProps) { + return ( +
+ {Array.from({ length: numCircles }, (_, i) => { + const size = mainCircleSize + i * 70; + const opacity = Math.max(0, mainCircleOpacity - i * 0.03); + const animationDelay = `${i * 0.06}s`; + const borderStyle = i === numCircles - 1 ? "dashed" : "solid"; + const borderOpacity = Math.max(0, 5 + i * 5); + + return ( +
+ ); + })} +
+ ); +}); + +Ripple.displayName = "Ripple"; diff --git a/app/resources/component/support-section.tsx b/app/resources/component/support-section.tsx new file mode 100644 index 0000000..b88c3f9 --- /dev/null +++ b/app/resources/component/support-section.tsx @@ -0,0 +1,30 @@ +import { Card } from "@/components/ui/card" +import { Button } from "@/components/ui/button" + +export default function SupportSection() { + return ( + + {/* Rainbow gradient background effect */} +
+ +
+

Support Our Learning Community

+ +

+ Help us grow by sharing this website with your friends and colleagues! +

+ + +
+ + ) +} + diff --git a/app/resources/page.tsx b/app/resources/page.tsx new file mode 100644 index 0000000..e2aeca3 --- /dev/null +++ b/app/resources/page.tsx @@ -0,0 +1,88 @@ +import { ResourceCard } from "./component/resource-card" +import { Globe, Laptop } from "lucide-react" +import Navbar1 from "@/components/navbar" +import { Ripple } from "./component/ripple" +import SupportSection from "./component/support-section" +import Footer from "@/components/footer" + +export default function ResourcesPage() { + return ( +
+ +
+ {/* Hero Section */} +
+ + +

+ Discover Resources +

+

+ Explore our curated collection of learning materials to enhance your skills in programming, web development, + and DevOps. +

+
+ + {/* Programming Languages Section */} +
+
+ +

Programming Languages

+
+ +
+ + + + +
+
+ +
+
+ +

Foundations

+
+ +
+ + + + +
+
+
+ +
+
+ ) +} + diff --git a/components/navbar.tsx b/components/navbar.tsx index 579c18a..d54d8bc 100644 --- a/components/navbar.tsx +++ b/components/navbar.tsx @@ -111,6 +111,14 @@ const Navbar1 = () => { Blogs2
+ + +
+ Resources1 + Resources2 +
+
+
diff --git a/tailwind.config.ts b/tailwind.config.ts index f9a5f82..71f43ee 100644 --- a/tailwind.config.ts +++ b/tailwind.config.ts @@ -101,13 +101,24 @@ export default { "background-position": "200%", }, }, + ripple: { + "0%, 100%": { + transform: "translate(-50%, -50%) scale(1)", + }, + "50%": { + transform: "translate(-50%, -50%) scale(0.9)", + }, + }, }, animation: { "accordion-down": "accordion-down 0.2s ease-out", "accordion-up": "accordion-up 0.2s ease-out", meteor: "meteor 5s linear infinite", rainbow: "rainbow var(--speed, 2s) infinite linear", + ripple: "ripple var(--duration,2s) ease calc(var(--i, 0)*.2s) infinite", + }, + }, }, plugins: [require("tailwindcss-animate")],