- форма: после «Отправить» с ошибками фокус уходит на первое поле с aria-invalid, скринридер читает подсказку; method=post — без JS имя и телефон не попадают в URL - scroll-padding-bottom < 768: фокус и якоря не прячутся под липкой CTA (WCAG 2.4.11) - штамп на этикетке сжимается на 320 вместо горизонтального скролла (WCAG 1.4.10); на 390 и шире без изменений - цена читается «32 BYN», «250 г» (sr-only пробелы) - sizes фото hero и «Кто обжаривает» по реальной ширине колонки на 1440; AVIF перед WebP
19 lines
764 B
TypeScript
19 lines
764 B
TypeScript
import path from 'node:path';
|
|
import type { NextConfig } from 'next';
|
|
|
|
const config: NextConfig = {
|
|
output: 'standalone',
|
|
outputFileTracingRoot: path.join(import.meta.dirname, '../..'),
|
|
transpilePackages: ['@kvarta/shared'],
|
|
poweredByHeader: false,
|
|
// AVIF заметно легче WebP на фото зерна (LCP на мобиле); WebP — запасной
|
|
images: { formats: ['image/avif', 'image/webp'] },
|
|
// в проде /api/ отдаёт nginx на контейнер api; локально проксируем на dev-сервер api
|
|
async rewrites() {
|
|
if (process.env.NODE_ENV === 'production') return [];
|
|
return [{ source: '/api/:path*', destination: 'http://127.0.0.1:3001/api/:path*' }];
|
|
},
|
|
};
|
|
|
|
export default config;
|