# LinearManhattanDisplay

Auto-generated @jbrowse/mobx-state-tree API for the current JBrowse release — see [pluggable elements](https://jbrowse.org/jb2/docs/developer_guide/) for concepts. Provided by the `gwas` plugin. [View source](https://github.com/GMOD/jbrowse-components/blob/main/plugins/gwas/src/LinearManhattanDisplay/stateModelFactory.ts).

The mark display with the LD join: an index SNP each fetch joins r² to,
which follows the top hit until the user pins one, and the menus that colour
the points by it.

The configuration slots for this model are documented on its [config schema page](../../config/linearmanhattandisplay).

Members a composed model contributes are listed here too, so these tables are the whole surface.

## Properties

<!-- prettier-ignore -->
| Member | Description | Defined by |
| --- | --- | --- |
| <span id="property-type">**type**</span><br><code>type: types.literal('LinearManhattanDisplay')</code> |  | LinearManhattanDisplay |
| <span id="property-configuration">**configuration**</span><br><code>configuration: ConfigurationReference(configSchema)</code> |  | LinearManhattanDisplay |
| <span id="property-indexsnp">**indexSnp**</span><br><code>indexSnp: types.maybe(types.string)</code> | The index SNP the LD join reads r² to: a SNP id or a 1-based `chr:bp`. It follows the highest-scoring loaded SNP until the user pins one. | LinearManhattanDisplay |
| <span id="property-indexsnppinned">**indexSnpPinned**</span><br><code>indexSnpPinned: types.stripDefault(types.boolean, false)</code> | True once the user pins an index SNP by right-clicking a point. | LinearManhattanDisplay |
| <span id="property-id">**id**</span><br><code>id: ElementId</code> |  | [BaseDisplay](../basedisplay#property-id) |
| <span id="property-runclustering">**runClustering**</span><br><code>runClustering: types.maybe(types.boolean)</code> | <span data-pagefind-ignore>Transient declarative launch spec, the same idea as `LinearGenomeView`'s `init`: a session or config sets this true and the real clustering RPC runs once automatically, with no dialog, as soon as the display reports itself ready. `setupRunClusteringAutorun` clears it afterwards, so a saved session never re-triggers.</span> | [TreeSidebarMixin](../treesidebarmixin#property-runclustering) |
| <span id="property-clusterregion">**clusterRegion**</span><br><code>clusterRegion: types.maybe(types.string)</code> | <span data-pagefind-ignore>Where that run reads from, as a locstring (whitespace-separated for several). Clustering is region-scoped, so naming the locus lets a session cluster on the signal and then show it against its context. Cleared with `runClustering`, since it is that flag's argument.</span> | [TreeSidebarMixin](../treesidebarmixin#property-clusterregion) |
| <span id="property-sortrowsby">**sortRowsBy**</span><br><code>sortRowsBy: types.maybe(types.frozen&lt;RowSortSpec&gt;())</code> | <span data-pagefind-ignore>Transient declarative launch spec, the same idea as `runClustering`: set `{refName, pos}` to order the rows once by the value each carries at that genomic column — the session-expressible form of the right-click "Sort rows by ... here". `setupRowSortAutorun` applies it once the region containing it has loaded and then clears it, so the resulting order persists but a saved session never re-sorts.</span> | [TreeSidebarMixin](../treesidebarmixin#property-sortrowsby) |

## Volatiles

<!-- prettier-ignore -->
| Member | Description | Defined by |
| --- | --- | --- |
| <span id="volatile-sourcelisting">**sourceListing**</span><br><span class="cell-more"><button type="button" class="cell-more-trigger"><code>sourceListing: undefined as &#124; AdapterRead&lt;RowSourceListing &#124; un…</code></button><dialog class="cell-dialog"><form method="dialog"><button class="cell-dialog-close" aria-label="Close">✕</button></form><pre><code>sourceListing: undefined as&#10;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#124; AdapterRead&lt;RowSourceListing &#124; undefined&gt;&#10;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#124; undefined</code></pre></dialog></span> | <span data-pagefind-ignore>The latest `MarkGetRowSources` answer, stamped with the adapter config it answers.</span> | [LinearMarkDisplay](../linearmarkdisplay#volatile-sourcelisting) |
| <span id="volatile-plotfields">**plotFields**</span><br><code>plotFields: undefined as PlotFields &#124; undefined</code> |  | [LinearMarkDisplay](../linearmarkdisplay#volatile-plotfields) |
| <span id="volatile-plotfieldserror">**plotFieldsError**</span><br><code>plotFieldsError: undefined as unknown</code> |  | [LinearMarkDisplay](../linearmarkdisplay#volatile-plotfieldserror) |
| <span id="volatile-plotdefaultchecked">**plotDefaultChecked**</span><br><code>plotDefaultChecked: false</code> |  | [LinearMarkDisplay](../linearmarkdisplay#volatile-plotdefaultchecked) |
| <span id="volatile-plotfieldspromise">**plotFieldsPromise**</span><br><code>plotFieldsPromise: undefined as Promise&lt;PlotFields&gt; &#124; undefined</code> |  | [LinearMarkDisplay](../linearmarkdisplay#volatile-plotfieldspromise) |
| <span id="volatile-plotscanned">**plotScanned**</span><br><code>plotScanned: [] as Region[]</code> |  | [LinearMarkDisplay](../linearmarkdisplay#volatile-plotscanned) |
| <span id="volatile-detailsrotation">**detailsRotation**</span><br><span class="cell-more"><button type="button" class="cell-more-trigger"><code>detailsRotation: createAbortRotation(self, { statusWindow: self…</code></button><dialog class="cell-dialog"><form method="dialog"><button class="cell-dialog-close" aria-label="Close">✕</button></form><pre><code>detailsRotation: createAbortRotation(self, {&#10;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;statusWindow: self.statusWindow,&#10;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;})</code></pre></dialog></span> |  | [LinearMarkDisplay](../linearmarkdisplay#volatile-detailsrotation) |
| <span id="volatile-plotscanrotation">**plotScanRotation**</span><br><span class="cell-more"><button type="button" class="cell-more-trigger"><code>plotScanRotation: createAbortRotation(self, { statusWindow: sel…</code></button><dialog class="cell-dialog"><form method="dialog"><button class="cell-dialog-close" aria-label="Close">✕</button></form><pre><code>plotScanRotation: createAbortRotation(self, {&#10;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;statusWindow: self.statusWindow,&#10;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;})</code></pre></dialog></span> |  | [LinearMarkDisplay](../linearmarkdisplay#volatile-plotscanrotation) |
| <span id="volatile-coarsetier">**coarseTier**</span><br><code>coarseTier: regionDataMap&lt;P&gt;('coarseTier')</code> | <span data-pagefind-ignore>The coarse payload by `displayedRegionIndex`, over the regions the last read was issued for. Cleared on chromosome navigation.</span> | [CoarseTierMixin](../coarsetiermixin#volatile-coarsetier) |
| <span id="volatile-coarsetierread">**coarseTierRead**</span><br><code>coarseTierRead: undefined as CoarseTierRead &#124; undefined</code> | <span data-pagefind-ignore>What the held payloads were read over — the buffered regions and the read key — so a pan or a zoom inside them re-reads nothing. Undefined until a read lands.</span> | [CoarseTierMixin](../coarsetiermixin#volatile-coarsetierread) |
| <span id="volatile-coarsetierloading">**coarseTierLoading**</span><br><code>coarseTierLoading: false</code> |  | [CoarseTierMixin](../coarsetiermixin#volatile-coarsetierloading) |
| <span id="volatile-unclippedquantile">**unclippedQuantile**</span><br><code>unclippedQuantile: undefined as number &#124; undefined</code> |  | [ScoreScaleMixin](../scorescalemixin#volatile-unclippedquantile) |
| <span id="volatile-dismissedlegendsections">**dismissedLegendSections**</span><br><code>dismissedLegendSections: [] as string[]</code> | <span data-pagefind-ignore>Ids of the scales whose section the reader closed on its own; cleared when the whole legend is shown again. Volatile where `showLegend` is config: which sections a reader collapsed in one sitting is not how the track is configured.</span> | [LegendMixin](../legendmixin#volatile-dismissedlegendsections) |
| <span id="volatile-contextmenuinfo">**contextMenuInfo**</span><br><code>contextMenuInfo: undefined as Info &#124; undefined</code> |  | [ContextMenuMixin](../contextmenumixin#volatile-contextmenuinfo) |
| <span id="volatile-storedhoveredfeature">**storedHoveredFeature**</span><br><code>storedHoveredFeature: undefined as T &#124; undefined</code> |  | [StoredHoverMixin](../storedhovermixin#volatile-storedhoveredfeature) |
| <span id="volatile-hiddengroups">**hiddenGroups**</span><br><code>hiddenGroups: observable.set&lt;string&gt;()</code> | <span data-pagefind-ignore>Group keys the user hid from the stack.</span> | [HiddenGroupsMixin](../hiddengroupsmixin#volatile-hiddengroups) |
| <span id="volatile-error">**error**</span><br><code>error: undefined as unknown</code> |  | [BaseDisplay](../basedisplay#volatile-error) |
| <span id="volatile-statusmessage">**statusMessage**</span><br><code>statusMessage: undefined as string &#124; undefined</code> |  | [BaseDisplay](../basedisplay#volatile-statusmessage) |
| <span id="volatile-statusprogress">**statusProgress**</span><br><code>statusProgress: undefined as number &#124; undefined</code> | <span data-pagefind-ignore>determinate progress fraction [0,1] for the current status, or undefined when the in-flight phase is indeterminate. Set alongside `statusMessage` by `setStatusMessage`; a display that never shows a bar simply leaves it undefined.</span> | [BaseDisplay](../basedisplay#volatile-statusprogress) |
| <span id="volatile-scrolltop">**scrollTop**</span><br><code>scrollTop: 0</code> |  | [TrackHeightMixin](../trackheightmixin#volatile-scrolltop) |
| <span id="volatile-loadedregions">**loadedRegions**</span><br><code>loadedRegions: regionDataMap&lt;LoadedRegion&gt;('loadedRegions')</code> | <span data-pagefind-ignore>The per-region store, keyed by `displayedRegionIndex`: what a fetch asked for (the span), what it was issued under (`fetchInputs`) and what it brought back (`payload`), written as one record by `ctx.commitRegion`.<br><br>A display's own `rpcDataMap` was the payload column of this map held separately, and every hook that existed to keep the two in step — `clearDisplaySpecificData`, a `regionHasData` that answered `rpcDataMap.has(idx)`, a hand-rolled prune — was that separation's cost. A display reads the payload back through `regionPayloads`.</span> | [MultiRegionDisplayMixin](../multiregiondisplaymixin#volatile-loadedregions) |
| <span id="volatile-forceloadtrack">**forceLoadTrack**</span><br><code>forceLoadTrack: false</code> | <span data-pagefind-ignore>The force-load button's track-wide approval. Volatile so it never reaches a saved session; the `forceLoad` config slot is the durable form.</span> | [RegionTooLargeMixin](../regiontoolargemixin#volatile-forceloadtrack) |
| <span id="volatile-byteestimate">**byteEstimate**</span><br><code>byteEstimate: undefined as ByteEstimate &#124; undefined</code> | <span data-pagefind-ignore>The last byte measurement: bytes, the span they were taken at, and whether zooming has been shown not to shrink them. Survives `clearAllRpcData`; dropped on chromosome navigation and on a tier swap.</span> | [RegionTooLargeMixin](../regiontoolargemixin#volatile-byteestimate) |
| <span id="volatile-gatemeasuredviewportkey">**gateMeasuredViewportKey**</span><br><code>gateMeasuredViewportKey: undefined as unknown</code> | <span data-pagefind-ignore>The `gateViewport` key the gate last asked the adapter about, on either axis — the viewport AND the settings it asked under. Separate from `byteEstimate` because a density refusal measures no bytes.</span> | [RegionTooLargeMixin](../regiontoolargemixin#volatile-gatemeasuredviewportkey) |
| <span id="volatile-canvasdrawn">**canvasDrawn**</span><br><code>canvasDrawn: false</code> | <span data-pagefind-ignore>flips true on first paint; read by test selectors to detect render</span> | [RenderLifecycleMixin](../renderlifecyclemixin#volatile-canvasdrawn) |
| <span id="volatile-paintcount">**paintCount**</span><br><code>paintCount: 0</code> | <span data-pagefind-ignore>bumped after every frame the backend painted, so a consumer that reads this display's canvas — the circular view's ring, which copies the strip into a texture — knows when the pixels moved</span> | [RenderLifecycleMixin](../renderlifecyclemixin#volatile-paintcount) |
| <span id="volatile-currentrenderingbackend">**currentRenderingBackend**</span><br><code>currentRenderingBackend: undefined</code> | <span data-pagefind-ignore>current backend reference, updated on context-loss recovery. Typed `unknown` (not generic `B`) on purpose: this mixin is composed by every display via a non-generic factory, so the per-display backend type `B` isn't known here — it's supplied at `attachRenderingBackend<B>` and narrowed with `as B` inside the autoruns. Don't "fix" the cast.</span> | [RenderLifecycleMixin](../renderlifecyclemixin#volatile-currentrenderingbackend) |
| <span id="volatile-rendertick">**renderTick**</span><br><code>renderTick: 0</code> | <span data-pagefind-ignore>counter the render autorun observes; bumped to force a re-render</span> | [RenderLifecycleMixin](../renderlifecyclemixin#volatile-rendertick) |
| <span id="volatile-autorunsinstalled">**autorunsInstalled**</span><br><code>autorunsInstalled: false</code> | <span data-pagefind-ignore>guards attachRenderingBackend so the autorun pair spawns once per instance</span> | [RenderLifecycleMixin](../renderlifecyclemixin#volatile-autorunsinstalled) |
| <span id="volatile-rendererror">**renderError**</span><br><code>renderError: undefined</code> | <span data-pagefind-ignore>the render-backend (GPU/Canvas2D init or context-loss) error, or undefined. Single source of truth for the render-error terminal state: `useRenderingBackend` writes it from the canvas-init mechanism so the model — not React-local hook state — owns every terminal state. Read by `displayPhase` (whose `renderError` term outranks `loading`, suppressing the scrim) and by `DisplayChrome` (shows the retry overlay).</span> | [RenderLifecycleMixin](../renderlifecyclemixin#volatile-rendererror) |
| <span id="volatile-offscreen">**offScreen**</span><br><code>offScreen: false</code> | <span data-pagefind-ignore>the display's canvas has scrolled out of the page, so the render autorun skips pan and zoom redraws, still draws new data, and hands its GPU targets back after every tick. Written by `useRenderingBackend`, which watches the canvas element itself — false everywhere `IntersectionObserver` is absent, which is every unit test and every non-browser host.<br><br>A whole view that scrolls away is already unmounted (`useViewVisibility`) and a minimized track never mounts, so what this covers is the track below the fold of a view that IS mounted: the display list is not windowed, and each of those tracks holds a full-height multisampled target.</span> | [RenderLifecycleMixin](../renderlifecyclemixin#volatile-offscreen) |
| <span id="volatile-activesignal">**activeSignal**</span><br><code>activeSignal: undefined as AbortSignal &#124; undefined</code> | <span data-pagefind-ignore>signal of the in-flight fetch, or undefined when idle</span> | [FetchMixin](../fetchmixin#volatile-activesignal) |
| <span id="volatile-fetchgeneration">**fetchGeneration**</span><br><code>fetchGeneration: 0</code> | <span data-pagefind-ignore>bumps at every fetch end; autoruns read it to re-evaluate, and it doubles as the staleness epoch inside runFetch</span> | [FetchMixin](../fetchmixin#volatile-fetchgeneration) |
| <span id="volatile-reloadcounter">**reloadCounter**</span><br><code>reloadCounter: 0</code> | <span data-pagefind-ignore>Bumped by `reload()` and read unconditionally by the fetch autoruns, so a user retry re-runs the body even where nothing else moved — after an error every other fetch input is unchanged. It is also the half that survives a `reload()` override that forgets to invalidate, which is the dead Retry button `makeRetryContractCheck` reports. Declared here because this is the one mixin every fetch foundation composes, the same argument that put `fetchInert` below; the comparative family carried its own until ADR-105.</span> | [FetchMixin](../fetchmixin#volatile-reloadcounter) |
| <span id="volatile-statuswindow">**statusWindow**</span><br><code>statusWindow: createStatusWindow(writeStatus(self))</code> | <span data-pagefind-ignore>This display's status field, and the only thing that writes it: one throttle window, one slot per concurrent operation, so N parallel per-region fetches thin to one stream between them rather than N and a second operation cannot end the first one's label (ADR-081). Lent whole to `createAbortRotation` by a display that also runs a bare-autorun fetch — see `StatusReporter`.</span> | [FetchMixin](../fetchmixin#volatile-statuswindow) |
| <span id="volatile-fetchcanceled">**fetchCanceled**</span><br><code>fetchCanceled: false</code> | <span data-pagefind-ignore>true after the user explicitly cancels a load (the loading overlay's cancel button → `cancelFetchByUser`). A durable, blocking state — unlike `cancelFetch`, it does not retrigger the fetch autoruns — so the load stays stopped until the user retries (`reload`) or the viewport changes. Any new fetch clears it (`runFetch` resets it at the start).</span> | [FetchMixin](../fetchmixin#volatile-fetchcanceled) |
| <span id="volatile-fetchrotation">**fetchRotation**</span><br><span class="cell-more"><button type="button" class="cell-more-trigger"><code>fetchRotation: createAbortRotation(self, { statusWindow: self.s…</code></button><dialog class="cell-dialog"><form method="dialog"><button class="cell-dialog-close" aria-label="Close">✕</button></form><pre><code>fetchRotation: createAbortRotation(self, {&#10;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;statusWindow: self.statusWindow,&#10;&#160;&#160;&#160;&#160;&#160;&#160;})</code></pre></dialog></span> | <span data-pagefind-ignore>**The latest-wins machine this mixin is a wrapper around**, and not a second one: `createAbortRotation` owns abort rotation, the `isCurrent` guard, the status slot and the supersede-versus-end rule (ADR-080, ADR-081), for every fetch in the codebase that has one. `runFetch` adds the observable bookkeeping a display needs on top — `isLoading`, `error`, `fetchGeneration`, `fetchCanceled` — and nothing else.<br><br>It was two implementations of that machine until 2026-08-20, which is how they came to disagree about whether a completed fetch releases its signal. A display's *primary* fetch is this wrapper; a second concurrent fetch on the same node holds a rotation of its own, which is why the primitive is the thing that exists and this is the thing built on it (ADR-054 §1, the one section ADR-105 keeps).<br><br>It is lent this display's `statusWindow`, so the fetch takes a slot on the one field rather than opening a second window over it — the whole point of `StatusReporter`.</span> | [FetchMixin](../fetchmixin#volatile-fetchrotation) |
| <span id="volatile-hoveredtreenode">**hoveredTreeNode**</span><br><code>hoveredTreeNode: undefined as HoveredTreeNode &#124; undefined</code> |  | [TreeSidebarMixin](../treesidebarmixin#volatile-hoveredtreenode) |
| <span id="volatile-treecanvas">**treeCanvas**</span><br><code>treeCanvas: null as HTMLCanvasElement &#124; null</code> |  | [TreeSidebarMixin](../treesidebarmixin#volatile-treecanvas) |
| <span id="volatile-mouseovercanvas">**mouseoverCanvas**</span><br><code>mouseoverCanvas: null as HTMLCanvasElement &#124; null</code> |  | [TreeSidebarMixin](../treesidebarmixin#volatile-mouseovercanvas) |

## Getters

<!-- prettier-ignore -->
| Member | Description | Defined by |
| --- | --- | --- |
| <span id="getter-gateenabled">**gateEnabled**</span><br><code>boolean</code> | No byte gate: a Manhattan plot's case is a genome-wide view of summary statistics, which a region budget would refuse. | LinearManhattanDisplay |
| <span id="getter-ldadapterconfig">**ldAdapterConfig**</span><br><code>Record&lt;string, unknown&gt; &#124; undefined</code> | The `ldAdapter` on the track's `GWASAdapter`, or undefined for none. Read off the live track, since `self.adapterConfig` is a snapshot, which leaves out a slot at its default. | LinearManhattanDisplay |
| <span id="getter-haslddata">**hasLdData**</span><br><code>boolean</code> |  | LinearManhattanDisplay |
| <span id="getter-joinsld">**joinsLd**</span><br><code>boolean</code> | Whether a fetch joins r² to the index: a mark's encoding names `ld` or `ld_role`, and the adapter has an LD file to read them from. Without one, a mark reads `ld` off the features like any other field. | LinearManhattanDisplay |
| <span id="getter-sharedsteps">**sharedSteps**</span><br><code>UnionNode&lt;…&gt;[]</code> | The steps every mark runs before its own: the display's, then the facet's. | LinearManhattanDisplay |
| <span id="getter-ldcolorable">**ldColorable**</span><br><code>boolean</code> | Whether "Color by LD to index SNP" has a point mark to colour. | LinearManhattanDisplay |
| <span id="getter-ldmarkindexes">**ldMarkIndexes**</span><br><code>number[]</code> | The marks drawing at this zoom that name an LD field and plot each SNP's own `y` at its own position, whose points the top hit reads. | LinearManhattanDisplay |
| <span id="getter-topsnp">**topSnp**</span><br><code>string &#124; undefined</code> | The highest-scoring loaded SNP of the LD marks as a 1-based `chr:bp`, the index the join follows while none is pinned.<br><br>A tie goes to the lowest region index, then the lowest position, never to arrival order or to the mark a SNP is drawn in. Ties at the top are routine — `negLog10` clamps every underflowed p of 0 to the same ~323.3 — and adopting the index refetches and moves it into the index mark, so a tie broken either way would flip between the tied SNPs and never paint (`ldAutoIndex.test.ts`). | LinearManhattanDisplay |
| <span id="getter-adapteroptions">**adapterOptions**</span><br><code>{ ld: string; } &#124; undefined</code> | The index the fetch joins r² to, a fetch input, so adopting or pinning one refetches. None before the first load names a top hit. | LinearManhattanDisplay |
| <span id="getter-datasuperseded">**dataSuperseded**</span><br><code>boolean</code> | The loaded data was joined under an index other than the top hit, so adopting it will clear the data and refetch: `MultiRegionDisplayMixin`'s supersession hook, and the auto-pick's trigger. | LinearManhattanDisplay |
| <span id="getter-conf">**conf**</span><br><span class="cell-more"><button type="button" class="cell-more-trigger"><code>ConfigNodeProps&lt;…&gt; &amp; ConfigNodeActions &amp; ConfigNodeBrand&lt;Config…</code></button><dialog class="cell-dialog"><form method="dialog"><button class="cell-dialog-close" aria-label="Close">✕</button></form><pre><code>ConfigNodeProps&lt;…&gt; &amp; ConfigNodeActions &amp; ConfigNodeBrand&lt;ConfigurationSchemaType&lt;…&gt;&gt;</code></pre></dialog></span> | <span data-pagefind-ignore>the config typed off the concrete schema</span> | [LinearMarkDisplay](../linearmarkdisplay#getter-conf) |
| <span id="getter-prefersoffset">**prefersOffset**</span><br><code>boolean</code> | <span data-pagefind-ignore>the track label sits above the plot so the y-axis stays on the edge</span> | [LinearMarkDisplay](../linearmarkdisplay#getter-prefersoffset) |
| <span id="getter-marktypes">**markTypes**</span><br><code>("bar" &#124; "line" &#124; "link" &#124; "point" &#124; "rule" &#124; "span" &#124; "text")[]</code> | <span data-pagefind-ignore>The declared marks' types, in draw order.</span> | [LinearMarkDisplay](../linearmarkdisplay#getter-marktypes) |
| <span id="getter-facet">**facet**</span><br><code>FacetSetting &#124; undefined</code> | <span data-pagefind-ignore>The `facet` object as written, or undefined while unfaceted.</span> | [LinearMarkDisplay](../linearmarkdisplay#getter-facet) |
| <span id="getter-groupkeyspace">**groupKeySpace**</span><br><code>string</code> | <span data-pagefind-ignore>`HiddenGroupsMixin`'s hook: a section key means nothing outside the facet that issued it, so moving the field drops what was hidden.</span> | [LinearMarkDisplay](../linearmarkdisplay#getter-groupkeyspace) |
| <span id="getter-markentries">**markEntries**</span><br><code>MarkEntry[]</code> | <span data-pagefind-ignore>Each mark's type and zoom range, what the mark list is built from.</span> | [LinearMarkDisplay](../linearmarkdisplay#getter-markentries) |
| <span id="getter-textmarkentries">**textMarkEntries**</span><br><code>TextMarkEntry[]</code> | <span data-pagefind-ignore>Each mark as the text layer places it: the entry with whether it names a `y` and whether its colour is written, a constant or a scale. Its own getter so a slot only a label reads never remakes the mark list.</span> | [LinearMarkDisplay](../linearmarkdisplay#getter-textmarkentries) |
| <span id="getter-markview">**markView**</span><br><code>MarkView</code> | <span data-pagefind-ignore>The marks at the view's zoom: whether each draws, inside its `minBpPerPx`..`maxBpPerPx` range where 0 is no bound, and the first drawing mark the density sidecar stands in for, -1 where none does.</span> | [LinearMarkDisplay](../linearmarkdisplay#getter-markview) |
| <span id="getter-densitymarkindex">**densityMarkIndex**</span><br><code>number</code> | <span data-pagefind-ignore>The mark the density sidecar stands in for, or -1.</span> | [LinearMarkDisplay](../linearmarkdisplay#getter-densitymarkindex) |
| <span id="getter-marksizes">**markSizes**</span><br><code>number[]</code> | <span data-pagefind-ignore>Each mark's `encoding.size` number in px, its type's default where none is written, which a bar or span leaves unread.</span> | [LinearMarkDisplay](../linearmarkdisplay#getter-marksizes) |
| <span id="getter-markrowproportions">**markRowProportions**</span><br><code>number[]</code> | <span data-pagefind-ignore>Each mark's `rowProportion`, which a span alone reads.</span> | [LinearMarkDisplay](../linearmarkdisplay#getter-markrowproportions) |
| <span id="getter-rowproportion">**rowProportion**</span><br><code>number &#124; undefined</code> | <span data-pagefind-ignore>The proportion the Row height dialog shows: the first span's, or undefined where no mark is a span, so the dialog asks for none.</span> | [LinearMarkDisplay](../linearmarkdisplay#getter-rowproportion) |
| <span id="getter-haslinkmark">**hasLinkMark**</span><br><code>boolean</code> | <span data-pagefind-ignore>Whether any mark is a link, whose feet place through the view's regions rather than the block's own range.</span> | [LinearMarkDisplay](../linearmarkdisplay#getter-haslinkmark) |
| <span id="getter-pointsize">**pointSize**</span><br><code>number</code> | <span data-pagefind-ignore>The size the Point size menu shows: the first point mark's, or the default where no mark is a point.</span> | [LinearMarkDisplay](../linearmarkdisplay#getter-pointsize) |
| <span id="getter-encodings">**encodings**</span><br><code>MarkEncoding[]</code> | <span data-pagefind-ignore>The declared marks' encodings, as the worker takes them.</span> | [LinearMarkDisplay](../linearmarkdisplay#getter-encodings) |
| <span id="getter-marksteplists">**markStepLists**</span><br><code>UnionNode&lt;…&gt;[][]</code> | <span data-pagefind-ignore>The steps that run before each mark's encode, in order: the display's, the facet's, then the mark's own.</span> | [LinearMarkDisplay](../linearmarkdisplay#getter-marksteplists) |
| <span id="getter-markchannels">**markChannels**</span><br><code>StepChannels[]</code> | <span data-pagefind-ignore>The channels each mark's steps fill where its encoding leaves them unwritten.</span> | [LinearMarkDisplay](../linearmarkdisplay#getter-markchannels) |
| <span id="getter-markcolors">**markColors**</span><br><code>ColorSource[]</code> | <span data-pagefind-ignore>Where each mark's colour comes from (`markColor.ts`), read from the config alone, so editing a colour recolours the loaded regions rather than fetching them again.</span> | [LinearMarkDisplay](../linearmarkdisplay#getter-markcolors) |
| <span id="getter-facetsteps">**facetSteps**</span><br><code>TransformStep[]</code> | <span data-pagefind-ignore>The facet's own steps as the worker takes them, run over each section before any mark's; with no field to split on they run over the one section there is, after the display's own steps.</span> | [LinearMarkDisplay](../linearmarkdisplay#getter-facetsteps) |
| <span id="getter-layerrequests">**layerRequests**</span><br><code>LayerRequest[]</code> | <span data-pagefind-ignore>The worker request, one layer per mark: its encoding and the lanes its type reads. Every mark is sent, the one outside its zoom range included, so the worker encodes a layer the view will not draw: measured at 280 ns a feature, 28 ms per 100,000, for the excluded half of the default multiscale pair (`encodeFeatures.bench.ts`, the pair table), against a parse in the hundreds of milliseconds. An empty slot for it would make the zoom a fetch input and refetch the pair on every crossing, so there is none (ADR-112). Its `auto` bin resolves at the bound it next draws at, so a zoom outside its range refetches nothing.</span> | [LinearMarkDisplay](../linearmarkdisplay#getter-layerrequests) |
| <span id="getter-origin">**origin**</span><br><code>number</code> |  | [LinearMarkDisplay](../linearmarkdisplay#getter-origin) |
| <span id="getter-minwidthpx">**minWidthPx**</span><br><code>number</code> |  | [LinearMarkDisplay](../linearmarkdisplay#getter-minwidthpx) |
| <span id="getter-configuredfilters">**configuredFilters**</span><br><code>() =&gt; string[]</code> | <span data-pagefind-ignore>the `filter` slot</span> | [LinearMarkDisplay](../linearmarkdisplay#getter-configuredfilters) |
| <span id="getter-basefilters">**baseFilters**</span><br><code>() =&gt; string[]</code> | <span data-pagefind-ignore>What the track's config declares for `filter`, which "Clear all filters" returns to.</span> | [LinearMarkDisplay](../linearmarkdisplay#getter-basefilters) |
| <span id="getter-rowsfield">**rowsField**</span><br><code>string</code> | <span data-pagefind-ignore>`rows.field` as written: the field each value of which takes a row.</span> | [LinearMarkDisplay](../linearmarkdisplay#getter-rowsfield) |
| <span id="getter-drawsrows">**drawsRows**</span><br><code>boolean</code> | <span data-pagefind-ignore>Whether the display draws one row per value: a `rows` field and no `facet`, which draws in its place until bands of rows land.</span> | [LinearMarkDisplay](../linearmarkdisplay#getter-drawsrows) |
| <span id="getter-drawskeyedrows">**drawsKeyedRows**</span><br><code>boolean</code> | <span data-pagefind-ignore>Whether each `row` lane holds a key the row table places: under `rows`, except while the density sidecar stands in, whose bins count every row's features and draw as one band.</span> | [LinearMarkDisplay](../linearmarkdisplay#getter-drawskeyedrows) |
| <span id="getter-splitfield">**splitField**</span><br><code>string &#124; undefined</code> | <span data-pagefind-ignore>The field the worker splits the features on: the facet's, else the rows'. One split serves both, so `rows` sends it as `facet`.</span> | [LinearMarkDisplay](../linearmarkdisplay#getter-splitfield) |
| <span id="getter-rowcolorfields">**rowColorFields**</span><br><code>readonly string[]</code> | <span data-pagefind-ignore>`TreeSidebarMixin`'s hook: none, since a row is a value of the rows field and carries no attribute of its own.</span> | [LinearMarkDisplay](../linearmarkdisplay#getter-rowcolorfields) |
| <span id="getter-coarsetiermode">**coarseTierMode**</span><br><code>CoarseTierMode</code> | <span data-pagefind-ignore>`CoarseTierMixin`'s hook, narrowed: with no mark declaring the sidecar there is nothing to draw the bins as, so the tier neither reads nor stands in and the banner is the answer it always was.</span> | [LinearMarkDisplay](../linearmarkdisplay#getter-coarsetiermode) |
| <span id="getter-densitypayloads">**densityPayloads**</span><br><code>ReadonlyMap&lt;number, MarkRegionData&gt;</code> | <span data-pagefind-ignore>The tier's bins as this display's own payload: the density mark's layer built from the sidecar's intervals, every other mark empty. Keyed off `coarseTier`, which moves once per read.</span> | [LinearMarkDisplay](../linearmarkdisplay#getter-densitypayloads) |
| <span id="getter-featurepayloads">**featurePayloads**</span><br><code>ReadonlyMap&lt;number, MarkRegionData&gt;</code> | <span data-pagefind-ignore>The layers as they came back, keyed by displayedRegionIndex: the foundation's per-region store, or the density tier's bins where the gate refused the features and a mark declared the sidecar. One map, so the domain, the legend, the hover, the highlight and the SVG export read the tier through the paths they already had.</span> | [LinearMarkDisplay](../linearmarkdisplay#getter-featurepayloads) |
| <span id="getter-rowlisting">**rowListing**</span><br><code>RowSourceListing &#124; undefined</code> | <span data-pagefind-ignore>The adapter's row listing where it names the rows drawn: its field is `rows.field`, or the key a `flatten` in the shared steps wrote over its field. Undefined for an adapter that lists none, one that lists another field, and until the current adapter config's listing lands.</span> | [LinearMarkDisplay](../linearmarkdisplay#getter-rowlisting) |
| <span id="getter-adaptersources">**adapterSources**</span><br><code>ListedRowSource[] &#124; undefined</code> | <span data-pagefind-ignore>The sources the adapter lists whatever a region holds, a multi-BigWig's files or a MAF's species, in the adapter's order.</span> | [LinearMarkDisplay](../linearmarkdisplay#getter-adaptersources) |
| <span id="getter-guidetreenewick">**guideTreeNewick**</span><br><code>string &#124; undefined</code> | <span data-pagefind-ignore>`TreeSidebarMixin`'s hook: the guide tree the adapter lists over the rows, a MAF's species tree.</span> | [LinearMarkDisplay](../linearmarkdisplay#getter-guidetreenewick) |
| <span id="getter-discoveredrows">**discoveredRows**</span><br><code>RowSource[]</code> | <span data-pagefind-ignore>`TreeSidebarMixin`'s hook: every row the adapter lists over the rows' field, in its order and with its label and colour, so a source with nothing in the loaded regions keeps its row; then the other values the worker split the loaded regions on, in the order the field's sections stack.</span> | [LinearMarkDisplay](../linearmarkdisplay#getter-discoveredrows) |
| <span id="getter-sources">**sources**</span><br><code>RowSource[]</code> | <span data-pagefind-ignore>The rows drawn, top to bottom: the arrangement narrowed to the focus.</span> | [LinearMarkDisplay](../linearmarkdisplay#getter-sources) |
| <span id="getter-rowkeys">**rowKeys**</span><br><code>RowKeys</code> | <span data-pagefind-ignore>The key each value of `rows.field` holds across every loaded region, assigned at the value's first arrival and never moved; a new field is a new key space.</span> | [LinearMarkDisplay](../linearmarkdisplay#getter-rowkeys) |
| <span id="getter-facetlayout">**facetLayout**</span><br><code>FacetLayout</code> | <span data-pagefind-ignore>The sections drawn over every loaded region, in the domain's order and less the hidden ones, and where each key's rows start; under `rows`, one row per value in the rows' order, which no chip names.</span> | [LinearMarkDisplay](../linearmarkdisplay#getter-facetlayout) |
| <span id="getter-rpcdatamap">**rpcDataMap**</span><br><code>ReadonlyMap&lt;number, MarkRegionData&gt;</code> | <span data-pagefind-ignore>The layers the display draws. Under a facet every region's rows are offset onto the one layout, so a chip and the band beside it agree whichever region a span came from; under `rows` every row is a key the row table places, so a reorder or a focus moves no instance. A region is offset or keyed again only when it, the facet's layout or the key space moves, which is what the upload re-packs.</span> | [LinearMarkDisplay](../linearmarkdisplay#getter-rpcdatamap) |
| <span id="getter-rowtable">**rowTable**</span><br><code>RowTable &#124; undefined</code> | <span data-pagefind-ignore>Under `rows`, the table every mark places a key through: its slot in the rows' order, hidden where the focus leaves it out. Rebuilt on a reorder, a focus or a new value, which uploads one small texture and no instance bytes. Undefined wherever the lanes are not keys.</span> | [LinearMarkDisplay](../linearmarkdisplay#getter-rowtable) |
| <span id="getter-drawnkeys">**drawnKeys**</span><br><code>Uint8Array&lt;ArrayBufferLike&gt; &#124; undefined</code> | <span data-pagefind-ignore>1 at each key the row table draws, undefined while every key a loaded region carries is drawn: a focus moves it, a reorder does not.</span> | [LinearMarkDisplay](../linearmarkdisplay#getter-drawnkeys) |
| <span id="getter-scaledatamap">**scaleDataMap**</span><br><code>ReadonlyMap&lt;number, MarkRegionData&gt;</code> | <span data-pagefind-ignore>`rpcDataMap` with each layer's key and extents over the instances the row table draws, its lanes shared: what the legend, the axis and the size scales read, so a row the focus hides leaves them as it leaves the plot.</span> | [LinearMarkDisplay](../linearmarkdisplay#getter-scaledatamap) |
| <span id="getter-marklist">**markList**</span><br><code>DisplayMark[]</code> | <span data-pagefind-ignore>The mark list the marks declare — one `defineMark` per config entry with a shape, reading `layers[markIndex]`, off outside its zoom range. A text mark has no shape and is the text layer's, so the list is shorter than `marks` where one is declared. Recomputed only when the entries move, so the component can key its backend factory on it.</span> | [LinearMarkDisplay](../linearmarkdisplay#getter-marklist) |
| <span id="getter-haspointmark">**hasPointMark**</span><br><code>boolean</code> | <span data-pagefind-ignore>Whether a point mark draws at the view's zoom, for the Point size menu.</span> | [LinearMarkDisplay](../linearmarkdisplay#getter-haspointmark) |
| <span id="getter-drawingmarkindices">**drawingMarkIndices**</span><br><code>number[]</code> | <span data-pagefind-ignore>Every mark drawing at this zoom, in list order: what folds into the y domain and what the plot's inset and row count are read from.</span> | [LinearMarkDisplay](../linearmarkdisplay#getter-drawingmarkindices) |
| <span id="getter-autoscalerange">**autoscaleRange**</span><br><code>[number, number] &#124; undefined</code> | <span data-pagefind-ignore>[min, max] over the `y` of every mark drawing at this zoom, through the autoscale mode `scales.y` names, widened to every rule the scale declares and to the origin whenever a bar mark draws, or undefined before any valued mark loads</span> | [LinearMarkDisplay](../linearmarkdisplay#getter-autoscalerange) |
| <span id="getter-domain">**domain**</span><br><code>[number, number] &#124; undefined</code> |  | [LinearMarkDisplay](../linearmarkdisplay#getter-domain) |
| <span id="getter-valueinsetpx">**valueInsetPx**</span><br><code>number</code> | <span data-pagefind-ignore>The px the y scale stands in from both ends of its band, one number for the axis and every mark: room for the largest glyph or half the thickest rule where only those draw, and none beside a bar, whose top edge is its datum and wants the plot box itself. A text mark labels what is drawn and moves nothing.</span> | [LinearMarkDisplay](../linearmarkdisplay#getter-valueinsetpx) |
| <span id="getter-valuescales">**valueScales**</span><br><code>ValueScale[]</code> | <span data-pagefind-ignore>The one y scale the chrome draws the axis from — `scales.y` resolved: its type, its domain autoscaled where it pins nothing, its title as the caption and its rules. Every mark reads the same pair.</span> | [LinearMarkDisplay](../linearmarkdisplay#getter-valuescales) |
| <span id="getter-rowcount">**rowCount**</span><br><code>number</code> | <span data-pagefind-ignore>bands a span stacks into: the facet's rows, one per row drawn under `rows`, or else the highest `row` any loaded layer carries, plus one</span> | [LinearMarkDisplay](../linearmarkdisplay#getter-rowcount) |
| <span id="getter-nrow">**nrow**</span><br><code>number</code> | <span data-pagefind-ignore>`rowCount`, under the name `useRowVirtualScroll`'s shift+wheel resize divides the plot by.</span> | [LinearMarkDisplay](../linearmarkdisplay#getter-nrow) |
| <span id="getter-autorowheight">**autoRowHeight**</span><br><code>number</code> | <span data-pagefind-ignore>`RowHeightMixin`'s hook: the plot split between the rows.</span> | [LinearMarkDisplay](../linearmarkdisplay#getter-autorowheight) |
| <span id="getter-rowsheaderheight">**rowsHeaderHeight**</span><br><code>number</code> | <span data-pagefind-ignore>`TreeSidebarMixin`'s hook: the plot's top inset.</span> | [LinearMarkDisplay](../linearmarkdisplay#getter-rowsheaderheight) |
| <span id="getter-plotbox">**plotBox**</span><br><code>{ yTop: number; plotHeight: number; }</code> | <span data-pagefind-ignore>The plot canvas's box: the axis inset, less the focus chip's line at its top, so the canvas starts where the rows do.</span> | [LinearMarkDisplay](../linearmarkdisplay#getter-plotbox) |
| <span id="getter-paintscales">**paintScales**</span><br><code>(MarkColorScale &#124; undefined)[]</code> | <span data-pagefind-ignore>The colour scale each mark paints through where its colour is quantitative: a ramp over the domain the legend already unioned across the regions, its middle stop a value, or a threshold's cuts and the packed colour of each interval. Both ride uniforms, so a pan that widens a domain or an edit that moves a cut uploads no instance bytes and no table.</span> | [LinearMarkDisplay](../linearmarkdisplay#getter-paintscales) |
| <span id="getter-sizescales">**sizeScales**</span><br><code>(LinkSizeScale &#124; undefined)[]</code> | <span data-pagefind-ignore>Each link mark's size scale: its declared ends, the open ones the least and greatest the regions draw, so a value strokes at one width in every region; undefined for a mark whose size names no field. Over the drawn layers, as the colour ramp's domain is, so a hidden section leaves the stroke widths the way it leaves the key.</span> | [LinearMarkDisplay](../linearmarkdisplay#getter-sizescales) |
| <span id="getter-linkregions">**linkRegions**</span><br><code>readonly LinkRegion[]</code> | <span data-pagefind-ignore>The view's displayed regions as a link's feet place through them (`viewRegionTable`). Empty where no mark is a link, reading nothing per frame.</span> | [LinearMarkDisplay](../linearmarkdisplay#getter-linkregions) |
| <span id="getter-renderstate">**renderState**</span><br><code>MarkRenderState</code> | <span data-pagefind-ignore>geometry and scale for the plot canvas, the same box the hit test measures in</span> | [LinearMarkDisplay](../linearmarkdisplay#getter-renderstate) |
| <span id="getter-highlightedhit">**highlightedHit**</span><br><code>MarkHitInfo &#124; undefined</code> | <span data-pagefind-ignore>The mark the hover or the open context menu is on, or undefined.</span> | [LinearMarkDisplay](../linearmarkdisplay#getter-highlightedhit) |
| <span id="getter-highlightstyle">**highlightStyle**</span><br><code>HighlightStyle</code> | <span data-pagefind-ignore>A ring around a point or a rule, since a wash over 4 px of ink is invisible and every hue may be the colour scale's; a shade over anything else.</span> | [LinearMarkDisplay](../linearmarkdisplay#getter-highlightstyle) |
| <span id="getter-hoverink">**hoverInk**</span><br><code>HighlightRect[]</code> | <span data-pagefind-ignore>The box the hovered instance painted, for the chrome's highlight; the context menu's hit stands in while a menu is open. In the chrome's px, so the plot's inset is added to the canvas box. A ring wraps the ink a fixed margin out, round a point and along a rule's whole length, and floors at 6 px, so a tiny point stays findable.</span> | [LinearMarkDisplay](../linearmarkdisplay#getter-hoverink) |
| <span id="getter-configproblems">**configProblems**</span><br><code>MarkProblem[]</code> | <span data-pagefind-ignore>What the declared marks say that the display cannot draw as written, reported where a load would once have refused the track.</span> | [LinearMarkDisplay](../linearmarkdisplay#getter-configproblems) |
| <span id="getter-datanotices">**dataNotices**</span><br><code>string[]</code> | <span data-pagefind-ignore>What the adapter said about the loaded regions that the plot cannot show — an index SNP no LD record names — each once, for the corner notice.</span> | [LinearMarkDisplay](../linearmarkdisplay#getter-datanotices) |
| <span id="getter-sharedkeys">**sharedKeys**</span><br><code>SharedKey[]</code> | <span data-pagefind-ignore>The shape keys whose unlisted values collide on one shape, each with the domain Pin distinct shapes writes.</span> | [LinearMarkDisplay](../linearmarkdisplay#getter-sharedkeys) |
| <span id="getter-cornernotices">**cornerNotices**</span><br><code>string[]</code> | <span data-pagefind-ignore>The config problems as lines, `dataNotices`, and the keys whose values collide: what the corner's problems notice lists. The skipped count has a chip of its own.</span> | [LinearMarkDisplay](../linearmarkdisplay#getter-cornernotices) |
| <span id="getter-notices">**notices**</span><br><code>string[]</code> | <span data-pagefind-ignore>`cornerNotices` and a mark whose every loaded feature was skipped, which a mistyped field is, as lines an agent's settle report carries: a display with any of them still draws, so nothing else reaches a caller that cannot see the corner.</span> | [LinearMarkDisplay](../linearmarkdisplay#getter-notices) |
| <span id="getter-densitystandinnotice">**densityStandInNotice**</span><br><code>string &#124; undefined</code> | <span data-pagefind-ignore>The corner notice while the sidecar stands in, naming what is drawn and how many marks are not: past the budget the banner is gone, and nothing else on screen says the bars are the sidecar's.</span> | [LinearMarkDisplay](../linearmarkdisplay#getter-densitystandinnotice) |
| <span id="getter-skippedfeatures">**skippedFeatures**</span><br><code>SkippedFeatures</code> | <span data-pagefind-ignore>What the worker left out of the loaded regions — a feature whose position or `y` read as missing or not a number — for the corner notice, naming the field a binned position came from.</span> | [LinearMarkDisplay](../linearmarkdisplay#getter-skippedfeatures) |
| <span id="getter-legendsections">**legendSections**</span><br><code>MarkLegendSection[]</code> | <span data-pagefind-ignore>the colour keys the loaded regions carry, one per scale the marks drawing at the view's zoom resolve through, each headed with its channel's `title`</span> | [LinearMarkDisplay](../linearmarkdisplay#getter-legendsections) |
| <span id="getter-colorscales">**colorScales**</span><br><code>ColorScale[]</code> | <span data-pagefind-ignore>`LegendMixin`'s hook: the keys as color scales, so the chrome and the export draw the legend off the tables the worker resolved, then the row colour key</span> | [LinearMarkDisplay](../linearmarkdisplay#getter-colorscales) |
| <span id="getter-effectiverowheight">**effectiveRowHeight**</span><br><code>number</code> | <span data-pagefind-ignore>The px each row is drawn in, the band every shape gets: `RowHeightMixin`'s under `rows`, pinned or fit. Elsewhere the bands fit the plot whatever `rowHeight` holds, since a facet's rows and the density sidecar's one band have no scroll to reach past the plot's foot.</span> | [LinearMarkDisplay](../linearmarkdisplay#getter-effectiverowheight) |
| <span id="getter-scrollcontentheight">**scrollContentHeight**</span><br><code>number</code> | <span data-pagefind-ignore>`TrackHeightMixin`'s hook: the rows under `rows`, taller than the plot wherever a pinned `rowHeight` asks for more than it holds.</span> | [LinearMarkDisplay](../linearmarkdisplay#getter-scrollcontentheight) |
| <span id="getter-scrollviewportheight">**scrollViewportHeight**</span><br><code>number</code> | <span data-pagefind-ignore>`TrackHeightMixin`'s hook: the plot the rows scroll behind.</span> | [LinearMarkDisplay](../linearmarkdisplay#getter-scrollviewportheight) |
| <span id="getter-valuemarkindex">**valueMarkIndex**</span><br><code>number</code> | <span data-pagefind-ignore>The first mark drawing at this zoom that stands at a value: what a row's value at a column is read from, and what clustering compares. -1 where none does.</span> | [LinearMarkDisplay](../linearmarkdisplay#getter-valuemarkindex) |
| <span id="getter-hierarchy">**hierarchy**</span><br><code>ClusterHierarchyNode &#124; undefined</code> | <span data-pagefind-ignore>The dendrogram positioned against the rows drawn, or undefined where it no longer names them.</span> | [LinearMarkDisplay](../linearmarkdisplay#getter-hierarchy) |
| <span id="getter-spatialindex">**spatialIndex**</span><br><code>TreeSpatialIndex &#124; undefined</code> |  | [LinearMarkDisplay](../linearmarkdisplay#getter-spatialindex) |
| <span id="getter-svgsidebar">**svgSidebar**</span><br><code>SvgSidebarProps &#124; undefined</code> |  | [LinearMarkDisplay](../linearmarkdisplay#getter-svgsidebar) |
| <span id="getter-plotscanlocus">**plotScanLocus**</span><br><code>string &#124; undefined</code> | <span data-pagefind-ignore>The window the held field scan read, for the dialog to name.</span> | [LinearMarkDisplay](../linearmarkdisplay#getter-plotscanlocus) |
| <span id="getter-coarseadapterslot">**coarseAdapterSlot**</span><br><code>string</code> |  | [DensityTierMixin](../densitytiermixin#getter-coarseadapterslot) |
| <span id="getter-densitytiermode">**densityTierMode**</span><br><code>"auto" &#124; "density" &#124; "features"</code> | <span data-pagefind-ignore>The `densityTier` slot's value.</span> | [DensityTierMixin](../densitytiermixin#getter-densitytiermode) |
| <span id="getter-densitytierthresholdbpperpx">**densityTierThresholdBpPerPx**</span><br><code>number</code> |  | [DensityTierMixin](../densitytiermixin#getter-densitytierthresholdbpperpx) |
| <span id="getter-coarsetierpastthreshold">**coarseTierPastThreshold**</span><br><code>boolean</code> | <span data-pagefind-ignore>`auto` also swaps from the `densityTierBpPerPx` slot outward, where a track asks for the band before the region is too large to fetch.</span> | [DensityTierMixin](../densitytiermixin#getter-coarsetierpastthreshold) |
| <span id="getter-coarsereadkey">**coarseReadKey**</span><br><code>string</code> | <span data-pagefind-ignore>The bins are read at the view's bp/px, so a real zoom re-reads at the level the sidecar keeps for it and a small one reuses what is held.</span> | [DensityTierMixin](../densitytiermixin#getter-coarsereadkey) |
| <span id="getter-coarsetiergated">**coarseTierGated**</span><br><code>boolean</code> | <span data-pagefind-ignore>Overridable hook (default false): the coarse read is a feature download the byte gate has to measure. The gate then measures the coarse adapter while the tier is up, its refusal is the banner, the detail fetch stands down outright since the coarse read is the measurement pass, and the swap is by threshold alone — the verdict is about whichever tier is up, so it cannot also pick the tier. A read bounded by construction (bins per screen pixel) leaves this off.</span> | [CoarseTierMixin](../coarsetiermixin#getter-coarsetiergated) |
| <span id="getter-coarsetierhassomewheretodraw">**coarseTierHasSomewhereToDraw**</span><br><code>boolean</code> | <span data-pagefind-ignore>Overridable hook (default true): the display has somewhere to put the tier. Alignments fills it with `showCoverage`. The measured view is not this hook but the tier's own term below, since every display drawing one needs the geometry the draw is mapped through.</span> | [CoarseTierMixin](../coarsetiermixin#getter-coarsetierhassomewheretodraw) |
| <span id="getter-coarsesourceconfig">**coarseSourceConfig**</span><br><code>unknown</code> | <span data-pagefind-ignore>The coarse source's config, read off the live track config so a re-pointed adapter follows.</span> | [CoarseTierMixin](../coarsetiermixin#getter-coarsesourceconfig) |
| <span id="getter-hascoarsesource">**hasCoarseSource**</span><br><code>boolean</code> |  | [CoarseTierMixin](../coarsetiermixin#getter-hascoarsesource) |
| <span id="getter-coarsetieractive">**coarseTierActive**</span><br><code>boolean</code> | <span data-pagefind-ignore>Whether the coarse tier stands in for the detail right now.</span> | [CoarseTierMixin](../coarsetiermixin#getter-coarsetieractive) |
| <span id="getter-coarsetierstandsin">**coarseTierStandsIn**</span><br><code>boolean</code> | <span data-pagefind-ignore>Whether the tier is standing in for the detail on screen right now: the tier's verdict, a measured view, and the display's own `coarseTierHasSomewhereToDraw`.<br><br>Not a hook any more. It was one, and the three displays that filled it wrote two spellings of the same conjunction between them — which is how alignments came to be the one that never checked the view. A display with a place-to-draw term states that term alone now.</span> | [CoarseTierMixin](../coarsetiermixin#getter-coarsetierstandsin) |
| <span id="getter-gatemeasurescoarse">**gateMeasuresCoarse**</span><br><code>boolean</code> | <span data-pagefind-ignore>The byte gate is measuring the coarse read rather than the detail fetch, so its verdict is about the tier on screen.</span> | [CoarseTierMixin](../coarsetiermixin#getter-gatemeasurescoarse) |
| <span id="getter-bytegateadapterpath">**byteGateAdapterPath**</span><br><code>ByteGateAdapterPath</code> | <span data-pagefind-ignore>`RegionTooLargeMixin`'s hook: measure the adapter of the fetch that is about to run, so the estimate and the budget describe one file.</span> | [CoarseTierMixin](../coarsetiermixin#getter-bytegateadapterpath) |
| <span id="getter-gaterefusesdetail">**gateRefusesDetail**</span><br><code>boolean</code> | <span data-pagefind-ignore>The gate's refusal is about the detail fetch, so that fetch owes the re-measure the gate releases through.</span> | [CoarseTierMixin](../coarsetiermixin#getter-gaterefusesdetail) |
| <span id="getter-coarsetierissuekey">**coarseTierIssueKey**</span><br><span class="cell-more"><button type="button" class="cell-more-trigger"><code>{ adapter: (Record&lt;string, unknown&gt; &amp; { type: string; }) &#124; unde…</code></button><dialog class="cell-dialog"><form method="dialog"><button class="cell-dialog-close" aria-label="Close">✕</button></form><pre><code>{ adapter: (Record&lt;string, unknown&gt; &amp; { type: string; }) &#124; undefined; read: unknown; }</code></pre></dialog></span> | <span data-pagefind-ignore>The whole key a read is held under: the coarse adapter and the display's own term.</span> | [CoarseTierMixin](../coarsetiermixin#getter-coarsetierissuekey) |
| <span id="getter-fetchsuspended">**fetchSuspended**</span><br><code>boolean</code> | <span data-pagefind-ignore>`MultiRegionDisplayMixin`'s hook, from `resolveFetchSuspended` over `coarseTierStandsIn`.</span> | [CoarseTierMixin](../coarsetiermixin#getter-fetchsuspended) |
| <span id="getter-displayphase">**displayPhase**</span><br><code>DisplayPhase</code> | <span data-pagefind-ignore>The foundation's phase with the too-large banner swapped for the tier — see `coarseTierDisplayPhase`.</span> | [CoarseTierMixin](../coarsetiermixin#getter-displayphase) |
| <span id="getter-svgready">**svgReady**</span><br><code>boolean</code> | <span data-pagefind-ignore>The export gate under the same swap — see `coarseTierSvgReady`.</span> | [CoarseTierMixin](../coarsetiermixin#getter-svgready) |
| <span id="getter-drawswhentoolarge">**drawsWhenTooLarge**</span><br><code>boolean</code> | <span data-pagefind-ignore>`renderDisplaySvg`'s hook: the export paints the tier in place of the too-large note, the same swap the chrome makes on screen — unless the note is about the coarse read itself.</span> | [CoarseTierMixin](../coarsetiermixin#getter-drawswhentoolarge) |
| <span id="getter-scaletype">**scaleType**</span><br><code>string</code> |  | [ScoreScaleMixin](../scorescalemixin#getter-scaletype) |
| <span id="getter-scalezero">**scaleZero**</span><br><code>boolean</code> | <span data-pagefind-ignore>`scales.y.zero`: whether an autoscaled linear or symlog axis reaches 0.</span> | [ScoreScaleMixin](../scorescalemixin#getter-scalezero) |
| <span id="getter-domainquantile">**domainQuantile**</span><br><code>number</code> | <span data-pagefind-ignore>`scales.y.domainQuantile`: what an unpinned end follows, 1 the extremes and below it that quantile of each sign.</span> | [ScoreScaleMixin](../scorescalemixin#getter-domainquantile) |
| <span id="getter-clipquantile">**clipQuantile**</span><br><code>number</code> | <span data-pagefind-ignore>The quantile "Clip extreme outliers" fences at: the one an untick this session wrote over, else the scale's own default where that is below 1, else 0.99.</span> | [ScoreScaleMixin](../scorescalemixin#getter-clipquantile) |
| <span id="getter-symlogconstant">**symlogConstant**</span><br><code>number</code> | <span data-pagefind-ignore>Raw slot; `0` means "derive from the domain". Resolve it with `resolveSymlogConstant` once the domain is known.</span> | [ScoreScaleMixin](../scorescalemixin#getter-symlogconstant) |
| <span id="getter-manualminscore">**manualMinScore**</span><br><code>number &#124; undefined</code> | <span data-pagefind-ignore>The lower bound the config pins, `undefined` where it pins none.</span> | [ScoreScaleMixin](../scorescalemixin#getter-manualminscore) |
| <span id="getter-manualmaxscore">**manualMaxScore**</span><br><code>number &#124; undefined</code> | <span data-pagefind-ignore>The upper bound the config pins, `undefined` where it pins none.</span> | [ScoreScaleMixin](../scorescalemixin#getter-manualmaxscore) |
| <span id="getter-valuescalenotices">**valueScaleNotices**</span><br><code>string[]</code> | <span data-pagefind-ignore>What `scales.y`'s ends say together that the axis cannot draw as written, as corner-notice lines, by the rule a colour ramp's ends answer to. The mark display reports them through its rule list.</span> | [ScoreScaleMixin](../scorescalemixin#getter-valuescalenotices) |
| <span id="getter-autoscalegroup">**autoscaleGroup**</span><br><code>string &#124; undefined</code> | <span data-pagefind-ignore>`scales.y.autoscaleGroup`, `undefined` while it names none.</span> | [ScoreScaleMixin](../scorescalemixin#getter-autoscalegroup) |
| <span id="getter-scaletitle">**scaleTitle**</span><br><code>string</code> | <span data-pagefind-ignore>`scales.y.title`, `''` while unset</span> | [ScoreScaleMixin](../scorescalemixin#getter-scaletitle) |
| <span id="getter-grid">**grid**</span><br><code>boolean</code> | <span data-pagefind-ignore>`scales.y.grid`</span> | [ScoreScaleMixin](../scorescalemixin#getter-grid) |
| <span id="getter-minimalticks">**minimalTicks**</span><br><code>boolean</code> | <span data-pagefind-ignore>`scales.y.minimalTicks`</span> | [ScoreScaleMixin](../scorescalemixin#getter-minimalticks) |
| <span id="getter-scorerulesdrawn">**scoreRulesDrawn**</span><br><code>boolean</code> | <span data-pagefind-ignore>Whether this display draws `scales.y.rules`, which is whether the Y axis panel offers Include 0 and the reference lines: a scale it places y through rules a band for them to cross, which a density plot's colour-mapped rows and a colour ramp do not.</span> | [ScoreScaleMixin](../scorescalemixin#getter-scorerulesdrawn) |
| <span id="getter-scorerules">**scoreRules**</span><br><code>ValueScaleRule[]</code> | <span data-pagefind-ignore>`scales.y.rules`, read off the live nodes: a snapshot strips a slot at its default, and a rule at 0 is one.</span> | [ScoreScaleMixin](../scorescalemixin#getter-scorerules) |
| <span id="getter-defaultscoredomain">**defaultScoreDomain**</span><br><code>[number &#124; undefined, number &#124; undefined]</code> | <span data-pagefind-ignore>Overridable hook: what each end of the domain falls back to where the config leaves its bound unset. `[undefined, undefined]` — the default — means autoscale both ends, which is right for a track whose scores have no absolute meaning (a bigwig's units are its own).<br><br>A display whose scores are bounded *by construction* overrides it, so the axis stops being a function of what happens to be on screen: GC content is a fraction, so 0 and 1 are its real limits and mean the same thing at every locus. Autoscaled, the same GC value drew at different heights depending on where the user had panned, and the track could not be read across loci.<br><br>A hook rather than a config default because the answer can depend on the data — the wiggle display reads the bounds its adapter declares, a GC content track's [0, 1] — and rather than each display re-resolving the sentinels, which is the one thing that must not be duplicated: config bounds still win, precisely because they are checked before this is consulted.</span> | [ScoreAxisMixin](../scoreaxismixin#getter-defaultscoredomain) |
| <span id="getter-axisreacheszero">**axisReachesZero**</span><br><code>boolean</code> | <span data-pagefind-ignore>Overridable: whether the autoscaled domain reaches 0, `scaleZero` unless the display maps its score to something with no axis.</span> | [ScoreAxisMixin](../scoreaxismixin#getter-axisreacheszero) |
| <span id="getter-autoscaleddomain">**autoscaledDomain**</span><br><code>[number, number] &#124; undefined</code> | <span data-pagefind-ignore>The domain an autoscaled axis draws: `autoscaleRange`, widened to every range its `autoscaleGroup` holds, nice-rounded inside this display's own bounds. Each member unions the others' own ranges and never their domains, so a pinned end stays the display's that pinned it. `undefined` while this display has nothing of its own to scale.</span> | [ScoreAxisMixin](../scoreaxismixin#getter-autoscaleddomain) |
| <span id="getter-minscorebound">**minScoreBound**</span><br><code>number &#124; undefined</code> | <span data-pagefind-ignore>Resolved lower bound; `undefined` means autoscale this end.</span> | [ScoreAxisMixin](../scoreaxismixin#getter-minscorebound) |
| <span id="getter-maxscorebound">**maxScoreBound**</span><br><code>number &#124; undefined</code> | <span data-pagefind-ignore>Resolved upper bound; `undefined` means autoscale this end.</span> | [ScoreAxisMixin](../scoreaxismixin#getter-maxscorebound) |
| <span id="getter-hasmanualscorebounds">**hasManualScoreBounds**</span><br><code>boolean</code> | <span data-pagefind-ignore>Whether the user has pinned either end, which is a different question from whether either end resolved to a number: `defaultScoreDomain` fills the unset ends in, so a GC content track answers yes to the second with nothing configured. The score menu asks this one — it captions the min/max row with the range in force, and a caption off the resolved pair named a range on every freshly opened GC content track.</span> | [ScoreAxisMixin](../scoreaxismixin#getter-hasmanualscorebounds) |
| <span id="getter-axes">**axes**</span><br><code>YAxis[]</code> | <span data-pagefind-ignore>The axes, one per declared scale whose domain resolved: where each tick lands in the band's own pixel space, through `computeYTicks` unless the scale brought its own ladder, and where each of the scale's `rules` inside the domain lands in that same box, through the scale type the renderer places its values by.</span> | [ScoreAxisMixin](../scoreaxismixin#getter-axes) |
| <span id="getter-showlegend">**showLegend**</span><br><code>boolean</code> | <span data-pagefind-ignore>Whether the legend is drawn.</span> | [LegendMixin](../legendmixin#getter-showlegend) |
| <span id="getter-legendtop">**legendTop**</span><br><code>number</code> | <span data-pagefind-ignore>Overridable hook (default 0): px the on-screen key is pushed down from its own inset. A display that already draws a control of its own in that corner — Hi-C's resolution box — answers that control's height; the chrome adds its own axis captions on top. The export draws no controls, so it does not read this.</span> | [LegendMixin](../legendmixin#getter-legendtop) |
| <span id="getter-legendright">**legendRight**</span><br><code>number</code> | <span data-pagefind-ignore>Overridable hook (default 0): px the on-screen key is pushed left from its own inset, for a display that draws a column of text down its right edge — the multi-way lanes' scales. Not read by the export.</span> | [LegendMixin](../legendmixin#getter-legendright) |
| <span id="getter-legendspec">**legendSpec**</span><br><code>LegendSpec</code> | <span data-pagefind-ignore>The key, derived from `colorScales` less the sections the reader dismissed. `DisplayChrome` renders it on screen and `renderDisplaySvg` flattens it for the export, so the two describe one set of colors.</span> | [LegendMixin](../legendmixin#getter-legendspec) |
| <span id="getter-haslegendkey">**hasLegendKey**</span><br><code>boolean</code> | <span data-pagefind-ignore>Whether the display has a key at all. The "Show legend" row is offered only when it does. Overridable for a display whose key is only waiting for data: a scale that stays empty until a region lands must not remove the toggle in the meantime.</span> | [LegendMixin](../legendmixin#getter-haslegendkey) |
| <span id="getter-hoveredfeature">**hoveredFeature**</span><br><code>T &#124; undefined</code> |  | [StoredHoverMixin](../storedhovermixin#getter-hoveredfeature) |
| <span id="getter-displayhiddengroupkeys">**displayHiddenGroupKeys**</span><br><code>ReadonlySet&lt;string&gt;</code> | <span data-pagefind-ignore>Overridable hook: lanes the DISPLAY hides on its own behalf, as opposed to the ones the user hid from a chip. Empty by default; LGVSyntenyDisplay hides the self-alignment lane of an all-vs-all track through it.</span> | [HiddenGroupsMixin](../hiddengroupsmixin#getter-displayhiddengroupkeys) |
| <span id="getter-owngroupstate">**ownGroupState**</span><br><code>unknown</code> | <span data-pagefind-ignore>Overridable hook: the per-group state a display keeps beyond the hidden sections, as a plain value. None by default; alignments answers its collapses and height overrides, the state its `dropGroupState` clears.</span> | [HiddenGroupsMixin](../hiddengroupsmixin#getter-owngroupstate) |
| <span id="getter-hiddengroupkeys">**hiddenGroupKeys**</span><br><code>ReadonlySet&lt;string&gt;</code> | <span data-pagefind-ignore>Every key the stack drops: what the user hid and what the display hides for itself. A fresh Set per change rather than the observable set itself, so a layout memo comparing its inputs by identity sees a hide.</span> | [HiddenGroupsMixin](../hiddengroupsmixin#getter-hiddengroupkeys) |
| <span id="getter-groupstatekey">**groupStateKey**</span><br><code>unknown</code> | <span data-pagefind-ignore>All the per-group state as a plain, comparable value: the hidden sections, sorted, beside `ownGroupState`. A live figure keys on it, since the state is volatile and in no snapshot; a Set would serialize as `{}`.</span> | [HiddenGroupsMixin](../hiddengroupsmixin#getter-groupstatekey) |
| <span id="getter-parenttrack">**parentTrack**</span><br><code>AbstractTrackModel</code> |  | [BaseDisplay](../basedisplay#getter-parenttrack) |
| <span id="getter-renderingcomponent">**RenderingComponent**</span><br><code>FC&lt;…&gt;</code> |  | [BaseDisplay](../basedisplay#getter-renderingcomponent) |
| <span id="getter-displayblurb">**DisplayBlurb**</span><br><span class="cell-more"><button type="button" class="cell-more-trigger"><code>FC&lt;{ model: ModelInstanceTypeProps&lt;{ id: IOptionalIType&lt;ISimple…</code></button><dialog class="cell-dialog"><form method="dialog"><button class="cell-dialog-close" aria-label="Close">✕</button></form><pre><code>FC&lt;{ model: ModelInstanceTypeProps&lt;{ id: IOptionalIType&lt;ISimpleType&lt;string&gt;, [undefined]&gt;; type: ISimpleType&lt;string&gt;; }&gt; &amp; { ...; } &amp; { ...; } &amp; IStateTreeNode&lt;...&gt;; }&gt; &#124; null</code></pre></dialog></span> |  | [BaseDisplay](../basedisplay#getter-displayblurb) |
| <span id="getter-adapterconfig">**adapterConfig**</span><br><code>Record&lt;string, unknown&gt;</code> |  | [BaseDisplay](../basedisplay#getter-adapterconfig) |
| <span id="getter-isminimized">**isMinimized**</span><br><code>boolean</code> | <span data-pagefind-ignore>Returns true if the parent track is minimized. Used to skip expensive operations like autoruns when track is not visible.</span> | [BaseDisplay](../basedisplay#getter-isminimized) |
| <span id="getter-featurenoun">**featureNoun**</span><br><code>string</code> | <span data-pagefind-ignore>Overridable hook (default `'feature'`): the SINGULAR word for one of the things this display draws, as a menu row or a chip says it — "Hide this read", "Showing 3 variants".<br><br>Declared here for the same reason as `hoveredFeature` above: it is read across the display boundary, by chrome that has no idea which display it is drawing for (`SoloSelectionChip`, alignments' group-label overlay), and a name only the base declares is a name every such consumer can rely on. Two displays declared it independently and one of those declarations WAS this default.<br><br>**A control keeps the generic word; content takes this one.** "Variant height" reads as a different setting from "Feature height" when it is the same one, so the shared menus stay on "feature" however the display answers here, and the noun varies where it names what the user is looking at — "Showing 3 variants", "Hide this read". A display drawing something the generic word already fits is right to leave this alone.<br><br>Distinct from the per-hit noun a context menu takes off the clicked item's own `type` ("mRNA", "gene"); that names one annotation, this names what the track holds. The hit noun falls back to this.</span> | [BaseDisplay](../basedisplay#getter-featurenoun) |
| <span id="getter-featurewidgettype">**featureWidgetType**</span><br><code>{ type: string; id: string; }</code> | <span data-pagefind-ignore>The widget `openFeatureWidget` opens for one of this display's features. Displays may override it. The default is the generic feature widget, for displays drawing plain features.<br><br>Displays whose features are a specific kind (a read, a variant, a synteny block) override it, including the `id`: two displays naming one id share the drawer panel, which suits two displays showing the same kind of feature.</span> | [BaseDisplay](../basedisplay#getter-featurewidgettype) |
| <span id="getter-plotkeys">**plotKeys**</span><br><code>string[]</code> | <span data-pagefind-ignore>The grammar settings this display's config declares, by slot name (`PLOT_VOCABULARY`): what "Edit plot..." edits. Empty on a display with none, which then offers no editor.</span> | [BaseDisplay](../basedisplay#getter-plotkeys) |
| <span id="getter-plot">**plot**</span><br><code>Plot</code> | <span data-pagefind-ignore>Those settings as declared, defaults left off and a shorthand written as a config file writes it. An agent edits a `structuredClone` of it, checks it with `plotProblems` and hands it to `applyPlot`.</span> | [BaseDisplay](../basedisplay#getter-plot) |
| <span id="getter-plotexamples">**plotExamples**</span><br><code>readonly PlotExample[]</code> | <span data-pagefind-ignore>The worked examples this display type declares, which "Edit plot..." offers as buttons.</span> | [BaseDisplay](../basedisplay#getter-plotexamples) |
| <span id="getter-configdocsurl">**configDocsUrl**</span><br><code>string</code> | <span data-pagefind-ignore>This display type's page in the config reference, which lists every setting it takes.</span> | [BaseDisplay](../basedisplay#getter-configdocsurl) |
| <span id="getter-height">**height**</span><br><code>number</code> |  | [TrackHeightMixin](../trackheightmixin#getter-height) |
| <span id="getter-resizing">**resizing**</span><br><code>boolean</code> | <span data-pagefind-ignore>True for the duration of a height drag on this track, whichever handle is running it. A display whose row geometry is a function of the track height restretches every row per animation frame, and can use this to sit an expensive per-frame layer out of the drag (MAF's dense per-base letter overlay is a Canvas2D pass that scales with rows x columns).<br><br>The flag itself is the track's (`BaseTrackModel`), so the view brackets a drag without needing the active display to have opted into this mixin. This getter reads it so that a display that did opt in has `self.resizing`.</span> | [TrackHeightMixin](../trackheightmixin#getter-resizing) |
| <span id="getter-scrollableheight">**scrollableHeight**</span><br><code>number</code> | <span data-pagefind-ignore>How far the content scrolls. A sub-pixel overflow is 0: a fit mode that divides the viewport across n rows multiplies back to a few ULPs over it, and an extent of 1e-14px still draws a scrollbar and holds the wheel away from the page.</span> | [TrackHeightMixin](../trackheightmixin#getter-scrollableheight) |
| <span id="getter-host">**host**</span><br><code>RegionHost</code> | <span data-pagefind-ignore>The containing LinearGenomeView, typed once for every display in this family — see `containingHost` for the cast it owns and why both foundations still declare the name.</span> | [MultiRegionDisplayMixin](../multiregiondisplaymixin#getter-host) |
| <span id="getter-canvaswidthpx">**canvasWidthPx**</span><br><code>number</code> | <span data-pagefind-ignore>The CSS width of this display's on-screen canvas, in px — and the `canvasWidth` its `renderState` must carry, since the two have to agree or the bp→px mapping is scaled against a box it doesn't fill.<br><br>`trackWidthPx`, **not** `view.width`: `TrackRenderingContainer` insets the rendering component by the 2px track outline under `contain: strict`, so a `view.width`-wide canvas overhangs its own container and the browser clips the overhang away. It renders almost identically, which is why MAF drifted onto `view.width` uncaught.<br><br>A getter rather than a note on each display, because the choice was being made by copying a neighbour out of four plausible view getters — `width` (the viewport), this one, and `totalWidthPx` / `totalWidthPxWithoutBorders` (the *content* width, which the global family's heatmaps legitimately want: a different question, not a different answer). `no-restricted-syntax` bans the underlying read everywhere but this line, since a second spelling agrees until it doesn't.<br><br>SVG export is the one exception: the export shell has no outline, so `renderSvg` overrides `canvasWidth` with the shell's own width (see `LgvSvgBodyProps`).</span> | [MultiRegionDisplayMixin](../multiregiondisplaymixin#getter-canvaswidthpx) |
| <span id="getter-settledsubpixelbinbp">**settledSubPixelBinBp**</span><br><code>number</code> | <span data-pagefind-ignore>Genomic bp one cell of a per-base pass stands for at the settled zoom: `subPixelBinBp` off the host's debounced `coarseBpPerPx`, and 1 until the view initializes. A per-base encode or fetch reads this rather than the live zoom so a wheel tick does not redo every region.</span> | [MultiRegionDisplayMixin](../multiregiondisplaymixin#getter-settledsubpixelbinbp) |
| <span id="getter-canrender">**canRender**</span><br><code>boolean</code> | <span data-pagefind-ignore>Overrides `RenderLifecycleMixin`'s default-true hook with the LGV precondition both foundations share — see `foundationCanRender`.</span> | [MultiRegionDisplayMixin](../multiregiondisplaymixin#getter-canrender) |
| <span id="getter-renderscanvas">**rendersCanvas**</span><br><code>boolean</code> | <span data-pagefind-ignore>Fills `RenderLifecycleMixin`'s hook off `fetchInert`, as `GlobalFetchMixin` does: a display that will never fetch here shows a placeholder where its canvas would be.</span> | [MultiRegionDisplayMixin](../multiregiondisplaymixin#getter-renderscanvas) |
| <span id="getter-trackvisibleregions">**trackVisibleRegions**</span><br><code>VisibleRegion[]</code> | <span data-pagefind-ignore>The visible blocks on the track's own assemblies, the ones this display fetches and is judged against. A view of several genomes leaves a single-genome track's other regions blank.</span> | [MultiRegionDisplayMixin](../multiregiondisplaymixin#getter-trackvisibleregions) |
| <span id="getter-viewportwithinloadeddata">**viewportWithinLoadedData**</span><br><code>boolean</code> | <span data-pagefind-ignore>true when every visible block lies within an already-fetched region — i.e. the viewport shows data we actually loaded, not the stale fringe left after a zoom-out/pan. Drives the loading overlay through the pre-refetch debounce.<br><br>**Spatial only, and it stays that way.** Whether the data held for a block is still what a fetch would bring back is `isCacheValid`, which `dataCurrent` conjoins for the export gate. The scrim reads this getter and `dataSuperseded`, never `isCacheValid`: a phase that went `loading` on a moved `fetchInputs` would raise the overlay into every zoom.</span> | [MultiRegionDisplayMixin](../multiregiondisplaymixin#getter-viewportwithinloadeddata) |
| <span id="getter-viewportempty">**viewportEmpty**</span><br><code>boolean</code> | <span data-pagefind-ignore>No content block is on screen, so this display has nothing to fetch and nothing to paint — see `viewportEmpty.ts` for the one viewport that reaches it, how narrow that is, and why the state still has to be terminal rather than a permanent scrim. Both foundations declare it over that one expression, the same way they each declare `host` and `paintInert`.</span> | [MultiRegionDisplayMixin](../multiregiondisplaymixin#getter-viewportempty) |
| <span id="getter-layoutready">**layoutReady**</span><br><code>boolean</code> | <span data-pagefind-ignore>Overridable hook (default false): whether a searchable feature layout currently exists. Any display defining a feature-lookup method (`searchFeatureByID`) must override it, so callers can tell "laid out, but off-display" from "no layout exists yet" — a distinction only the display can make. See `agent-docs/reference/DISPLAY_KIT.md` §"Four readiness axes".</span> | [MultiRegionDisplayMixin](../multiregiondisplaymixin#getter-layoutready) |
| <span id="getter-renderblocks">**renderBlocks**</span><br><code>RenderBlock[]</code> | <span data-pagefind-ignore>Shared cached view for every LGV-based GPU display. A single displayedRegion may produce multiple render blocks (shared GPU buffer, different scissor clips on screen). Plugins that want to suppress rendering in certain states (e.g. no domain yet) can override this getter to return [] — the autorun lifecycle will then issue an empty-blocks render that clears the canvas.</span> | [MultiRegionDisplayMixin](../multiregiondisplaymixin#getter-renderblocks) |
| <span id="getter-fetchinputs">**fetchInputs**</span><br><code>FetchInputs</code> | <span data-pagefind-ignore>What a fetch issued right now would stamp on a region: the settings tier (`FetchMixin.settingsFetchInputs`, the tier `staleSettingsDrawn` compares alone) and the zoom tier (the display's `zoomFetchArgs()` object). `fetchRegions` captures it before the RPC goes out and stamps it beside the loaded region; `isCacheValid` compares against it.</span> | [MultiRegionDisplayMixin](../multiregiondisplaymixin#getter-fetchinputs) |
| <span id="getter-regionpayloads">**regionPayloads**</span><br><code>ReadonlyMap&lt;number, unknown&gt;</code> | <span data-pagefind-ignore>The store's payloads, keyed by `displayedRegionIndex`. A display narrows this once — `get rpcDataMap() { return self.regionPayloads as ReadonlyMap<number, MyResult> }` — and every reader it already had goes on reading a map.<br><br>MST makes a `.views()` getter a computed, so the Map is built once per store change and handed back by reference after that — which is what keeps `installUpload`'s diff a reference compare per key and a frame that changed no data free of it. **While something observes it**: MobX suspends an unobserved computed and rebuilds on every read, so a display whose only reader is a pointer handler needs the keep-alive canvas and Manhattan both install (`agent-docs/reference/DISPLAY_KIT.md` §"A hit test's index needs an observer"). The render lifecycle's upload autorun is that reader for every display that draws.</span> | [MultiRegionDisplayMixin](../multiregiondisplaymixin#getter-regionpayloads) |
| <span id="getter-hasregiondata">**hasRegionData**</span><br><code>boolean</code> | <span data-pagefind-ignore>A fetch has landed: at least one region's payload is in the store. The render callback's first-paint gate reads this, so an empty frame before any data cannot flip `canvasDrawn`; an empty but loaded region counts, and paints its empty frame.</span> | [MultiRegionDisplayMixin](../multiregiondisplaymixin#getter-hasregiondata) |
| <span id="getter-stalesettingsdrawn">**staleSettingsDrawn**</span><br><code>boolean</code> | <span data-pagefind-ignore>A visible block's held data was fetched under a settings or adapter key that has since moved: drawn, and wrong for the current settings, until the refetch `isCacheValid` already owes lands. The loading scrim's third staleness term, beside spatial coverage and `dataSuperseded` — the one that used to come from `SettingsInvalidate` emptying the coverage map, and the reason it no longer has to.<br><br>False on a zoom by construction: it compares the stamp's `settings` tier alone, so a moved zoom tier raises no scrim. That is the whole distance from the declined fold, which compared the whole key and put the overlay 250 ms into every zoom.</span> | [MultiRegionDisplayMixin](../multiregiondisplaymixin#getter-stalesettingsdrawn) |
| <span id="getter-datacurrent">**dataCurrent**</span><br><code>boolean</code> | <span data-pagefind-ignore>This family's answer to the shared freshness question every display foundation must answer (`dataCurrent`): the held data corresponds to what is on screen right now. Four terms — spatial coverage of every visible block, `loadedRegions.size` to rule out the vacuously-true empty viewport, `isCacheValid` per block, and the display's own `dataSuperseded`. Regions stream in one at a time, so a multi-region/whole-genome export waits on this getter to be complete; waiting on the first datum to arrive would export a partial set.<br><br>**`isCacheValid` belongs here and not in the scrim.** Coverage answers "is the data here", never "is it what a fetch now would bring back", so a zoom that moves `fetchInputs` leaves every held region covered and stale at once — and an export sampling `svgReady` across that window painted bins the worker computed for the previous zoom. `displayPhase` takes `dataSuperseded` but NOT this term: folding a moved `fetchInputs` into the phase raises the loading scrim into every zoom, which is the trade this does not take.<br><br>The term cannot latch, and the reason is structural rather than a case list: a block reaches `fetchNeeded` unless `planRegionFetch` finds it ungated, covered AND cache-valid, and it reads that last term tracked. The `&&` short-circuits ahead of it drop its observables only where the block is fetched anyway, so the key move that closes this gate is the same read, in the same dependency set, that wakes the refetch reopening it.</span> | [MultiRegionDisplayMixin](../multiregiondisplaymixin#getter-datacurrent) |
| <span id="getter-loadedassembly">**loadedAssembly**</span><br><span class="cell-more"><button type="button" class="cell-more-trigger"><code>(ModelInstanceTypeProps&lt;…&gt; &amp; { error: unknown; loadingP: Promis…</code></button><dialog class="cell-dialog"><form method="dialog"><button class="cell-dialog-close" aria-label="Close">✕</button></form><pre><code>(ModelInstanceTypeProps&lt;…&gt; &amp; { error: unknown; loadingP: Promise&lt;…&gt; &#124; undefined; ... 10 more ...; refNameMismatches: Map&lt;…&gt;; } &amp; ... 13 more ... &amp; IStateTreeNode&lt;...&gt;) &#124; undefined</code></pre></dialog></span> | <span data-pagefind-ignore>The assembly the data in hand came from, once it can answer about refNames — `undefined` before that.<br><br>Read off the first LOADED region rather than the view's displayed ones, and defined here for that reason: a display holding fetched data is asking about the assembly THAT data is on, and the view's regions can already have moved on.<br><br>The `initialized` gate is why this returns the assembly rather than its name. `getCanonicalRefName2` and `refNameToIndex` answer WRONGLY rather than throwing before the aliases land — identity, and a miss — so a caller that skips the gate gets a plausible answer and no signal. Returning `undefined` until the aliases load forces the caller to write its fallback.</span> | [MultiRegionDisplayMixin](../multiregiondisplaymixin#getter-loadedassembly) |
| <span id="getter-phaseviewportcurrent">**phaseViewportCurrent**</span><br><code>boolean</code> | <span data-pagefind-ignore>The loading scrim's staleness argument: what is drawn answers for what is on screen. Spatial coverage, `dataSuperseded` and `staleSettingsDrawn`; NOT `isCacheValid`, which is `dataCurrent`'s and would scrim every zoom. `displayPhase` reads it, and so does a stand-in phase (`coarseTierDisplayPhase`) — one predicate, so a term added here reaches both.</span> | [MultiRegionDisplayMixin](../multiregiondisplaymixin#getter-phaseviewportcurrent) |
| <span id="getter-paintinert">**paintInert**</span><br><code>boolean</code> | <span data-pagefind-ignore>Fills `RenderLifecycleMixin`'s `paintInert` hook — see there for why a failed fetch has to read as finished to the consumers outside the display, and `foundationPaintInert` for the second such state and why both fetch families answer it through one function. Overridable, as the hook is: a display with a third inert state of its own says so here.</span> | [MultiRegionDisplayMixin](../multiregiondisplaymixin#getter-paintinert) |
| <span id="getter-paintsuperseded">**paintSuperseded**</span><br><code>boolean</code> | <span data-pagefind-ignore>Fills `RenderLifecycleMixin`'s hook with `staleSettingsDrawn`, so `painted` — and `data-display-drawn` through it — reads pending over a canvas painted under the previous settings until the refetch lands. `clearAllRpcData` used to reset `canvasDrawn` for the same effect; the hook says it without blanking anything.</span> | [MultiRegionDisplayMixin](../multiregiondisplaymixin#getter-paintsuperseded) |
| <span id="getter-bytegateadapterconfig">**byteGateAdapterConfig**</span><br><code>Record&lt;string, unknown&gt;</code> | <span data-pagefind-ignore>The adapter config the gate measures — the one at `byteGateAdapterPath`. Overridable for a display whose adapter config is synthesized rather than read off the track.</span> | [RegionTooLargeMixin](../regiontoolargemixin#getter-bytegateadapterconfig) |
| <span id="getter-configuredfetchsizelimit">**configuredFetchSizeLimit**</span><br><code>number &#124; undefined</code> | <span data-pagefind-ignore>The display's `fetchSizeLimit` slot, from `regionTooLargeConfigSchemaFields`. `number \| undefined`, because `getConf` answers `undefined` for a slot a composing display's schema never declared and typing it `number` hid the whole failure — `resolveByteLimit` falls back closed, and says why.</span> | [RegionTooLargeMixin](../regiontoolargemixin#getter-configuredfetchsizelimit) |
| <span id="getter-densitytoolarge">**densityTooLarge**</span><br><code>boolean</code> | <span data-pagefind-ignore>The density axis's verdict, and the whole of that axis's opt-in: `CanvasFeatureGateMixin` overrides it beside the measurement that fills it, and a byte-only display leaves it false.</span> | [RegionTooLargeMixin](../regiontoolargemixin#getter-densitytoolarge) |
| <span id="getter-adapterfetchsizelimit">**adapterFetchSizeLimit**</span><br><code>number &#124; undefined</code> | <span data-pagefind-ignore>The measured adapter's own `fetchSizeLimit` slot, read off the live track config rather than the `adapterConfig` snapshot, which omits slots at their default.</span> | [RegionTooLargeMixin](../regiontoolargemixin#getter-adapterfetchsizelimit) |
| <span id="getter-configforceload">**configForceLoad**</span><br><code>boolean</code> | <span data-pagefind-ignore>The declarative `forceLoad` slot.</span> | [RegionTooLargeMixin](../regiontoolargemixin#getter-configforceload) |
| <span id="getter-gateviewportspanbp">**gateViewportSpanBp**</span><br><code>number &#124; undefined</code> | <span data-pagefind-ignore>The span on screen, or undefined until the view is measured: the half of gateViewport the budget questions need. Split off because the identity half joins a string over `view.visibleRegions`, which rebuilds every gesture frame, and `aboveForceLoadFloor` sits under `regionTooLarge` — every gated display rebuilt it per frame to ask whether the span was 20 kb.</span> | [RegionTooLargeMixin](../regiontoolargemixin#getter-gateviewportspanbp) |
| <span id="getter-gateviewport">**gateViewport**</span><br><code>GateViewport &#124; undefined</code> | <span data-pagefind-ignore>What a measurement taken now would be about: the span on screen, and a key for the stretch of genome it covers **and the settings it would be taken under**. Undefined until the view is measured, and with gateViewportSpanBp the mixin's only read of the view. Captured before the fetch's round trip, never at commit, so the stamp names the settings the worker actually counted under.<br><br>The settings term is `settingsFetchInputs`, the axis every family invalidates data on. It belongs in the measurement because the worker's density probe counts ADMITTED features (`densityGate`'s `admit`), so a filter admitting almost nothing is a different measurement of the same viewport — and while staleness was viewport-only, the main thread never went back to ask. The byte axis is an index read no `rpcProps` field can move; the rule is one rule rather than one per axis.</span> | [RegionTooLargeMixin](../regiontoolargemixin#getter-gateviewport) |
| <span id="getter-aboveforceloadfloor">**aboveForceLoadFloor**</span><br><code>boolean</code> | <span data-pagefind-ignore>Whether the span on screen is at or above `AUTO_FORCE_LOAD_BP`, the one comparison against that constant. False on an unmeasured view.</span> | [RegionTooLargeMixin](../regiontoolargemixin#getter-aboveforceloadfloor) |
| <span id="getter-gateexempt">**gateExempt**</span><br><code>boolean</code> | <span data-pagefind-ignore>Nothing may gate on either axis: the `forceLoad` slot or the button.</span> | [RegionTooLargeMixin](../regiontoolargemixin#getter-gateexempt) |
| <span id="getter-estimatedfetchbytes">**estimatedFetchBytes**</span><br><code>number &#124; undefined</code> | <span data-pagefind-ignore>The stored estimate's bytes; undefined when nothing has been measured.</span> | [RegionTooLargeMixin](../regiontoolargemixin#getter-estimatedfetchbytes) |
| <span id="getter-gatemeasurementstale">**gateMeasurementStale**</span><br><code>boolean</code> | <span data-pagefind-ignore>Whether the last measurement still describes what a fetch issued now would ask: the viewport on screen, under the settings on screen. True before any measurement. The triple's third term, the adapter tier, is not here — a tier swap drops the measurement outright (`ClearGateMeasurementsOnNavOrTierSwap`) rather than marking it stale.</span> | [RegionTooLargeMixin](../regiontoolargemixin#getter-gatemeasurementstale) |
| <span id="getter-gatebytelimit">**gateByteLimit**</span><br><code>number</code> | <span data-pagefind-ignore>The byte budget: the adapter's limit, else the display's, doubled below `AUTO_FORCE_LOAD_BP`. Read only through `resolvedByteLimit()`.</span> | [RegionTooLargeMixin](../regiontoolargemixin#getter-gatebytelimit) |
| <span id="getter-gateactive">**gateActive**</span><br><code>boolean</code> | <span data-pagefind-ignore>Whether the gate may act right now, on any axis: opted in, not exempt, view measured. The view is read last, so an ungated display never touches it.</span> | [RegionTooLargeMixin](../regiontoolargemixin#getter-gateactive) |
| <span id="getter-densitygateactive">**densityGateActive**</span><br><code>boolean</code> | <span data-pagefind-ignore>Whether the density axis may act: `gateActive`, and the span is above the floor — the one axis the floor applies to. Whether it has anything to say is `densityTooLarge`.</span> | [RegionTooLargeMixin](../regiontoolargemixin#getter-densitygateactive) |
| <span id="getter-toolargestatus">**tooLargeStatus**</span><br><code>RegionTooLargeStatus</code> | <span data-pagefind-ignore>The verdict and its banner text, from the stored estimate against `resolvedByteLimit()` and the density axis when it may act.</span> | [RegionTooLargeMixin](../regiontoolargemixin#getter-toolargestatus) |
| <span id="getter-regiontoolarge">**regionTooLarge**</span><br><code>boolean</code> |  | [RegionTooLargeMixin](../regiontoolargemixin#getter-regiontoolarge) |
| <span id="getter-regiontoolargereason">**regionTooLargeReason**</span><br><code>string</code> | <span data-pagefind-ignore>Banner text for the axis that tripped; empty when not too large.</span> | [RegionTooLargeMixin](../regiontoolargemixin#getter-regiontoolargereason) |
| <span id="getter-zoomcanreleasegate">**zoomCanReleaseGate**</span><br><code>boolean</code> | <span data-pagefind-ignore>Whether "zoom in to see features" is honest advice. Density always releases on zoom; bytes only if the last zoom-in moved the estimate.</span> | [RegionTooLargeMixin](../regiontoolargemixin#getter-zoomcanreleasegate) |
| <span id="getter-gateskipsmeasuredviewport">**gateSkipsMeasuredViewport**</span><br><code>boolean</code> | <span data-pagefind-ignore>The skip both fetch skeletons apply: the banner is up and its measurement already describes the viewport on screen.</span> | [RegionTooLargeMixin](../regiontoolargemixin#getter-gateskipsmeasuredviewport) |
| <span id="getter-painted">**painted**</span><br><code>boolean</code> | <span data-pagefind-ignore>**The first-paint answer every consumer outside the display should read**, `canvasDrawn` being only the raw flag: a display that is deliberately not painting a canvas has finished, and reporting it unfinished leaves every waiter on it waiting forever.<br><br>The two `rendersCanvas: false` states each had three of their four consumers wired by hand — the loading scrim (`rendersCanvas` / `fetchInert`) and the SVG export (`fetchInert`) — while the fourth, `data-display-drawn`, went on publishing `"false"` forever off the raw flag. That attribute is what `PENDING_DISPLAYS` (`@jbrowse/browser-test-utils`) selects on, so a zoomed-out reference sequence track made every capture wait on the page run to its full timeout, and that wait swallows its own timeout without reporting it. `fetchInert` on the comparative side has the same problem: the forgotten reader is the one outside the display, so the display has to publish one name for it.<br><br>`paintInert` is the third term and the same argument once more, for the state where a display *would* paint a canvas and never gets to — a fetch that failed before first paint. `paintSuperseded` is the fourth, and the one that subtracts: a canvas painted from data a settings change has made wrong is drawn and not finished. See both hooks.</span> | [RenderLifecycleMixin](../renderlifecyclemixin#getter-painted) |
| <span id="getter-isloading">**isLoading**</span><br><code>boolean</code> | <span data-pagefind-ignore>true while a fetch is active</span> | [FetchMixin](../fetchmixin#getter-isloading) |
| <span id="getter-isloadingorcanceled">**isLoadingOrCanceled**</span><br><code>boolean</code> | <span data-pagefind-ignore>`isLoading` widened to cover a user-canceled load: what a hover gate wants, since neither state has a frame on screen that a hit describes. Not a phase input — `computeActivityPhase` reads the two apart, because a cancel is finished (`canceled`) where a fetch is not (`loading`).</span> | [FetchMixin](../fetchmixin#getter-isloadingorcanceled) |
| <span id="getter-fetchinert">**fetchInert**</span><br><code>boolean</code> | <span data-pagefind-ignore>Overridable hook (default false): the states where this display deliberately never fetches, so it holds no data and none is coming. Sequence sets it past base resolution ("Zoom in to see sequence"); LD sets it with the triangle toggled off.<br><br>**One hook has three readers.** A display that gains such a state declares it once, which covers the reader it would otherwise forget, always the one outside the display:<br><br>- the phase (`computeActivityPhase`), which otherwise parks a scrim over the placeholder, or a canceled overlay once Cancel is clicked; - the SVG export (`computeSvgReady`'s `extraTerminal`), whose `awaitSvgReady` is an unbounded `when`, so one such display hangs the whole view's export; - the retry contract check (`makeRetryContractCheck`), which would otherwise report a dead Retry on a display correctly declining to load anything.<br><br>`fetchInert` replaces three hooks: `loadingSuppressed`, `svgReadyExtraTerminal` on each of the two foundations, and `fetchInert` on the comparative family, which had already collapsed them. Both LGV displays that override it returned one expression for all three, and the global family hard-coded one of the three to `false` for a while, so LD could express only half its state. All three fetch families declare it here since the comparative one composed this mixin (ADR-105), so the retry check reads one field everywhere. ADR-082.<br><br>A hook rather than a `displayPhase` override, because overriding the getter means restating the whole loading condition. Sequence held a verbatim copy of the other terms that way, and a copy misses any term added to the condition later.<br><br>`fetchInert` lives **here** because this is the one mixin all three display foundations compose. Same argument, one level down, that put `rendersCanvas` on `RenderLifecycleMixin` beside `canvasDrawn`.</span> | [FetchMixin](../fetchmixin#getter-fetchinert) |
| <span id="getter-awaitingprerequisite">**awaitingPrerequisite**</span><br><code>boolean</code> | <span data-pagefind-ignore>Overridable hook (default false), read only by the retry contract check (`makeRetryContractCheck`): "this run declined because a prerequisite fetch in another autorun has not landed, and its arrival wakes this one again". It **defers** the retry verdict to that later run rather than waiving it, so a display cannot spend its retry on a decline it called preliminary.<br><br>Two displays set it, one per fetch foundation, so it lives beside `fetchInert` rather than on either: HiC's contacts fetch declines until `CoreGetInfo` lands, and `MultiSampleVariantBaseModel`'s `fetchNeeded` declines until `sourcesBase` does. Both have a `reload()` that wakes the prerequisite's autorun as well as their own.<br><br>**It has to be strictly narrower than the gate it explains.** One that restates the gate's negation makes every decline a deferred one. No run is then ever judged, which exempts the display from the check. HiC does this deliberately, because its gate and its prerequisite are one condition; what covers its retry instead is `LinearHicDisplay/infoFetchFailure.test.ts`.<br><br>Not for a display deliberately not fetching at all — that is `fetchInert` above, which the loading scrim and the export read too.</span> | [FetchMixin](../fetchmixin#getter-awaitingprerequisite) |
| <span id="getter-awaitingdependentdata">**awaitingDependentData**</span><br><code>boolean</code> | <span data-pagefind-ignore>Overridable hook (default false), read by `computeActivityPhase`: a load this display depends on beyond its primary fetch has not landed for the first time, so the frame the primary fetch calls current is still missing something. Multi-way synteny sets it until its lane genes and lane links first arrive, so an export or a capture never lands between the ortholog fetch and the gene models that fill the lanes.<br><br>A hook rather than a `displayPhase` override, for the reason `fetchInert` is one: that display carried the override, restating the foundation's two arguments verbatim to append one term, and a copy like that misses any term added to the foundation later.<br><br>Not `dataSuperseded`, which holds the export through every later refetch too: a display saying this wants the scrim on the first landing only, since later lane fetches redraw over lanes already on screen.</span> | [FetchMixin](../fetchmixin#getter-awaitingdependentdata) |
| <span id="getter-settingsfetchinputs">**settingsFetchInputs**</span><br><code>unknown</code> | <span data-pagefind-ignore>The settings axis every fetch family invalidates on: this display's `rpcProps()` payload and its adapter config, as one value compared structurally. The per-region family watches it from `SettingsInvalidate` and stamps it on each region, the keyed families fold it into `currentFetchKey`, and the byte gate measures under it — one getter, so no two can come to invalidate on different axes.<br><br>`undefined` inside the payload is a real state and a class instance compares by its own fields, which a serialized key could not say; `makeSettingsFetchInputs` has why.</span> | [FetchMixin](../fetchmixin#getter-settingsfetchinputs) |
| <span id="getter-showtree">**showTree**</span><br><code>boolean</code> | <span data-pagefind-ignore>Whether the dendrogram sidebar is drawn.</span> | [TreeSidebarMixin](../treesidebarmixin#getter-showtree) |
| <span id="getter-showbranchlength">**showBranchLength**</span><br><code>boolean</code> | <span data-pagefind-ignore>Whether tree nodes are positioned by branch length (dendrogram) or evenly by topology (cladogram).</span> | [TreeSidebarMixin](../treesidebarmixin#getter-showbranchlength) |
| <span id="getter-showrowlabels">**showRowLabels**</span><br><code>boolean</code> | <span data-pagefind-ignore>Whether each row's name is drawn over the left of the plot.</span> | [TreeSidebarMixin](../treesidebarmixin#getter-showrowlabels) |
| <span id="getter-treeareawidth">**treeAreaWidth**</span><br><code>number</code> | <span data-pagefind-ignore>Width in px of the sidebar the dendrogram draws in. On the config rather than the display snapshot for the same reason `height` is: the config node outlives the display instance, so a dragged width survives unticking and reticking the track.</span> | [TreeSidebarMixin](../treesidebarmixin#getter-treeareawidth) |
| <span id="getter-rowdomain">**rowDomain**</span><br><code>string[]</code> | <span data-pagefind-ignore>The row order, `rows.domain`: the rows it names lead, in its order, and the rest follow as `unlistedRowsSort` says.</span> | [TreeSidebarMixin](../treesidebarmixin#getter-rowdomain) |
| <span id="getter-rowlabels">**rowLabels**</span><br><code>Readonly&lt;Record&lt;string, string&gt;&gt;</code> | <span data-pagefind-ignore>The labels drawn in place of row names, `rows.labels`, by name.</span> | [TreeSidebarMixin](../treesidebarmixin#getter-rowlabels) |
| <span id="getter-rowtreeprovenance">**rowTreeProvenance**</span><br><code>ClusterProvenance &#124; undefined</code> | <span data-pagefind-ignore>What `rowTree` was computed from, the locus and the settings; undefined for a tree that arrived as data.</span> | [TreeSidebarMixin](../treesidebarmixin#getter-rowtreeprovenance) |
| <span id="getter-rowfocus">**rowFocus**</span><br><code>readonly string[] &#124; undefined</code> | <span data-pagefind-ignore>The row names a focus narrows the display to, `rows.kept` — a clade picked off the tree or a key row's rows — or undefined while every row shows.</span> | [TreeSidebarMixin](../treesidebarmixin#getter-rowfocus) |
| <span id="getter-rowcolorsetting">**rowColorSetting**</span><br><code>RowColorSetting</code> | <span data-pagefind-ignore>The `rowColor` object: the row attribute whose values take colours, `name` where it names none, and the values given a colour of their own.</span> | [TreeSidebarMixin](../treesidebarmixin#getter-rowcolorsetting) |
| <span id="getter-baserowcolor">**baseRowColor**</span><br><code>RowColorSetting</code> | <span data-pagefind-ignore>The `rowColor` object this display's base declares, which a reset returns to and "is this the reader's" compares against.</span> | [TreeSidebarMixin](../treesidebarmixin#getter-baserowcolor) |
| <span id="getter-baserowdomain">**baseRowDomain**</span><br><code>readonly string[]</code> | <span data-pagefind-ignore>The `rows.domain` this display's base declares: the base arrangement a row palette deals over, so no reorder recolours a row.</span> | [TreeSidebarMixin](../treesidebarmixin#getter-baserowdomain) |
| <span id="getter-rowalias">**rowAlias**</span><br><code>RowAlias &#124; undefined</code> | <span data-pagefind-ignore>Overridable hook: the name a row also answers to, for a display whose rows stand for something named by another name (a variant display's haplotype rows, each answering to its sample). An order, a label, a colour and a focus written against the alias reach every row answering to it. None by default.</span> | [TreeSidebarMixin](../treesidebarmixin#getter-rowalias) |
| <span id="getter-unlistedrowssort">**unlistedRowsSort**</span><br><code>UnlistedRowsSort</code> | <span data-pagefind-ignore>Overridable hook: where the rows `rowOrder` does not list go, in the order they arrived by default.</span> | [TreeSidebarMixin](../treesidebarmixin#getter-unlistedrowssort) |
| <span id="getter-rowbanding">**rowBanding**</span><br><code>RowBanding &#124; undefined</code> | <span data-pagefind-ignore>Overridable hook: the attribute the rows stack in bands by and the bands listed first, or undefined, the default, for no bands.</span> | [TreeSidebarMixin](../treesidebarmixin#getter-rowbanding) |
| <span id="getter-rowfocuslineheight">**rowFocusLineHeight**</span><br><code>number</code> | <span data-pagefind-ignore>The line the "Showing N rows" chip takes above the first row while `rows.kept` narrows the rows, 0 while every row shows.</span> | [TreeSidebarMixin](../treesidebarmixin#getter-rowfocuslineheight) |
| <span id="getter-rowstopoffset">**rowsTopOffset**</span><br><code>number</code> | <span data-pagefind-ignore>Where the rows start in the display's box: under the display's own `rowsHeaderHeight` and the focus chip's line. Every row painter, hit test, label, tree and export places the rows from here.</span> | [TreeSidebarMixin](../treesidebarmixin#getter-rowstopoffset) |
| <span id="getter-guidetree">**guideTree**</span><br><code>HierarchyNode&lt;NewickNode&gt; &#124; undefined</code> | <span data-pagefind-ignore>`guideTreeNewick` parsed and rotated towards `rows.domain`; undefined while the display supplies none.</span> | [TreeSidebarMixin](../treesidebarmixin#getter-guidetree) |
| <span id="getter-guidetreehonoursdomain">**guideTreeHonoursDomain**</span><br><code>boolean</code> | <span data-pagefind-ignore>Whether the rotated guide tree lists `rows.domain`'s names in `rows.domain`'s order, which holds exactly when some rotation of it does.</span> | [TreeSidebarMixin](../treesidebarmixin#getter-guidetreehonoursdomain) |
| <span id="getter-rowtree">**rowTree**</span><br><code>string &#124; undefined</code> | <span data-pagefind-ignore>The tree the rows are arranged by, as newick: `rows.tree`, else the guide tree while `guideTreeHonoursDomain`. A reorder no rotation produces hides the guide tree, and a reset brings it back.</span> | [TreeSidebarMixin](../treesidebarmixin#getter-rowtree) |
| <span id="getter-roworder">**rowOrder**</span><br><code>readonly string[]</code> | <span data-pagefind-ignore>Overridable hook: the names the rows are placed by, `rows.domain` by default; MAF leads with a drawn tree's leaves.</span> | [TreeSidebarMixin](../treesidebarmixin#getter-roworder) |
| <span id="getter-expandedrows">**expandedRows**</span><br><code>S[]</code> | <span data-pagefind-ignore>`discoveredRows` through `expandRows`: the rows at the granularity drawn, before any arrangement.</span> | [TreeSidebarMixin](../treesidebarmixin#getter-expandedrows) |
| <span id="getter-sharespanel">**sharesPanel**</span><br><code>boolean</code> | <span data-pagefind-ignore>Overridable hook: whether the rows share one panel, so nothing but colour tells them apart. False by default.</span> | [TreeSidebarMixin](../treesidebarmixin#getter-sharespanel) |
| <span id="getter-rowcolorpaintsmarks">**rowColorPaintsMarks**</span><br><code>boolean</code> | <span data-pagefind-ignore>Overridable hook: whether a row's colour paints its data marks, which holds while nothing else colours them. True by default.</span> | [TreeSidebarMixin](../treesidebarmixin#getter-rowcolorpaintsmarks) |
| <span id="getter-rownoun">**rowNoun**</span><br><code>string</code> | <span data-pagefind-ignore>Overridable hook: what one row is called, which titles the row colour key where it lists the rows by name in a shared panel. "Row" by default, which only a display of its own that shares a panel would show; a wiggle overlay's rows are subtracks.</span> | [TreeSidebarMixin](../treesidebarmixin#getter-rownoun) |
| <span id="getter-internalrowfields">**internalRowFields**</span><br><code>readonly string[]</code> | <span data-pagefind-ignore>Overridable hook: the row fields that are a display's own plumbing, which the arrangement dialog never lists as a column.</span> | [TreeSidebarMixin](../treesidebarmixin#getter-internalrowfields) |
| <span id="getter-rowbandingnotices">**rowBandingNotices**</span><br><code>string[]</code> | <span data-pagefind-ignore>A line for the corner notice when rows have arrived and none carries the field `rowBanding` bands by, which then bands nothing. Each display spreads it into its `notices`.</span> | [TreeSidebarMixin](../treesidebarmixin#getter-rowbandingnotices) |
| <span id="getter-rowpalettedeals">**rowPaletteDeals**</span><br><code>boolean</code> | <span data-pagefind-ignore>Whether the palette deals each row a colour by name: only where the rows share one panel and their colour paints the marks.</span> | [TreeSidebarMixin](../treesidebarmixin#getter-rowpalettedeals) |
| <span id="getter-rowcolordealrows">**rowColorDealRows**</span><br><code>readonly S[]</code> | <span data-pagefind-ignore>The rows the palette deals over: `expandedRows` in the base arrangement, so no reorder, focus or relabel recolours a row.</span> | [TreeSidebarMixin](../treesidebarmixin#getter-rowcolordealrows) |
| <span id="getter-rowstylingiscustom">**rowStylingIsCustom**</span><br><code>boolean</code> | <span data-pagefind-ignore>Whether `rowColor` gives its field's values colours the config does not, so "Reset row order" is offered for a recolour too: whether `rowColorResetTarget` has anything to write. What the rows are coloured by is no arrangement, so picking it is never custom.</span> | [TreeSidebarMixin](../treesidebarmixin#getter-rowstylingiscustom) |
| <span id="getter-rowcolorchoice">**rowColorChoice**</span><br><code>string</code> | <span data-pagefind-ignore>What the rows are coloured by, as the arrangement dialog and a menu offer it: '' for none dealt, `name` for a palette colour each, or an attribute.</span> | [TreeSidebarMixin](../treesidebarmixin#getter-rowcolorchoice) |
| <span id="getter-rowcolorattribute">**rowColorAttribute**</span><br><code>string</code> | <span data-pagefind-ignore>The attribute the rows are coloured by, or '' by `name`.</span> | [TreeSidebarMixin](../treesidebarmixin#getter-rowcolorattribute) |
| <span id="getter-dealtrowcolors">**dealtRowColors**</span><br><code>ReadonlyMap&lt;string, string&gt;</code> | <span data-pagefind-ignore>The colour each value of the config's `rowColor` field takes, listed pairs first and then in the order dealt.</span> | [TreeSidebarMixin](../treesidebarmixin#getter-dealtrowcolors) |
| <span id="getter-rowcolorattributesoffered">**rowColorAttributesOffered**</span><br><code>readonly string[]</code> | <span data-pagefind-ignore>The attributes a reader can colour the rows by: `rowColorFields`, and the current one where the rows lack it, so it still shows as chosen.</span> | [TreeSidebarMixin](../treesidebarmixin#getter-rowcolorattributesoffered) |
| <span id="getter-resolvedrowcolors">**resolvedRowColors**</span><br><code>ReadonlyMap&lt;string, string&gt;</code> | <span data-pagefind-ignore>Each row's colour, by name: its `rowColor` entry, else its own `color`, else the palette's where `rowPaletteDeals`. The one answer every display paints a row's colour from.</span> | [TreeSidebarMixin](../treesidebarmixin#getter-resolvedrowcolors) |
| <span id="getter-rowarrangementiscustom">**rowArrangementIsCustom**</span><br><code>boolean</code> | <span data-pagefind-ignore>Whether the arrangement differs from what the config declares — what "Reset row order" is offered on.</span> | [TreeSidebarMixin](../treesidebarmixin#getter-rowarrangementiscustom) |
| <span id="getter-editablesources">**editableSources**</span><br><code>S[]</code> | <span data-pagefind-ignore>The rows in the reader's arrangement, each with its resolved `rowColor`, and with no focus or band: the list the arrangement dialog edits, so a submit writes back only what the reader chose. `expandedRows` itself while nothing is arranged or coloured.</span> | [TreeSidebarMixin](../treesidebarmixin#getter-editablesources) |
| <span id="getter-rowcolorkeyinputs">**rowColorKeyInputs**</span><br><code>RowColorKeyInputs</code> | <span data-pagefind-ignore>What the row colour key and its focus read of the colours.</span> | [TreeSidebarMixin](../treesidebarmixin#getter-rowcolorkeyinputs) |
| <span id="getter-rowcolorscales">**rowColorScales**</span><br><code>CategoricalScale[]</code> | <span data-pagefind-ignore>The row colour key, which every display spreads into its `colorScales`: one scale titled by the `rowColor` field, or none where it has no entries. Its entries (`rowColorKeyEntries`) show where the labels cannot name the colours: by an attribute, or by name in a shared panel. By name on stacked rows the labels are the key.</span> | [TreeSidebarMixin](../treesidebarmixin#getter-rowcolorscales) |
| <span id="getter-clusterablesources">**clusterableSources**</span><br><code>S[]</code> | <span data-pagefind-ignore>Overridable hook: `editableSources` narrowed to the focus, the rows a clustering run clusters, and deliberately not the display's decorated `sources`, whose palette and band a run has no business writing back. MAF applies a focus as given on a track that discovers its species.</span> | [TreeSidebarMixin](../treesidebarmixin#getter-clusterablesources) |
| <span id="getter-parsedtree">**parsedTree**</span><br><code>HierarchyNode&lt;NewickNode&gt; &#124; undefined</code> | <span data-pagefind-ignore>`rowTree` parsed. A run rotated its tree in the same write as the order it produced; a tree that arrived as data rotates towards `rows.domain` here, and the guide tree is `guideTree`'s parse.</span> | [TreeSidebarMixin](../treesidebarmixin#getter-parsedtree) |
| <span id="getter-root">**root**</span><br><code>HierarchyNode&lt;NewickNode&gt; &#124; undefined</code> | <span data-pagefind-ignore>The parsed tree narrowed to the focus.</span> | [TreeSidebarMixin](../treesidebarmixin#getter-root) |
| <span id="getter-bandedrows">**bandedRows**</span><br><code>{ rows: S[]; bands: RowBand[]; }</code> | <span data-pagefind-ignore>`bandedSources` and `rowBands`, from one pass over the rows.</span> | [TreeSidebarMixin](../treesidebarmixin#getter-bandedrows) |
| <span id="getter-bandedsources">**bandedSources**</span><br><code>S[]</code> | <span data-pagefind-ignore>`clusterableSources` stacked in bands by `rowBanding`, each band's rows in their arranged order: the rows each display paints its palette over. `clusterableSources` itself while nothing bands.</span> | [TreeSidebarMixin](../treesidebarmixin#getter-bandedsources) |
| <span id="getter-rowbands">**rowBands**</span><br><code>readonly RowBand[]</code> | <span data-pagefind-ignore>Each band's value, label and the rows it spans in `bandedSources`; none while nothing bands.</span> | [TreeSidebarMixin](../treesidebarmixin#getter-rowbands) |
| <span id="getter-clusterpartition">**clusterPartition**</span><br><code>string[][] &#124; undefined</code> | <span data-pagefind-ignore>The names of the rows a clustering run clusters, by band, so each band clusters apart and the run writes one forest; undefined while fewer than two bands stack.</span> | [TreeSidebarMixin](../treesidebarmixin#getter-clusterpartition) |
| <span id="getter-treelessbandcount">**treelessBandCount**</span><br><code>number</code> | <span data-pagefind-ignore>How many bands the tree draws no dendrogram for, because it holds no clade whose leaves are that band's rows in order; 0 with no tree or no bands.</span> | [TreeSidebarMixin](../treesidebarmixin#getter-treelessbandcount) |
| <span id="getter-treehasbranchlengths">**treeHasBranchLengths**</span><br><code>boolean</code> | <span data-pagefind-ignore>Whether the tree carries merge heights, so a dendrogram layout differs from the cladogram; gates the "Tree branch lengths" toggle.</span> | [TreeSidebarMixin](../treesidebarmixin#getter-treehasbranchlengths) |
| <span id="getter-rowheight">**rowHeight**</span><br><code>number</code> | <span data-pagefind-ignore>Raw per-row height setting: `0` is fit-to-display-height, any positive value is a fixed px height. The resolved value is `effectiveRowHeight` — consumers read that, never this. On the config rather than the display snapshot for the same reason `height` is: the config node outlives the display instance, so a fixed height survives unticking and reticking the track.</span> | [RowHeightMixin](../rowheightmixin#getter-rowheight) |

## Methods

<!-- prettier-ignore -->
| Member | Description | Defined by |
| --- | --- | --- |
| <span id="method-resolveadapteroptions">**resolveAdapterOptions**</span><br><span class="cell-more"><button type="button" class="cell-more-trigger"><code>({ ld }: { ld: string; }, region: Region, signal: AbortSignal)…</code></button><dialog class="cell-dialog"><form method="dialog"><button class="cell-dialog-close" aria-label="Close">✕</button></form><pre><code>({ ld }: { ld: string; }, region: Region, signal: AbortSignal) =&gt; Promise&lt;{ ld: LdJoin; } &#124; undefined&gt;</code></pre></dialog></span> | The LD join as one region's fetch asks the adapter for it. | LinearManhattanDisplay |
| <span id="method-trackmenuitems">**trackMenuItems**</span><br><code>() =&gt; MenuItem[]</code> |  | LinearManhattanDisplay |
| <span id="method-contextmenuitems">**contextMenuItems**</span><br><code>() =&gt; MenuItem[]</code> |  | LinearManhattanDisplay |
| <span id="method-rpcprops">**rpcProps**</span><br><span class="cell-more"><button type="button" class="cell-more-trigger"><code>() =&gt; { layers: LayerRequest[]; transform: TransformStep[]; fac…</code></button><dialog class="cell-dialog"><form method="dialog"><button class="cell-dialog-close" aria-label="Close">✕</button></form><pre><code>() =&gt; { layers: LayerRequest[]; transform: TransformStep[]; facet?: FacetSpec &#124; undefined; opts?: object &#124; undefined; }</code></pre></dialog></span> | <span data-pagefind-ignore>the fetch inputs SettingsInvalidate watches: each mark's encoding and lanes, and the filters as transform steps, all evaluated in the worker, and the `adapterOptions` each region resolves</span> | [LinearMarkDisplay](../linearmarkdisplay#method-rpcprops) |
| <span id="method-plotproblems">**plotProblems**</span><br><code>(plot: Plot) =&gt; string[]</code> | <span data-pagefind-ignore>What a draft plot would report once applied, as the lines `notices` carries, without touching the display; one a config file would refuse throws the refusal.</span> | [LinearMarkDisplay](../linearmarkdisplay#method-plotproblems) |
| <span id="method-liftmarkplot">**liftMarkPlot**</span><br><code>(plot: Plot) =&gt; MarkPlotSettings</code> | <span data-pagefind-ignore>A draft as the rule list reads it, merged over `plot` and lifted by the config schema, throwing what a config file would be refused for. Nothing on this display is touched.</span> | [LinearMarkDisplay](../linearmarkdisplay#method-liftmarkplot) |
| <span id="method-svglegendwidth">**svgLegendWidth**</span><br><code>() =&gt; number</code> | <span data-pagefind-ignore>Overridable hook (default 0): the width the LGV export reserves beside the plot for this legend. A display whose plot fills its band — the contact matrix, the LD triangle — answers `svgLegendGutterWidth(self)` so the key does not cover it.</span> | [LegendMixin](../legendmixin#method-svglegendwidth) |
| <span id="method-colorscalesin">**colorScalesIn**</span><br><code>(_palette: JBrowsePalette) =&gt; ColorScale[]</code> | <span data-pagefind-ignore>Overridable hook (default `colorScales`): the scales in another theme, the SVG export's, which need not be the session's. Only a display whose key takes colors from the theme answers it.</span> | [LegendMixin](../legendmixin#method-colorscalesin) |
| <span id="method-legendspecin">**legendSpecIn**</span><br><code>(palette: JBrowsePalette) =&gt; LegendSpec</code> | <span data-pagefind-ignore>`legendSpec` in the SVG export's theme.</span> | [LegendMixin](../legendmixin#method-legendspecin) |
| <span id="method-renderingprops">**renderingProps**</span><br><span class="cell-more"><button type="button" class="cell-more-trigger"><code>() =&gt; { displayModel: ModelInstanceTypeProps&lt;{ id: IOptionalITy…</code></button><dialog class="cell-dialog"><form method="dialog"><button class="cell-dialog-close" aria-label="Close">✕</button></form><pre><code>() =&gt; { displayModel: ModelInstanceTypeProps&lt;{ id: IOptionalIType&lt;…&gt;; type: ISimpleType&lt;string&gt;; }&gt; &amp; { ...; } &amp; { ...; } &amp; { ...; } &amp; IStateTreeNode&lt;...&gt;; }</code></pre></dialog></span> | <span data-pagefind-ignore>props passed to the renderer's React "Rendering" component. these are client-side only and never sent to the worker. includes displayModel and callbacks</span> | [BaseDisplay](../basedisplay#method-renderingprops) |
| <span id="method-liftplot">**liftPlot**</span><br><code>(draft: Plot) =&gt; AnyConfigurationModel</code> | <span data-pagefind-ignore>A draft as the config would hold it, merged over `plot`, throwing what a config file would be refused for. Nothing on the display changes.</span> | [BaseDisplay](../basedisplay#method-liftplot) |
| <span id="method-plotwrites">**plotWrites**</span><br><code>(draft: Plot) =&gt; Record&lt;string, unknown&gt;</code> | <span data-pagefind-ignore>What applying a draft would write, by setting: the lifted value where it differs from `plot`, `null` where it resets one. Throws a refusal.</span> | [BaseDisplay](../basedisplay#method-plotwrites) |
| <span id="method-regionhasdata">**regionHasData**</span><br><code>(displayedRegionIndex: number) =&gt; boolean</code> | <span data-pagefind-ignore>Overridable hook: whether the display can draw what this region is marked loaded over, at the zoom the view has.<br><br>The default answers off the store — an entry a fetch committed carries what it stored — and off the payload's `zoomRange` where the adapter declared one (`BaseFeatureDataAdapter.getZoomRange`): a BigWig tier answers a band of zooms, and the region reads as stale when the view leaves it. A payload carrying no range answers at every zoom.<br><br>What survives an override is the question the store cannot answer: **which of several held payloads answers**. MAF caches a summary tier and a detail tier side by side under one `displayedRegionIndex`, so crossing the threshold inside an already-loaded region changes which map has to answer. The multi-row display's override survives for the auto-partition reconciliation (`regionHasPinnedData`).<br><br>A view, not an action, so the reads it makes register as dependencies of `FetchVisibleRegions`.</span> | [MultiRegionDisplayMixin](../multiregiondisplaymixin#method-regionhasdata) |
| <span id="method-iscachevalid">**isCacheValid**</span><br><code>(displayedRegionIndex: number) =&gt; boolean</code> | <span data-pagefind-ignore>Whether the data held for a region still answers the current view. Not a hook a display fills: a display states its rule as `zoomFetchArgs` (what a fetch now would send the worker) and `regionHasData` (does what the last one stored still answer), and this compares the whole input set against the one the region was fetched under.</span> | [MultiRegionDisplayMixin](../multiregiondisplaymixin#method-iscachevalid) |
| <span id="method-resolvedbytelimit">**resolvedByteLimit**</span><br><code>() =&gt; number &#124; undefined</code> | <span data-pagefind-ignore>The budget the worker enforces and the banner compares against — the one spelling of that pair. Undefined when the gate may not act.</span> | [RegionTooLargeMixin](../regiontoolargemixin#method-resolvedbytelimit) |
| <span id="method-gatefetchstate">**gateFetchState**</span><br><code>() =&gt; GateFetchState</code> | <span data-pagefind-ignore>The gate as it stands for a fetch about to be issued. Calling it is the capture, which is why it is a method.</span> | [RegionTooLargeMixin](../regiontoolargemixin#method-gatefetchstate) |
| <span id="method-expandrows">**expandRows**</span><br><code>(rows: S[]) =&gt; S[]</code> | <span data-pagefind-ignore>Overridable hook: the discovered rows as the rows drawn, the rows themselves by default; a variant display's phased mode expands each sample to its haplotypes.</span> | [TreeSidebarMixin](../treesidebarmixin#method-expandrows) |
| <span id="method-svgsidebarwidth">**svgSidebarWidth**</span><br><code>(text?: ExportTextStyle &#124; undefined) =&gt; number</code> | <span data-pagefind-ignore>Px the SVG export reserves left of the track for `svgSidebar`, measured in the export's text.</span> | [TreeSidebarMixin](../treesidebarmixin#method-svgsidebarwidth) |
| <span id="method-rowband">**rowBand**</span><br><code>(row: S) =&gt; string</code> | <span data-pagefind-ignore>Overridable hook: the band a row stacks in while `rowBanding` is set, by default its value of the banding attribute, '' for none.</span> | [TreeSidebarMixin](../treesidebarmixin#method-rowband) |
| <span id="method-dealtrowcolorsfor">**dealtRowColorsFor**</span><br><span class="cell-more"><button type="button" class="cell-more-trigger"><code>(setting: Partial&lt;RowColorSetting&gt;) =&gt; ReadonlyMap&lt;string, stri…</code></button><dialog class="cell-dialog"><form method="dialog"><button class="cell-dialog-close" aria-label="Close">✕</button></form><pre><code>(setting: Partial&lt;RowColorSetting&gt;) =&gt; ReadonlyMap&lt;string, string&gt;</code></pre></dialog></span> | <span data-pagefind-ignore>The colour each value takes under `setting` (`dealtValueColors`), which the arrangement dialog shows before it writes the setting.</span> | [TreeSidebarMixin](../treesidebarmixin#method-dealtrowcolorsfor) |
| <span id="method-rowcolorfor">**rowColorFor**</span><br><code>(choice: string) =&gt; RowColorSetting</code> | <span data-pagefind-ignore>The `rowColor` object `choice` starts from (`startingRowColor`): the current object's where it shows that choice, else the config's.</span> | [TreeSidebarMixin](../treesidebarmixin#method-rowcolorfor) |
| <span id="method-roworderwilldroptree">**rowOrderWillDropTree**</span><br><code>(next: readonly { name: string; }[]) =&gt; boolean</code> | <span data-pagefind-ignore>Whether the arrangement dialog's submit of `next` drops the tree: an order that moves no row is not written, so it drops nothing, and the guide tree drops only for an order no rotation of it lists.</span> | [TreeSidebarMixin](../treesidebarmixin#method-roworderwilldroptree) |

## Actions

<!-- prettier-ignore -->
| Member | Description | Defined by |
| --- | --- | --- |
| <span id="action-setindexsnp">**setIndexSnp**</span><br><code>(snp?: string &#124; undefined) =&gt; void</code> |  | LinearManhattanDisplay |
| <span id="action-setldcoloring">**setLdColoring**</span><br><code>(on: boolean) =&gt; void</code> | Colour each point by its r² to the index SNP, the index a pink diamond over them, or take that colouring off, leaving every other member and mark of the plot as it was (`withLd`, `withoutLd`). | LinearManhattanDisplay |
| <span id="action-colorbyldtohit">**colorByLdToHit**</span><br><code>(hit: { refName: string; start: number; }) =&gt; void</code> | Right-click "Color by LD to this SNP": colour by r² to the clicked point and pin it as the index, in one action so the fetch inputs settle once. | LinearManhattanDisplay |
| <span id="action-usetophitasindex">**useTopHitAsIndex**</span><br><code>() =&gt; void</code> | Release a pinned index back to following the top hit. | LinearManhattanDisplay |
| <span id="action-setsourcelisting">**setSourceListing**</span><br><code>(read: AdapterRead&lt;RowSourceListing &#124; undefined&gt;) =&gt; void</code> |  | [LinearMarkDisplay](../linearmarkdisplay#action-setsourcelisting) |
| <span id="action-setrowproportion">**setRowProportion**</span><br><code>(n: number) =&gt; void</code> | <span data-pagefind-ignore>Write every span mark's `rowProportion`.</span> | [LinearMarkDisplay](../linearmarkdisplay#action-setrowproportion) |
| <span id="action-setfittoheight">**setFitToHeight**</span><br><code>() =&gt; void</code> | <span data-pagefind-ignore>Fit the rows to the plot. The `height` getter is the slot itself, so nothing needs seeding on the way in.</span> | [LinearMarkDisplay](../linearmarkdisplay#action-setfittoheight) |
| <span id="action-selectfeature">**selectFeature**</span><br><code>(hit: MarkHitInfo) =&gt; void</code> | <span data-pagefind-ignore>Open the feature widget on the read, the bin or the run a hit drew, inside its facet section, through `selectEncodedFeature`. A bin of the density sidecar opens nothing, its region holding no request — the read-back is the download the gate refused.</span> | [LinearMarkDisplay](../linearmarkdisplay#action-selectfeature) |
| <span id="action-setrpcdata">**setRpcData**</span><br><code>(idx: number, data: EncodedLayersResult, region: Region) =&gt; void</code> | <span data-pagefind-ignore>Stage a region as fetched, with this display's payload layout.</span> | [LinearMarkDisplay](../linearmarkdisplay#action-setrpcdata) |
| <span id="action-setfacetdomain">**setFacetDomain**</span><br><code>(domain: string[]) =&gt; void</code> | <span data-pagefind-ignore>The Sections menu's reorder lands on the declaration.</span> | [LinearMarkDisplay](../linearmarkdisplay#action-setfacetdomain) |
| <span id="action-setfacetfield">**setFacetField**</span><br><code>(field: string) =&gt; void</code> | <span data-pagefind-ignore>A field's own bands, in their sorted order: the outgoing field's domain goes with it, and the facet's steps stay.</span> | [LinearMarkDisplay](../linearmarkdisplay#action-setfacetfield) |
| <span id="action-splitbyplotrows">**splitByPlotRows**</span><br><code>(fields: PlotFields) =&gt; void</code> | <span data-pagefind-ignore>A row per source where the adapter lists several and nothing splits the features yet: one value per row is the row axis, and a facet is for bands holding more than one row.</span> | [LinearMarkDisplay](../linearmarkdisplay#action-splitbyplotrows) |
| <span id="action-sortrowsbyvalueat">**sortRowsByValueAt**</span><br><code>(refName: string, pos: number) =&gt; boolean</code> | <span data-pagefind-ignore>Order the rows by the value each stands at over (refName, pos), highest first, off the loaded regions with no refetch; false where no loaded region covers the column.</span> | [LinearMarkDisplay](../linearmarkdisplay#action-sortrowsbyvalueat) |
| <span id="action-setfilter">**setFilter**</span><br><code>(filters?: string[] &#124; undefined) =&gt; void</code> | <span data-pagefind-ignore>Write the `filter` slot; undefined returns it to what the track's config declares.</span> | [LinearMarkDisplay](../linearmarkdisplay#action-setfilter) |
| <span id="action-setplotfields">**setPlotFields**</span><br><code>(fields?: PlotFields &#124; undefined, error?: unknown) =&gt; void</code> |  | [LinearMarkDisplay](../linearmarkdisplay#action-setplotfields) |
| <span id="action-setplotdefaultchecked">**setPlotDefaultChecked**</span><br><code>() =&gt; void</code> |  | [LinearMarkDisplay](../linearmarkdisplay#action-setplotdefaultchecked) |
| <span id="action-setplotfieldspromise">**setPlotFieldsPromise**</span><br><span class="cell-more"><button type="button" class="cell-more-trigger"><code>(promise?: Promise&lt;PlotFields&gt; &#124; undefined, scanned?: Region[])…</code></button><dialog class="cell-dialog"><form method="dialog"><button class="cell-dialog-close" aria-label="Close">✕</button></form><pre><code>(promise?: Promise&lt;PlotFields&gt; &#124; undefined, scanned?: Region[]) =&gt; void</code></pre></dialog></span> |  | [LinearMarkDisplay](../linearmarkdisplay#action-setplotfieldspromise) |
| <span id="action-ensureplotfields">**ensurePlotFields**</span><br><code>() =&gt; Promise&lt;PlotFields&gt;</code> | <span data-pagefind-ignore>Scan the features for the fields a plot can read. A scan that found a numeric field answers for the display's life; one that found none answers only for the window it read, and a failed one for nothing. A scan a newer one aborted answers with the newer one's fields.</span> | [LinearMarkDisplay](../linearmarkdisplay#action-ensureplotfields) |
| <span id="action-openplotdialog">**openPlotDialog**</span><br><code>(seed?: Plot &#124; undefined) =&gt; void</code> | <span data-pagefind-ignore>Open the plot as text, over the same settings the controls write. `seed` overlays a setting the caller has in hand but has not applied.</span> | [LinearMarkDisplay](../linearmarkdisplay#action-openplotdialog) |
| <span id="action-setpointsize">**setPointSize**</span><br><code>(val?: number &#124; undefined) =&gt; void</code> | <span data-pagefind-ignore>Write every point mark's `encoding.size` number; undefined returns each to the default.</span> | [LinearMarkDisplay](../linearmarkdisplay#action-setpointsize) |
| <span id="action-pindistinctshapes">**pinDistinctShapes**</span><br><code>() =&gt; void</code> | <span data-pagefind-ignore>The categorical analogue of the min/max dialog's "Use current range": every value a colliding shape key lists goes into the shape's `domain`, in key order after what it already lists, so each takes a shape of its own.</span> | [LinearMarkDisplay](../linearmarkdisplay#action-pindistinctshapes) |
| <span id="action-openmarkplotdialog">**openMarkPlotDialog**</span><br><code>(seed?: Plot &#124; undefined) =&gt; void</code> | <span data-pagefind-ignore>Open the plot as controls: every mark, the channels its type reads, and what the rules say under each. The field scan runs behind it, as it does for the field dialog.</span> | [LinearMarkDisplay](../linearmarkdisplay#action-openmarkplotdialog) |
| <span id="action-openplotform">**openPlotForm**</span><br><code>(draft: Plot) =&gt; void</code> | <span data-pagefind-ignore>The text box's "Back to form", opened on its draft.</span> | [LinearMarkDisplay](../linearmarkdisplay#action-openplotform) |
| <span id="action-fetchneeded">**fetchNeeded**</span><br><code>(needed: IndexedRegion[]) =&gt; Promise&lt;void&gt;</code> |  | [LinearMarkDisplay](../linearmarkdisplay#action-fetchneeded) |
| <span id="action-startrenderingbackend">**startRenderingBackend**</span><br><code>(backend: MarkRenderingBackend) =&gt; void</code> | <span data-pagefind-ignore>identity encode — the stored payload is what the backend uploads</span> | [LinearMarkDisplay](../linearmarkdisplay#action-startrenderingbackend) |
| <span id="action-rendersvg">**renderSvg**</span><br><span class="cell-more"><button type="button" class="cell-more-trigger"><code>(opts?: ExportSvgDisplayOptions &#124; undefined) =&gt; Promise&lt;ReactEl…</code></button><dialog class="cell-dialog"><form method="dialog"><button class="cell-dialog-close" aria-label="Close">✕</button></form><pre><code>(opts?: ExportSvgDisplayOptions &#124; undefined) =&gt; Promise&lt;ReactElement&lt;unknown, string &#124; JSXElementConstructor&lt;any&gt;&gt; &#124; Iterable&lt;...&gt; &#124; AwaitedReactNode&gt;</code></pre></dialog></span> |  | [LinearMarkDisplay](../linearmarkdisplay#action-rendersvg) |
| <span id="action-fetchcoarsetier">**fetchCoarseTier**</span><br><span class="cell-more"><button type="button" class="cell-more-trigger"><code>(read: CoarseTierRead, ctx: FetchContext) =&gt; Promise&lt;CoarseTier…</code></button><dialog class="cell-dialog"><form method="dialog"><button class="cell-dialog-close" aria-label="Close">✕</button></form><pre><code>(read: CoarseTierRead, ctx: FetchContext) =&gt; Promise&lt;CoarseTierResult&lt;FeatureDensity&gt;&gt;</code></pre></dialog></span> |  | [DensityTierMixin](../densitytiermixin#action-fetchcoarsetier) |
| <span id="action-setcoarsetier">**setCoarseTier**</span><br><code>(entries: CoarseTierEntry&lt;P&gt;[], read: CoarseTierRead) =&gt; void</code> |  | [CoarseTierMixin](../coarsetiermixin#action-setcoarsetier) |
| <span id="action-clearcoarsetier">**clearCoarseTier**</span><br><code>() =&gt; void</code> |  | [CoarseTierMixin](../coarsetiermixin#action-clearcoarsetier) |
| <span id="action-setcoarsetierloading">**setCoarseTierLoading**</span><br><code>(loading: boolean) =&gt; void</code> |  | [CoarseTierMixin](../coarsetiermixin#action-setcoarsetierloading) |
| <span id="action-setscaletype">**setScaleType**</span><br><code>(scaleType: string) =&gt; void</code> |  | [ScoreScaleMixin](../scorescalemixin#action-setscaletype) |
| <span id="action-setscalezero">**setScaleZero**</span><br><code>(zero: boolean) =&gt; void</code> |  | [ScoreScaleMixin](../scorescalemixin#action-setscalezero) |
| <span id="action-setdomainquantile">**setDomainQuantile**</span><br><code>(quantile: number) =&gt; void</code> |  | [ScoreScaleMixin](../scorescalemixin#action-setdomainquantile) |
| <span id="action-setminscore">**setMinScore**</span><br><code>(val?: number &#124; undefined) =&gt; void</code> |  | [ScoreScaleMixin](../scorescalemixin#action-setminscore) |
| <span id="action-setmaxscore">**setMaxScore**</span><br><code>(val?: number &#124; undefined) =&gt; void</code> |  | [ScoreScaleMixin](../scorescalemixin#action-setmaxscore) |
| <span id="action-setautoscalegroup">**setAutoscaleGroup**</span><br><code>(group?: string &#124; undefined) =&gt; void</code> |  | [ScoreScaleMixin](../scorescalemixin#action-setautoscalegroup) |
| <span id="action-setgrid">**setGrid**</span><br><code>(grid: boolean) =&gt; void</code> |  | [ScoreScaleMixin](../scorescalemixin#action-setgrid) |
| <span id="action-setscorerules">**setScoreRules**</span><br><code>(rules: (number &#124; ValueScaleRule)[]) =&gt; void</code> | <span data-pagefind-ignore>Replaces `scales.y.rules` whole, each entry in a form the config takes: a number, or `{ value, color, label }`.</span> | [ScoreScaleMixin](../scorescalemixin#action-setscorerules) |
| <span id="action-setshowlegend">**setShowLegend**</span><br><code>(arg: boolean) =&gt; void</code> | <span data-pagefind-ignore>Writes the slot, and showing the legend again restores the sections closed inside it.</span> | [LegendMixin](../legendmixin#action-setshowlegend) |
| <span id="action-dismisslegendsection">**dismissLegendSection**</span><br><code>(id: string) =&gt; void</code> | <span data-pagefind-ignore>Close one section of the legend, leaving the others up.</span> | [LegendMixin](../legendmixin#action-dismisslegendsection) |
| <span id="action-opencontextmenu">**openContextMenu**</span><br><code>(info: Info) =&gt; void</code> |  | [ContextMenuMixin](../contextmenumixin#action-opencontextmenu) |
| <span id="action-closecontextmenu">**closeContextMenu**</span><br><code>() =&gt; void</code> |  | [ContextMenuMixin](../contextmenumixin#action-closecontextmenu) |
| <span id="action-sethoveredfeature">**setHoveredFeature**</span><br><code>(hit?: T &#124; undefined) =&gt; void</code> |  | [StoredHoverMixin](../storedhovermixin#action-sethoveredfeature) |
| <span id="action-clearhoveredfeature">**clearHoveredFeature**</span><br><code>() =&gt; void</code> |  | [StoredHoverMixin](../storedhovermixin#action-clearhoveredfeature) |
| <span id="action-hidegroup">**hideGroup**</span><br><code>(key: string) =&gt; void</code> | <span data-pagefind-ignore>Drop a section from the stack. Reversed by `showAllGroups`, which the "Show..." menu offers while anything is hidden, since a hidden section draws no chip of its own to come back from.</span> | [HiddenGroupsMixin](../hiddengroupsmixin#action-hidegroup) |
| <span id="action-showallgroups">**showAllGroups**</span><br><code>() =&gt; void</code> |  | [HiddenGroupsMixin](../hiddengroupsmixin#action-showallgroups) |
| <span id="action-dropgroupstate">**dropGroupState**</span><br><code>() =&gt; void</code> | <span data-pagefind-ignore>Forget every hidden section.</span> | [HiddenGroupsMixin](../hiddengroupsmixin#action-dropgroupstate) |
| <span id="action-setstatusmessage">**setStatusMessage**</span><br><code>(status?: RpcStatus &#124; undefined) =&gt; void</code> |  | [BaseDisplay](../basedisplay#action-setstatusmessage) |
| <span id="action-seterror">**setError**</span><br><code>(error?: unknown) =&gt; void</code> |  | [BaseDisplay](../basedisplay#action-seterror) |
| <span id="action-reload">**reload**</span><br><code>() =&gt; void</code> | <span data-pagefind-ignore>base display reload does nothing, see specialized displays for details</span> | [BaseDisplay](../basedisplay#action-reload) |
| <span id="action-applydisplaysettings">**applyDisplaySettings**</span><br><span class="cell-more"><button type="button" class="cell-more-trigger"><code>(settings: Record&lt;string, unknown&gt;, options?: { allowSetters?:…</code></button><dialog class="cell-dialog"><form method="dialog"><button class="cell-dialog-close" aria-label="Close">✕</button></form><pre><code>(settings: Record&lt;string, unknown&gt;, options?: { allowSetters?: boolean &#124; undefined; } &#124; undefined) =&gt; { applied: string[]; unapplied: UnappliedSetting[]; failed: { ...; }[]; }</code></pre></dialog></span> | <span data-pagefind-ignore>Apply a set of display settings to the live display, and report which were applied. Each key runs through the display config schema's `preProcessSnapshot` (shorthand expansions and legacy-key migrations, as `showTrackGeneric` applies to a session spec's inline track keys), then writes the matching config slot. A key naming a sub-schema (`facet`, `color`) replaces the whole object, its string shorthand lifted by that schema, and `null` clears it. Keys that are not slots come back in `unapplied` as `{ key, reason }`, so a caller can tell a misspelling from a key that has an action instead of a slot.<br><br>`allowSetters` also routes a non-slot key to a single-argument action named `set<Key>`. It is off by default because session specs, share links and embeds pass untyped JSON here, and a default fallback would let them call internal setters (`setError`, `setScrollTop`, ...) and call multi-argument setters with one argument. A caller that wants a specific action can call it directly.<br><br>A key whose write threw is reported in `failed`. Only `failed` means the caller passed a bad value. `unapplied` needs the caller's own context to read: `showTrackGeneric` spreads the same settings into the display's snapshot, so a declared prop (`resolution`) has already landed by the time it reports here, while the restyle path spreads nothing and every entry there did nothing.<br><br>A per-key error does not abort the remaining keys. A caller mid-`showTrack` has already pushed the track, and one rejected value should not leave it half-configured.</span> | [BaseDisplay](../basedisplay#action-applydisplaysettings) |
| <span id="action-applyplot">**applyPlot**</span><br><code>(draft: Plot) =&gt; void</code> | <span data-pagefind-ignore>Write a draft over `plot`: each setting it changes is replaced whole, so a member left out of an object goes back to its default, and `null` resets the setting. A draft the schema refuses, or naming a setting outside the plot, throws before anything is written.</span> | [BaseDisplay](../basedisplay#action-applyplot) |
| <span id="action-setscrolltop">**setScrollTop**</span><br><code>(scrollTop: number) =&gt; void</code> |  | [TrackHeightMixin](../trackheightmixin#action-setscrolltop) |
| <span id="action-setheight">**setHeight**</span><br><code>(displayHeight: number) =&gt; number</code> |  | [TrackHeightMixin](../trackheightmixin#action-setheight) |
| <span id="action-resizeheight">**resizeHeight**</span><br><code>(distance: number) =&gt; number</code> |  | [TrackHeightMixin](../trackheightmixin#action-resizeheight) |
| <span id="action-expandtocontentheight">**expandToContentHeight**</span><br><code>() =&gt; number</code> | <span data-pagefind-ignore>Grow the track by the content it is hiding, for the resize handle's double click. Goes through `resizeHeight` so grow mode's override leaves grow first.</span> | [TrackHeightMixin](../trackheightmixin#action-expandtocontentheight) |
| <span id="action-setloadedregion">**setLoadedRegion**</span><br><span class="cell-more"><button type="button" class="cell-more-trigger"><code>(displayedRegionIndex: number, region: Region, payload: {} &#124; un…</code></button><dialog class="cell-dialog"><form method="dialog"><button class="cell-dialog-close" aria-label="Close">✕</button></form><pre><code>(displayedRegionIndex: number, region: Region, payload: {} &#124; undefined, fetchInputs?: FetchInputs) =&gt; void</code></pre></dialog></span> | <span data-pagefind-ignore>The raw write behind `ctx.commitRegion`, and **not what a fetch should call**. A display naming its span itself is the bug this family spent a release fixing, and the context gives a fetch no way to express it — see RegionFetchContext. Direct callers are tests staging an already-loaded display.<br><br>The payload is named on every call, `undefined` included: this write replaces the whole record, so a re-stamp that left it off dropped the data a test had staged one line earlier, and the failure surfaced as a reader throwing three layers away. A test stages a claim with nothing behind it by saying so.<br><br>An action so callers after an async boundary stay in MST strict mode. Stamps the region with the fetch key its data came back under. `fetchRegions` passes the key it captured before issuing the RPC; the default reads it *now*, which is right for a caller holding the region already and wrong for anything resuming after an await, where the viewport may have moved under the fetch.</span> | [MultiRegionDisplayMixin](../multiregiondisplaymixin#action-setloadedregion) |
| <span id="action-evictregionstore">**evictRegionStore**</span><br><code>(keep: ReadonlySet&lt;number&gt;) =&gt; void</code> | <span data-pagefind-ignore>The store's bound. Drops the entries a fetch can no longer be about: an index outside the view's buffered viewport, once the store is over `MAX_STORED_REGIONS`, oldest first.<br><br>One rule for every display, where canvas hand-rolled `pruneRpcDataMapToVisible` (prune to the buffer on every fetch) and every other display had no bound at all beyond `displayedRegions.length`. That count is the contig count, so a fragmented assembly was effectively unbounded. The cap lets a pan back onto a recently-visited region draw immediately, which the prune-to-buffer rule did not.</span> | [MultiRegionDisplayMixin](../multiregiondisplaymixin#action-evictregionstore) |
| <span id="action-droploadedregion">**dropLoadedRegion**</span><br><code>(displayedRegionIndex: number) =&gt; void</code> | <span data-pagefind-ignore>Forget one region — for a display pruning what has scrolled off screen.</span> | [MultiRegionDisplayMixin](../multiregiondisplaymixin#action-droploadedregion) |
| <span id="action-cleardisplayspecificdata">**clearDisplaySpecificData**</span><br><code>() =&gt; void</code> | <span data-pagefind-ignore>Overridable hook (no-op base): drop what this display holds beside the store — a second store of its own, a verdict about the viewport that was just dropped. Called by `clearAllRpcData`, which runs on a displayed-regions change, on a viewport move past an error or a cancel, and on `reload()`.</span> | [MultiRegionDisplayMixin](../multiregiondisplaymixin#action-cleardisplayspecificdata) |
| <span id="action-clearsettingsbakeddata">**clearSettingsBakedData**</span><br><code>() =&gt; void</code> | <span data-pagefind-ignore>Overridable hook (no-op base): drop what this display holds that is wrong under a changed setting rather than merely stale — a payload whose shape the setting decides. Called by `invalidateSettings`, where `clearDisplaySpecificData` is deliberately not: bins, reads and features fetched under the previous setting draw honestly under the scrim `staleSettingsDrawn` raises until the refetch lands, the way canvas has kept its features since ADR-006 and every display does since 2026-09.<br><br>The variant matrix overrides it, for a structural reason: it holds one payload for every visible region and the row set is a setting, so there is no per-region replacement to wait for.</span> | [MultiRegionDisplayMixin](../multiregiondisplaymixin#action-clearsettingsbakeddata) |
| <span id="action-clearallrpcdata">**clearAllRpcData**</span><br><code>() =&gt; void</code> | <span data-pagefind-ignore>full reset: cancels fetch, clears error, loadedRegions, display-specific data, and the canvas-drawn flag. The too-large gate is derived (a pure function of the cached estimate × viewport), so it needs no explicit clear here — the fetch autorun re-measures at the new viewport and the verdict follows.</span> | [MultiRegionDisplayMixin](../multiregiondisplaymixin#action-clearallrpcdata) |
| <span id="action-invalidatesettings">**invalidateSettings**</span><br><code>() =&gt; void</code> | <span data-pagefind-ignore>`SettingsInvalidate`'s reset: the half of `clearAllRpcData` a settings change still needs now that the settings and adapter axes are in `fetchInputs`. The in-flight fetch is superseded now rather than when its payload lands stamped stale, a blocking error or cancel is cleared so the plan is not `blocked`, and the display drops its settings-baked data. `loadedRegions` and the canvas-drawn flag stay: every held region already reads `!isCacheValid`, so the plan refetches it, and until that lands the data stays on screen under the scrim `staleSettingsDrawn` raises.</span> | [MultiRegionDisplayMixin](../multiregiondisplaymixin#action-invalidatesettings) |
| <span id="action-fetchregions">**fetchRegions**</span><br><span class="cell-more"><button type="button" class="cell-more-trigger"><code>(needed: IndexedRegion[], work: (ctx: RegionFetchContext) =&gt; Pr…</code></button><dialog class="cell-dialog"><form method="dialog"><button class="cell-dialog-close" aria-label="Close">✕</button></form><pre><code>(needed: IndexedRegion[], work: (ctx: RegionFetchContext) =&gt; Promise&lt;void&gt;) =&gt; Promise&lt;void&gt;</code></pre></dialog></span> | <span data-pagefind-ignore>Run a per-region fetch. The work callback calls `ctx.commitRegion` as it stores each region's payload, which is what marks it loaded — see RegionFetchContext for why this function no longer does that itself. Its only callers are the three helpers in `fetchEachRegion.ts`, which make that call for every display in the family; a display reaching past them owns both `ctx.isStale()` guards and the commit by hand, and none does.<br><br>The fetch key is captured here, at issue, and carried into every commit — never re-read after the await. `ctx.isStale()` trips on a newer fetch or a cancel, not on a viewport that moved under a fetch that is still current, so a key read at commit time would stamp this data with a zoom it was not fetched at.</span> | [MultiRegionDisplayMixin](../multiregiondisplaymixin#action-fetchregions) |
| <span id="action-afterattach">**afterAttach**</span><br><code>() =&gt; void</code> | <span data-pagefind-ignore>installs the fetch-lifecycle autoruns (DisplayedRegionsChange, FetchVisibleRegions, SettingsInvalidate, ClearBlockingStateOnViewportChange)</span> | [MultiRegionDisplayMixin](../multiregiondisplaymixin#action-afterattach) |
| <span id="action-clearbyteestimate">**clearByteEstimate**</span><br><code>() =&gt; void</code> | <span data-pagefind-ignore>Drops the estimate and the viewport stamp. `forceLoadTrack` survives: it is a track-wide approval.</span> | [RegionTooLargeMixin](../regiontoolargemixin#action-clearbyteestimate) |
| <span id="action-cleargatemeasurements">**clearGateMeasurements**</span><br><code>() =&gt; void</code> | <span data-pagefind-ignore>Overridable hook (no-op base): drop what the other axis measured, on the trigger that invalidates this one. The two used to clear on different triggers, so re-pointing an adapter dropped the bytes and left `densityTooLarge` speaking for the previous file.</span> | [RegionTooLargeMixin](../regiontoolargemixin#action-cleargatemeasurements) |
| <span id="action-setforceloadtrack">**setForceLoadTrack**</span><br><code>(flag: boolean) =&gt; void</code> |  | [RegionTooLargeMixin](../regiontoolargemixin#action-setforceloadtrack) |
| <span id="action-commitfetchbytes">**commitFetchBytes**</span><br><span class="cell-more"><button type="button" class="cell-more-trigger"><code>(perRegionBytes: (number &#124; undefined)[], issued: GateFetchState…</code></button><dialog class="cell-dialog"><form method="dialog"><button class="cell-dialog-close" aria-label="Close">✕</button></form><pre><code>(perRegionBytes: (number &#124; undefined)[], issued: GateFetchState, partial?: boolean) =&gt; void</code></pre></dialog></span> | <span data-pagefind-ignore>The byte axis of a finished fetch: the per-region max against the `gateFetchState()` captured at issue. An empty batch, or an ungated display, commits nothing.<br><br>Reached through `openGateCommit`, the only production caller, which owns the capture, the commit-at-most-once rule and the pairing with `partial`. A test staging a measurement by hand calls this directly.</span> | [RegionTooLargeMixin](../regiontoolargemixin#action-commitfetchbytes) |
| <span id="action-forceload">**forceLoad**</span><br><code>() =&gt; void</code> | <span data-pagefind-ignore>The banner's button: exempt the track on both axes and refetch.</span> | [RegionTooLargeMixin](../regiontoolargemixin#action-forceload) |
| <span id="action-markcanvasdrawn">**markCanvasDrawn**</span><br><code>() =&gt; void</code> |  | [RenderLifecycleMixin](../renderlifecyclemixin#action-markcanvasdrawn) |
| <span id="action-resetcanvasdrawn">**resetCanvasDrawn**</span><br><code>() =&gt; void</code> |  | [RenderLifecycleMixin](../renderlifecyclemixin#action-resetcanvasdrawn) |
| <span id="action-stoprenderingbackend">**stopRenderingBackend**</span><br><code>() =&gt; void</code> |  | [RenderLifecycleMixin](../renderlifecyclemixin#action-stoprenderingbackend) |
| <span id="action-rendernow">**renderNow**</span><br><code>() =&gt; void</code> |  | [RenderLifecycleMixin](../renderlifecyclemixin#action-rendernow) |
| <span id="action-setoffscreen">**setOffScreen**</span><br><code>(offScreen: boolean) =&gt; void</code> |  | [RenderLifecycleMixin](../renderlifecyclemixin#action-setoffscreen) |
| <span id="action-setrendererror">**setRenderError**</span><br><code>(error: unknown) =&gt; void</code> | <span data-pagefind-ignore>set/clear the render-backend error. Called by `useRenderingBackend`: with the error when the canvas factory rejects (or context-loss re-init fails), and with `undefined` on successful (re)init and on retry.</span> | [RenderLifecycleMixin](../renderlifecyclemixin#action-setrendererror) |
| <span id="action-attachrenderingbackend">**attachRenderingBackend**</span><br><span class="cell-more"><button type="button" class="cell-more-trigger"><code>&lt;B&gt;(backend: B, setup: () =&gt; RenderingBackendCallbacks&lt;B&gt;) =&gt; v…</code></button><dialog class="cell-dialog"><form method="dialog"><button class="cell-dialog-close" aria-label="Close">✕</button></form><pre><code>&lt;B&gt;(backend: B, setup: () =&gt; RenderingBackendCallbacks&lt;B&gt;) =&gt; void</code></pre></dialog></span> | <span data-pagefind-ignore>attach a GPU/Canvas2D backend and install the upload + render autorun pair. Idempotent: re-calling swaps the backend and does not run `setup` again, so the callbacks and everything they close over are the first call's.</span> | [RenderLifecycleMixin](../renderlifecyclemixin#action-attachrenderingbackend) |
| <span id="action-stopactivefetch">**stopActiveFetch**</span><br><code>() =&gt; void</code> | <span data-pagefind-ignore>Abort the in-flight fetch (if any) and retire its slot. The shared preamble of both cancel paths; the difference between them is only what they do to `fetchCanceled` / `fetchGeneration` afterward.</span> | [FetchMixin](../fetchmixin#action-stopactivefetch) |
| <span id="action-openstatusstream">**openStatusStream**</span><br><code>(isCurrent: () =&gt; boolean) =&gt; StatusStream</code> | <span data-pagefind-ignore>Open one operation's slot on the display's status field: an RPC `statusCallback` throttled through the display-wide window and guarded so a callback that fires after the node is torn down (RPCs resolve their status stream asynchronously) is a safe no-op, plus the `clear` that retires the slot when the operation ends.<br><br>**Every operation on the display opens one**, and the two come back together because an operation that never retires keeps reporting status for a phase that is over. The viewport fetch (`runFetch`), the clustering run and a lent `createAbortRotation` are three of them on one field; before ADR-081 each blanked the field outright and the last one to finish overwrote the status of the other two.<br><br>`isCurrent` is required and has no "node is alive" default, because a live node is not enough: a *superseded* fetch is on a live node, and its late status repainting the overlay of the fetch that replaced it is the failure this guards. `runFetch` passes `!isStale()`, and every display gets that through `ctx.statusCallback` unasked; a caller outside a fetch (the clustering autorun) passes its own run's flag. Defaulting to `isAlive` made the loose answer the easy one and five displays took it.<br><br>`runFetch`'s own slot is opened by the rotation; this is for an operation outside any fetch, the tree sidebar's clustering run.</span> | [FetchMixin](../fetchmixin#action-openstatusstream) |
| <span id="action-cancelfetch">**cancelFetch**</span><br><code>() =&gt; void</code> | <span data-pagefind-ignore>cancel any in-flight fetch and bump fetchGeneration (always bumps, so callers can retrigger fetch autoruns even when nothing was in flight). This is the *internal* reset `clearAllRpcData` runs — it clears any user-cancel flag so the retrigger actually re-fetches.</span> | [FetchMixin](../fetchmixin#action-cancelfetch) |
| <span id="action-cancelfetchbyuser">**cancelFetchByUser**</span><br><code>() =&gt; void</code> | <span data-pagefind-ignore>User-initiated cancel from the loading overlay. Stops the in-flight fetch and lands in a durable `fetchCanceled` state. Unlike `cancelFetch`, it does NOT bump fetchGeneration — so the fetch autoruns don't immediately restart the load. The user retries via `reload` (the overlay's retry button), or it clears on the next viewport change.</span> | [FetchMixin](../fetchmixin#action-cancelfetchbyuser) |
| <span id="action-beforedestroy">**beforeDestroy**</span><br><code>() =&gt; void</code> | <span data-pagefind-ignore>Abort an in-flight fetch on teardown. Without this, a display destroyed mid-fetch (track/view closed while loading) never signals the worker to abort the now-useless work, and its in-flight HTTP reads keep downloading. MST auto-chains lifecycle hooks, so a composing display can still define its own beforeDestroy.</span> | [FetchMixin](../fetchmixin#action-beforedestroy) |
| <span id="action-beginfetch">**beginFetch**</span><br><code>(signal: AbortSignal) =&gt; void</code> | <span data-pagefind-ignore>The `onBegin` half of a fetch's bookkeeping: publish the in-flight signal (`isLoading`) and clear the durable user-cancel — a load starting is the single clear point that covers every retrigger path (reload, viewport change, settings invalidate). An action of its own for the same reason `endFetch` is: `installFetch`'s lifecycle callbacks run outside any MST flow this mixin owns.</span> | [FetchMixin](../fetchmixin#action-beginfetch) |
| <span id="action-endfetch">**endFetch**</span><br><code>(current: boolean) =&gt; void</code> | <span data-pagefind-ignore>The `finally` half of `runFetch`'s bookkeeping, an action of its own because `runFetchOnce`'s `finally` resumes on a microtask the flow does not own — a direct volatile write there is outside the action context, which is the one thing hoisting the sequence into a shared function costs. The stale branch is a superseded fetch, which must not clear the loading flag the run that replaced it just set.</span> | [FetchMixin](../fetchmixin#action-endfetch) |
| <span id="action-runfetch">**runFetch**</span><br><code>(work: (ctx: FetchContext) =&gt; Promise&lt;void&gt;) =&gt; Promise&lt;void&gt;</code> | <span data-pagefind-ignore>Run a cancel-safe fetch (cancels any prior). The work callback gets a FetchContext with a signal to forward to the RPC and an isStale() check to short-circuit commits once the user has moved on.<br><br>**The MST-flow wrapper over the shared `runFetchOnce` sequence**, and only the wrapper: the begin/clear/run/commit/error/end order, and the rules that keep a superseded run from writing back, are the same function every other fetch in the tree runs. What this adds is the observable bookkeeping a display needs — `isLoading` through `activeSignal`, `fetchGeneration`, the user-cancel clear — and the flow itself, which is an action, so `work`'s synchronous prefix runs untracked wherever a fetch autorun calls this.</span> | [FetchMixin](../fetchmixin#action-runfetch) |
| <span id="action-setshowtree">**setShowTree**</span><br><code>(arg: boolean) =&gt; void</code> |  | [TreeSidebarMixin](../treesidebarmixin#action-setshowtree) |
| <span id="action-setshowbranchlength">**setShowBranchLength**</span><br><code>(arg: boolean) =&gt; void</code> |  | [TreeSidebarMixin](../treesidebarmixin#action-setshowbranchlength) |
| <span id="action-setshowrowlabels">**setShowRowLabels**</span><br><code>(arg: boolean) =&gt; void</code> |  | [TreeSidebarMixin](../treesidebarmixin#action-setshowrowlabels) |
| <span id="action-settreeareawidth">**setTreeAreaWidth**</span><br><code>(width: number) =&gt; void</code> |  | [TreeSidebarMixin](../treesidebarmixin#action-settreeareawidth) |
| <span id="action-setrunclustering">**setRunClustering**</span><br><code>(arg?: boolean &#124; undefined) =&gt; void</code> |  | [TreeSidebarMixin](../treesidebarmixin#action-setrunclustering) |
| <span id="action-setclusterregion">**setClusterRegion**</span><br><code>(arg?: string &#124; undefined) =&gt; void</code> |  | [TreeSidebarMixin](../treesidebarmixin#action-setclusterregion) |
| <span id="action-setsortrowsby">**setSortRowsBy**</span><br><code>(arg?: RowSortSpec &#124; undefined) =&gt; void</code> | <span data-pagefind-ignore>Trigger (or clear) a one-shot declarative row sort; consumed and reset by `setupRowSortAutorun`.</span> | [TreeSidebarMixin](../treesidebarmixin#action-setsortrowsby) |
| <span id="action-sethoveredtreenode">**setHoveredTreeNode**</span><br><code>(node?: HoveredTreeNode &#124; undefined) =&gt; void</code> |  | [TreeSidebarMixin](../treesidebarmixin#action-sethoveredtreenode) |
| <span id="action-settreecanvasref">**setTreeCanvasRef**</span><br><code>(ref: HTMLCanvasElement &#124; null) =&gt; void</code> |  | [TreeSidebarMixin](../treesidebarmixin#action-settreecanvasref) |
| <span id="action-setmouseovercanvasref">**setMouseoverCanvasRef**</span><br><code>(ref: HTMLCanvasElement &#124; null) =&gt; void</code> |  | [TreeSidebarMixin](../treesidebarmixin#action-setmouseovercanvasref) |
| <span id="action-setroworder">**setRowOrder**</span><br><span class="cell-more"><button type="button" class="cell-more-trigger"><code>(rows: readonly { name: string; }[], run?: ClusterRun &#124; undefin…</code></button><dialog class="cell-dialog"><form method="dialog"><button class="cell-dialog-close" aria-label="Close">✕</button></form><pre><code>(rows: readonly { name: string; }[], run?: ClusterRun &#124; undefined) =&gt; void</code></pre></dialog></span> | <span data-pagefind-ignore>Arrange the rows in `rows`' order, ahead of any name the current order carries that `rows` does not. A clustering run passes its result, and the tree and its provenance land with the order; any other reorder that moves a row drops the tree, which no longer describes it.</span> | [TreeSidebarMixin](../treesidebarmixin#action-setroworder) |
| <span id="action-setrowlabels">**setRowLabels**</span><br><code>(labels: Readonly&lt;Record&lt;string, string&gt;&gt;) =&gt; void</code> | <span data-pagefind-ignore>The labels drawn in place of row names, whole: a row the map does not name shows the name it arrived with.</span> | [TreeSidebarMixin](../treesidebarmixin#action-setrowlabels) |
| <span id="action-setrowfocus">**setRowFocus**</span><br><code>(names?: readonly string[] &#124; undefined) =&gt; void</code> | <span data-pagefind-ignore>Narrow the display to `names`, or show every row again.</span> | [TreeSidebarMixin](../treesidebarmixin#action-setrowfocus) |
| <span id="action-applyrowedits">**applyRowEdits**</span><br><span class="cell-more"><button type="button" class="cell-more-trigger"><code>(rows: readonly S[], rowColor?: Partial&lt;RowColorSetting&gt; &#124; unde…</code></button><dialog class="cell-dialog"><form method="dialog"><button class="cell-dialog-close" aria-label="Close">✕</button></form><pre><code>(rows: readonly S[], rowColor?: Partial&lt;RowColorSetting&gt; &#124; undefined) =&gt; void</code></pre></dialog></span> | <span data-pagefind-ignore>The arrangement dialog's submit: the rows in their new order, each carrying the label the reader left on it, and the `rowColor` object the dialog shows, written where it differs from the config's. The labels go to `rows` by the rule `labelEdits` states, and the order to `rows.domain` unless it moves no row, so a submit that changes nothing writes nothing.</span> | [TreeSidebarMixin](../treesidebarmixin#action-applyrowedits) |
| <span id="action-resetrowarrangement">**resetRowArrangement**</span><br><code>() =&gt; void</code> | <span data-pagefind-ignore>Return every arrangement member — order, labels, tree, provenance and focus — to what the config declares, leaving `rows.field`, and the `rowColor` colours to `rowColorResetTarget`: the config's for the choice, which stays.</span> | [TreeSidebarMixin](../treesidebarmixin#action-resetrowarrangement) |
| <span id="action-setrowcolorchoice">**setRowColorChoice**</span><br><code>(choice: string) =&gt; void</code> | <span data-pagefind-ignore>Colour the rows by `choice`, as a menu picks it: '' for None, `name` for Each row, or an attribute, starting from `rowColorFor`. A pick of the current choice writes nothing.</span> | [TreeSidebarMixin](../treesidebarmixin#action-setrowcolorchoice) |
| <span id="action-focuslegendentry">**focusLegendEntry**</span><br><code>(scaleId: string, value: string) =&gt; void</code> | <span data-pagefind-ignore>`LegendHost`'s hook: a click on a row colour key entry narrows the rows to those it lists. Every other scale's entries name colours, not rows, and stay inert.</span> | [TreeSidebarMixin](../treesidebarmixin#action-focuslegendentry) |
| <span id="action-setrowheight">**setRowHeight**</span><br><code>(n: number) =&gt; void</code> | <span data-pagefind-ignore>Pin a px row height. `0` is the fit sentinel, but enter fit mode through `setFitToHeight` instead — displays whose `height` getter is content-derived have to re-seed the slot on the way in, and that is what the action is for.</span> | [RowHeightMixin](../rowheightmixin#action-setrowheight) |

