MAIDR Documentation - v3.73.0
    Preparing search index...

    Virtual (invisible) trace comparing a candlestick chart against a reference line (e.g. a moving average) from the same subplot.

    Like a real candlestick, the user navigates left/right between candles and up/down between the four OHLC fields (value-sorted per candle, matching the candle's visual geometry). Each point exposes the signed delta fieldValue - reference through the standard BTS pipeline:

    • Audio: pitch encodes |delta|; the tone glides up for above-line points and down for below-line points; an exact zero plays a percussive click.
    • Braille: candlestick-style height encoding of |delta| for the current field where below-line points carry the bearish dot-8 marker.
    • Text: "above line" / "below line" / "on line" with the delta magnitude.

    The layer has no SVG geometry of its own, so it never highlights, and it deliberately omits the volatility section a real candlestick exposes.

    Hierarchy (View Summary)

    Index

    Constructors

    Properties

    observers: Observer<TraceState>[]
    isWarning: boolean
    isComputingStateAt: boolean

    True while AbstractTrace.getStateAt computes state at a temporarily moved cursor. Enforces (structurally, not just by documentation) that state getters never notify observers.

    id: string
    type: TraceType
    title: string
    xAxis: string
    yAxis: string
    z: string
    navigationService: NavigationService
    layer: MaidrLayer
    supportsExtrema: true

    Abstract property that subclasses must implement to indicate extrema support

    movable: Movable
    highlightValues: (SVGElement | SVGElement[])[][] | null = null

    Accessors

    • get isInitialEntry(): boolean

      Returns boolean

    • set isInitialEntry(value: boolean): void

      Parameters

      • value: boolean

      Returns void

    • get row(): number

      Returns number

    • set row(value: number): void

      Parameters

      • value: number

      Returns void

    • get col(): number

      Returns number

    • set col(value: number): void

      Parameters

      • value: number

      Returns void

    • get state(): TraceState

      Gets the current state of the trace including audio, braille, text, and highlight information.

      Returns TraceState

      The current TraceState

    • get hasMultiPoints(): boolean

      Returns boolean

    • get traceType(): TraceType

      The trace's chart type. Lightweight alternative to reading state.traceType, which eagerly computes the full audio/braille/text/ highlight state just to expose this one string.

      Returns TraceType

    • get reference(): string

      Human-readable name of the reference line this layer compares against.

      Returns string

    Methods

    • Gets safe row and column indices to prevent accessing undefined values

      Returns { row: number; col: number }

      Object with safe row and column indices

    • Parameters

      • a: number

        Utility function to compare point values for rotor functionality

      • b: number
      • type: "lower" | "higher"

      Returns boolean

      boolean value

    • Moves left in rotor mode, optionally filtering by lower or higher values.

      Parameters

      • Optional_mode: "lower" | "higher"

        Optional mode for filtering (lower or higher)

      Returns boolean

      Error always - subclasses must override this method

    • Moves right in rotor mode, optionally filtering by lower or higher values.

      Parameters

      • Optional_mode: "lower" | "higher"

        Optional mode for filtering (lower or higher)

      Returns boolean

      Error always - subclasses must override this method

    • Returns true if this trace supports compare (lower/higher value) navigation. Override to false for trace types that don't use compare modes (e.g., scatter, which is all we currently have).

      Returns boolean

    • Get all highlight SVG elements for this trace Used by HighlightService for high contrast mode

      Returns SVGElement[]

      Array of all SVG elements, or empty array if none

    • Get all original (visible) SVG elements for this trace. These are the actual rendered elements, not the hidden clones used for highlighting. Used by HighlightService for high contrast mode color changes.

      Returns SVGElement[]

      Array of all original SVG elements, or empty array if none

    • Returns a human-readable label for this trace's chart type (e.g., 'Bar Chart', 'Scatter Plot') for display in the description modal. Falls back to the raw layer type if no mapping is registered.

      Returns string

    • Builds the axes object for the description state, including z only when the layer explicitly provides a z-axis label. Subclasses should call this instead of constructing the axes object inline so charts without a real z dimension don't surface the placeholder default.

      Returns { x?: string; y?: string; z?: string }

    • Returns true if this trace supports intersection navigation mode. Opt-in per trace type: override to return true (possibly conditionally, e.g. based on data shape) for trace types that expose point intersections between series. Intersection navigation is a trace-level capability — it has no meaning at the figure or subplot level, which is why it lives on AbstractTrace rather than AbstractPlot.

      Returns boolean

    • Moves the active point to the pointer location and returns directional guidance toward the nearest data geometry in a single call.

      Combining both operations avoids running findNearestPoint twice per pointermove event — important on dense plots where the scan is the hot path.

      Parameters

      • x: number

        Screen-space x position of the pointer/finger

      • y: number

        Screen-space y position of the pointer/finger

      Returns PointerGuidanceState | null

      Guidance state relative to nearest point, or null when unavailable

    • Moves the trace to the nearest point when the pointer is within its bounds and the trace is not already focused on that point.

      onCurve is intentionally non-optional: the caller has already paid the cost of isPointInBounds to assemble guidance state, and forcing subclasses to accept the value makes the contract explicit so a future override cannot silently recompute (or worse, ignore) it.

      Subclasses override this to customise hover-driven navigation:

      • Box / ViolinBox no-op the move while still surfacing guidance.
      • Scatter switches into column navigation mode before delegating.

      Parameters

      Returns void

    • Checks if the specified coordinates are within bounds of the element.

      Parameters

      • x: number

        The x-coordinate

      • y: number

        The y-coordinate

      • element: NearestPoint

        Object containing the SVG element and its position

        • element: SVGElement
        • row: number
        • col: number
        • centerX: number
        • centerY: number

      Returns boolean

      True if the point is in bounds, false otherwise

    • Cleans up trace resources including values and highlighted SVG elements.

      Only removes elements MAIDR created (hidden clones, synthetic markers); traces that highlight the chart's original live elements in place (e.g. heatmap cells, line dots) merely drop their references so the visible chart geometry survives focusout and live-data rebuilds.

      Returns void

    • Moves the cursor to a candle index without notifying observers. Used on activation to align the delta layer with the candle the user was on while preserving the x position across on/off toggles.

      Parameters

      • index: number

        The candle index to position the cursor at

      Returns void

    • Computes the trace state at an arbitrary position without moving the user's cursor or notifying observers. Used by monitor mode to sonify and announce a newly appended point while the user stays put.

      The state getters read this.row/this.col internally, so the cursor is moved temporarily and always restored in a finally block — this method is the single owner of that pattern.

      Re-entrancy hazard: this is only safe because the entire call chain is synchronous (no await points), so timers (e.g. autoplay ticks) cannot interleave before the finally-restore, and state getters never notify observers. If a getter ever becomes async or triggers notifications, callers could observe the temporary cursor.

      Parameters

      • row: number

        The row of the position to compute state for

      • col: number

        The column of the position to compute state for

      Returns TraceState

      The trace state at the requested position

    • Base implementation of navigation in HIGHER and LOWER modes of ROTOR, default is no-op Needs to be implemented in Line, Bar, Heatmap, Candlestick

      Parameters

      • direction: "left" | "right" | "up" | "down"
      • type: "lower" | "higher"

      Returns boolean

    • Switches to the next OHLC field upward while the rotor is in a compare (above-line / below-line) mode. Without this override the rotor would fall back to the base class's throwing implementation and silently mirror a right move, jumping candles instead of changing field. Mirrors Candlestick.moveUpRotor: delegate to moveOnce, which handles its own boundary tone, and always report success so the rotor adds no competing message.

      Returns boolean

      Always true (boundary handled by moveOnce)

    • Always exposes the "on line" rotor filter unit, completing the fixed above-line / on-line / below-line trichotomy alongside the two compare units. It is intentionally NOT gated on a zero being present: gating on the current field made the unit flicker in and out as the user moved between OHLC fields, and gating on any field would silently hide the category for the (common) real-world case where no candle sits exactly on a moving average. A present-but-empty unit announces "no point on the line", which is the honest, predictable result — mirroring how the above/below compare units are always offered even when empty.

      Returns readonly RotorFilterUnit[]

      The on-line filter unit

    • Jumps to the previous/next candle whose current-field delta is exactly zero (on the reference line), preserving the current field. On-line filtering runs along the candle axis; the rotor service handles up/down (announcing them as unavailable) and dispatches only left/right here.

      Parameters

      • key: string

        The active filter unit key

      • direction: "left" | "right"

        The direction to search

      Returns boolean

      True if a matching candle was found and moved to