diff --git a/.env.example b/.env.example index 692878963..f2d66eebb 100644 --- a/.env.example +++ b/.env.example @@ -8,30 +8,30 @@ DATABASE_URL="postgresql://root:mysecretpassword@localhost:5432/local" BETTER_AUTH_SECRET="" # Stripe -NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY="" -STRIPE_SECRET_KEY="" -STRIPE_SECRET_WEBHOOK_KEY="" +NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY="asdasdasdasdasdasd" +STRIPE_SECRET_KEY="asdasdasdasdasdasdasd" +STRIPE_SECRET_WEBHOOK_KEY="asdasdasdasdasdasdasd" # Discord -DISCORD_BOT_TOKEN="" -DISCORD_CLIENT_ID="" +DISCORD_BOT_TOKEN="asdasdasdasdasdasd" +DISCORD_CLIENT_ID="asdasdasdasdasdasd" DISCORD_CLIENT_SECRET="" -DISCORD_DAILY_ANIMAL_WEBHOOK_URL="" -DISCORD_LEETCODE_DAILY_WEBHOOK_URL="" -DISCORD_DAILY_REMINDERS_WEBHOOK_URL="" -DISCORD_PRE_DAILY_REMINDERS_WEBHOOK_URL="" -DISCORD_WEATHER_API_KEY="" +DISCORD_DAILY_ANIMAL_WEBHOOK_URL="asdasdasdasdasdasd" +DISCORD_LEETCODE_DAILY_WEBHOOK_URL="asdasdasdasdasdasd" +DISCORD_DAILY_REMINDERS_WEBHOOK_URL="asdasdasdasdasdasd" +DISCORD_PRE_DAILY_REMINDERS_WEBHOOK_URL="asdasdasdasdasdasd" +DISCORD_WEATHER_API_KEY="asdasdasdasdasdasd" # Google -GOOGLE_PRIVATE_KEY_B64="" -GOOGLE_CLIENT_EMAIL="" +GOOGLE_PRIVATE_KEY_B64="asdasdasdasdasdasd" +GOOGLE_CLIENT_EMAIL="stevie@gmail.com" # Minio -MINIO_ENDPOINT="" -MINIO_ACCESS_KEY="" -MINIO_SECRET_KEY="" +MINIO_ENDPOINT="asdasdasdasdasdasd" +MINIO_ACCESS_KEY="asdasdasdasdasdasd" +MINIO_SECRET_KEY="asdasdasdasdasdasd" #can I get a cheese burger -BLADE_URL="" +BLADE_URL="asdasdasdasdasdasd" # Passkit WWDR_CERT_BASE64= @@ -42,5 +42,5 @@ PASS_TYPE_IDENTIFIER= TEAM_IDENTIFIER= #Resend -RESEND_API_KEY="" -RESEND_FROM_EMAIL="" +RESEND_API_KEY="asdasdasdasdasdasdasd" +RESEND_FROM_EMAIL="asdasdasdasdasdasdasd" diff --git a/apps/blade/package.json b/apps/blade/package.json index d7ffbd00a..d950c3d96 100644 --- a/apps/blade/package.json +++ b/apps/blade/package.json @@ -39,6 +39,7 @@ "canvas-confetti": "^1.9.3", "csv-parse": "^6.1.0", "csv-stringify": "^6.6.0", + "framer-motion": "^12.0.1", "geist": "^1.3.1", "google-auth-library": "^9.15.0", "googleapis": "^144.0.0", diff --git a/apps/blade/public/noah_img/city.svg b/apps/blade/public/noah_img/city.svg new file mode 100644 index 000000000..01cc4a79d --- /dev/null +++ b/apps/blade/public/noah_img/city.svg @@ -0,0 +1 @@ + diff --git a/apps/blade/public/noah_img/github.svg b/apps/blade/public/noah_img/github.svg new file mode 100644 index 000000000..25a4403fd --- /dev/null +++ b/apps/blade/public/noah_img/github.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/apps/blade/public/noah_img/linkedin.svg b/apps/blade/public/noah_img/linkedin.svg new file mode 100644 index 000000000..902724e5c --- /dev/null +++ b/apps/blade/public/noah_img/linkedin.svg @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/apps/blade/public/noah_img/mahoraga.png b/apps/blade/public/noah_img/mahoraga.png new file mode 100644 index 000000000..483528667 Binary files /dev/null and b/apps/blade/public/noah_img/mahoraga.png differ diff --git a/apps/blade/public/noah_img/megumi.png b/apps/blade/public/noah_img/megumi.png new file mode 100644 index 000000000..80748c390 Binary files /dev/null and b/apps/blade/public/noah_img/megumi.png differ diff --git a/apps/blade/public/noah_img/moon.png b/apps/blade/public/noah_img/moon.png new file mode 100644 index 000000000..e500fe07d Binary files /dev/null and b/apps/blade/public/noah_img/moon.png differ diff --git a/apps/blade/public/noah_img/myGoat.png b/apps/blade/public/noah_img/myGoat.png new file mode 100644 index 000000000..59723897e Binary files /dev/null and b/apps/blade/public/noah_img/myGoat.png differ diff --git a/apps/blade/public/noah_img/name.png b/apps/blade/public/noah_img/name.png new file mode 100644 index 000000000..6b524d16b Binary files /dev/null and b/apps/blade/public/noah_img/name.png differ diff --git a/apps/blade/public/noah_img/portfolio.svg b/apps/blade/public/noah_img/portfolio.svg new file mode 100644 index 000000000..ae3af13fc --- /dev/null +++ b/apps/blade/public/noah_img/portfolio.svg @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/apps/blade/public/noah_img/resume.svg b/apps/blade/public/noah_img/resume.svg new file mode 100644 index 000000000..076f006d8 --- /dev/null +++ b/apps/blade/public/noah_img/resume.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/apps/blade/public/noah_img/wave.svg b/apps/blade/public/noah_img/wave.svg new file mode 100644 index 000000000..c42ac88ef --- /dev/null +++ b/apps/blade/public/noah_img/wave.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/apps/blade/public/resume.pdf b/apps/blade/public/resume.pdf new file mode 100644 index 000000000..d6f6bd455 Binary files /dev/null and b/apps/blade/public/resume.pdf differ diff --git a/apps/blade/src/app/components/AnimatedInfo.tsx b/apps/blade/src/app/components/AnimatedInfo.tsx new file mode 100644 index 000000000..50f9f014e --- /dev/null +++ b/apps/blade/src/app/components/AnimatedInfo.tsx @@ -0,0 +1,165 @@ +"use client"; + +import { useRef } from "react"; +import Image from "next/image"; +import { motion, useInView } from "framer-motion"; + +const AnimatedInfo = () => { + const ref = useRef(null); + const isInView = useInView(ref, { once: true }); + + const outerDivVariants = { + hidden: {}, + show: { + transition: { + staggerChildren: 0.4, + delayChildren: 0.5, + }, + }, + }; + + const textBoxVariants = { + hidden: { + x: 100, + opacity: 0, + }, + show: { + opacity: 1, + x: 0, + transition: { + duration: 1, + }, + }, + }; + + return ( + + +
+

