@videojs/html 0.1.0-preview.3 → 0.1.0-preview.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.
Files changed (123) hide show
  1. package/dist/button-D1DWjsQu.js +57 -0
  2. package/dist/button-D1DWjsQu.js.map +1 -0
  3. package/dist/component-factory-DeAN6cjC.js +47 -0
  4. package/dist/component-factory-DeAN6cjC.js.map +1 -0
  5. package/dist/current-time-display-C3qndGf5.js +47 -0
  6. package/dist/current-time-display-C3qndGf5.js.map +1 -0
  7. package/dist/custom-element-3bDlB2XO.js +10 -0
  8. package/dist/custom-element-3bDlB2XO.js.map +1 -0
  9. package/dist/define/index.d.ts +12 -0
  10. package/dist/define/index.js +27 -0
  11. package/dist/define/media-container.d.ts +1 -0
  12. package/dist/define/media-container.js +3 -0
  13. package/dist/define/media-current-time-display.d.ts +1 -0
  14. package/dist/define/media-current-time-display.js +4 -0
  15. package/dist/define/media-duration-display.d.ts +1 -0
  16. package/dist/define/media-duration-display.js +4 -0
  17. package/dist/define/media-fullscreen-button.d.ts +1 -0
  18. package/dist/define/media-fullscreen-button.js +5 -0
  19. package/dist/define/media-mute-button.d.ts +1 -0
  20. package/dist/define/media-mute-button.js +5 -0
  21. package/dist/define/media-play-button.d.ts +1 -0
  22. package/dist/define/media-play-button.js +5 -0
  23. package/dist/define/media-popover.d.ts +1 -0
  24. package/dist/define/media-popover.js +3 -0
  25. package/dist/define/media-preview-time-display.d.ts +1 -0
  26. package/dist/define/media-preview-time-display.js +4 -0
  27. package/dist/define/media-provider.d.ts +1 -0
  28. package/dist/define/media-provider.js +3 -0
  29. package/dist/define/media-time-slider.d.ts +1 -0
  30. package/dist/define/media-time-slider.js +4 -0
  31. package/dist/define/media-tooltip.d.ts +1 -0
  32. package/dist/define/media-tooltip.js +3 -0
  33. package/dist/define/media-volume-slider.d.ts +1 -0
  34. package/dist/define/media-volume-slider.js +4 -0
  35. package/dist/duration-display-JOPp3bdU.js +49 -0
  36. package/dist/duration-display-JOPp3bdU.js.map +1 -0
  37. package/dist/fullscreen-button-CGO2UJjs.js +48 -0
  38. package/dist/fullscreen-button-CGO2UJjs.js.map +1 -0
  39. package/dist/{icons-eJws_3Te.js → icons-CuxuONCk.js} +20 -57
  40. package/dist/icons-CuxuONCk.js.map +1 -0
  41. package/dist/icons.d.ts +1 -2
  42. package/dist/icons.js +2 -3
  43. package/dist/index-LKrIp3Oo.d.ts +1 -0
  44. package/dist/index.d.ts +172 -4
  45. package/dist/index.d.ts.map +1 -1
  46. package/dist/index.js +16 -9
  47. package/dist/media-container-BGEXSi9g.js +8 -0
  48. package/dist/media-container-BGEXSi9g.js.map +1 -0
  49. package/dist/media-container-C0MUzkJ_.js +83 -0
  50. package/dist/media-container-C0MUzkJ_.js.map +1 -0
  51. package/dist/media-container-DPnFjmtK.d.ts +1 -0
  52. package/dist/media-current-time-display-B-4Cp845.js +8 -0
  53. package/dist/media-current-time-display-B-4Cp845.js.map +1 -0
  54. package/dist/media-current-time-display-Cd0rPAuj.d.ts +1 -0
  55. package/dist/media-duration-display-BLMr7VHo.js +8 -0
  56. package/dist/media-duration-display-BLMr7VHo.js.map +1 -0
  57. package/dist/media-duration-display-qvm6YX-q.d.ts +1 -0
  58. package/dist/media-fullscreen-button-BgUK3lgu.d.ts +1 -0
  59. package/dist/media-fullscreen-button-Dcflbt54.js +8 -0
  60. package/dist/media-fullscreen-button-Dcflbt54.js.map +1 -0
  61. package/dist/media-mute-button-BOVhZ3aP.js +8 -0
  62. package/dist/media-mute-button-BOVhZ3aP.js.map +1 -0
  63. package/dist/media-mute-button-NVJF2EEW.d.ts +1 -0
  64. package/dist/media-play-button-CLj-hkwn.js +8 -0
  65. package/dist/media-play-button-CLj-hkwn.js.map +1 -0
  66. package/dist/media-play-button-oq8yDlxe.d.ts +1 -0
  67. package/dist/media-popover-BtJmPv0E.d.ts +1 -0
  68. package/dist/media-popover-F4M4Tq4z.js +8 -0
  69. package/dist/media-popover-F4M4Tq4z.js.map +1 -0
  70. package/dist/media-preview-time-display-4YX5Rics.d.ts +1 -0
  71. package/dist/media-preview-time-display-DAiMgLPX.js +8 -0
  72. package/dist/media-preview-time-display-DAiMgLPX.js.map +1 -0
  73. package/dist/media-provider-CyoL0bCx.js +17 -0
  74. package/dist/media-provider-CyoL0bCx.js.map +1 -0
  75. package/dist/media-provider-D7P2TLXG.d.ts +1 -0
  76. package/dist/media-provider-D_GL2_DN.js +8 -0
  77. package/dist/media-provider-D_GL2_DN.js.map +1 -0
  78. package/dist/media-skin-Di3vSHvS.d.ts +11 -0
  79. package/dist/media-skin-Di3vSHvS.d.ts.map +1 -0
  80. package/dist/media-skin-mHWwUPg3.js +36 -0
  81. package/dist/media-skin-mHWwUPg3.js.map +1 -0
  82. package/dist/media-time-slider-Bp2qnwsW.js +12 -0
  83. package/dist/media-time-slider-Bp2qnwsW.js.map +1 -0
  84. package/dist/media-time-slider-DvMnfYXZ.d.ts +1 -0
  85. package/dist/media-tooltip-BqV17mdM.d.ts +1 -0
  86. package/dist/media-tooltip-ClcVafMb.js +14 -0
  87. package/dist/media-tooltip-ClcVafMb.js.map +1 -0
  88. package/dist/media-volume-slider-CKSxmdQv.js +11 -0
  89. package/dist/media-volume-slider-CKSxmdQv.js.map +1 -0
  90. package/dist/media-volume-slider-DP47VLVi.d.ts +1 -0
  91. package/dist/mute-button-vW2sLqqY.js +50 -0
  92. package/dist/mute-button-vW2sLqqY.js.map +1 -0
  93. package/dist/play-button-aVb0g10G.js +44 -0
  94. package/dist/play-button-aVb0g10G.js.map +1 -0
  95. package/dist/popover-Dc0hyhwB.js +187 -0
  96. package/dist/popover-Dc0hyhwB.js.map +1 -0
  97. package/dist/{media-preview-time-display-C7jpAct6.js → preview-time-display-Dax0FQ2X.js} +6 -6
  98. package/dist/preview-time-display-Dax0FQ2X.js.map +1 -0
  99. package/dist/skins/frosted.d.ts +16 -5
  100. package/dist/skins/frosted.d.ts.map +1 -1
  101. package/dist/skins/frosted.js +46 -20
  102. package/dist/skins/frosted.js.map +1 -1
  103. package/dist/skins/minimal.d.ts +16 -5
  104. package/dist/skins/minimal.d.ts.map +1 -1
  105. package/dist/skins/minimal.js +46 -20
  106. package/dist/skins/minimal.js.map +1 -1
  107. package/dist/time-slider-CA1GMs6A.js +201 -0
  108. package/dist/time-slider-CA1GMs6A.js.map +1 -0
  109. package/dist/tooltip-54fBUUpb.js +296 -0
  110. package/dist/tooltip-54fBUUpb.js.map +1 -0
  111. package/dist/volume-slider-guD8gqpi.js +206 -0
  112. package/dist/volume-slider-guD8gqpi.js.map +1 -0
  113. package/package.json +8 -4
  114. package/dist/chunk-Bp6m_JJh.js +0 -13
  115. package/dist/icons-eJws_3Te.js.map +0 -1
  116. package/dist/index-AcYRyuAY.d.ts +0 -76
  117. package/dist/index-AcYRyuAY.d.ts.map +0 -1
  118. package/dist/index.js.map +0 -1
  119. package/dist/media-preview-time-display-C7jpAct6.js.map +0 -1
  120. package/dist/media-skin-D44BfH6y.d.ts +0 -182
  121. package/dist/media-skin-D44BfH6y.d.ts.map +0 -1
  122. package/dist/media-skin-DR8zj-LV.js +0 -1324
  123. package/dist/media-skin-DR8zj-LV.js.map +0 -1
