feat(ads): client banner rotation, fade UX & live toggle (PR2)
CI / changes (pull_request) Successful in 2s
CI / unit (pull_request) Has been skipped
CI / integration (pull_request) Has been skipped
CI / ui (pull_request) Successful in 50s
CI / gate (pull_request) Successful in 0s
CI / deploy (pull_request) Successful in 58s
CI / changes (pull_request) Successful in 2s
CI / unit (pull_request) Has been skipped
CI / integration (pull_request) Has been skipped
CI / ui (pull_request) Successful in 50s
CI / gate (pull_request) Successful in 0s
CI / deploy (pull_request) Successful in 58s
Consume the server-driven banner block (PR1) in the UI and retire the gate. - banner.ts: createScheduler — a smooth weighted round-robin over campaigns (each appears its weight share per cycle, evenly interleaved) with round-robin over a campaign's messages; the rotator drives fade-in -> hold/scroll -> fade-out -> gap -> fade-in, a lone message stays put, reduce-motion swaps instantly without scroll. - model.ts/codec.ts: Profile.banner (Banner/BannerCampaign/BannerTimings) decoded from the fbs block. - Screen.svelte: drop the compile-time SHOW_AD_BANNER; render AdBanner from app.profile.banner (campaigns + timings + reduceMotion). - AdBanner.svelte: opacity-driven fades + scroll host; the rotator is recreated when the campaigns/timings change (a `banner` notify re-fetch swaps them in place). - app.svelte.ts: on the `notify` `banner` sub-kind, refreshProfile() so the banner shows/hides in place. - tests: scheduler distribution + round-robin, the fade sequence, single-message, reduce-motion, stop(); codec banner decode. UI_DESIGN.md + trackers updated.
This commit is contained in:
@@ -138,6 +138,32 @@ export interface Profile {
|
||||
isGuest: boolean;
|
||||
/** Confine notifications to the in-app stream (no out-of-app platform push). */
|
||||
notificationsInAppOnly: boolean;
|
||||
/** The advertising-banner block, present only for a viewer eligible to see it. */
|
||||
banner?: Banner;
|
||||
}
|
||||
|
||||
/** Banner is the advertising-banner block of an eligible viewer's profile. */
|
||||
export interface Banner {
|
||||
campaigns: BannerCampaign[];
|
||||
timings: BannerTimings;
|
||||
}
|
||||
|
||||
/** BannerCampaign is one campaign in the rotation feed. */
|
||||
export interface BannerCampaign {
|
||||
/** GCD-reduced show weight for the client's smooth weighted round-robin. */
|
||||
weight: number;
|
||||
/** Messages in display order, already resolved to the viewer's bot language. */
|
||||
messages: string[];
|
||||
}
|
||||
|
||||
/** BannerTimings are the global banner display timings (ms, except scrollPxPerSec). */
|
||||
export interface BannerTimings {
|
||||
holdMs: number;
|
||||
edgePauseMs: number;
|
||||
scrollPxPerSec: number;
|
||||
fadeOutMs: number;
|
||||
gapMs: number;
|
||||
fadeInMs: number;
|
||||
}
|
||||
|
||||
/** BlockStatus is the caller's current manual block, fetched after any call reports
|
||||
|
||||
Reference in New Issue
Block a user