Update README with new UI features and live preview
This commit is contained in:
99
README.md
99
README.md
@@ -1,22 +1,43 @@
|
|||||||
# PNGer - Modern PNG Editor & Resizer
|
# PNGer - Modern PNG Editor & Resizer
|
||||||
|
|
||||||
A simple, reactive, modern PNG editor and resizer with direct upload and download features. Built with TypeScript and deployed as a single Docker container on Unraid.
|
A sleek, modern PNG editor and resizer with **live preview**, **dark/light mode theming**, and direct upload/download features. Built with TypeScript and deployed as a single Docker container on Unraid.
|
||||||
|
|
||||||
## Features
|
## ✨ Features
|
||||||
|
|
||||||
- **Drag & Drop Upload**: Intuitive file upload interface
|
### 🎨 Modern UI with Dark/Light Mode
|
||||||
|
- **Dark Mode**: Black background (#0a0a0a) with light gold (#daa520) accents
|
||||||
|
- **Light Mode**: White background with dark gold (#b8860b) accents
|
||||||
|
- Perfect for inspecting PNG transparency on different backgrounds
|
||||||
|
- Persistent theme preference
|
||||||
|
- Smooth color transitions
|
||||||
|
|
||||||
|
### ⚡ Live Preview
|
||||||
|
- **Real-time preview** of transformations before download
|
||||||
|
- **Side-by-side comparison** (original vs transformed)
|
||||||
|
- **File size analysis** showing savings or increase
|
||||||
|
- **Instant feedback** using client-side Canvas API (< 500ms)
|
||||||
|
- No server round-trip needed for preview
|
||||||
|
|
||||||
|
### 🖼️ Image Operations
|
||||||
- **Resize Operations**: Width, height, and aspect ratio controls
|
- **Resize Operations**: Width, height, and aspect ratio controls
|
||||||
- **Crop to Fit**: Smart cropping with position control (center, top, bottom, etc.)
|
- **Crop to Fit**: Smart cropping with position control (9 positions)
|
||||||
- **Format Conversion**: PNG, WebP, and JPEG output
|
- **Format Conversion**: PNG, WebP, and JPEG output
|
||||||
- **Quality Control**: Adjustable compression settings
|
- **Quality Control**: Adjustable compression settings (10-100%)
|
||||||
|
- **Fit Modes**: Inside (resize only) or Cover (crop to fill)
|
||||||
|
|
||||||
|
### 🚀 Performance & Usability
|
||||||
- **Direct Download**: No server-side storage, immediate download
|
- **Direct Download**: No server-side storage, immediate download
|
||||||
- **Modern UI**: Sleek, responsive TypeScript/Svelte design
|
- **Modern UI**: Sleek, responsive TypeScript/Svelte design
|
||||||
|
- **File Analysis**: Original size, transformed size, savings percentage
|
||||||
|
- **Debounced Updates**: Smooth preview generation (300ms delay)
|
||||||
|
- **Visual Feedback**: Loading states, error messages, success indicators
|
||||||
|
|
||||||
## Tech Stack
|
## Tech Stack
|
||||||
|
|
||||||
- **Frontend**: Svelte 4 + Vite + TypeScript
|
- **Frontend**: Svelte 4 + Vite + TypeScript
|
||||||
- **Backend**: Node.js + Express + TypeScript
|
- **Backend**: Node.js + Express + TypeScript
|
||||||
- **Image Processing**: Sharp (high-performance image library)
|
- **Image Processing**: Sharp (high-performance image library)
|
||||||
|
- **Preview**: Canvas API (client-side)
|
||||||
- **Container**: Docker (Alpine-based, multi-stage build)
|
- **Container**: Docker (Alpine-based, multi-stage build)
|
||||||
- **Deployment**: Unraid via Docker Compose
|
- **Deployment**: Unraid via Docker Compose
|
||||||
|
|
||||||
@@ -143,10 +164,13 @@ docker run -d \
|
|||||||
pnger/
|
pnger/
|
||||||
├── frontend/ # Svelte + TypeScript application
|
├── frontend/ # Svelte + TypeScript application
|
||||||
│ ├── src/
|
│ ├── src/
|
||||||
│ │ ├── App.svelte # Main UI component
|
│ │ ├── App.svelte # Main UI component (with live preview)
|
||||||
│ │ ├── main.ts # Entry point
|
│ │ ├── main.ts # Entry point
|
||||||
|
│ │ ├── app.css # Design system (dark/light modes)
|
||||||
│ │ └── lib/
|
│ │ └── lib/
|
||||||
│ │ └── api.ts # API client
|
│ │ ├── api.ts # API client
|
||||||
|
│ │ ├── preview.ts # Live preview logic
|
||||||
|
│ │ └── theme.ts # Theme management store
|
||||||
│ ├── package.json
|
│ ├── package.json
|
||||||
│ ├── tsconfig.json
|
│ ├── tsconfig.json
|
||||||
│ └── vite.config.ts
|
│ └── vite.config.ts
|
||||||
@@ -161,17 +185,23 @@ pnger/
|
|||||||
│ └── tsconfig.json
|
│ └── tsconfig.json
|
||||||
├── Dockerfile # Multi-stage build (frontend + backend)
|
├── Dockerfile # Multi-stage build (frontend + backend)
|
||||||
├── docker-compose.yml # Unraid deployment config
|
├── docker-compose.yml # Unraid deployment config
|
||||||
└── INSTRUCTIONS.md # Development guide
|
├── ROADMAP.md # Feature roadmap
|
||||||
|
└── UI_UPGRADE_NOTES.md # UI upgrade documentation
|
||||||
```
|
```
|
||||||
|
|
||||||
## How It Works
|
## How It Works
|
||||||
|
|
||||||
1. User uploads an image via the web interface
|
1. User uploads an image via the web interface
|
||||||
2. Frontend sends image + transform parameters to backend API
|
2. **Live preview** generates instantly using Canvas API
|
||||||
3. Backend processes image using Sharp (resize, crop, compress, convert format)
|
3. User adjusts parameters (width, height, quality, format, etc.)
|
||||||
4. Processed image is returned directly to browser
|
4. Preview updates in real-time (debounced 300ms)
|
||||||
5. Browser triggers automatic download
|
5. User sees file size comparison and savings
|
||||||
6. No files stored on server (stateless operation)
|
6. When satisfied, user clicks "Transform & Download"
|
||||||
|
7. Frontend sends image + parameters to backend API
|
||||||
|
8. Backend processes using Sharp (resize, crop, compress, convert)
|
||||||
|
9. Processed image returned directly to browser
|
||||||
|
10. Browser triggers automatic download
|
||||||
|
11. No files stored on server (stateless operation)
|
||||||
|
|
||||||
## API Endpoints
|
## API Endpoints
|
||||||
|
|
||||||
@@ -204,6 +234,38 @@ All configuration is handled via environment variables passed through Docker/Unr
|
|||||||
- `TEMP_DIR`: Temporary directory for uploads (default: `/app/temp`)
|
- `TEMP_DIR`: Temporary directory for uploads (default: `/app/temp`)
|
||||||
- `NODE_ENV`: Node environment (default: `production`)
|
- `NODE_ENV`: Node environment (default: `production`)
|
||||||
|
|
||||||
|
## UI Features in Detail
|
||||||
|
|
||||||
|
### Dark/Light Mode
|
||||||
|
- **Toggle Button**: Sun (☀️) / Moon (🌙) icon in header
|
||||||
|
- **Persistent**: Saved to localStorage
|
||||||
|
- **System Detection**: Uses OS preference on first visit
|
||||||
|
- **Smooth Transitions**: Colors fade smoothly (250ms)
|
||||||
|
- **Use Case**: Compare PNG transparency on black vs white backgrounds
|
||||||
|
|
||||||
|
### Live Preview
|
||||||
|
- **Side-by-Side**: Original image on left, preview on right
|
||||||
|
- **File Size**: Shows before and after sizes
|
||||||
|
- **Savings Indicator**: Green for reduction, yellow for increase
|
||||||
|
- **Instant Updates**: Debounced at 300ms for smooth performance
|
||||||
|
- **Canvas-Based**: No server load, runs in browser
|
||||||
|
|
||||||
|
### Image Analysis
|
||||||
|
- Original file size displayed
|
||||||
|
- Preview size estimation
|
||||||
|
- Savings/increase percentage
|
||||||
|
- Visual feedback with color coding
|
||||||
|
|
||||||
|
## Roadmap
|
||||||
|
|
||||||
|
See [ROADMAP.md](./ROADMAP.md) for planned features including:
|
||||||
|
- Drag & drop upload
|
||||||
|
- Batch processing
|
||||||
|
- Smart presets
|
||||||
|
- Watermarking
|
||||||
|
- Advanced crop tool
|
||||||
|
- And more!
|
||||||
|
|
||||||
## License
|
## License
|
||||||
|
|
||||||
MIT License - See LICENSE file for details
|
MIT License - See LICENSE file for details
|
||||||
@@ -211,3 +273,14 @@ MIT License - See LICENSE file for details
|
|||||||
## Repository
|
## Repository
|
||||||
|
|
||||||
https://git.alwisp.com/jason/pnger
|
https://git.alwisp.com/jason/pnger
|
||||||
|
|
||||||
|
## Screenshots
|
||||||
|
|
||||||
|
### Light Mode
|
||||||
|
Clean white interface with dark gold accents, perfect for inspecting dark images
|
||||||
|
|
||||||
|
### Dark Mode
|
||||||
|
Sleek black interface with light gold accents, ideal for viewing light/transparent PNGs
|
||||||
|
|
||||||
|
### Live Preview
|
||||||
|
Side-by-side comparison showing original and transformed image with file size analysis
|
||||||
Reference in New Issue
Block a user