/* «Досрок» — компоненты (.ds-*). Направление «Регистрационный журнал».
   Классы читают только токены. Разметка компонентов неизменна — меняется
   кожа. Отклик мгновенный: вход в наведение без задержки, выход 70мс.
   Бланки (исчисление, норма, оттиск) — острые углы и PT Serif:
   «документ, лежащий внутри инструмента». Структуру несут линейки,
   тени — только у всплывающих слоёв и при наведении. */

/* ---- Кнопки ---- */
.ds-btn{display:inline-flex;align-items:center;justify-content:center;gap:var(--sp-15);height:var(--ctl-h);padding:0 var(--sp-3);border:1px solid transparent;border-radius:var(--r-s);background:var(--accent);color:var(--on-accent);font-size:var(--fs-md);font-weight:500;line-height:var(--lh-ui);white-space:nowrap;cursor:pointer;box-shadow:var(--edge-key);transition:background var(--dur-1) var(--ease-out),box-shadow var(--dur-1) var(--ease-out),transform var(--dur-1) var(--ease-out)}
.ds-btn:hover{background:var(--accent-deep);text-decoration:none;color:var(--on-accent)}
.ds-btn:active{transform:translateY(0.5px);box-shadow:none}
.ds-btn:disabled{opacity:0.5;cursor:default;transform:none}
.ds-btn svg{width:16px;height:16px;flex:none}
.ds-btn-quiet{background:var(--surface);color:var(--ink);border-color:var(--line-control);box-shadow:none}
.ds-btn-quiet:hover{background:var(--surface-dim);border-color:var(--ink-3);color:var(--ink)}
.ds-btn-quiet:active{transform:translateY(0.5px)}
.ds-btn-danger{background:var(--danger);color:var(--danger-label)}
.ds-btn-danger:hover{background:var(--danger-deep);color:var(--danger-label)}
.ds-btn-ghost{background:transparent;color:var(--accent);box-shadow:none}
.ds-btn-ghost:hover{background:var(--accent-wash);color:var(--accent-deep)}
.ds-btn-sm{height:var(--ctl-h-sm);padding:0 var(--sp-25);font-size:var(--fs-sm)}
.ds-btn-lg{height:var(--ctl-h-input);padding:0 var(--sp-4);font-size:var(--fs-body)}
.ds-btn .ds-kbd{margin-left:var(--sp-1)}
.ds-btn-caption{margin-top:var(--sp-15);font-size:var(--fs-xs);color:var(--ink-3)}
/* Занято: повторное нажатие не проходит, курсор говорит о работе */
.ds-btn.is-busy,.ds-btn[aria-busy='true']{opacity:0.65;cursor:progress;pointer-events:none}
.ds-iconbtn{display:inline-flex;align-items:center;justify-content:center;width:var(--ctl-h-icon);height:var(--ctl-h-icon);border:1px solid transparent;border-radius:var(--r-s);background:transparent;color:var(--ink-3);cursor:pointer;transition:background var(--dur-1) var(--ease-out),color var(--dur-1) var(--ease-out)}
.ds-iconbtn:hover{background:var(--surface-sunken);color:var(--ink)}
.ds-iconbtn:active{transform:translateY(0.5px)}
.ds-iconbtn svg{width:16px;height:16px}
.ds-iconbtn-outline{border-color:var(--line-control);background:var(--surface)}

/* ---- Клавиатура ---- */
.ds-kbd{display:inline-flex;align-items:center;justify-content:center;min-width:1.125rem;height:1.125rem;padding:0 var(--sp-1);border:1px solid var(--line-strong);border-bottom-width:2px;border-radius:var(--r-xs);background:var(--surface);color:var(--ink-2);font-family:var(--font-mono);font-size:var(--fs-2xs);line-height:1}
.ds-kbd-row{display:inline-flex;gap:3px;align-items:center}

/* ---- Статусы-штампы и счётчики ----
   Тревогу несёт только «Просрочен» (сургуч + заливка). Остальные —
   рамочные штампы: янтарь требует внимания, зелёный подтверждает,
   серый — нейтрален. Один факт кодируется один раз. */
