feat(tgu-ui): выбор полосы слотов мышью «от первого к последнему»

Замена авто-чипа «полоса ×N» на ручной жест. Полоса переопределена:
один КА + один крен (ε) + подряд по времени; виток в границу не входит.

- slotStrips.ts: groupStrips → { idByKey, membersOf }; группировка по КА →
  кластеры по крену (ROLL_EPSILON=0.5) → деление по каденции (CADENCE_GAP_FACTOR=1.5)
- slotSelection.ts: selectStripRange вместо toggleStripSelection
- TguSlotsTab.tsx: клик по строке = якорь + выбор; Shift+клик тянет полосу
  между якорем и строкой; выход за полосу запрещён + подсказка; рельс полосы якоря
- tgu-planning.css: убраны стили чипа/hover; user-select:none на строках
- тесты обновлены (125 зелёных), tsc/build чисто
This commit is contained in:
Дмитрий Соловьев
2026-06-17 10:13:11 +03:00
parent 8faaa03af3
commit b092e50dd8
7 changed files with 322 additions and 296 deletions
@@ -1305,49 +1305,22 @@
background: rgba(104, 195, 189, 0.36);
}
/* Ячейка «КА»: номер КА + чип выбора полосы рядом. */
.tgu-slots-sat {
display: inline-flex;
align-items: center;
gap: 0.4rem;
/* Строки таблицы — поверхность жеста выбора полосы (клик + Shift+клик), поэтому гасим выделение
текста, чтобы Shift+клик не подсвечивал текст между строками. */
.tgu-slots-table tbody {
user-select: none;
}
/* Чип «полоса ×N» — выбрать всю полосу (слоты одного крена подряд) одним кликом.
Нейтральный по умолчанию; .is-on — когда вся полоса уже выбрана. */
.tgu-slots-strip-chip {
display: inline-flex;
align-items: center;
padding: 0.02rem 0.4rem;
border-radius: 999px;
border: 1px solid var(--line);
background: #101214;
color: var(--text-muted);
font-size: 0.68rem;
line-height: 1.4;
cursor: pointer;
white-space: nowrap;
}
.tgu-slots-strip-chip:hover {
border-color: var(--accent);
color: var(--text);
}
.tgu-slots-strip-chip.is-on {
border-color: rgba(104, 195, 189, 0.58);
background: rgba(104, 195, 189, 0.16);
color: var(--accent-strong);
}
/* Рельс полосы (сортировка «время», члены идут подряд): приглушённая цветная полоса слева,
оттенок детерминирован StripId (--strip-hue) — соседние полосы визуально различаются.
У активной строки рельс перекрывается акцентным (is-active), это норма. */
/* Рельс полосы текущего якоря: приглушённая цветная полоса слева у всех членов полосы, в которой
стоит якорь жеста «полоса от первого к последнему». Оттенок детерминирован PolosaId (--strip-hue).
Так оператор видит границу полосы — что выделит Shift+клик и за что выйти нельзя. У активной
строки рельс перекрывается акцентным (is-active), это норма. */
.tgu-slots-table tbody tr.tgu-slots-row--strip {
box-shadow: inset 3px 0 0 hsl(var(--strip-hue, 0) 45% 55% / 0.55);
}
/* Подсветка всех членов полосы под курсором (актуально в «крен»/«вклад», где они не подряд). */
.tgu-slots-table tbody tr.is-strip-hover {
/* Строка-якорь полосы (первый клик жеста) — чуть заметнее остальных членов полосы. */
.tgu-slots-table tbody tr.is-strip-anchor {
background: rgba(104, 195, 189, 0.12);
}