@videojs/html 10.0.0-alpha.3 → 10.0.0-alpha.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,27 @@
1
+ background-video-player {
2
+ display: contents;
3
+ }
4
+
5
+ background-video-skin {
6
+ display: block;
7
+ position: relative;
8
+ width: 100%;
9
+ height: 100%;
10
+ --media-object-fit: cover;
11
+ object-fit: var(--media-object-fit);
12
+ }
13
+
14
+ background-video-skin > [slot="media"] {
15
+ position: absolute;
16
+ inset: 0;
17
+ width: 100%;
18
+ height: 100%;
19
+ object-fit: inherit;
20
+ }
21
+
22
+ background-video-skin > img,
23
+ background-video-skin > picture {
24
+ width: 100%;
25
+ height: 100%;
26
+ object-fit: inherit;
27
+ }
@@ -0,0 +1,34 @@
1
+ import { ReactiveElement } from "@videojs/element";
2
+ import { namedNodeMapToObject } from "@videojs/utils/dom";
3
+
4
+ //#region src/define/background/skin.ts
5
+ function getTemplateHTML(_attrs) {
6
+ return `
7
+ <media-container>
8
+ <slot name="media" slot="media"></slot>
9
+ </media-container>
10
+ `;
11
+ }
12
+ var BackgroundVideoSkinElement = class extends ReactiveElement {
13
+ static {
14
+ this.tagName = "background-video-skin";
15
+ }
16
+ static {
17
+ this.shadowRootOptions = { mode: "open" };
18
+ }
19
+ static {
20
+ this.getTemplateHTML = getTemplateHTML;
21
+ }
22
+ constructor() {
23
+ super();
24
+ if (!this.shadowRoot) {
25
+ this.attachShadow(this.constructor.shadowRootOptions);
26
+ this.shadowRoot.innerHTML = getTemplateHTML(namedNodeMapToObject(this.attributes));
27
+ }
28
+ }
29
+ };
30
+ customElements.define(BackgroundVideoSkinElement.tagName, BackgroundVideoSkinElement);
31
+
32
+ //#endregion
33
+ export { BackgroundVideoSkinElement };
34
+ //# sourceMappingURL=skin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skin.js","names":[],"sources":["../../../../src/define/background/skin.ts"],"sourcesContent":["import { ReactiveElement } from '@videojs/element';\nimport { namedNodeMapToObject } from '@videojs/utils/dom';\n\nfunction getTemplateHTML(_attrs: Record<string, string>) {\n return /*html*/ `\n <media-container>\n <slot name=\"media\" slot=\"media\"></slot>\n </media-container>\n `;\n}\n\nexport class BackgroundVideoSkinElement extends ReactiveElement {\n static readonly tagName = 'background-video-skin';\n static shadowRootOptions = { mode: 'open' as ShadowRootMode };\n static getTemplateHTML = getTemplateHTML;\n\n constructor() {\n super();\n\n if (!this.shadowRoot) {\n this.attachShadow((this.constructor as typeof BackgroundVideoSkinElement).shadowRootOptions);\n this.shadowRoot!.innerHTML = getTemplateHTML(namedNodeMapToObject(this.attributes));\n }\n }\n}\n\ncustomElements.define(BackgroundVideoSkinElement.tagName, BackgroundVideoSkinElement);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n [BackgroundVideoSkinElement.tagName]: BackgroundVideoSkinElement;\n }\n}\n"],"mappings":";;;;AAGA,SAAS,gBAAgB,QAAgC;AACvD,QAAgB;;;;;;AAOlB,IAAa,6BAAb,cAAgD,gBAAgB;;iBACpC;;;2BACC,EAAE,MAAM,QAA0B;;;yBACpC;;CAEzB,cAAc;AACZ,SAAO;AAEP,MAAI,CAAC,KAAK,YAAY;AACpB,QAAK,aAAc,KAAK,YAAkD,kBAAkB;AAC5F,QAAK,WAAY,YAAY,gBAAgB,qBAAqB,KAAK,WAAW,CAAC;;;;AAKzF,eAAe,OAAO,2BAA2B,SAAS,2BAA2B"}
@@ -0,0 +1,3 @@
1
+ import { BackgroundVideoElement } from "../media/background-video.js";
2
+
3
+ export { BackgroundVideoElement };
@@ -1,4 +1,4 @@
1
- import { CustomMediaMixin } from "@videojs/core/dom/media/custom-media-element";
1
+ import { namedNodeMapToObject } from "@videojs/utils/dom";
2
2
 
3
3
  //#region src/media/background-video/index.ts
