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
+
+
+
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")],