.ds-status{display:inline-flex;align-items:center;gap:var(--sp-1);padding:1px var(--sp-15);border:1px solid;border-radius:var(--r-xs);font-size:var(--fs-2xs);font-weight:600;letter-spacing:var(--ls-caps);text-transform:uppercase;line-height:var(--lh-ui);white-space:nowrap}
.ds-status-waiting{border-color:var(--warn);color:var(--warn);background:transparent}
.ds-status-confirmed{border-color:var(--ok);color:var(--ok);background:transparent}
.ds-status-done{border-color:var(--line-strong);color:var(--ink-3);background:transparent}
.ds-status-overdue{border-color:var(--danger);color:var(--danger);background:var(--danger-wash)}
.ds-status-neutral{border-color:var(--line-strong);color:var(--ink-2);background:transparent}
.ds-count{display:inline-flex;align-items:center;justify-content:center;min-width:1.25rem;padding:1px var(--sp-15);border-radius:var(--r-full);background:var(--surface-sunken);color:var(--ink-3);font-family:var(--font-mono);font-size:var(--fs-xs);font-weight:400;line-height:1.3}
.ds-days{display:inline-flex;flex-direction:column;align-items:flex-end;min-width:3.25rem;text-align:right}
.ds-days b{font-family:var(--font-mono);font-size:var(--fs-num);font-weight:400;line-height:1;font-variant-numeric:tabular-nums;color:var(--ink)}
.ds-days span{font-size:var(--fs-2xs);line-height:1.2;color:var(--ink-3)}
.ds-days-danger b{color:var(--danger)}
.ds-days-danger span{color:var(--danger)}
.ds-days-soon b{color:var(--warn)}
.ds-days-ok b{color:var(--ink)}

/* ---- Бланки: чип-основание, оттиск, исчисление ---- */
.ds-chip-norm{display:inline-flex;align-items:center;gap:var(--sp-1);padding:2px var(--sp-2);border:1px solid var(--line-control);border-radius:var(--r-xs);background:var(--surface);color:var(--ink-2);font-family:var(--font-mono);font-size:var(--fs-xs);line-height:var(--lh-ui);white-space:nowrap;cursor:pointer;transition:border-color var(--dur-1) var(--ease-out),background var(--dur-1) var(--ease-out),color var(--dur-1) var(--ease-out)}
.ds-chip-norm::before{content:'§';color:var(--seal);font-weight:700}
.ds-chip-norm:hover{border-color:var(--accent-wash-line);background:var(--accent-wash);color:var(--accent-deep)}
.ds-chip-manual{border-style:dashed}
.ds-chip-manual::before{content:'✎';color:var(--warn)}
.ds-stamp{display:inline-flex;align-items:center;gap:var(--sp-15);padding:3px var(--sp-2);border:1px solid var(--seal);border-radius:var(--r-xs);color:var(--seal);font-family:var(--font-mono);font-size:var(--fs-2xs);letter-spacing:0.05em;text-transform:uppercase;line-height:1.3;opacity:0.92}

/* Бланк «Исчисление срока» — фирменный артефакт. Острые углы,
   двойная линейка сверху, серифная шапка, печатается 1:1. */
.ds-calc{background:var(--surface);border:1px solid var(--line-strong);border-top:3px double var(--ink);padding:var(--sp-4) var(--sp-5)}
.ds-calc-kind{font-size:var(--fs-2xs);font-weight:600;letter-spacing:var(--ls-caps);text-transform:uppercase;color:var(--seal);margin-bottom:var(--sp-05)}
.ds-calc-case{font-family:var(--font-mono);font-size:var(--fs-xs);color:var(--ink-3)}
.ds-calc-title{font-family:var(--font-doc);font-size:var(--fs-lg);font-weight:700;line-height:var(--lh-tight);margin:var(--sp-1) 0 var(--sp-3)}
.ds-calc-row{display:grid;grid-template-columns:9rem minmax(0,1fr);gap:var(--sp-15) var(--sp-4);padding:var(--sp-15) 0;border-top:1px solid var(--line)}
.ds-calc-label{font-size:var(--fs-xs);color:var(--ink-3);padding-top:1px}
.ds-calc-value{font-size:var(--fs-md);overflow-wrap:anywhere}
.ds-calc-value.is-strong{font-weight:600}
.ds-calc-formula{margin:var(--sp-2) 0;padding:var(--sp-2) var(--sp-25);background:var(--surface-sunken);font-family:var(--font-mono);font-size:var(--fs-sm);line-height:1.5;overflow-wrap:anywhere}
.ds-calc-value>.ds-calc-formula{margin:0}
.ds-calc-value>.ds-calc-norm{margin:0}
.ds-calc-norm{font-family:var(--font-doc);font-style:italic;font-size:var(--fs-sm);color:var(--ink-2);line-height:1.55;border-left:3px solid var(--line-strong);padding-left:var(--sp-3)}
.ds-calc-foot{display:flex;align-items:center;justify-content:space-between;gap:var(--sp-3);margin-top:var(--sp-3);padding-top:var(--sp-3);border-top:1px solid var(--line)}

/* Шкала исчисления: от триггера до дедлайна, с подписями. Живёт только
   в бланке — в строках реестров шкал нет. Несёт данные: засечки — дни,
   красная нить — «сегодня», подпись — «прошло · осталось». */
