docs: add invoice templates design document
15 visually distinct templates across 4 tiers (Professional Essentials, Creative & Modern, Warm & Distinctive, Premium & Specialized) with template config schema, picker UI design, shared renderer architecture, and business identity support.
This commit is contained in:
239
docs/plans/2026-02-18-invoice-templates-design.md
Normal file
239
docs/plans/2026-02-18-invoice-templates-design.md
Normal file
@@ -0,0 +1,239 @@
|
|||||||
|
# Invoice Templates Design
|
||||||
|
|
||||||
|
## Goal
|
||||||
|
Add 15 visually distinct invoice templates to ZeroClock with a template picker that shows live previews, replacing the current single hardcoded layout.
|
||||||
|
|
||||||
|
## Architecture
|
||||||
|
Template Config Objects approach: each template is a config object describing colors, layout, typography, and decorative elements. A single shared renderer reads the config and produces both the Vue preview (HTML/CSS) and jsPDF output. This keeps code DRY — one renderer, 15 configs.
|
||||||
|
|
||||||
|
## Tech Stack
|
||||||
|
- jsPDF for PDF generation (already installed)
|
||||||
|
- Vue 3 Composition API for preview renderer
|
||||||
|
- Tailwind CSS v4 for template picker UI
|
||||||
|
- No new dependencies required
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Template Config Schema
|
||||||
|
|
||||||
|
```ts
|
||||||
|
interface InvoiceTemplateConfig {
|
||||||
|
id: string
|
||||||
|
name: string
|
||||||
|
category: 'essential' | 'creative' | 'warm' | 'premium'
|
||||||
|
description: string
|
||||||
|
|
||||||
|
// Colors
|
||||||
|
colors: {
|
||||||
|
primary: string // Main accent color
|
||||||
|
secondary: string // Secondary accent
|
||||||
|
background: string // Page background
|
||||||
|
headerBg: string // Header area background
|
||||||
|
headerText: string // Header text color
|
||||||
|
bodyText: string // Body text color
|
||||||
|
tableHeaderBg: string
|
||||||
|
tableHeaderText: string
|
||||||
|
tableRowAlt: string // Alternating row color
|
||||||
|
tableBorder: string
|
||||||
|
totalHighlight: string
|
||||||
|
}
|
||||||
|
|
||||||
|
// Layout
|
||||||
|
layout: {
|
||||||
|
logoPosition: 'top-left' | 'top-center' | 'top-right'
|
||||||
|
headerStyle: 'full-width' | 'split' | 'minimal' | 'sidebar' | 'gradient' | 'geometric' | 'centered'
|
||||||
|
tableStyle: 'bordered' | 'striped' | 'borderless' | 'minimal-lines' | 'colored-sections'
|
||||||
|
totalsPosition: 'right' | 'center'
|
||||||
|
showDividers: boolean
|
||||||
|
dividerStyle: 'thin' | 'double' | 'thick' | 'none'
|
||||||
|
}
|
||||||
|
|
||||||
|
// Typography
|
||||||
|
typography: {
|
||||||
|
titleSize: number // Invoice title font size
|
||||||
|
titleWeight: 'bold' | 'normal'
|
||||||
|
headerSize: number // Section header font size
|
||||||
|
bodySize: number // Body text font size
|
||||||
|
numberStyle: 'normal' | 'monospace-feel' // For amounts
|
||||||
|
}
|
||||||
|
|
||||||
|
// Decorative
|
||||||
|
decorative: {
|
||||||
|
cornerShape: 'none' | 'colored-block' | 'triangle' | 'diagonal'
|
||||||
|
sidebarWidth: number // 0 for none
|
||||||
|
sidebarColor: string
|
||||||
|
useGradientHeader: boolean
|
||||||
|
gradientFrom?: string
|
||||||
|
gradientTo?: string
|
||||||
|
backgroundTint: boolean
|
||||||
|
backgroundTintColor?: string
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## 15 Templates
|
||||||
|
|
||||||
|
### Tier 1: Professional Essentials
|
||||||
|
|
||||||
|
**1. Clean Minimal**
|
||||||
|
- White background, single accent line (#3B82F6 blue) under header
|
||||||
|
- Left-aligned logo, right-aligned invoice details
|
||||||
|
- Thin 1px borders, generous whitespace
|
||||||
|
- Inspired by Stripe invoices, Swiss design principles
|
||||||
|
|
||||||
|
**2. Corporate Classic**
|
||||||
|
- Navy (#1E3A5F) header band with white text
|
||||||
|
- Two-column header: business left, invoice meta right
|
||||||
|
- Gray alternating rows, bold column headers
|
||||||
|
- Inspired by QuickBooks Professional template
|
||||||
|
|
||||||
|
**3. Modern Bold**
|
||||||
|
- Large colored accent block top-left (#6366F1 indigo)
|
||||||
|
- Oversized invoice number, bold typography
|
||||||
|
- Borderless table with colored header row
|
||||||
|
- Inspired by Invoice Ninja Bold template
|
||||||
|
|
||||||
|
**4. Elegant Serif**
|
||||||
|
- Charcoal (#374151) with gold (#B8860B) accent lines
|
||||||
|
- Centered header layout, refined spacing
|
||||||
|
- Thin-rule dividers between sections
|
||||||
|
- Inspired by luxury invoicing trends
|
||||||
|
|
||||||
|
**5. Simple Two-Tone**
|
||||||
|
- Split header: dark left (#1F2937), light right
|
||||||
|
- Single-line table dividers only
|
||||||
|
- Accent (#10B981 emerald) only on totals
|
||||||
|
- Inspired by FreshBooks Modern template
|
||||||
|
|
||||||
|
### Tier 2: Creative & Modern
|
||||||
|
|
||||||
|
**6. Gradient Header**
|
||||||
|
- Full-width gradient header (#667EEA to #764BA2)
|
||||||
|
- White text on gradient for business name
|
||||||
|
- Striped table rows, generous padding
|
||||||
|
- Inspired by 2026 gradient design trends
|
||||||
|
|
||||||
|
**7. Sidebar Accent**
|
||||||
|
- Narrow (#E11D48 rose) vertical bar left edge, full page height
|
||||||
|
- Business info offset from sidebar
|
||||||
|
- Modern asymmetric layout
|
||||||
|
- Inspired by Invoice Ninja Creative template
|
||||||
|
|
||||||
|
**8. Geometric Modern**
|
||||||
|
- Colored triangle shape top-right corner (#8B5CF6 violet)
|
||||||
|
- Diagonal line element in header area
|
||||||
|
- Contemporary, design-forward
|
||||||
|
- Inspired by Dribbble geometric invoice designs
|
||||||
|
|
||||||
|
**9. Dark Mode**
|
||||||
|
- Near-black (#1A1A2E) background
|
||||||
|
- Light text (#E2E8F0), cyan (#06B6D4) highlights
|
||||||
|
- Inverted table (dark rows, light text)
|
||||||
|
- Strong 2025-2026 trend
|
||||||
|
|
||||||
|
### Tier 3: Warm & Distinctive
|
||||||
|
|
||||||
|
**10. Warm Natural**
|
||||||
|
- Warm beige (#FDF6EC) page background
|
||||||
|
- Terracotta (#C2703E) accents, olive secondary
|
||||||
|
- Soft, organic, approachable feel
|
||||||
|
|
||||||
|
**11. Playful Color Block**
|
||||||
|
- Teal (#0D9488) and coral (#F97316) blocks
|
||||||
|
- Colored backgrounds for different sections
|
||||||
|
- Fun but professional balance
|
||||||
|
- Inspired by Invoice Ninja Playful template
|
||||||
|
|
||||||
|
**12. Retro Professional**
|
||||||
|
- Double-rule lines, classic bordered table
|
||||||
|
- Warm brown (#78350F) monochrome palette
|
||||||
|
- Vintage typography hierarchy
|
||||||
|
- Inspired by Invoice Ninja Hipster template
|
||||||
|
|
||||||
|
### Tier 4: Premium & Specialized
|
||||||
|
|
||||||
|
**13. Tech Minimal**
|
||||||
|
- Slate (#475569) with electric green (#22C55E) accents
|
||||||
|
- Ultra-clean grid, large numbers
|
||||||
|
- Code-editor-inspired aesthetic
|
||||||
|
- Inspired by Invoice Ninja Tech template
|
||||||
|
|
||||||
|
**14. Executive Premium**
|
||||||
|
- Black (#111827) and gold (#D4AF37) scheme
|
||||||
|
- Generous margins, premium spacing
|
||||||
|
- Luxury feel, restrained decoration
|
||||||
|
|
||||||
|
**15. Data-Driven Clean**
|
||||||
|
- Deep blue (#1E40AF) primary
|
||||||
|
- Large prominent total amount display
|
||||||
|
- Emphasis on data hierarchy
|
||||||
|
- KPI-style layout for amounts
|
||||||
|
|
||||||
|
## Template Picker UI
|
||||||
|
|
||||||
|
### Location
|
||||||
|
Dropdown/selector in the invoice create form and in the preview dialog header.
|
||||||
|
|
||||||
|
### Layout
|
||||||
|
Split-pane design:
|
||||||
|
- **Left panel** (30%): Scrollable list of template names grouped by category, with small color dot indicators
|
||||||
|
- **Right panel** (70%): Live preview of selected template using sample/current invoice data
|
||||||
|
- Clicking a template name immediately updates the preview
|
||||||
|
|
||||||
|
### Category Headers
|
||||||
|
Templates grouped under: "Professional Essentials", "Creative & Modern", "Warm & Distinctive", "Premium & Specialized"
|
||||||
|
|
||||||
|
### Preview Rendering
|
||||||
|
- Preview uses the same renderer that generates the PDF, but outputs to an HTML canvas/div
|
||||||
|
- Shows a scaled-down A4 page with actual template styling
|
||||||
|
- Uses sample data (or current invoice data if available)
|
||||||
|
|
||||||
|
## Business Identity
|
||||||
|
|
||||||
|
### Settings Fields (already partially exist)
|
||||||
|
- `business_name` - Company/freelancer name
|
||||||
|
- `business_address` - Full address
|
||||||
|
- `business_email` - Contact email
|
||||||
|
- `business_phone` - Contact phone
|
||||||
|
- `business_logo` - Base64-encoded logo image (PNG/JPG)
|
||||||
|
|
||||||
|
### Logo Handling
|
||||||
|
- Upload via Settings > Business tab
|
||||||
|
- Stored as base64 in settings DB
|
||||||
|
- Rendered in PDF via `doc.addImage()`
|
||||||
|
- Max size: 200x80px (auto-scaled)
|
||||||
|
- Position determined by template config
|
||||||
|
|
||||||
|
## Shared Renderer Architecture
|
||||||
|
|
||||||
|
```
|
||||||
|
InvoiceTemplateConfig + InvoiceData + ClientData + Items
|
||||||
|
↓
|
||||||
|
Shared Renderer Logic
|
||||||
|
↓ ↓
|
||||||
|
Vue HTML Preview jsPDF Generator
|
||||||
|
(scaled div) (actual PDF)
|
||||||
|
```
|
||||||
|
|
||||||
|
### Implementation Approach
|
||||||
|
- `src/utils/invoiceTemplates.ts` — 15 template config objects + registry
|
||||||
|
- `src/utils/invoicePdfRenderer.ts` — jsPDF renderer that reads config
|
||||||
|
- `src/components/InvoicePreview.vue` — Vue component that renders HTML preview from config
|
||||||
|
- `src/components/InvoiceTemplatePicker.vue` — Split-pane picker UI
|
||||||
|
|
||||||
|
### Renderer Functions
|
||||||
|
Each layout/decorative feature maps to a render function:
|
||||||
|
- `renderHeader(doc, config, data)` — Handles all header styles
|
||||||
|
- `renderLineItems(doc, config, items)` — Handles all table styles
|
||||||
|
- `renderTotals(doc, config, totals)` — Handles totals section
|
||||||
|
- `renderDecorative(doc, config)` — Handles corners, sidebars, gradients
|
||||||
|
- `renderFooter(doc, config, notes)` — Handles notes and footer
|
||||||
|
|
||||||
|
## Verification
|
||||||
|
1. All 15 templates render correctly in both preview and PDF
|
||||||
|
2. Template picker shows all templates with live preview
|
||||||
|
3. Each template is visually distinct and professional
|
||||||
|
4. Logo renders correctly in templates that support it
|
||||||
|
5. Currency/locale formatting works across all templates
|
||||||
|
6. Long content (many line items) handles page breaks correctly
|
||||||
|
7. PDF export works via Tauri save dialog for all templates
|
||||||
Reference in New Issue
Block a user