feat: release v0.0.1

This commit is contained in:
2026-02-27 09:50:13 +03:00
parent ed30903f96
commit 8f2c799235
321 changed files with 23986 additions and 1 deletions

View File

@@ -0,0 +1,38 @@
import Component from "video.js/dist/types/component";
import Player from "video.js/dist/types/player";
import TachVideoMenu from "../tach-video-menu";
import TachVideoMenuItem from "../tach-video-menu-item";
declare const MenuButton: typeof Component;
export default class TachVideoMenuButton extends MenuButton {
private hideThreshold_;
private buttonPressed_;
private menu;
private menuButton_;
items: TachVideoMenuItem[];
/**
* Button constructor.
*
* @param {Player} player - videojs player instance
*/
constructor(player: Player, title: string, name: string);
/**
* Creates button items.
*
* @return {TachVideoMenuItem[]} - Button items
*/
createItems(): TachVideoMenuItem[];
/**
* Создаёт меню и добавляет в него все пункты.
*
* @return {Menu} - Сконструированное меню
*/
createMenu(): TachVideoMenu;
/**
* Обновление меню без его пересоздания.
*
* @return {Menu} - Обновлённое меню
*/
update(): void;
}
export {};
//# sourceMappingURL=index.d.ts.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../src/core/plugins/settings/components/tach-video-menu-button/index.ts"],"names":[],"mappings":"AACA,OAAO,SAAS,MAAM,+BAA+B,CAAC;AACtD,OAAO,MAAM,MAAM,4BAA4B,CAAC;AAEhD,OAAO,aAAa,MAAM,oBAAoB,CAAC;AAC/C,OAAO,iBAAiB,MAAM,yBAAyB,CAAC;AAExD,QAAA,MAAM,UAAU,kBAAqC,CAAC;AAStD,MAAM,CAAC,OAAO,OAAO,mBAAoB,SAAQ,UAAU;IAC1D,OAAO,CAAC,cAAc,CAAa;IACnC,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,IAAI,CAAiB;IAC7B,OAAO,CAAC,WAAW,CAAa;IACzB,KAAK,EAAE,iBAAiB,EAAE,CAAM;IAEvC;;;;OAIG;gBACS,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM;IAiBvD;;;;OAIG;IACH,WAAW,IAAI,iBAAiB,EAAE;IAIlC;;;;OAIG;IACH,UAAU;IAsBV;;;;OAIG;IACH,MAAM;CA6BN"}

View File

@@ -0,0 +1,90 @@
import videojs from "video.js";
import TachVideoMenu from "../tach-video-menu";
const MenuButton = videojs.getComponent("MenuButton");
const Menu = videojs.getComponent("Menu");
export default class TachVideoMenuButton extends MenuButton {
/**
* Button constructor.
*
* @param {Player} player - videojs player instance
*/
constructor(player, title, name) {
super(player, {
title: title,
name: name,
});
this.hideThreshold_ = 0;
this.buttonPressed_ = false;
this.items = [];
// Перехватываем событие 'mouseenter' на уровне захвата и предотвращаем его дальнейшее распространение
const el = this.menuButton_.el();
el.addEventListener("mouseenter", e => {
e.stopImmediatePropagation();
}, true);
}
/**
* Creates button items.
*
* @return {TachVideoMenuItem[]} - Button items
*/
createItems() {
return [];
}
/**
* Создаёт меню и добавляет в него все пункты.
*
* @return {Menu} - Сконструированное меню
*/
createMenu() {
const menu = new TachVideoMenu(this.player_, {
menuButton: this,
});
this.hideThreshold_ = 0;
this.items = this.createItems();
if (this.items) {
// Если метод updateItems присутствует, используем его для обновления списка
if (typeof menu.updateItems === "function") {
menu.updateItems(this.items);
}
else {
// Если по какой-то причине обновление недоступно, добавляем элементы по одному
this.items.forEach(item => menu.addItem(item));
}
}
return menu;
}
/**
* Обновление меню без его пересоздания.
*
* @return {Menu} - Обновлённое меню
*/
update() {
// Если меню уже создано и поддерживает updateItems, обновляем его содержимое
if (this.menu && typeof this.menu.updateItems === "function") {
this.items = this.createItems();
this.menu.updateItems(this.items);
}
else {
// Если меню ещё не создано, создаём его
this.menu = this.createMenu();
}
this.addChild(this.menu);
/**
* Track the state of the menu button
*
* @type {Boolean}
* @private
*/
this.buttonPressed_ = false;
this.menuButton_.el_.setAttribute("aria-expanded", "false");
if (this.items && this.items?.length <= this.hideThreshold_) {
this.hide();
this.menu.contentEl().removeAttribute("role");
}
else {
this.show();
this.menu.contentEl().setAttribute("role", "menu");
}
}
}
//# sourceMappingURL=index.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../src/core/plugins/settings/components/tach-video-menu-button/index.ts"],"names":[],"mappings":"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"}

View File

