Summary: Typing in a card's comment box freezes Safari (macOS + iOS) for 5–10s. It worsens during a session and on cards with longer comment threads. Chrome is unaffected.
Profiling (Safari Web Inspector → Timelines, ~57s capture during the freeze):
- Time is dominated by Compositing: ~9.8s total, with single composite frames up to 1.34s and rendering frames up to 2.9s. Scripting CPU is negligible (~0.27s), Layout/Paint minimal. So the cost is in the GPU/compositing layer, not JS or DOM morphing.
- ~15
keydown events fire per typed character (2106 keydown vs 138 input), plus a MutationObserver storm (~3045 callbacks).
drag_and_strum_controller listens for keydown globally and, on each keydown, runs #preloadAudioFiles, constructing new Audio() in a loop (the top JS self-time) — firing even when focus is inside the lexxy comment editor.
Suggested fixes:
drag_and_strum_controller should ignore keydown when focus is in an editor (e.g. event.target.closest('lexxy-editor') / isContentEditable), or preload audio once on connect instead of per keydown.
- The heavy compositing during typing points to large GPU layers (e.g.
will-change / filter / transform on the board) being recomposited on every DOM mutation from the editor — worth narrowing the composited area.
Environment: fizzy:main, Safari on macOS + iOS.
Summary: Typing in a card's comment box freezes Safari (macOS + iOS) for 5–10s. It worsens during a session and on cards with longer comment threads. Chrome is unaffected.
Profiling (Safari Web Inspector → Timelines, ~57s capture during the freeze):
keydownevents fire per typed character (2106keydownvs 138input), plus a MutationObserver storm (~3045 callbacks).drag_and_strum_controllerlistens forkeydownglobally and, on each keydown, runs#preloadAudioFiles, constructingnew Audio()in a loop (the top JS self-time) — firing even when focus is inside thelexxycomment editor.Suggested fixes:
drag_and_strum_controllershould ignorekeydownwhen focus is in an editor (e.g.event.target.closest('lexxy-editor')/isContentEditable), or preload audio once onconnectinstead of per keydown.will-change/filter/transformon the board) being recomposited on every DOM mutation from the editor — worth narrowing the composited area.Environment:
fizzy:main, Safari on macOS + iOS.