'', 'logo_url' => '', 'tenant_name' => '']; try { $user = saas_current_user($pdo); if ($user === null) { return $cached = $leer; } $tenantId = (int)$user['tenant_id']; if (!app_feature_enabled($pdo, $tenantId, 'branding')) { return $cached = $leer; } $settings = saas_fetch_tenant_settings($pdo, $tenantId); if ($settings === null) { return $cached = $leer; } $color = (string)($settings['brand_color'] ?? ''); // Zweite Pruefung neben der Formularvalidierung: was hier nicht wie // ein Hex-Wert aussieht, wird nie in ein Stylesheet geschrieben. if (!preg_match('/^#[0-9a-fA-F]{6}$/', $color)) { $color = ''; } return $cached = [ 'color' => strtolower($color), 'logo_url' => trim((string)($settings['brand_logo'] ?? '')) !== '' ? 'tenant-logo-anzeigen.php' : '', 'tenant_name' => (string)($settings['name'] ?? ''), ]; } catch (Throwable $e) { // Branding ist Beiwerk: faellt es aus (z. B. Migration noch nicht // eingespielt), laedt die Seite trotzdem im Standarddesign. return $cached = $leer; } } /** * Erzeugt die Farbueberschreibungen fuer das Template-Stylesheet. main.css * verwendet durchgaengig genau einen Akzentton (#38761d) - hier werden die * sichtbaren Stellen davon auf die Mandantenfarbe umgestellt. */ function app_branding_css(string $color): string { $c = preg_match('/^#[0-9a-f]{6}$/', strtolower($color)) ? strtolower($color) : '#38761d'; return << :last-child { border-bottom-color: var(--brand-color); } input[type="text"]:focus, input[type="password"]:focus, input[type="email"]:focus, input[type="tel"]:focus, input[type="search"]:focus, input[type="url"]:focus, input[type="number"]:focus, input[type="date"]:focus, input[type="datetime-local"]:focus, select:focus, textarea:focus, input[type="checkbox"]:focus + label:before, input[type="radio"]:focus + label:before { border-color: var(--brand-color); box-shadow: 0 0 0 1px var(--brand-color); } input[type="checkbox"]:checked + label:before, input[type="radio"]:checked + label:before { background: var(--brand-color); border-color: var(--brand-color); } input[type="submit"], input[type="reset"], input[type="button"], button, .button { box-shadow: inset 0 0 0 2px var(--brand-color); color: var(--brand-color) !important; } input[type="submit"].primary, input[type="reset"].primary, input[type="button"].primary, button.primary, .button.primary { background-color: var(--brand-color); box-shadow: none; color: #ffffff !important; } #header { border-bottom-color: var(--brand-color); } #menu ul a:hover, #menu ul span:hover { color: var(--brand-color); } .tenant-brand-line { border-bottom: solid 1px rgba(0, 0, 0, 0.08); } CSS; }