@@ -0,0 +1,33 @@
import Player from "video.js/dist/types/player";
import { TachPlayerMenuItemOptions, TachPlayerPlugin } from "../../types";
import TachVideoMenuButton from "../tach-video-menu-button";
declare const VideoJsMenuItemClass: typeof import("video.js/dist/types/component").default;
export interface ITachPlayerMenuItem extends TachPlayerMenuItemOptions {
onClick: () => void;
enabled?: boolean;
value?: unknown;
}
/**
* Extend vjs menu item class.
*/
export default class TachVideoMenuItem extends VideoJsMenuItemClass {
private item;
private button;
private plugin;
/**
* Menu item constructor.
*
* @param {Player} player - vjs player
* @param {ITachVideoMenuItem} item - Item object
* @param {ConcreteButton} button - The containing button.
* @param {TachPlayerPlugin} plugin - This plugin instance.
*/
constructor(player: Player, item: ITachPlayerMenuItem, button: TachVideoMenuButton, plugin: TachPlayerPlugin);
/**
* Click event for menu item.
*/
handleClick(): void;
selected(val: boolean): void;
}
export {};
//# sourceMappingURL=index.d.ts.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../src/core/plugins/settings/components/tach-video-menu-item/index.ts"],"names":[],"mappings":"AACA,OAAO,MAAM,MAAM,4BAA4B,CAAC;AAEhD,OAAO,EAAE,yBAAyB,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC1E,OAAO,mBAAmB,MAAM,2BAA2B,CAAC;AAG5D,QAAA,MAAM,oBAAoB,wDAAmC,CAAC;AAG9D,MAAM,WAAW,mBAAoB,SAAQ,yBAAyB;IACrE,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,OAAO,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,CAAC,OAAO,OAAO,iBAAkB,SAAQ,oBAAoB;IAClE,OAAO,CAAC,IAAI,CAAsB;IAClC,OAAO,CAAC,MAAM,CAAsB;IACpC,OAAO,CAAC,MAAM,CAAmB;IAEjC;;;;;;;OAOG;gBAEF,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,mBAAmB,EACzB,MAAM,EAAE,mBAAmB,EAC3B,MAAM,EAAE,gBAAgB;IAczB;;OAEG;IACH,WAAW;IAWX,QAAQ,CAAC,GAAG,EAAE,OAAO;CAIrB"}

View File

@@ -0,0 +1,45 @@
import videojs from "video.js";
// Concrete classes
const VideoJsMenuItemClass = videojs.getComponent("MenuItem");
/**
* Extend vjs menu item class.
*/
export default class TachVideoMenuItem extends VideoJsMenuItemClass {
/**
* Menu item constructor.
*
* @param {Player} player - vjs player
* @param {ITachVideoMenuItem} item - Item object
* @param {ConcreteButton} button - The containing button.
* @param {TachPlayerPlugin} plugin - This plugin instance.
*/
constructor(player, item, button, plugin) {
super(player, {
label: item.label,
selectable: item.selectable || true,
selected: item.selected || false,
});
this.item = item;
this.button = button;
this.plugin = plugin;
item.className && this.addClass(item.className);
}
/**
* Click event for menu item.
*/
handleClick() {
if (this.item.onClick) {
// Reset other menu items selected status.
for (let i = 0; i < this.button.items?.length; ++i) {
this.button.items[i].selected(false);
}
this.selected(true);
return this.item.onClick();
}
}
selected(val) {
//@ts-expect-error // getComponent reduant
super.selected(val);
}
}
//# sourceMappingURL=index.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../src/core/plugins/settings/components/tach-video-menu-item/index.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,UAAU,CAAC;AAM/B,mBAAmB;AACnB,MAAM,oBAAoB,GAAG,OAAO,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC;AAS9D;;GAEG;AACH,MAAM,CAAC,OAAO,OAAO,iBAAkB,SAAQ,oBAAoB;IAKlE;;;;;;;OAOG;IACH,YACC,MAAc,EACd,IAAyB,EACzB,MAA2B,EAC3B,MAAwB;QAExB,KAAK,CAAC,MAAM,EAAE;YACb,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,UAAU,EAAE,IAAI,CAAC,UAAU,IAAI,IAAI;YACnC,QAAQ,EAAE,IAAI,CAAC,QAAQ,IAAI,KAAK;SACzB,CAAC,CAAC;QACV,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QAErB,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACjD,CAAC;IAED;;OAEG;IACH,WAAW;QACV,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YACvB,0CAA0C;YAC1C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC;gBACpD,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;YACtC,CAAC;YACD,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;YACpB,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;QAC5B,CAAC;IACF,CAAC;IAED,QAAQ,CAAC,GAAY;QACpB,0CAA0C;QAC1C,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;IACrB,CAAC;CACD"}

View File

@@ -0,0 +1,33 @@
import Player from "video.js/dist/types/player";
import TachVideoMenuButton from "../tach-video-menu-button";
import TachVideoMenuItem from "../tach-video-menu-item";
declare const VideoJsMenuClass: typeof import("video.js/dist/types/component").default;
type BaseMenuOptions = ConstructorParameters<typeof VideoJsMenuClass>[1];
interface TachMenuOptions extends NonNullable<BaseMenuOptions> {
menuButton: TachVideoMenuButton;
}
/**
* Extend vjs menu item class.
*/
export default class TachVideoMenu extends VideoJsMenuClass {
private menuOpened_;
/**
* Menu item constructor.
*
* @param {Player} player - vjs player
* @param {TachPlayerMenuItemOptions} item - Item object
* @param {ConcreteButton} button - The containing button.
* @param {TachPlayerPlugin} plugin - This plugin instance.
*/
constructor(player: Player, options: TachMenuOptions);
hide(): void;
show(): void;
addItem(item: TachVideoMenuItem): void;
/**
* Обновляет пункты меню.
* @param {Array<Object|string>} newItems - Массив новых компонентов или их имён, которые будут добавлены в меню.
*/
updateItems(newItems: TachVideoMenuItem[]): void;
}
export {};
//# sourceMappingURL=index.d.ts.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../src/core/plugins/settings/components/tach-video-menu/index.ts"],"names":[],"mappings":"AACA,OAAO,MAAM,MAAM,4BAA4B,CAAC;AAEhD,OAAO,mBAAmB,MAAM,2BAA2B,CAAC;AAC5D,OAAO,iBAAiB,MAAM,yBAAyB,CAAC;AAGxD,QAAA,MAAM,gBAAgB,wDAA+B,CAAC;AAMtD,KAAK,eAAe,GAAG,qBAAqB,CAAC,OAAO,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC;AACzE,UAAU,eAAgB,SAAQ,WAAW,CAAC,eAAe,CAAC;IAC7D,UAAU,EAAE,mBAAmB,CAAC;CAChC;AAED;;GAEG;AACH,MAAM,CAAC,OAAO,OAAO,aAAc,SAAQ,gBAAgB;IAC1D,OAAO,CAAC,WAAW,CAAkB;IACrC;;;;;;;OAOG;gBACS,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe;IAUpD,IAAI;IAMJ,IAAI;IAMJ,OAAO,CAAC,IAAI,EAAE,iBAAiB;IAK/B;;;OAGG;IACH,WAAW,CAAC,QAAQ,EAAE,iBAAiB,EAAE;CAczC"}