@@ -0,0 +1,57 @@
1
+ import { namedNodeMapToObject } from "@videojs/utils/dom";
2
+
3
+ //#region src/elements/button.ts
4
+ function getTemplateHTML(_attrs, _props = {}) {
5
+ return `
6
+ <style>
7
+ /*
8
+ NOTE: Even though primitives should aim to be "unstyled" in their core definitions, we should
9
+ still add pointer-events, as this defines functionality. (CJP)
10
+ */
11
+ :host {
12
+ pointer-events: auto;
13
+ }
14
+ </style>
15
+ <slot>
16
+ </slot>
17
+ `;
18
+ }
19
+ var ButtonElement = class extends HTMLElement {
20
+ static {
21
+ this.shadowRootOptions = { mode: "open" };
22
+ }
23
+ static {
24
+ this.getTemplateHTML = getTemplateHTML;
25
+ }
26
+ constructor() {
27
+ super();
28
+ if (!this.shadowRoot) {
29
+ this.attachShadow(this.constructor.shadowRootOptions);
30
+ const attrs = namedNodeMapToObject(this.attributes);
31
+ const html = this.constructor.getTemplateHTML(attrs);
32
+ const shadowRoot = this.shadowRoot;
33
+ shadowRoot.setHTMLUnsafe ? shadowRoot.setHTMLUnsafe(html) : shadowRoot.innerHTML = html;
34
+ }
35
+ this.addEventListener("click", this);
36
+ this.addEventListener("keydown", this);
37
+ }
38
+ handleEvent(event) {
39
+ const { type } = event;
40
+ if (type === "keydown") this.#handleKeyDown(event);
41
+ }
42
+ #handleKeyDown = (event) => {
43
+ const { metaKey, altKey, key } = event;
44
+ if (metaKey || altKey || !["Enter", " "].includes(key)) {
45
+ this.removeEventListener("keyup", this.#handleKeyUp);
46
+ return;
47
+ }
48
+ this.addEventListener("keyup", this.#handleKeyUp, { once: true });
49
+ };
50
+ #handleKeyUp = (_event) => {
51
+ this.handleEvent({ type: "click" });
52
+ };
53
+ };
54
+
55
+ //#endregion
56
+ export { ButtonElement as t };
57
+ //# sourceMappingURL=button-D1DWjsQu.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"button-D1DWjsQu.js","names":["#handleKeyDown","#handleKeyUp"],"sources":["../src/elements/button.ts"],"sourcesContent":["import { namedNodeMapToObject } from '@videojs/utils/dom';\n\nexport function getTemplateHTML(\n this: typeof ButtonElement,\n _attrs: Record<string, string>,\n _props: Record<string, any> = {},\n): string {\n return /* html */ `\n <style>\n /*\n NOTE: Even though primitives should aim to be \"unstyled\" in their core definitions, we should\n still add pointer-events, as this defines functionality. (CJP)\n */\n :host {\n pointer-events: auto;\n }\n </style>\n <slot>\n </slot>\n `;\n}\n\nexport class ButtonElement extends HTMLElement {\n static shadowRootOptions = {\n mode: 'open' as ShadowRootMode,\n };\n\n static getTemplateHTML: typeof getTemplateHTML = getTemplateHTML;\n\n constructor() {\n super();\n\n if (!this.shadowRoot) {\n // Set up the Shadow DOM if not using Declarative Shadow DOM.\n this.attachShadow((this.constructor as typeof ButtonElement).shadowRootOptions);\n\n const attrs = namedNodeMapToObject(this.attributes);\n const html = (this.constructor as typeof ButtonElement).getTemplateHTML(attrs);\n // From MDN: setHTMLUnsafe should be used instead of ShadowRoot.innerHTML\n // when a string of HTML may contain declarative shadow roots.\n const shadowRoot = this.shadowRoot as unknown as ShadowRoot;\n shadowRoot.setHTMLUnsafe ? shadowRoot.setHTMLUnsafe(html) : (shadowRoot.innerHTML = html);\n }\n\n this.addEventListener('click', this);\n this.addEventListener('keydown', this);\n }\n\n handleEvent(event: Event): void {\n const { type } = event;\n if (type === 'keydown') {\n this.#handleKeyDown(event as KeyboardEvent);\n }\n }\n\n #handleKeyDown = (event: KeyboardEvent): void => {\n const { metaKey, altKey, key } = event;\n if (metaKey || altKey || !['Enter', ' '].includes(key)) {\n this.removeEventListener('keyup', this.#handleKeyUp);\n return;\n }\n this.addEventListener('keyup', this.#handleKeyUp, { once: true });\n };\n\n #handleKeyUp = (_event: KeyboardEvent): void => {\n this.handleEvent({ type: 'click' } as Event);\n };\n}\n"],"mappings":";;;AAEA,SAAgB,gBAEd,QACA,SAA8B,EAAE,EACxB;AACR,QAAkB;;;;;;;;;;;;;;AAepB,IAAa,gBAAb,cAAmC,YAAY;;2BAClB,EACzB,MAAM,QACP;;;yBAEgD;;CAEjD,cAAc;AACZ,SAAO;AAEP,MAAI,CAAC,KAAK,YAAY;AAEpB,QAAK,aAAc,KAAK,YAAqC,kBAAkB;GAE/E,MAAM,QAAQ,qBAAqB,KAAK,WAAW;GACnD,MAAM,OAAQ,KAAK,YAAqC,gBAAgB,MAAM;GAG9E,MAAM,aAAa,KAAK;AACxB,cAAW,gBAAgB,WAAW,cAAc,KAAK,GAAI,WAAW,YAAY;;AAGtF,OAAK,iBAAiB,SAAS,KAAK;AACpC,OAAK,iBAAiB,WAAW,KAAK;;CAGxC,YAAY,OAAoB;EAC9B,MAAM,EAAE,SAAS;AACjB,MAAI,SAAS,UACX,OAAKA,cAAe,MAAuB;;CAI/C,kBAAkB,UAA+B;EAC/C,MAAM,EAAE,SAAS,QAAQ,QAAQ;AACjC,MAAI,WAAW,UAAU,CAAC,CAAC,SAAS,IAAI,CAAC,SAAS,IAAI,EAAE;AACtD,QAAK,oBAAoB,SAAS,MAAKC,YAAa;AACpD;;AAEF,OAAK,iBAAiB,SAAS,MAAKA,aAAc,EAAE,MAAM,MAAM,CAAC;;CAGnE,gBAAgB,WAAgC;AAC9C,OAAK,YAAY,EAAE,MAAM,SAAS,CAAU"}
@@ -0,0 +1,47 @@
1
+ import { ConsumerMixin } from "@open-wc/context-protocol";
2
+
3
+ //#region src/utils/component-factory.ts
4
+ /**
5
+ * Generic factory function to create connected HTML components using hooks pattern.
6
+ * Provides equivalent functionality to React's toConnectedComponent but for custom elements.
7
+ *
8
+ * @param BaseClass - Base custom element class to extend
9
+ * @param stateHook - Hook that defines state keys and transformation logic
10
+ * @param propsHook - Hook that handles element attributes and properties based on state
11
+ * @param eventsHook - Hook that defines event handling logic
12
+ * @param displayName - Display name for debugging
13
+ * @returns Connected custom element class with media store integration
14
+ */
15
+ function toConnectedHTMLComponent(BaseClass, stateHook, propsHook, displayName) {
16
+ const ConnectedComponent = class extends ConsumerMixin(BaseClass) {
17
+ constructor(..._args) {
18
+ super(..._args);
19
+ this.contexts = { mediaStore: (mediaStore) => {
20
+ this._mediaStore = mediaStore;
21
+ this._mediaStore.subscribeKeys(stateHook.keys, (rawState) => {
22
+ const state = stateHook.transform(rawState, mediaStore);
23
+ const props = propsHook(state ?? {}, this);
24
+ this._update(props, state, mediaStore);
25
+ });
26
+ } };
27
+ }
28
+ static get observedAttributes() {
29
+ return [...super.observedAttributes ?? []];
30
+ }
31
+ connectedCallback() {
32
+ super.connectedCallback?.();
33
+ }
34
+ disconnectedCallback() {
35
+ super.disconnectedCallback?.();
36
+ }
37
+ handleEvent(event) {
38
+ super.handleEvent?.(event);
39
+ }
40
+ };
41
+ if (displayName) Object.defineProperty(ConnectedComponent, "name", { value: displayName });
42
+ return ConnectedComponent;
43
+ }
44
+
45
+ //#endregion
46
+ export { toConnectedHTMLComponent as t };
47
+ //# sourceMappingURL=component-factory-DeAN6cjC.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"component-factory-DeAN6cjC.js","names":[],"sources":["../src/utils/component-factory.ts"],"sourcesContent":["import { ConsumerMixin } from '@open-wc/context-protocol';\n\n/**\n * Generic types for HTML component hooks pattern\n * Mirrors the React hooks architecture for consistency\n */\nexport interface StateHook<T = any> {\n keys: string[];\n transform: (rawState: any, mediaStore: any) => T;\n}\n\nexport type PropsHook<T = any, P = any> = (state: T, element: HTMLElement) => P;\n\nexport interface ConnectedComponentConstructor<State> {\n new (state: State): HTMLElement;\n}\n\n/**\n * Generic factory function to create connected HTML components using hooks pattern.\n * Provides equivalent functionality to React's toConnectedComponent but for custom elements.\n *\n * @param BaseClass - Base custom element class to extend\n * @param stateHook - Hook that defines state keys and transformation logic\n * @param propsHook - Hook that handles element attributes and properties based on state\n * @param eventsHook - Hook that defines event handling logic\n * @param displayName - Display name for debugging\n * @returns Connected custom element class with media store integration\n */\nexport function toConnectedHTMLComponent<State = any>(\n BaseClass: CustomElementConstructor,\n stateHook: StateHook<State>,\n propsHook: PropsHook<State>,\n displayName?: string,\n): ConnectedComponentConstructor<State> {\n const ConnectedComponent = class extends ConsumerMixin(BaseClass) {\n static get observedAttributes(): string[] {\n return [\n // @ts-expect-error ts(2339)\n ...(super.observedAttributes ?? []),\n ];\n }\n\n _mediaStore: any;\n\n contexts = {\n mediaStore: (mediaStore: any) => {\n this._mediaStore = mediaStore;\n\n // Subscribe to media store state changes\n // Split into two phases: state transformation, then props update\n this._mediaStore.subscribeKeys(stateHook.keys, (rawState: any) => {\n // Phase 1: Transform raw media store state (state concern)\n const state = stateHook.transform(rawState, mediaStore);\n\n // Phase 2: Update element attributes/properties (props concern)\n const props = propsHook(state ?? {} as State, this);\n // @ts-expect-error any\n this._update(props, state, mediaStore);\n });\n },\n };\n\n connectedCallback(): void {\n super.connectedCallback?.();\n }\n\n disconnectedCallback(): void {\n super.disconnectedCallback?.();\n }\n\n handleEvent(event: CustomEvent): void {\n // @ts-expect-error any\n super.handleEvent?.(event);\n }\n };\n\n // Set display name for debugging and dev tools\n if (displayName) {\n Object.defineProperty(ConnectedComponent, 'name', { value: displayName });\n }\n\n return ConnectedComponent;\n}\n"],"mappings":";;;;;;;;;;;;;;AA4BA,SAAgB,yBACd,WACA,WACA,WACA,aACsC;CACtC,MAAM,qBAAqB,cAAc,cAAc,UAAU,CAAC;;;mBAUrD,EACT,aAAa,eAAoB;AAC/B,SAAK,cAAc;AAInB,SAAK,YAAY,cAAc,UAAU,OAAO,aAAkB;KAEhE,MAAM,QAAQ,UAAU,UAAU,UAAU,WAAW;KAGvD,MAAM,QAAQ,UAAU,SAAS,EAAE,EAAW,KAAK;AAEnD,UAAK,QAAQ,OAAO,OAAO,WAAW;MACtC;MAEL;;EAzBD,WAAW,qBAA+B;AACxC,UAAO,CAEL,GAAI,MAAM,sBAAsB,EAAE,CACnC;;EAuBH,oBAA0B;AACxB,SAAM,qBAAqB;;EAG7B,uBAA6B;AAC3B,SAAM,wBAAwB;;EAGhC,YAAY,OAA0B;AAEpC,SAAM,cAAc,MAAM;;;AAK9B,KAAI,YACF,QAAO,eAAe,oBAAoB,QAAQ,EAAE,OAAO,aAAa,CAAC;AAG3E,QAAO"}
@@ -0,0 +1,47 @@
1
+ import { t as toConnectedHTMLComponent } from "./component-factory-DeAN6cjC.js";
2
+ import { currentTimeDisplayStateDefinition } from "@videojs/core/store";
3
+ import { formatDisplayTime } from "@videojs/utils";
4
+
5
+ //#region src/elements/current-time-display.ts
6
+ var CurrentTimeDisplay = class extends HTMLElement {
7
+ static {
8
+ this.shadowRootOptions = { mode: "open" };
9
+ }
10
+ static {
11
+ this.observedAttributes = ["show-remaining"];
12
+ }
13
+ constructor() {
14
+ super();
15
+ if (!this.shadowRoot) this.attachShadow(this.constructor.shadowRootOptions);
16
+ }
17
+ get currentTime() {
18
+ return this._state?.currentTime ?? 0;
19
+ }
20
+ get duration() {
21
+ return this._state?.duration ?? 0;
22
+ }
23
+ get showRemaining() {
24
+ return this.hasAttribute("show-remaining");
25
+ }
26
+ attributeChangedCallback(name, _oldValue, _newValue) {
27
+ if (name === "show-remaining" && this._state) this._update({}, this._state);
28
+ }
29
+ _update(_props, state) {
30
+ this._state = state;
31
+ /** @TODO Should this live here or elsewhere? (CJP) */
32
+ const timeLabel = this.showRemaining && state.duration != null && state.currentTime != null ? formatDisplayTime(-(state.duration - state.currentTime)) : formatDisplayTime(state.currentTime);
33
+ if (this.shadowRoot) this.shadowRoot.textContent = timeLabel;
34
+ }
35
+ };
36
+ const useCurrentTimeDisplayState = {
37
+ keys: [...currentTimeDisplayStateDefinition.keys],
38
+ transform: (rawState, _mediaStore) => ({ ...currentTimeDisplayStateDefinition.stateTransform(rawState) })
39
+ };
40
+ const getCurrentTimeDisplayProps = (_state, _element) => {
41
+ return {};
42
+ };
43
+ const CurrentTimeDisplayElement = toConnectedHTMLComponent(CurrentTimeDisplay, useCurrentTimeDisplayState, getCurrentTimeDisplayProps, "CurrentTimeDisplay");
44
+
45
+ //#endregion
46
+ export { CurrentTimeDisplayElement as t };
47
+ //# sourceMappingURL=current-time-display-C3qndGf5.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"current-time-display-C3qndGf5.js","names":["useCurrentTimeDisplayState: StateHook<{\n currentTime: number | undefined;\n duration: number | undefined;\n}>","getCurrentTimeDisplayProps: PropsHook<{\n currentTime: number | undefined;\n duration: number | undefined;\n}>","CurrentTimeDisplayElement: ConnectedComponentConstructor<CurrentTimeDisplayState>"],"sources":["../src/elements/current-time-display.ts"],"sourcesContent":["import type { CurrentTimeDisplayState } from '@videojs/core/store';\nimport type { ConnectedComponentConstructor, PropsHook, StateHook } from '../utils/component-factory';\n\nimport { currentTimeDisplayStateDefinition } from '@videojs/core/store';\n\nimport { formatDisplayTime } from '@videojs/utils';\nimport { toConnectedHTMLComponent } from '../utils/component-factory';\n\nexport class CurrentTimeDisplay extends HTMLElement {\n static shadowRootOptions = {\n mode: 'open' as ShadowRootMode,\n };\n\n static observedAttributes: string[] = ['show-remaining'];\n\n _state:\n | {\n currentTime: number | undefined;\n duration: number | undefined;\n }\n | undefined;\n\n constructor() {\n super();\n\n if (!this.shadowRoot) {\n this.attachShadow((this.constructor as typeof CurrentTimeDisplay).shadowRootOptions);\n }\n }\n\n get currentTime(): number {\n return this._state?.currentTime ?? 0;\n }\n\n get duration(): number {\n return this._state?.duration ?? 0;\n }\n\n get showRemaining(): boolean {\n return this.hasAttribute('show-remaining');\n }\n\n attributeChangedCallback(name: string, _oldValue: string | null, _newValue: string | null): void {\n if (name === 'show-remaining' && this._state) {\n // Re-render with current state when show-remaining attribute changes\n this._update({}, this._state);\n }\n }\n\n _update(_props: any, state: any): void {\n this._state = state;\n\n /** @TODO Should this live here or elsewhere? (CJP) */\n const timeLabel\n = this.showRemaining && state.duration != null && state.currentTime != null\n ? formatDisplayTime(-(state.duration - state.currentTime))\n : formatDisplayTime(state.currentTime);\n\n if (this.shadowRoot) {\n this.shadowRoot.textContent = timeLabel;\n }\n }\n}\n\nexport const useCurrentTimeDisplayState: StateHook<{\n currentTime: number | undefined;\n duration: number | undefined;\n}> = {\n keys: [...currentTimeDisplayStateDefinition.keys],\n transform: (rawState, _mediaStore) => ({\n ...currentTimeDisplayStateDefinition.stateTransform(rawState),\n // Current time display is read-only, so no request methods needed\n }),\n};\n\nexport const getCurrentTimeDisplayProps: PropsHook<{\n currentTime: number | undefined;\n duration: number | undefined;\n}> = (_state, _element) => {\n const baseProps: Record<string, any> = {};\n return baseProps;\n};\n\nexport const CurrentTimeDisplayElement: ConnectedComponentConstructor<CurrentTimeDisplayState> = toConnectedHTMLComponent(\n CurrentTimeDisplay,\n useCurrentTimeDisplayState,\n getCurrentTimeDisplayProps,\n 'CurrentTimeDisplay',\n);\n"],"mappings":";;;;;AAQA,IAAa,qBAAb,cAAwC,YAAY;;2BACvB,EACzB,MAAM,QACP;;;4BAEqC,CAAC,iBAAiB;;CASxD,cAAc;AACZ,SAAO;AAEP,MAAI,CAAC,KAAK,WACR,MAAK,aAAc,KAAK,YAA0C,kBAAkB;;CAIxF,IAAI,cAAsB;AACxB,SAAO,KAAK,QAAQ,eAAe;;CAGrC,IAAI,WAAmB;AACrB,SAAO,KAAK,QAAQ,YAAY;;CAGlC,IAAI,gBAAyB;AAC3B,SAAO,KAAK,aAAa,iBAAiB;;CAG5C,yBAAyB,MAAc,WAA0B,WAAgC;AAC/F,MAAI,SAAS,oBAAoB,KAAK,OAEpC,MAAK,QAAQ,EAAE,EAAE,KAAK,OAAO;;CAIjC,QAAQ,QAAa,OAAkB;AACrC,OAAK,SAAS;;EAGd,MAAM,YACF,KAAK,iBAAiB,MAAM,YAAY,QAAQ,MAAM,eAAe,OACnE,kBAAkB,EAAE,MAAM,WAAW,MAAM,aAAa,GACxD,kBAAkB,MAAM,YAAY;AAE1C,MAAI,KAAK,WACP,MAAK,WAAW,cAAc;;;AAKpC,MAAaA,6BAGR;CACH,MAAM,CAAC,GAAG,kCAAkC,KAAK;CACjD,YAAY,UAAU,iBAAiB,EACrC,GAAG,kCAAkC,eAAe,SAAS,EAE9D;CACF;AAED,MAAaC,8BAGP,QAAQ,aAAa;AAEzB,QADuC,EAAE;;AAI3C,MAAaC,4BAAoF,yBAC/F,oBACA,4BACA,4BACA,qBACD"}
@@ -0,0 +1,10 @@
1
+ //#region src/utils/custom-element.ts
2
+ function defineCustomElement(tagName, ctor) {
3
+ if (typeof window === "undefined") return;
4
+ if (window.customElements.get(tagName)) return;
5
+ window.customElements.define(tagName, ctor);
6
+ }
7
+
8
+ //#endregion
9
+ export { defineCustomElement as t };
10
+ //# sourceMappingURL=custom-element-3bDlB2XO.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"custom-element-3bDlB2XO.js","names":[],"sources":["../src/utils/custom-element.ts"],"sourcesContent":["export function defineCustomElement(tagName: string, ctor: CustomElementConstructor): void {\n if (typeof window === 'undefined') return;\n\n if (window.customElements.get(tagName)) return;\n\n window.customElements.define(tagName, ctor);\n}\n"],"mappings":";AAAA,SAAgB,oBAAoB,SAAiB,MAAsC;AACzF,KAAI,OAAO,WAAW,YAAa;AAEnC,KAAI,OAAO,eAAe,IAAI,QAAQ,CAAE;AAExC,QAAO,eAAe,OAAO,SAAS,KAAK"}
@@ -0,0 +1,12 @@
1
+ import "../media-container-DPnFjmtK.js";
2
+ import "../media-provider-D7P2TLXG.js";
3
+ import "../media-play-button-oq8yDlxe.js";
4
+ import "../media-mute-button-NVJF2EEW.js";
5
+ import "../media-volume-slider-DP47VLVi.js";
6
+ import "../media-time-slider-DvMnfYXZ.js";
7
+ import "../media-fullscreen-button-BgUK3lgu.js";
8
+ import "../media-duration-display-qvm6YX-q.js";
9
+ import "../media-current-time-display-Cd0rPAuj.js";
10
+ import "../media-preview-time-display-4YX5Rics.js";
11
+ import "../media-popover-BtJmPv0E.js";
12
+ import "../media-tooltip-BqV17mdM.js";
@@ -0,0 +1,27 @@
1
+ import "../component-factory-DeAN6cjC.js";
2
+ import "../current-time-display-C3qndGf5.js";
3
+ import "../duration-display-JOPp3bdU.js";
4
+ import "../button-D1DWjsQu.js";
5
+ import "../fullscreen-button-CGO2UJjs.js";
6
+ import "../mute-button-vW2sLqqY.js";
7
+ import "../play-button-aVb0g10G.js";
8
+ import "../popover-Dc0hyhwB.js";
9
+ import "../preview-time-display-Dax0FQ2X.js";
10
+ import "../time-slider-CA1GMs6A.js";
11
+ import "../tooltip-54fBUUpb.js";
12
+ import "../volume-slider-guD8gqpi.js";
13
+ import "../media-container-C0MUzkJ_.js";
14
+ import "../media-provider-CyoL0bCx.js";
15
+ import "../custom-element-3bDlB2XO.js";
16
+ import "../media-container-BGEXSi9g.js";
17
+ import "../media-provider-D_GL2_DN.js";
18
+ import "../media-play-button-CLj-hkwn.js";
19
+ import "../media-mute-button-BOVhZ3aP.js";
20
+ import "../media-volume-slider-CKSxmdQv.js";
21
+ import "../media-time-slider-Bp2qnwsW.js";
22
+ import "../media-fullscreen-button-Dcflbt54.js";
23
+ import "../media-duration-display-BLMr7VHo.js";
24
+ import "../media-current-time-display-B-4Cp845.js";
25
+ import "../media-preview-time-display-DAiMgLPX.js";
26
+ import "../media-popover-F4M4Tq4z.js";
27
+ import "../media-tooltip-ClcVafMb.js";
@@ -0,0 +1 @@
1
+ import "../media-container-DPnFjmtK.js";
@@ -0,0 +1,3 @@
1
+ import "../media-container-C0MUzkJ_.js";
2
+ import "../custom-element-3bDlB2XO.js";
3
+ import "../media-container-BGEXSi9g.js";
@@ -0,0 +1 @@
1
+ import "../media-current-time-display-Cd0rPAuj.js";
@@ -0,0 +1,4 @@
1
+ import "../component-factory-DeAN6cjC.js";
2
+ import "../current-time-display-C3qndGf5.js";
3
+ import "../custom-element-3bDlB2XO.js";
4
+ import "../media-current-time-display-B-4Cp845.js";
@@ -0,0 +1 @@
1
+ import "../media-duration-display-qvm6YX-q.js";
@@ -0,0 +1,4 @@
1
+ import "../component-factory-DeAN6cjC.js";
2
+ import "../duration-display-JOPp3bdU.js";
3
+ import "../custom-element-3bDlB2XO.js";
4
+ import "../media-duration-display-BLMr7VHo.js";
@@ -0,0 +1 @@
1
+ import "../media-fullscreen-button-BgUK3lgu.js";
@@ -0,0 +1,5 @@
1
+ import "../component-factory-DeAN6cjC.js";
2
+ import "../button-D1DWjsQu.js";
3
+ import "../fullscreen-button-CGO2UJjs.js";
4
+ import "../custom-element-3bDlB2XO.js";
5
+ import "../media-fullscreen-button-Dcflbt54.js";
@@ -0,0 +1 @@
1
+ import "../media-mute-button-NVJF2EEW.js";
@@ -0,0 +1,5 @@
1
+ import "../component-factory-DeAN6cjC.js";
2
+ import "../button-D1DWjsQu.js";
3
+ import "../mute-button-vW2sLqqY.js";
4
+ import "../custom-element-3bDlB2XO.js";
5
+ import "../media-mute-button-BOVhZ3aP.js";
@@ -0,0 +1 @@
1
+ import "../media-play-button-oq8yDlxe.js";
@@ -0,0 +1,5 @@
1
+ import "../component-factory-DeAN6cjC.js";
2
+ import "../button-D1DWjsQu.js";
3
+ import "../play-button-aVb0g10G.js";
4
+ import "../custom-element-3bDlB2XO.js";
5
+ import "../media-play-button-CLj-hkwn.js";
@@ -0,0 +1 @@
1
+ import "../media-popover-BtJmPv0E.js";
@@ -0,0 +1,3 @@
1
+ import "../popover-Dc0hyhwB.js";
2
+ import "../custom-element-3bDlB2XO.js";
3
+ import "../media-popover-F4M4Tq4z.js";
@@ -0,0 +1 @@
1
+ import "../media-preview-time-display-4YX5Rics.js";
@@ -0,0 +1,4 @@
1
+ import "../component-factory-DeAN6cjC.js";
2
+ import "../preview-time-display-Dax0FQ2X.js";
3
+ import "../custom-element-3bDlB2XO.js";
4
+ import "../media-preview-time-display-DAiMgLPX.js";
@@ -0,0 +1 @@
1
+ import "../media-provider-D7P2TLXG.js";
@@ -0,0 +1,3 @@
1
+ import "../media-provider-CyoL0bCx.js";
2
+ import "../custom-element-3bDlB2XO.js";
3
+ import "../media-provider-D_GL2_DN.js";
@@ -0,0 +1 @@
1
+ import "../media-time-slider-DvMnfYXZ.js";
@@ -0,0 +1,4 @@
1
+ import "../component-factory-DeAN6cjC.js";
2
+ import "../time-slider-CA1GMs6A.js";
3
+ import "../custom-element-3bDlB2XO.js";
4
+ import "../media-time-slider-Bp2qnwsW.js";
@@ -0,0 +1 @@
1
+ import "../media-tooltip-BqV17mdM.js";
@@ -0,0 +1,3 @@
1
+ import "../tooltip-54fBUUpb.js";
2
+ import "../custom-element-3bDlB2XO.js";
3
+ import "../media-tooltip-ClcVafMb.js";
@@ -0,0 +1 @@
1
+ import "../media-volume-slider-DP47VLVi.js";
@@ -0,0 +1,4 @@
1
+ import "../component-factory-DeAN6cjC.js";
2
+ import "../volume-slider-guD8gqpi.js";
3
+ import "../custom-element-3bDlB2XO.js";
4
+ import "../media-volume-slider-CKSxmdQv.js";
@@ -0,0 +1,49 @@
1
+ import { t as toConnectedHTMLComponent } from "./component-factory-DeAN6cjC.js";
2
+ import { durationDisplayStateDefinition } from "@videojs/core/store";
3
+ import { formatDisplayTime } from "@videojs/utils";
4
+ import { namedNodeMapToObject } from "@videojs/utils/dom";
5
+
6
+ //#region src/elements/duration-display.ts
7
+ function getTemplateHTML(_attrs, _props = {}) {
8
+ return `
9
+ <span></span>
10
+ `;
11
+ }
12
+ var DurationDisplay = class extends HTMLElement {
13
+ static {
14
+ this.shadowRootOptions = { mode: "open" };
15
+ }
16
+ static {
17
+ this.getTemplateHTML = getTemplateHTML;
18
+ }
19
+ constructor() {
20
+ super();
21
+ if (!this.shadowRoot) {
22
+ this.attachShadow(this.constructor.shadowRootOptions);
23
+ const attrs = namedNodeMapToObject(this.attributes);
24
+ const html = this.constructor.getTemplateHTML(attrs);
25
+ const shadowRoot = this.shadowRoot;
26
+ shadowRoot.setHTMLUnsafe ? shadowRoot.setHTMLUnsafe(html) : shadowRoot.innerHTML = html;
27
+ }
28
+ }
29
+ get duration() {
30
+ return this._state?.duration ?? 0;
31
+ }
32
+ _update(_props, state) {
33
+ this._state = state;
34
+ const spanElement = this.shadowRoot?.querySelector("span");
35
+ if (spanElement) spanElement.textContent = formatDisplayTime(state.duration);
36
+ }
37
+ };
38
+ const useDurationDisplayState = {
39
+ keys: [...durationDisplayStateDefinition.keys],
40
+ transform: (rawState, _mediaStore) => ({ ...durationDisplayStateDefinition.stateTransform(rawState) })
41
+ };
42
+ const getDurationDisplayProps = (_state, _element) => {
43
+ return {};
44
+ };
45
+ const DurationDisplayElement = toConnectedHTMLComponent(DurationDisplay, useDurationDisplayState, getDurationDisplayProps, "DurationDisplay");
46
+
47
+ //#endregion
48
+ export { DurationDisplayElement as t };
49
+ //# sourceMappingURL=duration-display-JOPp3bdU.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"duration-display-JOPp3bdU.js","names":["useDurationDisplayState: StateHook<{\n duration: number | undefined;\n}>","getDurationDisplayProps: PropsHook<{\n duration: number | undefined;\n}>","DurationDisplayElement: ConnectedComponentConstructor<DurationDisplayState>"],"sources":["../src/elements/duration-display.ts"],"sourcesContent":["import type { DurationDisplayState } from '@videojs/core/store';\nimport type { ConnectedComponentConstructor, PropsHook, StateHook } from '../utils/component-factory';\n\nimport { durationDisplayStateDefinition } from '@videojs/core/store';\n\nimport { formatDisplayTime } from '@videojs/utils';\nimport { namedNodeMapToObject } from '@videojs/utils/dom';\nimport { toConnectedHTMLComponent } from '../utils/component-factory';\n\nexport function getTemplateHTML(\n this: typeof DurationDisplay,\n _attrs: Record<string, string>,\n _props: Record<string, any> = {},\n) {\n return /* html */ `\n <span></span>\n `;\n}\n\nexport class DurationDisplay extends HTMLElement {\n static shadowRootOptions = {\n mode: 'open' as ShadowRootMode,\n };\n\n static getTemplateHTML: typeof getTemplateHTML = getTemplateHTML;\n\n _state:\n | {\n duration: number | undefined;\n }\n | undefined;\n\n constructor() {\n super();\n\n if (!this.shadowRoot) {\n this.attachShadow((this.constructor as typeof DurationDisplay).shadowRootOptions);\n\n const attrs = namedNodeMapToObject(this.attributes);\n const html = (this.constructor as typeof DurationDisplay).getTemplateHTML(attrs);\n const shadowRoot = this.shadowRoot as unknown as ShadowRoot;\n shadowRoot.setHTMLUnsafe ? shadowRoot.setHTMLUnsafe(html) : (shadowRoot.innerHTML = html);\n }\n }\n\n get duration(): number {\n return this._state?.duration ?? 0;\n }\n\n _update(_props: any, state: any): void {\n this._state = state;\n\n // Update the span content with formatted duration\n const spanElement = this.shadowRoot?.querySelector('span') as HTMLElement;\n if (spanElement) {\n spanElement.textContent = formatDisplayTime(state.duration);\n }\n }\n}\n\nexport const useDurationDisplayState: StateHook<{\n duration: number | undefined;\n}> = {\n keys: [...durationDisplayStateDefinition.keys],\n transform: (rawState, _mediaStore) => ({\n ...durationDisplayStateDefinition.stateTransform(rawState),\n // Duration display is read-only, so no request methods needed\n }),\n};\n\nexport const getDurationDisplayProps: PropsHook<{\n duration: number | undefined;\n}> = (_state, _element) => {\n const baseProps: Record<string, any> = {};\n return baseProps;\n};\n\nexport const DurationDisplayElement: ConnectedComponentConstructor<DurationDisplayState> = toConnectedHTMLComponent(\n DurationDisplay,\n useDurationDisplayState,\n getDurationDisplayProps,\n 'DurationDisplay',\n);\n"],"mappings":";;;;;;AASA,SAAgB,gBAEd,QACA,SAA8B,EAAE,EAChC;AACA,QAAkB;;;;AAKpB,IAAa,kBAAb,cAAqC,YAAY;;2BACpB,EACzB,MAAM,QACP;;;yBAEgD;;CAQjD,cAAc;AACZ,SAAO;AAEP,MAAI,CAAC,KAAK,YAAY;AACpB,QAAK,aAAc,KAAK,YAAuC,kBAAkB;GAEjF,MAAM,QAAQ,qBAAqB,KAAK,WAAW;GACnD,MAAM,OAAQ,KAAK,YAAuC,gBAAgB,MAAM;GAChF,MAAM,aAAa,KAAK;AACxB,cAAW,gBAAgB,WAAW,cAAc,KAAK,GAAI,WAAW,YAAY;;;CAIxF,IAAI,WAAmB;AACrB,SAAO,KAAK,QAAQ,YAAY;;CAGlC,QAAQ,QAAa,OAAkB;AACrC,OAAK,SAAS;EAGd,MAAM,cAAc,KAAK,YAAY,cAAc,OAAO;AAC1D,MAAI,YACF,aAAY,cAAc,kBAAkB,MAAM,SAAS;;;AAKjE,MAAaA,0BAER;CACH,MAAM,CAAC,GAAG,+BAA+B,KAAK;CAC9C,YAAY,UAAU,iBAAiB,EACrC,GAAG,+BAA+B,eAAe,SAAS,EAE3D;CACF;AAED,MAAaC,2BAEP,QAAQ,aAAa;AAEzB,QADuC,EAAE;;AAI3C,MAAaC,yBAA8E,yBACzF,iBACA,yBACA,yBACA,kBACD"}
@@ -0,0 +1,48 @@
1
+ import { t as toConnectedHTMLComponent } from "./component-factory-DeAN6cjC.js";
2
+ import { t as ButtonElement } from "./button-D1DWjsQu.js";
3
+ import { fullscreenButtonStateDefinition } from "@videojs/core/store";
4
+ import { setAttributes } from "@videojs/utils/dom";
5
+
6
+ //#region src/elements/fullscreen-button.ts
7
+ var FullscreenButton = class extends ButtonElement {
8
+ handleEvent(event) {
9
+ super.handleEvent(event);
10
+ const { type } = event;
11
+ const state = this._state;
12
+ if (state && type === "click") if (state.fullscreen) state.requestExitFullscreen();
13
+ else state.requestEnterFullscreen();
14
+ }
15
+ get fullscreen() {
16
+ return this._state?.fullscreen ?? false;
17
+ }
18
+ _update(props, state, _mediaStore) {
19
+ this._state = state;
20
+ /** @TODO Follow up with React vs. W.C. data-* attributes discrepancies (CJP) */
21
+ setAttributes(this, props);
22
+ }
23
+ };
24
+ /**
25
+ * FullscreenButton state hook - equivalent to React's useFullscreenButtonState
26
+ * Handles media store state subscription and transformation
27
+ */
28
+ const getFullscreenButtonState = {
29
+ keys: fullscreenButtonStateDefinition.keys,
30
+ transform: (rawState, mediaStore) => ({
31
+ ...fullscreenButtonStateDefinition.stateTransform(rawState),
32
+ ...fullscreenButtonStateDefinition.createRequestMethods(mediaStore.dispatch)
33
+ })
34
+ };
35
+ const getFullscreenButtonProps = (state, _element) => {
36
+ return {
37
+ "data-fullscreen": state.fullscreen,
38
+ role: "button",
39
+ tabindex: "0",
40
+ "aria-label": state.fullscreen ? "exit fullscreen" : "enter fullscreen",
41
+ "data-tooltip": state.fullscreen ? "Exit Fullscreen" : "Enter Fullscreen"
42
+ };
43
+ };
44
+ const FullscreenButtonElement = toConnectedHTMLComponent(FullscreenButton, getFullscreenButtonState, getFullscreenButtonProps, "FullscreenButton");
45
+
46
+ //#endregion
47
+ export { FullscreenButtonElement as t };
48
+ //# sourceMappingURL=fullscreen-button-CGO2UJjs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fullscreen-button-CGO2UJjs.js","names":["getFullscreenButtonState: StateHook<{ fullscreen: boolean }>","getFullscreenButtonProps: PropsHook<{ fullscreen: boolean }>","FullscreenButtonElement: ConnectedComponentConstructor<FullscreenButtonState>"],"sources":["../src/elements/fullscreen-button.ts"],"sourcesContent":["import type { FullscreenButtonState } from '@videojs/core/store';\nimport type { ConnectedComponentConstructor, PropsHook, StateHook } from '../utils/component-factory';\n\nimport { fullscreenButtonStateDefinition } from '@videojs/core/store';\n\nimport { setAttributes } from '@videojs/utils/dom';\nimport { toConnectedHTMLComponent } from '../utils/component-factory';\nimport { ButtonElement } from './button';\n\nexport class FullscreenButton extends ButtonElement {\n _state:\n | {\n fullscreen: boolean;\n requestEnterFullscreen: () => void;\n requestExitFullscreen: () => void;\n }\n | undefined;\n\n handleEvent(event: Event): void {\n super.handleEvent(event);\n\n const { type } = event;\n const state = this._state;\n if (state && type === 'click') {\n if (state.fullscreen) {\n state.requestExitFullscreen();\n } else {\n state.requestEnterFullscreen();\n }\n }\n }\n\n get fullscreen(): boolean {\n return this._state?.fullscreen ?? false;\n }\n\n _update(props: any, state: any, _mediaStore?: any): void {\n this._state = state;\n /** @TODO Follow up with React vs. W.C. data-* attributes discrepancies (CJP) */\n setAttributes(this, props);\n }\n}\n\n/**\n * FullscreenButton state hook - equivalent to React's useFullscreenButtonState\n * Handles media store state subscription and transformation\n */\nexport const getFullscreenButtonState: StateHook<{ fullscreen: boolean }> = {\n keys: fullscreenButtonStateDefinition.keys,\n transform: (rawState, mediaStore) => ({\n ...fullscreenButtonStateDefinition.stateTransform(rawState),\n ...fullscreenButtonStateDefinition.createRequestMethods(mediaStore.dispatch),\n }),\n};\n\nexport const getFullscreenButtonProps: PropsHook<{ fullscreen: boolean }> = (state, _element) => {\n const baseProps: Record<string, any> = {\n /** data attributes/props */\n 'data-fullscreen': state.fullscreen,\n /** @TODO Need another state provider in core for i18n (CJP) */\n /** aria attributes/props */\n role: 'button',\n tabindex: '0',\n 'aria-label': state.fullscreen ? 'exit fullscreen' : 'enter fullscreen',\n /** tooltip */\n 'data-tooltip': state.fullscreen ? 'Exit Fullscreen' : 'Enter Fullscreen',\n /** @TODO Figure out how we want to handle attr overrides (e.g. aria-label) (CJP) */\n /** external props spread last to allow for overriding */\n // ...props,\n };\n\n return baseProps;\n};\n\nexport const FullscreenButtonElement: ConnectedComponentConstructor<FullscreenButtonState> = toConnectedHTMLComponent(\n FullscreenButton,\n getFullscreenButtonState,\n getFullscreenButtonProps,\n 'FullscreenButton',\n);\n"],"mappings":";;;;;;AASA,IAAa,mBAAb,cAAsC,cAAc;CASlD,YAAY,OAAoB;AAC9B,QAAM,YAAY,MAAM;EAExB,MAAM,EAAE,SAAS;EACjB,MAAM,QAAQ,KAAK;AACnB,MAAI,SAAS,SAAS,QACpB,KAAI,MAAM,WACR,OAAM,uBAAuB;MAE7B,OAAM,wBAAwB;;CAKpC,IAAI,aAAsB;AACxB,SAAO,KAAK,QAAQ,cAAc;;CAGpC,QAAQ,OAAY,OAAY,aAAyB;AACvD,OAAK,SAAS;;AAEd,gBAAc,MAAM,MAAM;;;;;;;AAQ9B,MAAaA,2BAA+D;CAC1E,MAAM,gCAAgC;CACtC,YAAY,UAAU,gBAAgB;EACpC,GAAG,gCAAgC,eAAe,SAAS;EAC3D,GAAG,gCAAgC,qBAAqB,WAAW,SAAS;EAC7E;CACF;AAED,MAAaC,4BAAgE,OAAO,aAAa;AAgB/F,QAfuC;EAErC,mBAAmB,MAAM;EAGzB,MAAM;EACN,UAAU;EACV,cAAc,MAAM,aAAa,oBAAoB;EAErD,gBAAgB,MAAM,aAAa,oBAAoB;EAIxD;;AAKH,MAAaC,0BAAgF,yBAC3F,kBACA,0BACA,0BACA,mBACD"}