mirror of
https://github.com/complexcaresolutions/cms.c2sgmbh.git
synced 2026-03-18 03:54:12 +00:00
Tenant-Wechsel UI: - Add TenantBreadcrumb component showing active tenant in admin header - Add German translations for multi-tenant plugin selector - Integrate with existing plugin TenantSelector dropdown Email-Konfiguration UX: - Add SMTP field validation (host format, port range, required fields) - Add EmailDeliverabilityInfo component with SPF/DKIM/DMARC guidance - Add TestEmailButton component for SMTP configuration testing - Create /api/test-email endpoint with full security: - CSRF protection (double-submit cookie) - IP allowlist (same rules as /api/send-email) - Rate limiting (10/min per user) - Tenant access control with proper object normalization Security: - Add comprehensive integration tests for /api/test-email - Tests cover CSRF, IP blocking, auth, tenant access, input validation 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
140 lines
2.7 KiB
SCSS
140 lines
2.7 KiB
SCSS
.email-deliverability-info {
|
|
margin: 1rem 0;
|
|
border: 1px solid var(--theme-elevation-150);
|
|
border-radius: var(--style-radius-s, 4px);
|
|
background-color: var(--theme-elevation-50);
|
|
|
|
&__toggle {
|
|
display: flex;
|
|
align-items: center;
|
|
gap: 0.5rem;
|
|
width: 100%;
|
|
padding: 0.75rem 1rem;
|
|
border: none;
|
|
background: none;
|
|
cursor: pointer;
|
|
text-align: left;
|
|
font-size: 0.875rem;
|
|
color: var(--theme-elevation-800);
|
|
transition: background-color 0.15s ease;
|
|
|
|
&:hover {
|
|
background-color: var(--theme-elevation-100);
|
|
}
|
|
}
|
|
|
|
&__icon {
|
|
flex-shrink: 0;
|
|
transition: transform 0.2s ease;
|
|
color: var(--theme-elevation-500);
|
|
|
|
&--expanded {
|
|
transform: rotate(90deg);
|
|
}
|
|
}
|
|
|
|
&__title {
|
|
font-weight: 500;
|
|
}
|
|
|
|
&__content {
|
|
padding: 0 1rem 1rem 1rem;
|
|
border-top: 1px solid var(--theme-elevation-150);
|
|
}
|
|
|
|
&__section {
|
|
margin-top: 1rem;
|
|
|
|
h4 {
|
|
margin: 0 0 0.5rem 0;
|
|
font-size: 0.8125rem;
|
|
font-weight: 600;
|
|
color: var(--theme-elevation-800);
|
|
}
|
|
|
|
p {
|
|
margin: 0 0 0.5rem 0;
|
|
font-size: 0.8125rem;
|
|
line-height: 1.5;
|
|
color: var(--theme-elevation-600);
|
|
}
|
|
}
|
|
|
|
&__code {
|
|
display: block;
|
|
padding: 0.5rem 0.75rem;
|
|
margin: 0.5rem 0;
|
|
font-family: var(--font-mono);
|
|
font-size: 0.75rem;
|
|
background-color: var(--theme-elevation-100);
|
|
border-radius: var(--style-radius-s, 4px);
|
|
overflow-x: auto;
|
|
white-space: nowrap;
|
|
color: var(--theme-elevation-800);
|
|
}
|
|
|
|
&__hint {
|
|
font-size: 0.75rem !important;
|
|
font-style: italic;
|
|
color: var(--theme-elevation-500) !important;
|
|
|
|
em {
|
|
font-style: normal;
|
|
background-color: var(--theme-elevation-100);
|
|
padding: 0.125rem 0.25rem;
|
|
border-radius: 2px;
|
|
}
|
|
}
|
|
|
|
&__tips {
|
|
margin-top: 1.25rem;
|
|
padding-top: 1rem;
|
|
border-top: 1px dashed var(--theme-elevation-200);
|
|
|
|
h4 {
|
|
margin: 0 0 0.5rem 0;
|
|
font-size: 0.8125rem;
|
|
font-weight: 600;
|
|
color: var(--theme-elevation-800);
|
|
}
|
|
|
|
ul {
|
|
margin: 0;
|
|
padding-left: 1.25rem;
|
|
font-size: 0.8125rem;
|
|
line-height: 1.6;
|
|
color: var(--theme-elevation-600);
|
|
}
|
|
|
|
li {
|
|
margin-bottom: 0.25rem;
|
|
}
|
|
|
|
a {
|
|
color: var(--theme-success-500);
|
|
text-decoration: none;
|
|
|
|
&:hover {
|
|
text-decoration: underline;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// Dark mode support
|
|
:global(.dark) .email-deliverability-info {
|
|
background-color: var(--theme-elevation-100);
|
|
border-color: var(--theme-elevation-200);
|
|
|
|
&__content {
|
|
border-top-color: var(--theme-elevation-200);
|
|
}
|
|
|
|
&__code {
|
|
background-color: var(--theme-elevation-150);
|
|
}
|
|
|
|
&__tips {
|
|
border-top-color: var(--theme-elevation-250);
|
|
}
|
|
}
|