Skip to main content
Each entry below follows the same shape: what you see, why it happens, what fixes it. The verification gates catch most of these mechanically; this page is for when you are staring at the symptom.

Layout

Symptom: in a justify="space-between" header, the links cluster sits centered. Invisible at 1200, glaring at 1512 and wider. Cause: a hidden-on-desktop mobile burger that hides its button but not its widget. A bare <html> widget as the third child still occupies the right flex slot even when its inner button is display: none, so the row balances against a ghost. This broke 8 of 10 sites in one batch run, and it is exactly what the empty-flex-slot probe in eu-studio check fails on. Fix: wrap the burger widget in a box that hides the whole widget on desktop:
Or use navBar(), which is immune by construction. The same ghost-slot logic applies to any html widget whose only content is hidden or absolutely positioned, sitting in a centered or space-between flex row: the slot participates in layout even though nothing paints.

A heading shrinks and overflows on mobile

Symptom: a headline inside a flex column renders at max-content width and pushes past 390px. Cause: headings in flex columns shrink to max-content unless given width. Fix: w="100%" on headings inside columns.

An absolute overlay renders at zero size

Symptom: pos: 'absolute' plus raw="inset:0;" and the overlay is invisible. Cause: in a flex parent the overlay has no width or height of its own; inset alone does not size it. Fix: give the overlay explicit w="100%" h="100%" and the parent pos: 'relative'.

A fixed overlay is trapped inside the nav

Symptom: a position: fixed mobile menu positions itself relative to the header instead of the viewport. Cause: backdrop-filter on the nav creates a containing block for fixed descendants. Fix: toggle the filter off while the overlay is open: .open { backdrop-filter: none }.

A marquee or bleed decoration widens the page

Symptom: check fails at some width with an overflow offender that is a decorative strip or marquee. Cause: the decoration legitimately extends past the section edge. Fix: raw="overflow:hidden;" on the section that contains it.

Text never wraps on mobile

Symptom: a mono or nowrap line overflows 390px. Cause: white-space: nowrap (and mono blocks styled that way) wrap nowhere. Fix: cap the width or allow wrapping below the tablet breakpoint.

CSS and deploy state

The page loads but looks unstyled or broken

Symptom: content renders, styling is partly or fully missing. Cause: one of several CSS lifecycle failures: a stylesheet that 404s (or 301-redirects to the homepage and “serves” as HTML), an unprimed atomic page, or a stale cache. Fix: run eu-studio doctor. It checks every stylesheet the page enqueues (asserting content-type, not just status), names the failing ones, and heals via cache regen plus re-prime with retries. Do not hand-grep page HTML; the doctor is faster and it is right.

The page renders collapsed, sections stacked at a fraction of their height

Symptom: a previously fine page suddenly renders compressed or z-stacked; check may fail css-coverage, naming classes no stylesheet defines. Cause: the global class store lost classes the page references. The known trigger is an Elementor editor session writing back an incomplete store copy. On real sites the companion plugin blocks the worst case (the mass-deletion 409) and keeps a restorable backup; on the playground the store can still lose classes. Fix: redeploy from source (exjsx deploy, idempotent), which rewrites the store; or on a plugin-guarded site, POST /elementor-ultra/v1/design/classes/restore. Then eu-studio doctor to confirm.

Styles keep flaking on the playground specifically

Symptom: doctor heals CSS, it breaks again later, repeatedly. Cause: the WASM playground’s css file store is the flaky part, not your build. Fix: eu-studio carry-css --page <id> once at the end of the build: the page’s generated CSS is baked in as an inline carrier and survives the file store. See also the CSS harvest recipe in the eu-studio README for the last-resort path.

Design review catches

Dark theme text is unreadable on some screens

Symptom: body copy that looked fine in the editor is muddy on a real display. Cause: low-contrast ink on near-black backgrounds; hex values lie about perceived contrast. Fix: keep body text at roughly #b0b8c0 or lighter on near-black, and judge contrast in screenshots (eu-studio measure shots), not by hex.

Fonts measure wrong everywhere

Symptom: every geometry measurement is slightly off; line wraps differ from the design. Cause: a family referenced only inside raw html widgets or raw= CSS is invisible to Elementor’s font enqueue and silently falls back. Fix: name the family in a style prop somewhere, or add fontLoader('Family', [400, 700]) first in the tree. Confirm with eu-studio measure fonts, which reports which families actually painted. exjsx lint warns about this (font-not-loaded).

When a deploy is refused

  • A 422 naming an envelope: the server-side validator is authoritative; fix the named envelope. The compiler’s build-time gates catch almost all of these first.
  • skipped-drifted pages: someone hand-edited the page in Elementor. Reconcile or consciously --force; see Deploy.
  • A class-store refusal telling you another project lives here: you are deploying a side bundle to an occupied site; the merge guard is protecting the resident project. See Deploy.
Most of this page is encoded in the gates: exjsx lint catches the authoring mistakes at build time, eu-studio check catches the layout failures in one call, and doctor diagnoses the CSS lifecycle. Run the gates first; read this page when a symptom survives them.