mirror of
https://github.com/mediacms-io/mediacms.git
synced 2025-11-09 08:58:53 -05:00
fix: Video.js improve browser/device compatibility, fixes and a lot improvements
This commit is contained in:
parent
b14e1f609d
commit
543085c38f
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>
|
||||||
|
|||||||
@ -52,50 +52,63 @@ class AutoplayToggleButton extends Button {
|
|||||||
});
|
});
|
||||||
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
|
||||||
this.isAutoplayEnabled = !this.isAutoplayEnabled;
|
this.isAutoplayEnabled = !this.isAutoplayEnabled;
|
||||||
@ -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 {
|
try {
|
||||||
this.player().el().querySelectorAll('.vjs-menu').forEach((m) => {
|
this.player().el().querySelectorAll('.vjs-menu').forEach((m) => {
|
||||||
m.classList.remove('vjs-lock-showing');
|
m.classList.remove('vjs-lock-showing');
|
||||||
m.style.display = 'none';
|
m.style.display = 'none';
|
||||||
});
|
});
|
||||||
} catch (e) {}
|
} catch (e) {}
|
||||||
} else {
|
|
||||||
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";
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// Mobile touch events for settings items
|
||||||
|
this.settingsOverlay.addEventListener("touchend", (e) => {
|
||||||
|
e.preventDefault();
|
||||||
|
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";
|
||||||
|
}
|
||||||
|
|
||||||
|
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)
|
// Speed submenu header (back button)
|
||||||
this.speedSubmenu
|
const speedHeader = this.speedSubmenu.querySelector(".submenu-header");
|
||||||
.querySelector(".submenu-header")
|
speedHeader.addEventListener("click", () => {
|
||||||
.addEventListener("click", () => {
|
|
||||||
this.speedSubmenu.style.display = "none";
|
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,7 +84,7 @@ 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="
|
||||||
@ -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
|
||||||
|
|||||||
@ -91,72 +91,55 @@ 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{
|
||||||
.countdown-timer {
|
|
||||||
color: #ff4444;
|
|
||||||
font-weight:700;
|
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-cancel-button {
|
||||||
|
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-play-button,
|
||||||
.autoplay-cancel-button {
|
.autoplay-cancel-button {
|
||||||
width: 100%;
|
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
|
||||||
|
|||||||
328
frontend/packages/player/package-lock.json
generated
328
frontend/packages/player/package-lock.json
generated
@ -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": {
|
||||||
|
|||||||
474
frontend/packages/scripts/package-lock.json
generated
474
frontend/packages/scripts/package-lock.json
generated
@ -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
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
Loading…
x
Reference in New Issue
Block a user