MediLingua / frontend /src /index.css
IINOVAII's picture
Add .gitignore to exclude dependencies and cache files
29a9ebc
/* ─────────────────────────────────────────────────────────────────────────
MediLingua Β· Clinical Warmth design system
Hardcoded palette + serif/sans/mono pairing. No generic AI aesthetics.
───────────────────────────────────────────────────────────────────────── */
@import url('https://fonts.googleapis.com/css2?family=Playfair+Display:wght@400;700&family=DM+Sans:wght@300;400;500&family=JetBrains+Mono:wght@400&display=swap');
:root {
/* Warm paper-and-clinic palette β€” every value hardcoded, not derived. */
--bg-base: #F7F5F0;
--bg-surface: #FFFFFF;
--bg-deep: #EFEDE8;
--ink-1: #1A1814;
--ink-2: #6B6760;
--ink-3: #A8A49F;
--teal: #0A7563;
--teal-hover: #08604F; /* ~8% darker for hover */
--teal-tint: #E3F2EE;
--amber: #C8760A;
--amber-tint: #FFF8EC;
--red: #B53A2F;
--red-tint: #FEF0EE;
--border: #E2DFD9;
--border-strong: #C8C4BD;
/* Type scale */
--serif: 'Playfair Display', Georgia, 'Times New Roman', serif;
--sans: 'DM Sans', -apple-system, BlinkMacSystemFont, sans-serif;
--mono: 'JetBrains Mono', ui-monospace, SFMono-Regular, monospace;
/* Motion */
--ease: cubic-bezier(0.32, 0.72, 0, 1);
--t-fast: 150ms;
--t-base: 200ms;
--t-slow: 280ms;
}
*, *::before, *::after { box-sizing: border-box; }
html, body, #root {
margin: 0;
padding: 0;
height: 100%;
background: var(--bg-base);
color: var(--ink-1);
}
body {
font-family: var(--sans);
font-weight: 400;
font-size: 15px;
line-height: 1.55;
-webkit-font-smoothing: antialiased;
text-rendering: optimizeLegibility;
}
a {
color: var(--teal);
text-decoration: none;
transition: color var(--t-fast) var(--ease);
}
a:hover { color: var(--teal-hover); text-decoration: underline; text-underline-offset: 3px; }
button { font-family: inherit; }
/* Selection */
::selection { background: var(--teal-tint); color: var(--ink-1); }
/* ───────────────────────────── Typography primitives ───────────────────── */
.h-display {
font-family: var(--serif);
font-weight: 700;
font-size: clamp(40px, 5.5vw, 56px);
line-height: 1.08;
letter-spacing: -0.01em;
color: var(--ink-1);
margin: 0;
}
.h-section {
font-family: var(--serif);
font-weight: 700;
font-size: 36px;
line-height: 1.15;
letter-spacing: -0.005em;
color: var(--ink-1);
margin: 0;
}
.h-card {
font-family: var(--serif);
font-weight: 700;
font-size: 32px;
line-height: 1.2;
color: var(--ink-1);
margin: 0;
}
.subhead {
font-family: var(--sans);
font-weight: 300;
font-size: 18px;
line-height: 1.7;
color: var(--ink-2);
max-width: 460px;
margin: 0;
}
.eyebrow {
font-family: var(--sans);
font-weight: 500;
font-size: 11px;
letter-spacing: 0.12em;
text-transform: uppercase;
color: var(--ink-3);
}
.label {
font-family: var(--sans);
font-weight: 500;
font-size: 12px;
letter-spacing: 0.08em;
text-transform: uppercase;
color: var(--ink-2);
margin-bottom: 8px;
display: block;
}
.helper {
font-size: 12px;
color: var(--ink-3);
line-height: 1.55;
}
/* ───────────────────────────── Buttons ─────────────────────────────────── */
.btn {
appearance: none;
border: 0;
cursor: pointer;
font-family: var(--sans);
font-weight: 500;
font-size: 15px;
padding: 14px 32px;
border-radius: 6px;
background: var(--teal);
color: #fff;
letter-spacing: 0;
transition: background var(--t-fast) var(--ease);
}
.btn:hover:not(:disabled) { background: var(--teal-hover); }
.btn:disabled { opacity: 0.4; cursor: not-allowed; }
.btn-ghost {
background: transparent;
color: var(--ink-1);
border: 1px solid var(--border);
font-size: 13px;
padding: 8px 16px;
border-radius: 6px;
cursor: pointer;
font-family: var(--sans);
font-weight: 400;
transition: border-color var(--t-fast) var(--ease), background var(--t-fast) var(--ease);
}
.btn-ghost:hover:not(:disabled) { border-color: var(--border-strong); background: var(--bg-deep); }
.btn-ghost:disabled { opacity: 0.4; cursor: not-allowed; }
.btn-link {
appearance: none;
background: none;
border: 0;
padding: 0;
cursor: pointer;
color: var(--teal);
font: inherit;
font-weight: 500;
}
.btn-link:hover { color: var(--teal-hover); text-decoration: underline; text-underline-offset: 3px; }
/* ───────────────────────────── Form inputs ─────────────────────────────── */
.field { margin-bottom: 22px; }
.input,
.select-input {
width: 100%;
font-family: var(--sans);
font-weight: 400;
font-size: 15px;
height: 46px;
padding: 12px 16px;
background: var(--bg-surface);
border: 1px solid var(--border);
border-radius: 4px;
color: var(--ink-1);
transition: border-color var(--t-fast) var(--ease);
}
.input:focus, .select-input:focus {
outline: none;
border-color: var(--teal);
}
.input::placeholder { color: var(--ink-3); }
.select-input {
appearance: none;
background-image:
linear-gradient(45deg, transparent 50%, var(--ink-2) 50%),
linear-gradient(135deg, var(--ink-2) 50%, transparent 50%);
background-position: calc(100% - 18px) 50%, calc(100% - 13px) 50%;
background-size: 5px 5px, 5px 5px;
background-repeat: no-repeat;
padding-right: 36px;
cursor: pointer;
}
.input-with-affix { position: relative; }
.input-with-affix .input { padding-right: 44px; }
.input-affix {
position: absolute;
right: 12px;
top: 50%;
transform: translateY(-50%);
background: none;
border: 0;
padding: 6px;
cursor: pointer;
color: var(--ink-2);
transition: color var(--t-fast) var(--ease);
}
.input-affix:hover { color: var(--ink-1); }
.row-2 { display: grid; grid-template-columns: 1fr 1fr; gap: 16px; }
@media (max-width: 540px) { .row-2 { grid-template-columns: 1fr; } }
/* ───────────────────────────── Urgency badges ──────────────────────────── */
.badge {
display: inline-flex;
align-items: center;
gap: 6px;
font-family: var(--sans);
font-weight: 500;
font-size: 12px;
letter-spacing: 0.06em;
text-transform: uppercase;
padding: 5px 10px;
border-radius: 3px;
}
.badge-routine { background: var(--teal-tint); color: var(--teal); }
.badge-urgent { background: var(--amber); color: #fff; padding: 7px 14px; font-size: 13px; }
.badge-emergency {
background: var(--red); color: #fff;
padding: 12px 18px;
font-size: 14px;
letter-spacing: 0.04em;
width: 100%;
justify-content: flex-start;
border-radius: 4px;
}
/* ───────────────────────────── Page-entry stagger ──────────────────────── */
@keyframes pageRise {
from { opacity: 0; transform: translateY(8px); }
to { opacity: 1; transform: translateY(0); }
}
.stagger > * {
opacity: 0;
animation: pageRise 520ms var(--ease) forwards;
}
.stagger > *:nth-child(1) { animation-delay: 60ms; }
.stagger > *:nth-child(2) { animation-delay: 140ms; }
.stagger > *:nth-child(3) { animation-delay: 220ms; }
.stagger > *:nth-child(4) { animation-delay: 300ms; }
.stagger > *:nth-child(5) { animation-delay: 380ms; }
.stagger > *:nth-child(6) { animation-delay: 460ms; }
.stagger > *:nth-child(7) { animation-delay: 540ms; }
.stagger > *:nth-child(8) { animation-delay: 620ms; }
@keyframes bubbleIn {
from { opacity: 0; transform: translateY(6px); }
to { opacity: 1; transform: translateY(0); }
}
@keyframes typingDot {
0%, 60%, 100% { opacity: 0.25; }
30% { opacity: 1; }
}
@keyframes micPulse {
0%, 100% { box-shadow: 0 0 0 0 rgba(10, 117, 99, 0.35); }
50% { box-shadow: 0 0 0 10px rgba(10, 117, 99, 0); }
}
@keyframes agentPulse {
0%, 100% { opacity: 0.45; transform: scale(1); }
50% { opacity: 1; transform: scale(1.15); }
}
/* ───────────────────────────── Utility ─────────────────────────────────── */
.sr-only {
position: absolute; width: 1px; height: 1px;
padding: 0; margin: -1px; overflow: hidden;
clip: rect(0, 0, 0, 0); white-space: nowrap; border: 0;
}
.divider { height: 1px; background: var(--border); border: 0; margin: 24px 0; }
.divider-tight { height: 1px; background: var(--border); border: 0; margin: 16px 0; }
/* Live interim transcript bubble emitted by VoiceRecorder in hero mode.
Styled here so any screen that uses VoiceRecorder gets it for free. */
.mic-interim {
margin-top: 4px;
max-width: 460px;
padding: 6px 14px;
font-family: var(--sans);
font-size: 14.5px;
font-style: italic;
color: var(--ink-2);
line-height: 1.5;
text-align: center;
animation: pageRise 240ms var(--ease);
}