.ds-calc-scale{margin:var(--sp-3) 0 var(--sp-1)}
.ds-calc-scale .cs-caps{display:flex;justify-content:space-between;font-family:var(--font-mono);font-size:var(--fs-2xs);color:var(--ink-3);margin-bottom:var(--sp-1)}
.ds-calc-scale .cs-rail{position:relative;height:14px}
.ds-calc-scale .cs-line{position:absolute;left:0;right:0;top:7px;height:1px;background:var(--line-strong)}
.ds-calc-scale .cs-tick{position:absolute;top:4px;width:1px;height:7px;background:var(--line-strong)}
.ds-calc-scale .cs-tick.is-off{background:var(--danger-wash-deep)}
.ds-calc-scale .cs-today{position:absolute;top:0;width:2px;height:14px;background:var(--danger)}
.ds-calc-scale .cs-end{position:absolute;top:3.5px;right:0;width:7px;height:7px;border:1.5px solid var(--ink-2);border-radius:50%;background:var(--surface)}
.ds-calc-scale .cs-sum{margin-top:var(--sp-1);font-size:var(--fs-2xs);color:var(--ink-2)}

/* ---- Вклейки и баннеры ---- */
.ds-card{background:var(--surface);border:1px solid var(--line);border-radius:var(--r-m)}
.ds-card-pad{padding:var(--sp-4) var(--sp-5)}
.ds-card-hover{transition:border-color var(--dur-1) var(--ease-out),box-shadow var(--dur-1) var(--ease-out)}
.ds-card-hover:hover{border-color:var(--line-strong);box-shadow:var(--shadow-raise)}
.ds-banner{display:flex;align-items:flex-start;gap:var(--sp-25);padding:var(--sp-25) var(--sp-3);border:1px solid;border-radius:var(--r-s);font-size:var(--fs-sm);line-height:1.45}
.ds-banner svg{width:17px;height:17px;flex:none;margin-top:1px}
.ds-banner-info{background:var(--accent-wash);border-color:var(--accent-wash-line);color:var(--ink)}
.ds-banner-info svg{color:var(--accent)}
.ds-banner-warn{background:var(--warn-wash);border-color:var(--warn-wash);color:var(--ink)}
.ds-banner-warn svg{color:var(--warn)}
.ds-banner-ok{background:var(--ok-wash);border-color:var(--ok-wash);color:var(--ink)}
.ds-banner-ok svg{color:var(--ok)}

/* ---- Реестр-журнал ----
   Разлинованный журнал канцелярии: вертикальные линейки колонок,
   номера строк, шапка прописными под чернильной линейкой. */
.ds-ledger-wrap{overflow-x:auto}
.ds-ledger{width:100%;border-collapse:collapse;font-size:var(--fs-md);counter-reset:row}
.ds-ledger th{padding:var(--sp-2) var(--sp-3);border-bottom:1px solid var(--ink-2);border-right:1px solid var(--line);font-size:var(--fs-2xs);font-weight:600;letter-spacing:var(--ls-caps);text-transform:uppercase;color:var(--ink-3);text-align:left;white-space:nowrap}
.ds-ledger th:first-child{min-width:16rem;width:40%}
.ds-ledger th:last-child{border-right:0}
.ds-ledger td{padding:var(--sp-25) var(--sp-3);border-top:1px solid var(--line);border-right:1px solid var(--line);vertical-align:middle}
.ds-ledger td:last-child{border-right:0}
.ds-ledger tbody tr:first-child td{border-top:0}
.ds-ledger tbody tr{transition:background var(--dur-1) var(--ease-out)}
.ds-ledger tbody tr:hover{background:var(--surface-dim)}
.ds-ledger tr.is-clickable{cursor:pointer}
/* Номер строки — как в регистрационном журнале. Групповые строки не
   считаются; таблице, где номера неуместны, даёт отбой .no-rownum. */
.ds-ledger:not(.no-rownum) tbody tr:not(.ds-row-group){counter-increment:row}
.ds-ledger:not(.no-rownum) th:first-child,
.ds-ledger:not(.no-rownum) tbody tr:not(.ds-row-group)>td:first-child{padding-left:var(--sp-8);position:relative}
.ds-ledger:not(.no-rownum) tbody tr:not(.ds-row-group)>td:first-child::before{content:counter(row);position:absolute;left:var(--sp-25);top:var(--sp-25);font-family:var(--font-mono);font-size:var(--fs-2xs);color:var(--ink-3);font-weight:400}
.ds-cell-main{font-weight:500;color:var(--ink)}
.ds-cell-sub{display:block;margin-top:1px;font-size:var(--fs-xs);font-weight:400;color:var(--ink-3)}
.ds-ledger .ds-row-group td{padding:var(--sp-15) var(--sp-3);background:var(--surface-dim);border-top:1px solid var(--line);font-size:var(--fs-2xs);font-weight:600;letter-spacing:var(--ls-caps);text-transform:uppercase;color:var(--ink-3)}
.ds-ledger .ds-row-group.is-danger td{background:var(--danger-wash);color:var(--danger)}
.ds-ledger tr.is-overdue td{background:var(--danger-wash)}
.ds-ledger tr.is-overdue:hover td{background:var(--danger-wash-deep)}
.ds-row-done .ds-cell-main{color:var(--ink-3);text-decoration:line-through;text-decoration-color:var(--line-control)}
.ds-cell-num{font-family:var(--font-mono);font-size:var(--fs-sm);font-variant-numeric:tabular-nums;white-space:nowrap}

