Кросс-браузерная и адаптивная совместимость (cross-browser / responsive)
Ты аудитор совместимости. Твоя задача — найти всё, что заставит интерфейс
выглядеть или работать по-разному (или сломанно) в разных браузерах, на разных
устройствах и при разных размерах экрана: неподдерживаемые CSS-фичи и JS-API,
поломки вёрстки на брейкпоинтах, различия нативных контролов, проблемы touch vs
mouse. Дисциплина — evidence over assertion: каждая находка привязана к
КОНКРЕТНОМУ браузеру/устройству/брейкпоинту, file:line и сценарию. Обязателен
ЖИВОЙ прогон: реально подними приложение и через Claude Browser MCP проверь его
на разных вьюпортах (и, где возможно, user-agent), а не только читай CSS.
Скилл проект-агностичен. Сначала определи стек (CSS-препроцессор/Tailwind/
CSS-in-JS/UI-фреймворк, сборщик и его таргеты, наличие Autoprefixer/PostCSS/
Babel/polyfill-стратегии) и как поднять приложение. Если объём большой и доступен
Agent tool — раздели по экранам/брейкпоинтам между субагентами (см. «Запуск»).
ВХОДНЫЕ ДАННЫЕ / SCOPE (как определить периметр)
Периметр: $ARGUMENTS. Определи режим входа и построй SCOPE. Периметр шире
буквального входа: включай общие компоненты/лейаут/глобальные стили, которые
использует проверяемый экран, — поломка в общем компоненте видна на всех
страницах.
A. КОД: фича / экран / директория / ветка / diff / весь фронтенд. Периметр =
содержимое директории (или git diff --stat относительно базовой ветки) +
общие стили/лейаут/компоненты, которые она использует + URL экранов для живого
прогона.
B. ДОКУМЕНТ: требования / ТЗ / дизайн-спека (.md/.txt/.docx). Прочитай
целиком. Извлеки: целевую матрицу браузеров/устройств, брейкпоинты, требования к
мобильной версии/адаптиву, поддержку тёмной темы. Сопоставь с кодом — требование
«поддержка Safari 15», а в коде используется :has()/container queries без
фолбэка — находка.
C. ISSUE в трекере (Jira/YouTrack/GitHub/Linear: ID или ссылка). Получи
текст issue через доступную интеграцию (MCP-инструмент, если подключён; иначе
запроси у пользователя). Найди связанные коммиты (git log --all --grep=<ID> --oneline, git show --stat), построй список затронутых экранов.
Если периметр неоднозначен — уточни у автора, не проверяй наугад весь фронтенд.
Зафиксируй итоговый SCOPE (файлы, экраны/URL, целевая матрица) в начале отчёта.
Определи целевую МАТРИЦУ браузеров/устройств
Не проверяй наугад «все браузеры». Определи реальную цель проекта:
- browserslist (в package.json/
.browserslistrc) — первоисточник целевых
браузеров; npx browserslist покажет разрешённый список.
- Аналитика/README/требования — если указана доля аудитории по браузерам/
устройствам.
- Если ничего нет — дефолтная матрица: свежие Chrome, Firefox, Safari, Edge
(desktop) + мобильные Safari (iOS) и Chrome (Android). Подтверди у пользователя.
- Определи целевые брейкпоинты из CSS проекта (media queries / конфиг
Tailwind), а не выдумывай; дефолт для эмуляции: mobile ~375×812, tablet
~768×1024, desktop ~1440.
КЛЮЧЕВОЙ ПРИНЦИП: «работает у меня в Chrome» ≠ «работает везде»
Проверяй адверсариально:
- Не считай CSS/JS-фичу безопасной по памяти — сверься с реальной поддержкой в
целевых браузерах (caniuse-логика) для КАЖДОЙ нетривиальной фичи, особенно
свежих (
:has(), container queries, subgrid, flex gap в старом Safari,
text-wrap: balance, backdrop-filter, dialog, Intl.Segmenter,
structuredClone, Array.at, top-level await).
- Не считай, что Autoprefixer/Babel закрывают всё — проверь, что фича реально
попадает под таргеты сборки и что для рантайм-API есть полифилл, а не только
транспиляция синтаксиса.
- Не проверяй адаптив ресайзом окна на одном брейкпоинте — пройди ВСЕ
брейкпоинты и границы между ними (где ломается чаще всего).
- Не полагайся на
:hover как единственный способ показать контент — на тач-
устройствах hover не срабатывает.
- Формулируй статус явно: «не поддерживается в браузере X» / «поддерживается,
но без фолбэка деградирует» / «работает во всей матрице».
МЕТОДОЛОГИЯ: ТРИ НЕЗАВИСИМЫХ СРЕЗА (в границах SCOPE)
СРЕЗ 1 — Инструментальный / статический анализ поддержки
- Прогони
npx browserslist — зафиксируй целевые браузеры.
- Если есть —
eslint-plugin-compat / stylelint с проверкой поддержки,
browserslist-lint, отчёт Autoprefixer. Цель — автоматически выявить
использование фич вне таргетов.
grep/анализ по SCOPE на нетривиальные CSS-свойства и JS-API (см. блок 3–4
чек-листа) и сверка их поддержки с целевой матрицей по caniuse-данным.
- Проверь конфиг сборки: таргеты Babel/
browserslist, наличие полифиллов
(core-js/@babel/preset-env с useBuiltIns), Autoprefixer в PostCSS.
СРЕЗ 2 — Ручной построчный разбор кода
Пройди файлы SCOPE построчно по чек-листу. Для каждой находки — file:line,
затронутый браузер/устройство, сценарий.
СРЕЗ 3 — ЖИВОЙ прогон в браузере (обязателен)
Реально подними приложение (штатная dev-команда из package.json/README или
указанный стенд) и через Claude Browser MCP проверь ключевые экраны:
- Брейкпоинты: эмулируй mobile / tablet / desktop (resize вьюпорта) и
границы между ними — проверь вёрстку, overflow, обрезку, наезд, читаемость,
работоспособность меню/навигации (гамбургер), таблиц (горизонтальный скролл).
- User-agent / мобильная эмуляция: где инструмент позволяет — эмулируй
мобильный UA (тач, отсутствие hover), проверь touch-взаимодействия и размеры
таргетов; проверь ориентацию portrait/landscape.
- Тёмная/светлая тема: эмулируй
prefers-color-scheme в обе стороны —
контраст, читаемость, отсутствие «белых вспышек».
- Зум: 200% — вёрстка не рассыпается.
- Консоль и сеть: сними ошибки консоли (
read_console_messages) — JS-ошибка
от неподдержанного API проявится тут; проверь, что ассеты/шрифты грузятся.
- ЯВНО зафиксируй ограничение: Claude Browser — это, как правило, движок
Chromium. Реальные Safari (WebKit) и Firefox (Gecko) так не проверить —
эмуляция вьюпорта/UA НЕ заменяет реальный движок. Различия рендеринга WebKit/
Gecko (flex gap, date input,
-webkit- префиксы, backdrop-filter, обработка
100vh на iOS) — выяви анализом кода (СРЕЗ 1–2) и пометь как «требует проверки
на реальном Safari/Firefox», а не выдавай за проверенное.
ЧЕК-ЛИСТ ПО КАТЕГОРИЯМ (применяй релевантные SCOPE)
- Матрица и брейкпоинты. Целевые браузеры/устройства определены (не
«наугад»); есть media queries на все целевые брейкпоинты; нет «мёртвой зоны»
между брейкпоинтами, где вёрстка ломается; используется responsive-подход
(
%/fr/clamp()/min-max), а не фиксированные пиксели под один экран.
- Вёрстка и overflow. Нет горизонтального скролла на мобильном (элемент шире
вьюпорта); длинный текст/URL переносится (
overflow-wrap/word-break);
таблицы и широкие блоки скроллятся внутри контейнера, а не растягивают body;
абсолютно позиционированные элементы не уезжают за экран; 100vh на iOS не
режется адресной строкой (используется 100dvh/svh или JS-фолбэк).
- CSS-фичи и их поддержка. Для каждой нетривиальной фичи проверь поддержку в
целевых браузерах и наличие фолбэка:
:has(), container queries, subgrid,
flex/grid gap (старый Safari <14.1 не поддерживал gap во flex),
aspect-ratio, backdrop-filter, text-wrap: balance/pretty, inset,
логические свойства, @supports-фолбэки, кастомные свойства с fallback,
clamp()/min()/max(), position: sticky (нюансы в Safari), вендорные
префиксы там, где нужны.
- JS-API и полифиллы. Для рантайм-API проверь поддержку и полифилл (не
только транспиляцию):
Intl.* (Segmenter, DisplayNames), structuredClone,
Array.prototype.at/findLast, Object.hasOwn, ResizeObserver/
IntersectionObserver, dialog element, URLPattern, navigator.share,
crypto.randomUUID, top-level await, optional chaining в старых движках,
fetch/AbortController. Есть ли graceful degradation, если API нет.
- Touch vs mouse. Контент/действия, доступные только по
:hover (тултип,
подменю, кнопки в строке при наведении), имеют тач-альтернативу; размеры
тач-таргетов достаточны (≥44×44px рекомендуемо, минимум ~24px) и не впритык;
нет зависимости от mouseover/mouseout без touch/pointer-эквивалента;
pointer-events/touch-action корректны для скролла/жестов;
click-delay/double-tap zoom не мешает (touch-action: manipulation).
- Viewport и ориентация. Есть корректный
<meta name="viewport"> (без
maximum-scale=1/user-scalable=no, блокирующего зум — это ещё и a11y);
layout переживает смену portrait↔landscape; учтён safe-area (вырез/челка) на
мобильных (env(safe-area-inset-*)).
- Формы и нативные контролы. Различия рендеринга и поведения между
браузерами:
<input type="date/time/color/range/number"> (в Safari/Firefox
выглядят и работают иначе, чем в Chrome), <select> (нативная отрисовка
различается), кастомные чекбоксы/радио, placeholder, автозаполнение,
виртуальная клавиатура на мобильном (тип клавиатуры по inputmode/type),
accept/capture у file input на iOS.
- Медиа и форматы. Форматы изображений с фолбэком (
<picture>/srcset:
WebP/AVIF не везде; <source> порядок), видео/аудио кодеки по браузеру
(<source type> + фолбэк), шрифты (font-display, форматы woff2, фолбэк-
стек), иконочные шрифты vs SVG.
- Производительность на слабых мобильных. Тяжёлые анимации/тени/фильтры
(
box-shadow, filter, backdrop-filter) на слабом GPU; размер бандла/
картинок на мобильном канале; отсутствие layout thrashing; ленивая загрузка
тяжёлого контента.
- Тёмная/светлая тема.
prefers-color-scheme поддержан; нет захардкоженных
цветов, ломающих тему; отсутствие «вспышки» неправильной темы при загрузке;
контраст сохраняется в обеих темах.
- Зум и масштаб текста. 200% зум и увеличенный системный размер шрифта не
ломают вёрстку (единицы
rem/em, а не жёсткие px под текст); ничего не
обрезается.
EDGE CASES, КОТОРЫЕ ЧАСТО ПРОПУСКАЮТ
gap во flex-контейнере — не работает в Safari < 14.1, элементы слипаются.
100vh на iOS Safari включает адресную строку → нижняя часть контента
обрезана; нужен 100dvh/-webkit-fill-available/JS.
:hover-меню/тултип полностью недоступны на тач — функционал теряется на
мобильных.
<input type="date"> отрисован кастомно под Chrome, а в Safari/Firefox
выглядит иначе или показывает нативный пикер — «дизайн уехал».
position: sticky внутри контейнера с overflow ведёт себя по-разному в
Safari.
- Autoprefixer не добавляет префикс, потому что фича вне browserslist-таргетов —
а реальная аудитория шире таргетов.
- WebP/AVIF без
<picture>-фолбэка → на старом Safari пустой квадрат.
backdrop-filter без -webkit- префикса не работает в Safari; без фолбэка
фон нечитаем.
- «Мёртвая зона» между брейкпоинтами (например 768–900px) — сверстано под 375 и
1440, посередине наезжает.
- Горизонтальный скролл всего body из-за одного элемента с
width: 100vw +
padding (не учтён скроллбар) или min-width у грид-элемента.
user-scalable=no в viewport — ломает зум (доступность) и иногда сам layout.
- Виртуальная клавиатура на мобильном перекрывает поле ввода/кнопку сабмита
(нет прокрутки к активному полю).
- Тёмная тема: иконка/логотип-PNG на прозрачном фоне становится невидимым.
- Ошибка JS от неподдержанного API (
structuredClone, Array.at) валит весь
экран только в старом браузере — в свежем Chrome не воспроизводится.
date/number input: формат ввода и парсинг зависят от локали ОС и браузера.
ШКАЛА SEVERITY
Для каждой находки указывай конкретный браузер/устройство/брейкпоинт.
- Critical — функциональность недоступна на целевом браузере/устройстве
(JS-ошибка валит экран в Safari; кнопка сабмита недостижима на мобильном;
контент полностью обрезан).
- High — серьёзная поломка UX на целевой конфигурации: сломанная вёрстка/
наезд на ключевом экране, горизонтальный скролл, недоступный по тачу основной
сценарий, критичная фича без фолбэка в целевом браузере.
- Medium — заметная, но не блокирующая проблема: косметическое расхождение
рендеринга, неоптимальный контрол на второстепенном пути, проблема на
граничном брейкпоинте.
- Low — best practice/минорное расхождение без сценария поломки в целевой
матрице (нет фолбэка для браузера вне таргетов).
Вердикт: совместимо со всей целевой матрицей / совместимо с оговорками / не
совместимо (перечисли блокеры и на каких браузерах/устройствах).
ФОРМАТ ОТЧЁТА
- Executive summary (без жаргона): работает ли интерфейс на целевых
браузерах и устройствах, где ломается, что чинить первым.
- SCOPE и матрица — проверенные файлы/экраны, целевая матрица браузеров/
устройств/брейкпоинтов, что осталось за периметром.
- Вердикт одной фразой в начале.
- Матрица покрытия — что проверено живым прогоном (какие вьюпорты/UA/темы),
что только статическим анализом, и ЯВНО: что НЕ проверено на реальном движке
(Safari/WebKit, Firefox/Gecko, реальные устройства) — это ограничение
эмуляции, а не пропуск.
- Список находок: ID, file:line (и/или URL+элемент), браузер/устройство/
брейкпоинт, сценарий, severity, рекомендация; где уместно — краткое описание/
скриншот из живого прогона.
- Что сделано хорошо — сильные паттерны адаптива/фолбэков для тиражирования.
- План действий: блокеры vs. отложенное; отдельно — что требует ручной
проверки на реальном Safari/Firefox/устройстве (BrowserStack/реальный девайс),
раз эмуляция это не покрывает.
- Что не проверено — ограничения (нет реального WebKit/Gecko, нет реальных
устройств, не все брейкпоинты, headless).
ПРАВИЛА ОФОРМЛЕНИЯ НАХОДОК
Перед началом проверь, нет ли отчёта по этому периметру в docs/qa/cross-browser/
— если есть, продолжи нумерацию ID и обнови статусы, а не пересоздавай.
Для каждой находки:
- Стабильный ID:
XBROWSER-<scope-slug>-001.
- file:line (и/или URL + элемент/селектор).
- Конкретный браузер/устройство/брейкпоинт и сценарий: «на iOS Safari нижняя
панель обрезается из-за
height: 100vh (line 42)» — не абстрактно.
- Severity с обоснованием (где и что ломается).
- Конкретная рекомендация («заменить
100vh на 100dvh с фолбэком»,
«добавить <picture> с JPEG-фолбэком для WebP», «добавить тач-альтернативу
hover-меню», «добавить -webkit- префикс к backdrop-filter»).
Сохрани отчёт в docs/qa/cross-browser/<scope-slug>.md (следуй существующей
структуре репозитория; docs/qa/... — дефолт).
ЗАПУСК (практическая инструкция)
- САМ в основном потоке определи SCOPE и целевую матрицу (раздел «Входные
данные») — не делегируй, субагент не видит контекст диалога. Определи стек,
таргеты сборки, как поднять приложение, URL экранов.
- Проверь, нет ли предыдущего отчёта в
docs/qa/cross-browser/.
- Прогони СРЕЗ 1 (
npx browserslist, compat-линтеры, grep на нетривиальные
фичи + сверка с caniuse-логикой, проверка полифилл-стратегии сборки).
- Проведи СРЕЗ 2 (построчный разбор по чек-листу) и СРЕЗ 3 (живой прогон:
эмуляция брейкпоинтов, мобильного UA, тёмной темы, зума, снятие ошибок
консоли). Явно отдели проверенное эмуляцией от того, что требует реального
Safari/Firefox/устройства. Если экранов много и доступен Agent tool — раздели
по экранам/брейкпоинтам между субагентами; каждому передай конкретные
URL/пути, целевую матрицу, чек-лист, шкалу severity, формат находки (субагент
не видит этот файл). Пиши подтверждённые находки в промежуточный файл.
- Сведи три среза в отчёт, сохрани в
docs/qa/cross-browser/<scope-slug>.md.
- Явно перечисли, что не проверено (особенно реальные движки/устройства).
Это тестирование, а не имплементация: правки вносит разработчик по итогам
отчёта, не ты в рамках этого скилла.
1---2name: ru-243description: Проверка кросс-браузерной и адаптивной (responsive) совместимости веб-интерфейса — периметр из фичи/экрана/директории/ветки, документа-требований или issue в трекере; проверка по матрице браузеров/устройств и брейкпоинтам (mobile/tablet/desktop) с обязательным живым прогоном в браузере через эмуляцию разных вьюпортов и user-agent, анализ поддержки используемых CSS-фич и JS-API (caniuse-логика), touch vs mouse, нативных контролов, тёмной темы и зума. Каждая находка привязана к конкретному браузеру/устройству/брейкпоинту, file:line и сценарию, с явным вердиктом совместимости. Используй когда просят проверить работу в разных браузерах, провести кросс-браузерное тестирование, оценить работу в Safari/Firefox/Edge, проверить адаптивность/мобильную вёрстку/responsive, разобраться почему ломается на мобильном или планшете — даже без слова "тестирование", например "заработает ли это в сафари", "не поедет ли вёрстка на телефоне", "поддерживается ли этот CSS везде", "нормально ли на планшете", "почему на iOS кнопка не н4---5# Кросс-браузерная и адаптивная совместимость (cross-browser / responsive)67Ты аудитор совместимости. Твоя задача — найти всё, что заставит интерфейс8выглядеть или работать по-разному (или сломанно) в разных браузерах, на разных9устройствах и при разных размерах экрана: неподдерживаемые CSS-фичи и JS-API,10поломки вёрстки на брейкпоинтах, различия нативных контролов, проблемы touch vs11mouse. Дисциплина — evidence over assertion: каждая находка привязана к12КОНКРЕТНОМУ браузеру/устройству/брейкпоинту, file:line и сценарию. Обязателен13ЖИВОЙ прогон: реально подними приложение и через Claude Browser MCP проверь его14на разных вьюпортах (и, где возможно, user-agent), а не только читай CSS.1516Скилл проект-агностичен. Сначала определи стек (CSS-препроцессор/Tailwind/17CSS-in-JS/UI-фреймворк, сборщик и его таргеты, наличие Autoprefixer/PostCSS/18Babel/polyfill-стратегии) и как поднять приложение. Если объём большой и доступен19Agent tool — раздели по экранам/брейкпоинтам между субагентами (см. «Запуск»).2021## ВХОДНЫЕ ДАННЫЕ / SCOPE (как определить периметр)2223Периметр: `$ARGUMENTS`. Определи режим входа и построй SCOPE. Периметр шире24буквального входа: включай общие компоненты/лейаут/глобальные стили, которые25использует проверяемый экран, — поломка в общем компоненте видна на всех26страницах.2728**A. КОД: фича / экран / директория / ветка / diff / весь фронтенд.** Периметр =29содержимое директории (или `git diff --stat` относительно базовой ветки) +30общие стили/лейаут/компоненты, которые она использует + URL экранов для живого31прогона.3233**B. ДОКУМЕНТ: требования / ТЗ / дизайн-спека (.md/.txt/.docx).** Прочитай34целиком. Извлеки: целевую матрицу браузеров/устройств, брейкпоинты, требования к35мобильной версии/адаптиву, поддержку тёмной темы. Сопоставь с кодом — требование36«поддержка Safari 15», а в коде используется `:has()`/container queries без37фолбэка — находка.3839**C. ISSUE в трекере (Jira/YouTrack/GitHub/Linear: ID или ссылка).** Получи40текст issue через доступную интеграцию (MCP-инструмент, если подключён; иначе41запроси у пользователя). Найди связанные коммиты (`git log --all --grep=<ID>42--oneline`, `git show --stat`), построй список затронутых экранов.4344Если периметр неоднозначен — уточни у автора, не проверяй наугад весь фронтенд.45Зафиксируй итоговый SCOPE (файлы, экраны/URL, целевая матрица) в начале отчёта.4647### Определи целевую МАТРИЦУ браузеров/устройств48Не проверяй наугад «все браузеры». Определи реальную цель проекта:49- **browserslist** (в package.json/`.browserslistrc`) — первоисточник целевых50 браузеров; `npx browserslist` покажет разрешённый список.51- Аналитика/README/требования — если указана доля аудитории по браузерам/52 устройствам.53- Если ничего нет — **дефолтная матрица**: свежие Chrome, Firefox, Safari, Edge54 (desktop) + мобильные Safari (iOS) и Chrome (Android). Подтверди у пользователя.55- Определи целевые **брейкпоинты** из CSS проекта (media queries / конфиг56 Tailwind), а не выдумывай; дефолт для эмуляции: mobile ~375×812, tablet57 ~768×1024, desktop ~1440.5859## КЛЮЧЕВОЙ ПРИНЦИП: «работает у меня в Chrome» ≠ «работает везде»60Проверяй адверсариально:611. Не считай CSS/JS-фичу безопасной по памяти — сверься с реальной поддержкой в62 целевых браузерах (caniuse-логика) для КАЖДОЙ нетривиальной фичи, особенно63 свежих (`:has()`, container queries, `subgrid`, flex `gap` в старом Safari,64 `text-wrap: balance`, `backdrop-filter`, `dialog`, `Intl.Segmenter`,65 `structuredClone`, `Array.at`, top-level await).662. Не считай, что Autoprefixer/Babel закрывают всё — проверь, что фича реально67 попадает под таргеты сборки и что для рантайм-API есть полифилл, а не только68 транспиляция синтаксиса.693. Не проверяй адаптив ресайзом окна на одном брейкпоинте — пройди ВСЕ70 брейкпоинты и границы между ними (где ломается чаще всего).714. Не полагайся на `:hover` как единственный способ показать контент — на тач-72 устройствах hover не срабатывает.735. Формулируй статус явно: «не поддерживается в браузере X» / «поддерживается,74 но без фолбэка деградирует» / «работает во всей матрице».7576## МЕТОДОЛОГИЯ: ТРИ НЕЗАВИСИМЫХ СРЕЗА (в границах SCOPE)7778### СРЕЗ 1 — Инструментальный / статический анализ поддержки79- Прогони `npx browserslist` — зафиксируй целевые браузеры.80- Если есть — `eslint-plugin-compat` / `stylelint` с проверкой поддержки,81 `browserslist-lint`, отчёт Autoprefixer. Цель — автоматически выявить82 использование фич вне таргетов.83- `grep`/анализ по SCOPE на нетривиальные CSS-свойства и JS-API (см. блок 3–484 чек-листа) и сверка их поддержки с целевой матрицей по caniuse-данным.85- Проверь конфиг сборки: таргеты Babel/`browserslist`, наличие полифиллов86 (core-js/`@babel/preset-env` с `useBuiltIns`), Autoprefixer в PostCSS.8788### СРЕЗ 2 — Ручной построчный разбор кода89Пройди файлы SCOPE построчно по чек-листу. Для каждой находки — file:line,90затронутый браузер/устройство, сценарий.9192### СРЕЗ 3 — ЖИВОЙ прогон в браузере (обязателен)93Реально подними приложение (штатная dev-команда из package.json/README или94указанный стенд) и через Claude Browser MCP проверь ключевые экраны:95- **Брейкпоинты**: эмулируй mobile / tablet / desktop (resize вьюпорта) и96 границы между ними — проверь вёрстку, overflow, обрезку, наезд, читаемость,97 работоспособность меню/навигации (гамбургер), таблиц (горизонтальный скролл).98- **User-agent / мобильная эмуляция**: где инструмент позволяет — эмулируй99 мобильный UA (тач, отсутствие hover), проверь touch-взаимодействия и размеры100 таргетов; проверь ориентацию portrait/landscape.101- **Тёмная/светлая тема**: эмулируй `prefers-color-scheme` в обе стороны —102 контраст, читаемость, отсутствие «белых вспышек».103- **Зум**: 200% — вёрстка не рассыпается.104- **Консоль и сеть**: сними ошибки консоли (`read_console_messages`) — JS-ошибка105 от неподдержанного API проявится тут; проверь, что ассеты/шрифты грузятся.106- **ЯВНО зафиксируй ограничение**: Claude Browser — это, как правило, движок107 Chromium. Реальные Safari (WebKit) и Firefox (Gecko) так не проверить —108 эмуляция вьюпорта/UA НЕ заменяет реальный движок. Различия рендеринга WebKit/109 Gecko (flex gap, date input, `-webkit-` префиксы, backdrop-filter, обработка110 `100vh` на iOS) — выяви анализом кода (СРЕЗ 1–2) и пометь как «требует проверки111 на реальном Safari/Firefox», а не выдавай за проверенное.112113## ЧЕК-ЛИСТ ПО КАТЕГОРИЯМ (применяй релевантные SCOPE)1141151. **Матрица и брейкпоинты.** Целевые браузеры/устройства определены (не116 «наугад»); есть media queries на все целевые брейкпоинты; нет «мёртвой зоны»117 между брейкпоинтами, где вёрстка ломается; используется responsive-подход118 (`%`/`fr`/`clamp()`/`min-max`), а не фиксированные пиксели под один экран.1192. **Вёрстка и overflow.** Нет горизонтального скролла на мобильном (элемент шире120 вьюпорта); длинный текст/URL переносится (`overflow-wrap`/`word-break`);121 таблицы и широкие блоки скроллятся внутри контейнера, а не растягивают body;122 абсолютно позиционированные элементы не уезжают за экран; `100vh` на iOS не123 режется адресной строкой (используется `100dvh`/`svh` или JS-фолбэк).1243. **CSS-фичи и их поддержка.** Для каждой нетривиальной фичи проверь поддержку в125 целевых браузерах и наличие фолбэка: `:has()`, container queries, `subgrid`,126 flex/grid `gap` (старый Safari <14.1 не поддерживал gap во flex),127 `aspect-ratio`, `backdrop-filter`, `text-wrap: balance/pretty`, `inset`,128 логические свойства, `@supports`-фолбэки, кастомные свойства с fallback,129 `clamp()`/`min()`/`max()`, `position: sticky` (нюансы в Safari), вендорные130 префиксы там, где нужны.1314. **JS-API и полифиллы.** Для рантайм-API проверь поддержку и полифилл (не132 только транспиляцию): `Intl.*` (Segmenter, DisplayNames), `structuredClone`,133 `Array.prototype.at/findLast`, `Object.hasOwn`, `ResizeObserver`/134 `IntersectionObserver`, `dialog` element, `URLPattern`, `navigator.share`,135 `crypto.randomUUID`, top-level await, optional chaining в старых движках,136 `fetch`/`AbortController`. Есть ли graceful degradation, если API нет.1375. **Touch vs mouse.** Контент/действия, доступные только по `:hover` (тултип,138 подменю, кнопки в строке при наведении), имеют тач-альтернативу; размеры139 тач-таргетов достаточны (≥44×44px рекомендуемо, минимум ~24px) и не впритык;140 нет зависимости от `mouseover`/`mouseout` без `touch`/`pointer`-эквивалента;141 `pointer-events`/`touch-action` корректны для скролла/жестов;142 click-delay/double-tap zoom не мешает (`touch-action: manipulation`).1436. **Viewport и ориентация.** Есть корректный `<meta name="viewport">` (без144 `maximum-scale=1`/`user-scalable=no`, блокирующего зум — это ещё и a11y);145 layout переживает смену portrait↔landscape; учтён safe-area (вырез/челка) на146 мобильных (`env(safe-area-inset-*)`).1477. **Формы и нативные контролы.** Различия рендеринга и поведения между148 браузерами: `<input type="date/time/color/range/number">` (в Safari/Firefox149 выглядят и работают иначе, чем в Chrome), `<select>` (нативная отрисовка150 различается), кастомные чекбоксы/радио, `placeholder`, автозаполнение,151 виртуальная клавиатура на мобильном (тип клавиатуры по `inputmode`/`type`),152 `accept`/`capture` у file input на iOS.1538. **Медиа и форматы.** Форматы изображений с фолбэком (`<picture>`/`srcset`:154 WebP/AVIF не везде; `<source>` порядок), видео/аудио кодеки по браузеру155 (`<source type>` + фолбэк), шрифты (`font-display`, форматы woff2, фолбэк-156 стек), иконочные шрифты vs SVG.1579. **Производительность на слабых мобильных.** Тяжёлые анимации/тени/фильтры158 (`box-shadow`, `filter`, `backdrop-filter`) на слабом GPU; размер бандла/159 картинок на мобильном канале; отсутствие layout thrashing; ленивая загрузка160 тяжёлого контента.16110. **Тёмная/светлая тема.** `prefers-color-scheme` поддержан; нет захардкоженных162 цветов, ломающих тему; отсутствие «вспышки» неправильной темы при загрузке;163 контраст сохраняется в обеих темах.16411. **Зум и масштаб текста.** 200% зум и увеличенный системный размер шрифта не165 ломают вёрстку (единицы `rem`/`em`, а не жёсткие `px` под текст); ничего не166 обрезается.167168## EDGE CASES, КОТОРЫЕ ЧАСТО ПРОПУСКАЮТ169- `gap` во flex-контейнере — не работает в Safari < 14.1, элементы слипаются.170- `100vh` на iOS Safari включает адресную строку → нижняя часть контента171 обрезана; нужен `100dvh`/`-webkit-fill-available`/JS.172- `:hover`-меню/тултип полностью недоступны на тач — функционал теряется на173 мобильных.174- `<input type="date">` отрисован кастомно под Chrome, а в Safari/Firefox175 выглядит иначе или показывает нативный пикер — «дизайн уехал».176- `position: sticky` внутри контейнера с `overflow` ведёт себя по-разному в177 Safari.178- Autoprefixer не добавляет префикс, потому что фича вне browserslist-таргетов —179 а реальная аудитория шире таргетов.180- WebP/AVIF без `<picture>`-фолбэка → на старом Safari пустой квадрат.181- `backdrop-filter` без `-webkit-` префикса не работает в Safari; без фолбэка182 фон нечитаем.183- «Мёртвая зона» между брейкпоинтами (например 768–900px) — сверстано под 375 и184 1440, посередине наезжает.185- Горизонтальный скролл всего body из-за одного элемента с `width: 100vw` +186 padding (не учтён скроллбар) или `min-width` у грид-элемента.187- `user-scalable=no` в viewport — ломает зум (доступность) и иногда сам layout.188- Виртуальная клавиатура на мобильном перекрывает поле ввода/кнопку сабмита189 (нет прокрутки к активному полю).190- Тёмная тема: иконка/логотип-PNG на прозрачном фоне становится невидимым.191- Ошибка JS от неподдержанного API (`structuredClone`, `Array.at`) валит весь192 экран только в старом браузере — в свежем Chrome не воспроизводится.193- `date`/`number` input: формат ввода и парсинг зависят от локали ОС и браузера.194195## ШКАЛА SEVERITY196Для каждой находки указывай конкретный браузер/устройство/брейкпоинт.197- **Critical** — функциональность недоступна на целевом браузере/устройстве198 (JS-ошибка валит экран в Safari; кнопка сабмита недостижима на мобильном;199 контент полностью обрезан).200- **High** — серьёзная поломка UX на целевой конфигурации: сломанная вёрстка/201 наезд на ключевом экране, горизонтальный скролл, недоступный по тачу основной202 сценарий, критичная фича без фолбэка в целевом браузере.203- **Medium** — заметная, но не блокирующая проблема: косметическое расхождение204 рендеринга, неоптимальный контрол на второстепенном пути, проблема на205 граничном брейкпоинте.206- **Low** — best practice/минорное расхождение без сценария поломки в целевой207 матрице (нет фолбэка для браузера вне таргетов).208209Вердикт: совместимо со всей целевой матрицей / совместимо с оговорками / не210совместимо (перечисли блокеры и на каких браузерах/устройствах).211212## ФОРМАТ ОТЧЁТА2131. **Executive summary** (без жаргона): работает ли интерфейс на целевых214 браузерах и устройствах, где ломается, что чинить первым.2152. **SCOPE и матрица** — проверенные файлы/экраны, целевая матрица браузеров/216 устройств/брейкпоинтов, что осталось за периметром.2173. **Вердикт одной фразой** в начале.2184. **Матрица покрытия** — что проверено живым прогоном (какие вьюпорты/UA/темы),219 что только статическим анализом, и ЯВНО: что НЕ проверено на реальном движке220 (Safari/WebKit, Firefox/Gecko, реальные устройства) — это ограничение221 эмуляции, а не пропуск.2225. **Список находок**: ID, file:line (и/или URL+элемент), браузер/устройство/223 брейкпоинт, сценарий, severity, рекомендация; где уместно — краткое описание/224 скриншот из живого прогона.2256. **Что сделано хорошо** — сильные паттерны адаптива/фолбэков для тиражирования.2267. **План действий**: блокеры vs. отложенное; отдельно — что требует ручной227 проверки на реальном Safari/Firefox/устройстве (BrowserStack/реальный девайс),228 раз эмуляция это не покрывает.2298. **Что не проверено** — ограничения (нет реального WebKit/Gecko, нет реальных230 устройств, не все брейкпоинты, headless).231232## ПРАВИЛА ОФОРМЛЕНИЯ НАХОДОК233Перед началом проверь, нет ли отчёта по этому периметру в `docs/qa/cross-browser/`234— если есть, продолжи нумерацию ID и обнови статусы, а не пересоздавай.235Для каждой находки:236- Стабильный ID: `XBROWSER-<scope-slug>-001`.237- file:line (и/или URL + элемент/селектор).238- Конкретный браузер/устройство/брейкпоинт и сценарий: «на iOS Safari нижняя239 панель обрезается из-за `height: 100vh` (line 42)» — не абстрактно.240- Severity с обоснованием (где и что ломается).241- Конкретная рекомендация («заменить `100vh` на `100dvh` с фолбэком»,242 «добавить `<picture>` с JPEG-фолбэком для WebP», «добавить тач-альтернативу243 hover-меню», «добавить `-webkit-` префикс к backdrop-filter»).244Сохрани отчёт в `docs/qa/cross-browser/<scope-slug>.md` (следуй существующей245структуре репозитория; `docs/qa/...` — дефолт).246247## ЗАПУСК (практическая инструкция)2481. САМ в основном потоке определи SCOPE и целевую матрицу (раздел «Входные249 данные») — не делегируй, субагент не видит контекст диалога. Определи стек,250 таргеты сборки, как поднять приложение, URL экранов.2512. Проверь, нет ли предыдущего отчёта в `docs/qa/cross-browser/`.2523. Прогони СРЕЗ 1 (`npx browserslist`, compat-линтеры, grep на нетривиальные253 фичи + сверка с caniuse-логикой, проверка полифилл-стратегии сборки).2544. Проведи СРЕЗ 2 (построчный разбор по чек-листу) и СРЕЗ 3 (живой прогон:255 эмуляция брейкпоинтов, мобильного UA, тёмной темы, зума, снятие ошибок256 консоли). Явно отдели проверенное эмуляцией от того, что требует реального257 Safari/Firefox/устройства. Если экранов много и доступен Agent tool — раздели258 по экранам/брейкпоинтам между субагентами; каждому передай конкретные259 URL/пути, целевую матрицу, чек-лист, шкалу severity, формат находки (субагент260 не видит этот файл). Пиши подтверждённые находки в промежуточный файл.2615. Сведи три среза в отчёт, сохрани в `docs/qa/cross-browser/<scope-slug>.md`.2626. Явно перечисли, что не проверено (особенно реальные движки/устройства).263264Это тестирование, а не имплементация: правки вносит разработчик по итогам265отчёта, не ты в рамках этого скилла.