Spaces:
Running
Running
| @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 ; | |
| animation-iteration-count: 1 ; | |
| transition-duration: 0.01ms ; | |
| } | |
| } | |
| /* 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) ; | |
| } | |
| .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 ; | |
| gap: 0.75rem ; | |
| } | |
| .bento-flip-container { | |
| grid-column: span 1; | |
| grid-row: span 1; | |
| order: -1; | |
| min-height: 280px; | |
| } | |
| } | |