@videojs/html 10.0.0-beta.14 → 10.0.0-beta.16
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.
- package/cdn/audio-minimal-ui.dev.js +4 -5
- package/cdn/audio-minimal-ui.js +1 -1
- package/cdn/audio-minimal.dev.js +7 -8
- package/cdn/audio-minimal.dev.js.map +1 -1
- package/cdn/audio-minimal.js +1 -1
- package/cdn/audio-minimal.js.map +1 -1
- package/cdn/audio-ui.dev.js +5 -5
- package/cdn/audio-ui.js +1 -1
- package/cdn/audio.dev.js +23 -7
- package/cdn/audio.dev.js.map +1 -1
- package/cdn/audio.js +1 -1
- package/cdn/audio.js.map +1 -1
- package/cdn/background.dev.js +3 -3
- package/cdn/background.js +1 -1
- package/cdn/background.js.map +1 -1
- package/cdn/context-C-IpVHEt.js +14 -0
- package/cdn/context-C-IpVHEt.js.map +1 -0
- package/cdn/{context-BjrbhiSk.js → context-CvJ83xGk.js} +2 -83
- package/cdn/context-CvJ83xGk.js.map +1 -0
- package/cdn/create-player-B_oNyyb5.js +7 -0
- package/cdn/create-player-B_oNyyb5.js.map +1 -0
- package/cdn/{create-player-Cz5Y4DmL.js → create-player-DckZq-sE.js} +59 -1419
- package/cdn/create-player-DckZq-sE.js.map +1 -0
- package/cdn/{hls-DwNUcXDb.js → hls-CJCXZSGG.js} +43 -5
- package/cdn/hls-CJCXZSGG.js.map +1 -0
- package/cdn/{hls-A02jAc_G.js → hls-lPH0rWmB.js} +3 -3
- package/cdn/hls-lPH0rWmB.js.map +1 -0
- package/cdn/hotkey-B7OaweHa.js +154 -0
- package/cdn/hotkey-B7OaweHa.js.map +1 -0
- package/cdn/hotkey-BLEt77Z0.js +2 -0
- package/cdn/hotkey-BLEt77Z0.js.map +1 -0
- package/cdn/media/dash-video.dev.js +3 -4
- package/cdn/media/dash-video.dev.js.map +1 -1
- package/cdn/media/dash-video.js +2 -2
- package/cdn/media/hls-video.dev.js +4 -5
- package/cdn/media/hls-video.dev.js.map +1 -1
- package/cdn/media/hls-video.js +1 -1
- package/cdn/media/hls-video.js.map +1 -1
- package/cdn/media/mux-audio.dev.d.ts +1 -0
- package/cdn/media/mux-audio.dev.js +29 -0
- package/cdn/media/mux-audio.dev.js.map +1 -0
- package/cdn/media/mux-audio.js +2 -0
- package/cdn/media/mux-audio.js.map +1 -0
- package/cdn/media/mux-video.dev.js +5 -3099
- package/cdn/media/mux-video.dev.js.map +1 -1
- package/cdn/media/mux-video.js +1 -24
- package/cdn/media/mux-video.js.map +1 -1
- package/cdn/media/native-hls-video.dev.js +4 -4
- package/cdn/media/native-hls-video.js +1 -1
- package/cdn/media/simple-hls-video.dev.js +965 -680
- package/cdn/media/simple-hls-video.dev.js.map +1 -1
- package/cdn/media/simple-hls-video.js +6 -6
- package/cdn/media/simple-hls-video.js.map +1 -1
- package/cdn/{media-attach-mixin-DfKkofgF.js → media-attach-mixin-CMH1ziXP.js} +2 -2
- package/cdn/{media-attach-mixin-DfKkofgF.js.map → media-attach-mixin-CMH1ziXP.js.map} +1 -1
- package/cdn/{media-attach-mixin-Dv2D43tb.js → media-attach-mixin-DUzmXEJ3.js} +2 -2
- package/cdn/{media-attach-mixin-Dv2D43tb.js.map → media-attach-mixin-DUzmXEJ3.js.map} +1 -1
- package/cdn/{media-props-mixin-CNJVvHAH.js → media-props-mixin-CZLZIhGT.js} +100 -9
- package/cdn/media-props-mixin-CZLZIhGT.js.map +1 -0
- package/cdn/media-props-mixin-DrjlZybt.js +47 -0
- package/cdn/media-props-mixin-DrjlZybt.js.map +1 -0
- package/cdn/{minimal-BUUGNZK7.js → minimal-D9Dw-L2P.js} +1 -1
- package/cdn/{minimal-BUUGNZK7.js.map → minimal-D9Dw-L2P.js.map} +1 -1
- package/cdn/{minimal-CJGOJ6pE.js → minimal-Dc5nNl_-.js} +1 -1
- package/cdn/{minimal-CJGOJ6pE.js.map → minimal-Dc5nNl_-.js.map} +1 -1
- package/cdn/mux-CBXn2z5k.js +3102 -0
- package/cdn/mux-CBXn2z5k.js.map +1 -0
- package/cdn/mux-DmGzBNIq.js +25 -0
- package/cdn/mux-DmGzBNIq.js.map +1 -0
- package/cdn/{native-hls-CPgjPTAQ.js → native-hls-BCOLtRUl.js} +2 -3
- package/cdn/{native-hls-CPgjPTAQ.js.map → native-hls-BCOLtRUl.js.map} +1 -1
- package/cdn/native-hls-BU8--1Kg.js +2 -0
- package/cdn/{native-hls-Db2TurPW.js.map → native-hls-BU8--1Kg.js.map} +1 -1
- package/cdn/player-DAmuLGE1.js +2 -0
- package/cdn/{player-DlGhe0FD.js.map → player-DAmuLGE1.js.map} +1 -1
- package/cdn/{player-XArb4DyB.js → player-Dbl1MUJ2.js} +3 -3
- package/cdn/{player-XArb4DyB.js.map → player-Dbl1MUJ2.js.map} +1 -1
- package/cdn/poster-B9COb7AR.js +2 -0
- package/cdn/poster-B9COb7AR.js.map +1 -0
- package/cdn/poster-qAhnKWea.js +480 -0
- package/cdn/poster-qAhnKWea.js.map +1 -0
- package/cdn/{skin-element-Dk_f7DE8.js → skin-element-DbmY-ske.js} +2 -2
- package/cdn/{skin-element-Dk_f7DE8.js.map → skin-element-DbmY-ske.js.map} +1 -1
- package/cdn/{skin-element-D40glySA.js → skin-element-ih3VrnYx.js} +2 -2
- package/cdn/{skin-element-D40glySA.js.map → skin-element-ih3VrnYx.js.map} +1 -1
- package/cdn/video-minimal-ui.dev.js +4 -5
- package/cdn/video-minimal-ui.js +1 -1
- package/cdn/video-minimal.dev.js +7 -8
- package/cdn/video-minimal.dev.js.map +1 -1
- package/cdn/video-minimal.js +1 -1
- package/cdn/video-minimal.js.map +1 -1
- package/cdn/video-ui.dev.js +5 -5
- package/cdn/video-ui.js +1 -1
- package/cdn/video.dev.js +26 -7
- package/cdn/video.dev.js.map +1 -1
- package/cdn/video.js +1 -1
- package/cdn/video.js.map +1 -1
- package/cdn/volume-slider-BbIc1N4U.js +8 -0
- package/cdn/volume-slider-BbIc1N4U.js.map +1 -0
- package/cdn/{volume-slider-CxGbFVVX.js → volume-slider-C6ek7oC9.js} +1855 -386
- package/cdn/volume-slider-C6ek7oC9.js.map +1 -0
- package/dist/default/_virtual/inline-css_src/define/audio/minimal-skin.js +1 -1
- package/dist/default/_virtual/inline-css_src/define/audio/minimal-skin.js.map +1 -1
- package/dist/default/_virtual/inline-css_src/define/audio/skin.js +1 -1
- package/dist/default/_virtual/inline-css_src/define/audio/skin.js.map +1 -1
- package/dist/default/_virtual/inline-css_src/define/video/minimal-skin.js +1 -1
- package/dist/default/_virtual/inline-css_src/define/video/minimal-skin.js.map +1 -1
- package/dist/default/_virtual/inline-css_src/define/video/skin.js +1 -1
- package/dist/default/_virtual/inline-css_src/define/video/skin.js.map +1 -1
- package/dist/default/define/audio/minimal-skin.css +23 -0
- package/dist/default/define/audio/skin.css +23 -0
- package/dist/default/define/audio/skin.js +1 -1
- package/dist/default/define/audio/skin.js.map +1 -1
- package/dist/default/define/audio/ui.js +1 -0
- package/dist/default/define/background/skin.js +1 -1
- package/dist/default/define/media/mux-audio.js +13 -0
- package/dist/default/define/media/mux-audio.js.map +1 -0
- package/dist/default/define/skin-element.js +1 -1
- package/dist/default/define/ui/hotkey.js +7 -0
- package/dist/default/define/ui/hotkey.js.map +1 -0
- package/dist/default/define/ui/slider.js +1 -1
- package/dist/default/define/ui/time-slider.js +1 -1
- package/dist/default/define/ui/volume-slider.js +1 -1
- package/dist/default/define/video/minimal-skin.css +23 -0
- package/dist/default/define/video/skin.css +23 -0
- package/dist/default/define/video/skin.js +1 -1
- package/dist/default/define/video/skin.js.map +1 -1
- package/dist/default/define/video/ui.js +1 -0
- package/dist/default/index.js +5 -1
- package/dist/default/media/container-element.js +16 -0
- package/dist/default/media/container-element.js.map +1 -1
- package/dist/default/media/mux-audio/index.js +18 -0
- package/dist/default/media/mux-audio/index.js.map +1 -0
- package/dist/default/player/context.js.map +1 -1
- package/dist/default/ui/alert-dialog/alert-dialog-element.js +1 -0
- package/dist/default/ui/alert-dialog/alert-dialog-element.js.map +1 -1
- package/dist/default/ui/buffering-indicator/buffering-indicator-element.js +1 -0
- package/dist/default/ui/buffering-indicator/buffering-indicator-element.js.map +1 -1
- package/dist/default/ui/captions-button/captions-button-element.js +1 -0
- package/dist/default/ui/captions-button/captions-button-element.js.map +1 -1
- package/dist/default/ui/error-dialog/error-dialog-element.js +1 -0
- package/dist/default/ui/error-dialog/error-dialog-element.js.map +1 -1
- package/dist/default/ui/fullscreen-button/fullscreen-button-element.js +1 -0
- package/dist/default/ui/fullscreen-button/fullscreen-button-element.js.map +1 -1
- package/dist/default/ui/hotkey/aria-key-shortcuts-controller.js +28 -0
- package/dist/default/ui/hotkey/aria-key-shortcuts-controller.js.map +1 -0
- package/dist/default/ui/hotkey/hotkey-element.js +81 -0
- package/dist/default/ui/hotkey/hotkey-element.js.map +1 -0
- package/dist/default/ui/media-button-element.js +9 -1
- package/dist/default/ui/media-button-element.js.map +1 -1
- package/dist/default/ui/mute-button/mute-button-element.js +1 -0
- package/dist/default/ui/mute-button/mute-button-element.js.map +1 -1
- package/dist/default/ui/pip-button/pip-button-element.js +1 -0
- package/dist/default/ui/pip-button/pip-button-element.js.map +1 -1
- package/dist/default/ui/play-button/play-button-element.js +1 -0
- package/dist/default/ui/play-button/play-button-element.js.map +1 -1
- package/dist/default/ui/popover/popover-element.js +7 -55
- package/dist/default/ui/popover/popover-element.js.map +1 -1
- package/dist/default/ui/position-controller.js +76 -0
- package/dist/default/ui/position-controller.js.map +1 -0
- package/dist/default/ui/slider/slider-element.js +1 -1
- package/dist/default/ui/slider/slider-preview-element.js +1 -1
- package/dist/default/ui/time-slider/time-slider-element.js +5 -5
- package/dist/default/ui/time-slider/time-slider-element.js.map +1 -1
- package/dist/default/ui/tooltip/tooltip-element.js +8 -54
- package/dist/default/ui/tooltip/tooltip-element.js.map +1 -1
- package/dist/default/ui/volume-slider/volume-slider-element.js +1 -1
- package/dist/dev/_virtual/inline-css_src/define/audio/minimal-skin.js +1 -1
- package/dist/dev/_virtual/inline-css_src/define/audio/minimal-skin.js.map +1 -1
- package/dist/dev/_virtual/inline-css_src/define/audio/skin.js +1 -1
- package/dist/dev/_virtual/inline-css_src/define/audio/skin.js.map +1 -1
- package/dist/dev/_virtual/inline-css_src/define/video/minimal-skin.js +1 -1
- package/dist/dev/_virtual/inline-css_src/define/video/minimal-skin.js.map +1 -1
- package/dist/dev/_virtual/inline-css_src/define/video/skin.js +1 -1
- package/dist/dev/_virtual/inline-css_src/define/video/skin.js.map +1 -1
- package/dist/dev/define/audio/minimal-skin.css +23 -0
- package/dist/dev/define/audio/skin.css +23 -0
- package/dist/dev/define/audio/skin.d.ts.map +1 -1
- package/dist/dev/define/audio/skin.js +16 -0
- package/dist/dev/define/audio/skin.js.map +1 -1
- package/dist/dev/define/audio/ui.js +1 -0
- package/dist/dev/define/background/skin.js +1 -1
- package/dist/dev/define/media/mux-audio.d.ts +14 -0
- package/dist/dev/define/media/mux-audio.d.ts.map +1 -0
- package/dist/dev/define/media/mux-audio.js +13 -0
- package/dist/dev/define/media/mux-audio.js.map +1 -0
- package/dist/dev/define/skin-element.d.ts +1 -1
- package/dist/dev/define/skin-element.js +1 -1
- package/dist/dev/define/ui/hotkey.d.ts +9 -0
- package/dist/dev/define/ui/hotkey.d.ts.map +1 -0
- package/dist/dev/define/ui/hotkey.js +7 -0
- package/dist/dev/define/ui/hotkey.js.map +1 -0
- package/dist/dev/define/ui/slider.js +1 -1
- package/dist/dev/define/ui/time-slider.js +1 -1
- package/dist/dev/define/ui/volume-slider.js +1 -1
- package/dist/dev/define/video/minimal-skin.css +23 -0
- package/dist/dev/define/video/skin.css +23 -0
- package/dist/dev/define/video/skin.d.ts.map +1 -1
- package/dist/dev/define/video/skin.js +19 -0
- package/dist/dev/define/video/skin.js.map +1 -1
- package/dist/dev/define/video/ui.js +1 -0
- package/dist/dev/index.d.ts +6 -2
- package/dist/dev/index.js +5 -1
- package/dist/dev/media/container-element.d.ts +3 -0
- package/dist/dev/media/container-element.d.ts.map +1 -1
- package/dist/dev/media/container-element.js +16 -0
- package/dist/dev/media/container-element.js.map +1 -1
- package/dist/dev/media/mux-audio/index.d.ts +11 -0
- package/dist/dev/media/mux-audio/index.d.ts.map +1 -0
- package/dist/dev/media/mux-audio/index.js +18 -0
- package/dist/dev/media/mux-audio/index.js.map +1 -0
- package/dist/dev/player/context.d.ts +4 -2
- package/dist/dev/player/context.d.ts.map +1 -1
- package/dist/dev/player/context.js.map +1 -1
- package/dist/dev/ui/alert-dialog/alert-dialog-element.d.ts.map +1 -1
- package/dist/dev/ui/alert-dialog/alert-dialog-element.js +1 -0
- package/dist/dev/ui/alert-dialog/alert-dialog-element.js.map +1 -1
- package/dist/dev/ui/buffering-indicator/buffering-indicator-element.d.ts.map +1 -1
- package/dist/dev/ui/buffering-indicator/buffering-indicator-element.js +1 -0
- package/dist/dev/ui/buffering-indicator/buffering-indicator-element.js.map +1 -1
- package/dist/dev/ui/captions-button/captions-button-element.d.ts +1 -0
- package/dist/dev/ui/captions-button/captions-button-element.d.ts.map +1 -1
- package/dist/dev/ui/captions-button/captions-button-element.js +1 -0
- package/dist/dev/ui/captions-button/captions-button-element.js.map +1 -1
- package/dist/dev/ui/context-part-element.d.ts +1 -1
- package/dist/dev/ui/error-dialog/error-dialog-element.d.ts.map +1 -1
- package/dist/dev/ui/error-dialog/error-dialog-element.js +1 -0
- package/dist/dev/ui/error-dialog/error-dialog-element.js.map +1 -1
- package/dist/dev/ui/fullscreen-button/fullscreen-button-element.d.ts +1 -0
- package/dist/dev/ui/fullscreen-button/fullscreen-button-element.d.ts.map +1 -1
- package/dist/dev/ui/fullscreen-button/fullscreen-button-element.js +1 -0
- package/dist/dev/ui/fullscreen-button/fullscreen-button-element.js.map +1 -1
- package/dist/dev/ui/hotkey/aria-key-shortcuts-controller.d.ts +15 -0
- package/dist/dev/ui/hotkey/aria-key-shortcuts-controller.d.ts.map +1 -0
- package/dist/dev/ui/hotkey/aria-key-shortcuts-controller.js +28 -0
- package/dist/dev/ui/hotkey/aria-key-shortcuts-controller.js.map +1 -0
- package/dist/dev/ui/hotkey/hotkey-element.d.ts +21 -0
- package/dist/dev/ui/hotkey/hotkey-element.d.ts.map +1 -0
- package/dist/dev/ui/hotkey/hotkey-element.js +81 -0
- package/dist/dev/ui/hotkey/hotkey-element.js.map +1 -0
- package/dist/dev/ui/media-button-element.d.ts +2 -0
- package/dist/dev/ui/media-button-element.d.ts.map +1 -1
- package/dist/dev/ui/media-button-element.js +9 -1
- package/dist/dev/ui/media-button-element.js.map +1 -1
- package/dist/dev/ui/mute-button/mute-button-element.d.ts +1 -0
- package/dist/dev/ui/mute-button/mute-button-element.d.ts.map +1 -1
- package/dist/dev/ui/mute-button/mute-button-element.js +1 -0
- package/dist/dev/ui/mute-button/mute-button-element.js.map +1 -1
- package/dist/dev/ui/pip-button/pip-button-element.d.ts +1 -0
- package/dist/dev/ui/pip-button/pip-button-element.d.ts.map +1 -1
- package/dist/dev/ui/pip-button/pip-button-element.js +1 -0
- package/dist/dev/ui/pip-button/pip-button-element.js.map +1 -1
- package/dist/dev/ui/play-button/play-button-element.d.ts +1 -0
- package/dist/dev/ui/play-button/play-button-element.d.ts.map +1 -1
- package/dist/dev/ui/play-button/play-button-element.js +1 -0
- package/dist/dev/ui/play-button/play-button-element.js.map +1 -1
- package/dist/dev/ui/popover/popover-element.d.ts.map +1 -1
- package/dist/dev/ui/popover/popover-element.js +7 -55
- package/dist/dev/ui/popover/popover-element.js.map +1 -1
- package/dist/dev/ui/position-controller.js +76 -0
- package/dist/dev/ui/position-controller.js.map +1 -0
- package/dist/dev/ui/slider/slider-element.js +1 -1
- package/dist/dev/ui/slider/slider-preview-element.d.ts +21 -0
- package/dist/dev/ui/slider/slider-preview-element.d.ts.map +1 -0
- package/dist/dev/ui/slider/slider-preview-element.js +1 -1
- package/dist/dev/ui/time-slider/time-slider-element.d.ts +2 -2
- package/dist/dev/ui/time-slider/time-slider-element.js +5 -5
- package/dist/dev/ui/time-slider/time-slider-element.js.map +1 -1
- package/dist/dev/ui/tooltip/tooltip-element.d.ts.map +1 -1
- package/dist/dev/ui/tooltip/tooltip-element.js +8 -54
- package/dist/dev/ui/tooltip/tooltip-element.js.map +1 -1
- package/dist/dev/ui/volume-slider/volume-slider-element.js +1 -1
- package/package.json +8 -8
- package/cdn/context-BjrbhiSk.js.map +0 -1
- package/cdn/context-CdkhXQEw.js +0 -14
- package/cdn/context-CdkhXQEw.js.map +0 -1
- package/cdn/create-player-Cz5Y4DmL.js.map +0 -1
- package/cdn/create-player-DSGjDLpM.js +0 -7
- package/cdn/create-player-DSGjDLpM.js.map +0 -1
- package/cdn/delegate-B626t_Va.js +0 -2
- package/cdn/delegate-B626t_Va.js.map +0 -1
- package/cdn/delegate-BCw-LjP_.js +0 -56
- package/cdn/delegate-BCw-LjP_.js.map +0 -1
- package/cdn/hls-A02jAc_G.js.map +0 -1
- package/cdn/hls-DwNUcXDb.js.map +0 -1
- package/cdn/media-props-mixin-CNJVvHAH.js.map +0 -1
- package/cdn/media-props-mixin-CmboksUe.js +0 -47
- package/cdn/media-props-mixin-CmboksUe.js.map +0 -1
- package/cdn/native-hls-Db2TurPW.js +0 -2
- package/cdn/player-DlGhe0FD.js +0 -2
- package/cdn/poster-BUuGv2Va.js +0 -215
- package/cdn/poster-BUuGv2Va.js.map +0 -1
- package/cdn/poster-Crn2YX3_.js +0 -2
- package/cdn/poster-Crn2YX3_.js.map +0 -1
- package/cdn/volume-slider-BSbnD5gg.js +0 -8
- package/cdn/volume-slider-BSbnD5gg.js.map +0 -1
- package/cdn/volume-slider-CxGbFVVX.js.map +0 -1
- /package/cdn/{minimal-ui-BL9eBXck.js → minimal-ui-DXFwjywa.js} +0 -0
- /package/cdn/{minimal-ui-a1UOKF79.js → minimal-ui-jrmrxIOn.js} +0 -0
- /package/cdn/{ui-CFIgmrlA.js → ui-18UYtw8D.js} +0 -0
- /package/cdn/{ui-Ccp_LyCf.js → ui-8HVY3XSt.js} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fullscreen-button-element.js","names":[],"sources":["../../../../src/ui/fullscreen-button/fullscreen-button-element.ts"],"sourcesContent":["import { FullscreenButtonCore, FullscreenButtonDataAttrs, type MediaFullscreenState } from '@videojs/core';\nimport { selectFullscreen } from '@videojs/core/dom';\n\nimport { playerContext } from '../../player/context';\nimport { PlayerController } from '../../player/player-controller';\nimport { MediaButtonElement } from '../media-button-element';\n\nexport class FullscreenButtonElement extends MediaButtonElement<FullscreenButtonCore> {\n static readonly tagName = 'media-fullscreen-button';\n\n protected readonly core = new FullscreenButtonCore();\n protected readonly stateAttrMap = FullscreenButtonDataAttrs;\n protected readonly mediaState = new PlayerController(this, playerContext, selectFullscreen);\n\n protected activate(state: MediaFullscreenState): void {\n this.core.toggle(state);\n }\n}\n"],"mappings":";;;;;;AAOA,IAAa,0BAAb,cAA6C,mBAAyC;;;cAG1D,IAAI,sBAAsB;sBAClB;oBACF,IAAI,iBAAiB,MAAM,eAAe,iBAAiB;;;
|
|
1
|
+
{"version":3,"file":"fullscreen-button-element.js","names":[],"sources":["../../../../src/ui/fullscreen-button/fullscreen-button-element.ts"],"sourcesContent":["import { FullscreenButtonCore, FullscreenButtonDataAttrs, type MediaFullscreenState } from '@videojs/core';\nimport { selectFullscreen } from '@videojs/core/dom';\n\nimport { playerContext } from '../../player/context';\nimport { PlayerController } from '../../player/player-controller';\nimport { MediaButtonElement } from '../media-button-element';\n\nexport class FullscreenButtonElement extends MediaButtonElement<FullscreenButtonCore> {\n static readonly tagName = 'media-fullscreen-button';\n\n protected readonly core = new FullscreenButtonCore();\n protected readonly stateAttrMap = FullscreenButtonDataAttrs;\n protected readonly mediaState = new PlayerController(this, playerContext, selectFullscreen);\n protected override readonly hotkeyAction = 'toggleFullscreen';\n\n protected activate(state: MediaFullscreenState): void {\n this.core.toggle(state);\n }\n}\n"],"mappings":";;;;;;AAOA,IAAa,0BAAb,cAA6C,mBAAyC;;;cAG1D,IAAI,sBAAsB;sBAClB;oBACF,IAAI,iBAAiB,MAAM,eAAe,iBAAiB;sBAChD;;;iBALjB;;CAO1B,SAAmB,OAAmC;AACpD,OAAK,KAAK,OAAO,MAAM"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { PlayerControllerHost } from "../../player/player-controller.js";
|
|
2
|
+
import { ReactiveController } from "@videojs/element";
|
|
3
|
+
|
|
4
|
+
//#region src/ui/hotkey/aria-key-shortcuts-controller.d.ts
|
|
5
|
+
/** Provides `aria-keyshortcuts` for a given hotkey action name. */
|
|
6
|
+
declare class AriaKeyShortcutsController implements ReactiveController {
|
|
7
|
+
#private;
|
|
8
|
+
constructor(host: PlayerControllerHost, action: string);
|
|
9
|
+
get value(): string | undefined;
|
|
10
|
+
hostConnected(): void;
|
|
11
|
+
hostDisconnected(): void;
|
|
12
|
+
}
|
|
13
|
+
//#endregion
|
|
14
|
+
export { AriaKeyShortcutsController };
|
|
15
|
+
//# sourceMappingURL=aria-key-shortcuts-controller.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"aria-key-shortcuts-controller.d.ts","names":[],"sources":["../../../../src/ui/hotkey/aria-key-shortcuts-controller.ts"],"mappings":";;;;;cASa,0BAAA,YAAsC,kBAAA;EAAA;cAIrC,IAAA,EAAM,oBAAA,EAAsB,MAAA;EAAA,IAMpC,KAAA,CAAA;EAMJ,aAAA,CAAA;EACA,gBAAA,CAAA;AAAA"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { containerContext } from "../../player/context.js";
|
|
2
|
+
import { findHotkeyCoordinator } from "@videojs/core/dom";
|
|
3
|
+
import { ContextConsumer } from "@videojs/element/context";
|
|
4
|
+
//#region src/ui/hotkey/aria-key-shortcuts-controller.ts
|
|
5
|
+
/** Provides `aria-keyshortcuts` for a given hotkey action name. */
|
|
6
|
+
var AriaKeyShortcutsController = class {
|
|
7
|
+
#action;
|
|
8
|
+
#container;
|
|
9
|
+
constructor(host, action) {
|
|
10
|
+
this.#action = action;
|
|
11
|
+
this.#container = new ContextConsumer(host, {
|
|
12
|
+
context: containerContext,
|
|
13
|
+
subscribe: true
|
|
14
|
+
});
|
|
15
|
+
host.addController(this);
|
|
16
|
+
}
|
|
17
|
+
get value() {
|
|
18
|
+
const container = this.#container.value?.container;
|
|
19
|
+
if (!container) return void 0;
|
|
20
|
+
return findHotkeyCoordinator(container)?.getAriaKeys(this.#action);
|
|
21
|
+
}
|
|
22
|
+
hostConnected() {}
|
|
23
|
+
hostDisconnected() {}
|
|
24
|
+
};
|
|
25
|
+
//#endregion
|
|
26
|
+
export { AriaKeyShortcutsController };
|
|
27
|
+
|
|
28
|
+
//# sourceMappingURL=aria-key-shortcuts-controller.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"aria-key-shortcuts-controller.js","names":["#action","#container"],"sources":["../../../../src/ui/hotkey/aria-key-shortcuts-controller.ts"],"sourcesContent":["import { findHotkeyCoordinator } from '@videojs/core/dom';\nimport type { ReactiveController } from '@videojs/element';\nimport { ContextConsumer } from '@videojs/element/context';\n\nimport type { ContainerContextConsumer } from '../../player/context';\nimport { containerContext } from '../../player/context';\nimport type { PlayerControllerHost } from '../../player/player-controller';\n\n/** Provides `aria-keyshortcuts` for a given hotkey action name. */\nexport class AriaKeyShortcutsController implements ReactiveController {\n #action: string;\n #container: ContainerContextConsumer;\n\n constructor(host: PlayerControllerHost, action: string) {\n this.#action = action;\n this.#container = new ContextConsumer(host, { context: containerContext, subscribe: true });\n host.addController(this);\n }\n\n get value(): string | undefined {\n const container = this.#container.value?.container;\n if (!container) return undefined;\n return findHotkeyCoordinator(container)?.getAriaKeys(this.#action);\n }\n\n hostConnected(): void {}\n hostDisconnected(): void {}\n}\n"],"mappings":";;;;;AASA,IAAa,6BAAb,MAAsE;CACpE;CACA;CAEA,YAAY,MAA4B,QAAgB;AACtD,QAAA,SAAe;AACf,QAAA,YAAkB,IAAI,gBAAgB,MAAM;GAAE,SAAS;GAAkB,WAAW;GAAM,CAAC;AAC3F,OAAK,cAAc,KAAK;;CAG1B,IAAI,QAA4B;EAC9B,MAAM,YAAY,MAAA,UAAgB,OAAO;AACzC,MAAI,CAAC,UAAW,QAAO,KAAA;AACvB,SAAO,sBAAsB,UAAU,EAAE,YAAY,MAAA,OAAa;;CAGpE,gBAAsB;CACtB,mBAAyB"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { MediaElement } from "../media-element.js";
|
|
2
|
+
import { HotkeyActionName } from "@videojs/core/dom";
|
|
3
|
+
import { PropertyDeclarationMap, PropertyValues } from "@videojs/element";
|
|
4
|
+
|
|
5
|
+
//#region src/ui/hotkey/hotkey-element.d.ts
|
|
6
|
+
declare class HotkeyElement extends MediaElement {
|
|
7
|
+
#private;
|
|
8
|
+
static readonly tagName = "media-hotkey";
|
|
9
|
+
static properties: PropertyDeclarationMap;
|
|
10
|
+
keys: string;
|
|
11
|
+
action: HotkeyActionName | (string & {});
|
|
12
|
+
value: number | undefined;
|
|
13
|
+
disabled: boolean;
|
|
14
|
+
target: 'player' | 'document';
|
|
15
|
+
connectedCallback(): void;
|
|
16
|
+
disconnectedCallback(): void;
|
|
17
|
+
protected update(changed: PropertyValues): void;
|
|
18
|
+
}
|
|
19
|
+
//#endregion
|
|
20
|
+
export { HotkeyElement };
|
|
21
|
+
//# sourceMappingURL=hotkey-element.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hotkey-element.d.ts","names":[],"sources":["../../../../src/ui/hotkey/hotkey-element.ts"],"mappings":";;;;;cAQa,aAAA,SAAsB,YAAA;EAAA;kBACjB,OAAA;EAAA,OAEA,UAAA,EAAY,sBAAA;EAQ5B,IAAA;EACA,MAAA,EAAQ,gBAAA;EACR,KAAA;EACA,QAAA;EACA,MAAA;EAUS,iBAAA,CAAA;EAMA,oBAAA,CAAA;EAAA,UAKU,MAAA,CAAO,OAAA,EAAS,cAAA;AAAA"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { containerContext, playerContext } from "../../player/context.js";
|
|
2
|
+
import { MediaElement } from "../media-element.js";
|
|
3
|
+
import { PlayerController } from "../../player/player-controller.js";
|
|
4
|
+
import { createHotkey, isHotkeyToggleAction, resolveHotkeyAction } from "@videojs/core/dom";
|
|
5
|
+
import { ContextConsumer } from "@videojs/element/context";
|
|
6
|
+
//#region src/ui/hotkey/hotkey-element.ts
|
|
7
|
+
var HotkeyElement = class extends MediaElement {
|
|
8
|
+
constructor(..._args) {
|
|
9
|
+
super(..._args);
|
|
10
|
+
this.keys = "";
|
|
11
|
+
this.action = "";
|
|
12
|
+
this.value = void 0;
|
|
13
|
+
this.disabled = false;
|
|
14
|
+
this.target = "player";
|
|
15
|
+
}
|
|
16
|
+
static {
|
|
17
|
+
this.tagName = "media-hotkey";
|
|
18
|
+
}
|
|
19
|
+
static {
|
|
20
|
+
this.properties = {
|
|
21
|
+
keys: { type: String },
|
|
22
|
+
action: { type: String },
|
|
23
|
+
value: { type: Number },
|
|
24
|
+
disabled: { type: Boolean },
|
|
25
|
+
target: { type: String }
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
#player = new PlayerController(this, playerContext);
|
|
29
|
+
#container = new ContextConsumer(this, {
|
|
30
|
+
context: containerContext,
|
|
31
|
+
callback: () => this.requestUpdate(),
|
|
32
|
+
subscribe: true
|
|
33
|
+
});
|
|
34
|
+
#cleanup = null;
|
|
35
|
+
connectedCallback() {
|
|
36
|
+
super.connectedCallback();
|
|
37
|
+
this.style.display = "none";
|
|
38
|
+
this.#register();
|
|
39
|
+
}
|
|
40
|
+
disconnectedCallback() {
|
|
41
|
+
super.disconnectedCallback();
|
|
42
|
+
this.#unregister();
|
|
43
|
+
}
|
|
44
|
+
update(changed) {
|
|
45
|
+
super.update(changed);
|
|
46
|
+
if (this.isConnected) {
|
|
47
|
+
this.#unregister();
|
|
48
|
+
this.#register();
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
#register() {
|
|
52
|
+
const store = this.#player.value;
|
|
53
|
+
const container = this.#container.value?.container;
|
|
54
|
+
if (!this.keys || !this.action || !store || !container) return;
|
|
55
|
+
const resolver = resolveHotkeyAction(this.action);
|
|
56
|
+
if (!resolver) return;
|
|
57
|
+
const { value, action } = this;
|
|
58
|
+
this.#cleanup = createHotkey(container, {
|
|
59
|
+
keys: this.keys,
|
|
60
|
+
action,
|
|
61
|
+
target: this.target,
|
|
62
|
+
disabled: this.disabled,
|
|
63
|
+
repeatable: !isHotkeyToggleAction(action),
|
|
64
|
+
onActivate: (_event, key) => {
|
|
65
|
+
resolver({
|
|
66
|
+
store,
|
|
67
|
+
key,
|
|
68
|
+
value
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
#unregister() {
|
|
74
|
+
this.#cleanup?.();
|
|
75
|
+
this.#cleanup = null;
|
|
76
|
+
}
|
|
77
|
+
};
|
|
78
|
+
//#endregion
|
|
79
|
+
export { HotkeyElement };
|
|
80
|
+
|
|
81
|
+
//# sourceMappingURL=hotkey-element.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hotkey-element.js","names":["#player","#container","#register","#unregister","#cleanup"],"sources":["../../../../src/ui/hotkey/hotkey-element.ts"],"sourcesContent":["import { createHotkey, type HotkeyActionName, isHotkeyToggleAction, resolveHotkeyAction } from '@videojs/core/dom';\nimport type { PropertyDeclarationMap, PropertyValues } from '@videojs/element';\nimport { ContextConsumer } from '@videojs/element/context';\n\nimport { containerContext, playerContext } from '../../player/context';\nimport { PlayerController } from '../../player/player-controller';\nimport { MediaElement } from '../media-element';\n\nexport class HotkeyElement extends MediaElement {\n static readonly tagName = 'media-hotkey';\n\n static override properties: PropertyDeclarationMap = {\n keys: { type: String },\n action: { type: String },\n value: { type: Number },\n disabled: { type: Boolean },\n target: { type: String },\n };\n\n keys = '';\n action: HotkeyActionName | (string & {}) = '';\n value: number | undefined = undefined;\n disabled = false;\n target: 'player' | 'document' = 'player';\n\n readonly #player = new PlayerController(this, playerContext);\n readonly #container = new ContextConsumer(this, {\n context: containerContext,\n callback: () => this.requestUpdate(),\n subscribe: true,\n });\n #cleanup: (() => void) | null = null;\n\n override connectedCallback(): void {\n super.connectedCallback();\n this.style.display = 'none';\n this.#register();\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n this.#unregister();\n }\n\n protected override update(changed: PropertyValues): void {\n super.update(changed);\n\n // Re-register when attributes change.\n if (this.isConnected) {\n this.#unregister();\n this.#register();\n }\n }\n\n #register(): void {\n const store = this.#player.value;\n const container = this.#container.value?.container;\n if (!this.keys || !this.action || !store || !container) return;\n\n const resolver = resolveHotkeyAction(this.action);\n if (!resolver) return;\n\n const { value, action } = this;\n\n this.#cleanup = createHotkey(container, {\n keys: this.keys,\n action,\n target: this.target,\n disabled: this.disabled,\n repeatable: !isHotkeyToggleAction(action),\n onActivate: (_event, key) => {\n resolver({ store, key, value });\n },\n });\n }\n\n #unregister(): void {\n this.#cleanup?.();\n this.#cleanup = null;\n }\n}\n"],"mappings":";;;;;;AAQA,IAAa,gBAAb,cAAmC,aAAa;;;cAWvC;gBACoC;eACf,KAAA;kBACjB;gBACqB;;;iBAdN;;;oBAE2B;GACnD,MAAM,EAAE,MAAM,QAAQ;GACtB,QAAQ,EAAE,MAAM,QAAQ;GACxB,OAAO,EAAE,MAAM,QAAQ;GACvB,UAAU,EAAE,MAAM,SAAS;GAC3B,QAAQ,EAAE,MAAM,QAAQ;GACzB;;CAQD,UAAmB,IAAI,iBAAiB,MAAM,cAAc;CAC5D,aAAsB,IAAI,gBAAgB,MAAM;EAC9C,SAAS;EACT,gBAAgB,KAAK,eAAe;EACpC,WAAW;EACZ,CAAC;CACF,WAAgC;CAEhC,oBAAmC;AACjC,QAAM,mBAAmB;AACzB,OAAK,MAAM,UAAU;AACrB,QAAA,UAAgB;;CAGlB,uBAAsC;AACpC,QAAM,sBAAsB;AAC5B,QAAA,YAAkB;;CAGpB,OAA0B,SAA+B;AACvD,QAAM,OAAO,QAAQ;AAGrB,MAAI,KAAK,aAAa;AACpB,SAAA,YAAkB;AAClB,SAAA,UAAgB;;;CAIpB,YAAkB;EAChB,MAAM,QAAQ,MAAA,OAAa;EAC3B,MAAM,YAAY,MAAA,UAAgB,OAAO;AACzC,MAAI,CAAC,KAAK,QAAQ,CAAC,KAAK,UAAU,CAAC,SAAS,CAAC,UAAW;EAExD,MAAM,WAAW,oBAAoB,KAAK,OAAO;AACjD,MAAI,CAAC,SAAU;EAEf,MAAM,EAAE,OAAO,WAAW;AAE1B,QAAA,UAAgB,aAAa,WAAW;GACtC,MAAM,KAAK;GACX;GACA,QAAQ,KAAK;GACb,UAAU,KAAK;GACf,YAAY,CAAC,qBAAqB,OAAO;GACzC,aAAa,QAAQ,QAAQ;AAC3B,aAAS;KAAE;KAAO;KAAK;KAAO,CAAC;;GAElC,CAAC;;CAGJ,cAAoB;AAClB,QAAA,WAAiB;AACjB,QAAA,UAAgB"}
|
|
@@ -15,6 +15,8 @@ declare abstract class MediaButtonElement<Core extends MediaButtonComponent> ext
|
|
|
15
15
|
protected abstract readonly stateAttrMap: StateAttrMap<InferComponentState<Core>>;
|
|
16
16
|
protected abstract readonly mediaState: PlayerController<any, InferMediaState<Core> | undefined>;
|
|
17
17
|
protected abstract activate(state: InferMediaState<Core>): void;
|
|
18
|
+
/** Override to set the hotkey action name for `aria-keyshortcuts`. */
|
|
19
|
+
protected readonly hotkeyAction: string | undefined;
|
|
18
20
|
get $state(): State<ButtonState>;
|
|
19
21
|
connectedCallback(): void;
|
|
20
22
|
disconnectedCallback(): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"media-button-element.d.ts","names":[],"sources":["../../../src/ui/media-button-element.ts"],"mappings":";;;;;;;;
|
|
1
|
+
{"version":3,"file":"media-button-element.d.ts","names":[],"sources":["../../../src/ui/media-button-element.ts"],"mappings":";;;;;;;;uBAgBsB,kBAAA,cAAgC,oBAAA,UAA8B,YAAA;EAAA;SAClE,UAAA,EAAY,sBAAA;EAK5B,QAAA;EACA,KAAA;EAAA,4BAE4B,IAAA,EAAM,IAAA;EAAA,4BACN,YAAA,EAAc,YAAA,CAAa,mBAAA,CAAoB,IAAA;EAAA,4BAC/C,UAAA,EAAY,gBAAA,MAAsB,eAAA,CAAgB,IAAA;EAAA,mBAE3D,QAAA,CAAS,KAAA,EAAO,eAAA,CAAgB,IAAA;EAHT;EAAA,mBAMvB,YAAA;EAAA,IAEf,MAAA,CAAA,GAAU,KAAA,CAAM,WAAA;EAOX,iBAAA,CAAA;EAsBA,oBAAA,CAAA;EAlC0B;EAyCnC,QAAA,CAAA;EAAA,UAImB,UAAA,CAAW,OAAA,EAAS,cAAA;EAAA,UAKpB,MAAA,CAAO,OAAA,EAAS,cAAA;AAAA"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { MediaElement } from "./media-element.js";
|
|
2
|
+
import { AriaKeyShortcutsController } from "./hotkey/aria-key-shortcuts-controller.js";
|
|
2
3
|
import { applyElementProps, applyStateDataAttrs, createButton, logMissingFeature } from "@videojs/core/dom";
|
|
3
4
|
//#region src/ui/media-button-element.ts
|
|
4
5
|
/** Abstract base for HTML custom elements that render a media-control button. */
|
|
@@ -7,6 +8,7 @@ var MediaButtonElement = class extends MediaElement {
|
|
|
7
8
|
super(..._args);
|
|
8
9
|
this.disabled = false;
|
|
9
10
|
this.label = "";
|
|
11
|
+
this.hotkeyAction = void 0;
|
|
10
12
|
}
|
|
11
13
|
static {
|
|
12
14
|
this.properties = {
|
|
@@ -18,8 +20,11 @@ var MediaButtonElement = class extends MediaElement {
|
|
|
18
20
|
return this.core.state;
|
|
19
21
|
}
|
|
20
22
|
#disconnect = null;
|
|
23
|
+
#hotkeyRegistry = null;
|
|
21
24
|
connectedCallback() {
|
|
22
25
|
super.connectedCallback();
|
|
26
|
+
if (this.destroyed) return;
|
|
27
|
+
if (this.hotkeyAction && !this.#hotkeyRegistry) this.#hotkeyRegistry = new AriaKeyShortcutsController(this, this.hotkeyAction);
|
|
23
28
|
this.#disconnect = new AbortController();
|
|
24
29
|
const buttonProps = createButton({
|
|
25
30
|
onActivate: () => this.activate(this.mediaState.value),
|
|
@@ -47,7 +52,10 @@ var MediaButtonElement = class extends MediaElement {
|
|
|
47
52
|
if (!media) return;
|
|
48
53
|
this.core.setMedia(media);
|
|
49
54
|
const state = this.core.getState();
|
|
50
|
-
applyElementProps(this,
|
|
55
|
+
applyElementProps(this, {
|
|
56
|
+
...this.core.getAttrs?.(state),
|
|
57
|
+
"aria-keyshortcuts": this.#hotkeyRegistry?.value
|
|
58
|
+
});
|
|
51
59
|
applyStateDataAttrs(this, state, this.stateAttrMap);
|
|
52
60
|
}
|
|
53
61
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"media-button-element.js","names":["#disconnect"],"sources":["../../../src/ui/media-button-element.ts"],"sourcesContent":["import type {\n ButtonState,\n InferComponentState,\n InferMediaState,\n MediaButtonComponent,\n StateAttrMap,\n} from '@videojs/core';\nimport { applyElementProps, applyStateDataAttrs, createButton, logMissingFeature } from '@videojs/core/dom';\nimport type { PropertyDeclarationMap, PropertyValues } from '@videojs/element';\nimport type { State } from '@videojs/store';\n\nimport type { PlayerController } from '../player/player-controller';\nimport { MediaElement } from './media-element';\n\n/** Abstract base for HTML custom elements that render a media-control button. */\nexport abstract class MediaButtonElement<Core extends MediaButtonComponent> extends MediaElement {\n static override properties: PropertyDeclarationMap = {\n label: { type: String },\n disabled: { type: Boolean },\n };\n\n disabled = false;\n label = '';\n\n protected abstract readonly core: Core;\n protected abstract readonly stateAttrMap: StateAttrMap<InferComponentState<Core>>;\n protected abstract readonly mediaState: PlayerController<any, InferMediaState<Core> | undefined>;\n\n protected abstract activate(state: InferMediaState<Core>): void;\n\n get $state(): State<ButtonState> {\n return this.core.state;\n }\n\n #disconnect: AbortController | null = null;\n\n override connectedCallback(): void {\n super.connectedCallback();\n\n this.#disconnect = new AbortController();\n\n const buttonProps = createButton({\n onActivate: () => this.activate(this.mediaState.value!),\n isDisabled: () => this.disabled || !this.mediaState.value,\n });\n\n applyElementProps(this, buttonProps, { signal: this.#disconnect.signal });\n\n if (__DEV__ && !this.mediaState.value && this.mediaState.displayName) {\n logMissingFeature(this.localName, this.mediaState.displayName);\n }\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n this.#disconnect?.abort();\n this.#disconnect = null;\n }\n\n /** Returns the button's current label derived from media state. */\n getLabel(): string | undefined {\n return this.core.state.current.label || undefined;\n }\n\n protected override willUpdate(changed: PropertyValues): void {\n super.willUpdate(changed);\n this.core.setProps?.(this);\n }\n\n protected override update(changed: PropertyValues): void {\n super.update(changed);\n\n const media = this.mediaState.value;\n\n if (!media) return;\n\n this.core.setMedia(media);\n const state = this.core.getState();\n applyElementProps(this, this.core.getAttrs?.(state)
|
|
1
|
+
{"version":3,"file":"media-button-element.js","names":["#hotkeyRegistry","#disconnect"],"sources":["../../../src/ui/media-button-element.ts"],"sourcesContent":["import type {\n ButtonState,\n InferComponentState,\n InferMediaState,\n MediaButtonComponent,\n StateAttrMap,\n} from '@videojs/core';\nimport { applyElementProps, applyStateDataAttrs, createButton, logMissingFeature } from '@videojs/core/dom';\nimport type { PropertyDeclarationMap, PropertyValues } from '@videojs/element';\nimport type { State } from '@videojs/store';\n\nimport type { PlayerController } from '../player/player-controller';\nimport { AriaKeyShortcutsController } from './hotkey/aria-key-shortcuts-controller';\nimport { MediaElement } from './media-element';\n\n/** Abstract base for HTML custom elements that render a media-control button. */\nexport abstract class MediaButtonElement<Core extends MediaButtonComponent> extends MediaElement {\n static override properties: PropertyDeclarationMap = {\n label: { type: String },\n disabled: { type: Boolean },\n };\n\n disabled = false;\n label = '';\n\n protected abstract readonly core: Core;\n protected abstract readonly stateAttrMap: StateAttrMap<InferComponentState<Core>>;\n protected abstract readonly mediaState: PlayerController<any, InferMediaState<Core> | undefined>;\n\n protected abstract activate(state: InferMediaState<Core>): void;\n\n /** Override to set the hotkey action name for `aria-keyshortcuts`. */\n protected readonly hotkeyAction: string | undefined = undefined;\n\n get $state(): State<ButtonState> {\n return this.core.state;\n }\n\n #disconnect: AbortController | null = null;\n #hotkeyRegistry: AriaKeyShortcutsController | null = null;\n\n override connectedCallback(): void {\n super.connectedCallback();\n if (this.destroyed) return;\n\n if (this.hotkeyAction && !this.#hotkeyRegistry) {\n this.#hotkeyRegistry = new AriaKeyShortcutsController(this, this.hotkeyAction);\n }\n\n this.#disconnect = new AbortController();\n\n const buttonProps = createButton({\n onActivate: () => this.activate(this.mediaState.value!),\n isDisabled: () => this.disabled || !this.mediaState.value,\n });\n\n applyElementProps(this, buttonProps, { signal: this.#disconnect.signal });\n\n if (__DEV__ && !this.mediaState.value && this.mediaState.displayName) {\n logMissingFeature(this.localName, this.mediaState.displayName);\n }\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n this.#disconnect?.abort();\n this.#disconnect = null;\n }\n\n /** Returns the button's current label derived from media state. */\n getLabel(): string | undefined {\n return this.core.state.current.label || undefined;\n }\n\n protected override willUpdate(changed: PropertyValues): void {\n super.willUpdate(changed);\n this.core.setProps?.(this);\n }\n\n protected override update(changed: PropertyValues): void {\n super.update(changed);\n\n const media = this.mediaState.value;\n\n if (!media) return;\n\n this.core.setMedia(media);\n const state = this.core.getState();\n applyElementProps(this, {\n ...this.core.getAttrs?.(state),\n 'aria-keyshortcuts': this.#hotkeyRegistry?.value,\n });\n applyStateDataAttrs(this, state, this.stateAttrMap);\n }\n}\n"],"mappings":";;;;;AAgBA,IAAsB,qBAAtB,cAAoF,aAAa;;;kBAMpF;eACH;sBAS8C,KAAA;;;oBAfD;GACnD,OAAO,EAAE,MAAM,QAAQ;GACvB,UAAU,EAAE,MAAM,SAAS;GAC5B;;CAcD,IAAI,SAA6B;AAC/B,SAAO,KAAK,KAAK;;CAGnB,cAAsC;CACtC,kBAAqD;CAErD,oBAAmC;AACjC,QAAM,mBAAmB;AACzB,MAAI,KAAK,UAAW;AAEpB,MAAI,KAAK,gBAAgB,CAAC,MAAA,eACxB,OAAA,iBAAuB,IAAI,2BAA2B,MAAM,KAAK,aAAa;AAGhF,QAAA,aAAmB,IAAI,iBAAiB;EAExC,MAAM,cAAc,aAAa;GAC/B,kBAAkB,KAAK,SAAS,KAAK,WAAW,MAAO;GACvD,kBAAkB,KAAK,YAAY,CAAC,KAAK,WAAW;GACrD,CAAC;AAEF,oBAAkB,MAAM,aAAa,EAAE,QAAQ,MAAA,WAAiB,QAAQ,CAAC;AAEzE,MAAe,CAAC,KAAK,WAAW,SAAS,KAAK,WAAW,YACvD,mBAAkB,KAAK,WAAW,KAAK,WAAW,YAAY;;CAIlE,uBAAsC;AACpC,QAAM,sBAAsB;AAC5B,QAAA,YAAkB,OAAO;AACzB,QAAA,aAAmB;;;CAIrB,WAA+B;AAC7B,SAAO,KAAK,KAAK,MAAM,QAAQ,SAAS,KAAA;;CAG1C,WAA8B,SAA+B;AAC3D,QAAM,WAAW,QAAQ;AACzB,OAAK,KAAK,WAAW,KAAK;;CAG5B,OAA0B,SAA+B;AACvD,QAAM,OAAO,QAAQ;EAErB,MAAM,QAAQ,KAAK,WAAW;AAE9B,MAAI,CAAC,MAAO;AAEZ,OAAK,KAAK,SAAS,MAAM;EACzB,MAAM,QAAQ,KAAK,KAAK,UAAU;AAClC,oBAAkB,MAAM;GACtB,GAAG,KAAK,KAAK,WAAW,MAAM;GAC9B,qBAAqB,MAAA,gBAAsB;GAC5C,CAAC;AACF,sBAAoB,MAAM,OAAO,KAAK,aAAa"}
|
|
@@ -12,6 +12,7 @@ declare class MuteButtonElement extends MediaButtonElement<MuteButtonCore> {
|
|
|
12
12
|
readonly volumeLevel: "data-volume-level";
|
|
13
13
|
};
|
|
14
14
|
protected readonly mediaState: PlayerController<_videojs_core_dom0.AnyPlayerStore, MediaVolumeState | undefined>;
|
|
15
|
+
protected readonly hotkeyAction = "toggleMuted";
|
|
15
16
|
protected activate(state: MediaVolumeState): void;
|
|
16
17
|
}
|
|
17
18
|
//#endregion
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mute-button-element.d.ts","names":[],"sources":["../../../../src/ui/mute-button/mute-button-element.ts"],"mappings":";;;;;;cAOa,iBAAA,SAA0B,kBAAA,CAAmB,cAAA;EAAA,gBACxC,OAAA;EAAA,mBAEG,IAAA,EAAI,cAAA;EAAA,mBACJ,YAAA;IAAA;;;qBACA,UAAA,EAAU,gBAAA,CAFN,kBAAA,CAEM,cAAA,EAAA,gBAAA;EAAA,
|
|
1
|
+
{"version":3,"file":"mute-button-element.d.ts","names":[],"sources":["../../../../src/ui/mute-button/mute-button-element.ts"],"mappings":";;;;;;cAOa,iBAAA,SAA0B,kBAAA,CAAmB,cAAA;EAAA,gBACxC,OAAA;EAAA,mBAEG,IAAA,EAAI,cAAA;EAAA,mBACJ,YAAA;IAAA;;;qBACA,UAAA,EAAU,gBAAA,CAFN,kBAAA,CAEM,cAAA,EAAA,gBAAA;EAAA,mBACD,YAAA;EAAA,UAElB,QAAA,CAAS,KAAA,EAAO,gBAAA;AAAA"}
|
|
@@ -10,6 +10,7 @@ var MuteButtonElement = class extends MediaButtonElement {
|
|
|
10
10
|
this.core = new MuteButtonCore();
|
|
11
11
|
this.stateAttrMap = MuteButtonDataAttrs;
|
|
12
12
|
this.mediaState = new PlayerController(this, playerContext, selectVolume);
|
|
13
|
+
this.hotkeyAction = "toggleMuted";
|
|
13
14
|
}
|
|
14
15
|
static {
|
|
15
16
|
this.tagName = "media-mute-button";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mute-button-element.js","names":[],"sources":["../../../../src/ui/mute-button/mute-button-element.ts"],"sourcesContent":["import { type MediaVolumeState, MuteButtonCore, MuteButtonDataAttrs } from '@videojs/core';\nimport { selectVolume } from '@videojs/core/dom';\n\nimport { playerContext } from '../../player/context';\nimport { PlayerController } from '../../player/player-controller';\nimport { MediaButtonElement } from '../media-button-element';\n\nexport class MuteButtonElement extends MediaButtonElement<MuteButtonCore> {\n static readonly tagName = 'media-mute-button';\n\n protected readonly core = new MuteButtonCore();\n protected readonly stateAttrMap = MuteButtonDataAttrs;\n protected readonly mediaState = new PlayerController(this, playerContext, selectVolume);\n\n protected activate(state: MediaVolumeState): void {\n this.core.toggle(state);\n }\n}\n"],"mappings":";;;;;;AAOA,IAAa,oBAAb,cAAuC,mBAAmC;;;cAG9C,IAAI,gBAAgB;sBACZ;oBACF,IAAI,iBAAiB,MAAM,eAAe,aAAa;;;
|
|
1
|
+
{"version":3,"file":"mute-button-element.js","names":[],"sources":["../../../../src/ui/mute-button/mute-button-element.ts"],"sourcesContent":["import { type MediaVolumeState, MuteButtonCore, MuteButtonDataAttrs } from '@videojs/core';\nimport { selectVolume } from '@videojs/core/dom';\n\nimport { playerContext } from '../../player/context';\nimport { PlayerController } from '../../player/player-controller';\nimport { MediaButtonElement } from '../media-button-element';\n\nexport class MuteButtonElement extends MediaButtonElement<MuteButtonCore> {\n static readonly tagName = 'media-mute-button';\n\n protected readonly core = new MuteButtonCore();\n protected readonly stateAttrMap = MuteButtonDataAttrs;\n protected readonly mediaState = new PlayerController(this, playerContext, selectVolume);\n protected override readonly hotkeyAction = 'toggleMuted';\n\n protected activate(state: MediaVolumeState): void {\n this.core.toggle(state);\n }\n}\n"],"mappings":";;;;;;AAOA,IAAa,oBAAb,cAAuC,mBAAmC;;;cAG9C,IAAI,gBAAgB;sBACZ;oBACF,IAAI,iBAAiB,MAAM,eAAe,aAAa;sBAC5C;;;iBALjB;;CAO1B,SAAmB,OAA+B;AAChD,OAAK,KAAK,OAAO,MAAM"}
|
|
@@ -12,6 +12,7 @@ declare class PiPButtonElement extends MediaButtonElement<PiPButtonCore> {
|
|
|
12
12
|
readonly availability: "data-availability";
|
|
13
13
|
};
|
|
14
14
|
protected readonly mediaState: PlayerController<_videojs_core_dom0.AnyPlayerStore, MediaPictureInPictureState | undefined>;
|
|
15
|
+
protected readonly hotkeyAction = "togglePiP";
|
|
15
16
|
protected activate(state: MediaPictureInPictureState): void;
|
|
16
17
|
}
|
|
17
18
|
//#endregion
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pip-button-element.d.ts","names":[],"sources":["../../../../src/ui/pip-button/pip-button-element.ts"],"mappings":";;;;;;cAOa,gBAAA,SAAyB,kBAAA,CAAmB,aAAA;EAAA,gBACvC,OAAA;EAAA,mBAEG,IAAA,EAAI,aAAA;EAAA,mBACJ,YAAA;IAAA;;;qBACA,UAAA,EAAU,gBAAA,CAFN,kBAAA,CAEM,cAAA,EAAA,0BAAA;EAAA,
|
|
1
|
+
{"version":3,"file":"pip-button-element.d.ts","names":[],"sources":["../../../../src/ui/pip-button/pip-button-element.ts"],"mappings":";;;;;;cAOa,gBAAA,SAAyB,kBAAA,CAAmB,aAAA;EAAA,gBACvC,OAAA;EAAA,mBAEG,IAAA,EAAI,aAAA;EAAA,mBACJ,YAAA;IAAA;;;qBACA,UAAA,EAAU,gBAAA,CAFN,kBAAA,CAEM,cAAA,EAAA,0BAAA;EAAA,mBACD,YAAA;EAAA,UAElB,QAAA,CAAS,KAAA,EAAO,0BAAA;AAAA"}
|
|
@@ -10,6 +10,7 @@ var PiPButtonElement = class extends MediaButtonElement {
|
|
|
10
10
|
this.core = new PiPButtonCore();
|
|
11
11
|
this.stateAttrMap = PiPButtonDataAttrs;
|
|
12
12
|
this.mediaState = new PlayerController(this, playerContext, selectPiP);
|
|
13
|
+
this.hotkeyAction = "togglePiP";
|
|
13
14
|
}
|
|
14
15
|
static {
|
|
15
16
|
this.tagName = "media-pip-button";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pip-button-element.js","names":[],"sources":["../../../../src/ui/pip-button/pip-button-element.ts"],"sourcesContent":["import { type MediaPictureInPictureState, PiPButtonCore, PiPButtonDataAttrs } from '@videojs/core';\nimport { selectPiP } from '@videojs/core/dom';\n\nimport { playerContext } from '../../player/context';\nimport { PlayerController } from '../../player/player-controller';\nimport { MediaButtonElement } from '../media-button-element';\n\nexport class PiPButtonElement extends MediaButtonElement<PiPButtonCore> {\n static readonly tagName = 'media-pip-button';\n\n protected readonly core = new PiPButtonCore();\n protected readonly stateAttrMap = PiPButtonDataAttrs;\n protected readonly mediaState = new PlayerController(this, playerContext, selectPiP);\n\n protected activate(state: MediaPictureInPictureState): void {\n this.core.toggle(state);\n }\n}\n"],"mappings":";;;;;;AAOA,IAAa,mBAAb,cAAsC,mBAAkC;;;cAG5C,IAAI,eAAe;sBACX;oBACF,IAAI,iBAAiB,MAAM,eAAe,UAAU;;;
|
|
1
|
+
{"version":3,"file":"pip-button-element.js","names":[],"sources":["../../../../src/ui/pip-button/pip-button-element.ts"],"sourcesContent":["import { type MediaPictureInPictureState, PiPButtonCore, PiPButtonDataAttrs } from '@videojs/core';\nimport { selectPiP } from '@videojs/core/dom';\n\nimport { playerContext } from '../../player/context';\nimport { PlayerController } from '../../player/player-controller';\nimport { MediaButtonElement } from '../media-button-element';\n\nexport class PiPButtonElement extends MediaButtonElement<PiPButtonCore> {\n static readonly tagName = 'media-pip-button';\n\n protected readonly core = new PiPButtonCore();\n protected readonly stateAttrMap = PiPButtonDataAttrs;\n protected readonly mediaState = new PlayerController(this, playerContext, selectPiP);\n protected override readonly hotkeyAction = 'togglePiP';\n\n protected activate(state: MediaPictureInPictureState): void {\n this.core.toggle(state);\n }\n}\n"],"mappings":";;;;;;AAOA,IAAa,mBAAb,cAAsC,mBAAkC;;;cAG5C,IAAI,eAAe;sBACX;oBACF,IAAI,iBAAiB,MAAM,eAAe,UAAU;sBACzC;;;iBALjB;;CAO1B,SAAmB,OAAyC;AAC1D,OAAK,KAAK,OAAO,MAAM"}
|
|
@@ -13,6 +13,7 @@ declare class PlayButtonElement extends MediaButtonElement<PlayButtonCore> {
|
|
|
13
13
|
readonly started: "data-started";
|
|
14
14
|
};
|
|
15
15
|
protected readonly mediaState: PlayerController<_videojs_core_dom0.AnyPlayerStore, MediaPlaybackState | undefined>;
|
|
16
|
+
protected readonly hotkeyAction = "togglePaused";
|
|
16
17
|
protected activate(state: MediaPlaybackState): void;
|
|
17
18
|
}
|
|
18
19
|
//#endregion
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"play-button-element.d.ts","names":[],"sources":["../../../../src/ui/play-button/play-button-element.ts"],"mappings":";;;;;;cAOa,iBAAA,SAA0B,kBAAA,CAAmB,cAAA;EAAA,gBACxC,OAAA;EAAA,mBAEG,IAAA,EAAI,cAAA;EAAA,mBACJ,YAAA;IAAA;;;;qBACA,UAAA,EAAU,gBAAA,CAFN,kBAAA,CAEM,cAAA,EAAA,kBAAA;EAAA,
|
|
1
|
+
{"version":3,"file":"play-button-element.d.ts","names":[],"sources":["../../../../src/ui/play-button/play-button-element.ts"],"mappings":";;;;;;cAOa,iBAAA,SAA0B,kBAAA,CAAmB,cAAA;EAAA,gBACxC,OAAA;EAAA,mBAEG,IAAA,EAAI,cAAA;EAAA,mBACJ,YAAA;IAAA;;;;qBACA,UAAA,EAAU,gBAAA,CAFN,kBAAA,CAEM,cAAA,EAAA,kBAAA;EAAA,mBACD,YAAA;EAAA,UAElB,QAAA,CAAS,KAAA,EAAO,kBAAA;AAAA"}
|
|
@@ -10,6 +10,7 @@ var PlayButtonElement = class extends MediaButtonElement {
|
|
|
10
10
|
this.core = new PlayButtonCore();
|
|
11
11
|
this.stateAttrMap = PlayButtonDataAttrs;
|
|
12
12
|
this.mediaState = new PlayerController(this, playerContext, selectPlayback);
|
|
13
|
+
this.hotkeyAction = "togglePaused";
|
|
13
14
|
}
|
|
14
15
|
static {
|
|
15
16
|
this.tagName = "media-play-button";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"play-button-element.js","names":[],"sources":["../../../../src/ui/play-button/play-button-element.ts"],"sourcesContent":["import { type MediaPlaybackState, PlayButtonCore, PlayButtonDataAttrs } from '@videojs/core';\nimport { selectPlayback } from '@videojs/core/dom';\n\nimport { playerContext } from '../../player/context';\nimport { PlayerController } from '../../player/player-controller';\nimport { MediaButtonElement } from '../media-button-element';\n\nexport class PlayButtonElement extends MediaButtonElement<PlayButtonCore> {\n static readonly tagName = 'media-play-button';\n\n protected readonly core = new PlayButtonCore();\n protected readonly stateAttrMap = PlayButtonDataAttrs;\n protected readonly mediaState = new PlayerController(this, playerContext, selectPlayback);\n\n protected activate(state: MediaPlaybackState): void {\n this.core.toggle(state);\n }\n}\n"],"mappings":";;;;;;AAOA,IAAa,oBAAb,cAAuC,mBAAmC;;;cAG9C,IAAI,gBAAgB;sBACZ;oBACF,IAAI,iBAAiB,MAAM,eAAe,eAAe;;;
|
|
1
|
+
{"version":3,"file":"play-button-element.js","names":[],"sources":["../../../../src/ui/play-button/play-button-element.ts"],"sourcesContent":["import { type MediaPlaybackState, PlayButtonCore, PlayButtonDataAttrs } from '@videojs/core';\nimport { selectPlayback } from '@videojs/core/dom';\n\nimport { playerContext } from '../../player/context';\nimport { PlayerController } from '../../player/player-controller';\nimport { MediaButtonElement } from '../media-button-element';\n\nexport class PlayButtonElement extends MediaButtonElement<PlayButtonCore> {\n static readonly tagName = 'media-play-button';\n\n protected readonly core = new PlayButtonCore();\n protected readonly stateAttrMap = PlayButtonDataAttrs;\n protected readonly mediaState = new PlayerController(this, playerContext, selectPlayback);\n protected override readonly hotkeyAction = 'togglePaused';\n\n protected activate(state: MediaPlaybackState): void {\n this.core.toggle(state);\n }\n}\n"],"mappings":";;;;;;AAOA,IAAa,oBAAb,cAAuC,mBAAmC;;;cAG9C,IAAI,gBAAgB;sBACZ;oBACF,IAAI,iBAAiB,MAAM,eAAe,eAAe;sBAC9C;;;iBALjB;;CAO1B,SAAmB,OAAiC;AAClD,OAAK,KAAK,OAAO,MAAM"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"popover-element.d.ts","names":[],"sources":["../../../../src/ui/popover/popover-element.ts"],"mappings":";;;;;;
|
|
1
|
+
{"version":3,"file":"popover-element.d.ts","names":[],"sources":["../../../../src/ui/popover/popover-element.ts"],"mappings":";;;;;;cAoBa,cAAA,SAAuB,YAAA;EAAA;kBAClB,OAAA;EAAA,OAEA,UAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAahB,IAAA;EACA,WAAA;EACA,IAAA,iBAAI,WAAA;EACJ,KAAA,EADI,cAAA,CACC,YAAA;EACL,KAAA,EAAO,YAAA;EACP,aAAA;EACA,mBAAA;EACA,WAAA;EACA,KAAA;EACA,UAAA;EAYS,iBAAA,CAAA;EAAA,UAmCU,YAAA,CAAa,OAAA,EAAS,cAAA;EAUhC,oBAAA,CAAA;EAMA,eAAA,CAAA;EAAA,UAMU,UAAA,CAAW,OAAA,EAAS,cAAA;EAAA,UAiBpB,MAAA,CAAO,QAAA,EAAU,cAAA;AAAA"}
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { MediaElement } from "../media-element.js";
|
|
2
|
+
import { PositionController } from "../position-controller.js";
|
|
2
3
|
import { PopoverCore, PopoverDataAttrs } from "@videojs/core";
|
|
3
4
|
import { applyElementProps, applyStateDataAttrs, createPopover, createTransition, getAnchorNameStyle, getAnchorPositionStyle, getPopupPositionRect, resolveOffsets } from "@videojs/core/dom";
|
|
4
|
-
import { SnapshotController } from "@videojs/store/html";
|
|
5
5
|
import { applyStyles, supportsAnchorPositioning, tryHidePopover, tryShowPopover } from "@videojs/utils/dom";
|
|
6
|
+
import { SnapshotController } from "@videojs/store/html";
|
|
6
7
|
//#region src/ui/popover/popover-element.ts
|
|
7
8
|
var PopoverElement = class extends MediaElement {
|
|
8
9
|
constructor(..._args) {
|
|
@@ -51,15 +52,12 @@ var PopoverElement = class extends MediaElement {
|
|
|
51
52
|
};
|
|
52
53
|
}
|
|
53
54
|
#core = new PopoverCore();
|
|
55
|
+
#position = new PositionController(this);
|
|
54
56
|
#popover = null;
|
|
55
57
|
#snapshot = null;
|
|
56
58
|
#disconnect = null;
|
|
57
59
|
#triggerAbort = null;
|
|
58
60
|
#currentTrigger = null;
|
|
59
|
-
#positionAbort = null;
|
|
60
|
-
#positionFrame = 0;
|
|
61
|
-
#resizeObserver = null;
|
|
62
|
-
#positionTrigger = null;
|
|
63
61
|
connectedCallback() {
|
|
64
62
|
super.connectedCallback();
|
|
65
63
|
if (this.destroyed) return;
|
|
@@ -90,12 +88,10 @@ var PopoverElement = class extends MediaElement {
|
|
|
90
88
|
}
|
|
91
89
|
disconnectedCallback() {
|
|
92
90
|
super.disconnectedCallback();
|
|
93
|
-
this.#cleanupPositioning();
|
|
94
91
|
this.#disconnect?.abort();
|
|
95
92
|
this.#disconnect = null;
|
|
96
93
|
}
|
|
97
94
|
destroyCallback() {
|
|
98
|
-
this.#cleanupPositioning();
|
|
99
95
|
this.#cleanupTrigger();
|
|
100
96
|
this.#popover?.destroy();
|
|
101
97
|
super.destroyCallback();
|
|
@@ -112,7 +108,7 @@ var PopoverElement = class extends MediaElement {
|
|
|
112
108
|
update(_changed) {
|
|
113
109
|
super.update(_changed);
|
|
114
110
|
if (!this.#popover) return;
|
|
115
|
-
const triggerEl = this.#findTrigger();
|
|
111
|
+
const triggerEl = this.#position.findTrigger();
|
|
116
112
|
this.#syncTrigger(triggerEl);
|
|
117
113
|
const input = this.#popover.input.current;
|
|
118
114
|
this.#core.setInput(input);
|
|
@@ -126,7 +122,7 @@ var PopoverElement = class extends MediaElement {
|
|
|
126
122
|
applyStyles(this.#currentTrigger, getAnchorNameStyle(this.id));
|
|
127
123
|
}
|
|
128
124
|
if (!state.open) {
|
|
129
|
-
this.#
|
|
125
|
+
this.#position.cleanup();
|
|
130
126
|
return;
|
|
131
127
|
}
|
|
132
128
|
const posOpts = {
|
|
@@ -141,15 +137,11 @@ var PopoverElement = class extends MediaElement {
|
|
|
141
137
|
const offsets = resolveOffsets(this);
|
|
142
138
|
applyStyles(this, getAnchorPositionStyle(this.id, posOpts, triggerRect, selfRect, boundaryRect, offsets));
|
|
143
139
|
}
|
|
144
|
-
this.#
|
|
145
|
-
}
|
|
146
|
-
#findTrigger() {
|
|
147
|
-
if (!this.id) return null;
|
|
148
|
-
return this.getRootNode().querySelector(`[commandfor="${this.id}"]`);
|
|
140
|
+
this.#position.sync(this.#currentTrigger);
|
|
149
141
|
}
|
|
150
142
|
#syncTrigger(triggerEl) {
|
|
151
143
|
if (triggerEl === this.#currentTrigger) return;
|
|
152
|
-
this.#
|
|
144
|
+
this.#position.cleanup();
|
|
153
145
|
this.#cleanupTrigger();
|
|
154
146
|
this.#currentTrigger = triggerEl;
|
|
155
147
|
this.#popover?.setTriggerElement(triggerEl);
|
|
@@ -171,46 +163,6 @@ var PopoverElement = class extends MediaElement {
|
|
|
171
163
|
this.#triggerAbort = null;
|
|
172
164
|
this.#currentTrigger = null;
|
|
173
165
|
}
|
|
174
|
-
#syncPositioning() {
|
|
175
|
-
if (supportsAnchorPositioning()) return;
|
|
176
|
-
const triggerEl = this.#currentTrigger;
|
|
177
|
-
if (!triggerEl) return;
|
|
178
|
-
if (this.#positionAbort && this.#positionTrigger === triggerEl) return;
|
|
179
|
-
this.#cleanupPositioning();
|
|
180
|
-
this.#positionAbort = new AbortController();
|
|
181
|
-
this.#positionTrigger = triggerEl;
|
|
182
|
-
const { signal } = this.#positionAbort;
|
|
183
|
-
const reposition = () => {
|
|
184
|
-
cancelAnimationFrame(this.#positionFrame);
|
|
185
|
-
this.#positionFrame = requestAnimationFrame(() => {
|
|
186
|
-
if (signal.aborted) return;
|
|
187
|
-
this.requestUpdate();
|
|
188
|
-
});
|
|
189
|
-
};
|
|
190
|
-
window.addEventListener("scroll", reposition, {
|
|
191
|
-
capture: true,
|
|
192
|
-
passive: true,
|
|
193
|
-
signal
|
|
194
|
-
});
|
|
195
|
-
window.addEventListener("resize", reposition, { signal });
|
|
196
|
-
if (typeof ResizeObserver === "function") {
|
|
197
|
-
this.#resizeObserver = new ResizeObserver(() => {
|
|
198
|
-
reposition();
|
|
199
|
-
});
|
|
200
|
-
this.#resizeObserver.observe(triggerEl);
|
|
201
|
-
this.#resizeObserver.observe(this);
|
|
202
|
-
}
|
|
203
|
-
reposition();
|
|
204
|
-
}
|
|
205
|
-
#cleanupPositioning() {
|
|
206
|
-
this.#positionAbort?.abort();
|
|
207
|
-
this.#positionAbort = null;
|
|
208
|
-
this.#positionTrigger = null;
|
|
209
|
-
cancelAnimationFrame(this.#positionFrame);
|
|
210
|
-
this.#positionFrame = 0;
|
|
211
|
-
this.#resizeObserver?.disconnect();
|
|
212
|
-
this.#resizeObserver = null;
|
|
213
|
-
}
|
|
214
166
|
};
|
|
215
167
|
//#endregion
|
|
216
168
|
export { PopoverElement };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"popover-element.js","names":["#core","#disconnect","#popover","#snapshot","#cleanupPositioning","#cleanupTrigger","#findTrigger","#syncTrigger","#currentTrigger","#syncPositioning","#triggerAbort","#positionAbort","#positionTrigger","#positionFrame","#resizeObserver"],"sources":["../../../../src/ui/popover/popover-element.ts"],"sourcesContent":["import { PopoverCore, PopoverDataAttrs, type PopoverInput, type PopoverProps } from '@videojs/core';\nimport {\n applyElementProps,\n applyStateDataAttrs,\n createPopover,\n createTransition,\n getAnchorNameStyle,\n getAnchorPositionStyle,\n getPopupPositionRect,\n type PopoverApi,\n type PopoverChangeDetails,\n resolveOffsets,\n} from '@videojs/core/dom';\nimport type { PropertyDeclarationMap, PropertyValues } from '@videojs/element';\nimport { SnapshotController } from '@videojs/store/html';\nimport { applyStyles, supportsAnchorPositioning, tryHidePopover, tryShowPopover } from '@videojs/utils/dom';\n\nimport { MediaElement } from '../media-element';\n\nexport class PopoverElement extends MediaElement {\n static readonly tagName = 'media-popover';\n\n static override properties = {\n open: { type: Boolean },\n defaultOpen: { type: Boolean, attribute: 'default-open' },\n side: { type: String },\n align: { type: String },\n modal: { type: Boolean },\n closeOnEscape: { type: Boolean, attribute: 'close-on-escape' },\n closeOnOutsideClick: { type: Boolean, attribute: 'close-on-outside-click' },\n openOnHover: { type: Boolean, attribute: 'open-on-hover' },\n delay: { type: Number },\n closeDelay: { type: Number, attribute: 'close-delay' },\n } satisfies PropertyDeclarationMap<keyof PopoverCore.Props>;\n\n open = PopoverCore.defaultProps.open;\n defaultOpen = PopoverCore.defaultProps.defaultOpen;\n side = PopoverCore.defaultProps.side;\n align = PopoverCore.defaultProps.align;\n modal: PopoverProps['modal'] = PopoverCore.defaultProps.modal;\n closeOnEscape = PopoverCore.defaultProps.closeOnEscape;\n closeOnOutsideClick = PopoverCore.defaultProps.closeOnOutsideClick;\n openOnHover = PopoverCore.defaultProps.openOnHover;\n delay = PopoverCore.defaultProps.delay;\n closeDelay = PopoverCore.defaultProps.closeDelay;\n\n readonly #core = new PopoverCore();\n #popover: PopoverApi | null = null;\n #snapshot: SnapshotController<PopoverInput> | null = null;\n\n // Cleanup controllers\n #disconnect: AbortController | null = null;\n #triggerAbort: AbortController | null = null;\n #currentTrigger: HTMLElement | null = null;\n #positionAbort: AbortController | null = null;\n #positionFrame = 0;\n #resizeObserver: ResizeObserver | null = null;\n #positionTrigger: HTMLElement | null = null;\n\n override connectedCallback(): void {\n super.connectedCallback();\n if (this.destroyed) return;\n\n this.#disconnect = new AbortController();\n\n this.#popover = createPopover({\n transition: createTransition(),\n onOpenChange: (nextOpen: boolean, details: PopoverChangeDetails) => {\n this.open = nextOpen;\n this.dispatchEvent(new CustomEvent('open-change', { detail: { open: nextOpen, ...details } }));\n },\n closeOnEscape: () => this.closeOnEscape,\n closeOnOutsideClick: () => this.closeOnOutsideClick,\n openOnHover: () => this.openOnHover,\n delay: () => this.delay,\n closeDelay: () => this.closeDelay,\n });\n\n // Register self as the popup element — the element IS the popup.\n this.#popover.setPopupElement(this);\n\n // Apply popup event handlers (pointerenter/leave, focusout) to self.\n applyElementProps(this, this.#popover.popupProps, { signal: this.#disconnect.signal });\n\n // Subscribe to interaction state for reactive updates.\n // Reuse the controller across connect/disconnect cycles to avoid\n // leaking stale controllers in the host's controller set.\n if (this.#snapshot) {\n this.#snapshot.track(this.#popover.input);\n } else {\n this.#snapshot = new SnapshotController(this, this.#popover.input);\n }\n }\n\n protected override firstUpdated(changed: PropertyValues): void {\n super.firstUpdated(changed);\n\n // Uncontrolled mode: open if `defaultOpen` is set. Controlled `open`\n // is already synced by `willUpdate` on the first render cycle.\n if (this.defaultOpen && !this.open) {\n this.#popover?.open();\n }\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n this.#cleanupPositioning();\n this.#disconnect?.abort();\n this.#disconnect = null;\n }\n\n override destroyCallback(): void {\n this.#cleanupPositioning();\n this.#cleanupTrigger();\n this.#popover?.destroy();\n super.destroyCallback();\n }\n\n protected override willUpdate(changed: PropertyValues): void {\n super.willUpdate(changed);\n this.#core.setProps(this);\n\n // Sync controlled open state\n if (this.#popover && changed.has('open')) {\n const { active: interactionOpen } = this.#popover.input.current;\n if (this.open !== interactionOpen) {\n if (this.open) {\n this.#popover.open();\n } else {\n this.#popover.close();\n }\n }\n }\n }\n\n protected override update(_changed: PropertyValues): void {\n super.update(_changed);\n if (!this.#popover) return;\n\n // Discover trigger via commandfor linkage.\n const triggerEl = this.#findTrigger();\n this.#syncTrigger(triggerEl);\n\n // Derive state from core + input.\n const input = this.#popover.input.current;\n this.#core.setInput(input);\n const state = this.#core.getState();\n\n // Apply popup ARIA and data attributes to self.\n applyElementProps(this, this.#core.getPopupAttrs(state));\n applyStateDataAttrs(this, state, PopoverDataAttrs);\n\n // Show/hide via Popover API AFTER data attributes are applied so\n // `data-starting-style` is present before the first visible frame.\n if (state.open) {\n tryShowPopover(this);\n } else {\n tryHidePopover(this);\n }\n\n // Apply trigger ARIA and anchor-name to the discovered trigger.\n if (this.#currentTrigger) {\n applyElementProps(this.#currentTrigger, this.#core.getTriggerAttrs(state, this.id));\n applyStyles(this.#currentTrigger, getAnchorNameStyle(this.id));\n }\n\n // Skip positioning when closed — no rects to measure.\n if (!state.open) {\n this.#cleanupPositioning();\n return;\n }\n\n // Apply positioning styles to self.\n const posOpts = { side: state.side, align: state.align };\n\n if (supportsAnchorPositioning()) {\n // Native CSS Anchor Positioning — no JS rect measurements needed.\n applyStyles(this, getAnchorPositionStyle(this.id, posOpts));\n } else {\n // JS fallback: measure rects and resolve CSS var offsets.\n const triggerRect = this.#currentTrigger?.getBoundingClientRect();\n const selfRect = getPopupPositionRect(this);\n const boundaryRect = document.documentElement.getBoundingClientRect();\n const offsets = resolveOffsets(this);\n applyStyles(this, getAnchorPositionStyle(this.id, posOpts, triggerRect, selfRect, boundaryRect, offsets));\n }\n\n this.#syncPositioning();\n }\n\n // --- Trigger discovery ---\n\n #findTrigger(): HTMLElement | null {\n if (!this.id) return null;\n const root = this.getRootNode() as Document | ShadowRoot;\n return root.querySelector<HTMLElement>(`[commandfor=\"${this.id}\"]`);\n }\n\n #syncTrigger(triggerEl: HTMLElement | null): void {\n if (triggerEl === this.#currentTrigger) return;\n\n this.#cleanupPositioning();\n this.#cleanupTrigger();\n this.#currentTrigger = triggerEl;\n this.#popover?.setTriggerElement(triggerEl);\n\n if (triggerEl && this.#popover) {\n this.#triggerAbort = new AbortController();\n applyElementProps(triggerEl, this.#popover.triggerProps, { signal: this.#triggerAbort.signal });\n }\n }\n\n #cleanupTrigger(): void {\n if (this.#currentTrigger) {\n // Remove ARIA attributes and anchor-name style from the old trigger.\n applyElementProps(this.#currentTrigger, {\n 'aria-expanded': undefined,\n 'aria-haspopup': undefined,\n 'aria-controls': undefined,\n });\n this.#currentTrigger.style.removeProperty('anchor-name');\n }\n\n this.#triggerAbort?.abort();\n this.#triggerAbort = null;\n this.#currentTrigger = null;\n }\n\n #syncPositioning(): void {\n if (supportsAnchorPositioning()) return;\n\n const triggerEl = this.#currentTrigger;\n\n if (!triggerEl) return;\n if (this.#positionAbort && this.#positionTrigger === triggerEl) return;\n\n this.#cleanupPositioning();\n this.#positionAbort = new AbortController();\n this.#positionTrigger = triggerEl;\n const { signal } = this.#positionAbort;\n\n const reposition = () => {\n cancelAnimationFrame(this.#positionFrame);\n this.#positionFrame = requestAnimationFrame(() => {\n if (signal.aborted) return;\n this.requestUpdate();\n });\n };\n\n window.addEventListener('scroll', reposition, { capture: true, passive: true, signal });\n window.addEventListener('resize', reposition, { signal });\n\n if (typeof ResizeObserver === 'function') {\n this.#resizeObserver = new ResizeObserver(() => {\n reposition();\n });\n this.#resizeObserver.observe(triggerEl);\n this.#resizeObserver.observe(this);\n }\n\n reposition();\n }\n\n #cleanupPositioning(): void {\n this.#positionAbort?.abort();\n this.#positionAbort = null;\n this.#positionTrigger = null;\n cancelAnimationFrame(this.#positionFrame);\n this.#positionFrame = 0;\n this.#resizeObserver?.disconnect();\n this.#resizeObserver = null;\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"popover-element.js","names":["#core","#position","#disconnect","#popover","#snapshot","#cleanupTrigger","#syncTrigger","#currentTrigger","#triggerAbort"],"sources":["../../../../src/ui/popover/popover-element.ts"],"sourcesContent":["import { PopoverCore, PopoverDataAttrs, type PopoverInput, type PopoverProps } from '@videojs/core';\nimport {\n applyElementProps,\n applyStateDataAttrs,\n createPopover,\n createTransition,\n getAnchorNameStyle,\n getAnchorPositionStyle,\n getPopupPositionRect,\n type PopoverApi,\n type PopoverChangeDetails,\n resolveOffsets,\n} from '@videojs/core/dom';\nimport type { PropertyDeclarationMap, PropertyValues } from '@videojs/element';\nimport { SnapshotController } from '@videojs/store/html';\nimport { applyStyles, supportsAnchorPositioning, tryHidePopover, tryShowPopover } from '@videojs/utils/dom';\n\nimport { MediaElement } from '../media-element';\nimport { PositionController } from '../position-controller';\n\nexport class PopoverElement extends MediaElement {\n static readonly tagName = 'media-popover';\n\n static override properties = {\n open: { type: Boolean },\n defaultOpen: { type: Boolean, attribute: 'default-open' },\n side: { type: String },\n align: { type: String },\n modal: { type: Boolean },\n closeOnEscape: { type: Boolean, attribute: 'close-on-escape' },\n closeOnOutsideClick: { type: Boolean, attribute: 'close-on-outside-click' },\n openOnHover: { type: Boolean, attribute: 'open-on-hover' },\n delay: { type: Number },\n closeDelay: { type: Number, attribute: 'close-delay' },\n } satisfies PropertyDeclarationMap<keyof PopoverCore.Props>;\n\n open = PopoverCore.defaultProps.open;\n defaultOpen = PopoverCore.defaultProps.defaultOpen;\n side = PopoverCore.defaultProps.side;\n align = PopoverCore.defaultProps.align;\n modal: PopoverProps['modal'] = PopoverCore.defaultProps.modal;\n closeOnEscape = PopoverCore.defaultProps.closeOnEscape;\n closeOnOutsideClick = PopoverCore.defaultProps.closeOnOutsideClick;\n openOnHover = PopoverCore.defaultProps.openOnHover;\n delay = PopoverCore.defaultProps.delay;\n closeDelay = PopoverCore.defaultProps.closeDelay;\n\n readonly #core = new PopoverCore();\n readonly #position = new PositionController(this);\n #popover: PopoverApi | null = null;\n #snapshot: SnapshotController<PopoverInput> | null = null;\n\n // Cleanup controllers\n #disconnect: AbortController | null = null;\n #triggerAbort: AbortController | null = null;\n #currentTrigger: HTMLElement | null = null;\n\n override connectedCallback(): void {\n super.connectedCallback();\n if (this.destroyed) return;\n\n this.#disconnect = new AbortController();\n\n this.#popover = createPopover({\n transition: createTransition(),\n onOpenChange: (nextOpen: boolean, details: PopoverChangeDetails) => {\n this.open = nextOpen;\n this.dispatchEvent(new CustomEvent('open-change', { detail: { open: nextOpen, ...details } }));\n },\n closeOnEscape: () => this.closeOnEscape,\n closeOnOutsideClick: () => this.closeOnOutsideClick,\n openOnHover: () => this.openOnHover,\n delay: () => this.delay,\n closeDelay: () => this.closeDelay,\n });\n\n // Register self as the popup element — the element IS the popup.\n this.#popover.setPopupElement(this);\n\n // Apply popup event handlers (pointerenter/leave, focusout) to self.\n applyElementProps(this, this.#popover.popupProps, { signal: this.#disconnect.signal });\n\n // Subscribe to interaction state for reactive updates.\n // Reuse the controller across connect/disconnect cycles to avoid\n // leaking stale controllers in the host's controller set.\n if (this.#snapshot) {\n this.#snapshot.track(this.#popover.input);\n } else {\n this.#snapshot = new SnapshotController(this, this.#popover.input);\n }\n }\n\n protected override firstUpdated(changed: PropertyValues): void {\n super.firstUpdated(changed);\n\n // Uncontrolled mode: open if `defaultOpen` is set. Controlled `open`\n // is already synced by `willUpdate` on the first render cycle.\n if (this.defaultOpen && !this.open) {\n this.#popover?.open();\n }\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n this.#disconnect?.abort();\n this.#disconnect = null;\n }\n\n override destroyCallback(): void {\n this.#cleanupTrigger();\n this.#popover?.destroy();\n super.destroyCallback();\n }\n\n protected override willUpdate(changed: PropertyValues): void {\n super.willUpdate(changed);\n this.#core.setProps(this);\n\n // Sync controlled open state\n if (this.#popover && changed.has('open')) {\n const { active: interactionOpen } = this.#popover.input.current;\n if (this.open !== interactionOpen) {\n if (this.open) {\n this.#popover.open();\n } else {\n this.#popover.close();\n }\n }\n }\n }\n\n protected override update(_changed: PropertyValues): void {\n super.update(_changed);\n if (!this.#popover) return;\n\n // Discover trigger via commandfor linkage.\n const triggerEl = this.#position.findTrigger();\n this.#syncTrigger(triggerEl);\n\n // Derive state from core + input.\n const input = this.#popover.input.current;\n this.#core.setInput(input);\n const state = this.#core.getState();\n\n // Apply popup ARIA and data attributes to self.\n applyElementProps(this, this.#core.getPopupAttrs(state));\n applyStateDataAttrs(this, state, PopoverDataAttrs);\n\n // Show/hide via Popover API AFTER data attributes are applied so\n // `data-starting-style` is present before the first visible frame.\n if (state.open) {\n tryShowPopover(this);\n } else {\n tryHidePopover(this);\n }\n\n // Apply trigger ARIA and anchor-name to the discovered trigger.\n if (this.#currentTrigger) {\n applyElementProps(this.#currentTrigger, this.#core.getTriggerAttrs(state, this.id));\n applyStyles(this.#currentTrigger, getAnchorNameStyle(this.id));\n }\n\n // Skip positioning when closed — no rects to measure.\n if (!state.open) {\n this.#position.cleanup();\n return;\n }\n\n // Apply positioning styles to self.\n const posOpts = { side: state.side, align: state.align };\n\n if (supportsAnchorPositioning()) {\n // Native CSS Anchor Positioning — no JS rect measurements needed.\n applyStyles(this, getAnchorPositionStyle(this.id, posOpts));\n } else {\n // JS fallback: measure rects and resolve CSS var offsets.\n const triggerRect = this.#currentTrigger?.getBoundingClientRect();\n const selfRect = getPopupPositionRect(this);\n const boundaryRect = document.documentElement.getBoundingClientRect();\n const offsets = resolveOffsets(this);\n applyStyles(this, getAnchorPositionStyle(this.id, posOpts, triggerRect, selfRect, boundaryRect, offsets));\n }\n\n this.#position.sync(this.#currentTrigger);\n }\n\n // --- Trigger management ---\n\n #syncTrigger(triggerEl: HTMLElement | null): void {\n if (triggerEl === this.#currentTrigger) return;\n\n this.#position.cleanup();\n this.#cleanupTrigger();\n this.#currentTrigger = triggerEl;\n this.#popover?.setTriggerElement(triggerEl);\n\n if (triggerEl && this.#popover) {\n this.#triggerAbort = new AbortController();\n applyElementProps(triggerEl, this.#popover.triggerProps, { signal: this.#triggerAbort.signal });\n }\n }\n\n #cleanupTrigger(): void {\n if (this.#currentTrigger) {\n // Remove ARIA attributes and anchor-name style from the old trigger.\n applyElementProps(this.#currentTrigger, {\n 'aria-expanded': undefined,\n 'aria-haspopup': undefined,\n 'aria-controls': undefined,\n });\n this.#currentTrigger.style.removeProperty('anchor-name');\n }\n\n this.#triggerAbort?.abort();\n this.#triggerAbort = null;\n this.#currentTrigger = null;\n }\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { supportsAnchorPositioning } from "@videojs/utils/dom";
|
|
2
|
+
//#region src/ui/position-controller.ts
|
|
3
|
+
/**
|
|
4
|
+
* Reactive controller that manages JS-fallback positioning for floating
|
|
5
|
+
* popup elements (tooltips, popovers). Tracks scroll, resize, and
|
|
6
|
+
* ResizeObserver events to keep the popup aligned with its trigger.
|
|
7
|
+
*
|
|
8
|
+
* When native CSS Anchor Positioning is supported, `sync()` is a no-op.
|
|
9
|
+
*/
|
|
10
|
+
var PositionController = class {
|
|
11
|
+
#host;
|
|
12
|
+
#abort = null;
|
|
13
|
+
#frame = 0;
|
|
14
|
+
#resizeObserver = null;
|
|
15
|
+
#trigger = null;
|
|
16
|
+
constructor(host) {
|
|
17
|
+
this.#host = host;
|
|
18
|
+
host.addController(this);
|
|
19
|
+
}
|
|
20
|
+
/** Discover a trigger element linked via `commandfor` attribute. */
|
|
21
|
+
findTrigger() {
|
|
22
|
+
if (!this.#host.id) return null;
|
|
23
|
+
return this.#host.getRootNode().querySelector(`[commandfor="${this.#host.id}"]`);
|
|
24
|
+
}
|
|
25
|
+
/** Start or update position tracking for the given trigger. */
|
|
26
|
+
sync(trigger) {
|
|
27
|
+
if (supportsAnchorPositioning()) return;
|
|
28
|
+
if (!trigger) return;
|
|
29
|
+
if (this.#abort && this.#trigger === trigger) return;
|
|
30
|
+
this.cleanup();
|
|
31
|
+
this.#abort = new AbortController();
|
|
32
|
+
this.#trigger = trigger;
|
|
33
|
+
const { signal } = this.#abort;
|
|
34
|
+
const reposition = () => {
|
|
35
|
+
cancelAnimationFrame(this.#frame);
|
|
36
|
+
this.#frame = requestAnimationFrame(() => {
|
|
37
|
+
if (signal.aborted) return;
|
|
38
|
+
this.#host.requestUpdate();
|
|
39
|
+
});
|
|
40
|
+
};
|
|
41
|
+
window.addEventListener("scroll", reposition, {
|
|
42
|
+
capture: true,
|
|
43
|
+
passive: true,
|
|
44
|
+
signal
|
|
45
|
+
});
|
|
46
|
+
window.addEventListener("resize", reposition, { signal });
|
|
47
|
+
if (typeof ResizeObserver === "function") {
|
|
48
|
+
this.#resizeObserver = new ResizeObserver(() => {
|
|
49
|
+
reposition();
|
|
50
|
+
});
|
|
51
|
+
this.#resizeObserver.observe(trigger);
|
|
52
|
+
this.#resizeObserver.observe(this.#host);
|
|
53
|
+
}
|
|
54
|
+
reposition();
|
|
55
|
+
}
|
|
56
|
+
/** Stop all position tracking. */
|
|
57
|
+
cleanup() {
|
|
58
|
+
this.#abort?.abort();
|
|
59
|
+
this.#abort = null;
|
|
60
|
+
this.#trigger = null;
|
|
61
|
+
cancelAnimationFrame(this.#frame);
|
|
62
|
+
this.#frame = 0;
|
|
63
|
+
this.#resizeObserver?.disconnect();
|
|
64
|
+
this.#resizeObserver = null;
|
|
65
|
+
}
|
|
66
|
+
hostDisconnected() {
|
|
67
|
+
this.cleanup();
|
|
68
|
+
}
|
|
69
|
+
hostDestroyed() {
|
|
70
|
+
this.cleanup();
|
|
71
|
+
}
|
|
72
|
+
};
|
|
73
|
+
//#endregion
|
|
74
|
+
export { PositionController };
|
|
75
|
+
|
|
76
|
+
//# sourceMappingURL=position-controller.js.map
|