LaelaZ's picture
Sync package to GitHub source: em-dashes out of rendered output; no API/logic change
de754a0 verified
/* InterviewCoach design system: the "Calm Coach" identity.
Focused, confident, supportive: a steady teal voice with a sage + soft-blue
supporting cast on a warm-neutral stone canvas. Generous whitespace, gentle
motion, light + dark. Built on Tailwind utilities; this file holds the few
bespoke components (rings, meters, washes) the utilities can't express well. */
:root {
--ic-teal: 13 148 136; /* teal-600, primary */
--ic-teal-strong: 15 118 110; /* teal-700, deep */
--ic-sage: 94 128 80; /* sage-500, calm support */
--ic-sky: 58 130 179; /* soft blue, accent */
/* Semantic score bands, kept soft and encouraging, never alarming. */
--ic-good: 16 185 129; /* emerald */
--ic-mid: 217 160 60; /* warm amber */
--ic-low: 219 139 119; /* soft terracotta (not a harsh red) */
}
html { scroll-behavior: smooth; }
body {
font-family: "Inter var", Inter, ui-sans-serif, system-ui, -apple-system,
"Segoe UI", Roboto, Helvetica, Arial, sans-serif;
font-feature-settings: "cv02", "cv03", "cv04", "cv11";
-webkit-font-smoothing: antialiased;
text-rendering: optimizeLegibility;
}
/* Calmer headings: a touch lighter and more relaxed than a shouty SaaS bold. */
h1, h2, h3 { letter-spacing: -0.011em; }
/* Subtle page wash: soft teal warmth from the corners, never busy. */
.ic-bg {
background-image:
radial-gradient(58rem 58rem at 108% -12%, rgb(var(--ic-sky) / 0.10), transparent 56%),
radial-gradient(52rem 52rem at -12% -6%, rgb(var(--ic-teal) / 0.08), transparent 52%),
radial-gradient(46rem 46rem at 50% 118%, rgb(var(--ic-sage) / 0.07), transparent 60%);
background-attachment: fixed;
}
.dark .ic-bg {
background-image:
radial-gradient(58rem 58rem at 108% -12%, rgb(var(--ic-sky) / 0.16), transparent 56%),
radial-gradient(52rem 52rem at -12% -6%, rgb(var(--ic-teal) / 0.14), transparent 52%),
radial-gradient(46rem 46rem at 50% 118%, rgb(var(--ic-sage) / 0.10), transparent 60%);
}
/* Brand text: a gentle teal -> soft-blue blend. */
.ic-gradient-text {
background-image: linear-gradient(
100deg, rgb(var(--ic-teal-strong)), rgb(var(--ic-sky))
);
-webkit-background-clip: text;
background-clip: text;
color: transparent;
}
/* Card: soft, breathable, warm-neutral. */
.ic-card {
border-radius: 1.1rem;
border: 1px solid rgb(231 226 218); /* stone-200-ish */
background: rgb(255 255 254 / 0.86);
backdrop-filter: blur(7px);
box-shadow: 0 1px 2px rgb(40 50 48 / 0.04), 0 14px 32px -18px rgb(20 60 56 / 0.20);
}
.dark .ic-card {
border-color: rgb(46 60 58 / 0.7);
background: rgb(15 25 24 / 0.6);
box-shadow: 0 1px 2px rgb(0 0 0 / 0.3), 0 14px 36px -18px rgb(0 0 0 / 0.65);
}
/* A soft "panel" tint used for grouped/quiet sections (calmer than slate). */
.ic-panel {
background: rgb(244 246 244 / 0.7);
}
.dark .ic-panel {
background: rgb(18 30 28 / 0.5);
}
/* Score / axis meter: rounded, gently animated. */
.ic-meter {
height: 0.5rem;
border-radius: 999px;
background: rgb(229 230 226);
overflow: hidden;
}
.dark .ic-meter { background: rgb(38 50 48); }
.ic-meter > span {
display: block;
height: 100%;
border-radius: 999px;
background: linear-gradient(90deg, rgb(var(--ic-teal)), rgb(var(--ic-sky)));
transition: width .6s cubic-bezier(.22,.61,.36,1);
}
/* Semantic meter fills by score band: soft, supportive tones. */
.ic-meter--low > span { background: linear-gradient(90deg, rgb(var(--ic-low) / 0.85), rgb(var(--ic-low))); }
.ic-meter--mid > span { background: linear-gradient(90deg, rgb(var(--ic-mid) / 0.85), rgb(var(--ic-mid))); }
.ic-meter--high > span { background: linear-gradient(90deg, rgb(var(--ic-teal)), rgb(var(--ic-good))); }
/* Conic score ring (hero + verdict): the calm focal point. */
.ic-ring {
--pct: 80;
width: var(--size, 9rem);
height: var(--size, 9rem);
border-radius: 50%;
display: grid;
place-content: center;
text-align: center;
background:
conic-gradient(from -90deg,
rgb(var(--ic-teal)) calc(var(--pct) * 1%),
rgb(226 228 223) 0);
position: relative;
}
.dark .ic-ring {
background:
conic-gradient(from -90deg,
rgb(var(--ic-teal)) calc(var(--pct) * 1%),
rgb(40 52 50) 0);
}
/* Tone variants so a low score reads supportive, not punishing. */
.ic-ring--mid { background: conic-gradient(from -90deg, rgb(var(--ic-mid)) calc(var(--pct) * 1%), rgb(226 228 223) 0); }
.ic-ring--low { background: conic-gradient(from -90deg, rgb(var(--ic-low)) calc(var(--pct) * 1%), rgb(226 228 223) 0); }
.dark .ic-ring--mid { background: conic-gradient(from -90deg, rgb(var(--ic-mid)) calc(var(--pct) * 1%), rgb(40 52 50) 0); }
.dark .ic-ring--low { background: conic-gradient(from -90deg, rgb(var(--ic-low)) calc(var(--pct) * 1%), rgb(40 52 50) 0); }
.ic-ring::before {
content: "";
position: absolute;
inset: 0.5rem;
border-radius: 50%;
background: rgb(255 255 254);
}
.dark .ic-ring::before { background: rgb(15 25 24); }
.ic-ring > * { position: relative; z-index: 1; }
/* Soft pill / chip used for skills + statuses. */
.ic-chip {
display: inline-flex;
align-items: center;
gap: 0.4rem;
border-radius: 999px;
padding: 0.2rem 0.7rem;
font-size: 0.72rem;
font-weight: 600;
}
/* Gentle lift on interactive cards. */
.ic-lift { transition: transform .18s ease, box-shadow .18s ease, border-color .18s ease; }
.ic-lift:hover { transform: translateY(-2px); }
/* htmx loading affordance. */
.htmx-indicator { opacity: 0; transition: opacity .15s ease; }
.htmx-request .htmx-indicator { opacity: 1; }
.htmx-request.htmx-indicator { opacity: 1; }
/* Disable the submit button while a request is in flight. */
.htmx-request button[type="submit"] { opacity: .65; pointer-events: none; }
/* Fade-in for swapped / new content. */
@keyframes ic-fade-in {
from { opacity: 0; transform: translateY(6px); }
to { opacity: 1; transform: translateY(0); }
}
.ic-fade { animation: ic-fade-in .28s cubic-bezier(.22,.61,.36,1) both; }
/* A slow, calming pulse for the "live demo" dot: a breathing rhythm. */
@keyframes ic-breathe {
0%, 100% { opacity: 1; transform: scale(1); }
50% { opacity: 0.55; transform: scale(0.82); }
}
.ic-breathe { animation: ic-breathe 3.2s ease-in-out infinite; }
/* Focus ring: calm teal, clearly visible. */
.ic-focus:focus-visible {
outline: none;
box-shadow: 0 0 0 3px rgb(var(--ic-teal) / 0.4);
}
@media (prefers-reduced-motion: reduce) {
.ic-fade, .ic-breathe, .ic-meter > span, .ic-lift { animation: none; transition: none; }
}