myCRM/docs/design/VISUAL_DESIGN_GUIDE.md
olli 82b022ba3b Add comprehensive styles for invoice form components and utilities
- Introduced CSS custom properties for spacing, typography, colors, and shadows.
- Developed styles for form sections, grids, invoice items, and summary components.
- Implemented responsive design adjustments for various screen sizes.
- Added utility classes for text, spacing, and flex layouts.
- Included dark mode and high contrast mode support.
- Established loading states and validation/error styles.
- Enhanced accessibility features with focus styles and screen reader utilities.
2025-12-13 10:02:30 +01:00

32 KiB
Raw Blame History

Visual Design Guide - Invoice Form

myCRM Billing Module | Design Reference


1. Farbpalette & Kontraste

Status Colors (Semantic)

┌─────────────────────────────────────────────────────────────┐
│ DRAFT (Entwurf)        │ #6B7280 │ ░░░░░░░░░░░░ Secondary  │
│ OPEN (Offen)           │ #06B6D4 │ ████████████ Info       │
│ PAID (Bezahlt)         │ #22C55E │ ████████████ Success    │
│ PARTIAL (Teilzahlung)  │ #F59E0B │ ████████████ Warning    │
│ OVERDUE (Überfällig)   │ #EF4444 │ ████████████ Danger     │
│ CANCELLED (Storniert)  │ #6B7280 │ ░░░░░░░░░░░░ Secondary  │
└─────────────────────────────────────────────────────────────┘

Surface Colors

Light Mode:                         Dark Mode:
┌──────────────────────────────┐   ┌──────────────────────────────┐
│ Background     #FFFFFF       │   │ Background     #0F172A       │
│ Surface-0      #FFFFFF       │   │ Surface-0      #1E293B       │
│ Surface-50     #F9FAFB       │   │ Surface-50     #334155       │
│ Surface-100    #F3F4F6       │   │ Surface-100    #475569       │
│ Surface-200    #E5E7EB       │   │ Surface-200    #64748B       │
└──────────────────────────────┘   └──────────────────────────────┘

Text Colors

┌────────────────────────────────────────────────────────────┐
│ Primary Text    #111827  ████  High contrast (main text)  │
│ Secondary Text  #6B7280  ████  Medium contrast (labels)   │
│ Muted Text      #9CA3AF  ████  Low contrast (hints)       │
└────────────────────────────────────────────────────────────┘

Accessibility Compliance

WCAG 2.1 AA Requirements:
✓ Normal Text (14px):   4.5:1 contrast ratio
✓ Large Text (18px+):   3.0:1 contrast ratio
✓ UI Components:        3.0:1 contrast ratio

WCAG 2.1 AAA Requirements:
✓ Normal Text (14px):   7.0:1 contrast ratio
✓ Large Text (18px+):   4.5:1 contrast ratio

2. Typography System

Font Stack

font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto,
             'Helvetica Neue', Arial, sans-serif;

Type Scale

┌──────────────────────────────────────────────────────────────┐
│ Dialog Title       24px / 1.5rem    Bold      (600)          │
│ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ │
│                                                                │
│ Section Title      20px / 1.25rem   Semibold (600)           │
│ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀            │
│                                                                │
│ Subsection         16px / 1rem      Medium   (500)           │
│ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀                     │
│                                                                │
│ Body Text          14px / 0.875rem  Regular  (400)           │
│ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀                           │
│                                                                │
│ Small Text         12px / 0.75rem   Regular  (400)           │
│ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀                                  │
└──────────────────────────────────────────────────────────────┘

Line Heights

Headings:   1.2  (tight)
Body:       1.5  (normal)
Dense:      1.3  (compact tables)
Relaxed:    1.75 (long form text)

3. Spacing System

Base Unit: 4px

┌───────────────────────────────────────────────────────────┐
│ Space    Size     Usage                                   │
├───────────────────────────────────────────────────────────┤
│ 0.25rem  4px   │  Minimal gap (inline icons)             │
│ 0.5rem   8px   ││ Label margin, tight spacing            │
│ 0.75rem  12px  │││ Inline field gaps                     │
│ 1rem     16px  ││││ Field gaps (standard)                │
│ 1.5rem   24px  │││││││ Section padding                   │
│ 2rem     32px  ││││││││││ Section gaps                   │
│ 3rem     48px  │││││││││││││││││ Empty state padding    │
└───────────────────────────────────────────────────────────┘

