Boopster's picture
refactor: Update terminology from "health companion" to "care companion" across the application.
f12493c
@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;
}
}