/* Связи пакета и поиск свободных окон.

   Две вещи, которых не хватало против чужих шахматок:
   · бронь пакета лежит в нескольких строках, и ничто их не связывает;
   · сетка показывает занятое и молчит о свободном, хотя вопрос
     по телефону звучит «а когда свободно?» (SPEC §1.1).            */

/* ── связанные брони одного пакета ── */
.bk[data-pkg]{cursor:pointer}
.pkg-lit{
  box-shadow:inset 3px 0 0 var(--ok),0 0 0 1.5px var(--ink),
             0 4px 12px rgba(25,24,21,.13) !important;
  z-index:11;
}
.pkg-lit.wait{box-shadow:inset 3px 0 0 var(--wait),0 0 0 1.5px var(--ink),
              0 4px 12px rgba(25,24,21,.13) !important}

/* ── свободные окна ── */
.free .bk:not(.buf){opacity:.5}
.free .g-bg i::after{content:none}
.slot{
  position:absolute;top:6px;bottom:6px;border-radius:var(--r-sm);
  left:calc(var(--p) * 100% / var(--span) + 2px);
  width:calc(var(--len) * 100% / var(--span) - 4px);
  background:rgba(30,85,64,.10);box-shadow:inset 2px 0 0 rgba(30,85,64,.5);
  display:flex;align-items:center;justify-content:center;
  z-index:6;cursor:pointer;transition:var(--t-tap) var(--ease);transition-property:background-color,box-shadow;
}
@media (hover:hover) and (pointer:fine){
  .slot:hover{background:rgba(30,85,64,.2);box-shadow:inset 2px 0 0 var(--ok),0 0 0 1px rgba(30,85,64,.35)}
}
.slot b{
  font-size:var(--fs-xs);font-weight:500;
  letter-spacing:-.01em;color:var(--ok);white-space:nowrap;
}
.slot.narrow b{display:none}

/* ── перенос брони ─────────────────────────────────────────
   Захваченный блок приподнимается и отпускает содержимое наружу:
   табличка времени начинается от левого края брони, то есть от её
   начала, но в ширину не ограничена длительностью. Иначе на шаге
   в полчаса «16:30 — 20:30» не помещается в 52 пикселя.          */
.bk:not(.buf){cursor:grab}
.bk.dragging{
  cursor:grabbing;z-index:30;transition:none;overflow:visible;
  top:-2px;bottom:-2px;
  box-shadow:0 10px 24px rgba(25,24,21,.22),0 0 0 1.5px var(--ink) !important;
}
.bk.dragging > *:not(.drag-time){visibility:hidden}
.bk.dragging.bad{
  background:var(--late-bg) !important;
  box-shadow:0 10px 24px rgba(160,47,30,.26),0 0 0 1.5px var(--late) !important;
}

.drag-time{
  position:absolute;left:-1px;top:50%;transform:translateY(-50%);
  display:flex;flex-direction:column;gap:1px;
  padding:7px 11px;border-radius:var(--r);white-space:nowrap;
  background:var(--band);color:var(--band-ink);
  box-shadow:0 6px 18px rgba(25,24,21,.3);
  pointer-events:none;visibility:visible;
}
.drag-time.flip{left:auto;right:-1px}
.drag-time b{
  font-size:14px;font-weight:500;letter-spacing:-.01em;
}
.drag-time em{
  font-style:normal;font-size:10.5px;color:var(--band-ink-2);letter-spacing:.01em;
}
.drag-time span{font-size:11px;color:var(--band-ink);opacity:.9}
.bad .drag-time{background:var(--late)}
.bad .drag-time em{color:rgba(255,255,255,.72)}

@keyframes reject{
  0%,100%{transform:translateX(0)} 25%{transform:translateX(-4px)} 75%{transform:translateX(4px)}
}
.bk.reject{animation:reject .3s}
/* пока перенос не подтверждён, бронь показана на новом месте пунктиром */
.bk.pending{outline:2px dashed var(--ink);outline-offset:2px;z-index:15}

/* ── подтверждение переноса ──
   Отдельное окно на один вопрос: перенос меняет время у живого гостя,
   и молча по отпусканию мыши так делать нельзя.                     */
