/* zaodno.com — one sheet, no classes.

   Naming axis `role-hooks`: every hook below is an ARIA role or state the element really
   carries — a banner, two navigations, a search form, lists, a note, a group of actions,
   `aria-current` on the page a reader is on — and the elements inside them. Nothing here
   selects on a class, an id or a data-attribute, so the vocabulary a neighbour could
   intersect is empty.

   Palette `coral-teal`: white paper, near-black ink, and two accents of equal weight —
   teal on what a reader presses, coral on the mark and on what is counted. Type
   `system-sans`, radius `soft`, layout `single-column`. */

:root {
    --ink: #202128;
    --paper: #ffffff;
    --mute: #6b6f76;
    --line: #e6e2dc;
    --soft: #f6f4f0;
    --coral: #f56f61;
    --coral-soft: #fdece9;
    --coral-ink: #9a3428;
    --teal: #176b6b;
    --teal-soft: #e3f0ef;
    --teal-ink: #0f4a4a;
    --sand: #f2c46d;
    --radius: 10px;
    --wrap: 74rem;
    --pad: 1.25rem;
}

* { box-sizing: border-box; }

/* `hidden` means hidden, whatever the element is. The attribute carries the browser's own
   `display: none`, whose specificity is zero, so ANY rule of this sheet that gives an
   element a display outranks it — `form { display: grid }` below did, and the crossing
   page's first card stayed on screen beside the second one after a visitor pressed the
   button. A reader who sees the form still standing presses it again instead of the way
   out, which costs the click this page exists for. */
[hidden] { display: none !important; }

html {
    font: 17px/1.55 system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
    color: var(--ink);
    background: var(--paper);
    -webkit-text-size-adjust: 100%;
}

body { margin: 0; }
a { color: var(--teal); }
img { max-width: 100%; height: auto; display: block; }
h1, h2, h3 { line-height: 1.2; letter-spacing: -0.01em; font-weight: 700; }
h1 { font-size: clamp(1.6rem, 4vw, 2.3rem); margin: 0 0 0.6rem; max-width: 34ch; }
h2 { font-size: 1.3rem; margin: 2.4rem 0 0.8rem; }
p { margin: 0 0 1rem; max-width: 70ch; }
small { font-size: 0.85em; color: var(--mute); }
figure { margin: 0; }
dl { display: grid; grid-template-columns: max-content 1fr; gap: 0.4rem 1.25rem; margin: 0 0 1rem; }
dt { color: var(--mute); }
dd { margin: 0; }

/* ── Header ──────────────────────────────────────────────────────────────────────── */

[role=banner] {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: 0.75rem 1.5rem;
    max-width: var(--wrap);
    margin: 0 auto;
    padding: 1rem var(--pad);
    border-bottom: 1px solid var(--line);
}

[role=banner] > a {
    display: flex;
    align-items: center;
    gap: 0.55rem;
    margin-right: auto;
    color: var(--ink);
    text-decoration: none;
}

/* The header's `details` is transparent on a wide screen: its control is gone and its
   panel is just the row of navigations it wraps. Only the phone block below turns it
   back into an element you can see.

   ⚠️ `display: contents` ON THE `details` ITSELF is what opens it, and that is the whole
   trick. Two sites of this network reached for a burger before and both rejected
   `details` for a reason written into their templates — "a closed `details` hides its
   content itself, and no rule on a descendant reopens it" — and the admin menu shipped
   that very bug (2e8adeb0: `.rail-menu:not([open]) > nav { display: block }` left the
   menu invisible at 2000px). They are right about a DESCENDANT. They are describing a
   `details` that still exists as a box: it is the element that hides its content, so
   taking the element out of the render tree takes the hiding with it. Measured
   2026-09-19 on this page with the `::details-content` rules below cut out entirely —
   the browser a Firefox without that pseudo-element stands in for — all four links
   visible at 1280px.

   The panel gets `display: contents` too, so the two navigations land as flex items of
   the banner exactly as they did before the fold existed. */