View File

@@ -0,0 +1,56 @@
import videojs from "video.js";
// Concrete classes
const VideoJsMenuClass = videojs.getComponent("Menu");
/**
* Extend vjs menu item class.
*/
export default class TachVideoMenu extends VideoJsMenuClass {
/**
* Menu item constructor.
*
* @param {Player} player - vjs player
* @param {TachPlayerMenuItemOptions} item - Item object
* @param {ConcreteButton} button - The containing button.
* @param {TachPlayerPlugin} plugin - This plugin instance.
*/
constructor(player, options) {
super(player, options);
this.menuOpened_ = false;
player.on("userinactive", () => {
if (this.menuOpened_) {
player.userActive(true);
}
});
}
hide() {
this.menuOpened_ = false;
// Вызов родительского метода скрытия
super.hide();
}
show() {
this.menuOpened_ = true;
// Вызов родительского метода скрытия
super.show();
}
addItem(item) {
//@ts-expect-error getComponent reduant method
super.addItem(item);
}
/**
* Обновляет пункты меню.
* @param {Array<Object|string>} newItems - Массив новых компонентов или их имён, которые будут добавлены в меню.
*/
updateItems(newItems) {
// Получаем текущих потомков
const currentChildren = this.children().slice();
// Удаляем все остальные дочерние компоненты.
currentChildren.forEach(child => {
this.removeChild(child);
});
// Добавляем новые пункты меню.
newItems.forEach(item => {
this.addItem(item);
});
}
}
//# sourceMappingURL=index.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../src/core/plugins/settings/components/tach-video-menu/index.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,UAAU,CAAC;AAM/B,mBAAmB;AACnB,MAAM,gBAAgB,GAAG,OAAO,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;AAWtD;;GAEG;AACH,MAAM,CAAC,OAAO,OAAO,aAAc,SAAQ,gBAAgB;IAE1D;;;;;;;OAOG;IACH,YAAY,MAAc,EAAE,OAAwB;QACnD,KAAK,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAVhB,gBAAW,GAAY,KAAK,CAAC;QAYpC,MAAM,CAAC,EAAE,CAAC,cAAc,EAAE,GAAG,EAAE;YAC9B,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;gBACtB,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;YACzB,CAAC;QACF,CAAC,CAAC,CAAC;IACJ,CAAC;IAED,IAAI;QACH,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;QACzB,qCAAqC;QACrC,KAAK,CAAC,IAAI,EAAE,CAAC;IACd,CAAC;IAED,IAAI;QACH,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;QACxB,qCAAqC;QACrC,KAAK,CAAC,IAAI,EAAE,CAAC;IACd,CAAC;IAED,OAAO,CAAC,IAAuB;QAC9B,8CAA8C;QAC9C,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACrB,CAAC;IAED;;;OAGG;IACH,WAAW,CAAC,QAA6B;QACxC,4BAA4B;QAC5B,MAAM,eAAe,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,CAAC;QAEhD,6CAA6C;QAC7C,eAAe,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;YAC/B,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;QACzB,CAAC,CAAC,CAAC;QAEH,+BAA+B;QAC/B,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;YACvB,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACpB,CAAC,CAAC,CAAC;IACJ,CAAC;CACD"}

53
dist/core/plugins/settings/index.d.ts vendored Normal file
View File

