diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 3bbb014..5178fe4 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 6de8911..919a858 100644 --- a/.prettierrc +++ b/.prettierrc @@ -1,7 +1,5 @@ { - "tabWidth": 4, - "singleQuote": true, - "useTabs": true, - "plugins": ["prettier-plugin-tailwindcss"], - "tailwindStylesheet": "./app/globals.css" -} + "tabWidth": 4, + "singleQuote": true, + "useTabs": true +} \ No newline at end of file diff --git a/AGENTS.md b/AGENTS.md index af3b7c8..8bd0e39 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -1,9 +1,5 @@ +# This is NOT the Next.js you know -## 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. - +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. diff --git a/README.md b/README.md index 1b81e15..e215bc4 100644 --- a/README.md +++ b/README.md @@ -1,23 +1,36 @@ -# Cayden's Website +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). -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. +## Getting Started -## Structure - -```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 -``` - -## Development +First, run the development server: ```bash -bun install -bun dev # http://localhost:3000 -bun run format +npm run dev +# or +yarn dev +# or +pnpm dev +# or +bun dev ``` + +Open [http://localhost:3000](http://localhost:3000) with your browser to see the result. + +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. diff --git a/app/blog/[slug]/page.tsx b/app/blog/[slug]/page.tsx new file mode 100644 index 0000000..10b02b6 --- /dev/null +++ b/app/blog/[slug]/page.tsx @@ -0,0 +1,23 @@ +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 new file mode 100644 index 0000000..509e44b --- /dev/null +++ b/app/blog/page.tsx @@ -0,0 +1,21 @@ +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 new file mode 100644 index 0000000..4c95272 --- /dev/null +++ b/app/contact/page.tsx @@ -0,0 +1,7 @@ +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 294a1b1..419ac72 100644 --- a/app/globals.css +++ b/app/globals.css @@ -1,78 +1,84 @@ -@import 'tailwindcss'; +@import "tailwindcss"; @theme inline { - --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; + --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; } -@theme { - --color-obsidian: #040807; - --color-aurora: #34d399; - --color-crest: #d1fae5; - --color-ink: #f2faf6; +.article { + @apply flex flex-col gap-3 font-poppins text-lg tracking-wide mb-20 } -@utility container-page { - @apply mx-auto max-w-5xl px-6; +.article > h1 { + @apply text-4xl font-cormorantGaramond text-center tracking-tight; } -@utility panel { - @apply border border-white/12 bg-obsidian/55 backdrop-blur-md; +.article > h2 { + @apply text-3xl font-cormorantGaramond text-center tracking-tight; } -@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 > ol { + @apply list-decimal 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 > ul { + @apply list-disc flex flex-col mx-10 gap-2; } -html { - scroll-behavior: smooth; - scroll-padding-top: 4rem; +.article > pre { + @apply bg-neutral-950 text-neutral-50 p-5 overflow-scroll; } -::selection { - background: var(--color-aurora); - color: var(--color-obsidian); +.article > blockquote { + @apply pl-5 italic border-l-2 border-neutral-600; } -:focus-visible { - outline: 1px solid var(--color-aurora); - outline-offset: 2px; +.article > p > img { + @apply w-1/2 mx-auto; } -@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 01cdd52..78035a3 100644 --- a/app/layout.tsx +++ b/app/layout.tsx @@ -1,54 +1,42 @@ -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'; +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"; -const spaceGrotesk = Space_Grotesk({ - subsets: ['latin'], - variable: '--font-space-grotesk', -}); +const cormorantGaramond = Cormorant_Garamond({ + subsets: ['latin'], + variable: "--font-cormorantGaramond", + weight: ['400'] +}) -const inter = Inter({ - subsets: ['latin'], - variable: '--font-inter', -}); +const poppins = Poppins({ + subsets: ['latin'], + variable: "--font-poppins", + weight: ['400', '600'] +}) -const jetbrainsMono = JetBrains_Mono({ - subsets: ['latin'], - variable: '--font-jetbrains-mono', - weight: ['400', '500'], -}); export const metadata: Metadata = { - 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', + title: "sh ~./caydencodes.sh", + description: "Come and see what I'm all about.", }; export default function RootLayout({ - children, -}: Readonly<{ - children: ReactNode; + children, + }: Readonly<{ + children: React.ReactNode; }>) { - return ( - - - -
-
{children}
-