feat(ui): explain operator workspace choices

This commit is contained in:
sjg
2026-08-01 11:12:33 +02:00
parent d393b3cefc
commit 9fbf90ee91
2 changed files with 39 additions and 6 deletions
@@ -2949,7 +2949,8 @@ button.is-active {
font-weight: 700; font-weight: 700;
letter-spacing: 0.04em; letter-spacing: 0.04em;
text-transform: uppercase; text-transform: uppercase;
overflow: hidden; overflow: visible;
position: relative;
} }
.operator-layout-picker::before { content: "Layout"; } .operator-layout-picker::before { content: "Layout"; }
.operator-layout-picker select { .operator-layout-picker select {
@@ -2967,6 +2968,36 @@ button.is-active {
} }
.operator-layout-picker:focus-within { border-color: var(--accent-green); box-shadow: 0 0 0 2px color-mix(in srgb, var(--accent-green) 20%, transparent); } .operator-layout-picker:focus-within { border-color: var(--accent-green); box-shadow: 0 0 0 2px color-mix(in srgb, var(--accent-green) 20%, transparent); }
.operator-layout-picker select:focus-visible { outline: 0; } .operator-layout-picker select:focus-visible { outline: 0; }
.operator-layout-description {
position: absolute;
top: calc(100% + 0.35rem);
left: 0;
z-index: 25;
width: max-content;
max-width: min(22rem, calc(100vw - 2rem));
padding: 0.35rem 0.55rem;
border: 1px solid var(--border-light);
border-radius: var(--radius-sm);
background: var(--card-bg);
color: var(--text-muted);
box-shadow: 0 8px 24px color-mix(in srgb, #000 28%, transparent);
font-size: var(--fs-xs);
font-weight: 500;
letter-spacing: 0;
line-height: 1.35;
text-transform: none;
opacity: 0;
transform: translateY(-0.2rem);
visibility: hidden;
pointer-events: none;
transition: opacity var(--dur-fast) var(--ease-out), transform var(--dur-fast) var(--ease-out), visibility var(--dur-fast);
}
.operator-layout-picker:hover .operator-layout-description,
.operator-layout-picker:focus-within .operator-layout-description {
opacity: 1;
transform: none;
visibility: visible;
}
.advanced-radio-controls { .advanced-radio-controls {
margin-top: var(--space-3); margin-top: var(--space-3);
border: 1px solid color-mix(in srgb, var(--border-light) 75%, transparent); border: 1px solid color-mix(in srgb, var(--border-light) 75%, transparent);
@@ -126,10 +126,10 @@
}; };
const layouts = { const layouts = {
compact: { label: "Compact", advanced: false, preferredTab: "main" }, compact: { label: "Compact", description: "Essential tuning and audio controls", advanced: false, preferredTab: "main" },
broadcast: { label: "Broadcast", advanced: false, preferredTab: "main", capability: "broadcast" }, broadcast: { label: "Broadcast", description: "WFM, RDS, stereo and interference monitoring", advanced: false, preferredTab: "main", capability: "broadcast" },
digital: { label: "Digital", advanced: false, preferredTab: "digital-modes", capability: "digital" }, digital: { label: "Digital", description: "Decoder status, messages and background decoding", advanced: false, preferredTab: "digital-modes", capability: "digital" },
full: { label: "Full controls", advanced: true, preferredTab: "main" }, full: { label: "Full controls", description: "Every control supported by the selected rig", advanced: true, preferredTab: "main" },
}; };
const layoutCapabilities = { broadcast: false, digital: false }; const layoutCapabilities = { broadcast: false, digital: false };
@@ -166,6 +166,8 @@
localStorage.setItem("trxOperatorLayout", document.body.dataset.operatorLayout); localStorage.setItem("trxOperatorLayout", document.body.dataset.operatorLayout);
const details = document.getElementById("advanced-radio-controls"); const details = document.getElementById("advanced-radio-controls");
if (details) details.open = layout.advanced; if (details) details.open = layout.advanced;
const description = document.getElementById("operator-layout-description");
if (description) description.textContent = layout.description;
if (options.navigate && typeof window.navigateToTab === "function") { if (options.navigate && typeof window.navigateToTab === "function") {
window.navigateToTab(layout.preferredTab); window.navigateToTab(layout.preferredTab);
} }
@@ -176,7 +178,7 @@
if (actions && !document.getElementById("operator-layout-select")) { if (actions && !document.getElementById("operator-layout-select")) {
const label = document.createElement("label"); const label = document.createElement("label");
label.className = "operator-layout-picker"; label.className = "operator-layout-picker";
label.innerHTML = '<span class="visually-hidden">Operator layout</span><select id="operator-layout-select" aria-label="Operator layout"></select>'; label.innerHTML = '<span class="visually-hidden">Operator layout</span><select id="operator-layout-select" aria-label="Operator layout" aria-describedby="operator-layout-description"></select><span id="operator-layout-description" class="operator-layout-description"></span>';
const select = label.querySelector("select"); const select = label.querySelector("select");
const savedLayout = localStorage.getItem("trxOperatorLayout") || "compact"; const savedLayout = localStorage.getItem("trxOperatorLayout") || "compact";
actions.insertBefore(label, actions.firstChild); actions.insertBefore(label, actions.firstChild);