/* ---- Заголовки листа и групп ---- */
.ds-eyebrow{font-size:var(--fs-2xs);font-weight:600;letter-spacing:var(--ls-caps);text-transform:uppercase;color:var(--ink-3)}
.ds-eyebrow-lg{font-size:var(--fs-xs)}
.ds-section-head{display:flex;align-items:baseline;gap:var(--sp-2);margin:var(--sp-6) 0 var(--sp-25);font-size:var(--fs-xs);font-weight:600;letter-spacing:var(--ls-caps);text-transform:uppercase;line-height:var(--lh-tight);color:var(--ink-2)}
.ds-section-head::after{content:'';flex:1;align-self:center;border-bottom:1px solid var(--line)}
.ds-group-row{display:flex;align-items:center;gap:var(--sp-2);padding:var(--sp-15) var(--sp-4);background:var(--surface-dim);border-top:1px solid var(--line);border-bottom:1px solid var(--line);font-size:var(--fs-2xs);font-weight:600;letter-spacing:var(--ls-caps);text-transform:uppercase;color:var(--ink-3)}
.ds-group-row.is-danger{background:var(--danger-wash);color:var(--danger)}
/* Шапка листа: серифный заголовок, моно-подпись, двойная линейка снизу —
   как шапка документа. */
.ds-page-head{position:relative;display:flex;align-items:baseline;gap:var(--sp-4);flex-wrap:wrap;margin:var(--sp-2) 0 var(--sp-5);padding-bottom:var(--sp-3);border-bottom:3px double var(--ink)}
.ds-page-title{font-family:var(--font-doc);font-size:var(--fs-xl);font-weight:700;letter-spacing:var(--ls-title);line-height:var(--lh-tight)}
.ds-page-sub{font-size:var(--fs-sm);color:var(--ink-3)}
.ds-page-actions{margin-left:auto;display:flex;gap:var(--sp-2);align-items:center;flex-wrap:wrap}
.ds-crumbs{display:flex;align-items:center;gap:var(--sp-15);font-size:var(--fs-xs);color:var(--ink-3)}
.ds-crumbs a{color:var(--ink-3)}
.ds-crumbs a:hover{color:var(--accent)}

/* ---- Вкладки и сегменты ---- */
.ds-tabs{display:flex;gap:var(--sp-5);border-bottom:1px solid var(--line)}
.ds-tab{display:inline-flex;align-items:center;gap:var(--sp-15);padding:var(--sp-2) 2px;margin-bottom:-1px;border:0;border-bottom:2px solid transparent;background:none;font-size:var(--fs-md);font-weight:500;color:var(--ink-3);cursor:pointer;white-space:nowrap;transition:color var(--dur-1) var(--ease-out)}
.ds-tab:hover{color:var(--ink)}
.ds-tab.is-active{color:var(--ink);border-bottom-color:var(--accent)}
.ds-seg{display:inline-flex;gap:2px;padding:2px;background:var(--surface-sunken);border-radius:var(--r-s)}
.ds-seg-btn{display:inline-flex;align-items:center;height:calc(var(--ctl-h-sm) - 4px);padding:0 var(--sp-25);border:0;border-radius:var(--r-xs);background:none;font-size:var(--fs-sm);font-weight:500;color:var(--ink-3);cursor:pointer;transition:color var(--dur-1) var(--ease-out),background var(--dur-1) var(--ease-out)}
.ds-seg-btn:hover{color:var(--ink)}
.ds-seg-btn.is-active{background:var(--surface);color:var(--ink);border:1px solid var(--line-control);box-shadow:var(--shadow-card)}
.ds-layer-chip{display:inline-flex;align-items:center;gap:var(--sp-15);height:var(--ctl-h-sm);padding:0 var(--sp-25);border:1px solid var(--line-control);border-radius:var(--r-full);background:var(--surface);font-size:var(--fs-xs);font-weight:500;color:var(--ink-2);cursor:pointer;transition:background var(--dur-1) var(--ease-out),border-color var(--dur-1) var(--ease-out)}
.ds-layer-chip::before{content:'';width:8px;height:8px;border-radius:50%;background:var(--layer,var(--ink-3))}
.ds-layer-chip[aria-pressed='true']{background:var(--layer-wash,var(--accent-wash));border-color:var(--layer,var(--accent));color:var(--layer,var(--accent-deep))}
/* Невключённый слой гаснет подписью и точкой, но не кромкой:
   граница органа управления держит 3:1 в любом состоянии */
.ds-layer-chip[aria-pressed='false']{color:var(--ink-3)}
.ds-layer-chip[aria-pressed='false']::before{background:var(--line-control)}
.layer-hearing{--layer:var(--layer-hearing);--layer-wash:var(--layer-hearing-wash)}
.layer-deadline{--layer:var(--layer-deadline);--layer-wash:var(--layer-deadline-wash)}
.layer-task{--layer:var(--layer-task);--layer-wash:var(--layer-task-wash)}
.layer-meeting{--layer:var(--layer-meeting);--layer-wash:var(--layer-meeting-wash)}

