# TypoGenie - AI Coding Agent Guide

## Project Overview

TypoGenie is a web application that transforms Markdown content into professionally formatted Microsoft Word documents. Users upload `.md` or `.txt` files, select from 40+ typography styles across multiple categories (Minimalist, Corporate, Editorial, Tech, Creative, etc.), and download a formatted `.docx` file.

The application uses a local Markdown parser (marked) rather than AI for document conversion, though it was originally designed with AI integration in mind.

## Technology Stack

- **Framework**: React 19.2.4 with TypeScript 5.8.2
- **Build Tool**: Vite 6.2.0
- **Styling**: Tailwind CSS (loaded via CDN in `index.html`)
- **Icons**: Lucide React
- **Document Generation**: docx library (client-side DOCX creation)
- **Markdown Parsing**: marked library (local conversion, no API calls)
- **Fonts**: Google Fonts loaded dynamically

## Project Structure

```
├── App.tsx                 # Main application component with state machine
├── index.tsx               # React root mount
├── index.html              # HTML entry, Tailwind CDN, import maps
├── types.ts                # TypeScript interfaces (StyleOption, DocxStyleConfig, etc.)
├── constants.ts            # System prompts and style exports
├── components/
│   ├── FileUpload.tsx      # Drag-and-drop file upload (.md, .txt)
│   ├── StyleSelector.tsx   # Style grid with preview iframe
│   ├── Preview.tsx         # Final preview and DOCX export
│   └── StylePreviewModal.tsx # (Unused) Modal style preview component

├── styles/                 # Typography style definitions
│   ├── index.ts            # Aggregates all style categories
│   ├── minimalist.ts       # 11 minimalist styles
│   ├── corporate.ts        # 13 corporate/professional styles
│   ├── editorial.ts        # Editorial/magazine styles
│   ├── tech.ts             # Tech/startup styles
│   ├── creative.ts         # Creative/artistic styles
│   ├── vintage.ts          # Retro/vintage styles
│   ├── lifestyle.ts        # Lifestyle/blog styles
│   ├── academic.ts         # Academic/research styles
│   └── industrial.ts       # Industrial/technical styles
```

## Application State Flow

The app uses a 4-state machine defined in `types.ts`:

1. **UPLOAD** - Initial screen with file upload dropzone
2. **CONFIG** - Style selection interface with live preview
3. **GENERATING** - Processing animation (800ms artificial delay for UX)
4. **PREVIEW** - Final preview with DOCX download option

State transitions:
- UPLOAD → CONFIG: After file loaded successfully
- CONFIG → GENERATING: When user clicks "Apply Style & Convert"
- GENERATING → PREVIEW: After HTML generation completes
- PREVIEW → CONFIG: Via "Back to Editor" button
- Any → UPLOAD: Via header logo click (reset)

## Style System Architecture

Each style is a `StyleOption` object containing:

```typescript
{
  id: string,                    // Unique identifier
  name: string,                  // Display name
  category: string,              // For filtering (Minimalist, Corporate, etc.)
  description: string,           // Short description
  vibe: string,                  // Mood/aesthetic descriptor
  googleFontsImport: string,     // Google Fonts URL
  wordConfig: {
    heading1: DocxStyleConfig,   // H1 formatting for Word
    heading2: DocxStyleConfig,   // H2 formatting for Word
    body: DocxStyleConfig,       // Body text formatting for Word
    accentColor: string          // Brand accent color
  },
  previewCss: string             // CSS string for web preview (must manually match wordConfig)
}
```

**Important**: `wordConfig` and `previewCss` must be kept in sync manually for visual fidelity between preview and exported document.

## Build Commands

```bash
# Install dependencies
npm install

# Development server (runs on port 3000)
npm run dev

# Production build (outputs to dist/)
npm run build

# Preview production build
npm run preview
```

## Environment Configuration

No environment variables required. The app uses local Markdown parsing only.

## Key Implementation Details

### DOCX Generation (components/Preview.tsx)

The DOCX export uses the `docx` library to create Word-compatible documents:

- Converts HTML to docx Paragraph elements
- Supports headings (h1-h6), paragraphs, blockquotes, lists
- Applies style-specific fonts, colors, spacing, borders, and shading
- Paper sizes: A4 (210mm × 297mm) and Letter (8.5in × 11in)
- Margins: 1in top/bottom, 1.2in left/right

### Preview System

Previews render in an iframe with dynamically injected:
- Google Fonts link from style config
- Style-specific CSS from `previewCss`
- Sample content for style selection view
- Actual converted content for final preview

### File Upload

Accepts: `.md`, `.txt`, `.markdown`
Uses FileReader API for client-side text extraction
Validates file extension before processing

## Code Style Guidelines

- **TypeScript**: Strict mode enabled; all components typed with React.FC
- **Imports**: Use `@/` path alias for project root imports
- **Styling**: Tailwind utility classes; custom CSS only in `previewCss` fields
- **Naming**: PascalCase for components, camelCase for functions/variables
- **Comments**: Explain business logic and non-obvious decisions

## Adding New Typography Styles

1. Choose appropriate category file in `/styles/` (or create new category)
2. Add StyleOption object to the array with:
   - Unique `id`
   - Google Fonts URL
   - Complete `wordConfig` for DOCX export
   - Matching `previewCss` for web preview
3. Export from `/styles/index.ts` if new category
4. Test both preview and DOCX export

## Security Considerations

- No server-side processing; all conversion happens client-side
- No API keys required; all processing is done locally
- File upload limited to text files by extension check
- iframe sandboxing for style previews (same-origin content only)

## Known Limitations

- `wordConfig` and `previewCss` require manual synchronization
- DOCX export has limited table support
- Complex Markdown (nested lists, code blocks) may not format perfectly
- Style categories are loosely organized and may overlap