@@ -0,0 +1,53 @@
import Component from "video.js/dist/types/component";
import Player from "video.js/dist/types/player";
import Plugin from "video.js/dist/types/plugin";
import "./settings.css";
interface SettingsButtonOptions {
}
interface PlayerWithControlBar extends Player {
hlsInstance?: unknown;
controlBar: Component;
}
declare const BasePlugin: typeof Plugin;
declare class SettingsButton extends BasePlugin {
private options;
private mainMenu;
private settingsButton;
private buttonInstance;
private backButton;
private playbackRateButton;
private qualityRateButton;
private audioTracksButton;
private textTracksButton;
constructor(player: PlayerWithControlBar, options: SettingsButtonOptions);
/**
* Инициализация плагина: создание кнопки настроек и привязка событий
*/
private initialize;
/**
* Привязка событий плеера (например, для обновления меню)
*/
private bindPlayerEvents;
/**
* Создание кнопки настроек и определение пунктов меню.
* Здесь создаются фабрики для формирования кнопок и устанавливается начальное меню.
*/
private createSettingsButton;
/**
* Обёртка для создания экземпляра пункта меню.
*
* @param item - объект настроек пункта меню
* @returns экземпляр TachVideoMenuItem
*/
private getMenuItem;
/**
* Устанавливает (обновляет) пункты меню плагина.
*
* @param items - массив пунктов меню (если не передан, используются кнопки по умолчанию)
* @param skipBackButton - если true, не добавлять кнопку "Назад"
* @param forceShow - если true, принудительно показать меню после обновления
*/
private setMenu;
}
export default SettingsButton;
//# sourceMappingURL=index.d.ts.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/core/plugins/settings/index.ts"],"names":[],"mappings":"AACA,OAAO,SAAS,MAAM,+BAA+B,CAAC;AACtD,OAAO,MAAM,MAAM,4BAA4B,CAAC;AAChD,OAAO,MAAM,MAAM,4BAA4B,CAAC;AAWhD,OAAO,gBAAgB,CAAC;AAGxB,UAAU,qBAAqB;CAE9B;AAGD,UAAU,oBAAqB,SAAQ,MAAM;IAC5C,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,UAAU,EAAE,SAAS,CAAC;CACtB;AAED,QAAA,MAAM,UAAU,EAAmC,OAAO,MAAM,CAAC;AAKjE,cAAM,cAAe,SAAQ,UAAU;IACtC,OAAO,CAAC,OAAO,CAAwB;IACvC,OAAO,CAAC,QAAQ,CAA6B;IAC7C,OAAO,CAAC,cAAc,CAAuB;IAC7C,OAAO,CAAC,cAAc,CAAa;IAGnC,OAAO,CAAC,UAAU,CAAuB;IACzC,OAAO,CAAC,kBAAkB,CAA6B;IACvD,OAAO,CAAC,iBAAiB,CAA6B;IACtD,OAAO,CAAC,iBAAiB,CAA6B;IACtD,OAAO,CAAC,gBAAgB,CAA6B;gBAEzC,MAAM,EAAE,oBAAoB,EAAE,OAAO,EAAE,qBAAqB;IAMxE;;OAEG;IACH,OAAO,CAAC,UAAU;IAKlB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAKxB;;;OAGG;IACH,OAAO,CAAC,oBAAoB;IA8D5B;;;;;OAKG;IACH,OAAO,CAAC,WAAW;IAInB;;;;;;OAMG;YACW,OAAO;CA8CrB;AAID,eAAe,cAAc,CAAC"}

141
dist/core/plugins/settings/index.js vendored Normal file
View File

@@ -0,0 +1,141 @@
import videojs from "video.js";
import TachVideoMenuButton from "./components/tach-video-menu-button";
import TachVideoMenuItem from "./components/tach-video-menu-item";
import audioTrackSelector from "./selectors/audio-track-selector";
import playbackRateSelector from "./selectors/playback-rate-selector";
import qualityRateSelector from "./selectors/quality-rate-selector";
import textTracksSelector from "./selectors/text-track-selector";
import "./settings.css";
const BasePlugin = videojs.getPlugin("plugin");
// Значения опций по умолчанию
const defaults = {};
class SettingsButton extends BasePlugin {
constructor(player, options) {
super(player);
this.mainMenu = [];
this.options = videojs.obj.merge(defaults, options);
this.player.ready(() => this.initialize());
}
/**
* Инициализация плагина: создание кнопки настроек и привязка событий
*/
initialize() {
this.createSettingsButton();
this.bindPlayerEvents();
}
/**
* Привязка событий плеера (например, для обновления меню)
*/
bindPlayerEvents() {
// При необходимости можно привязать событие, например:
// this.settingsButton.on("click", this.setMenu.bind(this, undefined, false, true));
}
/**
* Создание кнопки настроек и определение пунктов меню.
* Здесь создаются фабрики для формирования кнопок и устанавливается начальное меню.
*/
createSettingsButton() {
const player = this.player;
// Создаем кнопку настроек с помощью компонента TachVideoMenuButton
this.settingsButton = new TachVideoMenuButton(player, "Settings", "Settings");
this.buttonInstance = player.controlBar.addChild(this.settingsButton, {
componentClass: "settingsButton",
});
this.buttonInstance.addClass("vjs-settings-button");
// Определяем кнопку "Назад" для возврата в главное меню
this.backButton = {
label: "Назад",
value: this.mainMenu,
selectable: false,
selected: false,
onClick: () => this.setMenu(undefined, true, true),
className: "settings-back",
};
// Создаем фабрики для дополнительных настроек
const { menuItem: audioMenuItem, menuItems: audioMenuItems } = audioTrackSelector(player);
this.audioTracksButton = () => ({
...audioMenuItem(),
onClick: () => this.setMenu(audioMenuItems(), false, true),
});
const { menuItem: textMenuItem, menuItems: textMenuItems } = textTracksSelector(player);
this.textTracksButton = () => ({
...textMenuItem(),
onClick: () => this.setMenu(textMenuItems(), false, true),
});
const { menuItem: playbackMenuItem, menuItems: playbackMenuItems } = playbackRateSelector(player);
this.playbackRateButton = () => ({
...playbackMenuItem(),
onClick: () => this.setMenu(playbackMenuItems(), false, true),
});
// В createSettingsButton замени этот участок:
const qualitySelector = qualityRateSelector(player);
this.qualityRateButton = () => ({
...qualitySelector.menuItem(), // пересоздание при каждом открытии меню
onClick: () => this.setMenu(qualitySelector.menuItems(), false, true),
});
// Подписка на автообновление, когда hls переключает уровень
qualitySelector.setMenuUpdateCallback(() => {
this.setMenu(undefined, true); // Обновить главное меню без перезахода
});
// Инициализируем меню с кнопками по умолчанию без показа
this.setMenu(undefined, true, false);
}
/**
* Обёртка для создания экземпляра пункта меню.
*
* @param item - объект настроек пункта меню
* @returns экземпляр TachVideoMenuItem
*/
getMenuItem(item) {
return new TachVideoMenuItem(this.player, item, this.settingsButton, this);
}
/**
* Устанавливает (обновляет) пункты меню плагина.
*
* @param items - массив пунктов меню (если не передан, используются кнопки по умолчанию)
* @param skipBackButton - если true, не добавлять кнопку "Назад"
* @param forceShow - если true, принудительно показать меню после обновления
*/
async setMenu(items = [], skipBackButton = false, forceShow = false) {
const menuButtons = [];
if (!skipBackButton) {
menuButtons.push(this.backButton);
}
if (items?.length === 0) {
// Если не переданы конкретные пункты меню используем кнопки по умолчанию
const defaultButtons = [
this.playbackRateButton,
this.qualityRateButton,
this.textTracksButton,
this.audioTracksButton,
];
defaultButtons.forEach(createButton => {
const btn = createButton();
if (btn.enabled) {
menuButtons.push(btn);
}
});
}
else {
menuButtons.push(...items);
}
// Формируем список пунктов меню: вместо пересоздания меню, назначаем функцию,
// возвращающую актуальный список пунктов, и вызываем метод обновления.
this.settingsButton.createItems = () => menuButtons.map(item => this.getMenuItem(item));
await this.settingsButton.update();
// Если требуется принудительно показать меню, эмулируем клик по кнопке меню
if (forceShow) {
const menuElement = this.buttonInstance.el().querySelector(".vjs-menu");
const menuButton = this.buttonInstance
.el()
.querySelector(".vjs-menu-button");
if (menuElement && menuButton) {
menuButton.click();
}
}
}
}
// Регистрируем плагин в Video.js
videojs.registerPlugin("settingsMenu", SettingsButton);
export default SettingsButton;
//# sourceMappingURL=index.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/core/plugins/settings/index.ts"],"names":[],"mappings":"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"}

