mirror of
https://github.com/DRYTRIX/TimeTracker.git
synced 2026-01-25 14:09:16 -06:00
Major Features: - Add project costs feature with full CRUD operations - Implement toast notification system for better user feedback - Enhance analytics dashboard with improved visualizations - Add OIDC authentication improvements and debug tools Improvements: - Enhance reports with new filtering and export capabilities - Update command palette with additional shortcuts - Improve mobile responsiveness across all pages - Refactor UI components for consistency Removals: - Remove license server integration and related dependencies - Clean up unused license-related templates and utilities Technical Changes: - Add new migration 018 for project_costs table - Update models: Project, Settings, User with new relationships - Refactor routes: admin, analytics, auth, invoices, projects, reports - Update static assets: CSS improvements, new JS modules - Enhance templates: analytics, admin, projects, reports Documentation: - Add comprehensive documentation for project costs feature - Document toast notification system with visual guides - Update README with new feature descriptions - Add migration instructions and quick start guides - Document OIDC improvements and Kanban enhancements Files Changed: - Modified: 56 files (core app, models, routes, templates, static assets) - Deleted: 6 files (license server integration) - Added: 28 files (new features, documentation, migrations)
466 lines
17 KiB
Markdown
466 lines
17 KiB
Markdown
# Toast Notification Visual Guide
|
||
|
||
## 📍 Positioning
|
||
|
||
### Desktop View
|
||
```
|
||
┌─────────────────────────────────────────────────────┐
|
||
│ Navigation Bar │
|
||
├─────────────────────────────────────────────────────┤
|
||
│ │
|
||
│ Main Content Area │
|
||
│ │
|
||
│ │
|
||
│ │
|
||
│ │
|
||
│ ┌──────────────┐ │
|
||
│ │ Toast 3 │ │
|
||
│ └──────────────┘ │
|
||
│ ┌──────────────┐ │
|
||
│ │ Toast 2 │ │
|
||
│ └──────────────┘ │
|
||
│ ┌──────────────┐ │
|
||
│ Footer │ Toast 1 │ │
|
||
└───────────────────────────────────└──────────────┘──┘
|
||
↑
|
||
24px from bottom-right
|
||
```
|
||
|
||
### Mobile View
|
||
```
|
||
┌──────────────────┐
|
||
│ Navigation │
|
||
├──────────────────┤
|
||
│ │
|
||
│ Main Content │
|
||
│ │
|
||
│ │
|
||
├──────────────────┤
|
||
│ ┌──────────────┐ │
|
||
│ │ Toast 2 │ │
|
||
│ └──────────────┘ │
|
||
│ ┌──────────────┐ │
|
||
│ │ Toast 1 │ │
|
||
│ └──────────────┘ │
|
||
├──────────────────┤
|
||
│ [≣] [+] [✓] [☰]│← Mobile Tab Bar
|
||
└──────────────────┘
|
||
↑
|
||
80px from bottom
|
||
(above tab bar)
|
||
```
|
||
|
||
## 🎨 Notification Anatomy
|
||
|
||
### Success Toast
|
||
```
|
||
┌───────────────────────────────────────────┐
|
||
│██│ ✓ │ Operation Complete │×│
|
||
│██│ │ Your changes have been saved │ │
|
||
│██│ │ successfully. │ │
|
||
│██└───┴──────────────────────────────────┴─┘
|
||
└▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓┘
|
||
← Progress bar (green, animated)
|
||
|
||
Legend:
|
||
██ = Green accent bar (4px, gradient)
|
||
✓ = Check circle icon (green)
|
||
× = Close button
|
||
▓ = Progress bar showing time remaining
|
||
```
|
||
|
||
### Error Toast
|
||
```
|
||
┌───────────────────────────────────────────┐
|
||
│██│ ⚠ │ Error │×│
|
||
│██│ │ Failed to save changes. │ │
|
||
│██│ │ Please try again. │ │
|
||
│██└───┴──────────────────────────────────┴─┘
|
||
└▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓┘
|
||
← Progress bar (red, animated)
|
||
|
||
██ = Red accent bar
|
||
⚠ = Exclamation circle icon (red)
|
||
```
|
||
|
||
### Warning Toast
|
||
```
|
||
┌───────────────────────────────────────────┐
|
||
│██│ △ │ Warning │×│
|
||
│██│ │ Please review the highlighted │ │
|
||
│██│ │ fields before continuing. │ │
|
||
│██└───┴──────────────────────────────────┴─┘
|
||
└▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓┘
|
||
← Progress bar (orange, animated)
|
||
|
||
██ = Orange accent bar
|
||
△ = Exclamation triangle icon (orange)
|
||
```
|
||
|
||
### Info Toast
|
||
```
|
||
┌───────────────────────────────────────────┐
|
||
│██│ ⓘ │ Information │×│
|
||
│██│ │ New features are available. │ │
|
||
│██│ │ Check the changelog! │ │
|
||
│██└───┴──────────────────────────────────┴─┘
|
||
└▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓┘
|
||
← Progress bar (blue, animated)
|
||
|
||
██ = Blue accent bar
|
||
ⓘ = Info circle icon (blue)
|
||
```
|
||
|
||
## 🎭 States & Interactions
|
||
|
||
### Default State
|
||
```
|
||
┌────────────────────────────┐
|
||
│▌✓│ Success │×│ ← Normal appearance
|
||
│▌ │ Operation completed │ │
|
||
└▌─┴───────────────────────┴─┘
|
||
▓▓▓▓▓▓▓▓░░░░░░░░░░░░░░░░░░░
|
||
← Progress bar animating
|
||
```
|
||
|
||
### Hover State
|
||
```
|
||
┌────────────────────────────┐
|
||
│▌▌✓│ Success │✕│ ← Accent bar wider
|
||
│▌▌ │ Operation completed │ │ ← Shadow darker
|
||
└▌▌─┴──────────────────────┴─┘ ← Close button larger
|
||
▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
|
||
← Progress paused
|
||
```
|
||
|
||
### Focus State
|
||
```
|
||
╔════════════════════════════╗
|
||
║▌✓│ Success │×║ ← Blue outline (2px)
|
||
║▌ │ Operation completed │ ║ ← for accessibility
|
||
╚▌═╧═══════════════════════╧═╝
|
||
▓▓▓▓▓▓▓▓░░░░░░░░░░░░░░░░░░░
|
||
```
|
||
|
||
## 📐 Dimensions
|
||
|
||
### Toast Card
|
||
- **Width (Desktop)**: 320px - 420px
|
||
- **Width (Mobile)**: calc(100% - 32px)
|
||
- **Min Height**: 64px
|
||
- **Max Height**: None (auto-fits content)
|
||
- **Border Radius**: 12px
|
||
- **Padding**: 12px
|
||
|
||
### Components
|
||
- **Accent Bar**: 4px wide (6px on hover)
|
||
- **Icon Area**: 48px wide
|
||
- **Icon Size**: 20px
|
||
- **Close Button**: 36px × 36px
|
||
- **Progress Bar**: 3px height
|
||
- **Gap Between Toasts**: 12px
|
||
|
||
### Typography
|
||
- **Title**: 14px, weight 600
|
||
- **Message**: 13px, weight 400
|
||
- **Line Height**: 1.4 (title), 1.5 (message)
|
||
- **Font**: Inter (fallback: system-ui)
|
||
|
||
## 🌈 Color Palette
|
||
|
||
### Light Theme
|
||
```
|
||
Success:
|
||
Accent: #10b981 → #059669 (gradient)
|
||
Icon: #10b981
|
||
Text: #0f172a
|
||
|
||
Error:
|
||
Accent: #ef4444 → #dc2626 (gradient)
|
||
Icon: #ef4444
|
||
Text: #0f172a
|
||
|
||
Warning:
|
||
Accent: #f59e0b → #d97706 (gradient)
|
||
Icon: #f59e0b
|
||
Text: #0f172a
|
||
|
||
Info:
|
||
Accent: #3b82f6 → #2563eb (gradient)
|
||
Icon: #3b82f6
|
||
Text: #0f172a
|
||
|
||
Background: #ffffff
|
||
Title: #0f172a
|
||
Message: #64748b
|
||
```
|
||
|
||
### Dark Theme
|
||
```
|
||
Success:
|
||
Accent: #10b981 → #059669 (gradient)
|
||
Icon: #34d399 (lighter)
|
||
Text: #f1f5f9
|
||
|
||
Error:
|
||
Accent: #ef4444 → #dc2626 (gradient)
|
||
Icon: #f87171 (lighter)
|
||
Text: #f1f5f9
|
||
|
||
Warning:
|
||
Accent: #f59e0b → #d97706 (gradient)
|
||
Icon: #fbbf24 (lighter)
|
||
Text: #f1f5f9
|
||
|
||
Info:
|
||
Accent: #3b82f6 → #2563eb (gradient)
|
||
Icon: #60a5fa (lighter)
|
||
Text: #f1f5f9
|
||
|
||
Background: #1e293b
|
||
Title: #f1f5f9
|
||
Message: #cbd5e1
|
||
```
|
||
|
||
## 🎬 Animation Timeline
|
||
|
||
### Slide In (300ms)
|
||
```
|
||
0ms 150ms 300ms
|
||
│ │ │
|
||
├─ Opacity: 0 ├─ Opacity: 0.5 ├─ Opacity: 1
|
||
├─ X: 120% ├─ X: 60% ├─ X: 0%
|
||
└─ Scale: 0.8 └─ Scale: 0.9 └─ Scale: 1
|
||
```
|
||
|
||
### Auto-dismiss (5000ms default)
|
||
```
|
||
0ms Progress Bar 5000ms
|
||
│◄────────────────────────────────────────►│
|
||
├─ Full width Empty ────┤
|
||
└─ Show toast Hide toast┘
|
||
```
|
||
|
||
### Slide Out (300ms)
|
||
```
|
||
0ms 150ms 300ms
|
||
│ │ │
|
||
├─ Opacity: 1 ├─ Opacity: 0.5 ├─ Opacity: 0
|
||
├─ X: 0% ├─ X: 60% ├─ X: 120%
|
||
└─ Scale: 1 └─ Scale: 0.9 └─ Scale: 0.8
|
||
```
|
||
|
||
## 📏 Spacing & Layout
|
||
|
||
### Single Toast
|
||
```
|
||
┌──────────────────────────────┐
|
||
│ ┌──┬────────────────────┬──┐ │← 24px from edge
|
||
│ │██│ ✓ Title │× │ │
|
||
│ │██│ Message here │ │ │
|
||
│ └──┴────────────────────┴──┘ │
|
||
│ ▓▓▓▓▓▓▓▓▓▓▓░░░░░░░░░░░░░░ │
|
||
└──────────────────────────────┘
|
||
```
|
||
|
||
### Multiple Toasts (Stacked)
|
||
```
|
||
┌──────────────────────────────┐
|
||
│ ┌──────────────────────────┐ │← Newest (top)
|
||
│ │ Toast 3 │ │
|
||
│ └──────────────────────────┘ │
|
||
│ ↓ 12px gap │
|
||
│ ┌──────────────────────────┐ │
|
||
│ │ Toast 2 │ │
|
||
│ └──────────────────────────┘ │
|
||
│ ↓ 12px gap │
|
||
│ ┌──────────────────────────┐ │
|
||
│ │ Toast 1 │ │← Oldest (bottom)
|
||
│ └──────────────────────────┘ │
|
||
└──────────────────────────────┘
|
||
```
|
||
|
||
### Content Padding
|
||
```
|
||
┌───────────────────────────────┐
|
||
│█│←48px→│ │36px││
|
||
│█│ ✓ │ ←12px→ Title │ × │
|
||
│█│ │ Message │ │
|
||
└─┴──────┴──────────────────┴───┘
|
||
4px Icon Content Close
|
||
```
|
||
|
||
## 🎯 Responsive Breakpoints
|
||
|
||
### Desktop (> 768px)
|
||
```
|
||
Screen: 1920px wide
|
||
┌──────────────────────────────────────────────────┐
|
||
│ │
|
||
│ ┌─────────────────┐ │
|
||
│ │ 420px wide │ │
|
||
│ └─────────────────┘ │
|
||
└───────────────────────────────────────────────24px
|
||
```
|
||
|
||
### Tablet (576px - 768px)
|
||
```
|
||
Screen: 768px wide
|
||
┌──────────────────────────────────────┐
|
||
│ │
|
||
│ ┌──────────────────┐ │
|
||
│ │ ~350px wide │ │
|
||
│ └──────────────────┘ │
|
||
└───────────────────────────────────24px
|
||
```
|
||
|
||
### Mobile (< 576px)
|
||
```
|
||
Screen: 375px wide
|
||
┌───────────────────────┐
|
||
│ ←16px→ ←16px→ │
|
||
│ ┌───────────────────┐ │
|
||
│ │ Full width - 32px│ │
|
||
│ └───────────────────┘ │
|
||
│ ↑ 80px │
|
||
└───────────────────────┘
|
||
Tab Bar
|
||
```
|
||
|
||
## 🔍 Icon Details
|
||
|
||
### Success Icon
|
||
```
|
||
✓
|
||
╱ ╲ - Font Awesome: fa-check-circle
|
||
╱___╲ - Size: 20px
|
||
( ) - Color: #10b981 (light) / #34d399 (dark)
|
||
╲___╱ - Weight: Solid (900)
|
||
```
|
||
|
||
### Error Icon
|
||
```
|
||
⚠ - Font Awesome: fa-exclamation-circle
|
||
╱!╲ - Size: 20px
|
||
( ! ) - Color: #ef4444 (light) / #f87171 (dark)
|
||
╲!╱ - Weight: Solid (900)
|
||
```
|
||
|
||
### Warning Icon
|
||
```
|
||
△ - Font Awesome: fa-exclamation-triangle
|
||
╱!╲ - Size: 20px
|
||
╱ ╲ - Color: #f59e0b (light) / #fbbf24 (dark)
|
||
└─────┘ - Weight: Solid (900)
|
||
```
|
||
|
||
### Info Icon
|
||
```
|
||
ⓘ - Font Awesome: fa-info-circle
|
||
(i) - Size: 20px
|
||
│ - Color: #3b82f6 (light) / #60a5fa (dark)
|
||
- Weight: Solid (900)
|
||
```
|
||
|
||
## 🎨 Shadow & Depth
|
||
|
||
### Light Theme Shadows
|
||
```
|
||
Default:
|
||
shadow-sm: 0 4px 6px -1px rgba(0,0,0,0.1)
|
||
shadow-md: 0 10px 15px -3px rgba(0,0,0,0.1)
|
||
shadow-lg: 0 20px 25px -5px rgba(0,0,0,0.1)
|
||
|
||
Hover:
|
||
shadow-md: 0 12px 20px -3px rgba(0,0,0,0.15)
|
||
```
|
||
|
||
### Dark Theme Shadows
|
||
```
|
||
Default:
|
||
shadow-sm: 0 4px 6px -1px rgba(0,0,0,0.3)
|
||
shadow-md: 0 10px 15px -3px rgba(0,0,0,0.3)
|
||
shadow-lg: 0 20px 25px -5px rgba(0,0,0,0.4)
|
||
|
||
Hover:
|
||
shadow-md: 0 12px 20px -3px rgba(0,0,0,0.5)
|
||
```
|
||
|
||
## ♿ Accessibility Details
|
||
|
||
### ARIA Attributes
|
||
```html
|
||
<div class="toast-notification"
|
||
role="alert"
|
||
aria-live="polite" ← For info/success
|
||
aria-live="assertive" ← For errors
|
||
aria-atomic="true">
|
||
...
|
||
</div>
|
||
```
|
||
|
||
### Keyboard Navigation
|
||
```
|
||
Tab → Focus close button
|
||
Enter → Close notification
|
||
Escape → Close notification (if focused)
|
||
```
|
||
|
||
### Screen Reader Announcement
|
||
```
|
||
Success: "Success. Operation completed successfully."
|
||
Error: "Error. Failed to save changes."
|
||
Warning: "Warning. Please review your input."
|
||
Info: "Information. New updates available."
|
||
```
|
||
|
||
## 📱 Touch Targets
|
||
|
||
### Minimum Sizes (Mobile)
|
||
```
|
||
Close Button: 36px × 36px ✓ (meets 44px target with margin)
|
||
Toast Height: Min 64px ✓ (comfortable touch)
|
||
Tap Area: Full card ✓ (entire toast hoverable)
|
||
```
|
||
|
||
## 🎯 Use Case Examples
|
||
|
||
### Form Submission Success
|
||
```
|
||
┌───────────────────────────────────┐
|
||
│▌✓│ Saved │×│
|
||
│▌ │ Your profile has been │ │
|
||
│▌ │ updated successfully. │ │
|
||
└▌─┴──────────────────────────────┴─┘
|
||
▓▓▓▓▓▓▓▓░░░░░░░░░░░░░░░░░░░░░░░░░
|
||
Duration: 5 seconds
|
||
```
|
||
|
||
### Error Message
|
||
```
|
||
┌───────────────────────────────────┐
|
||
│▌⚠│ Error │×│
|
||
│▌ │ Unable to save changes. │ │
|
||
│▌ │ Please check your connection.│ │
|
||
└▌─┴──────────────────────────────┴─┘
|
||
▓▓▓▓▓▓▓▓░░░░░░░░░░░░░░░░░░░░░░░░░
|
||
Duration: 7 seconds
|
||
```
|
||
|
||
### Processing (Persistent)
|
||
```
|
||
┌───────────────────────────────────┐
|
||
│▌ⓘ│ Processing │×│
|
||
│▌ │ Please wait while we process │ │
|
||
│▌ │ your request... │ │
|
||
└▌─┴──────────────────────────────┴─┘
|
||
(No progress bar - manual dismiss)
|
||
```
|
||
|
||
---
|
||
|
||
**Note**: This visual guide uses ASCII art for illustration. Actual implementation uses modern CSS with smooth gradients, shadows, and animations.
|
||
|
||
For live examples, open: `docs/TOAST_NOTIFICATION_DEMO.html`
|
||
|