- Delete dev/CLAUDE.md, dev/blog-example.html, dev/contact-form-plan.md, dev/index.html, dev/optimization-guidelines.md, dev/plan.md - Update CLAUDE.md to include Design Specification section referencing dev/design.json - Modify dev/design.json with V7 Industrial Dark Mode system details - Update src/utils/git-commit.js to reflect new commit message format
117 lines
4.6 KiB
Markdown
117 lines
4.6 KiB
Markdown
# CLAUDE.md
|
|
|
|
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
|
|
|
|
## Development Commands
|
|
|
|
### Core Development
|
|
```bash
|
|
pnpm dev # Run development server
|
|
pnpm build # Build the project
|
|
pnpm preview # Build and preview with Wrangler
|
|
pnpm deploy # Build and deploy to Cloudflare Pages
|
|
```
|
|
|
|
### Utilities
|
|
```bash
|
|
# Git commit message automation
|
|
pnpm commit # Interactive: review, accept/edit, optionally push
|
|
pnpm commit --accept # Auto-accept message, prompt for push
|
|
pnpm commit --accept --no-push # Auto-accept and commit without pushing
|
|
pnpm commit --accept --push # Fully automated: accept and push
|
|
|
|
pnpm notepad # Quick note-taking utility
|
|
|
|
# Image conversion to AVIF format
|
|
pnpm run convert:avif:all # Convert all images
|
|
pnpm run convert:avif:jpeg # Convert JPEG only
|
|
pnpm run convert:avif:png # Convert PNG only
|
|
```
|
|
|
|
## High-Level Architecture
|
|
|
|
This is an Astro-based portfolio and blog site deployed on Cloudflare Pages. The architecture follows a content-driven approach with three distinct layers:
|
|
|
|
### 1. Content Layer (`src/content/**`)
|
|
Content is managed via Astro's Content Collections API with schema validation defined in `src/content.config.ts`:
|
|
|
|
- **`blog/`** - Blog posts as MDX files
|
|
- Schema: title, description, pubDate, heroImage (optional), featured (boolean), category, tags
|
|
- Posts are sorted by pubDate (newest first)
|
|
|
|
- **`sections/`** - Homepage section content (hero, experience, skills, featured-project)
|
|
- Each section has a custom schema for its specific data needs
|
|
- Experience entries include systemId, status, dates, company, role, achievements, links
|
|
- Skills entries include domain, tools, proficiency
|
|
|
|
- **`pages/`** - Page-specific content (contact form configuration)
|
|
- Includes form labels, social links, subject options
|
|
|
|
### 2. Component Layer
|
|
Components are organized by purpose:
|
|
|
|
- **Core UI**: `BlogCard`, `FormattedDate`, `Navigation`, `Footer`, `GridOverlay`
|
|
- **Blog-specific**: `BlogFilters`, `ReadingProgress`, `TableOfContents`, `PostNavigation`, `RelatedPosts`
|
|
- **Section components**: `Hero`, `Experience`, `Skills`, `FeaturedProject`
|
|
|
|
### 3. Page & Layout Layer
|
|
- **Layouts**: `BaseLayout` (shared structure), `BlogPost` (blog template)
|
|
- **Routes**: Static routes in `src/pages/` with dynamic blog routes via `[...slug].astro`
|
|
|
|
## Data Flow Patterns
|
|
|
|
### Blog Index (`src/pages/blog/index.astro`)
|
|
1. Fetches all posts via `getCollection('blog')`
|
|
2. Sorts by pubDate (newest first)
|
|
3. Identifies featured post (first with `featured: true` or fallback to latest)
|
|
4. Renders featured hero + filterable grid of all posts
|
|
5. Extracts unique categories for filter UI
|
|
|
|
### Individual Blog Posts (`src/pages/blog/[...slug].astro`)
|
|
1. Uses `getStaticPaths()` to generate all blog post routes
|
|
2. For each post, calculates:
|
|
- Previous/next posts (by date)
|
|
- Related posts (matching category or shared tags, limited to 3)
|
|
- Reading time (based on word count, 200 wpm)
|
|
3. Passes everything to `BlogPost` layout which handles headings, navigation, related posts
|
|
|
|
### Content Collections
|
|
All content follows the schema validation pattern:
|
|
```
|
|
MDX file → src/content.config.ts schema → getCollection() → Component props
|
|
```
|
|
|
|
## Key Technical Patterns
|
|
|
|
### Image Handling
|
|
- Assets in `src/assets/` are processed by Astro (use relative paths in frontmatter)
|
|
- Static files in `public/media/` are served as-is (use absolute paths like `/media/file.mp4`)
|
|
- AVIF conversion utility available for optimization
|
|
|
|
## Design Specification
|
|
|
|
`dev/design.json` contains V7 Industrial Dark Mode system specification (not yet implemented):
|
|
- Dark mode native with `#0B0D11` primary background
|
|
- Orange/yellow accent `#FFB84C` for CTAs
|
|
- Brutalist/industrial aesthetic with visible grid structure
|
|
- Heavy typography emphasis
|
|
|
|
### Deployment
|
|
- Cloudflare Pages adapter configured in `astro.config.mjs`
|
|
- Image service set to "compile" mode
|
|
- Platform proxy enabled for development
|
|
|
|
## Blog Post Creation Workflow
|
|
|
|
1. Create `.mdx` file in `src/content/blog/` (filename becomes URL slug)
|
|
2. Add required frontmatter: title, description, pubDate
|
|
3. Optionally add: heroImage, featured, category, tags
|
|
4. Write content using Markdown/MDX with embedded JSX/HTML
|
|
5. Images can reference `src/assets/` (relative) or `public/media/` (absolute)
|
|
|
|
## Utility Scripts
|
|
|
|
- **`src/utils/convert-to-avif.js`** - Converts images to AVIF format with quality options
|
|
- **`src/utils/git-commit.js`** - Auto-generates commit messages from staged changes
|
|
- **`src/utils/notepad.js`** - Quick note-taking utility
|