diff --git a/test-fixtures/reference-exhibits/scifi/css/style.css b/test-fixtures/reference-exhibits/scifi/css/style.css index 9d354da..1c7eb3a 100644 --- a/test-fixtures/reference-exhibits/scifi/css/style.css +++ b/test-fixtures/reference-exhibits/scifi/css/style.css @@ -2445,9 +2445,37 @@ body.surface-observation > main { body.surface-observation .observation-overlay { position: fixed; inset: 0; + /* The NGN pane is already the surface viewport. Do not retain the console + overlay's centered 16:9 box, transform, or its outside-pane letterbox. */ + width: auto; + height: auto; + transform: none; + box-shadow: none; z-index: 1; } +/* A secondary surface has no authority of its own. This is only shown after + its attach request times out; the inactive Observation controls stay hidden. */ +body.surface-observation.surface-waiting::before { + content: "WAITING FOR EXHIBIT OWNER\A Observation surface is not connected."; + white-space: pre-line; + position: fixed; + inset: 0; + z-index: 2; + display: grid; + place-items: center; + padding: 2rem; + box-sizing: border-box; + background: #010308; + color: var(--tertiary-accent); + font-family: var(--mono-font); + font-size: clamp(.8rem, 1.4vw, 1.1rem); + letter-spacing: .12em; + line-height: 1.8; + text-align: center; + pointer-events: none; +} + /* Exiting/returning to the console is NGN's job (pane lifecycle), not the surface's -- these controls would otherwise mutate the *console's* own view.observation overlay flag from a stray click (report SS7/SS8). */ diff --git a/test-fixtures/reference-exhibits/scifi/js/app.js b/test-fixtures/reference-exhibits/scifi/js/app.js index 7d4f287..bcfb99a 100644 --- a/test-fixtures/reference-exhibits/scifi/js/app.js +++ b/test-fixtures/reference-exhibits/scifi/js/app.js @@ -337,6 +337,7 @@ document.addEventListener('DOMContentLoaded', () => { channelName: XZBTSurfaceMode.channelName(xzbtInstanceId), timeoutMs: 1500, onSnapshot: (values, stateRevision, registryRevision, presentation) => { + document.body.classList.remove('surface-waiting'); Object.keys(values || {}).forEach(target => applyPresentationState(target, values[target])); if (presentation && typeof presentation.tickerText === 'string' && presentation.tickerText) { const ticker = document.getElementById('observation-ticker-text'); @@ -368,6 +369,7 @@ document.addEventListener('DOMContentLoaded', () => { // No console instance open on this channel (or a stale/unknown // ?xi=). Degrade to a clear waiting state rather than inventing // local authority (report SS9, Museum's proven behavior). + document.body.classList.add('surface-waiting'); console.warn('[SciFi-XZBT] Observation surface: no console instance found for xi=' + xzbtInstanceId); } });