4
4
  function getTemplateHTML(attrs) {
@@ -13,20 +13,24 @@ function getTemplateHTML(attrs) {
13
13
  inset: 0;
14
14
  width: 100%;
15
15
  height: 100%;
16
- object-fit: inherit;
16
+ object-fit: var(--media-object-fit, inherit);
17
+ object-position: var(--media-object-position, 50% 50%);
17
18
  }
18
19
  </style>
19
20
  <slot></slot>
20
21
  <video ${serializeAttributes(attrs)}></video>
21
22
  `;
22
23
  }
23
- var BackgroundVideo = class extends CustomMediaMixin(HTMLElement, { tag: "video" }) {
24
+ var BackgroundVideo = class extends HTMLElement {
24
25
  static {
25
26
  this.shadowRootOptions = { mode: "open" };
26
27
  }
27
28
  static {
28
29
  this.getTemplateHTML = getTemplateHTML;
29
30
  }
31
+ static get observedAttributes() {
32
+ return ["src"];
33
+ }
30
34
  constructor() {
31
35
  super();
32
36
  if (!this.shadowRoot) {
@@ -42,13 +46,15 @@ var BackgroundVideo = class extends CustomMediaMixin(HTMLElement, { tag: "video"
42
46
  };
43
47
  this.shadowRoot.innerHTML = getTemplateHTML(attrs);
44
48
  }
49
+ this.target.muted = !this.hasAttribute("nomuted");
50
+ }
51
+ attributeChangedCallback(attrName, oldValue, newValue) {
52
+ if (attrName === "src" && oldValue !== newValue) this.target.src = newValue ?? "";
53
+ }
54
+ get target() {
55
+ return this.querySelector(":scope > [slot=media]") ?? this.querySelector("video") ?? this.shadowRoot?.querySelector("video") ?? null;
45
56
  }
46
57
  };
47
- function namedNodeMapToObject(namedNodeMap) {
48
- const obj = {};
49
- for (const attr of namedNodeMap) obj[attr.name] = attr.value;
50
- return obj;
51
- }
52
58
  const VideoAttributes = [
53
59
  "autoplay",
54
60
  "controls",
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../../../src/media/background-video/index.ts"],"sourcesContent":["import { CustomMediaMixin } from '@videojs/core/dom/media/custom-media-element';\n\nfunction getTemplateHTML(attrs: Record<string, string>) {\n return /*html*/ `\n <style>\n :host {\n position: relative;\n }\n\n video {\n position: absolute;\n inset: 0;\n width: 100%;\n height: 100%;\n object-fit: inherit;\n }\n </style>\n <slot></slot>\n <video ${serializeAttributes(attrs)}></video>\n `;\n}\n\nexport class BackgroundVideo extends CustomMediaMixin(HTMLElement, { tag: 'video' }) {\n static shadowRootOptions = { mode: 'open' as ShadowRootMode };\n static getTemplateHTML = getTemplateHTML;\n\n constructor() {\n super();\n\n if (!this.shadowRoot) {\n this.attachShadow((this.constructor as typeof BackgroundVideo).shadowRootOptions);\n\n const attrs = {\n ...namedNodeMapToObject(this.attributes),\n ...(!this.hasAttribute('nomuted') && { muted: '' }),\n ...(!this.hasAttribute('noloop') && { loop: '' }),\n ...(!this.hasAttribute('noautoplay') && { autoplay: '' }),\n playsinline: '',\n disableremoteplayback: '',\n disablepictureinpicture: '',\n };\n\n this.shadowRoot!.innerHTML = getTemplateHTML(attrs);\n }\n }\n}\n\nfunction namedNodeMapToObject(namedNodeMap: NamedNodeMap) {\n const obj: Record<string, string> = {};\n for (const attr of namedNodeMap) {\n obj[attr.name] = attr.value;\n }\n return obj;\n}\n\nconst VideoAttributes = [\n 'autoplay',\n 'controls',\n 'controlslist',\n 'crossorigin',\n 'disablepictureinpicture',\n 'disableremoteplayback',\n 'loop',\n 'muted',\n 'playsinline',\n 'preload',\n] as const;\n\nfunction serializeAttributes(attrs: Record<string, string>): string {\n let html = '';\n for (const key in attrs) {\n // Skip forwarding non native video attributes.\n if (!VideoAttributes.includes(key as any)) continue;\n\n const value = attrs[key];\n if (value === '') html += ` ${key}`;\n else html += ` ${key}=\"${value}\"`;\n }\n return html;\n}\n"],"mappings":";;;AAEA,SAAS,gBAAgB,OAA+B;AACtD,QAAgB;;;;;;;;;;;;;;;aAeL,oBAAoB,MAAM,CAAC;;;AAIxC,IAAa,kBAAb,cAAqC,iBAAiB,aAAa,EAAE,KAAK,SAAS,CAAC,CAAC;;2BACxD,EAAE,MAAM,QAA0B;;;yBACpC;;CAEzB,cAAc;AACZ,SAAO;AAEP,MAAI,CAAC,KAAK,YAAY;AACpB,QAAK,aAAc,KAAK,YAAuC,kBAAkB;GAEjF,MAAM,QAAQ;IACZ,GAAG,qBAAqB,KAAK,WAAW;IACxC,GAAI,CAAC,KAAK,aAAa,UAAU,IAAI,EAAE,OAAO,IAAI;IAClD,GAAI,CAAC,KAAK,aAAa,SAAS,IAAI,EAAE,MAAM,IAAI;IAChD,GAAI,CAAC,KAAK,aAAa,aAAa,IAAI,EAAE,UAAU,IAAI;IACxD,aAAa;IACb,uBAAuB;IACvB,yBAAyB;IAC1B;AAED,QAAK,WAAY,YAAY,gBAAgB,MAAM;;;;AAKzD,SAAS,qBAAqB,cAA4B;CACxD,MAAM,MAA8B,EAAE;AACtC,MAAK,MAAM,QAAQ,aACjB,KAAI,KAAK,QAAQ,KAAK;AAExB,QAAO;;AAGT,MAAM,kBAAkB;CACtB;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACD;AAED,SAAS,oBAAoB,OAAuC;CAClE,IAAI,OAAO;AACX,MAAK,MAAM,OAAO,OAAO;AAEvB,MAAI,CAAC,gBAAgB,SAAS,IAAW,CAAE;EAE3C,MAAM,QAAQ,MAAM;AACpB,MAAI,UAAU,GAAI,SAAQ,IAAI;MACzB,SAAQ,IAAI,IAAI,IAAI,MAAM;;AAEjC,QAAO"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../../src/media/background-video/index.ts"],"sourcesContent":["import { namedNodeMapToObject } from '@videojs/utils/dom';\n\nfunction getTemplateHTML(attrs: Record<string, string>) {\n return /*html*/ `\n <style>\n :host {\n position: relative;\n }\n\n video {\n position: absolute;\n inset: 0;\n width: 100%;\n height: 100%;\n object-fit: var(--media-object-fit, inherit);\n object-position: var(--media-object-position, 50% 50%);\n }\n </style>\n <slot></slot>\n <video ${serializeAttributes(attrs)}></video>\n `;\n}\n\n// Don't extend CustomMediaMixin to save some bytes, background videos don't need the full Media API.\nexport class BackgroundVideo extends HTMLElement {\n static shadowRootOptions = { mode: 'open' as ShadowRootMode };\n static getTemplateHTML = getTemplateHTML;\n static get observedAttributes() {\n return ['src'];\n }\n\n constructor() {\n super();\n\n if (!this.shadowRoot) {\n this.attachShadow((this.constructor as typeof BackgroundVideo).shadowRootOptions);\n\n const attrs = {\n ...namedNodeMapToObject(this.attributes),\n ...(!this.hasAttribute('nomuted') && { muted: '' }),\n ...(!this.hasAttribute('noloop') && { loop: '' }),\n ...(!this.hasAttribute('noautoplay') && { autoplay: '' }),\n playsinline: '',\n disableremoteplayback: '',\n disablepictureinpicture: '',\n };\n\n this.shadowRoot!.innerHTML = getTemplateHTML(attrs);\n }\n\n // Neither Chrome or Firefox support setting the muted attribute\n // after using document.createElement.\n // Get around this by setting the muted property manually.\n this.target!.muted = !this.hasAttribute('nomuted');\n }\n\n attributeChangedCallback(attrName: string, oldValue: string | null, newValue: string | null): void {\n if (attrName === 'src' && oldValue !== newValue) {\n this.target!.src = newValue ?? '';\n }\n }\n\n get target(): HTMLVideoElement | null {\n return (\n this.querySelector(':scope > [slot=media]') ??\n this.querySelector('video') ??\n this.shadowRoot?.querySelector('video') ??\n null\n );\n }\n}\n\nconst VideoAttributes = [\n 'autoplay',\n 'controls',\n 'controlslist',\n 'crossorigin',\n 'disablepictureinpicture',\n 'disableremoteplayback',\n 'loop',\n 'muted',\n 'playsinline',\n 'preload',\n] as const;\n\nfunction serializeAttributes(attrs: Record<string, string>): string {\n let html = '';\n for (const key in attrs) {\n // Skip forwarding non native video attributes.\n if (!VideoAttributes.includes(key as any)) continue;\n\n const value = attrs[key];\n if (value === '') html += ` ${key}`;\n else html += ` ${key}=\"${value}\"`;\n }\n return html;\n}\n"],"mappings":";;;AAEA,SAAS,gBAAgB,OAA+B;AACtD,QAAgB;;;;;;;;;;;;;;;;aAgBL,oBAAoB,MAAM,CAAC;;;AAKxC,IAAa,kBAAb,cAAqC,YAAY;;2BACpB,EAAE,MAAM,QAA0B;;;yBACpC;;CACzB,WAAW,qBAAqB;AAC9B,SAAO,CAAC,MAAM;;CAGhB,cAAc;AACZ,SAAO;AAEP,MAAI,CAAC,KAAK,YAAY;AACpB,QAAK,aAAc,KAAK,YAAuC,kBAAkB;GAEjF,MAAM,QAAQ;IACZ,GAAG,qBAAqB,KAAK,WAAW;IACxC,GAAI,CAAC,KAAK,aAAa,UAAU,IAAI,EAAE,OAAO,IAAI;IAClD,GAAI,CAAC,KAAK,aAAa,SAAS,IAAI,EAAE,MAAM,IAAI;IAChD,GAAI,CAAC,KAAK,aAAa,aAAa,IAAI,EAAE,UAAU,IAAI;IACxD,aAAa;IACb,uBAAuB;IACvB,yBAAyB;IAC1B;AAED,QAAK,WAAY,YAAY,gBAAgB,MAAM;;AAMrD,OAAK,OAAQ,QAAQ,CAAC,KAAK,aAAa,UAAU;;CAGpD,yBAAyB,UAAkB,UAAyB,UAA+B;AACjG,MAAI,aAAa,SAAS,aAAa,SACrC,MAAK,OAAQ,MAAM,YAAY;;CAInC,IAAI,SAAkC;AACpC,SACE,KAAK,cAAc,wBAAwB,IAC3C,KAAK,cAAc,QAAQ,IAC3B,KAAK,YAAY,cAAc,QAAQ,IACvC;;;AAKN,MAAM,kBAAkB;CACtB;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACD;AAED,SAAS,oBAAoB,OAAuC;CAClE,IAAI,OAAO;AACX,MAAK,MAAM,OAAO,OAAO;AAEvB,MAAI,CAAC,gBAAgB,SAAS,IAAW,CAAE;EAE3C,MAAM,QAAQ,MAAM;AACpB,MAAI,UAAU,GAAI,SAAQ,IAAI;MACzB,SAAQ,IAAI,IAAI,IAAI,MAAM;;AAEjC,QAAO"}
@@ -0,0 +1,27 @@
1
+ background-video-player {
2
+ display: contents;
3
+ }
4
+
5
+ background-video-skin {
6
+ display: block;
7
+ position: relative;
8
+ width: 100%;
9
+ height: 100%;
10
+ --media-object-fit: cover;
11
+ object-fit: var(--media-object-fit);
12
+ }
13
+
14
+ background-video-skin > [slot="media"] {
15
+ position: absolute;
16
+ inset: 0;
17
+ width: 100%;
18
+ height: 100%;
19
+ object-fit: inherit;
20
+ }
21
+
22
+ background-video-skin > img,
23
+ background-video-skin > picture {
24
+ width: 100%;
25
+ height: 100%;
26
+ object-fit: inherit;
27
+ }
@@ -1 +1,20 @@
1
- export { };
1
+ import { ReactiveElement } from "@videojs/element";
2
+
3
+ //#region src/define/background/skin.d.ts
4
+ declare function getTemplateHTML(_attrs: Record<string, string>): string;
5
+ declare class BackgroundVideoSkinElement extends ReactiveElement {
6
+ static readonly tagName = "background-video-skin";
7
+ static shadowRootOptions: {
8
+ mode: ShadowRootMode;
9
+ };
10
+ static getTemplateHTML: typeof getTemplateHTML;
11
+ constructor();
12
+ }
13
+ declare global {
14
+ interface HTMLElementTagNameMap {
15
+ [BackgroundVideoSkinElement.tagName]: BackgroundVideoSkinElement;
16
+ }
17
+ }
18
+ //#endregion
19
+ export { BackgroundVideoSkinElement };
20
+ //# sourceMappingURL=skin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skin.d.ts","names":[],"sources":["../../../../src/define/background/skin.ts"],"mappings":";;;iBAGS,eAAA,CAAgB,MAAA,EAAQ,MAAA;AAAA,cAQpB,0BAAA,SAAmC,eAAA;EAAA,gBAC9B,OAAA;EAAA,OACT,iBAAA;UAAsC,cAAA;EAAA;EAAA,OACtC,eAAA,SAAe,eAAA;;;QAchB,MAAA;EAAA,UACI,qBAAA;IAAA,CACP,0BAAA,CAA2B,OAAA,GAAU,0BAAA;EAAA;AAAA"}
@@ -0,0 +1,34 @@
1
+ import { ReactiveElement } from "@videojs/element";
2
+ import { namedNodeMapToObject } from "@videojs/utils/dom";
3
+
4
+ //#region src/define/background/skin.ts
5
+ function getTemplateHTML(_attrs) {
6
+ return `
7
+ <media-container>
8
+ <slot name="media" slot="media"></slot>
9
+ </media-container>
10
+ `;
11
+ }
12
+ var BackgroundVideoSkinElement = class extends ReactiveElement {
13
+ static {
14
+ this.tagName = "background-video-skin";
15
+ }
16
+ static {
17
+ this.shadowRootOptions = { mode: "open" };
18
+ }
19
+ static {
20
+ this.getTemplateHTML = getTemplateHTML;
21
+ }
22
+ constructor() {
23
+ super();
24
+ if (!this.shadowRoot) {
25
+ this.attachShadow(this.constructor.shadowRootOptions);
26
+ this.shadowRoot.innerHTML = getTemplateHTML(namedNodeMapToObject(this.attributes));
27
+ }
28
+ }
29
+ };
30
+ customElements.define(BackgroundVideoSkinElement.tagName, BackgroundVideoSkinElement);
31
+
32
+ //#endregion
33
+ export { BackgroundVideoSkinElement };
34
+ //# sourceMappingURL=skin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skin.js","names":[],"sources":["../../../../src/define/background/skin.ts"],"sourcesContent":["import { ReactiveElement } from '@videojs/element';\nimport { namedNodeMapToObject } from '@videojs/utils/dom';\n\nfunction getTemplateHTML(_attrs: Record<string, string>) {\n return /*html*/ `\n <media-container>\n <slot name=\"media\" slot=\"media\"></slot>\n </media-container>\n `;\n}\n\nexport class BackgroundVideoSkinElement extends ReactiveElement {\n static readonly tagName = 'background-video-skin';\n static shadowRootOptions = { mode: 'open' as ShadowRootMode };\n static getTemplateHTML = getTemplateHTML;\n\n constructor() {\n super();\n\n if (!this.shadowRoot) {\n this.attachShadow((this.constructor as typeof BackgroundVideoSkinElement).shadowRootOptions);\n this.shadowRoot!.innerHTML = getTemplateHTML(namedNodeMapToObject(this.attributes));\n }\n }\n}\n\ncustomElements.define(BackgroundVideoSkinElement.tagName, BackgroundVideoSkinElement);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n [BackgroundVideoSkinElement.tagName]: BackgroundVideoSkinElement;\n }\n}\n"],"mappings":";;;;AAGA,SAAS,gBAAgB,QAAgC;AACvD,QAAgB;;;;;;AAOlB,IAAa,6BAAb,cAAgD,gBAAgB;;iBACpC;;;2BACC,EAAE,MAAM,QAA0B;;;yBACpC;;CAEzB,cAAc;AACZ,SAAO;AAEP,MAAI,CAAC,KAAK,YAAY;AACpB,QAAK,aAAc,KAAK,YAAkD,kBAAkB;AAC5F,QAAK,WAAY,YAAY,gBAAgB,qBAAqB,KAAK,WAAW,CAAC;;;;AAKzF,eAAe,OAAO,2BAA2B,SAAS,2BAA2B"}
@@ -0,0 +1,2 @@
1
+ import { BackgroundVideoElement } from "../media/background-video.js";
2
+ export { BackgroundVideoElement };
@@ -0,0 +1,3 @@
1
+ import { BackgroundVideoElement } from "../media/background-video.js";
2
+
3
+ export { BackgroundVideoElement };
@@ -1,14 +1,14 @@
1
- import * as _videojs_core_dom_media_custom_media_element0 from "@videojs/core/dom/media/custom-media-element";
2
-
3
1
  //#region src/media/background-video/index.d.ts
