/** * The vendo banner — the real logo at terminal resolution. * * The art is DATA, not drawing code: the Vendo mark (four stepped squares and * the flowing ribbon) and the lowercase wordmark, rasterized from the logo to * half-block cells (`█ ▀ ▄`) at two pixel rows per text row. Colour is one * left-to-right #6c3bff → #a78bfa ramp mapped across the art's COLUMNS, so the * gradient runs through the whole mark instead of restarting on every row; * terminals without truecolor get the ANSI magenta pair. * * Three arrival concepts ship (the CLI plays BANNER_CONCEPT). Whichever plays, * the last frame is the settled frame — a terminal that drops every frame in * between still lands on the finished mark. It plays once and never loops, and * only a TTY with colour ever sees it: the gate is pretty.ts's usePrettyOutput. */ export type BannerColorMode = "truecolor" | "ansi"; export type BannerConcept = "assembly" | "flow" | "shimmer"; /** 12 rows × 72 columns — wordmark beside the mark; fits an 80-column window and costs less than half the scrollback of the large art. */ export declare const BANNER_COMPACT: readonly string[]; /** 25 rows × 44 columns — wordmark stacked under the mark. */ export declare const BANNER_LARGE: readonly string[]; /** The dim line under the banner: what the product is, and where the docs are. */ export declare const BANNER_TAGLINE = " Customize your product with an embedded agent \u2014 docs.vendo.run"; /** The arrival the CLI plays. Decided: the flow. */ export declare const BANNER_CONCEPT: BannerConcept; /** The settled banner — every concept's last frame, and what a run that never animates prints. */ export declare function renderBanner(art: readonly string[], mode: BannerColorMode): string; /** * The arrival, as ANSI frames. LAW: the last frame ALWAYS equals the settled * frame, for every concept — the animation can only ever be a faster way to * arrive at `renderBanner`, never a different picture. */ export declare function bannerFrames(art: readonly string[], mode: BannerColorMode, concept: BannerConcept): string[]; /** Truecolor when the terminal says so; ANSI magenta otherwise. */ export declare function bannerColorMode(env?: Record): BannerColorMode; /** * Play the frames in place: cursor-up over the block and redraw, once. No * alternate screen buffer — the settled banner stays in the scrollback as the * top of the transcript. A resize mid-play costs one ragged frame, then the * settled one. * * `signal` cuts it short, and the settled frame is drawn INSIDE abort() — * synchronously, before abort() returns — so a run that has to end mid-arrival * (an interrupt) leaves the finished mark behind, never a half-drawn one. * Ordinary printing needs no abort: it goes BELOW the art (see `below`). */ export declare function playBanner(write: (chunk: string) => void, frames: readonly string[], frameMs?: number, signal?: AbortSignal, /** SCREEN rows of content the caller has printed BELOW the art since it started. When provided, each frame repaints the art in place above that content (save cursor → up over content+art → paint → restore), so the run keeps talking while the wave still plays. The caller maintains the count and owes screen rows, not lines — a line that wraps is more than one. */ below?: { rows: number; }): Promise;