View File

@@ -0,0 +1,27 @@
import Player from "video.js/dist/types/player";
import { TachPlayerMenuItemOptions } from "../../types";
interface TrackMenuOptions extends TachPlayerMenuItemOptions {
}
declare const audioTrack: (player: Player, options?: TrackMenuOptions) => {
menuItems: () => {
label: string;
value: number;
selected: boolean;
onClick: () => void;
}[] | {
label: string;
value: string | undefined;
selected: boolean;
onClick: () => void;
}[];
menuItem: () => {
value: string | null;
enabled: boolean;
label: string;
selectable?: boolean;
selected?: boolean;
className?: string;
};
};
export default audioTrack;
//# sourceMappingURL=index.d.ts.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../src/core/plugins/settings/selectors/audio-track-selector/index.ts"],"names":[],"mappings":"AACA,OAAO,MAAM,MAAM,4BAA4B,CAAC;AAEhD,OAAO,EAAE,yBAAyB,EAAE,MAAM,aAAa,CAAC;AASxD,UAAU,gBAAiB,SAAQ,yBAAyB;CAAG;AAe/D,QAAA,MAAM,UAAU,GAAI,QAAQ,MAAM,EAAE,UAAS,gBAA2B;;;;;;;;;;;;;;;;;;;;CAmJvE,CAAC;AAEF,eAAe,UAAU,CAAC"}

View File

@@ -0,0 +1,125 @@
const defaults = {
label: "Язык",
selected: false,
selectable: false,
className: "audio-selector",
};
const audioTrack = (player, options = defaults) => {
const playerWithTracks = player;
const getNativeTrackList = () => {
if (typeof playerWithTracks.audioTracks !== "function") {
return undefined;
}
return playerWithTracks.audioTracks();
};
const getNativeTracks = () => {
return getNativeTrackList()?.tracks_ ?? [];
};
const setNativeTrack = (track) => {
const audioTracks = getNativeTracks();
for (let i = 0; i < audioTracks.length; ++i) {
audioTracks[i].enabled = audioTracks[i] === track;
}
};
const getSelectedNativeTrack = () => {
const audioTracks = getNativeTracks();
for (let i = 0; i < audioTracks.length; ++i) {
if (audioTracks[i].enabled === true) {
return audioTracks[i];
}
}
return null;
};
const getHlsInstance = () => playerWithTracks.hlsInstance ?? null;
const getHlsTracks = () => {
const hls = getHlsInstance();
return hls?.audioTracks ?? [];
};
const setHlsTrack = (trackId) => {
const hls = getHlsInstance();
if (!hls)
return;
hls.audioTrack = trackId;
};
const getSelectedHlsTrack = () => {
const hls = getHlsInstance();
if (!hls)
return null;
const tracks = getHlsTracks();
const currentId = hls.audioTrack;
return tracks.find(track => track.id === currentId) ?? null;
};
const formatHlsTrackLabel = (track, index) => {
if (track.name?.trim()) {
return track.name.trim();
}
if (track.lang?.trim()) {
return track.lang.trim().toUpperCase();
}
const fallbackIndex = typeof index === "number"
? index + 1
: typeof track.id === "number"
? track.id + 1
: 1;
return `Дорожка ${fallbackIndex}`;
};
const buildHlsMenuItems = () => {
const hls = getHlsInstance();
const hlsTracks = getHlsTracks();
if (!hls || hlsTracks.length === 0) {
return [];
}
return hlsTracks.map((track, index) => ({
label: formatHlsTrackLabel(track, index),
value: track.id,
selected: track.id === hls.audioTrack,
onClick: () => setHlsTrack(track.id),
}));
};
const hasAudioTracks = () => {
if (getHlsTracks().length > 0) {
return true;
}
return getNativeTracks().length > 0;
};
const menuItems = () => {
const hlsTracks = buildHlsMenuItems();
if (hlsTracks.length > 0) {
return hlsTracks;
}
const nativeTracks = getNativeTracks();
const trackItems = [];
for (let i = 0; i < nativeTracks?.length; ++i) {
const trackItem = {
label: nativeTracks[i].label || "Default",
value: nativeTracks[i].label,
selected: nativeTracks[i].enabled,
onClick: () => setNativeTrack(nativeTracks[i]),
};
trackItems.push(trackItem);
}
return trackItems;
};
const getSelectedTrackLabel = () => {
const selectedHlsTrack = getSelectedHlsTrack();
if (selectedHlsTrack) {
const tracks = getHlsTracks();
const index = tracks.findIndex(track => track.id === selectedHlsTrack.id);
return formatHlsTrackLabel(selectedHlsTrack, index);
}
return getSelectedNativeTrack()?.label ?? null;
};
const menuItem = () => {
return {
...options,
value: getSelectedTrackLabel(),
enabled: hasAudioTracks(),
};
};
return {
menuItems,
menuItem,
};
};
export default audioTrack;
//# sourceMappingURL=index.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../src/core/plugins/settings/selectors/audio-track-selector/index.ts"],"names":[],"mappings":"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"}

