/* ==========================================================================
   AROLT v2 · L5 CHECKOUT · assets/v2/checkout.css
   Владелец: полоса L5 CHECKOUT (docs/DESIGN-V2.md, раздел 12; кто чем владеет - 9.4).
   Что здесь: корзина и оформление заказа (#view-quote, /cart), запрос КП (#view-kp, /kp), доставка
   в формах (и в калькуляторе ЖК), плательщик, итог. Запрос КП - те же разделы, поиск товара, карточки
   выбора и итог: общие правила - :is(#view-quote, #view-kp) (сила та же - у :is() сила самого сильного),
   своё у КП - раздел 10.
   Правила:
   - каждый селектор начинается с id своего вида: #view-quote, #view-kp, #v2 .quote-dlv*, #v2 .delivery-*, #v2 .dlv-addr*, .dlv-status*, .dlv-variant*, .dlv-map*, .dlv-pin*, .dlv-dialog*, .dlv-link, #v2 .quote-add*, #v2 .quote-table*, #v2 .cart-summary, #v2 .payer-card, #v2 .qf-sent, #v2 .dlv-suggest*, .dlv-center*;
   - токены, компоненты и утилиты - из assets/v2/foundation.css (--brand, --r, --shadow,
     .v2-card, .v2-band, .v2-lead-band, .v2-hero, .v2-pagehead, .v2-dot, .v2-pill, .v2-seg …),
     значения не дублировать числами;
   - файл подключён после foundation.css, поэтому при равной силе (1,1,0) побеждает он;
   - !important - только против !important первой версии (раздел 9.2);
   - нужна правка общего или чужого - запрос в …/v2/<полоса>/REQUESTS.md, а не правка здесь.
   ========================================================================== */

/* ==========================================================================
   1. Шапка страницы и раскладка (10.6: .v2-pagehead, сетка 1fr / 360px)
   ========================================================================== */
