diff --git a/packages/vidstack/src/elements/define/menus/quality-radio-group-element.ts b/packages/vidstack/src/elements/define/menus/quality-radio-group-element.ts index ab929b03a..e813feb7d 100644 --- a/packages/vidstack/src/elements/define/menus/quality-radio-group-element.ts +++ b/packages/vidstack/src/elements/define/menus/quality-radio-group-element.ts @@ -31,7 +31,14 @@ import { renderMenuItemsTemplate } from './_template'; export class MediaQualityRadioGroupElement extends Host(HTMLElement, QualityRadioGroup) { static tagName = 'media-quality-radio-group'; + #connectedRanOnce: Boolean = false; + protected onConnect(): void { + // onConnect can run more than once (eg, Phoenix LiveView after navigation) + if (this.#connectedRanOnce) return; + + this.#connectedRanOnce = true; + renderMenuItemsTemplate(this, (el, option) => { const bitrate = (option as QualityRadioOption).bitrate, bitrateEl = el.querySelector('[data-part="bitrate"]');