myetv-player 1.0.6 → 1.0.10
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/README.md +13 -0
- package/css/myetv-player.css +374 -208
- package/css/myetv-player.min.css +1 -1
- package/dist/myetv-player.js +213 -31
- package/dist/myetv-player.min.js +188 -20
- package/package.json +3 -1
- package/plugins/youtube/README.md +13 -5
- package/plugins/youtube/myetv-player-youtube-plugin.js +1150 -141
- package/scss/_base.scss +0 -15
- package/scss/_controls.scss +311 -30
- package/scss/_menus.scss +51 -0
- package/scss/_responsive.scss +187 -321
- package/scss/_video.scss +0 -75
- package/scss/_watermark.scss +120 -0
- package/scss/myetv-player.scss +7 -7
- package/src/controls.js +73 -22
- package/src/core.js +56 -4
- package/src/events.js +33 -5
- package/src/watermark.js +51 -0
package/scss/_base.scss
CHANGED
|
@@ -101,21 +101,6 @@ body {
|
|
|
101
101
|
opacity: 0;
|
|
102
102
|
}
|
|
103
103
|
|
|
104
|
-
.video-wrapper:not(.has-controls) .video-watermark.watermark-bottomleft:not(.hide-on-autohide),
|
|
105
|
-
.video-wrapper:not(.has-controls) .video-watermark.watermark-bottomright:not(.hide-on-autohide) {
|
|
106
|
-
bottom: 15px;
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
.video-wrapper.has-controls .video-watermark {
|
|
110
|
-
visibility: visible;
|
|
111
|
-
opacity: 0.7;
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
.video-wrapper.has-controls .video-watermark.watermark-bottomleft,
|
|
115
|
-
.video-wrapper.has-controls .video-watermark.watermark-bottomright {
|
|
116
|
-
bottom: 90px;
|
|
117
|
-
}
|
|
118
|
-
|
|
119
104
|
.hidden {
|
|
120
105
|
display: none !important;
|
|
121
106
|
}
|
package/scss/_controls.scss
CHANGED
|
@@ -1,30 +1,311 @@
|
|
|
1
|
-
// ===================================
|
|
2
|
-
// CONTROLS
|
|
3
|
-
// ===================================
|
|
4
|
-
|
|
5
|
-
@use 'mixins' as *;
|
|
6
|
-
@use 'variables' as *;
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
1
|
+
// ===================================
|
|
2
|
+
// CONTROLS
|
|
3
|
+
// ===================================
|
|
4
|
+
|
|
5
|
+
@use 'mixins' as *;
|
|
6
|
+
@use 'variables' as *;
|
|
7
|
+
|
|
8
|
+
// ===================================
|
|
9
|
+
// PREVENT TEXT SELECTION DURING DRAG
|
|
10
|
+
// ===================================
|
|
11
|
+
|
|
12
|
+
// Disable text selection on all controls when dragging
|
|
13
|
+
.controls,
|
|
14
|
+
.progress-container,
|
|
15
|
+
.progress-bar,
|
|
16
|
+
.controls-main,
|
|
17
|
+
.controls-left,
|
|
18
|
+
.controls-right,
|
|
19
|
+
.time-display {
|
|
20
|
+
user-select: none; // Prevent text selection
|
|
21
|
+
-webkit-user-select: none; // Safari
|
|
22
|
+
-moz-user-select: none; // Firefox
|
|
23
|
+
-ms-user-select: none; // IE/Edge
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
// ===================================
|
|
27
|
+
// PROGRESS BAR SYSTEM
|
|
28
|
+
// ===================================
|
|
29
|
+
|
|
30
|
+
.progress-container {
|
|
31
|
+
position: relative;
|
|
32
|
+
overflow: visible !important; // Allow handle to extend outside the container
|
|
33
|
+
padding: 0; // No padding - keeps control bar height normal
|
|
34
|
+
margin-bottom: 10px; // Space below instead of padding
|
|
35
|
+
display: flex;
|
|
36
|
+
align-items: center; // Vertically center the progress bar
|
|
37
|
+
cursor: pointer;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
.progress-bar {
|
|
41
|
+
position: relative;
|
|
42
|
+
width: 100%;
|
|
43
|
+
height: 4px; // Thin progress bar
|
|
44
|
+
background: rgba(255, 255, 255, 0.3); // Semi-transparent background
|
|
45
|
+
border-radius: 2px;
|
|
46
|
+
overflow: visible !important; // Allow handle to be visible
|
|
47
|
+
cursor: pointer;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
// Buffer bar (shows buffered/loaded video)
|
|
51
|
+
.progress-buffer {
|
|
52
|
+
position: absolute;
|
|
53
|
+
left: 0;
|
|
54
|
+
top: 0;
|
|
55
|
+
height: 100%;
|
|
56
|
+
background: rgba(255, 255, 255, 0.5);
|
|
57
|
+
border-radius: 2px;
|
|
58
|
+
pointer-events: none;
|
|
59
|
+
z-index: 1; // Below filled bar
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
// Filled bar (shows watched video progress)
|
|
63
|
+
.progress-filled {
|
|
64
|
+
position: absolute;
|
|
65
|
+
left: 0;
|
|
66
|
+
top: 0;
|
|
67
|
+
height: 100%;
|
|
68
|
+
background: var(--player-accent, #ff0000); // Accent color fill
|
|
69
|
+
border-radius: 2px;
|
|
70
|
+
pointer-events: none;
|
|
71
|
+
z-index: 2; // Above buffer, below handle
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
// ===================================
|
|
75
|
+
// PROGRESS HANDLE - BASE STYLES
|
|
76
|
+
// ===================================
|
|
77
|
+
|
|
78
|
+
.progress-handle {
|
|
79
|
+
position: absolute;
|
|
80
|
+
top: 50%;
|
|
81
|
+
left: 0%;
|
|
82
|
+
transform: translate(-50%, -50%); // Center the handle
|
|
83
|
+
width: 14px;
|
|
84
|
+
height: 14px;
|
|
85
|
+
background: var(--player-accent, #ff0000);
|
|
86
|
+
cursor: grab; // Indicates draggable
|
|
87
|
+
transition: all 0.2s ease; // Smooth transition for size changes
|
|
88
|
+
z-index: 10; // Above everything (buffer and filled)
|
|
89
|
+
pointer-events: auto; // Ensure it's clickable
|
|
90
|
+
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.3); // Subtle shadow for depth
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
// Grabbing cursor when actively dragging
|
|
94
|
+
.progress-handle:active {
|
|
95
|
+
cursor: grabbing;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
// ===================================
|
|
99
|
+
// SEEK HANDLE SHAPES
|
|
100
|
+
// ===================================
|
|
101
|
+
|
|
102
|
+
// Circle - classic round handle (default recommended)
|
|
103
|
+
.progress-handle-circle {
|
|
104
|
+
border-radius: 50%; // Perfect circle
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
// Square - sharp corners
|
|
108
|
+
.progress-handle-square {
|
|
109
|
+
border-radius: 3px; // Slightly rounded corners
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
// Diamond - rotated square
|
|
113
|
+
.progress-handle-diamond {
|
|
114
|
+
border-radius: 2px;
|
|
115
|
+
transform: translate(-50%, -50%) rotate(45deg); // 45 degree rotation
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
// Arrow - pointing upward
|
|
119
|
+
.progress-handle-arrow {
|
|
120
|
+
background: transparent;
|
|
121
|
+
width: 0 !important;
|
|
122
|
+
height: 0 !important;
|
|
123
|
+
border-left: 7px solid transparent;
|
|
124
|
+
border-right: 7px solid transparent;
|
|
125
|
+
border-bottom: 14px solid var(--player-accent, #ff0000); // Triangle pointing up
|
|
126
|
+
border-radius: 0;
|
|
127
|
+
box-shadow: none; // No shadow for border-based shapes
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
// Triangle - simple triangle shape
|
|
131
|
+
.progress-handle-triangle {
|
|
132
|
+
background: transparent;
|
|
133
|
+
width: 0 !important;
|
|
134
|
+
height: 0 !important;
|
|
135
|
+
border-left: 8px solid transparent;
|
|
136
|
+
border-right: 8px solid transparent;
|
|
137
|
+
border-bottom: 14px solid var(--player-accent, #ff0000);
|
|
138
|
+
border-radius: 0;
|
|
139
|
+
box-shadow: none;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
// Heart - romantic shape using clip-path
|
|
143
|
+
.progress-handle-heart {
|
|
144
|
+
width: 16px !important;
|
|
145
|
+
height: 16px !important;
|
|
146
|
+
clip-path: polygon( 50% 15%, 65% 0%, 80% 0%, 95% 15%, 95% 30%, 50% 85%, 5% 30%, 5% 15%, 20% 0%, 35% 0% );
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
// Star - five-pointed star using clip-path
|
|
150
|
+
.progress-handle-star {
|
|
151
|
+
width: 16px !important;
|
|
152
|
+
height: 16px !important;
|
|
153
|
+
clip-path: polygon( 50% 0%, 61% 35%, 98% 35%, 68% 57%, 79% 91%, 50% 70%, 21% 91%, 32% 57%, 2% 35%, 39% 35% );
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
// None - completely hidden (no visual indicator)
|
|
157
|
+
.progress-handle-none {
|
|
158
|
+
opacity: 0 !important;
|
|
159
|
+
pointer-events: none !important;
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
// ===================================
|
|
163
|
+
// FORCE HANDLE ALWAYS VISIBLE
|
|
164
|
+
// ===================================
|
|
165
|
+
|
|
166
|
+
// Override any other rule that hides the handle
|
|
167
|
+
.progress-handle {
|
|
168
|
+
opacity: 1 !important; // Always visible
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
.progress-container .progress-handle {
|
|
172
|
+
opacity: 1 !important; // Always visible with higher specificity
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
// ===================================
|
|
176
|
+
// MOBILE TOUCH ENHANCEMENTS
|
|
177
|
+
// ===================================
|
|
178
|
+
|
|
179
|
+
// Media query for tablets and mobile devices (max width 768px)
|
|
180
|
+
@media (max-width: 768px) {
|
|
181
|
+
|
|
182
|
+
// Progress bar stays thin (4px)
|
|
183
|
+
.progress-bar {
|
|
184
|
+
height: 4px; // Keep thin
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
// Handle with large invisible touch area
|
|
188
|
+
.progress-handle {
|
|
189
|
+
touch-action: none; // Critical for mobile drag
|
|
190
|
+
-webkit-touch-callout: none; // Disable iOS callout
|
|
191
|
+
// Add large invisible touch area using pseudo-element
|
|
192
|
+
&::before {
|
|
193
|
+
content: '';
|
|
194
|
+
position: absolute;
|
|
195
|
+
top: 50%;
|
|
196
|
+
left: 50%;
|
|
197
|
+
transform: translate(-50%, -50%);
|
|
198
|
+
width: 50px; // Large touch target (50x50px)
|
|
199
|
+
height: 50px;
|
|
200
|
+
border-radius: 50%;
|
|
201
|
+
background: transparent; // Invisible but touchable
|
|
202
|
+
z-index: -1; // Behind the visible handle
|
|
203
|
+
}
|
|
204
|
+
// Scale up when touched/active
|
|
205
|
+
&:active {
|
|
206
|
+
width: 24px !important; // Grow: 14px -> 24px
|
|
207
|
+
height: 24px !important;
|
|
208
|
+
box-shadow: 0 3px 8px rgba(0, 0, 0, 0.4); // Stronger shadow when active
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
// Adjust shapes when active (touched)
|
|
213
|
+
.progress-handle-circle:active {
|
|
214
|
+
border-radius: 50%;
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
.progress-handle-square:active {
|
|
218
|
+
border-radius: 5px;
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
.progress-handle-diamond:active {
|
|
222
|
+
border-radius: 4px;
|
|
223
|
+
transform: translate(-50%, -50%) rotate(45deg);
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
.progress-handle-arrow:active {
|
|
227
|
+
border-left: 12px solid transparent;
|
|
228
|
+
border-right: 12px solid transparent;
|
|
229
|
+
border-bottom: 24px solid var(--player-accent, #ff0000);
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
.progress-handle-triangle:active {
|
|
233
|
+
border-left: 13px solid transparent;
|
|
234
|
+
border-right: 13px solid transparent;
|
|
235
|
+
border-bottom: 24px solid var(--player-accent, #ff0000);
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
.progress-handle-heart:active,
|
|
239
|
+
.progress-handle-star:active {
|
|
240
|
+
width: 26px !important;
|
|
241
|
+
height: 26px !important;
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
// Enhanced touch targets for very small screens (phones)
|
|
246
|
+
@media (max-width: 480px) {
|
|
247
|
+
|
|
248
|
+
// Progress bar stays thin on phones too
|
|
249
|
+
.progress-bar {
|
|
250
|
+
height: 4px; // Keep thin
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
.progress-handle {
|
|
254
|
+
&::before {
|
|
255
|
+
width: 60px; // Extra large touch target on phones
|
|
256
|
+
height: 60px;
|
|
257
|
+
}
|
|
258
|
+
// Even bigger when touched on phones
|
|
259
|
+
&:active {
|
|
260
|
+
width: 28px !important;
|
|
261
|
+
height: 28px !important;
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
.progress-handle-heart:active,
|
|
266
|
+
.progress-handle-star:active {
|
|
267
|
+
width: 30px !important;
|
|
268
|
+
height: 30px !important;
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
// ===================================
|
|
273
|
+
// CONTROLS CONTAINER
|
|
274
|
+
// ===================================
|
|
275
|
+
|
|
276
|
+
/* Main controls container */
|
|
277
|
+
.controls {
|
|
278
|
+
position: absolute;
|
|
279
|
+
bottom: 0;
|
|
280
|
+
left: 0;
|
|
281
|
+
right: 0;
|
|
282
|
+
background: var(--player-bg-controls);
|
|
283
|
+
padding: var(--player-controls-padding);
|
|
284
|
+
opacity: 0; // Hidden by default
|
|
285
|
+
transform: translateY(100%); // Slide out below
|
|
286
|
+
transition: all var(--player-transition-normal);
|
|
287
|
+
z-index: 10;
|
|
288
|
+
min-height: 70px !important;
|
|
289
|
+
box-sizing: border-box;
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
/* Controls visible state */
|
|
293
|
+
.controls.show {
|
|
294
|
+
opacity: 1; // Fully visible
|
|
295
|
+
transform: translateY(0); // Slide in
|
|
296
|
+
position: absolute !important;
|
|
297
|
+
bottom: 0 !important;
|
|
298
|
+
z-index: 20 !important; // Above other elements
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
// ===================================
|
|
302
|
+
// TOUCH EVENT FIXES FOR MOBILE
|
|
303
|
+
// ===================================
|
|
304
|
+
|
|
305
|
+
// Prevent default touch behavior on progress bar
|
|
306
|
+
.progress-container,
|
|
307
|
+
.progress-bar,
|
|
308
|
+
.progress-handle {
|
|
309
|
+
touch-action: none; // Disable browser's default touch gestures
|
|
310
|
+
-webkit-touch-callout: none; // Disable callout on iOS
|
|
311
|
+
}
|
package/scss/_menus.scss
CHANGED
|
@@ -4235,4 +4235,55 @@ video::-webkit-media-text-track-display {
|
|
|
4235
4235
|
/* Clickable watermark cursor */
|
|
4236
4236
|
.video-watermark[style*="cursor: pointer"] {
|
|
4237
4237
|
cursor: pointer !important;
|
|
4238
|
+
}
|
|
4239
|
+
/* ===================================
|
|
4240
|
+
FIX SUBMENU CLIPPING ON SMALL SCREENS
|
|
4241
|
+
=================================== */
|
|
4242
|
+
|
|
4243
|
+
/* Change positioning from bottom-aligned to top-aligned when menu would be clipped */
|
|
4244
|
+
/* ONLY affects submenus inside settings menu (small screen mode) */
|
|
4245
|
+
@media (max-height: 600px) {
|
|
4246
|
+
.settings-menu .settings-submenu,
|
|
4247
|
+
.settings-option .settings-submenu,
|
|
4248
|
+
.settings-option .quality-submenu,
|
|
4249
|
+
.settings-option .speed-submenu {
|
|
4250
|
+
/* Remove bottom positioning */
|
|
4251
|
+
bottom: auto !important;
|
|
4252
|
+
/* Align to top of parent option */
|
|
4253
|
+
top: 0 !important;
|
|
4254
|
+
/* Reduce max-height on very small screens */
|
|
4255
|
+
max-height: 150px !important;
|
|
4256
|
+
}
|
|
4257
|
+
}
|
|
4258
|
+
|
|
4259
|
+
/* Even smaller screens - ultra compact */
|
|
4260
|
+
@media (max-height: 400px) {
|
|
4261
|
+
.settings-menu .settings-submenu,
|
|
4262
|
+
.settings-option .settings-submenu,
|
|
4263
|
+
.settings-option .quality-submenu,
|
|
4264
|
+
.settings-option .speed-submenu {
|
|
4265
|
+
max-height: 120px !important;
|
|
4266
|
+
}
|
|
4267
|
+
}
|
|
4268
|
+
|
|
4269
|
+
/* For very small players (width < 400px) - only inside settings menu */
|
|
4270
|
+
@media (max-width: 400px) {
|
|
4271
|
+
.settings-menu .settings-submenu,
|
|
4272
|
+
.settings-option .settings-submenu,
|
|
4273
|
+
.settings-option .quality-submenu,
|
|
4274
|
+
.settings-option .speed-submenu {
|
|
4275
|
+
/* Switch to top alignment */
|
|
4276
|
+
bottom: auto !important;
|
|
4277
|
+
top: 0 !important;
|
|
4278
|
+
max-height: 180px !important;
|
|
4279
|
+
}
|
|
4280
|
+
}
|
|
4281
|
+
|
|
4282
|
+
/* EXCLUDE standalone subtitles menu (the one that appears when player is large) */
|
|
4283
|
+
/* Keep original bottom positioning for standalone menus */
|
|
4284
|
+
.subtitles-button .subtitles-menu,
|
|
4285
|
+
.yt-subtitles-submenu:not(.settings-option *),
|
|
4286
|
+
.yt-quality-submenu:not(.settings-option *) {
|
|
4287
|
+
bottom: 0 !important;
|
|
4288
|
+
top: auto !important;
|
|
4238
4289
|
}
|