- api.js в конце: Store.load() восстанавливает access/refresh/user из localStorage
- ?v=11 cache bust
- GET теперь через ?_t= (предыдущий коммит) — без CORS preflight
- Без timeout'а fetch мог висеть вечно (CORS preflight, network)
- rebuild opts на каждый retry (раньше body повторно стрингифаил)
- refresh через try/catch (не должен ломать основной поток)
- v=10 cache bust
- ?v=8 на всех JS (CF cache bypass)
- api(): retry при 502/503/504 и network error
- api(): защита от infinite loop при refresh (флаг _isRefresh)
- App.init: при протухшем токене сразу showWelcome (без showError)
- L.tileLayer 2GIS
- PlacesApi.nearby() в client
- Кнопка 'Показать/Скрыть бары'
- Маркеры баров с эмодзи (🍺🍽️☕🎉)
- Список под картой (карточки)
- Invite to place: отправка предложения в чат
- 2GIS deeplink в сообщении
- vendor/leaflet.js (no more CDN dependency for JS)
- direct tile.openstreetmap.org (was {s}.tile)
- backend GET /api/v1/auth/consents (check if all accepted)
- frontend ConsentApi.status() before showing overlay
- only show overlay once