View File

@@ -0,0 +1,30 @@
import Player from "video.js/dist/types/player";
import { TachPlayerMenuItemOptions } from "../../types";
interface SpeedMenuOptions extends TachPlayerMenuItemOptions {
speeds: Array<{
label: string;
value: number;
}>;
}
declare const playbackRate: (player: Player, options?: SpeedMenuOptions) => {
menuItems: () => {
label: string;
selectable: boolean;
selected: boolean;
onClick: () => number | undefined;
}[];
menuItem: () => {
enabled: boolean;
speeds: Array<{
label: string;
value: number;
}>;
label: string;
value?: any;
selectable?: boolean;
selected?: boolean;
className?: string;
};
};
export default playbackRate;
//# sourceMappingURL=index.d.ts.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../src/core/plugins/settings/selectors/playback-rate-selector/index.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,4BAA4B,CAAC;AAEhD,OAAO,EAAE,yBAAyB,EAAE,MAAM,aAAa,CAAC;AAgBxD,UAAU,gBAAiB,SAAQ,yBAAyB;IAC3D,MAAM,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAChD;AAED,QAAA,MAAM,YAAY,GAAI,QAAQ,MAAM,EAAE,UAAS,gBAA2B;;;;;;;;;gBAHjE,KAAK,CAAC;YAAE,KAAK,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,MAAM,CAAA;SAAE,CAAC;;;;;;;CAwB/C,CAAC;AAEF,eAAe,YAAY,CAAC"}

View File

@@ -0,0 +1,35 @@
const defaults = {
label: "Скорость воспроизведения",
selected: false,
selectable: false,
speeds: [
{ label: "0.5x", value: 0.5 },
{ label: "Обычная", value: 1 },
{ label: "1.5x", value: 1.5 },
{ label: "1.75x", value: 1.75 },
{ label: "2x", value: 2 },
],
className: "speed-selector",
};
const playbackRate = (player, options = defaults) => {
const menuItems = () => options.speeds.map(speed => {
return {
label: speed.label,
selectable: true,
selected: speed.value === player.playbackRate(),
onClick: () => player.playbackRate(speed.value),
};
});
const menuItem = () => {
return {
...options,
enabled: true,
};
};
return {
menuItems,
menuItem,
};
};
export default playbackRate;
//# sourceMappingURL=index.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../src/core/plugins/settings/selectors/playback-rate-selector/index.ts"],"names":[],"mappings":"AAIA,MAAM,QAAQ,GAAG;IAChB,KAAK,EAAE,0BAA0B;IACjC,QAAQ,EAAE,KAAK;IACf,UAAU,EAAE,KAAK;IACjB,MAAM,EAAE;QACP,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE;QAC7B,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,EAAE;QAC9B,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE;QAC7B,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE;QAC/B,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE;KACzB;IACD,SAAS,EAAE,gBAAgB;CAC3B,CAAC;AAMF,MAAM,YAAY,GAAG,CAAC,MAAc,EAAE,UAA4B,QAAQ,EAAE,EAAE;IAC7E,MAAM,SAAS,GAAG,GAAG,EAAE,CACtB,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE;QAC1B,OAAO;YACN,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,UAAU,EAAE,IAAI;YAChB,QAAQ,EAAE,KAAK,CAAC,KAAK,KAAK,MAAM,CAAC,YAAY,EAAE;YAC/C,OAAO,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC,KAAK,CAAC;SAC/C,CAAC;IACH,CAAC,CAAC,CAAC;IACJ,MAAM,QAAQ,GAAG,GAAG,EAAE;QACrB,OAAO;YACN,GAAG,OAAO;YACV,OAAO,EAAE,IAAI;SACb,CAAC;IACH,CAAC,CAAC;IAEF,OAAO;QACN,SAAS;QACT,QAAQ;KACR,CAAC;AACH,CAAC,CAAC;AAEF,eAAe,YAAY,CAAC"}

View File

@@ -0,0 +1,39 @@
import Player from "video.js/dist/types/player";
import { TachPlayerMenuItemOptions } from "../../types";
interface QualityMenuOptions extends TachPlayerMenuItemOptions {
}
declare const qualityRate: (player: Player, options?: QualityMenuOptions) => {
menuItems: () => {
label: string;
value: string;
selected: boolean;
onClick: () => void;
}[];
menuItem: () => {
enabled: boolean;
label: string;
value?: any;
selectable?: boolean;
selected?: boolean;
className?: string;
};
setMenuUpdateCallback: () => void;
} | {
menuItem: () => {
enabled: boolean;
label: string;
value?: any;
selectable?: boolean;
selected?: boolean;
className?: string;
};
menuItems: () => {
label: string;
value: number;
selected: boolean;
onClick: () => void;
}[];
setMenuUpdateCallback: (cb: () => void) => void;
};
export default qualityRate;
//# sourceMappingURL=index.d.ts.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../src/core/plugins/settings/selectors/quality-rate-selector/index.ts"],"names":[],"mappings":"AACA,OAAO,MAAM,MAAM,4BAA4B,CAAC;AAEhD,OAAO,EAAE,yBAAyB,EAAE,MAAM,aAAa,CAAC;AAgBxD,UAAU,kBAAmB,SAAQ,yBAAyB;CAAG;AAEjE,QAAA,MAAM,WAAW,GAChB,QAAQ,MAAM,EACd,UAAS,kBAA6B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;gCAyHH,MAAM,IAAI;CAgB7C,CAAC;AAEF,eAAe,WAAW,CAAC"}

