Follow-up from PR #56 delta review (SHIP; non-blocking).
registerCssKeyframes validates frames in an isolated context (counters from 0), while real emission charges the shared document context. When model CSS exceeds CSS_MAX_RULES (2000) or CSS_MAX_DECLARATIONS (20000) before a registered @Keyframes, the real pass strips the definition while animation:he-kN references were already rewritten → silently inert animation (bounded; no crash/data loss). Twin cosmetic case: keyframes whose only decls are animation-* can emit as an orphan definition.
Fix direction: two-phase emission (drop dead names before reference rewrite) or exempt registered survivors' frames from shared counters so both passes see identical budgets.
Source: architect delta review on b0eefcd (src/main/html-export-css-sanitize.ts:424-440).
Follow-up from PR #56 delta review (SHIP; non-blocking).
registerCssKeyframesvalidates frames in an isolated context (counters from 0), while real emission charges the shared document context. When model CSS exceedsCSS_MAX_RULES(2000) orCSS_MAX_DECLARATIONS(20000) before a registered @Keyframes, the real pass strips the definition whileanimation:he-kNreferences were already rewritten → silently inert animation (bounded; no crash/data loss). Twin cosmetic case: keyframes whose only decls areanimation-*can emit as an orphan definition.Fix direction: two-phase emission (drop dead names before reference rewrite) or exempt registered survivors' frames from shared counters so both passes see identical budgets.
Source: architect delta review on
b0eefcd(src/main/html-export-css-sanitize.ts:424-440).