231 lines
7.2 KiB
Markdown
231 lines
7.2 KiB
Markdown
# IF.docs.md2html - Project Summary
|
|
|
|
## What We Built
|
|
|
|
A **magazine-style Markdown viewer** that transforms plain `.md` files into beautiful, animated documents using the **ICW NextSpread design system** from icantwait.ca property showcase.
|
|
|
|
## Key Features
|
|
|
|
### 🎨 Design System (Ported from ICW)
|
|
- **Typography**: Inter headings, system fonts for body, JetBrains Mono for code
|
|
- **Colors**: Neutral palette (50-900), Primary green (#10B981)
|
|
- **Spacing**: 8-point grid system, generous white space
|
|
- **Animations**: Webflow-style ease curves `[0.25, 0.46, 0.45, 0.94]`
|
|
|
|
### ✨ Animations (ICW Property Page Patterns)
|
|
- **Adaptive Duration**: Animation speed adjusts to scroll velocity
|
|
- Fast scroll = shorter animations (0.5x speed)
|
|
- Slow scroll = longer animations (1.5x speed)
|
|
- **Staggered Reveals**: Gallery-style cascade with 50ms delays
|
|
- **Scroll Triggers**: IntersectionObserver with -10% margin
|
|
- **Reduced Motion**: Respects accessibility preferences
|
|
|
|
### 📱 Layout
|
|
- **Magazine Grid**: 2-column main content + 1-column sidebar (desktop)
|
|
- **Full-Bleed Hero**: 40vh mobile, 50vh desktop with gradient overlay
|
|
- **Sticky Sidebar**: Navigation panel follows scroll
|
|
- **Responsive**: Mobile-first (320px) → Desktop (1440px+)
|
|
|
|
### 🚀 Functionality
|
|
- **Drag-and-Drop Upload**: `.md` and `.markdown` files
|
|
- **URL Parsing**: `?parse=https://url/file.md` query parameter
|
|
- **Syntax Highlighting**: VS Code Dark+ theme via highlight.js
|
|
- **Static Export**: Pre-rendered HTML for fast loading
|
|
|
|
## Components
|
|
|
|
### HeroSection (`src/components/HeroSection.tsx`)
|
|
- Full-bleed hero with gradient overlay
|
|
- Animated badge, title, CTA buttons
|
|
- ICW-style drop shadows and backdrop blur
|
|
|
|
### MagazineContent (`src/components/MagazineContent.tsx`)
|
|
- 2-column grid layout
|
|
- Staggered element reveals via IntersectionObserver
|
|
- Sticky sidebar with navigation
|
|
|
|
### MarkdownViewer (`src/components/MarkdownViewer.tsx`)
|
|
- Main wrapper component
|
|
- Orchestrates hero + content sections
|
|
- Adaptive animation timing
|
|
|
|
### FileUploader (`src/components/FileUploader.tsx`)
|
|
- Drag-and-drop zone with hover states
|
|
- File input fallback
|
|
- Loading spinner and error states
|
|
|
|
## Animation Hooks
|
|
|
|
### useAdaptiveDuration (`src/lib/useAdaptiveDuration.ts`)
|
|
```typescript
|
|
// Adjusts animation speed based on scroll velocity
|
|
const duration = useAdaptiveDuration(0.6); // Base 0.6s
|
|
// Returns: 0.3s (fast scroll) → 0.9s (slow scroll)
|
|
```
|
|
|
|
### useScrollSpeed (`src/lib/useScrollSpeed.ts`)
|
|
```typescript
|
|
// Measures scroll velocity (0-100 scale)
|
|
const scrollSpeed = useScrollSpeed();
|
|
// 0 = stationary, 100 = max speed (5000px/s)
|
|
```
|
|
|
|
### useClientReady (`src/lib/useClientReady.ts`)
|
|
```typescript
|
|
// Prevents hydration mismatches
|
|
const isReady = useClientReady();
|
|
if (!isReady) return <Skeleton />;
|
|
```
|
|
|
|
## Styling
|
|
|
|
### Markdown Prose (`src/styles/markdown.css`)
|
|
- **Headings**: -0.02em letter spacing, tracking-tight
|
|
- **Drop Cap**: First paragraph first letter (6xl, float left)
|
|
- **Lead Paragraph**: First paragraph 2xl size
|
|
- **Links**: Underline on hover with smooth transition
|
|
- **Blockquotes**: Magazine pull-quote style with left border
|
|
- **Code Blocks**: Rounded corners, VS Code theme
|
|
- **Images**: Full-width with rounded corners and shadows
|
|
|
|
### Syntax Highlighting (`src/styles/highlight.css`)
|
|
- VS Code Dark+ theme colors
|
|
- Background: `#1e1e1e`
|
|
- Keywords: `#569cd6` (blue)
|
|
- Strings: `#ce9178` (orange)
|
|
- Comments: `#6a9955` (green)
|
|
|
|
## Deployment Configuration
|
|
|
|
### Next.js Config (`next.config.mjs`)
|
|
```javascript
|
|
{
|
|
output: 'export', // Static export
|
|
basePath: '/infrafabric/IF.docs.md2html', // StackCP path
|
|
images: { unoptimized: true } // No image optimization
|
|
}
|
|
```
|
|
|
|
### Apache Config (`.htaccess`)
|
|
- SPA routing (all requests → index.html)
|
|
- CORS headers for external markdown fetching
|
|
- Gzip compression for text files
|
|
- Browser caching (1 hour HTML, 1 month CSS/JS)
|
|
|
|
## Usage Examples
|
|
|
|
### Local Development
|
|
```bash
|
|
npm install
|
|
npm run dev
|
|
# Open http://localhost:3000
|
|
```
|
|
|
|
### File Upload
|
|
1. Drag `.md` file onto dropzone
|
|
2. Or click "Choose File" button
|
|
3. Document renders with magazine layout + animations
|
|
|
|
### URL Parsing
|
|
```
|
|
http://localhost:3000?parse=https://raw.githubusercontent.com/user/repo/main/README.md
|
|
```
|
|
|
|
### Production (StackCP)
|
|
```
|
|
https://digital-lab.ca/infrafabric/IF.docs.md2html
|
|
https://digital-lab.ca/infrafabric/IF.docs.md2html?parse=https://example.com/docs.md
|
|
```
|
|
|
|
## File Structure
|
|
|
|
```
|
|
IF.docs.md2html/
|
|
├── src/
|
|
│ ├── app/
|
|
│ │ ├── layout.tsx # Root layout
|
|
│ │ └── page.tsx # Home page (Suspense wrapper)
|
|
│ ├── components/
|
|
│ │ ├── FileUploader.tsx # Drag-and-drop UI
|
|
│ │ ├── HeroSection.tsx # ICW-style hero
|
|
│ │ ├── MagazineContent.tsx # Magazine layout
|
|
│ │ ├── MarkdownViewer.tsx # Main viewer
|
|
│ │ └── ViewerContent.tsx # URL param handler
|
|
│ ├── lib/
|
|
│ │ ├── markdown-parser.ts # markdown-it config
|
|
│ │ ├── useAdaptiveDuration.ts # Animation hook
|
|
│ │ ├── useScrollSpeed.ts # Scroll tracker
|
|
│ │ └── useClientReady.ts # Hydration guard
|
|
│ └── styles/
|
|
│ ├── globals.css # Base + Tailwind
|
|
│ ├── markdown.css # Prose styling
|
|
│ └── highlight.css # Code theme
|
|
├── out/ # Build output
|
|
├── .htaccess # Apache config
|
|
├── DEPLOY.md # Deployment guide
|
|
├── README.md # User documentation
|
|
└── PROJECT_SUMMARY.md # This file
|
|
```
|
|
|
|
## Technical Highlights
|
|
|
|
### Performance
|
|
- **Static Export**: Pre-rendered HTML, no server required
|
|
- **Code Splitting**: Automatic via Next.js
|
|
- **Lazy Loading**: Images below fold
|
|
- **Gzip Compression**: ~70% size reduction
|
|
- **First Load**: 477 kB (main page)
|
|
|
|
### Accessibility
|
|
- **Reduced Motion**: Respects `prefers-reduced-motion`
|
|
- **Keyboard Navigation**: Tab order, focus indicators
|
|
- **Semantic HTML**: Proper heading hierarchy
|
|
- **Touch Targets**: 44px+ minimum size
|
|
|
|
### Browser Support
|
|
- Chrome/Edge 90+
|
|
- Firefox 88+
|
|
- Safari 14+
|
|
- Mobile browsers (iOS 14+, Android Chrome 90+)
|
|
|
|
## Design Credits
|
|
|
|
**Ported from ICW NextSpread** (icantwait.ca):
|
|
- Property page animations (HeroEditorial, Gallery, About components)
|
|
- Adaptive duration timing system
|
|
- Scroll-speed-based animation adjustments
|
|
- Webflow-style easing curves
|
|
- Typography scale and color palette
|
|
- Touch target sizes and spacing
|
|
|
|
**Inspired by**:
|
|
- Airbnb editorial pages (magazine layouts)
|
|
- Medium long-form articles (typography)
|
|
- Notion docs (clean, readable prose)
|
|
|
|
## Repository
|
|
|
|
- **GitHub**: https://github.com/dannystocker/IF.docs.md2html
|
|
- **Branch**: `main`
|
|
- **Commit**: f950357
|
|
|
|
## Next Steps
|
|
|
|
1. **Deploy to StackCP**: Follow `DEPLOY.md` instructions
|
|
2. **Test URL parsing**: Try with InfraFabric docs
|
|
3. **Add features**:
|
|
- Table of contents sidebar
|
|
- Dark mode toggle
|
|
- Export to PDF
|
|
- Social sharing
|
|
- Print stylesheet
|
|
|
|
## License
|
|
|
|
MIT
|
|
|
|
---
|
|
|
|
**Created**: 2025-11-14
|
|
**Author**: Claude Code
|
|
**Design System**: ICW NextSpread (icantwait.ca)
|