# EmbeddedSessionThemeMixin

Auto-generated @jbrowse/mobx-state-tree API for the current JBrowse release — see [pluggable elements](https://jbrowse.org/jb2/docs/developer_guide/) for concepts. Built into JBrowse core. [View source](https://github.com/GMOD/jbrowse-components/blob/main/packages/embedded-core/src/EmbeddedSessionThemeMixin.ts).

Theme getters shared by the single-view embedded sessions
(react-linear-genome-view, react-circular-genome-view). Embedded products
have no theme picker, so the palette is always `default` and the config
`theme` slot supplies it; light or dark is the host's to drive, through
`setThemeMode`.

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-id">**id**</span><br><code>id: ElementId</code> |  | [BaseSessionModel](../basesessionmodel#property-id) |
| <span id="property-name">**name**</span><br><code>name: types.string</code> |  | [BaseSessionModel](../basesessionmodel#property-name) |
| <span id="property-focusedviewid">**focusedViewId**</span><br><code>focusedViewId: types.maybe(types.string)</code> | <span data-pagefind-ignore>used to keep track of which view is in focus</span> | [BaseSessionModel](../basesessionmodel#property-focusedviewid) |
| <span id="property-highlights">**highlights**</span><br><span class="cell-more"><button type="button" class="cell-more-trigger"><code>highlights: types.stripDefault( types.array(types.frozen&lt;Highli…</code></button><dialog class="cell-dialog"><form method="dialog"><button class="cell-dialog-close" aria-label="Close">✕</button></form><pre><code>highlights: types.stripDefault(&#10;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;types.array(types.frozen&lt;HighlightType&gt;()),&#10;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;[],&#10;&#160;&#160;&#160;&#160;&#160;&#160;)</code></pre></dialog></span> | <span data-pagefind-ignore>translucent bands over genomic regions; every view draws the ones on its own assemblies</span> | [BaseSessionModel](../basesessionmodel#property-highlights) |
| <span id="property-highlightsvisible">**highlightsVisible**</span><br><code>highlightsVisible: types.stripDefault(types.boolean, true)</code> |  | [BaseSessionModel](../basesessionmodel#property-highlightsvisible) |
| <span id="property-highlightlabelsvisible">**highlightLabelsVisible**</span><br><code>highlightLabelsVisible: types.stripDefault(types.boolean, true)</code> | <span data-pagefind-ignore>whether a band's label is written on it</span> | [BaseSessionModel](../basesessionmodel#property-highlightlabelsvisible) |
| <span id="property-heldformissingplugins">**heldForMissingPlugins**</span><br><span class="cell-more"><button type="button" class="cell-more-trigger"><code>heldForMissingPlugins: types.stripDefault( types.frozen&lt;HeldNod…</code></button><dialog class="cell-dialog"><form method="dialog"><button class="cell-dialog-close" aria-label="Close">✕</button></form><pre><code>heldForMissingPlugins: types.stripDefault(&#10;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;types.frozen&lt;HeldNode[] &#124; undefined&gt;(),&#10;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;undefined,&#10;&#160;&#160;&#160;&#160;&#160;&#160;)</code></pre></dialog></span> | <span data-pagefind-ignore>views, tracks, displays and widgets `pruneUnbuildableNodes` took out of the tree because this build has no plugin for their type, each with the anchor that puts it back. Nothing in the session reads its contents, and `pruneUnbuildableNodes` defines their structure.<br><br>It is a **declared property** because MST drops undeclared snapshot keys without error. Without this declaration the held nodes survive the prune and are then discarded when `setSession` builds the tree, while every unit test of the prune still passes. `heldNodesSurviveTheSession.test.ts` tests that they survive.</span> | [BaseSessionModel](../basesessionmodel#property-heldformissingplugins) |

## Volatiles

<!-- prettier-ignore -->
| Member | Description | Defined by |
| --- | --- | --- |
| <span id="volatile-sessionthememode">**sessionThemeMode**</span><br><code>sessionThemeMode: undefined as PaletteMode &#124; undefined</code> |  | EmbeddedSessionThemeMixin |
| <span id="volatile-selection">**selection**</span><br><code>selection: undefined as unknown</code> | <span data-pagefind-ignore>this is the globally "selected" object. can be anything. code that wants to deal with this should examine it to see what kind of thing it is.</span> | [BaseSessionModel](../basesessionmodel#volatile-selection) |
| <span id="volatile-hovered">**hovered**</span><br><code>hovered: undefined as unknown</code> | <span data-pagefind-ignore>this is the globally "hovered" object. can be anything. code that wants to deal with this should examine it to see what kind of thing it is.</span> | [BaseSessionModel](../basesessionmodel#volatile-hovered) |
| <span id="volatile-queueofdialogs">**queueOfDialogs**</span><br><span class="cell-more"><button type="button" class="cell-more-trigger"><code>queueOfDialogs: [] as [DialogComponentType, Record&lt;string, unkn…</code></button><dialog class="cell-dialog"><form method="dialog"><button class="cell-dialog-close" aria-label="Close">✕</button></form><pre><code>queueOfDialogs: [] as [DialogComponentType, Record&lt;string, unknown&gt;][]</code></pre></dialog></span> |  | [BaseSessionModel](../basesessionmodel#volatile-queueofdialogs) |
| <span id="volatile-preferencesoverrides">**preferencesOverrides**</span><br><span class="cell-more"><button type="button" class="cell-more-trigger"><code>preferencesOverrides: observable.map&lt;string, unknown&gt;(undefined…</code></button><dialog class="cell-dialog"><form method="dialog"><button class="cell-dialog-close" aria-label="Close">✕</button></form><pre><code>preferencesOverrides: observable.map&lt;string, unknown&gt;(undefined, {&#10;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;deep: false,&#10;&#160;&#160;&#160;&#160;&#160;&#160;})</code></pre></dialog></span> | <span data-pagefind-ignore>runtime user-preference overrides keyed by preference id, resolved by `getPreference` against the `configuration.preferences` admin defaults. Empty here (config-only); products that let users edit preferences load and persist these via localStorage. A runtime override map layered over config defaults, kept off the snapshot since prefs are local UI.<br><br>An `observable.map` (not a plain object reassigned wholesale) so each preference is its own tracked key: writing one (`setScrollZoom`) can't invalidate a reader of another. A single spread-replaced object made every setter wake every reader, so toggling scroll-to-zoom re-fetched every track.<br><br>`deep: false` keeps an object-valued preference a plain object rather than a MobX Proxy, which V8's structured-clone serializer rejects. The map still notifies per key on `set`, so shallow values lose no reactivity — and nothing can mutate a preference in place, because `setPreferenceOverride` freezes what it stores.</span> | [BaseSessionModel](../basesessionmodel#volatile-preferencesoverrides) |
| <span id="volatile-snackbarmessages">**snackbarMessages**</span><br><code>snackbarMessages: observable.array&lt;SnackbarMessage&gt;()</code> |  | [SnackbarModel](../snackbarmodel#volatile-snackbarmessages) |
| <span id="volatile-errordialog">**errorDialog**</span><br><code>errorDialog: undefined as ErrorDialogState &#124; undefined</code> | <span data-pagefind-ignore>the error currently shown in the stack-trace dialog. Kept off the dialog queue so it can stack on top of an already-open dialog (e.g. the one whose action raised the error) instead of waiting behind it</span> | [SnackbarModel](../snackbarmodel#volatile-errordialog) |

## Getters

<!-- prettier-ignore -->
| Member | Description | Defined by |
| --- | --- | --- |
| <span id="getter-themeoptions">**themeOptions**</span><br><code>SerializableThemeArgs</code> | Serializable theme description (the canonical `themeOptions` contract shared with the app-core/web sessions). This is what crosses the RPC worker boundary — e.g. the canvas display reads `getSession(self).themeOptions` in its rpcProps so worker-baked colors (CDS frames, stroke fallback) honor the config `theme` slot. | EmbeddedSessionThemeMixin |
| <span id="getter-palette">**palette**</span><br><code>JBrowsePalette</code> | Every color JBrowse renders, resolved to plain strings and free of any UI toolkit. This is what rendering reads. See the canonical `ThemeManagerSessionMixin` getter of the same name. | EmbeddedSessionThemeMixin |
| <span id="getter-styletheme">**styleTheme**</span><br><code>JBrowseStyleTheme</code> | The palette plus the sizing tokens `makeStyles` reads. See the canonical `ThemeManagerSessionMixin` getter of the same name. | EmbeddedSessionThemeMixin |
| <span id="getter-theme">**theme**</span><br><code>Theme</code> | Resolved MUI theme, mirroring the product's ThemeProvider. Lets headless/RPC consumers derive theme-dependent state without a mounted component. Shares its colors with `palette` by construction. | EmbeddedSessionThemeMixin |
| <span id="getter-root">**root**</span><br><code>TypeOrStateTreeNodeToStateTreeNode&lt;ROOT_MODEL_TYPE&gt;</code> |  | [BaseSessionModel](../basesessionmodel#getter-root) |
| <span id="getter-jbrowse">**jbrowse**</span><br><code>any</code> |  | [BaseSessionModel](../basesessionmodel#getter-jbrowse) |
| <span id="getter-rpcmanager">**rpcManager**</span><br><code>RpcManager</code> |  | [BaseSessionModel](../basesessionmodel#getter-rpcmanager) |
| <span id="getter-configuration">**configuration**</span><br><code>Instance&lt;JB_CONFIG_SCHEMA&gt;</code> |  | [BaseSessionModel](../basesessionmodel#getter-configuration) |
| <span id="getter-adminmode">**adminMode**</span><br><code>boolean</code> |  | [BaseSessionModel](../basesessionmodel#getter-adminmode) |
| <span id="getter-textsearchmanager">**textSearchManager**</span><br><code>TextSearchManager</code> |  | [BaseSessionModel](../basesessionmodel#getter-textsearchmanager) |
| <span id="getter-assemblies">**assemblies**</span><br><span class="cell-more"><button type="button" class="cell-more-trigger"><code>(ConfigNodeProps&lt;…&gt; &amp; ConfigNodeActions &amp; ConfigNodeBrand&lt;...&gt;)…</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;...&gt;)[]</code></pre></dialog></span> |  | [BaseSessionModel](../basesessionmodel#getter-assemblies) |
| <span id="getter-dialogcomponent">**DialogComponent**</span><br><code>DialogComponentType</code> |  | [BaseSessionModel](../basesessionmodel#getter-dialogcomponent) |
| <span id="getter-dialogprops">**DialogProps**</span><br><code>Record&lt;string, unknown&gt;</code> |  | [BaseSessionModel](../basesessionmodel#getter-dialogprops) |
| <span id="getter-animationmode">**animationMode**</span><br><code>AnimationMode</code> | <span data-pagefind-ignore>resolved feature-layout animation mode (never undefined)</span> | [BaseSessionModel](../basesessionmodel#getter-animationmode) |
| <span id="getter-scrollzoom">**scrollZoom**</span><br><code>boolean</code> | <span data-pagefind-ignore>resolved scroll-to-zoom preference. Global and personal (never shared in a session snapshot); every wheel-zoom view reads this single value.</span> | [BaseSessionModel](../basesessionmodel#getter-scrollzoom) |
| <span id="getter-numbergrouping">**numberGrouping**</span><br><code>boolean</code> | <span data-pagefind-ignore>resolved thousand-separator preference. Read for display in the Preferences dialog; the formatter itself reads a plain module variable set at startup in each realm (see `setNumberGrouping`), because worker- built strings can't see a main-thread observable.</span> | [BaseSessionModel](../basesessionmodel#getter-numbergrouping) |
| <span id="getter-snackbarmessageset">**snackbarMessageSet**</span><br><code>Map&lt;string, SnackbarMessage&gt;</code> |  | [SnackbarModel](../snackbarmodel#getter-snackbarmessageset) |

## Methods

<!-- prettier-ignore -->
| Member | Description | Defined by |
| --- | --- | --- |
| <span id="method-getactivethemeoptions">**getActiveThemeOptions**</span><br><code>(_name?: string &#124; undefined) =&gt; ThemeOptions &#124; undefined</code> | Raw `ThemeOptions` for the active theme, which every view's SVG export threads into each display's `renderSvg` as a `configTheme` and rebuilds outside React. The config slot is the whole answer here because it is the whole of an embedded product's theming: no picker, no `allThemes`, and it is what `setThemeMode` writes and `palette` resolves from. `name` is accepted and ignored — the app session's counterpart looks a named preset up in `allThemes()`. | EmbeddedSessionThemeMixin |
| <span id="method-getpreferencedefault">**getPreferenceDefault**</span><br><code>(key: string) =&gt; unknown</code> | <span data-pagefind-ignore>the admin/embedder `configuration.preferences` value for a key, ignoring any runtime override — i.e. what a reset falls back to. Exposed rather than inlined because "differs from the default" is a question the Preferences reset diff asks about settings this map doesn't hold (see `defaultUseWorkspaces`).</span> | [BaseSessionModel](../basesessionmodel#method-getpreferencedefault) |
| <span id="method-getpreference">**getPreference**</span><br><code>(key: string) =&gt; unknown</code> | <span data-pagefind-ignore>resolved value of a user preference: a runtime override if the user set one, otherwise the admin/embedder `configuration.preferences` default. The override map is empty unless the product loads it (web/desktop).</span> | [BaseSessionModel](../basesessionmodel#method-getpreference) |
| <span id="method-getpreferencechanges">**getPreferenceChanges**</span><br><code>() =&gt; TrackConfigChange[]</code> | <span data-pagefind-ignore>every scalar preference override that currently differs from its config/admin default, as `{ path, from, to }` rows whose path is the override's own key. A scalar pref (animationMode, scrollZoom) whose override equals the default is omitted, since reverting it is a no-op.</span> | [BaseSessionModel](../basesessionmodel#method-getpreferencechanges) |

## Actions

<!-- prettier-ignore -->
| Member | Description | Defined by |
| --- | --- | --- |
| <span id="action-setthememode">**setThemeMode**</span><br><code>(mode: PaletteMode) =&gt; void</code> | Switch the session to light or dark, leaving the host's configured colours alone. `themeOptions` carries the mode to the renderer, so labels drawn in the worker follow it, and `palette` is derived from the same args, so React-drawn elements follow it too. An embedder who sets only a React-side palette leaves the worker-drawn labels in the old mode.<br><br>This used to write `palette.mode` into the config `theme` slot, which meant merging at two levels to avoid discarding the brand the host had passed to `createViewState`. Mode is its own axis now, so there is nothing to merge and nothing to discard. | EmbeddedSessionThemeMixin |
| <span id="action-setselection">**setSelection**</span><br><code>(thing: unknown) =&gt; void</code> | <span data-pagefind-ignore>set the global selection, i.e. the globally-selected object. can be a feature, a view, just about anything<br><br>A feature is unwrapped on the way in, so app state never holds a jexlFeatureProxy. `isFeature` accepts a proxy, but on one `id` is a data field rather than the method the Feature type promises — every consumer doing `isFeature(selection) ? selection.id() : …` would throw.</span> | [BaseSessionModel](../basesessionmodel#action-setselection) |
| <span id="action-clearselection">**clearSelection**</span><br><code>() =&gt; void</code> | <span data-pagefind-ignore>clears the global selection</span> | [BaseSessionModel](../basesessionmodel#action-clearselection) |
| <span id="action-sethovered">**setHovered**</span><br><code>(thing: unknown) =&gt; void</code> |  | [BaseSessionModel](../basesessionmodel#action-sethovered) |
| <span id="action-sethighlightsvisible">**setHighlightsVisible**</span><br><code>(arg: boolean) =&gt; void</code> |  | [BaseSessionModel](../basesessionmodel#action-sethighlightsvisible) |
| <span id="action-sethighlightlabelsvisible">**setHighlightLabelsVisible**</span><br><code>(arg: boolean) =&gt; void</code> |  | [BaseSessionModel](../basesessionmodel#action-sethighlightlabelsvisible) |
| <span id="action-addhighlight">**addHighlight**</span><br><code>(highlight: HighlightType) =&gt; void</code> | <span data-pagefind-ignore>an identical entry is not added twice, so a spec launched again does not stack its bands. Adding shows the bands again, since a highlight made while they are off would otherwise read as nothing happening</span> | [BaseSessionModel](../basesessionmodel#action-addhighlight) |
| <span id="action-removehighlight">**removeHighlight**</span><br><code>(highlight: HighlightType) =&gt; void</code> |  | [BaseSessionModel](../basesessionmodel#action-removehighlight) |
| <span id="action-updatehighlight">**updateHighlight**</span><br><code>(old: HighlightType, updates: Partial&lt;HighlightType&gt;) =&gt; void</code> |  | [BaseSessionModel](../basesessionmodel#action-updatehighlight) |
| <span id="action-sethighlights">**setHighlights**</span><br><code>(highlights: HighlightType[]) =&gt; void</code> |  | [BaseSessionModel](../basesessionmodel#action-sethighlights) |
| <span id="action-setpreferenceoverride">**setPreferenceOverride**</span><br><code>(key: string, value: unknown) =&gt; void</code> | <span data-pagefind-ignore>set a runtime user-preference override (see `getPreference`). Mutates volatile state; products persist these to localStorage. An `undefined` value deletes the key (rather than leaving a phantom entry that `getPreference` reads as absent) so the store never holds dead keys.</span> | [BaseSessionModel](../basesessionmodel#action-setpreferenceoverride) |
| <span id="action-clearpreferenceoverrides">**clearPreferenceOverrides**</span><br><code>() =&gt; void</code> | <span data-pagefind-ignore>clear every runtime preference override at once, so each falls back to its config/admin default. Backs the Preferences dialog "Reset to defaults" button.</span> | [BaseSessionModel](../basesessionmodel#action-clearpreferenceoverrides) |
| <span id="action-clearpreferenceoverride">**clearPreferenceOverride**</span><br><code>(key: string) =&gt; void</code> | <span data-pagefind-ignore>clear a single runtime preference override (see `getPreference`) so it falls back to its config/admin default. Backs the per-entry reset in the Preferences dialog "Reset to defaults" confirmation.</span> | [BaseSessionModel](../basesessionmodel#action-clearpreferenceoverride) |
| <span id="action-setscrollzoom">**setScrollZoom**</span><br><code>(flag: boolean) =&gt; void</code> | <span data-pagefind-ignore>set the global scroll-to-zoom preference (see the `scrollZoom` getter)</span> | [BaseSessionModel](../basesessionmodel#action-setscrollzoom) |
| <span id="action-setname">**setName**</span><br><code>(str: string) =&gt; void</code> |  | [BaseSessionModel](../basesessionmodel#action-setname) |
| <span id="action-setfocusedviewid">**setFocusedViewId**</span><br><code>(viewId: string &#124; undefined) =&gt; void</code> | <span data-pagefind-ignore>`undefined` is "no view is focused", which the property has always been able to hold (`types.maybe`) and this had no way to spell. Nothing cleared it on teardown as a result: a view that was focused when it left the session left its id behind, and since every consumer compares `focusedViewId === view.id`, the id matched nothing, the focus ring vanished with nothing to say why, and the dead id persisted into a saved or shared session. `takeOut` clears it now.</span> | [BaseSessionModel](../basesessionmodel#action-setfocusedviewid) |
| <span id="action-removeactivedialog">**removeActiveDialog**</span><br><code>() =&gt; void</code> |  | [BaseSessionModel](../basesessionmodel#action-removeactivedialog) |
| <span id="action-queuedialog">**queueDialog**</span><br><code>(doneCallback: DoneCallback) =&gt; void</code> |  | [BaseSessionModel](../basesessionmodel#action-queuedialog) |
| <span id="action-removedialog">**removeDialog**</span><br><code>(entry: [DialogComponentType, Record&lt;string, unknown&gt;]) =&gt; void</code> |  | [BaseSessionModel](../basesessionmodel#action-removedialog) |
| <span id="action-notify">**notify**</span><br><span class="cell-more"><button type="button" class="cell-more-trigger"><code>(message: string, level?: NotificationLevel &#124; undefined, action…</code></button><dialog class="cell-dialog"><form method="dialog"><button class="cell-dialog-close" aria-label="Close">✕</button></form><pre><code>(message: string, level?: NotificationLevel &#124; undefined, action?: SnackAction &#124; SnackAction[] &#124; undefined) =&gt; void</code></pre></dialog></span> |  | [SnackbarModel](../snackbarmodel#action-notify) |
| <span id="action-notifyerror">**notifyError**</span><br><span class="cell-more"><button type="button" class="cell-more-trigger"><code>(errorMessage: string, error?: unknown, extra?: unknown, action…</code></button><dialog class="cell-dialog"><form method="dialog"><button class="cell-dialog-close" aria-label="Close">✕</button></form><pre><code>(errorMessage: string, error?: unknown, extra?: unknown, action?: SnackAction &#124; undefined) =&gt; void</code></pre></dialog></span> |  | [SnackbarModel](../snackbarmodel#action-notifyerror) |
| <span id="action-seterrordialog">**setErrorDialog**</span><br><code>(state: ErrorDialogState &#124; undefined) =&gt; void</code> |  | [SnackbarModel](../snackbarmodel#action-seterrordialog) |
| <span id="action-pushsnackbarmessage">**pushSnackbarMessage**</span><br><span class="cell-more"><button type="button" class="cell-more-trigger"><code>(message: string, level?: NotificationLevel &#124; undefined, action…</code></button><dialog class="cell-dialog"><form method="dialog"><button class="cell-dialog-close" aria-label="Close">✕</button></form><pre><code>(message: string, level?: NotificationLevel &#124; undefined, actions?: SnackAction[] &#124; undefined) =&gt; void</code></pre></dialog></span> |  | [SnackbarModel](../snackbarmodel#action-pushsnackbarmessage) |
| <span id="action-popsnackbarmessage">**popSnackbarMessage**</span><br><code>() =&gt; SnackbarMessage &#124; undefined</code> |  | [SnackbarModel](../snackbarmodel#action-popsnackbarmessage) |
| <span id="action-removesnackbarmessage">**removeSnackbarMessage**</span><br><code>(message: string) =&gt; void</code> |  | [SnackbarModel](../snackbarmodel#action-removesnackbarmessage) |