4
2
  declare function getTemplateHTML(attrs: Record<string, string>): string;
5
- declare const BackgroundVideo_base: _videojs_core_dom_media_custom_media_element0.CustomVideoElement;
6
- declare class BackgroundVideo extends BackgroundVideo_base {
3
+ declare class BackgroundVideo extends HTMLElement {
7
4
  static shadowRootOptions: {
8
5
  mode: ShadowRootMode;
9
6
  };
10
7
  static getTemplateHTML: typeof getTemplateHTML;
8
+ static get observedAttributes(): string[];
11
9
  constructor();
10
+ attributeChangedCallback(attrName: string, oldValue: string | null, newValue: string | null): void;
11
+ get target(): HTMLVideoElement | null;
12
12
  }
13
13
  //#endregion
14
14
  export { BackgroundVideo };
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","names":[],"sources":["../../../../src/media/background-video/index.ts"],"mappings":";;;iBAES,eAAA,CAAgB,KAAA,EAAO,MAAA;AAAA,cAAsB,oBAAA;cAoBzC,eAAA,SAAwB,oBAAA;EAAA,OAC5B,iBAAA;UAAsC,cAAA;EAAA;EAAA,OACtC,eAAA,SAAe,eAAA"}
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../../../../src/media/background-video/index.ts"],"mappings":";iBAES,eAAA,CAAgB,KAAA,EAAO,MAAA;AAAA,cAsBnB,eAAA,SAAwB,WAAA;EAAA,OAC5B,iBAAA;UAAsC,cAAA;EAAA;EAAA,OACtC,eAAA,SAAe,eAAA;EAAA,WACX,kBAAA,CAAA;;EA6BX,wBAAA,CAAyB,QAAA,UAAkB,QAAA,iBAAyB,QAAA;EAAA,IAMhE,MAAA,CAAA,GAAU,gBAAA;AAAA"}
@@ -1,4 +1,4 @@
1
- import { CustomMediaMixin } from "@videojs/core/dom/media/custom-media-element";
1
+ import { namedNodeMapToObject } from "@videojs/utils/dom";
2
2
 
3
3
  //#region src/media/background-video/index.ts
4
4
  function getTemplateHTML(attrs) {
@@ -13,20 +13,24 @@ function getTemplateHTML(attrs) {
13
13
  inset: 0;
14
14
  width: 100%;
15
15
  height: 100%;
16
- object-fit: inherit;
16
+ object-fit: var(--media-object-fit, inherit);
17
+ object-position: var(--media-object-position, 50% 50%);
17
18
  }
18
19
  </style>
19
20
  <slot></slot>
20
21
  <video ${serializeAttributes(attrs)}></video>
21
22
  `;
22
23
  }
23
- var BackgroundVideo = class extends CustomMediaMixin(HTMLElement, { tag: "video" }) {
24
+ var BackgroundVideo = class extends HTMLElement {
24
25
  static {
25
26
  this.shadowRootOptions = { mode: "open" };
26
27
  }
27
28
  static {
28
29
  this.getTemplateHTML = getTemplateHTML;
29
30
  }
31
+ static get observedAttributes() {
32
+ return ["src"];
33
+ }
30
34
  constructor() {
31
35
  super();
32
36
  if (!this.shadowRoot) {
@@ -42,13 +46,15 @@ var BackgroundVideo = class extends CustomMediaMixin(HTMLElement, { tag: "video"
42
46
  };
43
47
  this.shadowRoot.innerHTML = getTemplateHTML(attrs);
44
48
  }
49
+ this.target.muted = !this.hasAttribute("nomuted");
50
+ }
51
+ attributeChangedCallback(attrName, oldValue, newValue) {
52
+ if (attrName === "src" && oldValue !== newValue) this.target.src = newValue ?? "";
53
+ }
54
+ get target() {
55
+ return this.querySelector(":scope > [slot=media]") ?? this.querySelector("video") ?? this.shadowRoot?.querySelector("video") ?? null;
45
56
  }
46
57
  };
47
- function namedNodeMapToObject(namedNodeMap) {
48
- const obj = {};
49
- for (const attr of namedNodeMap) obj[attr.name] = attr.value;
50
- return obj;
51
- }
52
58
  const VideoAttributes = [
53
59
  "autoplay",
54
60
  "controls",
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../../../src/media/background-video/index.ts"],"sourcesContent":["import { CustomMediaMixin } from '@videojs/core/dom/media/custom-media-element';\n\nfunction getTemplateHTML(attrs: Record<string, string>) {\n return /*html*/ `\n <style>\n :host {\n position: relative;\n }\n\n video {\n position: absolute;\n inset: 0;\n width: 100%;\n height: 100%;\n object-fit: inherit;\n }\n </style>\n <slot></slot>\n <video ${serializeAttributes(attrs)}></video>\n `;\n}\n\nexport class BackgroundVideo extends CustomMediaMixin(HTMLElement, { tag: 'video' }) {\n static shadowRootOptions = { mode: 'open' as ShadowRootMode };\n static getTemplateHTML = getTemplateHTML;\n\n constructor() {\n super();\n\n if (!this.shadowRoot) {\n this.attachShadow((this.constructor as typeof BackgroundVideo).shadowRootOptions);\n\n const attrs = {\n ...namedNodeMapToObject(this.attributes),\n ...(!this.hasAttribute('nomuted') && { muted: '' }),\n ...(!this.hasAttribute('noloop') && { loop: '' }),\n ...(!this.hasAttribute('noautoplay') && { autoplay: '' }),\n playsinline: '',\n disableremoteplayback: '',\n disablepictureinpicture: '',\n };\n\n this.shadowRoot!.innerHTML = getTemplateHTML(attrs);\n }\n }\n}\n\nfunction namedNodeMapToObject(namedNodeMap: NamedNodeMap) {\n const obj: Record<string, string> = {};\n for (const attr of namedNodeMap) {\n obj[attr.name] = attr.value;\n }\n return obj;\n}\n\nconst VideoAttributes = [\n 'autoplay',\n 'controls',\n 'controlslist',\n 'crossorigin',\n 'disablepictureinpicture',\n 'disableremoteplayback',\n 'loop',\n 'muted',\n 'playsinline',\n 'preload',\n] as const;\n\nfunction serializeAttributes(attrs: Record<string, string>): string {\n let html = '';\n for (const key in attrs) {\n // Skip forwarding non native video attributes.\n if (!VideoAttributes.includes(key as any)) continue;\n\n const value = attrs[key];\n if (value === '') html += ` ${key}`;\n else html += ` ${key}=\"${value}\"`;\n }\n return html;\n}\n"],"mappings":";;;AAEA,SAAS,gBAAgB,OAA+B;AACtD,QAAgB;;;;;;;;;;;;;;;aAeL,oBAAoB,MAAM,CAAC;;;AAIxC,IAAa,kBAAb,cAAqC,iBAAiB,aAAa,EAAE,KAAK,SAAS,CAAC,CAAC;;2BACxD,EAAE,MAAM,QAA0B;;;yBACpC;;CAEzB,cAAc;AACZ,SAAO;AAEP,MAAI,CAAC,KAAK,YAAY;AACpB,QAAK,aAAc,KAAK,YAAuC,kBAAkB;GAEjF,MAAM,QAAQ;IACZ,GAAG,qBAAqB,KAAK,WAAW;IACxC,GAAI,CAAC,KAAK,aAAa,UAAU,IAAI,EAAE,OAAO,IAAI;IAClD,GAAI,CAAC,KAAK,aAAa,SAAS,IAAI,EAAE,MAAM,IAAI;IAChD,GAAI,CAAC,KAAK,aAAa,aAAa,IAAI,EAAE,UAAU,IAAI;IACxD,aAAa;IACb,uBAAuB;IACvB,yBAAyB;IAC1B;AAED,QAAK,WAAY,YAAY,gBAAgB,MAAM;;;;AAKzD,SAAS,qBAAqB,cAA4B;CACxD,MAAM,MAA8B,EAAE;AACtC,MAAK,MAAM,QAAQ,aACjB,KAAI,KAAK,QAAQ,KAAK;AAExB,QAAO;;AAGT,MAAM,kBAAkB;CACtB;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACD;AAED,SAAS,oBAAoB,OAAuC;CAClE,IAAI,OAAO;AACX,MAAK,MAAM,OAAO,OAAO;AAEvB,MAAI,CAAC,gBAAgB,SAAS,IAAW,CAAE;EAE3C,MAAM,QAAQ,MAAM;AACpB,MAAI,UAAU,GAAI,SAAQ,IAAI;MACzB,SAAQ,IAAI,IAAI,IAAI,MAAM;;AAEjC,QAAO"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../../src/media/background-video/index.ts"],"sourcesContent":["import { namedNodeMapToObject } from '@videojs/utils/dom';\n\nfunction getTemplateHTML(attrs: Record<string, string>) {\n return /*html*/ `\n <style>\n :host {\n position: relative;\n }\n\n video {\n position: absolute;\n inset: 0;\n width: 100%;\n height: 100%;\n object-fit: var(--media-object-fit, inherit);\n object-position: var(--media-object-position, 50% 50%);\n }\n </style>\n <slot></slot>\n <video ${serializeAttributes(attrs)}></video>\n `;\n}\n\n// Don't extend CustomMediaMixin to save some bytes, background videos don't need the full Media API.\nexport class BackgroundVideo extends HTMLElement {\n static shadowRootOptions = { mode: 'open' as ShadowRootMode };\n static getTemplateHTML = getTemplateHTML;\n static get observedAttributes() {\n return ['src'];\n }\n\n constructor() {\n super();\n\n if (!this.shadowRoot) {\n this.attachShadow((this.constructor as typeof BackgroundVideo).shadowRootOptions);\n\n const attrs = {\n ...namedNodeMapToObject(this.attributes),\n ...(!this.hasAttribute('nomuted') && { muted: '' }),\n ...(!this.hasAttribute('noloop') && { loop: '' }),\n ...(!this.hasAttribute('noautoplay') && { autoplay: '' }),\n playsinline: '',\n disableremoteplayback: '',\n disablepictureinpicture: '',\n };\n\n this.shadowRoot!.innerHTML = getTemplateHTML(attrs);\n }\n\n // Neither Chrome or Firefox support setting the muted attribute\n // after using document.createElement.\n // Get around this by setting the muted property manually.\n this.target!.muted = !this.hasAttribute('nomuted');\n }\n\n attributeChangedCallback(attrName: string, oldValue: string | null, newValue: string | null): void {\n if (attrName === 'src' && oldValue !== newValue) {\n this.target!.src = newValue ?? '';\n }\n }\n\n get target(): HTMLVideoElement | null {\n return (\n this.querySelector(':scope > [slot=media]') ??\n this.querySelector('video') ??\n this.shadowRoot?.querySelector('video') ??\n null\n );\n }\n}\n\nconst VideoAttributes = [\n 'autoplay',\n 'controls',\n 'controlslist',\n 'crossorigin',\n 'disablepictureinpicture',\n 'disableremoteplayback',\n 'loop',\n 'muted',\n 'playsinline',\n 'preload',\n] as const;\n\nfunction serializeAttributes(attrs: Record<string, string>): string {\n let html = '';\n for (const key in attrs) {\n // Skip forwarding non native video attributes.\n if (!VideoAttributes.includes(key as any)) continue;\n\n const value = attrs[key];\n if (value === '') html += ` ${key}`;\n else html += ` ${key}=\"${value}\"`;\n }\n return html;\n}\n"],"mappings":";;;AAEA,SAAS,gBAAgB,OAA+B;AACtD,QAAgB;;;;;;;;;;;;;;;;aAgBL,oBAAoB,MAAM,CAAC;;;AAKxC,IAAa,kBAAb,cAAqC,YAAY;;2BACpB,EAAE,MAAM,QAA0B;;;yBACpC;;CACzB,WAAW,qBAAqB;AAC9B,SAAO,CAAC,MAAM;;CAGhB,cAAc;AACZ,SAAO;AAEP,MAAI,CAAC,KAAK,YAAY;AACpB,QAAK,aAAc,KAAK,YAAuC,kBAAkB;GAEjF,MAAM,QAAQ;IACZ,GAAG,qBAAqB,KAAK,WAAW;IACxC,GAAI,CAAC,KAAK,aAAa,UAAU,IAAI,EAAE,OAAO,IAAI;IAClD,GAAI,CAAC,KAAK,aAAa,SAAS,IAAI,EAAE,MAAM,IAAI;IAChD,GAAI,CAAC,KAAK,aAAa,aAAa,IAAI,EAAE,UAAU,IAAI;IACxD,aAAa;IACb,uBAAuB;IACvB,yBAAyB;IAC1B;AAED,QAAK,WAAY,YAAY,gBAAgB,MAAM;;AAMrD,OAAK,OAAQ,QAAQ,CAAC,KAAK,aAAa,UAAU;;CAGpD,yBAAyB,UAAkB,UAAyB,UAA+B;AACjG,MAAI,aAAa,SAAS,aAAa,SACrC,MAAK,OAAQ,MAAM,YAAY;;CAInC,IAAI,SAAkC;AACpC,SACE,KAAK,cAAc,wBAAwB,IAC3C,KAAK,cAAc,QAAQ,IAC3B,KAAK,YAAY,cAAc,QAAQ,IACvC;;;AAKN,MAAM,kBAAkB;CACtB;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACD;AAED,SAAS,oBAAoB,OAAuC;CAClE,IAAI,OAAO;AACX,MAAK,MAAM,OAAO,OAAO;AAEvB,MAAI,CAAC,gBAAgB,SAAS,IAAW,CAAE;EAE3C,MAAM,QAAQ,MAAM;AACpB,MAAI,UAAU,GAAI,SAAQ,IAAI;MACzB,SAAQ,IAAI,IAAI,IAAI,MAAM;;AAEjC,QAAO"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@videojs/html",
3
3
  "type": "module",
4
- "version": "10.0.0-alpha.3",
4
+ "version": "10.0.0-alpha.4",
5
5
  "description": "HTML library for building media players",
6
6
  "license": "Apache-2.0",
7
7
  "repository": {
@@ -24,21 +24,6 @@
24
24
  "development": "./dist/dev/index.js",
25
25
  "default": "./dist/default/index.js"
26
26
  },
27
- "./video/*": {
28
- "types": "./dist/dev/define/video/*.d.ts",
29
- "development": "./dist/dev/define/video/*.js",
30
- "default": "./dist/default/define/video/*.js"
31
- },
32
- "./audio/*": {
33
- "types": "./dist/dev/define/audio/*.d.ts",
34
- "development": "./dist/dev/define/audio/*.js",
35
- "default": "./dist/default/define/audio/*.js"
36
- },
37
- "./background/*": {
38
- "types": "./dist/dev/define/background/*.d.ts",
39
- "development": "./dist/dev/define/background/*.js",
40
- "default": "./dist/default/define/background/*.js"
41
- },
42
27
  "./ui/*": {
43
28
  "types": "./dist/dev/define/ui/*.d.ts",
44
29
  "development": "./dist/dev/define/ui/*.js",
@@ -53,13 +38,19 @@
53
38
  "types": "./dist/dev/define/media/*.d.ts",
54
39
  "development": "./dist/dev/define/media/*.js",
55
40
  "default": "./dist/default/define/media/*.js"
41
+ },
42
+ "./*.css": "./dist/default/define/*.css",
43
+ "./*": {
44
+ "types": "./dist/dev/define/*.d.ts",
45
+ "development": "./dist/dev/define/*.js",
46
+ "default": "./dist/default/define/*.js"
56
47
  }
57
48
  },
58
49
  "dependencies": {
59
- "@videojs/core": "10.0.0-alpha.3",
60
- "@videojs/store": "10.0.0-alpha.3",
61
- "@videojs/element": "10.0.0-alpha.3",
62
- "@videojs/utils": "10.0.0-alpha.3"
50
+ "@videojs/element": "10.0.0-alpha.4",
51
+ "@videojs/core": "10.0.0-alpha.4",
52
+ "@videojs/store": "10.0.0-alpha.4",
53
+ "@videojs/utils": "10.0.0-alpha.4"
63
54
  },
64
55
  "devDependencies": {
65
56
  "@testing-library/dom": "^10.4.0",