cms.c2sgmbh/src/components/admin/EmailDeliverabilityInfo.scss
Martin Porwoll 53f26e7349 feat: admin UX improvements with tenant switcher and email config
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>
2025-12-08 16:33:39 +00:00

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);
}
}