Layout tables New
A <table> is two different things: one that states relationships a screen reader must announce, and one that only positions content. Only the first was representable. Marking a table as layout now writes role="presentation" and removes the data-table semantics, moving a caption’s text into a paragraph rather than deleting it. No vendor class is written — the role is the whole marker, so exported HTML gains nothing the editor has to own.
This also fixes an accessibility rule that could not be satisfied: table-missing-header fired on every table without a <th>, including layout tables, which must not have one — so an email template produced a permanent error the author could never clear.
Crash recovery New
rte-watchdog.js: an uncaught exception could leave the editing surface half-dead while the page looked fine.
Shadow DOM and a web component New
An editor inside a shadow root now picks up a theme injected as an inline <style> by Vite or webpack’s style-loader — previously that left the toolbar unstyled.
The stylesheets were never minified Performance
We have minified the JavaScript for years and never the CSS. Measured in the published 2.5.4 package: 706 KB of stylesheets shipping with comments and indentation intact, of which plugins/aitoolkit.css alone was 537 KB — larger than the obfuscated rte.js. A .min.css now ships beside every stylesheet: 711,972 bytes down to 385,418, 46% smaller. The readable .css files still ship and are still the ones to edit or override.