/** * The composer: role="dialog", focus-trapped, anchored near the pin (flipping to * stay in the viewport). Textarea (required, max 2000, live counter), optional * name input, Submit/Cancel, spinner, success/failure states, copy-to-clipboard * on failure, and the branding footer. Esc dismisses the composer but KEEPS the * typed draft (only Cancel discards it); a second Esc (handled by the overlay) * leaves comment mode. Cmd/Ctrl+Enter submits. Focus returns on close. * While the composer is untouched, clicking elsewhere on the page abandons the * pending pin and re-pins at the new spot (see overlay.pick / abandonClean). */ import type { Panel, Pin, Runtime } from "../index"; import type { FeedbackPayload } from "../types"; /** * Human-readable description of what a pin is anchored to, used by the * capture chip: element text → label → selector → percent fallback. */ export declare function chipLabel(anchor: Pin["anchor"]): string; /** The root pin a reply belongs to, or null for top-level pins / gone roots. */ export declare function replyRoot(rt: Runtime, pin: Pin): Pin | null; /** * The body as delivered: replies carry the "Re #N:" linkage prefix in the * payload (the transport has no thread schema of its own). Bodies that already * start with a prefix — legacy restores, or a reviewer typing it — are kept. */ export declare function deliveredBody(rt: Runtime, pin: Pin, body: string): string; /** * Payload for a pin's comment. Shared by the composer's submit and the * drawer's retry-after-reload; `createdAt` preserves the original write time * on retries. */ export declare function buildPayload(rt: Runtime, pin: Pin, body: string, name: string | null, createdAt?: string): FeedbackPayload; export declare function createPanel(rt: Runtime): Panel;