diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 5178fe4..3bbb014 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -6,14 +6,14 @@ # Note that environment variables can be set in several places # See https://docs.gitlab.com/ci/variables/#cicd-variable-precedence stages: -- test -- secret-detection + - test + - secret-detection sast: - stage: test + stage: test include: -- template: Security/SAST.gitlab-ci.yml -- template: Security/Secret-Detection.gitlab-ci.yml + - template: Security/SAST.gitlab-ci.yml + - template: Security/Secret-Detection.gitlab-ci.yml variables: - SECRET_DETECTION_ENABLED: 'true' + SECRET_DETECTION_ENABLED: 'true' secret_detection: - stage: secret-detection + stage: secret-detection diff --git a/.prettierrc b/.prettierrc index 919a858..6de8911 100644 --- a/.prettierrc +++ b/.prettierrc @@ -1,5 +1,7 @@ { - "tabWidth": 4, - "singleQuote": true, - "useTabs": true -} \ No newline at end of file + "tabWidth": 4, + "singleQuote": true, + "useTabs": true, + "plugins": ["prettier-plugin-tailwindcss"], + "tailwindStylesheet": "./app/globals.css" +} diff --git a/AGENTS.md b/AGENTS.md index 8bd0e39..af3b7c8 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -1,5 +1,9 @@ -# This is NOT the Next.js you know -This version has breaking changes — APIs, conventions, and file structure may all differ from your training data. Read the relevant guide in `node_modules/next/dist/docs/` before writing any code. Heed deprecation notices. +## This is NOT the Next.js you know + +This version has breaking changes — APIs, conventions, and file structure may all differ from your training data. Read the relevant guide in `node_modules/next/dist/docs/` (resolved from this file's directory; in monorepos the `next` package may not be visible from the repo root) before writing any code. Heed deprecation notices. + +This block is written and re-added by `next dev` — verify at `node_modules/next/dist/server/lib/generate-agent-files.js`. Removing it from a diff only re-creates the uncommitted change; committing it with your work keeps the tree clean. + diff --git a/README.md b/README.md index e215bc4..1b81e15 100644 --- a/README.md +++ b/README.md @@ -1,36 +1,23 @@ -This is a [Next.js](https://nextjs.org) project bootstrapped with [`create-next-app`](https://nextjs.org/docs/app/api-reference/cli/create-next-app). +# Cayden's Website -## Getting Started +Software engineer & AI orchestrator portfolio built with **Next.js 16**, **React 19**, **TypeScript**, and **Tailwind CSS 4**, featuring a full-page React Bits `GradientWaves` ("Aurora") background behind sharp, translucent `1px` panels. -First, run the development server: +## Structure -```bash -npm run dev -# or -yarn dev -# or -pnpm dev -# or -bun dev +```text +app/ Root layout, global styles, home page +components/ + layout/ Header, Footer, PageBackground + sections/ Hero, Projects, Feats, Contact + ui/ Reveal, SectionHeading + GradientWaves.tsx Vendored from React Bits +lib/site.ts All editable content and types ``` -Open [http://localhost:3000](http://localhost:3000) with your browser to see the result. +## Development -You can start editing the page by modifying `app/page.tsx`. The page auto-updates as you edit the file. - -This project uses [`next/font`](https://nextjs.org/docs/app/building-your-application/optimizing/fonts) to automatically optimize and load [Geist](https://vercel.com/font), a new font family for Vercel. - -## Learn More - -To learn more about Next.js, take a look at the following resources: - -- [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js features and API. -- [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial. - -You can check out [the Next.js GitHub repository](https://github.com/vercel/next.js) - your feedback and contributions are welcome! - -## Deploy on Vercel - -The easiest way to deploy your Next.js app is to use the [Vercel Platform](https://vercel.com/new?utm_medium=default-template&filter=next.js&utm_source=create-next-app&utm_campaign=create-next-app-readme) from the creators of Next.js. - -Check out our [Next.js deployment documentation](https://nextjs.org/docs/app/building-your-application/deploying) for more details. +```bash +bun install +bun dev # http://localhost:3000 +bun run format +``` diff --git a/app/blog/[slug]/page.tsx b/app/blog/[slug]/page.tsx deleted file mode 100644 index 10b02b6..0000000 --- a/app/blog/[slug]/page.tsx +++ /dev/null @@ -1,23 +0,0 @@ -import Link from "next/link" -import {ArrowLeftIcon} from "@heroicons/react/24/solid" -import {getArticleData} from "@/lib/articles"; - -const Article = async ({params}: { params: Promise<{ slug: string }> }) => { - const {slug} = await params; - const articleData = await getArticleData(slug); - - return ( -
-
- - -

