/* Универсальные компоненты, общие для всех ролей.
   Использовать как первичные классы; в role-*.css можно тонко переопределять оттенки. */

/* ======== Кнопки ======== */
.btn {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    gap: var(--space-2);
    min-height: 40px;
    padding: 0 var(--space-4);
    border-radius: var(--radius-md);
    border: 1px solid var(--color-line-strong);
    background: var(--color-surface);
    color: var(--color-text);
    font-weight: var(--fw-semibold);
    font-size: var(--fs-sm);
    line-height: 1;
    letter-spacing: 0.01em;
    text-decoration: none;
    cursor: pointer;
    transition: background var(--transition-fast), border-color var(--transition-fast), transform var(--transition-fast), color var(--transition-fast);
    white-space: nowrap;
}

.btn:hover {
    background: var(--color-surface-2);
    border-color: var(--color-line-strong);
}

.btn:active { transform: translateY(1px); }
.btn:focus-visible { outline: none; box-shadow: var(--shadow-focus); }

.btn[disabled],
.btn.is-disabled {
    opacity: 0.5;
    pointer-events: none;
}

.btn--primary {
    background: var(--accent);
    border-color: var(--accent);
    color: var(--accent-contrast);
}
.btn--primary:hover {
    background: var(--accent-hover);
    border-color: var(--accent-hover);
    color: var(--accent-contrast);
}

.btn--ghost {
    background: transparent;
    border-color: var(--color-line);
}
.btn--ghost:hover {
    background: var(--color-surface-2);
}

.btn--danger {
    background: var(--color-danger-soft);
    border-color: transparent;
    color: var(--color-danger);
}
.btn--danger:hover {
    background: color-mix(in srgb, var(--color-danger-soft) 70%, var(--color-danger));
    color: #fff;
}

.btn--success {
    background: var(--color-success);
    border-color: var(--color-success);
    color: #fff;
}

.btn--sm { min-height: 32px; padding: 0 var(--space-3); font-size: var(--fs-xs); border-radius: var(--radius-sm); }
.btn--lg { min-height: 48px; padding: 0 var(--space-5); font-size: var(--fs-md); }
.btn--block { display: flex; width: 100%; }
.btn--icon { padding: 0 var(--space-3); min-width: 40px; }

/* ======== Card ======== */
.card {
    background: var(--color-surface);
    border: 1px solid var(--color-line);
    border-radius: var(--radius-lg);
    overflow: hidden;
    transition: border-color var(--transition-fast), background var(--transition-fast);
}

.card--interactive { cursor: pointer; }
.card--interactive:hover { border-color: var(--color-line-strong); background: var(--color-surface-2); }

.card__header {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: var(--space-3);
    padding: var(--space-4) var(--space-5) 0;
}

.card__title {
    font-size: var(--fs-lg);
    font-weight: var(--fw-bold);
    margin: 0;
    color: var(--color-text);
}

.card__subtitle {
    margin-top: var(--space-1);
    color: var(--color-text-muted);
    font-size: var(--fs-sm);
}

.card__body {
    padding: var(--space-4) var(--space-5);
    display: flex;
    flex-direction: column;
    gap: var(--space-3);
}

.card__footer {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: var(--space-3);
    padding: var(--space-3) var(--space-5);
    border-top: 1px solid var(--color-line);
    background: var(--color-surface-2);
}

.card__divider {
    height: 1px;
    background: var(--color-line);
    margin: 0;
}

/* ======== Meta-cards (KPI блоки) ======== */
.meta-card {
    background: var(--color-surface);
    border: 1px solid var(--color-line);
    border-radius: var(--radius-lg);
    padding: var(--space-4) var(--space-5);
    display: flex;
    flex-direction: column;
    gap: var(--space-2);
    min-height: 96px;
}
.meta-card__label {
    color: var(--color-text-muted);
    font-size: var(--fs-xs);
    font-weight: var(--fw-semibold);
    text-transform: uppercase;
    letter-spacing: 0.08em;
}
.meta-card__value {
    font-size: var(--fs-2xl);
    font-weight: var(--fw-black);
    line-height: 1;
    font-variant-numeric: tabular-nums;
    color: var(--color-text);
}
.meta-card__hint {
    color: var(--color-text-muted);
    font-size: var(--fs-sm);
}
.meta-card--link {
    text-decoration: none;
    color: inherit;
    transition: border-color var(--transition-fast), box-shadow var(--transition-fast), transform var(--transition-fast);
}
.meta-card--link:hover {
    border-color: var(--accent);
    box-shadow: var(--shadow-sm);
    transform: translateY(-1px);
}
.meta-card--warn {
    border-color: var(--color-warning);
    background: color-mix(in srgb, var(--color-warning-soft) 50%, var(--color-surface));
}
.meta-card--warn .meta-card__value { color: var(--color-warning); }
.meta-card--warn.meta-card--link:hover { border-color: var(--color-danger); }

/* ======== Page header ======== */
.page-header {
    display: flex;
    align-items: flex-start;
    justify-content: space-between;
    gap: var(--space-4);
    flex-wrap: wrap;
}
.page-header__title-block { min-width: 0; }
.page-header__title {
    font-size: var(--fs-3xl);
    font-weight: var(--fw-black);
    letter-spacing: -0.02em;
    line-height: 1;
    color: var(--color-text);
}
.page-header__subtitle {
    margin-top: var(--space-2);
    color: var(--color-text-muted);
    font-size: var(--fs-md);
    max-width: 60ch;
}
.page-header__actions {
    display: flex;
    gap: var(--space-2);
    flex-wrap: wrap;
}

/* ======== Inputs / forms ======== */
.field {
    display: flex;
    flex-direction: column;
    gap: var(--space-2);
}
.field__label {
    font-size: var(--fs-sm);
    font-weight: var(--fw-semibold);
    color: var(--color-text-muted);
}
.field__hint {
    font-size: var(--fs-xs);
    color: var(--color-text-soft);
}
.field__error {
    font-size: var(--fs-xs);
    color: var(--color-danger);
}

.input,
.select,
.textarea {
    width: 100%;
    min-height: 42px;
    padding: 0 var(--space-3);
    background: var(--color-surface-2);
    border: 1px solid var(--color-line);
    border-radius: var(--radius-md);
    color: var(--color-text);
    font-size: var(--fs-md);
    transition: border-color var(--transition-fast), background var(--transition-fast), box-shadow var(--transition-fast);
}

.textarea {
    padding: var(--space-3);
    min-height: 96px;
    resize: vertical;
    line-height: var(--lh-normal);
}

.input:focus,
.select:focus,
.textarea:focus {
    outline: none;
    border-color: var(--accent);
    box-shadow: var(--shadow-focus);
    background: var(--color-surface);
}

.input::placeholder,
.textarea::placeholder { color: var(--color-text-soft); }

.input--error,
.select--error,
.textarea--error {
    border-color: var(--color-danger);
}

/* ======== Chips / badges ======== */
.chip {
    display: inline-flex;
    align-items: center;
    gap: var(--space-1);
    padding: 0 var(--space-3);
    min-height: 26px;
    border-radius: var(--radius-pill);
    background: var(--color-surface-2);
    color: var(--color-text-muted);
    font-size: var(--fs-xs);
    font-weight: var(--fw-semibold);
    letter-spacing: 0.04em;
    text-transform: uppercase;
    border: 1px solid var(--color-line);
}
.chip--accent { background: var(--accent-soft); color: var(--accent); border-color: transparent; }
.chip--success { background: var(--color-success-soft); color: var(--color-success); border-color: transparent; }
.chip--warning { background: var(--color-warning-soft); color: var(--color-warning); border-color: transparent; }
.chip--danger { background: var(--color-danger-soft); color: var(--color-danger); border-color: transparent; }
.chip--info { background: var(--color-info-soft); color: var(--color-info); border-color: transparent; }