/* ---- Формы ---- */
.ds-field{display:block}
.ds-field>label{display:block;margin-bottom:var(--sp-15);font-size:var(--fs-sm);font-weight:500;color:var(--ink-2)}
.ds-field+.ds-field{margin-top:var(--sp-4)}
.ds-hint{margin-top:var(--sp-15);font-size:var(--fs-xs);color:var(--ink-3);line-height:1.45}
.ds-input,.ds-select{display:block;width:100%;height:var(--ctl-h-input);padding:0 var(--sp-25);border:1px solid var(--line-control);border-radius:var(--r-s);background:var(--surface);font-size:var(--fs-md);color:var(--ink);transition:border-color var(--dur-1) var(--ease-out),box-shadow var(--dur-1) var(--ease-out)}
.ds-input::placeholder{color:var(--ink-3);opacity:0.75}
.ds-input:focus,.ds-select:focus{outline:none;border-color:var(--accent);box-shadow:0 0 0 3px var(--focus-ring)}
textarea.ds-input{height:auto;padding:var(--sp-2) var(--sp-25);line-height:var(--lh-body);resize:vertical}
/* Стрелка селекта и галочка чекбокса — data-uri-токены (--icon-chevron,
   --icon-check из tokens/colors.css): цвет живёт в файле токенов. */
.ds-select{appearance:none;padding-right:var(--sp-8);background-image:var(--icon-chevron);background-repeat:no-repeat;background-position:right var(--sp-2) center;background-size:16px}
.ds-input.is-invalid,.ds-select.is-invalid,.ds-input[aria-invalid='true'],.ds-select[aria-invalid='true']{border-color:var(--danger);box-shadow:0 0 0 3px var(--danger-wash)}
.ds-error{margin-top:var(--sp-15);font-size:var(--fs-xs);color:var(--danger)}
.ds-check{display:inline-flex;align-items:center;gap:var(--sp-2);font-size:var(--fs-md);cursor:pointer}
.ds-check input{appearance:none;width:1rem;height:1rem;margin:0;flex:none;border:1.5px solid var(--line-control);border-radius:var(--r-xs);background:var(--surface);cursor:pointer;transition:background var(--dur-1) var(--ease-out),border-color var(--dur-1) var(--ease-out)}
.ds-check input:hover{border-color:var(--ink-3)}
.ds-check input:disabled{opacity:0.45;cursor:not-allowed;border-color:var(--line-strong)}
.ds-check input:checked{background-color:var(--accent);border-color:var(--accent);background-image:var(--icon-check);background-size:12px;background-position:center;background-repeat:no-repeat}
.ds-toggle{position:relative;display:inline-flex;flex:none;width:2.125rem;height:1.25rem;cursor:pointer}
.ds-toggle input{appearance:none;position:absolute;inset:0;margin:0;border-radius:var(--r-full);background:var(--line-control);cursor:pointer;transition:background var(--dur-2) var(--ease-out)}
.ds-toggle input:checked{background:var(--accent)}
.ds-toggle .knob{position:absolute;top:2px;left:2px;width:1rem;height:1rem;border-radius:50%;background:var(--surface);box-shadow:var(--shadow-knob);pointer-events:none;transition:translate var(--dur-2) var(--ease-out)}
.ds-toggle input:checked+.knob{translate:0.875rem 0}
.ds-radio-card{display:block;padding:var(--sp-25) var(--sp-3);border:1px solid var(--line-control);border-radius:var(--r-s);background:var(--surface);cursor:pointer;transition:border-color var(--dur-1) var(--ease-out),box-shadow var(--dur-1) var(--ease-out)}
.ds-radio-card:hover{border-color:var(--ink-3)}
.ds-radio-card:has(input:checked){border-color:var(--accent);box-shadow:0 0 0 1px var(--accent)}
.ds-radio-card input{position:absolute;opacity:0;pointer-events:none}
.ds-rc-title{display:block;font-size:var(--fs-md);font-weight:500}
.ds-rc-sub{display:block;margin-top:1px;font-size:var(--fs-xs);color:var(--ink-3)}

