What happened
A component (ts-analytics' SettingsTab.stx) lost one closing </div> in an edit. The HTML parser auto-closed the element at EOF, silently re-parenting every subsequent sibling (three whole sub-tab sections) INSIDE an x-show div — so they inherited its display:none and rendered as a blank page whenever that tab wasn't selected.
Nothing surfaced the problem at any layer:
- Server render: page 200s, no component error, markup 'valid' (auto-closed)
- Client runtime: hydration succeeds, signals/gates all healthy, no console output
- The failure is purely structural and only visible by eye (or by walking
getComputedStyleup the ancestor chain in a WebView)
Repro sketch:
<div>
<div x-show="tab() === 'a'">
<p>tab A</p>
<!-- missing </div> here -->
<div x-show="tab() === 'b'"><p>tab B — invisible whenever tab A is hidden</p></div>
</div>Ask
A dev-mode warning when a component template's open/close tag counts don't balance (per void-element-aware counting), e.g.:
[stx] SettingsTab.stx: 47 <div> opened, 46 closed — unclosed element starting at line 771 may swallow following contentEven a coarse per-tag-name count comparison at template-parse time would have caught this instantly instead of after production screenshots. A lint in stx check/pickier-stx would work too.
(Found while debugging stacksjs/ts-analytics — fixed there in 6961cbb; diagnosed by driving the page with WebView.evaluate() from the new screenshot machinery, which was excellent for this.)