Compact single-row header — master plan v1

Jessar Industries · 22 July 2026 · dual independent review (Claude + Codex GPT-5.6) · plan only, nothing changed
Route
A · native, additive
JS changes
Zero planned
Revert
1 checkbox + cold backup
Reviews
2 independent, converged
Mobile
Untouched

Before / after

Family-run in Quebec — since 1996Find a Retailer · Become a Dealer · EN/FR
Search products…◎ ◎
▼ becomes ▼
Family-run in Quebec — since 1996Find a Retailer · Become a Dealer · EN/FR
Kitchen & DiningHome & BathLightingElectricalBrandsAboutSearch…

Topbar unchanged and still scrolls away. Mobile (<1024px) unchanged: hamburger + drawer. The two-row header exists because the cart/account icons Hyper designs around are hidden on this B2B site — the compact row is the layout the content actually calls for.

How the current system actually works (both reviews, converged, line-cited)

The decision: Route A — extend the native header (both reviews independently recommend it)

Add a fourth header_layout option — logo-left-menu-inline — plus a master checkbox rs_enable_compact_single_row. All new code paths are dead unless that layout + checkbox are active. The stock three layouts are not edited. Nav renders inline in the top row inside its existing .header__bottom wrapper (kept for the JS contract, made position:static so panels anchor to the full-width .header__top instead). ~40 lines of scoped CSS live in rs-soft-modern.css (the RevShift layer), not in Hyper's files.

Route B (fully custom section) was independently examined and rejected by both reviews: it must clone the entire ~100KB schema/block contract, header.js hard-codes document.querySelector('.header-section'), and every Hyper update becomes an untracked interface. It buys no visual ceiling Route A can't reach.

Convergence check: two models reviewed the same code blind and arrived at the same route, the same anchor strategy, the same crash trap, and the same revert design. The plans differ only in refinements — merged below.

Where the two reviews differed — and the resolution

TopicClaudeCodexResolution
Search in the rowIcon → existing full-width overlayPersistent compact field (140–320px), zero new JS/ARIA Sean's call — Codex's is lower-risk v1; icon-expander is a clean v1.1 if the field feels busy
Nav row elementEmpty stub div (crash guard)Nested .header__bottom--rs-inline, static, inside top row Codex's — keeps every JS hook on the real nav; one menu render
Panel offsetRe-anchor top:100%Same + zero out the measured padding or the offset doubles Codex caught the padding — both fixes ship together
Collapse-on-scrollDisable in compact layoutKeep, restyled as fade (translate would push nav into topbar) Ship Codex's CSS, but activate with collapse OFF — single row has little to collapse; setting still works if ever wanted
Master toggleFlip layout dropdown backCheckbox that maps the layout back to stock while keeping compact settings stored Codex's — one-checkbox revert, nothing lost
FR/width safetyAuto-fallback to two-row below ~1200pxHard design gate: stop for approval if EN/FR menu can't fit at 1024px Gate first (no silent degradation); fallback kept as a named option if the gate fails

Finding neither plan fully had — our own components are consumers

Full-theme grep (done after both plans locked): RevShift's own rs-section-nav (live on PDPs) and rs-brand-pills compute their sticky offset as --header-height − --header-navigation-height — they assume the collapsed header height. In the compact layout the nested nav makes --header-navigation-height ≈ the row's content height, which would stick them under the header. Fix is one compact-scoped override for each (2 files), or letting them read --header-height alone when the compact class is present. Cheap — but only because it was found now, not in QA. Also confirmed: search.js consumes --header-bottom-position; unchanged by this design since search stays inside .header__top.

Revert strategy — both belts, exactly as requested

  1. Instant toggle: untick rs_enable_compact_single_row in the theme editor → Liquid maps the layout back to logo-left-search-center and renders the untouched stock branch. No deploy, no data loss, compact settings stay stored. QA for the revert = DOM + screenshot match against the pre-change baseline, not "looks like two rows".
  2. Cold backup: before any edit — backups/2026-07-XX-compact-header-prechange/ in the repo (outside theme/, never deployed): verbatim copies of the three touched files + MANIFEST.md (theme version, reason, restore steps) + SHA256SUMS. Survives Hyper updates, a B2C pivot, anything. Git history is the third layer, not the client-facing backup.

Files touched, total: sections/header.liquid (guarded branches + schema), assets/rs-soft-modern.css (one dated block), sections/header-group.json (activation only, after QA), plus the two RS component offset overrides. Hyper's theme.css, header.js and all menu/drawer/search snippets stay byte-identical.

Top risks (full 25-row register in the Codex plan)

RiskSevMitigation
Mega panel inherits the nav cell width instead of full rowCritical Nav wrapper position:static; .header__top is the positioned ancestor; assert panel rect vs baseline at 4 widths
Double/missing panel offset (anchor + legacy padding)Critical top:100% + zero the --header-navigation-height padding, compact scope only; nested dropdowns untouched
header.js crash / height vars misreportHigh .header__bottom stays in DOM; log all 5 vars before/after; RS component overrides shipped in the same step
EN/FR menu doesn't fit at 1024pxHigh no-wrap + minmax grid + 140px search floor; hard stop for design approval, never truncate
Hyper update collisionMed Additive dated branches, CSS in RevShift file, cold backup + manifest, re-verify on every update

Implementation sequence (each step its own commit, behind the off-by-default toggle until the end)

  1. Baseline capture — screenshots + computed values (panel rects, header vars, class states) at 7 widths, EN + FR, top/scrolled, editor preview. Nothing changes without a baseline to diff against.
  2. Cold backup + inert schema — backup dir with hashes; add layout option + checkbox + compact ranges. Site renders pixel-identical (toggle off).
  3. Guarded Liquid structure — nested inline nav branch, collapse-toggle condition, stock branch untouched. Verified on a preview theme, not live.
  4. One-row geometry CSS — grid, padding, search width, no-wrap nav, ::after suppression.
  5. Panel geometry — anchor + padding overrides; numeric rect comparison against baseline is the gate.
  6. Height propagation + RS components — log the 5 vars, ship the rs-section-nav / rs-brand-pills compact overrides, QA PDP sticky behaviour.
  7. Search + a11y + resilience passes — predictive search full-width results, keyboard/focus, touch, no-JS, editor block select, reduced motion, 200% zoom.
  8. Activate — flip settings in header-group.json off-hours, re-run the QA matrix live, then prove the revert by toggling off/on once in preview.

Open questions for Sean before any code

  1. Search style, v1: persistent compact field (zero-risk, Codex) or icon-that-expands (cleaner look, small JS/ARIA addition)? Recommendation: field for v1, judge it visually, icon as v1.1 if wanted.
  2. Collapse-on-scroll: activate compact with it OFF (recommended — a single row doesn't need to collapse) or keep the fade behaviour on?
  3. Utility links stay in the topbar ("Find a Retailer", "Become a Dealer", EN/FR)? Recommended yes — moving them into the row is a v2 conversation and crowds FR widths.
  4. Timing: this wants an uninterrupted implementation window with the preview-theme QA pass before live activation — say the word and step 1 (baseline + backup) starts.