openmixer — generated API reference
    Preparing search index...

    Interface SurfacePreferencesJson

    Every operator view selection the console remembers — the LOOK of the desk, as opposed to the state of the mix.

    It belongs to the SESSION (operator decision 2026-08-04): until there are users to derive per-user defaults from, the show owns its own look, so loading a different session restores THAT session's look. It rides ConsoleSnapshot for exactly that reason, and reaches clients as the /surface/preferences entity — no browser storage anywhere, so a browser whose policy forbids site data changes nothing and a second screen agrees by construction.

    What is deliberately NOT here: the per-WINDOW dock arrangement (a phone and the FOH screen legitimately differ — see the row's doc), genuinely ephemeral modes nobody wants back after a reload (the analyzer freeze, which bank layer the bay currently shows), and — moved out by issue #658 — the RTA overlay's own display aids: peak hold, meter colour, the pre→post delta highlight. Those are what the EQ/analyzer PANEL looks at, not a fact about the show a second screen must agree with; a phone glancing at the wall and the FOH engineer buried in a channel's EQ are entitled to their own reading habits, same reasoning as the dock. They live in the client's own window-local storage (web-ui/app/composables/usePreferences.ts), never here. eqTap stays — #658 is not a call to move everything — and RTA ARMING is a per-channel desk fact on that channel's own row, not a preference at all.

    interface SurfacePreferencesJson {
        bayMenuPosition: "left" | "right" | "top" | "bottom";
        confirmConfigApply: boolean;
        density: "auto" | "compact" | "normal" | "comfortable";
        dismissedMissingKey: string;
        eqFillMode: "off" | "summed" | "bands";
        eqTap: "drive" | "pre" | "post" | "both";
        hideUnpatched: boolean;
        narrowOnOverflow: boolean;
        occupiedPatch: "warn" | "unpatch";
        panelTap: "drive" | "pre" | "post" | "both";
        sendBus: ChannelRefJson | null;
        theme: "dark" | "hc" | "light";
        traceToolbar: "left" | "right" | "top" | "bottom";
    }
    Index
    bayMenuPosition: "left" | "right" | "top" | "bottom"

    Where the bay's display-mode menu sits.

    confirmConfigApply: boolean

    Whether applying a channel config / factory instrument template WARNS first when it would move facts the channel currently holds (RULED 2026-09-01, surface-interaction-conventions.md §"Whole-state applies warn"). ON until the operator signs off with the dialog's "don't warn me again" — the console-wide choice, never a per-panel shortcut.

    Deliberately NOT confirmDestructive on /surface/gestures: that switch governs the arm-then-fire gate on REMOVES, and an apply removes nothing — it overwrites, and the document it overwrites from survives. One switch meaning two things would make an operator who turned off delete-arming lose a warning they never asked to lose.

    density: "auto" | "compact" | "normal" | "comfortable"

    The density axis pick; auto lets the window propose from its own real estate.

    dismissedMissingKey: string

    The missing-hardware set whose arrival banner the operator dismissed (sorted kind:id pairs joined by |; '' = nothing dismissed). Content-keyed so an identical replayed set stays dismissed and a CHANGED set re-raises — that is news.

    eqFillMode: "off" | "summed" | "bands"

    The EQ curve's fill mode (one summed shape, one shape per band, or none).

    eqTap: "drive" | "pre" | "post" | "both"

    EQ overlay tap: pre-EQ, post-EQ, or both traces.

    hideUnpatched: boolean

    Hide input channels with no source patched (a big virtual box shows only its live ones).

    narrowOnOverflow: boolean

    R1 (operator 2026-07-10): on bay overflow the default is stable strip width + more banks; narrowing the strips instead is this explicit opt-in — a SEPARATE trigger (strip count) from the viewport/pointer tier above, never conflated into one boolean again.

    occupiedPatch: "warn" | "unpatch"

    What happens when a physical input is patched onto a channel that already has one. The door refuses a second either way; this decides whether the surface warns or re-patches.

    panelTap: "drive" | "pre" | "post" | "both"

    Standalone analyzer panel tap.

    sendBus: ChannelRefJson | null

    Which bus the sends-on-faders flip targets. null = nothing picked yet, and the bay snaps to its first live aux — an explicit absence, never a shipped mix/1 that may not be allocated on this console.

    theme: "dark" | "hc" | "light"

    The console theme, high contrast included (hc) — one axis, not a theme plus a flag.

    traceToolbar: "left" | "right" | "top" | "bottom"

    Which EDGE the processing trace's own control line sits on — the family selector and the selected family's toolbar, which belong to the trace and travel with it (2026-08-04-processing-view-layout.md Amendment 2026-09-15d). All four edges, because the canvas can give up a row or a column on any of them.