diff --git a/docs/ADS.md b/docs/ADS.md index 07f61a9..251f275 100644 --- a/docs/ADS.md +++ b/docs/ADS.md @@ -51,6 +51,57 @@ Tool: **terser** (concat + minify). Triggered by `~/git-save-all.sh` коли so Cache-bust: md5 → `?v=...` у `layout.etlua` (детально у [DEPLOY.md](DEPLOY.md#cache-bust-механізм)). +### Banner partial loader — `tb.load_frame_baner_v2` + +Source: `views/static/js/lib/common/js/tbanner.etlua` (shared lib з кешуючою етлуа-обгорткою) + `tbanner_min.etlua` (minified inline). Підключається у layout.etlua через `<% render("static.js.lib.common.js.tbanner_min") %>`. + +**Сигнатура:** `tb.load_frame_baner_v2(spot_url, dom_target, timeouts, attrs [, callback])` +- `spot_url` — `//a5.g--o.info/api/spots/?p=1` +- `dom_target` — `#selector` куди append iframe +- `timeouts` — `{event_min_timeout, event_max_timeout}` ms +- `attrs` — `{height, width, ...}` iframe attributes / style +- `callback` — викликається після append (для native — інсталяція postMessage listener-у) + +**Lazy-load logic:** +- Чекає user event (`scroll`, `mousemove`, `touchstart`, `resize`, `mouseenter`, `click`) АБО `event_min_timeout` (раніше) +- Якщо tab hidden → відкладає до `visibilitychange` +- `event_max_timeout` — fallback hard limit +- Counter per banner — окрема черга для кожного instance +- iframe attrs default: `sandbox="allow-scripts allow-popups allow-forms allow-same-origin"`, `loading="lazy"`, `class="na"` + +### Native banners — auto-height через postMessage + +Native (`tbn1`, `tbn2`, `tbn3`) — adaptive ads з невідомою висотою. Pattern: + +1. **На стороні ASG** користувач прописує код банера (TrafficStars або ExoClick) + кастом-CSS для responsive grid + кастом-JS який postMessage-ить розмір. +2. **На стороні сервера** ASG обертає у iframe (через `/api/spots/` endpoint). +3. **Frontend** ловить `window.message` event від iframe → парсить JSON `{url, height}` → встановлює `height` attribute на iframe з `transition: all .3s`. + +**Network providers за ASG (приклад інтеграції на adспy admin side):** +- **TrafficStars** — `cdn.tsyndicate.com/sdk/v1/n.js` + `NativeAd({element_id, spot, type: "label-under", cols:4, rows:1, ...})` +- **ExoClick** — `a.magsrv.com/ad-provider.js` + `` + `(AdProvider).push({"serve":{}})` + +Обидва вкладають кастомний `