Files
alex 8fe0e72664
Pull request / build (pull_request) Successful in 45s
added link for downloading app
2026-09-04 10:00:36 +05:00

416 lines
15 KiB
CSS

/* ---------------------------------------------------------------- palette */
:root,
:root[data-theme="light"] {
color-scheme: light dark;
--bg: #fbfbfd;
--surface: #ffffff;
--surface-2: #f3f3f7;
--line: #e5e5ec;
--text: #15151a;
--muted: #5c5c6a;
--accent: #0060b0;
--accent-bg: rgba(0, 96, 176, .09);
--shadow: 0 1px 2px rgba(18, 18, 28, .05), 0 14px 40px rgba(18, 18, 28, .07);
--shadow-sm: 0 1px 2px rgba(18, 18, 28, .06), 0 4px 12px rgba(18, 18, 28, .05);
--chip-bg: #202020;
--chip-fg: #ffffff;
--radius: 14px;
--maxw: 1060px;
--bar-h: 62px;
/* The air above and below a section. The anchor arithmetic subtracts it,
so the two have to come from one place */
--section-pad: clamp(56px, 8vw, 96px);
--font: "Segoe UI Variable Display", "Segoe UI", system-ui, -apple-system,
"Helvetica Neue", Arial, sans-serif;
}
@media (prefers-color-scheme: dark) {
:root:not([data-theme="light"]) {
--bg: #0d0d10;
--surface: #151519;
--surface-2: #1c1c22;
--line: #272730;
--text: #f1f1f4;
--muted: #9d9dab;
--accent: #62c8ff;
--accent-bg: rgba(98, 200, 255, .12);
--shadow: 0 1px 2px rgba(0, 0, 0, .4), 0 18px 44px rgba(0, 0, 0, .45);
--shadow-sm: 0 1px 2px rgba(0, 0, 0, .35), 0 6px 16px rgba(0, 0, 0, .35);
}
}
:root[data-theme="dark"] {
--bg: #0d0d10;
--surface: #151519;
--surface-2: #1c1c22;
--line: #272730;
--text: #f1f1f4;
--muted: #9d9dab;
--accent: #62c8ff;
--accent-bg: rgba(98, 200, 255, .12);
--shadow: 0 1px 2px rgba(0, 0, 0, .4), 0 18px 44px rgba(0, 0, 0, .45);
--shadow-sm: 0 1px 2px rgba(0, 0, 0, .35), 0 6px 16px rgba(0, 0, 0, .35);
}
/* ------------------------------------------------------- the two languages */
html[data-lang="en"] [lang="ru"],
html[data-lang="ru"] [lang="en"] { display: none !important; }
/* ------------------------------------------------------------------- base */
* { box-sizing: border-box; }
html { scroll-behavior: smooth; }
body {
margin: 0;
background: var(--bg);
color: var(--text);
font-family: var(--font);
font-size: 17px;
line-height: 1.62;
-webkit-font-smoothing: antialiased;
overflow-x: clip;
}
h1, h2, h3 { line-height: 1.16; letter-spacing: -.021em; margin: 0; font-weight: 700; }
h1 { font-size: clamp(2.1rem, 5.4vw, 3.35rem); }
h2 { font-size: clamp(2rem, 4vw, 2.75rem); }
h3 { font-size: 1.2rem; letter-spacing: -.014em; }
p { margin: 0; }
a { color: var(--accent); text-decoration-thickness: 1px; text-underline-offset: 3px; }
:focus-visible { outline: 2px solid var(--accent); outline-offset: 3px; border-radius: 4px; }
.wrap { width: 100%; max-width: var(--maxw); margin-inline: auto; padding-inline: 24px; }
.muted { color: var(--muted); }
.skip {
position: absolute; left: -9999px; top: 0;
background: var(--surface); color: var(--text);
padding: 10px 16px; border-radius: 8px; z-index: 10;
}
.skip:focus { left: 12px; top: 12px; }
/* ----------------------------------------------------------------- header */
header {
position: sticky; top: 0; z-index: 5;
background: var(--bg);
background: color-mix(in srgb, var(--bg) 86%, transparent);
-webkit-backdrop-filter: saturate(160%) blur(12px);
backdrop-filter: saturate(160%) blur(12px);
border-bottom: 1px solid transparent;
transition: border-color .2s ease;
}
header.scrolled { border-bottom-color: var(--line); }
.bar { display: flex; align-items: center; gap: 18px; height: var(--bar-h); }
.brand { display: flex; align-items: center; gap: 11px; font-weight: 650; letter-spacing: -.015em; }
.brand svg { display: block; border-radius: 7px; }
nav.links { display: flex; gap: 22px; margin-left: auto; font-size: .94rem; }
nav.links a { color: var(--muted); text-decoration: none; }
nav.links a:hover { color: var(--text); }
.controls { display: flex; align-items: center; gap: 8px; margin-left: auto; }
nav.links + .controls { margin-left: 0; }
.seg {
display: inline-flex; padding: 2px; gap: 2px;
background: var(--surface-2); border: 1px solid var(--line); border-radius: 9px;
}
.seg button {
font: inherit; font-size: .82rem; font-weight: 600; letter-spacing: .02em;
padding: 4px 10px; border: 0; border-radius: 7px;
background: transparent; color: var(--muted); cursor: pointer;
}
.seg button[aria-pressed="true"] { background: var(--surface); color: var(--text); box-shadow: var(--shadow-sm); }
.icon-btn {
display: grid; place-items: center; width: 34px; height: 34px;
border: 1px solid var(--line); border-radius: 9px;
background: var(--surface-2); color: var(--muted); cursor: pointer;
}
.icon-btn:hover { color: var(--text); }
.icon-btn svg { width: 17px; height: 17px; }
#menuBtn { display: none; }
#menuBtn .cross { display: none; }
header[data-menu="open"] #menuBtn .bars { display: none; }
header[data-menu="open"] #menuBtn .cross { display: block; }
.icon-btn .sun { display: none; }
.icon-btn .moon { display: block; }
@media (prefers-color-scheme: dark) {
:root:not([data-theme="light"]) .icon-btn .sun { display: block; }
:root:not([data-theme="light"]) .icon-btn .moon { display: none; }
}
:root[data-theme="dark"] .icon-btn .sun { display: block; }
:root[data-theme="dark"] .icon-btn .moon { display: none; }
.scrim {
display: none;
position: fixed; top: var(--bar-h); left: 0; right: 0; bottom: 0;
background: rgba(0, 0, 0, .5); z-index: 4;
}
/* --------------------------------------------------------------- sections */
section { padding-block: var(--section-pad); }
section + section { border-top: 1px solid var(--line); }
/* An anchor should show as much of the section as the window holds. Landing on
the top of its box would spend the whole top padding on empty space under
the bar and push the tail off the screen, so the padding is taken out of
the offset and the heading arrives a small gap below the bar */
section { scroll-margin-top: calc(var(--bar-h) + 16px - var(--section-pad)); }
.lede { color: var(--muted); font-size: 1.06rem; margin-top: 14px; }
/* The line under the name of a section: what the section says, in one sentence.
Larger than the text it stands over, smaller than the name above it */
.deck {
margin-top: 12px;
font-size: clamp(1.3rem, 2.3vw, 1.65rem);
font-weight: 600; line-height: 1.28; letter-spacing: -.016em;
}
/* ------------------------------------------------------------------- hero */
.hero { padding-top: clamp(40px, 6vw, 72px); padding-bottom: clamp(48px, 6vw, 80px); }
/* No width cap: both headings are written to stand in one line, and they hold
it down to a window of about 600 px. Narrower than that they wrap, and
`balance` splits them evenly rather than leaving one word below */
.hero h1 { text-wrap: balance; }
.hero .lede { font-size: 1.14rem; }
.cta { display: flex; flex-wrap: wrap; align-items: center; gap: 14px; margin-top: 30px; }
.btn {
display: inline-flex; align-items: center; gap: 10px;
font: inherit; font-size: .97rem; font-weight: 600;
padding: 12px 20px; border-radius: 11px; border: 1px solid transparent;
text-decoration: none; cursor: pointer;
background: var(--text); color: var(--bg);
}
.btn:hover { opacity: .88; }
.btn svg { width: 18px; height: 18px; }
.btn.ghost { background: transparent; color: var(--text); border-color: var(--line); }
.btn.ghost:hover { background: var(--surface-2); opacity: 1; }
.btn.block { width: 100%; justify-content: center; }
.facts {
display: flex; flex-wrap: wrap; gap: 8px 20px;
margin-top: 26px; font-size: .89rem; color: var(--muted);
}
.facts span { display: inline-flex; align-items: center; gap: 8px; }
.facts span::before {
content: ""; width: 4px; height: 4px; border-radius: 50%;
background: currentColor; opacity: .5;
}
/* ------------------------------------------------------- the typing demo */
.stage { margin: clamp(36px, 5vw, 58px) 0 0; }
.window {
background: var(--surface); border: 1px solid var(--line);
border-radius: var(--radius); box-shadow: var(--shadow); overflow: hidden;
}
.titlebar {
display: flex; align-items: center; gap: 10px;
padding: 9px 14px; border-bottom: 1px solid var(--line);
background: var(--surface-2); font-size: .8rem; color: var(--muted);
}
.titlebar .dots { display: flex; gap: 6px; }
.titlebar .dots i { width: 9px; height: 9px; border-radius: 50%; background: var(--line); }
.titlebar .name { font-weight: 600; }
.screen { position: relative; padding: 30px clamp(18px, 4vw, 40px) 0; min-height: 210px; }
.msg {
max-width: 60ch; margin-bottom: 14px; padding: 10px 14px;
border-radius: 12px; background: var(--surface-2);
font-size: 1rem; color: var(--muted);
}
.field {
display: flex; align-items: center; min-height: 46px;
margin-bottom: 26px; padding: 8px 14px;
border: 1px solid var(--line); border-radius: 11px; background: var(--surface);
font-size: 1rem;
}
.typed { white-space: pre-wrap; }
.caret {
position: relative; display: inline-block;
width: 1.5px; height: 1.25em; margin-left: 1px;
background: var(--text); vertical-align: text-bottom;
animation: blink 1.06s steps(1, end) infinite;
}
@keyframes blink { 0%, 55% { opacity: 1; } 56%, 100% { opacity: 0; } }
.chip {
position: absolute; top: 50%; transform: translateY(-50%);
display: inline-block; padding: .18em .5em;
border-radius: .28em; background: var(--chip-bg); color: var(--chip-fg);
font-family: var(--font); font-size: 20px; font-weight: 600; line-height: 1.25;
letter-spacing: .01em; white-space: nowrap; opacity: .9;
pointer-events: none; user-select: none;
box-shadow: 0 2px 12px rgba(0, 0, 0, .3);
}
.chip[hidden] { display: none; }
.chip.right { left: 100%; margin-left: 10px; }
.chip.left { right: 100%; margin-right: 10px; }
.chip.fade { transition: opacity .12s linear; }
.chip.fade.out { opacity: 0 !important; }
.taskbar {
display: flex; align-items: center; justify-content: flex-end; gap: 16px;
margin-top: 18px; padding: 7px clamp(18px, 4vw, 40px);
border-top: 1px solid var(--line); background: var(--surface-2);
font-size: .74rem; color: var(--muted);
}
.taskbar .ind { padding: 2px 6px; border-radius: 4px; background: var(--bg); font-weight: 600; }
/* ------------------------------------------------------------------ cards */
.cards {
display: grid; gap: 18px; margin-top: 40px;
grid-template-columns: repeat(auto-fit, minmax(260px, 1fr));
}
.card {
padding: 22px; border: 1px solid var(--line); border-radius: var(--radius);
background: var(--surface); box-shadow: var(--shadow-sm);
}
.card h3 { margin-bottom: 8px; }
.card p { font-size: .96rem; color: var(--muted); }
.card figure { margin: 0 0 18px; }
.card svg { display: block; width: 100%; height: auto; }
.sketch .frame { fill: var(--surface-2); stroke: var(--line); }
.sketch .line { stroke: var(--line); stroke-linecap: round; }
.sketch .ink { fill: var(--muted); }
.sketch .mark { fill: var(--text); }
.sketch .plate { fill: var(--accent); }
.sketch .glyph { fill: var(--bg); font: 700 9px var(--font); }
.sketch .ghost { fill: var(--line); }
.aside {
margin-top: 20px; padding: 18px 20px;
border: 1px solid var(--line); border-left: 3px solid var(--accent);
border-radius: 10px; background: var(--surface);
font-size: .95rem; color: var(--muted);
}
.aside b { color: var(--text); font-weight: 600; }
/* ----------------------------------------------------- the live preview */
.playground {
display: grid; gap: 24px; margin-top: 26px;
grid-template-columns: minmax(0, 300px) minmax(0, 1fr);
align-items: stretch;
}
@media (max-width: 760px) { .playground { grid-template-columns: 1fr; } }
.panel {
padding: 20px; border: 1px solid var(--line); border-radius: var(--radius);
background: var(--surface); box-shadow: var(--shadow-sm);
}
.panel h3 { font-size: .82rem; letter-spacing: .08em; text-transform: uppercase; color: var(--muted); margin-bottom: 16px; }
.row { display: grid; gap: 6px; margin-bottom: 13px; }
.row:last-child, .row.tight { margin-bottom: 0; }
.row > label,
.row > .lbl { font-size: .89rem; display: flex; justify-content: space-between; gap: 12px; }
.row .val { color: var(--muted); font-variant-numeric: tabular-nums; font-size: .85rem; }
input[type="range"] { width: 100%; accent-color: var(--accent); }
input[type="color"] {
width: 100%; height: 32px; padding: 2px;
border: 1px solid var(--line); border-radius: 8px;
background: var(--surface-2); cursor: pointer;
}
.pair { display: grid; grid-template-columns: 1fr 1fr; gap: 12px; }
.preview-stage {
position: relative; display: grid; place-items: center;
min-height: 260px; padding: 28px;
border: 1px solid var(--line); border-radius: var(--radius);
background:
radial-gradient(circle at 1px 1px, var(--line) 1px, transparent 0) 0 0 / 22px 22px,
var(--surface);
}
.preview-line {
display: inline-block;
padding: 12px 16px; border-radius: 11px;
background: var(--surface); border: 1px solid var(--line); box-shadow: var(--shadow-sm);
font-size: 1rem; max-width: 100%;
}
/* --------------------------------------------------------------- bullets */
.bullets { display: grid; gap: 14px; margin: 32px 0 0; padding: 0; list-style: none; }
.bullets li { display: grid; grid-template-columns: 22px 1fr; gap: 12px; color: var(--muted); font-size: .99rem; }
.bullets li b { color: var(--text); font-weight: 600; }
.bullets svg { width: 18px; height: 18px; margin-top: 4px; color: var(--accent); }
/* Four short notes side by side rather than one long ladder down half the page */
.bullets.two-up { grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 22px 44px; }
/* --------------------------------------------------------------- privacy */
#privacy .panel { margin-top: 30px; }
#privacy .bullets { margin-top: 0; }
.stamp { margin-top: 22px; font-size: .86rem; color: var(--muted); }
/* ---------------------------------------------------------------- footer */
footer { border-top: 1px solid var(--line); padding-block: 34px; color: var(--muted); font-size: .9rem; }
.footrow { display: flex; flex-wrap: wrap; align-items: center; gap: 14px 26px; }
.footrow nav { display: flex; flex-wrap: wrap; gap: 20px; margin-left: auto; }
.footrow a { color: var(--muted); text-decoration: none; }
.footrow a:hover { color: var(--text); text-decoration: underline; }
.support { margin-top: 26px; color: var(--muted); font-size: .95rem; }
@media (max-width: 900px) {
.bullets.two-up { grid-template-columns: 1fr; }
#menuBtn { display: grid; }
nav.links + .controls { margin-left: auto; }
nav.links {
position: absolute; top: 100%; left: 0; right: 0;
display: none; flex-direction: column; gap: 0;
padding: 6px 24px 12px;
background: var(--surface-2);
border-bottom: 1px solid var(--line);
box-shadow: var(--shadow);
}
header[data-menu="open"] nav.links { display: flex; }
header[data-menu="open"] ~ .scrim { display: block; }
nav.links a { padding: 12px 0; color: var(--text); font-size: 1rem; }
nav.links a + a { border-top: 1px solid var(--line); }
.field { padding-right: 62px; }
#demoChip { font-size: 17px; }
}
@media (prefers-reduced-motion: reduce) {
html { scroll-behavior: auto; }
.caret { animation: none; }
* { transition-duration: .01ms !important; }
}