@hh.ru/magritte-ui-video 1.0.2 → 1.1.0
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/Video.js +1 -1
- package/VideoControls.js +1 -1
- package/VideoPlayer.js +2 -1
- package/VideoPlayer.js.map +1 -1
- package/index.css +64 -61
- package/index.js +1 -1
- package/internal/ControlButton.js +1 -1
- package/internal/Scrubber.js +1 -1
- package/internal/SeekIndicator.js +1 -1
- package/internal/VolumeSlider.js +1 -1
- package/internal/context.d.ts +5 -0
- package/internal/context.js.map +1 -1
- package/internal/store.js +7 -1
- package/internal/store.js.map +1 -1
- package/package.json +8 -8
- package/video-CaC1atet.js +5 -0
- package/video-CaC1atet.js.map +1 -0
- package/video-BnfN4Emx.js +0 -5
- package/video-BnfN4Emx.js.map +0 -1
package/Video.js
CHANGED
|
@@ -13,7 +13,7 @@ import '@hh.ru/magritte-ui-icon/icon';
|
|
|
13
13
|
import '@hh.ru/magritte-ui-typography';
|
|
14
14
|
import './internal/ControlButton.js';
|
|
15
15
|
import '@hh.ru/magritte-ui-tooltip';
|
|
16
|
-
import './video-
|
|
16
|
+
import './video-CaC1atet.js';
|
|
17
17
|
import './internal/Scrubber.js';
|
|
18
18
|
import './internal/formatTime.js';
|
|
19
19
|
import './internal/useSliderPointer.js';
|
package/VideoControls.js
CHANGED
|
@@ -15,7 +15,7 @@ import { useVideoContext, VideoPlayerContext, useVideoState } from './internal/c
|
|
|
15
15
|
import { findFocusableControl, CONTROL_KEY_ATTRIBUTE } from './internal/controlKey.js';
|
|
16
16
|
import { useInert } from './internal/useInert.js';
|
|
17
17
|
import { useVideoHotkeys } from './internal/useVideoHotkeys.js';
|
|
18
|
-
import { s as styles } from './video-
|
|
18
|
+
import { s as styles } from './video-CaC1atet.js';
|
|
19
19
|
import '@hh.ru/magritte-ui-tooltip';
|
|
20
20
|
import './internal/formatTime.js';
|
|
21
21
|
import './internal/useSliderPointer.js';
|
package/VideoPlayer.js
CHANGED
|
@@ -19,7 +19,7 @@ import { useCanvasGestures } from './internal/useCanvasGestures.js';
|
|
|
19
19
|
import { useInert } from './internal/useInert.js';
|
|
20
20
|
import { useVideoHotkeys } from './internal/useVideoHotkeys.js';
|
|
21
21
|
import { useViewportVisibility } from './internal/useViewportVisibility.js';
|
|
22
|
-
import { s as styles } from './video-
|
|
22
|
+
import { s as styles } from './video-CaC1atet.js';
|
|
23
23
|
import '@hh.ru/magritte-common-keyboard';
|
|
24
24
|
|
|
25
25
|
const ERROR_PLACEHOLDER_MAX_WIDTH = 343;
|
|
@@ -184,6 +184,7 @@ const VideoPlayer = ({
|
|
|
184
184
|
store.retry();
|
|
185
185
|
},
|
|
186
186
|
"data-qa": "video-retry",
|
|
187
|
+
...host?.retryButtonProps,
|
|
187
188
|
children: retryTrl
|
|
188
189
|
}
|
|
189
190
|
) })
|
package/VideoPlayer.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"VideoPlayer.js","sources":["src/VideoPlayer.tsx"],"sourcesContent":["import { type FC, useCallback, useContext, useEffect, useRef } from 'react';\nimport { createPortal } from 'react-dom';\nimport classnames from 'classnames';\n\nimport { useTranslation } from '@hh.ru/magritte-common-use-translation';\nimport { useBreakpoint } from '@hh.ru/magritte-ui-breakpoint';\nimport { Button } from '@hh.ru/magritte-ui-button';\nimport { ButtonStack } from '@hh.ru/magritte-ui-button-stack';\nimport {\n ArrowPathClockwiseOutlinedSize24,\n ForwardFilledSize16,\n PauseFilledSize24,\n PlayFilledSize24,\n} from '@hh.ru/magritte-ui-icon/icon';\nimport { Loader } from '@hh.ru/magritte-ui-loader';\nimport { Placeholder } from '@hh.ru/magritte-ui-placeholder';\nimport { Text } from '@hh.ru/magritte-ui-typography';\nimport { SeekIndicator } from '@hh.ru/magritte-ui-video/internal/SeekIndicator';\nimport {\n useVideoContext,\n useVideoState,\n VideoPlayerContext,\n VideoPlayerHostContext,\n} from '@hh.ru/magritte-ui-video/internal/context';\nimport { formatDuration } from '@hh.ru/magritte-ui-video/internal/formatTime';\nimport { BOOST_RATE } from '@hh.ru/magritte-ui-video/internal/store';\nimport { useCanvasGestures } from '@hh.ru/magritte-ui-video/internal/useCanvasGestures';\nimport { useInert } from '@hh.ru/magritte-ui-video/internal/useInert';\nimport { useVideoHotkeys } from '@hh.ru/magritte-ui-video/internal/useVideoHotkeys';\nimport { useViewportVisibility } from '@hh.ru/magritte-ui-video/internal/useViewportVisibility';\nimport { type VideoPlayerProps } from '@hh.ru/magritte-ui-video/types';\n\nimport styles from './video.less';\n\nconst ERROR_PLACEHOLDER_MAX_WIDTH = 343;\n\n/** Круглая кнопка поверх видео: play в default и центральная play/pause на mobile */\nconst OVERLAY_ICON_PROPS = {\n initialColor: 'constant',\n padding: 16,\n borderRadius: 'halfHeight',\n backgroundStyle: 'overlay',\n} as const;\n\n/** Клики и тапы по контролам и кнопкам — не жесты холста */\nconst isOwnInteractiveTarget = (target: EventTarget): boolean =>\n target instanceof Element && !!target.closest('[data-video-controls], button, [role=\"slider\"]');\n\n/** Холст видео: `<video>` и всё, что поверх него, — кнопка воспроизведения, длительность, загрузка, ошибка */\nexport const VideoPlayer: FC<VideoPlayerProps> = ({\n aspectRatio,\n borderRadius = 0,\n showDuration = true,\n 'aria-label': ariaLabel,\n 'data-qa': dataQa = 'video-player',\n children,\n}) => {\n const { store, preview, duration: durationProp, interactive, observeViewport } = useVideoContext('Video.Player');\n const status = useVideoState(store, (state) => state.status);\n const waiting = useVideoState(store, (state) => state.waiting);\n const metadataDuration = useVideoState(store, (state) => state.duration);\n const controlsVisible = useVideoState(store, (state) => state.controlsVisible);\n const fullscreen = useVideoState(store, (state) => state.fullscreen);\n const boosted = useVideoState(store, (state) => state.boosted);\n const indicatorContainer = useVideoState(store, (state) => state.indicatorContainer);\n // повтор после ошибки: до начала воспроизведения — лоадер на тёмном фоне, без превью\n const retrying = useVideoState(store, (state) => state.retrying);\n const host = useContext(VideoPlayerHostContext);\n const { isMobile } = useBreakpoint();\n const centerButtonRef = useRef<HTMLSpanElement>(null);\n useInert(centerButtonRef, !controlsVisible);\n const rootRef = useRef<HTMLDivElement | null>(null);\n const setRoot = useCallback(\n (element: HTMLDivElement | null) => {\n rootRef.current = element;\n store.attachRoot(element);\n },\n [store]\n );\n\n const componentDescriptionTrl = useTranslation('Video', 'componentDescription');\n const playTrl = useTranslation('Video', 'play');\n const loadingTrl = useTranslation('Video', 'loading');\n const errorTitleTrl = useTranslation('Video', 'errorTitle');\n const errorDescriptionTrl = useTranslation('Video', 'errorDescription');\n const retryTrl = useTranslation('Video', 'retry');\n const pauseTrl = useTranslation('Video', 'pause');\n const replayTrl = useTranslation('Video', 'replay');\n\n // кнопка, на которой фокус, сейчас исчезнет — оставляем фокус в плеере, а не на body\n const keepFocus = () => rootRef.current?.focus({ preventScroll: true });\n\n const duration = metadataDuration ?? durationProp;\n const isLoading = status === 'loading' || (status === 'playing' && waiting);\n const started = status === 'playing' || status === 'paused' || status === 'ended';\n\n // mobile: на паузе по центру видео кнопка воспроизведения — контролы можно прятать и на паузе; на desktop\n // поверх видео на паузе ничего нет, контролы остаются\n useEffect(() => store.setHideWhenPaused(isMobile), [store, isMobile]);\n\n const { seekIndicator, handlers } = useCanvasGestures({ store, isMobile, isOwnInteractiveTarget, keepFocus });\n const onKeyDown = useVideoHotkeys(store);\n useViewportVisibility(rootRef, store, observeViewport);\n // неинтерактивное видео: без кнопок, жестов, горячих клавиш и экрана ошибки — только видео и загрузка\n const showError = interactive && status === 'error';\n\n let CenterIcon = PlayFilledSize24;\n let centerLabel = playTrl;\n if (status === 'ended') {\n CenterIcon = ArrowPathClockwiseOutlinedSize24;\n centerLabel = replayTrl;\n } else if (status === 'playing') {\n CenterIcon = PauseFilledSize24;\n centerLabel = pauseTrl;\n }\n\n // плашка ускорения — вверху плеера или в заданном контейнере (под шапкой вьювера); в fullscreen — всегда в плеере\n const renderBoostIndicator = () => {\n const indicator = (\n <span className={styles.boostIndicator} aria-hidden data-qa=\"video-boost\">\n <Text typography=\"label-3-regular\" style=\"constant\">\n {`${BOOST_RATE}x`}\n </Text>\n <ForwardFilledSize16 initialColor=\"constant\" />\n </span>\n );\n return indicatorContainer && !fullscreen ? createPortal(indicator, indicatorContainer) : indicator;\n };\n\n const video = (\n <video\n ref={store.attach}\n className={classnames(styles.video, { [styles.videoHidden]: showError || retrying })}\n poster={preview}\n playsInline\n preload=\"metadata\"\n />\n );\n\n return (\n <div\n ref={setRoot}\n role=\"group\"\n aria-label={ariaLabel ?? componentDescriptionTrl}\n tabIndex={-1}\n className={classnames(styles.player, {\n [styles.playerFit]: aspectRatio === undefined,\n [styles.playerEmbedded]: !!host && !fullscreen,\n })}\n // в fullscreen плеер занимает весь экран — скругление сбрасываем\n style={{\n aspectRatio,\n borderRadius: fullscreen ? 0 : borderRadius,\n }}\n data-qa={dataQa}\n data-status={status}\n {...(interactive && { onKeyDown, ...handlers })}\n >\n {host ? host.renderVideo(video) : video}\n\n {interactive && status === 'idle' && (\n <>\n {/* обёртка — позиционирование и размытие подложки, кнопку даёт сама иконка */}\n <span className={styles.overlayButton}>\n <PlayFilledSize24\n {...OVERLAY_ICON_PROPS}\n aria-label={playTrl}\n onClick={() => {\n keepFocus();\n store.play();\n }}\n data-qa=\"video-play\"\n />\n </span>\n {showDuration && duration !== undefined && (\n <span className={styles.duration} data-qa=\"video-duration\">\n <Text typography=\"paragraph-2-regular\" style=\"constant\">\n {formatDuration(duration)}\n </Text>\n </span>\n )}\n </>\n )}\n\n {interactive && isMobile && started && !waiting && (\n <span\n ref={centerButtonRef}\n className={classnames(styles.overlayButton, { [styles.overlayButtonHidden]: !controlsVisible })}\n >\n <CenterIcon\n {...OVERLAY_ICON_PROPS}\n aria-label={centerLabel}\n onClick={() => {\n store.toggle();\n store.notifyActivity();\n }}\n data-qa=\"video-center-button\"\n />\n </span>\n )}\n\n {seekIndicator && <SeekIndicator {...seekIndicator} />}\n\n {boosted && renderBoostIndicator()}\n\n {isLoading && (\n <div className={styles.loader}>\n <Loader size={32} color=\"constant\" aria-label={loadingTrl} />\n </div>\n )}\n\n {showError && (\n <div className={styles.error} data-qa=\"video-error\">\n <Placeholder\n title={errorTitleTrl}\n description={errorDescriptionTrl}\n titleProps={{\n Element: 'div',\n size: 'medium',\n alignment: 'center',\n style: 'constant',\n descriptionStyle: 'constant-secondary',\n notRegionTitle: true,\n }}\n maxWidth={ERROR_PLACEHOLDER_MAX_WIDTH}\n buttons={\n <ButtonStack layout=\"vertical\" stretched>\n <Button\n mode=\"secondary\"\n style=\"constant\"\n size=\"medium\"\n onClick={() => {\n keepFocus();\n store.retry();\n }}\n data-qa=\"video-retry\"\n >\n {retryTrl}\n </Button>\n </ButtonStack>\n }\n />\n </div>\n )}\n\n <VideoPlayerContext.Provider value>{children}</VideoPlayerContext.Provider>\n </div>\n );\n};\n\nVideoPlayer.displayName = 'VideoPlayer';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"VideoPlayer.js","sources":["src/VideoPlayer.tsx"],"sourcesContent":["import { type FC, useCallback, useContext, useEffect, useRef } from 'react';\nimport { createPortal } from 'react-dom';\nimport classnames from 'classnames';\n\nimport { useTranslation } from '@hh.ru/magritte-common-use-translation';\nimport { useBreakpoint } from '@hh.ru/magritte-ui-breakpoint';\nimport { Button } from '@hh.ru/magritte-ui-button';\nimport { ButtonStack } from '@hh.ru/magritte-ui-button-stack';\nimport {\n ArrowPathClockwiseOutlinedSize24,\n ForwardFilledSize16,\n PauseFilledSize24,\n PlayFilledSize24,\n} from '@hh.ru/magritte-ui-icon/icon';\nimport { Loader } from '@hh.ru/magritte-ui-loader';\nimport { Placeholder } from '@hh.ru/magritte-ui-placeholder';\nimport { Text } from '@hh.ru/magritte-ui-typography';\nimport { SeekIndicator } from '@hh.ru/magritte-ui-video/internal/SeekIndicator';\nimport {\n useVideoContext,\n useVideoState,\n VideoPlayerContext,\n VideoPlayerHostContext,\n} from '@hh.ru/magritte-ui-video/internal/context';\nimport { formatDuration } from '@hh.ru/magritte-ui-video/internal/formatTime';\nimport { BOOST_RATE } from '@hh.ru/magritte-ui-video/internal/store';\nimport { useCanvasGestures } from '@hh.ru/magritte-ui-video/internal/useCanvasGestures';\nimport { useInert } from '@hh.ru/magritte-ui-video/internal/useInert';\nimport { useVideoHotkeys } from '@hh.ru/magritte-ui-video/internal/useVideoHotkeys';\nimport { useViewportVisibility } from '@hh.ru/magritte-ui-video/internal/useViewportVisibility';\nimport { type VideoPlayerProps } from '@hh.ru/magritte-ui-video/types';\n\nimport styles from './video.less';\n\nconst ERROR_PLACEHOLDER_MAX_WIDTH = 343;\n\n/** Круглая кнопка поверх видео: play в default и центральная play/pause на mobile */\nconst OVERLAY_ICON_PROPS = {\n initialColor: 'constant',\n padding: 16,\n borderRadius: 'halfHeight',\n backgroundStyle: 'overlay',\n} as const;\n\n/** Клики и тапы по контролам и кнопкам — не жесты холста */\nconst isOwnInteractiveTarget = (target: EventTarget): boolean =>\n target instanceof Element && !!target.closest('[data-video-controls], button, [role=\"slider\"]');\n\n/** Холст видео: `<video>` и всё, что поверх него, — кнопка воспроизведения, длительность, загрузка, ошибка */\nexport const VideoPlayer: FC<VideoPlayerProps> = ({\n aspectRatio,\n borderRadius = 0,\n showDuration = true,\n 'aria-label': ariaLabel,\n 'data-qa': dataQa = 'video-player',\n children,\n}) => {\n const { store, preview, duration: durationProp, interactive, observeViewport } = useVideoContext('Video.Player');\n const status = useVideoState(store, (state) => state.status);\n const waiting = useVideoState(store, (state) => state.waiting);\n const metadataDuration = useVideoState(store, (state) => state.duration);\n const controlsVisible = useVideoState(store, (state) => state.controlsVisible);\n const fullscreen = useVideoState(store, (state) => state.fullscreen);\n const boosted = useVideoState(store, (state) => state.boosted);\n const indicatorContainer = useVideoState(store, (state) => state.indicatorContainer);\n // повтор после ошибки: до начала воспроизведения — лоадер на тёмном фоне, без превью\n const retrying = useVideoState(store, (state) => state.retrying);\n const host = useContext(VideoPlayerHostContext);\n const { isMobile } = useBreakpoint();\n const centerButtonRef = useRef<HTMLSpanElement>(null);\n useInert(centerButtonRef, !controlsVisible);\n const rootRef = useRef<HTMLDivElement | null>(null);\n const setRoot = useCallback(\n (element: HTMLDivElement | null) => {\n rootRef.current = element;\n store.attachRoot(element);\n },\n [store]\n );\n\n const componentDescriptionTrl = useTranslation('Video', 'componentDescription');\n const playTrl = useTranslation('Video', 'play');\n const loadingTrl = useTranslation('Video', 'loading');\n const errorTitleTrl = useTranslation('Video', 'errorTitle');\n const errorDescriptionTrl = useTranslation('Video', 'errorDescription');\n const retryTrl = useTranslation('Video', 'retry');\n const pauseTrl = useTranslation('Video', 'pause');\n const replayTrl = useTranslation('Video', 'replay');\n\n // кнопка, на которой фокус, сейчас исчезнет — оставляем фокус в плеере, а не на body\n const keepFocus = () => rootRef.current?.focus({ preventScroll: true });\n\n const duration = metadataDuration ?? durationProp;\n const isLoading = status === 'loading' || (status === 'playing' && waiting);\n const started = status === 'playing' || status === 'paused' || status === 'ended';\n\n // mobile: на паузе по центру видео кнопка воспроизведения — контролы можно прятать и на паузе; на desktop\n // поверх видео на паузе ничего нет, контролы остаются\n useEffect(() => store.setHideWhenPaused(isMobile), [store, isMobile]);\n\n const { seekIndicator, handlers } = useCanvasGestures({ store, isMobile, isOwnInteractiveTarget, keepFocus });\n const onKeyDown = useVideoHotkeys(store);\n useViewportVisibility(rootRef, store, observeViewport);\n // неинтерактивное видео: без кнопок, жестов, горячих клавиш и экрана ошибки — только видео и загрузка\n const showError = interactive && status === 'error';\n\n let CenterIcon = PlayFilledSize24;\n let centerLabel = playTrl;\n if (status === 'ended') {\n CenterIcon = ArrowPathClockwiseOutlinedSize24;\n centerLabel = replayTrl;\n } else if (status === 'playing') {\n CenterIcon = PauseFilledSize24;\n centerLabel = pauseTrl;\n }\n\n // плашка ускорения — вверху плеера или в заданном контейнере (под шапкой вьювера); в fullscreen — всегда в плеере\n const renderBoostIndicator = () => {\n const indicator = (\n <span className={styles.boostIndicator} aria-hidden data-qa=\"video-boost\">\n <Text typography=\"label-3-regular\" style=\"constant\">\n {`${BOOST_RATE}x`}\n </Text>\n <ForwardFilledSize16 initialColor=\"constant\" />\n </span>\n );\n return indicatorContainer && !fullscreen ? createPortal(indicator, indicatorContainer) : indicator;\n };\n\n const video = (\n <video\n ref={store.attach}\n className={classnames(styles.video, { [styles.videoHidden]: showError || retrying })}\n poster={preview}\n playsInline\n preload=\"metadata\"\n />\n );\n\n return (\n <div\n ref={setRoot}\n role=\"group\"\n aria-label={ariaLabel ?? componentDescriptionTrl}\n tabIndex={-1}\n className={classnames(styles.player, {\n [styles.playerFit]: aspectRatio === undefined,\n [styles.playerEmbedded]: !!host && !fullscreen,\n })}\n // в fullscreen плеер занимает весь экран — скругление сбрасываем\n style={{\n aspectRatio,\n borderRadius: fullscreen ? 0 : borderRadius,\n }}\n data-qa={dataQa}\n data-status={status}\n {...(interactive && { onKeyDown, ...handlers })}\n >\n {host ? host.renderVideo(video) : video}\n\n {interactive && status === 'idle' && (\n <>\n {/* обёртка — позиционирование и размытие подложки, кнопку даёт сама иконка */}\n <span className={styles.overlayButton}>\n <PlayFilledSize24\n {...OVERLAY_ICON_PROPS}\n aria-label={playTrl}\n onClick={() => {\n keepFocus();\n store.play();\n }}\n data-qa=\"video-play\"\n />\n </span>\n {showDuration && duration !== undefined && (\n <span className={styles.duration} data-qa=\"video-duration\">\n <Text typography=\"paragraph-2-regular\" style=\"constant\">\n {formatDuration(duration)}\n </Text>\n </span>\n )}\n </>\n )}\n\n {interactive && isMobile && started && !waiting && (\n <span\n ref={centerButtonRef}\n className={classnames(styles.overlayButton, { [styles.overlayButtonHidden]: !controlsVisible })}\n >\n <CenterIcon\n {...OVERLAY_ICON_PROPS}\n aria-label={centerLabel}\n onClick={() => {\n store.toggle();\n store.notifyActivity();\n }}\n data-qa=\"video-center-button\"\n />\n </span>\n )}\n\n {seekIndicator && <SeekIndicator {...seekIndicator} />}\n\n {boosted && renderBoostIndicator()}\n\n {isLoading && (\n <div className={styles.loader}>\n <Loader size={32} color=\"constant\" aria-label={loadingTrl} />\n </div>\n )}\n\n {showError && (\n <div className={styles.error} data-qa=\"video-error\">\n <Placeholder\n title={errorTitleTrl}\n description={errorDescriptionTrl}\n titleProps={{\n Element: 'div',\n size: 'medium',\n alignment: 'center',\n style: 'constant',\n descriptionStyle: 'constant-secondary',\n notRegionTitle: true,\n }}\n maxWidth={ERROR_PLACEHOLDER_MAX_WIDTH}\n buttons={\n <ButtonStack layout=\"vertical\" stretched>\n <Button\n mode=\"secondary\"\n style=\"constant\"\n size=\"medium\"\n onClick={() => {\n keepFocus();\n store.retry();\n }}\n data-qa=\"video-retry\"\n {...host?.retryButtonProps}\n >\n {retryTrl}\n </Button>\n </ButtonStack>\n }\n />\n </div>\n )}\n\n <VideoPlayerContext.Provider value>{children}</VideoPlayerContext.Provider>\n </div>\n );\n};\n\nVideoPlayer.displayName = 'VideoPlayer';\n"],"names":[],"mappings":"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"}
|
package/index.css
CHANGED
|
@@ -21,7 +21,7 @@
|
|
|
21
21
|
.magritte-zp-day-theme{
|
|
22
22
|
--magritte-color-background-accent-v26-0-2:#7195AF;
|
|
23
23
|
}
|
|
24
|
-
.magritte-player___IHHy5_1-0
|
|
24
|
+
.magritte-player___IHHy5_1-1-0{
|
|
25
25
|
position:relative;
|
|
26
26
|
width:100%;
|
|
27
27
|
overflow:hidden;
|
|
@@ -32,23 +32,23 @@
|
|
|
32
32
|
-webkit-user-select:none;
|
|
33
33
|
-webkit-touch-callout:none;
|
|
34
34
|
}
|
|
35
|
-
.magritte-player-fit___TX-6X_1-0
|
|
35
|
+
.magritte-player-fit___TX-6X_1-1-0{
|
|
36
36
|
height:100%;
|
|
37
37
|
}
|
|
38
|
-
.magritte-player-embedded___GNvRb_1-0
|
|
38
|
+
.magritte-player-embedded___GNvRb_1-1-0{
|
|
39
39
|
overflow:visible;
|
|
40
40
|
background-color:transparent;
|
|
41
41
|
}
|
|
42
|
-
.magritte-video___4cS-u_1-0
|
|
42
|
+
.magritte-video___4cS-u_1-1-0{
|
|
43
43
|
display:block;
|
|
44
44
|
width:100%;
|
|
45
45
|
height:100%;
|
|
46
46
|
object-fit:contain;
|
|
47
47
|
}
|
|
48
|
-
.magritte-video-hidden___agqVq_1-0
|
|
48
|
+
.magritte-video-hidden___agqVq_1-1-0{
|
|
49
49
|
visibility:hidden;
|
|
50
50
|
}
|
|
51
|
-
.magritte-overlay-button___MIRAP_1-0
|
|
51
|
+
.magritte-overlay-button___MIRAP_1-1-0{
|
|
52
52
|
position:absolute;
|
|
53
53
|
top:50%;
|
|
54
54
|
left:50%;
|
|
@@ -58,7 +58,7 @@
|
|
|
58
58
|
backdrop-filter:blur(24px);
|
|
59
59
|
transition:opacity var(--magritte-semantic-animation-time-m-duration-v26-0-2) var(--magritte-semantic-animation-ease-base-timing-function-v26-0-2);
|
|
60
60
|
}
|
|
61
|
-
.magritte-duration___ND1ei_1-0
|
|
61
|
+
.magritte-duration___ND1ei_1-1-0{
|
|
62
62
|
position:absolute;
|
|
63
63
|
right:16px;
|
|
64
64
|
bottom:16px;
|
|
@@ -69,7 +69,7 @@
|
|
|
69
69
|
backdrop-filter:blur(24px);
|
|
70
70
|
pointer-events:none;
|
|
71
71
|
}
|
|
72
|
-
.magritte-seek-indicator___VJQBC_1-0
|
|
72
|
+
.magritte-seek-indicator___VJQBC_1-1-0{
|
|
73
73
|
position:absolute;
|
|
74
74
|
top:50%;
|
|
75
75
|
display:flex;
|
|
@@ -78,25 +78,25 @@
|
|
|
78
78
|
transform:translateY(-50%);
|
|
79
79
|
pointer-events:none;
|
|
80
80
|
}
|
|
81
|
-
.magritte-seek-indicator-forward___9C5gD_1-0
|
|
81
|
+
.magritte-seek-indicator-forward___9C5gD_1-1-0{
|
|
82
82
|
right:40px;
|
|
83
83
|
}
|
|
84
|
-
.magritte-seek-indicator-backward___gIZ0E_1-0
|
|
84
|
+
.magritte-seek-indicator-backward___gIZ0E_1-1-0{
|
|
85
85
|
left:40px;
|
|
86
86
|
flex-direction:row-reverse;
|
|
87
87
|
--magritte-ui-video-seek-arrow-shift:16px;
|
|
88
88
|
}
|
|
89
|
-
.magritte-seek-arrows___Ql1eP_1-0
|
|
89
|
+
.magritte-seek-arrows___Ql1eP_1-1-0{
|
|
90
90
|
position:relative;
|
|
91
91
|
display:flex;
|
|
92
92
|
}
|
|
93
|
-
.magritte-seek-arrow-incoming___oZxww_1-0
|
|
93
|
+
.magritte-seek-arrow-incoming___oZxww_1-1-0{
|
|
94
94
|
position:absolute;
|
|
95
95
|
inset:0;
|
|
96
96
|
display:flex;
|
|
97
|
-
animation:magritte-seek-arrow-in___CB4-s_1-0
|
|
97
|
+
animation:magritte-seek-arrow-in___CB4-s_1-1-0 var(--magritte-semantic-animation-time-m-duration-v26-0-2) var(--magritte-semantic-animation-ease-base-timing-function-v26-0-2) both;
|
|
98
98
|
}
|
|
99
|
-
@keyframes magritte-seek-arrow-in___CB4-s_1-0
|
|
99
|
+
@keyframes magritte-seek-arrow-in___CB4-s_1-1-0{
|
|
100
100
|
from{
|
|
101
101
|
transform:translateX(var(--magritte-ui-video-seek-arrow-shift, -16px));
|
|
102
102
|
}
|
|
@@ -104,7 +104,7 @@
|
|
|
104
104
|
transform:translateX(0);
|
|
105
105
|
}
|
|
106
106
|
}
|
|
107
|
-
.magritte-boost-indicator___ujllx_1-0
|
|
107
|
+
.magritte-boost-indicator___ujllx_1-1-0{
|
|
108
108
|
position:absolute;
|
|
109
109
|
top:24px;
|
|
110
110
|
left:50%;
|
|
@@ -118,7 +118,7 @@
|
|
|
118
118
|
transform:translateX(-50%);
|
|
119
119
|
pointer-events:none;
|
|
120
120
|
}
|
|
121
|
-
.magritte-loader___qVu0P_1-0
|
|
121
|
+
.magritte-loader___qVu0P_1-1-0{
|
|
122
122
|
position:absolute;
|
|
123
123
|
top:50%;
|
|
124
124
|
left:50%;
|
|
@@ -126,7 +126,7 @@
|
|
|
126
126
|
display:flex;
|
|
127
127
|
pointer-events:none;
|
|
128
128
|
}
|
|
129
|
-
.magritte-error___Rm7uG_1-0
|
|
129
|
+
.magritte-error___Rm7uG_1-1-0{
|
|
130
130
|
position:absolute;
|
|
131
131
|
inset:0;
|
|
132
132
|
display:flex;
|
|
@@ -135,12 +135,15 @@
|
|
|
135
135
|
padding:16px;
|
|
136
136
|
overflow:auto;
|
|
137
137
|
}
|
|
138
|
-
.magritte-
|
|
139
|
-
|
|
138
|
+
.magritte-player-embedded___GNvRb_1-1-0 .magritte-error___Rm7uG_1-1-0{
|
|
139
|
+
touch-action:none;
|
|
140
|
+
}
|
|
141
|
+
.magritte-overlay-button-hidden___AoGFc_1-1-0,
|
|
142
|
+
.magritte-controls___pKoSN_1-1-0.magritte-controls-hidden___bePTD_1-1-0{
|
|
140
143
|
opacity:0;
|
|
141
144
|
pointer-events:none;
|
|
142
145
|
}
|
|
143
|
-
.magritte-controls___pKoSN_1-0
|
|
146
|
+
.magritte-controls___pKoSN_1-1-0{
|
|
144
147
|
display:flex;
|
|
145
148
|
flex-direction:column;
|
|
146
149
|
gap:4px;
|
|
@@ -148,52 +151,52 @@
|
|
|
148
151
|
pointer-events:auto;
|
|
149
152
|
transition:opacity var(--magritte-semantic-animation-time-m-duration-v26-0-2) var(--magritte-semantic-animation-ease-base-timing-function-v26-0-2);
|
|
150
153
|
}
|
|
151
|
-
.magritte-controls-mobile___tdKGT_1-0
|
|
154
|
+
.magritte-controls-mobile___tdKGT_1-1-0{
|
|
152
155
|
gap:6px;
|
|
153
156
|
padding:4px 16px 8px;
|
|
154
157
|
}
|
|
155
|
-
.magritte-controls-overlay___mRsJL_1-0
|
|
158
|
+
.magritte-controls-overlay___mRsJL_1-1-0{
|
|
156
159
|
position:absolute;
|
|
157
160
|
right:0;
|
|
158
161
|
bottom:0;
|
|
159
162
|
left:0;
|
|
160
163
|
}
|
|
161
|
-
.magritte-controls-row___2sdJg_1-0
|
|
164
|
+
.magritte-controls-row___2sdJg_1-1-0{
|
|
162
165
|
display:flex;
|
|
163
166
|
align-items:center;
|
|
164
167
|
justify-content:space-between;
|
|
165
168
|
gap:8px;
|
|
166
169
|
}
|
|
167
|
-
.magritte-controls-group-start___yY9ZA_1-0
|
|
168
|
-
.magritte-controls-group-end___ziIm8_1-0
|
|
170
|
+
.magritte-controls-group-start___yY9ZA_1-1-0,
|
|
171
|
+
.magritte-controls-group-end___ziIm8_1-1-0{
|
|
169
172
|
display:flex;
|
|
170
173
|
align-items:center;
|
|
171
174
|
min-width:0;
|
|
172
175
|
}
|
|
173
|
-
.magritte-controls-group-start___yY9ZA_1-0
|
|
176
|
+
.magritte-controls-group-start___yY9ZA_1-1-0{
|
|
174
177
|
gap:12px;
|
|
175
178
|
}
|
|
176
|
-
.magritte-controls-group-end___ziIm8_1-0
|
|
179
|
+
.magritte-controls-group-end___ziIm8_1-1-0{
|
|
177
180
|
gap:8px;
|
|
178
181
|
}
|
|
179
|
-
.magritte-controls-mobile___tdKGT_1-0
|
|
182
|
+
.magritte-controls-mobile___tdKGT_1-1-0 .magritte-controls-group-end___ziIm8_1-1-0{
|
|
180
183
|
gap:4px;
|
|
181
184
|
}
|
|
182
|
-
.magritte-control-pill___hK8Mv_1-0
|
|
183
|
-
.magritte-controls-time___e9zoz_1-0
|
|
184
|
-
.magritte-controls-volume___o4ajR_1-0
|
|
185
|
+
.magritte-control-pill___hK8Mv_1-1-0,
|
|
186
|
+
.magritte-controls-time___e9zoz_1-1-0,
|
|
187
|
+
.magritte-controls-volume___o4ajR_1-1-0{
|
|
185
188
|
display:flex;
|
|
186
189
|
align-items:center;
|
|
187
190
|
justify-content:center;
|
|
188
191
|
border-radius:999px;
|
|
189
192
|
backdrop-filter:blur(24px);
|
|
190
193
|
}
|
|
191
|
-
.magritte-control-pill-bare___lU9ev_1-0
|
|
194
|
+
.magritte-control-pill-bare___lU9ev_1-1-0{
|
|
192
195
|
backdrop-filter:none;
|
|
193
196
|
}
|
|
194
|
-
.magritte-control-button___VJ2Qr_1-0
|
|
195
|
-
.magritte-controls-time___e9zoz_1-0
|
|
196
|
-
.magritte-controls-volume___o4ajR_1-0
|
|
197
|
+
.magritte-control-button___VJ2Qr_1-1-0,
|
|
198
|
+
.magritte-controls-time___e9zoz_1-1-0,
|
|
199
|
+
.magritte-controls-volume___o4ajR_1-1-0{
|
|
197
200
|
box-sizing:border-box;
|
|
198
201
|
min-width:48px;
|
|
199
202
|
min-height:48px;
|
|
@@ -201,27 +204,27 @@
|
|
|
201
204
|
border-radius:999px;
|
|
202
205
|
background-color:var(--magritte-color-background-overlay-v26-0-2);
|
|
203
206
|
}
|
|
204
|
-
.magritte-control-button___VJ2Qr_1-0
|
|
207
|
+
.magritte-control-button___VJ2Qr_1-1-0{
|
|
205
208
|
display:flex;
|
|
206
209
|
align-items:center;
|
|
207
210
|
justify-content:center;
|
|
208
211
|
border-width:0;
|
|
209
212
|
cursor:pointer;
|
|
210
213
|
}
|
|
211
|
-
.magritte-control-button___VJ2Qr_1-0
|
|
214
|
+
.magritte-control-button___VJ2Qr_1-1-0.focus-visible{
|
|
212
215
|
outline:4px solid var(--magritte-color-stroke-state-focused-accessible-v26-0-2);
|
|
213
216
|
}
|
|
214
|
-
.magritte-controls-time___e9zoz_1-0
|
|
217
|
+
.magritte-controls-time___e9zoz_1-1-0{
|
|
215
218
|
padding:12px 16px;
|
|
216
219
|
white-space:nowrap;
|
|
217
220
|
}
|
|
218
|
-
.magritte-controls-mobile___tdKGT_1-0
|
|
221
|
+
.magritte-controls-mobile___tdKGT_1-1-0 .magritte-controls-time___e9zoz_1-1-0{
|
|
219
222
|
padding:12px;
|
|
220
223
|
}
|
|
221
|
-
.magritte-controls-volume___o4ajR_1-0
|
|
224
|
+
.magritte-controls-volume___o4ajR_1-1-0{
|
|
222
225
|
gap:6px;
|
|
223
226
|
}
|
|
224
|
-
.magritte-scrubber___-K3ik_1-0
|
|
227
|
+
.magritte-scrubber___-K3ik_1-1-0{
|
|
225
228
|
position:relative;
|
|
226
229
|
display:flex;
|
|
227
230
|
align-items:center;
|
|
@@ -232,32 +235,32 @@
|
|
|
232
235
|
--magritte-ui-video-scrubber-track-height:4px;
|
|
233
236
|
--magritte-ui-video-scrubber-thumb-size:8px;
|
|
234
237
|
}
|
|
235
|
-
.magritte-controls-mobile___tdKGT_1-0
|
|
238
|
+
.magritte-controls-mobile___tdKGT_1-1-0 .magritte-scrubber___-K3ik_1-1-0::before{
|
|
236
239
|
content:'';
|
|
237
240
|
position:absolute;
|
|
238
241
|
inset:calc(-1 * 20px) 0 calc(-1 * 6px);
|
|
239
242
|
}
|
|
240
|
-
.magritte-scrubber___-K3ik_1-0
|
|
243
|
+
.magritte-scrubber___-K3ik_1-1-0.focus-visible{
|
|
241
244
|
outline:4px solid var(--magritte-color-stroke-state-focused-accessible-v26-0-2);
|
|
242
245
|
border-radius:4px;
|
|
243
246
|
}
|
|
244
|
-
.magritte-scrubber___-K3ik_1-0
|
|
247
|
+
.magritte-scrubber___-K3ik_1-1-0[data-scrubbing]{
|
|
245
248
|
--magritte-ui-video-scrubber-track-height:6px;
|
|
246
249
|
--magritte-ui-video-scrubber-thumb-size:12px;
|
|
247
250
|
}
|
|
248
251
|
@media (min-width: 1020px){
|
|
249
|
-
body.magritte-old-layout .magritte-scrubber___-K3ik_1-0
|
|
252
|
+
body.magritte-old-layout .magritte-scrubber___-K3ik_1-1-0:hover{
|
|
250
253
|
--magritte-ui-video-scrubber-track-height:6px;
|
|
251
254
|
--magritte-ui-video-scrubber-thumb-size:12px;
|
|
252
255
|
}
|
|
253
256
|
}
|
|
254
257
|
@media (min-width: 1024px){
|
|
255
|
-
body:not(.magritte-old-layout) .magritte-scrubber___-K3ik_1-0
|
|
258
|
+
body:not(.magritte-old-layout) .magritte-scrubber___-K3ik_1-1-0:hover{
|
|
256
259
|
--magritte-ui-video-scrubber-track-height:6px;
|
|
257
260
|
--magritte-ui-video-scrubber-thumb-size:12px;
|
|
258
261
|
}
|
|
259
262
|
}
|
|
260
|
-
.magritte-scrubber-track___ki1zV_1-0
|
|
263
|
+
.magritte-scrubber-track___ki1zV_1-1-0{
|
|
261
264
|
position:relative;
|
|
262
265
|
flex-grow:1;
|
|
263
266
|
height:var(--magritte-ui-video-scrubber-track-height);
|
|
@@ -265,21 +268,21 @@
|
|
|
265
268
|
border-radius:999px;
|
|
266
269
|
background-color:var(--magritte-color-background-overlay-v26-0-2);
|
|
267
270
|
}
|
|
268
|
-
.magritte-scrubber-buffered___ufvLe_1-0
|
|
269
|
-
.magritte-scrubber-progress___ZIyew_1-0
|
|
271
|
+
.magritte-scrubber-buffered___ufvLe_1-1-0,
|
|
272
|
+
.magritte-scrubber-progress___ZIyew_1-1-0{
|
|
270
273
|
position:absolute;
|
|
271
274
|
inset:0;
|
|
272
275
|
transform-origin:left;
|
|
273
276
|
}
|
|
274
|
-
.magritte-scrubber-buffered___ufvLe_1-0
|
|
277
|
+
.magritte-scrubber-buffered___ufvLe_1-1-0{
|
|
275
278
|
background-color:var(--magritte-color-stroke-neutral-v26-0-2);
|
|
276
279
|
transform:scaleX(var(--magritte-ui-video-scrubber-buffered, 0));
|
|
277
280
|
}
|
|
278
|
-
.magritte-scrubber-progress___ZIyew_1-0
|
|
281
|
+
.magritte-scrubber-progress___ZIyew_1-1-0{
|
|
279
282
|
background-color:var(--magritte-color-background-accent-v26-0-2);
|
|
280
283
|
transform:scaleX(var(--magritte-ui-video-scrubber-progress, 0));
|
|
281
284
|
}
|
|
282
|
-
.magritte-scrubber-thumb___VXyPP_1-0
|
|
285
|
+
.magritte-scrubber-thumb___VXyPP_1-1-0{
|
|
283
286
|
position:absolute;
|
|
284
287
|
top:50%;
|
|
285
288
|
left:calc(var(--magritte-ui-video-scrubber-progress, 0) * 100%);
|
|
@@ -290,7 +293,7 @@
|
|
|
290
293
|
transform:translate(-50%, -50%);
|
|
291
294
|
pointer-events:none;
|
|
292
295
|
}
|
|
293
|
-
.magritte-scrubber-timecode___M-syA_1-0
|
|
296
|
+
.magritte-scrubber-timecode___M-syA_1-1-0{
|
|
294
297
|
position:absolute;
|
|
295
298
|
bottom:calc(100% + 8px);
|
|
296
299
|
left:calc(var(--magritte-ui-video-scrubber-timecode, 0) * 100%);
|
|
@@ -302,20 +305,20 @@
|
|
|
302
305
|
white-space:nowrap;
|
|
303
306
|
pointer-events:none;
|
|
304
307
|
}
|
|
305
|
-
.magritte-scrubber___-K3ik_1-0
|
|
308
|
+
.magritte-scrubber___-K3ik_1-1-0[data-scrubbing] .magritte-scrubber-timecode___M-syA_1-1-0{
|
|
306
309
|
display:flex;
|
|
307
310
|
}
|
|
308
311
|
@media (min-width: 1020px){
|
|
309
|
-
body.magritte-old-layout .magritte-scrubber___-K3ik_1-0
|
|
312
|
+
body.magritte-old-layout .magritte-scrubber___-K3ik_1-1-0:hover .magritte-scrubber-timecode___M-syA_1-1-0{
|
|
310
313
|
display:flex;
|
|
311
314
|
}
|
|
312
315
|
}
|
|
313
316
|
@media (min-width: 1024px){
|
|
314
|
-
body:not(.magritte-old-layout) .magritte-scrubber___-K3ik_1-0
|
|
317
|
+
body:not(.magritte-old-layout) .magritte-scrubber___-K3ik_1-1-0:hover .magritte-scrubber-timecode___M-syA_1-1-0{
|
|
315
318
|
display:flex;
|
|
316
319
|
}
|
|
317
320
|
}
|
|
318
|
-
.magritte-volume-slider___qE2P7_1-0
|
|
321
|
+
.magritte-volume-slider___qE2P7_1-1-0{
|
|
319
322
|
display:flex;
|
|
320
323
|
align-items:center;
|
|
321
324
|
width:64px;
|
|
@@ -324,25 +327,25 @@
|
|
|
324
327
|
touch-action:none;
|
|
325
328
|
outline:none;
|
|
326
329
|
}
|
|
327
|
-
.magritte-volume-slider___qE2P7_1-0
|
|
330
|
+
.magritte-volume-slider___qE2P7_1-1-0.focus-visible{
|
|
328
331
|
outline:4px solid var(--magritte-color-stroke-state-focused-accessible-v26-0-2);
|
|
329
332
|
border-radius:4px;
|
|
330
333
|
}
|
|
331
|
-
.magritte-volume-track___up8nd_1-0
|
|
334
|
+
.magritte-volume-track___up8nd_1-1-0{
|
|
332
335
|
position:relative;
|
|
333
336
|
flex-grow:1;
|
|
334
337
|
height:4px;
|
|
335
338
|
border-radius:999px;
|
|
336
339
|
background-color:var(--magritte-color-background-overlay-v26-0-2);
|
|
337
340
|
}
|
|
338
|
-
.magritte-volume-value___aUSuU_1-0
|
|
341
|
+
.magritte-volume-value___aUSuU_1-1-0{
|
|
339
342
|
position:relative;
|
|
340
343
|
width:calc(var(--magritte-ui-video-volume, 1) * 100%);
|
|
341
344
|
height:100%;
|
|
342
345
|
border-radius:999px;
|
|
343
346
|
background-color:var(--magritte-color-stroke-neutral-v26-0-2);
|
|
344
347
|
}
|
|
345
|
-
.magritte-volume-value___aUSuU_1-0
|
|
348
|
+
.magritte-volume-value___aUSuU_1-1-0::after{
|
|
346
349
|
content:'';
|
|
347
350
|
position:absolute;
|
|
348
351
|
top:50%;
|
package/index.js
CHANGED
|
@@ -11,7 +11,7 @@ import '@hh.ru/magritte-ui-icon/icon';
|
|
|
11
11
|
import '@hh.ru/magritte-ui-typography';
|
|
12
12
|
import './internal/ControlButton.js';
|
|
13
13
|
import '@hh.ru/magritte-ui-tooltip';
|
|
14
|
-
import './video-
|
|
14
|
+
import './video-CaC1atet.js';
|
|
15
15
|
import './internal/Scrubber.js';
|
|
16
16
|
import './internal/formatTime.js';
|
|
17
17
|
import './internal/useSliderPointer.js';
|
|
@@ -3,7 +3,7 @@ import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
|
|
|
3
3
|
import { useRef } from 'react';
|
|
4
4
|
import classnames from 'classnames';
|
|
5
5
|
import { TooltipHover } from '@hh.ru/magritte-ui-tooltip';
|
|
6
|
-
import { s as styles } from '../video-
|
|
6
|
+
import { s as styles } from '../video-CaC1atet.js';
|
|
7
7
|
|
|
8
8
|
const ControlButton = ({
|
|
9
9
|
control,
|
package/internal/Scrubber.js
CHANGED
|
@@ -6,7 +6,7 @@ import { Text } from '@hh.ru/magritte-ui-typography';
|
|
|
6
6
|
import { formatTime, formatDuration } from './formatTime.js';
|
|
7
7
|
import { useSliderPointer } from './useSliderPointer.js';
|
|
8
8
|
import { SEEK_STEP_SECONDS } from './useVideoHotkeys.js';
|
|
9
|
-
import { s as styles } from '../video-
|
|
9
|
+
import { s as styles } from '../video-CaC1atet.js';
|
|
10
10
|
import '@hh.ru/magritte-common-keyboard';
|
|
11
11
|
|
|
12
12
|
const KEYBOARD_SEEK_STEP = SEEK_STEP_SECONDS;
|
|
@@ -3,7 +3,7 @@ import { jsxs, jsx } from 'react/jsx-runtime';
|
|
|
3
3
|
import classnames from 'classnames';
|
|
4
4
|
import { ChevronRightOutlinedSize24, ChevronLeftOutlinedSize24 } from '@hh.ru/magritte-ui-icon/icon';
|
|
5
5
|
import { Text } from '@hh.ru/magritte-ui-typography';
|
|
6
|
-
import { s as styles } from '../video-
|
|
6
|
+
import { s as styles } from '../video-CaC1atet.js';
|
|
7
7
|
|
|
8
8
|
const SeekIndicator = ({ direction, seconds, count }) => {
|
|
9
9
|
const forward = direction > 0;
|
package/internal/VolumeSlider.js
CHANGED
|
@@ -3,7 +3,7 @@ import { jsx } from 'react/jsx-runtime';
|
|
|
3
3
|
import { useTranslation } from '@hh.ru/magritte-common-use-translation';
|
|
4
4
|
import { useVideoState } from './context.js';
|
|
5
5
|
import { useSliderPointer } from './useSliderPointer.js';
|
|
6
|
-
import { s as styles } from '../video-
|
|
6
|
+
import { s as styles } from '../video-CaC1atet.js';
|
|
7
7
|
import 'react';
|
|
8
8
|
|
|
9
9
|
const KEYBOARD_VOLUME_STEP = 0.1;
|
package/internal/context.d.ts
CHANGED
|
@@ -22,5 +22,10 @@ export declare const VideoPlayerContext: import("react").Context<boolean>;
|
|
|
22
22
|
*/
|
|
23
23
|
export interface VideoPlayerHost {
|
|
24
24
|
renderVideo: (video: ReactElement) => ReactNode;
|
|
25
|
+
/**
|
|
26
|
+
* Атрибуты кнопки повтора на экране ошибки: в ошибке тапы по плееру обрабатывает хост, а по ним он отличает
|
|
27
|
+
* нажатие на кнопку от тапа по видео
|
|
28
|
+
*/
|
|
29
|
+
retryButtonProps?: Record<`data-${string}`, string | boolean>;
|
|
25
30
|
}
|
|
26
31
|
export declare const VideoPlayerHostContext: import("react").Context<VideoPlayerHost | null>;
|
package/internal/context.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context.js","sources":["src/internal/context.ts"],"sourcesContent":["import { createContext, type ReactElement, type ReactNode, useContext, useSyncExternalStore } from 'react';\n\nimport { type VideoState, type VideoStore } from '@hh.ru/magritte-ui-video/internal/store';\n\nexport interface VideoContextValue {\n store: VideoStore;\n preview?: string;\n /** Длительность из пропсов — до загрузки метаданных */\n duration?: number;\n /** `false` — неинтерактивный режим: без кнопок, контролов, жестов и горячих клавиш */\n interactive: boolean;\n /** Плеер сообщает стору свою видимость во вьюпорте (автовоспроизведение, автопауза) */\n observeViewport: boolean;\n}\n\nexport const VideoContext = createContext<VideoContextValue | null>(null);\n\nexport const useVideoContext = (componentName: string): VideoContextValue => {\n const context = useContext(VideoContext);\n if (!context) {\n throw new Error(`${componentName} must be used within <Video>`);\n }\n return context;\n};\n\n/** Подписка на часть состояния: компонент перерендеривается, только когда она меняется */\nexport const useVideoState = <T>(store: VideoStore, selector: (state: VideoState) => T): T => {\n const getSnapshot = () => selector(store.getState());\n return useSyncExternalStore(store.subscribe, getSnapshot, getSnapshot);\n};\n\n/** Части видео внутри `Video.Player` (например, `Video.Controls`) раскладываются поверх видео */\nexport const VideoPlayerContext = createContext(false);\n\n/**\n * Встраивание `Video.Player` в другой компонент дизайн-системы (вьювер медиа): хост оборачивает `<video>` в свою\n * разметку (например, трансформацию зума), оверлеи плеера остаются без неё. Только для внутреннего использования\n */\nexport interface VideoPlayerHost {\n renderVideo: (video: ReactElement) => ReactNode;\n}\n\nexport const VideoPlayerHostContext = createContext<VideoPlayerHost | null>(null);\n"],"names":[],"mappings":";;AAea,MAAA,YAAA,GAAe,cAAwC,IAAI,EAAA;AAE3D,MAAA,eAAA,GAAkB,CAAC,aAA6C,KAAA;AACzE,EAAM,MAAA,OAAA,GAAU,WAAW,YAAY,CAAA,CAAA;AACvC,EAAA,IAAI,CAAC,OAAS,EAAA;AACV,IAAA,MAAM,IAAI,KAAA,CAAM,CAAG,EAAA,aAAa,CAA8B,4BAAA,CAAA,CAAA,CAAA;AAAA,GAClE;AACA,EAAO,OAAA,OAAA,CAAA;AACX,EAAA;AAGa,MAAA,aAAA,GAAgB,CAAI,KAAA,EAAmB,QAA0C,KAAA;AAC1F,EAAA,MAAM,WAAc,GAAA,MAAM,QAAS,CAAA,KAAA,CAAM,UAAU,CAAA,CAAA;AACnD,EAAA,OAAO,oBAAqB,CAAA,KAAA,CAAM,SAAW,EAAA,WAAA,EAAa,WAAW,CAAA,CAAA;AACzE,EAAA;AAGa,MAAA,kBAAA,GAAqB,cAAc,KAAK,EAAA;
|
|
1
|
+
{"version":3,"file":"context.js","sources":["src/internal/context.ts"],"sourcesContent":["import { createContext, type ReactElement, type ReactNode, useContext, useSyncExternalStore } from 'react';\n\nimport { type VideoState, type VideoStore } from '@hh.ru/magritte-ui-video/internal/store';\n\nexport interface VideoContextValue {\n store: VideoStore;\n preview?: string;\n /** Длительность из пропсов — до загрузки метаданных */\n duration?: number;\n /** `false` — неинтерактивный режим: без кнопок, контролов, жестов и горячих клавиш */\n interactive: boolean;\n /** Плеер сообщает стору свою видимость во вьюпорте (автовоспроизведение, автопауза) */\n observeViewport: boolean;\n}\n\nexport const VideoContext = createContext<VideoContextValue | null>(null);\n\nexport const useVideoContext = (componentName: string): VideoContextValue => {\n const context = useContext(VideoContext);\n if (!context) {\n throw new Error(`${componentName} must be used within <Video>`);\n }\n return context;\n};\n\n/** Подписка на часть состояния: компонент перерендеривается, только когда она меняется */\nexport const useVideoState = <T>(store: VideoStore, selector: (state: VideoState) => T): T => {\n const getSnapshot = () => selector(store.getState());\n return useSyncExternalStore(store.subscribe, getSnapshot, getSnapshot);\n};\n\n/** Части видео внутри `Video.Player` (например, `Video.Controls`) раскладываются поверх видео */\nexport const VideoPlayerContext = createContext(false);\n\n/**\n * Встраивание `Video.Player` в другой компонент дизайн-системы (вьювер медиа): хост оборачивает `<video>` в свою\n * разметку (например, трансформацию зума), оверлеи плеера остаются без неё. Только для внутреннего использования\n */\nexport interface VideoPlayerHost {\n renderVideo: (video: ReactElement) => ReactNode;\n /**\n * Атрибуты кнопки повтора на экране ошибки: в ошибке тапы по плееру обрабатывает хост, а по ним он отличает\n * нажатие на кнопку от тапа по видео\n */\n retryButtonProps?: Record<`data-${string}`, string | boolean>;\n}\n\nexport const VideoPlayerHostContext = createContext<VideoPlayerHost | null>(null);\n"],"names":[],"mappings":";;AAea,MAAA,YAAA,GAAe,cAAwC,IAAI,EAAA;AAE3D,MAAA,eAAA,GAAkB,CAAC,aAA6C,KAAA;AACzE,EAAM,MAAA,OAAA,GAAU,WAAW,YAAY,CAAA,CAAA;AACvC,EAAA,IAAI,CAAC,OAAS,EAAA;AACV,IAAA,MAAM,IAAI,KAAA,CAAM,CAAG,EAAA,aAAa,CAA8B,4BAAA,CAAA,CAAA,CAAA;AAAA,GAClE;AACA,EAAO,OAAA,OAAA,CAAA;AACX,EAAA;AAGa,MAAA,aAAA,GAAgB,CAAI,KAAA,EAAmB,QAA0C,KAAA;AAC1F,EAAA,MAAM,WAAc,GAAA,MAAM,QAAS,CAAA,KAAA,CAAM,UAAU,CAAA,CAAA;AACnD,EAAA,OAAO,oBAAqB,CAAA,KAAA,CAAM,SAAW,EAAA,WAAA,EAAa,WAAW,CAAA,CAAA;AACzE,EAAA;AAGa,MAAA,kBAAA,GAAqB,cAAc,KAAK,EAAA;AAexC,MAAA,sBAAA,GAAyB,cAAsC,IAAI;;;;"}
|
package/internal/store.js
CHANGED
|
@@ -330,6 +330,11 @@ const createVideoStore = ({
|
|
|
330
330
|
([name, handler]) => add ? element.addEventListener(name, handler) : element.removeEventListener(name, handler)
|
|
331
331
|
);
|
|
332
332
|
};
|
|
333
|
+
const restoreRate = () => {
|
|
334
|
+
if (video) {
|
|
335
|
+
video.playbackRate = state.rate;
|
|
336
|
+
}
|
|
337
|
+
};
|
|
333
338
|
const applySource = () => {
|
|
334
339
|
if (!video) {
|
|
335
340
|
return;
|
|
@@ -346,6 +351,7 @@ const createVideoStore = ({
|
|
|
346
351
|
}
|
|
347
352
|
}
|
|
348
353
|
});
|
|
354
|
+
restoreRate();
|
|
349
355
|
return;
|
|
350
356
|
}
|
|
351
357
|
const url = pickSource(video, source);
|
|
@@ -355,6 +361,7 @@ const createVideoStore = ({
|
|
|
355
361
|
video.removeAttribute("src");
|
|
356
362
|
}
|
|
357
363
|
video.load();
|
|
364
|
+
restoreRate();
|
|
358
365
|
};
|
|
359
366
|
const resetState = () => {
|
|
360
367
|
endBoost();
|
|
@@ -414,7 +421,6 @@ const createVideoStore = ({
|
|
|
414
421
|
video.volume = volume;
|
|
415
422
|
video.loop = getOptions().loop || !getOptions().interactive;
|
|
416
423
|
applySource();
|
|
417
|
-
video.playbackRate = state.rate;
|
|
418
424
|
tryAutoPlay();
|
|
419
425
|
},
|
|
420
426
|
getVideoElement: () => video,
|
package/internal/store.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store.js","sources":["src/internal/store.ts"],"sourcesContent":["import {\n type VideoAttachMedia,\n type VideoProps,\n type VideoSource,\n type VideoStatus,\n} from '@hh.ru/magritte-ui-video/types';\n\nexport interface VideoState {\n status: VideoStatus;\n /** Воспроизведение запущено, но видео ждёт данные */\n waiting: boolean;\n /**\n * Повторная попытка после ошибки: до начала воспроизведения видео и превью не показываются — лоадер на тёмном\n * фоне, а не мелькание превью перед новой ошибкой\n */\n retrying: boolean;\n /** Длительность из метаданных; `null`, пока неизвестна или бесконечна (live) */\n duration: number | null;\n /** Натуральный размер видео из метаданных */\n size: { width: number; height: number } | null;\n /** Звук выключен */\n muted: boolean;\n /** Громкость от 0 до 1 */\n volume: number;\n /** Скорость воспроизведения */\n rate: number;\n /** Видимость контролов: прячутся после бездействия во время воспроизведения */\n controlsVisible: boolean;\n /** Плеер развёрнут на весь экран */\n fullscreen: boolean;\n /** Куда `Video.Controls` переносятся порталом вне fullscreen; `null` — остаются на месте */\n controlsContainer: HTMLElement | null;\n /** Ускорение удержанием: видео играет на 2x, выбранная скорость (`rate`) не меняется */\n boosted: boolean;\n /** Куда переносится индикатор ускорения вне fullscreen; `null` — вверху плеера */\n indicatorContainer: HTMLElement | null;\n}\n\n/**\n * Исключение из правил владельца видимости контролов: `shown` — показать и не прятать (фокус с клавиатуры в контролах,\n * перетаскивание бегунка), `hidden` — спрятать и не показывать от активности (ускорение удержанием на desktop),\n * `null` — исключений нет\n */\nexport type VideoControlsPin = 'shown' | 'hidden' | null;\n\n/**\n * Внешний владелец видимости контролов (тулбары вьювера медиа). Пока он подключён, контролы показываются и прячутся\n * только по нему: собственного таймера у плеера нет, активность и тапы по видео передаются ему\n */\nexport interface VideoControlsVisibilityHost {\n isVisible: () => boolean;\n subscribe: (listener: (visible: boolean) => void) => VoidFunction;\n /** Активность пользователя в плеере: движение мыши, нажатия, горячие клавиши */\n notifyActivity: VoidFunction;\n /** Тап по видео (mobile) */\n toggle: VoidFunction;\n setPin: (pin: VideoControlsPin) => void;\n}\n\nexport interface VideoTime {\n current: number;\n duration: number;\n /** Конец загруженного фрагмента, в котором находится текущая позиция */\n buffered: number;\n /**\n * Позиция, с которой началось воспроизведение текущего источника. Для live (бесконечная длительность)\n * прошедшее время считается от неё: у live HLS `currentTime` идёт от начала окна плейлиста\n */\n origin: number;\n}\n\nexport interface VideoSourceOptions {\n src?: string;\n sources?: VideoSource[];\n}\n\ntype VideoCallbacks = Pick<VideoProps, 'onPlay' | 'onPause' | 'onEnded' | 'onError'>;\n\n/** Режимы воспроизведения из пропсов `Video`; `interactive={false}` включает autoPlay и loop */\nexport interface VideoPlaybackOptions {\n autoPlay: boolean;\n autoPause: boolean;\n loop: boolean;\n interactive: boolean;\n}\n\nexport interface VideoStoreOptions extends VideoSourceOptions {\n /** Актуальные колбэки и attachMedia читаются в момент события — без пересоздания стора */\n getCallbacks: () => VideoCallbacks & { attachMedia?: VideoAttachMedia };\n /** Актуальные режимы воспроизведения; после их смены стор надо уведомить через `syncOptions` */\n getOptions: () => VideoPlaybackOptions;\n /** Звук и громкость на старте */\n defaultMuted?: boolean;\n defaultVolume?: number;\n}\n\nexport interface VideoStore {\n getState: () => VideoState;\n /** Подписка на изменения состояния (для `useSyncExternalStore`) */\n subscribe: (listener: VoidFunction) => VoidFunction;\n getTime: () => VideoTime;\n /** Подписка на время: каждый кадр во время воспроизведения, минуя React */\n subscribeTime: (listener: (time: VideoTime) => void) => VoidFunction;\n /** Callback ref для `<video>` — единственный способ привязать элемент к стору */\n attach: (element: HTMLVideoElement | null) => void;\n getVideoElement: () => HTMLVideoElement | null;\n /** Смена источника: сбрасывает состояние в `idle` */\n setSource: (source: VideoSourceOptions) => void;\n play: VoidFunction;\n pause: VoidFunction;\n seek: (seconds: number) => void;\n /** Перемотка относительно текущей позиции */\n seekBy: (seconds: number) => void;\n /**\n * Видимость плеера во вьюпорте (видно не меньше 10%): по ней работают автовоспроизведение и автопауза.\n * `null` — неизвестно (плеер размонтирован)\n */\n setVisible: (visible: boolean | null) => void;\n /** Режимы воспроизведения из пропсов изменились */\n syncOptions: VoidFunction;\n /** Повторная загрузка после ошибки с запуском воспроизведения */\n retry: VoidFunction;\n /** play, если видео на паузе, закончилось или ещё не запускалось; иначе pause */\n toggle: VoidFunction;\n setMuted: (muted: boolean) => void;\n /** Громкость от 0 до 1. Ненулевая громкость включает звук, нулевая — выключает */\n setVolume: (volume: number) => void;\n /** Следующая скорость из ряда 1x → 1.5x → 2x → 1x */\n cycleRate: VoidFunction;\n /** Взаимодействие с плеером: показывает контролы и перезапускает таймер автоскрытия */\n notifyActivity: VoidFunction;\n /** Тап по видео на mobile: показать или спрятать контролы */\n toggleControls: VoidFunction;\n /** Прятать контролы по бездействию и на паузе, а не только во время воспроизведения (mobile) */\n setHideWhenPaused: (hide: boolean) => void;\n /** Пока удержание активно (фокус внутри контролов, перетаскивание ползунка), контролы не прячутся */\n holdControls: (hold: boolean) => void;\n /** Подключить внешнего владельца видимости контролов; `null` — плеер снова управляет ими сам */\n setControlsVisibilityHost: (host: VideoControlsVisibilityHost | null) => void;\n /** Callback ref для корня `Video.Player` — элемента, который разворачивается на весь экран */\n attachRoot: (element: HTMLElement | null) => void;\n getRoot: () => HTMLElement | null;\n toggleFullscreen: VoidFunction;\n /** Контейнер для `Video.Controls` вне fullscreen (например, тулбар вьювера); `null` — контролы на месте */\n setControlsContainer: (element: HTMLElement | null) => void;\n /** Контейнер для индикатора ускорения вне fullscreen (например, под шапкой вьювера); `null` — вверху плеера */\n setIndicatorContainer: (element: HTMLElement | null) => void;\n /**\n * Ускорение удержанием (палец или кнопка мыши на видео): только во время воспроизведения и если скорость ещё\n * не 2x. `hideControls` — спрятать контролы на это время (desktop). Возвращает, включилось ли ускорение\n */\n setBoost: (active: boolean, options?: { hideControls?: boolean }) => boolean;\n}\n\n/** Ряд скоростей воспроизведения */\nexport const PLAYBACK_RATES = [1, 1.5, 2];\n\n/**\n * Событие на document: видео начало играть со звуком — остальные видео со звуком встают на паузу.\n * Через document, а не общий модуль: работает и между разными копиями пакета на странице\n */\nconst AUDIBLE_EVENT = 'magritte-video-audible';\n\n/** Скорость ускорения удержанием */\nexport const BOOST_RATE = 2;\n\n/** Задержка автоскрытия контролов по спеке */\nexport const CONTROLS_HIDE_DELAY_MS = 4000;\n\n/** iPhone: Fullscreen API для элементов нет, есть только нативный полноэкранный плеер */\ntype WebkitVideoElement = HTMLVideoElement & { webkitEnterFullscreen?: VoidFunction };\n\nconst INITIAL_STATE: VideoState = {\n status: 'idle',\n waiting: false,\n retrying: false,\n duration: null,\n size: null,\n muted: false,\n volume: 1,\n rate: 1,\n controlsVisible: true,\n fullscreen: false,\n controlsContainer: null,\n boosted: false,\n indicatorContainer: null,\n};\n\n/** Состояние, которое переживает смену источника: настройки пользователя, fullscreen и место контролов */\nconst pickPreserved = ({\n muted,\n volume,\n rate,\n fullscreen,\n controlsContainer,\n indicatorContainer,\n}: VideoState): Partial<VideoState> => ({\n muted,\n volume,\n rate,\n fullscreen,\n controlsContainer,\n indicatorContainer,\n});\n\nconst getSourceKey = ({ src, sources }: VideoSourceOptions): string =>\n JSON.stringify([src ?? null, sources?.map(({ src, type }) => [src, type ?? null]) ?? null]);\n\n/** Как браузер выбирает `<source>`: первый, тип которого поддерживается (или без типа) */\nconst pickSource = (video: HTMLVideoElement, { src, sources }: VideoSourceOptions): string | undefined => {\n const playable = sources?.find(({ type }) => !type || video.canPlayType(type) !== '');\n return playable?.src ?? src;\n};\n\nconst toDuration = (value: number): number | null => (Number.isFinite(value) && value > 0 ? value : null);\n\nconst clampVolume = (volume: number): number => Math.min(Math.max(volume, 0), 1);\n\nexport const createVideoStore = ({\n getCallbacks,\n getOptions,\n defaultMuted = false,\n defaultVolume = 1,\n ...initialSource\n}: VideoStoreOptions): VideoStore => {\n const isAutoPlay = (): boolean => {\n const { autoPlay, interactive } = getOptions();\n return autoPlay || !interactive;\n };\n\n let state: VideoState = {\n ...INITIAL_STATE,\n // автовоспроизведение и неинтерактивный режим — без звука\n muted: defaultMuted || isAutoPlay(),\n volume: Number.isFinite(defaultVolume) ? clampVolume(defaultVolume) : 1,\n };\n let source: VideoSourceOptions = initialSource;\n let sourceKey = getSourceKey(initialSource);\n let video: HTMLVideoElement | null = null;\n let detachMedia: VoidFunction | null = null;\n let rafId: number | null = null;\n /** Воспроизведение запускали хотя бы раз для текущего источника */\n let started = false;\n /** Позиция первого playing текущего источника — точка отсчёта для live */\n let origin: number | null = null;\n let root: HTMLElement | null = null;\n let hideTimer: ReturnType<typeof setTimeout> | null = null;\n let holds = 0;\n /** Прятать контролы и на паузе (mobile: на паузе по центру видео есть кнопка воспроизведения) */\n let hideWhenPaused = false;\n /** Внешний владелец видимости контролов */\n let host: VideoControlsVisibilityHost | null = null;\n let unsubscribeHost: VoidFunction | null = null;\n /** Последнее исключение, переданное владельцу */\n let hostPin: VideoControlsPin = null;\n /** Ускорение прячет контролы (desktop) */\n let boostHidesControls = false;\n /** Видимость во вьюпорте; `null` — неизвестна */\n let visible: boolean | null = null;\n /** Видео поставила на паузу автопауза, а не пользователь: автовоспроизведение может его продолжить */\n let pausedByViewport = false;\n /** Пользователь сам менял звук: автовоспроизведение больше его не выключает */\n let soundChangedByUser = false;\n /** Маркер своего события AUDIBLE_EVENT */\n const audibleToken = {};\n\n const listeners = new Set<VoidFunction>();\n const timeListeners = new Set<(time: VideoTime) => void>();\n\n const getControlsPin = (): VideoControlsPin => {\n if (state.boosted && boostHidesControls) {\n return 'hidden';\n }\n return holds > 0 ? 'shown' : null;\n };\n\n /** Передаёт владельцу видимости исключение, если оно изменилось */\n const syncControlsPin = (): void => {\n const pin = getControlsPin();\n if (host && pin !== hostPin) {\n hostPin = pin;\n host.setPin(pin);\n }\n };\n\n const setState = (patch: Partial<VideoState>): void => {\n const keys = Object.keys(patch) as (keyof VideoState)[];\n if (keys.every((key) => patch[key] === state[key])) {\n return;\n }\n state = { ...state, ...patch };\n listeners.forEach((listener) => listener());\n syncControlsPin();\n };\n\n const getTime = (): VideoTime => {\n if (!video) {\n return { current: 0, duration: state.duration ?? 0, buffered: 0, origin: origin ?? 0 };\n }\n let buffered = 0;\n for (let i = 0; i < video.buffered.length; i += 1) {\n if (video.buffered.start(i) <= video.currentTime) {\n buffered = Math.max(buffered, video.buffered.end(i));\n }\n }\n return {\n current: video.currentTime,\n duration: toDuration(video.duration) ?? 0,\n buffered,\n origin: origin ?? 0,\n };\n };\n\n const emitTime = (): void => {\n if (timeListeners.size === 0) {\n return;\n }\n const time = getTime();\n timeListeners.forEach((listener) => listener(time));\n };\n\n const stopTicking = (): void => {\n if (rafId !== null) {\n cancelAnimationFrame(rafId);\n rafId = null;\n }\n };\n\n const tick = (): void => {\n emitTime();\n rafId = requestAnimationFrame(tick);\n };\n\n const startTicking = (): void => {\n if (rafId === null && timeListeners.size > 0) {\n rafId = requestAnimationFrame(tick);\n }\n };\n\n const clearHideTimer = (): void => {\n if (hideTimer !== null) {\n clearTimeout(hideTimer);\n hideTimer = null;\n }\n };\n\n /** Контролы прячутся во время воспроизведения, а с `hideWhenPaused` — и на паузе; после окончания видны */\n const canHide = (): boolean =>\n holds === 0 && (state.status === 'playing' || (hideWhenPaused && state.status === 'paused'));\n\n const scheduleHide = (): void => {\n clearHideTimer();\n // с внешним владельцем видимости своего таймера нет\n if (host || !canHide()) {\n return;\n }\n hideTimer = setTimeout(() => {\n hideTimer = null;\n if (canHide()) {\n setState({ controlsVisible: false });\n }\n }, CONTROLS_HIDE_DELAY_MS);\n };\n\n const showControls = (): void => {\n if (host) {\n host.notifyActivity();\n return;\n }\n setState({ controlsVisible: true });\n scheduleHide();\n };\n\n /** Лоадер — только при первом запуске и повторе; снятие с паузы обходится флагом waiting */\n const enterLoading = (): void => {\n if (state.status === 'idle' || state.status === 'ended') {\n setState({ status: 'loading' });\n }\n };\n\n /** Перемотка назад после окончания: видео больше не закончено — это пауза (play вместо «повторить») */\n const leaveEnded = (): void => {\n if (state.status === 'ended' && video && !video.ended) {\n setState({ status: 'paused' });\n }\n };\n\n /** Ускорение заканчивается вместе с воспроизведением: пауза, конец, ошибка, смена источника */\n const endBoost = (): void => {\n if (!state.boosted) {\n return;\n }\n boostHidesControls = false;\n setState({ boosted: false });\n if (video) {\n video.playbackRate = state.rate;\n }\n };\n\n const fail = (error: unknown): void => {\n endBoost();\n stopTicking();\n clearHideTimer();\n setState({ status: 'error', waiting: false, retrying: false });\n getCallbacks().onError?.(error);\n };\n\n const isAudible = (): boolean => !!video && !video.paused && !video.muted && video.volume > 0;\n\n /** Видео играет со звуком — остальные видео со звуком встают на паузу */\n const claimAudio = (): void => {\n if (isAudible()) {\n document.dispatchEvent(new CustomEvent(AUDIBLE_EVENT, { detail: audibleToken }));\n }\n };\n\n const onAudibleElsewhere = (event: Event): void => {\n if ((event as CustomEvent).detail !== audibleToken && isAudible()) {\n video?.pause();\n }\n };\n\n const play = (): void => {\n if (!video) {\n return;\n }\n pausedByViewport = false;\n started = true;\n enterLoading();\n if (video.ended) {\n video.currentTime = 0;\n }\n const element = video;\n // play() может быть отклонён (политика autoplay, источник не загрузился)\n // в старых браузерах может вернуть не Promise, а undefined\n Promise.resolve(element.play()).catch(() => {\n if (video !== element || state.status === 'error' || !element.paused) {\n return;\n }\n if (state.status === 'loading') {\n started = element.currentTime > 0;\n setState({ status: started ? 'paused' : 'idle', waiting: false, retrying: false });\n }\n });\n };\n\n /** Автовоспроизведение: видео ещё не запускали или его остановила автопауза, и плеер во вьюпорте */\n const tryAutoPlay = (): void => {\n // видимость сообщает Video.Player; пока она неизвестна, не запускаем — плеер может быть за пределами экрана\n if (!video || visible !== true || !isAutoPlay()) {\n return;\n }\n if (state.status !== 'idle' && !(state.status === 'paused' && pausedByViewport)) {\n return;\n }\n pausedByViewport = false;\n // звук выключен, пока пользователь не включит его сам; неинтерактивное видео — всегда без звука\n if (!soundChangedByUser || !getOptions().interactive) {\n video.muted = true;\n }\n play();\n };\n\n const autoPause = (): void => {\n if (!video || !getOptions().autoPause || video.paused) {\n return;\n }\n video.pause();\n pausedByViewport = true;\n };\n\n const handlers: Record<string, VoidFunction> = {\n loadedmetadata: () => {\n if (!video) {\n return;\n }\n setState({\n duration: toDuration(video.duration),\n size:\n video.videoWidth && video.videoHeight\n ? { width: video.videoWidth, height: video.videoHeight }\n : null,\n });\n emitTime();\n },\n durationchange: () => {\n video && setState({ duration: toDuration(video.duration) });\n },\n play: () => {\n // воспроизведение могло начаться не через store.play (например, нативно)\n started = true;\n enterLoading();\n claimAudio();\n getCallbacks().onPlay?.();\n },\n playing: () => {\n if (origin === null && video) {\n origin = video.currentTime;\n }\n const wasPlaying = state.status === 'playing';\n setState({ status: 'playing', waiting: false, retrying: false });\n startTicking();\n if (!wasPlaying) {\n scheduleHide();\n }\n },\n waiting: () => setState({ waiting: true }),\n canplay: () => setState({ waiting: false }),\n pause: () => {\n endBoost();\n stopTicking();\n emitTime();\n // pause приходит и перед ended, и при ошибке — эти состояния главнее\n if (!video || video.ended || state.status === 'error') {\n return;\n }\n setState({ status: started ? 'paused' : 'idle', waiting: false, retrying: false });\n showControls();\n getCallbacks().onPause?.();\n },\n ended: () => {\n endBoost();\n stopTicking();\n emitTime();\n clearHideTimer();\n setState({ status: 'ended', waiting: false });\n // с внешним владельцем видимость — по его правилам\n if (!host) {\n setState({ controlsVisible: true });\n }\n getCallbacks().onEnded?.();\n },\n error: () => fail(video?.error ?? new Error('Video loading error')),\n volumechange: () => {\n if (video) {\n setState({ muted: video.muted, volume: video.volume });\n claimAudio();\n }\n },\n ratechange: () => {\n // ускорение удержанием — не выбор пользователя: выбранная скорость остаётся прежней\n if (video && !state.boosted) {\n setState({ rate: video.playbackRate });\n }\n },\n webkitbeginfullscreen: () => setState({ fullscreen: true }),\n webkitendfullscreen: () => setState({ fullscreen: false }),\n progress: emitTime,\n seeked: () => {\n leaveEnded();\n emitTime();\n },\n timeupdate: () => {\n // во время воспроизведения время двигает rAF\n if (state.status !== 'playing') {\n emitTime();\n }\n },\n };\n\n const listen = (element: HTMLVideoElement, add: boolean): void => {\n Object.entries(handlers).forEach(([name, handler]) =>\n add ? element.addEventListener(name, handler) : element.removeEventListener(name, handler)\n );\n };\n\n const applySource = (): void => {\n if (!video) {\n return;\n }\n detachMedia?.();\n detachMedia = null;\n const { attachMedia } = getCallbacks();\n if (attachMedia) {\n const element = video;\n detachMedia = attachMedia(element, {\n onError: (error) => {\n // ошибка от уже отключённой библиотеки не должна ломать новый источник\n if (video === element) {\n fail(error);\n }\n },\n });\n return;\n }\n const url = pickSource(video, source);\n if (url) {\n video.src = url;\n } else {\n video.removeAttribute('src');\n }\n video.load();\n };\n\n const resetState = (): void => {\n endBoost();\n stopTicking();\n clearHideTimer();\n started = false;\n origin = null;\n pausedByViewport = false;\n state = { ...INITIAL_STATE, ...pickPreserved(state) };\n listeners.forEach((listener) => listener());\n };\n\n const onFullscreenChange = (): void => {\n setState({ fullscreen: !!root && document.fullscreenElement === root });\n };\n\n const store: VideoStore = {\n getState: () => state,\n subscribe: (listener) => {\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n };\n },\n getTime,\n subscribeTime: (listener) => {\n timeListeners.add(listener);\n listener(getTime());\n if (state.status === 'playing') {\n startTicking();\n }\n return () => {\n timeListeners.delete(listener);\n if (timeListeners.size === 0) {\n stopTicking();\n }\n };\n },\n attach: (element) => {\n if (video === element) {\n return;\n }\n // ускорение привязано к удержанию на этом элементе: со сменой элемента оно не переживает\n endBoost();\n if (video) {\n listen(video, false);\n document.removeEventListener(AUDIBLE_EVENT, onAudibleElsewhere);\n detachMedia?.();\n detachMedia = null;\n stopTicking();\n }\n video = element;\n if (!video) {\n return;\n }\n listen(video, true);\n document.addEventListener(AUDIBLE_EVENT, onAudibleElsewhere);\n // настройки пользователя переживают смену элемента. Значения берём до присваивания: volumechange\n // от первого из них обновляет стор значениями элемента\n const { muted, volume } = state;\n video.muted = muted;\n video.volume = volume;\n video.loop = getOptions().loop || !getOptions().interactive;\n applySource();\n video.playbackRate = state.rate;\n tryAutoPlay();\n },\n getVideoElement: () => video,\n setSource: (nextSource) => {\n const nextKey = getSourceKey(nextSource);\n if (nextKey === sourceKey) {\n return;\n }\n source = nextSource;\n sourceKey = nextKey;\n resetState();\n applySource();\n tryAutoPlay();\n },\n play,\n pause: () => {\n pausedByViewport = false;\n video?.pause();\n },\n seek: (seconds) => {\n if (!video) {\n return;\n }\n const duration = toDuration(video.duration);\n video.currentTime = Math.max(0, duration === null ? seconds : Math.min(seconds, duration));\n leaveEnded();\n emitTime();\n },\n seekBy: (seconds) => {\n if (video) {\n store.seek(video.currentTime + seconds);\n }\n },\n setVisible: (nextVisible) => {\n if (visible === nextVisible) {\n return;\n }\n visible = nextVisible;\n if (visible) {\n tryAutoPlay();\n } else if (visible === false) {\n autoPause();\n }\n },\n syncOptions: () => {\n if (!video) {\n return;\n }\n const { loop, interactive } = getOptions();\n video.loop = loop || !interactive;\n if (!interactive) {\n video.muted = true;\n }\n tryAutoPlay();\n },\n retry: () => {\n if (!video) {\n return;\n }\n resetState();\n setState({ retrying: true });\n applySource();\n store.play();\n },\n toggle: () => {\n if (!video) {\n return;\n }\n if (state.status === 'playing' || (state.status === 'loading' && !video.paused)) {\n store.pause();\n return;\n }\n store.play();\n },\n setMuted: (muted) => {\n if (video) {\n soundChangedByUser = true;\n video.muted = muted;\n }\n },\n setVolume: (volume) => {\n if (!video) {\n return;\n }\n soundChangedByUser = true;\n const next = clampVolume(volume);\n video.volume = next;\n video.muted = next === 0;\n },\n cycleRate: () => {\n if (!video) {\n return;\n }\n const index = PLAYBACK_RATES.indexOf(state.rate);\n video.playbackRate = PLAYBACK_RATES[(index + 1) % PLAYBACK_RATES.length];\n },\n notifyActivity: showControls,\n toggleControls: () => {\n if (host) {\n host.toggle();\n return;\n }\n if (state.controlsVisible && canHide()) {\n clearHideTimer();\n setState({ controlsVisible: false });\n return;\n }\n showControls();\n },\n setHideWhenPaused: (hide) => {\n hideWhenPaused = hide;\n if (state.controlsVisible) {\n scheduleHide();\n }\n },\n holdControls: (hold) => {\n holds = Math.max(0, holds + (hold ? 1 : -1));\n if (host) {\n syncControlsPin();\n return;\n }\n if (holds > 0) {\n clearHideTimer();\n setState({ controlsVisible: true });\n } else {\n scheduleHide();\n }\n },\n setControlsVisibilityHost: (nextHost) => {\n if (host === nextHost) {\n return;\n }\n unsubscribeHost?.();\n unsubscribeHost = null;\n if (host && hostPin !== null) {\n host.setPin(null);\n }\n hostPin = null;\n host = nextHost;\n clearHideTimer();\n if (!host) {\n showControls();\n return;\n }\n unsubscribeHost = host.subscribe((visible) => setState({ controlsVisible: visible }));\n setState({ controlsVisible: host.isVisible() });\n syncControlsPin();\n },\n attachRoot: (element) => {\n if (root === element) {\n return;\n }\n if (root) {\n document.removeEventListener('fullscreenchange', onFullscreenChange);\n if (document.fullscreenElement === root) {\n void document.exitFullscreen();\n }\n }\n root = element;\n if (root) {\n document.addEventListener('fullscreenchange', onFullscreenChange);\n } else {\n clearHideTimer();\n }\n },\n getRoot: () => root,\n toggleFullscreen: () => {\n if (root && document.fullscreenElement === root) {\n void document.exitFullscreen();\n return;\n }\n if (root && document.fullscreenEnabled && typeof root.requestFullscreen === 'function') {\n root.requestFullscreen().catch(() => {});\n return;\n }\n // iPhone: нативный плеер\n const webkitVideo: WebkitVideoElement | null = video;\n webkitVideo?.webkitEnterFullscreen?.();\n },\n setControlsContainer: (element) => setState({ controlsContainer: element }),\n setIndicatorContainer: (element) => setState({ indicatorContainer: element }),\n setBoost: (active, { hideControls = false } = {}) => {\n if (!active) {\n endBoost();\n return false;\n }\n if (!video || state.boosted || state.status !== 'playing' || state.rate === BOOST_RATE) {\n return false;\n }\n if (hideControls) {\n clearHideTimer();\n boostHidesControls = true;\n setState(host ? { boosted: true } : { boosted: true, controlsVisible: false });\n } else {\n setState({ boosted: true });\n }\n video.playbackRate = BOOST_RATE;\n return true;\n },\n };\n\n return store;\n};\n"],"names":["src","visible"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"store.js","sources":["src/internal/store.ts"],"sourcesContent":["import {\n type VideoAttachMedia,\n type VideoProps,\n type VideoSource,\n type VideoStatus,\n} from '@hh.ru/magritte-ui-video/types';\n\nexport interface VideoState {\n status: VideoStatus;\n /** Воспроизведение запущено, но видео ждёт данные */\n waiting: boolean;\n /**\n * Повторная попытка после ошибки: до начала воспроизведения видео и превью не показываются — лоадер на тёмном\n * фоне, а не мелькание превью перед новой ошибкой\n */\n retrying: boolean;\n /** Длительность из метаданных; `null`, пока неизвестна или бесконечна (live) */\n duration: number | null;\n /** Натуральный размер видео из метаданных */\n size: { width: number; height: number } | null;\n /** Звук выключен */\n muted: boolean;\n /** Громкость от 0 до 1 */\n volume: number;\n /** Скорость воспроизведения */\n rate: number;\n /** Видимость контролов: прячутся после бездействия во время воспроизведения */\n controlsVisible: boolean;\n /** Плеер развёрнут на весь экран */\n fullscreen: boolean;\n /** Куда `Video.Controls` переносятся порталом вне fullscreen; `null` — остаются на месте */\n controlsContainer: HTMLElement | null;\n /** Ускорение удержанием: видео играет на 2x, выбранная скорость (`rate`) не меняется */\n boosted: boolean;\n /** Куда переносится индикатор ускорения вне fullscreen; `null` — вверху плеера */\n indicatorContainer: HTMLElement | null;\n}\n\n/**\n * Исключение из правил владельца видимости контролов: `shown` — показать и не прятать (фокус с клавиатуры в контролах,\n * перетаскивание бегунка), `hidden` — спрятать и не показывать от активности (ускорение удержанием на desktop),\n * `null` — исключений нет\n */\nexport type VideoControlsPin = 'shown' | 'hidden' | null;\n\n/**\n * Внешний владелец видимости контролов (тулбары вьювера медиа). Пока он подключён, контролы показываются и прячутся\n * только по нему: собственного таймера у плеера нет, активность и тапы по видео передаются ему\n */\nexport interface VideoControlsVisibilityHost {\n isVisible: () => boolean;\n subscribe: (listener: (visible: boolean) => void) => VoidFunction;\n /** Активность пользователя в плеере: движение мыши, нажатия, горячие клавиши */\n notifyActivity: VoidFunction;\n /** Тап по видео (mobile) */\n toggle: VoidFunction;\n setPin: (pin: VideoControlsPin) => void;\n}\n\nexport interface VideoTime {\n current: number;\n duration: number;\n /** Конец загруженного фрагмента, в котором находится текущая позиция */\n buffered: number;\n /**\n * Позиция, с которой началось воспроизведение текущего источника. Для live (бесконечная длительность)\n * прошедшее время считается от неё: у live HLS `currentTime` идёт от начала окна плейлиста\n */\n origin: number;\n}\n\nexport interface VideoSourceOptions {\n src?: string;\n sources?: VideoSource[];\n}\n\ntype VideoCallbacks = Pick<VideoProps, 'onPlay' | 'onPause' | 'onEnded' | 'onError'>;\n\n/** Режимы воспроизведения из пропсов `Video`; `interactive={false}` включает autoPlay и loop */\nexport interface VideoPlaybackOptions {\n autoPlay: boolean;\n autoPause: boolean;\n loop: boolean;\n interactive: boolean;\n}\n\nexport interface VideoStoreOptions extends VideoSourceOptions {\n /** Актуальные колбэки и attachMedia читаются в момент события — без пересоздания стора */\n getCallbacks: () => VideoCallbacks & { attachMedia?: VideoAttachMedia };\n /** Актуальные режимы воспроизведения; после их смены стор надо уведомить через `syncOptions` */\n getOptions: () => VideoPlaybackOptions;\n /** Звук и громкость на старте */\n defaultMuted?: boolean;\n defaultVolume?: number;\n}\n\nexport interface VideoStore {\n getState: () => VideoState;\n /** Подписка на изменения состояния (для `useSyncExternalStore`) */\n subscribe: (listener: VoidFunction) => VoidFunction;\n getTime: () => VideoTime;\n /** Подписка на время: каждый кадр во время воспроизведения, минуя React */\n subscribeTime: (listener: (time: VideoTime) => void) => VoidFunction;\n /** Callback ref для `<video>` — единственный способ привязать элемент к стору */\n attach: (element: HTMLVideoElement | null) => void;\n getVideoElement: () => HTMLVideoElement | null;\n /** Смена источника: сбрасывает состояние в `idle` */\n setSource: (source: VideoSourceOptions) => void;\n play: VoidFunction;\n pause: VoidFunction;\n seek: (seconds: number) => void;\n /** Перемотка относительно текущей позиции */\n seekBy: (seconds: number) => void;\n /**\n * Видимость плеера во вьюпорте (видно не меньше 10%): по ней работают автовоспроизведение и автопауза.\n * `null` — неизвестно (плеер размонтирован)\n */\n setVisible: (visible: boolean | null) => void;\n /** Режимы воспроизведения из пропсов изменились */\n syncOptions: VoidFunction;\n /** Повторная загрузка после ошибки с запуском воспроизведения */\n retry: VoidFunction;\n /** play, если видео на паузе, закончилось или ещё не запускалось; иначе pause */\n toggle: VoidFunction;\n setMuted: (muted: boolean) => void;\n /** Громкость от 0 до 1. Ненулевая громкость включает звук, нулевая — выключает */\n setVolume: (volume: number) => void;\n /** Следующая скорость из ряда 1x → 1.5x → 2x → 1x */\n cycleRate: VoidFunction;\n /** Взаимодействие с плеером: показывает контролы и перезапускает таймер автоскрытия */\n notifyActivity: VoidFunction;\n /** Тап по видео на mobile: показать или спрятать контролы */\n toggleControls: VoidFunction;\n /** Прятать контролы по бездействию и на паузе, а не только во время воспроизведения (mobile) */\n setHideWhenPaused: (hide: boolean) => void;\n /** Пока удержание активно (фокус внутри контролов, перетаскивание ползунка), контролы не прячутся */\n holdControls: (hold: boolean) => void;\n /** Подключить внешнего владельца видимости контролов; `null` — плеер снова управляет ими сам */\n setControlsVisibilityHost: (host: VideoControlsVisibilityHost | null) => void;\n /** Callback ref для корня `Video.Player` — элемента, который разворачивается на весь экран */\n attachRoot: (element: HTMLElement | null) => void;\n getRoot: () => HTMLElement | null;\n toggleFullscreen: VoidFunction;\n /** Контейнер для `Video.Controls` вне fullscreen (например, тулбар вьювера); `null` — контролы на месте */\n setControlsContainer: (element: HTMLElement | null) => void;\n /** Контейнер для индикатора ускорения вне fullscreen (например, под шапкой вьювера); `null` — вверху плеера */\n setIndicatorContainer: (element: HTMLElement | null) => void;\n /**\n * Ускорение удержанием (палец или кнопка мыши на видео): только во время воспроизведения и если скорость ещё\n * не 2x. `hideControls` — спрятать контролы на это время (desktop). Возвращает, включилось ли ускорение\n */\n setBoost: (active: boolean, options?: { hideControls?: boolean }) => boolean;\n}\n\n/** Ряд скоростей воспроизведения */\nexport const PLAYBACK_RATES = [1, 1.5, 2];\n\n/**\n * Событие на document: видео начало играть со звуком — остальные видео со звуком встают на паузу.\n * Через document, а не общий модуль: работает и между разными копиями пакета на странице\n */\nconst AUDIBLE_EVENT = 'magritte-video-audible';\n\n/** Скорость ускорения удержанием */\nexport const BOOST_RATE = 2;\n\n/** Задержка автоскрытия контролов по спеке */\nexport const CONTROLS_HIDE_DELAY_MS = 4000;\n\n/** iPhone: Fullscreen API для элементов нет, есть только нативный полноэкранный плеер */\ntype WebkitVideoElement = HTMLVideoElement & { webkitEnterFullscreen?: VoidFunction };\n\nconst INITIAL_STATE: VideoState = {\n status: 'idle',\n waiting: false,\n retrying: false,\n duration: null,\n size: null,\n muted: false,\n volume: 1,\n rate: 1,\n controlsVisible: true,\n fullscreen: false,\n controlsContainer: null,\n boosted: false,\n indicatorContainer: null,\n};\n\n/** Состояние, которое переживает смену источника: настройки пользователя, fullscreen и место контролов */\nconst pickPreserved = ({\n muted,\n volume,\n rate,\n fullscreen,\n controlsContainer,\n indicatorContainer,\n}: VideoState): Partial<VideoState> => ({\n muted,\n volume,\n rate,\n fullscreen,\n controlsContainer,\n indicatorContainer,\n});\n\nconst getSourceKey = ({ src, sources }: VideoSourceOptions): string =>\n JSON.stringify([src ?? null, sources?.map(({ src, type }) => [src, type ?? null]) ?? null]);\n\n/** Как браузер выбирает `<source>`: первый, тип которого поддерживается (или без типа) */\nconst pickSource = (video: HTMLVideoElement, { src, sources }: VideoSourceOptions): string | undefined => {\n const playable = sources?.find(({ type }) => !type || video.canPlayType(type) !== '');\n return playable?.src ?? src;\n};\n\nconst toDuration = (value: number): number | null => (Number.isFinite(value) && value > 0 ? value : null);\n\nconst clampVolume = (volume: number): number => Math.min(Math.max(volume, 0), 1);\n\nexport const createVideoStore = ({\n getCallbacks,\n getOptions,\n defaultMuted = false,\n defaultVolume = 1,\n ...initialSource\n}: VideoStoreOptions): VideoStore => {\n const isAutoPlay = (): boolean => {\n const { autoPlay, interactive } = getOptions();\n return autoPlay || !interactive;\n };\n\n let state: VideoState = {\n ...INITIAL_STATE,\n // автовоспроизведение и неинтерактивный режим — без звука\n muted: defaultMuted || isAutoPlay(),\n volume: Number.isFinite(defaultVolume) ? clampVolume(defaultVolume) : 1,\n };\n let source: VideoSourceOptions = initialSource;\n let sourceKey = getSourceKey(initialSource);\n let video: HTMLVideoElement | null = null;\n let detachMedia: VoidFunction | null = null;\n let rafId: number | null = null;\n /** Воспроизведение запускали хотя бы раз для текущего источника */\n let started = false;\n /** Позиция первого playing текущего источника — точка отсчёта для live */\n let origin: number | null = null;\n let root: HTMLElement | null = null;\n let hideTimer: ReturnType<typeof setTimeout> | null = null;\n let holds = 0;\n /** Прятать контролы и на паузе (mobile: на паузе по центру видео есть кнопка воспроизведения) */\n let hideWhenPaused = false;\n /** Внешний владелец видимости контролов */\n let host: VideoControlsVisibilityHost | null = null;\n let unsubscribeHost: VoidFunction | null = null;\n /** Последнее исключение, переданное владельцу */\n let hostPin: VideoControlsPin = null;\n /** Ускорение прячет контролы (desktop) */\n let boostHidesControls = false;\n /** Видимость во вьюпорте; `null` — неизвестна */\n let visible: boolean | null = null;\n /** Видео поставила на паузу автопауза, а не пользователь: автовоспроизведение может его продолжить */\n let pausedByViewport = false;\n /** Пользователь сам менял звук: автовоспроизведение больше его не выключает */\n let soundChangedByUser = false;\n /** Маркер своего события AUDIBLE_EVENT */\n const audibleToken = {};\n\n const listeners = new Set<VoidFunction>();\n const timeListeners = new Set<(time: VideoTime) => void>();\n\n const getControlsPin = (): VideoControlsPin => {\n if (state.boosted && boostHidesControls) {\n return 'hidden';\n }\n return holds > 0 ? 'shown' : null;\n };\n\n /** Передаёт владельцу видимости исключение, если оно изменилось */\n const syncControlsPin = (): void => {\n const pin = getControlsPin();\n if (host && pin !== hostPin) {\n hostPin = pin;\n host.setPin(pin);\n }\n };\n\n const setState = (patch: Partial<VideoState>): void => {\n const keys = Object.keys(patch) as (keyof VideoState)[];\n if (keys.every((key) => patch[key] === state[key])) {\n return;\n }\n state = { ...state, ...patch };\n listeners.forEach((listener) => listener());\n syncControlsPin();\n };\n\n const getTime = (): VideoTime => {\n if (!video) {\n return { current: 0, duration: state.duration ?? 0, buffered: 0, origin: origin ?? 0 };\n }\n let buffered = 0;\n for (let i = 0; i < video.buffered.length; i += 1) {\n if (video.buffered.start(i) <= video.currentTime) {\n buffered = Math.max(buffered, video.buffered.end(i));\n }\n }\n return {\n current: video.currentTime,\n duration: toDuration(video.duration) ?? 0,\n buffered,\n origin: origin ?? 0,\n };\n };\n\n const emitTime = (): void => {\n if (timeListeners.size === 0) {\n return;\n }\n const time = getTime();\n timeListeners.forEach((listener) => listener(time));\n };\n\n const stopTicking = (): void => {\n if (rafId !== null) {\n cancelAnimationFrame(rafId);\n rafId = null;\n }\n };\n\n const tick = (): void => {\n emitTime();\n rafId = requestAnimationFrame(tick);\n };\n\n const startTicking = (): void => {\n if (rafId === null && timeListeners.size > 0) {\n rafId = requestAnimationFrame(tick);\n }\n };\n\n const clearHideTimer = (): void => {\n if (hideTimer !== null) {\n clearTimeout(hideTimer);\n hideTimer = null;\n }\n };\n\n /** Контролы прячутся во время воспроизведения, а с `hideWhenPaused` — и на паузе; после окончания видны */\n const canHide = (): boolean =>\n holds === 0 && (state.status === 'playing' || (hideWhenPaused && state.status === 'paused'));\n\n const scheduleHide = (): void => {\n clearHideTimer();\n // с внешним владельцем видимости своего таймера нет\n if (host || !canHide()) {\n return;\n }\n hideTimer = setTimeout(() => {\n hideTimer = null;\n if (canHide()) {\n setState({ controlsVisible: false });\n }\n }, CONTROLS_HIDE_DELAY_MS);\n };\n\n const showControls = (): void => {\n if (host) {\n host.notifyActivity();\n return;\n }\n setState({ controlsVisible: true });\n scheduleHide();\n };\n\n /** Лоадер — только при первом запуске и повторе; снятие с паузы обходится флагом waiting */\n const enterLoading = (): void => {\n if (state.status === 'idle' || state.status === 'ended') {\n setState({ status: 'loading' });\n }\n };\n\n /** Перемотка назад после окончания: видео больше не закончено — это пауза (play вместо «повторить») */\n const leaveEnded = (): void => {\n if (state.status === 'ended' && video && !video.ended) {\n setState({ status: 'paused' });\n }\n };\n\n /** Ускорение заканчивается вместе с воспроизведением: пауза, конец, ошибка, смена источника */\n const endBoost = (): void => {\n if (!state.boosted) {\n return;\n }\n boostHidesControls = false;\n setState({ boosted: false });\n if (video) {\n video.playbackRate = state.rate;\n }\n };\n\n const fail = (error: unknown): void => {\n endBoost();\n stopTicking();\n clearHideTimer();\n setState({ status: 'error', waiting: false, retrying: false });\n getCallbacks().onError?.(error);\n };\n\n const isAudible = (): boolean => !!video && !video.paused && !video.muted && video.volume > 0;\n\n /** Видео играет со звуком — остальные видео со звуком встают на паузу */\n const claimAudio = (): void => {\n if (isAudible()) {\n document.dispatchEvent(new CustomEvent(AUDIBLE_EVENT, { detail: audibleToken }));\n }\n };\n\n const onAudibleElsewhere = (event: Event): void => {\n if ((event as CustomEvent).detail !== audibleToken && isAudible()) {\n video?.pause();\n }\n };\n\n const play = (): void => {\n if (!video) {\n return;\n }\n pausedByViewport = false;\n started = true;\n enterLoading();\n if (video.ended) {\n video.currentTime = 0;\n }\n const element = video;\n // play() может быть отклонён (политика autoplay, источник не загрузился)\n // в старых браузерах может вернуть не Promise, а undefined\n Promise.resolve(element.play()).catch(() => {\n if (video !== element || state.status === 'error' || !element.paused) {\n return;\n }\n if (state.status === 'loading') {\n started = element.currentTime > 0;\n setState({ status: started ? 'paused' : 'idle', waiting: false, retrying: false });\n }\n });\n };\n\n /** Автовоспроизведение: видео ещё не запускали или его остановила автопауза, и плеер во вьюпорте */\n const tryAutoPlay = (): void => {\n // видимость сообщает Video.Player; пока она неизвестна, не запускаем — плеер может быть за пределами экрана\n if (!video || visible !== true || !isAutoPlay()) {\n return;\n }\n if (state.status !== 'idle' && !(state.status === 'paused' && pausedByViewport)) {\n return;\n }\n pausedByViewport = false;\n // звук выключен, пока пользователь не включит его сам; неинтерактивное видео — всегда без звука\n if (!soundChangedByUser || !getOptions().interactive) {\n video.muted = true;\n }\n play();\n };\n\n const autoPause = (): void => {\n if (!video || !getOptions().autoPause || video.paused) {\n return;\n }\n video.pause();\n pausedByViewport = true;\n };\n\n const handlers: Record<string, VoidFunction> = {\n loadedmetadata: () => {\n if (!video) {\n return;\n }\n setState({\n duration: toDuration(video.duration),\n size:\n video.videoWidth && video.videoHeight\n ? { width: video.videoWidth, height: video.videoHeight }\n : null,\n });\n emitTime();\n },\n durationchange: () => {\n video && setState({ duration: toDuration(video.duration) });\n },\n play: () => {\n // воспроизведение могло начаться не через store.play (например, нативно)\n started = true;\n enterLoading();\n claimAudio();\n getCallbacks().onPlay?.();\n },\n playing: () => {\n if (origin === null && video) {\n origin = video.currentTime;\n }\n const wasPlaying = state.status === 'playing';\n setState({ status: 'playing', waiting: false, retrying: false });\n startTicking();\n if (!wasPlaying) {\n scheduleHide();\n }\n },\n waiting: () => setState({ waiting: true }),\n canplay: () => setState({ waiting: false }),\n pause: () => {\n endBoost();\n stopTicking();\n emitTime();\n // pause приходит и перед ended, и при ошибке — эти состояния главнее\n if (!video || video.ended || state.status === 'error') {\n return;\n }\n setState({ status: started ? 'paused' : 'idle', waiting: false, retrying: false });\n showControls();\n getCallbacks().onPause?.();\n },\n ended: () => {\n endBoost();\n stopTicking();\n emitTime();\n clearHideTimer();\n setState({ status: 'ended', waiting: false });\n // с внешним владельцем видимость — по его правилам\n if (!host) {\n setState({ controlsVisible: true });\n }\n getCallbacks().onEnded?.();\n },\n error: () => fail(video?.error ?? new Error('Video loading error')),\n volumechange: () => {\n if (video) {\n setState({ muted: video.muted, volume: video.volume });\n claimAudio();\n }\n },\n ratechange: () => {\n // ускорение удержанием — не выбор пользователя: выбранная скорость остаётся прежней\n if (video && !state.boosted) {\n setState({ rate: video.playbackRate });\n }\n },\n webkitbeginfullscreen: () => setState({ fullscreen: true }),\n webkitendfullscreen: () => setState({ fullscreen: false }),\n progress: emitTime,\n seeked: () => {\n leaveEnded();\n emitTime();\n },\n timeupdate: () => {\n // во время воспроизведения время двигает rAF\n if (state.status !== 'playing') {\n emitTime();\n }\n },\n };\n\n const listen = (element: HTMLVideoElement, add: boolean): void => {\n Object.entries(handlers).forEach(([name, handler]) =>\n add ? element.addEventListener(name, handler) : element.removeEventListener(name, handler)\n );\n };\n\n /** Загрузка источника молча сбрасывает скорость элемента к `defaultPlaybackRate`: выбранная скорость переживает её */\n const restoreRate = (): void => {\n if (video) {\n video.playbackRate = state.rate;\n }\n };\n\n const applySource = (): void => {\n if (!video) {\n return;\n }\n detachMedia?.();\n detachMedia = null;\n const { attachMedia } = getCallbacks();\n if (attachMedia) {\n const element = video;\n detachMedia = attachMedia(element, {\n onError: (error) => {\n // ошибка от уже отключённой библиотеки не должна ломать новый источник\n if (video === element) {\n fail(error);\n }\n },\n });\n restoreRate();\n return;\n }\n const url = pickSource(video, source);\n if (url) {\n video.src = url;\n } else {\n video.removeAttribute('src');\n }\n video.load();\n restoreRate();\n };\n\n const resetState = (): void => {\n endBoost();\n stopTicking();\n clearHideTimer();\n started = false;\n origin = null;\n pausedByViewport = false;\n state = { ...INITIAL_STATE, ...pickPreserved(state) };\n listeners.forEach((listener) => listener());\n };\n\n const onFullscreenChange = (): void => {\n setState({ fullscreen: !!root && document.fullscreenElement === root });\n };\n\n const store: VideoStore = {\n getState: () => state,\n subscribe: (listener) => {\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n };\n },\n getTime,\n subscribeTime: (listener) => {\n timeListeners.add(listener);\n listener(getTime());\n if (state.status === 'playing') {\n startTicking();\n }\n return () => {\n timeListeners.delete(listener);\n if (timeListeners.size === 0) {\n stopTicking();\n }\n };\n },\n attach: (element) => {\n if (video === element) {\n return;\n }\n // ускорение привязано к удержанию на этом элементе: со сменой элемента оно не переживает\n endBoost();\n if (video) {\n listen(video, false);\n document.removeEventListener(AUDIBLE_EVENT, onAudibleElsewhere);\n detachMedia?.();\n detachMedia = null;\n stopTicking();\n }\n video = element;\n if (!video) {\n return;\n }\n listen(video, true);\n document.addEventListener(AUDIBLE_EVENT, onAudibleElsewhere);\n // настройки пользователя переживают смену элемента. Значения берём до присваивания: volumechange\n // от первого из них обновляет стор значениями элемента\n const { muted, volume } = state;\n video.muted = muted;\n video.volume = volume;\n video.loop = getOptions().loop || !getOptions().interactive;\n applySource();\n tryAutoPlay();\n },\n getVideoElement: () => video,\n setSource: (nextSource) => {\n const nextKey = getSourceKey(nextSource);\n if (nextKey === sourceKey) {\n return;\n }\n source = nextSource;\n sourceKey = nextKey;\n resetState();\n applySource();\n tryAutoPlay();\n },\n play,\n pause: () => {\n pausedByViewport = false;\n video?.pause();\n },\n seek: (seconds) => {\n if (!video) {\n return;\n }\n const duration = toDuration(video.duration);\n video.currentTime = Math.max(0, duration === null ? seconds : Math.min(seconds, duration));\n leaveEnded();\n emitTime();\n },\n seekBy: (seconds) => {\n if (video) {\n store.seek(video.currentTime + seconds);\n }\n },\n setVisible: (nextVisible) => {\n if (visible === nextVisible) {\n return;\n }\n visible = nextVisible;\n if (visible) {\n tryAutoPlay();\n } else if (visible === false) {\n autoPause();\n }\n },\n syncOptions: () => {\n if (!video) {\n return;\n }\n const { loop, interactive } = getOptions();\n video.loop = loop || !interactive;\n if (!interactive) {\n video.muted = true;\n }\n tryAutoPlay();\n },\n retry: () => {\n if (!video) {\n return;\n }\n resetState();\n setState({ retrying: true });\n applySource();\n store.play();\n },\n toggle: () => {\n if (!video) {\n return;\n }\n if (state.status === 'playing' || (state.status === 'loading' && !video.paused)) {\n store.pause();\n return;\n }\n store.play();\n },\n setMuted: (muted) => {\n if (video) {\n soundChangedByUser = true;\n video.muted = muted;\n }\n },\n setVolume: (volume) => {\n if (!video) {\n return;\n }\n soundChangedByUser = true;\n const next = clampVolume(volume);\n video.volume = next;\n video.muted = next === 0;\n },\n cycleRate: () => {\n if (!video) {\n return;\n }\n const index = PLAYBACK_RATES.indexOf(state.rate);\n video.playbackRate = PLAYBACK_RATES[(index + 1) % PLAYBACK_RATES.length];\n },\n notifyActivity: showControls,\n toggleControls: () => {\n if (host) {\n host.toggle();\n return;\n }\n if (state.controlsVisible && canHide()) {\n clearHideTimer();\n setState({ controlsVisible: false });\n return;\n }\n showControls();\n },\n setHideWhenPaused: (hide) => {\n hideWhenPaused = hide;\n if (state.controlsVisible) {\n scheduleHide();\n }\n },\n holdControls: (hold) => {\n holds = Math.max(0, holds + (hold ? 1 : -1));\n if (host) {\n syncControlsPin();\n return;\n }\n if (holds > 0) {\n clearHideTimer();\n setState({ controlsVisible: true });\n } else {\n scheduleHide();\n }\n },\n setControlsVisibilityHost: (nextHost) => {\n if (host === nextHost) {\n return;\n }\n unsubscribeHost?.();\n unsubscribeHost = null;\n if (host && hostPin !== null) {\n host.setPin(null);\n }\n hostPin = null;\n host = nextHost;\n clearHideTimer();\n if (!host) {\n showControls();\n return;\n }\n unsubscribeHost = host.subscribe((visible) => setState({ controlsVisible: visible }));\n setState({ controlsVisible: host.isVisible() });\n syncControlsPin();\n },\n attachRoot: (element) => {\n if (root === element) {\n return;\n }\n if (root) {\n document.removeEventListener('fullscreenchange', onFullscreenChange);\n if (document.fullscreenElement === root) {\n void document.exitFullscreen();\n }\n }\n root = element;\n if (root) {\n document.addEventListener('fullscreenchange', onFullscreenChange);\n } else {\n clearHideTimer();\n }\n },\n getRoot: () => root,\n toggleFullscreen: () => {\n if (root && document.fullscreenElement === root) {\n void document.exitFullscreen();\n return;\n }\n if (root && document.fullscreenEnabled && typeof root.requestFullscreen === 'function') {\n root.requestFullscreen().catch(() => {});\n return;\n }\n // iPhone: нативный плеер\n const webkitVideo: WebkitVideoElement | null = video;\n webkitVideo?.webkitEnterFullscreen?.();\n },\n setControlsContainer: (element) => setState({ controlsContainer: element }),\n setIndicatorContainer: (element) => setState({ indicatorContainer: element }),\n setBoost: (active, { hideControls = false } = {}) => {\n if (!active) {\n endBoost();\n return false;\n }\n if (!video || state.boosted || state.status !== 'playing' || state.rate === BOOST_RATE) {\n return false;\n }\n if (hideControls) {\n clearHideTimer();\n boostHidesControls = true;\n setState(host ? { boosted: true } : { boosted: true, controlsVisible: false });\n } else {\n setState({ boosted: true });\n }\n video.playbackRate = BOOST_RATE;\n return true;\n },\n };\n\n return store;\n};\n"],"names":["src","visible"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@hh.ru/magritte-ui-video",
|
|
3
|
-
"version": "1.0
|
|
3
|
+
"version": "1.1.0",
|
|
4
4
|
"main": "index.js",
|
|
5
5
|
"types": "index.d.ts",
|
|
6
6
|
"sideEffects": [
|
|
@@ -24,13 +24,13 @@
|
|
|
24
24
|
"@hh.ru/magritte-common-use-translation": "3.8.0",
|
|
25
25
|
"@hh.ru/magritte-design-tokens": "26.0.2",
|
|
26
26
|
"@hh.ru/magritte-ui-breakpoint": "6.1.3",
|
|
27
|
-
"@hh.ru/magritte-ui-button": "7.
|
|
28
|
-
"@hh.ru/magritte-ui-button-stack": "4.0
|
|
29
|
-
"@hh.ru/magritte-ui-icon": "15.
|
|
30
|
-
"@hh.ru/magritte-ui-loader": "4.
|
|
27
|
+
"@hh.ru/magritte-ui-button": "7.4.0",
|
|
28
|
+
"@hh.ru/magritte-ui-button-stack": "4.1.0",
|
|
29
|
+
"@hh.ru/magritte-ui-icon": "15.2.0",
|
|
30
|
+
"@hh.ru/magritte-ui-loader": "4.2.0",
|
|
31
31
|
"@hh.ru/magritte-ui-mock-component": "1.1.9",
|
|
32
|
-
"@hh.ru/magritte-ui-placeholder": "11.
|
|
33
|
-
"@hh.ru/magritte-ui-tooltip": "11.0
|
|
32
|
+
"@hh.ru/magritte-ui-placeholder": "11.2.0",
|
|
33
|
+
"@hh.ru/magritte-ui-tooltip": "11.1.0",
|
|
34
34
|
"@hh.ru/magritte-ui-typography": "5.3.17"
|
|
35
35
|
},
|
|
36
36
|
"peerDependencies": {
|
|
@@ -41,5 +41,5 @@
|
|
|
41
41
|
"publishConfig": {
|
|
42
42
|
"access": "public"
|
|
43
43
|
},
|
|
44
|
-
"gitHead": "
|
|
44
|
+
"gitHead": "24e606d1bcdafe5b56067887c4ebb87a8fa87c0c"
|
|
45
45
|
}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import './index.css';
|
|
2
|
+
var styles = {"player":"magritte-player___IHHy5_1-1-0","player-fit":"magritte-player-fit___TX-6X_1-1-0","playerFit":"magritte-player-fit___TX-6X_1-1-0","player-embedded":"magritte-player-embedded___GNvRb_1-1-0","playerEmbedded":"magritte-player-embedded___GNvRb_1-1-0","video":"magritte-video___4cS-u_1-1-0","video-hidden":"magritte-video-hidden___agqVq_1-1-0","videoHidden":"magritte-video-hidden___agqVq_1-1-0","overlay-button":"magritte-overlay-button___MIRAP_1-1-0","overlayButton":"magritte-overlay-button___MIRAP_1-1-0","duration":"magritte-duration___ND1ei_1-1-0","seek-indicator":"magritte-seek-indicator___VJQBC_1-1-0","seekIndicator":"magritte-seek-indicator___VJQBC_1-1-0","seek-indicator-forward":"magritte-seek-indicator-forward___9C5gD_1-1-0","seekIndicatorForward":"magritte-seek-indicator-forward___9C5gD_1-1-0","seek-indicator-backward":"magritte-seek-indicator-backward___gIZ0E_1-1-0","seekIndicatorBackward":"magritte-seek-indicator-backward___gIZ0E_1-1-0","seek-arrows":"magritte-seek-arrows___Ql1eP_1-1-0","seekArrows":"magritte-seek-arrows___Ql1eP_1-1-0","seek-arrow-incoming":"magritte-seek-arrow-incoming___oZxww_1-1-0","seekArrowIncoming":"magritte-seek-arrow-incoming___oZxww_1-1-0","seek-arrow-in":"magritte-seek-arrow-in___CB4-s_1-1-0","seekArrowIn":"magritte-seek-arrow-in___CB4-s_1-1-0","boost-indicator":"magritte-boost-indicator___ujllx_1-1-0","boostIndicator":"magritte-boost-indicator___ujllx_1-1-0","loader":"magritte-loader___qVu0P_1-1-0","error":"magritte-error___Rm7uG_1-1-0","overlay-button-hidden":"magritte-overlay-button-hidden___AoGFc_1-1-0","overlayButtonHidden":"magritte-overlay-button-hidden___AoGFc_1-1-0","controls":"magritte-controls___pKoSN_1-1-0","controls-hidden":"magritte-controls-hidden___bePTD_1-1-0","controlsHidden":"magritte-controls-hidden___bePTD_1-1-0","controls-mobile":"magritte-controls-mobile___tdKGT_1-1-0","controlsMobile":"magritte-controls-mobile___tdKGT_1-1-0","controls-overlay":"magritte-controls-overlay___mRsJL_1-1-0","controlsOverlay":"magritte-controls-overlay___mRsJL_1-1-0","controls-row":"magritte-controls-row___2sdJg_1-1-0","controlsRow":"magritte-controls-row___2sdJg_1-1-0","controls-group-start":"magritte-controls-group-start___yY9ZA_1-1-0","controlsGroupStart":"magritte-controls-group-start___yY9ZA_1-1-0","controls-group-end":"magritte-controls-group-end___ziIm8_1-1-0","controlsGroupEnd":"magritte-controls-group-end___ziIm8_1-1-0","control-pill":"magritte-control-pill___hK8Mv_1-1-0","controlPill":"magritte-control-pill___hK8Mv_1-1-0","controls-time":"magritte-controls-time___e9zoz_1-1-0","controlsTime":"magritte-controls-time___e9zoz_1-1-0","controls-volume":"magritte-controls-volume___o4ajR_1-1-0","controlsVolume":"magritte-controls-volume___o4ajR_1-1-0","control-pill-bare":"magritte-control-pill-bare___lU9ev_1-1-0","controlPillBare":"magritte-control-pill-bare___lU9ev_1-1-0","control-button":"magritte-control-button___VJ2Qr_1-1-0","controlButton":"magritte-control-button___VJ2Qr_1-1-0","scrubber":"magritte-scrubber___-K3ik_1-1-0","scrubber-track":"magritte-scrubber-track___ki1zV_1-1-0","scrubberTrack":"magritte-scrubber-track___ki1zV_1-1-0","scrubber-buffered":"magritte-scrubber-buffered___ufvLe_1-1-0","scrubberBuffered":"magritte-scrubber-buffered___ufvLe_1-1-0","scrubber-progress":"magritte-scrubber-progress___ZIyew_1-1-0","scrubberProgress":"magritte-scrubber-progress___ZIyew_1-1-0","scrubber-thumb":"magritte-scrubber-thumb___VXyPP_1-1-0","scrubberThumb":"magritte-scrubber-thumb___VXyPP_1-1-0","scrubber-timecode":"magritte-scrubber-timecode___M-syA_1-1-0","scrubberTimecode":"magritte-scrubber-timecode___M-syA_1-1-0","volume-slider":"magritte-volume-slider___qE2P7_1-1-0","volumeSlider":"magritte-volume-slider___qE2P7_1-1-0","volume-track":"magritte-volume-track___up8nd_1-1-0","volumeTrack":"magritte-volume-track___up8nd_1-1-0","volume-value":"magritte-volume-value___aUSuU_1-1-0","volumeValue":"magritte-volume-value___aUSuU_1-1-0"};
|
|
3
|
+
|
|
4
|
+
export { styles as s };
|
|
5
|
+
//# sourceMappingURL=video-CaC1atet.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"video-CaC1atet.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;"}
|
package/video-BnfN4Emx.js
DELETED
|
@@ -1,5 +0,0 @@
|
|
|
1
|
-
import './index.css';
|
|
2
|
-
var styles = {"player":"magritte-player___IHHy5_1-0-2","player-fit":"magritte-player-fit___TX-6X_1-0-2","playerFit":"magritte-player-fit___TX-6X_1-0-2","player-embedded":"magritte-player-embedded___GNvRb_1-0-2","playerEmbedded":"magritte-player-embedded___GNvRb_1-0-2","video":"magritte-video___4cS-u_1-0-2","video-hidden":"magritte-video-hidden___agqVq_1-0-2","videoHidden":"magritte-video-hidden___agqVq_1-0-2","overlay-button":"magritte-overlay-button___MIRAP_1-0-2","overlayButton":"magritte-overlay-button___MIRAP_1-0-2","duration":"magritte-duration___ND1ei_1-0-2","seek-indicator":"magritte-seek-indicator___VJQBC_1-0-2","seekIndicator":"magritte-seek-indicator___VJQBC_1-0-2","seek-indicator-forward":"magritte-seek-indicator-forward___9C5gD_1-0-2","seekIndicatorForward":"magritte-seek-indicator-forward___9C5gD_1-0-2","seek-indicator-backward":"magritte-seek-indicator-backward___gIZ0E_1-0-2","seekIndicatorBackward":"magritte-seek-indicator-backward___gIZ0E_1-0-2","seek-arrows":"magritte-seek-arrows___Ql1eP_1-0-2","seekArrows":"magritte-seek-arrows___Ql1eP_1-0-2","seek-arrow-incoming":"magritte-seek-arrow-incoming___oZxww_1-0-2","seekArrowIncoming":"magritte-seek-arrow-incoming___oZxww_1-0-2","seek-arrow-in":"magritte-seek-arrow-in___CB4-s_1-0-2","seekArrowIn":"magritte-seek-arrow-in___CB4-s_1-0-2","boost-indicator":"magritte-boost-indicator___ujllx_1-0-2","boostIndicator":"magritte-boost-indicator___ujllx_1-0-2","loader":"magritte-loader___qVu0P_1-0-2","error":"magritte-error___Rm7uG_1-0-2","overlay-button-hidden":"magritte-overlay-button-hidden___AoGFc_1-0-2","overlayButtonHidden":"magritte-overlay-button-hidden___AoGFc_1-0-2","controls":"magritte-controls___pKoSN_1-0-2","controls-hidden":"magritte-controls-hidden___bePTD_1-0-2","controlsHidden":"magritte-controls-hidden___bePTD_1-0-2","controls-mobile":"magritte-controls-mobile___tdKGT_1-0-2","controlsMobile":"magritte-controls-mobile___tdKGT_1-0-2","controls-overlay":"magritte-controls-overlay___mRsJL_1-0-2","controlsOverlay":"magritte-controls-overlay___mRsJL_1-0-2","controls-row":"magritte-controls-row___2sdJg_1-0-2","controlsRow":"magritte-controls-row___2sdJg_1-0-2","controls-group-start":"magritte-controls-group-start___yY9ZA_1-0-2","controlsGroupStart":"magritte-controls-group-start___yY9ZA_1-0-2","controls-group-end":"magritte-controls-group-end___ziIm8_1-0-2","controlsGroupEnd":"magritte-controls-group-end___ziIm8_1-0-2","control-pill":"magritte-control-pill___hK8Mv_1-0-2","controlPill":"magritte-control-pill___hK8Mv_1-0-2","controls-time":"magritte-controls-time___e9zoz_1-0-2","controlsTime":"magritte-controls-time___e9zoz_1-0-2","controls-volume":"magritte-controls-volume___o4ajR_1-0-2","controlsVolume":"magritte-controls-volume___o4ajR_1-0-2","control-pill-bare":"magritte-control-pill-bare___lU9ev_1-0-2","controlPillBare":"magritte-control-pill-bare___lU9ev_1-0-2","control-button":"magritte-control-button___VJ2Qr_1-0-2","controlButton":"magritte-control-button___VJ2Qr_1-0-2","scrubber":"magritte-scrubber___-K3ik_1-0-2","scrubber-track":"magritte-scrubber-track___ki1zV_1-0-2","scrubberTrack":"magritte-scrubber-track___ki1zV_1-0-2","scrubber-buffered":"magritte-scrubber-buffered___ufvLe_1-0-2","scrubberBuffered":"magritte-scrubber-buffered___ufvLe_1-0-2","scrubber-progress":"magritte-scrubber-progress___ZIyew_1-0-2","scrubberProgress":"magritte-scrubber-progress___ZIyew_1-0-2","scrubber-thumb":"magritte-scrubber-thumb___VXyPP_1-0-2","scrubberThumb":"magritte-scrubber-thumb___VXyPP_1-0-2","scrubber-timecode":"magritte-scrubber-timecode___M-syA_1-0-2","scrubberTimecode":"magritte-scrubber-timecode___M-syA_1-0-2","volume-slider":"magritte-volume-slider___qE2P7_1-0-2","volumeSlider":"magritte-volume-slider___qE2P7_1-0-2","volume-track":"magritte-volume-track___up8nd_1-0-2","volumeTrack":"magritte-volume-track___up8nd_1-0-2","volume-value":"magritte-volume-value___aUSuU_1-0-2","volumeValue":"magritte-volume-value___aUSuU_1-0-2"};
|
|
3
|
-
|
|
4
|
-
export { styles as s };
|
|
5
|
-
//# sourceMappingURL=video-BnfN4Emx.js.map
|
package/video-BnfN4Emx.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"video-BnfN4Emx.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;"}
|