import "./cell_stack.css"; import type * as React from "react"; import { type ReactNode } from "react"; import { useRender } from "@base-ui/react/use-render"; import { type TextSize } from "./text"; import { type TextColor } from "./text_ink"; import { type StyleProps } from "./style_props"; export interface CellStackProps extends StyleProps { /** The subject — what this cell is ABOUT. */ title: ReactNode; /** * The ONE line that qualifies the subject. Omit for a lone value. * * RESERVING the line on a row that has nothing to say is the COLUMN's * (`TableColumn.lines`), never this call's, so an empty or whitespace caption * is no caption. */ caption?: ReactNode; /** * Subject weight. `medium` is itself a channel of demotion between the two * lines, so it decides the caption's rung — see the class doc. */ weight?: "regular" | "medium" | "semibold"; /** * Set when the cell opens with an identity mark the CALLER draws. A mark * separates the pair exactly as `medium` does, so the caption keeps body size * beside one. */ marked?: boolean; /** * The identity mark, drawn HERE — an `Avatar`, a `FileBadge`. Sets `marked` * and owns the gap between the mark and the pair (`--lotics-lead-gap`). The * column still budgets the mark's width (`TableColumn.lead`). */ leading?: ReactNode; /** The subject's rung. The pair takes ONE rung, so the caption follows it. */ size?: TextSize; /** The subject's ink. The caption is always `muted` — it is supporting text. */ color?: TextColor; /** Fixed-width numerals on BOTH lines, so a column of figures lines up. */ align?: "left" | "right" | "center"; /** Clamp each line. A register cell almost always wants 1. */ lines?: number; testID?: string; ref?: React.Ref; render?: useRender.RenderProp; } /** * A SUBJECT over one qualifying line. The rule is `docs/composition.md` §"The * register's own craft"; its three pieces have to agree, and a mismatch is * invisible to a spacing probe because the excess height comes from the LINE * BOX, so no margin or gap appears to explain it. * * **1. The caption's rung is decided by what ELSE separates the pair**, never by * what the line carries. A `medium` subject or a leading mark separates the pair * on its own, so the caption stays at body size — which matters where that line * is the DISAMBIGUATOR. With both lines regular and colour the only thing * between them, the caption drops to `xs` or the two read as peers. * * **2. Both body-rung lines take `leading="tight"`.** The ramp's body rungs * carry PROSE leading. Where the caption is already `xs` it is already tight, so * only the subject carries the prop. A LONE line is deliberately not tightened. * * **3. The stack's `gap` is 0.** Each tight line box contributes 3px above and * below, which is the 6px the pair wants. * * A caption passed as a NODE keeps its own leading and ink — forcing either on * somebody else's subtree would re-space something that is not a line of text. */ export declare function CellStack(props: CellStackProps): React.ReactElement>;