.confirm{
  position:fixed;z-index:80;width:296px;
  background:var(--card);border-radius:var(--r-lg);
  box-shadow:var(--sh-3);padding:14px;
  /* Без visibility и без перехода: вопрос должен появляться сразу
     и целиком. Переход на visibility уже съедал кнопки. */
  display:none;
}
.confirm.on{display:block}
.confirm > b{display:block;font-size:13.5px;font-weight:600;letter-spacing:-.02em}
.cf-who{font-size:12px;color:var(--ink-2);margin:2px 0 10px}
.cf-move{
  display:grid;grid-template-columns:1fr auto 1fr;align-items:center;gap:9px;
  background:var(--paper);border-radius:var(--r);padding:9px 10px;
  font-size:11px;line-height:1.45;
}
.cf-move s{color:var(--ink-3);text-decoration:none}
.cf-move i{font-style:normal;color:var(--ink-3);font-size:13px}
.cf-move u{color:var(--ink);font-weight:550;text-decoration:none}
.cf-act{display:flex;gap:8px;margin-top:12px}
.cf-act .btn{flex:1;justify-content:center;padding:8px 12px}
/* Перенос — это правка: кто ещё едет, что не влезло, во что обойдётся и
   почему. Те же знаки, что в окне правки, только теснее: вопрос один. */
.confirm:has(.cf-cash){width:320px}
.cf-check{display:flex;align-items:flex-start;gap:8px;margin-top:10px;cursor:pointer;font-size:12px;line-height:1.4;color:var(--ink-2)}
.cf-check input{margin:2px 0 0;flex-shrink:0;accent-color:var(--accent)}
.cf-note{margin:3px 0 0 21px;font-size:11px;line-height:1.4;color:var(--ink-3)}
.cf-stop,.cf-warn{margin-top:10px;display:flex;flex-direction:column;gap:5px}
.cf-stop p,.cf-warn p{margin:0;padding:7px 9px;border-radius:var(--r);font-size:11px;line-height:1.45}
.cf-stop p{background:var(--late-bg);border:1px solid var(--late-line);color:var(--late)}
.cf-stop b{font-weight:600}
.cf-warn p{background:var(--wait-bg);border:1px solid var(--wait-line);color:var(--wait-ink)}
.cf-cash{margin-top:10px;border:1px solid var(--rule);border-radius:var(--r);background:var(--paper);padding:5px 10px}
.cf-cash>div{display:flex;flex-wrap:wrap;align-items:baseline;justify-content:space-between;gap:0 10px;padding:3px 0;font-size:11.5px;color:var(--ink-2)}
.cf-cash b{font-weight:500;color:var(--ink)}
.cf-cash u{flex-basis:100%;text-decoration:none;font-size:10.5px;color:var(--ink-3)}
.cf-cash .sum{margin-top:3px;padding-top:6px;border-top:1px solid var(--rule);font-weight:600;color:var(--ink)}
.cf-cash .sum b{font-size:14px;font-weight:600}
.cf-cash .sum.charge b{color:var(--late)}
.cf-cash .sum.refund b{color:var(--ok)}
.cf-paid{margin:6px 0 0;font-size:11px;line-height:1.4;color:var(--ink-2)}
.cf-reason{width:100%;margin-top:10px;padding:6px 2px;border:0;border-bottom:1px solid var(--rule);background:none;font:inherit;font-size:12.5px;color:var(--ink)}
.cf-reason:focus{outline:none;border-color:var(--ink);box-shadow:0 1px 0 var(--ink)}
.cf-act .btn:disabled{opacity:.45;pointer-events:none}

/* ── выделение времени в сетке ──
   Провести по пустому месту — и бронь заводится на этот интервал.
   Красное означает занято: туда бронь не примет и база (SPEC §3.3).

   Селектор привязан к ленте: голый `.sel` цеплял выбранный день
   в календарике и растягивал его на всю сетку — имя слишком общее
   для стиля, который живёт только внутри полосы времени. */
.timeline-strip .sel{
  position:absolute;top:6px;bottom:6px;z-index:14;pointer-events:none;
  left:calc(var(--p) * 100% / var(--span) + 1.5px);
  width:calc(var(--len) * 100% / var(--span) - 3px);
  border-radius:var(--r-sm);
  background:rgba(30,85,64,.14);box-shadow:inset 0 0 0 1.5px var(--ok);
  display:flex;flex-direction:column;justify-content:center;
  padding:4px 8px;overflow:hidden;
}
.timeline-strip .sel b{
  font-size:var(--fs-s);font-weight:500;
  letter-spacing:-.01em;color:var(--ok);white-space:nowrap;
}
.timeline-strip .sel span{font-size:var(--fs-xs);color:var(--ok);opacity:.8}
.timeline-strip .sel.bad{background:rgba(160,47,30,.13);box-shadow:inset 0 0 0 1.5px var(--late)}
.timeline-strip .sel.bad b,.timeline-strip .sel.bad span{color:var(--late)}
