diff --git a/internal/check-shell-header.mjs b/internal/check-shell-header.mjs index bcd142fbd..63cb65584 100644 --- a/internal/check-shell-header.mjs +++ b/internal/check-shell-header.mjs @@ -58,9 +58,9 @@ async function audit({ vtl = VTL, menu = MENU, langs = LANGS } = {}) { // locale detection reads ; SSR has no document, so the render gets a one-field stand-in. if (typeof globalThis.document === 'undefined') globalThis.document = { documentElement: { lang: 'en' } } const Layout = (await server.ssrLoadModule('/' + vtl)).default - // shellMode (resolved into data.mode at mount): 'app' owns the screen and gets the bar; 'web' sits under a - // host's own site header and gets NO bar, a corner ☰ (with its --map-fab-* footprint) and the language at - // the drawer's foot. The drawer is shut (navOpen false), as mounted() leaves it on a phone. + // shellMode (resolved into data.mode at mount): BOTH modes get the one top bar on a phone (☰ at the start, the + // language at the end); web mode's bar takes no camera inset (.is-web). No corner circle in either mode + // (a corner ☰ with no header was rejected on a real phone). The drawer is shut, as on a phone at load. for (const mode of ['app', 'web']) for (const narrow of [true, false]) for (const header of [true, false]) { // A copy of the real layout whose data says `narrow` and `mode` (in a browser mounted() reads them from // matchMedia and the host, which SSR never runs). A copy, not `extends`: the render function is not inherited. @@ -70,17 +70,16 @@ async function audit({ vtl = VTL, menu = MENU, langs = LANGS } = {}) { 'rail-end': () => h('i', { class: 'probe-rail-end' }) }) }) const html = (await renderToString(app)).replace(//g, '') // template comments are not markup const tag = `mode=${mode} narrow=${narrow} header=${header}` + // The bar's class list, in whatever order Vue renders it (a bound class can come first). + const pbar = (html.match(/