Component Spacing

FORM SECTION:
┌─────────────────────────────────────┐
│ [24px padding]                      │
│                                     │
│ ┌─────────────────────────────┐   │
│ │ Header                      │   │
│ └─────────────────────────────┘   │
│ [24px gap]                          │
│ ┌─────────────────────────────┐   │
│ │ Field 1 [16px gap] Field 2  │   │
│ └─────────────────────────────┘   │
│ [16px gap]                          │
│ ┌─────────────────────────────┐   │
│ │ Field 3                     │   │
│ └─────────────────────────────┘   │
│                                     │
│ [24px padding]                      │
└─────────────────────────────────────┘
[32px gap between sections]

4. Component Anatomy

Invoice Item Card

┌─────────────────────────────────────────────────────────────┐
│ Position 1                                    [Delete] ←16px │
│ ─────────────────────────────────────────────────────────── │ 16px
│                                                               │
│ ┌───────────────────────────────────────────────────────┐ │ │
│ │ Beschreibung                                          │ │ │
│ │ (Textarea - 2 rows)                                   │ │ │
│ └───────────────────────────────────────────────────────┘ │ │
│                                   ↕ 12px gap                 │
│ ┌─────────────┐ ┌──────────────┐ ┌──────┐             │ │
│ │   Menge     │ │  Einzelpreis │ │ MwSt │             │ │
│ │   1.00 Stk. │ │   100,00 €   │ │ 19%  │             │ │
│ └─────────────┘ └──────────────┘ └──────┘             │ │
│                                   ↕ 16px gap                 │
│ ─────────────────────────────────────────────────────────── │
│ Zwischensumme:                           119,00 € ←semibold │
└─────────────────────────────────────────────────────────────┘
    ↑                                                       ↑
  16px padding                                        16px padding

Invoice Summary Box

┌─────────────────────────────────────────────────────────────┐
│ ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ │
│ ┃ Zusammenfassung                     [24px padding]    ┃ │
│ ┃ ───────────────────────────────────────────────────── ┃ │
│ ┃                                                        ┃ │
│ ┃ Nettobetrag:                          1.000,00 €  ← 8px │ │
│ ┃ MwSt (19%):                             190,00 €      ┃ │
│ ┃ MwSt (7%):                               14,00 €      ┃ │
│ ┃                                   ↕ 12px gap          ┃ │
│ ┃ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━  ┃ │
│ ┃                                   ↕ 16px gap          ┃ │
│ ┃ GESAMTBETRAG:                       1.204,00 €        ┃ │
│ ┃ (20px font, bold)                                     ┃ │
│ ┃                                                        ┃ │
│ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ │
└─────────────────────────────────────────────────────────────┘
  Gradient background: primary-50 → primary-100
  Border: 2px solid primary-color

Empty State

┌─────────────────────────────────────────────────────────────┐
│                                                               │
│                          48px ↓                              │
│                     ┌──────────────┐                         │
│                     │              │                         │
│                     │   Inbox      │ ← 48px icon, muted      │
│                     │   Icon       │                         │
│                     └──────────────┘                         │
│                          16px ↓                              │
│              Noch keine Positionen hinzugefügt              │
│              (16px, medium weight, secondary color)          │
│                          8px ↓                               │
│       Fügen Sie mindestens eine Position hinzu,             │
│             um die Rechnung zu erstellen                     │
│              (12px, muted color)                             │
│                          24px ↓                              │
│              ┌──────────────────────────┐                   │
│              │ Erste Position hinzufügen │                   │
│              └──────────────────────────┘                   │
│                                                               │
│                          48px ↓                              │
└─────────────────────────────────────────────────────────────┘

5. Interactive States

Button States

DEFAULT:
┌──────────────┐
│   Speichern  │  Background: primary-color
└──────────────┘  Text: white
                  Height: 40px (2.5rem)
                  Padding: 12px 20px
                  Border-radius: 6px

