Files
protokeyandClaude Opus 5.5 f7d0f27faa refactor: every project landing has its own theme
- landing.css is layout only and uses tokens (colors, fonts, hero, nav)
- palettes live in css/landing-<theme>.css; Robotex gets its own dark
  theme, MyPointVPN sets the same tokens
- theme defaults to the project folder name; the build fails if the
  theme file is missing, so a landing can't ship without styles

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-13 21:17:17 +04:00

134 lines
6.1 KiB
CSS
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/* Project landing pages (layouts/projects/single.html). Standalone, no theme CSS. */
/*
Layout only. Every landing has its own theme, css/landing-<theme>.css, which sets
these tokens on .theme-<theme> (and may restyle anything else):
--bg, --bg-alt, --surface, --surface-hover, --border, --text, --muted,
--accent, --accent-strong, --accent-soft (tinted fill), --accent-line (tinted border),
--on-accent, --code-bg, --code-text, --nav-bg, --hero-bg, --radius, --font, --font-mono.
*/
* { box-sizing: border-box; }
html { scroll-behavior: smooth; }
body {
margin: 0;
background: var(--bg);
color: var(--text);
font: 400 1rem/1.6 var(--font);
-webkit-font-smoothing: antialiased;
}
a { color: var(--accent); }
code, pre { font-family: var(--font-mono); }
h1, h2, h3 { letter-spacing: -.02em; line-height: 1.15; margin: 0; }
h2 { font-size: clamp(1.6rem, 3vw, 2.2rem); font-weight: 800; }
h3 { font-size: 1.05rem; font-weight: 600; }
.wrap { width: min(100% - 2rem, 1040px); margin-inline: auto; }
/* nav */
.nav {
position: sticky; top: 0; z-index: 10;
background: var(--nav-bg);
backdrop-filter: blur(10px);
border-bottom: 1px solid var(--border);
}
.nav__row { display: flex; align-items: center; justify-content: space-between; gap: 1rem; height: 3.5rem; }
.nav__logo { font-weight: 800; font-size: 1.15rem; color: var(--text); text-decoration: none; }
.nav__links { display: flex; align-items: center; gap: 1.25rem; }
.nav__links a { color: var(--muted); text-decoration: none; font-size: .9rem; }
.nav__links a:hover { color: var(--text); }
.nav__lang { padding: .15rem .5rem; border: 1px solid var(--border); border-radius: .4rem; }
@media (max-width: 640px) {
.nav__links a:not(.nav__lang) { display: none; }
}
/* hero */
.hero {
padding: clamp(4rem, 12vw, 7.5rem) 0 clamp(3rem, 8vw, 5rem);
background: var(--hero-bg);
text-align: center;
}
.badge {
display: inline-block; margin: 0 0 1.25rem; padding: .3rem .8rem;
border: 1px solid var(--accent-line); border-radius: 999px;
color: var(--accent); font-size: .85rem; font-weight: 600;
}
.hero__title { font-size: clamp(2.2rem, 6vw, 3.6rem); font-weight: 800; max-width: 18ch; margin-inline: auto; }
.hero__lead { max-width: 40rem; margin: 1.25rem auto 0; color: var(--muted); font-size: 1.15rem; }
.hero__cta { display: flex; flex-wrap: wrap; justify-content: center; gap: .75rem; margin-top: 2rem; }
.btn {
display: inline-block; padding: .75rem 1.4rem; border-radius: .7rem;
border: 1px solid var(--border); background: var(--surface);
color: var(--text); font-weight: 600; text-decoration: none;
transition: background .15s, transform .15s;
}
.btn:hover { background: var(--surface-hover); transform: translateY(-1px); }
.btn--primary { background: var(--accent-strong); border-color: var(--accent-strong); color: var(--on-accent); }
.btn--primary:hover { background: var(--accent); }
/* sections */
.section { padding: clamp(3rem, 8vw, 5rem) 0; scroll-margin-top: 3.5rem; }
.section--alt { background: var(--bg-alt); border-block: 1px solid var(--border); }
.section__lead { color: var(--muted); max-width: 44rem; margin: .75rem 0 0; font-size: 1.05rem; }
.problems { margin: 1.5rem 0; padding: 0; list-style: none; display: grid; gap: .6rem; counter-reset: p; }
.problems li {
counter-increment: p; display: flex; gap: .9rem; align-items: center;
padding: .8rem 1rem; border: 1px solid var(--border); border-radius: var(--radius); background: var(--surface);
}
.problems li::before {
content: counter(p); flex: none; display: grid; place-items: center;
width: 1.8rem; height: 1.8rem; border-radius: 50%;
background: var(--accent-soft); color: var(--accent); font-weight: 600; font-size: .9rem;
}
.grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(18rem, 1fr)); gap: 1rem; margin-top: 2rem; }
.grid--4 { grid-template-columns: repeat(auto-fit, minmax(13rem, 1fr)); }
.card { padding: 1.25rem; border: 1px solid var(--border); border-radius: var(--radius); background: var(--surface); }
.card p { margin: .5rem 0 0; color: var(--muted); font-size: .95rem; }
.card code { font-size: .85em; color: var(--text); }
.card--link { text-decoration: none; color: var(--text); transition: border-color .15s, transform .15s; }
.card--link:hover { border-color: var(--accent-line); transform: translateY(-2px); }
.card--link h3 { color: var(--accent); }
.steps { margin: 1.5rem 0 0; padding-left: 1.25rem; display: grid; gap: .4rem; }
.steps code { font-size: .9em; }
.code { display: grid; gap: 1rem; margin-top: 2rem; }
.code figure { margin: 0; min-width: 0; }
.code figcaption { color: var(--muted); font-size: .85rem; margin-bottom: .4rem; }
.code pre {
margin: 0; padding: 1rem; overflow-x: auto;
background: var(--code-bg); border: 1px solid var(--border); border-radius: var(--radius);
font-size: .82rem; line-height: 1.5; color: var(--code-text); tab-size: 2;
}
.limits { margin: 1.5rem 0 0; padding-left: 1.25rem; display: grid; gap: .5rem; color: var(--muted); }
.limits strong { color: var(--text); }
/* footer */
.footer { padding: 2rem 0; border-top: 1px solid var(--border); color: var(--muted); font-size: .9rem; }
.footer__row { display: flex; flex-wrap: wrap; justify-content: space-between; gap: .5rem 2rem; }
.footer p { margin: 0; }
/* under the hood (optional "engine" section) */
.engine__kicker {
margin: 0 0 .5rem; color: var(--accent);
font: 600 .8rem/1 var(--font-mono); text-transform: uppercase; letter-spacing: .12em;
}
.engine__list {
list-style: none; margin: 2rem 0 0; padding: 0;
display: grid; grid-template-columns: repeat(auto-fit, minmax(19rem, 1fr)); gap: .75rem 2rem;
}
.engine__list li { position: relative; padding-left: 1.4rem; color: var(--muted); }
.engine__list li::before { content: "›"; position: absolute; left: 0; color: var(--accent); font-weight: 800; }
.engine__list strong { color: var(--text); }
.engine__callout {
margin-top: 2.5rem; padding: 1.25rem 1.5rem;
border: 1px solid var(--accent-line); border-radius: var(--radius);
background: var(--accent-soft);
}
.engine__callout h3 { color: var(--accent); font-size: 1.1rem; }
.engine__callout p { margin: .5rem 0 0; color: var(--muted); }