View File

@@ -0,0 +1,125 @@
import Hls from "hls.js";
const defaults = {
label: "Качество",
selected: false,
selectable: false,
className: "quality-selector",
};
const qualityRate = (player, options = defaults) => {
const hls = player.hlsInstance;
let onMenuUpdate = null;
if (!hls) {
return {
menuItems: () => [
{ label: "Авто", value: "auto", selected: true, onClick: () => { } },
],
menuItem: () => ({ ...options, enabled: false }),
setMenuUpdateCallback: () => { },
};
}
// Инициализация состояния уровней качества
let levels = [];
let isMenuInitialized = false;
const updateLevels = () => {
if (hls.levels?.length > 0) {
levels = hls.levels;
if (!isMenuInitialized) {
isMenuInitialized = true;
}
if (onMenuUpdate) {
onMenuUpdate();
}
}
};
// Обновляем уровни при загрузке манифеста
hls.on(Hls.Events.MANIFEST_PARSED, () => {
updateLevels();
});
// Проверяем, есть ли уже доступные уровни
if (hls.levels && hls.levels?.length > 0) {
levels = hls.levels;
}
const getPixels = (l) => (l.width > l.height ? l.height : l.width);
const formatBitrate = (bps) => (bps / 1000000).toFixed(1).replace(/\.0$/, "") + " Мбит";
const getCurrentAutoLevel = () => {
const current = levels[hls.currentLevel];
return current ? `${getPixels(current)}p` : "";
};
const getCurrentManualLevel = () => {
const manual = levels[hls.manualLevel];
return manual
? `${getPixels(manual)}p / ${formatBitrate(manual.bitrate)}`
: "Качество";
};
const menuItem = () => {
return {
...options,
enabled: levels?.length > 0,
label: levels?.length === 0
? "Качество"
: levels?.length === 1
? "Авто"
: hls.autoLevelEnabled
? `Авто (${getCurrentAutoLevel()})`
: getCurrentManualLevel(),
};
};
const setQuality = (quality) => {
if (!levels?.length)
return;
if (quality === 'auto') {
hls.currentLevel = -1;
}
else if (typeof quality === 'number') {
hls.currentLevel = quality;
}
};
const menuItems = () => {
const isAuto = hls.autoLevelEnabled;
// Если доступен только один уровень качества, показываем только "Авто"
if (levels?.length <= 1) {
return [{
label: "Авто",
value: -1,
selected: true,
onClick: () => setQuality('auto'),
}];
}
const items = levels.map((level, index) => {
const label = `${getPixels(level)}p / ${formatBitrate(level.bitrate)}`;
const selected = !isAuto && hls.currentLevel === index;
return {
label,
value: index,
selected,
onClick: () => setQuality(index),
};
});
items.sort((a, b) => b.value - a.value);
// Добавляем "Авто" с информацией о текущем качестве только если есть выбор
items.push({
label: isAuto ? `Авто (${getCurrentAutoLevel()})` : "Авто",
value: -1,
selected: isAuto,
onClick: () => setQuality('auto'),
});
return items;
};
// Позволяет установить внешний колбэк на обновление меню
const setMenuUpdateCallback = (cb) => {
onMenuUpdate = cb;
// Если уже есть уровни качества, сразу обновляем меню
if (levels?.length > 0) {
requestAnimationFrame(() => cb());
}
};
// Подписка на смену уровня (в т.ч. в авто режиме)
hls.on(Hls.Events.LEVEL_SWITCHED, () => {
if (onMenuUpdate) {
onMenuUpdate(); // триггерим обновление главного меню
}
});
return { menuItem, menuItems, setMenuUpdateCallback };
};
export default qualityRate;
//# sourceMappingURL=index.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../src/core/plugins/settings/selectors/quality-rate-selector/index.ts"],"names":[],"mappings":"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"}

View File

@@ -0,0 +1,26 @@
import Player from "video.js/dist/types/player";
import { TachPlayerMenuItemOptions } from "../../types";
interface QualityMenuOptions extends TachPlayerMenuItemOptions {
}
declare const textTracks: (player: Player & {
textTracks: () => {
tracks_?: TextTrack[];
};
}, options?: QualityMenuOptions) => {
menuItems: () => {
label: any;
value: any;
selected: boolean;
onClick: () => void;
}[];
menuItem: () => {
enabled: boolean;
label: string;
value?: any;
selectable?: boolean;
selected?: boolean;
className?: string;
};
};
export default textTracks;
//# sourceMappingURL=index.d.ts.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../src/core/plugins/settings/selectors/text-track-selector/index.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,4BAA4B,CAAC;AAEhD,OAAO,EAAE,yBAAyB,EAAE,MAAM,aAAa,CAAC;AASxD,UAAU,kBAAmB,SAAQ,yBAAyB;CAAG;AAEjE,QAAA,MAAM,UAAU,GACf,QAAQ,MAAM,GAAG;IAAE,UAAU,EAAE,MAAM;QAAE,OAAO,CAAC,EAAE,SAAS,EAAE,CAAA;KAAE,CAAA;CAAE,EAChE,UAAS,kBAA6B;;;;;;;;;;;;;;;CAgDtC,CAAC;AAEF,eAAe,UAAU,CAAC"}

