diff --git a/README.md b/README.md index 6bda8bf..81d71e2 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,7 @@ # RainnnyCLUB My personal portfolio website hosted [here](https://rainnny.club) + +## TODO +- [ ] Mobile Responsiveness +- [ ] Discord Integration (Status, Activity, etc) +- [ ] Add Configuration diff --git a/bun.lockb b/bun.lockb index d611580..e8be417 100644 Binary files a/bun.lockb and b/bun.lockb differ diff --git a/next.config.mjs b/next.config.mjs index 4678774..f1e1509 100644 --- a/next.config.mjs +++ b/next.config.mjs @@ -1,4 +1,13 @@ /** @type {import('next').NextConfig} */ -const nextConfig = {}; +const nextConfig = { + images: { + remotePatterns: [ + { + protocol: "https", + hostname: "img.icons8.com", + }, + ], + }, +}; export default nextConfig; diff --git a/package.json b/package.json index 55c4ec2..0b49d3b 100644 --- a/package.json +++ b/package.json @@ -12,10 +12,12 @@ "@heroicons/react": "^2.1.5", "@radix-ui/react-navigation-menu": "^1.2.0", "@radix-ui/react-slot": "^1.1.0", + "@radix-ui/react-tooltip": "^1.1.2", "class-variance-authority": "^0.7.0", "clsx": "^2.1.1", "framer-motion": "^11.3.30", "lucide-react": "^0.436.0", + "moment": "^2.30.1", "next": "14.2.3", "next-themes": "^0.3.0", "react": "^18", diff --git a/public/maven.png b/public/maven.png new file mode 100644 index 0000000..4c71ba9 Binary files /dev/null and b/public/maven.png differ diff --git a/public/waving-hand.gif b/public/waving-hand.gif new file mode 100644 index 0000000..318a35e Binary files /dev/null and b/public/waving-hand.gif differ diff --git a/src/app/(pages)/layout.tsx b/src/app/(pages)/layout.tsx index 8326fa1..f9255c4 100644 --- a/src/app/(pages)/layout.tsx +++ b/src/app/(pages)/layout.tsx @@ -3,6 +3,7 @@ import { Inter } from "next/font/google"; import { ThemeProvider } from "@/components/theme-provider"; import "../globals.css"; import { ReactElement } from "react"; +import { TooltipProvider } from "@/components/ui/tooltip"; const inter = Inter({ subsets: ["latin"] }); @@ -34,7 +35,7 @@ const RootLayout = ({ enableSystem disableTransitionOnChange > - {children} + {children} diff --git a/src/app/(pages)/page.tsx b/src/app/(pages)/page.tsx index 788df51..b327b78 100644 --- a/src/app/(pages)/page.tsx +++ b/src/app/(pages)/page.tsx @@ -1,10 +1,19 @@ +import Greeting from "@/components/landing/greeting"; import Navbar from "@/components/landing/navbar"; import { ReactElement } from "react"; const LandingPage = (): ReactElement => ( -
+
- Page Content +
+ +
); export default LandingPage; diff --git a/src/app/favicon.ico b/src/app/favicon.ico index ed52fc2..191ba4d 100644 Binary files a/src/app/favicon.ico and b/src/app/favicon.ico differ diff --git a/src/components/landing/greeting.tsx b/src/components/landing/greeting.tsx new file mode 100644 index 0000000..4ec0381 --- /dev/null +++ b/src/components/landing/greeting.tsx @@ -0,0 +1,67 @@ +"use client"; + +import BlurFade from "@/components/ui/blur-fade"; +import { cn } from "@/lib/utils"; +import moment, { Moment } from "moment"; +import Image from "next/image"; +import { ReactElement } from "react"; +import { FlipWords } from "@/components/ui/flip-words"; +import Navigation from "./navigation"; + +const Greeting = (): ReactElement => { + const now: Moment = moment(Date.now()); + return ( +
+ + My Selfie (: + + + +

+ Hello, I'm + + Braydon + + + Waving Hand + +

+
+ + + + + + + + +
+ ); +}; +export default Greeting; diff --git a/src/components/landing/nav-content/homelab.tsx b/src/components/landing/nav-content/homelab.tsx new file mode 100644 index 0000000..5256989 --- /dev/null +++ b/src/components/landing/nav-content/homelab.tsx @@ -0,0 +1,32 @@ +import { ReactElement } from "react"; + +const HomelabContent = (): ReactElement => ( + +); +export default HomelabContent; diff --git a/src/components/landing/nav-content/my-work.tsx b/src/components/landing/nav-content/my-work.tsx new file mode 100644 index 0000000..9431b39 --- /dev/null +++ b/src/components/landing/nav-content/my-work.tsx @@ -0,0 +1,20 @@ +import { ReactElement } from "react"; + +type Project = { + name: string; + git: string; + content: ReactElement; +}; + +const projects: Project[] = [ + { + name: "This Website!", + git: "https://github.com/Rainnny7/rainnny.club", + content:
This website
, + }, +]; + +const MyWork = (): ReactElement => ( +
MY WORK HELLO
+); +export default MyWork; diff --git a/src/components/landing/nav-content/skills.tsx b/src/components/landing/nav-content/skills.tsx new file mode 100644 index 0000000..0aff409 --- /dev/null +++ b/src/components/landing/nav-content/skills.tsx @@ -0,0 +1,145 @@ +import Image from "next/image"; +import Link from "next/link"; +import { ReactElement } from "react"; +import { + Tooltip, + TooltipContent, + TooltipTrigger, +} from "@/components/ui/tooltip"; +import SimpleTooltip from "@/components/ui/simple-tooltip"; + +type Skill = { + name: string; + icon: string; + link: string; +}; + +const skillset: Skill[] = [ + // Languages + { + name: "Java", + icon: "https://img.icons8.com/color/2x/java-coffee-cup-logo.png", + link: "https://www.java.com", + }, + { + name: "JavaScript", + icon: "https://img.icons8.com/fluent/2x/javascript.png", + link: "https://developer.mozilla.org/en-US/docs/Web/JavaScript", + }, + { + name: "CSS", + icon: "https://img.icons8.com/fluent/2x/css3.png", + link: "https://www.w3schools.com/css", + }, + + // Operating Systems + { + name: "Linux", + icon: "https://img.icons8.com/color/2x/linux.png", + link: "https://www.linux.org", + }, + { + name: "Bash", + icon: "https://img.icons8.com/color/2x/bash.png", + link: "https://www.gnu.org/software/bash", + }, + + // Databases + { + name: "MariaDB", + icon: "https://img.icons8.com/fluent/2x/maria-db.png", + link: "https://mariadb.org", + }, + { + name: "MongoDB", + icon: "https://img.icons8.com/color/2x/mongodb.png", + link: "https://www.mongodb.com", + }, + { + name: "Redis", + icon: "https://img.icons8.com/color/2x/redis.png", + link: "https://redis.io", + }, + + // Software + { + name: "Git", + icon: "https://img.icons8.com/color/2x/git.png", + link: "https://git-scm.com", + }, + { + name: "Docker", + icon: "https://img.icons8.com/fluent/2x/docker.png", + link: "https://www.docker.com", + }, + { + name: "Jenkins", + icon: "https://img.icons8.com/color/2x/jenkins.png", + link: "https://www.jenkins.io", + }, + { + name: "Figma", + icon: "https://img.icons8.com/fluent/2x/figma.png", + link: "https://www.figma.com", + }, + { + name: "Postman", + icon: "https://img.icons8.com/dusk/2x/postman-api.png", + link: "https://www.postman.com", + }, + + // Frameworks & Libraries + { + name: "Maven", + icon: "/maven.png", + link: "https://maven.apache.org", + }, + { + name: "NPM", + icon: "https://img.icons8.com/color/2x/npm.png", + link: "https://www.npmjs.com", + }, + { + name: "React", + icon: "https://img.icons8.com/dusk/2x/react.png", + link: "https://reactjs.org/", + }, + { + name: "NextJS", + icon: "https://img.icons8.com/color/2x/nextjs.png", + link: "https://nextjs.org/", + }, + { + name: "TailwindCSS", + icon: "https://img.icons8.com/color/2x/tailwindcss.png", + link: "https://tailwindcss.com", + }, + { + name: "Redux", + icon: "https://img.icons8.com/color/2x/redux.png", + link: "https://redux.js.org", + }, + { + name: "Nginx", + icon: "https://img.icons8.com/color/2x/nginx.png", + link: "https://www.nginx.com", + }, +]; + +const Skills = (): ReactElement => ( +
+ {skillset.map((skill, index) => ( + + + {`${skill.name} + + + ))} +
+); +export default Skills; diff --git a/src/components/landing/navbar.tsx b/src/components/landing/navbar.tsx index 6da21e4..fa020b8 100644 --- a/src/components/landing/navbar.tsx +++ b/src/components/landing/navbar.tsx @@ -15,20 +15,24 @@ import { navigationMenuTriggerStyle } from "@/components/ui/navigation-menu"; import { HeartIcon } from "@heroicons/react/24/solid"; import { cn } from "@/lib/utils"; import ThemeSwitcher from "./theme-switcher"; -import { Button } from "../ui/button"; +import { Button } from "@/components/ui/button"; import { BookOpenIcon } from "@heroicons/react/24/outline"; import { SignalIcon } from "@heroicons/react/24/outline"; +import BlurFade from "@/components/ui/blur-fade"; +import { CodeBracketIcon } from "@heroicons/react/24/outline"; const Navbar = (): ReactElement => ( - + + + ); const Branding = (): ReactElement => ( ( className={cn(navigationMenuTriggerStyle(), "gap-2")} target="_blank" > - Donate + Buy me a Coffee ( const UsefulLinksContent = (): ReactElement => (
+ {/* Git */} + + + + {/* Wiki */} - @@ -92,7 +104,7 @@ const UsefulLinksContent = (): ReactElement => ( {/* Status Page */} - diff --git a/src/components/landing/navigation.tsx b/src/components/landing/navigation.tsx new file mode 100644 index 0000000..c45c006 --- /dev/null +++ b/src/components/landing/navigation.tsx @@ -0,0 +1,75 @@ +"use client"; + +import { ReactElement, useState } from "react"; +import { Button } from "@/components/ui/button"; +import { BriefcaseIcon } from "@heroicons/react/24/outline"; +import { WrenchIcon } from "@heroicons/react/24/outline"; +import { ServerStackIcon } from "@heroicons/react/24/outline"; +import { cn } from "@/lib/utils"; +import BlurFade from "@/components/ui/blur-fade"; +import HomelabContent from "./nav-content/homelab"; +import Skills from "./nav-content/skills"; +import MyWork from "./nav-content/my-work"; + +type Item = { + name: string; + icon: ReactElement; + content: ReactElement; +}; + +const items: Item[] = [ + { + name: "My Work", + icon: , + content: , + }, + { + name: "Skills", + icon: , + content: , + }, + { + name: "Homelab", + icon: , + content: , + }, +]; + +const Navigation = (): ReactElement => { + const [selected, setSelected] = useState(undefined); + return ( +
+ {/* Selection Buttons */} +
+ {items.map((item, index) => { + const active: boolean = selected === item; + return ( + + + + ); + })} +
+ + {/* Selected Content */} + {selected && ( + +
{selected.content}
+
+ )} +
+ ); +}; +export default Navigation; diff --git a/src/components/landing/theme-switcher.tsx b/src/components/landing/theme-switcher.tsx index b9debbb..73b626d 100644 --- a/src/components/landing/theme-switcher.tsx +++ b/src/components/landing/theme-switcher.tsx @@ -12,7 +12,7 @@ const ThemeSwitcher = (): ReactElement => { const isLight = theme === "light"; return (