# SWP Design System - Component Catalog Reference for alle genbrugelige komponenter. **LAV ALDRIG EN NY KOMPONENT HVIS DEN ALLEREDE EKSISTERER HER.** --- ## Base Patterns (components.css) **VIGTIGT:** Disse base patterns skal ALTID bruges som foundation for nye features. ### Data Table Pattern (ANBEFALET) Alle nye tabeller skal bruge `swp-data-table` fra components.css: ```html Kolonne 1 Kolonne 2 Data 1 Data 2 ``` **CSS Pattern:** ```css /* I feature CSS - definer kun kolonner via context class */ swp-card.feature-context swp-data-table { grid-template-columns: 1fr 120px 80px; } /* Kolonne-specifik styling med nth-child */ swp-card.feature-context swp-data-table-cell:nth-child(2) { font-family: var(--font-mono); } ``` **VIGTIGT:** Context class skal være på `swp-card`, IKKE en wrapper div! ### List Item Pattern Alle lister (notifikationer, bookinger, attentions) bruger: ```html ``` ### Icon Container Pattern Standard icon wrapper (40×40px cirkel): ```html ``` --- ## Page Structure (page.css) | Element | Beskrivelse | Eksempel | |---------|-------------|----------| | `swp-page-container` | Hovedcontainer for side | `...` | | `swp-page-header` | Side header med titel og actions | Flex, space-between | | `swp-page-title` | Titel-wrapper med h1 og p | h1 + subtitle | | `swp-page-actions` | Action buttons i header | Flex gap | | `swp-card` | Standard card wrapper | Border, padding, rounded | | `swp-card-header` | Card header wrapper | Flex, space-between, border-bottom | | `swp-card-title` | Card title med ikon | Flex, icon + text | | `swp-section-action` | Action link i header | Teal, clickable | | `swp-section-label` | Subsection label (KUN til sekundære sektioner inde i card, ALDRIG som card header) | Uppercase, 11px, border-bottom | | `swp-card-content` | Card indhold | Block | ### Card Header Eksempler **VIGTIGT:** Brug ALTID `swp-card-header` + `swp-card-title` som første element i et card. ❌ **FORKERT - brug IKKE `swp-section-label` som card header:** ```html Kontaktoplysninger ``` ✅ **KORREKT - brug `swp-card-header` + `swp-card-title`:** ```html Kontaktoplysninger ``` **Card header med ikon:** ```html Email ``` **Card header med action:** ```html Dagens bookinger Se alle ``` **Subsection label (KUN til sekundære sektioner inde i card):** ```html Grundlæggende Interne noter ``` **HUSK:** `swp-section-label` må ALDRIG bruges som erstatning for `swp-card-header`! --- ## Stats Components (stats.css) ### Containers | Element | Kolonner | Brug | |---------|----------|------| | `swp-stats-bar` | 4 kolonner | Dashboard stats | | `swp-stats-grid` | 4 kolonner | Grid layout | | `swp-stats-row` | 3 kolonner | Feature pages (Employees, etc.) | ### Stat Card ```html 42 Aktive brugere ``` **Varianter (class):** - `highlight` / `teal` - Teal farve - `success` - Grøn - `warning` / `amber` - Amber/orange - `danger` / `negative` / `red` - Rød - `purple` - Lilla - `highlight filled` - Filled teal baggrund **VIGTIGT:** `swp-stat-value` bruger `font-family: var(--font-mono)` automatisk! --- ## Tabs (tabs.css) ```html Brugere Roller ``` **VIGTIGT:** - Aktiv tab: `class="active"` (IKKE data-active="true") - Tab content: `class="active"` for at vise --- ## Buttons (cash.css) ```html Tilføj ``` **Varianter:** - `primary` - Teal baggrund, hvid tekst - `secondary` - Hvid baggrund, border - `ghost` - Transparent --- ## Badges (cash.css) **ALLE badges bruger `swp-status-badge`** - kun farve og indhold ændres. ```html Tekst ``` **Varianter:** | Class | Farve | Brug | |-------|-------|------| | `approved` | Grøn | Godkendt status | | `active` | Grøn | Aktiv status | | `paid` | Grøn | Betalt status | | `draft` | Amber | Kladde status | | `invited` | Amber | Invitation sendt | | `pending` | Amber | Afventer status | | `owner` | Teal | Ejer rolle | | `admin` | Purple | Admin rolle | | `leader` | Blue | Leder rolle | | `employee` | Grå | Medarbejder rolle | Automatisk dot via `::before` pseudo-element. --- ## Tables - swp-data-table Pattern **BRUG ALTID `swp-data-table`** for nye tabeller. Den generiske komponent er defineret i components.css. ### Struktur ```html Kolonne 1 Kolonne 2 Data 1 Data 2 ``` ### CSS Pattern ```css /* Definer kolonner via context class på swp-card */ swp-card.context-class swp-data-table { grid-template-columns: 1fr 120px 80px; } /* Kolonne-specifik styling med nth-child */ swp-card.context-class swp-data-table-cell:nth-child(2) { font-family: var(--font-mono); } ``` ### Eksisterende tabeller | Feature | Card Class | CSS fil | |---------|------------|---------| | Employees list | `swp-card.employees-list` | employees.css | | Salary history | `swp-card.salary-history` | employees.css | | Invoice history | `swp-card.invoice-history` | account.css | | Stats bookings | `swp-card.stats-bookings` | employees.css | | Cash | `swp-cash-table` (kompleks) | cash.css | **Lister (ikke tabeller):** | Feature | Container | Item | CSS fil | |---------|-----------|------|---------| | Bookings | `swp-booking-list` | `swp-booking-item` | bookings.css | | Notifications | `swp-notification-list` | `swp-notification-item` | notifications.css | | Attentions | `swp-attention-list` | `swp-attention-item` | attentions.css | --- ## Table Cells - Standard Styling Base styling er i components.css. Tilpas kun via context class: ```css /* Header cells (automatisk fra components.css) */ swp-data-table-header swp-data-table-cell { font-size: var(--font-size-xs); font-weight: var(--font-weight-semibold); text-transform: uppercase; color: var(--color-text-secondary); } /* Body cells (automatisk fra components.css) */ swp-data-table-cell { padding: var(--spacing-4); font-size: var(--font-size-base); color: var(--color-text); } /* Feature-specifik tilpasning via context */ swp-card.my-feature swp-data-table-cell:nth-child(3) { text-align: right; } ``` --- ## Icon Buttons (employees.css) ```html ``` --- ## Edit Forms (employees.css) Key-value display med valgfri redigering. Bruger Grid + Subgrid for alignment. ### Basis struktur ```html Label tekst Værdi Med redigering Redigerbar værdi ``` ### Med select dropdown ```html Vælg type ``` ### Mono-font for tal ```html 131,49 kr ``` --- ## User Info Pattern (employees.css) ```html MJ Maria Jensen maria@example.com ``` **Avatar farver:** (ingen class = teal), `purple`, `blue`, `amber` --- ## Document List (employees.css) Genbruges til dokumenter, certificeringer, kurser og lignende lister. ```html Ansættelseskontrakt.pdf Uploadet 1. aug 2019 Vis ``` **Med badge i stedet for knap:** ```html Balayage Specialist Udløber: 15. juni 2026 Gyldig ``` --- ## Subsection (employees.css) Til gruppering af lister (f.eks. "Gennemførte kurser" / "Planlagte kurser"). ```html Gennemførte kurser ``` --- ## Simple List (employees.css) Simpel liste med tekst + badge (f.eks. planlagt fravær). ```html 23. dec – 2. jan 2026 Ferie ``` --- ## Salary History Table (employees.css) Bruger `swp-data-table` med `.salary-history` context class. ```html Lønhistorik Periode Bruttoløn Januar 2026 34.063,50 kr ``` Rækker har hover-effekt og chevron bliver teal ved hover. --- ## Add Button (components.css) Dashed border knap til tilføjelse af elementer. ```html + Upload dokument + Tilføj certificering ``` **Styling:** Dashed border, centreret, hover → teal border og tekst. --- ## Design Tokens (design-tokens.css) ### Farver | Token | Brug | |-------|------| | `--color-teal` | Primary brand, success | | `--color-green` | Success, positive | | `--color-amber` | Warning, pending | | `--color-red` | Error, danger | | `--color-purple` | Special, AI | | `--color-blue` | Info | ### Spacing ```css --spacing-1: 2px; --spacing-2: 4px; --spacing-3: 6px; --spacing-4: 8px; --spacing-5: 10px; --spacing-6: 12px; --spacing-7: 14px; --spacing-8: 16px; --spacing-10: 20px; --spacing-12: 24px; ``` ### Font Sizes ```css --font-size-xs: 11px; --font-size-sm: 12px; --font-size-md: 13px; --font-size-base: 14px; /* Standard body text */ --font-size-lg: 16px; --font-size-xl: 18px; --font-size-2xl: 20px; --font-size-3xl: 22px; ``` ### Font Families ```css --font-family: 'Poppins', sans-serif; --font-mono: 'JetBrains Mono', monospace; /* Til tal/værdier */ ``` --- ## Checklist for Ny Side 1. [ ] Læs denne fil 2. [ ] List UI elementer der skal bruges 3. [ ] Match hver element med eksisterende komponent 4. [ ] Dokumenter kun NYE elementer der skal oprettes 5. [ ] Opret feature CSS med header der angiver genbrugte komponenter 6. [ ] Brug `var(--font-size-base)` for body text 7. [ ] Brug `var(--font-mono)` kun for tal/værdier --- ## Fil Reference | Fil | Indhold | |-----|---------| | `design-tokens.css` | Farver, spacing, fonts, shadows | | `design-system.css` | Base resets, typography | | `page.css` | Page structure, sticky-header | | `components.css` | Buttons, badges, cards, section-label, add-button, avatars, icon-btn, **swp-data-table** | | `stats.css` | Stat cards, stat rows | | `tabs.css` | Tab bar, tab content | | `employees.css` | User info, edit forms, document lists, context styles (.employees-list, .salary-history, .stats-bookings) | | `account.css` | Account/billing styles, context styles (.invoice-history) | | `bookings.css` | Booking list items | | `notifications.css` | Notification items | | `attentions.css` | Attention items | | `cash.css` | Cash register (swp-cash-table - kompleks, ikke migreret) |