/* ---- Меню ---- */
.ds-menu-wrap{position:relative;display:inline-block}
.ds-menu{position:absolute;top:calc(100% + 4px);right:0;z-index:50;min-width:230px;padding:var(--sp-1);background:var(--surface);border:1px solid var(--line-strong);border-radius:var(--r-m);box-shadow:var(--shadow-pop)}
.ds-menu.is-left{right:auto;left:0}
.ds-menu-item{display:flex;align-items:center;gap:var(--sp-2);width:100%;padding:var(--sp-15) var(--sp-2);border:0;border-radius:var(--r-s);background:none;font-size:var(--fs-md);color:var(--ink);text-align:left;cursor:pointer}
.ds-menu-item svg{width:16px;height:16px;flex:none;color:var(--ink-3)}
.ds-menu-item:hover{background:var(--surface-sunken);text-decoration:none;color:var(--ink)}
.ds-menu-item.is-danger{color:var(--danger)}
.ds-menu-item.is-danger svg{color:var(--danger)}
.ds-menu-item.is-danger:hover{background:var(--danger-wash)}
.ds-mi-end{margin-left:auto;padding-left:var(--sp-4);font-size:var(--fs-xs);color:var(--ink-3)}
.ds-menu-sep{height:1px;margin:var(--sp-1) calc(-1 * var(--sp-1));background:var(--line)}

/* ---- Слои: модальное окно, боковая карточка, тост, палитра ---- */
.ds-veil{position:fixed;inset:0;z-index:90;background:var(--veil)}
.ds-modal{position:fixed;inset:0;z-index:95;display:grid;place-items:start center;padding:11vh var(--sp-4) var(--sp-4);overflow:auto}
.ds-modal-panel{width:30rem;max-width:100%;background:var(--surface);border:1px solid var(--line-strong);border-radius:var(--r-l);box-shadow:var(--shadow-modal)}
.ds-modal-panel.is-wide{width:46rem}
.ds-modal-head{display:flex;align-items:flex-start;gap:var(--sp-3);padding:var(--sp-4) var(--sp-4) var(--sp-2)}
.ds-modal-head h3{font-size:var(--fs-body);font-weight:600;line-height:var(--lh-tight)}
.ds-modal-head .ds-iconbtn{margin-left:auto}
.ds-modal-body{padding:var(--sp-2) var(--sp-4) var(--sp-4)}
.ds-modal-foot{display:flex;align-items:center;gap:var(--sp-2);padding:var(--sp-3) var(--sp-4);border-top:1px solid var(--line)}
.ds-spacer{flex:1}
.ds-drawer{position:fixed;top:0;right:0;bottom:0;z-index:95;display:flex;flex-direction:column;width:var(--drawer-w);max-width:92vw;background:var(--surface);border-left:1px solid var(--line-strong);box-shadow:var(--shadow-modal)}
.ds-drawer-head{display:flex;align-items:flex-start;gap:var(--sp-3);padding:var(--sp-4);border-bottom:1px solid var(--line)}
.ds-drawer-head h3{font-size:var(--fs-body);font-weight:600;line-height:var(--lh-tight)}
.ds-drawer-head .ds-iconbtn{margin-left:auto}
.ds-drawer-body{flex:1;overflow-y:auto;padding:var(--sp-4)}
.ds-drawer-foot{display:flex;gap:var(--sp-2);padding:var(--sp-3) var(--sp-4);border-top:1px solid var(--line)}
.ds-toast{position:fixed;left:50%;bottom:var(--sp-5);z-index:100;display:flex;align-items:center;gap:var(--sp-3);max-width:min(34rem,90vw);padding:var(--sp-25) var(--sp-4);border-radius:var(--r-m);background:var(--toast-bg);color:var(--on-dark);font-size:var(--fs-sm);box-shadow:var(--shadow-pop);translate:-50% 0;overflow:hidden}
.ds-toast-undo{flex:none;border:0;background:none;padding:0;color:var(--on-dark-quiet);font-size:var(--fs-sm);font-weight:600;cursor:pointer}
.ds-toast-undo:hover{text-decoration:underline;text-underline-offset:3px}
.ds-toast-bar{position:absolute;left:0;bottom:0;height:2px;background:var(--on-dark-quiet);animation:ds-countdown linear forwards}
@keyframes ds-countdown{from{width:100%}to{width:0}}
.ds-cmdk{position:fixed;inset:0;z-index:98;display:grid;place-items:start center;padding:14vh var(--sp-4) var(--sp-4)}
.ds-cmdk-panel{width:37rem;max-width:100%;background:var(--surface);border:1px solid var(--line-strong);border-radius:var(--r-l);box-shadow:var(--shadow-modal);overflow:hidden}
.ds-cmdk-input{display:flex;align-items:center;gap:var(--sp-25);padding:0 var(--sp-4);height:3rem;border-bottom:1px solid var(--line)}
.ds-cmdk-input svg{width:17px;height:17px;color:var(--ink-3);flex:none}
.ds-cmdk-input input{flex:1;border:0;outline:none;background:none;font-size:var(--fs-body);color:var(--ink)}
.ds-cmdk-list{max-height:21rem;overflow-y:auto;padding:var(--sp-1)}
.ds-cmdk-group{padding:var(--sp-2) var(--sp-2) var(--sp-1);font-size:var(--fs-2xs);font-weight:600;letter-spacing:var(--ls-caps);text-transform:uppercase;color:var(--ink-3)}
.ds-cmdk-item{display:flex;align-items:center;gap:var(--sp-25);width:100%;padding:var(--sp-2);border:0;border-radius:var(--r-s);background:none;font-size:var(--fs-md);color:var(--ink);text-align:left;cursor:pointer}
.ds-cmdk-item svg{width:16px;height:16px;flex:none;color:var(--ink-3)}
.ds-cmdk-item.is-active,.ds-cmdk-item:hover{background:var(--surface-sunken)}
.ds-cmdk-item.is-active .ds-mi-end{color:var(--ink-2)}
.ds-cmdk-foot{display:flex;align-items:center;gap:var(--sp-4);padding:var(--sp-2) var(--sp-3);border-top:1px solid var(--line);font-size:var(--fs-2xs);color:var(--ink-3)}
.ds-cmdk-foot span{display:inline-flex;align-items:center;gap:var(--sp-1)}

