Mudanças entre as edições de "Widget:Skillbox"
Ir para navegação
Ir para pesquisar
| (2 revisões intermediárias por 2 usuários não estão sendo mostradas) | |||
| Linha 1: | Linha 1: | ||
<div class=" | <div class="skillbox-container"> | ||
<div class=" | <div class="skillbox-inner"> | ||
<div class=" | <div class="skillbox-info-area"> | ||
<div class=" | <div class="skillbox-wrapper"> | ||
<div class=" | <div class="skillbox-tabs" id="skill-tabs"></div> | ||
<div class=" | <div class="skillbox-tabs-separator"></div> | ||
<div class="skillbox-desc" id="desc-text"></div> | |||
</div> | </div> | ||
</div> | </div> | ||
<div class=" | <div class="skillbox-video-area" id="skill-videos"></div> | ||
</div> | </div> | ||
</div> | </div> | ||
<script> | <script> | ||
(function () { | |||
const allRawBlocks = document.querySelectorAll('.skillbox-data'); | |||
if (!allRawBlocks.length) return; | |||
allRawBlocks.forEach((raw, index) => { | |||
const uniqueId = raw.dataset.skillboxId || `skillbox${index}`; | |||
const habilidades = []; | const habilidades = []; | ||
for (let i = 1; i <= 15; i++) { | |||
for (let i = 1; i <= | |||
const nome = raw.dataset[`hab${i}`]; | const nome = raw.dataset[`hab${i}`]; | ||
const descricao = raw.dataset[`de${i}`]; | const descricao = raw.dataset[`de${i}`] || ""; | ||
const videoFile = raw.dataset[`vid${i}`]; | const videoFile = raw.dataset[`vid${i}`]; | ||
if (!nome || !videoFile) continue; | if (!nome || !videoFile || videoFile.trim() === '') continue; | ||
habilidades.push({ | habilidades.push({ | ||
| Linha 28: | Linha 31: | ||
descricao, | descricao, | ||
videoUrl: `https://wiki.gla.com.br/index.php/Special:FilePath/${videoFile}`, | videoUrl: `https://wiki.gla.com.br/index.php/Special:FilePath/${videoFile}`, | ||
id: `video${i}` | id: `${uniqueId}-video${i}` | ||
}); | }); | ||
} | } | ||
const | // Criar estrutura DOM local | ||
const videoContainer = | const container = document.createElement('div'); | ||
const descText = | container.className = 'skillbox-container'; | ||
container.innerHTML = ` | |||
<div class="skillbox-inner"> | |||
<div class="skillbox-info-area"> | |||
<div class="skillbox-wrapper"> | |||
<div class="skillbox-tabs" id="${uniqueId}-tabs"></div> | |||
<div class="skillbox-tabs-separator"></div> | |||
<div class="skillbox-desc" id="${uniqueId}-desc"></div> | |||
</div> | |||
</div> | |||
<div class="skillbox-video-area" id="${uniqueId}-videos"></div> | |||
</div> | |||
`; | |||
raw.insertAdjacentElement('afterend', container); | |||
const tabsContainer = container.querySelector(`#${uniqueId}-tabs`); | |||
const videoContainer = container.querySelector(`#${uniqueId}-videos`); | |||
const descText = container.querySelector(`#${uniqueId}-desc`); | |||
habilidades.forEach((hab, idx) => { | habilidades.forEach((hab, idx) => { | ||
const btn = document.createElement('button'); | const btn = document.createElement('button'); | ||
btn.className = ' | btn.className = 'skillbox-tab' + (idx === 0 ? ' active' : ''); | ||
btn.dataset.video = hab.id; | btn.dataset.video = hab.id; | ||
btn.textContent = hab.nome; | btn.textContent = hab.nome; | ||
| Linha 45: | Linha 67: | ||
const videoWrapper = document.createElement('div'); | const videoWrapper = document.createElement('div'); | ||
videoWrapper.id = hab.id; | videoWrapper.id = hab.id; | ||
videoWrapper.className = ' | videoWrapper.className = 'skillbox-video' + (idx === 0 ? ' active' : ''); | ||
const video = document.createElement('video'); | const video = document.createElement('video'); | ||
video.className = ' | video.className = 'skillbox-video-element'; | ||
video.controls = true; | video.controls = true; | ||
video.preload = 'auto'; | video.preload = 'auto'; | ||
| Linha 63: | Linha 84: | ||
if (habilidades.length) { | if (habilidades.length) { | ||
descText.innerHTML = habilidades[0].descricao.replace(/'''(.*?)'''/g, '<b>$1</b>'); | |||
} | } | ||
const tabs = | const tabs = container.querySelectorAll('.skillbox-tab'); | ||
const videos = | const videos = container.querySelectorAll('.skillbox-video'); | ||
tabs.forEach((tab, idx) => { | tabs.forEach((tab, idx) => { | ||
| Linha 74: | Linha 94: | ||
tabs.forEach(t => t.classList.remove('active')); | tabs.forEach(t => t.classList.remove('active')); | ||
tab.classList.add('active'); | tab.classList.add('active'); | ||
habilidades[idx].descricao = | |||
const desc = habilidades[idx].descricao || ""; | |||
descText.innerHTML = desc.replace(/'''(.*?)'''/g, '<b>$1</b>'); | |||
videos.forEach(v => { | videos.forEach(v => { | ||
const videoTag = v.querySelector('video'); | const videoTag = v.querySelector('video'); | ||
if (v.id === habilidades[idx].id) { | if (v.id === habilidades[idx].id) { | ||
v.classList.add('active'); | |||
videoTag.play(); | if (videoTag) { | ||
videoTag.currentTime = 0; | |||
videoTag.play(); | |||
} | |||
} else { | } else { | ||
videoTag.pause(); | v.classList.remove('active'); | ||
if (videoTag) videoTag.pause(); | |||
} | } | ||
}); | }); | ||
| Linha 91: | Linha 115: | ||
raw.remove(); | raw.remove(); | ||
})(); | }); | ||
})(); | |||
</script> | </script> | ||
<style> | <style> | ||
.skillbox-video { | |||
display: none; | |||
width: 100%; | |||
max-width: 900px; | |||
aspect-ratio: 16 / 9; | |||
margin: 0 auto; | |||
padding: 0; | |||
} | |||
.skillbox-video.active { | |||
display: flex; | |||
} | justify-content: center; | ||
align-items: center; | |||
} | |||
</style> | </style> | ||
Edição atual tal como às 11h23min de 9 de junho de 2025
<script> (function () {
const allRawBlocks = document.querySelectorAll('.skillbox-data');
if (!allRawBlocks.length) return;
allRawBlocks.forEach((raw, index) => {
const uniqueId = raw.dataset.skillboxId || `skillbox${index}`;
const habilidades = [];
for (let i = 1; i <= 15; i++) {
const nome = raw.dataset[`hab${i}`];
const descricao = raw.dataset[`de${i}`] || "";
const videoFile = raw.dataset[`vid${i}`];
if (!nome || !videoFile || videoFile.trim() === ) continue;
habilidades.push({
nome,
descricao,
videoUrl: `https://wiki.gla.com.br/index.php/Special:FilePath/${videoFile}`,
id: `${uniqueId}-video${i}`
});
}
// Criar estrutura DOM local
const container = document.createElement('div');
container.className = 'skillbox-container';
container.innerHTML = `
`;
raw.insertAdjacentElement('afterend', container);
const tabsContainer = container.querySelector(`#${uniqueId}-tabs`);
const videoContainer = container.querySelector(`#${uniqueId}-videos`);
const descText = container.querySelector(`#${uniqueId}-desc`);
habilidades.forEach((hab, idx) => {
const btn = document.createElement('button');
btn.className = 'skillbox-tab' + (idx === 0 ? ' active' : );
btn.dataset.video = hab.id;
btn.textContent = hab.nome;
tabsContainer.appendChild(btn);
const videoWrapper = document.createElement('div');
videoWrapper.id = hab.id;
videoWrapper.className = 'skillbox-video' + (idx === 0 ? ' active' : );
const video = document.createElement('video');
video.className = 'skillbox-video-element';
video.controls = true;
video.preload = 'auto';
const source = document.createElement('source');
source.src = hab.videoUrl;
source.type = 'video/mp4';
video.appendChild(source);
videoWrapper.appendChild(video);
videoContainer.appendChild(videoWrapper);
});
if (habilidades.length) {
descText.innerHTML = habilidades[0].descricao.replace(/(.*?)/g, '$1');
}
const tabs = container.querySelectorAll('.skillbox-tab');
const videos = container.querySelectorAll('.skillbox-video');
tabs.forEach((tab, idx) => {
tab.addEventListener('click', () => {
tabs.forEach(t => t.classList.remove('active'));
tab.classList.add('active');
const desc = habilidades[idx].descricao || "";
descText.innerHTML = desc.replace(/(.*?)/g, '$1');
videos.forEach(v => {
const videoTag = v.querySelector('video');
if (v.id === habilidades[idx].id) {
v.classList.add('active');
if (videoTag) {
videoTag.currentTime = 0;
videoTag.play();
}
} else {
v.classList.remove('active');
if (videoTag) videoTag.pause();
}
});
});
});
raw.remove(); });
})();
</script>
<style> .skillbox-video {
display: none; width: 100%; max-width: 900px; aspect-ratio: 16 / 9; margin: 0 auto; padding: 0;
}
.skillbox-video.active {
display: flex; justify-content: center; align-items: center;
} </style>