[role=banner] > details,
[role=banner] > details > div { display: contents !important; }
[role=banner] > details > summary { display: none; }

/* Belt to that braces, for the browser that keeps a box for the closed panel anyway.
   `::details-content` is the pseudo-element Chrome and Safari expose for it; a browser
   without the pseudo-element ignores these two rules and is carried by the
   `display: contents` above, which was measured to be enough on its own. Neither rule
   is load-bearing alone — that is the point of having both. */
[role=banner] > details::details-content {
    display: contents !important;
    content-visibility: visible !important;
}

[role=banner] [role=navigation] { display: flex; gap: 1.1rem; align-items: center; }
[role=banner] [role=navigation] a { color: var(--ink); text-decoration: none; padding: 0.35rem 0; }
[role=banner] [role=navigation] a:hover { color: var(--teal); }
[role=banner] [role=navigation] a[aria-current=page] { box-shadow: inset 0 -2px 0 var(--coral); }

/* The two service buttons: the last link of the last navigation is the one that leads
   to a new account, and it is the one filled. */
[role=banner] [role=navigation]:last-child a:last-child {
    background: var(--teal);
    color: #fff;
    padding: 0.5rem 1rem;
    border-radius: var(--radius);
}
[role=banner] [role=navigation]:last-child a:last-child:hover { background: var(--teal-ink); color: #fff; }

/* ── Page ────────────────────────────────────────────────────────────────────────── */

main {
    max-width: var(--wrap);
    margin: 0 auto;
    padding: 1.5rem var(--pad) 3rem;
}

/* Breadcrumbs: the first navigation of the page. Plain text, and the rule is written
   with the same specificity as the chip rule below plus a tag, so the chips do not
   dress the crumbs as pills — they did, until a review looked. */
main > nav:first-child ol {
    display: flex;
    flex-wrap: wrap;
    gap: 0.4rem;
    margin: 0 0 1.25rem;
    padding: 0;
    font-size: 0.9rem;
    color: var(--mute);
}
main > nav:first-child li + li::before { content: "/"; margin-right: 0.4rem; color: var(--line); }
main > nav:first-child ol > li > a { display: inline; padding: 0; border-radius: 0; background: none; color: var(--mute); }
main > nav:first-child ol > li > a:hover { background: none; color: var(--teal); }

/* The line of counts under a heading: a paragraph made of bold facts, found by its
   shape rather than by a role — a count is content, not an aside. */
main p:has(> b:first-child) {
    display: flex;
    flex-wrap: wrap;
    gap: 0.4rem 1.25rem;
    color: var(--mute);
}
main p:has(> b:first-child) b { font-weight: 600; color: var(--ink); }
main p:has(> b:first-child) b::before { content: "·"; margin-right: 0.6rem; color: var(--coral); }

/* ── Picker ──────────────────────────────────────────────────────────────────────── */

[role=search] {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(min(11rem, 100%), 1fr));
    gap: 0.75rem;
    align-items: end;
    margin: 1.5rem 0 2.5rem;
    padding: 1rem;
    background: var(--soft);
    border-radius: calc(var(--radius) + 4px);
}
[role=search] label { display: grid; gap: 0.3rem; font-size: 0.85rem; color: var(--mute); }
[role=search] select {
    font: inherit;
    color: var(--ink);
    padding: 0.6rem 0.7rem;
    border: 1px solid var(--line);
    border-radius: var(--radius);
    background: #fff;
}
[role=search] button {
    font: inherit;
    font-weight: 600;
    padding: 0.7rem 1rem;
    border: 0;
    border-radius: var(--radius);
    background: var(--teal);
    color: #fff;
    cursor: pointer;
}
[role=search] button:hover { background: var(--teal-ink); }

/* ── Lists of places and slices: chips ───────────────────────────────────────────── */

[role=list] { list-style: none; margin: 0; padding: 0; }

main [role=list]:has(> li > a) {
    display: flex;
    flex-wrap: wrap;
    gap: 0.5rem;
}
main [role=list] > li > a {
    display: inline-flex;
    align-items: baseline;
    gap: 0.4rem;
    padding: 0.45rem 0.85rem;
    border-radius: 999px;
    background: var(--soft);
    color: var(--ink);
    text-decoration: none;
}
main [role=list] > li > a:hover { background: var(--line); }
main [role=list] > li > a small { color: inherit; opacity: 0.6; }

/* The slices of a place: one row per gender, women first as the zone orders them — the
   women's row in the coral tint, the men's in the teal, so the two halves of the pool
   read as the palette's two accents. The tints are what a chip WEARS; the action colour
   stays teal and the coral never fills a button.

   Keyed on WHOSE row it is, through the heading each list is labelled by, not on where
   the row stands: two cities (Красногорск, Королёв) publish men only, and an order-keyed
   rule dressed their chips in the women's tint. The label is not a style hook — a reader
   hearing two lists of ages needs to know which is which. */
main > nav:not(:first-child) h2 { font-size: 0.95rem; margin: 1rem 0 0.4rem; color: var(--mute); }
main > nav:not(:first-child) ul[aria-labelledby="row-female"] > li > a { background: var(--coral-soft); color: var(--coral-ink); }
main > nav:not(:first-child) ul[aria-labelledby="row-male"] > li > a { background: var(--teal-soft); color: var(--teal-ink); }
main > nav:not(:first-child) ul[aria-labelledby="row-female"] > li > a:hover { background: #fbd9d3; }
main > nav:not(:first-child) ul[aria-labelledby="row-male"] > li > a:hover { background: #cfe3e1; }
main > nav:not(:first-child) a[aria-current=page] { background: var(--ink) !important; color: #fff !important; }
main > nav:not(:first-child) > p { margin-top: 1rem; }

/* ── Listing: blockquote entries ─────────────────────────────────────────────────── */

main [role=list]:has(> li > article) {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(min(21rem, 100%), 1fr));
    gap: 0.9rem;
}
li > article, li > article blockquote { margin: 0; height: 100%; }
li > article a {
    display: grid;
    grid-template-columns: 7rem 1fr;
    grid-template-rows: 1fr auto;
    gap: 0 0.9rem;
    height: 100%;
    padding: 0.7rem;
    border: 1px solid var(--line);
    border-radius: var(--radius);
    background: #fff;
    color: inherit;
    text-decoration: none;
    transition: border-color 0.15s, box-shadow 0.15s;
}
li > article a:hover { border-color: var(--teal); box-shadow: 0 2px 10px rgba(23, 107, 107, 0.12); }
li > article img,
li > article svg[role=img] {
    grid-row: 1 / span 2;
    width: 7rem;
    height: auto;
    aspect-ratio: 3 / 4;
    object-fit: cover;
    border-radius: 6px;
}
/* The quoted line: the person's own sentence, an opening mark in coral before it. */
li > article p {
    grid-column: 2;
    margin: 0;
    padding-left: 1.05rem;
    position: relative;
    font-size: 1rem;
    line-height: 1.4;
    max-width: none;
}
li > article p::before {
    content: "«";
    position: absolute;
    left: 0;
    color: var(--coral);
    font-weight: 700;
}
li > article footer { grid-column: 2; align-self: end; margin-top: 0.6rem; font-size: 0.9rem; color: var(--mute); }
li > article cite { font-style: normal; font-weight: 600; color: var(--ink); }
li > article footer span { display: block; }
/* Метка «видео»: коралл — то, чем этот сайт помечает считанное и фигурное, и та же
   коралловая кавычка стоит у цитаты выше. На заливке `--coral-soft` надпись берёт
   тёмный коралл (`--coral-ink`): светлый на светлом даёт 2.2 к бумаге. Строкой ниже
   места, а не рядом с ним: место бывает длинным, и метка уезжала бы за край. */
li > article footer small {
    display: inline-block;
    margin-top: 0.25rem;
    padding: 0 0.45rem;
    border-radius: 0.35rem;
    background: var(--coral-soft);
    color: var(--coral-ink);
    font-size: 0.78rem;
    line-height: 1.5;
    white-space: nowrap;
}

/* ── Pager ───────────────────────────────────────────────────────────────────────── */

section > nav { display: flex; align-items: center; gap: 1rem; margin-top: 1.5rem; }
a[rel=prev], a[rel=next] {
    padding: 0.5rem 1rem;
    border: 1px solid var(--line);
    border-radius: var(--radius);
    text-decoration: none;
    color: var(--ink);
}
a[rel=prev]:hover, a[rel=next]:hover { border-color: var(--teal); color: var(--teal); }
section > nav span[aria-current=page] { color: var(--mute); }

/* ── Questions ───────────────────────────────────────────────────────────────────── */

details { border-top: 1px solid var(--line); padding: 0.7rem 0; max-width: 70ch; }
details:last-of-type { border-bottom: 1px solid var(--line); }
summary { cursor: pointer; font-weight: 600; }
summary:hover { color: var(--teal); }
details > p { margin: 0.6rem 0 0; }

/* ── Profile ─────────────────────────────────────────────────────────────────────── */

main > article > header { margin-bottom: 1.25rem; }

/* The photo strip: a list the reader swipes, one photo snapping into place at a time. */
main > article [role=list]:has(> li > figure) {
    display: flex;
    gap: 0.5rem;
    overflow-x: auto;
    scroll-snap-type: x mandatory;
    -webkit-overflow-scrolling: touch;
    padding-bottom: 0.25rem;
}
/* The flex items are the list items, not the figures inside them. */
main > article [role=list]:has(> li > figure) > li { flex: 0 0 min(72vw, 22rem); scroll-snap-align: start; }
main > article li > figure img { width: 100%; aspect-ratio: 3 / 4; object-fit: cover; border-radius: var(--radius); }

/* What the person wrote, whole. */
main > article > blockquote {
    margin: 0 0 1.5rem;
    padding: 1rem 1.25rem;
    max-width: 70ch;
    border-left: 4px solid var(--coral);
    background: var(--soft);
    border-radius: 0 var(--radius) var(--radius) 0;
    font-size: 1.08rem;
}
main > article > blockquote p { margin: 0 0 0.5rem; white-space: pre-line; }
main > article > blockquote cite { font-style: normal; color: var(--mute); font-size: 0.9rem; }

/* The actions: the first — writing — is the one a dating site lives on, and it is filled. */
[role=group] { display: flex; flex-wrap: wrap; gap: 0.6rem; }
[role=group] a {
    padding: 0.75rem 1.2rem;
    border: 1.5px solid var(--teal);
    border-radius: var(--radius);
    color: var(--teal);
    text-decoration: none;
    font-weight: 600;
}
[role=group] a:first-child { background: var(--teal); color: #fff; }
[role=group] a:hover { background: var(--teal-ink); border-color: var(--teal-ink); color: #fff; }

/* ── The crossing page ───────────────────────────────────────────────────────────── */

/* A column, so that `order` can put the age tick under the way out while the markup
   keeps it above — see the tick's own rule below. */
main > section:only-child {
    display: flex;
    flex-direction: column;
    max-width: 30rem;
    margin: 2rem auto;
    text-align: center;
}
main > section:only-child > img { margin: 0 auto 1rem; border-radius: var(--radius); }
main > section:only-child h1 { margin: 0 auto 0.5rem; }
main > section:only-child h1 small { display: block; font-size: 0.55em; font-weight: 400; margin-top: 0.3rem; }
main > section:only-child p { margin-left: auto; margin-right: auto; }
main > section:only-child form { display: grid; gap: 0.75rem; margin: 1rem 0; }
main > section:only-child form label { display: grid; gap: 0.3rem; text-align: left; font-size: 0.9rem; color: var(--mute); }
main > section:only-child input[type=email] {
    font: inherit;
    padding: 0.7rem 0.8rem;
    border: 1px solid var(--line);
    border-radius: var(--radius);
}
/* The way out — the form's button, the second card's link, or the plain link under the
   tick — is one filled button; the links inside paragraphs (why we ask, back) stay text. */
main > section:only-child button,
main > section:only-child > a,
main > section:only-child div > a {
    display: block;
    width: 100%;
    font: inherit;
    font-weight: 600;
    padding: 0.85rem 1.2rem;
    border: 0;
    border-radius: var(--radius);
    background: var(--teal);
    color: #fff;
    text-decoration: none;
    cursor: pointer;
}
main > section:only-child > p a { display: inline; width: auto; padding: 0; background: none; color: var(--mute); font-weight: 400; }
main > section:only-child input[type=checkbox] { accent-color: var(--teal); width: 1.1rem; height: 1.1rem; vertical-align: -0.15rem; }

/* The tick and its words on ONE line, left with whatever stands above them. The form is a
   grid and its labels are grids too — the label stacked the words under the box and the
   centred column put the pair in the middle, which read as another step rather than a
   footnote to the button.

   `order` is what puts it BELOW the button it governs while the markup keeps it above:
   the source order is what a keyboard and a screen reader follow, so they meet the
   condition before the control; the visual order is what an eye follows, and there the
   tick belongs under the button as its footnote. One step apart in one group — the only
   distance at which this trade is safe. */
main > section:only-child p:has(input[type=checkbox]) {
    order: 2;
    display: flex;
    align-items: center;
    gap: 0.5rem;
    margin: 0.6rem 0 0;
    text-align: left;
    font-size: 0.9rem;
    color: var(--mute);
}
/* Three ranks, so the eye reads: what is ahead, the button, the age as its footnote, the
   way back. The way out is named INSIDE the `~ *` rule rather than in one of its own —
   `:has()` makes that selector specific enough to win any plainer one, and a duel of
   specificities is how this rule silently did nothing the first time. */
main > section:only-child > p:has(input[type=checkbox]) ~ a,
main > section:only-child form > p:has(input[type=checkbox]) ~ button { order: 1; }
main > section:only-child > p:has(input[type=checkbox]) ~ :not(a),
main > section:only-child form > p:has(input[type=checkbox]) ~ :not(button) { order: 3; }
main > section:only-child p:has(input[type=checkbox]) label { display: inline; font-size: inherit; }
main > section:only-child p:has(input[type=checkbox]) small { margin-left: auto; }

/* Unticked, whatever leads out greys. Read down from the common parent rather than
   forward from the tick — `:has()` on the section for the crossing's link, on the form
   for the entry's button and the second card it reveals — because `order` moves the tick
   on screen and a sibling selector would then depend on where it happens to sit.

   A browser without `:has()` drops the whole rule and the button stays live. That is the
   safe side and the honest one: the tick is a statement the reader makes, not a lock
   (`/tolko-vzroslym` says so), and a lock a page cannot enforce is theatre. */
main > section:only-child:has(p > input[type=checkbox]:not(:checked)) > a,
main > section:only-child:has(p > input[type=checkbox]:not(:checked)) > div a,
main > section:only-child form:has(input[type=checkbox]:not(:checked)) button,
main > section:only-child form:has(input[type=checkbox]:not(:checked)) ~ div a { opacity: 0.35; pointer-events: none; }

/* ── Footer ──────────────────────────────────────────────────────────────────────── */

[role=contentinfo] {
    display: flex;
    flex-wrap: wrap;
    justify-content: space-between;
    gap: 0.5rem 1.5rem;
    max-width: var(--wrap);
    margin: 0 auto;
    padding: 1.25rem var(--pad) 2rem;
    border-top: 1px solid var(--line);
    font-size: 0.9rem;
    color: var(--mute);
}
[role=contentinfo] [role=navigation] { display: flex; flex-wrap: wrap; gap: 1rem; }
[role=contentinfo] a { color: var(--mute); }
[role=contentinfo] a:hover { color: var(--teal); }
[role=contentinfo] [role=note] { margin: 0; }

/* ── Phone ───────────────────────────────────────────────────────────────────────── */

/* ⚠️ The width is in `em`, not px, and that is what makes the fold do its job. An `em`
   here is the reader's own font size, so the query asks "is there room for this header's
   TEXT" rather than "is this a phone". Measured 2026-09-19 at 760px, a tablet width well
   above any px threshold that reads as phone-sized: at the default 17px the header is one
   row 87px tall, and at 26px — a reader running 150% text — it breaks into two rows 197px
   tall, which is the exact defect the fold was built to remove. In `em` that same reader
   crosses the threshold and gets the burger, while a reader at the default size on the
   same screen keeps the full row.
   ⚠️ The divisor is the BROWSER's font size, not this sheet's. `em` in a media query is
   resolved against the initial font — 16px in every browser's defaults — and `html
   { font: 17px }` below does not enter into it. Written as 640/17 = 37.6em first, which
   put the threshold at 601.6px and left 602–640px with neither the burger nor room for
   the row: measured at 620px, the header came back two rows tall (143px). 40em is the
   640px it was meant to be, so nothing changes for a reader who changed nothing. */
@media (max-width: 40em) {
    :root { --pad: 1rem; }
    /* One row, and it stays one row: the wordmark keeps the space left over, the
       control sits at the end. `nowrap` because the header wrapped to two lines before
       the fold existed, which is the whole reason for it. */
    [role=banner] { gap: 0.6rem 1rem; flex-wrap: nowrap; }

    /* The fold becomes a real element again — a positioning context for the panel it
       drops, and the control's own box. */
    [role=banner] > details { display: block !important; position: relative; }

    /* And the fold starts folding again: the wide-screen rules above force the panel
       open regardless of state, so the phone has to hand that state back. Closed, the
       panel is gone; open, it is the dropdown styled below. */
    [role=banner] > details::details-content {
        display: block !important;
        content-visibility: hidden !important;
    }
    [role=banner] > details[open]::details-content { content-visibility: visible !important; }
    [role=banner] > details:not([open]) > div { display: none !important; }

    [role=banner] > details > summary {
        display: flex;
        align-items: center;
        padding: 0.4rem;
        margin: -0.4rem;
        color: var(--ink);
        cursor: pointer;
        /* The disclosure triangle is a second mark next to three bars that already say
           the same thing. Both properties are needed: WebKit draws it through its own
           pseudo-element and ignores `list-style`. */
        list-style: none;
    }
    [role=banner] > details > summary::-webkit-details-marker { display: none; }

    /* Hangs under the header rather than pushing it down: a panel that moves the page
       shifts whatever the reader was about to tap. */
    [role=banner] > details[open] > div {
        display: flex !important;
        position: absolute;
        top: calc(100% + 0.9rem);
        right: 0;
        z-index: 2;
        flex-direction: column;
        align-items: flex-start;
        gap: 0.9rem;
        min-width: 11rem;
        padding: 1rem 1.1rem;
        background: var(--paper);
        border: 1px solid var(--line);
        border-radius: var(--radius);
        box-shadow: 0 10px 28px rgb(0 0 0 / 12%);
    }

    /* Inside the panel the two navigations stack, and so do the links within each. */
    [role=banner] > details > div [role=navigation] {
        flex-direction: column;
        align-items: flex-start;
        gap: 0.9rem;
    }

    /* The filled button keeps its fill but stops being a button-sized target squeezed
       into a column of plain links. */
    [role=banner] > details > div [role=navigation]:last-child a:last-child {
        align-self: stretch;
        text-align: center;
    }

    [role=banner] [role=navigation] { gap: 0.8rem; }
    li > article a { grid-template-columns: 5.5rem 1fr; }
    li > article img, li > article svg[role=img] { width: 5.5rem; }
    li > article p { font-size: 0.95rem; }
    [role=contentinfo] { flex-direction: column; }
}
