@import "tailwindcss"; @theme { --color-cta: var(--color-cta); --color-cta-dark: var(--color-cta-dark); --color-accent-cyan: var(--color-accent-cyan); --color-accent-pink: var(--color-accent-pink); --color-surface-elevated: var(--color-surface-elevated); --color-surface-overlay: var(--color-surface-overlay); --color-surface-subtle: var(--color-surface-subtle); --color-text-primary: var(--color-text-primary); --color-text-secondary: var(--color-text-secondary); --color-text-muted: var(--color-text-muted); --color-warning: var(--color-warning); --radius-md: 8px; --radius-lg: 12px; --radius-xl: 16px; } /* ============================================ REACHY MINI MINDER DESIGN SYSTEM Dark Mode Care Companion Palette ============================================ */ :root { /* Core Colors */ --color-background: #2c2c2c; --color-text-primary: #e4e4e4; --color-accent-cyan: #a8dadc; --color-accent-pink: #ffc1cc; --color-cta: #b39cd0; /* Surface Variants */ --color-surface-elevated: #363636; --color-surface-overlay: #404040; --color-surface-subtle: #242424; /* Text Variants */ --color-text-secondary: #b0b0b0; --color-text-muted: #808080; --color-text-inverse: #1a1a1a; /* State Colors */ --color-success: #7dd3a8; --color-warning: #f5c26b; --color-error: #e57373; /* Accent Variants (hover/active states) */ --color-accent-cyan-light: #c5e9eb; --color-accent-cyan-dark: #7abec0; --color-accent-pink-light: #ffd7de; --color-accent-pink-dark: #e8a3b0; --color-cta-light: #c9b5de; --color-cta-dark: #9a7fc0; /* Typography - Design System Fonts */ /* These get values from next/font CSS variables set on body */ --font-sans: var(--font-body), "Poppins", system-ui, -apple-system, sans-serif; --font-mono: "JetBrains Mono", "Fira Code", "SF Mono", monospace; /* Spacing (4px base) */ --space-1: 0.25rem; --space-2: 0.5rem; --space-3: 0.75rem; --space-4: 1rem; --space-5: 1.5rem; --space-6: 2rem; --space-8: 3rem; --space-10: 4rem; /* Border Radius */ --radius-sm: 4px; --radius-md: 8px; --radius-lg: 12px; --radius-xl: 16px; --radius-full: 9999px; /* Shadows */ --shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.2); --shadow-md: 0 2px 8px rgba(0, 0, 0, 0.3); --shadow-lg: 0 4px 16px rgba(0, 0, 0, 0.4); --shadow-xl: 0 8px 32px rgba(0, 0, 0, 0.5); /* Transitions */ --transition-fast: 0.1s ease; --transition-normal: 0.2s ease; --transition-slow: 0.3s ease; } /* Tailwind theme mapping */ @theme inline { --color-background: var(--color-background); --color-foreground: var(--color-text-primary); --font-sans: var(--font-sans); --font-mono: var(--font-mono); --font-heading: var(--font-heading); } /* ============================================ BASE STYLES ============================================ */ body { background: var(--color-background); color: var(--color-text-secondary); font-family: var(--font-body), "Poppins", system-ui, sans-serif; line-height: 1.5; } /* Heading font utility class */ .font-heading { font-family: var(--font-heading), "Atkinson Hyperlegible", system-ui, sans-serif; } /* Body font utility class */ .font-body { font-family: var(--font-body), "Poppins", system-ui, sans-serif; } /* ============================================ BUTTONS ============================================ */ .btn { display: inline-flex; align-items: center; justify-content: center; gap: var(--space-2); padding: var(--space-3) var(--space-5); border-radius: var(--radius-md); font-weight: 500; font-size: 0.875rem; cursor: pointer; transition: all var(--transition-normal); border: none; outline: none; } .btn:focus-visible { outline: 2px solid var(--color-accent-cyan); outline-offset: 2px; } /* Primary (CTA) */ .btn-primary { background: var(--color-cta); color: var(--color-text-inverse); } .btn-primary:hover { background: var(--color-cta-dark); transform: translateY(-1px); } .btn-primary:active { transform: translateY(0); } /* Secondary (Outlined) */ .btn-secondary { background: transparent; color: var(--color-accent-cyan); border: 1px solid var(--color-accent-cyan); } .btn-secondary:hover { background: rgba(168, 218, 220, 0.1); } /* Alert/Health */ .btn-alert { background: var(--color-accent-pink); color: var(--color-text-inverse); } .btn-alert:hover { background: var(--color-accent-pink-dark); } /* Ghost */ .btn-ghost { background: transparent; color: var(--color-text-primary); } .btn-ghost:hover { background: var(--color-surface-elevated); } /* Sizes */ .btn-sm { padding: var(--space-2) var(--space-3); font-size: 0.75rem; } .btn-lg { padding: var(--space-4) var(--space-6); font-size: 1rem; } /* ============================================ CARDS ============================================ */ .card { background: var(--color-surface-elevated); border-radius: var(--radius-lg); padding: var(--space-5); box-shadow: var(--shadow-md); } .card-interactive { cursor: pointer; transition: transform var(--transition-normal), box-shadow var(--transition-normal); } .card-interactive:hover { transform: translateY(-2px); box-shadow: var(--shadow-lg); } .card-alert { border-left: 4px solid var(--color-accent-pink); } .card-info { border-left: 4px solid var(--color-accent-cyan); } /* ============================================ INPUTS ============================================ */ .input { width: 100%; background: var(--color-surface-subtle); border: 1px solid var(--color-surface-overlay); color: var(--color-text-primary); padding: var(--space-3) var(--space-4); border-radius: var(--radius-md); font-size: 1rem; transition: border-color var(--transition-normal), box-shadow var(--transition-normal); } .input::placeholder { color: var(--color-text-muted); } .input:focus { outline: none; border-color: var(--color-accent-cyan); box-shadow: 0 0 0 3px rgba(168, 218, 220, 0.2); } .input-error { border-color: var(--color-error); } .input-error:focus { box-shadow: 0 0 0 3px rgba(229, 115, 115, 0.2); } /* ============================================ BADGES & PILLS ============================================ */ .badge { display: inline-flex; align-items: center; justify-content: center; min-width: 1.5rem; height: 1.5rem; padding: 0 var(--space-2); border-radius: var(--radius-full); font-size: 0.75rem; font-weight: 600; } .badge-cyan { background: var(--color-accent-cyan); color: var(--color-text-inverse); } .badge-pink { background: var(--color-accent-pink); color: var(--color-text-inverse); } .badge-lavender { background: var(--color-cta); color: var(--color-text-inverse); } /* Live indicator (e.g., for transcript status) */ .badge-live { background: var(--color-accent-pink); color: var(--color-text-inverse); animation: pulse 2s infinite; } @keyframes pulse { 0%, 100% { opacity: 1; } 50% { opacity: 0.7; } } /* Pill labels */ .pill { display: inline-flex; align-items: center; gap: var(--space-1); padding: var(--space-1) var(--space-3); border-radius: var(--radius-full); font-size: 0.75rem; font-weight: 500; } .pill-cyan { background: rgba(168, 218, 220, 0.2); color: var(--color-accent-cyan); } .pill-pink { background: rgba(255, 193, 204, 0.2); color: var(--color-accent-pink); } .pill-lavender { background: rgba(179, 156, 208, 0.2); color: var(--color-cta); } /* ============================================ TOGGLE SWITCH ============================================ */ .toggle { position: relative; width: 44px; height: 24px; background: var(--color-surface-overlay); border-radius: var(--radius-full); cursor: pointer; transition: background var(--transition-normal); } .toggle::after { content: ""; position: absolute; top: 2px; left: 2px; width: 20px; height: 20px; background: var(--color-text-primary); border-radius: 50%; transition: transform var(--transition-normal); } .toggle.active { background: var(--color-cta); } .toggle.active::after { transform: translateX(20px); } /* ============================================ PROGRESS BAR ============================================ */ .progress { width: 100%; height: 8px; background: var(--color-surface-overlay); border-radius: var(--radius-full); overflow: hidden; } .progress-bar { height: 100%; background: var(--color-cta); border-radius: var(--radius-full); transition: width var(--transition-slow); } .progress-bar.cyan { background: var(--color-accent-cyan); } .progress-bar.pink { background: var(--color-accent-pink); } /* ============================================ MODALS & OVERLAYS ============================================ */ .modal-overlay { position: fixed; inset: 0; background: var(--color-surface-subtle); backdrop-filter: blur(8px); display: flex; align-items: center; justify-content: center; padding: var(--space-4); z-index: 50; animation: fadeIn 0.3s ease-out; } @keyframes fadeIn { from { opacity: 0; } to { opacity: 1; } } .modal { background: var(--color-surface-elevated); border: 1px solid var(--color-surface-overlay); border-radius: var(--radius-xl); width: 100%; max-width: 800px; max-height: 85vh; box-shadow: var(--shadow-xl), 0 0 0 1px rgba(255, 255, 255, 0.05); display: flex; flex-direction: column; overflow: hidden; animation: modalPop 0.4s cubic-bezier(0.16, 1, 0.3, 1); } @keyframes modalPop { from { opacity: 0; transform: scale(0.95) translateY(10px); } to { opacity: 1; transform: scale(1) translateY(0); } } /* Fullscreen variant for data-heavy panels (System Monitor etc.) Designed for TV-distance legibility — fills nearly the entire screen */ .modal-fullscreen { background: var(--color-surface-elevated); border: 1px solid var(--color-surface-overlay); border-radius: var(--radius-lg); width: 98vw; max-width: 100vw; height: 96vh; max-height: 96vh; box-shadow: var(--shadow-xl), 0 0 0 1px rgba(255, 255, 255, 0.05); display: flex; flex-direction: column; overflow: hidden; animation: modalPop 0.4s cubic-bezier(0.16, 1, 0.3, 1); } .modal-header { font-size: 1.25rem; font-weight: 600; margin-bottom: var(--space-4); } /* ============================================ NOTIFICATIONS / TOASTS ============================================ */ .toast { display: flex; align-items: center; gap: var(--space-3); padding: var(--space-4); background: var(--color-surface-elevated); border-radius: var(--radius-lg); box-shadow: var(--shadow-lg); border-left: 4px solid var(--color-accent-cyan); } .toast-success { border-left-color: var(--color-success); } .toast-warning { border-left-color: var(--color-warning); } .toast-error { border-left-color: var(--color-error); } .toast-health { border-left-color: var(--color-accent-pink); } /* ============================================ NAVIGATION ============================================ */ .nav-item { display: flex; align-items: center; gap: var(--space-3); padding: var(--space-3) var(--space-5); color: var(--color-text-secondary); border-radius: var(--radius-md); transition: all var(--transition-normal); cursor: pointer; font-weight: 500; font-size: 0.875rem; } .nav-item:hover { background: var(--color-surface-elevated); color: var(--color-text-primary); } .nav-item.active { background: rgba(179, 156, 208, 0.1); color: var(--color-cta); box-shadow: inset 0 0 0 1px rgba(179, 156, 208, 0.2); } /* ============================================ DIVIDERS ============================================ */ .divider { height: 1px; background: var(--color-surface-overlay); margin: var(--space-4) 0; } /* ============================================ ACCESSIBILITY ============================================ */ *:focus-visible { outline: 2px solid var(--color-accent-cyan); outline-offset: 2px; } /* Respect reduced motion preferences */ @media (prefers-reduced-motion: reduce) { *, *::before, *::after { animation-duration: 0.01ms !important; animation-iteration-count: 1 !important; transition-duration: 0.01ms !important; } } /* High-Comfort Markdown Styling for Clinical Reports */ .markdown-content h1, .markdown-content h2 { font-size: 1.1rem; font-weight: 800; color: var(--color-primary); margin-top: 2rem; margin-bottom: 0.75rem; letter-spacing: -0.02em; } .markdown-content h3 { font-size: 0.9rem; font-weight: 700; color: var(--color-primary); margin-top: 1.5rem; margin-bottom: 0.5rem; text-transform: uppercase; letter-spacing: 0.05em; opacity: 0.9; } .markdown-content p { margin-bottom: 1.25rem; color: var(--color-primary); opacity: 0.85; } .markdown-content ul, .markdown-content ol { margin-bottom: 1.5rem; padding-left: 1.25rem; } .markdown-content li { margin-bottom: 0.5rem; position: relative; } .markdown-content li::before { content: "•"; color: var(--color-cta); position: absolute; left: -1rem; font-weight: bold; } .markdown-content strong { color: var(--color-primary); font-weight: 700; background: var(--color-surface-overlay); padding: 0 4px; border-radius: 4px; } /* MusicPicker & VolumeControl animations */ @keyframes iconPulse { 0%, 100% { opacity: 0; transform: scale(0.95); } 50% { opacity: 0.3; transform: scale(1.05); } } @keyframes wave { 0%, 100% { transform: scaleY(0.5); } 50% { transform: scaleY(1); } } /* ============================================ BENTO GRID DASHBOARD Glassmorphism cards with entry animations ============================================ */ .bento-card { background: linear-gradient( 135deg, rgba(54, 54, 54, 0.8) 0%, rgba(36, 36, 36, 0.9) 100% ); backdrop-filter: blur(20px); border: 1px solid rgba(255, 255, 255, 0.15); border-radius: 16px; padding: 24px; position: relative; overflow: hidden; transition: transform 0.3s ease, box-shadow 0.3s ease; } /* Top highlight line */ .bento-card::before { content: ""; position: absolute; top: 0; left: 0; right: 0; height: 1px; background: linear-gradient( 90deg, transparent, rgba(255, 255, 255, 0.1), transparent ); } .bento-card:hover { transform: translateY(-2px); box-shadow: 0 12px 40px rgba(0, 0, 0, 0.4); } /* Entry animations for cards */ .dashboard-grid .bento-card { animation: slideUp 0.6s ease-out backwards; } .dashboard-grid .bento-card:nth-child(1) { animation-delay: 0.1s; } .dashboard-grid .bento-card:nth-child(2) { animation-delay: 0.2s; } .dashboard-grid .bento-card:nth-child(3) { animation-delay: 0.3s; } .dashboard-grid .bento-card:nth-child(4) { animation-delay: 0.4s; } .dashboard-grid .bento-card:nth-child(5) { animation-delay: 0.5s; } @keyframes slideUp { from { opacity: 0; transform: translateY(20px); } to { opacity: 1; transform: translateY(0); } } .animate-slideUp { animation: slideUp 0.4s cubic-bezier(0.16, 1, 0.3, 1); } .animate-fadeIn { animation: fadeIn 0.3s ease-out; } /* Bounce animation for CTA arrow */ @keyframes bounce-x { 0%, 100% { transform: translateX(0); } 50% { transform: translateX(4px); } } .animate-bounce-x { animation: bounce-x 1.5s ease-in-out infinite; } /* ============================================ 3D CARD FLIP — Bento Hero ↔ Camera Professional, understated 3D flip transition Uses CSS Grid stacking to avoid height collapse. ============================================ */ .bento-flip-container { perspective: 1200px; /* Grid placement for the hero 2x2 tile */ grid-column: span 2; grid-row: span 2; } .bento-flip-inner { display: grid; /* Grid stacking — both faces share the same cell */ width: 100%; height: 100%; transition: transform 0.6s cubic-bezier(0.4, 0, 0.2, 1); transform-style: preserve-3d; } .bento-flip-inner.flipped { transform: rotateY(180deg); } /* Both faces occupy the same grid cell — no absolute positioning needed */ .bento-flip-front, .bento-flip-back { grid-row: 1; grid-column: 1; backface-visibility: hidden; -webkit-backface-visibility: hidden; border-radius: 16px; overflow: hidden; min-width: 0; /* prevent grid blowout */ } .bento-flip-back { transform: rotateY(180deg); } /* Reduced motion fallback: simple crossfade instead of 3D flip */ @media (prefers-reduced-motion: reduce) { .bento-flip-inner { transition: none; } .bento-flip-inner.flipped { transform: none; } .bento-flip-front, .bento-flip-back { backface-visibility: visible; -webkit-backface-visibility: visible; transition: opacity 0.3s ease; } .bento-flip-inner .bento-flip-front { opacity: 1; } .bento-flip-inner.flipped .bento-flip-front { opacity: 0; } .bento-flip-back { transform: none; opacity: 0; } .bento-flip-inner.flipped .bento-flip-back { opacity: 1; } } /* Responsive grid */ .dashboard-grid-layout { display: grid; grid-template-columns: repeat(4, 1fr); grid-template-rows: auto auto; } /* Medium screens: hero full-width on top, 4 smaller tiles in 2×2 below */ @media (max-width: 768px) { .dashboard-grid-layout { grid-template-columns: repeat(2, 1fr) !important; } .bento-flip-container { grid-column: span 2; grid-row: span 1; order: -1; min-height: 240px; } } /* Mobile: single column stack */ @media (max-width: 480px) { .dashboard-grid-layout { grid-template-columns: 1fr !important; gap: 0.75rem !important; } .bento-flip-container { grid-column: span 1; grid-row: span 1; order: -1; min-height: 280px; } }