A Terminal Neon themed portfolio showcasing ventures, projects, and skills with a modern developer aesthetic.
This is a Next.js 15 portfolio website built with TypeScript, Tailwind CSS 4, and Framer Motion. It features a unique Terminal Neon design system with Electric Cyan primary color, Neon Magenta accents, and immersive terminal-style UI elements.
All colors are defined as CSS variables in src/styles/globals.css using RGB values for alpha channel support:
--color-primary: 0 217 255; /* Electric Cyan #00D9FF */
--color-accent: 255 0 110; /* Neon Magenta #FF006E */
--color-secondary: 204 255 0; /* Electric Lime #CCFF00 */
--color-success: 0 255 159; /* #00FF9F */
--color-warning: 255 184 0; /* #FFB800 */
--color-error: 255 71 87; /* #FF4757 */
CRITICAL: This project uses CSS variables exclusively. NEVER use hardcoded CSS values. All colors, spacing, fonts, shadows, and other design tokens are defined as variables in :root and referenced via Tailwind’s theme configuration.
Why?
rgb(var(--color-primary) / <alpha-value>)All spacing uses CSS variables:
--spacing-xs: 0.25rem; /* 4px */
--spacing-sm: 0.5rem; /* 8px */
--spacing-md: 1rem; /* 16px */
--spacing-lg: 1.5rem; /* 24px */
--spacing-xl: 2rem; /* 32px */
--spacing-2xl: 3rem; /* 48px */
--spacing-3xl: 4rem; /* 64px */
Custom neon glow shadows for that cyberpunk aesthetic:
--shadow-neon-primary: 0 0 5px rgb(var(--color-primary)), 0 0 20px rgb(var(--color-primary));
--shadow-neon-primary-lg: 0 0 10px rgb(var(--color-primary)), 0 0 40px rgb(var(--color-primary));
jlucus2/
├── src/
│ ├── app/
│ │ ├── layout.tsx # Root layout with fonts & metadata
│ │ ├── page.tsx # Homepage with all sections
│ │ └── globals.css # CSS variables & Tailwind directives
│ ├── components/
│ │ ├── layout/
│ │ │ ├── header.tsx # Navigation header
│ │ │ └── footer.tsx # Site footer
│ │ ├── sections/
│ │ │ ├── hero-terminal.tsx # Hero with terminal UI
│ │ │ ├── ventures-section.tsx # Ventures showcase
│ │ │ ├── portfolio-section.tsx # Projects portfolio
│ │ │ ├── skill-tree.tsx # Skills display
│ │ │ ├── contact-section.tsx # Contact form
│ │ │ └── animated-grid.tsx # Background grid
│ │ └── ui/
│ │ ├── button.tsx # Button component with Slot support
│ │ └── command-palette.tsx # Command palette UI
│ ├── data/
│ │ ├── ventures.ts # Ventures data
│ │ ├── projects.ts # Projects data
│ │ └── skills.ts # Skills data
│ ├── lib/
│ │ ├── utils.ts # Utility functions (cn, debounce, etc.)
│ │ └── constants.ts # Site constants & config
│ └── styles/
│ └── globals.css # Global styles & CSS variables
├── public/ # Static assets
├── package.json # Dependencies
├── tsconfig.json # TypeScript config
├── tailwind.config.ts # Tailwind configuration
├── postcss.config.js # PostCSS with Tailwind plugin
└── next.config.js # Next.js configuration
# Install dependencies
npm install
# Start development server
npm run dev
# Build for production
npm run build
# Start production server
npm start
The site runs at http://localhost:3000 in development mode with hot module replacement.
Edit src/lib/constants.ts to update:
Update content in src/data/:
Modify design tokens in src/styles/globals.css:
Supports both button and anchor elements via asChild prop:
// As button
<Button variant="default" size="lg">
Click Me
</Button>
// As link (using asChild with Slot)
<Button variant="outline" size="sm" asChild>
<a href="/link">Visit</a>
</Button>
Variants: default, destructive, outline, secondary, ghost, link Sizes: default, sm, lg, icon Props: loading, asChild, disabled
Located in src/lib/utils.ts:
import { cn, debounce, throttle, lerp, copyToClipboard } from '@/lib/utils'
// Class names merging
cn('class1', 'class2', { conditional: true })
// Debounce function calls
const debouncedFn = debounce(() => {}, 300)
// Linear interpolation for animations
const value = lerp(start, end, progress)
The site is fully responsive with breakpoints:
Powered by Framer Motion:
whileInView with viewport=next/fontnext/image# Install Vercel CLI
npm i -g vercel
# Deploy
vercel
# Build
npm run build
# The output is in .next/ folder
# Deploy .next/ to your hosting provider
Create .env.local for local development:
# Add any API keys or secrets here
NEXT_PUBLIC_SITE_URL=https://jlucus.dev
@tailwindcss/postcss plugin instead of tailwindcss directlyasChild with Button, loading state is ignored (Slot accepts single child only)See PROJECT_ROADMAP.md for planned features and improvements.
This is a personal portfolio, but suggestions and bug reports are welcome!
MIT License - feel free to use this as inspiration for your own portfolio.
Built with by jlucus using Claude Code