reachy_web / tailwindcss /styles /landing.css
Domotick's picture
v0.8.0
256d8bf
Raw
History Blame Contribute Delete
9.96 kB
/* Reachy Web — Space landing page (Tailwind v4 source, builds to ../style.css) */
@import "tailwindcss";
@source "../../index.html";
/* Fonts (self-hosted, variable weight) */
@font-face { font-family: 'Space Grotesk'; src: url("/reachy_web/static/fonts/SpaceGrotesk.ttf") format('truetype'); font-weight: 100 900; font-display: swap; }
@font-face { font-family: 'Manrope'; src: url("/reachy_web/static/fonts/Manrope.ttf") format('truetype'); font-weight: 100 900; font-display: swap; }
/* Tokens — dark default. Themes (data-theme) and palettes (data-palette) swap
these variables; every Tailwind color utility below follows along. */
:root {
color-scheme: dark;
accent-color: var(--acc);
--bg: #0b0e14;
--card: #151923;
--soft: #0f1320;
--line: #1e2533;
--txt: #e8eaed;
--mut: #8a909a;
--acc: #3b82f6;
--ok: #27c281;
}
[data-theme=light] { color-scheme: light; --bg: #eef1f7; --card: #fff; --soft: #f1f4f9; --line: #d9dfea; --txt: #1b2330; --mut: #5b6675; --acc: #2563eb; --ok: #16a34a; }
/* Palettes (from PiWRT) */
:root[data-palette=ocean] { --bg: #0a141c; --card: #11202e; --soft: #1a3a48; --line: #1f3245; --txt: #e1ecf4; --mut: #85a1b5; --acc: #22d3ee; }
:root[data-palette=ocean][data-theme=light] { --bg: #f0f7fa; --card: #fff; --soft: #cfeaf1; --line: #dde9f0; --txt: #0f1b26; --mut: #5a7387; --acc: #0891b2; }
:root[data-palette=violet] { --bg: #15101f; --card: #1f1a2e; --soft: #2a2342; --line: #2e2942; --txt: #f1edf8; --mut: #a19bb5; --acc: #a78bfa; }
:root[data-palette=violet][data-theme=light] { --bg: #f7f4fb; --card: #fff; --soft: #efe9fa; --line: #e6e0ef; --txt: #1f1b2c; --mut: #6b6480; --acc: #7c3aed; }
:root[data-palette=sunset] { --bg: #1c100a; --card: #2a180f; --soft: #3d2412; --line: #3d2415; --txt: #f5e6d8; --mut: #b59880; --acc: #fb923c; }
:root[data-palette=sunset][data-theme=light] { --bg: #fff7f0; --card: #fff; --soft: #fce7d6; --line: #f5e6d8; --txt: #2c1810; --mut: #7a5a45; --acc: #ea580c; }
:root[data-palette=forest] { --bg: #0e140f; --card: #172218; --soft: #1a3422; --line: #1f2a1f; --txt: #e8f0e5; --mut: #8fa088; --acc: #4ade80; }
:root[data-palette=forest][data-theme=light] { --bg: #f4f8f1; --card: #fff; --soft: #dcefde; --line: #dde5d6; --txt: #1a2614; --mut: #5f6e55; --acc: #16a34a; }
:root[data-palette=rose] { --bg: #1a0b12; --card: #2a1320; --soft: #3d1a2d; --line: #3d1a2a; --txt: #fdf2f8; --mut: #c49aab; --acc: #fb7185; }
:root[data-palette=rose][data-theme=light] { --bg: #fdf2f8; --card: #fff; --soft: #fbe0ea; --line: #f4d9e2; --txt: #1f0e15; --mut: #7a4757; --acc: #e11d48; }
:root[data-palette=mint] { --bg: #06181a; --card: #0e2426; --soft: #133a35; --line: #1b3638; --txt: #e0f5ee; --mut: #7fa89a; --acc: #5eead4; }
:root[data-palette=mint][data-theme=light] { --bg: #f0fbf6; --card: #fff; --soft: #ccf1e8; --line: #d5ede0; --txt: #0a2e20; --mut: #5c7c6e; --acc: #14b8a6; }
:root[data-palette=amber] { --bg: #101114; --card: #1a1c20; --soft: #26292f; --line: #2e323a; --txt: #eceef2; --mut: #9aa0aa; --acc: #e9a23b; }
:root[data-palette=amber][data-theme=light] { --bg: #fafafb; --card: #fff; --soft: #f1f2f4; --line: #e2e5ea; --txt: #17191d; --mut: #5f6672; --acc: #b9761a; }
:root[data-palette=slate] { --bg: #0f172a; --card: #1e293b; --soft: #1e2b40; --line: #334155; --txt: #f1f5f9; --mut: #94a3b8; --acc: #94a3b8; }
:root[data-palette=slate][data-theme=light] { --bg: #f8fafc; --card: #fff; --soft: #e2e8f0; --line: #e2e8f0; --txt: #0f172a; --mut: #64748b; --acc: #475569; }
:root[data-palette=nordic] { --bg: #2e3440; --card: #3b4252; --soft: #3f4f65; --line: #4c566a; --txt: #eceff4; --mut: #a8b0bf; --acc: #88c0d0; }
:root[data-palette=nordic][data-theme=light] { --bg: #eceff4; --card: #fff; --soft: #e5ecf3; --line: #d8dee9; --txt: #2e3440; --mut: #4c566a; --acc: #5e81ac; }
:root[data-palette=one-dark] { --bg: #0e1015; --card: #1b1d22; --soft: #21304a; --line: #2a2d34; --txt: #abb2bf; --mut: #5c6370; --acc: #61afef; }
:root[data-palette=one-dark][data-theme=light] { --bg: #fafafa; --card: #fff; --soft: #dbe7fb; --line: #e5e5e6; --txt: #383a42; --mut: #6b6f76; --acc: #4078f2; }
:root[data-palette=midnight] { --bg: #000; --card: #0a0a0a; --soft: #1a1b3a; --line: #1a1a1a; --txt: #fafafa; --mut: #888; --acc: #818cf8; }
:root[data-palette=midnight][data-theme=light] { --bg: #fff; --card: #f5f5f5; --soft: #e0e1fb; --line: #e5e5e5; --txt: #000; --mut: #666; --acc: #4f46e5; }
:root[data-palette=matrix] { --bg: #000; --card: #0a140a; --soft: #0e1f0e; --line: #163a16; --txt: #4dff77; --mut: #2e9a4f; --acc: #00ff41; }
:root[data-palette=matrix][data-theme=light] { --bg: #eefbf1; --card: #fff; --soft: #d6f7dd; --line: #c3eece; --txt: #08350f; --mut: #4a7d57; --acc: #0ba21e; }
/* Map the tokens into Tailwind so bg-bg, text-txt, border-line, text-acc,
bg-card, bg-soft, text-mut, bg-ok… exist as utilities and react to the
palette/theme switches. */
@theme inline {
--color-bg: var(--bg);
--color-card: var(--card);
--color-soft: var(--soft);
--color-line: var(--line);
--color-txt: var(--txt);
--color-mut: var(--mut);
--color-acc: var(--acc);
--color-ok: var(--ok);
--font-display: "Space Grotesk", sans-serif;
--font-body: "Manrope", system-ui, -apple-system, sans-serif;
}
@layer base {
html { scroll-behavior: smooth; }
body {
font-family: var(--font-body);
background: radial-gradient(1200px 600px at 50% -10%, var(--soft), var(--bg)) fixed;
color: var(--txt);
line-height: 1.6;
transition: background 0.25s, color 0.25s;
}
h1, h2, h3 { font-family: var(--font-display); font-weight: 600; line-height: 1.2; }
a { color: var(--acc); text-decoration: none; transition: color 0.2s; }
a:hover { color: color-mix(in srgb, var(--acc) 70%, var(--txt)); }
}
/* Stateful / repeated components the JS toggles (.on, .hidden) or builds
at runtime (changelog cards) — everything else is utilities in the HTML. */
@layer components {
.card {
background: var(--card);
border: 1px solid var(--line);
border-radius: 16px;
padding: 26px;
box-shadow: 0 8px 24px #00000040;
transition: border-color 0.2s, transform 0.2s, background-color 0.25s;
}
[data-theme=light] .card { box-shadow: 0 6px 18px #141e3c14; }
.btn {
padding: 12px 24px;
border-radius: 12px;
font-weight: 700;
font-size: 0.95rem;
font-family: inherit;
border: none;
cursor: pointer;
transition: transform 0.2s, box-shadow 0.2s, background-color 0.2s;
}
.btn.primary {
background: var(--acc);
color: var(--bg);
box-shadow: 0 4px 18px color-mix(in srgb, var(--acc) 35%, transparent);
}
.btn.primary:hover { transform: translateY(-2px); box-shadow: 0 8px 26px color-mix(in srgb, var(--acc) 45%, transparent); }
.btn.ghost { background: var(--soft); border: 1px solid var(--line); color: var(--txt); }
.btn.ghost:hover { border-color: var(--acc); }
.chip {
background: color-mix(in srgb, var(--acc) 12%, var(--card));
border: 1px solid color-mix(in srgb, var(--acc) 35%, var(--line));
padding: 6px 13px;
border-radius: 9px;
font-size: 0.83rem;
font-weight: 600;
color: color-mix(in srgb, var(--acc) 70%, var(--txt));
}
.version-pill {
background: var(--acc);
color: var(--bg);
padding: 2px 10px;
border-radius: 100px;
font-size: 0.75rem;
font-weight: 700;
}
.pdot {
width: 18px; height: 18px;
border-radius: 50%;
border: 2px solid transparent;
cursor: pointer; padding: 0;
transition: transform 0.15s, border-color 0.15s;
}
.pdot:hover { transform: scale(1.2); }
.pdot.on { border-color: var(--txt); transform: scale(1.15); }
.ios {
appearance: none; border: none; position: relative;
width: 38px; height: 22px; border-radius: 999px;
background: var(--line); cursor: pointer; flex: none; padding: 0;
transition: background-color 0.18s;
}
.ios:after {
content: ""; position: absolute; top: 2px; left: 2px;
width: 18px; height: 18px; border-radius: 50%;
background: #fff; box-shadow: 0 1px 3px #00000059;
transition: transform 0.18s;
}
.ios.on { background: var(--acc); }
.ios.on:after { transform: translateX(16px); }
.seg {
display: inline-flex; gap: 4px;
background: var(--soft);
border: 1px solid var(--line);
border-radius: 12px; padding: 4px;
}
.seg button {
border: none; cursor: pointer; border-radius: 9px;
background: transparent; color: var(--mut);
font-family: inherit; font-weight: 600; font-size: 0.85rem;
padding: 8px 16px;
transition: background-color 0.18s, color 0.18s;
}
.seg button:hover:not(.on) { background: color-mix(in srgb, var(--acc) 14%, var(--card)); color: var(--txt); }
.seg button.on { background: var(--acc); color: var(--bg); }
.status-dot {
display: inline-block; width: 9px; height: 9px; border-radius: 50%;
background: var(--ok); margin-right: 7px; box-shadow: 0 0 8px var(--ok);
}
.code-block {
background: color-mix(in srgb, var(--bg) 70%, black);
border: 1px solid var(--line);
border-radius: 12px;
padding: 18px 20px;
overflow-x: auto;
}
[data-theme=light] .code-block { background: #0f1320; }
.code-block code {
font-family: ui-monospace, 'SF Mono', Menlo, monospace;
font-size: 0.82rem;
color: #e8eaed;
white-space: pre;
}
/* built by JS from changelog.json */
.changelog-card .version-badge {
display: inline-block;
background: var(--acc); color: var(--bg);
padding: 3px 11px; border-radius: 7px;
font-size: 0.82rem; font-weight: 700; margin-bottom: 6px;
}
.changelog-card .date { color: var(--mut); font-size: 0.83rem; display: block; margin-bottom: 10px; }
.changelog-card ul { list-style: none; margin: 0; padding: 0; }
.changelog-card li { color: var(--mut); font-size: 0.9rem; padding: 3px 0 3px 16px; position: relative; }
.changelog-card li::before { content: '→'; position: absolute; left: 0; color: var(--acc); }
}