/** * The row-cap notice (spec: "Monetization Gates / row cap"). When the free * plan's per-layer row cap truncates a layer, the map still renders — so * WITHOUT this the failure is invisible to the person looking at the map, and * a partial dataset silently reads as a complete one. That invisibility was * the whole reason the gate used to render nothing instead (license.ts's * revised violation-mode note); this node is what makes truncation safe to * prefer over a blank layer. * * Deliberately NOT the badge's twin: * * - Dismissible, and no tamper resistance. The badge is a CONDITION of the * free license, so it fights removal; this is a diagnostic. Hiding it costs * the viewer nothing but their own warning, and the dev/agent channel * (`report`, severity "error") is unaffected either way. * - Dismissal is keyed to the SIGNATURE of what was truncated, not to the * session. Dismiss it and it stays gone for that situation — but a * genuinely different truncation later (another layer, a changed count) is * news, and says so again. * - Top-center, because widgets own the corners. * * `update()` is called on every reconcile and must stay free when nothing * changed — it compares signatures before touching the DOM at all. * * ANNOUNCEMENT is a separate, permanently-mounted, visually-hidden live * region rather than `role="status"` on the visible box. A live region has to * already be in the accessibility tree when its content changes for assistive * tech to announce it — inserting a node that ALREADY carries * `role="status"`/`aria-live` usually announces nothing, and moving the * region's content into a `display:none` box doesn't announce either. So the * region mounts empty at map construction (long before any data loads) and * only ever has its text swapped. The visible box deliberately carries NO * live-region role, or the same message would be announced twice; it stays in * the a11y tree so its dismiss button is still reachable by keyboard and * screen reader. */ import type { TruncatedLayer } from "./license"; export interface QuotaNoticeHandle { /** Called every reconcile with the pass's truncations — no-ops unless they changed. */ update(truncated: readonly TruncatedLayer[]): void; destroy(): void; } export declare function mountQuotaNotice(container: HTMLElement): QuotaNoticeHandle;