@venomousone/rn-videokit 0.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.
Files changed (145) hide show
  1. package/LICENSE +20 -0
  2. package/README.md +248 -0
  3. package/lib/module/components/VideoKit.js +347 -0
  4. package/lib/module/components/VideoKit.js.map +1 -0
  5. package/lib/module/components/controls/FullscreenButton.js +38 -0
  6. package/lib/module/components/controls/FullscreenButton.js.map +1 -0
  7. package/lib/module/components/controls/Icon.js +71 -0
  8. package/lib/module/components/controls/Icon.js.map +1 -0
  9. package/lib/module/components/controls/PlayPauseButton.js +33 -0
  10. package/lib/module/components/controls/PlayPauseButton.js.map +1 -0
  11. package/lib/module/components/controls/Scrubber.js +146 -0
  12. package/lib/module/components/controls/Scrubber.js.map +1 -0
  13. package/lib/module/components/controls/SpeedButton.js +96 -0
  14. package/lib/module/components/controls/SpeedButton.js.map +1 -0
  15. package/lib/module/components/controls/TimeDisplay.js +28 -0
  16. package/lib/module/components/controls/TimeDisplay.js.map +1 -0
  17. package/lib/module/components/controls/VolumeButton.js +31 -0
  18. package/lib/module/components/controls/VolumeButton.js.map +1 -0
  19. package/lib/module/components/core/VideoPlayer.js +114 -0
  20. package/lib/module/components/core/VideoPlayer.js.map +1 -0
  21. package/lib/module/components/core/VideoPlayerContext.js +119 -0
  22. package/lib/module/components/core/VideoPlayerContext.js.map +1 -0
  23. package/lib/module/components/core/index.js +5 -0
  24. package/lib/module/components/core/index.js.map +1 -0
  25. package/lib/module/components/index.js +14 -0
  26. package/lib/module/components/index.js.map +1 -0
  27. package/lib/module/components/overlays/BufferingOverlay.js +24 -0
  28. package/lib/module/components/overlays/BufferingOverlay.js.map +1 -0
  29. package/lib/module/components/overlays/DoubleTapSeek.js +95 -0
  30. package/lib/module/components/overlays/DoubleTapSeek.js.map +1 -0
  31. package/lib/module/components/overlays/ErrorOverlay.js +60 -0
  32. package/lib/module/components/overlays/ErrorOverlay.js.map +1 -0
  33. package/lib/module/components/overlays/GestureIndicator.js +118 -0
  34. package/lib/module/components/overlays/GestureIndicator.js.map +1 -0
  35. package/lib/module/components/overlays/LoadingPoster.js +22 -0
  36. package/lib/module/components/overlays/LoadingPoster.js.map +1 -0
  37. package/lib/module/hooks/index.js +6 -0
  38. package/lib/module/hooks/index.js.map +1 -0
  39. package/lib/module/hooks/useVideoBrightness.js +33 -0
  40. package/lib/module/hooks/useVideoBrightness.js.map +1 -0
  41. package/lib/module/hooks/useVideoControls.js +64 -0
  42. package/lib/module/hooks/useVideoControls.js.map +1 -0
  43. package/lib/module/hooks/useVideoOrientation.js +24 -0
  44. package/lib/module/hooks/useVideoOrientation.js.map +1 -0
  45. package/lib/module/hooks/useVideoPlayer.js +59 -0
  46. package/lib/module/hooks/useVideoPlayer.js.map +1 -0
  47. package/lib/module/hooks/useVideoVolume.js +42 -0
  48. package/lib/module/hooks/useVideoVolume.js.map +1 -0
  49. package/lib/module/index.js +7 -0
  50. package/lib/module/index.js.map +1 -0
  51. package/lib/module/package.json +1 -0
  52. package/lib/module/types/index.js +4 -0
  53. package/lib/module/types/index.js.map +1 -0
  54. package/lib/module/utils/clamp.js +8 -0
  55. package/lib/module/utils/clamp.js.map +1 -0
  56. package/lib/module/utils/formatTime.js +12 -0
  57. package/lib/module/utils/formatTime.js.map +1 -0
  58. package/lib/module/utils/index.js +5 -0
  59. package/lib/module/utils/index.js.map +1 -0
  60. package/lib/typescript/package.json +1 -0
  61. package/lib/typescript/src/components/VideoKit.d.ts +3 -0
  62. package/lib/typescript/src/components/VideoKit.d.ts.map +1 -0
  63. package/lib/typescript/src/components/controls/FullscreenButton.d.ts +6 -0
  64. package/lib/typescript/src/components/controls/FullscreenButton.d.ts.map +1 -0
  65. package/lib/typescript/src/components/controls/Icon.d.ts +10 -0
  66. package/lib/typescript/src/components/controls/Icon.d.ts.map +1 -0
  67. package/lib/typescript/src/components/controls/PlayPauseButton.d.ts +2 -0
  68. package/lib/typescript/src/components/controls/PlayPauseButton.d.ts.map +1 -0
  69. package/lib/typescript/src/components/controls/Scrubber.d.ts +7 -0
  70. package/lib/typescript/src/components/controls/Scrubber.d.ts.map +1 -0
  71. package/lib/typescript/src/components/controls/SpeedButton.d.ts +2 -0
  72. package/lib/typescript/src/components/controls/SpeedButton.d.ts.map +1 -0
  73. package/lib/typescript/src/components/controls/TimeDisplay.d.ts +2 -0
  74. package/lib/typescript/src/components/controls/TimeDisplay.d.ts.map +1 -0
  75. package/lib/typescript/src/components/controls/VolumeButton.d.ts +2 -0
  76. package/lib/typescript/src/components/controls/VolumeButton.d.ts.map +1 -0
  77. package/lib/typescript/src/components/core/VideoPlayer.d.ts +14 -0
  78. package/lib/typescript/src/components/core/VideoPlayer.d.ts.map +1 -0
  79. package/lib/typescript/src/components/core/VideoPlayerContext.d.ts +48 -0
  80. package/lib/typescript/src/components/core/VideoPlayerContext.d.ts.map +1 -0
  81. package/lib/typescript/src/components/core/index.d.ts +3 -0
  82. package/lib/typescript/src/components/core/index.d.ts.map +1 -0
  83. package/lib/typescript/src/components/index.d.ts +6 -0
  84. package/lib/typescript/src/components/index.d.ts.map +1 -0
  85. package/lib/typescript/src/components/overlays/BufferingOverlay.d.ts +2 -0
  86. package/lib/typescript/src/components/overlays/BufferingOverlay.d.ts.map +1 -0
  87. package/lib/typescript/src/components/overlays/DoubleTapSeek.d.ts +5 -0
  88. package/lib/typescript/src/components/overlays/DoubleTapSeek.d.ts.map +1 -0
  89. package/lib/typescript/src/components/overlays/ErrorOverlay.d.ts +6 -0
  90. package/lib/typescript/src/components/overlays/ErrorOverlay.d.ts.map +1 -0
  91. package/lib/typescript/src/components/overlays/GestureIndicator.d.ts +9 -0
  92. package/lib/typescript/src/components/overlays/GestureIndicator.d.ts.map +1 -0
  93. package/lib/typescript/src/components/overlays/LoadingPoster.d.ts +6 -0
  94. package/lib/typescript/src/components/overlays/LoadingPoster.d.ts.map +1 -0
  95. package/lib/typescript/src/hooks/index.d.ts +4 -0
  96. package/lib/typescript/src/hooks/index.d.ts.map +1 -0
  97. package/lib/typescript/src/hooks/useVideoBrightness.d.ts +5 -0
  98. package/lib/typescript/src/hooks/useVideoBrightness.d.ts.map +1 -0
  99. package/lib/typescript/src/hooks/useVideoControls.d.ts +11 -0
  100. package/lib/typescript/src/hooks/useVideoControls.d.ts.map +1 -0
  101. package/lib/typescript/src/hooks/useVideoOrientation.d.ts +6 -0
  102. package/lib/typescript/src/hooks/useVideoOrientation.d.ts.map +1 -0
  103. package/lib/typescript/src/hooks/useVideoPlayer.d.ts +7 -0
  104. package/lib/typescript/src/hooks/useVideoPlayer.d.ts.map +1 -0
  105. package/lib/typescript/src/hooks/useVideoVolume.d.ts +6 -0
  106. package/lib/typescript/src/hooks/useVideoVolume.d.ts.map +1 -0
  107. package/lib/typescript/src/index.d.ts +6 -0
  108. package/lib/typescript/src/index.d.ts.map +1 -0
  109. package/lib/typescript/src/types/index.d.ts +96 -0
  110. package/lib/typescript/src/types/index.d.ts.map +1 -0
  111. package/lib/typescript/src/utils/clamp.d.ts +2 -0
  112. package/lib/typescript/src/utils/clamp.d.ts.map +1 -0
  113. package/lib/typescript/src/utils/formatTime.d.ts +2 -0
  114. package/lib/typescript/src/utils/formatTime.d.ts.map +1 -0
  115. package/lib/typescript/src/utils/index.d.ts +3 -0
  116. package/lib/typescript/src/utils/index.d.ts.map +1 -0
  117. package/package.json +191 -0
  118. package/src/components/VideoKit.tsx +415 -0
  119. package/src/components/controls/FullscreenButton.tsx +29 -0
  120. package/src/components/controls/Icon.tsx +71 -0
  121. package/src/components/controls/PlayPauseButton.tsx +25 -0
  122. package/src/components/controls/Scrubber.tsx +157 -0
  123. package/src/components/controls/SpeedButton.tsx +86 -0
  124. package/src/components/controls/TimeDisplay.tsx +21 -0
  125. package/src/components/controls/VolumeButton.tsx +23 -0
  126. package/src/components/core/VideoPlayer.tsx +148 -0
  127. package/src/components/core/VideoPlayerContext.tsx +133 -0
  128. package/src/components/core/index.ts +5 -0
  129. package/src/components/index.ts +25 -0
  130. package/src/components/overlays/BufferingOverlay.tsx +21 -0
  131. package/src/components/overlays/DoubleTapSeek.tsx +91 -0
  132. package/src/components/overlays/ErrorOverlay.tsx +49 -0
  133. package/src/components/overlays/GestureIndicator.tsx +114 -0
  134. package/src/components/overlays/LoadingPoster.tsx +21 -0
  135. package/src/hooks/index.ts +3 -0
  136. package/src/hooks/useVideoBrightness.ts +34 -0
  137. package/src/hooks/useVideoControls.ts +65 -0
  138. package/src/hooks/useVideoOrientation.ts +22 -0
  139. package/src/hooks/useVideoPlayer.ts +69 -0
  140. package/src/hooks/useVideoVolume.ts +36 -0
  141. package/src/index.ts +15 -0
  142. package/src/types/index.ts +137 -0
  143. package/src/utils/clamp.ts +4 -0
  144. package/src/utils/formatTime.ts +9 -0
  145. package/src/utils/index.ts +2 -0