View File

@@ -0,0 +1,49 @@
const defaults = {
label: "Субтитры",
selected: false,
selectable: false,
className: "subs-selector",
};
const textTracks = (player, options = defaults) => {
const menuItems = () => {
const textTracks = player.textTracks().tracks_;
const trackItems = [];
for (let i = 0; i < textTracks?.length; ++i) {
if (textTracks[i].mode === "hidden") {
continue;
}
const trackItem = {
label: textTracks[i].label,
value: textTracks[i].label,
selected: textTracks[i].mode === "showing",
onClick: () => setTrack(textTracks[i]),
};
trackItems.push(trackItem);
}
return trackItems;
};
const setTrack = (track) => {
const textTracks = player.textTracks().tracks_;
for (let i = 0; i < textTracks?.length; ++i) {
if (textTracks[i].mode === "hidden") {
continue;
}
if (textTracks[i].label === track.label)
textTracks[i].mode = "showing";
else
textTracks[i].mode = "disabled";
}
};
const menuItem = () => {
return {
...options,
enabled: menuItems().length > 0,
};
};
return {
menuItems,
menuItem,
};
};
export default textTracks;
//# sourceMappingURL=index.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../src/core/plugins/settings/selectors/text-track-selector/index.ts"],"names":[],"mappings":"AAIA,MAAM,QAAQ,GAAG;IAChB,KAAK,EAAE,UAAU;IACjB,QAAQ,EAAE,KAAK;IACf,UAAU,EAAE,KAAK;IACjB,SAAS,EAAE,eAAe;CAC1B,CAAC;AAIF,MAAM,UAAU,GAAG,CAClB,MAAgE,EAChE,UAA8B,QAAQ,EACrC,EAAE;IACH,MAAM,SAAS,GAAG,GAAG,EAAE;QACtB,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,EAAE,CAAC,OAAO,CAAC;QAC/C,MAAM,UAAU,GAAG,EAAE,CAAC;QAEtB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC;YAC7C,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACrC,SAAS;YACV,CAAC;YAED,MAAM,SAAS,GAAG;gBACjB,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,KAAK;gBAC1B,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,KAAK;gBAC1B,QAAQ,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,SAAS;gBAC1C,OAAO,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;aACtC,CAAC;YAEF,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC5B,CAAC;QAED,OAAO,UAAU,CAAC;IACnB,CAAC,CAAC;IAEF,MAAM,QAAQ,GAAG,CAAC,KAAgB,EAAE,EAAE;QACrC,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,EAAE,CAAC,OAAO,CAAC;QAE/C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC;YAC7C,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACrC,SAAS;YACV,CAAC;YAED,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,KAAK;gBAAE,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,SAAS,CAAC;;gBACnE,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,UAAU,CAAC;QACtC,CAAC;IACF,CAAC,CAAC;IAEF,MAAM,QAAQ,GAAG,GAAG,EAAE;QACrB,OAAO;YACN,GAAG,OAAO;YACV,OAAO,EAAE,SAAS,EAAE,CAAC,MAAM,GAAG,CAAC;SAC/B,CAAC;IACH,CAAC,CAAC;IAEF,OAAO;QACN,SAAS;QACT,QAAQ;KACR,CAAC;AACH,CAAC,CAAC;AAEF,eAAe,UAAU,CAAC"}

93
dist/core/plugins/settings/settings.css vendored Normal file
View File

@@ -0,0 +1,93 @@
.video-js {
.vjs-control-bar {
.vjs-settings-button {
.vjs-menu {
z-index: 10 !important;
&.vjs-lock-showing {
width: 100%;
.vjs-menu-content {
height: fit-content;
bottom: 3em;
width: 340px;
left: -220px;
}
}
}
}
}
&.vjs-mobile-ui {
.vjs-control-bar {
.vjs-settings-button {
.vjs-menu {
&.vjs-lock-showing {
width: 100%;
position: fixed;
.vjs-menu-content {
border-radius: 0;
width: 100vw;
height: 100vh;
padding-top: 50vh;
padding-left: 20px;
padding-right: 20px;
padding-bottom: 5px;
max-height: 100vh;
position: fixed;
top: 0;
left: 0;
/* top: 85%;
left: 50%; */
/* transform: translate(-50%, -85%); */
background: rgba(
0,
0,
0,
0.5
); /* затемнение в области паддингов */
&:hover {
border-radius: 0 !important;
}
&::before {
content: "";
position: absolute;
top: 50vh;
left: 20px;
right: 20px;
bottom: 5px;
background: var(--Default-BgDarken);
border-radius: 10px; /* желаемый border-radius */
}
.vjs-menu-item {
position: relative;
z-index: 2;
border-radius: 0;
&:hover {
border-radius: 0 !important;
}
}
@media (orientation: landscape) {
padding-top: 20px;
padding-left: 25vw;
padding-right: 25vw;
&::before {
top: 20px;
left: 25vw;
right: 25vw;
}
}
}
}
}
}
}
}
}

10
dist/core/plugins/settings/types.d.ts vendored Normal file
View File

@@ -0,0 +1,10 @@
export interface TachPlayerMenuItemOptions {
label: string;
value?: any;
selectable?: boolean;
selected?: boolean;
className?: string;
}
export interface TachPlayerPlugin {
}
//# sourceMappingURL=types.d.ts.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/core/plugins/settings/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,yBAAyB;IACzC,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,GAAG,CAAC;IACZ,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,gBAAgB;CAAG"}

2
dist/core/plugins/settings/types.js vendored Normal file
View File

@@ -0,0 +1,2 @@
export {};
//# sourceMappingURL=types.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/core/plugins/settings/types.ts"],"names":[],"mappings":""}