MAIDR JavaScript API
    Preparing search index...

    Interface TextState

    Text description state containing labels and values for screen reader output.

    interface TextState {
        main: { label: string; value: string | number | string[] | number[] };
        cross?: { label: string; value: string | number | string[] | number[] };
        z?: { label: string; value: string | number | number[] };
        stack?: { label: string; value: number; share?: number };
        interval?: { min?: number; max?: number };
        range?: { min: number; max: number };
        asides?: { label: string; value: string }[];
        section?: string;
        mainAxis?: AxisType;
        crossAxis?: AxisType;
        crossRange?: { min: number; max: number };
        gridPoints?: { x: number; y: number }[];
        gridPosition?: { row: number; col: number };
    }
    Index

    Properties

    main: { label: string; value: string | number | string[] | number[] }

    string[] for the same reason number[] is here: one navigation step can cover several points. A categorical scatter reaches it — in ROW mode the cross value is every x sharing that y, and on a strip plot those x are category names (ScatterPoint.xLabel). TextService already formats arrays as (number | string)[] and joins them, so this widens the type to what the service has always accepted rather than adding a shape it has to learn.

    cross?: { label: string; value: string | number | string[] | number[] }

    Optional, because a chart can have no cross axis to speak of.

    A pure hierarchy is the case that exists: TreemapTrace reads a tree whose nodes declare no magnitude at all -- an org chart -- and every value it could put here would be one the chart does not draw (#1153). TextService already tested for the clause before reading it in the terse and layer-switch paths; the verbose and grid paths now do too, and omit both the label and the value rather than announcing a bare label.

    Absent is not the same as empty. A trace that has a cross axis and no reading at this point sends the axis with a non-finite value, which is announced as "missing" (#925). Omitting the clause says the axis is not there at all.

    z?: { label: string; value: string | number | number[] }

    Third-dimension value for heatmaps, segmented bars, pie slices and 3D scatter. number[] when one navigation step covers several points that each carry their own z (a 3D scatter column or row); TextService formats each entry and joins them, exactly as it already does for an array main/cross.

    stack?: { label: string; value: number; share?: number }

    The running total a stacked point sits inside, alongside the point's own value in cross.

    A stacked area draws two magnitudes at once: a band's height is its series' value, and the band's top edge is the total of every series below it. cross carries the first; without somewhere to put the second, the announcement names a number the chart shows twice over and leaves the reader unable to tell which one they heard. share is that value as a fraction of the total, which is what a stacked chart is read for and what a listener cannot divide out in their head mid-navigation.

    A waterfall step carries it for the same reason under a different name: the bar's height is that step's contribution and its position is the running total the step produced, so cross announces the one and this announces the other. label is what distinguishes them to the reader, which is why it travels with the value rather than being assumed.

    Absent on traces that draw a single magnitude, so nothing else changes shape.

    interval?: { min?: number; max?: number }

    The uncertainty around the value in cross, announced as a clause after it rather than in place of it.

    Deliberately not TextState.range, which is a main-axis extent that replaces the main value — right for a histogram bin ("x is 3 through 5") and wrong here, where the value is a real reading and the interval is a second fact about it. A band on a fitted curve has to be heard alongside "y is 3.2", not instead of it.

    Either bound may be absent: a one-sided interval is a real chart.

    range?: { min: number; max: number }
    asides?: { label: string; value: string }[]

    Facts the point carries that sit on neither axis, announced as their own clauses after everything that does.

    A mosaic is the case this exists for. Its column width is a share of the whole chart and its cell count is a tally, and neither is a value on the main or cross axis -- so neither can travel in a field the text service formats with an axis formatter, or a percent format declared for the cross axis would announce a count of 203 as "20300.0%".

    section cannot carry them either. That field is a short qualifier which gets fused onto the cross-axis label whenever z is present -- and a segmented trace always sets z -- so a share put there read "15.0% of all Proportion is 0.62", saying the proportion was the share.

    The values arrive already formatted, because only the trace knows what they are: a share is a percentage and a tally is an integer, and there is no axis to ask.

    section?: string
    mainAxis?: AxisType

    Original axis identity for main value. For vertical plots: 'x', for horizontal plots: 'y'. Used to apply correct formatter regardless of orientation.

    crossAxis?: AxisType

    Original axis identity for cross value. For vertical plots: 'y', for horizontal plots: 'x'. Used to apply correct formatter regardless of orientation.

    crossRange?: { min: number; max: number }

    Range for the cross axis, used in grid navigation to show both axis ranges.

    gridPoints?: { x: number; y: number }[]

    Points in the current grid cell, listed as coordinate pairs.

    gridPosition?: { row: number; col: number }

    Current grid cell position (1-indexed for display).