From da4a036e8a7fba40e0d87b20fc968e7b8c92561f Mon Sep 17 00:00:00 2001 From: Thomas Reitz Date: Sat, 14 Mar 2026 14:29:00 +0100 Subject: [PATCH] =?UTF-8?q?fix:=20PDF-Gr=C3=BCnton=20dunkler=20+=20Buttons?= =?UTF-8?q?=20gleichbreit?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - darkenColor() Funktion: extrahierte Logo-Farbe um 30% abdunkeln (gilt für PDF und DOCX Export) → kräftigerer, druckfreundlicher Ton - ExpertProfileTab: min-width: 130px für btnPrimary und btnSecondary → alle Aktions-Buttons haben einheitliche Mindestbreite Co-Authored-By: Claude Sonnet 4.6 --- .../core/expert-profile/profile-export.service.ts | 15 ++++++++++++--- .../src/profile/ExpertProfileTab.module.css | 2 ++ 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/packages/core-service/src/core/expert-profile/profile-export.service.ts b/packages/core-service/src/core/expert-profile/profile-export.service.ts index 78a3552..fa832be 100644 --- a/packages/core-service/src/core/expert-profile/profile-export.service.ts +++ b/packages/core-service/src/core/expert-profile/profile-export.service.ts @@ -105,6 +105,14 @@ function lightenColor(hex: string, factor: number): string { return `#${lr.toString(16).padStart(2, '0')}${lg.toString(16).padStart(2, '0')}${lb.toString(16).padStart(2, '0')}`; } +function darkenColor(hex: string, factor: number): string { + const { r, g, b } = hexToRgb(hex); + const dr = Math.round(r * (1 - factor)); + const dg = Math.round(g * (1 - factor)); + const db = Math.round(b * (1 - factor)); + return `#${dr.toString(16).padStart(2, '0')}${dg.toString(16).padStart(2, '0')}${db.toString(16).padStart(2, '0')}`; +} + // ============================================================ // ProfileExportService // ============================================================ @@ -256,7 +264,8 @@ export class ProfileExportService { // Akzentfarbe dynamisch aus Logo extrahieren if (platformLogo) { const extracted = await this.extractDominantColor(platformLogo); - if (extracted) accentColor = extracted; + // Extrahierte Farbe um 30% abdunkeln damit sie im Druck kräftiger wirkt + if (extracted) accentColor = darkenColor(extracted, 0.30); } const fullName = `${data.firstName} ${data.lastName}`; @@ -664,10 +673,10 @@ export class ProfileExportService { } catch { /* ignore */ } } - // Dominante Farbe aus Logo extrahieren + // Dominante Farbe aus Logo extrahieren und abdunkeln if (platformLogo) { const extracted = await this.extractDominantColor(platformLogo); - if (extracted) accentColor = extracted; + if (extracted) accentColor = darkenColor(extracted, 0.30); } let companyFooterText: string | null = null; diff --git a/packages/frontend/src/profile/ExpertProfileTab.module.css b/packages/frontend/src/profile/ExpertProfileTab.module.css index 9093617..fbf9ff2 100644 --- a/packages/frontend/src/profile/ExpertProfileTab.module.css +++ b/packages/frontend/src/profile/ExpertProfileTab.module.css @@ -279,6 +279,7 @@ /* === Buttons === */ .btnPrimary { height: 32px; + min-width: 130px; padding: 0 1rem; background: var(--color-primary); color: white; @@ -303,6 +304,7 @@ .btnSecondary { height: 32px; + min-width: 130px; padding: 0 1rem; background: transparent; color: var(--color-text-secondary);