// web/screens/review2.jsx — Ревью 2 · Тексты (§21.5). // Привели в соответствие с дизайном 2026-06-03: page-header с // breadcrumbs + «Перегенерировать», pipeline status strip, KwCard с // top/banner/suspect вариациями, разделение active/spare ключей, // «Развернуть анализ», CSV preview блок внизу. // EditableText — contentEditable div как в дизайне (вместо textarea). // Управляемый компонент: текст приходит из props.value, на blur вызывается // onChange. Placeholder показывается через CSS pseudo-element (data-placeholder). // // Зачем contentEditable а не textarea: класс .r2-text в дизайне стилизован // как inline-текст без рамки (transparent border, при hover серый фон, при // focus — обводка цвета акцента). У textarea свой нативный стиль (рамка + // fixed height по rows), который ломает визуал. ContentEditable div этого // не имеет — он растягивается по содержимому естественно. function EditableText({ value, onChange, className, placeholder }) { const ref = React.useRef(null); // Синхронизируем внешний value (например после reload фотки из API) с DOM // только если он реально изменился И элемент не в фокусе (чтобы не // прерывать редактирование). React.useEffect(() => { if (!ref.current) return; if (document.activeElement === ref.current) return; if (ref.current.textContent !== (value || "")) { ref.current.textContent = value || ""; } }, [value]); return (
{csvSample}