You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
isSeeking deadlock — isSeeking now resets on seek slider mouseup when masterVideo is absent or has NaN duration; added 2–3s timeout fallback in stepFrame and doSeek so the flag never gets stuck permanently
drawSplitLabel argument mutation — function no longer modifies the passed name string in-place
bestGrid on empty state — drawGrid now returns early when there are no media elements, preventing a redundant render call
Blob URL leak — URL.revokeObjectURL is now called on remove and clearAll for all media types (video and image); blob URLs from drag-and-drop are also detected and tracked via file.data prefix check
isSeeking stuck on seek error — both stepFrame and doSeek now have a timeout fallback that releases isSeeking if onseeked never fires (e.g. corrupt file)
Loupe stays active after second media added — loupeActive is now forcefully reset alongside the button state when updateControls disables the loupe button
Annotation cleared on auto-deactivation — toggleAnnot now accepts a keepDrawing flag; automatic deactivations (play, split, diff, tile, loupe) pass true so the drawing is preserved; only explicit user action or Escape clears it
syncAnnotCanvas race condition — skips resize if wrap has no size yet; validates imgData before putImageData; logs warnings instead of silently swallowing errors
Tile checkerboard pattern — fixed from column-based ti%2 to true chess pattern (row+col)%2
Keyboard shortcuts not working without mouse click — canvas now gets tabIndex=0 and focus() on load; focus is restored automatically after panel interactions
Localization
Portuguese (pt) — fixed t_export which was incorrectly set to Spanish 'Guardar pantalla (S)'; corrected to 'Salvar tela (S)'
New Features
Mobile layout — responsive CSS breakpoints at 640px and 400px: smaller buttons, flex-wrap panel, bottom-anchored popup menus
Touch support — annotation canvas and split divider now respond to touch events; empty canvas tap opens file picker on mobile
Performance
buildHelp — HTML string now built in a single pass and assigned once instead of repeated innerHTML += in a loop
Annotation canvas — all getContext('2d') calls on the annotation canvas now pass {willReadFrequently: true}
Other
MAX_MEDIA enforced on file input — loop breaks early when the limit is reached, consistent with drag-and-drop behavior
p5.js loading — clarified that the ERR_FILE_NOT_FOUND console error for p5.min.js is expected when no local file is present; CDN fallback loads automatically