/* stretch, а не общий flex-end: на ≤760 шапка - колонка, и flex-end прижимал блок вправо от края логотипа */
:is(#view-quote, #view-kp) .section-head { align-items: stretch; margin-bottom: var(--head-gap); }
:is(#view-quote, #view-kp) .section-head > div { display: flex; flex-direction: column; align-items: flex-start; }
:is(#view-quote, #view-kp) .section-head h1 { margin: 0; }
:is(#view-quote, #view-kp) .section-head .lead { margin: 16px 0 0; }

/* Итог 380, а не 360 (10.6): в 360 основная кнопка «Выставить удалённый счёт на Kaspi» ложится в две строки */
:is(#view-quote, #view-kp) .quote-page {
  display: grid; grid-template-columns: minmax(0, 1fr) 380px;
  gap: var(--gap); align-items: start;
}
:is(#view-quote, #view-kp) .quote-main { display: grid; gap: var(--gap); min-width: 0; }

/* Разделы формы - белые карточки soft */
:is(#view-quote, #view-kp) .quote-section { padding: clamp(24px, 3vw, 36px); }
:is(#view-quote, #view-kp) .quote-section__head {
  display: flex; flex-wrap: wrap; align-items: flex-end; justify-content: space-between;
  gap: 12px 24px; margin-bottom: 24px;
}
:is(#view-quote, #view-kp) .quote-section__head .eyebrow { margin-bottom: 8px; }
:is(#view-quote, #view-kp) .quote-section__head h2 {
  margin: 0; font-size: 24px; font-weight: 500; line-height: 1.2; letter-spacing: -0.02em;
}
:is(#view-quote, #view-kp) .quote-section__head .chip { flex: none; }

/* ==========================================================================
   2. Позиции: поле «Добавить позицию» и подсказки (5.3, 5.10)
   ========================================================================== */
:is(#view-quote, #view-kp) .quote-add { margin-bottom: 0; }
/* Таблица позиций - под полем; пустой таблицы нет, и под полем нет лишнего отступа */
:is(#view-quote, #view-kp) .quote-table-wrap:not([hidden]) { margin-top: 20px; }
:is(#view-quote, #view-kp) .quote-add__field {
  grid-template-columns: 48px minmax(0, 1fr) auto;
  min-height: var(--ctl-h);
  border: 1px solid transparent; border-radius: var(--r-pill);
  background: var(--field); box-shadow: none;
  transition: border-color var(--speed) var(--ease), background-color var(--speed) var(--ease);
}
:is(#view-quote, #view-kp) .quote-add__field:hover { border-color: var(--line-strong); }
:is(#view-quote, #view-kp) .quote-add.is-open .quote-add__field,
:is(#view-quote, #view-kp) .quote-add__field:focus-within { border-color: var(--brand); background: var(--surface); box-shadow: none; }
:is(#view-quote, #view-kp) .quote-add__icon { padding-left: 6px; color: var(--muted); }
:is(#view-quote, #view-kp) .quote-add__icon svg { width: 18px; height: 18px; stroke-width: 1.6; stroke-linejoin: round; }
:is(#view-quote, #view-kp) .quote-add__field input,
:is(#view-quote, #view-kp) .quote-add__field input:hover,
:is(#view-quote, #view-kp) .quote-add__field input:focus {
  height: 50px; min-height: 0; padding: 0 12px 0 0;
  border: 0; border-radius: 0; background: transparent; box-shadow: none;
  font-size: 16px; font-weight: 400;
}
:is(#view-quote, #view-kp) .quote-add__field input::placeholder { color: var(--hint); }
:is(#view-quote, #view-kp) .quote-add__clear {
  width: 36px; height: 36px; margin-right: 7px;
  border: 0; border-radius: var(--r-pill);
  background: var(--field); color: var(--ink);
  transition: background-color var(--speed) var(--ease);
}
:is(#view-quote, #view-kp) .quote-add__clear:hover { background: var(--hairline); color: var(--ink); }
:is(#view-quote, #view-kp) .quote-add__clear svg { width: 16px; height: 16px; stroke-width: 1.6; }

:is(#view-quote, #view-kp) .quote-add__suggest {
  top: calc(100% + 8px); padding: 8px;
  border: 0; border-radius: var(--r);
  background: var(--surface); box-shadow: var(--shadow);
}
:is(#view-quote, #view-kp) .quote-add__item {
  grid-template-columns: 48px minmax(0, 1fr) auto; gap: 14px;
  padding: 8px 10px 8px 8px; border-radius: var(--r-in);
  color: var(--ink); font-family: var(--font);
  transition: background-color var(--speed) var(--ease), color var(--speed) var(--ease);
}
:is(#view-quote, #view-kp) .quote-add__item + .quote-add__item { margin-top: 2px; }
:is(#view-quote, #view-kp) .quote-add__item:hover,
:is(#view-quote, #view-kp) .quote-add__item.is-active { background: var(--field); }
:is(#view-quote, #view-kp) .quote-add__item:hover .quote-add__title,
:is(#view-quote, #view-kp) .quote-add__item.is-active .quote-add__title { color: var(--brand); }
:is(#view-quote, #view-kp) .quote-add__media {
  width: 48px; height: 48px;
  border: 0; border-radius: var(--r-in); background: var(--field);
}
:is(#view-quote, #view-kp) .quote-add__item:hover .quote-add__media,
:is(#view-quote, #view-kp) .quote-add__item.is-active .quote-add__media { background: var(--surface); }
:is(#view-quote, #view-kp) .quote-add__media img { width: 84%; height: 84%; margin: auto; mix-blend-mode: multiply; }
:is(#view-quote, #view-kp) .quote-add__copy { gap: 2px; }
:is(#view-quote, #view-kp) .quote-add__title { font-size: 15px; font-weight: 400; line-height: 1.3; transition: color var(--speed) var(--ease); }
:is(#view-quote, #view-kp) .quote-add__meta { color: var(--muted); font-size: 13px; }
:is(#view-quote, #view-kp) .quote-add__meta b { color: var(--ink); font-weight: 500; }
:is(#view-quote, #view-kp) .quote-add__plus {
  width: 36px; height: 36px; border-radius: var(--r-pill);
  background: var(--brand-tint); color: var(--brand-hover);
  transition: background-color var(--speed) var(--ease), color var(--speed) var(--ease);
}
:is(#view-quote, #view-kp) .quote-add__item.is-active .quote-add__plus,
:is(#view-quote, #view-kp) .quote-add__item:hover .quote-add__plus { background: var(--brand); color: #fff; }
:is(#view-quote, #view-kp) .quote-add__plus svg { width: 18px; height: 18px; stroke-width: 1.6; }
:is(#view-quote, #view-kp) .quote-add__empty { padding: 16px 14px; color: var(--muted); font-size: 14px; }

/* ==========================================================================
   3. Строки позиций: без таблицы визуально (10.6)
   Окно 56 радиус 12, название 15/500 и категория 13 muted, счётчик малый, сумма 16/500,
   «Удалить» - капсула --field 32 с контурной корзиной и словом под категорией, как в v1.
   Подписи v1 остаются везде: шапка «Товар / Цена / Кол-во / Сумма», а где шапки нет -
   «Цена», «Кол-во» / «Количество», «Сумма» у самих значений.
   ========================================================================== */
:is(#view-quote, #view-kp) .quote-table-wrap { overflow: visible; }
:is(#view-quote, #view-kp) .quote-table,
:is(#view-quote, #view-kp) .quote-table thead,
:is(#view-quote, #view-kp) .quote-table tbody { display: block; width: 100%; min-width: 0; }
:is(#view-quote, #view-kp) .quote-table tr {
  position: relative; display: grid;
  grid-template-columns: minmax(0, 1fr) 104px 124px 116px;
  align-items: center; column-gap: 16px;
  padding: 16px 0;
  border-bottom: 1px solid var(--hairline);
}
:is(#view-quote, #view-kp) .quote-table tbody tr:last-child { border-bottom: 0; padding-bottom: 0; }
:is(#view-quote, #view-kp) .quote-table thead tr { padding-top: 0; padding-bottom: 12px; }
:is(#view-quote, #view-kp) .quote-table th,
:is(#view-quote, #view-kp) .quote-table td {
  display: block; padding: 0; border: 0; background: none;
  color: var(--ink); font-size: 15px; text-align: left;
}
:is(#view-quote, #view-kp) .quote-table th { color: var(--muted); font-size: 13px; font-weight: 400; }
:is(#view-quote, #view-kp) .quote-table :is(th, td):nth-child(2),
:is(#view-quote, #view-kp) .quote-table :is(th, td):nth-child(4) { text-align: right; white-space: nowrap; }
:is(#view-quote, #view-kp) .quote-table :is(th, td):nth-child(3) { display: flex; justify-content: center; }
:is(#view-quote, #view-kp) .quote-table td:nth-child(2) { color: var(--ink-2); font-variant-numeric: tabular-nums; }
:is(#view-quote, #view-kp) .quote-table td:nth-child(4) strong { font-size: 16px; font-weight: 500; font-variant-numeric: tabular-nums; }
/* 999 шт. дорогой позиции шире колонки суммы - пусть растёт влево, в зазор, а не за край карточки */
:is(#view-quote, #view-kp) .quote-table tbody td:nth-child(4) { justify-self: end; }

:is(#view-quote, #view-kp) .quote-product { min-width: 0; align-items: flex-start; gap: 16px; }
:is(#view-quote, #view-kp) .quote-product > div { min-width: 0; }
:is(#view-quote, #view-kp) .mini-photo {
  width: 56px; height: 56px; border: 0; border-radius: var(--r-in); background: var(--field);
}
:is(#view-quote, #view-kp) .mini-photo img { width: 84%; height: 84%; margin: auto; mix-blend-mode: multiply; }
:is(#view-quote, #view-kp) .quote-product a { color: inherit; text-decoration: none; }
:is(#view-quote, #view-kp) .quote-product strong {
  display: block; margin: 0 0 2px;
  font-size: 15px; font-weight: 500; line-height: 1.35; color: var(--ink);
  transition: color var(--speed) var(--ease);
}
:is(#view-quote, #view-kp) .quote-product a:hover strong { color: var(--brand); }
:is(#view-quote, #view-kp) .quote-product span { display: block; color: var(--muted); font-size: 13px; line-height: 1.4; }

/* Кнопка «Удалить»: капсула под категорией - контурная корзина и слово, как текстовая ссылка v1 */
:is(#view-quote, #view-kp) .quote-product__remove {
  display: inline-flex; align-items: center; gap: 6px;
  width: auto; height: 32px; margin: 10px 0 0; padding: 0 12px 0 10px;
  border: 0; border-radius: var(--r-pill);
  background: var(--field); color: var(--ink-2);
  font-family: var(--font); font-size: 13px; font-weight: 500; line-height: 1; white-space: nowrap; cursor: pointer;
  transition: background-color var(--speed) var(--ease), color var(--speed) var(--ease);
}
:is(#view-quote, #view-kp) .quote-product__remove::before {
  content: ""; flex: none; width: 16px; height: 16px; background: currentColor;
  -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.6' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M4 7h16'/%3E%3Cpath d='M10 11v6'/%3E%3Cpath d='M14 11v6'/%3E%3Cpath d='M6 7l1 12a2 2 0 0 0 2 2h6a2 2 0 0 0 2-2l1-12'/%3E%3Cpath d='M9 7V4h6v3'/%3E%3C/svg%3E") center / contain no-repeat;
          mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.6' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M4 7h16'/%3E%3Cpath d='M10 11v6'/%3E%3Cpath d='M14 11v6'/%3E%3Cpath d='M6 7l1 12a2 2 0 0 0 2 2h6a2 2 0 0 0 2-2l1-12'/%3E%3Cpath d='M9 7V4h6v3'/%3E%3C/svg%3E") center / contain no-repeat;
}
:is(#view-quote, #view-kp) .quote-product__remove:hover { background: var(--danger-bg); color: var(--danger); }
:is(#view-quote, #view-kp) .quote-product__remove:focus-visible { outline: 2px solid var(--brand); outline-offset: 2px; }

/* Пустая корзина: «Корзина пуста» и две кнопки (в каталог, запрос КП) на поле --field под поиском */
#view-quote .quote-empty {
  display: grid; justify-items: start; gap: 16px;
  margin-top: 20px; padding: 24px;
  border-radius: var(--r-in); background: var(--field);
}
#view-quote .quote-empty[hidden] { display: none; }
#view-quote .quote-empty strong { color: var(--ink); font-size: 18px; font-weight: 500; line-height: 1.3; }
#view-quote .quote-empty__actions { display: flex; flex-wrap: wrap; gap: 10px; }

/* ==========================================================================
   4. Плательщик: карточки выбора (5.6). Панели способа оплаты под ними нет (правка 27):
      способ оплаты - строкой на самой карточке и в итоге
   ========================================================================== */
/* Устроены как варианты доставки (раздел 6): значок в .v2-dot слева, название 16 и подпись 14,
   отметка-радио 20 справа; настоящее радио скрыто, фокус - кольцо карточки. Две карточки в ряд
   шире вариантов доставки, поэтому строкой (значок | текст | отметка), а не столбиком */
:is(#view-quote, #view-kp) .payer-grid { gap: 12px; }
#v2 .payer-card {
  position: relative;
  display: grid; grid-template-columns: 44px minmax(0, 1fr) 20px; align-items: center; align-content: center;
  gap: 16px; min-height: 0; padding: 18px 20px;
  border: 0; border-radius: var(--r-in);
  background: var(--field); color: var(--ink); box-shadow: none; transform: none;
  cursor: pointer;
  transition: background-color var(--speed) var(--ease), box-shadow var(--speed) var(--ease);
}
#v2 .payer-card:hover { background: var(--field); box-shadow: inset 0 0 0 1px var(--line-strong); }
#v2 .payer-card input { position: absolute; width: 1px; height: 1px; margin: 0; opacity: 0; pointer-events: none; }
/* Белый кружок на --field, как у вариантов доставки (в .panel .v2-dot по умолчанию тинт) */
#v2 .payer-card .payer-card__icon { background: var(--surface); color: var(--brand); }
/* Цвет - явно: правило v1 «.payer-card span» красит muted и обёртку, название наследовало бы его */
#v2 .payer-card__body { display: block; min-width: 0; color: var(--ink); font-size: 16px; line-height: 1.3; }
#v2 .payer-card__body strong {
  display: block; margin: 0 0 4px;
  font-size: 16px; font-weight: 500; line-height: 1.3; letter-spacing: 0;
}
#v2 .payer-card__body > span { display: block; color: var(--muted); font-size: 14px; line-height: 1.45; }
#v2 .payer-card__mark {
  width: 20px; height: 20px;
  border: 1.5px solid var(--control); border-radius: var(--r-pill); background: var(--surface);
  transition: border-color var(--speed) var(--ease), border-width var(--speed) var(--ease);
}
#v2 .payer-card.is-active,
#v2 .payer-card:has(input:checked) { background: var(--brand-tint); box-shadow: inset 0 0 0 1.5px var(--brand); }
#v2 .payer-card.is-active .payer-card__body strong,
#v2 .payer-card:has(input:checked) .payer-card__body strong { color: var(--brand-hover); }
#v2 .payer-card.is-active .payer-card__mark,
#v2 .payer-card:has(input:checked) .payer-card__mark { border: 6px solid var(--brand); }
#v2 .payer-card:has(input:focus-visible) { outline: 2px solid var(--brand); outline-offset: 2px; }
/* Две в ряд - только когда в карточке «Юридическое лицо» стоит в одну строку (~290px): блок от 600px.
   Уже (1041-1140, где форма узкая) - одна под другой, как варианты доставки */
:is(#view-quote, #view-kp) .quote-section:has(> [data-payer-grid]) { container: quote-payer / inline-size; }
@container quote-payer (max-width: 599px) {
  :is(#view-quote, #view-kp) .payer-grid { grid-template-columns: minmax(0, 1fr); gap: 8px; }
  #v2 .payer-card { grid-template-columns: 40px minmax(0, 1fr) 20px; gap: 12px; padding: 14px 16px; }
  #v2 .payer-card .payer-card__icon { width: 40px; height: 40px; }
}

/* ==========================================================================
   5. Контакты и документы: поля 2 колонки, товары, файлы, комментарий.
      Вводного абзаца, чипа источника и заметки про НДС/документы нет (правки 27, 29)
   ========================================================================== */
:is(#view-quote, #view-kp) .quote-section .form-grid { gap: 24px; margin-top: 0; }
:is(#view-quote, #view-kp) .payer-fields.is-active { gap: 16px; }
:is(#view-quote, #view-kp) .contact-grid { gap: 16px; align-items: start; }
:is(#view-quote, #view-kp) .quote-section .field { align-content: start; }
/* Файлов нет - пустой список места не занимает */
:is(#view-quote, #view-kp) .qf-file__list:empty { display: none; }
/* Убрать один файл (и в окне заявки): круг 32 фундамента с крестиком, нажимается квадрат 44 */
#v2 .qf-file__item .qf-file__remove { position: relative; color: var(--muted); transition: background-color var(--speed) var(--ease), color var(--speed) var(--ease); }
#v2 .qf-file__item .qf-file__remove::after { content: ""; position: absolute; inset: -6px; }
#v2 .qf-file__item .qf-file__remove:hover { color: var(--danger); }
#v2 .qf-file__item .qf-file__remove:focus-visible { outline: 2px solid var(--brand); outline-offset: 2px; }
#v2 .qf-file__item .qf-file__remove svg { width: 16px; height: 16px; fill: none; stroke: currentColor; stroke-width: 1.6; stroke-linecap: round; }

/* ==========================================================================
   6. Доставка: три карточки выбора, блок адреса с картой (10.6, правка 28)
   Компоненты .dlv-* и .delivery-km* рисует и assets/delivery-map.js - в заявке, в окне карты
   и в калькуляторе ЖК, поэтому селекторы общие (#v2).
   ========================================================================== */
#view-quote .delivery-options { gap: 12px; }
#v2 .delivery-option {
  display: grid; grid-template-columns: minmax(0, 1fr) 20px;
  grid-template-areas: "icon mark" "body body";
  align-items: start; align-content: start; gap: 16px 12px;
  min-height: 0; padding: 18px 20px 20px;
  border: 0; border-radius: var(--r-in);
  background: var(--field); color: var(--ink); box-shadow: none; transform: none;
  transition: background-color var(--speed) var(--ease), box-shadow var(--speed) var(--ease);
}
#v2 .delivery-option:hover { transform: none; background: var(--field); box-shadow: inset 0 0 0 1px var(--line-strong); }
#v2 .delivery-option.is-active,
#v2 .delivery-option:has(input:checked) {
  transform: none; background: var(--brand-tint); box-shadow: inset 0 0 0 1.5px var(--brand);
}
#v2 .delivery-option:has(input:focus-visible) { outline: 2px solid var(--brand); outline-offset: 2px; }
#v2 .delivery-option__icon {
  grid-area: icon; width: 44px; height: 44px;
  border: 0; border-radius: var(--r-pill); background: var(--surface); color: var(--brand);
}
#v2 .delivery-option__icon svg { width: 20px; height: 20px; stroke-width: 1.6; }
#v2 .delivery-option__body { grid-area: body; min-width: 0; }
#v2 .delivery-option__body strong { margin: 0 0 4px; font-size: 16px; font-weight: 500; line-height: 1.3; }
#v2 .delivery-option.is-active .delivery-option__body strong,
#v2 .delivery-option:has(input:checked) .delivery-option__body strong { color: var(--brand-hover); }
/* Подпись - одна короткая строка (правка 31): «Со склада в Алматы, бесплатно», «от 6 500 ₸», «Считаем отдельно» */
#v2 .delivery-option__body > span { color: var(--muted); font-size: 14px; line-height: 1.45; }
/* Отметка - радио 5.5: рамка --control, выбрано - рамка 6 --brand и белая точка */
#v2 .delivery-option__mark {
  grid-area: mark; width: 20px; height: 20px; margin-top: 12px;
  border: 1.5px solid var(--control); border-radius: var(--r-pill); background: var(--surface);
  transition: border-color var(--speed) var(--ease), border-width var(--speed) var(--ease);
}
#v2 .delivery-option.is-active .delivery-option__mark,
#v2 .delivery-option:has(input:checked) .delivery-option__mark { border: 6px solid var(--brand); background: var(--surface); }
#v2 .delivery-option.is-active .delivery-option__mark::after,
#v2 .delivery-option:has(input:checked) .delivery-option__mark::after { content: none; }

/* Блок адреса, карты и суммы - вложенная панель --field */
#v2 .quote-dlv {
  margin-top: 12px; padding: 16px;
  border: 0; border-radius: var(--r-in); background: var(--field);
}
#v2 .quote-dlv .delivery-address { gap: 8px; }
#v2 .quote-dlv .quote-dlv__label { padding-left: 4px; color: var(--muted); font-size: 14px; font-weight: 400; line-height: 1.3; }

/* По городу - одна колонка во всю ширину блока, как в картах: подпись, поле с подсказками,
   (варианты адреса), карта с пином в центре, адрес под пином, сумма. Обёртки поля адреса
   раскрыты (display: contents), чтобы карта, общая для обоих плательщиков, встала между полем
   и его строкой статуса: статус меняется под картой и карту не сдвигает. Колонки v1 (адрес
   и сумма слева, карта справа) отменены. */
#v2 .quote-dlv.is-city .quote-dlv__grid {
  display: grid; grid-template-columns: minmax(0, 1fr); grid-template-areas: none; gap: 12px;
}
#v2 .quote-dlv.is-city .quote-dlv__addr,
#v2 .quote-dlv.is-city .delivery-address:not([hidden]) { display: contents; }
#v2 .quote-dlv.is-city .quote-dlv__label { order: 1; margin-bottom: -4px; }
#v2 .quote-dlv.is-city .dlv-addr { order: 2; }
#v2 .quote-dlv.is-city .dlv-variants { order: 3; }
#v2 .quote-dlv.is-city .quote-dlv__map { order: 4; grid-area: auto; }
#v2 .quote-dlv.is-city .dlv-status { order: 5; min-height: 0; margin: 0; padding: 0 4px; }
#v2 .quote-dlv.is-city .delivery-km { order: 6; grid-area: auto; grid-template-rows: none; align-self: auto; }
/* Под картой - только «Стоимость доставки» и сумма (правка 27.10): строк «Точка на карте: …»,
   «Нашли: …» и «Считаем…» не видно - адрес и так подписан у пина и стоит в поле. Строку с адресом
   слышит скринридер (aria-live). Ошибки и предупреждения видны как раньше; пока пересчитываем,
   статус с предупреждением держит своё место (min-height из delivery-map.js) - сумма под ним не
   прыгает. Карта не загрузилась - пина нет, и статус как был: «Нашли: …» видно */
#v2 .quote-dlv:not(:has(.dlv-map.is-failed)) .dlv-status__line--ok,
#v2 .quote-dlv:not(:has(.dlv-map.is-failed)) .dlv-status:not([style*="min-height"]):not(:has(.dlv-status__line:not(.dlv-status__line--ok, .dlv-status__line--loading))) {
  position: absolute; width: 1px; height: 1px; margin: -1px; padding: 0; overflow: hidden;
  clip: rect(0 0 0 0); white-space: nowrap; border: 0;
}
#v2 .quote-dlv:not(:has(.dlv-map.is-failed)) .dlv-status__line--loading { visibility: hidden; }
#v2 .quote-dlv:not(:has(.dlv-map.is-failed)) .dlv-status__line--ok ~ .dlv-status__line--warn { padding-left: 0; }

/* Поле адреса - одна капсула: поле прозрачное, кнопка поиска (лупа) внутри справа */
#v2 .dlv-addr {
  position: relative;
  gap: 6px; padding: 4px;
  border: 1px solid transparent; border-radius: var(--r-pill);
  background: var(--surface);
  transition: border-color var(--speed) var(--ease);
}
#v2 .dlv-addr:hover { border-color: var(--line-strong); }
#v2 .dlv-addr:focus-within { border-color: var(--brand); }
#v2 :is(.v2-card, .panel, .dlv-dialog) .dlv-addr { background: var(--field); }
#v2 :is(.v2-card, .panel, .dlv-dialog) .dlv-addr:focus-within { background: var(--surface); }
#v2 .quote-dlv .dlv-addr { grid-template-columns: minmax(0, 1fr) auto; background: var(--surface); }
#v2 .dlv-addr .dlv-addr__input,
#v2 .dlv-addr .dlv-addr__input:hover,
#v2 .dlv-addr .dlv-addr__input:focus {
  height: 44px; min-height: 0; padding: 0 8px 0 18px;
  border: 0; border-radius: var(--r-pill); background: transparent; box-shadow: none;
  color: var(--ink); font-size: 16px; font-weight: 400;
}
#v2 .dlv-addr .dlv-addr__input::placeholder { color: var(--hint); }
/* display не задаётся: у межгорода кнопку прячет .delivery-address.is-calc-off [data-dlv-calc] */
#v2 .dlv-addr .dlv-addr__btn {
  min-height: var(--btn-h-sm); height: var(--btn-h-sm); padding: 0 var(--btn-px-sm);
  border-color: var(--brand); background: var(--brand); color: #fff;
  font-size: 15px; white-space: nowrap;
}
#v2 .dlv-addr .dlv-addr__btn:hover { border-color: var(--brand-hover); background: var(--brand-hover); color: #fff; }
#v2 .dlv-addr .dlv-addr__btn:active { border-color: var(--brand-press); background: var(--brand-press); }
#v2 .dlv-addr .dlv-addr__btn[aria-busy="true"] { opacity: .72; }
/* Поиск лупой: круглая кнопка 44 внутри капсулы */
#v2 .dlv-addr .dlv-addr__btn--icon {
  place-items: center; width: var(--btn-h-sm); padding: 0;
  border-radius: var(--r-pill);
}
#v2 .dlv-addr .dlv-addr__btn--icon:not([hidden]) { display: inline-grid; }
#v2 .delivery-address.is-calc-off .dlv-addr__btn--icon { display: none; }
#v2 .dlv-addr .dlv-addr__btn--icon svg { width: 20px; height: 20px; fill: none; stroke: currentColor; stroke-width: 1.8; stroke-linecap: round; }
/* Калькулятор ЖК: рядом основная «Добавить расчёт в заявку» - здесь мягкая кнопка */
#v2 .dlv-addr--compact .dlv-addr__btn { border-color: var(--brand-tint); background: var(--brand-tint); color: var(--brand-hover); }
#v2 .dlv-addr--compact .dlv-addr__btn:hover,
#v2 .dlv-addr--compact .dlv-addr__btn:active { border-color: var(--brand-tint-2); background: var(--brand-tint-2); color: var(--brand-hover); }
#v2 .dlv-addr--compact .dlv-addr__input,
#v2 .dlv-addr--compact .dlv-addr__input:hover,
#v2 .dlv-addr--compact .dlv-addr__input:focus { font-size: 15px; }

/* Подсказки адресов при наборе (Photon) - выпадающая панель 5.10 под полем */
#v2 .dlv-suggest {
  position: absolute; top: calc(100% + 8px); left: 0; right: 0; z-index: 40;
  display: grid; gap: 2px; max-height: 336px; overflow: auto;
  margin: 0; padding: 8px; list-style: none;
  border-radius: var(--r); background: var(--surface); box-shadow: var(--shadow-pop);
}
#v2 .dlv-suggest[hidden] { display: none; }
#v2 .dlv-suggest__item {
  display: grid; grid-template-columns: 20px minmax(0, 1fr); align-items: start; gap: 12px;
  padding: 10px 12px; border-radius: var(--r-in);
  color: var(--ink); cursor: pointer;
  transition: background-color var(--speed) var(--ease);
}
#v2 .dlv-suggest__item:hover,
#v2 .dlv-suggest__item.is-active { background: var(--field); }
#v2 .dlv-suggest__icon { display: grid; place-items: center; height: 20px; color: var(--muted); }
#v2 .dlv-suggest__icon svg { width: 18px; height: 18px; fill: none; stroke: currentColor; stroke-width: 1.6; stroke-linejoin: round; }
#v2 .dlv-suggest__item.is-active .dlv-suggest__icon { color: var(--brand); }
#v2 .dlv-suggest__text { display: grid; gap: 2px; min-width: 0; }
#v2 .dlv-suggest__text strong { color: inherit; font-size: 15px; font-weight: 500; line-height: 1.35; }
#v2 .dlv-suggest__item.is-active .dlv-suggest__text strong { color: var(--brand); }
#v2 .dlv-suggest__text small { color: var(--muted); font-size: 13px; line-height: 1.4; }
/* Первая строка - «Найти «…» в Алматы» (поиск, как Enter): лупа вместо пина, ниже волосяная линия
   до подсказок */
#v2 .dlv-suggest__item--search .dlv-suggest__icon svg { stroke-linecap: round; }
#v2 .dlv-suggest__item--search + .dlv-suggest__item { position: relative; margin-top: 5px; }
#v2 .dlv-suggest__item--search + .dlv-suggest__item::before {
  content: ""; position: absolute; top: -4px; left: 12px; right: 12px;
  border-top: 1px solid var(--hairline); pointer-events: none;
}

/* Строка состояния: 14px, иконка 16 (найдено --brand, ошибка --danger, «Считаем…» muted) */
#v2 .dlv-status { gap: 4px; color: var(--muted); font-size: 14px; line-height: 1.45; }
#v2 .delivery-address .dlv-status { margin: 0; padding-left: 4px; }
#v2 .dlv-status__line { gap: 8px; }
#v2 .dlv-status__line svg { flex-basis: 16px; width: 16px; height: 16px; margin-top: 2px; stroke-width: 1.6; }
#v2 .dlv-status__line strong { color: var(--ink); font-weight: 500; }
#v2 .dlv-status__line--ok { color: var(--ink); }
#v2 .dlv-status__line--ok svg { stroke: var(--brand); }
#v2 .dlv-status__line--error { color: var(--danger); font-weight: 400; }
#v2 .dlv-status__line--warn { color: var(--warn); }
#v2 .dlv-status__line--idle, #v2 .dlv-status__line--hint { color: var(--muted); }
#v2 .dlv-status__line--source { color: var(--muted); font-size: 12px; }
#v2 .dlv-status__line--ok ~ .dlv-status__line--source,
#v2 .dlv-status__line--ok ~ .dlv-status__line--warn { padding-left: 24px; }
#v2 .dlv-status__line--loading::before { border-width: 1.6px; }

#v2 .dlv-link {
  color: var(--brand); font-weight: 500;
  text-decoration: underline; text-decoration-thickness: 1px; text-underline-offset: 3px;
  transition: color var(--speed) var(--ease);
}
#v2 .dlv-link:hover { color: var(--brand-hover); }

/* Несколько найденных адресов: список-панель, выбранный - радио-отметка --brand */
#v2 .dlv-variants { gap: 8px; }
#v2 .dlv-variants__title { padding-left: 4px; color: var(--muted); font-size: 13px; font-weight: 400; }
#v2 .dlv-variant {
  grid-template-columns: 20px minmax(0, 1fr); gap: 12px;
  padding: 12px 14px;
  border: 0; border-radius: var(--r-in);
  background: var(--surface); color: var(--ink); font-family: var(--font);
  transition: background-color var(--speed) var(--ease), box-shadow var(--speed) var(--ease);
}
#v2 :is(.v2-card, .panel, .dlv-dialog) .dlv-variant { background: var(--field); }
#v2 .quote-dlv .dlv-variant { background: var(--surface); }
#v2 .dlv-variant:hover { box-shadow: inset 0 0 0 1px var(--line-strong); }
#v2 .dlv-variant.is-active { background: var(--brand-tint); box-shadow: inset 0 0 0 1.5px var(--brand); }
#v2 .dlv-variant:focus-visible { outline: 2px solid var(--brand); outline-offset: 2px; }
#v2 .dlv-variants--compact .dlv-variant { padding: 10px 14px; }
#v2 .dlv-variant__mark { width: 20px; height: 20px; margin-top: 0; border: 1.5px solid var(--control); background: var(--surface); }
#v2 .dlv-variant__mark svg { stroke: #fff; stroke-width: 2; }
#v2 .dlv-variant.is-active .dlv-variant__mark { border-color: var(--brand); background: var(--brand); }
#v2 .dlv-variant__text strong { font-size: 14px; font-weight: 500; line-height: 1.35; }
#v2 .dlv-variant.is-active .dlv-variant__text strong { color: var(--brand-hover); }
#v2 .dlv-variant__text small { color: var(--muted); font-size: 13px; }

/* Итог доставки: «Стоимость доставки» слева, сумма справа 20/500; под ней расстояние 13 muted.
   Поля «Расстояние от склада, км» нет (правка 28): километры - только из расчёта по адресу */
#v2 .delivery-km {
  gap: 4px; padding: 14px 18px;
  border: 0; border-radius: var(--r-in); background: var(--surface);
}
#v2 .delivery-km__head { align-items: baseline; gap: 2px 16px; }
#v2 .delivery-km__title { color: var(--muted); font-size: 14px; font-weight: 400; }
#v2 .delivery-km__price { color: var(--ink); font-size: 20px; font-weight: 500; letter-spacing: -0.02em; }
#v2 .delivery-km__price.is-unknown { color: var(--muted); font-size: 15px; font-weight: 400; letter-spacing: 0; }
#v2 .delivery-km__source { color: var(--muted); font-size: 13px; line-height: 1.5; }
#v2 .delivery-km__source[hidden] { display: none; }
#v2 .delivery-km__source.is-manual { color: var(--warn); }

/* Карта: окно радиус 12 без рамки; заглушка - миллиметровка, как фото товара (7.1) */
#v2 .dlv-map {
  border: 0; border-radius: var(--r-in); background: var(--paper);
}
#v2 .quote-dlv .quote-dlv__map { min-height: 0; height: clamp(300px, 28vw, 380px); }
#v2 .dlv-map .leaflet-container { background: var(--paper); font-family: var(--font); }
#v2 .dlv-map__placeholder {
  gap: 12px;
  background:
    linear-gradient(var(--grid-minor) 1px, transparent 1px) 0 0 / 24px 24px,
    linear-gradient(90deg, var(--grid-minor) 1px, transparent 1px) 0 0 / 24px 24px,
    var(--paper);
  color: var(--muted); font-size: 14px;
}
#v2 .dlv-map__placeholder svg { width: 32px; height: 32px; stroke-width: 1.6; opacity: 1; }
/* Телефон: карта в странице не двигается под пальцем - касание открывает её на весь экран */
#v2 .dlv-map.is-static .leaflet-container { cursor: pointer; }

/* Пин в центре карты: стоит на месте, двигается карта (assets/delivery-map.js, DeliveryMap).
   Тащат карту - пин приподнимается, под ним тень-точка; отпустили - опускается с лёгкой пружиной.
   Точки ещё нет - пин пустой (белый с зелёной обводкой) */
#v2 .dlv-center {
  position: absolute; left: 50%; top: 50%; z-index: 640;
  width: 0; height: 0; pointer-events: none;
}
#v2 .dlv-center__pin {
  position: absolute; left: -17px; top: -43px; width: 34px; height: 44px; overflow: visible;
  filter: drop-shadow(0 4px 4px rgb(22 30 23 / .28));
  transition: transform 280ms cubic-bezier(.34, 1.56, .64, 1);
}
#v2 .dlv-center__pin path { fill: var(--brand); stroke: #fff; stroke-width: 2; transition: fill var(--speed) var(--ease); }
#v2 .dlv-center__pin circle { fill: #fff; transition: fill var(--speed) var(--ease); }
#v2 .dlv-map:not(.has-point) .dlv-center__pin path { fill: var(--surface); stroke: var(--brand); }
#v2 .dlv-map:not(.has-point) .dlv-center__pin circle { fill: var(--brand); }
#v2 .dlv-center__dot {
  position: absolute; left: -4px; top: -3px; width: 8px; height: 6px;
  border-radius: var(--r-pill); background: rgb(22 30 23 / .4);
  opacity: 0; transform: scale(.5);
  transition: opacity 160ms var(--ease), transform 160ms var(--ease);
}
#v2 .dlv-map.is-moving .dlv-center__pin {
  transform: translateY(-12px);
  transition-duration: 140ms; transition-timing-function: cubic-bezier(.2, .8, .2, 1);
}
#v2 .dlv-map.is-moving .dlv-center__dot,
#v2 .dlv-map.is-pending .dlv-center__dot { opacity: 1; transform: scale(1); }
#v2 .dlv-map.is-pending .dlv-center__dot { animation: dlv-ground 1.1s var(--ease) infinite; }
@keyframes dlv-ground { 50% { transform: scale(1.6); opacity: .45; } }
/* Адрес под пином - подпись над ним, во всю ширину карты по центру (длинный - многоточием) */
#v2 .dlv-center__tag {
  position: absolute; left: 12px; right: 12px; bottom: calc(50% + 52px); z-index: 650;
  display: flex; justify-content: center; pointer-events: none;
  transition: opacity 140ms var(--ease);
}
#v2 .dlv-center__tag[hidden] { display: none; }
#v2 .dlv-map.is-moving .dlv-center__tag { opacity: 0; }
#v2 .dlv-center__label {
  min-width: 0; overflow: hidden; padding: 7px 14px;
  border-radius: var(--r-pill); background: var(--surface); box-shadow: var(--shadow);
  color: var(--ink); font: 500 14px/1.3 var(--font); white-space: nowrap; text-overflow: ellipsis;
}
#v2 .dlv-map.is-pending .dlv-center__label { color: var(--muted); font-weight: 400; }
#v2 .dlv-map:not(.is-ready) :is(.dlv-center, .dlv-center__tag, .dlv-map__locate) { display: none; }

/* Кнопки поверх карты: «+/-» и «На весь экран» - белые круги 40 с --shadow одним рядом сверху,
   «Моё местоположение» - круг справа внизу над подписью карты */
#v2 .dlv-map__expand {
  top: 8px; right: 8px; z-index: 1000;
  gap: 8px; min-height: 40px; height: 40px; padding: 0 16px 0 14px;
  border: 0; border-radius: var(--r-pill);
  background: var(--surface); color: var(--ink); box-shadow: var(--shadow);
  font-family: var(--font); font-size: 14px; font-weight: 500;
  transition: color var(--speed) var(--ease);
}
#v2 .dlv-map__expand:hover { border: 0; color: var(--brand); }
#v2 .dlv-map__expand:focus-visible { outline: 2px solid var(--brand); outline-offset: 2px; }
#v2 .dlv-map__expand svg { width: 16px; height: 16px; stroke-width: 1.6; }
#v2 .dlv-map__locate {
  position: absolute; right: 8px; bottom: 30px; z-index: 1000;
  display: grid; place-items: center; width: 40px; height: 40px; padding: 0;
  border: 0; border-radius: var(--r-pill);
  background: var(--surface); color: var(--ink); box-shadow: var(--shadow);
  cursor: pointer;
  transition: color var(--speed) var(--ease);
}
#v2 .dlv-map__locate:hover { color: var(--brand); }
#v2 .dlv-map__locate:focus-visible { outline: 2px solid var(--brand); outline-offset: 2px; }
#v2 .dlv-map__locate svg { width: 20px; height: 20px; fill: none; stroke: currentColor; stroke-width: 1.6; stroke-linecap: round; }
#v2 .dlv-map__locate[aria-busy="true"] { color: var(--brand); }
#v2 .dlv-map__locate[aria-busy="true"] svg { animation: dlv-locate 1s var(--ease) infinite; }
@keyframes dlv-locate { 50% { opacity: .35; } }
#v2 .dlv-map .leaflet-top.leaflet-left .leaflet-control-zoom { margin: 8px 0 0 8px; }
#v2 .dlv-map .leaflet-control-zoom.leaflet-bar {
  display: flex; gap: 8px; overflow: visible;
  border: 0; border-radius: 0; background: none; box-shadow: none;
}
#v2 .dlv-map .leaflet-control-zoom.leaflet-bar a,
#v2 .quote-dlv .quote-dlv__map .leaflet-control-zoom.leaflet-bar a {
  display: grid; place-items: center;
  width: 40px; height: 40px; border: 0; border-radius: var(--r-pill);
  background: var(--surface); color: var(--ink); box-shadow: var(--shadow);
  font: 400 22px/40px var(--font); text-indent: 0;
  transition: color var(--speed) var(--ease);
}
#v2 .dlv-map .leaflet-control-zoom.leaflet-bar a + a { border: 0; }
#v2 .dlv-map .leaflet-control-zoom.leaflet-bar a:hover { background: var(--surface); color: var(--brand); }
#v2 .dlv-map .leaflet-control-zoom.leaflet-bar a.leaflet-disabled { background: var(--surface); color: var(--hint); cursor: default; }
/* Подпись карты 12px, как у Leaflet (в v1 было 10.5 - мельче нижней границы 12) */
#v2 .dlv-map .leaflet-control-attribution { border-radius: var(--r-in) 0 0 0; font-size: 12px; }

/* Окно карты «На весь экран» - оболочка 5.11; на телефоне во весь экран, «Готово» во всю ширину */
#v2 .dlv-dialog {
  width: min(1040px, calc(100vw - 48px)); height: min(800px, calc(100vh - 48px));
  border: 0; border-radius: var(--r);
  background: var(--surface); color: var(--ink); box-shadow: var(--shadow-pop);
  font-family: var(--font);
}
#v2 .dlv-dialog::backdrop { background: rgb(22 30 23 / .45); backdrop-filter: blur(2px); }
#v2 .dlv-dialog__head { display: flex; align-items: center; justify-content: space-between; gap: 16px; padding: 20px 24px 14px; }
#v2 .dlv-dialog__title { margin: 0; font-size: 22px; font-weight: 500; line-height: 1.15; letter-spacing: -0.02em; }
#v2 .dlv-dialog__close {
  flex: none; width: 40px; height: 40px; border: 0; border-radius: var(--r-pill);
  background: var(--field); color: var(--ink);
  transition: background-color var(--speed) var(--ease);
}
#v2 .dlv-dialog__close:hover { border: 0; background: var(--hairline); }
#v2 .dlv-dialog__close svg { stroke-width: 1.6; }
/* Поиск над картой: подсказки ложатся поверх карты, поэтому без прокрутки у самого блока -
   прокручивается только длинный список вариантов */
#v2 .dlv-dialog__search { position: relative; z-index: 2; gap: 8px; max-height: none; overflow: visible; padding: 0 24px 14px; }
#v2 .dlv-dialog .dlv-variants { max-height: 28vh; overflow: auto; }
#v2 .dlv-dialog .dlv-status { padding-left: 4px; }
#v2 .dlv-dialog__map { min-height: 240px; border-radius: 0; }
#v2 .dlv-dialog__foot {
  display: flex; align-items: center; justify-content: space-between; gap: 12px 24px;
  padding: 16px 24px; border-top: 1px solid var(--hairline);
}
#v2 .dlv-dialog__summary { display: grid; gap: 2px; min-width: 0; color: var(--muted); font-size: 14px; line-height: 1.45; }
#v2 .dlv-dialog__summary strong { color: var(--ink); font-size: 20px; font-weight: 500; letter-spacing: -0.02em; }
#v2 .dlv-dialog__done { flex: none; min-width: 200px; }

/* ==========================================================================
   7. Итог «Ваша заявка» (10.6, правка 30): всё по левому краю - строки, под ними «Итого
   предварительно», сумма строкой ниже, НДС одной строкой; кнопки во всю ширину; почему кнопка
   выключена - одна короткая строка под ними слева
   ========================================================================== */
:is(#view-quote, #view-kp) .cart-summary {
  top: calc(var(--hd-h, 80px) + 24px);
  padding: 28px;
}
:is(#view-quote, #view-kp) .cart-summary__title { align-items: center; gap: 12px; margin-bottom: 8px; }
:is(#view-quote, #view-kp) .cart-summary__title h3 { margin: 0; font-size: 22px; font-weight: 500; line-height: 1.2; letter-spacing: -0.02em; }
:is(#view-quote, #view-kp) .summary-line {
  align-items: baseline; gap: 16px;
  padding: 14px 0; border-bottom: 1px solid var(--hairline);
  color: var(--muted); font-size: 15px; line-height: 1.4;
}
:is(#view-quote, #view-kp) .summary-line > span { flex: none; }
:is(#view-quote, #view-kp) .summary-line strong { min-width: 0; color: var(--ink); font-size: 15px; font-weight: 500; text-align: right; }
/* Позиций нет (заявка по описанию) - строки «Количество 0 шт.» нет */
:is(#view-quote, #view-kp) .summary-line[hidden] { display: none; }
:is(#view-quote, #view-kp) .summary-total { display: grid; justify-items: start; gap: 4px; padding: 20px 0 0; text-align: left; }
:is(#view-quote, #view-kp) .summary-total__label { color: var(--muted); font-size: 15px; line-height: 1.4; }
:is(#view-quote, #view-kp) .summary-total__value {
  color: var(--ink); font-size: 28px; font-weight: 500; line-height: 1.15; letter-spacing: -0.02em;
  font-variant-numeric: tabular-nums;
}
/* «+ доставка» - своей строкой под суммой, тише неё: на 320 она переносилась кусками и читалась второй суммой */
:is(#view-quote, #view-kp) .summary-total__extra {
  display: block; margin-top: 2px;
  color: var(--muted); font-size: 15px; font-weight: 400; line-height: 1.4; letter-spacing: 0;
}
/* Суммы нет (товары без цены или только описание) - «По расчёту менеджера» тише и мельче суммы */
:is(#view-quote, #view-kp) .summary-total__value.is-pending { color: var(--ink-2); font-size: 20px; line-height: 1.25; letter-spacing: -0.01em; }
:is(#view-quote, #view-kp) .summary-note { margin: 2px 0 0; padding: 0; border: 0; border-radius: 0; background: none; color: var(--muted); font-size: 13px; line-height: 1.45; }
:is(#view-quote, #view-kp) .cart-summary .form-grid { gap: 10px; margin: 20px 0 0; }
:is(#view-quote, #view-kp) .cart-summary .form-grid .btn { width: 100%; padding-inline: 18px; font-size: 15px; }
@media (min-width: 761px) {
  :is(#view-quote, #view-kp) .cart-summary .form-grid .btn { white-space: nowrap; }
}
:is(#view-quote, #view-kp) .quote-submit-hint { margin: 10px 0 0; padding: 0; color: var(--muted); font-size: 13px; line-height: 1.45; text-align: left; }

/* Заявка отправлена - заметка .v2-note--tint (и в формах тендеров и МВО) */
#v2 .qf-sent {
  margin-top: 16px; padding: 16px 18px;
  border: 0; border-radius: var(--r-in);
  background: var(--brand-tint); color: var(--brand-hover);
  font-size: 14px; line-height: 1.5;
}
#v2 .qf-sent strong { margin-bottom: 4px; color: var(--brand-hover); font-size: 15px; font-weight: 500; }
#v2 .qf-sent ul { gap: 4px; margin-top: 10px; font-size: 13px; }
#v2 .mvo-form .qf-sent { margin-top: 0; }

/* ==========================================================================
   8. Адаптив
   ========================================================================== */
/* Две колонки (от 1041): итог прилипает под шапкой во всём диапазоне - правило v1 «≤ 1180 static»
   оставляло правую колонку пустой, пока листают форму. Выше экрана итог не растёт: после отправки
   (блок «Заявка передана менеджеру») на ноутбуке 1280×720 он прокручивается внутри себя */
@media (min-width: 1041px) {
  :is(#view-quote, #view-kp) .cart-summary {
    position: sticky;
    max-height: calc(100vh - var(--hd-h, 80px) - 48px); overflow-y: auto; overscroll-behavior: contain;
  }
}
/* ≤ 1040: итог под формой; на планшете - в две колонки: строки слева, итог и кнопки справа */
@media (max-width: 1040px) {
  :is(#view-quote, #view-kp) .quote-page { grid-template-columns: minmax(0, 1fr); }
  :is(#view-quote, #view-kp) .cart-summary { position: static; }
}
/* Строки: заголовок и три строки (1-4), свободная строка 5 забирает лишнюю высоту столбика кнопок
   (иначе он растягивал строку после «Доставки» и «Оплата» отъезжала на 17px), под ним подсказка и
   подтверждение. Кнопки переносят подпись: в колонке 313px на iPad 768 «Выставить удалённый счёт
   на Kaspi» в строку не помещалась и заходила на поле карточки */
@media (min-width: 761px) and (max-width: 1040px) {
  #view-quote .cart-summary {
    display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
    grid-template-rows: repeat(4, auto) 1fr auto auto;
    column-gap: clamp(32px, 5vw, 56px); align-items: start;
    padding: clamp(24px, 3vw, 36px);
  }
  #view-quote .cart-summary > :is(.cart-summary__title, .summary-line) { grid-column: 1; }
  #view-quote .cart-summary > .summary-total { grid-column: 2; grid-row: 1 / 3; padding-top: 0; }
  #view-quote .cart-summary > .form-grid { grid-column: 2; grid-row: 3 / 6; align-self: end; }
  #view-quote .cart-summary .form-grid .btn { padding-block: 8px; white-space: normal; text-wrap: balance; }
  #view-quote .cart-summary > .quote-submit-hint { grid-column: 2; grid-row: 6; }
  #view-quote .cart-summary > .lead-error { grid-column: 2; }
  #view-quote .cart-summary > .qf-sent { grid-column: 1 / -1; grid-row: 7; }
}

/* 1041-1180: колонка формы узкая - строка позиции в два этажа: товар, под ним цена, счётчик, сумма.
   Шапки над двумя этажами нет, поэтому подписи шапки («Цена», «Кол-во», «Сумма») - над каждым значением */
@media (min-width: 1041px) and (max-width: 1180px) {
  #view-quote .quote-table thead { display: none; }
  #view-quote .quote-table tr {
    grid-template-columns: minmax(0, 1fr) auto 112px;
    grid-template-areas: "prod prod prod" "price qty sum";
    align-items: start; gap: 12px 16px;
  }
  #view-quote .quote-table td:first-child { grid-area: prod; }
  /* подпись сверху, значение - по центру высоты счётчика (44) */
  #view-quote .quote-table td:nth-child(n + 2) { display: grid; grid-template-rows: auto 44px; row-gap: 4px; align-items: center; }
  #view-quote .quote-table td:nth-child(2) { grid-area: price; justify-items: start; padding-left: 72px; text-align: left; }
  #view-quote .quote-table td:nth-child(3) { grid-area: qty; justify-items: start; justify-content: stretch; }
  #view-quote .quote-table td:nth-child(4) { grid-area: sum; justify-items: end; }
  #view-quote .quote-table td:nth-child(n + 2)::before { color: var(--muted); font-size: 13px; font-weight: 400; line-height: 1.3; white-space: nowrap; }
  #view-quote .quote-table td:nth-child(2)::before { content: "Цена"; }
  #view-quote .quote-table td:nth-child(3)::before { content: "Кол-во"; }
  #view-quote .quote-table td:nth-child(4)::before { content: "Сумма"; }
}

@media (max-width: 900px) {
  #view-quote .quote-table tr { grid-template-columns: minmax(0, 1fr) 96px 124px 104px; column-gap: 12px; }
}

/* Варианты доставки: подпись одной строкой (правка 31). Три карточки в ряд - только когда в каждой
   помещается «Со склада в Алматы, бесплатно» (14px, ~213px): блок от 790px. Уже - строки списком
   (значок | текст | отметка), как на телефоне: так на 761-900 и 1041-1340, где форма узкая */
#view-quote [data-quote-delivery-field] { container: quote-delivery / inline-size; }
@container quote-delivery (max-width: 789px) {
  #view-quote .delivery-options { grid-template-columns: minmax(0, 1fr); gap: 8px; }
  #v2 .delivery-option {
    grid-template-columns: 40px minmax(0, 1fr) 20px; grid-template-areas: "icon body mark";
    align-items: center; gap: 12px; padding: 14px 16px;
  }
  #v2 .delivery-option__icon { width: 40px; height: 40px; }
  #v2 .delivery-option__mark { margin-top: 0; }
}

/* Телефон: одна колонка, строки позиций - карточкой: товар, цена, счётчик и сумма */
@media (max-width: 760px) {
  :is(#view-quote, #view-kp) .quote-page, :is(#view-quote, #view-kp) .quote-main { gap: 12px; }
  :is(#view-quote, #view-kp) .quote-section { padding: 24px 16px; }
  :is(#view-quote, #view-kp) .quote-section__head { flex-direction: column; align-items: flex-start; gap: 12px; margin-bottom: 20px; }
  :is(#view-quote, #view-kp) .quote-section__head h2 { font-size: 22px; }

  :is(#view-quote, #view-kp) .quote-add__item { grid-template-columns: 44px minmax(0, 1fr) auto; gap: 12px; }
  :is(#view-quote, #view-kp) .quote-add__media { width: 44px; height: 44px; }
  /* Счётчик и «Удалить» под палец: кнопки «-»/«+» 44 (пилюля 52, как на странице товара),
     у «Удалить» вид прежний (32), а нажимается полоса 44 */
  :is(#view-quote, #view-kp) .quote-table .qty { height: 52px; }
  :is(#view-quote, #view-kp) .quote-table .qty button { width: 44px; height: 44px; }
  :is(#view-quote, #view-kp) .quote-table .qty input { height: 44px; }
  :is(#view-quote, #view-kp) .quote-product__remove { position: relative; }
  :is(#view-quote, #view-kp) .quote-product__remove::after { content: ""; position: absolute; inset: -6px -4px; }

  /* Шапки нет - у каждого значения своя подпись, как в v1: «Цена», «Количество», «Сумма» строками подпись - значение */
  #view-quote .quote-table thead { display: none; }
  #view-quote .quote-table tbody { display: block; }
  #view-quote .quote-table tr,
  #view-quote .quote-table tbody tr:last-child {
    grid-template-columns: minmax(0, 1fr);
    grid-template-areas: "prod" "price" "qty" "sum";
    gap: 10px; padding: 16px 0; margin: 0;
    border: 0; border-bottom: 1px solid var(--hairline); border-radius: 0; background: none;
  }
  #view-quote .quote-table tbody tr:first-child { padding-top: 4px; }
  #view-quote .quote-table tbody tr:last-child { padding-bottom: 0; border-bottom: 0; }
  #view-quote .quote-table td { width: auto; padding: 0; border: 0; font-size: 14px; }
  #view-quote .quote-table td:first-child { grid-area: prod; padding: 0 0 6px; border: 0; }
  #view-quote .quote-table td:nth-child(n + 2) {
    display: flex; justify-content: space-between; align-items: center; gap: 12px;
    min-height: 0; text-align: right;
  }
  #view-quote .quote-table td:nth-child(2) { grid-area: price; color: var(--ink-2); font-size: 14px; }
  #view-quote .quote-table td:nth-child(3) { grid-area: qty; }
  #view-quote .quote-table td:nth-child(4),
  #view-quote .quote-table tbody td:nth-child(4) { grid-area: sum; justify-self: stretch; }
  #view-quote .quote-table td:nth-child(n + 2)::before {
    color: var(--muted); font-size: 13px; font-weight: 400; line-height: 1.3; letter-spacing: 0; text-transform: none; text-align: left;
  }
  #view-quote .quote-table td:nth-child(2)::before { content: "Цена"; }
  #view-quote .quote-table td:nth-child(3)::before { content: "Количество"; }
  #view-quote .quote-table td:nth-child(4)::before { content: "Сумма"; }
  #view-quote .quote-table .qty { width: auto; }
  #view-quote .quote-table .qty button { min-height: 0; }
  #view-quote .quote-table .qty input { min-height: 0; }
  :is(#view-quote, #view-kp) .quote-product { align-items: flex-start; gap: 12px; }
  :is(#view-quote, #view-kp) .mini-photo { width: 56px; height: 56px; }
  :is(#view-quote, #view-kp) .quote-product strong { font-size: 15px; }

  :is(#view-quote, #view-kp) .payer-grid { grid-template-columns: minmax(0, 1fr); gap: 8px; }
  /* Как варианты доставки на телефоне: значок 40, отступы 14/16 */
  #v2 .payer-card { grid-template-columns: 40px minmax(0, 1fr) 20px; gap: 12px; padding: 14px 16px; }
  #v2 .payer-card__body > span { font-size: 13px; }

  :is(#view-quote, #view-kp) .contact-grid { grid-template-columns: minmax(0, 1fr); gap: 16px; }

  #view-quote .delivery-options { grid-template-columns: minmax(0, 1fr); gap: 8px; }
  #v2 .delivery-option {
    grid-template-columns: 40px minmax(0, 1fr) 20px; grid-template-areas: "icon body mark";
    align-items: center; gap: 12px; padding: 14px 16px;
  }
  #v2 .delivery-option__icon { width: 40px; height: 40px; }
  /* Подпись одной строкой и на телефоне: «Со склада в Алматы, бесплатно» */
  #v2 .delivery-option__body > span { font-size: 13px; }
  #v2 .delivery-option__mark { margin-top: 0; }

  /* 280: подпись адреса над пином не заходит под ряд кнопок карты */
  #v2 .quote-dlv .quote-dlv__map { height: 280px; }

  :is(#view-quote, #view-kp) .cart-summary { padding: 24px 16px; }
  :is(#view-quote, #view-kp) .cart-summary__title h3 { font-size: 20px; }
  :is(#view-quote, #view-kp) .summary-total__value { font-size: 26px; }
  :is(#view-quote, #view-kp) .summary-total__value.is-pending { font-size: 20px; }
  /* На 320-375 «Выставить удалённый счёт на Kaspi» в строку не помещается - две ровные строки */
  :is(#view-quote, #view-kp) .cart-summary .form-grid .btn { padding-block: 8px; text-wrap: balance; }
}

/* Поиск товара в заявке на телефоне: название целиком (обрезка в две строки оставляла у всех
   вариантов «Металлический евроконтейне…» - колёса, сталь и отбойники не было видно) */
@media (max-width: 600px) {
  :is(#view-quote, #view-kp) .quote-add__item { grid-template-columns: 40px minmax(0, 1fr) auto; gap: 10px; }
  :is(#view-quote, #view-kp) .quote-add__media { width: 40px; height: 40px; }
  :is(#view-quote, #view-kp) .quote-add__title { display: block; overflow: visible; -webkit-line-clamp: unset; font-size: 14px; line-height: 1.35; }
  :is(#view-quote, #view-kp) .quote-add__plus { width: 32px; height: 32px; }
}

/* Узкий телефон: подпись варианта доставки одной строкой - значок 32, отступы 12 (на 360-389);
   на 320-359 и так не помещается - карточка без значка (он только украшение) */
@media (max-width: 389px) {
  #v2 .delivery-option { grid-template-columns: 32px minmax(0, 1fr) 20px; gap: 10px; padding: 12px; }
  #v2 .delivery-option__icon { width: 32px; height: 32px; }
  #v2 .delivery-option__icon svg { width: 18px; height: 18px; }
  /* Плательщик - так же, карточки выбора в форме одинаковые */
  #v2 .payer-card { grid-template-columns: 32px minmax(0, 1fr) 20px; gap: 10px; padding: 12px; }
  #v2 .payer-card .payer-card__icon { width: 32px; height: 32px; }
  #v2 .payer-card .payer-card__icon svg { width: 18px; height: 18px; }
}
@media (max-width: 359px) {
  #v2 .delivery-option { grid-template-columns: minmax(0, 1fr) 20px; grid-template-areas: "body mark"; padding: 12px 14px; }
  #v2 .delivery-option__icon { display: none; }
  #v2 .payer-card { grid-template-columns: minmax(0, 1fr) 20px; padding: 12px 14px; }
  #v2 .payer-card .payer-card__icon { display: none; }
}

/* Поле адреса в калькуляторе ЖК - 16px на телефоне и планшете: мельче iOS Safari увеличивает
   страницу при фокусе */
@media (max-width: 760px), (pointer: coarse) {
  #v2 .dlv-addr--compact .dlv-addr__input,
  #v2 .dlv-addr--compact .dlv-addr__input:hover,
  #v2 .dlv-addr--compact .dlv-addr__input:focus { font-size: 16px; }
}

/* Узкая форма: поле адреса заявки остаётся капсулой с лупой (кнопка-иконка не занимает места) */
@media (max-width: 560px) {
  #v2 .quote-dlv { padding: 12px; }
  #v2 .quote-dlv .delivery-address .dlv-addr { grid-template-columns: minmax(0, 1fr) auto; }
  #v2 .dlv-dialog__head { padding: 14px 16px 10px; }
  #v2 .dlv-dialog__title { font-size: 20px; }
  #v2 .dlv-dialog__search { padding: 0 16px 12px; }
}
@media (max-width: 640px) {
  #v2 .dlv-dialog { width: 100vw; height: 100vh; height: 100dvh; border-radius: 0; }
  #v2 .dlv-dialog__foot {
    display: grid; grid-template-columns: minmax(0, 1fr); gap: 10px;
    padding: 12px 16px calc(12px + env(safe-area-inset-bottom));
  }
  #v2 .dlv-dialog__done { width: 100%; min-width: 0; min-height: var(--btn-h); font-size: 17px; }
}

@media (prefers-reduced-motion: reduce) {
  #v2 :is(.payer-card, .payer-card__mark, .delivery-option, .delivery-option__mark, .dlv-variant, .dlv-suggest__item, .quote-add__item, .quote-product__remove, .qf-file__remove) { transition: none; }
  #v2 :is(.dlv-center__pin, .dlv-center__pin path, .dlv-center__pin circle, .dlv-center__dot, .dlv-center__tag) { transition: none; }
  #v2 .dlv-map.is-moving .dlv-center__pin { transform: none; }
  #v2 .dlv-map.is-pending .dlv-center__dot,
  #v2 .dlv-map__locate[aria-busy="true"] svg { animation: none; }
}

/* ==========================================================================
   9. Лид-формы: ошибка отправки (showLeadError) - заметка --danger-bg радиус 12, как .v2-note
   Лид-полоса .hd-lead держит свою строку под капсулой (фундамент) - её не трогаем.
   ========================================================================== */
#v2 .lead-error:not(.hd-lead__form *) {
  margin: 12px 0 0; padding: 12px 16px;
  border: 0; border-radius: var(--r-in);
  background: var(--danger-bg); color: var(--danger);
  font-size: 14px; font-weight: 400; line-height: 1.5;
}
#v2 .lead-error[hidden] { display: none; }

/* ==========================================================================
   10. Запрос КП (/kp, #view-kp). Общее с оформлением заказа - в разделах выше. Своё: строки позиций
   без цен (товар | количество), карточки выбора («Для кого КП», «Куда прислать КП») - по две в ряд,
   пока блок шире 600px, документы - плашками с галочкой, как карточки выбора, строка про данные
   ========================================================================== */
#view-kp .quote-section { container: kp-section / inline-size; }
#view-kp .quote-section .kp-need { margin-top: 24px; }
#view-kp .quote-table--kp tr { grid-template-columns: minmax(0, 1fr) 124px; }
#view-kp .quote-table--kp :is(th, td):nth-child(2) { display: flex; justify-content: center; text-align: center; color: var(--ink); }
@container kp-section (max-width: 599px) {
  #view-kp .payer-grid { grid-template-columns: minmax(0, 1fr); gap: 8px; }
  #v2 #view-kp .payer-card { grid-template-columns: 40px minmax(0, 1fr) 20px; gap: 12px; padding: 14px 16px; }
  #v2 #view-kp .payer-card .payer-card__icon { width: 40px; height: 40px; }
}

/* Поле «Номер лота» - только у тендера и госзаказчика: display у .field сильнее атрибута hidden */
#view-kp [data-kp-lot-field][hidden] { display: none; }
#view-kp .kp-docs { display: grid; gap: 0; min-width: 0; margin: 0; padding: 0; border: 0; }
#view-kp .kp-docs legend { margin: 0 0 8px; padding: 0 0 0 4px; color: var(--muted); font-size: 14px; line-height: 1.3; }
#view-kp .kp-docs__grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(220px, 1fr)); gap: 8px; }
#view-kp .kp-doc {
  display: flex; align-items: center; gap: 12px;
  min-height: 52px; padding: 12px 16px;
  border-radius: var(--r-in); background: var(--field);
  color: var(--ink); font-size: 15px; font-weight: 400; line-height: 1.3; cursor: pointer;
  transition: background-color var(--speed) var(--ease), box-shadow var(--speed) var(--ease);
}
#view-kp .kp-doc input { flex: none; }
#view-kp .kp-doc:hover { box-shadow: inset 0 0 0 1px var(--line-strong); }
#view-kp .kp-doc:has(input:checked) { background: var(--brand-tint); box-shadow: inset 0 0 0 1.5px var(--brand); color: var(--brand-hover); }
#view-kp .kp-doc:has(input:focus-visible) { outline: 2px solid var(--brand); outline-offset: 2px; }
#view-kp .kp-legal { margin: 12px 0 0; color: var(--muted); font-size: 12px; line-height: 1.45; }

/* Планшет: итог под формой одним блоком - кнопка во всю ширину, без колонок оформления заказа */
@media (min-width: 761px) and (max-width: 1040px) {
  #view-kp .cart-summary { padding: clamp(24px, 3vw, 36px); }
}
/* Узкий телефон: количество - своей строкой под товаром, с подписью, как в корзине */
@media (max-width: 560px) {
  #view-kp .quote-table--kp thead { display: none; }
  #view-kp .quote-table--kp tr { grid-template-columns: minmax(0, 1fr); gap: 10px; }
  #view-kp .quote-table--kp tbody tr:first-child { padding-top: 4px; }
  #view-kp .quote-table--kp td:nth-child(2) { justify-content: space-between; align-items: center; gap: 12px; }
  #view-kp .quote-table--kp td:nth-child(2)::before { content: "Количество"; color: var(--muted); font-size: 13px; line-height: 1.3; }
  #view-kp .kp-docs__grid { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  #view-kp .kp-doc { gap: 10px; min-height: 48px; padding: 10px 12px; font-size: 14px; }
  #view-quote .quote-empty { padding: 20px 16px; }
  #view-quote .quote-empty__actions { display: grid; width: 100%; }
}

@media (prefers-reduced-motion: reduce) {
  #view-kp .kp-doc { transition: none; }
}
