# Changelog All notable changes to VidPly will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). ## [1.2.1] - 2026-06-14 ### Added - **VTT speech audio description (extended AD)**: When no described video is configured, VidPly can speak `kind="descriptions"` WebVTT cues via the browser `speechSynthesis` API — pausing playback during each cue and resuming when narration finishes (`DescriptionSpeechManager`). - **Audio description delivery modes** via `audioDescriptionMode`: `auto` (default), `swap`, `vtt_speech`. In `auto`, a described MP4/WebM source takes precedence over VTT speech. - **New options**: `audioDescriptionSpeech` (enable/disable TTS), `audioDescriptionExtended` (resume after speech ends rather than at cue end time). - **New events**: `audiodescriptioncuestart`, `audiodescriptioncueend`. - **Demo**: `demo/single-player-vtt-speech.html` — VTT speech-only AD without described video swap. ## [1.2.0] - 2026-06-04 Maintenance release implementing the findings of an internal code review. No public API was removed; the changes are accessibility refinements, memory-leak fixes, bundle-size reductions, and stricter typing. ### Accessibility - **Menu semantics (1.1.1 / 4.1.2)**: Disabled and empty menu entries are now excluded from roving (arrow-key) focus, so screen-reader and keyboard users no longer land on non-interactive items. - **Single-select menus (4.1.2)**: Speed, quality and caption menus now expose `role="menuitemradio"` with `aria-checked` instead of a visual checkmark only. - **Pinch-zoom restored (1.4.4 / 1.4.10)**: Pseudo-fullscreen (iOS) no longer sets `maximum-scale=1.0, user-scalable=no`, so zoom is no longer blocked while the player fills the viewport. - **Live announcements (4.1.3)**: Play/pause, caption and volume changes triggered by mouse/touch are now announced (previously keyboard-only), and the caption cue overlay carries an `aria-live` region. - **Focus traps**: The interactive transcript window and the settings dialog now trap focus while open and restore it to the trigger on close. - **Reduced motion (2.3.3)**: `scrollIntoView({ behavior: 'smooth' })` in menus, the control bar, the caption overlay and the transcript is now gated behind `prefers-reduced-motion`. - **Target size (2.5.8)**: Floating/transcript resize handles and range thumbs were enlarged to meet the 24×24 CSS-pixel minimum. - **Escape handling**: Floating-player and drag/resize Escape handlers are ordered/scoped so keyboard drag/resize mode can be cancelled without immediately dismissing the player. ### Performance - **Smaller core bundle**: The caption-style panel builder was extracted into a lazily imported module (`controls/CaptionStyleMenu`), so it is fetched only the first time the panel is opened instead of shipping in the always-loaded core. - **Shared SDK loader**: A new `utils/ScriptLoader.loadScriptOnce(url, { integrity })` deduplicates the five separate SDK-injection routines (hls.js, dash.js, YouTube, Vimeo, SoundCloud) and prevents duplicate `