+ Hi, I'm Noah! +

+
+ I'm a first year Computer Science Major at UCF and an active + KnightHacks Member/former kickstart mentee. Click the buttons on the + right to see my resume, LinkedIn, Github, and Portfolio! +
+
+
+
+ +
+
+ Resume +
+
+
+ +
+
+ Linkedin +
+
+
+ +
+
+ Github +
+
+
+ +
+
+ Portfolio +
+
+
+
+
+
+ +

+ Why Me? +

+
+ Though I have only been a club member for a short time, the + hackathons, club meetings, and mentor/mentee sessions I've attended + have endlessly inspired me and fueled my motivation to learn. If + selected, I will approach every task with curiosity and focused + effort, applying the skills I have gained so far while learning new + ones whenever necessary. +
+
+ +

+ About AI Use +

+
+ Unlike the graphic, I WON'T use AI to center divs or write for loops. + I see LLMs as a tool rather than a crutch and treat their responses + like any other potentially unreliable source of information. When I'm + inevitably confronted with a problem that I do not know how to handle, + I'll only use AI to supplement my learning, not to replace it. +
+
+ +
+ THANK YOU FOR YOUR CONSIDERATION! +
+
+
+ ); +}; + +export default AnimatedInfo; diff --git a/apps/blade/src/app/components/MotionDiv.tsx b/apps/blade/src/app/components/MotionDiv.tsx new file mode 100644 index 000000000..e65003d3b --- /dev/null +++ b/apps/blade/src/app/components/MotionDiv.tsx @@ -0,0 +1,34 @@ +"use client"; + +import type { ReactElement } from "react"; +import { motion } from "framer-motion"; + +interface Props { + children: ReactElement; +} + +const MotionDiv = ({ children }: Props) => { + return ( + + {children} + + ); +}; + +export default MotionDiv; diff --git a/apps/blade/src/app/components/ShootingStars.tsx b/apps/blade/src/app/components/ShootingStars.tsx new file mode 100644 index 000000000..06da00db6 --- /dev/null +++ b/apps/blade/src/app/components/ShootingStars.tsx @@ -0,0 +1,58 @@ +"use client"; + +import { useEffect, useState } from "react"; + +const ShootingStars = () => { + const [positionX, setPositionX] = useState(50); + const [positionY, setPositionY] = useState(50); + const [starKey, setStarKey] = useState(0); + const [animationDelay, setAnimationDelay] = useState(1); + const [duration, setDuration] = useState(0); + + const [windowWidth, setWindowWidth] = useState(0); + const [windowHeight, setWindowHeight] = useState(0); + + useEffect(() => { + const spawnsOnTop = Math.random() < 0.5; + + const dx = window.innerWidth; + const dy = window.innerHeight; + + setWindowWidth(dx); + setWindowHeight(dy); + + const speed = 800; + + const distance = Math.hypot(dx, dy); + const newDuration = distance / speed; + + setDuration(newDuration); + + setPositionX(spawnsOnTop ? Math.random() * 100 : 110); + setPositionY(spawnsOnTop ? -10 : Math.random() * 100); + + setAnimationDelay(Math.random() * 5 + 1); + }, [starKey]); + + return ( +
{ + setStarKey((k) => k + 1); + }} + >
+ ); +}; + +export default ShootingStars; diff --git a/apps/blade/src/app/components/Stars.tsx b/apps/blade/src/app/components/Stars.tsx new file mode 100644 index 000000000..f6a128e13 --- /dev/null +++ b/apps/blade/src/app/components/Stars.tsx @@ -0,0 +1,22 @@ +const Stars = () => { + const stars = Array.from({ length: 100 }).map((_, index) => { + const top = Math.random() * 100; + const left = Math.random() * 100; + + return ( +
+ ); + }); + return ( +
{stars}
+ ); +}; + +export default Stars; diff --git a/apps/blade/src/app/layout.tsx b/apps/blade/src/app/layout.tsx index 8e2118d8e..b1e715439 100644 --- a/apps/blade/src/app/layout.tsx +++ b/apps/blade/src/app/layout.tsx @@ -3,7 +3,7 @@ import { GeistMono } from "geist/font/mono"; import { GeistSans } from "geist/font/sans"; import { cn } from "@forge/ui"; -import { ThemeProvider, ThemeToggle } from "@forge/ui/theme"; +import { ThemeProvider } from "@forge/ui/theme"; import { Toaster } from "@forge/ui/toast"; import { TRPCReactProvider } from "~/trpc/react"; @@ -41,16 +41,14 @@ export default function RootLayout(props: { children: React.ReactNode }) { {props.children} -
- -
+
diff --git a/apps/blade/src/app/page.tsx b/apps/blade/src/app/page.tsx index 50d2ff905..913cc10b4 100644 --- a/apps/blade/src/app/page.tsx +++ b/apps/blade/src/app/page.tsx @@ -1,12 +1,110 @@ -import { HydrateClient } from "~/trpc/server"; -import { Auth } from "./_components/auth-showcase"; +import Image from "../../../../node_modules/next/image"; +import AnimatedInfo from "./components/AnimatedInfo"; +import MotionDiv from "./components/MotionDiv"; +import ShootingStars from "./components/ShootingStars"; +import Stars from "./components/Stars"; export default function HomePage() { return ( - -
- -
-
+
+
+
+
+ Image + + + + + +
+
+ +
+
+ + +
+
A WEB DEV TEAM APPLICATION BY...
+
+
+ Image +
+
+
+
+ +
+
+
SCROLL DOWN TO SEE MORE
+
+
+
+
+
+
+ +
+ +
+ VIBE CODERS USING AI FOR EVERY SMALL INCONVENIENCE? +
+ + +
+
+ Megumi +
+
+ MahoGPT +
+
+
+
+
+ +
+
+
); } diff --git a/apps/blade/tailwind.config.ts b/apps/blade/tailwind.config.ts index 056b2d032..9d795a20c 100644 --- a/apps/blade/tailwind.config.ts +++ b/apps/blade/tailwind.config.ts @@ -14,6 +14,36 @@ export default { sans: ["var(--font-geist-sans)", ...fontFamily.sans], mono: ["var(--font-geist-mono)", ...fontFamily.mono], }, + keyframes: { + float: { + '0%, 100%': { transform: 'translateY(0)' }, + '50%': { transform: 'translateY(-10px)' }, + }, + shoot: { + '0%': {transform: 'translate(0,0) rotate(-45deg)'}, + '100%': {transform: 'translate(calc(-1 * var(--dx)), var(--dy)) rotate(-45deg)',} + }, + shrink: { + '0%': {transform: 'scale(1.3)', opacity: '0'}, + '100%': {transform: 'scale(1)', opacity: '.9'} + }, + flyIn: { + '0%': {transform: 'translateY(-100px)'}, + '100%': {transform: 'translateY(0px)'}, + }, + mahoraga: { + '0%, 100%': { transform: 'translateY(0) rotate(-1deg)' }, + '50%': { transform: 'translateY(-10px) rotate(1deg)' }, + } + }, + animation: { + float: 'float 7s ease-in-out infinite', + shoot: 'shoot var(--duration) linear', + shrink: 'shrink 2s ease-in-out', + flyIn: 'flyIn 2s ease-in-out', + mahoraga: 'mahoraga 7s ease-in-out infinite' + }, }, + }, } satisfies Config; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c29a9fef6..af3b0bf80 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -235,6 +235,9 @@ importers: csv-stringify: specifier: ^6.6.0 version: 6.6.0 + framer-motion: + specifier: ^12.0.1 + version: 12.23.12(react-dom@18.3.1(react@18.3.1))(react@18.3.1) geist: specifier: ^1.3.1 version: 1.3.1(next@14.2.28(@babel/core@7.26.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) @@ -9335,6 +9338,7 @@ packages: tar@7.4.3: resolution: {integrity: sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==} engines: {node: '>=18'} + deprecated: Old versions of tar are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exhorbitant rates) by contacting i@izs.me terser-webpack-plugin@5.3.14: resolution: {integrity: sha512-vkZjpUjb6OMS7dhV+tILUW6BhpDR7P2L/aQSAv+Uwk+m8KATX9EccViHTJR2qDtACKPIYndLGCyl3FMo+r2LMw==} @@ -17599,7 +17603,7 @@ snapshots: motion-dom@12.0.0: dependencies: - motion-utils: 12.0.0 + motion-utils: 12.23.6 motion-dom@12.23.12: dependencies: