/* ------------------------------------------------------------ faces
   the two faces travel with the page. font-display: block, not swap:
   swap paints a fallback and re-paints when the real face lands, and
   every line on the page visibly re-wraps. these are small files off
   the same origin; the wait is a moment.                            */

/* Лист вывернут 21 августа: светлый грунт, тёмная краска.

   Значения не подобраны на глаз — это прежняя шкала, пересчитанная так,
   чтобы КОНТРАСТ каждой ступени к грунту остался тем же, каким был на
   чёрном. Иерархия страницы поэтому не поехала:
     ink 17.1:1, quiet 5.1:1, подвал 3.0:1, линейки 1.2 и 1.6.

   Грунт #e8e8e8, а не белый: ровно тот же, что видно на index сквозь
   мишень, поэтому переход между листами не мигает.                 */
.p-license {
    --bg:      #e8e8e8;
    --ash-0:   #000000;   /* the ink        */
    --ash-2:   #606060;   /* nav, at rest   */
    --ash-3:   #868686;   /* footer         */
    --rule:    #d2d2d2;   /* hairlines      */
    --rule-lit:#b9b9b9;
    --lit:     var(--ash-0);

    --sys-sans: system-ui, -apple-system, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;

    --sans: "Ronzino", var(--sys-sans);


    --page-pad:    28px;

    /* переход между страницами */
    --slide:       620ms;   /* вся длительность                     */
    --dim:          0.25;   /* до какой яркости гаснет старая        */
    --lift:          18%;   /* насколько старая уходит вверх         */
    --lift-time:     0.6;   /* на какой части хода она трогается     */
    --scale:        0.94;   /* и во сколько ужимается, уходя вглубь   */

    --in:  220ms;  /* arrival */
    --out:  90ms;  /* departure is faster than arrival */

    /* шапка. те же числа, что на index. её высота теперь считается из
       них: плашка плюс два поля, 14 + 9 + 9.                        */
    --mast-size:   11.5px;
    --mast-plate:  14px;
    --mast-padx:   3px;
    --mast-gap:    3px;
    --mast-radius: 2px;
    --mast-slot:   103px;
    --mast-track:  0.012em;
    --mast-inset:  10px;
    --mast-top:    9px;
    --mast-h: calc(var(--mast-plate) + var(--mast-top) * 2);
}

.p-license * { box-sizing: border-box; margin: 0; padding: 0; }

.p-license {
    background: var(--bg);
    color: var(--ash-0);
    font-family: var(--sans);
    font-size: 15px;
    line-height: 1.65;
    -webkit-font-smoothing: antialiased;
    text-rendering: optimizeLegibility;
    display: flex;
    flex-direction: column;
    min-height: 100svh;
}

.p-license ::selection { background: var(--ash-0); color: var(--bg); }

.p-license a {
    color: var(--ash-0);
    text-decoration: none;
    border-bottom: 1px solid var(--rule-lit);
    transition: color var(--out), border-color var(--out);
}
.p-license .page {
    flex: 1;
    display: flex;
    flex-direction: column;
    padding: 0 var(--page-pad);
}

/* ---------------------------------------------------------- masthead

   Те же плашки, что на index: числа с and2es.com, набраны Ronzino.
   Прежняя шапка — плита с `ashen one`, `docs`, именем страницы и датой,
   Commit Mono 13 — лежит в archive/license-2026-08-18.html.

   Имя страницы и дата документа с этой строки сняты.               */

/* ЛИПКАЯ, А НЕ ПРИКОЛОЧЕННАЯ, и это условие налистывания, а не вкус.
   Приколоченная шапка меряется от края ОКНА — но пока лист едет, он
   вынут в position: fixed и двигается transform'ом, а transform делает
   лист началом отсчёта для всего приколоченного внутри. Значит на ходу
   шапка едет с листом, а в кадр, когда ход кончился и transform снят,
   перескакивает к краю окна — прыжок ровно в щель, 11 px. Так это и
   вело себя на docs, пока там не сделали то же самое.              */
.p-license .masthead {
    position: sticky;
    top: 0;
    z-index: 800;
    /* шапка стоит на ПОЛЕ ЛИСТА, а не на поле страницы: в потоке она
       сидит внутри --page-pad и плашки уехали бы внутрь против соседних
       листов. Поле страницы вычитается, дальше работает --mast-inset. */
    margin: 0 calc(var(--page-pad) * -1);
    display: flex;
    align-items: center;
    gap: var(--mast-gap);
    padding: var(--mast-top) var(--mast-inset);
    background: transparent;
}

.p-license .mast-mid {
    position: absolute;
    left: 50%;
    transform: translateX(-50%);
    display: flex;
    gap: var(--mast-gap);
}
.p-license .mast-left  { display: flex; gap: var(--mast-gap); }
.p-license .mast-right { display: flex; gap: var(--mast-gap); margin-left: auto; }

.p-license .pill {
    display: inline-flex;
    align-items: center;
    height: var(--mast-plate);
    padding: 0 var(--mast-padx);
    border: 0;
    border-radius: var(--mast-radius);
    background: #000000;
    color: #e8e8e8;
    font-family: var(--sans);
    font-size: var(--mast-size);
    letter-spacing: var(--mast-track);
    line-height: 1;
    white-space: nowrap;
}
.p-license .mast-mid .pill { width: var(--mast-slot); }

/* ---------------------------------------------------------- canvas
   the licence set the way the manual is set. what stood here before --
   a 44px title, a 140px indent, a 62ch measure and a two-column term
   list -- is whole in archive/license-2026-08-18.html, unedited.

   pulled up by the masthead's whole height, so the island starts at the
   top of the page instead of a row below it. sticky only takes over once
   something scrolls; until then the bar sits where the flow put it, and
   the flow was putting it under the masthead.                        */
/* шапка вернулась в поток и занимает свои --mast-h сама, поэтому
   подпирать её полем больше не надо: поле дало бы её высоту дважды. */
.p-license main {
    flex: 1 1 auto;
    display: flex;
    flex-direction: column;
}

/* ---------------------------------------------------------- the bar
   measured from the CONTENT box, which already starts a gutter in.
   `ashen one` is 71.4 of 13px mono with its 0.01em tracking;
   `untitled  docs` is 63.4 + 28 + 31.7 = 123.1. one gutter of air after
   each, rounded up. the same two numbers the manual carries -- the
   masthead is the same masthead.                                     */
.p-license {
    --clear-l: 100px;
    --clear-r: 152px;
}

.p-license .entry-body {
    /* 43 is the step the manual uses under its bar. the 27.69 on top of
       it is what the sticky row used to occupy before the date moved up
       onto the masthead: its own 14 of margin and its 13.69 of height.
       without it the first line came up to 7.57 under the bar, against
       35.25 on documentation -- measured, not guessed.               */
    padding: calc(43px + 27.69px) 0 120px;
}

/* ---------------------------------------------------------- the text
   the manual's grammar exactly: a quiet label, a blank line, then the
   lines. no bullets, no rules, no term column -- a list is made of its
   rows and nothing else.

   it hangs off --clear-l, the island's own left edge, so the body starts
   where its bar starts.

   RONZINO, and the same argument the manual makes: this is a thing that
   is read rather than scanned. 13px is the island's size -- prose set
   larger than the bar naming it reads as a mistake.                  */
.p-license .doc {
    margin-left: var(--clear-l);
    max-width: 74ch;
    font-size: 13px;
    font-family: var(--sans);
}
.p-license .doc-group + .doc-group { margin-top: 43px; }
/* the label is an h2 and looks like the manual's: same face, same size,
   same ink, weight not touched. the manual can afford a <p> there --
   nobody arrives at it by structure. a licence is a page things are
   looked up in, so the outline stays, and on screen it costs nothing. */
.p-license .doc-label {
    font-size: inherit;
    font-weight: 400;
    color: var(--ash-0);
    margin-bottom: 21px;
}
.p-license .doc p + p { margin-top: 21px; }
.p-license .doc ol,
.p-license .doc ul { list-style: none; }
.p-license .doc li + li { margin-top: 21px; }
/* the step across a list's edge, which nothing was declaring: p+p and
   li+li both took 21 and every junction between a paragraph and a list
   took 0, so the lede and the first term were printed as one block.
   the old two-column list had 28 of air above it and the conversion
   dropped it. same 21 as everywhere else in the group.               */
.p-license .doc p + ol,
.p-license .doc p + ul,
.p-license .doc ol + p,
.p-license .doc ul + p { margin-top: 21px; }
/* an empty field, not an answer. the refund window is not settled and a
   licence page with no refund line reads as though it were.          */
.p-license .quiet { color: var(--ash-2); }

/* ---------------------------------------------------------- footer */
.p-license footer {
    display: flex;
    align-items: baseline;
    justify-content: space-between;
    gap: var(--page-pad);
    flex-wrap: wrap;
    padding: 22px 0 18px;
    font-family: var(--sans);
    font-size: 11px;
    /* серого здесь больше нет: на светлом грунте подвал перестаёт быть
       тише страницы, он просто её последняя строка.               */
    color: #000000;
}

/* ---------------------------------------------------------- narrow */
@media (max-width: 720px) {
    .p-license { --page-pad: 20px; }
    .p-license footer { gap: calc(var(--page-pad) / 4) var(--page-pad); }
}

/* ------------------------------------------------- переход между страниц
   настоящая навигация: адрес меняется, F5 и «назад» работают, каждая
   страница грузит только своё. анимацию играет сам браузер — скрипт не
   нужен. в firefox её не будет, там просто обычный переход.

   старая страница СТОИТ, а не уезжает: без этого браузер разводит их
   крест-накрест и получается подмена, а не налистывание. новая выходит
   снизу и накрывает.                                                 */

/* полоса носит одно имя на всех страницах, поэтому браузер понимает,
   что это один и тот же объект, и оставляет её на месте.            */

/* НОВАЯ идёт снизу. кривая снята с becaneparis: quintEaseOut,
   .22 1 .36 1. первая контрольная точка уже стоит на единице, поэтому
   разгона нет вовсе — страница трогается на полной скорости и всю
   дорогу только гасится. это и есть их подхват: не «поехала», а «уже
   едет» с первого кадра.                                            */

/* СТАРАЯ делает два движения разом, и они не совпадают по времени.
   темнеет она с самого начала и ровно, а вверх трогается только на
   последней части хода — когда новая её уже почти закрыла.

   КРИВАЯ подъёма зеркальна кривой входа, тоже с becaneparis:
   quintEaseIn, .64 0 .78 0. вторая контрольная точка на нуле, значит
   торможения в конце нет — старая трогается с места и разгоняется до
   самого конца, уходя из кадра на полном ходу. пара out/in, вход
   гасится, выход разгоняется, — это их приём, а не наш.             */

/* подъём и ужатие — одно движение и один момент: старая уходит вверх и
   вглубь разом, когда её подхватывает приходящая.                    */
