fix: update styles in various components to use dynamic theming and improve layout consistency

This commit is contained in:
Juergen Kunz
2025-06-19 12:14:52 +00:00
parent 2ab2e30336
commit 3ba47f9a71
9 changed files with 333 additions and 239 deletions

View File

@ -10,6 +10,7 @@ import {
css,
cssManager,
} from '@design.estate/dees-element';
import { type IStatsTile } from '@design.estate/dees-catalog';
@customElement('ops-view-security')
export class OpsViewSecurity extends DeesElement {
@ -45,7 +46,7 @@ export class OpsViewSecurity extends DeesElement {
display: flex;
gap: 8px;
margin-bottom: 24px;
border-bottom: 2px solid #e9ecef;
border-bottom: 2px solid ${cssManager.bdTheme('#e9ecef', '#333')};
}
.tab {
@ -55,29 +56,33 @@ export class OpsViewSecurity extends DeesElement {
border-bottom: 2px solid transparent;
cursor: pointer;
font-size: 16px;
color: #666;
color: ${cssManager.bdTheme('#666', '#999')};
transition: all 0.2s ease;
}
.tab:hover {
color: #333;
color: ${cssManager.bdTheme('#333', '#ccc')};
}
.tab.active {
color: #2196F3;
border-bottom-color: #2196F3;
color: ${cssManager.bdTheme('#2196F3', '#4a90e2')};
border-bottom-color: ${cssManager.bdTheme('#2196F3', '#4a90e2')};
}
.securityGrid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
gap: 16px;
h2 {
margin: 32px 0 16px 0;
font-size: 24px;
font-weight: 600;
color: ${cssManager.bdTheme('#333', '#ccc')};
}
dees-statsgrid {
margin-bottom: 32px;
}
.securityCard {
background: white;
border: 1px solid #e9ecef;
background: ${cssManager.bdTheme('#fff', '#222')};
border: 1px solid ${cssManager.bdTheme('#e9ecef', '#333')};
border-radius: 8px;
padding: 24px;
position: relative;
@ -85,18 +90,18 @@ export class OpsViewSecurity extends DeesElement {
}
.securityCard.alert {
border-color: #f44336;
background: #ffebee;
border-color: ${cssManager.bdTheme('#f44336', '#ff6666')};
background: ${cssManager.bdTheme('#ffebee', '#4a1f1f')};
}
.securityCard.warning {
border-color: #ff9800;
background: #fff3e0;
border-color: ${cssManager.bdTheme('#ff9800', '#ffaa33')};
background: ${cssManager.bdTheme('#fff3e0', '#4a3a1f')};
}
.securityCard.success {
border-color: #4caf50;
background: #e8f5e9;
border-color: ${cssManager.bdTheme('#4caf50', '#66cc66')};
background: ${cssManager.bdTheme('#e8f5e9', '#1f3f1f')};
}
.cardHeader {
@ -109,7 +114,7 @@ export class OpsViewSecurity extends DeesElement {
.cardTitle {
font-size: 18px;
font-weight: 600;
color: #333;
color: ${cssManager.bdTheme('#333', '#ccc')};
}
.cardStatus {
@ -120,18 +125,18 @@ export class OpsViewSecurity extends DeesElement {
}
.status-critical {
background: #f44336;
color: white;
background: ${cssManager.bdTheme('#f44336', '#ff6666')};
color: ${cssManager.bdTheme('#fff', '#fff')};
}
.status-warning {
background: #ff9800;
color: white;
background: ${cssManager.bdTheme('#ff9800', '#ffaa33')};
color: ${cssManager.bdTheme('#fff', '#fff')};
}
.status-good {
background: #4caf50;
color: white;
background: ${cssManager.bdTheme('#4caf50', '#66cc66')};
color: ${cssManager.bdTheme('#fff', '#fff')};
}
.metricValue {
@ -142,7 +147,7 @@ export class OpsViewSecurity extends DeesElement {
.metricLabel {
font-size: 14px;
color: #666;
color: ${cssManager.bdTheme('#666', '#999')};
}
.actionButton {
@ -159,7 +164,7 @@ export class OpsViewSecurity extends DeesElement {
justify-content: space-between;
align-items: center;
padding: 12px;
border-bottom: 1px solid #e9ecef;
border-bottom: 1px solid ${cssManager.bdTheme('#e9ecef', '#333')};
}
.blockedIpItem:last-child {
@ -173,12 +178,12 @@ export class OpsViewSecurity extends DeesElement {
.blockReason {
font-size: 14px;
color: #666;
color: ${cssManager.bdTheme('#666', '#999')};
}
.blockTime {
font-size: 12px;
color: #999;
color: ${cssManager.bdTheme('#999', '#666')};
}
`,
];
@ -243,36 +248,60 @@ export class OpsViewSecurity extends DeesElement {
private renderOverview(metrics: any) {
const threatLevel = this.calculateThreatLevel(metrics);
const threatScore = this.getThreatScore(metrics);
const tiles: IStatsTile[] = [
{
id: 'threatLevel',
title: 'Threat Level',
value: threatScore,
type: 'gauge',
icon: 'shield',
gaugeOptions: {
min: 0,
max: 100,
thresholds: [
{ value: 0, color: '#ef4444' },
{ value: 30, color: '#f59e0b' },
{ value: 70, color: '#22c55e' },
],
},
description: `Status: ${threatLevel.toUpperCase()}`,
},
{
id: 'blockedThreats',
title: 'Blocked Threats',
value: metrics.blockedIPs.length + metrics.spamDetected,
type: 'number',
icon: 'userShield',
color: '#ef4444',
description: 'Total threats blocked today',
},
{
id: 'activeSessions',
title: 'Active Sessions',
value: 0,
type: 'number',
icon: 'users',
color: '#22c55e',
description: 'Current authenticated sessions',
},
{
id: 'authFailures',
title: 'Auth Failures',
value: metrics.authenticationFailures,
type: 'number',
icon: 'lockOpen',
color: metrics.authenticationFailures > 10 ? '#ef4444' : '#f59e0b',
description: 'Failed login attempts today',
},
];
return html`
<div class="securityGrid">
<div class="securityCard ${threatLevel}">
<div class="cardHeader">
<h3 class="cardTitle">Threat Level</h3>
<span class="cardStatus status-${threatLevel === 'alert' ? 'critical' : threatLevel === 'warning' ? 'warning' : 'good'}">
${threatLevel.toUpperCase()}
</span>
</div>
<div class="metricValue">${this.getThreatScore(metrics)}/100</div>
<div class="metricLabel">Overall security score</div>
</div>
<div class="securityCard">
<div class="cardHeader">
<h3 class="cardTitle">Blocked Threats</h3>
</div>
<div class="metricValue">${metrics.blockedIPs.length + metrics.spamDetected}</div>
<div class="metricLabel">Total threats blocked today</div>
</div>
<div class="securityCard">
<div class="cardHeader">
<h3 class="cardTitle">Active Sessions</h3>
</div>
<div class="metricValue">${0}</div>
<div class="metricLabel">Current authenticated sessions</div>
</div>
</div>
<dees-statsgrid
.tiles=${tiles}
.minTileWidth=${200}
></dees-statsgrid>
<h2>Recent Security Events</h2>
<dees-table
@ -320,20 +349,32 @@ export class OpsViewSecurity extends DeesElement {
}
private renderAuthentication(metrics: any) {
return html`
<div class="securityGrid">
<div class="securityCard">
<h3 class="cardTitle">Authentication Statistics</h3>
<div class="metricValue">${metrics.authenticationFailures}</div>
<div class="metricLabel">Failed authentication attempts today</div>
</div>
const tiles: IStatsTile[] = [
{
id: 'authFailures',
title: 'Authentication Failures',
value: metrics.authenticationFailures,
type: 'number',
icon: 'lockOpen',
color: metrics.authenticationFailures > 10 ? '#ef4444' : '#f59e0b',
description: 'Failed authentication attempts today',
},
{
id: 'successfulLogins',
title: 'Successful Logins',
value: 0,
type: 'number',
icon: 'lock',
color: '#22c55e',
description: 'Successful logins today',
},
];
<div class="securityCard">
<h3 class="cardTitle">Successful Logins</h3>
<div class="metricValue">${0}</div>
<div class="metricLabel">Successful logins today</div>
</div>
</div>
return html`
<dees-statsgrid
.tiles=${tiles}
.minTileWidth=${200}
></dees-statsgrid>
<h2>Recent Login Attempts</h2>
<dees-table
@ -352,32 +393,50 @@ export class OpsViewSecurity extends DeesElement {
}
private renderEmailSecurity(metrics: any) {
const tiles: IStatsTile[] = [
{
id: 'malware',
title: 'Malware Detection',
value: metrics.malwareDetected,
type: 'number',
icon: 'virusSlash',
color: metrics.malwareDetected > 0 ? '#ef4444' : '#22c55e',
description: 'Malware detected',
},
{
id: 'phishing',
title: 'Phishing Detection',
value: metrics.phishingDetected,
type: 'number',
icon: 'fishFins',
color: metrics.phishingDetected > 0 ? '#ef4444' : '#22c55e',
description: 'Phishing attempts detected',
},
{
id: 'suspicious',
title: 'Suspicious Activities',
value: metrics.suspiciousActivities,
type: 'number',
icon: 'triangleExclamation',
color: metrics.suspiciousActivities > 5 ? '#ef4444' : '#f59e0b',
description: 'Suspicious activities detected',
},
{
id: 'spam',
title: 'Spam Detection',
value: metrics.spamDetected,
type: 'number',
icon: 'ban',
color: '#f59e0b',
description: 'Spam emails blocked',
},
];
return html`
<div class="securityGrid">
<div class="securityCard">
<h3 class="cardTitle">Malware Detection</h3>
<div class="metricValue">${metrics.malwareDetected}</div>
<div class="metricLabel">Malware detected</div>
</div>
<div class="securityCard">
<h3 class="cardTitle">Phishing Detection</h3>
<div class="metricValue">${metrics.phishingDetected}</div>
<div class="metricLabel">Phishing attempts detected</div>
</div>
<div class="securityCard">
<h3 class="cardTitle">Suspicious Activities</h3>
<div class="metricValue">${metrics.suspiciousActivities}</div>
<div class="metricLabel">Suspicious activities detected</div>
</div>
<div class="securityCard">
<h3 class="cardTitle">Spam Detection</h3>
<div class="metricValue">${metrics.spamDetected}</div>
<div class="metricLabel">Spam emails blocked</div>
</div>
</div>
<dees-statsgrid
.tiles=${tiles}
.minTileWidth=${200}
></dees-statsgrid>
<h2>Email Security Configuration</h2>
<div class="securityCard">