HOVER:
┌──────────────┐
│   Speichern  │  Background: primary-600 (darker)
└──────────────┘  Transform: scale(1.02)
                  Transition: 0.2s ease

FOCUS:
┌──────────────┐
│   Speichern  │  Outline: 2px solid primary-color
└──────────────┘  Outline-offset: 2px

LOADING:
┌──────────────┐
│ ⟳ Speichern  │  Spinner icon rotating
└──────────────┘  Cursor: wait
                  Opacity: 0.8

DISABLED:
┌──────────────┐
│   Speichern  │  Background: surface-200
└──────────────┘  Text: text-muted
                  Cursor: not-allowed
                  Opacity: 0.6

Input Field States

DEFAULT (FloatLabel):
┌─────────────────────────────────────┐
│ Rechnungsnummer                     │ ← Label (12px, top)
│ INV-2025-001                        │ ← Value (14px)
└─────────────────────────────────────┘
  Border: 1px solid surface-200
  Height: 44px (touch-friendly)

FOCUS:
┌─────────────────────────────────────┐
│ Rechnungsnummer                     │ ← Label (primary color)
│ INV-2025-001│                       │ ← Cursor visible
└─────────────────────────────────────┘
  Border: 2px solid primary-color
  Box-shadow: 0 0 0 3px primary-50

ERROR:
┌─────────────────────────────────────┐
│ Rechnungsnummer                     │ ← Label (danger color)
│ INV-2025-001                        │
└─────────────────────────────────────┘
⚠ Rechnungsnummer ist erforderlich    ← Error message (12px, danger)
  Border: 2px solid danger-color

DISABLED:
┌─────────────────────────────────────┐
│ Rechnungsnummer                     │ ← Label (muted)
│ INV-2025-001                        │ ← Value (muted)
└─────────────────────────────────────┘
  Background: surface-100
  Cursor: not-allowed
  Opacity: 0.6

6. Animation & Transitions

Timing Functions

// Fast interactions (hover, focus)
transition: all 0.15s ease-in-out;

// Standard interactions (expand, collapse)
transition: all 0.2s ease;

// Slow interactions (page transitions)
transition: all 0.3s ease;

List Animations (Invoice Items)

ENTER (new item):
┌─────────────┐     ┌─────────────┐
│   Opacity   │ →   │   Opacity   │
│     0.0     │     │     1.0     │
└─────────────┘     └─────────────┘
      ↓                   ↓
TranslateY(-20px)   TranslateY(0)
Duration: 0.3s ease-out

LEAVE (deleted item):
┌─────────────┐     ┌─────────────┐
│   Opacity   │ →   │   Opacity   │
│     1.0     │     │     0.0     │
└─────────────┘     └─────────────┘
      ↓                   ↓
TranslateX(0)       TranslateX(20px)
Duration: 0.3s ease

Micro-interactions

Button Click:
  • Transform: scale(0.98)
  • Duration: 0.1s
  • Timing: ease-out

Card Hover:
  • Box-shadow: 0 2px 8px rgba(0,0,0,0.08)
  • Border-color: primary-color
  • Duration: 0.2s
  • Timing: ease

Toast Notification:
  • Slide in from right
  • Transform: translateX(100%) → translateX(0)
  • Duration: 0.3s
  • Timing: cubic-bezier(0.4, 0, 0.2, 1)

7. Responsive Breakpoints

┌────────────────────────────────────────────────────────────┐
│ BREAKPOINT     WIDTH      COLUMNS    LAYOUT                │
├────────────────────────────────────────────────────────────┤
│ Small Mobile   < 576px    1          Stack all fields      │
│ Mobile         576-768px  1          Stack + full width    │
│ Tablet         768-992px  1-2        Hybrid layout         │
│ Desktop        992-1200px 2          2-column grid         │
│ Large Desktop  > 1200px   2-3        Optimized spacing     │
└────────────────────────────────────────────────────────────┘

Layout Examples

Desktop (992px+)