.badge {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    min-width: 22px;
    height: 22px;
    padding: 0 var(--space-2);
    border-radius: var(--radius-pill);
    background: var(--accent);
    color: var(--accent-contrast);
    font-size: var(--fs-xs);
    font-weight: var(--fw-bold);
}
.badge--success { background: var(--color-success); color: #fff; }
.badge--danger  { background: var(--color-danger);  color: #fff; }
.badge--warning { background: var(--color-warning); color: #fff; }
.badge--info    { background: var(--color-info);    color: #fff; }

/* Подсветка строк таблицы при расхождении план/факт */
.table tbody tr.is-surplus  > td { background: color-mix(in srgb, var(--color-success-soft) 70%, transparent); }
.table tbody tr.is-shortage > td { background: color-mix(in srgb, var(--color-danger-soft)  70%, transparent); }
.table tbody tr.is-selected > td { background: var(--accent-soft); }

/* ============ Dropzone (drag-and-drop загрузка файлов) ============ */
.dropzone {
    position: relative;
    display: flex; align-items: center; gap: 12px;
    padding: 16px 18px;
    border: 2px dashed var(--color-line-strong);
    border-radius: var(--radius-md);
    background: var(--color-surface-2);
    cursor: pointer;
    transition: border-color var(--transition-fast), background var(--transition-fast);
    text-align: left;
}
.dropzone:hover { border-color: var(--accent); background: var(--accent-soft); }
.dropzone.is-drag {
    border-color: var(--accent);
    background: var(--accent-soft);
    box-shadow: var(--shadow-focus);
}
.dropzone.is-filled { border-style: solid; border-color: var(--color-success); }
.dropzone__icon { font-size: 26px; color: var(--accent); flex-shrink: 0; }
.dropzone__text { font-size: var(--fs-sm); color: var(--color-text); line-height: 1.4; min-width: 0; }
.dropzone__hint { font-size: 11px; color: var(--color-text-muted); margin-top: 2px; }
.dropzone__file {
    margin-top: 6px; font-size: var(--fs-sm); font-weight: var(--fw-semibold);
    color: var(--color-success);
    overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.dropzone__size { color: var(--color-text-soft); font-weight: 400; font-size: 11px; }
/* Инпут прозрачно накрывает всю зону — клик и нативный drop работают, фокус сохраняется */
.dropzone__overlay {
    position: absolute; inset: 0;
    width: 100%; height: 100%;
    opacity: 0; cursor: pointer;
    z-index: 2;
}

/* ============ Chip-toggle: чекбокс в виде кликабельного чипа ============ */
.chip-toggle-group {
    display: flex;
    flex-wrap: wrap;
    gap: 6px;
}
.chip-toggle {
    display: inline-flex;
    align-items: center;
    gap: 4px;
    padding: 6px 12px;
    background: var(--color-surface-2);
    border: 1px solid var(--color-line);
    border-radius: var(--radius-pill);
    cursor: pointer;
    font-size: var(--fs-sm);
    color: var(--color-text-muted);
    transition: all var(--transition-fast);
    user-select: none;
}
.chip-toggle:hover { border-color: var(--color-line-strong); color: var(--color-text); }
.chip-toggle input[type=checkbox] {
    position: absolute;
    width: 1px; height: 1px;
    opacity: 0;
    pointer-events: none;
}
.chip-toggle:has(input:checked) {
    background: var(--accent-soft);
    border-color: var(--accent);
    color: var(--accent);
    font-weight: var(--fw-semibold);
}
.chip-toggle:has(input:checked)::before {
    content: "✓";
    margin-right: 2px;
    font-weight: var(--fw-black);
}

/* ============ Простые CSS-графики для дашборда ============ */
.chart-bars {
    display: flex;
    align-items: flex-end;
    gap: 6px;
    height: 140px;
    padding-top: 8px;
}
.chart-bars__group {
    flex: 1 1 0;
    min-width: 0;
    display: flex;
    flex-direction: column;
    align-items: center;
    gap: 4px;
    height: 100%;
}
.chart-bars__col {
    flex: 1 1 auto;
    width: 100%;
    display: flex;
    align-items: flex-end;
    justify-content: center;
    gap: 2px;
    min-height: 0;
}
.chart-bars--paired .chart-bars__col { gap: 3px; }
.chart-bars__bar {
    flex: 1 1 0;
    min-height: 2px;
    border-radius: 3px 3px 0 0;
    background: var(--accent);
    transition: opacity var(--transition-fast);
}
.chart-bars__bar:hover { opacity: 0.8; }
.chart-bars__bar--in  { background: var(--color-info); }
.chart-bars__bar--out { background: var(--color-warning); }
.chart-bars__bar--rev { background: var(--color-success); }
.chart-bars__label {
    font-size: 10px;
    color: var(--color-text-muted);
    font-variant-numeric: tabular-nums;
    white-space: nowrap;
}
.chart-bars__value {
    font-size: 11px;
    font-weight: var(--fw-bold);
    color: var(--color-text);
}

.chart-legend {
    display: inline-block;
    width: 10px;
    height: 10px;
    border-radius: 2px;
    vertical-align: middle;
    margin-right: 4px;
}
.chart-legend--in  { background: var(--color-info); }
.chart-legend--out { background: var(--color-warning); }

.chart-rows {
    display: flex;
    flex-direction: column;
    gap: 8px;
}
.chart-rows__row {
    display: grid;
    grid-template-columns: 1fr 2fr auto;
    align-items: center;
    gap: 10px;
    font-size: var(--fs-sm);
}
.chart-rows__label {
    color: var(--color-text);
    font-weight: var(--fw-semibold);
}
.chart-rows__track {
    height: 10px;
    background: var(--color-surface-2);
    border-radius: var(--radius-pill);
    overflow: hidden;
}
.chart-rows__fill {
    height: 100%;
    background: var(--accent);
    transition: width var(--transition-base);
}
.chart-rows__value {
    font-weight: var(--fw-bold);
    color: var(--color-text);
    min-width: 32px;
    text-align: right;
}

/* ======== Alerts ======== */
.alert {
    display: flex;
    align-items: flex-start;
    gap: var(--space-3);
    padding: var(--space-3) var(--space-4);
    border-radius: var(--radius-md);
    border: 1px solid transparent;
    background: var(--color-surface-2);
    font-size: var(--fs-sm);
    line-height: var(--lh-normal);
}
.alert__title { font-weight: var(--fw-bold); margin-bottom: var(--space-1); }
.alert__body { color: var(--color-text-muted); }

.alert--success { background: var(--color-success-soft); color: var(--color-success); }
.alert--warning { background: var(--color-warning-soft); color: var(--color-warning); }
.alert--danger,
.alert--error { background: var(--color-danger-soft); color: var(--color-danger); }
.alert--info { background: var(--color-info-soft); color: var(--color-info); }

.alert--success .alert__body,
.alert--warning .alert__body,
.alert--danger .alert__body,
.alert--info .alert__body { color: inherit; opacity: 0.9; }

/* ======== Tables ======== */
.table-wrap {
    width: 100%;
    overflow-x: auto;
    -webkit-overflow-scrolling: touch;
    border: 1px solid var(--color-line);
    border-radius: var(--radius-lg);
    background-color: var(--color-surface);
    /* Индикатор горизонтального скролла: тени у краёв появляются, только когда
       часть колонок скрыта (широкая таблица), и гаснут у края прокрутки.
       Классический приём scroll shadows: «шторки» (local) накрывают тени (scroll). */
    background-image:
        linear-gradient(90deg, var(--color-surface) 40%, transparent),
        linear-gradient(270deg, var(--color-surface) 40%, transparent),
        radial-gradient(farthest-side at 0 50%, color-mix(in srgb, var(--color-text) 22%, transparent), transparent),
        radial-gradient(farthest-side at 100% 50%, color-mix(in srgb, var(--color-text) 22%, transparent), transparent);
    background-position: 0 0, 100% 0, 0 0, 100% 0;
    background-size: 44px 100%, 44px 100%, 12px 100%, 12px 100%;
    background-repeat: no-repeat;
    background-attachment: local, local, scroll, scroll;
}

.table {
    width: 100%;
    border-collapse: separate;
    border-spacing: 0;
    font-size: var(--fs-sm);
}

.table thead th {
    text-align: left;
    padding: var(--space-3) var(--space-4);
    font-weight: var(--fw-semibold);
    font-size: var(--fs-xs);
    color: var(--color-text-muted);
    text-transform: uppercase;
    letter-spacing: 0.06em;
    background: var(--color-surface-2);
    border-bottom: 1px solid var(--color-line);
    position: sticky;
    top: 0;
    z-index: 1;
}

.table tbody td {
    padding: var(--space-3) var(--space-4);
    border-bottom: 1px solid var(--color-line);
    vertical-align: middle;
}

.table tbody tr:last-child td { border-bottom: 0; }
.table tbody tr:hover { background: var(--color-surface-2); }

.table--compact thead th,
.table--compact tbody td { padding: var(--space-2) var(--space-3); }

.table__cell--num { text-align: right; font-variant-numeric: tabular-nums; }
.table__cell--right { text-align: right; }
.table__cell--center { text-align: center; }

@media (max-width: 980px) {
    .table thead { display: none; }
    .table,
    .table tbody,
    .table tr,
    .table td { display: block; width: 100%; }
    .table tbody tr {
        margin-bottom: var(--space-3);
        padding: var(--space-3);
        border: 1px solid var(--color-line);
        border-radius: var(--radius-md);
        background: var(--color-surface-2);
    }
    .table tbody td {
        display: grid;
        grid-template-columns: minmax(96px, 0.45fr) 1fr;
        gap: var(--space-3);
        padding: var(--space-2) 0;
        border: 0;
    }
    .table tbody td::before {
        content: attr(data-label);
        color: var(--color-text-muted);
        font-size: var(--fs-xs);
        font-weight: var(--fw-bold);
        text-transform: uppercase;
        letter-spacing: 0.06em;
    }
}

/* ======== Empty state ======== */
.empty-state {
    padding: var(--space-7) var(--space-5);
    display: flex;
    flex-direction: column;
    align-items: center;
    text-align: center;
    gap: var(--space-3);
    color: var(--color-text-muted);
}
.empty-state__icon {
    width: 56px;
    height: 56px;
    display: grid;
    place-items: center;
    border-radius: var(--radius-pill);
    background: var(--color-surface-2);
    color: var(--color-text-soft);
    font-size: 24px;
}
.empty-state__title { color: var(--color-text); font-weight: var(--fw-bold); font-size: var(--fs-lg); }
.empty-state__body { max-width: 42ch; }

/* ======== Modal (через нативный <dialog>) ======== */

/* Сброс дефолтных стилей dialog */
.modal[open] {
    border: 0;
    padding: 0;
    background: transparent;
    color: inherit;
    max-width: none;
    max-height: none;
    overflow: visible;
}

/* Backdrop — затемнение и blur */
.modal::backdrop {
    background: rgba(0, 0, 0, 0.6);
    backdrop-filter: blur(6px);
    -webkit-backdrop-filter: blur(6px);
}

/* Контейнер диалога — центровка через flex родителя dialog */
.modal[open] {
    position: fixed;
    inset: 0;
    z-index: var(--z-modal);
    display: grid;
    place-items: center;
    padding: var(--space-4);
}

.modal__panel {
    width: 100%;
    max-width: 560px;
    max-height: calc(100dvh - var(--space-7));
    background: var(--color-surface);
    border: 1px solid var(--color-line);
    border-radius: var(--radius-xl);
    overflow: hidden;
    display: flex;
    flex-direction: column;
    box-shadow: var(--shadow-lg);
    animation: modal-in 200ms ease-out;
}

.modal--lg .modal__panel { max-width: 760px; }
.modal--xl .modal__panel { max-width: 1000px; }
.modal--narrow .modal__panel { max-width: 420px; }

@keyframes modal-in {
    from { transform: translateY(8px) scale(0.98); opacity: 0; }
    to   { transform: translateY(0) scale(1);     opacity: 1; }
}

.modal__header {
    padding: var(--space-4) var(--space-5);
    border-bottom: 1px solid var(--color-line);
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: var(--space-3);
}
.modal__heading { min-width: 0; }
.modal__title {
    font-size: var(--fs-lg);
    font-weight: var(--fw-bold);
    color: var(--color-text);
    margin: 0;
    min-width: 0;
    overflow-wrap: anywhere;
}
.modal__subtitle {
    font-size: var(--fs-sm);
    color: var(--color-text-muted);
    margin-top: 4px;
}
.modal__close {
    width: 32px; height: 32px;
    display: grid; place-items: center;
    border-radius: var(--radius-md);
    color: var(--color-text-muted);
    font-size: var(--fs-xl);
    line-height: 1;
    transition: background var(--transition-fast), color var(--transition-fast);
}
.modal__close:hover {
    background: var(--color-surface-2);
    color: var(--color-text);
}
.modal__body {
    padding: var(--space-5);
    overflow-y: auto;
    flex: 1 1 auto;
}
.modal__footer {
    padding: var(--space-3) var(--space-5);
    border-top: 1px solid var(--color-line);
    background: var(--color-surface-2);
    display: flex;
    justify-content: flex-end;
    gap: var(--space-2);
    flex-wrap: wrap;
}

/* Mobile: модалка прилипает к низу как bottom-sheet */
@media (max-width: 600px) {
    .modal[open] {
        padding: 0;
        align-items: end;
    }
    .modal__panel {
        max-width: none;
        max-height: 92dvh;
        border-radius: var(--radius-xl) var(--radius-xl) 0 0;
        animation: modal-in-mobile 240ms ease-out;
    }
    @keyframes modal-in-mobile {
        from { transform: translateY(100%); opacity: 0.6; }
        to   { transform: translateY(0);    opacity: 1; }
    }
    .modal__footer {
        padding-bottom: calc(var(--space-3) + var(--safe-bottom));
    }
    /* Модалки без футера (напр. задания клиента): safe-area отступ внизу тела */
    .modal__body { padding-bottom: calc(var(--space-5) + var(--safe-bottom)); }
}

/* ======== Avatar ======== */
.avatar {
    width: 36px;
    height: 36px;
    border-radius: var(--radius-pill);
    background: var(--accent-soft);
    color: var(--accent);
    display: grid;
    place-items: center;
    font-size: var(--fs-sm);
    font-weight: var(--fw-bold);
    flex-shrink: 0;
}
.avatar--lg { width: 48px; height: 48px; font-size: var(--fs-md); }
.avatar--sm { width: 28px; height: 28px; font-size: var(--fs-xs); }

/* ======== Divider with label ======== */
.divider-text {
    display: flex;
    align-items: center;
    gap: var(--space-3);
    color: var(--color-text-soft);
    font-size: var(--fs-xs);
    text-transform: uppercase;
    letter-spacing: 0.08em;
}
.divider-text::before,
.divider-text::after {
    content: "";
    flex: 1 1 auto;
    height: 1px;
    background: var(--color-line);
}

/* ======== Status pills (универсальные) ======== */
.status {
    display: inline-flex;
    align-items: center;
    gap: var(--space-1);
    padding: 2px var(--space-3);
    border-radius: var(--radius-pill);
    font-size: var(--fs-xs);
    font-weight: var(--fw-bold);
    background: var(--color-surface-2);
    color: var(--color-text-muted);
}
.status::before {
    content: "";
    width: 6px; height: 6px;
    border-radius: 50%;
    background: currentColor;
}
.status--planned   { background: var(--color-info-soft); color: var(--color-info); }
.status--active    { background: var(--color-warning-soft); color: var(--color-warning); }
.status--done      { background: var(--color-success-soft); color: var(--color-success); }
.status--paid      { background: var(--color-success-soft); color: var(--color-success); }
.status--unpaid    { background: var(--color-warning-soft); color: var(--color-warning); }
.status--cancelled,
.status--archived  { background: var(--color-surface-3); color: var(--color-text-soft); }
.status--overdue,
.status--danger    { background: var(--color-danger-soft); color: var(--color-danger); }

/* ======== Pagination ======== */
.pagination {
    display: flex;
    align-items: center;
    gap: var(--space-2);
    flex-wrap: wrap;
}
.pagination__item {
    min-width: 36px;
    height: 36px;
    border-radius: var(--radius-md);
    border: 1px solid var(--color-line);
    background: var(--color-surface);
    color: var(--color-text-muted);
    display: inline-flex;
    align-items: center;
    justify-content: center;
    padding: 0 var(--space-3);
    font-weight: var(--fw-semibold);
    font-size: var(--fs-sm);
}
.pagination__item:hover { background: var(--color-surface-2); color: var(--color-text); }
.pagination__item.is-active {
    background: var(--accent);
    color: var(--accent-contrast);
    border-color: var(--accent);
}
.pagination__item.is-disabled { opacity: 0.4; pointer-events: none; }

/* ======== Timeline groups ======== */
.timeline-group {
    background: var(--color-surface);
    border: 1px solid var(--color-line);
    border-radius: var(--radius-lg);
    padding: var(--space-4) var(--space-5);
    display: flex;
    flex-direction: column;
    gap: var(--space-3);
}
.timeline-group__header {
    display: flex;
    align-items: baseline;
    gap: var(--space-3);
}
.timeline-group__title {
    display: inline-flex;
    align-items: center;
    gap: var(--space-2);
    font-size: var(--fs-lg);
    font-weight: var(--fw-black);
    letter-spacing: -0.01em;
    margin: 0;
    color: var(--color-text);
}
.timeline-group__count {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    min-width: 24px;
    height: 24px;
    padding: 0 8px;
    border-radius: var(--radius-pill);
    background: var(--accent-soft);
    color: var(--accent);
    font-size: var(--fs-xs);
    font-weight: var(--fw-bold);
}
.timeline-group__hint {
    color: var(--color-text-muted);
    font-size: var(--fs-sm);
}

.timeline-list {
    display: flex;
    flex-direction: column;
    gap: var(--space-2);
}

.timeline-item {
    display: grid;
    grid-template-columns: 32px 1fr auto;
    align-items: center;
    gap: var(--space-3);
    padding: var(--space-3) var(--space-4);
    border-radius: var(--radius-md);
    border: 1px solid var(--color-line);
    background: var(--color-surface-2);
    color: inherit;
    text-decoration: none;
    transition: border-color var(--transition-fast), background var(--transition-fast), transform var(--transition-fast);
}
.timeline-item:hover {
    border-color: var(--color-line-strong);
    background: var(--color-surface-3);
    transform: translateY(-1px);
}
.timeline-item__icon {
    width: 32px;
    height: 32px;
    display: grid;
    place-items: center;
    border-radius: var(--radius-md);
    background: var(--accent-soft);
    color: var(--accent);
    font-size: var(--fs-md);
    font-weight: var(--fw-black);
}
.timeline-item__body {
    display: flex;
    flex-direction: column;
    gap: 2px;
    min-width: 0;
}
.timeline-item__title {
    font-weight: var(--fw-semibold);
    font-size: var(--fs-md);
}
.timeline-item__meta {
    display: flex;
    gap: 6px;
    align-items: center;
    flex-wrap: wrap;
}

.timeline-group--archive .timeline-item { opacity: 0.7; }

@media (max-width: 600px) {
    .timeline-item { grid-template-columns: 28px 1fr; }
    .timeline-item .status { grid-column: 2; justify-self: start; margin-top: 4px; }
    .timeline-item__icon { width: 28px; height: 28px; }
}

/* ======== Tabs (горизонтальные вкладки внутри карточек/модалок) ======== */
.tabs {
    display: flex;
    gap: 2px;
    background: var(--color-surface-2);
    border-radius: var(--radius-md);
    padding: 4px;
}
.tabs__btn {
    flex: 1 1 0;
    min-height: 36px;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    gap: var(--space-2);
    padding: 0 var(--space-3);
    border-radius: var(--radius-sm);
    background: transparent;
    color: var(--color-text-muted);
    font-size: var(--fs-sm);
    font-weight: var(--fw-semibold);
    cursor: pointer;
    border: 0;
    transition: background var(--transition-fast), color var(--transition-fast);
}
.tabs__btn:hover { color: var(--color-text); }
.tabs__btn.is-active {
    background: var(--color-surface);
    color: var(--color-text);
    box-shadow: var(--shadow-sm);
}
.tabs__panel { display: none; }
.tabs__panel.is-active { display: block; animation: tab-fade 180ms ease; }
@keyframes tab-fade {
    from { opacity: 0; transform: translateY(4px); }
    to   { opacity: 1; transform: translateY(0); }
}

/* ======== Toast notifications ======== */
.toast-stack {
    position: fixed;
    right: var(--space-4);
    bottom: calc(var(--space-4) + var(--safe-bottom));
    z-index: var(--z-toast);
    display: flex;
    flex-direction: column;
    gap: var(--space-2);
    pointer-events: none;
    max-width: min(420px, calc(100vw - var(--space-6)));
}
@media (max-width: 980px) {
    .toast-stack {
        right: var(--space-3);
        bottom: calc(var(--bottom-tabs-height) + var(--space-3) + var(--safe-bottom));
        left: var(--space-3);
        max-width: none;
    }
}
.toast {
    display: flex;
    align-items: flex-start;
    gap: var(--space-3);
    padding: var(--space-3) var(--space-4);
    border-radius: var(--radius-md);
    background: var(--color-surface);
    border: 1px solid var(--color-line-strong);
    box-shadow: var(--shadow-lg);
    pointer-events: auto;
    font-size: var(--fs-sm);
    line-height: var(--lh-normal);
    transform: translateY(8px);
    opacity: 0;
    animation: toast-in 240ms ease forwards;
}
.toast.is-leaving { animation: toast-out 200ms ease forwards; }
.toast__icon { font-size: var(--fs-lg); line-height: 1; }
.toast__body { flex: 1 1 auto; min-width: 0; }
.toast__close {
    color: var(--color-text-soft);
    font-size: var(--fs-lg);
    line-height: 1;
    padding: 0 4px;
}
.toast--success { border-color: var(--color-success-soft); }
.toast--success .toast__icon { color: var(--color-success); }
.toast--warning { border-color: var(--color-warning-soft); }
.toast--warning .toast__icon { color: var(--color-warning); }
.toast--danger,
.toast--error   { border-color: var(--color-danger-soft); }
.toast--danger .toast__icon,
.toast--error  .toast__icon  { color: var(--color-danger); }
.toast--info    { border-color: var(--color-info-soft); }
.toast--info    .toast__icon { color: var(--color-info); }

@keyframes toast-in {
    from { transform: translateY(8px); opacity: 0; }
    to   { transform: translateY(0);   opacity: 1; }
}
@keyframes toast-out {
    from { transform: translateY(0);   opacity: 1; }
    to   { transform: translateY(8px); opacity: 0; }
}

/* ======== FF Select (кастомный select с поиском) ======== */
.ffs {
    position: relative;
    display: block;
}
.ffs__native {
    position: absolute !important;
    width: 1px !important;
    height: 1px !important;
    padding: 0 !important;
    margin: -1px !important;
    overflow: hidden !important;
    clip: rect(0,0,0,0) !important;
    white-space: nowrap !important;
    border: 0 !important;
    /* для form: остаётся посылаемым полем */
    opacity: 0;
}
.ffs__trigger {
    width: 100%;
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 8px;
    padding: 0 var(--space-3);
    min-height: 42px;
    background: var(--color-surface-2);
    border: 1px solid var(--color-line);
    border-radius: var(--radius-md);
    color: var(--color-text);
    font: inherit;
    font-size: var(--fs-md);
    text-align: left;
    cursor: pointer;
    transition: border-color var(--transition-fast), background var(--transition-fast);
}
.ffs__trigger:hover { border-color: var(--color-line-strong); }
.ffs.is-open > .ffs__trigger {
    border-color: var(--accent);
    box-shadow: var(--shadow-focus);
    background: var(--color-surface);
}
.ffs__trigger[disabled] { opacity: 0.5; pointer-events: none; }
.ffs__trigger--placeholder .ffs__label { color: var(--color-text-soft); }
.ffs__label {
    flex: 1; min-width: 0;
    white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.ffs__caret {
    color: var(--color-text-muted);
    font-size: 10px;
    transition: transform var(--transition-fast);
}
.ffs.is-open .ffs__caret { transform: rotate(180deg); }

.ffs__panel {
    position: fixed;
    max-width: 480px;
    background: var(--color-surface);
    border: 1px solid var(--color-line-strong);
    border-radius: var(--radius-md);
    box-shadow: var(--shadow-lg);
    z-index: 9000;
    display: none;
    overflow: hidden;
    flex-direction: column;       /* search-wrap фикс. высоты + список занимает остаток и скроллится */
    animation: ffs-in 140ms ease-out;
}
.ffs.is-open .ffs__panel { display: flex; }
@keyframes ffs-in {
    from { opacity: 0; transform: translateY(-4px); }
    to   { opacity: 1; transform: translateY(0); }
}

.ffs__search-wrap {
    display: flex;
    align-items: center;
    gap: 8px;
    padding: 8px 12px;
    border-bottom: 1px solid var(--color-line);
}
.ffs__search-icon {
    color: var(--color-text-muted);
    font-size: 14px;
}
.ffs__search {
    flex: 1;
    border: 0;
    background: transparent;
    outline: none;
    font: inherit;
    color: var(--color-text);
    min-height: 24px;
}
.ffs__search::placeholder { color: var(--color-text-soft); }

.ffs__list {
    max-height: 280px;
    flex: 1 1 auto;
    min-height: 0;
    overflow-y: auto;
    padding: 4px 0;
}
.ffs__item {
    display: flex;
    align-items: center;
    gap: 8px;
    padding: 7px 12px;
    cursor: pointer;
    font-size: var(--fs-sm);
    color: var(--color-text);
    transition: background var(--transition-fast);
}
.ffs__item:hover { background: var(--color-surface-2); }
.ffs__item.is-active { background: var(--accent-soft); color: var(--accent); }
.ffs__item.is-selected { font-weight: var(--fw-semibold); }
.ffs__item.is-disabled { opacity: 0.4; pointer-events: none; }
.ffs__item-check {
    width: 16px;
    text-align: center;
    color: var(--accent);
    flex-shrink: 0;
}
.ffs__item-label {
    flex: 1; min-width: 0;
    white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.ffs__empty {
    padding: 16px;
    text-align: center;
    color: var(--color-text-muted);
    font-size: var(--fs-sm);
}

/* Inside modal — ещё выше, чтобы лист был поверх dialog */
dialog.modal .ffs__panel { z-index: calc(var(--z-modal) + 1000); }

/* ======== Command palette (⌘K) ======== */
.cmdk-overlay {
    position: fixed; inset: 0;
    background: rgba(0,0,0,0.5);
    backdrop-filter: blur(6px);
    z-index: var(--z-modal);
    display: none;
    padding: 12vh 16px 16px;
    align-items: flex-start;
    justify-content: center;
}
.cmdk-overlay.is-open { display: flex; }
.cmdk-panel {
    width: 100%;
    max-width: 640px;
    background: var(--color-surface);
    border: 1px solid var(--color-line-strong);
    border-radius: var(--radius-lg);
    box-shadow: var(--shadow-lg);
    overflow: hidden;
    animation: cmdk-in 200ms ease-out;
}
@keyframes cmdk-in {
    from { transform: translateY(-12px); opacity: 0; }
    to   { transform: translateY(0); opacity: 1; }
}
.cmdk-input-wrap {
    display: flex; align-items: center; gap: 10px;
    padding: 12px 16px;
    border-bottom: 1px solid var(--color-line);
}
.cmdk-icon { font-size: 18px; color: var(--color-text-muted); }
.cmdk-input {
    flex: 1; border: 0; background: transparent; outline: none;
    font: inherit; font-size: var(--fs-lg); color: var(--color-text);
}
.cmdk-input::placeholder { color: var(--color-text-soft); }
.cmdk-esc {
    background: var(--color-surface-2);
    color: var(--color-text-muted);
    padding: 2px 8px;
    border-radius: 4px;
    font-size: 11px;
    font-family: var(--font-mono);
}
.cmdk-results {
    max-height: 60vh; overflow-y: auto;
    padding: 6px 0;
}
.cmdk-empty {
    padding: 24px; text-align: center; color: var(--color-text-muted); font-size: var(--fs-sm);
}
.cmdk-group-title {
    padding: 8px 16px 4px;
    font-size: var(--fs-xs);
    text-transform: uppercase;
    letter-spacing: 0.08em;
    color: var(--color-text-muted);
    font-weight: var(--fw-bold);
}
.cmdk-item {
    display: flex; align-items: center; gap: 12px;
    padding: 10px 16px;
    text-decoration: none;
    color: inherit;
    border-left: 2px solid transparent;
}
.cmdk-item.is-active {
    background: var(--accent-soft);
    border-left-color: var(--accent);
}
.cmdk-item__icon {
    width: 28px; height: 28px;
    display: grid; place-items: center;
    background: var(--color-surface-2);
    border-radius: 6px;
    font-size: 14px;
    flex-shrink: 0;
}
.cmdk-item.is-active .cmdk-item__icon { background: color-mix(in srgb, var(--accent) 30%, transparent); }
.cmdk-item__body { display: flex; flex-direction: column; gap: 2px; min-width: 0; flex: 1; }
.cmdk-item__title { font-size: var(--fs-sm); font-weight: var(--fw-semibold); color: var(--color-text); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.cmdk-item__sub { font-size: 11px; color: var(--color-text-muted); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.cmdk-footer {
    display: flex; gap: 16px;
    padding: 8px 16px;
    border-top: 1px solid var(--color-line);
    background: var(--color-surface-2);
    font-size: 11px;
    color: var(--color-text-muted);
}
.cmdk-footer kbd {
    background: var(--color-surface);
    border: 1px solid var(--color-line);
    border-radius: 4px;
    padding: 1px 6px;
    font-family: var(--font-mono);
    font-size: 10px;
}

/* ======== Skeleton ======== */
.skeleton {
    background: linear-gradient(90deg, var(--color-surface-2) 0%, var(--color-surface-3) 50%, var(--color-surface-2) 100%);
    background-size: 200% 100%;
    animation: skeleton-shimmer 1.4s infinite;
    border-radius: var(--radius-sm);
    min-height: 1em;
}

@keyframes skeleton-shimmer {
    0% { background-position: 200% 0; }
    100% { background-position: -200% 0; }
}

/* ===== Kebab dropdown ===== */
.kebab { position: relative; display: inline-block; }
.kebab__trigger {
    width: 32px; height: 32px; padding: 0; line-height: 1;
    font-size: 18px; letter-spacing: 1px; cursor: pointer;
    background: transparent; border: 1px solid transparent;
    border-radius: var(--radius-sm); color: var(--color-text-muted);
}
.kebab__trigger:hover, .kebab[data-open="1"] .kebab__trigger {
    background: var(--color-bg-soft); border-color: var(--color-line);
    color: var(--color-text);
}
.kebab__menu {
    /* position:fixed — меню выносится из table-wrap/overflow-контейнеров (ui.js ставит координаты),
       поэтому больше не обрезается на крайних строках/колонках. */
    position: fixed; top: auto; right: auto;
    min-width: 220px; padding: 6px; z-index: var(--z-modal, 2000);
    background: var(--color-surface); border: 1px solid var(--color-line);
    border-radius: var(--radius-md);
    box-shadow: 0 8px 24px rgba(0, 0, 0, 0.18);
    display: flex; flex-direction: column; gap: 2px;
    max-height: 70vh; overflow-y: auto;
}
.kebab__menu[hidden] { display: none; }
.kebab__item {
    display: flex; align-items: center; gap: 8px;
    text-align: left; padding: 8px 10px; border-radius: var(--radius-sm);
    background: transparent; border: 0; cursor: pointer;
    font: inherit; color: var(--color-text); text-decoration: none;
}
.kebab__item:hover { background: var(--color-bg-soft); }
.kebab__item--danger { color: var(--color-danger); }
.kebab__item--danger:hover { background: var(--color-danger-soft); }
.kebab__sep { height: 1px; background: var(--color-line); margin: 4px 2px; }

/* ============ Issue-invoice modal (выставление счёта по заданию) ============ */
.issue-invoice__summary {
    display: grid;
    grid-template-columns: 1fr auto 1fr;
    align-items: stretch;
    gap: 10px;
    padding: 14px;
    background: linear-gradient(135deg, var(--color-bg-soft) 0%, var(--accent-soft) 140%);
    border: 1px solid var(--color-line);
    border-radius: var(--radius-md);
}
.issue-invoice__summary-cell {
    padding: 8px 12px;
    background: var(--color-surface);
    border: 1px solid var(--color-line);
    border-radius: var(--radius-sm);
    display: flex; flex-direction: column; justify-content: center; gap: 2px;
}
.issue-invoice__summary-cell--accent {
    background: var(--accent-soft);
    border-color: var(--accent);
}
.issue-invoice__cell-label {
    font-size: var(--fs-xs);
    color: var(--color-text-muted);
    text-transform: uppercase;
    letter-spacing: 0.04em;
}
.issue-invoice__cell-value {
    font-size: var(--fs-xl);
    font-weight: var(--fw-bold);
    color: var(--color-text);
    line-height: 1.1;
}
.issue-invoice__summary-cell--accent .issue-invoice__cell-value { color: var(--accent); }
.issue-invoice__summary-arrow {
    align-self: center;
    font-size: 22px;
    color: var(--color-text-muted);
    user-select: none;
}

/* Сворачиваемые секции внутри модалки */
.issue-invoice__preview,
.issue-invoice__params {
    border: 1px solid var(--color-line);
    border-radius: var(--radius-md);
    background: var(--color-surface);
}
.issue-invoice__preview[open],
.issue-invoice__params[open] { box-shadow: inset 0 -1px 0 var(--color-line); }
.issue-invoice__preview-summary {
    display: flex; align-items: center; justify-content: space-between;
    padding: 10px 14px;
    cursor: pointer;
    user-select: none;
    list-style: none;
    font-weight: var(--fw-semibold);
    border-radius: var(--radius-md);
    transition: background var(--transition-fast);
}
.issue-invoice__preview-summary::-webkit-details-marker { display: none; }
.issue-invoice__preview-summary:hover { background: var(--color-bg-soft); }
.issue-invoice__preview-table { margin-bottom: 0; }
.issue-invoice__preview-table tbody tr:nth-child(even) td { background: var(--color-bg-soft); }
.issue-invoice__preview .table-wrap,
.issue-invoice__params > div { padding: 0 14px 12px; }

/* Состояние «Счёт создан»: чек-марк с анимацией */
.issue-invoice__success {
    display: flex; flex-direction: column; align-items: center; text-align: center;
    padding: 12px 8px 4px;
}
.issue-invoice__success-ring {
    width: 76px; height: 76px;
    margin-bottom: 14px;
    display: grid; place-items: center;
}
.issue-invoice__check { width: 76px; height: 76px; display: block; }
.issue-invoice__check-circle {
    stroke: var(--color-success, #16a34a);
    stroke-width: 3;
    stroke-dasharray: 160;
    stroke-dashoffset: 160;
    stroke-linecap: round;
    animation: ff-check-circle 0.5s ease-out forwards;
}
.issue-invoice__check-mark {
    stroke: var(--color-success, #16a34a);
    stroke-width: 4;
    stroke-dasharray: 48;
    stroke-dashoffset: 48;
    stroke-linecap: round;
    stroke-linejoin: round;
    animation: ff-check-mark 0.3s 0.45s ease-out forwards;
}
@keyframes ff-check-circle { to { stroke-dashoffset: 0; } }
@keyframes ff-check-mark   { to { stroke-dashoffset: 0; } }

.issue-invoice__success-title {
    margin: 0; font-size: var(--fs-lg); font-weight: var(--fw-semibold);
    color: var(--color-text);
}
.issue-invoice__success-number {
    margin-top: 4px;
    font-family: var(--font-mono, ui-monospace, "SF Mono", Menlo, monospace);
    font-size: var(--fs-sm); color: var(--color-text-muted);
}
.issue-invoice__success-total {
    margin-top: 8px;
    font-size: 24px;
    font-weight: var(--fw-bold);
    color: var(--accent);
}

/* Лоадер на submit-кнопке */
.btn-spinner {
    display: inline-block;
    width: 14px; height: 14px;
    margin-right: 6px;
    border: 2px solid currentColor;
    border-right-color: transparent;
    border-radius: 50%;
    animation: ff-spinner 0.6s linear infinite;
    vertical-align: -2px;
}
@keyframes ff-spinner { to { transform: rotate(360deg); } }

/* ============ Клиенты: вкладки и документы ============ */
.client-pill {
    display: inline-flex; align-items: center; gap: 4px;
    padding: 3px 9px;
    background: var(--color-surface-2);
    border: 1px solid var(--color-line);
    border-radius: 999px;
    font-size: var(--fs-xs);
    color: var(--color-text-muted);
    cursor: pointer;
    text-decoration: none;
    transition: all var(--transition-fast);
    font-family: inherit;
}
.client-pill:hover {
    background: var(--accent-soft);
    border-color: var(--accent);
    color: var(--accent);
}
.client-pill--active {
    color: var(--color-text);
    background: var(--accent-soft);
    border-color: var(--accent);
    font-weight: var(--fw-semibold);
}

.client-modal { display: flex; flex-direction: column; gap: 14px; }
.client-tabs {
    display: flex; gap: 6px;
    border-bottom: 1px solid var(--color-line);
    margin-bottom: 4px;
    overflow-x: auto;
}
.client-tabs__tab {
    background: transparent;
    border: 0;
    padding: 8px 12px;
    border-radius: var(--radius-sm) var(--radius-sm) 0 0;
    font: inherit;
    color: var(--color-text-muted);
    cursor: pointer;
    display: inline-flex; align-items: center; gap: 6px;
    border-bottom: 2px solid transparent;
    transition: color var(--transition-fast), border-color var(--transition-fast);
    white-space: nowrap;
}
.client-tabs__tab:hover { color: var(--color-text); }
.client-tabs__tab.is-active {
    color: var(--accent);
    border-bottom-color: var(--accent);
    font-weight: var(--fw-semibold);
}
.client-tabs__count {
    display: inline-block;
    min-width: 18px; padding: 1px 5px;
    background: var(--color-surface-2);
    border-radius: 999px;
    font-size: 11px;
    color: var(--color-text-muted);
    line-height: 1.3;
}
.client-tabs__tab.is-active .client-tabs__count {
    background: var(--accent-soft);
    color: var(--accent);
}

.client-tabs__pane { display: none; }
.client-tabs__pane.is-active { display: block; }

/* ----- Документы клиента ----- */
.client-docs__upload-form {
    display: flex; flex-direction: column; gap: 10px;
    padding: 14px;
    background: var(--color-bg-soft);
    border: 1px dashed var(--color-line);
    border-radius: var(--radius-md);
    margin-bottom: 14px;
}
.client-docs__list { display: flex; flex-direction: column; gap: 8px; }
.client-doc {
    display: grid;
    grid-template-columns: 40px 1fr auto;
    align-items: center;
    gap: 12px;
    padding: 10px 14px;
    background: var(--color-surface);
    border: 1px solid var(--color-line);
    border-radius: var(--radius-md);
    transition: border-color var(--transition-fast), box-shadow var(--transition-fast);
}
.client-doc:hover {
    border-color: var(--color-line-strong);
    box-shadow: 0 2px 8px rgba(0, 0, 0, 0.04);
}
.client-doc__icon { font-size: 28px; text-align: center; }
.client-doc__body { min-width: 0; overflow: hidden; }
.client-doc__title {
    font-weight: var(--fw-semibold);
    color: var(--color-text);
    display: flex; align-items: center; gap: 8px;
    flex-wrap: wrap;
}
.client-doc__type {
    display: inline-block;
    padding: 1px 8px;
    background: var(--accent-soft);
    color: var(--accent);
    border-radius: 999px;
    font-size: 11px;
    font-weight: var(--fw-bold);
    text-transform: uppercase;
    letter-spacing: 0.03em;
}
.client-doc__meta {
    display: flex; gap: 6px; flex-wrap: wrap;
    font-size: var(--fs-xs);
    color: var(--color-text-muted);
    margin-top: 2px;
}
.client-doc__notes {
    margin-top: 4px;
    font-size: var(--fs-sm);
    color: var(--color-text);
    font-style: italic;
}
.client-doc__actions {
    display: flex; gap: 4px; align-items: center;
}
.client-docs__empty {
    padding: 36px 24px;
    text-align: center;
    color: var(--color-text-muted);
    background: var(--color-bg-soft);
    border: 1px dashed var(--color-line);
    border-radius: var(--radius-md);
}
.client-docs__empty-icon { font-size: 36px; margin-bottom: 8px; }

/* ----- Быстрые действия ----- */
.client-actions-grid {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
    gap: 12px;
}
.client-action-card {
    display: flex; flex-direction: column; gap: 4px;
    padding: 16px;
    background: var(--color-surface);
    border: 1px solid var(--color-line);
    border-radius: var(--radius-md);
    text-decoration: none;
    color: var(--color-text);
    transition: all var(--transition-fast);
    cursor: pointer;
}
.client-action-card:hover {
    border-color: var(--accent);
    background: var(--accent-soft);
    transform: translateY(-1px);
    box-shadow: 0 4px 12px rgba(0, 0, 0, 0.06);
}
.client-action-card__icon { font-size: 26px; line-height: 1; }
.client-action-card__title {
    font-weight: var(--fw-semibold);
    margin-top: 2px;
}
.client-action-card__hint {
    font-size: var(--fs-xs);
    color: var(--color-text-muted);
}

/* ============ Auto-handling card (Обработка товара авто) ============ */
.auto-handling-card {
    margin-top: 14px;
    padding: 14px;
    background: linear-gradient(135deg, var(--color-bg-soft) 0%, var(--accent-soft) 200%);
    border: 1px solid var(--accent);
    border-radius: var(--radius-md);
}
.auto-handling-card__head {
    display: flex; align-items: flex-start; gap: 12px;
    margin-bottom: 10px;
}
.auto-handling-card__icon { font-size: 24px; line-height: 1; }
.auto-handling-card__title {
    font-weight: var(--fw-semibold);
    color: var(--color-text);
    flex: 1;
}
.auto-handling-card__subtitle {
    font-weight: var(--fw-regular);
    margin-top: 2px;
}
.auto-handling-card__body {
    display: flex; align-items: center; justify-content: space-between;
    gap: 14px;
    flex-wrap: wrap;
}
.auto-handling-card__body--warning {
    flex-direction: column;
    align-items: stretch;
}
.auto-handling-card__formula {
    display: inline-flex; align-items: center; gap: 8px;
    padding: 8px 12px;
    background: var(--color-surface);
    border: 1px solid var(--color-line);
    border-radius: var(--radius-sm);
    font-size: var(--fs-md);
    color: var(--color-text);
}
.auto-handling-card__op {
    color: var(--color-text-muted);
    font-weight: var(--fw-regular);
}
.auto-handling-card__total {
    color: var(--accent);
    font-size: var(--fs-lg);
}

/* ---- Выбор состава «наименования услуги» (галочки полей товара) ---- */
.bill-namepick {
    display: flex;
    flex-direction: column;
    gap: 6px;
    margin-bottom: 10px;
}
.bill-namepick__lbl {
    font-size: var(--fs-xs);
    color: var(--color-text-muted);
    font-weight: var(--fw-medium);
}
.bill-namepick__opts {
    display: flex;
    flex-wrap: wrap;
    gap: 6px;
}
.bill-namepick__opt {
    display: inline-flex;
    align-items: center;
    gap: 5px;
    padding: 4px 9px;
    border: 1px solid var(--color-line);
    border-radius: var(--radius-pill, 999px);
    font-size: var(--fs-sm);
    cursor: pointer;
    user-select: none;
    transition: background .12s, border-color .12s;
}
.bill-namepick__opt:hover { border-color: var(--accent); }
.bill-namepick__opt:has(input:checked) {
    background: color-mix(in srgb, var(--accent) 12%, transparent);
    border-color: var(--accent);
    color: var(--color-text);
}
.bill-namepick__opt input { accent-color: var(--accent); margin: 0; }

/* ---- Быстрая установка цены для товаров без цены (прямо в карточке начисления) ---- */
.bill-missing__list {
    display: flex;
    flex-direction: column;
    gap: 6px;
    margin-top: 8px;
}
.bill-missing__row {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 10px;
    flex-wrap: wrap;
    padding: 6px 8px;
    background: var(--color-surface);
    border: 1px solid var(--color-line);
    border-radius: var(--radius-sm);
}
.bill-missing__name {
    font-size: var(--fs-sm);
    font-weight: var(--fw-medium);
    flex: 1;
    min-width: 140px;
}
.bill-missing__form {
    display: flex;
    align-items: center;
    gap: 6px;
}
.bill-missing__price {
    width: 110px;
    text-align: right;
}
.bill-missing__nocard {
    color: var(--color-warning);
    font-style: italic;
}

/* ============ Начисление: табличный редактор строк (CSS-grid) ============ */
.bill-grid-wrap { overflow-x: auto; border: 1px solid var(--color-line); border-radius: var(--radius-md); background: var(--color-surface); }
.bill-grid { display: grid; grid-template-columns: minmax(170px, 1fr) 132px 82px 100px 112px 62px; min-width: 640px; }
.bill-grid--locked { grid-template-columns: minmax(170px, 1fr) 132px 82px 100px 112px; min-width: 560px; }
/* строки = display:contents, чтобы поля формы встали в колонки общего грида */
.bill-grid__head, .bill-row, .bill-foot { display: contents; }
.bill-grid__head > span {
    position: sticky; top: 0; z-index: 1; background: var(--color-surface-2);
    padding: 9px 10px; font-size: var(--fs-xs); text-transform: uppercase; letter-spacing: .03em;
    color: var(--color-text-muted); font-weight: var(--fw-semibold); border-bottom: 1px solid var(--color-line);
}
.bill-grid__head > span.num { text-align: right; }
.bill-cell {
    min-width: 0; padding: 5px 9px; border-bottom: 1px solid var(--color-line);
    background: var(--color-surface); font: inherit; color: var(--color-text); align-self: stretch;
    display: flex; align-items: center;
}
input.bill-cell { border: 1px solid transparent; border-radius: 0; background: transparent; }
input.bill-cell:hover { border-color: var(--color-line); }
input.bill-cell:focus {
    outline: none; border-color: var(--accent, var(--color-info)); border-radius: var(--radius-sm);
    background: var(--color-surface); box-shadow: 0 0 0 2px color-mix(in srgb, var(--color-info) 22%, transparent);
}
.bill-cell--num { text-align: right; justify-content: flex-end; font-variant-numeric: tabular-nums; }
input.bill-cell--num { text-align: right; }
.bill-cell--sum { justify-content: flex-end; font-weight: var(--fw-bold); font-variant-numeric: tabular-nums; color: var(--color-text); }
.bill-row__act { display: flex; align-items: center; justify-content: center; gap: 3px; padding: 3px 5px; border-bottom: 1px solid var(--color-line); background: var(--color-surface); }
.bill-row:hover > .bill-cell, .bill-row:hover > .bill-row__act { background: color-mix(in srgb, var(--color-surface-2) 55%, transparent); }
.bill-row--add > .bill-cell, .bill-row--add > .bill-row__act { background: var(--accent-soft, color-mix(in srgb, var(--accent) 8%, transparent)); border-bottom: 0; }
.bill-iconbtn { width: 26px; height: 26px; display: inline-flex; align-items: center; justify-content: center;
    border: 1px solid var(--color-line); border-radius: var(--radius-sm); background: var(--color-surface);
    cursor: pointer; font-size: 14px; line-height: 1; padding: 0; color: var(--color-text-muted); transition: all .12s; }
.bill-iconbtn--ok:hover { border-color: var(--color-success); color: var(--color-success); background: color-mix(in srgb, var(--color-success) 12%, transparent); }
.bill-iconbtn--del:hover { border-color: var(--color-danger); color: var(--color-danger); background: color-mix(in srgb, var(--color-danger) 12%, transparent); }
.bill-iconbtn--add { width: 100%; border-color: var(--accent); color: var(--accent); font-weight: 700; }
.bill-iconbtn--add:hover { background: var(--accent); color: #fff; }
.bill-foot > * { padding: 10px; border-top: 2px solid var(--color-line); }
.bill-foot__label { text-align: right; font-weight: var(--fw-semibold); color: var(--color-text-muted); }
.bill-foot__sum { text-align: right; font-weight: var(--fw-bold); font-size: var(--fs-lg); font-variant-numeric: tabular-nums; color: var(--accent); }
.bill-grid__empty { grid-column: 1 / -1; padding: 16px; text-align: center; color: var(--color-text-muted); font-size: var(--fs-sm); }
/* Свободные позиции в общем счёте: 5 колонок (без действий-формы) */
.bill-grid--manual { grid-template-columns: minmax(170px, 1fr) 92px 110px 120px 56px; min-width: 560px; }
.bill-additem { grid-column: 1 / -1; display: flex; align-items: center; justify-content: center; gap: 6px;
    padding: 10px; border: 0; border-top: 1px dashed var(--color-line); background: var(--accent-soft, color-mix(in srgb, var(--accent) 7%, transparent));
    color: var(--accent); font: inherit; font-weight: var(--fw-semibold); cursor: pointer; width: 100%; }
.bill-additem:hover { background: color-mix(in srgb, var(--accent) 14%, transparent); }
/* Полоса «Итого по счёту» */
.invoice-total-bar { display: flex; align-items: center; justify-content: space-between; gap: 14px;
    padding: 14px 18px; border-radius: var(--radius-md); margin: 4px 0;
    background: var(--color-surface-2); border: 1px solid var(--color-line); }
.invoice-total-bar__label { font-weight: var(--fw-semibold); color: var(--color-text-muted); }
.invoice-total-bar__sum { font-size: var(--fs-xl, 22px); font-weight: var(--fw-bold); font-variant-numeric: tabular-nums; color: var(--accent); }
.invoice-total-bar__hint { font-size: var(--fs-xs); color: var(--color-text-soft); margin-left: auto; }

/* ---- Инлайн-правка базовой цены в каталоге/прайсе ---- */
.bp-input { width: 96px; text-align: right; padding: 4px 8px; font-variant-numeric: tabular-nums;
    border: 1px solid var(--color-line); border-radius: var(--radius-sm); background: var(--color-surface); }
.bp-input:focus { outline: none; border-color: var(--accent, var(--color-info));
    box-shadow: 0 0 0 2px color-mix(in srgb, var(--color-info) 22%, transparent); }
.bp-input--ok { border-color: var(--color-success); box-shadow: 0 0 0 2px color-mix(in srgb, var(--color-success) 25%, transparent); }
.bp-input--err { border-color: var(--color-danger); box-shadow: 0 0 0 2px color-mix(in srgb, var(--color-danger) 25%, transparent); }

/* ============ Сборка отгрузок (picking) ============ */
.picking-grid {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
    gap: 12px;
}
.picking-tile {
    display: flex; flex-direction: column; gap: 8px;
    padding: 14px;
    background: var(--color-surface);
    border: 1px solid var(--color-line);
    border-radius: var(--radius-md);
    text-decoration: none;
    color: var(--color-text);
    transition: all var(--transition-fast);
}
.picking-tile:hover {
    border-color: var(--accent);
    box-shadow: 0 4px 12px rgba(0, 0, 0, 0.05);
    transform: translateY(-1px);
}
.picking-tile--done { border-color: var(--color-success, #16a34a); background: var(--color-success-soft, #f0fdf4); }
.picking-tile__top { display: flex; justify-content: space-between; align-items: center; }
.picking-tile__id { font-family: var(--font-mono, ui-monospace); font-size: var(--fs-xs); color: var(--color-text-muted); }
.picking-tile__status { font-size: 10px; padding: 2px 8px; background: var(--color-bg-soft); border-radius: 999px; color: var(--color-text-muted); text-transform: uppercase; }
.picking-tile__title { font-weight: var(--fw-semibold); font-size: var(--fs-md); line-height: 1.25; }
.picking-tile__meta { display: flex; flex-wrap: wrap; gap: 6px 12px; font-size: var(--fs-xs); color: var(--color-text-muted); }
.picking-tile__progress { margin-top: 4px; display: flex; flex-direction: column; gap: 4px; }
.picking-tile__counter { font-size: var(--fs-lg); font-weight: var(--fw-bold); }
.picking-tile__counter--done { color: var(--color-success, #16a34a); }
.picking-tile__slash { color: var(--color-text-muted); margin: 0 4px; font-weight: var(--fw-regular); }
.picking-tile__bar {
    position: relative; height: 6px;
    background: var(--color-bg-soft);
    border-radius: 3px; overflow: hidden;
}
.picking-tile__bar > span {
    position: absolute; left: 0; top: 0; bottom: 0;
    background: linear-gradient(90deg, var(--accent), var(--color-success, #16a34a));
    transition: width 0.3s ease;
}
.picking-tile__hint { font-size: var(--fs-xs); color: var(--color-text-muted); }

/* === Picking page layout === */
.picking-layout {
    display: grid;
    grid-template-columns: minmax(320px, 1fr) minmax(280px, 420px);
    gap: 16px;
    margin-top: 8px;
}
@media (max-width: 880px) {
    .picking-layout { grid-template-columns: 1fr; }
}

.picking-main { display: flex; flex-direction: column; gap: 12px; }
.picking-camera {
    width: 100%;
    aspect-ratio: 4 / 3;
    max-height: 70vh;
    background: #000;
    border-radius: var(--radius-md);
    overflow: hidden;
    position: relative;
}
/* html5-qrcode вставляет внутрь обёртки (__scan_region/__dashboard) и <video>.
   Заставляем видео заполнять весь бокс — иначе на телефоне превью выходит крошечным
   с чёрными полями. Поведение как у рабочего сканера .fbs-cam. */
.picking-camera [id$="__scan_region"],
.picking-camera [id$="__dashboard"] { width: 100% !important; border: 0 !important; }
.picking-camera video {
    width: 100% !important;
    height: 100% !important;
    object-fit: cover !important;
    display: block;
}
/* Прячем «кривое» библиотечное затемнение — рисуем свой ровный прицел */
.picking-camera #qr-shaded-region { display: none !important; }
.picking-camera:not(:empty)::after {
    content: '';
    position: absolute; left: 50%; top: 50%;
    transform: translate(-50%, -50%);
    width: min(86%, 440px); height: 46%;
    border: 2px solid rgba(54, 200, 132, 0.95);
    border-radius: 12px;
    box-shadow: 0 0 0 100vmax rgba(0, 0, 0, 0.28);
    pointer-events: none;
}
.picking-camera:empty::before {
    content: '📷'; color: #444;
    position: absolute; inset: 0;
    display: grid; place-items: center;
    font-size: 64px;
}
/* Телефон: окно во всю ширину и заметно выше (портретная камера заполняет бокс) */
@media (max-width: 880px) {
    .picking-camera { aspect-ratio: 3 / 4; max-height: 64vh; }
}
.picking-camera__start { align-self: flex-start; }

.picking-card {
    padding: 14px;
    background: var(--color-surface);
    border: 1px solid var(--color-line);
    border-radius: var(--radius-md);
    display: grid;
    grid-template-areas: "brand counter" "name counter" "meta counter" "qty qty";
    grid-template-columns: 1fr auto;
    gap: 4px 16px;
    transition: background var(--transition-fast), border-color var(--transition-fast);
}
.picking-card.flash-ok   { border-color: var(--color-success, #16a34a); background: var(--color-success-soft, #f0fdf4); }
.picking-card.flash-warn { border-color: var(--color-warning, #f59e0b); background: var(--color-warning-soft, #fffbeb); }
.picking-card.flash-bad  { border-color: var(--color-danger, #dc2626);  background: var(--color-danger-soft,  #fef2f2); }
.picking-card--empty { opacity: 0.7; }

.picking-card__brand { grid-area: brand; font-size: var(--fs-xs); color: var(--color-text-muted); text-transform: uppercase; letter-spacing: 0.04em; font-weight: var(--fw-bold); }
.picking-card__name  { grid-area: name; font-weight: var(--fw-semibold); font-size: var(--fs-lg); line-height: 1.25; }
.picking-card__meta  { grid-area: meta; display: flex; flex-wrap: wrap; gap: 6px 12px; font-size: var(--fs-xs); color: var(--color-text-muted); }
.picking-card__counter {
    grid-area: counter;
    font-size: 40px; font-weight: var(--fw-bold);
    line-height: 1;
    align-self: center;
    display: flex; align-items: baseline; gap: 4px;
    color: var(--color-text);
}
.picking-card__slash { color: var(--color-text-muted); font-size: 0.6em; }

.picking-card__qty {
    grid-area: qty;
    display: flex; gap: 6px; align-items: center;
    margin-top: 8px;
}
.picking-qty-btn { padding: 6px 12px; font-size: var(--fs-md); min-width: 40px; }
.picking-qty-input { width: 100px; text-align: center; font-weight: var(--fw-bold); }

.picking-flash {
    padding: 10px 14px;
    border-radius: var(--radius-md);
    font-weight: var(--fw-semibold);
    text-align: center;
    animation: ff-picking-flash-in 0.15s ease-out;
}
.picking-flash--ok   { background: var(--color-success, #16a34a); color: #fff; }
.picking-flash--warn { background: var(--color-warning, #f59e0b); color: #fff; }
.picking-flash--bad  { background: var(--color-danger,  #dc2626); color: #fff; }
@keyframes ff-picking-flash-in { from { transform: scale(0.9); opacity: 0; } to { transform: scale(1); opacity: 1; } }

.picking-actions { display: flex; gap: 8px; }

.picking-foreign {
    background: var(--color-warning-soft, #fffbeb);
    border: 1px solid var(--color-warning, #f59e0b);
    border-radius: var(--radius-md);
    padding: 10px 14px;
    font-size: var(--fs-sm);
}
.picking-foreign summary { cursor: pointer; font-weight: var(--fw-semibold); }
.picking-foreign ul { margin: 8px 0 0; padding-left: 18px; }
.picking-foreign code { font-family: var(--font-mono); font-size: var(--fs-xs); }

/* === Side panel === */
.picking-side { display: flex; flex-direction: column; gap: 8px; }
.picking-progress-bar {
    padding: 10px 12px;
    background: var(--color-surface);
    border: 1px solid var(--color-line);
    border-radius: var(--radius-md);
    display: flex; flex-direction: column; gap: 8px;
}
.picking-progress-bar__head { display: flex; justify-content: space-between; align-items: baseline; font-size: var(--fs-sm); }

.picking-items {
    list-style: none; padding: 0; margin: 0;
    display: flex; flex-direction: column; gap: 4px;
    max-height: 70vh; overflow-y: auto;
    border: 1px solid var(--color-line);
    border-radius: var(--radius-md);
    background: var(--color-surface);
}
.picking-item {
    display: flex; align-items: center; gap: 8px;
    padding: 8px 12px;
    border-bottom: 1px solid var(--color-line);
    cursor: pointer;
    transition: background var(--transition-fast);
}
.picking-item:last-child { border-bottom: none; }
.picking-item:hover { background: var(--color-bg-soft); }
.picking-item--active { background: var(--accent-soft); border-left: 3px solid var(--accent); padding-left: 9px; }
.picking-item--done   { background: var(--color-success-soft, #f0fdf4); }
.picking-item--over   { background: var(--color-warning-soft, #fffbeb); }
.picking-item__body { flex: 1; min-width: 0; }
.picking-item__name { font-weight: var(--fw-semibold); font-size: var(--fs-sm); line-height: 1.25; overflow: hidden; text-overflow: ellipsis; }
.picking-item__meta { font-size: var(--fs-xs); color: var(--color-text-muted); margin-top: 2px; }
.picking-item__counts { font-size: var(--fs-md); font-weight: var(--fw-semibold); white-space: nowrap; }
.picking-item__scanned--zero { color: var(--color-text-muted); font-weight: var(--fw-regular); }

.picking-camera-controls { display: flex; flex-direction: column; gap: 8px; }
.picking-manual-form { display: flex; gap: 8px; align-items: end; }
.picking-manual-form .input {
    font-family: var(--font-mono, ui-monospace);
    font-size: var(--fs-md);
    letter-spacing: 0.05em;
}

/* ============ Комплекты (kits) ============ */
.kit-grid {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
    gap: 12px;
}
.kit-card {
    display: flex; flex-direction: column; gap: 10px;
    padding: 14px;
    background: var(--color-surface);
    border: 1px solid var(--color-line);
    border-radius: var(--radius-md);
}
.kit-card:hover { border-color: var(--color-line-strong); box-shadow: 0 2px 8px rgba(0,0,0,0.04); }
.kit-card__head { display: flex; flex-direction: column; gap: 2px; }
.kit-card__title { font-weight: var(--fw-semibold); font-size: var(--fs-md); line-height: 1.3; }
.kit-card__meta { display: flex; flex-wrap: wrap; gap: 6px; font-size: var(--fs-xs); color: var(--color-text-muted); }

.kit-card__buildable {
    display: flex; align-items: baseline; gap: 6px;
    padding: 10px 12px;
    background: var(--accent-soft);
    border-radius: var(--radius-sm);
}
.kit-card__buildable-value {
    font-size: 24px;
    font-weight: var(--fw-bold);
    color: var(--accent);
}
.kit-card__buildable--zero { color: var(--color-warning, #f59e0b); }

.kit-card__components { font-size: var(--fs-sm); }
.kit-card__components ul {
    list-style: none; padding: 0; margin: 0;
    display: flex; flex-direction: column; gap: 3px;
    max-height: 160px; overflow-y: auto;
}
.kit-card__components li {
    display: flex; align-items: baseline; gap: 6px;
    padding: 4px 8px;
    background: var(--color-bg-soft);
    border-radius: var(--radius-sm);
}
.kit-card__comp-name { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.kit-card__comp-qty {
    font-weight: var(--fw-bold);
    color: var(--accent);
    white-space: nowrap;
}
.kit-card__actions { display: flex; gap: 6px; margin-top: auto; }

.kit-components-editor {
    border: 1px solid var(--color-line);
    border-radius: var(--radius-md);
    padding: 10px;
    background: var(--color-bg-soft);
}
.kit-components-editor__header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 8px; }
.kit-components-editor__cols {
    display: grid;
    grid-template-columns: 1fr 92px 36px;
    gap: 6px;
    padding: 0 6px 4px;
    font-size: var(--fs-xs);
    color: var(--color-text-muted);
    font-weight: var(--fw-semibold);
    text-transform: uppercase;
    letter-spacing: 0.03em;
}
.kit-components-editor__cols > span:nth-child(2) { text-align: center; }
.kit-components-editor__rows { display: flex; flex-direction: column; gap: 6px; }
.kit-component-row {
    display: grid;
    grid-template-columns: 1fr 92px 36px;
    gap: 6px; align-items: center;
    background: var(--color-surface);
    padding: 6px;
    border-radius: var(--radius-sm);
    border: 1px solid var(--color-line);
}
.kit-component-row > select,
.kit-component-row > .ffs { min-width: 0; }   /* ff_select оборачивает select в .ffs — он должен влезать в колонку грида */
.kit-component-row > input[type=number] { text-align: center; }

/* ============ Модалка начисления по заданию ============ */
.billing-modal__meta {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
    gap: 8px;
    padding: 12px 14px;
    background: var(--color-bg-soft);
    border: 1px solid var(--color-line);
    border-radius: var(--radius-md);
    margin-bottom: 12px;
}
.billing-modal__meta > div { display: flex; flex-direction: column; gap: 2px; min-width: 0; }
.billing-modal__meta-k { font-size: var(--fs-xs); color: var(--color-text-muted); text-transform: uppercase; letter-spacing: 0.03em; }
.billing-modal__meta-v { font-weight: var(--fw-semibold); color: var(--color-text); overflow: hidden; text-overflow: ellipsis; }
.billing-modal__composition {
    border: 1px solid var(--color-line);
    border-radius: var(--radius-md);
    margin-bottom: 8px;
}
.billing-modal__composition .table-wrap { max-height: 240px; overflow-y: auto; }

.billing-summary {
    display: flex; align-items: center; justify-content: space-between;
    gap: 12px; flex-wrap: wrap;
    padding: 12px 14px;
    background: var(--accent-soft);
    border-radius: var(--radius-md);
}
.billing-summary__total { display: flex; flex-direction: column; gap: 1px; }
.billing-summary__total strong { color: var(--accent); }

/* ============ Контур склада / ТСД ============ */
.wh-actions {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
    gap: 12px;
}
.wh-action {
    display: flex; flex-direction: column; gap: 4px;
    padding: 18px 16px;
    background: var(--color-surface);
    border: 1px solid var(--color-line);
    border-radius: var(--radius-md);
    text-decoration: none; color: var(--color-text);
    transition: all var(--transition-fast);
    min-height: 96px;
}
.wh-action:hover { border-color: var(--accent); background: var(--accent-soft); transform: translateY(-2px); box-shadow: 0 4px 14px rgba(0,0,0,0.06); }
.wh-action--scan { background: linear-gradient(135deg, var(--accent-soft), var(--color-surface)); border-color: var(--accent); }
.wh-action__icon { font-size: 30px; line-height: 1; }
.wh-action__title { font-weight: var(--fw-semibold); font-size: var(--fs-md); }
.wh-action__hint { font-size: var(--fs-xs); color: var(--color-text-muted); }

.scan-layout { display: grid; grid-template-columns: minmax(300px, 1fr) minmax(300px, 1.2fr); gap: 16px; }
@media (max-width: 880px) { .scan-layout { grid-template-columns: 1fr; } }
.scan-main { display: flex; flex-direction: column; gap: 12px; }
.scan-result__empty {
    display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 10px;
    min-height: 240px; padding: 24px; text-align: center;
    background: var(--color-bg-soft); border: 1px dashed var(--color-line); border-radius: var(--radius-md);
    color: var(--color-text-muted);
}
.scan-result__cards { display: flex; flex-direction: column; gap: 12px; }
.scan-card { border: 1px solid var(--color-line); border-radius: var(--radius-md); overflow: hidden; background: var(--color-surface); }
.scan-card__top { display: flex; gap: 12px; padding: 14px; }
.scan-card__media { width: 56px; height: 56px; border-radius: var(--radius-sm); overflow: hidden; background: var(--color-bg-soft); display: grid; place-items: center; font-size: 28px; flex-shrink: 0; }
.scan-card__media img { width: 100%; height: 100%; object-fit: cover; }
.scan-card__title { font-weight: var(--fw-semibold); font-size: var(--fs-md); }
.scan-card__meta, .scan-card__client, .scan-card__bc { font-size: var(--fs-xs); color: var(--color-text-muted); margin-top: 2px; }
.scan-card__avail {
    display: flex; align-items: center; justify-content: space-between;
    padding: 12px 14px; margin: 0 14px;
    border-radius: var(--radius-sm);
}
.scan-card__avail--ok { background: var(--color-success-soft, #f0fdf4); }
.scan-card__avail--zero { background: var(--color-bg-soft); }
.scan-card__avail--neg { background: var(--color-danger-soft, #fef2f2); }
.scan-card__avail-label { font-size: var(--fs-sm); color: var(--color-text-muted); }
.scan-card__avail-value { font-size: 26px; font-weight: var(--fw-bold); font-variant-numeric: tabular-nums; }
.scan-card__avail--ok .scan-card__avail-value { color: var(--color-success, #16a34a); }
.scan-card__avail--neg .scan-card__avail-value { color: var(--color-danger, #dc2626); }
.scan-card__breakdown { display: flex; flex-wrap: wrap; gap: 6px 14px; padding: 10px 14px; font-size: var(--fs-xs); color: var(--color-text-muted); }

/* ============ Меню аккаунта (свитчер) в topbar ============ */
.acct-menu { position: relative; }
.acct-menu__trigger { cursor: pointer; user-select: none; list-style: none; display: inline-flex; align-items: center; gap: 4px; }
.acct-menu__trigger::-webkit-details-marker { display: none; }
.acct-menu__caret { font-size: 10px; opacity: 0.7; }
.acct-menu__panel {
    position: absolute; top: calc(100% + 6px); right: 0;
    min-width: 248px; z-index: 200;
    background: var(--color-surface); border: 1px solid var(--color-line);
    border-radius: var(--radius-md); box-shadow: 0 10px 30px rgba(0,0,0,0.16);
    padding: 8px; display: flex; flex-direction: column; gap: 2px;
}
.acct-menu__head { padding: 6px 10px 8px; display: flex; flex-direction: column; gap: 1px; border-bottom: 1px solid var(--color-line); margin-bottom: 4px; }
.acct-menu__label { font-size: var(--fs-xs); color: var(--color-text-muted); text-transform: uppercase; letter-spacing: 0.03em; padding: 4px 10px 2px; }
.acct-menu__item {
    display: flex; flex-direction: column; align-items: flex-start; gap: 1px;
    width: 100%; text-align: left; padding: 8px 10px;
    background: transparent; border: 0; border-radius: var(--radius-sm);
    cursor: pointer; font: inherit; color: var(--color-text);
}
.acct-menu__item:hover { background: var(--color-bg-soft); }
.acct-menu__item--return { color: var(--accent); font-weight: var(--fw-semibold); }
.acct-menu__item--logout { color: var(--color-danger); }
.acct-menu__role { font-weight: var(--fw-semibold); }
.acct-menu__switch-form { padding: 6px 10px; display: flex; flex-direction: column; gap: 4px; }
.acct-menu__sep { height: 1px; background: var(--color-line); margin: 4px 2px; }

/* Меню действий (action_menu): панель по умолчанию прижата к ПРАВОМУ краю триггера
   (растёт влево — «Ещё» в шапке у правого края экрана больше не уезжает за него).
   Если слева не хватает места (кебаб у левого края), ui.js вешает .is-align-left. */
.amenu__panel { min-width: 220px; }
.acct-menu__panel.is-align-left { left: 0; right: auto; }
.amenu__item {
    flex-direction: row; align-items: center; gap: 8px;
    white-space: nowrap; font-size: var(--fs-sm); text-decoration: none;
}
.amenu .acct-menu__caret { font-size: 9px; }
.input--sm { min-height: 30px; padding: 4px 8px; font-size: var(--fs-sm); flex: 1; }

/* ===================== Мобильное сканирование (телефон кладовщика) ===================== */
/* Подсветка карточки результата при успешном скане (вместе со звуком/вибро). */
.scan-card--hit { animation: ff-scan-hit 0.35s ease-out; }
@keyframes ff-scan-hit {
    0%   { transform: scale(0.97); box-shadow: 0 0 0 0 rgba(22,163,74,0.55); }
    40%  { transform: scale(1.012); box-shadow: 0 0 0 3px rgba(22,163,74,0.45); }
    100% { transform: scale(1); box-shadow: 0 0 0 0 rgba(22,163,74,0); }
}
/* Непросканированные позиции пикинга подсвечиваем — видно, что осталось собрать. */
.picking-item__scanned--zero { color: var(--color-danger, #dc2626); font-weight: var(--fw-bold); }

@media (max-width: 600px) {
    .scan-layout { display: flex; flex-direction: column; gap: 12px; }
    .scan-main, .scan-result { width: 100%; }
    .scan-result__empty { min-height: 150px; padding: 16px; }
    .picking-items { max-height: 38vh; }
    .picking-card__counter { font-size: 34px; }
    .scan-card__breakdown { gap: 4px 10px; padding: 8px 12px; }
}

@media (max-width: 430px) {
    /* тач-таргеты ≥44px — попасть пальцем одной рукой */
    .btn { min-height: 44px; }
    .picking-qty-btn { min-width: 44px; min-height: 44px; padding: 8px 12px; }
    .picking-qty-input { width: 84px; }
    .picking-card__qty { flex-wrap: wrap; }
    /* поля ввода ≥16px — иначе iOS зумит страницу при фокусе на вводе */
    .input, .picking-manual-form .input { font-size: 16px; }
    /* ручная форма — в столбик, кнопка во всю ширину, ничего не убегает за экран */
    .picking-manual-form { flex-direction: column; align-items: stretch; }
    .picking-manual-form .input, .picking-manual-form .btn { width: 100%; }
    /* камера компактнее — результат/последний скан виден без прокрутки */
    .picking-camera { aspect-ratio: 16 / 10; max-height: 230px; }
    /* кнопка камеры и ручной ввод всегда под рукой при прокрутке к результату */
    .picking-camera-controls {
        position: sticky; top: var(--topbar-height, 56px); z-index: 30;
        background: var(--color-surface); padding-top: 8px;
    }
    .scan-card { word-break: break-word; overflow-wrap: anywhere; }
}

/* ============================================================
   Складской контур ТЗ (warehouse task) — фокусная главная и карточка ТЗ.
   Мобильный приоритет: крупные тач-цели, вертикальный поток.
   ============================================================ */
.wh-section { margin-bottom: var(--space-6); }
.wh-section__title {
    font-size: 0.95rem; font-weight: 700; text-transform: uppercase;
    letter-spacing: 0.04em; color: var(--color-text-muted);
    margin: 0 0 var(--space-3);
}
.wh-section__title--warn { color: var(--color-warning); }
.wh-muted { color: var(--color-text-muted); font-size: 0.95rem; margin: var(--space-2) 0; }

.wh-grid { display: flex; flex-direction: column; gap: var(--space-3); }

.wh-card {
    background: var(--color-surface); border: 1px solid var(--color-line);
    border-radius: var(--radius-lg); padding: var(--space-4);
    box-shadow: var(--shadow-sm); display: flex; flex-direction: column; gap: var(--space-3);
}
.wh-card--lg { border-color: var(--color-line-strong); box-shadow: var(--shadow-md); }
.wh-card__open { text-decoration: none; color: inherit; display: flex; flex-direction: column; gap: var(--space-2); }
.wh-card__top { display: flex; align-items: center; justify-content: space-between; gap: var(--space-2); }
.wh-card__type { font-size: 0.85rem; font-weight: 600; color: var(--color-text-muted); }
.wh-card__title { font-size: 1.1rem; font-weight: 700; line-height: 1.25; color: var(--color-text); }
.wh-card--lg .wh-card__title { font-size: 1.3rem; }
.wh-card__client { font-size: 0.95rem; color: var(--color-text-muted); }
.wh-card__assignee { font-size: 0.9rem; color: var(--color-info); }
.wh-card__problem {
    font-size: 0.9rem; color: var(--color-warning);
    background: var(--color-warning-soft); padding: var(--space-2) var(--space-3);
    border-radius: var(--radius-sm);
}
.wh-card__cta { margin-top: var(--space-1); }
.wh-card__cta .btn, .wh-card__cta button { width: 100%; justify-content: center; }

/* Чипы статусов ТЗ */
.wh-chip {
    display: inline-flex; align-items: center; padding: 2px 10px;
    border-radius: var(--radius-pill); font-size: 0.78rem; font-weight: 700;
    white-space: nowrap;
}
.wh-chip--queued  { background: var(--color-info-soft);    color: var(--color-info); }
.wh-chip--in_work { background: var(--color-success-soft); color: var(--color-success); }
.wh-chip--paused  { background: var(--color-surface-3);    color: var(--color-text-muted); }
.wh-chip--problem { background: var(--color-danger-soft);  color: var(--color-danger); }
.wh-chip--done    { background: var(--color-surface-3);    color: var(--color-text); }

/* Прогресс сборки */
.wh-progress { display: flex; align-items: center; gap: var(--space-3); }
.wh-progress__bar {
    flex: 1; height: 8px; background: var(--color-surface-3);
    border-radius: var(--radius-pill); overflow: hidden;
}
.wh-progress__bar > span {
    display: block; height: 100%; background: var(--color-success);
    border-radius: var(--radius-pill); transition: width 0.25s ease;
}
.wh-progress__num { font-size: 0.9rem; font-weight: 700; color: var(--color-text-muted); white-space: nowrap; }
.wh-progress--wide { margin: var(--space-3) 0; }

/* Карточка ТЗ */
.wh-task__status {
    display: flex; flex-wrap: wrap; align-items: center; gap: var(--space-2) var(--space-3);
    margin-bottom: var(--space-3);
}
.wh-task__status .wh-muted { margin: 0; font-size: 0.9rem; }
.wh-task__problem {
    background: var(--color-danger-soft); color: var(--color-danger);
    padding: var(--space-3); border-radius: var(--radius-md);
    font-weight: 600; margin-bottom: var(--space-3);
}
.wh-bigbtn { width: 100%; justify-content: center; font-size: 1.05rem; padding: var(--space-4); margin: var(--space-3) 0; }
.wh-scanner { margin: 0 0 var(--space-3); }
.wh-items { max-height: 46vh; }

/* Нижний бар действий ТЗ — крупные тач-цели, в потоке (не перекрывает таб-бар) */
.wh-actionbar {
    display: flex; gap: var(--space-2); margin-top: var(--space-4);
    padding-bottom: var(--space-2);
}
.wh-actionbar form { flex: 1; display: flex; }
.wh-actionbar .btn, .wh-actionbar form button { flex: 1; justify-content: center; min-height: 48px; }

.wh-scan-cta { margin-top: var(--space-5); }
.wh-scan-cta .btn { width: 100%; justify-content: center; }

/* На широком экране (админ открыл) — сетка карточек в 2 колонки */
@media (min-width: 720px) {
    .wh-grid { display: grid; grid-template-columns: repeat(2, 1fr); }
    .wh-card--lg { grid-column: 1 / -1; }
}

/* ============================================================
   CRM-доска админа (канбан заданий). Колонки = статусы, внутри дни→клиенты.
   ============================================================ */
.board-toolbar { display: flex; align-items: center; gap: var(--space-2); flex-wrap: wrap; margin-bottom: var(--space-3); }
.board-toolbar .spacer { flex: 1; }
.board-search { flex: 1 1 240px; min-width: 200px; max-width: 380px; margin: 0; }
.board-search .input { width: 100%; }
@media (max-width: 700px) { .board-search { flex-basis: 100%; max-width: none; } .board-hint { display: none; } }
.board-hint { white-space: nowrap; }
.board { display: flex; gap: var(--space-3); align-items: flex-start; overflow-x: auto; padding-bottom: var(--space-3); }
.board__col {
    flex: 1 1 0; min-width: 264px; background: var(--color-bg-soft);
    border: 1px solid var(--color-line); border-radius: var(--radius-lg);
    display: flex; flex-direction: column; max-height: calc(100dvh - 230px);
}
.board__col-head {
    position: sticky; top: 0; z-index: 1;
    min-height: 52px; box-sizing: border-box;
    display: flex; align-items: center; justify-content: space-between; gap: var(--space-2);
    padding: var(--space-3); border-bottom: 1px solid var(--color-line);
    background: var(--color-bg-soft); border-radius: var(--radius-lg) var(--radius-lg) 0 0;
}
/* Заголовок — всегда в одну строку (иначе разная высота шапок ломала выравнивание колонок) */
.board__col-title { font-weight: 700; font-size: 0.9rem; min-width: 0; flex: 1 1 auto; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.board__col-count { flex: 0 0 auto; font-size: 0.78rem; color: var(--color-text-muted); background: var(--color-surface-3); border-radius: var(--radius-pill); padding: 1px 8px; }
.board__col-body { padding: var(--space-2); overflow-y: auto; overflow-x: hidden; min-width: 0; display: flex; flex-direction: column; gap: var(--space-2); min-height: 80px; }
.board__col-body.is-over { background: var(--color-info-soft); outline: 2px dashed var(--color-info); outline-offset: -4px; border-radius: var(--radius-md); }
.board__day { display: flex; flex-direction: column; gap: 4px; }
.board__day-label { font-size: 0.72rem; font-weight: 700; text-transform: uppercase; letter-spacing: 0.04em; color: var(--color-text-muted); padding: var(--space-2) 2px 2px; }
.board__client { display: flex; flex-direction: column; gap: 6px; margin-bottom: var(--space-2); }
.board__client-name { font-size: 0.8rem; color: var(--color-text-muted); padding-left: 2px; overflow-wrap: anywhere; }
.board__empty { color: var(--color-text-soft); font-size: 0.85rem; text-align: center; padding: var(--space-4) 0; }

.board-card {
    position: relative; min-width: 0; background: var(--color-surface);
    border: 1px solid var(--color-line); border-left: 3px solid var(--color-line-strong);
    border-radius: var(--radius-md); padding: var(--space-3); cursor: grab; box-shadow: var(--shadow-sm);
}
.board-card:active { cursor: grabbing; }
.board-card.is-dragging { opacity: 0.5; }
.board-card--attention { border-left-color: var(--color-warning); }
.board-card--overdue { border-left-color: var(--color-danger); }
.board-card__top { display: flex; align-items: center; justify-content: space-between; }
.board-card__type { font-size: 0.78rem; color: var(--color-text-muted); font-weight: 600; }
.board-card__kebab { background: none; border: 0; color: var(--color-text-muted); cursor: pointer; font-size: 1rem; line-height: 1; padding: 2px 8px; border-radius: var(--radius-sm); }
.board-card__kebab:hover { background: var(--color-surface-3); }
.board-card__title { display: block; font-weight: 600; color: var(--color-text); text-decoration: none; margin: 2px 0; line-height: 1.25; overflow-wrap: anywhere; }
.board-card__title:hover { text-decoration: underline; }
.board-card__meta { display: flex; align-items: center; gap: 6px; flex-wrap: wrap; margin-top: 4px; }
.board-card__qty { margin-left: auto; font-size: 0.8rem; color: var(--color-text-muted); }
.board-card__att { font-size: 0.72rem; color: var(--color-warning); font-weight: 700; }
.board-card--overdue .board-card__att { color: var(--color-danger); }
.board-card__sub { font-size: 0.8rem; color: var(--color-text-muted); margin-top: 4px; }
.board-card__problem { font-size: 0.78rem; color: var(--color-danger); background: var(--color-danger-soft); border-radius: var(--radius-sm); padding: 3px 6px; margin-top: 4px; }
.board-card__menu { position: absolute; right: 8px; top: 30px; z-index: 10; background: var(--color-surface); border: 1px solid var(--color-line-strong); border-radius: var(--radius-md); box-shadow: var(--shadow-md); display: flex; flex-direction: column; padding: 4px; min-width: 190px; }
.board-card__menu button { text-align: left; background: none; border: 0; color: var(--color-text); padding: 8px 10px; border-radius: var(--radius-sm); cursor: pointer; font-size: 0.85rem; }
.board-card__menu button:hover { background: var(--color-surface-3); }

@media (max-width: 900px) {
    .board { gap: var(--space-2); }
    .board__col { min-width: 240px; }
    .board-hint { display: none; }
}

/* CRM-доска: расширенная карточка задания */
.board-card__client { font-size: 0.82rem; color: var(--color-text); font-weight: 600; margin-top: 2px; overflow-wrap: anywhere; }
.board-card__info { display: flex; flex-wrap: wrap; gap: 4px 10px; margin-top: 6px; font-size: 0.75rem; color: var(--color-text-muted); }
.board-card__info span { white-space: nowrap; }
/* Склад/адрес может быть длинным — занимает свою строку и обрезается многоточием
   (полный текст — в title). Иначе длинный адрес растягивал колонку и давал гор. скролл. */
.board-card__wh { flex: 1 1 100%; min-width: 0; max-width: 100%; overflow: hidden; text-overflow: ellipsis; }
.board-card__picker { font-size: 0.72rem; color: var(--color-text-muted); }

/* Карточка ТЗ: блок информации / печать / файлы */
.wh-info { background: var(--color-surface); border: 1px solid var(--color-line); border-radius: var(--radius-md); padding: var(--space-3); margin-bottom: var(--space-3); display: flex; flex-direction: column; gap: var(--space-3); }
.wh-info__grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(140px, 1fr)); gap: var(--space-2) var(--space-3); }
.wh-info__grid > div { display: flex; flex-direction: column; }
.wh-info__wide { grid-column: 1 / -1; }
.wh-info__k { font-size: 0.7rem; text-transform: uppercase; letter-spacing: 0.04em; color: var(--color-text-muted); }
.wh-info__v { font-weight: 600; }
.wh-print { display: flex; flex-wrap: wrap; gap: var(--space-2); }
.wh-files { display: flex; flex-direction: column; gap: 4px; }
.wh-file { color: var(--color-info); text-decoration: none; font-size: 0.9rem; word-break: break-all; }
.wh-file:hover { text-decoration: underline; }
.wh-item-print { margin-left: 8px; text-decoration: none; font-size: 1.05rem; }

/* Карточка ТЗ: тулбар позиций + инлайн-количество готового товара */
.wh-items-toolbar { display: flex; flex-wrap: wrap; align-items: center; gap: var(--space-2); margin: var(--space-2) 0; }
.wh-items-search { flex: 1 1 200px; min-width: 150px; }
.wh-items-filter { display: inline-flex; align-items: center; gap: 6px; font-size: 0.85rem; color: var(--color-text-muted); white-space: nowrap; cursor: pointer; }
.wh-items-summary { font-size: 0.82rem; color: var(--color-text-muted); margin-left: auto; white-space: nowrap; }
.wh-task .picking-item__counts { flex-wrap: wrap; justify-content: flex-end; gap: 4px; row-gap: 4px; }
.wh-qty { display: inline-flex; align-items: center; gap: 4px; }
.wh-qty__btn { width: 34px; height: 34px; min-width: 34px; border: 1px solid var(--color-line-strong); background: var(--color-surface-2); color: var(--color-text); border-radius: var(--radius-sm); font-size: 1.1rem; line-height: 1; cursor: pointer; }
.wh-qty__btn:hover { background: var(--color-surface-3); }
.wh-qty__field { width: 56px; text-align: center; padding: 6px 4px; }
.wh-qty__plan { font-size: 0.85rem; white-space: nowrap; }
.wh-qty__done { width: 34px; height: 34px; min-width: 34px; border: 1px solid var(--color-success); background: var(--color-success-soft); color: var(--color-success); border-radius: var(--radius-sm); font-size: 1rem; cursor: pointer; }
.wh-qty__done:hover { background: var(--color-success); color: #fff; }
@media (max-width: 600px) { .wh-qty__field { width: 48px; } .wh-items-summary { margin-left: 0; } }

/* Карточка ТЗ: инструкция, текущий короб, раскладка по коробам */
.wh-help { background: var(--color-surface); border: 1px solid var(--color-line); border-radius: var(--radius-md); padding: var(--space-2) var(--space-3); margin-bottom: var(--space-2); }
.wh-help summary { cursor: pointer; font-weight: 600; color: var(--color-text-muted); }
.wh-help__list { margin: var(--space-2) 0 0; padding-left: 18px; display: flex; flex-direction: column; gap: 4px; font-size: 0.9rem; color: var(--color-text); }
.wh-current-box { background: var(--color-info-soft); color: var(--color-info); border-radius: var(--radius-md); padding: var(--space-2) var(--space-3); margin-bottom: var(--space-2); font-size: 0.95rem; font-weight: 600; }
.wh-boxes-section { margin: var(--space-4) 0; }
.wh-boxes-title { font-size: 0.95rem; font-weight: 700; margin: 0 0 var(--space-2); }
.wh-box { border: 1px solid var(--color-line); border-radius: var(--radius-md); margin-bottom: var(--space-2); overflow: hidden; }
.wh-box--open { border-color: var(--color-info); box-shadow: 0 0 0 1px var(--color-info-soft); }
.wh-box__head { display: flex; align-items: center; justify-content: space-between; gap: 8px; padding: var(--space-2) var(--space-3); background: var(--color-bg-soft); font-weight: 600; font-size: 0.9rem; }
.wh-box__total { color: var(--color-text-muted); font-weight: 700; white-space: nowrap; }
.wh-box__row { display: flex; align-items: center; justify-content: space-between; gap: 8px; padding: 6px var(--space-3); border-top: 1px solid var(--color-line); }
.wh-box__name { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }

/* Карточка ТЗ: штрихкод позиции (виден кладовщику) */
.picking-item__bc { font-size: 0.82rem; color: var(--color-text); font-family: var(--font-mono, monospace); letter-spacing: 0.03em; margin-top: 2px; }
.picking-item__bc--none { color: var(--color-warning); font-family: inherit; font-size: 0.78rem; }

/* ============================================================
   Календарь заданий (страницы /admin/calendar и /warehouse/calendar)
   ============================================================ */
.cal-toolbar {
    display: flex;
    gap: var(--space-3);
    align-items: center;
    flex-wrap: wrap;
}
.cal-toolbar .row { gap: 6px; }

.cal-grid {
    display: grid;
    grid-template-columns: repeat(7, minmax(0, 1fr));
    gap: 6px;
}
.cal-grid--month { gap: 4px; }
@media (max-width: 900px) {
    .cal-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}

.cal-day {
    background: var(--color-surface);
    border: 1px solid var(--color-line);
    border-radius: var(--radius-md);
    padding: 8px 10px;
    min-height: 140px;
    display: flex; flex-direction: column;
    gap: 6px;
    position: relative;
}
.cal-day--month { min-height: 110px; padding: 6px 8px; }
.cal-day--out-month { opacity: 0.35; }
.cal-day--today { border-color: var(--accent); box-shadow: 0 0 0 2px var(--accent-soft); }
.cal-day--has-attention { border-color: var(--color-warning); }
.cal-day--has-overdue {
    border-color: var(--color-danger);
    background: linear-gradient(180deg, color-mix(in srgb, var(--color-danger) 8%, var(--color-surface)) 0%, var(--color-surface) 100%);
    box-shadow: inset 0 0 0 1px var(--color-danger-soft);
}
.cal-day--has-overdue .cal-day__attention {
    background: var(--color-danger);
    color: #fff;
    animation: pulse-overdue 1.6s ease-in-out infinite;
}
@keyframes pulse-overdue {
    0%, 100% { box-shadow: 0 0 0 0 color-mix(in srgb, var(--color-danger) 50%, transparent); }
    50%      { box-shadow: 0 0 0 6px color-mix(in srgb, var(--color-danger) 0%, transparent); }
}
.cal-day__header {
    display: flex; justify-content: space-between; align-items: center;
    font-size: var(--fs-xs);
    color: var(--color-text-muted);
    font-weight: var(--fw-bold);
    text-transform: uppercase;
    letter-spacing: 0.06em;
}
.cal-day__date {
    font-size: var(--fs-md);
    font-weight: var(--fw-black);
    color: var(--color-text);
}
.cal-day__attention {
    font-size: 10px;
    color: var(--color-warning);
    font-weight: var(--fw-bold);
    background: var(--color-warning-soft);
    padding: 2px 6px;
    border-radius: var(--radius-pill);
}
/* Мягкая заглушка пустого дня (неделя/2 дня): день без заданий не выглядит «сломанным» */
.cal-day__empty {
    flex: 1;
    display: grid;
    place-items: center;
    font-size: var(--fs-xs);
    color: var(--color-text-soft);
    user-select: none;
}

.cal-event {
    display: grid;
    grid-template-columns: 18px 1fr;
    gap: 6px;
    align-items: center;
    padding: 6px 8px;
    border-radius: var(--radius-sm);
    background: var(--color-surface-2);
    text-decoration: none;
    color: inherit;
    font-size: 11px;
    line-height: 1.2;
    transition: background var(--transition-fast);
}
.cal-event:hover { background: var(--color-surface-3); }
.cal-event__icon {
    display: grid; place-items: center;
    width: 18px; height: 18px;
    border-radius: 4px;
    font-weight: var(--fw-black);
    font-size: 11px;
    color: #fff;
}
.cal-event__icon--in { background: var(--color-success); }
.cal-event__icon--out { background: var(--color-warning); }
.cal-event--attention { box-shadow: inset 3px 0 0 var(--color-warning); }
.cal-event--overdue { box-shadow: inset 3px 0 0 var(--color-danger); }
.cal-event__body { min-width: 0; }
.cal-event__title {
    font-weight: var(--fw-semibold);
    color: var(--color-text);
    white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.cal-event__meta {
    color: var(--color-text-soft);
    white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.cal-event__stats {
    margin-top: 2px;
    display: flex; gap: 6px; flex-wrap: nowrap; align-items: center;
    font-size: 10.5px; color: var(--color-text-muted);
    font-variant-numeric: tabular-nums;
    white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.cal-event__qty { font-weight: var(--fw-bold); color: var(--color-text); }
.cal-event__qty--ok { color: var(--color-success); }
.cal-event__wh {
    display: block; margin-top: 2px;
    font-size: 11px; color: var(--color-text);
    font-weight: var(--fw-semibold);
    white-space: normal; overflow: hidden;
    text-overflow: ellipsis;
    display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical;
    word-break: break-word;
}
.cal-event__wh::before { content: "📍 "; opacity: .85; font-size: 10px; }
.cal-event__status {
    font-size: 9.5px; padding: 1px 6px; border-radius: 999px;
    background: var(--color-bg-soft); color: var(--color-text-muted);
    text-transform: lowercase; flex: 0 0 auto;
}
.cal-event__status--ok { background: var(--color-success-soft); color: var(--color-success); }
.cal-event__status--warn { background: var(--color-warning-soft); color: var(--color-warning); }
.cal-event__status--danger { background: var(--color-danger-soft); color: var(--color-danger); }
.cal-event__more {
    font-size: 10px;
    color: var(--accent);
    text-align: center;
    padding: 4px 6px;
    background: var(--color-surface-2);
    border: 1px dashed var(--color-line);
    border-radius: var(--radius-sm);
    cursor: pointer;
    width: 100%;
    font-weight: var(--fw-semibold);
    transition: background var(--transition-fast);
}
.cal-event__more:hover { background: var(--accent-soft); }
.cal-event__overflow:not([hidden]) { display: flex; flex-direction: column; gap: 4px; }
.cal-event[draggable="true"] { cursor: grab; }
.cal-event.is-dragging { opacity: 0.4; cursor: grabbing; }
.cal-day.is-drop-target {
    border-color: var(--accent);
    background: var(--accent-soft);
    transform: scale(1.02);
    transition: transform 120ms ease;
}

/* Фильтр-чипы (используются календарём и доской) */
.fchip {
    display: inline-flex;
    align-items: center;
    gap: 4px;
    padding: 4px 10px;
    border-radius: var(--radius-pill);
    background: var(--color-surface-2);
    border: 1px solid var(--color-line);
    font-size: var(--fs-xs);
    font-weight: var(--fw-semibold);
    color: var(--color-text-muted);
    text-decoration: none;
    cursor: pointer;
    white-space: nowrap;
}
.fchip:hover { background: var(--color-surface-3); color: var(--color-text); }
.fchip.is-active {
    background: var(--accent-soft);
    color: var(--accent);
    border-color: transparent;
}
.fchip__count {
    display: inline-block;
    min-width: 16px;
    height: 16px;
    padding: 0 4px;
    font-size: 10px;
    line-height: 16px;
    text-align: center;
    background: color-mix(in srgb, currentColor 22%, transparent);
    color: currentColor;
    border-radius: var(--radius-pill);
}

/* ============================================================
   Каталог товаров: миниатюра + ШК + лайтбокс увеличения фото
   ============================================================ */
.cat-prod { display: flex; gap: 10px; align-items: flex-start; }
.cat-prod__thumb {
    flex: 0 0 auto; width: 46px; height: 46px;
    border-radius: var(--radius-sm); overflow: hidden;
    background: var(--color-bg-soft); border: 1px solid var(--color-line);
    display: grid; place-items: center; padding: 0;
    cursor: zoom-in; position: relative;
}
.cat-prod__thumb img { width: 100%; height: 100%; object-fit: cover; display: block; }
.cat-prod__thumb--empty { font-size: 22px; cursor: default; }
.cat-prod__zoom {
    position: absolute; right: 2px; bottom: 2px;
    font-size: 10px; line-height: 14px; padding: 0 3px;
    background: rgba(0, 0, 0, 0.55); color: #fff; border-radius: 4px;
    opacity: 0; transition: opacity var(--transition-fast);
}
.cat-prod__thumb:hover .cat-prod__zoom { opacity: 1; }
.cat-prod__info { min-width: 0; }
.cat-prod__bc {
    font-family: var(--font-mono, monospace);
    font-size: var(--fs-xs); color: var(--color-text-soft);
    margin-top: 2px; letter-spacing: 0.02em;
}

.img-lightbox {
    position: fixed; inset: 0; z-index: var(--z-modal);
    background: rgba(0, 0, 0, 0.8);
    backdrop-filter: blur(4px); -webkit-backdrop-filter: blur(4px);
    display: grid; place-items: center; padding: var(--space-5);
}
.img-lightbox[hidden] { display: none; }
.img-lightbox__fig {
    margin: 0; max-width: 92vw; max-height: 90vh;
    display: flex; flex-direction: column; gap: 8px; align-items: center;
}
.img-lightbox__fig img {
    max-width: 92vw; max-height: 82vh; object-fit: contain;
    border-radius: var(--radius-md); box-shadow: var(--shadow-lg); background: #fff;
}
.img-lightbox__fig figcaption { color: #fff; font-size: var(--fs-sm); text-align: center; }
.img-lightbox__close {
    position: absolute; top: 16px; right: 20px;
    width: 40px; height: 40px; border-radius: 50%;
    background: rgba(255, 255, 255, 0.15); color: #fff;
    font-size: 24px; line-height: 1; border: 0;
    display: grid; place-items: center; cursor: pointer;
}
.img-lightbox__close:hover { background: rgba(255, 255, 255, 0.28); }

/* ======== Drawer — боковая карточка-панель (offcanvas справа) ========
   Переиспользуемый компонент: товар/задание открывается вбок единым местом,
   без перезагрузки. Шапка + быстрые действия + табы + прокручиваемое тело. */
.drawer { position: fixed; inset: 0; z-index: var(--z-modal); display: flex; justify-content: flex-end; }
.drawer[hidden] { display: none; }
.drawer__scrim {
    position: absolute; inset: 0; background: rgba(0, 0, 0, 0.45);
    backdrop-filter: blur(2px); -webkit-backdrop-filter: blur(2px);
    opacity: 0; transition: opacity var(--transition-fast);
}
.drawer.is-open .drawer__scrim { opacity: 1; }
.drawer__panel {
    position: relative; z-index: 1; width: min(600px, 100vw); height: 100%;
    background: var(--color-surface); border-left: 1px solid var(--color-line-strong);
    box-shadow: var(--shadow-lg); display: flex; flex-direction: column;
    transform: translateX(100%); transition: transform var(--transition-md);
}
.drawer.is-open .drawer__panel { transform: translateX(0); }
.drawer__header { display: flex; gap: 12px; align-items: flex-start; padding: var(--space-4); border-bottom: 1px solid var(--color-line); }
.drawer__thumb {
    width: 56px; height: 56px; flex: 0 0 auto; border-radius: var(--radius-md);
    object-fit: cover; border: 1px solid var(--color-line);
    background: var(--color-surface-2); display: grid; place-items: center; font-size: 24px;
}
.drawer__heading { flex: 1; min-width: 0; }
.drawer__title { font-size: var(--fs-lg); font-weight: 700; margin: 0; line-height: 1.25; }
.drawer__meta { font-size: var(--fs-sm); color: var(--color-text-soft); margin-top: 2px; }
.drawer__chips { display: flex; flex-wrap: wrap; gap: 4px; margin-top: 6px; }
.drawer__close {
    flex: 0 0 auto; width: 36px; height: 36px; border-radius: 50%;
    border: 1px solid var(--color-line); background: var(--color-surface-2);
    font-size: 20px; line-height: 1; cursor: pointer; display: grid; place-items: center;
}
.drawer__close:hover { border-color: var(--color-line-strong); }
.drawer__actions { display: flex; gap: 6px; flex-wrap: wrap; padding: var(--space-3) var(--space-4); border-bottom: 1px solid var(--color-line); }
.drawer__tabs { display: flex; gap: 0; padding: 0 var(--space-4); border-bottom: 1px solid var(--color-line); }
.drawer__tab {
    appearance: none; border: 0; background: transparent; padding: 12px 8px; font: inherit; font-size: var(--fs-sm);
    flex: 1 1 0; text-align: center; color: var(--color-text-soft); cursor: pointer;
    border-bottom: 2px solid transparent; margin-bottom: -1px; white-space: nowrap;
}
.drawer__tab:hover { color: var(--color-text); }
.drawer__tab.is-active { color: var(--accent); border-bottom-color: var(--accent); font-weight: var(--fw-semibold); }
.drawer__body { flex: 1; overflow-y: auto; padding: var(--space-4); }
.drawer__section[hidden] { display: none; }
/* Форма карточки — в один столбец: разная длина подписей в 2 колонки шла вразнобой. */
.drawer__section .grid--2 { grid-template-columns: 1fr; gap: var(--space-3); }
.drawer__section .table-wrap { overflow-x: auto; }
.drawer-stock { display: grid; grid-template-columns: repeat(2, 1fr); gap: 8px; }
.drawer-stock__cell { border: 1px solid var(--color-line); border-radius: var(--radius-md); padding: 10px 12px; background: var(--color-surface-2); }
.drawer-stock__cell--wide { grid-column: 1 / -1; }
.drawer-stock__label { font-size: var(--fs-xs); color: var(--color-text-soft); }
.drawer-stock__value { font-size: var(--fs-lg); font-weight: 700; font-variant-numeric: tabular-nums; }
.drawer-stock__cell--danger { border-color: var(--color-danger); }
.drawer-stock__cell--danger .drawer-stock__value { color: var(--color-danger); }
@media (max-width: 640px) { .drawer__panel { width: 100vw; } }

/* ============================================================
   Единый каркас детальной страницы задания (приёмка/отгрузка/поручение).
   Один дизайн для всех типов — различается только функциональное наполнение.
   ============================================================ */
.task-hero { position: relative; overflow: hidden; border-radius: var(--radius-lg); padding: 20px 24px; margin-bottom: 16px;
    background: linear-gradient(135deg, var(--accent-soft) 0%, var(--color-surface) 62%); border: 1px solid var(--color-line);
    display: flex; justify-content: space-between; align-items: flex-start; gap: 24px; flex-wrap: wrap; }
.task-hero::after { content: ''; position: absolute; top: -40px; right: -40px; width: 200px; height: 200px;
    background: radial-gradient(circle, var(--accent) 0%, transparent 70%); opacity: .10; pointer-events: none; }
.task-hero__badge { display: inline-flex; align-items: center; gap: 6px; font-size: 11px; text-transform: uppercase; letter-spacing: .08em;
    font-weight: 800; color: var(--accent); background: var(--color-surface); border: 1px solid var(--color-line); padding: 4px 12px; border-radius: var(--radius-pill); }
.task-hero__title { font-size: 24px; font-weight: 900; line-height: 1.12; margin: 10px 0 8px; }
.task-hero__meta { display: flex; gap: 18px; flex-wrap: wrap; color: var(--color-text-muted); font-size: 14px; }
.task-hero__meta b { color: var(--color-text); font-weight: 700; }
.task-hero__side { display: flex; flex-direction: column; gap: 10px; align-items: flex-end; min-width: 200px; position: relative; z-index: 1; }
.task-hero__progress { width: 100%; min-width: 180px; }
.task-hero__progress-bar { height: 8px; border-radius: var(--radius-pill); background: var(--color-surface-2); overflow: hidden; margin-top: 6px; }
.task-hero__progress-fill { height: 100%; background: var(--accent); border-radius: var(--radius-pill); transition: width .3s ease; }

.section-nav { position: sticky; top: 6px; z-index: 6; display: flex; gap: 6px; flex-wrap: wrap;
    background: color-mix(in srgb, var(--color-bg) 82%, transparent); backdrop-filter: blur(8px);
    padding: 8px; border-radius: var(--radius-md); margin-bottom: 16px; border: 1px solid var(--color-line); }
.section-nav a { text-decoration: none; font-size: 13px; font-weight: 600; color: var(--color-text-muted); padding: 6px 13px; border-radius: var(--radius-pill); transition: background .15s, color .15s; }
.section-nav a:hover { background: var(--accent-soft); color: var(--accent); }

.detail-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 16px; }
@media (max-width: 960px) { .detail-grid { grid-template-columns: 1fr; } }
section[id] { scroll-margin-top: 70px; }

/* Унифицированный степпер статуса — для всех типов задания */
.task-steps { display: flex; align-items: center; gap: 0; flex-wrap: wrap; margin: 4px 0 18px; }
.task-steps__item { display: inline-flex; align-items: center; gap: 8px; padding: 4px 0; }
.task-steps__dot { width: 26px; height: 26px; border-radius: 50%; display: inline-flex; align-items: center; justify-content: center;
    font-size: 13px; font-weight: 800; border: 2px solid var(--color-line); background: var(--color-surface); color: var(--color-text-muted); flex: 0 0 auto; }
.task-steps__label { font-size: 13px; font-weight: 600; color: var(--color-text-muted); white-space: nowrap; }
.task-steps__bar { flex: 1 1 24px; min-width: 18px; height: 2px; background: var(--color-line); margin: 0 8px; }
.task-steps__bar--done { background: var(--accent); }
.task-steps__bar--danger { background: var(--color-danger, #e5484d); }
.task-steps__item--done   .task-steps__dot { background: var(--accent); border-color: var(--accent); color: #fff; }
.task-steps__item--done   .task-steps__label { color: var(--color-text); }
.task-steps__item--active .task-steps__dot { border-color: var(--accent); color: var(--accent); box-shadow: 0 0 0 4px var(--accent-soft); }
.task-steps__item--active .task-steps__label { color: var(--accent); font-weight: 800; }
.task-steps__item--danger .task-steps__dot { background: var(--color-danger, #e5484d); border-color: var(--color-danger, #e5484d); color: #fff; }
.task-steps__item--danger .task-steps__label { color: var(--color-danger, #e5484d); font-weight: 800; }
@media (max-width: 640px) { .task-steps__label { font-size: 12px; } .task-steps__bar { margin: 0 4px; } }

/* Сворачиваемый блок: редкие/опасные действия не мозолят глаза (общий для деталей задания) */
details.ce { border: 1px solid var(--color-line); border-radius: var(--radius-lg); background: var(--color-surface); margin-top: 16px; overflow: hidden; }
details.ce > summary { cursor: pointer; list-style: none; padding: 13px 18px; display: flex; align-items: center; justify-content: space-between; gap: 10px; font-weight: 700; user-select: none; }
details.ce > summary::-webkit-details-marker { display: none; }
details.ce > summary:hover { background: var(--color-surface-2); }
details.ce > summary .ce__hint { font-weight: 500; font-size: 12px; color: var(--color-text-soft); margin-left: auto; }
details.ce > summary .ce__chev { transition: transform .2s ease; color: var(--color-text-muted); font-size: 18px; line-height: 1; }
details.ce[open] > summary .ce__chev { transform: rotate(90deg); }
details.ce .ce__body { padding: 6px 18px 18px; }
details.ce--danger > summary { color: var(--color-danger); }
details.ce--danger { border-color: color-mix(in srgb, var(--color-danger) 35%, var(--color-line)); }

/* Группировка пунктов внутри выпадающего меню действий (action_menu) */
.amenu__group { font-size: 11px; text-transform: uppercase; letter-spacing: .06em; color: var(--color-text-soft); padding: 8px 14px 2px; font-weight: 700; }
.amenu__sep { height: 1px; background: var(--color-line); margin: 6px 0; }

/* Футер модалки без рамки/паддинга/фона — общий вариант вместо инлайн-оверрайдов
   style="border:0;padding:0;background:transparent" на каждой детальной странице. */
.modal__footer--bare { border: 0; padding: 0; background: transparent; }

/* Компактная строка смены статуса под степпером (детали задания) */
.task-transitions { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; margin: -4px 0 18px; }
.task-transitions > form { margin: 0; }
.task-transitions__label { font-size: 13px; color: var(--color-text-muted); }

/* ===== Редактор товарного состава (composition_editor.js) ===== */
.comp-toolbar { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; margin-bottom: 10px; }
.comp-toolbar .spacer { flex: 1; }
[data-edit-cell] { cursor: pointer; border-radius: var(--radius-xs); padding: 2px 6px; transition: background .12s ease, box-shadow .12s ease;
    display: inline-block; min-width: 28px; border-bottom: 1px dashed var(--color-line-strong); }
[data-edit-cell]:hover { background: var(--accent-soft); box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--accent) 35%, transparent); border-bottom-color: transparent; }
[data-edit-cell]:focus-visible { background: var(--accent-soft); box-shadow: var(--shadow-focus); outline: none; border-bottom-color: transparent; }
[data-edit-cell][data-field="planned"] { font-weight: var(--fw-bold); }
.is-editmode [data-edit-cell] { cursor: default; background: transparent; box-shadow: none; padding: 0; border-bottom: 0; }
/* В режиме массовой правки прячем мгновенные действия строки — чтобы не обходить «Сохранить всё». */
.is-editmode .comp-remove,
.is-editmode [data-itemlabel-open],
.is-editmode [data-defect-open] { display: none; }
.comp-input { width: 76px; max-width: 100%; padding: 5px 8px; font: inherit; font-variant-numeric: tabular-nums;
    border: 1px solid var(--accent); border-radius: var(--radius-sm); background: var(--color-surface); color: var(--color-text);
    outline: none; box-shadow: var(--shadow-focus); }
.comp-remove { border: 0; background: transparent; cursor: pointer; color: var(--color-text-soft); font-size: 15px;
    line-height: 1; padding: 4px 6px; border-radius: var(--radius-sm); transition: background .12s ease, color .12s ease; }
.comp-remove:hover { background: var(--color-danger-soft); color: var(--color-danger); }
.comp-editbar { position: sticky; bottom: 0; z-index: 5; display: flex; align-items: center; gap: 10px; flex-wrap: wrap;
    margin-top: 12px; padding: 12px 14px; border-radius: var(--radius-md);
    background: color-mix(in srgb, var(--accent-soft) 60%, var(--color-surface)); border: 1px solid var(--accent); box-shadow: var(--shadow-md); }
.comp-editbar__hint { font-size: 13px; color: var(--color-text-muted); }
.comp-editbar .spacer { flex: 1; }