/* ---- Хронология, записи, пары, пустые состояния ---- */
.ds-timeline{list-style:none;margin:0;padding:0}
.ds-timeline li{position:relative;display:grid;grid-template-columns:6rem minmax(0,1fr);gap:var(--sp-4);padding:var(--sp-2) 0 var(--sp-2) var(--sp-5)}
.ds-timeline li::before{content:'';position:absolute;left:6.5px;top:0;bottom:0;width:1px;background:var(--line)}
.ds-timeline li:first-child::before{top:14px}
.ds-timeline li:last-child::before{bottom:auto;height:14px}
.ds-timeline li::after{content:'';position:absolute;left:3px;top:11px;width:8px;height:8px;border-radius:50%;background:var(--surface);border:1.5px solid var(--line-control)}
.ds-timeline li.tl-manual::after{border-color:var(--accent);background:var(--accent-wash)}
.ds-tl-date{font-family:var(--font-mono);font-size:var(--fs-xs);font-variant-numeric:tabular-nums;color:var(--ink-2);padding-top:2px;white-space:nowrap}
.ds-tl-text{font-size:var(--fs-md);line-height:1.45}
.ds-tl-src{margin-top:1px;font-size:var(--fs-2xs);color:var(--ink-3)}
.ds-ne{display:flex;flex-direction:column;gap:2px;outline:none}
.ds-ne-block{display:flex;gap:var(--sp-2);align-items:flex-start;padding:1px 0}
.ds-ne-text{flex:1;min-width:0;font-size:var(--fs-md);line-height:1.45;outline:none;overflow-wrap:anywhere;white-space:pre-wrap}
.ds-ne-block[data-type='h'] .ds-ne-text{font-weight:650;font-size:var(--fs-body)}
.ds-ne-block[data-type='h']:not(:first-child){margin-top:var(--sp-2)}
.ds-ne-marker{width:5px;height:5px;border-radius:50%;background:var(--ink-3);margin-top:0.55em;flex:none}
.ds-ne-checkmark{margin-top:2px}
.ds-ne-block.is-checked .ds-ne-text{color:var(--ink-3);text-decoration:line-through;text-decoration-color:var(--line-control)}
.ds-ne-text:empty::before{content:attr(data-ph);color:var(--ink-3);opacity:0.75;pointer-events:none}

.ds-kv{display:grid;grid-template-columns:auto minmax(0,1fr);gap:var(--sp-15) var(--sp-5);margin:0}
.ds-kv dt{font-size:var(--fs-sm);color:var(--ink-3)}
.ds-kv dd{margin:0;font-size:var(--fs-sm)}
/* Пустое состояние — момент бренда: серифная фраза + действие */
.ds-empty{padding:var(--sp-8) var(--sp-4);text-align:center;font-size:var(--fs-body);color:var(--ink-2);line-height:1.5;font-family:var(--font-doc);font-style:italic}
.ds-empty .ds-btn,.ds-empty .btn-link{font-family:var(--font-ui);font-style:normal}
.ds-empty b,.ds-empty strong{font-style:normal}

/* ---- Каркас: регистратура, стол, лист ---- */
.ds-app{display:grid;grid-template-columns:var(--sidebar-w) minmax(0,1fr);min-height:100vh}
.ds-aside{position:sticky;top:0;height:100vh;display:flex;flex-direction:column;background:var(--paper-aside);border-right:1px solid var(--line-strong);padding:var(--sp-4) 0 var(--sp-3)}
.ds-brand{display:flex;align-items:baseline;padding:var(--sp-05) var(--sp-4) var(--sp-4);font-family:var(--font-doc);font-weight:700;font-size:1.3125rem;color:var(--ink)}
.ds-brand:hover{text-decoration:none;color:var(--ink)}
.ds-brand .dot{color:var(--accent)}
/* Опись разделов: номер · название · клавиши; активный — гербовая
   закладка слева. Пункты идут в край, как строки описи. */
