/* cards.css — история: сессия UI-1 вводила карточку ОПЕРАТОРА (.rec-card), BL-065
   позже перевела оператора на табличный вид (table-view.css, renderRecordRow) —
   .rec-card/.rec-zone-actions отсюда больше НЕ используются (оставлены общие
   иконки-бейджи ниже, они переиспользуются исполнителем). Единственная живая
   карточка в этом файле — ИСПОЛНИТЕЛЬ (.exec-record/.exec-group), см. секцию
   ниже (переверстана в сессии 2026-09-13 под единый шаблон "оба типа записи"). */

/* Общие бейджи/иконки строки — используются и в operator-таблице (table-view.css
   переопределяет размер под 34px), и в карточке исполнителя ниже. */
.rec-urgent-icon { margin-right: 4px; font-size: 13px; color: var(--status-yellow); }
/* «Повторный брак» (сессия 2026-09-12, часть 3) — бейдж с количеством связанных
   закрытых записей. Стиль общий с операторской таблицей (.record-repeat-badge,
   table-view.css) — тот же токен, тот же вид. */
.rec-repeat-badge {
  display: inline-block; background: var(--repeat-badge-bg); color: #fff;
  font-size: 11px; font-weight: 700; padding: 1px 6px; border-radius: 999px;
  white-space: nowrap; margin-right: 4px; cursor: pointer;
}
.rec-viewed-icon { font-size: 13px; cursor: default; }
.rec-viewed-icon.viewed { color: var(--btn-blue); }
.rec-viewed-icon.not-viewed { color: var(--text-hint); opacity: .6; }
.rec-mixed { font-family: var(--mono); font-size: 12px; color: var(--text-secondary); }

/* ==========================================================================
   Карточка ИСПОЛНИТЕЛЯ (.exec-record / .exec-group) — переверстано в сессии
   2026-09-13 ("переверстать список записей — оба шаблона", образец
   repair-tracker, решения Igor по чату: 1) область — только панель
   исполнителя, у оператора шаблон один (таблица), не трогаем; 2) все текущие
   действия (чат/bulk-результат/на склад/edit/archive/delete/шеврон) остаются
   видны сразу, просто перенесены в колонку "кнопка" единой сетки; 3) в
   свёрнутой групповой карточке "номер брака" → кол-во записей, "кол-во" →
   сумма quantity по группе).
   Единый визуальный шаблон для ОБЕИХ форм записи (одиночная renderExecutorInlineRecord
   и групповая renderExecutorGroup, index.html): белая карточка, синяя рамка
   2.5px, radius 12px, grid-строка колонок статус|устройство|деталь+s/n|номер
   брака|кол-во|глаз|дата|кнопка, снизу — полоска комментария. Collapse/expand
   логика группы (isOpen/expandedGroupIds, bulk-панель, mark-group-viewed) не
   тронута — меняется только разметка/CSS внутри .exec-group-header. ========== */

.exec-record, .exec-group {
  display: block;
  background: var(--card-bg);
  border: 2.5px solid var(--exec-card-border);
  border-radius: var(--exec-card-radius);
  padding: 10px 14px;
  margin-top: 10px;
  overflow: hidden;
}
.exec-record:first-child, .exec-group:first-child { margin-top: 0; }
.exec-record:hover { background: var(--list-bg); }

/* «Повторный брак» — вместо приглушённой розовой строки (--repeat-row-bg,
   операторская таблица) тут вся карточка перекрашивается в контрастную
   красную рамку/фон, как в ТЗ. .repeat-row у группы — агрегат (хотя бы одна
   запись группы повторная, computeGroupHasRepeat). */
.exec-record.repeat-row, .exec-group.repeat-row {
  border-color: var(--status-red);
  background: var(--exec-card-repeat-bg);
}
.exec-record.repeat-row:hover { background: var(--exec-card-repeat-bg); }

/* Единая grid-строка карточки — 8 колонок из ТЗ. Общий класс для шапки
   одиночной записи, шапки свёрнутой/развёрнутой группы и .exec-list-header
   (та переопределяет только визуал текста, колонки остаются те же — не надо
   вручную синхронизировать ширины в двух местах). */
.exec-card-grid {
  display: grid;
  grid-template-columns: 118px 68px minmax(140px, 1.6fr) minmax(90px, 1fr) 64px 26px 84px auto;
  gap: 10px;
  align-items: center;
}
.exec-cell { min-width: 0; font-size: 13px; }
/* Самый длинный статус-текст ("Nurašyti rekomenduojama") шире колонки —
   .status-pill в общем случае nowrap (table-view.css, там ячейка тянется по
   контенту), тут ширина фиксированная: уменьшенный шрифт + перенос по словам
   (word-break — подстраховка на случай ещё более длинного статуса) вместо
   наезда на соседнюю колонку. */
