diff --git a/AGENTS.md b/AGENTS.md index caeace2..a9332fb 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -1,6 +1,13 @@ -# 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/app/globals.css b/app/globals.css index e128722..752d503 100644 --- a/app/globals.css +++ b/app/globals.css @@ -1,8 +1,10 @@ @import 'tailwindcss'; @theme inline { - --font-display: - var(--font-space-grotesk), ui-sans-serif, system-ui, sans-serif; + --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; diff --git a/app/layout.tsx b/app/layout.tsx index 70fbcf3..d0975a4 100644 --- a/app/layout.tsx +++ b/app/layout.tsx @@ -1,6 +1,7 @@ -import type { ReactNode } from 'react'; -import type { Metadata, Viewport } from 'next'; -import { Inter, JetBrains_Mono, Space_Grotesk } from 'next/font/google'; +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'; @@ -40,7 +41,7 @@ export default function RootLayout({ return ( diff --git a/bun.lock b/bun.lock index 3a1e642..8dbd774 100644 --- a/bun.lock +++ b/bun.lock @@ -6,6 +6,7 @@ "name": "myblog", "dependencies": { "@heroicons/react": "^2.2.0", + "geist": "^1.9.0", "next": "^16.4.3", "react": "^19.3.1", "react-dom": "^19.3.1", @@ -467,6 +468,8 @@ "functions-have-names": ["functions-have-names@1.2.3", "", {}, "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ=="], + "geist": ["geist@1.9.0", "", { "peerDependencies": { "next": ">=13.2.0" } }, "sha512-uxiyxH5PaKDaK2//ln06NxJEz5gc6771BTwSs1YFgNnASGtp1SYD3VZShSIijvlNwDjMgHnzqye4MmIUTspEzw=="], + "generator-function": ["generator-function@2.0.1", "", {}, "sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g=="], "gensync": ["gensync@1.0.0-beta.2", "", {}, "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg=="], diff --git a/components/sections/contact.tsx b/components/sections/contact.tsx index e853c7c..231812e 100644 --- a/components/sections/contact.tsx +++ b/components/sections/contact.tsx @@ -1,10 +1,10 @@ -import { site } from '@/lib/site'; +import {site} from '@/lib/site'; const Contact = () => (
-

+

Get in touch