@@ -0,0 +1,119 @@
1
+ "use strict";
2
+
3
+ import React, { createContext, useContext, useRef } from 'react';
4
+ import { useRef as useStoreRef } from 'react';
5
+ import { createStore, useStore } from 'zustand';
6
+ import { jsx as _jsx } from "react/jsx-runtime";
7
+ //Theme
8
+
9
+ const ThemeContext = /*#__PURE__*/createContext({});
10
+ export const useVideoTheme = () => useContext(ThemeContext);
11
+
12
+ // ─── Store shape ─────────────────────────────────────────────────────────────
13
+
14
+ const initialState = {
15
+ status: 'idle',
16
+ currentTime: 0,
17
+ duration: 0,
18
+ buffered: 0,
19
+ muted: false,
20
+ speed: 1,
21
+ isFullscreen: false,
22
+ controlsVisible: true,
23
+ error: null
24
+ };
25
+ export const createVideoStore = () => createStore(set => ({
26
+ ...initialState,
27
+ setStatus: status => set({
28
+ status
29
+ }),
30
+ setCurrentTime: currentTime => set({
31
+ currentTime
32
+ }),
33
+ setDuration: duration => set({
34
+ duration
35
+ }),
36
+ setBuffered: buffered => set({
37
+ buffered
38
+ }),
39
+ setMuted: muted => set({
40
+ muted
41
+ }),
42
+ setSpeed: speed => set({
43
+ speed
44
+ }),
45
+ setFullscreen: isFullscreen => set({
46
+ isFullscreen
47
+ }),
48
+ setControlsVisible: controlsVisible => set({
49
+ controlsVisible
50
+ }),
51
+ setError: error => set({
52
+ error
53
+ }),
54
+ reset: () => set(initialState)
55
+ }));
56
+
57
+ // ─── Context ─────────────────────────────────────────────────────────────────
58
+
59
+ const VideoPlayerContext = /*#__PURE__*/createContext(null);
60
+
61
+ // ─── Provider ────────────────────────────────────────────────────────────────
62
+
63
+ export const VideoPlayerProvider = ({
64
+ children,
65
+ theme
66
+ }) => {
67
+ const videoRef = useRef(null);
68
+ const storeRef = useStoreRef(null);
69
+
70
+ // create the store once per provider instance
71
+ if (storeRef.current === null) {
72
+ storeRef.current = createVideoStore();
73
+ }
74
+ return /*#__PURE__*/_jsx(VideoPlayerContext.Provider, {
75
+ value: {
76
+ videoRef,
77
+ store: storeRef.current
78
+ },
79
+ children: /*#__PURE__*/_jsx(ThemeContext.Provider, {
80
+ value: theme ?? {},
81
+ children: children
82
+ })
83
+ });
84
+ };
85
+
86
+ // ─── Hooks ───────────────────────────────────────────────────────────────────
87
+
88
+ export const useVideoPlayerContext = () => {
89
+ const ctx = useContext(VideoPlayerContext);
90
+ if (!ctx) throw new Error('useVideoPlayerContext must be used inside VideoPlayerProvider');
91
+ return ctx;
92
+ };
93
+
94
+ /**
95
+ * Scoped reactive store hook — replaces the old global useVideoStore.
96
+ * Use this everywhere instead of the old import.
97
+ */
98
+ export const useVideoStore = selector => {
99
+ const {
100
+ store
101
+ } = useVideoPlayerContext();
102
+ return useStore(store, selector);
103
+ };
104
+ // export function useVideoStore<T>(selector: (state: VideoState) => T): T {
105
+ // const { store } = useVideoPlayerContext();
106
+ // return useStore(store, selector);
107
+ // }
108
+
109
+ /**
110
+ * For imperative access (getState / setState) without subscribing.
111
+ * Use in callbacks and gesture handlers.
112
+ */
113
+ export const useVideoStoreApi = () => {
114
+ const {
115
+ store
116
+ } = useVideoPlayerContext();
117
+ return store;
118
+ };
119
+ //# sourceMappingURL=VideoPlayerContext.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["React","createContext","useContext","useRef","useStoreRef","createStore","useStore","jsx","_jsx","ThemeContext","useVideoTheme","initialState","status","currentTime","duration","buffered","muted","speed","isFullscreen","controlsVisible","error","createVideoStore","set","setStatus","setCurrentTime","setDuration","setBuffered","setMuted","setSpeed","setFullscreen","setControlsVisible","setError","reset","VideoPlayerContext","VideoPlayerProvider","children","theme","videoRef","storeRef","current","Provider","value","store","useVideoPlayerContext","ctx","Error","useVideoStore","selector","useVideoStoreApi"],"sourceRoot":"../../../../src","sources":["components/core/VideoPlayerContext.tsx"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+
3
+ export { useVideoStore } from "./VideoPlayerContext.js";
4
+ export { VideoPlayerProvider, useVideoPlayerContext } from "./VideoPlayerContext.js";
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["useVideoStore","VideoPlayerProvider","useVideoPlayerContext"],"sourceRoot":"../../../../src","sources":["components/core/index.ts"],"mappings":";;AAAA,SAASA,aAAa,QAAQ,yBAAsB;AACpD,SACEC,mBAAmB,EACnBC,qBAAqB,QAChB,yBAAsB","ignoreList":[]}
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+
3
+ // ─── Main component ───────────────────────────────────────────────────────────
4
+ export { VideoPlayer } from "./core/VideoPlayer.js";
5
+ export { VideoKit } from "./VideoKit.js";
6
+
7
+ // ─── Headless hook ────────────────────────────────────────────────────────────
8
+ export { useVideoPlayer } from "../hooks/useVideoPlayer.js";
9
+
10
+ // ─── Context & store (for advanced usage) ────────────────────────────────────
11
+ export { VideoPlayerProvider, useVideoPlayerContext, useVideoStore } from "./core/VideoPlayerContext.js";
12
+
13
+ // ─── Types ────────────────────────────────────────────────────────────────────
14
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["VideoPlayer","VideoKit","useVideoPlayer","VideoPlayerProvider","useVideoPlayerContext","useVideoStore"],"sourceRoot":"../../../src","sources":["components/index.ts"],"mappings":";;AAAA;AACA,SAASA,WAAW,QAAQ,uBAAoB;AAChD,SAASC,QAAQ,QAAQ,eAAY;;AAErC;AACA,SAASC,cAAc,QAAQ,4BAAyB;;AAExD;AACA,SACEC,mBAAmB,EACnBC,qBAAqB,EACrBC,aAAa,QACR,8BAA2B;;AAElC","ignoreList":[]}
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+
3
+ import { ActivityIndicator, StyleSheet, View } from 'react-native';
4
+ import { useVideoStore } from "../core/VideoPlayerContext.js";
5
+ import { jsx as _jsx } from "react/jsx-runtime";
6
+ export function BufferingOverlay() {
7
+ const status = useVideoStore(s => s.status);
8
+ if (status !== 'buffering' && status !== 'loading') return null;
9
+ return /*#__PURE__*/_jsx(View, {
10
+ style: styles.container,
11
+ children: /*#__PURE__*/_jsx(ActivityIndicator, {
12
+ size: "large",
13
+ color: "#fff"
14
+ })
15
+ });
16
+ }
17
+ const styles = StyleSheet.create({
18
+ container: {
19
+ ...StyleSheet.absoluteFill,
20
+ alignItems: 'center',
21
+ justifyContent: 'center'
22
+ }
23
+ });
24
+ //# sourceMappingURL=BufferingOverlay.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["ActivityIndicator","StyleSheet","View","useVideoStore","jsx","_jsx","BufferingOverlay","status","s","style","styles","container","children","size","color","create","absoluteFill","alignItems","justifyContent"],"sourceRoot":"../../../../src","sources":["components/overlays/BufferingOverlay.tsx"],"mappings":";;AAAA,SAASA,iBAAiB,EAAEC,UAAU,EAAEC,IAAI,QAAQ,cAAc;AAClE,SAASC,aAAa,QAAQ,+BAA4B;AAAC,SAAAC,GAAA,IAAAC,IAAA;AAE3D,OAAO,SAASC,gBAAgBA,CAAA,EAAG;EACjC,MAAMC,MAAM,GAAGJ,aAAa,CAAEK,CAAC,IAAKA,CAAC,CAACD,MAAM,CAAC;EAC7C,IAAIA,MAAM,KAAK,WAAW,IAAIA,MAAM,KAAK,SAAS,EAAE,OAAO,IAAI;EAE/D,oBACEF,IAAA,CAACH,IAAI;IAACO,KAAK,EAAEC,MAAM,CAACC,SAAU;IAAAC,QAAA,eAC5BP,IAAA,CAACL,iBAAiB;MAACa,IAAI,EAAC,OAAO;MAACC,KAAK,EAAC;IAAM,CAAE;EAAC,CAC3C,CAAC;AAEX;AAEA,MAAMJ,MAAM,GAAGT,UAAU,CAACc,MAAM,CAAC;EAC/BJ,SAAS,EAAE;IACT,GAAGV,UAAU,CAACe,YAAY;IAC1BC,UAAU,EAAE,QAAQ;IACpBC,cAAc,EAAE;EAClB;AACF,CAAC,CAAC","ignoreList":[]}
@@ -0,0 +1,95 @@
1
+ "use strict";
2
+
3
+ import { forwardRef, useImperativeHandle, useRef, useState } from 'react';
4
+ import { StyleSheet, Text, View } from 'react-native';
5
+ import Animated, { useSharedValue, useAnimatedStyle, withSequence, withTiming } from 'react-native-reanimated';
6
+ import { scheduleOnRN } from 'react-native-worklets';
7
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
8
+ export const DoubleTapSeek = /*#__PURE__*/forwardRef((_, ref) => {
9
+ const [state, setState] = useState(null);
10
+ const opacity = useSharedValue(0);
11
+ const scale = useSharedValue(0.8);
12
+ const timerRef = useRef(undefined);
13
+ const hide = () => setState(null);
14
+ useImperativeHandle(ref, () => ({
15
+ show: (side, seconds) => {
16
+ clearTimeout(timerRef.current);
17
+ setState({
18
+ side,
19
+ seconds
20
+ });
21
+ opacity.value = withSequence(withTiming(1, {
22
+ duration: 100
23
+ }), withTiming(1, {
24
+ duration: 400
25
+ }), withTiming(0, {
26
+ duration: 200
27
+ }, done => {
28
+ if (done) scheduleOnRN(hide);
29
+ }));
30
+ scale.value = withSequence(withTiming(1, {
31
+ duration: 150
32
+ }), withTiming(0.9, {
33
+ duration: 350
34
+ }));
35
+ }
36
+ }));
37
+ const animStyle = useAnimatedStyle(() => ({
38
+ opacity: opacity.value,
39
+ transform: [{
40
+ scale: scale.value
41
+ }]
42
+ }));
43
+ if (!state) return null;
44
+ const isLeft = state.side === 'left';
45
+ return /*#__PURE__*/_jsx(View, {
46
+ style: [styles.container, isLeft ? styles.left : styles.right],
47
+ pointerEvents: "none",
48
+ children: /*#__PURE__*/_jsxs(Animated.View, {
49
+ style: [styles.ripple, animStyle],
50
+ children: [/*#__PURE__*/_jsx(Text, {
51
+ style: styles.arrow,
52
+ children: isLeft ? '«' : '»'
53
+ }), /*#__PURE__*/_jsx(Text, {
54
+ style: styles.label,
55
+ children: isLeft ? `-${state.seconds}s` : `+${state.seconds}s`
56
+ })]
57
+ })
58
+ });
59
+ });
60
+ const styles = StyleSheet.create({
61
+ container: {
62
+ position: 'absolute',
63
+ top: 0,
64
+ bottom: 0,
65
+ width: '40%',
66
+ alignItems: 'center',
67
+ justifyContent: 'center'
68
+ },
69
+ left: {
70
+ left: 0
71
+ },
72
+ right: {
73
+ right: 0
74
+ },
75
+ ripple: {
76
+ width: 80,
77
+ height: 80,
78
+ borderRadius: 40,
79
+ backgroundColor: 'rgba(255,255,255,0.15)',
80
+ alignItems: 'center',
81
+ justifyContent: 'center',
82
+ gap: 2
83
+ },
84
+ arrow: {
85
+ color: '#fff',
86
+ fontSize: 20,
87
+ fontWeight: '700'
88
+ },
89
+ label: {
90
+ color: '#fff',
91
+ fontSize: 11,
92
+ fontWeight: '600'
93
+ }
94
+ });
95
+ //# sourceMappingURL=DoubleTapSeek.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["forwardRef","useImperativeHandle","useRef","useState","StyleSheet","Text","View","Animated","useSharedValue","useAnimatedStyle","withSequence","withTiming","scheduleOnRN","jsx","_jsx","jsxs","_jsxs","DoubleTapSeek","_","ref","state","setState","opacity","scale","timerRef","undefined","hide","show","side","seconds","clearTimeout","current","value","duration","done","animStyle","transform","isLeft","style","styles","container","left","right","pointerEvents","children","ripple","arrow","label","create","position","top","bottom","width","alignItems","justifyContent","height","borderRadius","backgroundColor","gap","color","fontSize","fontWeight"],"sourceRoot":"../../../../src","sources":["components/overlays/DoubleTapSeek.tsx"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,60 @@
1
+ "use strict";
2
+
3
+ import { StyleSheet, Text, TouchableOpacity, View } from 'react-native';
4
+ import { useVideoStore } from "../core/VideoPlayerContext.js";
5
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
6
+ export function ErrorOverlay({
7
+ onRetry
8
+ }) {
9
+ const status = useVideoStore(s => s.status);
10
+ const error = useVideoStore(s => s.error);
11
+ if (status !== 'error') return null;
12
+ return /*#__PURE__*/_jsxs(View, {
13
+ style: styles.container,
14
+ children: [/*#__PURE__*/_jsx(Text, {
15
+ style: styles.icon,
16
+ children: "\u26A0\uFE0F"
17
+ }), /*#__PURE__*/_jsx(Text, {
18
+ style: styles.message,
19
+ children: error ?? 'Something went wrong'
20
+ }), onRetry && /*#__PURE__*/_jsx(TouchableOpacity, {
21
+ style: styles.retryBtn,
22
+ onPress: onRetry,
23
+ children: /*#__PURE__*/_jsx(Text, {
24
+ style: styles.retryText,
25
+ children: "Retry"
26
+ })
27
+ })]
28
+ });
29
+ }
30
+ const styles = StyleSheet.create({
31
+ container: {
32
+ ...StyleSheet.absoluteFill,
33
+ alignItems: 'center',
34
+ justifyContent: 'center',
35
+ backgroundColor: 'rgba(0,0,0,0.75)',
36
+ gap: 12
37
+ },
38
+ icon: {
39
+ fontSize: 36
40
+ },
41
+ message: {
42
+ color: '#fff',
43
+ fontSize: 14,
44
+ textAlign: 'center',
45
+ paddingHorizontal: 24
46
+ },
47
+ retryBtn: {
48
+ marginTop: 8,
49
+ paddingHorizontal: 24,
50
+ paddingVertical: 10,
51
+ backgroundColor: '#fff',
52
+ borderRadius: 20
53
+ },
54
+ retryText: {
55
+ color: '#000',
56
+ fontWeight: '700',
57
+ fontSize: 14
58
+ }
59
+ });
60
+ //# sourceMappingURL=ErrorOverlay.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["StyleSheet","Text","TouchableOpacity","View","useVideoStore","jsx","_jsx","jsxs","_jsxs","ErrorOverlay","onRetry","status","s","error","style","styles","container","children","icon","message","retryBtn","onPress","retryText","create","absoluteFill","alignItems","justifyContent","backgroundColor","gap","fontSize","color","textAlign","paddingHorizontal","marginTop","paddingVertical","borderRadius","fontWeight"],"sourceRoot":"../../../../src","sources":["components/overlays/ErrorOverlay.tsx"],"mappings":";;AAAA,SAASA,UAAU,EAAEC,IAAI,EAAEC,gBAAgB,EAAEC,IAAI,QAAQ,cAAc;AACvE,SAASC,aAAa,QAAQ,+BAA4B;AAAC,SAAAC,GAAA,IAAAC,IAAA,EAAAC,IAAA,IAAAC,KAAA;AAM3D,OAAO,SAASC,YAAYA,CAAC;EAAEC;AAAe,CAAC,EAAE;EAC/C,MAAMC,MAAM,GAAGP,aAAa,CAAEQ,CAAC,IAAKA,CAAC,CAACD,MAAM,CAAC;EAC7C,MAAME,KAAK,GAAGT,aAAa,CAAEQ,CAAC,IAAKA,CAAC,CAACC,KAAK,CAAC;EAC3C,IAAIF,MAAM,KAAK,OAAO,EAAE,OAAO,IAAI;EAEnC,oBACEH,KAAA,CAACL,IAAI;IAACW,KAAK,EAAEC,MAAM,CAACC,SAAU;IAAAC,QAAA,gBAC5BX,IAAA,CAACL,IAAI;MAACa,KAAK,EAAEC,MAAM,CAACG,IAAK;MAAAD,QAAA,EAAC;IAAE,CAAM,CAAC,eACnCX,IAAA,CAACL,IAAI;MAACa,KAAK,EAAEC,MAAM,CAACI,OAAQ;MAAAF,QAAA,EAAEJ,KAAK,IAAI;IAAsB,CAAO,CAAC,EACpEH,OAAO,iBACNJ,IAAA,CAACJ,gBAAgB;MAACY,KAAK,EAAEC,MAAM,CAACK,QAAS;MAACC,OAAO,EAAEX,OAAQ;MAAAO,QAAA,eACzDX,IAAA,CAACL,IAAI;QAACa,KAAK,EAAEC,MAAM,CAACO,SAAU;QAAAL,QAAA,EAAC;MAAK,CAAM;IAAC,CAC3B,CACnB;EAAA,CACG,CAAC;AAEX;AAEA,MAAMF,MAAM,GAAGf,UAAU,CAACuB,MAAM,CAAC;EAC/BP,SAAS,EAAE;IACT,GAAGhB,UAAU,CAACwB,YAAY;IAC1BC,UAAU,EAAE,QAAQ;IACpBC,cAAc,EAAE,QAAQ;IACxBC,eAAe,EAAE,kBAAkB;IACnCC,GAAG,EAAE;EACP,CAAC;EACDV,IAAI,EAAE;IAAEW,QAAQ,EAAE;EAAG,CAAC;EACtBV,OAAO,EAAE;IACPW,KAAK,EAAE,MAAM;IACbD,QAAQ,EAAE,EAAE;IACZE,SAAS,EAAE,QAAQ;IACnBC,iBAAiB,EAAE;EACrB,CAAC;EACDZ,QAAQ,EAAE;IACRa,SAAS,EAAE,CAAC;IACZD,iBAAiB,EAAE,EAAE;IACrBE,eAAe,EAAE,EAAE;IACnBP,eAAe,EAAE,MAAM;IACvBQ,YAAY,EAAE;EAChB,CAAC;EACDb,SAAS,EAAE;IAAEQ,KAAK,EAAE,MAAM;IAAEM,UAAU,EAAE,KAAK;IAAEP,QAAQ,EAAE;EAAG;AAC9D,CAAC,CAAC","ignoreList":[]}
@@ -0,0 +1,118 @@
1
+ "use strict";
2
+
3
+ import React, { forwardRef, useImperativeHandle, useCallback } from 'react';
4
+ import { StyleSheet, Text, View } from 'react-native';
5
+ import Animated, { useSharedValue, useAnimatedStyle, withTiming } from 'react-native-reanimated';
6
+ import { scheduleOnRN } from 'react-native-worklets';
7
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
8
+ export const GestureIndicator = /*#__PURE__*/forwardRef((_, ref) => {
9
+ const opacity = useSharedValue(0);
10
+ const fillHeight = useSharedValue(0);
11
+
12
+ // JS state via ref to avoid re-renders
13
+ const typeRef = React.useRef('brightness');
14
+ const [type, setType] = React.useState('brightness');
15
+ const [value, setValue] = React.useState(0);
16
+ const hideTimerRef = React.useRef(undefined);
17
+ const scheduleAutoHide = useCallback(() => {
18
+ clearTimeout(hideTimerRef.current);
19
+ hideTimerRef.current = setTimeout(() => {
20
+ opacity.value = withTiming(0, {
21
+ duration: 300
22
+ });
23
+ }, 1200);
24
+ }, [opacity]);
25
+ useImperativeHandle(ref, () => ({
26
+ show: (t, v) => {
27
+ typeRef.current = t;
28
+ scheduleOnRN(() => {
29
+ setType(t);
30
+ setValue(v);
31
+ });
32
+ opacity.value = withTiming(1, {
33
+ duration: 150
34
+ });
35
+ fillHeight.value = withTiming(v, {
36
+ duration: 100
37
+ });
38
+ scheduleAutoHide();
39
+ },
40
+ update: v => {
41
+ scheduleOnRN(() => setValue(v));
42
+ fillHeight.value = withTiming(v, {
43
+ duration: 80
44
+ });
45
+ scheduleAutoHide();
46
+ },
47
+ hide: () => {
48
+ clearTimeout(hideTimerRef.current);
49
+ opacity.value = withTiming(0, {
50
+ duration: 200
51
+ });
52
+ }
53
+ }));
54
+ const containerStyle = useAnimatedStyle(() => ({
55
+ opacity: opacity.value
56
+ }));
57
+ const fillStyle = useAnimatedStyle(() => ({
58
+ height: `${fillHeight.value * 100}%`
59
+ }));
60
+ const icon = type === 'brightness' ? '☀️' : value === 0 ? '🔇' : '🔊';
61
+ return /*#__PURE__*/_jsxs(Animated.View, {
62
+ style: [styles.container, containerStyle],
63
+ pointerEvents: "none",
64
+ children: [/*#__PURE__*/_jsx(Text, {
65
+ style: styles.icon,
66
+ children: icon
67
+ }), /*#__PURE__*/_jsx(View, {
68
+ style: styles.track,
69
+ children: /*#__PURE__*/_jsx(Animated.View, {
70
+ style: [styles.fill, fillStyle]
71
+ })
72
+ }), /*#__PURE__*/_jsxs(Text, {
73
+ style: styles.value,
74
+ children: [Math.round(value * 100), "%"]
75
+ })]
76
+ });
77
+ });
78
+ const styles = StyleSheet.create({
79
+ container: {
80
+ position: 'absolute',
81
+ top: '50%',
82
+ left: '50%',
83
+ transform: [{
84
+ translateX: -28
85
+ }, {
86
+ translateY: -80
87
+ }],
88
+ alignItems: 'center',
89
+ gap: 6,
90
+ backgroundColor: 'rgba(0,0,0,0.65)',
91
+ borderRadius: 12,
92
+ paddingVertical: 10,
93
+ paddingHorizontal: 12,
94
+ width: 56
95
+ },
96
+ icon: {
97
+ fontSize: 18
98
+ },
99
+ track: {
100
+ width: 4,
101
+ height: 80,
102
+ backgroundColor: 'rgba(255,255,255,0.25)',
103
+ borderRadius: 2,
104
+ justifyContent: 'flex-end',
105
+ overflow: 'hidden'
106
+ },
107
+ fill: {
108
+ width: '100%',
109
+ backgroundColor: '#fff',
110
+ borderRadius: 2
111
+ },
112
+ value: {
113
+ color: '#fff',
114
+ fontSize: 11,
115
+ fontWeight: '600'
116
+ }
117
+ });
118
+ //# sourceMappingURL=GestureIndicator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["React","forwardRef","useImperativeHandle","useCallback","StyleSheet","Text","View","Animated","useSharedValue","useAnimatedStyle","withTiming","scheduleOnRN","jsx","_jsx","jsxs","_jsxs","GestureIndicator","_","ref","opacity","fillHeight","typeRef","useRef","type","setType","useState","value","setValue","hideTimerRef","undefined","scheduleAutoHide","clearTimeout","current","setTimeout","duration","show","t","v","update","hide","containerStyle","fillStyle","height","icon","style","styles","container","pointerEvents","children","track","fill","Math","round","create","position","top","left","transform","translateX","translateY","alignItems","gap","backgroundColor","borderRadius","paddingVertical","paddingHorizontal","width","fontSize","justifyContent","overflow","color","fontWeight"],"sourceRoot":"../../../../src","sources":["components/overlays/GestureIndicator.tsx"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+
3
+ import { Image, StyleSheet, View } from 'react-native';
4
+ import { useVideoStore } from "../core/VideoPlayerContext.js";
5
+ import { jsx as _jsx } from "react/jsx-runtime";
6
+ export function LoadingPoster({
7
+ uri
8
+ }) {
9
+ const status = useVideoStore(s => s.status);
10
+ if (!uri || status !== 'idle') return null;
11
+ return /*#__PURE__*/_jsx(View, {
12
+ style: StyleSheet.absoluteFill,
13
+ children: /*#__PURE__*/_jsx(Image, {
14
+ source: {
15
+ uri
16
+ },
17
+ style: StyleSheet.absoluteFill,
18
+ resizeMode: "cover"
19
+ })
20
+ });
21
+ }
22
+ //# sourceMappingURL=LoadingPoster.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["Image","StyleSheet","View","useVideoStore","jsx","_jsx","LoadingPoster","uri","status","s","style","absoluteFill","children","source","resizeMode"],"sourceRoot":"../../../../src","sources":["components/overlays/LoadingPoster.tsx"],"mappings":";;AAAA,SAASA,KAAK,EAAEC,UAAU,EAAEC,IAAI,QAAQ,cAAc;AACtD,SAASC,aAAa,QAAQ,+BAA4B;AAAC,SAAAC,GAAA,IAAAC,IAAA;AAM3D,OAAO,SAASC,aAAaA,CAAC;EAAEC;AAAW,CAAC,EAAE;EAC5C,MAAMC,MAAM,GAAGL,aAAa,CAAEM,CAAC,IAAKA,CAAC,CAACD,MAAM,CAAC;EAC7C,IAAI,CAACD,GAAG,IAAIC,MAAM,KAAK,MAAM,EAAE,OAAO,IAAI;EAE1C,oBACEH,IAAA,CAACH,IAAI;IAACQ,KAAK,EAAET,UAAU,CAACU,YAAa;IAAAC,QAAA,eACnCP,IAAA,CAACL,KAAK;MACJa,MAAM,EAAE;QAAEN;MAAI,CAAE;MAChBG,KAAK,EAAET,UAAU,CAACU,YAAa;MAC/BG,UAAU,EAAC;IAAO,CACnB;EAAC,CACE,CAAC;AAEX","ignoreList":[]}
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+
3
+ export { useVideoPlayer } from "./useVideoPlayer.js";
4
+ export { useVideoControls } from "./useVideoControls.js";
5
+ export { useVideoOrientation } from "./useVideoOrientation.js";
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["useVideoPlayer","useVideoControls","useVideoOrientation"],"sourceRoot":"../../../src","sources":["hooks/index.ts"],"mappings":";;AAAA,SAASA,cAAc,QAAQ,qBAAkB;AACjD,SAASC,gBAAgB,QAAQ,uBAAoB;AACrD,SAASC,mBAAmB,QAAQ,0BAAuB","ignoreList":[]}
@@ -0,0 +1,33 @@
1
+ "use strict";
2
+
3
+ import { useCallback, useRef } from 'react';
4
+ import { getBrightnessLevel, setBrightnessLevel } from '@reeq/react-native-device-brightness';
5
+ import { clamp } from "../utils/clamp.js";
6
+ export function useVideoBrightness() {
7
+ const current = useRef(null);
8
+ const init = useCallback(() => {
9
+ try {
10
+ current.current = getBrightnessLevel();
11
+ } catch (e) {
12
+ console.warn('[VideoKit] brightness init failed:', e);
13
+ }
14
+ }, []);
15
+ const adjust = useCallback(delta => {
16
+ try {
17
+ // lazy init — read current brightness on first adjust
18
+ if (current.current === null) {
19
+ current.current = getBrightnessLevel();
20
+ }
21
+ const next = clamp(current.current + delta, 0, 1);
22
+ current.current = next;
23
+ setBrightnessLevel(next);
24
+ } catch (e) {
25
+ console.warn('[VideoKit] brightness adjust failed:', e);
26
+ }
27
+ }, []);
28
+ return {
29
+ initBrightness: init,
30
+ adjustBrightness: adjust
31
+ };
32
+ }
33
+ //# sourceMappingURL=useVideoBrightness.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["useCallback","useRef","getBrightnessLevel","setBrightnessLevel","clamp","useVideoBrightness","current","init","e","console","warn","adjust","delta","next","initBrightness","adjustBrightness"],"sourceRoot":"../../../src","sources":["hooks/useVideoBrightness.ts"],"mappings":";;AAAA,SAASA,WAAW,EAAEC,MAAM,QAAQ,OAAO;AAC3C,SACEC,kBAAkB,EAClBC,kBAAkB,QACb,sCAAsC;AAC7C,SAASC,KAAK,QAAQ,mBAAgB;AAEtC,OAAO,SAASC,kBAAkBA,CAAA,EAAG;EACnC,MAAMC,OAAO,GAAGL,MAAM,CAAgB,IAAI,CAAC;EAE3C,MAAMM,IAAI,GAAGP,WAAW,CAAC,MAAM;IAC7B,IAAI;MACFM,OAAO,CAACA,OAAO,GAAGJ,kBAAkB,CAAC,CAAC;IACxC,CAAC,CAAC,OAAOM,CAAC,EAAE;MACVC,OAAO,CAACC,IAAI,CAAC,oCAAoC,EAAEF,CAAC,CAAC;IACvD;EACF,CAAC,EAAE,EAAE,CAAC;EAEN,MAAMG,MAAM,GAAGX,WAAW,CAAEY,KAAa,IAAK;IAC5C,IAAI;MACF;MACA,IAAIN,OAAO,CAACA,OAAO,KAAK,IAAI,EAAE;QAC5BA,OAAO,CAACA,OAAO,GAAGJ,kBAAkB,CAAC,CAAC;MACxC;MACA,MAAMW,IAAI,GAAGT,KAAK,CAACE,OAAO,CAACA,OAAO,GAAGM,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;MACjDN,OAAO,CAACA,OAAO,GAAGO,IAAI;MACtBV,kBAAkB,CAACU,IAAI,CAAC;IAC1B,CAAC,CAAC,OAAOL,CAAC,EAAE;MACVC,OAAO,CAACC,IAAI,CAAC,sCAAsC,EAAEF,CAAC,CAAC;IACzD;EACF,CAAC,EAAE,EAAE,CAAC;EAEN,OAAO;IAAEM,cAAc,EAAEP,IAAI;IAAEQ,gBAAgB,EAAEJ;EAAO,CAAC;AAC3D","ignoreList":[]}
@@ -0,0 +1,64 @@
1
+ "use strict";
2
+
3
+ import { useCallback, useEffect, useRef } from 'react';
4
+ import { useVideoStore, useVideoStoreApi } from "../components/core/VideoPlayerContext.js";
5
+
6
+ /**
7
+ * Manages controls visibility with an auto-hide timer.
8
+ * Call `showControls()` on any user interaction to reset the timer.
9
+ */
10
+ export function useVideoControls(autoHideDelayMs = 3000) {
11
+ const timerRef = useRef(null);
12
+ const status = useVideoStore(s => s.status);
13
+ const {} = useVideoStore(s => s);
14
+ const controlsVisible = useVideoStore(s => s.controlsVisible);
15
+ const store = useVideoStoreApi();
16
+ const clearTimer = useCallback(() => {
17
+ if (timerRef.current) {
18
+ clearTimeout(timerRef.current);
19
+ timerRef.current = null;
20
+ }
21
+ }, []);
22
+ const scheduleHide = useCallback(() => {
23
+ clearTimer();
24
+ timerRef.current = setTimeout(() => {
25
+ store.getState().setControlsVisible(false);
26
+ }, autoHideDelayMs);
27
+ }, [clearTimer, autoHideDelayMs, store]);
28
+ const showControls = useCallback(() => {
29
+ store.getState().setControlsVisible(true);
30
+ if (status === 'playing') {
31
+ scheduleHide();
32
+ }
33
+ }, [store, status, scheduleHide]);
34
+ const toggleControls = useCallback(() => {
35
+ store.getState().setControlsVisible(!controlsVisible);
36
+ }, [controlsVisible, store]);
37
+ const keepControlsVisible = useCallback(() => {
38
+ // Call this during scrub to cancel auto-hide
39
+ clearTimer();
40
+ store.getState().setControlsVisible(true);
41
+ }, [clearTimer, store]);
42
+
43
+ // When playback starts, begin the hide countdown
44
+ useEffect(() => {
45
+ if (status === 'playing' && controlsVisible) {
46
+ clearTimer();
47
+ scheduleHide();
48
+ } else if (status !== 'playing' && controlsVisible) {
49
+ clearTimer();
50
+ scheduleHide();
51
+ } else {
52
+ clearTimer();
53
+ scheduleHide();
54
+ }
55
+ return clearTimer;
56
+ }, [status, controlsVisible, scheduleHide, clearTimer]);
57
+ return {
58
+ controlsVisible,
59
+ showControls,
60
+ keepControlsVisible,
61
+ toggleControls
62
+ };
63
+ }
64
+ //# sourceMappingURL=useVideoControls.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["useCallback","useEffect","useRef","useVideoStore","useVideoStoreApi","useVideoControls","autoHideDelayMs","timerRef","status","s","controlsVisible","store","clearTimer","current","clearTimeout","scheduleHide","setTimeout","getState","setControlsVisible","showControls","toggleControls","keepControlsVisible"],"sourceRoot":"../../../src","sources":["hooks/useVideoControls.ts"],"mappings":";;AAAA,SAASA,WAAW,EAAEC,SAAS,EAAEC,MAAM,QAAQ,OAAO;AACtD,SACEC,aAAa,EACbC,gBAAgB,QACX,0CAAuC;;AAE9C;AACA;AACA;AACA;AACA,OAAO,SAASC,gBAAgBA,CAACC,eAAe,GAAG,IAAI,EAAE;EACvD,MAAMC,QAAQ,GAAGL,MAAM,CAAuC,IAAI,CAAC;EACnE,MAAMM,MAAM,GAAGL,aAAa,CAAEM,CAAC,IAAKA,CAAC,CAACD,MAAM,CAAC;EAC7C,MAAM,CAAC,CAAC,GAAGL,aAAa,CAAEM,CAAC,IAAKA,CAAC,CAAC;EAClC,MAAMC,eAAe,GAAGP,aAAa,CAAEM,CAAC,IAAKA,CAAC,CAACC,eAAe,CAAC;EAC/D,MAAMC,KAAK,GAAGP,gBAAgB,CAAC,CAAC;EAEhC,MAAMQ,UAAU,GAAGZ,WAAW,CAAC,MAAM;IACnC,IAAIO,QAAQ,CAACM,OAAO,EAAE;MACpBC,YAAY,CAACP,QAAQ,CAACM,OAAO,CAAC;MAC9BN,QAAQ,CAACM,OAAO,GAAG,IAAI;IACzB;EACF,CAAC,EAAE,EAAE,CAAC;EAEN,MAAME,YAAY,GAAGf,WAAW,CAAC,MAAM;IACrCY,UAAU,CAAC,CAAC;IACZL,QAAQ,CAACM,OAAO,GAAGG,UAAU,CAAC,MAAM;MAClCL,KAAK,CAACM,QAAQ,CAAC,CAAC,CAACC,kBAAkB,CAAC,KAAK,CAAC;IAC5C,CAAC,EAAEZ,eAAe,CAAC;EACrB,CAAC,EAAE,CAACM,UAAU,EAAEN,eAAe,EAAEK,KAAK,CAAC,CAAC;EAExC,MAAMQ,YAAY,GAAGnB,WAAW,CAAC,MAAM;IACrCW,KAAK,CAACM,QAAQ,CAAC,CAAC,CAACC,kBAAkB,CAAC,IAAI,CAAC;IACzC,IAAIV,MAAM,KAAK,SAAS,EAAE;MACxBO,YAAY,CAAC,CAAC;IAChB;EACF,CAAC,EAAE,CAACJ,KAAK,EAAEH,MAAM,EAAEO,YAAY,CAAC,CAAC;EAEjC,MAAMK,cAAc,GAAGpB,WAAW,CAAC,MAAM;IACvCW,KAAK,CAACM,QAAQ,CAAC,CAAC,CAACC,kBAAkB,CAAC,CAACR,eAAe,CAAC;EACvD,CAAC,EAAE,CAACA,eAAe,EAAEC,KAAK,CAAC,CAAC;EAE5B,MAAMU,mBAAmB,GAAGrB,WAAW,CAAC,MAAM;IAC5C;IACAY,UAAU,CAAC,CAAC;IACZD,KAAK,CAACM,QAAQ,CAAC,CAAC,CAACC,kBAAkB,CAAC,IAAI,CAAC;EAC3C,CAAC,EAAE,CAACN,UAAU,EAAED,KAAK,CAAC,CAAC;;EAEvB;EACAV,SAAS,CAAC,MAAM;IACd,IAAIO,MAAM,KAAK,SAAS,IAAIE,eAAe,EAAE;MAC3CE,UAAU,CAAC,CAAC;MACZG,YAAY,CAAC,CAAC;IAChB,CAAC,MAAM,IAAIP,MAAM,KAAK,SAAS,IAAIE,eAAe,EAAE;MAClDE,UAAU,CAAC,CAAC;MACZG,YAAY,CAAC,CAAC;IAChB,CAAC,MAAM;MACLH,UAAU,CAAC,CAAC;MACZG,YAAY,CAAC,CAAC;IAChB;IACA,OAAOH,UAAU;EACnB,CAAC,EAAE,CAACJ,MAAM,EAAEE,eAAe,EAAEK,YAAY,EAAEH,UAAU,CAAC,CAAC;EAEvD,OAAO;IAAEF,eAAe;IAAES,YAAY;IAAEE,mBAAmB;IAAED;EAAe,CAAC;AAC/E","ignoreList":[]}