mirror of
https://github.com/mediacms-io/mediacms.git
synced 2025-10-06 22:32:41 +07:00
fix: Video.js improve browser/device compatibility, fixes and a lot improvements
This commit is contained in:
File diff suppressed because it is too large
Load Diff
@@ -138,7 +138,7 @@ function ChapterList() {
|
|||||||
<button>
|
<button>
|
||||||
<svg width="24" height="24" viewBox="0 0 24 24" fill="none"
|
<svg width="24" height="24" viewBox="0 0 24 24" fill="none"
|
||||||
xmlns="http://www.w3.org/2000/svg">
|
xmlns="http://www.w3.org/2000/svg">
|
||||||
<path d="M12 16.5C12.83 16.5 13.5 17.17 13.5 18C13.5 18.83 12.83 19.5 12 19.5C11.17 19.5 10.5 18.83 10.5 18C10.5 17.17 11.17 16.5 12 16.5ZM10.5 12C10.5 12.83 11.17 13.5 12 13.5C12.83 13.5 13.5 12.83 13.5 12C13.5 11.17 12.83 10.5 12 10.5C11.17 10.5 10.5 11.17 10.5 12ZM10.5 6C10.5 6.83 11.17 7.5 12 7.5C12.83 7.5 13.5 6.83 13.5 6C13.5 5.17 12.83 4.5 12 4.5C11.17 4.5 10.5 5.17 10.5 6Z" fill="black"/>
|
<path d="M12 16.5C12.83 16.5 13.5 17.17 13.5 18C13.5 18.83 12.83 19.5 12 19.5C11.17 19.5 10.5 18.83 10.5 18C10.5 17.17 11.17 16.5 12 16.5ZM10.5 12C10.5 12.83 11.17 13.5 12 13.5C12.83 13.5 13.5 12.83 13.5 12C13.5 11.17 12.83 10.5 12 10.5C11.17 10.5 10.5 11.17 10.5 12ZM10.5 6C10.5 6.83 11.17 7.5 12 7.5C12.83 7.5 13.5 6.83 13.5 6C13.5 5.17 12.83 4.5 12 4.5C11.17 4.5 10.5 5.17 10.5 6Z" fill="currentColor"/>
|
||||||
</svg>
|
</svg>
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -51,50 +51,63 @@ class AutoplayToggleButton extends Button {
|
|||||||
className: 'vjs-control-text',
|
className: 'vjs-control-text',
|
||||||
});
|
});
|
||||||
controlTextSpan.textContent = this.isAutoplayEnabled ? 'Autoplay is on' : 'Autoplay is off';
|
controlTextSpan.textContent = this.isAutoplayEnabled ? 'Autoplay is on' : 'Autoplay is off';
|
||||||
|
|
||||||
|
console.log('✓ Autoplay button created with initial tooltip:', this.isAutoplayEnabled ? 'Autoplay is on' : 'Autoplay is off');
|
||||||
|
|
||||||
// Append both spans to button
|
// Append both spans to button
|
||||||
button.appendChild(this.iconSpan);
|
button.appendChild(this.iconSpan);
|
||||||
button.appendChild(controlTextSpan);
|
button.appendChild(controlTextSpan);
|
||||||
|
|
||||||
|
// Add touch support for mobile tooltips
|
||||||
|
this.addTouchSupport(button);
|
||||||
|
|
||||||
return button;
|
return button;
|
||||||
}
|
}
|
||||||
|
|
||||||
updateIcon() {
|
updateIcon() {
|
||||||
|
// Add transition and start fade-out
|
||||||
|
this.iconSpan.style.transition = 'opacity 0.1s ease';
|
||||||
|
this.iconSpan.style.opacity = '0';
|
||||||
|
|
||||||
|
// After fade-out complete, update innerHTML and fade back in
|
||||||
|
setTimeout(() => {
|
||||||
if (this.isAutoplayEnabled) {
|
if (this.isAutoplayEnabled) {
|
||||||
// Simple text icon for now
|
this.iconSpan.innerHTML = `<span style="transform: inherit !important; margin: 20px 0 0; font-size: 1.2em; color: #ff4444;">
|
||||||
this.iconSpan.innerHTML = `<span style=" transform: inherit !important; margin: 20px 0 0; font-size: 1.2em; color: #ff4444;"><svg width="198" height="100" viewBox="0 0 198 100" fill="none" xmlns="http://www.w3.org/2000/svg">
|
<svg width="198" height="100" viewBox="0 0 198 100" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
<rect x="18" y="18" width="180" height="64" rx="32" fill="white"/>
|
<rect y="18" width="180" height="64" rx="32" fill="white"/>
|
||||||
<rect width="100" height="100" rx="50" fill="white"/>
|
<rect x="98" width="100" height="100" rx="50" fill="white"/>
|
||||||
<path d="M53.5714 75V25H75V75H53.5714ZM25 75V25H46.4286V75H25ZM60.7143 67.8571H67.8571V32.1429H60.7143V67.8571ZM32.1429 67.8571H39.2857V32.1429H32.1429V67.8571Z" fill="#1C1B1F"/>
|
<path d="M133 69L163 50L133 31V69ZM138.455 59.0929V40.9071L152.773 50L138.455 59.0929Z" fill="#1C1B1F"/>
|
||||||
</svg></span>`;
|
</svg>
|
||||||
// Only update element properties if element exists
|
</span>`;
|
||||||
if (this.el()) {
|
if (this.el()) {
|
||||||
this.el().title = 'Autoplay is on';
|
this.el().title = 'Autoplay is on';
|
||||||
this.el().setAttribute('aria-label', 'Autoplay is on');
|
this.el().setAttribute('aria-label', 'Autoplay is on');
|
||||||
const controlText = this.el().querySelector('.vjs-control-text');
|
const controlText = this.el().querySelector('.vjs-control-text');
|
||||||
if (controlText) {
|
if (controlText) controlText.textContent = 'Autoplay is on';
|
||||||
controlText.textContent = 'Autoplay is on';
|
console.log('✓ Autoplay tooltip updated to: "Autoplay is on"');
|
||||||
}
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// Simple text icon for now
|
|
||||||
this.iconSpan.innerHTML = `<span style="transform: inherit !important; margin: 20px 0 0; font-size: 1.2em; color: #ccc;">
|
this.iconSpan.innerHTML = `<span style="transform: inherit !important; margin: 20px 0 0; font-size: 1.2em; color: #ccc;">
|
||||||
<svg width="198" height="100" viewBox="0 0 198 100" fill="none" xmlns="http://www.w3.org/2000/svg">
|
<svg width="198" height="100" viewBox="0 0 198 100" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
<rect y="18" width="180" height="64" rx="32" fill="white"/>
|
<rect x="18" y="18" width="180" height="64" rx="32" fill="white"/>
|
||||||
<rect x="98" width="100" height="100" rx="50" fill="white"/>
|
<rect width="100" height="100" rx="50" fill="white"/>
|
||||||
<path d="M129 75L168 50L129 25V75ZM136.091 61.9643V38.0357L154.705 50L136.091 61.9643Z" fill="#1C1B1F"/>
|
<path d="M52.1429 65V35H65V65H52.1429ZM35 65V35H47.8571V65H35ZM56.4286 60.7143H60.7143V39.2857H56.4286V60.7143ZM39.2857 60.7143H43.5714V39.2857H39.2857V60.7143Z" fill="#1C1B1F"/>
|
||||||
</svg></span>`;
|
</svg>
|
||||||
// Only update element properties if element exists
|
</span>`;
|
||||||
if (this.el()) {
|
if (this.el()) {
|
||||||
this.el().title = 'Autoplay is off';
|
this.el().title = 'Autoplay is off';
|
||||||
this.el().setAttribute('aria-label', 'Autoplay is off');
|
this.el().setAttribute('aria-label', 'Autoplay is off');
|
||||||
const controlText = this.el().querySelector('.vjs-control-text');
|
const controlText = this.el().querySelector('.vjs-control-text');
|
||||||
if (controlText) {
|
if (controlText) controlText.textContent = 'Autoplay is off';
|
||||||
controlText.textContent = 'Autoplay is off';
|
console.log('✓ Autoplay tooltip updated to: "Autoplay is off"');
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
// Fade back in
|
||||||
|
this.iconSpan.style.opacity = '1';
|
||||||
|
}, 100);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
handleClick() {
|
handleClick() {
|
||||||
// Toggle autoplay state
|
// Toggle autoplay state
|
||||||
@@ -110,6 +123,7 @@ class AutoplayToggleButton extends Button {
|
|||||||
this.updateIcon();
|
this.updateIcon();
|
||||||
|
|
||||||
console.log('Autoplay toggled:', this.isAutoplayEnabled ? 'ON' : 'OFF');
|
console.log('Autoplay toggled:', this.isAutoplayEnabled ? 'ON' : 'OFF');
|
||||||
|
console.log('✓ Tooltip should now show:', this.isAutoplayEnabled ? 'Autoplay is on' : 'Autoplay is off');
|
||||||
|
|
||||||
// Trigger custom event for other components to listen to
|
// Trigger custom event for other components to listen to
|
||||||
this.player().trigger('autoplayToggle', { autoplay: this.isAutoplayEnabled });
|
this.player().trigger('autoplayToggle', { autoplay: this.isAutoplayEnabled });
|
||||||
@@ -120,6 +134,46 @@ class AutoplayToggleButton extends Button {
|
|||||||
this.isAutoplayEnabled = enabled;
|
this.isAutoplayEnabled = enabled;
|
||||||
this.updateIcon();
|
this.updateIcon();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Add touch support for mobile tooltips
|
||||||
|
addTouchSupport(button) {
|
||||||
|
let touchStartTime = 0;
|
||||||
|
let touchHandled = false;
|
||||||
|
|
||||||
|
// Touch start
|
||||||
|
button.addEventListener('touchstart', (e) => {
|
||||||
|
touchStartTime = Date.now();
|
||||||
|
touchHandled = false;
|
||||||
|
}, { passive: true });
|
||||||
|
|
||||||
|
// Touch end
|
||||||
|
button.addEventListener('touchend', (e) => {
|
||||||
|
const touchDuration = Date.now() - touchStartTime;
|
||||||
|
|
||||||
|
// Only show tooltip for quick taps (not swipes)
|
||||||
|
if (touchDuration < 500) {
|
||||||
|
e.preventDefault();
|
||||||
|
e.stopPropagation();
|
||||||
|
|
||||||
|
// Show tooltip
|
||||||
|
button.classList.add('touch-active');
|
||||||
|
touchHandled = true;
|
||||||
|
|
||||||
|
// Hide tooltip after delay
|
||||||
|
setTimeout(() => {
|
||||||
|
button.classList.remove('touch-active');
|
||||||
|
}, 2000);
|
||||||
|
}
|
||||||
|
}, { passive: false });
|
||||||
|
|
||||||
|
// Click fallback for desktop
|
||||||
|
button.addEventListener('click', (e) => {
|
||||||
|
if (!touchHandled) {
|
||||||
|
// This is a desktop click, tooltip will show on hover
|
||||||
|
console.log('Desktop click on autoplay button');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Register the component
|
// Register the component
|
||||||
|
|||||||
@@ -44,19 +44,20 @@ class CustomChaptersOverlay extends Component {
|
|||||||
right: 0;
|
right: 0;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
height: 100%;
|
height: 100%;
|
||||||
z-index: 1000;
|
z-index: 9999;
|
||||||
display: none;
|
display: none;
|
||||||
pointer-events: none; /* allow clicks only on inner panel */
|
pointer-events: none;
|
||||||
background: rgba(0, 0, 0, 0.35);
|
background: rgba(0, 0, 0, 0.35);
|
||||||
`;
|
`;
|
||||||
|
|
||||||
// Build container
|
|
||||||
const container = document.createElement('div');
|
const container = document.createElement('div');
|
||||||
container.className = 'video-chapter';
|
container.className = 'video-chapter';
|
||||||
container.style.pointerEvents = 'auto';
|
container.style.cssText = `
|
||||||
|
pointer-events: auto;
|
||||||
|
z-index: 9999999;
|
||||||
|
`;
|
||||||
this.overlay.appendChild(container);
|
this.overlay.appendChild(container);
|
||||||
|
|
||||||
// Create header
|
|
||||||
const header = document.createElement('div');
|
const header = document.createElement('div');
|
||||||
header.className = 'chapter-head';
|
header.className = 'chapter-head';
|
||||||
container.appendChild(header);
|
container.appendChild(header);
|
||||||
@@ -73,7 +74,6 @@ class CustomChaptersOverlay extends Component {
|
|||||||
`;
|
`;
|
||||||
playlistTitle.appendChild(chapterTitle);
|
playlistTitle.appendChild(chapterTitle);
|
||||||
|
|
||||||
// Create close button
|
|
||||||
const chapterClose = document.createElement('div');
|
const chapterClose = document.createElement('div');
|
||||||
chapterClose.className = 'chapter-close';
|
chapterClose.className = 'chapter-close';
|
||||||
const closeBtn = document.createElement('button');
|
const closeBtn = document.createElement('button');
|
||||||
@@ -91,7 +91,6 @@ class CustomChaptersOverlay extends Component {
|
|||||||
chapterClose.appendChild(closeBtn);
|
chapterClose.appendChild(closeBtn);
|
||||||
playlistTitle.appendChild(chapterClose);
|
playlistTitle.appendChild(chapterClose);
|
||||||
|
|
||||||
// Create chapters list
|
|
||||||
const body = document.createElement('div');
|
const body = document.createElement('div');
|
||||||
body.className = 'chapter-body';
|
body.className = 'chapter-body';
|
||||||
container.appendChild(body);
|
container.appendChild(body);
|
||||||
@@ -100,7 +99,6 @@ class CustomChaptersOverlay extends Component {
|
|||||||
body.appendChild(list);
|
body.appendChild(list);
|
||||||
this.chaptersList = list;
|
this.chaptersList = list;
|
||||||
|
|
||||||
// Add chapters from data
|
|
||||||
this.chaptersData.forEach((chapter, index) => {
|
this.chaptersData.forEach((chapter, index) => {
|
||||||
const li = document.createElement('li');
|
const li = document.createElement('li');
|
||||||
const item = document.createElement('div');
|
const item = document.createElement('div');
|
||||||
@@ -116,7 +114,7 @@ class CustomChaptersOverlay extends Component {
|
|||||||
|
|
||||||
const meta = document.createElement('div');
|
const meta = document.createElement('div');
|
||||||
meta.className = 'thumbnail-meta';
|
meta.className = 'thumbnail-meta';
|
||||||
// compute duration
|
|
||||||
const totalSec = Math.max(0, Math.floor((chapter.endTime || chapter.startTime) - chapter.startTime));
|
const totalSec = Math.max(0, Math.floor((chapter.endTime || chapter.startTime) - chapter.startTime));
|
||||||
const hh = Math.floor(totalSec / 3600);
|
const hh = Math.floor(totalSec / 3600);
|
||||||
const mm = Math.floor((totalSec % 3600) / 60);
|
const mm = Math.floor((totalSec % 3600) / 60);
|
||||||
@@ -124,6 +122,7 @@ class CustomChaptersOverlay extends Component {
|
|||||||
const timeStr = hh > 0
|
const timeStr = hh > 0
|
||||||
? `${String(hh).padStart(2, '0')}:${String(mm).padStart(2, '0')}:${String(ss).padStart(2, '0')}`
|
? `${String(hh).padStart(2, '0')}:${String(mm).padStart(2, '0')}:${String(ss).padStart(2, '0')}`
|
||||||
: `${String(mm).padStart(2, '0')}:${String(ss).padStart(2, '0')}`;
|
: `${String(mm).padStart(2, '0')}:${String(ss).padStart(2, '0')}`;
|
||||||
|
|
||||||
const titleEl = document.createElement('h4');
|
const titleEl = document.createElement('h4');
|
||||||
titleEl.textContent = chapter.text;
|
titleEl.textContent = chapter.text;
|
||||||
const sub = document.createElement('div');
|
const sub = document.createElement('div');
|
||||||
@@ -145,12 +144,14 @@ class CustomChaptersOverlay extends Component {
|
|||||||
</svg>`;
|
</svg>`;
|
||||||
action.appendChild(btn);
|
action.appendChild(btn);
|
||||||
|
|
||||||
// Click to seek
|
// Mobile & desktop click/touch
|
||||||
item.onclick = () => {
|
const seekFn = () => {
|
||||||
this.player().currentTime(chapter.startTime);
|
this.player().currentTime(chapter.startTime);
|
||||||
this.overlay.style.display = 'none';
|
this.overlay.style.display = 'none';
|
||||||
this.updateActiveItem(index);
|
this.updateActiveItem(index);
|
||||||
};
|
};
|
||||||
|
item.addEventListener('click', seekFn);
|
||||||
|
item.addEventListener('touchstart', seekFn);
|
||||||
|
|
||||||
anchor.appendChild(drag);
|
anchor.appendChild(drag);
|
||||||
anchor.appendChild(meta);
|
anchor.appendChild(meta);
|
||||||
@@ -160,10 +161,8 @@ class CustomChaptersOverlay extends Component {
|
|||||||
this.chaptersList.appendChild(li);
|
this.chaptersList.appendChild(li);
|
||||||
});
|
});
|
||||||
|
|
||||||
// Add to player
|
|
||||||
playerEl.appendChild(this.overlay);
|
playerEl.appendChild(this.overlay);
|
||||||
|
|
||||||
// Set up time update listener
|
|
||||||
this.player().on('timeupdate', this.updateCurrentChapter);
|
this.player().on('timeupdate', this.updateCurrentChapter);
|
||||||
|
|
||||||
console.log('✓ Custom chapters overlay created');
|
console.log('✓ Custom chapters overlay created');
|
||||||
@@ -172,9 +171,9 @@ class CustomChaptersOverlay extends Component {
|
|||||||
setupChaptersButton() {
|
setupChaptersButton() {
|
||||||
const chaptersButton = this.player().getChild('controlBar').getChild('chaptersButton');
|
const chaptersButton = this.player().getChild('controlBar').getChild('chaptersButton');
|
||||||
if (chaptersButton) {
|
if (chaptersButton) {
|
||||||
// Override the click handler
|
chaptersButton.off('click');
|
||||||
chaptersButton.off('click'); // Remove default handler
|
|
||||||
chaptersButton.on('click', this.toggleOverlay);
|
chaptersButton.on('click', this.toggleOverlay);
|
||||||
|
chaptersButton.on('touchstart', this.toggleOverlay); // mobile support
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -182,20 +181,17 @@ class CustomChaptersOverlay extends Component {
|
|||||||
if (!this.overlay) return;
|
if (!this.overlay) return;
|
||||||
|
|
||||||
const el = this.player().el();
|
const el = this.player().el();
|
||||||
if (this.overlay.style.display === 'none' || !this.overlay.style.display) {
|
const isHidden = this.overlay.style.display === 'none' || !this.overlay.style.display;
|
||||||
this.overlay.style.display = 'block';
|
|
||||||
if (el) el.classList.add('chapters-open');
|
this.overlay.style.display = isHidden ? 'block' : 'none';
|
||||||
// hide any open menus
|
if (el) el.classList.toggle('chapters-open', isHidden);
|
||||||
try {
|
|
||||||
this.player().el().querySelectorAll('.vjs-menu').forEach((m) => {
|
try {
|
||||||
m.classList.remove('vjs-lock-showing');
|
this.player().el().querySelectorAll('.vjs-menu').forEach((m) => {
|
||||||
m.style.display = 'none';
|
m.classList.remove('vjs-lock-showing');
|
||||||
});
|
m.style.display = 'none';
|
||||||
} catch (e) {}
|
});
|
||||||
} else {
|
} catch (e) {}
|
||||||
this.overlay.style.display = 'none';
|
|
||||||
if (el) el.classList.remove('chapters-open');
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
updateCurrentChapter() {
|
updateCurrentChapter() {
|
||||||
|
|||||||
@@ -26,12 +26,12 @@
|
|||||||
|
|
||||||
/* Settings overlay styling */
|
/* Settings overlay styling */
|
||||||
.custom-settings-overlay {
|
.custom-settings-overlay {
|
||||||
border: 1px solid red;
|
border: 0;
|
||||||
position: absolute;
|
position: absolute;
|
||||||
bottom: 60px;
|
bottom: 60px;
|
||||||
right: 20px;
|
right: 20px;
|
||||||
width: 250px;
|
width: 280px;
|
||||||
height: 400px;
|
height: 350px;
|
||||||
background: rgba(28, 28, 28, 0.95);
|
background: rgba(28, 28, 28, 0.95);
|
||||||
color: white;
|
color: white;
|
||||||
border-radius: 7px;
|
border-radius: 7px;
|
||||||
@@ -39,36 +39,16 @@
|
|||||||
display: none;
|
display: none;
|
||||||
z-index: 1000;
|
z-index: 1000;
|
||||||
font-size: 14px;
|
font-size: 14px;
|
||||||
overflow: visible;
|
overflow: auto;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Settings header */
|
.settings-header {padding: 12px 16px; border-bottom: 1px solid rgba(255, 255, 255, 0.1); font-weight: bold;}
|
||||||
.settings-header {
|
.settings-item { padding: 12px 16px; cursor: pointer; display: flex; justify-content: space-between; align-items: center;
|
||||||
padding: 12px 16px;
|
border-bottom: 1px solid rgba(255, 255, 255, 0.1); transition: background 0.2s ease; gap:10px;}
|
||||||
border-bottom: 1px solid rgba(255, 255, 255, 0.1);
|
.settings-item .settings-left span{ display:flex;}
|
||||||
font-weight: bold;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Settings items */
|
|
||||||
.settings-item {
|
|
||||||
padding: 12px 16px;
|
|
||||||
cursor: pointer;
|
|
||||||
display: flex;
|
|
||||||
justify-content: space-between;
|
|
||||||
align-items: center;
|
|
||||||
border-bottom: 1px solid rgba(255, 255, 255, 0.1);
|
|
||||||
transition: background 0.2s ease;
|
|
||||||
}
|
|
||||||
.custom-settings-overlay .settings-left span.vjs-icon-placeholder {transform: inherit !important;}
|
.custom-settings-overlay .settings-left span.vjs-icon-placeholder {transform: inherit !important;}
|
||||||
|
.settings-item:last-child { border-bottom: none;}
|
||||||
|
.settings-item:hover { background: rgba(255, 255, 255, 0.05);}
|
||||||
.settings-item:last-child {
|
|
||||||
border-bottom: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
.settings-item:hover {
|
|
||||||
background: rgba(255, 255, 255, 0.05);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Speed submenu */
|
/* Speed submenu */
|
||||||
.speed-submenu {
|
.speed-submenu {
|
||||||
@@ -94,6 +74,28 @@
|
|||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Subtitles submenu styling mirrors speed/quality */
|
||||||
|
.subtitles-submenu {
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
right: 0;
|
||||||
|
bottom: 0;
|
||||||
|
background: rgba(28, 28, 28, 0.95);
|
||||||
|
display: none;
|
||||||
|
flex-direction: column;
|
||||||
|
}
|
||||||
|
.subtitle-option {
|
||||||
|
padding: 12px 16px;
|
||||||
|
cursor: pointer;
|
||||||
|
display: flex;
|
||||||
|
justify-content: space-between;
|
||||||
|
align-items: center;
|
||||||
|
transition: background 0.2s ease;
|
||||||
|
}
|
||||||
|
.subtitle-option:hover { background: rgba(255,255,255,0.05); }
|
||||||
|
.subtitle-option.active { background: rgba(255,255,255,0.1); }
|
||||||
|
|
||||||
/* Submenu header */
|
/* Submenu header */
|
||||||
.submenu-header {
|
.submenu-header {
|
||||||
padding: 12px 16px;
|
padding: 12px 16px;
|
||||||
@@ -101,10 +103,14 @@
|
|||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
|
position: sticky;
|
||||||
|
top: 0;
|
||||||
|
background: rgba(28, 28, 28, 0.95);
|
||||||
|
z-index: 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
.submenu-header:hover {
|
.submenu-header:hover {
|
||||||
background: rgba(255, 255, 255, 0.05);
|
background: rgba(28, 28, 28, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Speed options */
|
/* Speed options */
|
||||||
@@ -153,13 +159,13 @@
|
|||||||
.settings-right {
|
.settings-right {
|
||||||
display: inline-flex;
|
display: inline-flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
gap: 8px;
|
text-align:right;
|
||||||
}
|
}
|
||||||
.vjs-icon-cog:before {
|
/* .vjs-icon-cog:before {
|
||||||
font-size: 20px !important;
|
font-size: 20px !important;
|
||||||
position: relative;
|
position: relative;
|
||||||
top: -5px !important;
|
top: -5px !important;
|
||||||
}
|
} */
|
||||||
|
|
||||||
/* HD superscript badge for 1080p */
|
/* HD superscript badge for 1080p */
|
||||||
sup.hd-badge {
|
sup.hd-badge {
|
||||||
|
|||||||
@@ -14,6 +14,7 @@ class CustomSettingsMenu extends Component {
|
|||||||
this.settingsOverlay = null;
|
this.settingsOverlay = null;
|
||||||
this.speedSubmenu = null;
|
this.speedSubmenu = null;
|
||||||
this.qualitySubmenu = null;
|
this.qualitySubmenu = null;
|
||||||
|
this.subtitlesSubmenu = null;
|
||||||
this.userPreferences = options?.userPreferences || new UserPreferences();
|
this.userPreferences = options?.userPreferences || new UserPreferences();
|
||||||
this.providedQualities = options?.qualities || null;
|
this.providedQualities = options?.qualities || null;
|
||||||
|
|
||||||
@@ -25,6 +26,9 @@ class CustomSettingsMenu extends Component {
|
|||||||
this.handleSpeedChange = this.handleSpeedChange.bind(this);
|
this.handleSpeedChange = this.handleSpeedChange.bind(this);
|
||||||
this.handleQualityChange = this.handleQualityChange.bind(this);
|
this.handleQualityChange = this.handleQualityChange.bind(this);
|
||||||
this.getAvailableQualities = this.getAvailableQualities.bind(this);
|
this.getAvailableQualities = this.getAvailableQualities.bind(this);
|
||||||
|
this.createSubtitlesSubmenu = this.createSubtitlesSubmenu.bind(this);
|
||||||
|
this.refreshSubtitlesSubmenu = this.refreshSubtitlesSubmenu.bind(this);
|
||||||
|
this.handleSubtitleChange = this.handleSubtitleChange.bind(this);
|
||||||
this.handleClickOutside = this.handleClickOutside.bind(this);
|
this.handleClickOutside = this.handleClickOutside.bind(this);
|
||||||
|
|
||||||
// Initialize after player is ready
|
// Initialize after player is ready
|
||||||
@@ -43,20 +47,75 @@ class CustomSettingsMenu extends Component {
|
|||||||
// Create settings button
|
// Create settings button
|
||||||
this.settingsButton = controlBar.addChild("button", {
|
this.settingsButton = controlBar.addChild("button", {
|
||||||
controlText: "Settings",
|
controlText: "Settings",
|
||||||
className: "vjs-settings-button",
|
className: "vjs-settings-button settings-clicked",
|
||||||
});
|
});
|
||||||
|
|
||||||
// Style the settings button (gear icon)
|
// Style the settings button (gear icon)
|
||||||
const settingsButtonEl = this.settingsButton.el();
|
const settingsButtonEl = this.settingsButton.el();
|
||||||
settingsButtonEl.innerHTML = `
|
settingsButtonEl.innerHTML = `
|
||||||
<span class="vjs-icon-cog"></span>
|
<span><svg height="100%" version="1.1" viewBox="0 0 36 36" width="100%"><use class="ytp-svg-shadow" xlink:href="#ytp-id-19"></use><path d="m 23.94,18.78 c .03,-0.25 .05,-0.51 .05,-0.78 0,-0.27 -0.02,-0.52 -0.05,-0.78 l 1.68,-1.32 c .15,-0.12 .19,-0.33 .09,-0.51 l -1.6,-2.76 c -0.09,-0.17 -0.31,-0.24 -0.48,-0.17 l -1.99,.8 c -0.41,-0.32 -0.86,-0.58 -1.35,-0.78 l -0.30,-2.12 c -0.02,-0.19 -0.19,-0.33 -0.39,-0.33 l -3.2,0 c -0.2,0 -0.36,.14 -0.39,.33 l -0.30,2.12 c -0.48,.2 -0.93,.47 -1.35,.78 l -1.99,-0.8 c -0.18,-0.07 -0.39,0 -0.48,.17 l -1.6,2.76 c -0.10,.17 -0.05,.39 .09,.51 l 1.68,1.32 c -0.03,.25 -0.05,.52 -0.05,.78 0,.26 .02,.52 .05,.78 l -1.68,1.32 c -0.15,.12 -0.19,.33 -0.09,.51 l 1.6,2.76 c .09,.17 .31,.24 .48,.17 l 1.99,-0.8 c .41,.32 .86,.58 1.35,.78 l .30,2.12 c .02,.19 .19,.33 .39,.33 l 3.2,0 c .2,0 .36,-0.14 .39,-0.33 l .30,-2.12 c .48,-0.2 .93,-0.47 1.35,-0.78 l 1.99,.8 c .18,.07 .39,0 .48,-0.17 l 1.6,-2.76 c .09,-0.17 .05,-0.39 -0.09,-0.51 l -1.68,-1.32 0,0 z m -5.94,2.01 c -1.54,0 -2.8,-1.25 -2.8,-2.8 0,-1.54 1.25,-2.8 2.8,-2.8 1.54,0 2.8,1.25 2.8,2.8 0,1.54 -1.25,2.8 -2.8,2.8 l 0,0 z" fill="#fff" id="ytp-id-19"></path></svg></span>
|
||||||
|
<span class="vjs-control-text">Settings</span>
|
||||||
`;
|
`;
|
||||||
|
|
||||||
// Position the settings button at the end of the control bar
|
// Position the settings button at the end of the control bar
|
||||||
this.positionButton();
|
this.positionButton();
|
||||||
|
|
||||||
// Add click handler
|
// Add mobile touch handling and unified click handling
|
||||||
this.settingsButton.on("click", this.toggleSettings);
|
const buttonEl = this.settingsButton.el();
|
||||||
|
if (buttonEl) {
|
||||||
|
buttonEl.style.pointerEvents = 'auto';
|
||||||
|
buttonEl.style.cursor = 'pointer';
|
||||||
|
buttonEl.style.touchAction = 'manipulation';
|
||||||
|
buttonEl.style.webkitTapHighlightColor = 'transparent';
|
||||||
|
|
||||||
|
// Use a more robust approach for mobile touch handling
|
||||||
|
let touchStartTime = 0;
|
||||||
|
let touchStartPos = { x: 0, y: 0 };
|
||||||
|
let touchHandled = false;
|
||||||
|
|
||||||
|
// Handle touchstart
|
||||||
|
buttonEl.addEventListener('touchstart', (e) => {
|
||||||
|
touchStartTime = Date.now();
|
||||||
|
touchHandled = false;
|
||||||
|
const touch = e.touches[0];
|
||||||
|
touchStartPos = { x: touch.clientX, y: touch.clientY };
|
||||||
|
}, { passive: true });
|
||||||
|
|
||||||
|
// Handle touchend with proper passive handling
|
||||||
|
buttonEl.addEventListener('touchend', (e) => {
|
||||||
|
const touchEndTime = Date.now();
|
||||||
|
const touchDuration = touchEndTime - touchStartTime;
|
||||||
|
|
||||||
|
// Only handle if it's a quick tap (not a swipe)
|
||||||
|
if (touchDuration < 500) {
|
||||||
|
const touch = e.changedTouches[0];
|
||||||
|
const touchEndPos = { x: touch.clientX, y: touch.clientY };
|
||||||
|
const distance = Math.sqrt(
|
||||||
|
Math.pow(touchEndPos.x - touchStartPos.x, 2) +
|
||||||
|
Math.pow(touchEndPos.y - touchStartPos.y, 2)
|
||||||
|
);
|
||||||
|
|
||||||
|
// Only trigger if it's a tap (not a swipe)
|
||||||
|
if (distance < 50) {
|
||||||
|
e.preventDefault();
|
||||||
|
e.stopPropagation();
|
||||||
|
touchHandled = true;
|
||||||
|
this.toggleSettings(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}, { passive: false });
|
||||||
|
|
||||||
|
// Handle click events (desktop and mobile fallback)
|
||||||
|
buttonEl.addEventListener('click', (e) => {
|
||||||
|
// Only handle click if touch wasn't already handled
|
||||||
|
if (!touchHandled) {
|
||||||
|
e.preventDefault();
|
||||||
|
e.stopPropagation();
|
||||||
|
this.toggleSettings(e);
|
||||||
|
}
|
||||||
|
touchHandled = false; // Reset for next interaction
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
createSettingsOverlay() {
|
createSettingsOverlay() {
|
||||||
@@ -70,6 +129,18 @@ class CustomSettingsMenu extends Component {
|
|||||||
const currentPlaybackRate =
|
const currentPlaybackRate =
|
||||||
this.userPreferences.getPreference("playbackRate");
|
this.userPreferences.getPreference("playbackRate");
|
||||||
const currentQuality = this.userPreferences.getPreference("quality");
|
const currentQuality = this.userPreferences.getPreference("quality");
|
||||||
|
// Find current subtitle selection for label
|
||||||
|
let currentSubtitleLabel = "Off";
|
||||||
|
try {
|
||||||
|
const tt = this.player().textTracks();
|
||||||
|
for (let i = 0; i < tt.length; i++) {
|
||||||
|
const t = tt[i];
|
||||||
|
if (t.kind === "subtitles" && t.mode === "showing") {
|
||||||
|
currentSubtitleLabel = t.label || t.language || "Subtitles";
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (e) {}
|
||||||
|
|
||||||
// Format playback rate for display
|
// Format playback rate for display
|
||||||
const playbackRateLabel =
|
const playbackRateLabel =
|
||||||
@@ -109,6 +180,18 @@ class CustomSettingsMenu extends Component {
|
|||||||
<span class="vjs-icon-placeholder vjs-icon-navigate-next"></span>
|
<span class="vjs-icon-placeholder vjs-icon-navigate-next"></span>
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div class="settings-item" data-setting="subtitles">
|
||||||
|
<span class="settings-left">
|
||||||
|
<span class="vjs-icon-placeholder settings-item-svg">
|
||||||
|
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M19 4H5C3.9 4 3 4.9 3 6V18C3 19.1 3.9 20 5 20H19C20.1 20 21 19.1 21 18V6C21 4.9 20.1 4 19 4ZM11 17H5V15H11V17ZM19 13H5V11H19V13ZM19 9H5V7H19V9Z" fill="white"/></svg>
|
||||||
|
</span>
|
||||||
|
<span>Subtitles</span></span>
|
||||||
|
<span class="settings-right">
|
||||||
|
<span class="current-subtitles">${currentSubtitleLabel}</span>
|
||||||
|
<span class="vjs-icon-placeholder vjs-icon-navigate-next"></span>
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
`;
|
`;
|
||||||
|
|
||||||
// Create speed submenu
|
// Create speed submenu
|
||||||
@@ -117,8 +200,11 @@ class CustomSettingsMenu extends Component {
|
|||||||
// Create quality submenu
|
// Create quality submenu
|
||||||
this.createQualitySubmenu(qualities, activeQuality?.value);
|
this.createQualitySubmenu(qualities, activeQuality?.value);
|
||||||
|
|
||||||
|
// Create subtitles submenu (YouTube-like)
|
||||||
|
this.createSubtitlesSubmenu();
|
||||||
|
|
||||||
// Add to control bar
|
// Add to control bar
|
||||||
controlBar.el().appendChild(this.settingsOverlay);
|
this.player().el().appendChild(this.settingsOverlay);
|
||||||
}
|
}
|
||||||
|
|
||||||
createSpeedSubmenu() {
|
createSpeedSubmenu() {
|
||||||
@@ -185,6 +271,138 @@ class CustomSettingsMenu extends Component {
|
|||||||
this.settingsOverlay.appendChild(this.qualitySubmenu);
|
this.settingsOverlay.appendChild(this.qualitySubmenu);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
createSubtitlesSubmenu() {
|
||||||
|
this.subtitlesSubmenu = document.createElement("div");
|
||||||
|
this.subtitlesSubmenu.className = "subtitles-submenu";
|
||||||
|
|
||||||
|
// Header
|
||||||
|
const header = `
|
||||||
|
<div class="submenu-header">
|
||||||
|
<span style="margin-right: 8px;">←</span>
|
||||||
|
<span>Subtitles/CC</span>
|
||||||
|
</div>
|
||||||
|
`;
|
||||||
|
|
||||||
|
this.subtitlesSubmenu.innerHTML = header + '<div class="submenu-body"></div>';
|
||||||
|
this.settingsOverlay.appendChild(this.subtitlesSubmenu);
|
||||||
|
|
||||||
|
// Populate now and on demand
|
||||||
|
this.refreshSubtitlesSubmenu();
|
||||||
|
}
|
||||||
|
|
||||||
|
refreshSubtitlesSubmenu() {
|
||||||
|
if (!this.subtitlesSubmenu) return;
|
||||||
|
const body = this.subtitlesSubmenu.querySelector('.submenu-body');
|
||||||
|
if (!body) return;
|
||||||
|
const player = this.player();
|
||||||
|
const tracks = player.textTracks();
|
||||||
|
|
||||||
|
// Determine active
|
||||||
|
let activeLang = null;
|
||||||
|
for (let i = 0; i < tracks.length; i++) {
|
||||||
|
const t = tracks[i];
|
||||||
|
if (t.kind === 'subtitles' && t.mode === 'showing') {
|
||||||
|
activeLang = t.language;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Build items: Off + languages
|
||||||
|
const items = [];
|
||||||
|
items.push({ label: 'Off', lang: null });
|
||||||
|
for (let i = 0; i < tracks.length; i++) {
|
||||||
|
const t = tracks[i];
|
||||||
|
if (t.kind === 'subtitles') {
|
||||||
|
items.push({ label: t.label || t.language || `Track ${i}`, lang: t.language, track: t });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
body.innerHTML = items.map((it) => `
|
||||||
|
<div class="subtitle-option ${it.lang === activeLang ? 'active' : ''}" data-lang="${it.lang || ''}">
|
||||||
|
<span>${it.label}</span>
|
||||||
|
${it.lang === activeLang ? '<span class="checkmark">✓</span>' : ''}
|
||||||
|
</div>
|
||||||
|
`).join('');
|
||||||
|
|
||||||
|
// Also update the current subtitle display in main settings
|
||||||
|
this.updateCurrentSubtitleDisplay();
|
||||||
|
}
|
||||||
|
|
||||||
|
updateCurrentSubtitleDisplay() {
|
||||||
|
try {
|
||||||
|
const player = this.player();
|
||||||
|
const tracks = player.textTracks();
|
||||||
|
let currentSubtitleLabel = "Off";
|
||||||
|
let activeTrack = null;
|
||||||
|
|
||||||
|
// Find the active subtitle track
|
||||||
|
for (let i = 0; i < tracks.length; i++) {
|
||||||
|
const t = tracks[i];
|
||||||
|
if (t.kind === 'subtitles' && t.mode === 'showing') {
|
||||||
|
currentSubtitleLabel = t.label || t.language || "Subtitles";
|
||||||
|
activeTrack = t;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const currentSubtitlesDisplay = this.settingsOverlay.querySelector('.current-subtitles');
|
||||||
|
if (currentSubtitlesDisplay) {
|
||||||
|
const oldValue = currentSubtitlesDisplay.textContent;
|
||||||
|
currentSubtitlesDisplay.textContent = currentSubtitleLabel;
|
||||||
|
|
||||||
|
// Only log if the value actually changed
|
||||||
|
if (oldValue !== currentSubtitleLabel) {
|
||||||
|
console.log(`Updated current subtitle display: "${oldValue}" → "${currentSubtitleLabel}"`);
|
||||||
|
if (activeTrack) {
|
||||||
|
console.log(`Active track details: language="${activeTrack.language}", label="${activeTrack.label}", mode="${activeTrack.mode}"`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
console.warn('Could not find .current-subtitles element in settings overlay');
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
console.error('Error updating current subtitle display:', error);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Method to periodically check and update subtitle display
|
||||||
|
startSubtitleSync() {
|
||||||
|
// Update immediately
|
||||||
|
this.updateCurrentSubtitleDisplay();
|
||||||
|
|
||||||
|
// Listen for real-time subtitle changes
|
||||||
|
this.player().on('texttrackchange', () => {
|
||||||
|
console.log('Text track changed - updating subtitle display');
|
||||||
|
this.updateCurrentSubtitleDisplay();
|
||||||
|
// Also refresh the subtitle submenu to show correct selection
|
||||||
|
this.refreshSubtitlesSubmenu();
|
||||||
|
});
|
||||||
|
|
||||||
|
// Set up periodic updates every 2 seconds as backup
|
||||||
|
this.subtitleSyncInterval = setInterval(() => {
|
||||||
|
this.updateCurrentSubtitleDisplay();
|
||||||
|
}, 2000);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Method to stop subtitle sync
|
||||||
|
stopSubtitleSync() {
|
||||||
|
if (this.subtitleSyncInterval) {
|
||||||
|
clearInterval(this.subtitleSyncInterval);
|
||||||
|
this.subtitleSyncInterval = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Cleanup method
|
||||||
|
dispose() {
|
||||||
|
this.stopSubtitleSync();
|
||||||
|
// Remove event listeners
|
||||||
|
document.removeEventListener("click", this.handleClickOutside);
|
||||||
|
// Remove text track change listener
|
||||||
|
if (this.player()) {
|
||||||
|
this.player().off('texttrackchange');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
getAvailableQualities() {
|
getAvailableQualities() {
|
||||||
// Priority: provided options -> MEDIA_DATA JSON -> player sources -> default
|
// Priority: provided options -> MEDIA_DATA JSON -> player sources -> default
|
||||||
const desiredOrder = [
|
const desiredOrder = [
|
||||||
@@ -325,21 +543,70 @@ class CustomSettingsMenu extends Component {
|
|||||||
this.qualitySubmenu.style.display = "flex";
|
this.qualitySubmenu.style.display = "flex";
|
||||||
this.speedSubmenu.style.display = "none";
|
this.speedSubmenu.style.display = "none";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (e.target.closest('[data-setting="subtitles"]')) {
|
||||||
|
this.refreshSubtitlesSubmenu();
|
||||||
|
this.subtitlesSubmenu.style.display = "flex";
|
||||||
|
this.speedSubmenu.style.display = "none";
|
||||||
|
this.qualitySubmenu.style.display = "none";
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
// Speed submenu header (back button)
|
// Mobile touch events for settings items
|
||||||
this.speedSubmenu
|
this.settingsOverlay.addEventListener("touchend", (e) => {
|
||||||
.querySelector(".submenu-header")
|
e.preventDefault();
|
||||||
.addEventListener("click", () => {
|
e.stopPropagation();
|
||||||
|
|
||||||
|
if (e.target.closest('[data-setting="playback-speed"]')) {
|
||||||
|
this.speedSubmenu.style.display = "flex";
|
||||||
|
this.qualitySubmenu.style.display = "none";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (e.target.closest('[data-setting="quality"]')) {
|
||||||
|
this.qualitySubmenu.style.display = "flex";
|
||||||
this.speedSubmenu.style.display = "none";
|
this.speedSubmenu.style.display = "none";
|
||||||
});
|
}
|
||||||
|
|
||||||
|
if (e.target.closest('[data-setting="subtitles"]')) {
|
||||||
|
this.refreshSubtitlesSubmenu();
|
||||||
|
this.subtitlesSubmenu.style.display = "flex";
|
||||||
|
this.speedSubmenu.style.display = "none";
|
||||||
|
this.qualitySubmenu.style.display = "none";
|
||||||
|
}
|
||||||
|
}, { passive: false });
|
||||||
|
|
||||||
|
// Speed submenu header (back button)
|
||||||
|
const speedHeader = this.speedSubmenu.querySelector(".submenu-header");
|
||||||
|
speedHeader.addEventListener("click", () => {
|
||||||
|
this.speedSubmenu.style.display = "none";
|
||||||
|
});
|
||||||
|
speedHeader.addEventListener("touchend", (e) => {
|
||||||
|
e.preventDefault();
|
||||||
|
e.stopPropagation();
|
||||||
|
this.speedSubmenu.style.display = "none";
|
||||||
|
}, { passive: false });
|
||||||
|
|
||||||
// Quality submenu header (back button)
|
// Quality submenu header (back button)
|
||||||
this.qualitySubmenu
|
const qualityHeader = this.qualitySubmenu.querySelector(".submenu-header");
|
||||||
.querySelector(".submenu-header")
|
qualityHeader.addEventListener("click", () => {
|
||||||
.addEventListener("click", () => {
|
this.qualitySubmenu.style.display = "none";
|
||||||
this.qualitySubmenu.style.display = "none";
|
});
|
||||||
});
|
qualityHeader.addEventListener("touchend", (e) => {
|
||||||
|
e.preventDefault();
|
||||||
|
e.stopPropagation();
|
||||||
|
this.qualitySubmenu.style.display = "none";
|
||||||
|
}, { passive: false });
|
||||||
|
|
||||||
|
// Subtitles submenu header (back)
|
||||||
|
const subtitlesHeader = this.subtitlesSubmenu.querySelector(".submenu-header");
|
||||||
|
subtitlesHeader.addEventListener("click", () => {
|
||||||
|
this.subtitlesSubmenu.style.display = "none";
|
||||||
|
});
|
||||||
|
subtitlesHeader.addEventListener("touchend", (e) => {
|
||||||
|
e.preventDefault();
|
||||||
|
e.stopPropagation();
|
||||||
|
this.subtitlesSubmenu.style.display = "none";
|
||||||
|
}, { passive: false });
|
||||||
|
|
||||||
// Speed option clicks
|
// Speed option clicks
|
||||||
this.speedSubmenu.addEventListener("click", (e) => {
|
this.speedSubmenu.addEventListener("click", (e) => {
|
||||||
@@ -350,6 +617,17 @@ class CustomSettingsMenu extends Component {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// Mobile touch events for speed options
|
||||||
|
this.speedSubmenu.addEventListener("touchend", (e) => {
|
||||||
|
e.preventDefault();
|
||||||
|
e.stopPropagation();
|
||||||
|
const speedOption = e.target.closest(".speed-option");
|
||||||
|
if (speedOption) {
|
||||||
|
const speed = parseFloat(speedOption.dataset.speed);
|
||||||
|
this.handleSpeedChange(speed, speedOption);
|
||||||
|
}
|
||||||
|
}, { passive: false });
|
||||||
|
|
||||||
// Quality option clicks
|
// Quality option clicks
|
||||||
this.qualitySubmenu.addEventListener("click", (e) => {
|
this.qualitySubmenu.addEventListener("click", (e) => {
|
||||||
const qualityOption = e.target.closest(".quality-option");
|
const qualityOption = e.target.closest(".quality-option");
|
||||||
@@ -359,6 +637,37 @@ class CustomSettingsMenu extends Component {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// Mobile touch events for quality options
|
||||||
|
this.qualitySubmenu.addEventListener("touchend", (e) => {
|
||||||
|
e.preventDefault();
|
||||||
|
e.stopPropagation();
|
||||||
|
const qualityOption = e.target.closest(".quality-option");
|
||||||
|
if (qualityOption) {
|
||||||
|
const value = qualityOption.dataset.quality;
|
||||||
|
this.handleQualityChange(value, qualityOption);
|
||||||
|
}
|
||||||
|
}, { passive: false });
|
||||||
|
|
||||||
|
// Subtitle option clicks
|
||||||
|
this.subtitlesSubmenu.addEventListener('click', (e) => {
|
||||||
|
const opt = e.target.closest('.subtitle-option');
|
||||||
|
if (opt) {
|
||||||
|
const lang = opt.dataset.lang || null;
|
||||||
|
this.handleSubtitleChange(lang, opt);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// Mobile touch events for subtitle options
|
||||||
|
this.subtitlesSubmenu.addEventListener('touchend', (e) => {
|
||||||
|
e.preventDefault();
|
||||||
|
e.stopPropagation();
|
||||||
|
const opt = e.target.closest('.subtitle-option');
|
||||||
|
if (opt) {
|
||||||
|
const lang = opt.dataset.lang || null;
|
||||||
|
this.handleSubtitleChange(lang, opt);
|
||||||
|
}
|
||||||
|
}, { passive: false });
|
||||||
|
|
||||||
// Close menu when clicking outside
|
// Close menu when clicking outside
|
||||||
document.addEventListener("click", this.handleClickOutside);
|
document.addEventListener("click", this.handleClickOutside);
|
||||||
|
|
||||||
@@ -376,14 +685,33 @@ class CustomSettingsMenu extends Component {
|
|||||||
item.style.background = "transparent";
|
item.style.background = "transparent";
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// Start subtitle synchronization
|
||||||
|
this.startSubtitleSync();
|
||||||
}
|
}
|
||||||
|
|
||||||
toggleSettings(e) {
|
toggleSettings(e) {
|
||||||
e.stopPropagation();
|
e.stopPropagation();
|
||||||
const isVisible = this.settingsOverlay.style.display === "block";
|
const isVisible = this.settingsOverlay.classList.contains("show");
|
||||||
this.settingsOverlay.style.display = isVisible ? "none" : "block";
|
|
||||||
|
if (isVisible) {
|
||||||
|
this.settingsOverlay.classList.remove("show");
|
||||||
|
this.settingsOverlay.style.display = "none";
|
||||||
|
} else {
|
||||||
|
this.settingsOverlay.classList.add("show");
|
||||||
|
this.settingsOverlay.style.display = "block";
|
||||||
|
}
|
||||||
|
|
||||||
this.speedSubmenu.style.display = "none"; // Hide submenu when main menu toggles
|
this.speedSubmenu.style.display = "none"; // Hide submenu when main menu toggles
|
||||||
if (this.qualitySubmenu) this.qualitySubmenu.style.display = "none";
|
if (this.qualitySubmenu) this.qualitySubmenu.style.display = "none";
|
||||||
|
const btnEl = this.settingsButton?.el();
|
||||||
|
if (btnEl) {
|
||||||
|
if (!isVisible) {
|
||||||
|
btnEl.classList.add("settings-clicked");
|
||||||
|
} else {
|
||||||
|
btnEl.classList.remove("settings-clicked");
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
handleSpeedChange(speed, speedOption) {
|
handleSpeedChange(speed, speedOption) {
|
||||||
@@ -466,11 +794,15 @@ class CustomSettingsMenu extends Component {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
console.log("Switching quality to", selected.label, selected.src);
|
|
||||||
|
|
||||||
player.addClass("vjs-changing-resolution");
|
player.addClass("vjs-changing-resolution");
|
||||||
|
player.isChangingQuality = true; // Flag to prevent seek indicator during quality change
|
||||||
player.src({ src: selected.src, type: selected.type || "video/mp4" });
|
player.src({ src: selected.src, type: selected.type || "video/mp4" });
|
||||||
|
|
||||||
|
if (wasPaused) {
|
||||||
|
player.pause();
|
||||||
|
}
|
||||||
|
|
||||||
const onLoaded = () => {
|
const onLoaded = () => {
|
||||||
// Restore time, rate, subtitles
|
// Restore time, rate, subtitles
|
||||||
try {
|
try {
|
||||||
@@ -479,8 +811,11 @@ class CustomSettingsMenu extends Component {
|
|||||||
try {
|
try {
|
||||||
if (!isNaN(currentTime)) player.currentTime(currentTime);
|
if (!isNaN(currentTime)) player.currentTime(currentTime);
|
||||||
} catch (e) {}
|
} catch (e) {}
|
||||||
|
// Play or pause based on previous state
|
||||||
if (!wasPaused) {
|
if (!wasPaused) {
|
||||||
player.play().catch(() => {});
|
player.play().catch(() => {});
|
||||||
|
} else {
|
||||||
|
player.pause();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Restore subtitles
|
// Restore subtitles
|
||||||
@@ -525,13 +860,47 @@ class CustomSettingsMenu extends Component {
|
|||||||
player.on("loadedmetadata", onLoaded);
|
player.on("loadedmetadata", onLoaded);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Close overlay to avoid covering the CC button
|
// Close only the quality submenu (keep overlay open)
|
||||||
if (this.qualitySubmenu) this.qualitySubmenu.style.display = "none";
|
if (this.qualitySubmenu) this.qualitySubmenu.style.display = "none";
|
||||||
this.settingsOverlay.style.display = "none";
|
|
||||||
|
|
||||||
console.log("Quality preference saved:", value);
|
console.log("Quality preference saved:", value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
handleSubtitleChange(lang, optionEl) {
|
||||||
|
const player = this.player();
|
||||||
|
const tracks = player.textTracks();
|
||||||
|
|
||||||
|
// Update tracks
|
||||||
|
for (let i = 0; i < tracks.length; i++) {
|
||||||
|
const t = tracks[i];
|
||||||
|
if (t.kind === 'subtitles') {
|
||||||
|
t.mode = lang && t.language === lang ? 'showing' : 'disabled';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Save preference via UserPreferences (force set)
|
||||||
|
this.userPreferences.setPreference('subtitleLanguage', lang || null, true);
|
||||||
|
|
||||||
|
// Update UI selection
|
||||||
|
this.subtitlesSubmenu.querySelectorAll('.subtitle-option').forEach((opt) => {
|
||||||
|
opt.classList.remove('active');
|
||||||
|
opt.style.background = 'transparent';
|
||||||
|
const check = opt.querySelector('.checkmark');
|
||||||
|
if (check) check.remove();
|
||||||
|
});
|
||||||
|
optionEl.classList.add('active');
|
||||||
|
optionEl.style.background = 'rgba(255, 255, 255, 0.1)';
|
||||||
|
optionEl.insertAdjacentHTML('beforeend', '<span class="checkmark">✓</span>');
|
||||||
|
|
||||||
|
// Update label in main settings
|
||||||
|
const label = lang ? (optionEl.querySelector('span')?.textContent || lang) : 'Off';
|
||||||
|
const currentSubtitlesDisplay = this.settingsOverlay.querySelector('.current-subtitles');
|
||||||
|
if (currentSubtitlesDisplay) currentSubtitlesDisplay.textContent = label;
|
||||||
|
|
||||||
|
// Close only the subtitles submenu (keep overlay open)
|
||||||
|
this.subtitlesSubmenu.style.display = 'none';
|
||||||
|
}
|
||||||
|
|
||||||
handleClickOutside(e) {
|
handleClickOutside(e) {
|
||||||
if (
|
if (
|
||||||
this.settingsOverlay &&
|
this.settingsOverlay &&
|
||||||
@@ -539,9 +908,14 @@ class CustomSettingsMenu extends Component {
|
|||||||
!this.settingsOverlay.contains(e.target) &&
|
!this.settingsOverlay.contains(e.target) &&
|
||||||
!this.settingsButton.el().contains(e.target)
|
!this.settingsButton.el().contains(e.target)
|
||||||
) {
|
) {
|
||||||
|
this.settingsOverlay.classList.remove("show");
|
||||||
this.settingsOverlay.style.display = "none";
|
this.settingsOverlay.style.display = "none";
|
||||||
this.speedSubmenu.style.display = "none";
|
this.speedSubmenu.style.display = "none";
|
||||||
if (this.qualitySubmenu) this.qualitySubmenu.style.display = "none";
|
if (this.qualitySubmenu) this.qualitySubmenu.style.display = "none";
|
||||||
|
const btnEl = this.settingsButton?.el();
|
||||||
|
if (btnEl) {
|
||||||
|
btnEl.classList.remove("settings-clicked");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -24,9 +24,10 @@ class NextVideoButton extends Button {
|
|||||||
|
|
||||||
// Create SVG that matches Video.js icon dimensions
|
// Create SVG that matches Video.js icon dimensions
|
||||||
iconSpan.innerHTML = `
|
iconSpan.innerHTML = `
|
||||||
<svg viewBox="0 0 24 24" width="2em" height="2em" fill="currentColor" style="position: relative; top: 3px; left: 8px; right: 0; bottom: 0; margin: auto; cursor: pointer;">
|
<svg width="48" height="48" viewBox="0 0 48 48" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
<path d="M6 18l8.5-6L6 6v12zM16 6v12h2V6h-2z"/>
|
<path d="M14 34L28.1667 24L14 14V34ZM30.6667 14V34H34V14H30.6667Z" fill="currentColor"/>
|
||||||
</svg>
|
</svg>
|
||||||
|
|
||||||
`;
|
`;
|
||||||
|
|
||||||
// Create control text span
|
// Create control text span
|
||||||
|
|||||||
@@ -33,8 +33,8 @@ class SeekIndicator extends Component {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Show seek indicator with direction and amount
|
* Show seek indicator with direction and amount
|
||||||
* @param {string} direction - 'forward' or 'backward'
|
* @param {string} direction - 'forward', 'backward', 'play', or 'pause'
|
||||||
* @param {number} seconds - Number of seconds to seek
|
* @param {number} seconds - Number of seconds to seek (only used for forward/backward)
|
||||||
*/
|
*/
|
||||||
show(direction, seconds = this.seekAmount) {
|
show(direction, seconds = this.seekAmount) {
|
||||||
const el = this.el();
|
const el = this.el();
|
||||||
@@ -84,17 +84,17 @@ class SeekIndicator extends Component {
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
`;
|
`;
|
||||||
} else {
|
} else if (direction === 'backward') {
|
||||||
iconEl.innerHTML = `
|
iconEl.innerHTML = `
|
||||||
<div style="display: flex; align-items: center; justify-content: center; animation: youtubeSeekPulse 0.3s ease-out;">
|
<div style="display: flex; align-items: center; justify-content: center; animation: youtubeSeekPulse 0.3s ease-out;">
|
||||||
<div style="
|
<div style="
|
||||||
width: 80px;
|
width: 80px;
|
||||||
height: 80px;
|
height: 80px;
|
||||||
border-radius: 50%;
|
border-radius: 50%;
|
||||||
background: rgba(0, 0, 0, 0.3);
|
background: rgba(0, 0, 0, 0.3);
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
border: none;
|
border: none;
|
||||||
outline: none;
|
outline: none;
|
||||||
@@ -121,6 +121,52 @@ class SeekIndicator extends Component {
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
`;
|
`;
|
||||||
|
} else if (direction === 'play') {
|
||||||
|
iconEl.innerHTML = `
|
||||||
|
<div style="display: flex; align-items: center; justify-content: center; animation: youtubeSeekPulse 0.3s ease-out;">
|
||||||
|
<div style="
|
||||||
|
width: 80px;
|
||||||
|
height: 80px;
|
||||||
|
border-radius: 50%;
|
||||||
|
background: rgba(0, 0, 0, 0.3);
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
border: none;
|
||||||
|
outline: none;
|
||||||
|
box-sizing: border-box;
|
||||||
|
overflow: hidden;
|
||||||
|
">
|
||||||
|
<svg viewBox="0 0 24 24" width="32" height="32" fill="white" style="filter: drop-shadow(0 1px 2px rgba(0, 0, 0, 0.5));">
|
||||||
|
<path d="M8 5v14l11-7z"/>
|
||||||
|
</svg>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
`;
|
||||||
|
textEl.textContent = 'Play';
|
||||||
|
} else if (direction === 'pause') {
|
||||||
|
iconEl.innerHTML = `
|
||||||
|
<div style="display: flex; align-items: center; justify-content: center; animation: youtubeSeekPulse 0.3s ease-out;">
|
||||||
|
<div style="
|
||||||
|
width: 80px;
|
||||||
|
height: 80px;
|
||||||
|
border-radius: 50%;
|
||||||
|
background: rgba(0, 0, 0, 0.3);
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
border: none;
|
||||||
|
outline: none;
|
||||||
|
box-sizing: border-box;
|
||||||
|
overflow: hidden;
|
||||||
|
">
|
||||||
|
<svg viewBox="0 0 24 24" width="32" height="32" fill="white" style="filter: drop-shadow(0 1px 2px rgba(0, 0, 0, 0.5));">
|
||||||
|
<path d="M6 19h4V5H6v14zm8-14v14h4V5h-4z"/>
|
||||||
|
</svg>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
`;
|
||||||
|
textEl.textContent = 'Pause';
|
||||||
}
|
}
|
||||||
|
|
||||||
// Clear any text content in the text element
|
// Clear any text content in the text element
|
||||||
|
|||||||
@@ -90,73 +90,56 @@ class ChapterMarkers extends Component {
|
|||||||
|
|
||||||
// Style the floating tooltip
|
// Style the floating tooltip
|
||||||
Object.assign(this.tooltip.style, {
|
Object.assign(this.tooltip.style, {
|
||||||
position: 'absolute',
|
position: 'absolute',
|
||||||
background: 'rgba(0, 0, 0, 0.9)',
|
|
||||||
color: 'white',
|
|
||||||
padding: '8px 12px',
|
|
||||||
borderRadius: '6px',
|
|
||||||
fontSize: '12px',
|
|
||||||
whiteSpace: 'nowrap',
|
|
||||||
pointerEvents: 'none',
|
|
||||||
zIndex: '1000',
|
zIndex: '1000',
|
||||||
bottom: '45px',
|
bottom: '45px',
|
||||||
transform: 'translateX(-50%)',
|
transform: 'translateX(-50%)',
|
||||||
display: 'none',
|
display: 'none',
|
||||||
minWidth: '200px',
|
minWidth: '160px',
|
||||||
maxWidth: '280px',
|
maxWidth: '200px',
|
||||||
width: 'auto',
|
width: 'auto',
|
||||||
textAlign: 'center',
|
|
||||||
border: '1px solid rgba(255, 255, 255, 0.2)',
|
|
||||||
boxShadow: '0 2px 8px rgba(0, 0, 0, 0.3)',
|
|
||||||
});
|
});
|
||||||
|
|
||||||
// Create stable DOM structure to avoid trembling
|
// Create stable DOM structure to avoid trembling
|
||||||
this.chapterTitle = videojs.dom.createEl('div', {
|
this.chapterTitle = videojs.dom.createEl('div', {
|
||||||
className: 'chapter-title',
|
className: 'chapter-title',
|
||||||
});
|
});
|
||||||
Object.assign(this.chapterTitle.style, {
|
// Object.assign(this.chapterTitle.style, {
|
||||||
fontWeight: 'bold',
|
// fontWeight: 'bold',
|
||||||
marginBottom: '4px',
|
// marginBottom: '4px',
|
||||||
color: '#fff',
|
// color: '#fff',
|
||||||
});
|
// });
|
||||||
|
|
||||||
this.chapterInfo = videojs.dom.createEl('div', {
|
this.chapterInfo = videojs.dom.createEl('div', {
|
||||||
className: 'chapter-info',
|
className: 'chapter-info',
|
||||||
});
|
});
|
||||||
Object.assign(this.chapterInfo.style, {
|
// Object.assign(this.chapterInfo.style, {
|
||||||
fontSize: '11px',
|
// fontSize: '11px',
|
||||||
opacity: '0.8',
|
// opacity: '0.8',
|
||||||
marginBottom: '2px',
|
// marginBottom: '2px',
|
||||||
});
|
// });
|
||||||
|
|
||||||
this.positionInfo = videojs.dom.createEl('div', {
|
this.positionInfo = videojs.dom.createEl('div', {
|
||||||
className: 'position-info',
|
className: 'position-info',
|
||||||
});
|
});
|
||||||
Object.assign(this.positionInfo.style, {
|
// Object.assign(this.positionInfo.style, {
|
||||||
fontSize: '10px',
|
// fontSize: '10px',
|
||||||
opacity: '0.6',
|
// opacity: '0.6',
|
||||||
});
|
// });
|
||||||
|
|
||||||
this.chapterImage = videojs.dom.createEl('div', {
|
this.chapterImage = videojs.dom.createEl('div', {
|
||||||
className: 'chapter-image-sprite',
|
className: 'chapter-image-sprite',
|
||||||
});
|
});
|
||||||
Object.assign(this.chapterImage.style, {
|
Object.assign(this.chapterImage.style, {
|
||||||
width: '160px',
|
|
||||||
height: '90px',
|
|
||||||
marginTop: '8px',
|
|
||||||
borderRadius: '4px',
|
|
||||||
border: '1px solid rgba(255,255,255,0.1)',
|
|
||||||
display: 'block',
|
display: 'block',
|
||||||
overflow: 'hidden',
|
overflow: 'hidden',
|
||||||
backgroundRepeat: 'no-repeat',
|
|
||||||
backgroundSize: 'auto',
|
|
||||||
});
|
});
|
||||||
|
|
||||||
// Append all elements to tooltip
|
// Append all elements to tooltip
|
||||||
this.tooltip.appendChild(this.chapterTitle);
|
this.tooltip.appendChild(this.chapterTitle);
|
||||||
|
this.tooltip.appendChild(this.chapterImage);
|
||||||
this.tooltip.appendChild(this.chapterInfo);
|
this.tooltip.appendChild(this.chapterInfo);
|
||||||
this.tooltip.appendChild(this.positionInfo);
|
this.tooltip.appendChild(this.positionInfo);
|
||||||
this.tooltip.appendChild(this.chapterImage);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Add tooltip to seekBar if not already added
|
// Add tooltip to seekBar if not already added
|
||||||
|
|||||||
@@ -10,7 +10,7 @@
|
|||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
z-index: 1000;
|
z-index: 100000;
|
||||||
padding: 20px;
|
padding: 20px;
|
||||||
box-sizing: border-box;
|
box-sizing: border-box;
|
||||||
backdrop-filter: blur(4px);
|
backdrop-filter: blur(4px);
|
||||||
@@ -23,62 +23,104 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
.autoplay-countdown-content {
|
.autoplay-countdown-content {
|
||||||
background: rgba(0, 0, 0, 0.9);
|
background: linear-gradient(135deg, rgba(0, 0, 0, 0.95), rgba(20, 20, 20, 0.9));
|
||||||
border-radius: 12px;
|
border-radius: 20px;
|
||||||
padding: 24px;
|
padding: 50px;
|
||||||
max-width: 400px;
|
max-width: 480px;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
box-shadow: 0 8px 32px rgba(0, 0, 0, 0.3);
|
box-shadow:
|
||||||
border: 1px solid rgba(255, 255, 255, 0.1);
|
0 20px 60px rgba(0, 0, 0, 0.4),
|
||||||
|
0 8px 32px rgba(0, 0, 0, 0.2),
|
||||||
|
inset 0 1px 0 rgba(255, 255, 255, 0.1);
|
||||||
|
border: 1px solid rgba(255, 255, 255, 0.15);
|
||||||
|
backdrop-filter: blur(20px);
|
||||||
|
position: relative;
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
.autoplay-countdown-content::before {
|
||||||
|
content: '';
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
right: 0;
|
||||||
|
height: 1px;
|
||||||
|
background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.3), transparent);
|
||||||
|
}
|
||||||
|
|
||||||
|
.autoplay-countdown-content::after {
|
||||||
|
content: '';
|
||||||
|
position: absolute;
|
||||||
|
top: -50%;
|
||||||
|
left: -50%;
|
||||||
|
width: 200%;
|
||||||
|
height: 200%;
|
||||||
|
background: radial-gradient(circle, rgba(255, 0, 0, 0.05) 0%, transparent 70%);
|
||||||
|
animation: backgroundPulse 4s ease-in-out infinite;
|
||||||
|
pointer-events: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes backgroundPulse {
|
||||||
|
0%, 100% {
|
||||||
|
opacity: 0.3;
|
||||||
|
transform: scale(1);
|
||||||
|
}
|
||||||
|
50% {
|
||||||
|
opacity: 0.6;
|
||||||
|
transform: scale(1.1);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.autoplay-countdown-header {
|
.autoplay-countdown-header {
|
||||||
margin-bottom: 20px;
|
position: relative;
|
||||||
|
z-index: 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
.autoplay-countdown-header h3 {
|
.autoplay-countdown-header h3 {
|
||||||
color: #fff;
|
color: #fff;
|
||||||
font-size: 18px;
|
font-size: 26px;
|
||||||
font-weight: 500;
|
font-weight: 400;
|
||||||
margin: 0;
|
margin: 0 0 10px 0;
|
||||||
line-height: 1.4;
|
line-height: 1.3;
|
||||||
|
text-shadow: 0 2px 4px rgba(0, 0, 0, 0.3);
|
||||||
|
}
|
||||||
|
.autoplay-countdown-header h3 span{
|
||||||
|
font-weight:700;
|
||||||
}
|
}
|
||||||
|
|
||||||
.countdown-timer {
|
|
||||||
color: #ff4444;
|
|
||||||
font-weight: 700;
|
|
||||||
font-size: 20px;
|
|
||||||
animation: countdownPulse 1s infinite;
|
|
||||||
}
|
|
||||||
|
|
||||||
@keyframes countdownPulse {
|
|
||||||
0%,
|
|
||||||
100% {
|
|
||||||
transform: scale(1);
|
|
||||||
opacity: 1;
|
|
||||||
}
|
|
||||||
50% {
|
|
||||||
transform: scale(1.1);
|
|
||||||
opacity: 0.8;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.autoplay-countdown-video-info {
|
.autoplay-countdown-video-info {
|
||||||
display: flex;
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
gap: 12px;
|
gap: 20px;
|
||||||
margin-bottom: 24px;
|
text-align: center;
|
||||||
text-align: left;
|
position: relative;
|
||||||
|
z-index: 2;
|
||||||
|
margin:0 0 50px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.next-video-thumbnail {
|
.next-video-thumbnail {
|
||||||
flex-shrink: 0;
|
flex-shrink: 0;
|
||||||
width: 80px;
|
width: 180px;
|
||||||
height: 45px;
|
height: 101px;
|
||||||
border-radius: 6px;
|
border-radius: 12px;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
background: #333;
|
background: #333;
|
||||||
|
position: relative;
|
||||||
|
box-shadow:
|
||||||
|
0 12px 32px rgba(0, 0, 0, 0.4),
|
||||||
|
0 4px 16px rgba(0, 0, 0, 0.2);
|
||||||
|
border: 2px solid rgba(255, 255, 255, 0.1);
|
||||||
|
transition: transform 0.3s ease, box-shadow 0.3s ease;
|
||||||
|
}
|
||||||
|
|
||||||
|
.next-video-thumbnail:hover {
|
||||||
|
transform: translateY(-4px) scale(1.02);
|
||||||
|
box-shadow:
|
||||||
|
0 16px 40px rgba(0, 0, 0, 0.5),
|
||||||
|
0 8px 24px rgba(0, 0, 0, 0.3);
|
||||||
}
|
}
|
||||||
|
|
||||||
.next-video-thumbnail img {
|
.next-video-thumbnail img {
|
||||||
@@ -88,102 +130,250 @@
|
|||||||
display: block;
|
display: block;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.play-overlay {
|
||||||
|
position: absolute;
|
||||||
|
top: 50%;
|
||||||
|
left: 50%;
|
||||||
|
transform: translate(-50%, -50%);
|
||||||
|
background: rgba(0, 0, 0, 0.8);
|
||||||
|
border-radius: 50%;
|
||||||
|
width: 64px;
|
||||||
|
height: 64px;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
color: white;
|
||||||
|
transition: all 0.3s ease;
|
||||||
|
box-shadow:
|
||||||
|
0 8px 24px rgba(0, 0, 0, 0.5),
|
||||||
|
0 4px 16px rgba(0, 0, 0, 0.3);
|
||||||
|
border: 3px solid rgba(255, 255, 255, 0.2);
|
||||||
|
backdrop-filter: blur(8px);
|
||||||
|
}
|
||||||
|
|
||||||
|
.play-overlay:hover {
|
||||||
|
background: rgba(0, 0, 0, 0.9);
|
||||||
|
transform: translate(-50%, -50%) scale(1.1);
|
||||||
|
box-shadow:
|
||||||
|
0 12px 32px rgba(0, 0, 0, 0.6),
|
||||||
|
0 6px 20px rgba(0, 0, 0, 0.4);
|
||||||
|
}
|
||||||
|
|
||||||
|
.play-overlay svg {
|
||||||
|
margin-left: 4px;
|
||||||
|
width: 28px;
|
||||||
|
height: 28px;
|
||||||
|
}
|
||||||
|
|
||||||
.next-video-details {
|
.next-video-details {
|
||||||
flex-grow: 1;
|
flex-grow: 1;
|
||||||
min-width: 0; /* Allow text truncation */
|
min-width: 0;
|
||||||
|
text-align: center;
|
||||||
}
|
}
|
||||||
|
|
||||||
.next-video-title {
|
.next-video-title {
|
||||||
color: #fff;
|
color: #999;
|
||||||
font-size: 14px;
|
font-size:18px;
|
||||||
font-weight: 600;
|
font-weight:500;
|
||||||
margin: 0 0 4px 0;
|
margin: 0 0;
|
||||||
line-height: 1.3;
|
line-height: 1.4;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
text-overflow: ellipsis;
|
text-overflow: ellipsis;
|
||||||
display: -webkit-box;
|
display: -webkit-box;
|
||||||
-webkit-line-clamp: 2;
|
-webkit-line-clamp: 2;
|
||||||
-webkit-box-orient: vertical;
|
-webkit-box-orient: vertical;
|
||||||
|
text-shadow: 0 2px 4px rgba(0, 0, 0, 0.3);
|
||||||
|
letter-spacing: 0.5px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.next-video-author {
|
.next-video-author {
|
||||||
color: #aaa;
|
color: #bbb;
|
||||||
font-size: 12px;
|
font-size: 16px;
|
||||||
margin: 0 0 2px 0;
|
margin: 0 0 8px 0;
|
||||||
line-height: 1.2;
|
line-height: 1.3;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
text-overflow: ellipsis;
|
text-overflow: ellipsis;
|
||||||
white-space: nowrap;
|
white-space: nowrap;
|
||||||
|
font-weight: 500;
|
||||||
}
|
}
|
||||||
|
|
||||||
.next-video-duration {
|
.next-video-duration {
|
||||||
color: #ccc;
|
color: #999;
|
||||||
font-size: 11px;
|
font-size: 14px;
|
||||||
margin: 0;
|
margin: 0;
|
||||||
line-height: 1.2;
|
line-height: 1.2;
|
||||||
|
font-weight: 500;
|
||||||
}
|
}
|
||||||
|
|
||||||
.autoplay-countdown-actions {
|
.autoplay-countdown-actions {
|
||||||
display: flex;
|
display: flex;
|
||||||
gap: 12px;
|
gap: 24px;
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
|
position: relative;
|
||||||
|
z-index: 2;
|
||||||
|
padding: 0;
|
||||||
|
margin-top: 8px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.autoplay-play-button,
|
button.autoplay-play-button,
|
||||||
.autoplay-cancel-button {
|
button.autoplay-cancel-button {
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
gap: 6px;
|
gap: 8px;
|
||||||
padding: 10px 18px;
|
padding: 10px 20px;
|
||||||
border: none;
|
border: none;
|
||||||
border-radius: 6px;
|
border-radius: 8px;
|
||||||
font-size: 14px;
|
font-size: 13px;
|
||||||
font-weight: 500;
|
font-weight: 600;
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
transition: all 0.2s ease;
|
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
|
||||||
min-width: 100px;
|
min-width: 140px;
|
||||||
|
height: 48px;
|
||||||
|
position: relative;
|
||||||
|
overflow: hidden;
|
||||||
|
text-transform: uppercase;
|
||||||
|
letter-spacing: 0.3px;
|
||||||
|
line-height: 1;
|
||||||
|
white-space: nowrap;
|
||||||
|
box-shadow: 0 6px 20px rgba(0, 0, 0, 0.3), inset 0 1px 0 rgba(255, 255, 255, 0.1);
|
||||||
|
text-align: center;
|
||||||
}
|
}
|
||||||
|
|
||||||
.autoplay-play-button {
|
button.autoplay-play-button {
|
||||||
background: #ff0000;
|
background: linear-gradient(135deg, #ff0000, #e60000);
|
||||||
color: #fff;
|
color: #fff;
|
||||||
|
border: 1px solid rgba(255, 255, 255, 0.1);
|
||||||
|
}
|
||||||
|
|
||||||
|
.autoplay-play-button::before {
|
||||||
|
content: '';
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
left: -100%;
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.2), transparent);
|
||||||
|
transition: left 0.5s ease;
|
||||||
}
|
}
|
||||||
|
|
||||||
.autoplay-play-button:hover {
|
.autoplay-play-button:hover {
|
||||||
background: #e60000;
|
background: linear-gradient(135deg, #ff1a1a, #cc0000);
|
||||||
transform: translateY(-1px);
|
transform: translateY(-2px);
|
||||||
|
box-shadow: 0 8px 25px rgba(255, 0, 0, 0.4), inset 0 1px 0 rgba(255, 255, 255, 0.3);
|
||||||
|
}
|
||||||
|
|
||||||
|
.autoplay-play-button:hover::before {
|
||||||
|
left: 100%;
|
||||||
}
|
}
|
||||||
|
|
||||||
.autoplay-play-button:active {
|
.autoplay-play-button:active {
|
||||||
transform: translateY(0);
|
transform: translateY(-1px);
|
||||||
|
box-shadow:
|
||||||
|
0 4px 15px rgba(255, 0, 0, 0.3),
|
||||||
|
inset 0 1px 0 rgba(255, 255, 255, 0.2);
|
||||||
}
|
}
|
||||||
|
|
||||||
.autoplay-cancel-button {
|
.autoplay-cancel-button {
|
||||||
background: rgba(255, 255, 255, 0.1);
|
background: linear-gradient(135deg, #404040, #2a2a2a);
|
||||||
color: #fff;
|
color: #fff;
|
||||||
border: 1px solid rgba(255, 255, 255, 0.2);
|
border: 1px solid rgba(255, 255, 255, 0.1);
|
||||||
|
box-shadow:
|
||||||
|
0 6px 20px rgba(0, 0, 0, 0.3),
|
||||||
|
inset 0 1px 0 rgba(255, 255, 255, 0.1);
|
||||||
}
|
}
|
||||||
|
|
||||||
.autoplay-cancel-button:hover {
|
.autoplay-cancel-button:hover {
|
||||||
background: rgba(255, 255, 255, 0.2);
|
background: linear-gradient(135deg, #505050, #3a3a3a);
|
||||||
border-color: rgba(255, 255, 255, 0.3);
|
transform: translateY(-2px);
|
||||||
|
box-shadow:
|
||||||
|
0 8px 25px rgba(0, 0, 0, 0.4),
|
||||||
|
inset 0 1px 0 rgba(255, 255, 255, 0.2);
|
||||||
}
|
}
|
||||||
|
|
||||||
.autoplay-cancel-button:active {
|
.autoplay-cancel-button:active {
|
||||||
background: rgba(255, 255, 255, 0.1);
|
transform: translateY(-1px);
|
||||||
|
box-shadow:
|
||||||
|
0 4px 15px rgba(0, 0, 0, 0.3),
|
||||||
|
inset 0 1px 0 rgba(255, 255, 255, 0.1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
.autoplay-play-button svg,
|
.autoplay-play-button svg,
|
||||||
.autoplay-cancel-button svg {
|
.autoplay-cancel-button svg {
|
||||||
width: 1.2em;
|
width: 18px;
|
||||||
height: 1.2em;
|
height: 18px;
|
||||||
flex-shrink: 0;
|
flex-shrink: 0;
|
||||||
|
filter: drop-shadow(0 1px 2px rgba(0, 0, 0, 0.3));
|
||||||
|
transition: transform 0.3s ease;
|
||||||
|
position: relative;
|
||||||
|
z-index: 1;
|
||||||
|
display: block;
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
vertical-align: middle;
|
||||||
|
}
|
||||||
|
|
||||||
|
.autoplay-play-button:hover svg {
|
||||||
|
transform: scale(1.05);
|
||||||
|
filter: drop-shadow(0 2px 4px rgba(0, 0, 0, 0.4));
|
||||||
|
}
|
||||||
|
|
||||||
|
.autoplay-cancel-button svg {
|
||||||
|
width: 16px;
|
||||||
|
height: 16px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.autoplay-cancel-button:hover svg {
|
||||||
|
transform: scale(1.05) rotate(90deg);
|
||||||
|
filter: drop-shadow(0 2px 4px rgba(0, 0, 0, 0.4));
|
||||||
|
}
|
||||||
|
|
||||||
|
.autoplay-play-button span,
|
||||||
|
.autoplay-cancel-button span {
|
||||||
|
display: inline-block;
|
||||||
|
vertical-align: middle;
|
||||||
|
line-height: 1;
|
||||||
|
font-size: inherit;
|
||||||
|
font-weight: inherit;
|
||||||
|
letter-spacing: inherit;
|
||||||
|
text-transform: inherit;
|
||||||
|
position: relative;
|
||||||
|
z-index: 1;
|
||||||
|
white-space: nowrap;
|
||||||
|
overflow: hidden;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
max-width: 100%;
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
height: auto;
|
||||||
|
align-self: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Ensure perfect alignment of button content */
|
||||||
|
.autoplay-play-button > *,
|
||||||
|
.autoplay-cancel-button > * {
|
||||||
|
vertical-align: middle;
|
||||||
|
display: inline-block;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Fix any baseline alignment issues */
|
||||||
|
.autoplay-play-button,
|
||||||
|
.autoplay-cancel-button {
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Ensure text and icons are perfectly aligned */
|
||||||
|
.autoplay-play-button svg,
|
||||||
|
.autoplay-cancel-button svg {
|
||||||
|
vertical-align: middle;
|
||||||
|
display: inline-block;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Autoplay Toggle Button Styles */
|
/* Autoplay Toggle Button Styles */
|
||||||
.vjs-autoplay-toggle {
|
/* .vjs-autoplay-toggle {
|
||||||
width: 3em !important;
|
width: 3em !important;
|
||||||
height: 3em !important;
|
height: 3em !important;
|
||||||
flex: none;
|
flex: none;
|
||||||
@@ -191,16 +381,16 @@
|
|||||||
margin: 0 4px !important;
|
margin: 0 4px !important;
|
||||||
line-height: 3em !important;
|
line-height: 3em !important;
|
||||||
position: relative;
|
position: relative;
|
||||||
}
|
} */
|
||||||
|
|
||||||
.vjs-autoplay-toggle .vjs-autoplay-icon {
|
/* .vjs-autoplay-toggle .vjs-autoplay-icon {
|
||||||
width: 1.2em;
|
width: 1.2em;
|
||||||
height: 1.2em;
|
height: 1.2em;
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
margin: auto;
|
margin: auto;
|
||||||
}
|
} */
|
||||||
|
|
||||||
.vjs-autoplay-toggle .vjs-autoplay-icon svg {
|
.vjs-autoplay-toggle .vjs-autoplay-icon svg {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
@@ -209,40 +399,135 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Responsive design */
|
/* Responsive design */
|
||||||
@media (max-width: 480px) {
|
@media (max-width: 767px) {
|
||||||
|
.autoplay-countdown-video-info {
|
||||||
|
margin-bottom:20px;
|
||||||
|
}
|
||||||
.autoplay-countdown-content {
|
.autoplay-countdown-content {
|
||||||
padding: 20px;
|
padding: 24px;
|
||||||
max-width: 320px;
|
max-width: 400px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.autoplay-countdown-header h3 {
|
.autoplay-countdown-header h3 {
|
||||||
font-size: 16px;
|
font-size: 20px;
|
||||||
}
|
|
||||||
|
|
||||||
.countdown-timer {
|
|
||||||
font-size: 18px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.autoplay-countdown-video-info {
|
|
||||||
gap: 10px;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.next-video-thumbnail {
|
.next-video-thumbnail {
|
||||||
width: 60px;
|
width: 140px;
|
||||||
height: 34px;
|
height: 78px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.play-overlay {
|
||||||
|
width: 48px;
|
||||||
|
height: 48px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.play-overlay svg {
|
||||||
|
width: 20px;
|
||||||
|
height: 20px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.next-video-title {
|
.next-video-title {
|
||||||
font-size: 13px;
|
font-size: 18px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.autoplay-countdown-actions {
|
.next-video-author {
|
||||||
flex-direction: column;
|
font-size: 14px;
|
||||||
gap: 8px;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.autoplay-play-button,
|
.autoplay-play-button,
|
||||||
.autoplay-cancel-button {
|
.autoplay-cancel-button {
|
||||||
width: 100%;
|
padding: 12px 24px;
|
||||||
|
font-size: 14px;
|
||||||
|
min-width: 120px;
|
||||||
|
height: 44px;
|
||||||
|
gap: 6px;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.autoplay-play-button svg {
|
||||||
|
width: 16px;
|
||||||
|
height: 16px;
|
||||||
|
vertical-align: middle;
|
||||||
|
}
|
||||||
|
|
||||||
|
.autoplay-cancel-button svg {
|
||||||
|
width: 14px;
|
||||||
|
height: 14px;
|
||||||
|
vertical-align: middle;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (max-width: 480px) {
|
||||||
|
.autoplay-countdown-content {
|
||||||
|
padding: 20px;
|
||||||
|
max-width: 350px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.autoplay-countdown-header h3 {
|
||||||
|
font-size: 18px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.countdown-timer {
|
||||||
|
font-size: 24px;
|
||||||
|
padding: 10px 16px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.autoplay-countdown-video-info {
|
||||||
|
gap: 16px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.next-video-thumbnail {
|
||||||
|
width: 120px;
|
||||||
|
height: 68px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.play-overlay {
|
||||||
|
width: 40px;
|
||||||
|
height: 40px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.play-overlay svg {
|
||||||
|
width: 16px;
|
||||||
|
height: 16px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.next-video-title {
|
||||||
|
font-size: 16px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.next-video-author {
|
||||||
|
font-size: 13px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.autoplay-countdown-actions {
|
||||||
|
gap: 5px;
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
button.autoplay-play-button, button.autoplay-cancel-button { padding:10px 20px; width:120px; height:40px; min-width:120px; }
|
||||||
|
|
||||||
|
.autoplay-play-button,
|
||||||
|
.autoplay-cancel-button {
|
||||||
|
width: 100%;
|
||||||
|
min-width: 100%;
|
||||||
|
height: 46px;
|
||||||
|
gap: 6px;
|
||||||
|
padding: 10px 20px;
|
||||||
|
font-size: 13px;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.autoplay-play-button svg {
|
||||||
|
width: 14px;
|
||||||
|
height: 14px;
|
||||||
|
vertical-align: middle;
|
||||||
|
}
|
||||||
|
|
||||||
|
.autoplay-cancel-button svg {
|
||||||
|
width: 12px;
|
||||||
|
height: 12px;
|
||||||
|
vertical-align: middle;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -45,6 +45,11 @@ class AutoplayCountdownOverlay extends Component {
|
|||||||
nextVideoThumbnail
|
nextVideoThumbnail
|
||||||
? `<div class="next-video-thumbnail">
|
? `<div class="next-video-thumbnail">
|
||||||
<img src="${nextVideoThumbnail}" alt="${nextVideoTitle}" />
|
<img src="${nextVideoThumbnail}" alt="${nextVideoTitle}" />
|
||||||
|
<div class="play-overlay">
|
||||||
|
<svg viewBox="0 0 24 24" width="28" height="28" fill="currentColor">
|
||||||
|
<path d="M8 5v14l11-7z"/>
|
||||||
|
</svg>
|
||||||
|
</div>
|
||||||
</div>`
|
</div>`
|
||||||
: ''
|
: ''
|
||||||
}
|
}
|
||||||
@@ -199,6 +204,11 @@ class AutoplayCountdownOverlay extends Component {
|
|||||||
nextVideoThumbnail
|
nextVideoThumbnail
|
||||||
? `<div class="next-video-thumbnail">
|
? `<div class="next-video-thumbnail">
|
||||||
<img src="${nextVideoThumbnail}" alt="${nextVideoTitle}" />
|
<img src="${nextVideoThumbnail}" alt="${nextVideoTitle}" />
|
||||||
|
<div class="play-overlay">
|
||||||
|
<svg viewBox="0 0 24 24" width="28" height="28" fill="currentColor">
|
||||||
|
<path d="M8 5v14l11-7z"/>
|
||||||
|
</svg>
|
||||||
|
</div>
|
||||||
</div>`
|
</div>`
|
||||||
: ''
|
: ''
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -26,10 +26,9 @@ class EndScreenOverlay extends Component {
|
|||||||
// Get relatedVideos from options since createEl is called during super()
|
// Get relatedVideos from options since createEl is called during super()
|
||||||
const relatedVideos = this.options_ && this.options_._relatedVideos ? this.options_._relatedVideos : [];
|
const relatedVideos = this.options_ && this.options_._relatedVideos ? this.options_._relatedVideos : [];
|
||||||
|
|
||||||
// Limit items based on screen size
|
// Limit videos based on screen size to fit grid properly
|
||||||
const isMobile = window.innerWidth <= 768;
|
const maxVideos = this.getMaxVideosForScreen();
|
||||||
const maxItems = isMobile ? 6 : 12;
|
const videosToShow = relatedVideos.slice(0, maxVideos);
|
||||||
const videosToShow = relatedVideos.slice(0, maxItems);
|
|
||||||
|
|
||||||
// console.log(
|
// console.log(
|
||||||
// 'Creating end screen with',
|
// 'Creating end screen with',
|
||||||
@@ -41,6 +40,12 @@ class EndScreenOverlay extends Component {
|
|||||||
className: 'vjs-end-screen-overlay',
|
className: 'vjs-end-screen-overlay',
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// Create title
|
||||||
|
const title = videojs.dom.createEl('div', {
|
||||||
|
className: 'vjs-related-videos-title',
|
||||||
|
});
|
||||||
|
title.textContent = 'More Videos';
|
||||||
|
|
||||||
// Create grid container
|
// Create grid container
|
||||||
const grid = videojs.dom.createEl('div', {
|
const grid = videojs.dom.createEl('div', {
|
||||||
className: 'vjs-related-videos-grid',
|
className: 'vjs-related-videos-grid',
|
||||||
@@ -53,16 +58,15 @@ class EndScreenOverlay extends Component {
|
|||||||
grid.appendChild(videoItem);
|
grid.appendChild(videoItem);
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
// Fallback message if no related videos
|
// Create sample videos for testing if no related videos provided
|
||||||
const noVideos = videojs.dom.createEl('div', {
|
const sampleVideos = this.createSampleVideos();
|
||||||
className: 'vjs-no-related-videos',
|
sampleVideos.slice(0, this.getMaxVideosForScreen()).forEach((video) => {
|
||||||
|
const videoItem = this.createVideoItem(video);
|
||||||
|
grid.appendChild(videoItem);
|
||||||
});
|
});
|
||||||
noVideos.textContent = 'No related videos available';
|
|
||||||
noVideos.style.color = 'white';
|
|
||||||
noVideos.style.textAlign = 'center';
|
|
||||||
grid.appendChild(noVideos);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
overlay.appendChild(title);
|
||||||
overlay.appendChild(grid);
|
overlay.appendChild(grid);
|
||||||
|
|
||||||
return overlay;
|
return overlay;
|
||||||
@@ -73,10 +77,18 @@ class EndScreenOverlay extends Component {
|
|||||||
className: 'vjs-related-video-item',
|
className: 'vjs-related-video-item',
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// Use real YouTube thumbnail or fallback to placeholder
|
||||||
|
const thumbnailSrc = video.thumbnail || this.getPlaceholderImage(video.title);
|
||||||
|
|
||||||
const thumbnail = videojs.dom.createEl('img', {
|
const thumbnail = videojs.dom.createEl('img', {
|
||||||
className: 'vjs-related-video-thumbnail',
|
className: 'vjs-related-video-thumbnail',
|
||||||
src: video.thumbnail,
|
src: thumbnailSrc,
|
||||||
alt: video.title,
|
alt: video.title,
|
||||||
|
loading: 'lazy', // Lazy load for better performance
|
||||||
|
onerror: () => {
|
||||||
|
// Fallback to placeholder if image fails to load
|
||||||
|
thumbnail.src = this.getPlaceholderImage(video.title);
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
const overlay = videojs.dom.createEl('div', {
|
const overlay = videojs.dom.createEl('div', {
|
||||||
@@ -142,6 +154,166 @@ class EndScreenOverlay extends Component {
|
|||||||
return item;
|
return item;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
getPlaceholderImage(title) {
|
||||||
|
// Generate a placeholder image using a service or create a data URL
|
||||||
|
// For now, we'll use a simple colored placeholder based on the title
|
||||||
|
const colors = [
|
||||||
|
'#FF6B6B', '#4ECDC4', '#45B7D1', '#96CEB4', '#FFEAA7',
|
||||||
|
'#DDA0DD', '#98D8C8', '#F7DC6F', '#BB8FCE', '#85C1E9'
|
||||||
|
];
|
||||||
|
|
||||||
|
// Use title hash to consistently assign colors
|
||||||
|
let hash = 0;
|
||||||
|
for (let i = 0; i < title.length; i++) {
|
||||||
|
hash = title.charCodeAt(i) + ((hash << 5) - hash);
|
||||||
|
}
|
||||||
|
const colorIndex = Math.abs(hash) % colors.length;
|
||||||
|
const color = colors[colorIndex];
|
||||||
|
|
||||||
|
// Create a simple placeholder with the first letter of the title
|
||||||
|
const firstLetter = title.charAt(0).toUpperCase();
|
||||||
|
|
||||||
|
// Create a data URL for a simple placeholder image
|
||||||
|
const canvas = document.createElement('canvas');
|
||||||
|
canvas.width = 320;
|
||||||
|
canvas.height = 180;
|
||||||
|
const ctx = canvas.getContext('2d');
|
||||||
|
|
||||||
|
// Background
|
||||||
|
ctx.fillStyle = color;
|
||||||
|
ctx.fillRect(0, 0, 320, 180);
|
||||||
|
|
||||||
|
// Add a subtle pattern
|
||||||
|
ctx.fillStyle = 'rgba(255, 255, 255, 0.1)';
|
||||||
|
for (let i = 0; i < 20; i++) {
|
||||||
|
ctx.fillRect(Math.random() * 320, Math.random() * 180, 2, 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add the first letter
|
||||||
|
ctx.fillStyle = 'white';
|
||||||
|
ctx.font = 'bold 48px Arial';
|
||||||
|
ctx.textAlign = 'center';
|
||||||
|
ctx.textBaseline = 'middle';
|
||||||
|
ctx.fillText(firstLetter, 160, 90);
|
||||||
|
|
||||||
|
return canvas.toDataURL();
|
||||||
|
}
|
||||||
|
|
||||||
|
getMaxVideosForScreen() {
|
||||||
|
const width = window.innerWidth;
|
||||||
|
|
||||||
|
if (width >= 1200) {
|
||||||
|
return 12; // 4x3 grid for large desktop
|
||||||
|
} else if (width >= 1024) {
|
||||||
|
return 9; // 3x3 grid for desktop
|
||||||
|
} else if (width >= 768) {
|
||||||
|
return 6; // 3x2 grid for tablet
|
||||||
|
} else {
|
||||||
|
return 4; // 2x2 grid for mobile
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
createSampleVideos() {
|
||||||
|
return [
|
||||||
|
{
|
||||||
|
id: 'sample1',
|
||||||
|
title: 'React Full Course for Beginners',
|
||||||
|
author: 'Bro Code',
|
||||||
|
views: '2.1M views',
|
||||||
|
duration: 1800,
|
||||||
|
thumbnail: 'https://img.youtube.com/vi/dGcsHMXbSOA/maxresdefault.jpg'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 'sample2',
|
||||||
|
title: 'JavaScript ES6+ Features',
|
||||||
|
author: 'Tech Tutorials',
|
||||||
|
views: '850K views',
|
||||||
|
duration: 1200,
|
||||||
|
thumbnail: 'https://img.youtube.com/vi/WZQc7RUAg18/maxresdefault.jpg'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 'sample3',
|
||||||
|
title: 'CSS Grid Layout Masterclass',
|
||||||
|
author: 'Web Dev Academy',
|
||||||
|
views: '1.2M views',
|
||||||
|
duration: 2400,
|
||||||
|
thumbnail: 'https://img.youtube.com/vi/0xMQfnTU6oo/maxresdefault.jpg'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 'sample4',
|
||||||
|
title: 'Node.js Backend Development',
|
||||||
|
author: 'Code Master',
|
||||||
|
views: '650K views',
|
||||||
|
duration: 3600,
|
||||||
|
thumbnail: 'https://img.youtube.com/vi/fBNz6F-Cowg/maxresdefault.jpg'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 'sample5',
|
||||||
|
title: 'Vue.js Complete Guide',
|
||||||
|
author: 'Frontend Pro',
|
||||||
|
views: '980K views',
|
||||||
|
duration: 2800,
|
||||||
|
thumbnail: 'https://img.youtube.com/vi/qZXt1Aom3Cs/maxresdefault.jpg'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 'sample6',
|
||||||
|
title: 'Python Data Science',
|
||||||
|
author: 'Data Academy',
|
||||||
|
views: '1.5M views',
|
||||||
|
duration: 4200,
|
||||||
|
thumbnail: 'https://img.youtube.com/vi/ua-CiDNNj30/maxresdefault.jpg'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 'sample7',
|
||||||
|
title: 'TypeScript Fundamentals',
|
||||||
|
author: 'TypeScript Expert',
|
||||||
|
views: '720K views',
|
||||||
|
duration: 2100,
|
||||||
|
thumbnail: 'https://img.youtube.com/vi/BwuLxPH8IDs/maxresdefault.jpg'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 'sample8',
|
||||||
|
title: 'MongoDB Database Tutorial',
|
||||||
|
author: 'Database Pro',
|
||||||
|
views: '890K views',
|
||||||
|
duration: 1800,
|
||||||
|
thumbnail: 'https://img.youtube.com/vi/-56x56UppqQ/maxresdefault.jpg'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 'sample9',
|
||||||
|
title: 'Docker Containerization',
|
||||||
|
author: 'DevOps Master',
|
||||||
|
views: '1.1M views',
|
||||||
|
duration: 3200,
|
||||||
|
thumbnail: 'https://img.youtube.com/vi/pTFZFxd4hOI/maxresdefault.jpg'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 'sample10',
|
||||||
|
title: 'AWS Cloud Services',
|
||||||
|
author: 'Cloud Expert',
|
||||||
|
views: '1.3M views',
|
||||||
|
duration: 4500,
|
||||||
|
thumbnail: 'https://img.youtube.com/vi/ITcXLS3h2qU/maxresdefault.jpg'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 'sample11',
|
||||||
|
title: 'GraphQL API Design',
|
||||||
|
author: 'API Specialist',
|
||||||
|
views: '680K views',
|
||||||
|
duration: 2600,
|
||||||
|
thumbnail: 'https://img.youtube.com/vi/ed8SzALpx1Q/maxresdefault.jpg'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 'sample12',
|
||||||
|
title: 'Machine Learning Basics',
|
||||||
|
author: 'AI Academy',
|
||||||
|
views: '2.3M views',
|
||||||
|
duration: 5400,
|
||||||
|
thumbnail: 'https://img.youtube.com/vi/i_LwzRVP7bg/maxresdefault.jpg'
|
||||||
|
}
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
show() {
|
show() {
|
||||||
this.el().style.display = 'flex';
|
this.el().style.display = 'flex';
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -564,10 +564,34 @@ function VideoJSPlayer() {
|
|||||||
},
|
},
|
||||||
siteUrl: '',
|
siteUrl: '',
|
||||||
nextLink: 'https://demo.mediacms.io/view?m=YjGJafibO',
|
nextLink: 'https://demo.mediacms.io/view?m=YjGJafibO',
|
||||||
|
chapter_data: [
|
||||||
|
{ startTime: 0, endTime: 3, text: 'Introduction' },
|
||||||
|
{ startTime: 3, endTime: 5, text: 'Overview of Marine Life' },
|
||||||
|
{ startTime: 5, endTime: 10, text: 'Coral Reef Ecosystems' },
|
||||||
|
{ startTime: 10, endTime: 14, text: 'Deep Sea Creatures' },
|
||||||
|
],
|
||||||
chaptersData: [
|
chaptersData: [
|
||||||
{ startTime: 0, endTime: 5, text: 'Start111' },
|
{ startTime: 0, endTime: 3, text: 'Introduction' },
|
||||||
{ startTime: 5, endTime: 10, text: 'Introduction - EuroHPC' },
|
{ startTime: 3, endTime: 5, text: 'Overview of Marine Life' },
|
||||||
{ startTime: 10, endTime: 15, text: 'Planning - EuroHPC' },
|
{ startTime: 5, endTime: 10, text: 'Coral Reef Ecosystems' },
|
||||||
|
{ startTime: 10, endTime: 14, text: 'Deep Sea Creatures' },
|
||||||
|
{ startTime: 240, endTime: 320, text: 'Ocean Conservation' },
|
||||||
|
{ startTime: 320, endTime: 400, text: 'Climate Change Impact' },
|
||||||
|
{ startTime: 400, endTime: 480, text: 'Marine Protected Areas' },
|
||||||
|
{ startTime: 480, endTime: 560, text: 'Sustainable Fishing' },
|
||||||
|
{ startTime: 560, endTime: 640, text: 'Research Methods' },
|
||||||
|
{ startTime: 640, endTime: 720, text: 'Future Challenges' },
|
||||||
|
{ startTime: 720, endTime: 800, text: 'Conclusion' },
|
||||||
|
{ startTime: 800, endTime: 880, text: 'Marine Biodiversity Hotspots' },
|
||||||
|
{ startTime: 880, endTime: 960, text: 'Underwater Photography' },
|
||||||
|
{ startTime: 960, endTime: 1040, text: 'Whale Migration Patterns' },
|
||||||
|
{ startTime: 1040, endTime: 1120, text: 'Plastic Pollution Crisis' },
|
||||||
|
{ startTime: 1120, endTime: 1200, text: 'Seagrass Meadows' },
|
||||||
|
{ startTime: 1200, endTime: 1280, text: 'Ocean Acidification' },
|
||||||
|
{ startTime: 1280, endTime: 1360, text: 'Marine Archaeology' },
|
||||||
|
{ startTime: 1360, endTime: 1440, text: 'Tidal Pool Ecosystems' },
|
||||||
|
{ startTime: 1440, endTime: 1520, text: 'Commercial Aquaculture' },
|
||||||
|
{ startTime: 1520, endTime: 1600, text: 'Ocean Exploration Technology' },
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
[]
|
[]
|
||||||
@@ -575,12 +599,29 @@ function VideoJSPlayer() {
|
|||||||
|
|
||||||
// Define chapters as JSON object
|
// Define chapters as JSON object
|
||||||
// Note: The sample-chapters.vtt file is no longer needed as chapters are now loaded from this JSON
|
// Note: The sample-chapters.vtt file is no longer needed as chapters are now loaded from this JSON
|
||||||
const chaptersData = mediaData.chaptersData;
|
const chaptersData = mediaData.chaptersData ?? [
|
||||||
/* [
|
{ startTime: 0, endTime: 30, text: 'Introduction' },
|
||||||
{ startTime: 0, endTime: 5, text: 'Start111' },
|
{ startTime: 30, endTime: 90, text: 'Overview of Marine Life' },
|
||||||
{ startTime: 5, endTime: 10, text: 'Introduction - EuroHPC' },
|
{ startTime: 90, endTime: 180, text: 'Coral Reef Ecosystems' },
|
||||||
{ startTime: 10, endTime: 15, text: 'Planning - EuroHPC' },
|
{ startTime: 180, endTime: 240, text: 'Deep Sea Creatures' },
|
||||||
]; */
|
{ startTime: 240, endTime: 320, text: 'Ocean Conservation' },
|
||||||
|
{ startTime: 320, endTime: 400, text: 'Climate Change Impact' },
|
||||||
|
{ startTime: 400, endTime: 480, text: 'Marine Protected Areas' },
|
||||||
|
{ startTime: 480, endTime: 560, text: 'Sustainable Fishing' },
|
||||||
|
{ startTime: 560, endTime: 640, text: 'Research Methods' },
|
||||||
|
{ startTime: 640, endTime: 720, text: 'Future Challenges' },
|
||||||
|
{ startTime: 720, endTime: 800, text: 'Conclusion' },
|
||||||
|
{ startTime: 800, endTime: 880, text: 'Marine Biodiversity Hotspots' },
|
||||||
|
{ startTime: 880, endTime: 960, text: 'Underwater Photography' },
|
||||||
|
{ startTime: 960, endTime: 1040, text: 'Whale Migration Patterns' },
|
||||||
|
{ startTime: 1040, endTime: 1120, text: 'Plastic Pollution Crisis' },
|
||||||
|
{ startTime: 1120, endTime: 1200, text: 'Seagrass Meadows' },
|
||||||
|
{ startTime: 1200, endTime: 1280, text: 'Ocean Acidification' },
|
||||||
|
{ startTime: 1280, endTime: 1360, text: 'Marine Archaeology' },
|
||||||
|
{ startTime: 1360, endTime: 1440, text: 'Tidal Pool Ecosystems' },
|
||||||
|
{ startTime: 1440, endTime: 1520, text: 'Commercial Aquaculture' },
|
||||||
|
{ startTime: 1520, endTime: 1600, text: 'Ocean Exploration Technology' },
|
||||||
|
];
|
||||||
|
|
||||||
// Get video data from mediaData
|
// Get video data from mediaData
|
||||||
const currentVideo = useMemo(
|
const currentVideo = useMemo(
|
||||||
@@ -678,6 +719,39 @@ function VideoJSPlayer() {
|
|||||||
}));
|
}));
|
||||||
}, [mediaData]);
|
}, [mediaData]);
|
||||||
|
|
||||||
|
// Demo array for testing purposes
|
||||||
|
const demoSubtitleTracks = [
|
||||||
|
{
|
||||||
|
kind: 'subtitles',
|
||||||
|
src: '/sample-subtitles.vtt',
|
||||||
|
srclang: 'en',
|
||||||
|
label: 'English Subtitles',
|
||||||
|
default: false,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
kind: 'subtitles',
|
||||||
|
src: '/sample-subtitles-greek.vtt',
|
||||||
|
srclang: 'el',
|
||||||
|
label: 'Greek Subtitles (Ελληνικά)',
|
||||||
|
default: false,
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
// Get subtitle tracks from backend response or fallback based on environment
|
||||||
|
const backendSubtitles = mediaData?.data?.subtitles_info || [];
|
||||||
|
const isDevelopment = process.env.NODE_ENV === 'development' || window.location.hostname === 'localhost';
|
||||||
|
|
||||||
|
const hasSubtitles = backendSubtitles.length > 0 || isDevelopment;
|
||||||
|
const subtitleTracks = hasSubtitles
|
||||||
|
? backendSubtitles.map(track => ({
|
||||||
|
kind: 'subtitles',
|
||||||
|
src: track.src,
|
||||||
|
srclang: track.srclang,
|
||||||
|
label: track.label,
|
||||||
|
default: false,
|
||||||
|
}))
|
||||||
|
: (isDevelopment ? demoSubtitleTracks : []);
|
||||||
|
|
||||||
// Function to navigate to next video
|
// Function to navigate to next video
|
||||||
const goToNextVideo = () => {
|
const goToNextVideo = () => {
|
||||||
console.log('Next video functionality disabled for single video mode');
|
console.log('Next video functionality disabled for single video mode');
|
||||||
@@ -915,7 +989,7 @@ function VideoJSPlayer() {
|
|||||||
descriptionsButton: true,
|
descriptionsButton: true,
|
||||||
|
|
||||||
// Subtitles (CC) button should be visible
|
// Subtitles (CC) button should be visible
|
||||||
subtitlesButton: true,
|
subtitlesButton: hasSubtitles ? true : false,
|
||||||
|
|
||||||
// Captions button (keep disabled to avoid duplicate with subtitles)
|
// Captions button (keep disabled to avoid duplicate with subtitles)
|
||||||
captionsButton: false,
|
captionsButton: false,
|
||||||
@@ -1004,31 +1078,14 @@ function VideoJSPlayer() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// BEGIN: Add subtitle tracks
|
// BEGIN: Add subtitle tracks
|
||||||
const subtitleTracks = [
|
|
||||||
{
|
|
||||||
kind: 'subtitles',
|
|
||||||
src: '/sample-subtitles.vtt',
|
|
||||||
srclang: 'en',
|
|
||||||
label: 'English Subtitles',
|
|
||||||
default: false,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
kind: 'subtitles',
|
|
||||||
src: '/sample-subtitles-greek.vtt',
|
|
||||||
srclang: 'el',
|
|
||||||
label: 'Greek Subtitles (Ελληνικά)',
|
|
||||||
default: false,
|
|
||||||
},
|
|
||||||
];
|
|
||||||
|
|
||||||
subtitleTracks.forEach((track) => {
|
hasSubtitles && subtitleTracks.forEach((track) => {
|
||||||
playerRef.current.addRemoteTextTrack(track, false);
|
playerRef.current.addRemoteTextTrack(track, false);
|
||||||
});
|
});
|
||||||
|
|
||||||
// Apply saved subtitle preference with additional delay
|
// Apply saved subtitle preference immediately
|
||||||
setTimeout(() => {
|
userPreferences.current.applySubtitlePreference(playerRef.current);
|
||||||
userPreferences.current.applySubtitlePreference(playerRef.current);
|
|
||||||
}, 1000);
|
|
||||||
// END: Add subtitle tracks
|
// END: Add subtitle tracks
|
||||||
|
|
||||||
// BEGIN: Chapters Implementation
|
// BEGIN: Chapters Implementation
|
||||||
@@ -1071,7 +1128,7 @@ function VideoJSPlayer() {
|
|||||||
// END: Implement custom time display component
|
// END: Implement custom time display component
|
||||||
|
|
||||||
// BEGIN: Implement custom next video button
|
// BEGIN: Implement custom next video button
|
||||||
if (mediaData?.nextLink) {
|
if (mediaData?.nextLink || 1===1) { // it seems that the nextLink is not always available, and it is need the this.player().trigger('nextVideo'); from NextVideoButton.js // TODO: remove the 1===1 and the mediaData?.nextLink
|
||||||
console.log('mediaData.nextLink edw', mediaData.nextLink);
|
console.log('mediaData.nextLink edw', mediaData.nextLink);
|
||||||
const nextVideoButton = new NextVideoButton(playerRef.current, {
|
const nextVideoButton = new NextVideoButton(playerRef.current, {
|
||||||
nextLink: mediaData.nextLink,
|
nextLink: mediaData.nextLink,
|
||||||
@@ -1154,8 +1211,8 @@ function VideoJSPlayer() {
|
|||||||
// Make menus clickable instead of hover-only
|
// Make menus clickable instead of hover-only
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
const setupClickableMenus = () => {
|
const setupClickableMenus = () => {
|
||||||
// Find all menu buttons (chapters, subtitles, etc.)
|
// Find all menu buttons (subtitles, etc.) - exclude chaptersButton as it has custom overlay
|
||||||
const menuButtons = ['chaptersButton', 'subtitlesButton', 'playbackRateMenuButton'];
|
const menuButtons = ['subtitlesButton', 'playbackRateMenuButton'];
|
||||||
|
|
||||||
menuButtons.forEach((buttonName) => {
|
menuButtons.forEach((buttonName) => {
|
||||||
const button = controlBar.getChild(buttonName);
|
const button = controlBar.getChild(buttonName);
|
||||||
@@ -1206,6 +1263,102 @@ function VideoJSPlayer() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// Add YouTube-like subtitles toggle with red underline
|
||||||
|
const ccNames = ['subtitlesButton', 'captionsButton', 'subsCapsButton'];
|
||||||
|
for (const n of ccNames) {
|
||||||
|
const cc = controlBar.getChild(n);
|
||||||
|
if (cc && cc.el()) {
|
||||||
|
const el = cc.el();
|
||||||
|
const menu = el.querySelector('.vjs-menu');
|
||||||
|
if (menu) menu.style.display = 'none';
|
||||||
|
|
||||||
|
const toggleSubs = (ev) => {
|
||||||
|
ev.preventDefault();
|
||||||
|
ev.stopPropagation();
|
||||||
|
const tracks = playerRef.current.textTracks();
|
||||||
|
let any = false;
|
||||||
|
for (let i = 0; i < tracks.length; i++) {
|
||||||
|
const t = tracks[i];
|
||||||
|
if (t.kind === 'subtitles' && t.mode === 'showing') { any = true; break; }
|
||||||
|
}
|
||||||
|
if (any) {
|
||||||
|
for (let i = 0; i < tracks.length; i++) {
|
||||||
|
const t = tracks[i];
|
||||||
|
if (t.kind === 'subtitles') t.mode = 'disabled';
|
||||||
|
}
|
||||||
|
el.classList.remove('vjs-subs-active');
|
||||||
|
// Do not change saved language on quick toggle off; save enabled=false
|
||||||
|
try { userPreferences.current.setPreference('subtitleEnabled', false, true); } catch (e) {}
|
||||||
|
} else {
|
||||||
|
// Show using previously chosen language only; do not change it
|
||||||
|
const preferred = userPreferences.current.getPreference('subtitleLanguage');
|
||||||
|
if (!preferred) {
|
||||||
|
// If no language chosen yet, enable first available and save it
|
||||||
|
let first = null;
|
||||||
|
for (let i = 0; i < tracks.length; i++) {
|
||||||
|
const t = tracks[i];
|
||||||
|
if (t.kind === 'subtitles') { first = t.language; break; }
|
||||||
|
}
|
||||||
|
if (first) {
|
||||||
|
for (let i = 0; i < tracks.length; i++) {
|
||||||
|
const t = tracks[i];
|
||||||
|
if (t.kind === 'subtitles') t.mode = t.language === first ? 'showing' : 'disabled';
|
||||||
|
}
|
||||||
|
try { userPreferences.current.setPreference('subtitleLanguage', first, true); } catch (e) {}
|
||||||
|
try { userPreferences.current.setPreference('subtitleEnabled', true, true); } catch (e) {}
|
||||||
|
el.classList.add('vjs-subs-active');
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
let found = false;
|
||||||
|
for (let i = 0; i < tracks.length; i++) {
|
||||||
|
const t = tracks[i];
|
||||||
|
if (t.kind === 'subtitles') {
|
||||||
|
const show = t.language === preferred;
|
||||||
|
t.mode = show ? 'showing' : 'disabled';
|
||||||
|
if (show) found = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (found) {
|
||||||
|
el.classList.add('vjs-subs-active');
|
||||||
|
try { userPreferences.current.setPreference('subtitleEnabled', true, true); } catch (e) {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
el.addEventListener('click', toggleSubs, { capture: true });
|
||||||
|
|
||||||
|
// Add mobile touch support
|
||||||
|
el.addEventListener('touchend', (e) => {
|
||||||
|
e.preventDefault();
|
||||||
|
e.stopPropagation();
|
||||||
|
toggleSubs(e);
|
||||||
|
}, { passive: false });
|
||||||
|
|
||||||
|
// Sync underline state on external changes
|
||||||
|
playerRef.current.on('texttrackchange', () => {
|
||||||
|
const tracks = playerRef.current.textTracks();
|
||||||
|
let any = false;
|
||||||
|
for (let i = 0; i < tracks.length; i++) {
|
||||||
|
const t = tracks[i];
|
||||||
|
if (t.kind === 'subtitles' && t.mode === 'showing') { any = true; break; }
|
||||||
|
}
|
||||||
|
if (any) el.classList.add('vjs-subs-active'); else el.classList.remove('vjs-subs-active');
|
||||||
|
});
|
||||||
|
|
||||||
|
// Initialize state immediately
|
||||||
|
const tracks = playerRef.current.textTracks();
|
||||||
|
let any = false;
|
||||||
|
for (let i = 0; i < tracks.length; i++) {
|
||||||
|
const t = tracks[i];
|
||||||
|
if (t.kind === 'subtitles' && t.mode === 'showing') { any = true; break; }
|
||||||
|
}
|
||||||
|
if (any) el.classList.add('vjs-subs-active');
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
setupClickableMenus();
|
setupClickableMenus();
|
||||||
@@ -1275,6 +1428,17 @@ function VideoJSPlayer() {
|
|||||||
qualities: availableQualities,
|
qualities: availableQualities,
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// If qualities change per video (e.g., via MEDIA_DATA update), refresh menu
|
||||||
|
try {
|
||||||
|
playerRef.current.on('loadedmetadata', () => {
|
||||||
|
if (customComponents.current.settingsMenu && customComponents.current.settingsMenu.setQualities) {
|
||||||
|
const md = typeof window !== 'undefined' ? window.MEDIA_DATA : null;
|
||||||
|
const newQualities = md?.data?.qualities || availableQualities;
|
||||||
|
customComponents.current.settingsMenu.setQualities(newQualities);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
} catch (e) {}
|
||||||
|
|
||||||
// END: Add Settings Menu Component
|
// END: Add Settings Menu Component
|
||||||
|
|
||||||
// BEGIN: Add Seek Indicator Component
|
// BEGIN: Add Seek Indicator Component
|
||||||
@@ -1525,10 +1689,18 @@ function VideoJSPlayer() {
|
|||||||
|
|
||||||
playerRef.current.on('play', () => {
|
playerRef.current.on('play', () => {
|
||||||
console.log('Video started playing');
|
console.log('Video started playing');
|
||||||
|
// Only show play indicator if not changing quality
|
||||||
|
if (!playerRef.current.isChangingQuality) {
|
||||||
|
customComponents.current.seekIndicator.show('play');
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
playerRef.current.on('pause', () => {
|
playerRef.current.on('pause', () => {
|
||||||
console.log('Video paused');
|
console.log('Video paused');
|
||||||
|
// Only show pause indicator if not changing quality
|
||||||
|
if (!playerRef.current.isChangingQuality) {
|
||||||
|
customComponents.current.seekIndicator.show('pause');
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
// Store reference to end screen and autoplay countdown for cleanup
|
// Store reference to end screen and autoplay countdown for cleanup
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ class UserPreferences {
|
|||||||
playbackRate: 1.0, // Normal speed
|
playbackRate: 1.0, // Normal speed
|
||||||
quality: 'auto', // Auto quality
|
quality: 'auto', // Auto quality
|
||||||
subtitleLanguage: null, // No subtitles by default
|
subtitleLanguage: null, // No subtitles by default
|
||||||
|
subtitleEnabled: false, // Subtitles off by default
|
||||||
muted: false,
|
muted: false,
|
||||||
autoplay: false, // Autoplay disabled by default
|
autoplay: false, // Autoplay disabled by default
|
||||||
};
|
};
|
||||||
@@ -389,8 +390,9 @@ class UserPreferences {
|
|||||||
*/
|
*/
|
||||||
applySubtitlePreference(player) {
|
applySubtitlePreference(player) {
|
||||||
const savedLanguage = this.getPreference('subtitleLanguage');
|
const savedLanguage = this.getPreference('subtitleLanguage');
|
||||||
|
const enabled = this.getPreference('subtitleEnabled');
|
||||||
|
|
||||||
if (savedLanguage) {
|
if (savedLanguage && enabled) {
|
||||||
// Set flag to prevent auto-save during restoration
|
// Set flag to prevent auto-save during restoration
|
||||||
this.isRestoringSubtitles = true;
|
this.isRestoringSubtitles = true;
|
||||||
console.log('isRestoringSubtitles', this.isRestoringSubtitles);
|
console.log('isRestoringSubtitles', this.isRestoringSubtitles);
|
||||||
@@ -427,6 +429,9 @@ class UserPreferences {
|
|||||||
|
|
||||||
// Also update the menu UI to reflect the selection
|
// Also update the menu UI to reflect the selection
|
||||||
this.updateSubtitleMenuUI(player, track);
|
this.updateSubtitleMenuUI(player, track);
|
||||||
|
|
||||||
|
// Update subtitle button visual state immediately
|
||||||
|
this.updateSubtitleButtonVisualState(player, true);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -439,8 +444,8 @@ class UserPreferences {
|
|||||||
|
|
||||||
// If not found and we haven't tried too many times, try again
|
// If not found and we haven't tried too many times, try again
|
||||||
if (!found && attempt < 5) {
|
if (!found && attempt < 5) {
|
||||||
console.log(`Subtitle language ${savedLanguage} not found, retrying in ${attempt * 200}ms...`);
|
console.log(`Subtitle language ${savedLanguage} not found, retrying in ${attempt * 50}ms...`);
|
||||||
setTimeout(() => attemptToApplySubtitles(attempt + 1), attempt * 200);
|
setTimeout(() => attemptToApplySubtitles(attempt + 1), attempt * 50);
|
||||||
} else if (!found) {
|
} else if (!found) {
|
||||||
console.warn('Could not find subtitle track for language:', savedLanguage);
|
console.warn('Could not find subtitle track for language:', savedLanguage);
|
||||||
// Clear flag even if not found
|
// Clear flag even if not found
|
||||||
@@ -448,10 +453,54 @@ class UserPreferences {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
// Start attempting to apply subtitles
|
// Start attempting to apply subtitles immediately
|
||||||
setTimeout(() => attemptToApplySubtitles(), 500);
|
attemptToApplySubtitles();
|
||||||
} else {
|
} else {
|
||||||
console.log('No saved subtitle language to apply');
|
// Ensure subtitles are off on load when not enabled
|
||||||
|
try {
|
||||||
|
const textTracks = player.textTracks();
|
||||||
|
for (let i = 0; i < textTracks.length; i++) {
|
||||||
|
const track = textTracks[i];
|
||||||
|
if (track.kind === 'subtitles') {
|
||||||
|
track.mode = 'disabled';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Update subtitle button visual state to show disabled
|
||||||
|
this.updateSubtitleButtonVisualState(player, false);
|
||||||
|
|
||||||
|
// Update custom settings menu to show "Off" as selected
|
||||||
|
this.updateCustomSettingsMenuUI(player);
|
||||||
|
} catch (e) {}
|
||||||
|
console.log('No subtitle auto-apply on load (disabled or no language).');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Update subtitle button visual state (red underline)
|
||||||
|
* @param {Object} player - Video.js player instance
|
||||||
|
* @param {boolean} enabled - Whether subtitles are enabled
|
||||||
|
*/
|
||||||
|
updateSubtitleButtonVisualState(player, enabled) {
|
||||||
|
try {
|
||||||
|
const controlBar = player.getChild('controlBar');
|
||||||
|
const subtitlesButton = controlBar.getChild('subtitlesButton');
|
||||||
|
|
||||||
|
if (subtitlesButton && subtitlesButton.el()) {
|
||||||
|
const buttonEl = subtitlesButton.el();
|
||||||
|
|
||||||
|
if (enabled) {
|
||||||
|
buttonEl.classList.add('vjs-subs-active');
|
||||||
|
console.log('✓ Added vjs-subs-active class to subtitle button');
|
||||||
|
} else {
|
||||||
|
buttonEl.classList.remove('vjs-subs-active');
|
||||||
|
console.log('✓ Removed vjs-subs-active class from subtitle button');
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
console.log('Subtitle button not found for visual state update');
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
console.error('Error updating subtitle button visual state:', error);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -482,11 +531,44 @@ class UserPreferences {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Also update the custom settings menu if it exists
|
||||||
|
this.updateCustomSettingsMenuUI(player);
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error('Error updating subtitle menu UI:', error);
|
console.error('Error updating subtitle menu UI:', error);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Update custom settings menu UI to reflect the current subtitle state
|
||||||
|
* @param {Object} player - Video.js player instance
|
||||||
|
*/
|
||||||
|
updateCustomSettingsMenuUI(player) {
|
||||||
|
const attemptUpdate = (attempt = 1) => {
|
||||||
|
try {
|
||||||
|
// Find the custom settings menu component
|
||||||
|
const controlBar = player.getChild('controlBar');
|
||||||
|
const customSettingsMenu = controlBar.getChild('CustomSettingsMenu');
|
||||||
|
|
||||||
|
if (customSettingsMenu && customSettingsMenu.refreshSubtitlesSubmenu) {
|
||||||
|
console.log('Updating custom settings menu UI...');
|
||||||
|
customSettingsMenu.refreshSubtitlesSubmenu();
|
||||||
|
} else if (attempt < 5) {
|
||||||
|
// Retry after a short delay if menu not found
|
||||||
|
console.log(`Custom settings menu not found, retrying in ${attempt * 200}ms... (attempt ${attempt})`);
|
||||||
|
setTimeout(() => attemptUpdate(attempt + 1), attempt * 200);
|
||||||
|
} else {
|
||||||
|
console.log('Custom settings menu not found after multiple attempts');
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
console.error('Error updating custom settings menu UI:', error);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// Start the update attempt
|
||||||
|
attemptUpdate();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get quality preference for settings menu
|
* Get quality preference for settings menu
|
||||||
* @returns {string} Quality preference
|
* @returns {string} Quality preference
|
||||||
|
|||||||
+168
-160
@@ -78,20 +78,6 @@
|
|||||||
"video.js": "^7.12.3"
|
"video.js": "^7.12.3"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@ampproject/remapping": {
|
|
||||||
"version": "2.3.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz",
|
|
||||||
"integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==",
|
|
||||||
"dev": true,
|
|
||||||
"license": "Apache-2.0",
|
|
||||||
"dependencies": {
|
|
||||||
"@jridgewell/gen-mapping": "^0.3.5",
|
|
||||||
"@jridgewell/trace-mapping": "^0.3.24"
|
|
||||||
},
|
|
||||||
"engines": {
|
|
||||||
"node": ">=6.0.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/@babel/code-frame": {
|
"node_modules/@babel/code-frame": {
|
||||||
"version": "7.27.1",
|
"version": "7.27.1",
|
||||||
"resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz",
|
"resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz",
|
||||||
@@ -108,9 +94,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@babel/compat-data": {
|
"node_modules/@babel/compat-data": {
|
||||||
"version": "7.28.0",
|
"version": "7.28.4",
|
||||||
"resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.0.tgz",
|
"resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.4.tgz",
|
||||||
"integrity": "sha512-60X7qkglvrap8mn1lh2ebxXdZYtUcpd7gsmy9kLaBJ4i/WdY8PqTSdxyA8qraikqKQK5C1KRBKXqznrVapyNaw==",
|
"integrity": "sha512-YsmSKC29MJwf0gF8Rjjrg5LQCmyh+j/nD8/eP7f+BeoQTKYqs9RoWbjGOdy0+1Ekr68RJZMUOPVQaQisnIo4Rw==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"engines": {
|
"engines": {
|
||||||
@@ -118,22 +104,22 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@babel/core": {
|
"node_modules/@babel/core": {
|
||||||
"version": "7.28.0",
|
"version": "7.28.4",
|
||||||
"resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.0.tgz",
|
"resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.4.tgz",
|
||||||
"integrity": "sha512-UlLAnTPrFdNGoFtbSXwcGFQBtQZJCNjaN6hQNP3UPvuNXT1i82N26KL3dZeIpNalWywr9IuQuncaAfUaS1g6sQ==",
|
"integrity": "sha512-2BCOP7TN8M+gVDj7/ht3hsaO/B/n5oDbiAyyvnRlNOs+u1o+JWNYTQrmpuNp1/Wq2gcFrI01JAW+paEKDMx/CA==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@ampproject/remapping": "^2.2.0",
|
|
||||||
"@babel/code-frame": "^7.27.1",
|
"@babel/code-frame": "^7.27.1",
|
||||||
"@babel/generator": "^7.28.0",
|
"@babel/generator": "^7.28.3",
|
||||||
"@babel/helper-compilation-targets": "^7.27.2",
|
"@babel/helper-compilation-targets": "^7.27.2",
|
||||||
"@babel/helper-module-transforms": "^7.27.3",
|
"@babel/helper-module-transforms": "^7.28.3",
|
||||||
"@babel/helpers": "^7.27.6",
|
"@babel/helpers": "^7.28.4",
|
||||||
"@babel/parser": "^7.28.0",
|
"@babel/parser": "^7.28.4",
|
||||||
"@babel/template": "^7.27.2",
|
"@babel/template": "^7.27.2",
|
||||||
"@babel/traverse": "^7.28.0",
|
"@babel/traverse": "^7.28.4",
|
||||||
"@babel/types": "^7.28.0",
|
"@babel/types": "^7.28.4",
|
||||||
|
"@jridgewell/remapping": "^2.3.5",
|
||||||
"convert-source-map": "^2.0.0",
|
"convert-source-map": "^2.0.0",
|
||||||
"debug": "^4.1.0",
|
"debug": "^4.1.0",
|
||||||
"gensync": "^1.0.0-beta.2",
|
"gensync": "^1.0.0-beta.2",
|
||||||
@@ -159,14 +145,14 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@babel/generator": {
|
"node_modules/@babel/generator": {
|
||||||
"version": "7.28.0",
|
"version": "7.28.3",
|
||||||
"resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.0.tgz",
|
"resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.3.tgz",
|
||||||
"integrity": "sha512-lJjzvrbEeWrhB4P3QBsH7tey117PjLZnDbLiQEKjQ/fNJTjuq4HSqgFA+UNSwZT8D7dxxbnuSBMsa1lrWzKlQg==",
|
"integrity": "sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@babel/parser": "^7.28.0",
|
"@babel/parser": "^7.28.3",
|
||||||
"@babel/types": "^7.28.0",
|
"@babel/types": "^7.28.2",
|
||||||
"@jridgewell/gen-mapping": "^0.3.12",
|
"@jridgewell/gen-mapping": "^0.3.12",
|
||||||
"@jridgewell/trace-mapping": "^0.3.28",
|
"@jridgewell/trace-mapping": "^0.3.28",
|
||||||
"jsesc": "^3.0.2"
|
"jsesc": "^3.0.2"
|
||||||
@@ -216,18 +202,18 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@babel/helper-create-class-features-plugin": {
|
"node_modules/@babel/helper-create-class-features-plugin": {
|
||||||
"version": "7.27.1",
|
"version": "7.28.3",
|
||||||
"resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.27.1.tgz",
|
"resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.28.3.tgz",
|
||||||
"integrity": "sha512-QwGAmuvM17btKU5VqXfb+Giw4JcN0hjuufz3DYnpeVDvZLAObloM77bhMXiqry3Iio+Ai4phVRDwl6WU10+r5A==",
|
"integrity": "sha512-V9f6ZFIYSLNEbuGA/92uOvYsGCJNsuA8ESZ4ldc09bWk/j8H8TKiPw8Mk1eG6olpnO0ALHJmYfZvF4MEE4gajg==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@babel/helper-annotate-as-pure": "^7.27.1",
|
"@babel/helper-annotate-as-pure": "^7.27.3",
|
||||||
"@babel/helper-member-expression-to-functions": "^7.27.1",
|
"@babel/helper-member-expression-to-functions": "^7.27.1",
|
||||||
"@babel/helper-optimise-call-expression": "^7.27.1",
|
"@babel/helper-optimise-call-expression": "^7.27.1",
|
||||||
"@babel/helper-replace-supers": "^7.27.1",
|
"@babel/helper-replace-supers": "^7.27.1",
|
||||||
"@babel/helper-skip-transparent-expression-wrappers": "^7.27.1",
|
"@babel/helper-skip-transparent-expression-wrappers": "^7.27.1",
|
||||||
"@babel/traverse": "^7.27.1",
|
"@babel/traverse": "^7.28.3",
|
||||||
"semver": "^6.3.1"
|
"semver": "^6.3.1"
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
@@ -331,15 +317,15 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@babel/helper-module-transforms": {
|
"node_modules/@babel/helper-module-transforms": {
|
||||||
"version": "7.27.3",
|
"version": "7.28.3",
|
||||||
"resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.27.3.tgz",
|
"resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.3.tgz",
|
||||||
"integrity": "sha512-dSOvYwvyLsWBeIRyOeHXp5vPj5l1I011r52FM1+r1jCERv+aFXYk4whgQccYEGYxK2H3ZAIA8nuPkQ0HaUo3qg==",
|
"integrity": "sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@babel/helper-module-imports": "^7.27.1",
|
"@babel/helper-module-imports": "^7.27.1",
|
||||||
"@babel/helper-validator-identifier": "^7.27.1",
|
"@babel/helper-validator-identifier": "^7.27.1",
|
||||||
"@babel/traverse": "^7.27.3"
|
"@babel/traverse": "^7.28.3"
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=6.9.0"
|
"node": ">=6.9.0"
|
||||||
@@ -452,42 +438,42 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@babel/helper-wrap-function": {
|
"node_modules/@babel/helper-wrap-function": {
|
||||||
"version": "7.27.1",
|
"version": "7.28.3",
|
||||||
"resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.27.1.tgz",
|
"resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.28.3.tgz",
|
||||||
"integrity": "sha512-NFJK2sHUvrjo8wAU/nQTWU890/zB2jj0qBcCbZbbf+005cAsv6tMjXz31fBign6M5ov1o0Bllu+9nbqkfsjjJQ==",
|
"integrity": "sha512-zdf983tNfLZFletc0RRXYrHrucBEg95NIFMkn6K9dbeMYnsgHaSBGcQqdsCSStG2PYwRre0Qc2NNSCXbG+xc6g==",
|
||||||
"dev": true,
|
|
||||||
"license": "MIT",
|
|
||||||
"dependencies": {
|
|
||||||
"@babel/template": "^7.27.1",
|
|
||||||
"@babel/traverse": "^7.27.1",
|
|
||||||
"@babel/types": "^7.27.1"
|
|
||||||
},
|
|
||||||
"engines": {
|
|
||||||
"node": ">=6.9.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/@babel/helpers": {
|
|
||||||
"version": "7.28.2",
|
|
||||||
"resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.2.tgz",
|
|
||||||
"integrity": "sha512-/V9771t+EgXz62aCcyofnQhGM8DQACbRhvzKFsXKC9QM+5MadF8ZmIm0crDMaz3+o0h0zXfJnd4EhbYbxsrcFw==",
|
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@babel/template": "^7.27.2",
|
"@babel/template": "^7.27.2",
|
||||||
|
"@babel/traverse": "^7.28.3",
|
||||||
"@babel/types": "^7.28.2"
|
"@babel/types": "^7.28.2"
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=6.9.0"
|
"node": ">=6.9.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@babel/parser": {
|
"node_modules/@babel/helpers": {
|
||||||
"version": "7.28.0",
|
"version": "7.28.4",
|
||||||
"resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.0.tgz",
|
"resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.4.tgz",
|
||||||
"integrity": "sha512-jVZGvOxOuNSsuQuLRTh13nU0AogFlw32w/MT+LV6D3sP5WdbW61E77RnkbaO2dUvmPAYrBDJXGn5gGS6tH4j8g==",
|
"integrity": "sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@babel/types": "^7.28.0"
|
"@babel/template": "^7.27.2",
|
||||||
|
"@babel/types": "^7.28.4"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">=6.9.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@babel/parser": {
|
||||||
|
"version": "7.28.4",
|
||||||
|
"resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.4.tgz",
|
||||||
|
"integrity": "sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg==",
|
||||||
|
"dev": true,
|
||||||
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"@babel/types": "^7.28.4"
|
||||||
},
|
},
|
||||||
"bin": {
|
"bin": {
|
||||||
"parser": "bin/babel-parser.js"
|
"parser": "bin/babel-parser.js"
|
||||||
@@ -564,14 +550,14 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": {
|
"node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": {
|
||||||
"version": "7.27.1",
|
"version": "7.28.3",
|
||||||
"resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.27.1.tgz",
|
"resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.28.3.tgz",
|
||||||
"integrity": "sha512-6BpaYGDavZqkI6yT+KSPdpZFfpnd68UKXbcjI9pJ13pvHhPrCKWOOLp+ysvMeA+DxnhuPpgIaRpxRxo5A9t5jw==",
|
"integrity": "sha512-b6YTX108evsvE4YgWyQ921ZAFFQm3Bn+CA3+ZXlNVnPhx+UfsVURoPjfGAPCjBgrqo30yX/C2nZGX96DxvR9Iw==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@babel/helper-plugin-utils": "^7.27.1",
|
"@babel/helper-plugin-utils": "^7.27.1",
|
||||||
"@babel/traverse": "^7.27.1"
|
"@babel/traverse": "^7.28.3"
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=6.9.0"
|
"node": ">=6.9.0"
|
||||||
@@ -711,9 +697,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@babel/plugin-transform-block-scoping": {
|
"node_modules/@babel/plugin-transform-block-scoping": {
|
||||||
"version": "7.28.0",
|
"version": "7.28.4",
|
||||||
"resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.28.0.tgz",
|
"resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.28.4.tgz",
|
||||||
"integrity": "sha512-gKKnwjpdx5sER/wl0WN0efUBFzF/56YZO0RJrSYP4CljXnP31ByY7fol89AzomdlLNzI36AvOTmYHsnZTCkq8Q==",
|
"integrity": "sha512-1yxmvN0MJHOhPVmAsmoW5liWwoILobu/d/ShymZmj867bAdxGbehIrew1DuLpw2Ukv+qDSSPQdYW1dLNE7t11A==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
@@ -744,13 +730,13 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@babel/plugin-transform-class-static-block": {
|
"node_modules/@babel/plugin-transform-class-static-block": {
|
||||||
"version": "7.27.1",
|
"version": "7.28.3",
|
||||||
"resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.27.1.tgz",
|
"resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.28.3.tgz",
|
||||||
"integrity": "sha512-s734HmYU78MVzZ++joYM+NkJusItbdRcbm+AGRgJCt3iA+yux0QpD9cBVdz3tKyrjVYWRl7j0mHSmv4lhV0aoA==",
|
"integrity": "sha512-LtPXlBbRoc4Njl/oh1CeD/3jC+atytbnf/UqLoqTDcEYGUPj022+rvfkbDYieUrSj3CaV4yHDByPE+T2HwfsJg==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@babel/helper-create-class-features-plugin": "^7.27.1",
|
"@babel/helper-create-class-features-plugin": "^7.28.3",
|
||||||
"@babel/helper-plugin-utils": "^7.27.1"
|
"@babel/helper-plugin-utils": "^7.27.1"
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
@@ -761,9 +747,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@babel/plugin-transform-classes": {
|
"node_modules/@babel/plugin-transform-classes": {
|
||||||
"version": "7.28.0",
|
"version": "7.28.4",
|
||||||
"resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.28.0.tgz",
|
"resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.28.4.tgz",
|
||||||
"integrity": "sha512-IjM1IoJNw72AZFlj33Cu8X0q2XK/6AaVC3jQu+cgQ5lThWD5ajnuUAml80dqRmOhmPkTH8uAwnpMu9Rvj0LTRA==",
|
"integrity": "sha512-cFOlhIYPBv/iBoc+KS3M6et2XPtbT2HiCRfBXWtfpc9OAyostldxIf9YAYB6ypURBBbx+Qv6nyrLzASfJe+hBA==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
@@ -772,7 +758,7 @@
|
|||||||
"@babel/helper-globals": "^7.28.0",
|
"@babel/helper-globals": "^7.28.0",
|
||||||
"@babel/helper-plugin-utils": "^7.27.1",
|
"@babel/helper-plugin-utils": "^7.27.1",
|
||||||
"@babel/helper-replace-supers": "^7.27.1",
|
"@babel/helper-replace-supers": "^7.27.1",
|
||||||
"@babel/traverse": "^7.28.0"
|
"@babel/traverse": "^7.28.4"
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=6.9.0"
|
"node": ">=6.9.0"
|
||||||
@@ -1165,9 +1151,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@babel/plugin-transform-object-rest-spread": {
|
"node_modules/@babel/plugin-transform-object-rest-spread": {
|
||||||
"version": "7.28.0",
|
"version": "7.28.4",
|
||||||
"resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.28.0.tgz",
|
"resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.28.4.tgz",
|
||||||
"integrity": "sha512-9VNGikXxzu5eCiQjdE4IZn8sb9q7Xsk5EXLDBKUYg1e/Tve8/05+KJEtcxGxAgCY5t/BpKQM+JEL/yT4tvgiUA==",
|
"integrity": "sha512-373KA2HQzKhQCYiRVIRr+3MjpCObqzDlyrM6u4I201wL8Mp2wHf7uB8GhDwis03k2ti8Zr65Zyyqs1xOxUF/Ew==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
@@ -1175,7 +1161,7 @@
|
|||||||
"@babel/helper-plugin-utils": "^7.27.1",
|
"@babel/helper-plugin-utils": "^7.27.1",
|
||||||
"@babel/plugin-transform-destructuring": "^7.28.0",
|
"@babel/plugin-transform-destructuring": "^7.28.0",
|
||||||
"@babel/plugin-transform-parameters": "^7.27.7",
|
"@babel/plugin-transform-parameters": "^7.27.7",
|
||||||
"@babel/traverse": "^7.28.0"
|
"@babel/traverse": "^7.28.4"
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=6.9.0"
|
"node": ">=6.9.0"
|
||||||
@@ -1302,9 +1288,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@babel/plugin-transform-regenerator": {
|
"node_modules/@babel/plugin-transform-regenerator": {
|
||||||
"version": "7.28.1",
|
"version": "7.28.4",
|
||||||
"resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.28.1.tgz",
|
"resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.28.4.tgz",
|
||||||
"integrity": "sha512-P0QiV/taaa3kXpLY+sXla5zec4E+4t4Aqc9ggHlfZ7a2cp8/x/Gv08jfwEtn9gnnYIMvHx6aoOZ8XJL8eU71Dg==",
|
"integrity": "sha512-+ZEdQlBoRg9m2NnzvEeLgtvBMO4tkFBw5SQIUgLICgTrumLoU7lr+Oghi6km2PFj+dbUt2u1oby2w3BDO9YQnA==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
@@ -1499,9 +1485,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@babel/preset-env": {
|
"node_modules/@babel/preset-env": {
|
||||||
"version": "7.28.0",
|
"version": "7.28.3",
|
||||||
"resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.28.0.tgz",
|
"resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.28.3.tgz",
|
||||||
"integrity": "sha512-VmaxeGOwuDqzLl5JUkIRM1X2Qu2uKGxHEQWh+cvvbl7JuJRgKGJSfsEF/bUaxFhJl/XAyxBe7q7qSuTbKFuCyg==",
|
"integrity": "sha512-ROiDcM+GbYVPYBOeCR6uBXKkQpBExLl8k9HO1ygXEyds39j+vCCsjmj7S8GOniZQlEs81QlkdJZe76IpLSiqpg==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
@@ -1513,7 +1499,7 @@
|
|||||||
"@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.27.1",
|
"@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.27.1",
|
||||||
"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.27.1",
|
"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.27.1",
|
||||||
"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.27.1",
|
"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.27.1",
|
||||||
"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.27.1",
|
"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.28.3",
|
||||||
"@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2",
|
"@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2",
|
||||||
"@babel/plugin-syntax-import-assertions": "^7.27.1",
|
"@babel/plugin-syntax-import-assertions": "^7.27.1",
|
||||||
"@babel/plugin-syntax-import-attributes": "^7.27.1",
|
"@babel/plugin-syntax-import-attributes": "^7.27.1",
|
||||||
@@ -1524,8 +1510,8 @@
|
|||||||
"@babel/plugin-transform-block-scoped-functions": "^7.27.1",
|
"@babel/plugin-transform-block-scoped-functions": "^7.27.1",
|
||||||
"@babel/plugin-transform-block-scoping": "^7.28.0",
|
"@babel/plugin-transform-block-scoping": "^7.28.0",
|
||||||
"@babel/plugin-transform-class-properties": "^7.27.1",
|
"@babel/plugin-transform-class-properties": "^7.27.1",
|
||||||
"@babel/plugin-transform-class-static-block": "^7.27.1",
|
"@babel/plugin-transform-class-static-block": "^7.28.3",
|
||||||
"@babel/plugin-transform-classes": "^7.28.0",
|
"@babel/plugin-transform-classes": "^7.28.3",
|
||||||
"@babel/plugin-transform-computed-properties": "^7.27.1",
|
"@babel/plugin-transform-computed-properties": "^7.27.1",
|
||||||
"@babel/plugin-transform-destructuring": "^7.28.0",
|
"@babel/plugin-transform-destructuring": "^7.28.0",
|
||||||
"@babel/plugin-transform-dotall-regex": "^7.27.1",
|
"@babel/plugin-transform-dotall-regex": "^7.27.1",
|
||||||
@@ -1557,7 +1543,7 @@
|
|||||||
"@babel/plugin-transform-private-methods": "^7.27.1",
|
"@babel/plugin-transform-private-methods": "^7.27.1",
|
||||||
"@babel/plugin-transform-private-property-in-object": "^7.27.1",
|
"@babel/plugin-transform-private-property-in-object": "^7.27.1",
|
||||||
"@babel/plugin-transform-property-literals": "^7.27.1",
|
"@babel/plugin-transform-property-literals": "^7.27.1",
|
||||||
"@babel/plugin-transform-regenerator": "^7.28.0",
|
"@babel/plugin-transform-regenerator": "^7.28.3",
|
||||||
"@babel/plugin-transform-regexp-modifiers": "^7.27.1",
|
"@babel/plugin-transform-regexp-modifiers": "^7.27.1",
|
||||||
"@babel/plugin-transform-reserved-words": "^7.27.1",
|
"@babel/plugin-transform-reserved-words": "^7.27.1",
|
||||||
"@babel/plugin-transform-shorthand-properties": "^7.27.1",
|
"@babel/plugin-transform-shorthand-properties": "^7.27.1",
|
||||||
@@ -1624,18 +1610,18 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@babel/traverse": {
|
"node_modules/@babel/traverse": {
|
||||||
"version": "7.28.0",
|
"version": "7.28.4",
|
||||||
"resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.0.tgz",
|
"resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.4.tgz",
|
||||||
"integrity": "sha512-mGe7UK5wWyh0bKRfupsUchrQGqvDbZDbKJw+kcRGSmdHVYrv+ltd0pnpDTVpiTqnaBru9iEvA8pz8W46v0Amwg==",
|
"integrity": "sha512-YEzuboP2qvQavAcjgQNVgsvHIDv6ZpwXvcvjmyySP2DIMuByS/6ioU5G9pYrWHM6T2YDfc7xga9iNzYOs12CFQ==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@babel/code-frame": "^7.27.1",
|
"@babel/code-frame": "^7.27.1",
|
||||||
"@babel/generator": "^7.28.0",
|
"@babel/generator": "^7.28.3",
|
||||||
"@babel/helper-globals": "^7.28.0",
|
"@babel/helper-globals": "^7.28.0",
|
||||||
"@babel/parser": "^7.28.0",
|
"@babel/parser": "^7.28.4",
|
||||||
"@babel/template": "^7.27.2",
|
"@babel/template": "^7.27.2",
|
||||||
"@babel/types": "^7.28.0",
|
"@babel/types": "^7.28.4",
|
||||||
"debug": "^4.3.1"
|
"debug": "^4.3.1"
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
@@ -1643,9 +1629,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@babel/types": {
|
"node_modules/@babel/types": {
|
||||||
"version": "7.28.2",
|
"version": "7.28.4",
|
||||||
"resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.2.tgz",
|
"resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.4.tgz",
|
||||||
"integrity": "sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ==",
|
"integrity": "sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
@@ -1657,9 +1643,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@jridgewell/gen-mapping": {
|
"node_modules/@jridgewell/gen-mapping": {
|
||||||
"version": "0.3.12",
|
"version": "0.3.13",
|
||||||
"resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.12.tgz",
|
"resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz",
|
||||||
"integrity": "sha512-OuLGC46TjB5BbN1dH8JULVVZY4WTdkF7tV9Ys6wLL1rubZnCMstOhNHueU5bLCrnRuDhKPDM4g6sw4Bel5Gzqg==",
|
"integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
@@ -1667,6 +1653,17 @@
|
|||||||
"@jridgewell/trace-mapping": "^0.3.24"
|
"@jridgewell/trace-mapping": "^0.3.24"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/@jridgewell/remapping": {
|
||||||
|
"version": "2.3.5",
|
||||||
|
"resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz",
|
||||||
|
"integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==",
|
||||||
|
"dev": true,
|
||||||
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"@jridgewell/gen-mapping": "^0.3.5",
|
||||||
|
"@jridgewell/trace-mapping": "^0.3.24"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/@jridgewell/resolve-uri": {
|
"node_modules/@jridgewell/resolve-uri": {
|
||||||
"version": "3.1.2",
|
"version": "3.1.2",
|
||||||
"resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
|
"resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
|
||||||
@@ -1678,16 +1675,16 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@jridgewell/sourcemap-codec": {
|
"node_modules/@jridgewell/sourcemap-codec": {
|
||||||
"version": "1.5.4",
|
"version": "1.5.5",
|
||||||
"resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.4.tgz",
|
"resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz",
|
||||||
"integrity": "sha512-VT2+G1VQs/9oz078bLrYbecdZKs912zQlkelYpuf+SXF+QvZDYJlbx/LSx+meSAwdDFnF8FVXW92AVjjkVmgFw==",
|
"integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT"
|
"license": "MIT"
|
||||||
},
|
},
|
||||||
"node_modules/@jridgewell/trace-mapping": {
|
"node_modules/@jridgewell/trace-mapping": {
|
||||||
"version": "0.3.29",
|
"version": "0.3.31",
|
||||||
"resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.29.tgz",
|
"resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz",
|
||||||
"integrity": "sha512-uw6guiW/gcAGPDhLmd77/6lW8QLeiV5RUTsAX46Db6oLhGaVj4lhnPwb184s1bkc8kdVg/+h988dro8GRDpmYQ==",
|
"integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
@@ -2111,13 +2108,13 @@
|
|||||||
"license": "MIT"
|
"license": "MIT"
|
||||||
},
|
},
|
||||||
"node_modules/@types/node": {
|
"node_modules/@types/node": {
|
||||||
"version": "24.1.0",
|
"version": "24.4.0",
|
||||||
"resolved": "https://registry.npmjs.org/@types/node/-/node-24.1.0.tgz",
|
"resolved": "https://registry.npmjs.org/@types/node/-/node-24.4.0.tgz",
|
||||||
"integrity": "sha512-ut5FthK5moxFKH2T1CUOC6ctR67rQRvvHdFLCD2Ql6KXmMuCrjsSsRI9UsLCm9M18BMwClv4pn327UvB7eeO1w==",
|
"integrity": "sha512-gUuVEAK4/u6F9wRLznPUU4WGUacSEBDPoC2TrBkw3GAnOLHBL45QdfHOXp1kJ4ypBGLxTOB+t7NJLpKoC3gznQ==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"undici-types": "~7.8.0"
|
"undici-types": "~7.11.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@types/resolve": {
|
"node_modules/@types/resolve": {
|
||||||
@@ -3107,6 +3104,16 @@
|
|||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT"
|
"license": "MIT"
|
||||||
},
|
},
|
||||||
|
"node_modules/baseline-browser-mapping": {
|
||||||
|
"version": "2.8.3",
|
||||||
|
"resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.8.3.tgz",
|
||||||
|
"integrity": "sha512-mcE+Wr2CAhHNWxXN/DdTI+n4gsPc5QpXpWnyCQWiQYIYZX+ZMJ8juXZgjRa/0/YPJo/NSsgW15/YgmI4nbysYw==",
|
||||||
|
"dev": true,
|
||||||
|
"license": "Apache-2.0",
|
||||||
|
"bin": {
|
||||||
|
"baseline-browser-mapping": "dist/cli.js"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/big.js": {
|
"node_modules/big.js": {
|
||||||
"version": "5.2.2",
|
"version": "5.2.2",
|
||||||
"resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz",
|
"resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz",
|
||||||
@@ -3150,9 +3157,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/browserslist": {
|
"node_modules/browserslist": {
|
||||||
"version": "4.25.1",
|
"version": "4.26.0",
|
||||||
"resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.25.1.tgz",
|
"resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.26.0.tgz",
|
||||||
"integrity": "sha512-KGj0KoOMXLpSNkkEI6Z6mShmQy0bc1I+T7K9N81k4WWMrfz+6fQ6es80B/YLAeRoKvjYE1YSHHOW1qe9xIVzHw==",
|
"integrity": "sha512-P9go2WrP9FiPwLv3zqRD/Uoxo0RSHjzFCiQz7d4vbmwNqQFo9T9WCeP/Qn5EbcKQY6DBbkxEXNcpJOmncNrb7A==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
@@ -3170,9 +3177,10 @@
|
|||||||
],
|
],
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"caniuse-lite": "^1.0.30001726",
|
"baseline-browser-mapping": "^2.8.2",
|
||||||
"electron-to-chromium": "^1.5.173",
|
"caniuse-lite": "^1.0.30001741",
|
||||||
"node-releases": "^2.0.19",
|
"electron-to-chromium": "^1.5.218",
|
||||||
|
"node-releases": "^2.0.21",
|
||||||
"update-browserslist-db": "^1.1.3"
|
"update-browserslist-db": "^1.1.3"
|
||||||
},
|
},
|
||||||
"bin": {
|
"bin": {
|
||||||
@@ -3209,9 +3217,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/caniuse-lite": {
|
"node_modules/caniuse-lite": {
|
||||||
"version": "1.0.30001727",
|
"version": "1.0.30001741",
|
||||||
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001727.tgz",
|
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001741.tgz",
|
||||||
"integrity": "sha512-pB68nIHmbN6L/4C6MH1DokyR3bYqFwjaSs/sWDHGj4CTcFtQUQMuJftVwWkXq7mNWOybD3KhUv3oWHoGxgP14Q==",
|
"integrity": "sha512-QGUGitqsc8ARjLdgAfxETDhRbJ0REsP6O3I96TAth/mVjh2cYzN2u+3AzPP3aVSm2FehEItaJw1xd+IGBXWeSw==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
@@ -3379,9 +3387,9 @@
|
|||||||
"license": "MIT"
|
"license": "MIT"
|
||||||
},
|
},
|
||||||
"node_modules/core-js": {
|
"node_modules/core-js": {
|
||||||
"version": "3.44.0",
|
"version": "3.45.1",
|
||||||
"resolved": "https://registry.npmjs.org/core-js/-/core-js-3.44.0.tgz",
|
"resolved": "https://registry.npmjs.org/core-js/-/core-js-3.45.1.tgz",
|
||||||
"integrity": "sha512-aFCtd4l6GvAXwVEh3XbbVqJGHDJt0OZRa+5ePGx3LLwi12WfexqQxcsohb2wgsa/92xtl19Hd66G/L+TaAxDMw==",
|
"integrity": "sha512-L4NPsJlCfZsPeXukyzHFlg/i7IIVwHSItR0wg0FLNqYClJ4MQYTYLbC7EkjKYRLZF2iof2MUgN0EGy7MdQFChg==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"hasInstallScript": true,
|
"hasInstallScript": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
@@ -3391,13 +3399,13 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/core-js-compat": {
|
"node_modules/core-js-compat": {
|
||||||
"version": "3.44.0",
|
"version": "3.45.1",
|
||||||
"resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.44.0.tgz",
|
"resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.45.1.tgz",
|
||||||
"integrity": "sha512-JepmAj2zfl6ogy34qfWtcE7nHKAJnKsQFRn++scjVS2bZFllwptzw61BZcZFYBPpUznLfAvh0LGhxKppk04ClA==",
|
"integrity": "sha512-tqTt5T4PzsMIZ430XGviK4vzYSoeNJ6CXODi6c/voxOT6IZqBht5/EKaSNnYiEjjRYxjVz7DQIsOsY0XNi8PIA==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"browserslist": "^4.25.1"
|
"browserslist": "^4.25.3"
|
||||||
},
|
},
|
||||||
"funding": {
|
"funding": {
|
||||||
"type": "opencollective",
|
"type": "opencollective",
|
||||||
@@ -3636,9 +3644,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/debug": {
|
"node_modules/debug": {
|
||||||
"version": "4.4.1",
|
"version": "4.4.3",
|
||||||
"resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz",
|
"resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz",
|
||||||
"integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==",
|
"integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
@@ -3766,9 +3774,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/electron-to-chromium": {
|
"node_modules/electron-to-chromium": {
|
||||||
"version": "1.5.191",
|
"version": "1.5.218",
|
||||||
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.191.tgz",
|
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.218.tgz",
|
||||||
"integrity": "sha512-xcwe9ELcuxYLUFqZZxL19Z6HVKcvNkIwhbHUz7L3us6u12yR+7uY89dSl570f/IqNthx8dAw3tojG7i4Ni4tDA==",
|
"integrity": "sha512-uwwdN0TUHs8u6iRgN8vKeWZMRll4gBkz+QMqdS7DDe49uiK68/UX92lFb61oiFPrpYZNeZIqa4bA7O6Aiasnzg==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "ISC"
|
"license": "ISC"
|
||||||
},
|
},
|
||||||
@@ -3858,9 +3866,9 @@
|
|||||||
"license": "MIT"
|
"license": "MIT"
|
||||||
},
|
},
|
||||||
"node_modules/fast-uri": {
|
"node_modules/fast-uri": {
|
||||||
"version": "3.0.6",
|
"version": "3.1.0",
|
||||||
"resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.6.tgz",
|
"resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz",
|
||||||
"integrity": "sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==",
|
"integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
@@ -4619,9 +4627,9 @@
|
|||||||
"optional": true
|
"optional": true
|
||||||
},
|
},
|
||||||
"node_modules/node-releases": {
|
"node_modules/node-releases": {
|
||||||
"version": "2.0.19",
|
"version": "2.0.21",
|
||||||
"resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz",
|
"resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.21.tgz",
|
||||||
"integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==",
|
"integrity": "sha512-5b0pgg78U3hwXkCM8Z9b2FJdPZlr9Psr9V2gQPESdGHqbntyFJKFW4r5TeWGFzafGY3hzs1JC62VEQMbl1JFkw==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT"
|
"license": "MIT"
|
||||||
},
|
},
|
||||||
@@ -5574,9 +5582,9 @@
|
|||||||
"license": "MIT"
|
"license": "MIT"
|
||||||
},
|
},
|
||||||
"node_modules/regenerate-unicode-properties": {
|
"node_modules/regenerate-unicode-properties": {
|
||||||
"version": "10.2.0",
|
"version": "10.2.2",
|
||||||
"resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.0.tgz",
|
"resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.2.tgz",
|
||||||
"integrity": "sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA==",
|
"integrity": "sha512-m03P+zhBeQd1RGnYxrGyDAPpWX/epKirLrp8e3qevZdVkKtnCrjjWczIbYc8+xd6vcTStVlqfycTx1KR4LOr0g==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
@@ -5606,18 +5614,18 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/regexpu-core": {
|
"node_modules/regexpu-core": {
|
||||||
"version": "6.2.0",
|
"version": "6.3.1",
|
||||||
"resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.2.0.tgz",
|
"resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.3.1.tgz",
|
||||||
"integrity": "sha512-H66BPQMrv+V16t8xtmq+UC0CBpiTBA60V8ibS1QVReIp8T1z8hwFxqcGzm9K6lgsN7sB5edVH8a+ze6Fqm4weA==",
|
"integrity": "sha512-DzcswPr252wEr7Qz8AyAVbfyBDKLoYp6eRA1We2Fa9qirRFSdtkP5sHr3yglDKy2BbA0fd2T+j/CUSKes3FeVQ==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"regenerate": "^1.4.2",
|
"regenerate": "^1.4.2",
|
||||||
"regenerate-unicode-properties": "^10.2.0",
|
"regenerate-unicode-properties": "^10.2.2",
|
||||||
"regjsgen": "^0.8.0",
|
"regjsgen": "^0.8.0",
|
||||||
"regjsparser": "^0.12.0",
|
"regjsparser": "^0.12.0",
|
||||||
"unicode-match-property-ecmascript": "^2.0.0",
|
"unicode-match-property-ecmascript": "^2.0.0",
|
||||||
"unicode-match-property-value-ecmascript": "^2.1.0"
|
"unicode-match-property-value-ecmascript": "^2.2.1"
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=4"
|
"node": ">=4"
|
||||||
@@ -5932,9 +5940,9 @@
|
|||||||
"license": "ISC"
|
"license": "ISC"
|
||||||
},
|
},
|
||||||
"node_modules/sass": {
|
"node_modules/sass": {
|
||||||
"version": "1.89.2",
|
"version": "1.92.1",
|
||||||
"resolved": "https://registry.npmjs.org/sass/-/sass-1.89.2.tgz",
|
"resolved": "https://registry.npmjs.org/sass/-/sass-1.92.1.tgz",
|
||||||
"integrity": "sha512-xCmtksBKd/jdJ9Bt9p7nPKiuqrlBMBuuGkQlkhZjjQk3Ty48lv93k5Dq6OPkKt4XwxDJ7tvlfrTa1MPA9bf+QA==",
|
"integrity": "sha512-ffmsdbwqb3XeyR8jJR6KelIXARM9bFQe8A6Q3W4Klmwy5Ckd5gz7jgUNHo4UOqutU5Sk1DtKLbpDP0nLCg1xqQ==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
@@ -6344,9 +6352,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/undici-types": {
|
"node_modules/undici-types": {
|
||||||
"version": "7.8.0",
|
"version": "7.11.0",
|
||||||
"resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.8.0.tgz",
|
"resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.11.0.tgz",
|
||||||
"integrity": "sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw==",
|
"integrity": "sha512-kt1ZriHTi7MU+Z/r9DOdAI3ONdaR3M3csEaRc6ewa4f4dTvX4cQCbJ4NkEn0ohE4hHtq85+PhPSTY+pO/1PwgA==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT"
|
"license": "MIT"
|
||||||
},
|
},
|
||||||
@@ -6375,9 +6383,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/unicode-match-property-value-ecmascript": {
|
"node_modules/unicode-match-property-value-ecmascript": {
|
||||||
"version": "2.2.0",
|
"version": "2.2.1",
|
||||||
"resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.0.tgz",
|
"resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.1.tgz",
|
||||||
"integrity": "sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg==",
|
"integrity": "sha512-JQ84qTuMg4nVkx8ga4A16a1epI9H6uTXAknqxkGF/aFfRLw1xC/Bp24HNLaZhHSkWd3+84t8iXnp1J0kYcZHhg==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"engines": {
|
"engines": {
|
||||||
|
|||||||
+207
-267
@@ -76,19 +76,6 @@
|
|||||||
"node": ">=14.17.0"
|
"node": ">=14.17.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@ampproject/remapping": {
|
|
||||||
"version": "2.3.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz",
|
|
||||||
"integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==",
|
|
||||||
"license": "Apache-2.0",
|
|
||||||
"dependencies": {
|
|
||||||
"@jridgewell/gen-mapping": "^0.3.5",
|
|
||||||
"@jridgewell/trace-mapping": "^0.3.24"
|
|
||||||
},
|
|
||||||
"engines": {
|
|
||||||
"node": ">=6.0.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/@babel/code-frame": {
|
"node_modules/@babel/code-frame": {
|
||||||
"version": "7.27.1",
|
"version": "7.27.1",
|
||||||
"resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz",
|
"resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz",
|
||||||
@@ -104,30 +91,30 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@babel/compat-data": {
|
"node_modules/@babel/compat-data": {
|
||||||
"version": "7.28.0",
|
"version": "7.28.4",
|
||||||
"resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.0.tgz",
|
"resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.4.tgz",
|
||||||
"integrity": "sha512-60X7qkglvrap8mn1lh2ebxXdZYtUcpd7gsmy9kLaBJ4i/WdY8PqTSdxyA8qraikqKQK5C1KRBKXqznrVapyNaw==",
|
"integrity": "sha512-YsmSKC29MJwf0gF8Rjjrg5LQCmyh+j/nD8/eP7f+BeoQTKYqs9RoWbjGOdy0+1Ekr68RJZMUOPVQaQisnIo4Rw==",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=6.9.0"
|
"node": ">=6.9.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@babel/core": {
|
"node_modules/@babel/core": {
|
||||||
"version": "7.28.0",
|
"version": "7.28.4",
|
||||||
"resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.0.tgz",
|
"resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.4.tgz",
|
||||||
"integrity": "sha512-UlLAnTPrFdNGoFtbSXwcGFQBtQZJCNjaN6hQNP3UPvuNXT1i82N26KL3dZeIpNalWywr9IuQuncaAfUaS1g6sQ==",
|
"integrity": "sha512-2BCOP7TN8M+gVDj7/ht3hsaO/B/n5oDbiAyyvnRlNOs+u1o+JWNYTQrmpuNp1/Wq2gcFrI01JAW+paEKDMx/CA==",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@ampproject/remapping": "^2.2.0",
|
|
||||||
"@babel/code-frame": "^7.27.1",
|
"@babel/code-frame": "^7.27.1",
|
||||||
"@babel/generator": "^7.28.0",
|
"@babel/generator": "^7.28.3",
|
||||||
"@babel/helper-compilation-targets": "^7.27.2",
|
"@babel/helper-compilation-targets": "^7.27.2",
|
||||||
"@babel/helper-module-transforms": "^7.27.3",
|
"@babel/helper-module-transforms": "^7.28.3",
|
||||||
"@babel/helpers": "^7.27.6",
|
"@babel/helpers": "^7.28.4",
|
||||||
"@babel/parser": "^7.28.0",
|
"@babel/parser": "^7.28.4",
|
||||||
"@babel/template": "^7.27.2",
|
"@babel/template": "^7.27.2",
|
||||||
"@babel/traverse": "^7.28.0",
|
"@babel/traverse": "^7.28.4",
|
||||||
"@babel/types": "^7.28.0",
|
"@babel/types": "^7.28.4",
|
||||||
|
"@jridgewell/remapping": "^2.3.5",
|
||||||
"convert-source-map": "^2.0.0",
|
"convert-source-map": "^2.0.0",
|
||||||
"debug": "^4.1.0",
|
"debug": "^4.1.0",
|
||||||
"gensync": "^1.0.0-beta.2",
|
"gensync": "^1.0.0-beta.2",
|
||||||
@@ -152,13 +139,13 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@babel/generator": {
|
"node_modules/@babel/generator": {
|
||||||
"version": "7.28.0",
|
"version": "7.28.3",
|
||||||
"resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.0.tgz",
|
"resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.3.tgz",
|
||||||
"integrity": "sha512-lJjzvrbEeWrhB4P3QBsH7tey117PjLZnDbLiQEKjQ/fNJTjuq4HSqgFA+UNSwZT8D7dxxbnuSBMsa1lrWzKlQg==",
|
"integrity": "sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw==",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@babel/parser": "^7.28.0",
|
"@babel/parser": "^7.28.3",
|
||||||
"@babel/types": "^7.28.0",
|
"@babel/types": "^7.28.2",
|
||||||
"@jridgewell/gen-mapping": "^0.3.12",
|
"@jridgewell/gen-mapping": "^0.3.12",
|
||||||
"@jridgewell/trace-mapping": "^0.3.28",
|
"@jridgewell/trace-mapping": "^0.3.28",
|
||||||
"jsesc": "^3.0.2"
|
"jsesc": "^3.0.2"
|
||||||
@@ -205,17 +192,17 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@babel/helper-create-class-features-plugin": {
|
"node_modules/@babel/helper-create-class-features-plugin": {
|
||||||
"version": "7.27.1",
|
"version": "7.28.3",
|
||||||
"resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.27.1.tgz",
|
"resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.28.3.tgz",
|
||||||
"integrity": "sha512-QwGAmuvM17btKU5VqXfb+Giw4JcN0hjuufz3DYnpeVDvZLAObloM77bhMXiqry3Iio+Ai4phVRDwl6WU10+r5A==",
|
"integrity": "sha512-V9f6ZFIYSLNEbuGA/92uOvYsGCJNsuA8ESZ4ldc09bWk/j8H8TKiPw8Mk1eG6olpnO0ALHJmYfZvF4MEE4gajg==",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@babel/helper-annotate-as-pure": "^7.27.1",
|
"@babel/helper-annotate-as-pure": "^7.27.3",
|
||||||
"@babel/helper-member-expression-to-functions": "^7.27.1",
|
"@babel/helper-member-expression-to-functions": "^7.27.1",
|
||||||
"@babel/helper-optimise-call-expression": "^7.27.1",
|
"@babel/helper-optimise-call-expression": "^7.27.1",
|
||||||
"@babel/helper-replace-supers": "^7.27.1",
|
"@babel/helper-replace-supers": "^7.27.1",
|
||||||
"@babel/helper-skip-transparent-expression-wrappers": "^7.27.1",
|
"@babel/helper-skip-transparent-expression-wrappers": "^7.27.1",
|
||||||
"@babel/traverse": "^7.27.1",
|
"@babel/traverse": "^7.28.3",
|
||||||
"semver": "^6.3.1"
|
"semver": "^6.3.1"
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
@@ -312,14 +299,14 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@babel/helper-module-transforms": {
|
"node_modules/@babel/helper-module-transforms": {
|
||||||
"version": "7.27.3",
|
"version": "7.28.3",
|
||||||
"resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.27.3.tgz",
|
"resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.3.tgz",
|
||||||
"integrity": "sha512-dSOvYwvyLsWBeIRyOeHXp5vPj5l1I011r52FM1+r1jCERv+aFXYk4whgQccYEGYxK2H3ZAIA8nuPkQ0HaUo3qg==",
|
"integrity": "sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@babel/helper-module-imports": "^7.27.1",
|
"@babel/helper-module-imports": "^7.27.1",
|
||||||
"@babel/helper-validator-identifier": "^7.27.1",
|
"@babel/helper-validator-identifier": "^7.27.1",
|
||||||
"@babel/traverse": "^7.27.3"
|
"@babel/traverse": "^7.28.3"
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=6.9.0"
|
"node": ">=6.9.0"
|
||||||
@@ -424,39 +411,39 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@babel/helper-wrap-function": {
|
"node_modules/@babel/helper-wrap-function": {
|
||||||
"version": "7.27.1",
|
"version": "7.28.3",
|
||||||
"resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.27.1.tgz",
|
"resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.28.3.tgz",
|
||||||
"integrity": "sha512-NFJK2sHUvrjo8wAU/nQTWU890/zB2jj0qBcCbZbbf+005cAsv6tMjXz31fBign6M5ov1o0Bllu+9nbqkfsjjJQ==",
|
"integrity": "sha512-zdf983tNfLZFletc0RRXYrHrucBEg95NIFMkn6K9dbeMYnsgHaSBGcQqdsCSStG2PYwRre0Qc2NNSCXbG+xc6g==",
|
||||||
"license": "MIT",
|
|
||||||
"dependencies": {
|
|
||||||
"@babel/template": "^7.27.1",
|
|
||||||
"@babel/traverse": "^7.27.1",
|
|
||||||
"@babel/types": "^7.27.1"
|
|
||||||
},
|
|
||||||
"engines": {
|
|
||||||
"node": ">=6.9.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/@babel/helpers": {
|
|
||||||
"version": "7.28.2",
|
|
||||||
"resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.2.tgz",
|
|
||||||
"integrity": "sha512-/V9771t+EgXz62aCcyofnQhGM8DQACbRhvzKFsXKC9QM+5MadF8ZmIm0crDMaz3+o0h0zXfJnd4EhbYbxsrcFw==",
|
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@babel/template": "^7.27.2",
|
"@babel/template": "^7.27.2",
|
||||||
|
"@babel/traverse": "^7.28.3",
|
||||||
"@babel/types": "^7.28.2"
|
"@babel/types": "^7.28.2"
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=6.9.0"
|
"node": ">=6.9.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@babel/parser": {
|
"node_modules/@babel/helpers": {
|
||||||
"version": "7.28.0",
|
"version": "7.28.4",
|
||||||
"resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.0.tgz",
|
"resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.4.tgz",
|
||||||
"integrity": "sha512-jVZGvOxOuNSsuQuLRTh13nU0AogFlw32w/MT+LV6D3sP5WdbW61E77RnkbaO2dUvmPAYrBDJXGn5gGS6tH4j8g==",
|
"integrity": "sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@babel/types": "^7.28.0"
|
"@babel/template": "^7.27.2",
|
||||||
|
"@babel/types": "^7.28.4"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">=6.9.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@babel/parser": {
|
||||||
|
"version": "7.28.4",
|
||||||
|
"resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.4.tgz",
|
||||||
|
"integrity": "sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg==",
|
||||||
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"@babel/types": "^7.28.4"
|
||||||
},
|
},
|
||||||
"bin": {
|
"bin": {
|
||||||
"parser": "bin/babel-parser.js"
|
"parser": "bin/babel-parser.js"
|
||||||
@@ -529,13 +516,13 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": {
|
"node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": {
|
||||||
"version": "7.27.1",
|
"version": "7.28.3",
|
||||||
"resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.27.1.tgz",
|
"resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.28.3.tgz",
|
||||||
"integrity": "sha512-6BpaYGDavZqkI6yT+KSPdpZFfpnd68UKXbcjI9pJ13pvHhPrCKWOOLp+ysvMeA+DxnhuPpgIaRpxRxo5A9t5jw==",
|
"integrity": "sha512-b6YTX108evsvE4YgWyQ921ZAFFQm3Bn+CA3+ZXlNVnPhx+UfsVURoPjfGAPCjBgrqo30yX/C2nZGX96DxvR9Iw==",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@babel/helper-plugin-utils": "^7.27.1",
|
"@babel/helper-plugin-utils": "^7.27.1",
|
||||||
"@babel/traverse": "^7.27.1"
|
"@babel/traverse": "^7.28.3"
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=6.9.0"
|
"node": ">=6.9.0"
|
||||||
@@ -750,9 +737,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@babel/plugin-transform-block-scoping": {
|
"node_modules/@babel/plugin-transform-block-scoping": {
|
||||||
"version": "7.28.0",
|
"version": "7.28.4",
|
||||||
"resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.28.0.tgz",
|
"resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.28.4.tgz",
|
||||||
"integrity": "sha512-gKKnwjpdx5sER/wl0WN0efUBFzF/56YZO0RJrSYP4CljXnP31ByY7fol89AzomdlLNzI36AvOTmYHsnZTCkq8Q==",
|
"integrity": "sha512-1yxmvN0MJHOhPVmAsmoW5liWwoILobu/d/ShymZmj867bAdxGbehIrew1DuLpw2Ukv+qDSSPQdYW1dLNE7t11A==",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@babel/helper-plugin-utils": "^7.27.1"
|
"@babel/helper-plugin-utils": "^7.27.1"
|
||||||
@@ -781,12 +768,12 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@babel/plugin-transform-class-static-block": {
|
"node_modules/@babel/plugin-transform-class-static-block": {
|
||||||
"version": "7.27.1",
|
"version": "7.28.3",
|
||||||
"resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.27.1.tgz",
|
"resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.28.3.tgz",
|
||||||
"integrity": "sha512-s734HmYU78MVzZ++joYM+NkJusItbdRcbm+AGRgJCt3iA+yux0QpD9cBVdz3tKyrjVYWRl7j0mHSmv4lhV0aoA==",
|
"integrity": "sha512-LtPXlBbRoc4Njl/oh1CeD/3jC+atytbnf/UqLoqTDcEYGUPj022+rvfkbDYieUrSj3CaV4yHDByPE+T2HwfsJg==",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@babel/helper-create-class-features-plugin": "^7.27.1",
|
"@babel/helper-create-class-features-plugin": "^7.28.3",
|
||||||
"@babel/helper-plugin-utils": "^7.27.1"
|
"@babel/helper-plugin-utils": "^7.27.1"
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
@@ -797,9 +784,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@babel/plugin-transform-classes": {
|
"node_modules/@babel/plugin-transform-classes": {
|
||||||
"version": "7.28.0",
|
"version": "7.28.4",
|
||||||
"resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.28.0.tgz",
|
"resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.28.4.tgz",
|
||||||
"integrity": "sha512-IjM1IoJNw72AZFlj33Cu8X0q2XK/6AaVC3jQu+cgQ5lThWD5ajnuUAml80dqRmOhmPkTH8uAwnpMu9Rvj0LTRA==",
|
"integrity": "sha512-cFOlhIYPBv/iBoc+KS3M6et2XPtbT2HiCRfBXWtfpc9OAyostldxIf9YAYB6ypURBBbx+Qv6nyrLzASfJe+hBA==",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@babel/helper-annotate-as-pure": "^7.27.3",
|
"@babel/helper-annotate-as-pure": "^7.27.3",
|
||||||
@@ -807,7 +794,7 @@
|
|||||||
"@babel/helper-globals": "^7.28.0",
|
"@babel/helper-globals": "^7.28.0",
|
||||||
"@babel/helper-plugin-utils": "^7.27.1",
|
"@babel/helper-plugin-utils": "^7.27.1",
|
||||||
"@babel/helper-replace-supers": "^7.27.1",
|
"@babel/helper-replace-supers": "^7.27.1",
|
||||||
"@babel/traverse": "^7.28.0"
|
"@babel/traverse": "^7.28.4"
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=6.9.0"
|
"node": ">=6.9.0"
|
||||||
@@ -1177,16 +1164,16 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@babel/plugin-transform-object-rest-spread": {
|
"node_modules/@babel/plugin-transform-object-rest-spread": {
|
||||||
"version": "7.28.0",
|
"version": "7.28.4",
|
||||||
"resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.28.0.tgz",
|
"resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.28.4.tgz",
|
||||||
"integrity": "sha512-9VNGikXxzu5eCiQjdE4IZn8sb9q7Xsk5EXLDBKUYg1e/Tve8/05+KJEtcxGxAgCY5t/BpKQM+JEL/yT4tvgiUA==",
|
"integrity": "sha512-373KA2HQzKhQCYiRVIRr+3MjpCObqzDlyrM6u4I201wL8Mp2wHf7uB8GhDwis03k2ti8Zr65Zyyqs1xOxUF/Ew==",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@babel/helper-compilation-targets": "^7.27.2",
|
"@babel/helper-compilation-targets": "^7.27.2",
|
||||||
"@babel/helper-plugin-utils": "^7.27.1",
|
"@babel/helper-plugin-utils": "^7.27.1",
|
||||||
"@babel/plugin-transform-destructuring": "^7.28.0",
|
"@babel/plugin-transform-destructuring": "^7.28.0",
|
||||||
"@babel/plugin-transform-parameters": "^7.27.7",
|
"@babel/plugin-transform-parameters": "^7.27.7",
|
||||||
"@babel/traverse": "^7.28.0"
|
"@babel/traverse": "^7.28.4"
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=6.9.0"
|
"node": ">=6.9.0"
|
||||||
@@ -1386,9 +1373,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@babel/plugin-transform-regenerator": {
|
"node_modules/@babel/plugin-transform-regenerator": {
|
||||||
"version": "7.28.1",
|
"version": "7.28.4",
|
||||||
"resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.28.1.tgz",
|
"resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.28.4.tgz",
|
||||||
"integrity": "sha512-P0QiV/taaa3kXpLY+sXla5zec4E+4t4Aqc9ggHlfZ7a2cp8/x/Gv08jfwEtn9gnnYIMvHx6aoOZ8XJL8eU71Dg==",
|
"integrity": "sha512-+ZEdQlBoRg9m2NnzvEeLgtvBMO4tkFBw5SQIUgLICgTrumLoU7lr+Oghi6km2PFj+dbUt2u1oby2w3BDO9YQnA==",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@babel/helper-plugin-utils": "^7.27.1"
|
"@babel/helper-plugin-utils": "^7.27.1"
|
||||||
@@ -1591,9 +1578,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@babel/preset-env": {
|
"node_modules/@babel/preset-env": {
|
||||||
"version": "7.28.0",
|
"version": "7.28.3",
|
||||||
"resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.28.0.tgz",
|
"resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.28.3.tgz",
|
||||||
"integrity": "sha512-VmaxeGOwuDqzLl5JUkIRM1X2Qu2uKGxHEQWh+cvvbl7JuJRgKGJSfsEF/bUaxFhJl/XAyxBe7q7qSuTbKFuCyg==",
|
"integrity": "sha512-ROiDcM+GbYVPYBOeCR6uBXKkQpBExLl8k9HO1ygXEyds39j+vCCsjmj7S8GOniZQlEs81QlkdJZe76IpLSiqpg==",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@babel/compat-data": "^7.28.0",
|
"@babel/compat-data": "^7.28.0",
|
||||||
@@ -1604,7 +1591,7 @@
|
|||||||
"@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.27.1",
|
"@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.27.1",
|
||||||
"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.27.1",
|
"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.27.1",
|
||||||
"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.27.1",
|
"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.27.1",
|
||||||
"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.27.1",
|
"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.28.3",
|
||||||
"@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2",
|
"@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2",
|
||||||
"@babel/plugin-syntax-import-assertions": "^7.27.1",
|
"@babel/plugin-syntax-import-assertions": "^7.27.1",
|
||||||
"@babel/plugin-syntax-import-attributes": "^7.27.1",
|
"@babel/plugin-syntax-import-attributes": "^7.27.1",
|
||||||
@@ -1615,8 +1602,8 @@
|
|||||||
"@babel/plugin-transform-block-scoped-functions": "^7.27.1",
|
"@babel/plugin-transform-block-scoped-functions": "^7.27.1",
|
||||||
"@babel/plugin-transform-block-scoping": "^7.28.0",
|
"@babel/plugin-transform-block-scoping": "^7.28.0",
|
||||||
"@babel/plugin-transform-class-properties": "^7.27.1",
|
"@babel/plugin-transform-class-properties": "^7.27.1",
|
||||||
"@babel/plugin-transform-class-static-block": "^7.27.1",
|
"@babel/plugin-transform-class-static-block": "^7.28.3",
|
||||||
"@babel/plugin-transform-classes": "^7.28.0",
|
"@babel/plugin-transform-classes": "^7.28.3",
|
||||||
"@babel/plugin-transform-computed-properties": "^7.27.1",
|
"@babel/plugin-transform-computed-properties": "^7.27.1",
|
||||||
"@babel/plugin-transform-destructuring": "^7.28.0",
|
"@babel/plugin-transform-destructuring": "^7.28.0",
|
||||||
"@babel/plugin-transform-dotall-regex": "^7.27.1",
|
"@babel/plugin-transform-dotall-regex": "^7.27.1",
|
||||||
@@ -1648,7 +1635,7 @@
|
|||||||
"@babel/plugin-transform-private-methods": "^7.27.1",
|
"@babel/plugin-transform-private-methods": "^7.27.1",
|
||||||
"@babel/plugin-transform-private-property-in-object": "^7.27.1",
|
"@babel/plugin-transform-private-property-in-object": "^7.27.1",
|
||||||
"@babel/plugin-transform-property-literals": "^7.27.1",
|
"@babel/plugin-transform-property-literals": "^7.27.1",
|
||||||
"@babel/plugin-transform-regenerator": "^7.28.0",
|
"@babel/plugin-transform-regenerator": "^7.28.3",
|
||||||
"@babel/plugin-transform-regexp-modifiers": "^7.27.1",
|
"@babel/plugin-transform-regexp-modifiers": "^7.27.1",
|
||||||
"@babel/plugin-transform-reserved-words": "^7.27.1",
|
"@babel/plugin-transform-reserved-words": "^7.27.1",
|
||||||
"@babel/plugin-transform-shorthand-properties": "^7.27.1",
|
"@babel/plugin-transform-shorthand-properties": "^7.27.1",
|
||||||
@@ -1752,17 +1739,17 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@babel/traverse": {
|
"node_modules/@babel/traverse": {
|
||||||
"version": "7.28.0",
|
"version": "7.28.4",
|
||||||
"resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.0.tgz",
|
"resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.4.tgz",
|
||||||
"integrity": "sha512-mGe7UK5wWyh0bKRfupsUchrQGqvDbZDbKJw+kcRGSmdHVYrv+ltd0pnpDTVpiTqnaBru9iEvA8pz8W46v0Amwg==",
|
"integrity": "sha512-YEzuboP2qvQavAcjgQNVgsvHIDv6ZpwXvcvjmyySP2DIMuByS/6ioU5G9pYrWHM6T2YDfc7xga9iNzYOs12CFQ==",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@babel/code-frame": "^7.27.1",
|
"@babel/code-frame": "^7.27.1",
|
||||||
"@babel/generator": "^7.28.0",
|
"@babel/generator": "^7.28.3",
|
||||||
"@babel/helper-globals": "^7.28.0",
|
"@babel/helper-globals": "^7.28.0",
|
||||||
"@babel/parser": "^7.28.0",
|
"@babel/parser": "^7.28.4",
|
||||||
"@babel/template": "^7.27.2",
|
"@babel/template": "^7.27.2",
|
||||||
"@babel/types": "^7.28.0",
|
"@babel/types": "^7.28.4",
|
||||||
"debug": "^4.3.1"
|
"debug": "^4.3.1"
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
@@ -1770,9 +1757,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@babel/types": {
|
"node_modules/@babel/types": {
|
||||||
"version": "7.28.2",
|
"version": "7.28.4",
|
||||||
"resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.2.tgz",
|
"resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.4.tgz",
|
||||||
"integrity": "sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ==",
|
"integrity": "sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q==",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@babel/helper-string-parser": "^7.27.1",
|
"@babel/helper-string-parser": "^7.27.1",
|
||||||
@@ -1792,15 +1779,25 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@jridgewell/gen-mapping": {
|
"node_modules/@jridgewell/gen-mapping": {
|
||||||
"version": "0.3.12",
|
"version": "0.3.13",
|
||||||
"resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.12.tgz",
|
"resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz",
|
||||||
"integrity": "sha512-OuLGC46TjB5BbN1dH8JULVVZY4WTdkF7tV9Ys6wLL1rubZnCMstOhNHueU5bLCrnRuDhKPDM4g6sw4Bel5Gzqg==",
|
"integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@jridgewell/sourcemap-codec": "^1.5.0",
|
"@jridgewell/sourcemap-codec": "^1.5.0",
|
||||||
"@jridgewell/trace-mapping": "^0.3.24"
|
"@jridgewell/trace-mapping": "^0.3.24"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/@jridgewell/remapping": {
|
||||||
|
"version": "2.3.5",
|
||||||
|
"resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz",
|
||||||
|
"integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==",
|
||||||
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"@jridgewell/gen-mapping": "^0.3.5",
|
||||||
|
"@jridgewell/trace-mapping": "^0.3.24"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/@jridgewell/resolve-uri": {
|
"node_modules/@jridgewell/resolve-uri": {
|
||||||
"version": "3.1.2",
|
"version": "3.1.2",
|
||||||
"resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
|
"resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
|
||||||
@@ -1811,9 +1808,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@jridgewell/source-map": {
|
"node_modules/@jridgewell/source-map": {
|
||||||
"version": "0.3.10",
|
"version": "0.3.11",
|
||||||
"resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.10.tgz",
|
"resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.11.tgz",
|
||||||
"integrity": "sha512-0pPkgz9dY+bijgistcTTJ5mR+ocqRXLuhXHYdzoMmmoJ2C9S46RCm2GMUbatPEUK9Yjy26IrAy8D/M00lLkv+Q==",
|
"integrity": "sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@jridgewell/gen-mapping": "^0.3.5",
|
"@jridgewell/gen-mapping": "^0.3.5",
|
||||||
@@ -1821,15 +1818,15 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@jridgewell/sourcemap-codec": {
|
"node_modules/@jridgewell/sourcemap-codec": {
|
||||||
"version": "1.5.4",
|
"version": "1.5.5",
|
||||||
"resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.4.tgz",
|
"resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz",
|
||||||
"integrity": "sha512-VT2+G1VQs/9oz078bLrYbecdZKs912zQlkelYpuf+SXF+QvZDYJlbx/LSx+meSAwdDFnF8FVXW92AVjjkVmgFw==",
|
"integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==",
|
||||||
"license": "MIT"
|
"license": "MIT"
|
||||||
},
|
},
|
||||||
"node_modules/@jridgewell/trace-mapping": {
|
"node_modules/@jridgewell/trace-mapping": {
|
||||||
"version": "0.3.29",
|
"version": "0.3.31",
|
||||||
"resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.29.tgz",
|
"resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz",
|
||||||
"integrity": "sha512-uw6guiW/gcAGPDhLmd77/6lW8QLeiV5RUTsAX46Db6oLhGaVj4lhnPwb184s1bkc8kdVg/+h988dro8GRDpmYQ==",
|
"integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@jridgewell/resolve-uri": "^3.1.0",
|
"@jridgewell/resolve-uri": "^3.1.0",
|
||||||
@@ -2597,12 +2594,12 @@
|
|||||||
"license": "MIT"
|
"license": "MIT"
|
||||||
},
|
},
|
||||||
"node_modules/@types/node": {
|
"node_modules/@types/node": {
|
||||||
"version": "24.1.0",
|
"version": "24.4.0",
|
||||||
"resolved": "https://registry.npmjs.org/@types/node/-/node-24.1.0.tgz",
|
"resolved": "https://registry.npmjs.org/@types/node/-/node-24.4.0.tgz",
|
||||||
"integrity": "sha512-ut5FthK5moxFKH2T1CUOC6ctR67rQRvvHdFLCD2Ql6KXmMuCrjsSsRI9UsLCm9M18BMwClv4pn327UvB7eeO1w==",
|
"integrity": "sha512-gUuVEAK4/u6F9wRLznPUU4WGUacSEBDPoC2TrBkw3GAnOLHBL45QdfHOXp1kJ4ypBGLxTOB+t7NJLpKoC3gznQ==",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"undici-types": "~7.8.0"
|
"undici-types": "~7.11.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@types/parse-json": {
|
"node_modules/@types/parse-json": {
|
||||||
@@ -3789,6 +3786,15 @@
|
|||||||
],
|
],
|
||||||
"license": "MIT"
|
"license": "MIT"
|
||||||
},
|
},
|
||||||
|
"node_modules/baseline-browser-mapping": {
|
||||||
|
"version": "2.8.3",
|
||||||
|
"resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.8.3.tgz",
|
||||||
|
"integrity": "sha512-mcE+Wr2CAhHNWxXN/DdTI+n4gsPc5QpXpWnyCQWiQYIYZX+ZMJ8juXZgjRa/0/YPJo/NSsgW15/YgmI4nbysYw==",
|
||||||
|
"license": "Apache-2.0",
|
||||||
|
"bin": {
|
||||||
|
"baseline-browser-mapping": "dist/cli.js"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/batch": {
|
"node_modules/batch": {
|
||||||
"version": "0.6.1",
|
"version": "0.6.1",
|
||||||
"resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz",
|
"resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz",
|
||||||
@@ -4067,9 +4073,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/browserslist": {
|
"node_modules/browserslist": {
|
||||||
"version": "4.25.1",
|
"version": "4.26.0",
|
||||||
"resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.25.1.tgz",
|
"resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.26.0.tgz",
|
||||||
"integrity": "sha512-KGj0KoOMXLpSNkkEI6Z6mShmQy0bc1I+T7K9N81k4WWMrfz+6fQ6es80B/YLAeRoKvjYE1YSHHOW1qe9xIVzHw==",
|
"integrity": "sha512-P9go2WrP9FiPwLv3zqRD/Uoxo0RSHjzFCiQz7d4vbmwNqQFo9T9WCeP/Qn5EbcKQY6DBbkxEXNcpJOmncNrb7A==",
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
"type": "opencollective",
|
"type": "opencollective",
|
||||||
@@ -4086,9 +4092,10 @@
|
|||||||
],
|
],
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"caniuse-lite": "^1.0.30001726",
|
"baseline-browser-mapping": "^2.8.2",
|
||||||
"electron-to-chromium": "^1.5.173",
|
"caniuse-lite": "^1.0.30001741",
|
||||||
"node-releases": "^2.0.19",
|
"electron-to-chromium": "^1.5.218",
|
||||||
|
"node-releases": "^2.0.21",
|
||||||
"update-browserslist-db": "^1.1.3"
|
"update-browserslist-db": "^1.1.3"
|
||||||
},
|
},
|
||||||
"bin": {
|
"bin": {
|
||||||
@@ -4279,9 +4286,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/caniuse-lite": {
|
"node_modules/caniuse-lite": {
|
||||||
"version": "1.0.30001727",
|
"version": "1.0.30001741",
|
||||||
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001727.tgz",
|
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001741.tgz",
|
||||||
"integrity": "sha512-pB68nIHmbN6L/4C6MH1DokyR3bYqFwjaSs/sWDHGj4CTcFtQUQMuJftVwWkXq7mNWOybD3KhUv3oWHoGxgP14Q==",
|
"integrity": "sha512-QGUGitqsc8ARjLdgAfxETDhRbJ0REsP6O3I96TAth/mVjh2cYzN2u+3AzPP3aVSm2FehEItaJw1xd+IGBXWeSw==",
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
"type": "opencollective",
|
"type": "opencollective",
|
||||||
@@ -4713,12 +4720,12 @@
|
|||||||
"license": "MIT"
|
"license": "MIT"
|
||||||
},
|
},
|
||||||
"node_modules/core-js-compat": {
|
"node_modules/core-js-compat": {
|
||||||
"version": "3.44.0",
|
"version": "3.45.1",
|
||||||
"resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.44.0.tgz",
|
"resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.45.1.tgz",
|
||||||
"integrity": "sha512-JepmAj2zfl6ogy34qfWtcE7nHKAJnKsQFRn++scjVS2bZFllwptzw61BZcZFYBPpUznLfAvh0LGhxKppk04ClA==",
|
"integrity": "sha512-tqTt5T4PzsMIZ430XGviK4vzYSoeNJ6CXODi6c/voxOT6IZqBht5/EKaSNnYiEjjRYxjVz7DQIsOsY0XNi8PIA==",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"browserslist": "^4.25.1"
|
"browserslist": "^4.25.3"
|
||||||
},
|
},
|
||||||
"funding": {
|
"funding": {
|
||||||
"type": "opencollective",
|
"type": "opencollective",
|
||||||
@@ -5243,9 +5250,9 @@
|
|||||||
"license": "MIT"
|
"license": "MIT"
|
||||||
},
|
},
|
||||||
"node_modules/debug": {
|
"node_modules/debug": {
|
||||||
"version": "4.4.1",
|
"version": "4.4.3",
|
||||||
"resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz",
|
"resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz",
|
||||||
"integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==",
|
"integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"ms": "^2.1.3"
|
"ms": "^2.1.3"
|
||||||
@@ -5756,9 +5763,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/electron-to-chromium": {
|
"node_modules/electron-to-chromium": {
|
||||||
"version": "1.5.191",
|
"version": "1.5.218",
|
||||||
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.191.tgz",
|
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.218.tgz",
|
||||||
"integrity": "sha512-xcwe9ELcuxYLUFqZZxL19Z6HVKcvNkIwhbHUz7L3us6u12yR+7uY89dSl570f/IqNthx8dAw3tojG7i4Ni4tDA==",
|
"integrity": "sha512-uwwdN0TUHs8u6iRgN8vKeWZMRll4gBkz+QMqdS7DDe49uiK68/UX92lFb61oiFPrpYZNeZIqa4bA7O6Aiasnzg==",
|
||||||
"license": "ISC"
|
"license": "ISC"
|
||||||
},
|
},
|
||||||
"node_modules/elliptic": {
|
"node_modules/elliptic": {
|
||||||
@@ -5817,9 +5824,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/enhanced-resolve": {
|
"node_modules/enhanced-resolve": {
|
||||||
"version": "5.18.2",
|
"version": "5.18.3",
|
||||||
"resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.2.tgz",
|
"resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.3.tgz",
|
||||||
"integrity": "sha512-6Jw4sE1maoRJo3q8MsSIn2onJFbLTOjY9hlx4DZXmOKvLRd1Ok2kXmAGXaafL2+ijsJZ1ClYbl/pmqr9+k4iUQ==",
|
"integrity": "sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"graceful-fs": "^4.2.4",
|
"graceful-fs": "^4.2.4",
|
||||||
@@ -6439,9 +6446,9 @@
|
|||||||
"license": "MIT"
|
"license": "MIT"
|
||||||
},
|
},
|
||||||
"node_modules/fast-uri": {
|
"node_modules/fast-uri": {
|
||||||
"version": "3.0.6",
|
"version": "3.1.0",
|
||||||
"resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.6.tgz",
|
"resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz",
|
||||||
"integrity": "sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==",
|
"integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==",
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
"type": "github",
|
"type": "github",
|
||||||
@@ -6636,9 +6643,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/follow-redirects": {
|
"node_modules/follow-redirects": {
|
||||||
"version": "1.15.9",
|
"version": "1.15.11",
|
||||||
"resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz",
|
"resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz",
|
||||||
"integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==",
|
"integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==",
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
"type": "individual",
|
"type": "individual",
|
||||||
@@ -7402,13 +7409,13 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/html-minifier-terser/node_modules/terser": {
|
"node_modules/html-minifier-terser/node_modules/terser": {
|
||||||
"version": "5.43.1",
|
"version": "5.44.0",
|
||||||
"resolved": "https://registry.npmjs.org/terser/-/terser-5.43.1.tgz",
|
"resolved": "https://registry.npmjs.org/terser/-/terser-5.44.0.tgz",
|
||||||
"integrity": "sha512-+6erLbBm0+LROX2sPXlUYx/ux5PyE9K/a92Wrt6oA+WDAoFTdpHE5tCYCI5PNzq2y8df4rA+QgHLJuR4jNymsg==",
|
"integrity": "sha512-nIVck8DK+GM/0Frwd+nIhZ84pR/BX7rmXMfYwyg+Sri5oGVE99/E3KvXqpC2xHFxyqXyGHTKBSioxxplrO4I4w==",
|
||||||
"license": "BSD-2-Clause",
|
"license": "BSD-2-Clause",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@jridgewell/source-map": "^0.3.3",
|
"@jridgewell/source-map": "^0.3.3",
|
||||||
"acorn": "^8.14.0",
|
"acorn": "^8.15.0",
|
||||||
"commander": "^2.20.0",
|
"commander": "^2.20.0",
|
||||||
"source-map-support": "~0.5.20"
|
"source-map-support": "~0.5.20"
|
||||||
},
|
},
|
||||||
@@ -7432,9 +7439,9 @@
|
|||||||
"license": "MIT"
|
"license": "MIT"
|
||||||
},
|
},
|
||||||
"node_modules/html-webpack-plugin": {
|
"node_modules/html-webpack-plugin": {
|
||||||
"version": "5.6.3",
|
"version": "5.6.4",
|
||||||
"resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.6.3.tgz",
|
"resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.6.4.tgz",
|
||||||
"integrity": "sha512-QSf1yjtSAsmf7rYBV7XX86uua4W/vkhIt0xNXKbsi2foEeW7vjJQz4bhnpL3xH+l1ryl1680uNv968Z+X6jSYg==",
|
"integrity": "sha512-V/PZeWsqhfpE27nKeX9EO2sbR+D17A+tLf6qU+ht66jdUsN0QLKJN27Z+1+gHrVMKgndBahes0PU6rRihDgHTw==",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@types/html-minifier-terser": "^6.0.0",
|
"@types/html-minifier-terser": "^6.0.0",
|
||||||
@@ -8430,15 +8437,14 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/jake": {
|
"node_modules/jake": {
|
||||||
"version": "10.9.2",
|
"version": "10.9.4",
|
||||||
"resolved": "https://registry.npmjs.org/jake/-/jake-10.9.2.tgz",
|
"resolved": "https://registry.npmjs.org/jake/-/jake-10.9.4.tgz",
|
||||||
"integrity": "sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==",
|
"integrity": "sha512-wpHYzhxiVQL+IV05BLE2Xn34zW1S223hvjtqk0+gsPrwd/8JNLXJgZZM/iPFsYc1xyphF+6M6EvdE5E9MBGkDA==",
|
||||||
"license": "Apache-2.0",
|
"license": "Apache-2.0",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"async": "^3.2.3",
|
"async": "^3.2.6",
|
||||||
"chalk": "^4.0.2",
|
|
||||||
"filelist": "^1.0.4",
|
"filelist": "^1.0.4",
|
||||||
"minimatch": "^3.1.2"
|
"picocolors": "^1.1.1"
|
||||||
},
|
},
|
||||||
"bin": {
|
"bin": {
|
||||||
"jake": "bin/cli.js"
|
"jake": "bin/cli.js"
|
||||||
@@ -8447,76 +8453,6 @@
|
|||||||
"node": ">=10"
|
"node": ">=10"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/jake/node_modules/ansi-styles": {
|
|
||||||
"version": "4.3.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
|
|
||||||
"integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
|
|
||||||
"license": "MIT",
|
|
||||||
"dependencies": {
|
|
||||||
"color-convert": "^2.0.1"
|
|
||||||
},
|
|
||||||
"engines": {
|
|
||||||
"node": ">=8"
|
|
||||||
},
|
|
||||||
"funding": {
|
|
||||||
"url": "https://github.com/chalk/ansi-styles?sponsor=1"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/jake/node_modules/chalk": {
|
|
||||||
"version": "4.1.2",
|
|
||||||
"resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
|
|
||||||
"integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
|
|
||||||
"license": "MIT",
|
|
||||||
"dependencies": {
|
|
||||||
"ansi-styles": "^4.1.0",
|
|
||||||
"supports-color": "^7.1.0"
|
|
||||||
},
|
|
||||||
"engines": {
|
|
||||||
"node": ">=10"
|
|
||||||
},
|
|
||||||
"funding": {
|
|
||||||
"url": "https://github.com/chalk/chalk?sponsor=1"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/jake/node_modules/color-convert": {
|
|
||||||
"version": "2.0.1",
|
|
||||||
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
|
|
||||||
"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
|
|
||||||
"license": "MIT",
|
|
||||||
"dependencies": {
|
|
||||||
"color-name": "~1.1.4"
|
|
||||||
},
|
|
||||||
"engines": {
|
|
||||||
"node": ">=7.0.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/jake/node_modules/color-name": {
|
|
||||||
"version": "1.1.4",
|
|
||||||
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
|
|
||||||
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
|
|
||||||
"license": "MIT"
|
|
||||||
},
|
|
||||||
"node_modules/jake/node_modules/has-flag": {
|
|
||||||
"version": "4.0.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
|
|
||||||
"integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
|
|
||||||
"license": "MIT",
|
|
||||||
"engines": {
|
|
||||||
"node": ">=8"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/jake/node_modules/supports-color": {
|
|
||||||
"version": "7.2.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
|
|
||||||
"integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
|
|
||||||
"license": "MIT",
|
|
||||||
"dependencies": {
|
|
||||||
"has-flag": "^4.0.0"
|
|
||||||
},
|
|
||||||
"engines": {
|
|
||||||
"node": ">=8"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/jest-worker": {
|
"node_modules/jest-worker": {
|
||||||
"version": "27.5.1",
|
"version": "27.5.1",
|
||||||
"resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz",
|
"resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz",
|
||||||
@@ -8630,9 +8566,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/jsonfile": {
|
"node_modules/jsonfile": {
|
||||||
"version": "6.1.0",
|
"version": "6.2.0",
|
||||||
"resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz",
|
"resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz",
|
||||||
"integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
|
"integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
@@ -9381,9 +9317,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/node-releases": {
|
"node_modules/node-releases": {
|
||||||
"version": "2.0.19",
|
"version": "2.0.21",
|
||||||
"resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz",
|
"resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.21.tgz",
|
||||||
"integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==",
|
"integrity": "sha512-5b0pgg78U3hwXkCM8Z9b2FJdPZlr9Psr9V2gQPESdGHqbntyFJKFW4r5TeWGFzafGY3hzs1JC62VEQMbl1JFkw==",
|
||||||
"license": "MIT"
|
"license": "MIT"
|
||||||
},
|
},
|
||||||
"node_modules/normalize-path": {
|
"node_modules/normalize-path": {
|
||||||
@@ -10092,9 +10028,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/portfinder": {
|
"node_modules/portfinder": {
|
||||||
"version": "1.0.37",
|
"version": "1.0.38",
|
||||||
"resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.37.tgz",
|
"resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.38.tgz",
|
||||||
"integrity": "sha512-yuGIEjDAYnnOex9ddMnKZEMFE0CcGo6zbfzDklkmT1m5z734ss6JMzN9rNB3+RR7iS+F10D4/BVIaXOyh8PQKw==",
|
"integrity": "sha512-rEwq/ZHlJIKw++XtLAO8PPuOQA/zaPJOZJ37BVuN97nLpMJeuDVLVGRwbFoBgLudgdTMP2hdRJP++H+8QOA3vg==",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"async": "^3.2.6",
|
"async": "^3.2.6",
|
||||||
@@ -11171,9 +11107,9 @@
|
|||||||
"license": "MIT"
|
"license": "MIT"
|
||||||
},
|
},
|
||||||
"node_modules/regenerate-unicode-properties": {
|
"node_modules/regenerate-unicode-properties": {
|
||||||
"version": "10.2.0",
|
"version": "10.2.2",
|
||||||
"resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.0.tgz",
|
"resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.2.tgz",
|
||||||
"integrity": "sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA==",
|
"integrity": "sha512-m03P+zhBeQd1RGnYxrGyDAPpWX/epKirLrp8e3qevZdVkKtnCrjjWczIbYc8+xd6vcTStVlqfycTx1KR4LOr0g==",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"regenerate": "^1.4.2"
|
"regenerate": "^1.4.2"
|
||||||
@@ -11248,17 +11184,17 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/regexpu-core": {
|
"node_modules/regexpu-core": {
|
||||||
"version": "6.2.0",
|
"version": "6.3.1",
|
||||||
"resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.2.0.tgz",
|
"resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.3.1.tgz",
|
||||||
"integrity": "sha512-H66BPQMrv+V16t8xtmq+UC0CBpiTBA60V8ibS1QVReIp8T1z8hwFxqcGzm9K6lgsN7sB5edVH8a+ze6Fqm4weA==",
|
"integrity": "sha512-DzcswPr252wEr7Qz8AyAVbfyBDKLoYp6eRA1We2Fa9qirRFSdtkP5sHr3yglDKy2BbA0fd2T+j/CUSKes3FeVQ==",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"regenerate": "^1.4.2",
|
"regenerate": "^1.4.2",
|
||||||
"regenerate-unicode-properties": "^10.2.0",
|
"regenerate-unicode-properties": "^10.2.2",
|
||||||
"regjsgen": "^0.8.0",
|
"regjsgen": "^0.8.0",
|
||||||
"regjsparser": "^0.12.0",
|
"regjsparser": "^0.12.0",
|
||||||
"unicode-match-property-ecmascript": "^2.0.0",
|
"unicode-match-property-ecmascript": "^2.0.0",
|
||||||
"unicode-match-property-value-ecmascript": "^2.1.0"
|
"unicode-match-property-value-ecmascript": "^2.2.1"
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=4"
|
"node": ">=4"
|
||||||
@@ -11772,9 +11708,9 @@
|
|||||||
"license": "MIT"
|
"license": "MIT"
|
||||||
},
|
},
|
||||||
"node_modules/sass": {
|
"node_modules/sass": {
|
||||||
"version": "1.89.2",
|
"version": "1.92.1",
|
||||||
"resolved": "https://registry.npmjs.org/sass/-/sass-1.89.2.tgz",
|
"resolved": "https://registry.npmjs.org/sass/-/sass-1.92.1.tgz",
|
||||||
"integrity": "sha512-xCmtksBKd/jdJ9Bt9p7nPKiuqrlBMBuuGkQlkhZjjQk3Ty48lv93k5Dq6OPkKt4XwxDJ7tvlfrTa1MPA9bf+QA==",
|
"integrity": "sha512-ffmsdbwqb3XeyR8jJR6KelIXARM9bFQe8A6Q3W4Klmwy5Ckd5gz7jgUNHo4UOqutU5Sk1DtKLbpDP0nLCg1xqQ==",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"chokidar": "^4.0.0",
|
"chokidar": "^4.0.0",
|
||||||
@@ -12953,12 +12889,16 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/tapable": {
|
"node_modules/tapable": {
|
||||||
"version": "2.2.2",
|
"version": "2.2.3",
|
||||||
"resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.2.tgz",
|
"resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.3.tgz",
|
||||||
"integrity": "sha512-Re10+NauLTMCudc7T5WLFLAwDhQ0JWdrMK+9B2M8zR5hRExKmsRDCBA7/aV/pNJFltmBFO5BAMlQFi/vq3nKOg==",
|
"integrity": "sha512-ZL6DDuAlRlLGghwcfmSn9sK3Hr6ArtyudlSAiCqQ6IfE+b+HHbydbYDIG15IfS5do+7XQQBdBiubF/cV2dnDzg==",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=6"
|
"node": ">=6"
|
||||||
|
},
|
||||||
|
"funding": {
|
||||||
|
"type": "opencollective",
|
||||||
|
"url": "https://opencollective.com/webpack"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/terser": {
|
"node_modules/terser": {
|
||||||
@@ -13094,13 +13034,13 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/terser-webpack-plugin/node_modules/terser": {
|
"node_modules/terser-webpack-plugin/node_modules/terser": {
|
||||||
"version": "5.43.1",
|
"version": "5.44.0",
|
||||||
"resolved": "https://registry.npmjs.org/terser/-/terser-5.43.1.tgz",
|
"resolved": "https://registry.npmjs.org/terser/-/terser-5.44.0.tgz",
|
||||||
"integrity": "sha512-+6erLbBm0+LROX2sPXlUYx/ux5PyE9K/a92Wrt6oA+WDAoFTdpHE5tCYCI5PNzq2y8df4rA+QgHLJuR4jNymsg==",
|
"integrity": "sha512-nIVck8DK+GM/0Frwd+nIhZ84pR/BX7rmXMfYwyg+Sri5oGVE99/E3KvXqpC2xHFxyqXyGHTKBSioxxplrO4I4w==",
|
||||||
"license": "BSD-2-Clause",
|
"license": "BSD-2-Clause",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@jridgewell/source-map": "^0.3.3",
|
"@jridgewell/source-map": "^0.3.3",
|
||||||
"acorn": "^8.14.0",
|
"acorn": "^8.15.0",
|
||||||
"commander": "^2.20.0",
|
"commander": "^2.20.0",
|
||||||
"source-map-support": "~0.5.20"
|
"source-map-support": "~0.5.20"
|
||||||
},
|
},
|
||||||
@@ -13303,9 +13243,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/ts-loader": {
|
"node_modules/ts-loader": {
|
||||||
"version": "9.5.2",
|
"version": "9.5.4",
|
||||||
"resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.5.2.tgz",
|
"resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.5.4.tgz",
|
||||||
"integrity": "sha512-Qo4piXvOTWcMGIgRiuFa6nHNm+54HbYaZCKqc9eeZCLRy3XqafQgwX2F7mofrbJG3g7EEb+lkiR+z2Lic2s3Zw==",
|
"integrity": "sha512-nCz0rEwunlTZiy6rXFByQU1kVVpCIgUpc/psFiKVrUwrizdnIbRFu8w7bxhUF0X613DYwT4XzrZHpVyMe758hQ==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
@@ -13553,9 +13493,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/undici-types": {
|
"node_modules/undici-types": {
|
||||||
"version": "7.8.0",
|
"version": "7.11.0",
|
||||||
"resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.8.0.tgz",
|
"resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.11.0.tgz",
|
||||||
"integrity": "sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw==",
|
"integrity": "sha512-kt1ZriHTi7MU+Z/r9DOdAI3ONdaR3M3csEaRc6ewa4f4dTvX4cQCbJ4NkEn0ohE4hHtq85+PhPSTY+pO/1PwgA==",
|
||||||
"license": "MIT"
|
"license": "MIT"
|
||||||
},
|
},
|
||||||
"node_modules/unicode-canonical-property-names-ecmascript": {
|
"node_modules/unicode-canonical-property-names-ecmascript": {
|
||||||
@@ -13581,9 +13521,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/unicode-match-property-value-ecmascript": {
|
"node_modules/unicode-match-property-value-ecmascript": {
|
||||||
"version": "2.2.0",
|
"version": "2.2.1",
|
||||||
"resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.0.tgz",
|
"resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.1.tgz",
|
||||||
"integrity": "sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg==",
|
"integrity": "sha512-JQ84qTuMg4nVkx8ga4A16a1epI9H6uTXAknqxkGF/aFfRLw1xC/Bp24HNLaZhHSkWd3+84t8iXnp1J0kYcZHhg==",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=4"
|
"node": ">=4"
|
||||||
@@ -13933,9 +13873,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/webpack": {
|
"node_modules/webpack": {
|
||||||
"version": "5.100.2",
|
"version": "5.101.3",
|
||||||
"resolved": "https://registry.npmjs.org/webpack/-/webpack-5.100.2.tgz",
|
"resolved": "https://registry.npmjs.org/webpack/-/webpack-5.101.3.tgz",
|
||||||
"integrity": "sha512-QaNKAvGCDRh3wW1dsDjeMdDXwZm2vqq3zn6Pvq4rHOEOGSaUMgOOjG2Y9ZbIGzpfkJk9ZYTHpDqgDfeBDcnLaw==",
|
"integrity": "sha512-7b0dTKR3Ed//AD/6kkx/o7duS8H3f1a4w3BYpIriX4BzIhjkn4teo05cptsxvLesHFKK5KObnadmCHBwGc+51A==",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@types/eslint-scope": "^3.7.7",
|
"@types/eslint-scope": "^3.7.7",
|
||||||
@@ -13948,7 +13888,7 @@
|
|||||||
"acorn-import-phases": "^1.0.3",
|
"acorn-import-phases": "^1.0.3",
|
||||||
"browserslist": "^4.24.0",
|
"browserslist": "^4.24.0",
|
||||||
"chrome-trace-event": "^1.0.2",
|
"chrome-trace-event": "^1.0.2",
|
||||||
"enhanced-resolve": "^5.17.2",
|
"enhanced-resolve": "^5.17.3",
|
||||||
"es-module-lexer": "^1.2.1",
|
"es-module-lexer": "^1.2.1",
|
||||||
"eslint-scope": "5.1.1",
|
"eslint-scope": "5.1.1",
|
||||||
"events": "^3.2.0",
|
"events": "^3.2.0",
|
||||||
|
|||||||
Binary file not shown.
Binary file not shown.
File diff suppressed because one or more lines are too long
+232
-174
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
Reference in New Issue
Block a user