┌─────────────────────────────────────────────────────┐
│ Rechnungsinformationen                       [Tag]  │
│ ─────────────────────────────────────────────────── │
│ ┌────────────────┐  ┌────────────────┐             │
│ │ Rechnungsnr.   │  │ Status         │             │
│ └────────────────┘  └────────────────┘             │
│ ┌──────────────────────────────────────────────┐   │
│ │ Kunde (full width)                           │   │
│ └──────────────────────────────────────────────┘   │
│ ┌────────────────┐  ┌────────────────┐             │
│ │ Datum          │  │ Fälligk.       │             │
│ └────────────────┘  └────────────────┘             │
└─────────────────────────────────────────────────────┘

Tablet (768-992px)

┌─────────────────────────────────────┐
│ Rechnungsinformationen       [Tag]  │
│ ───────────────────────────────────── │
│ ┌───────────────────────────────┐   │
│ │ Rechnungsnr.                  │   │
│ └───────────────────────────────┘   │
│ ┌───────────────────────────────┐   │
│ │ Status                        │   │
│ └───────────────────────────────┘   │
│ ┌───────────────────────────────┐   │
│ │ Kunde                         │   │
│ └───────────────────────────────┘   │
│ ┌───────────────────────────────┐   │
│ │ Datum                         │   │
│ └───────────────────────────────┘   │
│ ┌───────────────────────────────┐   │
│ │ Fälligkeit                    │   │
│ └───────────────────────────────┘   │
└─────────────────────────────────────┘

Mobile (< 768px)

┌─────────────────────────┐
│ Rechnung                │
│                  [Tag]  │
│ ─────────────────────── │
│ ┌─────────────────────┐ │
│ │ Rechnungsnr.        │ │
│ └─────────────────────┘ │
│ ┌─────────────────────┐ │
│ │ Status              │ │
│ └─────────────────────┘ │
│ ┌─────────────────────┐ │
│ │ Kunde               │ │
│ └─────────────────────┘ │
│         ...              │
└─────────────────────────┘

Dialog = Full Screen
Summary = Sticky Bottom

8. Iconography

PrimeIcons Usage

┌────────────────────────────────────────────────────────┐
│ CONTEXT          ICON              SIZE    USAGE       │
├────────────────────────────────────────────────────────┤
│ Add Item         pi-plus           1rem    Buttons     │
│ Remove Item      pi-trash          1rem    Buttons     │
│ Save             pi-check          1rem    Buttons     │
│ Cancel           pi-times          1rem    Buttons     │
│ Upload           pi-upload         2rem    Empty state │
│ PDF              pi-file-pdf       2.5rem  Preview     │
│ Calendar         pi-calendar       0.875   Input icon  │
│ Building/Company pi-building       1rem    Dropdown    │
│ Info             pi-info-circle    1rem    Messages    │
│ Warning          pi-exclamation    1rem    Alerts      │
│ Success          pi-check-circle   1rem    Toast       │
│ Error            pi-times-circle   1rem    Toast       │
└────────────────────────────────────────────────────────┘

Icon Colors

Default:    var(--text-secondary)    #6B7280
Primary:    var(--primary-color)     #3B82F6
Success:    var(--success-color)     #22C55E
Warning:    var(--warning-color)     #F59E0B
Danger:     var(--danger-color)      #EF4444
Muted:      var(--text-muted)        #9CA3AF (opacity: 0.5)

9. Error Handling & Validation

Validation Patterns

INLINE VALIDATION (on blur):
┌─────────────────────────────────────┐
│ E-Mail                              │
│ invalid.email                       │ ← Invalid input
└─────────────────────────────────────┘
⚠ Ungültige E-Mail-Adresse            ← Error appears immediately
  Duration: 0.2s fade-in

SUBMIT VALIDATION:
┌─────────────────────────────────────┐
│ Rechnungsnummer                     │
│                                     │ ← Empty required field
└─────────────────────────────────────┘
⚠ Rechnungsnummer ist erforderlich

  All errors show simultaneously on submit
  Focus moves to first invalid field

Error States Visual Hierarchy

PRIORITY 1 - Critical Errors (Red border + icon):
┌─────────────────────────────────────┐
│ ⚠ Rechnungsnummer                   │ ← Red label
│                                     │
└─────────────────────────────────────┘
  Border: 2px solid danger-color

PRIORITY 2 - Warnings (Orange border):
┌─────────────────────────────────────┐
│ ⚠ Fälligkeitsdatum                  │ ← Orange label
│ 01.01.2024                          │
└─────────────────────────────────────┘
⚠ Datum liegt in der Vergangenheit
  Border: 2px solid warning-color

