import { type Interval } from "../timeline/intervals.js"; /** Width budget. The bar-cell count is an input to `coverage`, so these * are rendering math, not cosmetics. Degradation on narrow terminals: * gutter shrinks first (floor 20), then stats (floor 8); the bar never * drops below minBarCells. */ export declare const LAYOUT: { flameGutter: number; occurrenceGutterMax: number; occurrenceGutterShare: number; flameStats: number; minBarCells: number; }; export type WidthSplit = { gutter: number; bar: number; stats: number; }; export declare function splitWidth(view: "timeline" | "occurrences", cols: number): WidthSplit; /** Solid cells for a set of intervals, all block elements of one height * so a bar reads as one shape: █ for a cell the intervals cover by more * than three quarters, ▐ for one they cover mostly on its right (a span * starting partway through), ▌ for one they cover mostly on its left (a * span ending partway through, or a short call), · for none. The half * glyph covers half a cell and the full one all of it, so three quarters * is where each is equally wrong. The shades ░▒▓ sit at other heights * than █ in most fonts. Floor: an interval inside the window too short * for any cell still paints one half glyph, on the side of its cell it * falls in, since losing a 60ms call on a 20-minute axis is worse than * overstating it. A running bar extends to the window end and is capped * with ⋯ so it cannot read as finished. */ export declare class BarComponent { private readonly intervals; private readonly opts; constructor(intervals: Interval[], opts: { running?: boolean; }); computeCells(window: Interval, cells: number): string; } /** Tick labels over the bar area: left / mid / right offsets from the * view start, padded to exactly the bar width. */ export declare class AxisHeader { private readonly gutter; constructor(gutter: number); computeText(window: Interval, viewStart: number, barCells: number): string; } export declare class TimelineHeader { computeText(args: { crumbs: string[]; totalMs: number; zoom?: Interval; viewStart: number; adminShown: boolean; following?: boolean; /** Time the run spent waiting for the person; the header then splits * the elapsed time into working and waiting. */ waitingMs?: number; }): string; } /** Footers render identically across the bar views: one bright line. */ export declare class SelectionFooter { computeText(text: string): string; } /** Offsets and durations in the timeline read `15m59s` past a minute * (fmtDuration's minutes style); `0ms`, not `?`, for zero. */ export declare function fmtOffset(ms: number): string; /** The bottom hint line with the current view's name pinned to the * bottom-right corner — every view (explorer included) renders through * this so "where am I" is always answered in the same place. */ export declare function bottomHints(hints: string, tag: string, cols: number): string; export declare function padCell(text: string, width: number): string; export declare function clipCell(text: string, width: number): string;