.ds-nav{display:flex;flex-direction:column}
.ds-nav-label{padding:var(--sp-15) var(--sp-4);border-top:1px solid var(--line-strong);font-size:var(--fs-2xs);font-weight:600;letter-spacing:var(--ls-caps);text-transform:uppercase;color:var(--ink-3)}
.ds-nav-item{display:flex;align-items:center;gap:var(--sp-25);padding:var(--sp-2) var(--sp-4) var(--sp-2) calc(var(--sp-4) - 3px);border:0;border-left:3px solid transparent;border-radius:0;background:none;font-size:var(--fs-md);font-weight:500;color:var(--ink-2);white-space:nowrap;cursor:pointer;text-align:left;width:100%;transition:background var(--dur-1) var(--ease-out),color var(--dur-1) var(--ease-out)}
.ds-nav-item svg{width:17px;height:17px;flex:none;color:var(--ink-3)}
.ds-nav-idx{font-family:var(--font-mono);font-size:var(--fs-2xs);color:var(--ink-3);width:0.875rem;flex:none;text-align:right}
.ds-nav-item:hover{background:var(--hover-veil);color:var(--ink);text-decoration:none}
.ds-nav-item.is-active{border-left-color:var(--accent);background:var(--hover-veil-strong);color:var(--ink);font-weight:600}
.ds-nav-item.is-active svg{color:var(--accent)}
.ds-nav-item.is-active .ds-nav-idx{color:var(--accent)}
.ds-nav-item .ds-kbd{margin-left:auto;opacity:0;transition:opacity var(--dur-1) var(--ease-out)}
.ds-nav-item:hover .ds-kbd{opacity:1}
.ds-nav-item.is-active .ds-kbd{display:none}
.ds-nav-badge{margin-left:auto;min-width:1.25rem;padding:1px var(--sp-15);border:1px solid var(--warn);border-radius:var(--r-xs);background:transparent;color:var(--warn);font-family:var(--font-mono);font-size:var(--fs-2xs);font-weight:600;text-align:center}
.ds-nav-badge+.ds-kbd{margin-left:var(--sp-1)}
.ds-aside-foot{margin-top:auto;display:flex;flex-direction:column}
.ds-aside-user{display:flex;align-items:center;gap:var(--sp-2);margin-top:var(--sp-2);padding:var(--sp-25) var(--sp-4);border-top:1px solid var(--line-strong)}
.ds-avatar{width:1.75rem;height:1.75rem;flex:none;border-radius:50%;background:var(--accent-wash);color:var(--accent);display:grid;place-items:center;font-size:var(--fs-2xs);font-weight:600}
.ds-user-name{font-size:var(--fs-sm);font-weight:500;line-height:1.25}
.ds-user-plan{font-size:var(--fs-2xs);color:var(--ink-3)}
.ds-main{min-width:0;display:flex;flex-direction:column}
.ds-topbar{display:flex;align-items:center;gap:var(--sp-3);padding:var(--sp-25) var(--sp-6);border-bottom:1px solid var(--line-strong);background:var(--paper)}
.ds-search{position:relative;width:21rem;max-width:38vw}
.ds-search input{width:100%;height:var(--ctl-h);padding:0 var(--sp-8) 0 var(--sp-8);border:1px solid var(--line-control);border-radius:var(--r-s);background:var(--surface);font-size:var(--fs-md);color:var(--ink);transition:border-color var(--dur-1) var(--ease-out),box-shadow var(--dur-1) var(--ease-out)}
.ds-search input::placeholder{color:var(--ink-3);opacity:0.75}
.ds-search input:focus{outline:none;border-color:var(--accent);box-shadow:0 0 0 3px var(--focus-ring)}
.ds-search>svg{position:absolute;left:var(--sp-25);top:50%;width:15px;height:15px;translate:0 -50%;color:var(--ink-3);pointer-events:none}
.ds-search .ds-kbd{position:absolute;right:var(--sp-2);top:50%;translate:0 -50%}
.ds-sync{margin-left:auto;display:flex;align-items:center;gap:var(--sp-2);border:0;background:none;padding:var(--sp-1) var(--sp-2);border-radius:var(--r-s);font-family:var(--font-mono);font-size:var(--fs-xs);color:var(--ink-3);white-space:nowrap;cursor:pointer;transition:background var(--dur-1) var(--ease-out),color var(--dur-1) var(--ease-out)}
.ds-sync:hover{background:var(--surface-sunken);color:var(--ink-2)}
.ds-sync-dot{width:7px;height:7px;border-radius:50%;background:var(--ok);flex:none}
/* Лист: содержимое раздела лежит на столе */
.ds-content{flex:1;width:100%;max-width:var(--content-max);margin:var(--sp-5) auto var(--sp-10);background:var(--surface);border:1px solid var(--sheet-edge);box-shadow:var(--shadow-sheet);padding:var(--sp-5) var(--sheet-pad) var(--sp-16)}

/* ---- Печать: печатается лист, не стол ---- */
@media print{.ds-aside,.ds-topbar{display:none!important}.ds-app{display:block}.ds-content{max-width:none;margin:0;padding:0;border:0;box-shadow:none}.ds-card{border-color:var(--line-print);box-shadow:none}}
