9265f907cc
T19: пункт меню «Рекламный кошелёк» (сайдбар + мобильное «Ещё») ведёт на новый роут /advertising/wallet → AdWalletView.vue — баланс/заморожено/ свободно с короткими подсказками, кнопка «Пополнить», история операций помечена «появится позже» (клиентского эндпоинта списка операций у рекламного кошелька нет — не выдумываю). T20: в AdWalletTopupDialog — чипы-пресеты суммы (1000/3000/5000 + «Своя сумма»), кнопки в v-card-actions переведены на flex-wrap вместо v-spacer (чинит тесноту/обрезание «Закрыть»), на узком экране — столбик; «Оплатить картой» явно выглядит выключенной при невалидной сумме (variant меняется на outlined). T21: обработка ответа topupAdvertisingByCard — если ни confirmation_url, ни ok:true, теперь явная ошибка в диалоге вместо тихого тупика. Редирект и заглушка-успех (ok:true, с обновлением баланса через emit topped-up) — поведение сохранено. AdWalletHeader тоже подписан на topped-up. Живая оплата картой боевым ЮKassa НЕ проверялась (go-live не завершён) — код корректен на все три исхода ответа, но happy-path в бою не пройден. Тесты: 10 файлов advertising-* зелёные (86/86), полный npm run test:vue 222/222 файлов без новых падений (1 pre-existing unhandled rejection в AutopodborManualCompetitorError.spec.ts — не мой). eslint чисто. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>