---
name: fst-print-layout
description: >-
  Настройка печатных бланков и Excel Otgruzka без обрезки строк и дыр в нумерации.
  Use when print preview, PDF, Excel export, A4, page-break, overflow hidden,
  «бланк», «форма», «переход страниц», список сотрудников, печать/выгрузка.
---

# Раскладка бланков Otgruzka

Канон кода: React-лист + `src/styles/print.css` + fit после paint. Не Puppeteer.
Читать вместе с `print-forms`. Этот скил — про **переходы страниц и Excel**.

## Инцидент (не повторять)

Печать списка сотрудников, 2026-08-14: на лист 1 с логотипом положили 22 строки.
`overflow: hidden` обрезал №18–22. Лист 2 начинался с №23. В превью — серая щель и дыра в номерах.

**Правило:** если в превью последний видимый № на листе N, а следующий лист начинается с N+k (k>1) — это баг, люди потеряны.

## Печать (A4)

1. Лист = точный A4 (`297×210` альбом или `210×297` книжка), поля **внутри** padding, `@page { margin: 0 }`.
2. Первый лист с логотипом/титулом вмещает **меньше** строк, чем продолжение с одной строкой-кикером.
3. После paint подогнать высоту строк: `rowH = min(max, available / count)`. **Не** `Math.max(minRow, …)`, если `minRow * count` больше available — тогда hidden режет хвост.
4. `overflow: hidden` на листе можно только если **все** `tbody tr` целиком внутри бокса. Иначе уменьшить count, не прятать людей.
5. Нумерация сквозная: concat страниц = исходный список без пропусков.
6. Длинный текст: `nowrap` + ellipsis, не рост строки на 2–3 линии (ломает вместимость).
7. Превью = печать (как журнал явки). Не обнулять padding в `@media print`, если `@page margin: 0`.
8. Модалка печати — `ephemeral`. Fit — после `requestAnimationFrame` ×2, снова перед Ctrl+P / PDF.

Ориентир вместимости альбом + логотип FiberCell: **16 строк** на первый лист, больше — только с короткой шапкой.

## Excel

Как бланк, не голый `aoa_to_sheet`:

- шапка (орг, заголовок, дата, счётчик);
- колонка №;
- `autoFilter` на строке заголовков;
- `pageSetup`: A4, landscape, `fitToWidth: 1`, `fitToHeight: 0`;
- `printTitlesRow` = строка фильтров;
- те же колонки/люди, что на печати (без ЗП/банка в офисном списке).

Образец стиля: `src/lib/export/payrollBankTransferExcel.ts`. Офис: `src/lib/office/staffListExcel.ts`.

## Чеклист перед сдачей

- [ ] В превью нет серой щели с «пропавшими» номерами между листами
- [ ] Последний № листа 1 + 1 = первый № листа 2
- [ ] Хвост не обрезан `overflow: hidden`
- [ ] Excel: стрелки фильтра, лист не уезжает за A4 по ширине
- [ ] i18n RU+KA
