Files
web-cad/docs/component_inventory.md

132 lines
5.7 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# HMS Licht & Ton Component Inventory
## Overview
All components are built as Vue 3 single-file components (template + setup). In production (Nuxt 3), these map to `.vue` files in `components/` and `pages/` directories.
## Shared Components
### HmsLogo
- **Purpose:** SVG logo with white HMS text + orange (#EC6925) rectangular border
- **Props:** `size` (Number, default: 40)
- **States:** Default only (static SVG)
- **Accessibility:** `aria-label`, `role="img"`
### SpeakerIcon
- **Purpose:** SVG loudspeaker/light icon for equipment grid
- **Props:** `type` (String: linearray, subwoofer, monitor, pointsource, column, movinghead)
- **States:** Default (gray), Hover (orange via parent CSS)
- **Accessibility:** `aria-hidden="true"`
### AppHeader
- **Purpose:** Sticky navigation header with logo, desktop nav, mobile hamburger menu
- **States:** Default, Active nav item (`aria-current="page"`), Mobile menu open/closed
- **Accessibility:** `role="banner"`, `aria-label`, `aria-expanded`, `aria-controls`
### AppFooter
- **Purpose:** 4-column footer with company info, navigation, contact, legal links
- **States:** Default only
- **Accessibility:** `role="contentinfo"`
### ServiceCard
- **Purpose:** Service offering card with icon, title, description
- **Props:** `icon`, `title`, `description`
- **States:** Default, Hover (border highlight)
### EquipmentCard
- **Purpose:** Equipment listing card with image, badge, name, description, add-to-cart button
- **Props:** `item` (Object: id, code, name, category, description, brand, image)
- **Emits:** `click`, `add-to-cart`
- **States:** Default, Hover (border + shadow + lift), Focus (keyboard), No image (placeholder)
- **Accessibility:** `role="article"`, `tabindex="0"`, `aria-label` on add button
### LoadingSkeleton
- **Purpose:** Shimmer animation skeleton cards for loading states
- **Props:** `count` (Number, default: 6)
- **States:** Shimmer animation (infinite)
- **Accessibility:** `aria-live="polite"`, `aria-busy="true"`
### EmptyState
- **Purpose:** Empty state with icon, title, message, optional CTA button
- **Props:** `icon`, `title`, `message`, `actionLabel`
- **Emits:** `action`
- **States:** Default
- **Accessibility:** `role="status"`
### ErrorState
- **Purpose:** Error state with alert icon, title, message, retry button
- **Props:** `title`, `message`
- **Emits:** `retry`
- **States:** Default
- **Accessibility:** `role="alert"`
## Page Components
### HomePage (`#/`)
- **Sections:** Hero (bg image + overlay), Speaker Grid (6 types), Über uns (stats + image), 8 Service Cards, Mietkatalog CTA
- **States:** Default (all content static)
### ReferenzenPage (`#/referenzen`)
- **States:** Loading (skeleton), Loaded (gallery grid), Error (retry), Empty (no category results)
- **Features:** Category filter chips (Alle, Open-Air, Indoor, Rigging, Event), 9 real HMS photos
### KontaktPage (`#/kontakt`)
- **Sections:** Büro/Lager/Öffnungszeiten cards, 2 Ansprechpartner cards, Contact form
- **Form States:** Default, Validation errors (inline), Submitting (spinner), Submitted (success message)
- **Validation:** Name*, Email* (regex), Message*, Privacy checkbox*
### MietkatalogPage (`#/mietkatalog`)
- **States:** Loading (skeleton), Loaded (equipment grid), Error (retry), Empty (no search results)
- **Features:** Search input, Category filter chips (7 categories), Sort dropdown (name/brand/code), Result count
### EquipmentDetailPage (`#/mietkatalog/:id`)
- **States:** Loading (skeleton), Loaded (detail view), Error (not found)
- **Sections:** Image/placeholder, Specs table, Rental form (date range + quantity), Related items grid
- **Form:** Mietbeginn, Mietende, Anzahl (stepper), Add to cart button
### WarenkorbPage (`#/warenkorb`)
- **States:** Empty (no items), Cart with items, Submitting (spinner), Submitted (success)
- **Features:** Item list with quantity steppers, remove buttons, rental dates display, Request form (name*, email*, phone, event_date*, event_location*, message)
### AdminPage (`#/admin`)
- **States:** Login form, Loading (spinner), Logged in (success)
- **Features:** Username + password fields, minimal design
### NotFoundPage (`#/404`)
- **States:** Default (404 message + home link)
## UX State Coverage Summary
| Page | Loading | Empty | Error | Partial | Success |
|------|---------|-------|-------|---------|---------|
| Home | | | | | |
| Referenzen | Skeleton | No category | Retry | Filtered | |
| Kontakt | | | | | Form sent |
| Mietkatalog | Skeleton | No results | Retry | Filtered | |
| Detail | Skeleton | | Not found | | |
| Warenkorb | | Empty cart | | | Request sent |
| Admin | Spinner | | | | Logged in |
## Component States Documentation
### Button States
- **Default:** `background: var(--color-accent); color: white`
- **Hover:** `background: var(--color-accent-hover)`
- **Active:** `transform: translateY(0)`
- **Disabled:** `background: var(--secondary); cursor: not-allowed`
- **Focus-visible:** `outline: 2px solid var(--color-accent); outline-offset: 2px`
### Input States
- **Default:** `border: 1px solid var(--border-strong); background: var(--surface)`
- **Focus:** `border-color: var(--color-accent); box-shadow: 0 0 0 2px rgba(236,105,37,0.1)`
- **Error:** `border-color: var(--color-error)`
- **Disabled:** `background: var(--row); color: var(--secondary); cursor: not-allowed`
### Card States
- **Default:** `border: 1px solid var(--border); box-shadow: var(--shadow-sm)`
- **Hover:** `border-color: var(--secondary); box-shadow: var(--shadow-lg)`
### Chip States
- **Default:** `border: 1px solid var(--border-strong); background: var(--surface)`
- **Hover:** `border-color: var(--secondary)`
- **Active:** `background: var(--color-accent); color: white; border-color: var(--color-accent)`