blog homepage

- -

{articleData.date.toString()}

-
-
-
- ) -} - -export default Article; \ No newline at end of file diff --git a/app/blog/page.tsx b/app/blog/page.tsx deleted file mode 100644 index 509e44b..0000000 --- a/app/blog/page.tsx +++ /dev/null @@ -1,21 +0,0 @@ -import {getCategorizedArticles} from "@/lib/articles"; -import ArticleItemList from "@/components/ArticleListItem"; - -export default function BlogPage() { - const articles = getCategorizedArticles() - - return ( - <> -
-
-

Blog & thoughts

-
-
- {articles != null && Object.keys(articles).map((article) => ( - - ))} -
-
- - ); -} \ No newline at end of file diff --git a/app/contact/page.tsx b/app/contact/page.tsx deleted file mode 100644 index 4c95272..0000000 --- a/app/contact/page.tsx +++ /dev/null @@ -1,7 +0,0 @@ -export default function Contact() { - return ( -
-

Contact page, wip.

-
- ) -} \ No newline at end of file diff --git a/app/globals.css b/app/globals.css index 419ac72..294a1b1 100644 --- a/app/globals.css +++ b/app/globals.css @@ -1,84 +1,78 @@ -@import "tailwindcss"; +@import 'tailwindcss'; @theme inline { - --font-cormorantGaramond: "Cormorant_Garamond", "sans-serif"; - --font-poppins: "Poppins", "sans-serif"; - - /* Nord: Polar Night */ - --color-nord-0: #2e3440; - --color-nord-1: #3b4252; - --color-nord-2: #4D535F; - --color-nord-3: #434c5e; - - /* Nord: Snow Storm */ - --color-nord-4: #d8dee9; - --color-nord-5: #e5e9f0; - --color-nord-6: #eceff4; - - /* Nord: Frost */ - --color-nord-7: #8fbcbb; - --color-nord-8: #88c0d0; - --color-nord-9: #81a1c1; - --color-nord-10: #5e81ac; - - /* Nord: Aurora */ - --color-nord-11: #bf616a; - --color-nord-12: #d08770; - --color-nord-13: #ebcb8b; - --color-nord-14: #a3be8c; - --color-nord-15: #b48ead; - - /* Optional semantic aliases */ - --color-polar-night-dark: #2e3440; - --color-polar-night: #3b4252; - --color-polar-night-light: #434c5e; - --color-polar-night-lighter: #4c566a; - - --color-snow-storm-dark: #d8dee9; - --color-snow-storm: #e5e9f0; - --color-snow-storm-light: #eceff4; - - --color-frost-green: #8fbcbb; - --color-frost-cyan: #88c0d0; - --color-frost-blue: #81a1c1; - --color-frost-deep-blue: #5e81ac; - - --color-aurora-red: #bf616a; - --color-aurora-orange: #d08770; - --color-aurora-yellow: #ebcb8b; - --color-aurora-green: #a3be8c; - --color-aurora-purple: #b48ead; + --font-display: + var(--font-geist-serif), ui-serif, Georgia, Cambria, 'Times New Roman', + Times, serif; + --font-serif: + var(--font-geist-serif), ui-serif, Georgia, Cambria, 'Times New Roman', + Times, serif; + --font-sans: var(--font-inter), ui-sans-serif, system-ui, sans-serif; + --font-mono: + var(--font-jetbrains-mono), ui-monospace, SFMono-Regular, monospace; } -.article { - @apply flex flex-col gap-3 font-poppins text-lg tracking-wide mb-20 +@theme { + --color-obsidian: #040807; + --color-aurora: #34d399; + --color-crest: #d1fae5; + --color-ink: #f2faf6; } -.article > h1 { - @apply text-4xl font-cormorantGaramond text-center tracking-tight; +@utility container-page { + @apply mx-auto max-w-5xl px-6; } -.article > h2 { - @apply text-3xl font-cormorantGaramond text-center tracking-tight; +@utility panel { + @apply border border-white/12 bg-obsidian/55 backdrop-blur-md; } -.article > ol { - @apply list-decimal flex flex-col mx-10 gap-2; +@utility btn-primary { + @apply border border-aurora bg-aurora px-5 py-2.5 text-obsidian transition-colors hover:border-crest hover:bg-crest; } -.article > ul { - @apply list-disc flex flex-col mx-10 gap-2; +@utility btn-ghost { + @apply border border-white/20 bg-obsidian/45 px-5 py-2.5 text-ink backdrop-blur-md transition-colors hover:border-aurora hover:text-aurora; } -.article > pre { - @apply bg-neutral-950 text-neutral-50 p-5 overflow-scroll; +html { + scroll-behavior: smooth; + scroll-padding-top: 4rem; } -.article > blockquote { - @apply pl-5 italic border-l-2 border-neutral-600; +::selection { + background: var(--color-aurora); + color: var(--color-obsidian); } -.article > p > img { - @apply w-1/2 mx-auto; +:focus-visible { + outline: 1px solid var(--color-aurora); + outline-offset: 2px; } +@media (scripting: enabled) { + .reveal { + opacity: 0; + transform: translateY(10px); + transition: + opacity 0.5s cubic-bezier(0.16, 1, 0.3, 1), + transform 0.5s cubic-bezier(0.16, 1, 0.3, 1); + transition-delay: var(--reveal-delay, 0ms); + } + + .reveal[data-visible='true'] { + opacity: 1; + transform: none; + } +} + +@media (prefers-reduced-motion: reduce) { + html { + scroll-behavior: auto; + } + .reveal { + opacity: 1; + transform: none; + transition: none; + } +} diff --git a/app/layout.tsx b/app/layout.tsx index 78035a3..01cdd52 100644 --- a/app/layout.tsx +++ b/app/layout.tsx @@ -1,42 +1,54 @@ -import React from "react"; -import type {Metadata} from "next"; -import {Cormorant_Garamond, Poppins} from "next/font/google"; -import "./globals.css"; -import Header from "@/components/layout/layout-header"; +import type { ReactNode } from 'react'; +import type { Metadata, Viewport } from 'next'; +import { Inter, JetBrains_Mono, Space_Grotesk } from 'next/font/google'; +import { GeistSerif } from 'geist/font/serif'; +import './globals.css'; +import Header from '@/components/layout/layout-header'; +import Footer from '@/components/layout/layout-footer'; +import PageBackground from '@/components/layout/page-background'; -const cormorantGaramond = Cormorant_Garamond({ - subsets: ['latin'], - variable: "--font-cormorantGaramond", - weight: ['400'] -}) +const spaceGrotesk = Space_Grotesk({ + subsets: ['latin'], + variable: '--font-space-grotesk', +}); -const poppins = Poppins({ - subsets: ['latin'], - variable: "--font-poppins", - weight: ['400', '600'] -}) +const inter = Inter({ + subsets: ['latin'], + variable: '--font-inter', +}); +const jetbrainsMono = JetBrains_Mono({ + subsets: ['latin'], + variable: '--font-jetbrains-mono', + weight: ['400', '500'], +}); export const metadata: Metadata = { - title: "sh ~./caydencodes.sh", - description: "Come and see what I'm all about.", + title: 'Cayden — Software Engineer & AI Orchestrator', + description: + 'Software engineer and AI orchestrator building clinical interfaces, fleet telemetry, and high-performance web systems.', +}; + +export const viewport: Viewport = { + themeColor: '#040807', }; export default function RootLayout({ - children, - }: Readonly<{ - children: React.ReactNode; + children, +}: Readonly<{ + children: ReactNode; }>) { - return ( - - -
- {children} - - - ); + return ( + + + +
+
{children}
+