tractatus/public/css/tractatus-theme.css
TheFlow af3ef61a19 fix: Add missing Tailwind gradient utilities to theme CSS
All gradient backgrounds (bg-gradient-to-r/br, from-*, via-*, to-*)
were not rendering because the classes weren't in the compiled Tailwind
CSS. Added 60+ gradient utility classes to tractatus-theme.css so
gradients render correctly site-wide.

Fixes white-on-white text in Koha section (gradient background was
transparent, making white text invisible against page background).
Also fixes Production Evidence section and all other gradient sections.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-07 15:52:39 +13:00

1073 lines
29 KiB
CSS

/**
* Tractatus AI Safety Framework - Theme System
*
* Based on TRACTATUS_BRAND_SYSTEM.md
* Created: 2025-10-18
*
* This file defines the complete color, typography, and design token system
* for the Tractatus Framework. It implements the 6-node hexagonal orbital
* brand identity with service-specific colors.
*/
:root {
/* ========================================
* CORE IDENTITY - Cyan to Blue Gradient
* Shared with MySovereignty Passport
* ======================================== */
--tractatus-core-start: #64ffda; /* Cyan 300 - Clarity, transparency */
--tractatus-core-mid: #448aff; /* Blue 400 - Trust, logic */
--tractatus-core-end: #0891b2; /* Cyan 600 - Technical precision (WCAG AA: 4.57:1 on gray-50) */
/* ========================================
* SIX GOVERNANCE SERVICES
* Hexagonal node colors mapped to framework components
* ======================================== */
/* 1. BoundaryEnforcer - Emerald Green */
--service-boundary-light: #10b981; /* Emerald 500 */
--service-boundary-dark: #059669; /* Emerald 600 */
/* 2. InstructionPersistenceClassifier - Indigo */
--service-instruction-light: #6366f1; /* Indigo 500 */
--service-instruction-dark: #4f46e5; /* Indigo 600 */
/* 3. CrossReferenceValidator - Purple */
--service-validator-light: #8b5cf6; /* Purple 500 */
--service-validator-dark: #7c3aed; /* Purple 600 */
/* 4. ContextPressureMonitor - Amber */
--service-pressure-light: #f59e0b; /* Amber 500 */
--service-pressure-dark: #d97706; /* Amber 600 */
/* 5. MetacognitiveVerifier - Rose */
--service-metacognitive-light: #ec4899; /* Pink 500 */
--service-metacognitive-dark: #db2777; /* Pink 600 */
/* 6. PluralisticDeliberationOrchestrator - Teal */
--service-deliberation-light: #14b8a6; /* Teal 500 */
--service-deliberation-dark: #0f766e; /* Teal 700 */
/* ========================================
* UI NEUTRALS - Slate-based
* Technical, professional feel
* ======================================== */
/* Light mode backgrounds */
--bg-primary: #ffffff;
--bg-secondary: #f8fafc; /* Slate 50 */
--bg-tertiary: #f1f5f9; /* Slate 100 */
/* Text colors */
--text-primary: #0f172a; /* Slate 900 */
--text-secondary: #475569; /* Slate 600 */
--text-tertiary: #94a3b8; /* Slate 400 */
/* Borders */
--border-light: #e2e8f0; /* Slate 200 */
--border-medium: #cbd5e1; /* Slate 300 */
--border-dark: #94a3b8; /* Slate 400 */
/* Dark mode (future implementation) */
--bg-primary-dark: #0f172a; /* Slate 900 */
--bg-secondary-dark: #1e293b; /* Slate 800 */
--text-primary-dark: #f8fafc; /* Slate 50 */
/* ========================================
* SEMANTIC COLORS
* State and feedback colors
* ======================================== */
/* Success (safety achieved) */
--success: #10b981; /* Emerald 500 - matches BoundaryEnforcer */
--success-light: #d1fae5; /* Emerald 100 */
--success-dark: #065f46; /* Emerald 800 */
/* Warning (attention needed) */
--warning: #f59e0b; /* Amber 500 - matches PressureMonitor */
--warning-light: #fef3c7; /* Amber 100 */
--warning-dark: #92400e; /* Amber 800 */
/* Error (boundary violation) */
--error: #ef4444; /* Red 500 */
--error-light: #fee2e2; /* Red 100 */
--error-dark: #991b1b; /* Red 800 */
/* Info (neutral notification) */
--info: #0ea5e9; /* Cyan 500 - matches core */
--info-light: #e0f2fe; /* Cyan 100 */
--info-dark: #075985; /* Cyan 800 */
/* ========================================
* TYPOGRAPHY SYSTEM
* Font families and weights
* ======================================== */
/* Font stacks */
--font-display: 'Inter', -apple-system, BlinkMacSystemFont, sans-serif;
--font-body: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
--font-mono: 'SF Mono', Monaco, 'Cascadia Code', monospace;
/* Font weights */
--font-light: 300;
--font-normal: 400;
--font-medium: 500;
--font-semibold: 600;
--font-bold: 700;
--font-extrabold: 800;
/* ========================================
* GRADIENTS
* Pre-defined gradient combinations
* ======================================== */
/* Primary hero gradient */
--gradient-hero: linear-gradient(135deg, #64ffda 0%, #448aff 50%, #0ea5e9 100%);
/* Primary CTA button */
--gradient-primary-btn: linear-gradient(135deg, #0ea5e9 0%, #0284c7 100%);
/* Service-specific button gradients */
--gradient-btn-boundary: linear-gradient(135deg, #10b981 0%, #059669 100%);
--gradient-btn-instruction: linear-gradient(135deg, #6366f1 0%, #4f46e5 100%);
--gradient-btn-validator: linear-gradient(135deg, #8b5cf6 0%, #7c3aed 100%);
--gradient-btn-pressure: linear-gradient(135deg, #f59e0b 0%, #d97706 100%);
--gradient-btn-metacognitive: linear-gradient(135deg, #ec4899 0%, #db2777 100%);
--gradient-btn-deliberation: linear-gradient(135deg, #14b8a6 0%, #0d9488 100%);
/* Multi-service highlight gradient */
--gradient-all-services: linear-gradient(90deg,
#10b981 0%, /* BoundaryEnforcer */
#6366f1 20%, /* InstructionPersistence */
#8b5cf6 40%, /* Validator */
#f59e0b 60%, /* PressureMonitor */
#ec4899 80%, /* Metacognitive */
#14b8a6 100% /* Deliberation */
);
/* ========================================
* SPACING SCALE
* Consistent spacing throughout
* ======================================== */
--spacing-xs: 0.25rem; /* 4px */
--spacing-sm: 0.5rem; /* 8px */
--spacing-md: 1rem; /* 16px */
--spacing-lg: 1.5rem; /* 24px */
--spacing-xl: 2rem; /* 32px */
--spacing-2xl: 3rem; /* 48px */
--spacing-3xl: 4rem; /* 64px */
/* ========================================
* BORDER RADIUS
* Rounded corner styles
* ======================================== */
--radius-sm: 0.25rem; /* 4px */
--radius-md: 0.5rem; /* 8px */
--radius-lg: 0.75rem; /* 12px */
--radius-xl: 1rem; /* 16px */
--radius-2xl: 1.5rem; /* 24px */
--radius-full: 9999px; /* Fully rounded */
/* ========================================
* SHADOWS
* Elevation system
* ======================================== */
--shadow-sm: 0 1px 2px 0 rgba(0, 0, 0, 0.05);
--shadow-md: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);
--shadow-lg: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05);
--shadow-xl: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04);
--shadow-2xl: 0 25px 50px -12px rgba(0, 0, 0, 0.25);
/* ========================================
* TRANSITIONS
* Standard animation timing
* ======================================== */
--transition-fast: 150ms cubic-bezier(0.4, 0, 0.2, 1);
--transition-normal: 300ms cubic-bezier(0.4, 0, 0.2, 1);
--transition-slow: 500ms cubic-bezier(0.4, 0, 0.2, 1);
/* ========================================
* Z-INDEX SCALE
* Layer management
* ======================================== */
--z-base: 0;
--z-dropdown: 1000;
--z-sticky: 1020;
--z-fixed: 1030;
--z-modal-backdrop: 1040;
--z-modal: 1050;
--z-popover: 1060;
--z-tooltip: 1070;
}
/* ========================================
* UTILITY CLASSES
* Common reusable patterns
* ======================================== */
/* Service color accent classes */
.accent-boundary { border-left-color: var(--service-boundary-light); }
.accent-instruction { border-left-color: var(--service-instruction-light); }
.accent-validator { border-left-color: var(--service-validator-light); }
.accent-pressure { border-left-color: var(--service-pressure-light); }
.accent-metacognitive { border-left-color: var(--service-metacognitive-light); }
.accent-deliberation { border-left-color: var(--service-deliberation-light); }
/* Text color utilities */
.text-boundary { color: var(--service-boundary-light); }
.text-instruction { color: var(--service-instruction-light); }
.text-validator { color: var(--service-validator-light); }
.text-pressure { color: var(--service-pressure-light); }
.text-metacognitive { color: var(--service-metacognitive-light); }
.text-deliberation { color: var(--service-deliberation-light); }
/* Background utilities */
.bg-boundary { background-color: var(--service-boundary-light); }
.bg-instruction { background-color: var(--service-instruction-light); }
.bg-validator { background-color: var(--service-validator-light); }
.bg-pressure { background-color: var(--service-pressure-light); }
.bg-metacognitive { background-color: var(--service-metacognitive-light); }
.bg-deliberation { background-color: var(--service-deliberation-light); }
/* Gradient backgrounds */
.bg-gradient-hero { background: var(--gradient-hero); }
.bg-gradient-all-services { background: var(--gradient-all-services); }
/* ========================================
* COMPONENT BASE STYLES
* Foundational component patterns
* ======================================== */
/* Button base */
.btn-base {
font-weight: var(--font-semibold);
padding: 0.75rem 2rem;
border-radius: var(--radius-md);
transition: all var(--transition-normal);
box-shadow: var(--shadow-md);
}
.btn-base:hover {
box-shadow: var(--shadow-lg);
transform: translateY(-2px);
}
/* Primary button */
.btn-primary {
background: var(--gradient-primary-btn);
color: white;
}
/* Service-specific buttons */
.btn-boundary { background: var(--gradient-btn-boundary); color: white; }
.btn-instruction { background: var(--gradient-btn-instruction); color: white; }
.btn-validator { background: var(--gradient-btn-validator); color: white; }
.btn-pressure { background: var(--gradient-btn-pressure); color: white; }
.btn-metacognitive { background: var(--gradient-btn-metacognitive); color: white; }
.btn-deliberation { background: var(--gradient-btn-deliberation); color: white; }
/* Card base */
.card-base {
background: var(--bg-primary);
border-radius: var(--radius-xl);
box-shadow: var(--shadow-md);
padding: 2rem;
transition: all var(--transition-normal);
}
.card-interactive:hover {
box-shadow: var(--shadow-xl);
transform: translateY(-4px);
}
/* Service-specific cards (with left border accent) */
.card-service {
border-left: 4px solid transparent;
}
.card-service.boundary { border-left-color: var(--service-boundary-light); }
.card-service.instruction { border-left-color: var(--service-instruction-light); }
.card-service.validator { border-left-color: var(--service-validator-light); }
.card-service.pressure { border-left-color: var(--service-pressure-light); }
.card-service.metacognitive { border-left-color: var(--service-metacognitive-light); }
.card-service.deliberation { border-left-color: var(--service-deliberation-light); }
/* ========================================
* RESPONSIVE TYPOGRAPHY
* Fluid type scale
* ======================================== */
.text-display-sm { font-size: clamp(2.5rem, 5vw, 3.5rem); font-family: var(--font-display); }
.text-display-md { font-size: clamp(3rem, 6vw, 4.5rem); font-family: var(--font-display); }
.text-display-lg { font-size: clamp(3.5rem, 8vw, 6rem); font-family: var(--font-display); }
/* Apply Inter to headings */
h1, h2, h3, h4, h5, h6 {
font-family: var(--font-display);
font-weight: 700;
}
/* Fine-tune letter spacing for Inter */
h1 { letter-spacing: -0.025em; }
h2 { letter-spacing: -0.02em; }
h3 { letter-spacing: -0.015em; }
/* ========================================
* ANIMATIONS & MICRO-INTERACTIONS
* Scroll effects and hover states
* ======================================== */
/* Keyframes */
@keyframes fadeIn {
from {
opacity: 0;
transform: translateY(20px);
}
to {
opacity: 1;
transform: translateY(0);
}
}
@keyframes fadeInScale {
from {
opacity: 0;
transform: scale(0.95);
}
to {
opacity: 1;
transform: scale(1);
}
}
@keyframes slideInLeft {
from {
opacity: 0;
transform: translateX(-30px);
}
to {
opacity: 1;
transform: translateX(0);
}
}
@keyframes slideInRight {
from {
opacity: 0;
transform: translateX(30px);
}
to {
opacity: 1;
transform: translateX(0);
}
}
@keyframes pulse {
0%, 100% {
opacity: 1;
}
50% {
opacity: 0.7;
}
}
/* Animation utility classes */
.animate-fade-in {
animation: fadeIn 0.6s ease-out;
}
.animate-fade-in-scale {
animation: fadeInScale 0.5s ease-out;
}
.animate-slide-in-left {
animation: slideInLeft 0.6s ease-out;
}
.animate-slide-in-right {
animation: slideInRight 0.6s ease-out;
}
.animate-pulse {
animation: pulse 2s ease-in-out infinite;
}
/* Staggered animation delays */
.animate-delay-100 { animation-delay: 100ms; }
.animate-delay-200 { animation-delay: 200ms; }
.animate-delay-300 { animation-delay: 300ms; }
.animate-delay-400 { animation-delay: 400ms; }
.animate-delay-500 { animation-delay: 500ms; }
/* Hover effects */
.hover-lift {
transition: transform var(--transition-normal), box-shadow var(--transition-normal);
}
.hover-lift:hover {
transform: translateY(-4px);
}
.hover-scale {
transition: transform var(--transition-normal);
}
.hover-scale:hover {
transform: scale(1.05);
}
.hover-glow {
transition: box-shadow var(--transition-normal);
}
.hover-glow:hover {
box-shadow: 0 0 20px rgba(14, 165, 233, 0.3);
}
/* ========================================
* ACCESSIBILITY
* Focus states and reduced motion
* ======================================== */
/* Enhanced focus indicators */
*:focus-visible {
outline: 3px solid var(--tractatus-core-end);
outline-offset: 2px;
}
/* Respect user's motion preferences */
@media (prefers-reduced-motion: reduce) {
*,
*::before,
*::after {
animation-duration: 0.01ms !important;
animation-iteration-count: 1 !important;
transition-duration: 0.01ms !important;
}
}
/* ========================================
* LOADING STATES
* Spinner and loading indicators
* ======================================== */
/* Loading spinner */
.spinner {
width: 40px;
height: 40px;
border: 4px solid var(--border-light);
border-top-color: var(--tractatus-core-end);
border-radius: 50%;
animation: spin 0.8s linear infinite;
}
.spinner-sm {
width: 20px;
height: 20px;
border-width: 2px;
}
.spinner-lg {
width: 60px;
height: 60px;
border-width: 6px;
}
@keyframes spin {
to { transform: rotate(360deg); }
}
/* Loading overlay */
.loading-overlay {
position: absolute;
inset: 0;
background: rgba(255, 255, 255, 0.9);
backdrop-filter: blur(2px);
display: flex;
align-items: center;
justify-content: center;
z-index: 50;
}
.loading-overlay-dark {
background: rgba(15, 23, 42, 0.9);
}
/* Skeleton loading */
.skeleton {
background: linear-gradient(
90deg,
var(--bg-secondary) 0%,
var(--bg-tertiary) 50%,
var(--bg-secondary) 100%
);
background-size: 200% 100%;
animation: skeleton-loading 1.5s ease-in-out infinite;
border-radius: 0.375rem;
}
@keyframes skeleton-loading {
0% { background-position: 200% 0; }
100% { background-position: -200% 0; }
}
.skeleton-text {
height: 1rem;
margin-bottom: 0.5rem;
}
.skeleton-heading {
height: 2rem;
width: 60%;
margin-bottom: 1rem;
}
/* Loading dots */
.loading-dots {
display: inline-flex;
gap: 0.5rem;
}
.loading-dots span {
width: 8px;
height: 8px;
border-radius: 50%;
background: var(--tractatus-core-end);
animation: loading-dots 1.4s ease-in-out infinite;
}
.loading-dots span:nth-child(2) {
animation-delay: 0.2s;
}
.loading-dots span:nth-child(3) {
animation-delay: 0.4s;
}
@keyframes loading-dots {
0%, 80%, 100% {
opacity: 0.3;
transform: scale(0.8);
}
40% {
opacity: 1;
transform: scale(1);
}
}
/* ========================================
* CSP-COMPLIANT UTILITY CLASSES
* Common styles extracted from inline attributes
* ======================================== */
/* Text Colors */
.text-tractatus-link {
color: var(--tractatus-core-end);
}
.text-service-boundary {
color: var(--service-boundary-light);
}
.text-service-instruction {
color: var(--service-instruction-light);
}
.text-service-validator {
color: var(--service-validator-light);
}
.text-service-pressure {
color: var(--service-pressure-light);
}
.text-service-metacognitive {
color: var(--service-metacognitive-light);
}
.text-service-deliberation {
color: var(--service-deliberation-light);
}
/* Border Colors */
.border-l-tractatus {
border-left-color: var(--tractatus-core-end);
}
.border-l-service-boundary {
border-left-color: var(--service-boundary-light);
}
.border-l-service-instruction {
border-left-color: var(--service-instruction-light);
}
.border-l-service-validator {
border-left-color: var(--service-validator-light);
}
.border-l-service-pressure {
border-left-color: var(--service-pressure-light);
}
.border-l-service-metacognitive {
border-left-color: var(--service-metacognitive-light);
}
.border-l-service-deliberation {
border-left-color: var(--service-deliberation-light);
}
/* Gradient Backgrounds */
.bg-gradient-tractatus {
background: linear-gradient(135deg, #2563eb 0%, #1d4ed8 50%, #7e22ce 100%);
}
.bg-gradient-service-boundary {
background: linear-gradient(135deg, #10b981 0%, #059669 100%);
}
.bg-gradient-service-instruction {
background: linear-gradient(135deg, #6366f1 0%, #4f46e5 100%);
}
.bg-gradient-service-validator {
background: linear-gradient(135deg, #8b5cf6 0%, #7c3aed 100%);
}
.bg-gradient-service-pressure {
background: linear-gradient(135deg, #f59e0b 0%, #d97706 100%);
}
.bg-gradient-service-metacognitive {
background: linear-gradient(135deg, #ec4899 0%, #db2777 100%);
}
.bg-gradient-service-deliberation {
background: linear-gradient(135deg, #14b8a6 0%, #0d9488 100%);
}
.bg-gradient-cyan-blue {
background: linear-gradient(135deg, #0ea5e9 0%, #0284c7 100%);
}
/* Tailwind Gradient Utilities (not in compiled tailwind.css) */
.bg-gradient-to-r { background-image: linear-gradient(to right, var(--tw-gradient-stops)); }
.bg-gradient-to-br { background-image: linear-gradient(to bottom right, var(--tw-gradient-stops)); }
.bg-gradient-to-b { background-image: linear-gradient(to bottom, var(--tw-gradient-stops)); }
/* From colors */
.from-blue-50 { --tw-gradient-from: #eff6ff; --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to, rgba(239,246,255,0)); }
.from-blue-600 { --tw-gradient-from: #2563eb; --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to, rgba(37,99,235,0)); }
.from-blue-900 { --tw-gradient-from: #1e3a8a; --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to, rgba(30,58,138,0)); }
.from-emerald-500 { --tw-gradient-from: #10b981; --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to, rgba(16,185,129,0)); }
.from-indigo-50 { --tw-gradient-from: #eef2ff; --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to, rgba(238,242,255,0)); }
.from-indigo-500 { --tw-gradient-from: #6366f1; --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to, rgba(99,102,241,0)); }
.from-indigo-600 { --tw-gradient-from: #4f46e5; --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to, rgba(79,70,229,0)); }
.from-amber-50 { --tw-gradient-from: #fffbeb; --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to, rgba(255,251,235,0)); }
.from-amber-500 { --tw-gradient-from: #f59e0b; --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to, rgba(245,158,11,0)); }
.from-purple-50 { --tw-gradient-from: #faf5ff; --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to, rgba(250,245,255,0)); }
.from-purple-500 { --tw-gradient-from: #a855f7; --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to, rgba(168,85,247,0)); }
.from-purple-600 { --tw-gradient-from: #9333ea; --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to, rgba(147,51,234,0)); }
.from-rose-500 { --tw-gradient-from: #f43f5e; --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to, rgba(244,63,94,0)); }
.from-teal-50 { --tw-gradient-from: #f0fdfa; --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to, rgba(240,253,250,0)); }
.from-teal-500 { --tw-gradient-from: #14b8a6; --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to, rgba(20,184,166,0)); }
.from-teal-600 { --tw-gradient-from: #0d9488; --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to, rgba(13,148,136,0)); }
.from-teal-700 { --tw-gradient-from: #0f766e; --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to, rgba(15,118,110,0)); }
.from-yellow-50 { --tw-gradient-from: #fefce8; --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to, rgba(254,252,232,0)); }
.from-orange-50 { --tw-gradient-from: #fff7ed; --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to, rgba(255,247,237,0)); }
.from-gray-50 { --tw-gradient-from: #f9fafb; --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to, rgba(249,250,251,0)); }
.from-gray-800 { --tw-gradient-from: #1f2937; --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to, rgba(31,41,55,0)); }
.from-green-50 { --tw-gradient-from: #f0fdf4; --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to, rgba(240,253,244,0)); }
.from-sky-500 { --tw-gradient-from: #0ea5e9; --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to, rgba(14,165,233,0)); }
.from-pink-50 { --tw-gradient-from: #fdf2f8; --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to, rgba(253,242,248,0)); }
.from-pink-500 { --tw-gradient-from: #ec4899; --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to, rgba(236,72,153,0)); }
/* Via colors */
.via-blue-50 { --tw-gradient-stops: var(--tw-gradient-from), #eff6ff, var(--tw-gradient-to, rgba(239,246,255,0)); }
.via-blue-700 { --tw-gradient-stops: var(--tw-gradient-from), #1d4ed8, var(--tw-gradient-to, rgba(29,78,216,0)); }
.via-teal-50 { --tw-gradient-stops: var(--tw-gradient-from), #f0fdfa, var(--tw-gradient-to, rgba(240,253,250,0)); }
.via-teal-800 { --tw-gradient-stops: var(--tw-gradient-from), #115e59, var(--tw-gradient-to, rgba(17,94,89,0)); }
/* To colors */
.to-blue-50 { --tw-gradient-to: #eff6ff; }
.to-blue-600 { --tw-gradient-to: #2563eb; }
.to-blue-700 { --tw-gradient-to: #1d4ed8; }
.to-purple-50 { --tw-gradient-to: #faf5ff; }
.to-purple-600 { --tw-gradient-to: #9333ea; }
.to-purple-700 { --tw-gradient-to: #7e22ce; }
.to-purple-900 { --tw-gradient-to: #581c87; }
.to-emerald-50 { --tw-gradient-to: #ecfdf5; }
.to-emerald-600 { --tw-gradient-to: #059669; }
.to-emerald-700 { --tw-gradient-to: #047857; }
.to-emerald-800 { --tw-gradient-to: #065f46; }
.to-indigo-50 { --tw-gradient-to: #eef2ff; }
.to-indigo-600 { --tw-gradient-to: #4f46e5; }
.to-amber-600 { --tw-gradient-to: #d97706; }
.to-rose-600 { --tw-gradient-to: #e11d48; }
.to-teal-50 { --tw-gradient-to: #f0fdfa; }
.to-teal-600 { --tw-gradient-to: #0d9488; }
.to-orange-50 { --tw-gradient-to: #fff7ed; }
.to-cyan-600 { --tw-gradient-to: #0891b2; }
.to-green-50 { --tw-gradient-to: #f0fdf4; }
.to-red-50 { --tw-gradient-to: #fef2f2; }
.to-violet-600 { --tw-gradient-to: #7c3aed; }
.to-gray-100 { --tw-gradient-to: #f3f4f6; }
.to-gray-900 { --tw-gradient-to: #111827; }
.to-pink-600 { --tw-gradient-to: #db2777; }
/* Text Shadows */
.text-shadow-sm {
text-shadow: 0 1px 2px rgba(0,0,0,0.1);
}
.text-shadow-md {
text-shadow: 0 2px 4px rgba(0,0,0,0.1);
}
/* Badge Backgrounds (with matching text colors) */
.badge-boundary {
color: #065f46;
background-color: #d1fae5;
}
.badge-instruction {
color: #3730a3;
background-color: #e0e7ff;
}
.badge-validator {
color: #581c87;
background-color: #f3e8ff;
}
.badge-pressure {
color: #92400e;
background-color: #fef3c7;
}
.badge-metacognitive {
color: #831843;
background-color: #fce7f3;
}
.badge-deliberation {
color: #134e4a;
background-color: #ccfbf1;
}
/* Layout Utilities */
.min-h-16 {
min-height: 64px;
}
/* Auth Error Page */
.auth-error-container {
display: flex;
align-items: center;
justify-content: center;
height: 100vh;
font-family: system-ui, -apple-system, sans-serif;
}
.auth-error-content {
text-align: center;
}
.auth-error-icon {
width: 64px;
height: 64px;
margin: 0 auto 16px;
color: #3B82F6;
}
.auth-error-title {
font-size: 20px;
font-weight: 600;
color: #111827;
margin-bottom: 8px;
}
.auth-error-message {
color: #6B7280;
margin-bottom: 16px;
}
.auth-error-redirect {
color: #9CA3AF;
font-size: 14px;
}
/* Coming Soon Overlay */
.coming-soon-overlay {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: rgba(0, 0, 0, 0.95);
z-index: 9999;
display: flex;
align-items: center;
justify-content: center;
backdrop-filter: blur(10px);
}
.coming-soon-card {
background: white;
padding: 3rem;
border-radius: 1rem;
max-width: 600px;
text-align: center;
box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.25);
}
.coming-soon-title {
font-size: 2.5rem;
font-weight: bold;
color: #1f2937;
margin-bottom: 1rem;
}
.coming-soon-subtitle {
font-size: 1.25rem;
color: #6b7280;
margin-bottom: 2rem;
}
.coming-soon-info-box {
background: #eff6ff;
border-left: 4px solid #3b82f6;
padding: 1.5rem;
margin-bottom: 2rem;
text-align: left;
}
.coming-soon-info-title {
color: #1e40af;
margin-bottom: 0.5rem;
}
.coming-soon-info-text {
color: #1e3a8a;
font-size: 0.875rem;
margin: 0;
}
.coming-soon-status {
color: #6b7280;
font-size: 0.875rem;
margin-bottom: 1.5rem;
}
.coming-soon-button {
display: inline-block;
background: #3b82f6;
color: white;
padding: 0.75rem 2rem;
border-radius: 0.5rem;
text-decoration: none;
font-weight: 600;
transition: background 0.2s;
}
.coming-soon-button:hover {
background: #2563eb;
}
.coming-soon-footer {
margin-top: 1.5rem;
font-size: 0.75rem;
color: #9ca3af;
}
.coming-soon-footer a {
color: #3b82f6;
text-decoration: none;
}
.coming-soon-footer a:hover {
text-decoration: underline;
}
/* ========================================
* SCROLL ANIMATIONS
* Intersection Observer-based scroll animations
* ======================================== */
/* Scroll animation initial states (before visible) */
.animate-on-scroll {
transition: opacity 0.6s cubic-bezier(0.4, 0, 0.2, 1),
transform 0.6s cubic-bezier(0.4, 0, 0.2, 1);
}
/* Fade in animation */
.animate-on-scroll[data-animation="fade-in"] {
opacity: 0;
}
.animate-on-scroll[data-animation="fade-in"].is-visible {
opacity: 1;
}
/* Slide up animation */
.animate-on-scroll[data-animation="slide-up"] {
opacity: 0;
transform: translateY(2rem);
}
.animate-on-scroll[data-animation="slide-up"].is-visible {
opacity: 1;
transform: translateY(0);
}
/* Slide down animation */
.animate-on-scroll[data-animation="slide-down"] {
opacity: 0;
transform: translateY(-2rem);
}
.animate-on-scroll[data-animation="slide-down"].is-visible {
opacity: 1;
transform: translateY(0);
}
/* Slide left animation */
.animate-on-scroll[data-animation="slide-left"] {
opacity: 0;
transform: translateX(2rem);
}
.animate-on-scroll[data-animation="slide-left"].is-visible {
opacity: 1;
transform: translateX(0);
}
/* Slide right animation */
.animate-on-scroll[data-animation="slide-right"] {
opacity: 0;
transform: translateX(-2rem);
}
.animate-on-scroll[data-animation="slide-right"].is-visible {
opacity: 1;
transform: translateX(0);
}
/* Scale in animation */
.animate-on-scroll[data-animation="scale-in"] {
opacity: 0;
transform: scale(0.95);
}
.animate-on-scroll[data-animation="scale-in"].is-visible {
opacity: 1;
transform: scale(1);
}
/* Rotate in animation */
.animate-on-scroll[data-animation="rotate-in"] {
opacity: 0;
transform: rotate(12deg) scale(0.95);
}
.animate-on-scroll[data-animation="rotate-in"].is-visible {
opacity: 1;
transform: rotate(0deg) scale(1);
}
/* Default animation if no data-animation specified */
.animate-on-scroll:not([data-animation]) {
opacity: 0;
transform: translateY(2rem);
}
.animate-on-scroll:not([data-animation]).is-visible {
opacity: 1;
transform: translateY(0);
}
/* Respect user's motion preferences for scroll animations */
@media (prefers-reduced-motion: reduce) {
.animate-on-scroll {
opacity: 1 !important;
transform: none !important;
transition: none !important;
}
}
/* ========================================
* PAGE TRANSITIONS
* Smooth fade transitions between pages
* ======================================== */
body {
transition: opacity 0.3s ease-in-out;
}
body.page-fade-in {
opacity: 1;
}
body.page-fade-out {
opacity: 0;
}
/* Respect user's motion preferences for page transitions */
@media (prefers-reduced-motion: reduce) {
body {
transition: none !important;
}
}
/* ========================================
* DATA VISUALIZATIONS
* Pressure chart and timeline components
* ======================================== */
.gauge-fill-path {
transition: stroke 0.3s ease;
}
.timeline-event {
transition: all 0.3s ease;
}
.timeline-event:hover {
transform: scale(1.05);
}
@media (prefers-reduced-motion: reduce) {
.gauge-fill-path,
.timeline-event {
transition: none !important;
}
.timeline-event:hover {
transform: none !important;
}
}
/* ========================================
* DARK MODE SUPPORT (Future)
* Placeholder for dark mode implementation
* ======================================== */
@media (prefers-color-scheme: dark) {
/* Will be implemented in Phase 3 */
}
/* ========================================
* PRINT STYLES
* Optimize for PDF/print output
* ======================================== */
@media print {
* {
background: white !important;
color: black !important;
box-shadow: none !important;
}
a {
text-decoration: underline;
}
.no-print {
display: none !important;
}
}