import { globalThis } from '../utils/server-safe-globals.js';
import { MediaUIAttributes, MediaUIEvents } from '../constants.js';
import { getMediaController } from '../utils/element-utils.js';
import {
MediaChromeMenu,
createMenuItem,
createIndicator,
} from './media-chrome-menu.js';
import {
parseTextTracksStr,
stringifyTextTrackList,
formatTextTrackObj,
} from '../utils/captions.js';
import { TextTrackLike } from '../utils/TextTrackLike.js';
import { t } from '../utils/i18n.js';
const ccIcon = /*html*/ `
`;
function getTemplateHTML(_attrs: Record) {
return /*html*/ `
${MediaChromeMenu.getTemplateHTML(_attrs)}
${ccIcon}
`;
}
/**
* @extends {MediaChromeMenu}
*
* @slot - Default slotted elements.
* @slot header - An element shown at the top of the menu.
* @slot checked-indicator - An icon element indicating a checked menu-item.
* @slot captions-indicator - An icon element indicating an item with closed captions.
*
* @attr {string} mediasubtitleslist - (read-only) A list of all subtitles and captions.
* @attr {boolean} mediasubtitlesshowing - (read-only) A list of the showing subtitles and captions.
*/
class MediaCaptionsMenu extends MediaChromeMenu {
static getTemplateHTML = getTemplateHTML;
static get observedAttributes(): string[] {
return [
...super.observedAttributes,
MediaUIAttributes.MEDIA_SUBTITLES_LIST,
MediaUIAttributes.MEDIA_SUBTITLES_SHOWING,
];
}
#prevState: string | undefined;
attributeChangedCallback(
attrName: string,
oldValue: string | null,
newValue: string | null
): void {
super.attributeChangedCallback(attrName, oldValue, newValue);
if (
attrName === MediaUIAttributes.MEDIA_SUBTITLES_LIST &&
oldValue !== newValue
) {
this.#render();
} else if (
attrName === MediaUIAttributes.MEDIA_SUBTITLES_SHOWING &&
oldValue !== newValue
) {
this.value = newValue || "";
this.#render();
}
}
connectedCallback(): void {
super.connectedCallback();
this.addEventListener('change', this.#onChange);
}
disconnectedCallback(): void {
super.disconnectedCallback();
this.removeEventListener('change', this.#onChange);
}
/**
* Returns the anchor element when it is a floating menu.
*/
get anchorElement(): HTMLElement {
if (this.anchor !== 'auto') return super.anchorElement;
return getMediaController(this).querySelector('media-captions-menu-button');
}
/**
* @type {Array