MorphGuard / static /css /theme.css
juanquy's picture
Initial clean commit of modular MorphGuard
2978bba
Raw
History Blame Contribute Delete
10.3 kB
/**
* MorphGuard Theme System
* Base theme styling using CSS variables
*/
:root {
/* Default theme variables (light theme) */
--bg-primary: #ffffff;
--bg-secondary: #f3f4f6;
--bg-tertiary: #e5e7eb;
--text-primary: #111827;
--text-secondary: #4b5563;
--text-tertiary: #9ca3af;
--accent-primary: #4f46e5;
--accent-secondary: #818cf8;
--accent-tertiary: #c7d2fe;
--success: #10b981;
--warning: #f59e0b;
--error: #ef4444;
--info: #3b82f6;
--border-color: #e5e7eb;
--shadow-color: rgba(0, 0, 0, 0.1);
--shadow-intensity: 0.1;
--card-bg: #ffffff;
--nav-bg: #ffffff;
--header-bg: #ffffff;
--footer-bg: #f9fafb;
--detection-safe: #d1fae5;
--detection-morph: #fee2e2;
--chart-color-1: #4f46e5;
--chart-color-2: #10b981;
--chart-color-3: #f59e0b;
--chart-color-4: #ef4444;
--chart-color-5: #3b82f6;
--chart-grid: #e5e7eb;
/* Derived variables - these are calculated based on the base theme variables */
--shadow-sm: 0 1px 2px var(--shadow-color);
--shadow-md: 0 4px 6px var(--shadow-color);
--shadow-lg: 0 10px 15px var(--shadow-color);
--shadow-xl: 0 20px 25px var(--shadow-color);
/* Animation durations */
--transition-fast: 0.15s;
--transition-normal: 0.3s;
--transition-slow: 0.5s;
/* Spacing and sizing variables */
--spacing-xs: 0.25rem;
--spacing-sm: 0.5rem;
--spacing-md: 1rem;
--spacing-lg: 1.5rem;
--spacing-xl: 2rem;
--spacing-2xl: 3rem;
/* Border radius */
--radius-sm: 0.125rem;
--radius-md: 0.375rem;
--radius-lg: 0.5rem;
--radius-xl: 0.75rem;
--radius-full: 9999px;
/* Font weights */
--font-weight-light: 300;
--font-weight-normal: 400;
--font-weight-medium: 500;
--font-weight-semibold: 600;
--font-weight-bold: 700;
/* Font sizes */
--font-size-xs: 0.75rem;
--font-size-sm: 0.875rem;
--font-size-md: 1rem;
--font-size-lg: 1.125rem;
--font-size-xl: 1.25rem;
--font-size-2xl: 1.5rem;
--font-size-3xl: 1.875rem;
--font-size-4xl: 2.25rem;
}
/* Base styling for the theme system */
body {
background-color: var(--bg-primary);
color: var(--text-primary);
transition: background-color var(--transition-normal), color var(--transition-normal);
margin: 0;
padding: 0;
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
line-height: 1.5;
}
/* Apply theme to common elements */
/* Headers */
h1, h2, h3, h4, h5, h6 {
color: var(--text-primary);
margin-top: var(--spacing-lg);
margin-bottom: var(--spacing-md);
}
/* Links */
a {
color: var(--accent-primary);
text-decoration: none;
transition: color var(--transition-fast);
}
a:hover {
color: var(--accent-secondary);
}
/* Buttons */
button,
.btn {
background-color: var(--accent-primary);
color: white;
border: none;
border-radius: var(--radius-md);
padding: var(--spacing-sm) var(--spacing-md);
font-size: var(--font-size-md);
font-weight: var(--font-weight-medium);
cursor: pointer;
transition: background-color var(--transition-fast), transform var(--transition-fast);
}
button:hover,
.btn:hover {
background-color: var(--accent-secondary);
transform: translateY(-1px);
}
button:focus,
.btn:focus {
outline: 2px solid var(--accent-tertiary);
outline-offset: 2px;
}
button:active,
.btn:active {
transform: translateY(1px);
}
/* Secondary button */
button.btn-secondary,
.btn-secondary {
background-color: var(--bg-tertiary);
color: var(--text-primary);
}
button.btn-secondary:hover,
.btn-secondary:hover {
background-color: var(--bg-secondary);
}
/* Inputs */
input,
select,
textarea {
background-color: var(--bg-secondary);
color: var(--text-primary);
border: 1px solid var(--border-color);
border-radius: var(--radius-md);
padding: var(--spacing-sm) var(--spacing-md);
font-size: var(--font-size-md);
transition: border-color var(--transition-fast), box-shadow var(--transition-fast);
}
input:focus,
select:focus,
textarea:focus {
border-color: var(--accent-primary);
box-shadow: 0 0 0 2px var(--accent-tertiary);
outline: none;
}
/* Cards */
.card {
background-color: var(--card-bg);
border-radius: var(--radius-lg);
box-shadow: var(--shadow-md);
padding: var(--spacing-lg);
margin-bottom: var(--spacing-lg);
transition: transform var(--transition-normal), box-shadow var(--transition-normal);
}
.card:hover {
transform: translateY(-2px);
box-shadow: var(--shadow-lg);
}
/* Navigation */
nav,
.nav {
background-color: var(--nav-bg);
padding: var(--spacing-md);
box-shadow: var(--shadow-md);
}
nav a,
.nav a {
color: var(--text-primary);
margin-right: var(--spacing-md);
transition: color var(--transition-fast);
}
nav a:hover,
.nav a:hover {
color: var(--accent-primary);
}
nav a.active,
.nav a.active {
color: var(--accent-primary);
font-weight: var(--font-weight-medium);
}
/* Header */
header,
.header {
background-color: var(--header-bg);
padding: var(--spacing-lg);
box-shadow: var(--shadow-md);
}
/* Footer */
footer,
.footer {
background-color: var(--footer-bg);
padding: var(--spacing-lg);
color: var(--text-secondary);
}
/* Tables */
table {
width: 100%;
border-collapse: collapse;
margin: var(--spacing-md) 0;
}
th {
background-color: var(--bg-secondary);
color: var(--text-primary);
font-weight: var(--font-weight-semibold);
text-align: left;
padding: var(--spacing-sm) var(--spacing-md);
border-bottom: 2px solid var(--border-color);
}
td {
padding: var(--spacing-sm) var(--spacing-md);
border-bottom: 1px solid var(--border-color);
}
tr:hover {
background-color: var(--bg-secondary);
}
/* Status colors */
.success {
color: var(--success);
}
.warning {
color: var(--warning);
}
.error {
color: var(--error);
}
.info {
color: var(--info);
}
.success-bg {
background-color: var(--success);
color: white;
}
.warning-bg {
background-color: var(--warning);
color: white;
}
.error-bg {
background-color: var(--error);
color: white;
}
.info-bg {
background-color: var(--info);
color: white;
}
/* Detection results styling */
.detection-safe {
background-color: var(--detection-safe);
padding: var(--spacing-md);
border-radius: var(--radius-md);
border-left: 4px solid var(--success);
}
.detection-morph {
background-color: var(--detection-morph);
padding: var(--spacing-md);
border-radius: var(--radius-md);
border-left: 4px solid var(--error);
}
/* Charts and visualizations */
.chart-container {
background-color: var(--card-bg);
border-radius: var(--radius-lg);
padding: var(--spacing-lg);
box-shadow: var(--shadow-md);
}
/* Theme toggle button */
.theme-toggle {
background: none;
border: none;
cursor: pointer;
padding: var(--spacing-sm);
border-radius: var(--radius-full);
display: inline-flex;
align-items: center;
justify-content: center;
transition: background-color var(--transition-fast);
}
.theme-toggle:hover {
background-color: var(--bg-tertiary);
}
.theme-toggle svg {
width: 1.5rem;
height: 1.5rem;
fill: var(--text-primary);
}
/* Theme selector dropdown */
.theme-selector {
background-color: var(--bg-secondary);
color: var(--text-primary);
border: 1px solid var(--border-color);
border-radius: var(--radius-md);
padding: var(--spacing-sm) var(--spacing-md);
font-size: var(--font-size-sm);
cursor: pointer;
transition: border-color var(--transition-fast);
}
.theme-selector:hover {
border-color: var(--accent-primary);
}
.theme-selector:focus {
border-color: var(--accent-primary);
outline: none;
box-shadow: 0 0 0 2px var(--accent-tertiary);
}
/* Context indicator */
.context-indicator {
display: inline-flex;
align-items: center;
font-size: var(--font-size-sm);
color: var(--text-tertiary);
margin-left: var(--spacing-md);
}
.context-indicator svg {
width: 1rem;
height: 1rem;
margin-right: var(--spacing-xs);
}
/* High contrast specific adjustments */
[data-theme="highContrast"] a {
text-decoration: underline;
}
[data-theme="highContrast"] button,
[data-theme="highContrast"] .btn {
border: 2px solid white;
}
[data-theme="highContrast"] input,
[data-theme="highContrast"] select,
[data-theme="highContrast"] textarea {
border: 2px solid var(--border-color);
}
/* Dark theme specific adjustments */
[data-theme="dark"] .card {
box-shadow: 0 4px 6px rgba(0, 0, 0, 0.3);
}
[data-theme="dark"] code {
background-color: rgba(0, 0, 0, 0.3);
padding: var(--spacing-xs) var(--spacing-sm);
border-radius: var(--radius-sm);
}
/* Theme transition helper */
.theme-transition {
transition: background-color var(--transition-normal),
color var(--transition-normal),
border-color var(--transition-normal),
box-shadow var(--transition-normal);
}
/* Utilities for theme demos */
.color-swatch {
display: inline-block;
width: 2rem;
height: 2rem;
border-radius: var(--radius-md);
margin-right: var(--spacing-sm);
border: 1px solid var(--border-color);
}
.theme-demo-section {
margin: var(--spacing-xl) 0;
padding: var(--spacing-lg);
border: 1px solid var(--border-color);
border-radius: var(--radius-lg);
}
/* Responsive adjustments */
@media (max-width: 768px) {
:root {
/* Adjust spacing for mobile */
--spacing-lg: 1rem;
--spacing-xl: 1.5rem;
--spacing-2xl: 2rem;
}
.card {
padding: var(--spacing-md);
}
header, .header,
footer, .footer {
padding: var(--spacing-md);
}
/* Stack navigation on mobile */
nav, .nav {
display: flex;
flex-direction: column;
}
nav a, .nav a {
margin-right: 0;
margin-bottom: var(--spacing-sm);
}
}
/* Print styles */
@media print {
body {
background-color: white !important;
color: black !important;
}
.card, .nav, header, footer {
box-shadow: none !important;
background-color: white !important;
}
button, .btn, .theme-toggle, .theme-selector {
display: none !important;
}
}
/* Reduced motion preference */
@media (prefers-reduced-motion: reduce) {
*, *::before, *::after {
animation-duration: 0.01ms !important;
animation-iteration-count: 1 !important;
transition-duration: 0.01ms !important;
scroll-behavior: auto !important;
}
.theme-transition {
transition: none !important;
}
}