initial
This commit is contained in:
@@ -0,0 +1,172 @@
|
||||
# Koko Blog
|
||||
|
||||
A fast, beautiful personal blog built with Astro, TypeScript, and a synthwave purple theme.
|
||||
|
||||
**Load time:** < 100ms | **Bundle size:** < 50KB | **Zero runtime JS by default**
|
||||
|
||||
---
|
||||
|
||||
## Stack
|
||||
|
||||
- **Framework:** Astro 5 — static output, file-based routing, zero JS by default
|
||||
- **Language:** TypeScript strict
|
||||
- **Package manager:** pnpm
|
||||
- **Syntax highlighting:** Shiki / Dracula (built into Astro, zero runtime cost)
|
||||
- **Image optimization:** `node image-optimizer.js` (WebP via sharp, run before build)
|
||||
- **Content:** Astro Content Collections with Zod schema
|
||||
|
||||
> **For AI agents:** All components are `.astro` files. No React, no Vue, no `.tsx`. Astro uses
|
||||
> `---` frontmatter fences, not `<template>` or `<script setup>`. File-based routing lives in
|
||||
> `src/pages/` — no router library needed. If existing files contradict this, ignore them and
|
||||
> follow this README.
|
||||
|
||||
---
|
||||
|
||||
## Quick Start
|
||||
|
||||
```bash
|
||||
pnpm install
|
||||
pnpm dev # dev server at http://localhost:4321
|
||||
pnpm build # production build → dist/
|
||||
pnpm preview # preview production build
|
||||
pnpm check # TypeScript check (astro check, not tsc)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Project Structure
|
||||
|
||||
```
|
||||
koko-blog/
|
||||
├── public/
|
||||
│ ├── images/
|
||||
│ │ ├── posts/ # Blog post hero images
|
||||
│ │ └── previews/ # WebP-optimised thumbnails
|
||||
│ └── favicon.svg
|
||||
├── src/
|
||||
│ ├── components/ # .astro components only
|
||||
│ │ ├── Layout.astro # Base page layout (head, header, footer)
|
||||
│ │ ├── Header.astro # Navigation + mobile menu
|
||||
│ │ ├── Sidebar.astro # Collapsible sidebar
|
||||
│ │ ├── Footer.astro
|
||||
│ │ ├── Hero.astro # Homepage hero with carousel
|
||||
│ │ ├── PostCard.astro # Blog post preview card
|
||||
│ │ └── PostGrid.astro # Posts grid layout
|
||||
│ ├── pages/ # File-based routing (.astro files only)
|
||||
│ │ ├── index.astro # Homepage
|
||||
│ │ ├── posts/
|
||||
│ │ │ └── [slug].astro # Individual post page
|
||||
│ │ └── 404.astro
|
||||
│ ├── content/
|
||||
│ │ ├── config.ts # Zod schema for blog collection
|
||||
│ │ └── blog/ # Markdown posts (.md files)
|
||||
│ ├── styles/
|
||||
│ │ ├── synthwave.css # CSS custom properties (theme variables)
|
||||
│ │ └── global.css # Resets and base styles
|
||||
│ └── env.d.ts # /// <reference types="astro/client" />
|
||||
├── image-optimizer.js # WebP conversion (run: node image-optimizer.js)
|
||||
├── astro.config.mjs # Astro config (output: static, shiki/dracula)
|
||||
├── tsconfig.json # extends astro/tsconfigs/strict + path aliases
|
||||
├── PLAN.md
|
||||
└── TODO.md
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Scripts
|
||||
|
||||
| Command | Description |
|
||||
|---------|-------------|
|
||||
| `pnpm dev` | Start dev server (port 4321) |
|
||||
| `pnpm build` | Build for production |
|
||||
| `pnpm preview` | Preview production build |
|
||||
| `pnpm check` | Type-check with `astro check` |
|
||||
| `node image-optimizer.js` | Convert images to WebP (run before build) |
|
||||
|
||||
---
|
||||
|
||||
## Design System
|
||||
|
||||
### Colors
|
||||
|
||||
| Token | Hex | Usage |
|
||||
|-------|-----|-------|
|
||||
| Primary | `#6a1b9a` | Buttons, accents, links |
|
||||
| Primary Dark | `#510ca9` | Hover states |
|
||||
| Secondary | `#000080` | Electronic sheen elements |
|
||||
| Background | `#000000` | Page background |
|
||||
| Paper | `#121212` | Card backgrounds |
|
||||
| Text Primary | `#ffffff` | Headings |
|
||||
| Text Secondary | `#eeeeee` | Body text |
|
||||
| Text Muted | `#888888` | Metadata |
|
||||
|
||||
### Typography
|
||||
|
||||
- **Headlines:** 2.5rem–4rem, weight 800
|
||||
- **Titles:** 1.8rem, weight 700
|
||||
- **Body:** 1rem, line-height 1.8
|
||||
- **Code:** Monospace, dark background (Shiki/Dracula)
|
||||
|
||||
### Breakpoints
|
||||
|
||||
- **Mobile:** < 768px
|
||||
- **Tablet:** 768px–1024px
|
||||
- **Desktop:** > 1024px
|
||||
|
||||
---
|
||||
|
||||
## Writing Content
|
||||
|
||||
Posts live in `src/content/blog/` as `.md` files with YAML frontmatter:
|
||||
|
||||
```markdown
|
||||
---
|
||||
title: "My Awesome Post"
|
||||
slug: "my-awesome-post"
|
||||
excerpt: "A brief description..."
|
||||
publishedAt: "2026-02-28"
|
||||
category: "Game Development"
|
||||
tags: ["unity", "csharp"]
|
||||
image: "/images/posts/hero.jpg"
|
||||
draft: false
|
||||
---
|
||||
|
||||
Your content here with **markdown** support.
|
||||
|
||||
```typescript
|
||||
// Syntax highlighting via Shiki/Dracula — zero runtime JS
|
||||
const hello = "world";
|
||||
```
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## TypeScript Path Aliases
|
||||
|
||||
```typescript
|
||||
import Layout from '@components/Layout.astro';
|
||||
import '@styles/global.css';
|
||||
```
|
||||
|
||||
Available aliases (defined in `tsconfig.json`):
|
||||
- `@/*` → `./src/*`
|
||||
- `@components/*` → `./src/components/*`
|
||||
- `@layouts/*` → `./src/layouts/*`
|
||||
- `@styles/*` → `./src/styles/*`
|
||||
- `@utils/*` → `./src/utils/*`
|
||||
|
||||
---
|
||||
|
||||
## Performance Targets
|
||||
|
||||
| Metric | Target |
|
||||
|--------|--------|
|
||||
| Load time | < 100ms |
|
||||
| Bundle size | < 50KB (gzipped) |
|
||||
| First Contentful Paint | < 50ms |
|
||||
| Largest Contentful Paint | < 1s |
|
||||
| Lighthouse score | > 90 |
|
||||
|
||||
---
|
||||
|
||||
**Built with:** Astro • TypeScript • pnpm
|
||||
Reference in New Issue
Block a user