diff --git a/components/sections/feats.tsx b/components/sections/feats.tsx index c7046f5..c165bb8 100644 --- a/components/sections/feats.tsx +++ b/components/sections/feats.tsx @@ -1,6 +1,6 @@ import Reveal from '@/components/ui/reveal'; import SectionHeading from '@/components/ui/section-heading'; -import { feats } from '@/lib/site'; +import {feats} from '@/lib/site'; const Feats = () => (

@@ -15,7 +15,7 @@ const Feats = () => ( className="border-white/12 p-6 transition-colors not-last:border-b hover:bg-white/[0.04] sm:odd:border-r sm:odd:nth-last-2:border-b-0 md:p-7" > -

+

{feat.title}

diff --git a/components/sections/hero.tsx b/components/sections/hero.tsx index a4b6252..071b5d3 100644 --- a/components/sections/hero.tsx +++ b/components/sections/hero.tsx @@ -1,5 +1,5 @@ import Image from 'next/image'; -import { about, site, stack } from '@/lib/site'; +import {about, site, stack} from '@/lib/site'; const Hero = () => (

@@ -8,8 +8,8 @@ const Hero = () => ( {site.role}

-

- Howdy, I'm {site.name}. +

+ Howdy, I'm Cayden.

{site.tagline} @@ -32,7 +32,7 @@ const Hero = () => (

-
+
Cayden ( -
- - Instant-Response Web Applications - +const Projects = () => { + const rem = projects.length % 3; + const lastRowStart = projects.length - (rem || 3); -
- {projects.map((project, i) => ( - -
-
-

- {project.title} -

-

- {project.blurb} -

-
+ return ( +
+ + Instant-Response Web Applications + -

- {project.stack} -

-
-
- ))} -
-
-); +
+ {projects.map((project, i) => { + const inLastRow = i >= lastRowStart; + const colSpan = + inLastRow && rem === 1 + ? 'md:col-span-6' + : inLastRow && rem === 2 + ? 'md:col-span-3' + : 'md:col-span-2'; + const rightRule = + i !== projects.length - 1 && i % 3 !== 2 + ? 'md:border-r' + : ''; + const bottomRule = inLastRow ? 'md:border-b-0' : ''; + const className = `group grid border-white/12 p-6 transition-colors not-last:border-b hover:bg-white/4 md:p-7 ${colSpan} ${rightRule} ${bottomRule}`; + + const content = ( + +
+
+

+ {project.title} + {project.href && ( + + ↗ + + )} +

+

+ {project.blurb} +

+
+ +

+ {project.stack} +

+
+
+ ); + + return project.href ? ( + + {content} + + ) : ( +
+ {content} +
+ ); + })} +
+
+ ); +}; export default Projects; diff --git a/components/ui/section-heading.tsx b/components/ui/section-heading.tsx index 701adb2..152908f 100644 --- a/components/ui/section-heading.tsx +++ b/components/ui/section-heading.tsx @@ -1,4 +1,4 @@ -import type { ReactNode } from 'react'; +import type {ReactNode} from 'react'; type Props = { title: string; @@ -9,7 +9,7 @@ const SectionHeading = ({ title, children }: Props) => (
-

+

{title}

diff --git a/lib/site.ts b/lib/site.ts index d9145fa..1d4c7b6 100644 --- a/lib/site.ts +++ b/lib/site.ts @@ -2,6 +2,7 @@ export type Project = { title: string; blurb: string; stack: string; + href?: string; }; export type Feat = { @@ -10,7 +11,7 @@ export type Feat = { }; export const site = { - name: 'Cayden', + name: 'Cayden Codes', role: 'Web Developer', tagline: "I'm a proven people leader building fast, dependable web software for clinical floors and fleet operations.", @@ -29,7 +30,7 @@ export const stack = ['TypeScript', 'React', 'Next.js', 'Python', 'JavaScript']; export const about = [ 'I engineer responsive, high-performance web applications where speed and clarity are paramount, specializing in touch-first EHR interfaces and live fleet telemetry for mobile medical workstations. I bridge the gap between human workflows and technical architecture to deliver interfaces that feel natural, comfortable, and precise.', - "Outside of software engineering, I directed one of the Southeast’s largest interest-driven communities, producing 250-attendee live events, speaking at regional conventions, and coordinating partnerships with major streaming platforms.", + 'Outside of software engineering, I directed one of the Southeast’s largest interest-driven communities, producing 250-attendee live events, speaking at regional conventions, and coordinating partnerships with major streaming platforms.', ]; export const projects: Project[] = [ @@ -48,6 +49,18 @@ export const projects: Project[] = [ blurb: 'Validated configuration tooling for programming power delivery controllers in multi-cell battery packs.', stack: 'Next.js · Python · Embedded', }, + { + title: 'Wayfarer', + blurb: 'Multi-provider weather station pairing animated NEXRAD and global radar maps with live NWS alerts, air quality, and 14-day forecasts.', + stack: 'Next.js · TypeScript · Tailwind CSS · Leaflet', + href: 'https://wayfarer.caydens.dev', + }, + { + title: 'Plan My Meal', + blurb: 'Budget-first weekly meal planner with whole-package grocery pricing, ingredient overlap scoring, and appliance-aware filtering across 420+ recipes.', + stack: 'Next.js · TypeScript · Tailwind CSS', + href: 'https://planmymeal.caydens.dev', + }, ]; export const feats: Feat[] = [ diff --git a/package.json b/package.json index c64aa47..8f131c0 100644 --- a/package.json +++ b/package.json @@ -11,6 +11,7 @@ }, "dependencies": { "@heroicons/react": "^2.2.0", + "geist": "^1.9.0", "next": "^16.4.3", "react": "^19.3.1", "react-dom": "^19.3.1"