Fundament: Branding Craftvia
- Farb-Tokens laut Brandbook §11.4 (Lotsenblau, Signalorange, Graphit, Hafengrau, Stahlgrau, Zink, Funktionsfarben) in globals.css + src/lib/brand.ts; helles Theme - Inline-SVG-Logo src/components/brand/craftvia-logo.tsx (horizontal/signet, color/mono/reversed, App-Icon-Kachel, optionale Tagline); Certvia-/GEFIM-Logos entfernt - Favicon/PWA-Icons aus dem Signet erzeugt (scripts/generate-brand-icons.ts), site.webmanifest (Craftvia, theme_color #082E5B) - Inter selbst gehostet (next/font/local, lokale OFL-Datei), Open Sans/Poppins entfernt - Metadaten, WebAuthn-RP-Name, Mail-/Dokument-CD auf Craftvia umgestellt - docs/craftvia/BRANDING.md ersetzt docs/BRANDING-CERTVIA.md Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -1,149 +0,0 @@
|
||||
# Branding-Umstellung auf Certvia — Inventar & Umsetzung
|
||||
|
||||
> Branch `dev-branding-certvia` (Basis `dev`) · Quelle: `Aufgabenpaket-Branding-Certvia.md` + `Certvia-Assets/`
|
||||
> Leitplanke: **GEFIM bleibt Dachmarke** („Ein Produkt von GEFIM"), nur die **Produktmarke** wird Certvia.
|
||||
> Reines Branding — **keine Funktionsänderung**, kein Umbau von Logik oder Datenmodell.
|
||||
|
||||
---
|
||||
|
||||
## 1. Design-Tokens (verbindliche Referenz)
|
||||
|
||||
**Markenfarben** (Logo, Print, Verläufe — `--brand-*`):
|
||||
|
||||
| Rolle | Token | Hex |
|
||||
|---|---|---|
|
||||
| Violett (Marke) | `--brand-violet` | `#5d52a3` |
|
||||
| Magenta (Akzent „via", Haken) | `--brand-magenta` | `#812d80` |
|
||||
| Hellblau | `--brand-blue` | `#8dc4e0` |
|
||||
| Anthrazit (Text/Headlines) | `--brand-anthracite` | `#3b3b3a` |
|
||||
| Violett auf Dunkel | `--brand-violet-on-dark` | `#7d6fd6` |
|
||||
| Magenta auf Dunkel | `--brand-magenta-on-dark` | `#d17bcf` |
|
||||
|
||||
**UI Dark-Theme** (unverändert — **ist** die Certvia-Produktpalette, nicht „korrigieren"):
|
||||
`--ui-primary #7d6fd6` · `--ui-primary-deep #5d52a3` · `--ui-blue #8dc4e0` · `--ui-magenta #b45bb0` ·
|
||||
`--bg-0 #0e1220` · `--bg-1 #141a2e` · `--elevated #1a2138` · `--panel rgba(30,38,64,.72)` ·
|
||||
`--panel-brd rgba(120,135,180,.18)` · `--foreground #e8ecf7` · `--muted-foreground #8b93ad` ·
|
||||
`--ok #39c07f` · `--warn #f0ad4e` · `--risk #ff6b6b` · Primär-Verlauf `linear-gradient(135deg,#5d52a3,#7d6fd6)`
|
||||
· Fokus-Ring `rgba(125,111,214,.35)`.
|
||||
|
||||
Single Source of Truth: **`src/app/globals.css`** (CSS) und **`src/lib/brand.ts`** (JS/TS — für alles,
|
||||
was CSS-Variablen nicht auflösen kann: Canvas-/PNG-Export, Metadaten, künftige Dokument-Exporte).
|
||||
|
||||
**Typografie:** Headlines/Wortmarke **Poppins**, Fließtext **Open Sans** — self-hosted (`src/app/fonts/`).
|
||||
|
||||
---
|
||||
|
||||
## 2. Inventar (Story S0)
|
||||
|
||||
### 2.1 Produktmarke → Certvia
|
||||
|
||||
| Datei | Fundstelle | Maßnahme | Story |
|
||||
|---|---|---|---|
|
||||
| `src/app/globals.css` | `--gefim-violet/-deep/-blue/-magenta`, Kommentare „GEFIM-Theme" | Umbenannt auf `--brand-*` / `--ui-*`, Kommentare auf Certvia | S1/S9 |
|
||||
| `src/app/globals.css` | Flächenfarben direkt als Hex (`#0e1220`, `#141a2e`, …) | Über `--bg-0`/`--bg-1`/`--elevated` geführt, semantische Tokens referenzieren sie | S1 |
|
||||
| `src/components/risk-modals.tsx` | `bg-[#0e1220]` (Rest-Risiko-Marker, Legende) | → `bg-[var(--bg-0)]` | S1 |
|
||||
| `src/app/(app)/risks/page.tsx` | `bg-[#0e1220]/75`, `hover:bg-[#0e1220]` (Heatmap-Chip) | → Token `--chip-overlay` / `var(--bg-0)` | S1 |
|
||||
| `src/components/dependency-graph.tsx` | `#8dc4e0`, `#ff6b6b`, `#141a2e`, `#0e1220`, `#4a5372`, `#8b93ad` | CSS-Vars wo möglich; PNG-Export nutzt `BRAND.ui` aus `src/lib/brand.ts` (html-to-image löst keine CSS-Vars auf) | S1 |
|
||||
| `public/gefim-logo.png` | Produktlogo in Sidebar + Login | Verschoben nach `public/assets/logo/gefim-logo.png`, dient nur noch der **Dachmarke** | S2 |
|
||||
| `src/app/(app)/layout.tsx` | Sidebar-Logo `/gefim-logo.png`, Alt-Text „GEFIM …" | `<CertviaLogo variant="lockup" theme="dark">` über den Branding-Resolver | S2/S8 |
|
||||
| `src/app/login/page.tsx` | Logo `/gefim-logo.png`, Alt-Text | Certvia-Lockup + Tagline + Dachmarken-Fußnote | S2/S7 |
|
||||
| `src/app/platform/login/page.tsx` | kein Logo | Certvia-Lockup + „Plattform-Administration" | S2/S7 |
|
||||
| `src/app/(platform)/layout.tsx` | `ShieldCheck` + „ISMS · Plattform-Administration" | Certvia-Mark + „Certvia · Plattform-Administration" | S2/S3 |
|
||||
| `src/app/layout.tsx` | `title: "ISMS-Tool"`, keine Icons/OG/Manifest | Vollständige Certvia-Metadaten inkl. Icons, Manifest, `themeColor` | S3 |
|
||||
| `src/app/favicon.ico` | Next-Default-Favicon | Entfernt; Icons laufen über `public/favicon/` + `metadata.icons` | S2 |
|
||||
| `messages/de.json`, `messages/en.json` | `common.appName` = „ISMS-Tool"/„ISMS Tool" | → „Certvia" (+ `appTagline`, `appByline`) | S3 |
|
||||
| `src/server/mfa.ts` | TOTP-Issuer `"ISMS-Tool · Plattform"` | → `"Certvia · Plattform"` | S3 |
|
||||
| `src/components/ui/button.tsx` | Kommentar „GEFIM-Verlauf" | → „Certvia-Verlauf" | S9 |
|
||||
| `src/components/mockup-ui.tsx` | Kommentar-Referenz auf Mockup-Datei | Formulierung entschärft (Dateiname bleibt, s. u.) | S9 |
|
||||
| `src/lib/control-titles.ts` | Kommentar „aus dem GEFIM-Mockup übernommen" | → neutral „aus dem UI-Mockup" | S9 |
|
||||
| `src/app/(app)/settings/page.tsx` | Hinweis „Logo-Upload folgt in Phase 2" | Ergänzt um Certvia-Default-Aussage | S8 |
|
||||
| `src/proxy.ts` | Matcher schloss `.webmanifest` nicht aus | `/site.webmanifest` lieferte die Login-HTML statt JSON → Endung ergänzt (siehe §5) | S3 |
|
||||
|
||||
### 2.2 Dachmarke GEFIM → bleibt bewusst erhalten
|
||||
|
||||
| Ort | Grund |
|
||||
|---|---|
|
||||
| `public/assets/logo/gefim-logo.png` | Dachmarken-Logo für „Ein Produkt von GEFIM" |
|
||||
| `src/components/brand/powered-by-gefim.tsx` | Neue Komponente, die genau diesen Hinweis rendert (Login, Plattform-Login, Print-/Export-Fußzeile, Mail-Footer) |
|
||||
| `docs/ISMS-*-GEFIM.html`, Verweise in `README.md`/`AGENTS.md`/`docs/SPEC.md` | Historische Mockups/Spezifikation — Projektartefakte, keine Produkt-UI |
|
||||
| `prisma/seed.ts` (`ORG_NAME` „GEFIM Demo GmbH") | **Demo-Mandantendaten** (fiktiver Kunde), nicht der Produktname |
|
||||
| `prisma/import-managed.ts` (`portal.gefim.example`) | Demo-Registerzeile, nicht der Produktname |
|
||||
|
||||
Nach der Umstellung liefert `rg -i "gefim"` ausschließlich diese Kategorien.
|
||||
|
||||
---
|
||||
|
||||
## 3. Umgesetzte Stories
|
||||
|
||||
| Story | Inhalt | Status |
|
||||
|---|---|---|
|
||||
| **S0** | Inventar (dieses Dokument) | ✅ |
|
||||
| **S1** | Token-Zentralisierung `--brand-*` / `--ui-*`, `src/lib/brand.ts`, hartkodierte Farben ersetzt | ✅ |
|
||||
| **S2** | Assets eingebunden, `<CertviaLogo>`, Favicon/PWA-Icons, Sidebar + beide Logins | ✅ |
|
||||
| **S3** | App-Name/Meta/OG/Manifest/i18n/MFA-Issuer auf Certvia | ✅ |
|
||||
| **S4** | Poppins + Open Sans self-hosted bestätigt (waren es bereits), Fallback-Stack + `swap` geprüft | ✅ |
|
||||
| **S7** | Login, Plattform-Login, Change-Password, Enroll-MFA, Konto-deaktiviert, 404, 500 gebranded | ✅ |
|
||||
| **S9** | Produkt-Referenzen bereinigt, Dachmarke belassen | ✅ |
|
||||
| **S5** | Branding-Layer für Dokument-/Export-CD (`src/lib/brand.ts` + Print-Stylesheet) | ✅ (Andockpunkt) |
|
||||
| **S8** | Branding-Resolver mit Certvia-Default, Custom überschreibt nur wenn gesetzt | ✅ |
|
||||
| **S6** | Brandfähige E-Mail-Template-Basis (SMTP selbst folgt in Paket 4) | ✅ (Basis) |
|
||||
|
||||
---
|
||||
|
||||
## 4. Wo liegt was (neu)
|
||||
|
||||
| Pfad | Inhalt |
|
||||
|---|---|
|
||||
| `src/lib/brand.ts` | Marken-/UI-Farben als JS-Konstanten, Produktname/Tagline/Byline, Asset-Pfade, `resolveTenantBranding()` |
|
||||
| `src/lib/document-brand.ts` | Dokument-CD (helles Theme, Kopf-/Fußzeilen-Bausteine) — Andockpunkt für DOCX/PDF |
|
||||
| `src/lib/email-brand.ts` | Brandfähige HTML-/Text-Mail-Basis für Paket 4 |
|
||||
| `src/components/brand/certvia-logo.tsx` | `<CertviaLogo variant="lockup\|mark" theme="light\|dark" />` als Inline-SVG |
|
||||
| `src/components/brand/tenant-brand.tsx` | Mandanten-Marke mit Certvia-Fallback |
|
||||
| `src/components/brand/powered-by-gefim.tsx` | Dachmarken-Hinweis inkl. GEFIM-Logo |
|
||||
| `public/assets/logo/` | Certvia-SVGs/PNGs + GEFIM-Dachmarkenlogo |
|
||||
| `public/favicon/`, `public/favicon.ico`, `public/site.webmanifest` | App-Icons und PWA-Manifest |
|
||||
| `docs/branding/` | Aufgabenpaket + Logo-README aus dem Design-Paket |
|
||||
| `src/app/globals.css` (`@media print`) | Druck-/Dokument-CD |
|
||||
|
||||
---
|
||||
|
||||
## 5. Beim Einbau aufgefallen (Abweichungen vom Aufgabenpaket)
|
||||
|
||||
- **Lockup-SVG trägt Poppins jetzt eingebettet.** `public/assets/logo/certvia-lockup-positiv.svg`
|
||||
enthält Poppins 300 + 700 als woff2-Data-URI (≈22 KB). Damit erscheint die Wortmarke auch
|
||||
außerhalb der App korrekt (Druck, Export, Mail) — der offene Punkt „Text in Pfade wandeln" aus
|
||||
`docs/branding/README-Logo.md` ist damit erledigt. Geometrie und Farben sind unverändert.
|
||||
In der App rendert `<CertviaLogo>` das Zeichen ohnehin inline und nutzt die App-Schrift direkt.
|
||||
- **`/site.webmanifest` war nicht erreichbar.** Der Route-Gate-Matcher in `src/proxy.ts` nahm nur
|
||||
`svg|png|jpg|ico` aus — für `.webmanifest` lieferte der Server die Login-Seite statt JSON, das
|
||||
PWA-Manifest wäre also wirkungslos geblieben. Endung ergänzt. Bewusst **keine** Verzeichnis-
|
||||
Ausnahme für `assets/`: das ist zugleich die App-Route des Asset-Inventars und bleibt hinter dem
|
||||
Gate (nachgeprüft: `/assets`, `/assets/xyz` → 307 auf `/login`).
|
||||
- **`src/app/favicon.ico` entfernt.** Die Datei-Konvention von Next.js und eine `public/favicon.ico`
|
||||
schließen sich gegenseitig aus; die Icons laufen jetzt vollständig über `metadata.icons`.
|
||||
- **404-/500-Seiten neu angelegt** (`src/app/not-found.tsx`, `src/app/error.tsx`) — es gab bisher
|
||||
keine. Sie erscheinen für angemeldete Nutzer; anonyme Aufrufe fängt weiterhin das Login-Gate ab.
|
||||
|
||||
### Kontrast (WCAG AA, geprüft)
|
||||
|
||||
| Kombination | Kontrast | Bewertung |
|
||||
|---|---|---|
|
||||
| Magenta `#812d80` auf Weiß (Wortmarke/Print) | 8,0 : 1 | AA + AAA |
|
||||
| Magenta `#d17bcf` auf Karte `#141a2e` | 6,1 : 1 | AA |
|
||||
| Magenta `#d17bcf` auf Seitengrund `#0e1220` | 6,6 : 1 | AA |
|
||||
|
||||
---
|
||||
|
||||
## 6. Bewusste Abgrenzungen
|
||||
|
||||
- **UI-Palette unverändert.** Die Dark-Theme-Farben wurden nur konsolidiert/umbenannt, nicht geändert.
|
||||
`--brand-violet` (`#5d52a3`) gilt für Logo/Print/Verläufe, `--ui-primary` (`#7d6fd6`) für Interaktion.
|
||||
- **Kein Light-Mode.** Die App ist bewusst dark-only; `<CertviaLogo theme="light">` existiert für
|
||||
Dokument-/Druck-/Mail-Kontexte, wird in der UI aber nicht verwendet.
|
||||
- **Poppins 400** ist nicht als woff2 im Repo (vorhanden: 300/500/600/700). Aktuell nutzt nichts
|
||||
Poppins 400 — Headlines laufen auf 600/700, die Wortmarke auf 300/700. Sollte 400 gebraucht werden,
|
||||
muss die woff2 ergänzt werden; ein CDN-Fetch bleibt ausgeschlossen.
|
||||
- **Logo-Upload je Mandant** braucht Objektspeicher (Admin Phase 2). Der Resolver ist bereits darauf
|
||||
vorbereitet (`logoUrl` optional), das Feld existiert im Schema noch nicht — bewusst keine Migration.
|
||||
- **DOCX/PDF-Export** existiert noch nicht. S5 liefert den Branding-Layer (Konstanten + Kopf-/Fußzeile
|
||||
+ Print-CSS), an den das Export-Feature andockt.
|
||||
@@ -1,107 +0,0 @@
|
||||
# Umsetzungspaket — Vollständige Branding-Umstellung auf **Certvia**
|
||||
|
||||
> Claude-Code-Prompt für **einen** Entwickler. Basis-Branch **`dev`**, Feature-Branch **`dev/branding-certvia`** (PR-Ziel `dev`).
|
||||
> Quelle der Wahrheit: **Certvia Brand-Board** (`Certvia-Brand-Board-final.html`) + Logo-SVGs (`certvia-mark-positiv/negativ/grau/anthrazit.svg`, `certvia-favicon.svg`, `certvia-lockup-positiv.svg`) aus `Certvia-Design-Uebergabe.zip`.
|
||||
|
||||
## 0. Ziel & Leitplanken
|
||||
Die App vollständig auf den **Certvia-Styleguide** umstellen — Logo, Wortmarke, App-Name, Favicon/Icons, Typografie, Marken-/UI-Farben, Dokument-/Export-Design und alle Texte.
|
||||
**Wichtige Leitplanken:**
|
||||
- **GEFIM bleibt Dachmarke.** „**Ein Produkt von GEFIM**" (inkl. GEFIM-Logo) bleibt im Footer/Impressum/Export-Fußzeile erhalten. Nur die **Produktmarke** wird Certvia.
|
||||
- **UI-Farben bleiben wie initial festgelegt** (Dark-Theme-Primär `#7d6fd6` etc.) — sie **sind** die Certvia-UI-Palette. Nicht „korrigieren". Marken-Violett `#5d52a3` gilt für Logo/Print/Verläufe, UI-Interaktiv bleibt `#7d6fd6`.
|
||||
- **Keine Funktionsänderung** — reines Branding/Design. Kein Umbau von Logik/Datenmodell.
|
||||
|
||||
---
|
||||
|
||||
## 1. Design-Tokens (verbindliche Referenz)
|
||||
|
||||
**Markenfarben (Logo, Print, Verläufe, Akzent):**
|
||||
| Rolle | Hex |
|
||||
|---|---|
|
||||
| Violett (Marke) | `#5d52a3` |
|
||||
| Magenta (Akzent: „via", Haken, Highlights) | `#812d80` |
|
||||
| Hellblau | `#8dc4e0` |
|
||||
| Anthrazit (Text/Headlines) | `#3b3b3a` |
|
||||
|
||||
**UI Dark-Theme (unverändert, = Certvia-Produktpalette):**
|
||||
`--violet:#7d6fd6` · `--violet-deep:#5d52a3` · `--blue:#8dc4e0` · `--magenta:#b45bb0` · `--bg0:#0e1220` · `--bg1:#141a2e` · `--panel:rgba(30,38,64,.72)` · `--panel-b:rgba(120,135,180,.18)` · `--elev:#1a2138` · `--txt:#e8ecf7` · `--muted:#8b93ad` · `--ok:#39c07f` · `--warn:#f0ad4e` · `--risk:#ff6b6b` · Primär-Verlauf `linear-gradient(135deg,#5d52a3,#7d6fd6)` · Fokus-Ring `rgba(125,111,214,.35)`.
|
||||
|
||||
**Typografie:** Headlines/Wortmarke **Poppins**, Fließtext **Open Sans** (bereits im Einsatz — bestätigen, **selbst hosten**, kein ungefragtes Google-Fonts-CDN).
|
||||
|
||||
**Logo/Marke:** C-Monogramm (offenes „C" Violett `#5d52a3` + Haken Magenta `#812d80`, Haken schließt bündig an die C-Öffnung). Wortmarke „Cert" (Poppins Light, Anthrazit) + „**via**" (Poppins Bold, Magenta). Auf dunklem Grund: C `#7d6fd6`, Haken `#d17bcf`, Text weiß.
|
||||
|
||||
---
|
||||
|
||||
## 2. Story B0 — Bestandsaufnahme / Branding-Inventar (zuerst!) (S)
|
||||
**Als** Entwickler **möchte ich** alle Branding-Berührungspunkte finden, **damit** nichts übersehen wird.
|
||||
- Repo-weit suchen und als kurze Inventarliste (Datei → Fundstelle → Maßnahme) dokumentieren:
|
||||
```bash
|
||||
rg -i "gefim" -l # Produktname vs. Dachmarke unterscheiden
|
||||
rg -i "shield|logo|brand|favicon|wordmark|app[_-]?name|siteName|title" src public
|
||||
rg -i "#5d52a3|#7d6fd6|#812d80|#8dc4e0|#b45bb0|#0e1220" src # hartkodierte Farben außerhalb der Tokens
|
||||
rg -i "poppins|open sans|fonts.googleapis" src public
|
||||
```
|
||||
- **AK:** Inventarliste liegt vor; jede Fundstelle ist einer der Stories S1–S9 zugeordnet; klar getrennt „Produktmarke → Certvia" vs. „Dachmarke → GEFIM bleibt".
|
||||
|
||||
---
|
||||
|
||||
## 3. Stories
|
||||
|
||||
### S1 — Design-Tokens zentralisieren & Certvia-Palette verankern (M)
|
||||
- Eine **zentrale Token-Quelle** (CSS-Variablen/`theme`/Tailwind-Config) als Single Source of Truth; hartkodierte Farben aus S0 durch Tokens ersetzen.
|
||||
- Marken- vs. UI-Tokens klar benennen (`--brand-violet` `#5d52a3` vs. `--ui-primary` `#7d6fd6`), damit Logo/Print und UI nicht vermischt werden.
|
||||
- **AK:** keine hartkodierten Markenfarben mehr in Komponenten; Umschalten zentral möglich; UI optisch unverändert (nur konsolidiert).
|
||||
|
||||
### S2 — Logo, Wortmarke & Icons (M)
|
||||
- **App-Header/Sidebar**, **Login** (`/login`) und **Plattform-Login** (`/platform/login`): GEFIM-Schild → **Certvia-Logo** (Lockup C-Monogramm + „Certvia"). Dark-Variante nutzen.
|
||||
- **Favicon** + **PWA/Manifest-Icons** (`public/`, `manifest.webmanifest`, `apple-touch-icon`) auf `certvia-favicon.svg` (C auf Violett-Tile) und generierte PNGs (32/180/192/512).
|
||||
- `meta-theme-color` = `#5d52a3` (schon so auf der Website).
|
||||
- SVG-Assets aus dem Design-Paket in `public/assets/logo/` bzw. `src/components/brand/` einbinden; **Logo als React-Komponente** `<CertviaLogo variant="lockup|mark" theme="light|dark" />`.
|
||||
- **AK:** in allen App-Bereichen erscheint das Certvia-Logo; Favicon/Tab-Icon = Certvia; keine GEFIM-Schild-Reste in Produkt-UI.
|
||||
|
||||
### S3 — App-Name, Titel, Meta & i18n-Texte (S–M)
|
||||
- App-Name/`<title>`/OG-/Twitter-Meta, PWA-Name, Sidebar-Kopf, „Über"/Version-Info → **Certvia**.
|
||||
- i18n (`de`/`en`): alle Produktname-Strings auf „Certvia"; Tagline „Informationssicherheit. Endlich einfach." wo passend.
|
||||
- **AK:** Browser-Tab, Meta, Manifest und sichtbare Produktnamen zeigen „Certvia"; „ein Produkt von GEFIM" bleibt erhalten.
|
||||
|
||||
### S4 — Typografie bestätigen & selbst hosten (S)
|
||||
- Poppins (300/400/500/600/700) + Open Sans (400/600/700) **self-hosted** (woff2) statt CDN; Fallback-Stack; `font-display: swap`.
|
||||
- **AK:** keine externen Font-Requests; Wortmarke „Cert**via**" korrekt (Light + Bold), Headlines Poppins, Fließtext Open Sans.
|
||||
|
||||
### S5 — Dokument-/Export-Corporate-Design (M–L)
|
||||
- **DOCX/PDF/Print-Export** (Richtlinien, VDA-ISA-Katalog, Reports) auf **Certvia-Corporate-Design**: Deckblatt/Kopf mit Certvia-Logo + Farben, Fußzeile „Certvia — ein Produkt von GEFIM" + GEFIM-Logo, Poppins/Open Sans.
|
||||
- Betrifft den (offenen) DOCX/PDF-Export — Branding-Layer so bauen, dass er beim Export-Feature andockt.
|
||||
- **AK:** exportierte Dokumente tragen Certvia-Branding; GEFIM als Dachmarke in der Fußzeile.
|
||||
|
||||
### S6 — E-Mail-/Benachrichtigungs-Templates (S–M, falls vorhanden)
|
||||
- Sobald SMTP/E-Mail (Paket 4) existiert bzw. für Einladungs-/Reset-Mails: Header/Footer/Farben/Logo auf Certvia; Absender-/Signatur-Text „Certvia — ein Produkt von GEFIM".
|
||||
- Falls E-Mail noch nicht aktiv: nur die **Template-Basis** brandfähig vorbereiten.
|
||||
- **AK:** vorhandene Mail-Templates gebranded oder brandfähige Basis vorbereitet.
|
||||
|
||||
### S7 — Auth-, Fehler- & Systemseiten (S)
|
||||
- Login, Change-Password, deaktiviertes Konto, 404/500, Wartungs-/Status-Banner, Loading-/Empty-States: Certvia-Logo + Palette.
|
||||
- **AK:** keine ungebrandeten/gemischten Screens mehr.
|
||||
|
||||
### S8 — Mandanten-Branding-Default = Certvia (S–M)
|
||||
- Der Whitelabel-/Branding-Fallback je Mandant (Admin Phase 2 „Logo-Upload") ist **Certvia** als Default; Custom-Logo überschreibt nur, wenn gesetzt.
|
||||
- **AK:** ohne Custom-Logo zeigt jeder Mandant Certvia; „ein Produkt von GEFIM" bleibt unabhängig davon.
|
||||
|
||||
### S9 — Restliche GEFIM-Referenzen bereinigen (S)
|
||||
- Alle in S0 gefundenen **Produkt**-Referenzen „GEFIM" → „Certvia" (Kommentare, Alt-Texte, aria-labels, Klassennamen unkritisch). **Dachmarken-Hinweise bewusst belassen.**
|
||||
- **AK:** `rg -i "gefim"` liefert nur noch Dachmarken-Kontext (Footer/Impressum/Export-Fußzeile/Assets `gefim/`).
|
||||
|
||||
---
|
||||
|
||||
## 4. QA / Definition of Done
|
||||
- **Visuelles Review** der Kernscreens (Dashboard, Richtlinien, Assets, Risiken, Lieferanten, Aufgaben, Admin, beide Logins, Export, Fehlerseiten) hell **und** dunkel — Screenshots im PR.
|
||||
- **Kontrast prüfen:** Magenta `#812d80` auf Weiß und `#d17bcf` auf Dunkel (WCAG AA für Text/aktive Elemente).
|
||||
- `rg -i "gefim"` = nur Dachmarken-Kontext; keine externen Font-/Logo-Requests; keine hartkodierten Markenfarben.
|
||||
- `npx tsc --noEmit` → `npm run lint` → `npm run build` grün; Demo-Umgebung lauffähig.
|
||||
- **Reines Branding-PR** — keine funktionalen Diffs.
|
||||
|
||||
## 5. Reihenfolge
|
||||
S0 (Inventar) → S1 (Tokens) → S2 (Logo/Icons) → S3 (Name/Meta/i18n) → S4 (Fonts) → S7 (Auth/Fehler) → S9 (Cleanup) → S5 (Export) → S8 (Mandanten-Default) → S6 (Mail, falls vorhanden).
|
||||
|
||||
## 6. Assets (mitliefern an den Entwickler)
|
||||
Aus `Certvia-Design-Uebergabe.zip`: `logo/certvia-mark-positiv.svg`, `-negativ.svg`, `-grau.svg`, `-anthrazit.svg`, `certvia-favicon.svg`, `certvia-lockup-positiv.svg`, `logo/README-Logo.md`, `Brand-Board.html` (Farb-/Typo-Referenz) sowie `gefim-dachmarke/` (GEFIM-Logo für den „ein Produkt von GEFIM"-Hinweis).
|
||||
|
||||
> Hinweis: Falls PNG-Rastergrößen (Favicon/Apple-Touch/PWA 32/180/192/512) benötigt werden, kann ich sie aus dem SVG erzeugen und beilegen — sag kurz Bescheid.
|
||||
@@ -1,29 +0,0 @@
|
||||
# Certvia — Logo-Dateien
|
||||
|
||||
Logo = **C-Monogramm + Haken** (Entwurf C) in GEFIM-Farben. Alle Marken (außer Lockup) sind quadratisch (viewBox 64×64), vektoriell und frei skalierbar.
|
||||
|
||||
## Dateien
|
||||
| Datei | Verwendung |
|
||||
|---|---|
|
||||
| `certvia-mark-positiv.svg` | Standard auf hellem Grund (C Violett, Haken Magenta) |
|
||||
| `certvia-mark-negativ.svg` | Auf farbigem/dunklem Grund (weiß) |
|
||||
| `certvia-mark-grau.svg` | Graustufen |
|
||||
| `certvia-mark-anthrazit.svg` | Einfarbig Anthrazit (Dokumente/Druck s/w) |
|
||||
| `certvia-favicon.svg` | App-Icon/Favicon (Monogramm auf violettem Tile) |
|
||||
| `certvia-lockup-positiv.svg` | Wortmarke horizontal (Zeichen + „Certvia") |
|
||||
|
||||
## Farben
|
||||
- **Violett (C):** `#5d52a3`
|
||||
- **Magenta (Haken & „via"):** `#812d80`
|
||||
- **Anthrazit (Wortmarke „Cert"):** `#3b3b3a`
|
||||
- Auf dunklem Grund/UI: C `#7d6fd6`, Haken `#d17bcf`.
|
||||
|
||||
## Konstruktion / Regeln
|
||||
- „C" ist **offen nach rechts**; der **Haken** liegt in der Öffnung („cert").
|
||||
- **Kein Verlauf** im Zeichen. „C" nicht schließen, nicht verzerren, Seitenverhältnis wahren.
|
||||
- **Schutzraum:** mind. Höhe des Haken-Elements rundum frei.
|
||||
- Wortmarke „Cert" (Poppins Light/300, Anthrazit) + „**via**" (Poppins Bold/700, Magenta).
|
||||
- Hinweis: SVG-Lockup nutzt Poppins per `font-family` — beim finalen Export ggf. **Text in Pfade wandeln**, damit die Schrift überall korrekt erscheint.
|
||||
|
||||
## Schrift
|
||||
- **Poppins** (Wortmarke/Headlines), **Open Sans** (Fließtext).
|
||||
@@ -0,0 +1,68 @@
|
||||
# Craftvia — Branding in der Anwendung
|
||||
|
||||
Maßgeblich ist das Brandbook: [BRANDBOOK.md](BRANDBOOK.md) (§11.4 Farben, §11.5 Typografie).
|
||||
Referenzbild: [assets/craftvia-brand-identity-v1.png](assets/craftvia-brand-identity-v1.png).
|
||||
Dieses Dokument beschreibt, **wo** die Marke im Code verankert ist.
|
||||
|
||||
## Quellen der Wahrheit
|
||||
|
||||
| Was | Datei |
|
||||
|---|---|
|
||||
| CSS-Tokens (Browser) | `src/app/globals.css` — `--brand-*` (Kernfarben), `--ui-*` (UI-Rollen), shadcn-Tokens abgeleitet |
|
||||
| JS-Konstanten (Metadaten, Mail, Dokumente) | `src/lib/brand.ts` — `BRAND`, `BRAND_COLORS`, `STATUS_COLORS`, `BRAND_FONTS` |
|
||||
| Logo (Inline-SVG) | `src/components/brand/craftvia-logo.tsx` |
|
||||
| Mandanten-Logo-Override | `src/components/brand/tenant-brand.tsx` + `resolveTenantBranding()` |
|
||||
| E-Mail-Layout | `src/lib/email-brand.ts` |
|
||||
| Dokument-/Druck-CD | `src/lib/document-brand.ts`, `@media print` in `globals.css` |
|
||||
| Favicon/PWA-Icons | `scripts/generate-brand-icons.ts` → `public/favicon/*`, `public/favicon.ico` |
|
||||
| Manifest | `public/site.webmanifest` (`theme_color` #082E5B) |
|
||||
|
||||
## Farben
|
||||
|
||||
| Rolle | Name | Hex | Token |
|
||||
|---|---|---|---|
|
||||
| Primär | Lotsenblau | `#082E5B` | `--brand-lotsenblau` → `--primary` |
|
||||
| Akzent/CTA | Signalorange | `#FF6A00` | `--brand-signalorange` → `--ui-accent` (`bg-cta`) |
|
||||
| Text | Graphit | `#34383D` | `--foreground` |
|
||||
| Fläche | Hafengrau | `#F3F5F7` | `--background` |
|
||||
| Sekundärtext | Stahlgrau | `#66727D` | `--muted-foreground` |
|
||||
| Linien | Zink | `#D9E0E5` | `--border`, `--input` |
|
||||
| Erfolg / Warnung / Fehler / Info | | `#23845D` / `#C87912` / `#C64242` / `#2F6FA3` | `--ok` / `--warn` / `--risk` / `--info` |
|
||||
|
||||
Regeln: Signalorange sparsam (eine Hauptaktion je Ansicht, aktive Elemente). Farbe nie
|
||||
als einziges Statussignal — immer mit Text oder Icon. Keine Verläufe, keine Schlagschatten
|
||||
(`--shadow-card` ist eine feine Kontur); die Utility-Namen `bg-grad*` zeigen Vollfarbe.
|
||||
|
||||
## Logo
|
||||
|
||||
`<CraftviaLogo />` — Props:
|
||||
|
||||
- `variant`: `"horizontal"` (Signet + Wortmarke, Default) | `"signet"`
|
||||
- `tone`: `"color"` (Default) | `"mono"` (einfarbig Lotsenblau) | `"reversed"` (weiß, für dunkle Flächen)
|
||||
- `tile` (nur Signet): App-Icon-Kachel in Lotsenblau mit weißem C und orangem Haken
|
||||
- `tagline`: „Handwerk. Digital auf Kurs." unter der Wortmarke
|
||||
- `height`: Renderhöhe in px
|
||||
|
||||
Konstruktion (viewBox 64×64, exportiert als `SIGNET`): kräftiges C (Kreisbogen r=19,
|
||||
Strichstärke 11) mit Öffnung rechts oben; oranger Haken startet links außerhalb, durchquert
|
||||
das C (dort per Maske freigestellt) und endet als Pfeil nach rechts oben. Wortmarke
|
||||
„Craft" Lotsenblau + „via" Signalorange, Gewicht 800.
|
||||
|
||||
Nach Änderungen an der Geometrie Icons neu erzeugen:
|
||||
|
||||
```bash
|
||||
npx tsx scripts/generate-brand-icons.ts
|
||||
```
|
||||
|
||||
## Typografie
|
||||
|
||||
Inter (Brandbook §11.5), selbst gehostet über `next/font/local`
|
||||
(`src/app/fonts/inter-variable.ttf`, SIL Open Font License) — kein Laden aus dem Netz.
|
||||
TODO: auf woff2-Subsets umstellen (Dateigröße).
|
||||
|
||||
## Produktidentität
|
||||
|
||||
- Name: **Craftvia**, Tagline: **Handwerk. Digital auf Kurs.**
|
||||
- In-Product-Assistent: **Lotse** (eigene Figur, getrennt vom Logo; Modul `lotse`)
|
||||
- TOTP-Issuer: `Craftvia · Plattform` (`src/server/mfa.ts`), WebAuthn-RP-Name: `Craftvia`
|
||||
- Mail-Absender-Default: `MAIL_FROM_NAME` → `Craftvia`
|
||||
Reference in New Issue
Block a user