PRIORITY 3 - Info (Blue border):
┌─────────────────────────────────────┐
│  Steuer-ID                         │
│ DE123456789                         │
└─────────────────────────────────────┘
 Optional, aber empfohlen
  Border: 1px solid info-color

10. Loading & Empty States

Skeleton Screens

LOADING FORM:
┌─────────────────────────────────────┐
│ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓                     │ ← Animated gradient
│ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓                 │
│ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓   │
│ ▓▓▓▓▓▓▓▓▓▓                         │
└─────────────────────────────────────┘
  Animation: shimmer effect (1.5s loop)
  Background: linear-gradient 200% width

LOADING BUTTON:
┌──────────────┐
│ ⟳ Lädt...    │ ← Spinner rotates
└──────────────┘
  Disabled: true
  Cursor: wait

Progress Indication

UPLOAD PROGRESS:
┌─────────────────────────────────────┐
│ rechnung_2025_001.pdf    │ [×]     │
│ 2.4 MB                              │
│ ▓▓▓▓▓▓▓▓▓▓▓░░░░░░░░░░░ 45%        │ ← Progress bar
└─────────────────────────────────────┘
  Height: 6px
  Background: success-color
  Animation: smooth increment

11. Accessibility Features

Focus Management

TAB ORDER:
1. Rechnungsnummer     [← First field]
2. Status
3. Kunde
4. Rechnungsdatum
5. Fälligkeitsdatum
6. Position 1 - Beschreibung
7. Position 1 - Menge
8. Position 1 - Preis
9. Position 1 - MwSt
10. Position hinzufügen Button
...
N-1. Abbrechen Button
N. Speichern Button   [← Last focusable]

ESC: Return to previous focusable

ARIA Live Regions

<!-- Screen reader announcements -->
<div aria-live="polite" aria-atomic="true" class="sr-only">
  <span v-if="saving">Rechnung wird gespeichert...</span>
  <span v-if="saved">Rechnung wurde gespeichert</span>
  <span v-if="error">Fehler: {{ errorMessage }}</span>
</div>

<!-- Status updates -->
<div aria-live="assertive" role="alert" class="sr-only">
  Position {{ index + 1 }} wurde entfernt
</div>

Keyboard Navigation Hints

┌────────────────────────────────────────────────────────┐
│ [Ctrl+S] Speichern  •  [Ctrl+⇧+P] Position hinzufügen │
│ [Esc] Abbrechen  •  [Tab] Nächstes Feld               │
└────────────────────────────────────────────────────────┘
  Display: Desktop & Tablet only
  Hidden on mobile (<768px)
  Can be toggled with [?] key

12. Print Styles

@media print {
  /* Hide interactive elements */
  .form-actions,
  .keyboard-hints,
  .invoice-item-actions,
  button { display: none !important; }

  /* Optimize for paper */
  .form-section {
    box-shadow: none;
    page-break-inside: avoid;
  }

  /* Black & white optimization */
  .invoice-summary {
    background: white;
    border: 2px solid black;
  }

  /* Add page breaks */
  .page-break { page-break-after: always; }
}

Print Layout Preview

PAGE 1:
┌─────────────────────────────────────┐
│ myCRM                        Logo   │
│ ─────────────────────────────────── │
│                                     │
│ RECHNUNG INV-2025-001               │
│                                     │
│ Rechnungsinformationen              │
│ Rechnungsnr: INV-2025-001           │
│ Datum: 12.12.2025                   │
│ Kunde: ACME Corp                    │
│                                     │
│ Rechnungspositionen                 │
│ 1. Consulting Services              │
│    10 Stk × 100,00 € = 1.000,00 €  │
│                                     │
│ ─────────────────────────────────── │
│ Nettobetrag:        1.000,00 €      │
│ MwSt (19%):           190,00 €      │
│ GESAMTBETRAG:       1.190,00 €      │
│                                     │
│ Seite 1 von 1                       │
└─────────────────────────────────────┘

Document Version: 1.0 Last Updated: 2025-12-12 Author: UX Designer Agent Project: myCRM Billing Module