Подключил порт-модули лимитов (creativeLimits/urlRule/imageRule/imageMeta)
к CreativeForm.vue: живые счётчики и ошибки длин заголовка/второго
заголовка/текста, живая проверка ссылки, проверка картинки до отправки
(imageError через readImageMeta+checkImage). Текст объявления стал
обязательным (звёздочка в лейбле + блок сабмита пустого текста).
Добавил humanizeCreativeErrors.ts (TDD, тест до кода) — заменяет
технические имена полей (title/title2/text/href/image) в сообщениях 422
от сервера на русские подписи; подключил в CreativeForm через
humanFieldErrors. Баг двоения v-file-input не трогал — отдельная задача.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Три изолированных модуля по TDD (тест до кода) — заголовок/второй
заголовок/текст (creativeLimits.ts), проверка ссылки (urlRule.ts) и
проверка картинки (imageRule.ts + imageMeta.ts). Цифры и сообщения —
порт 1:1 из app/app/Services/Advertising/CreativeValidator.php
(единый источник лимитов Яндекс.Директа). 23 новых теста зелёные.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>