536e4e9f863a34da31a590bcc3490516483aa52a
Round 2's tag-name check on close popping fixed misattribution but could wedge the stack permanently: a mismatch with a real, still-open ancestor (e.g. an unclosed <p> before a later </div>, a normal optional-end-tag slip) never drained, so everything after it inherited the stuck depth and could print out of source order. Close handling now searches the whole stack for a matching tag, not just the top; frames above a found match are popped and implicitly closed (no fabricated close tag, just ending their indentation) before the match itself closes normally. A close with no match anywhere is still left in place untouched, since it has nothing to pair with. Also fixes a related idempotency bug in text-run whitespace collapsing surfaced while verifying this: boundary whitespace containing a newline (formatter-introduced structural gap) is now dropped entirely instead of being collapsed to a preserved space like same-line boundary spaces are. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Description
Visual drag-and-drop website builder using GrapesJS
3.5 MiB
Languages
TypeScript
64.8%
HTML
16.1%
JavaScript
14.9%
CSS
3.2%
PHP
0.7%
Other
0.3%