.exec-cell-status .status-pill {
  display: block; white-space: normal; text-align: center;
  font-size: 10.5px; line-height: 1.2; padding: 3px 6px; word-break: break-word;
}
.exec-cell-device { font-family: var(--mono); font-size: 12px; color: var(--text-secondary); }
.exec-cell-component-name {
  font-weight: 700; color: var(--text-blue-dark); font-size: 14px;
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.exec-cell-serial { font-size: 12px; color: var(--text-secondary); margin-top: 1px; }
.exec-cell-order { font-family: var(--mono); }
.exec-cell-order.muted { color: var(--text-hint); }
.exec-cell-qty { white-space: nowrap; display: flex; align-items: center; gap: 6px; }
.exec-cell-eye { text-align: center; }
.exec-cell-date { font-family: var(--mono); font-size: 12px; color: var(--text-secondary); line-height: 1.35; }
.exec-cell-date .exec-created-date { display: block; font-weight: 600; color: var(--text-blue-dark); }
.exec-cell-date .exec-created-time, .exec-cell-date .exec-created-author { display: block; font-weight: 400; }
.exec-cell-actions { display: flex; flex-wrap: wrap; gap: 6px; align-items: center; justify-content: flex-end; }
/* Свёрнутая группа: сводка по статусам позиций вместо одного цветного пилла
   (у группы их несколько, computeGroupStatusSummary — логика не менялась). */
.exec-group-status-summary { font-size: 11px; color: var(--text-secondary); line-height: 1.3; }

/* Items-блок под шапкой — развёрнутый список позиций (renderItemRow) ИЛИ, для
   bulk-сдачи (items.length > 1, UI-A.2), свёрнутая сводка по умолчанию. */
.exec-record-items { margin-top: 10px; padding-top: 10px; border-top: 1px solid var(--card-border); }
.exec-record-bulk {
  margin-top: 10px;
  padding-top: 10px;
  border-top: 1px solid var(--card-border);
  display: flex;
  align-items: center;
  gap: 8px;
  flex-wrap: wrap;
}

/* Полоска комментария снизу карточки (ТЗ) — переиспользует существующий
   .card-chat-block (одиночная запись/inline-запись в развёрнутой группе) и
   .exec-group-last-comment (свёрнутая группа, своя сводка последнего
   сообщения по ВСЕЙ группе, логика без изменений). Отрицательный margin
   растягивает полоску на всю ширину карточки (родитель имеет padding). */
.exec-record > .card-chat-block,
.exec-group > .exec-group-last-comment {
  margin: 10px -14px -10px -14px;
  padding: 8px 14px;
  border-top: 1.5px solid var(--exec-card-border);
  background: var(--exec-card-comment-bg);
  border-radius: 0 0 calc(var(--exec-card-radius) - 2px) calc(var(--exec-card-radius) - 2px);
}
.exec-record > .card-chat-block .card-chat-preview,
.exec-record > .card-chat-block .card-chat-full { border-top: none; margin-top: 0; padding-top: 0; }
.exec-group-last-comment { display: flex; align-items: center; gap: 4px; font-size: 12px; color: var(--text-secondary); }
.exec-group-last-comment:empty { display: none; margin: 0; padding: 0; border: none; }

/* Полоска всегда видна, даже без сообщений — как у операторской таблицы
   (table-view.css .record-comment-row), тот же приём: пустой .card-chat-preview
   показывает placeholder через data-empty-label вместо CSS display:none по
   умолчанию (buttons.css). */
.exec-record .card-chat-preview { font-style: italic; }
.exec-record .card-chat-preview:not(:empty)::before { content: '“'; }
.exec-record .card-chat-preview:not(:empty)::after { content: '”'; }
.exec-record .card-chat-preview:empty { display: block; font-style: normal; }
.exec-record .card-chat-preview:empty::before { content: attr(data-empty-label); color: var(--text-hint); }

@media (max-width: 900px) {
  .exec-card-grid { grid-template-columns: 1fr 1fr; row-gap: 6px; }
  .exec-cell-component { grid-column: 1 / -1; }
  .exec-cell-actions { grid-column: 1 / -1; justify-content: flex-start; }
}

/* Заголовок колонок над списком исполнителя (как у оператора, table-view.css
   thead) — те же 8 колонок .exec-card-grid, только текстовые подписи вместо
   значений записи. */
.exec-list-header {
  background: var(--list-bg);
  border: 2px solid var(--exec-card-border);
  border-radius: var(--exec-card-radius);
  padding: 8px 14px;
  margin-bottom: 10px;
  font-size: 11px;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: .04em;
  color: var(--text-secondary);
  /* Отзыв Igor — шапка колонок остаётся на месте, пока скроллится сам список
     карточек (тот же приём, что у операторской таблицы, table-view.css
     .records-table thead th — прилипает к #records-list, реальному
     scroll-контейнеру). */
  position: sticky;
  top: 0;
  z-index: 2;
}

/* Группа (.exec-group) — объединяет РАЗНЫЕ записи одного component_id (Этап 5),
   не путать с items-блоком одной записи выше. Свёрнуто — шапка (.exec-card-grid)
   + полоска последнего комментария + bulk-панель; развёрнуто — bulk-панель
   исчезает, вместо неё вложенные .exec-record (свой белый фон/синяя рамка —
   визуально "карточка в карточке", тот же язык, что и у одиночной записи).
   Collapse-логика (isOpen/expandedGroupIds/mark-group-viewed) не тронута. */
.exec-group-header { cursor: pointer; border-radius: calc(var(--exec-card-radius) - 4px); }
.exec-group-header:hover { background: var(--list-bg); }
.exec-group-bulk { padding: 12px 0 0; margin-top: 10px; border-top: 1px solid var(--card-border); }
.exec-group-bulk-title { font-family: var(--mono); font-size: 11px; text-transform: uppercase; letter-spacing: .5px; color: var(--text-secondary); margin-bottom: 8px; }
.exec-group-body { margin-top: 10px; padding-top: 10px; border-top: 1px solid var(--card-border); }
.exec-group-body:empty { display: none; }
