Mudanças entre as edições de "Widget:Teste"
m Etiqueta: Revertido |
m Etiqueta: Revertido |
||
| Linha 1: | Linha 1: | ||
<script> | <script> | ||
(function() { | (function() { | ||
const buttons = document.querySelectorAll('.tab-btn'); | // Tabs functionality | ||
const contents = document.querySelectorAll('.tab-content'); | const buttons = document.querySelectorAll('.character-tab-btn'); | ||
const contents = document.querySelectorAll('.character-tab-content'); | |||
buttons.forEach(btn => btn.addEventListener('click', () => { | buttons.forEach(btn => btn.addEventListener('click', () => { | ||
buttons.forEach(b => b.classList.remove('active')); | buttons.forEach(b => b.classList.remove('active')); | ||
| Linha 10: | Linha 11: | ||
document.getElementById(btn.dataset.tab).classList.add('active'); | document.getElementById(btn.dataset.tab).classList.add('active'); | ||
})); | })); | ||
const | activateCarouselArrows(); | ||
const | |||
const | const skillsBar = document.querySelector('.character-skills-bar'); | ||
const | const descriptionBox = document.querySelector('.character-description-box'); | ||
const videoBox = document.querySelector('.character-video-box'); | |||
const skillIcons = [...skillsBar.querySelectorAll('.character-skill-icon')]; | |||
skillIcons.forEach(div => { | |||
const | const name = div.dataset.name; | ||
const desc = div.dataset.desc.replace(/'''(.*?)'''/g, '<b>$1</b>'); | const desc = div.dataset.desc.replace(/'''(.*?)'''/g, '<b>$1</b>'); | ||
const | const attr = div.dataset.attr; | ||
const video = div.dataset.video; | const video = div.dataset.video; | ||
div.title = | div.title = name; | ||
div.addEventListener('click', () => { | div.addEventListener('click', () => { | ||
descriptionBox.innerHTML = ` | |||
<div class=" | <div class="character-skill-title"> | ||
<h3>${name}</h3> | |||
<div class="character-tooltip-container"> | |||
<button class="character-info-btn">i</button> | |||
<span class="character-tooltip-text"> | |||
Extra information, tips or effects for this skill. | |||
</span> | |||
</div> | |||
</div> | </div> | ||
${ | ${generateAttributesHTML(attr)} | ||
<div class="desc">${desc}</div>`; | <div class="character-desc-text">${desc}</div>`; | ||
videoBox.innerHTML = video ? ` | |||
<video width="100%" controls playsinline> | <video width="100%" controls playsinline> | ||
<source src="${video}" type="video/webm"> | <source src="${video}" type="video/webm"> | ||
</video>` : ''; | </video>` : ''; | ||
skillIcons.forEach(c => c.classList.remove('active')); | |||
div.classList.add(' | div.classList.add('active'); | ||
}); | }); | ||
['data- | |||
['data-name', 'data-desc', 'data-attr', 'data-video', 'data-index'].forEach(attr => div.removeAttribute(attr)); | |||
}); | }); | ||
if ( | if (skillIcons.length) skillIcons[0].click(); | ||
skillsBar.addEventListener('wheel', e => { | |||
if (e.deltaY) { | if (e.deltaY) { | ||
e.preventDefault(); | |||
skillsBar.scrollLeft += e.deltaY; | |||
} | } | ||
}); | }); | ||
function | function activateCarouselArrows() { | ||
const carousel = document.querySelector('.skins-carousel'); | const carousel = document.querySelector('.character-skins-carousel'); | ||
const wrapper = document.querySelector('.skins-carousel-wrapper'); | const wrapper = document.querySelector('.character-skins-carousel-wrapper'); | ||
const [leftBtn, rightBtn] = ['.skins-arrow.left', '.skins-arrow.right'].map(sel => document.querySelector(sel)); | const [leftBtn, rightBtn] = ['.character-skins-arrow.left', '.character-skins-arrow.right'].map(sel => document.querySelector(sel)); | ||
let isPredictingScroll | let isPredictingScroll = false; | ||
const getScrollAmount = () => carousel.clientWidth * 0.6; | const getScrollAmount = () => carousel.clientWidth * 0.6; | ||
const hideArrow = btn => { | const hideArrow = btn => { | ||
if (!btn.classList.contains(' | if (!btn.classList.contains('hiding') && btn.style.display !== 'none') { | ||
btn.classList.add(' | btn.classList.add('hiding'); | ||
setTimeout(() => { | setTimeout(() => { | ||
btn.style.display = 'none'; | btn.style.display = 'none'; | ||
btn.classList.remove(' | btn.classList.remove('hiding'); | ||
}, 300); | }, 300); | ||
} | } | ||
| Linha 83: | Linha 85: | ||
void btn.offsetWidth; | void btn.offsetWidth; | ||
} | } | ||
btn.classList.remove(' | btn.classList.remove('hiding'); | ||
}; | }; | ||
| Linha 133: | Linha 135: | ||
} | } | ||
function | function generateAttributesHTML(str) { | ||
const vals = str.split(',').map(v => v.trim()); | const vals = str.split(',').map(v => v.trim()); | ||
const title = [' | const title = ['PVE Power','PVP Power','Energy','Cooldown']; | ||
return ` | return ` | ||
<div class=" | <div class="character-attributes-cards"> | ||
${vals.map((v, i) => { | ${vals.map((v, i) => { | ||
let f = v === '-' ? '-' : parseInt(v); | let f = v === '-' ? '-' : parseInt(v); | ||
if (i === 2 && !isNaN(f)) f = (f > 0 ? '+' : '') + f; | if (i === 2 && !isNaN(f)) f = (f > 0 ? '+' : '') + f; | ||
return ` | return ` | ||
<div class="character-attribute-card"> | |||
<span class="character-attribute-title">${title[i]}</span> | |||
<h2 class="character-attribute-value">${f}${i === 3 && f !== '-' ? ' sec' : ''}</h2> | |||
</div> | |||
`; | |||
}).join('')} | }).join('')} | ||
</div>`; | </div>`; | ||
| Linha 154: | Linha 156: | ||
<style> | <style> | ||
.character-box { | |||
padding: 24px; | |||
color: #fff; | |||
font-family: 'Orbitron', 'Noto Sans', Arial, sans-serif; | |||
width: 98%; | |||
margin: 28px auto; | |||
position: relative; | |||
user-select: none; | |||
background: #1c2025; | |||
border-radius: 18px; | |||
box-shadow: 0 2px 24px #0008; | |||
max-width: 1200px; | |||
} | |||
.character-header { | |||
display: flex; | |||
align-items: flex-start; | |||
gap: 24px; | |||
margin-bottom: 10px; | |||
} | |||
.character-icon { | |||
width: 88px; | |||
height: 88px; | |||
border-radius: 9px; | |||
object-fit: cover; | |||
border: 3px solid #2bd8d3; | |||
background: #181b1e; | |||
} | |||
.character-info-block { | |||
display: flex; | |||
flex-direction: column; | |||
gap: 4px; | |||
} | |||
.character-name { | |||
font-size: 3.3em; | |||
font-weight: 900; | |||
letter-spacing: 0.04em; | |||
color: #fff; | |||
margin-bottom: 2px; | |||
text-shadow: 2px 2px 0 #1ca8b6; | |||
} | |||
.character-classes { | |||
font-size: 1.12em; | |||
color: #2bd8d3; | |||
margin-bottom: 3px; | |||
font-weight: bold; | |||
display: flex; | |||
gap: 10px; | |||
} | |||
.character-desc { | |||
background: #1a252e; | |||
color: #b6eaff; | |||
border-radius: 7px; | |||
padding: 9px 16px; | |||
font-size: 1.21em; | |||
margin-top: 5px; | |||
box-shadow: 0 1px 4px #0003; | |||
max-width: 650px; | |||
} | |||
.character-tabs { | |||
margin: 20px 0 8px 0; | |||
display: flex; | |||
} | gap: 16px; | ||
} | |||
.character-tab-btn { | |||
padding: 7px 28px; | |||
} | font-size: 1.14em; | ||
border: none; | |||
border-radius: 6px; | |||
background: #393a40; | |||
color: #fff; | |||
} | font-weight: bold; | ||
cursor: pointer; | |||
transition: background .18s; | |||
outline: none; | |||
letter-spacing: 1px; | |||
} | |||
.character-tab-btn.active { | |||
background: #2bd8d3; | |||
color: #191c1d; | |||
} | |||
.character-tab-content { | |||
display: none; | |||
} | |||
.character-tab-content.active { | |||
display: block; | |||
margin-top: 10px; | |||
} | |||
.character-skills-bar { | |||
display: flex; | |||
flex-wrap: nowrap; | |||
gap: 14px; | |||
padding: 6px 0 10px 2px; | |||
overflow-x: auto; | |||
scrollbar-width: thin; | |||
scrollbar-color: #2bd8d3 #181b1e; | |||
margin-bottom: 6px; | |||
} | |||
.character-skill-icon { | |||
width: 54px; | |||
height: 54px; | |||
border-radius: 8px; | |||
border: 2px solid transparent; | |||
cursor: pointer; | |||
box-shadow: 0 1px 5px #0004; | |||
transition: border 0.2s, box-shadow 0.2s, transform 0.12s; | |||
background: #181b1e; | |||
display: flex; | |||
align-items: center; | |||
justify-content: center; | |||
} | |||
.character-skill-icon.active { | |||
border: 2.5px solid #2bd8d3; | |||
box-shadow: 0 0 0 3px #2bd8d366; | |||
transform: scale(1.11); | |||
} | |||
.character-skill-icon img { | |||
width: 80%; | |||
height: 80%; | |||
object-fit: contain; | |||
} | |||
.character-main-content { | |||
display: flex; | |||
gap: 24px; | |||
margin-top: 10px; | |||
} | |||
.character-description-box { | |||
flex: 1 1 60%; | |||
display: flex; | |||
flex-direction: column; | |||
gap: 13px; | |||
background: #181b1e; | |||
border-radius: 10px; | |||
padding: 24px; | |||
box-shadow: 0 0 16px #0003; | |||
min-width: 350px; | |||
max-width: 600px; | |||
} | |||
.character-desc-text { | |||
color: #fff; | |||
font-size: 1.1em; | |||
} | |||
.character-skill-title h3 { | |||
font-size: 2.3em; | |||
letter-spacing: 1.6px; | |||
margin-bottom: 3px; | |||
color: #2bd8d3; | |||
} | |||
.character-attributes-cards { | |||
display: flex; | |||
gap: 17px; | |||
margin-bottom: 9px; | |||
} | |||
.character-attribute-card { | |||
background: #2bd8d320; | |||
border-radius: 6px; | |||
padding: 10px; | |||
min-width: 80px; | |||
text-align: center; | |||
color: #fff; | |||
font-weight: 600; | |||
} | |||
.character-attribute-title { | |||
font-size: 1.1em; | |||
color: #b6eaff; | |||
} | |||
.character-attribute-value { | |||
font-size: 1.22em; | |||
color: #fff; | |||
} | |||
.character-video-box { | |||
flex: 1 1 40%; | |||
display: flex; | |||
align-items: center; | |||
justify-content: center; | |||
background: #181b1e; | |||
border-radius: 10px; | |||
padding: 24px; | |||
box-shadow: 0 0 16px #0003; | |||
min-width: 350px; | |||
max-width: 600px; | |||
min-height: 240px; | |||
margin-left: 10px; | |||
} | |||
.character-tooltip-container { | |||
position: absolute; | |||
right: 0; | |||
top: 50%; | |||
transform: translateY(-50%); | |||
} | |||
.character-info-btn { | |||
border: none; | |||
color: #D3DBDC; | |||
background-color: #787878; | |||
font-weight: bold; | |||
border-radius: 50%; | |||
width: 44px; | |||
height: 44px; | |||
font-family: 'Noto Sans'; | |||
cursor: pointer; | |||
transition: 0.2s; | |||
box-shadow: 0 0 3px #000; | |||
font-size: 40px; | |||
padding: 0; | |||
line-height: 24px; | |||
text-align: center; | |||
} | |||
.character-tooltip-text { | |||
visibility: hidden; | |||
width: 220px; | |||
background-color: #222; | |||
color: #fff; | |||
text-align: left; | |||
padding: 8px 10px; | |||
border-radius: 8px; | |||
position: absolute; | |||
z-index: 10; | |||
bottom: 130%; | |||
left: 50%; | |||
transform: translate(-85%, 110%); | |||
opacity: 0; | |||
transition: opacity 0.3s; | |||
font-size: 12px; | |||
box-shadow: 0 2px 10px rgba(0,0,0,0.5); | |||
pointer-events: none; | |||
} | |||
.character-tooltip-container:hover .character-tooltip-text { | |||
visibility: visible; | |||
opacity: 1; | |||
} | |||
@media (max-width: 1050px) { | |||
.character-main-content { flex-direction: column; } | |||
.character-video-box, .character-description-box { max-width: 100%; min-width: 0; } | |||
} | |||
</style> | </style> | ||
Edição das 17h03min de 8 de agosto de 2025
<script> (function() {
// Tabs functionality
const buttons = document.querySelectorAll('.character-tab-btn');
const contents = document.querySelectorAll('.character-tab-content');
buttons.forEach(btn => btn.addEventListener('click', () => {
buttons.forEach(b => b.classList.remove('active'));
contents.forEach(c => c.classList.remove('active'));
btn.classList.add('active');
document.getElementById(btn.dataset.tab).classList.add('active');
}));
activateCarouselArrows();
const skillsBar = document.querySelector('.character-skills-bar');
const descriptionBox = document.querySelector('.character-description-box');
const videoBox = document.querySelector('.character-video-box');
const skillIcons = [...skillsBar.querySelectorAll('.character-skill-icon')];
skillIcons.forEach(div => {
const name = div.dataset.name;
const desc = div.dataset.desc.replace(/(.*?)/g, '$1');
const attr = div.dataset.attr;
const video = div.dataset.video;
div.title = name;
div.addEventListener('click', () => {
descriptionBox.innerHTML = `
${name}
<button class="character-info-btn">i</button>
Extra information, tips or effects for this skill.
${generateAttributesHTML(attr)}
`;
videoBox.innerHTML = video ? `
<video width="100%" controls playsinline>
<source src="${video}" type="video/webm">
</video>` : ;
skillIcons.forEach(c => c.classList.remove('active'));
div.classList.add('active');
});
['data-name', 'data-desc', 'data-attr', 'data-video', 'data-index'].forEach(attr => div.removeAttribute(attr)); });
if (skillIcons.length) skillIcons[0].click();
skillsBar.addEventListener('wheel', e => {
if (e.deltaY) {
e.preventDefault();
skillsBar.scrollLeft += e.deltaY;
}
});
function activateCarouselArrows() {
const carousel = document.querySelector('.character-skins-carousel');
const wrapper = document.querySelector('.character-skins-carousel-wrapper');
const [leftBtn, rightBtn] = ['.character-skins-arrow.left', '.character-skins-arrow.right'].map(sel => document.querySelector(sel));
let isPredictingScroll = false;
const getScrollAmount = () => carousel.clientWidth * 0.6;
const hideArrow = btn => {
if (!btn.classList.contains('hiding') && btn.style.display !== 'none') {
btn.classList.add('hiding');
setTimeout(() => {
btn.style.display = 'none';
btn.classList.remove('hiding');
}, 300);
}
};
const showArrow = btn => {
if (btn.style.display === 'none') {
btn.style.display = 'inline-block';
void btn.offsetWidth;
}
btn.classList.remove('hiding');
};
const setArrowsState = scrollLeft => {
const maxScroll = carousel.scrollWidth - carousel.clientWidth;
const hasLeft = scrollLeft > 5, hasRight = scrollLeft < maxScroll - 5;
hasLeft ? showArrow(leftBtn) : hideArrow(leftBtn);
hasRight ? showArrow(rightBtn) : hideArrow(rightBtn);
wrapper.classList.toggle('has-left', hasLeft);
wrapper.classList.toggle('has-right', hasRight);
if (!hasLeft && !hasRight) { carousel.style.justifyContent = 'center'; } else { carousel.style.justifyContent = ; }
};
const handleArrowClick = dir => {
isPredictingScroll = true;
const scrollLeft = carousel.scrollLeft, maxScroll = carousel.scrollWidth - carousel.clientWidth;
const nextScroll = dir === 'left' ? Math.max(0, scrollLeft - getScrollAmount()) : Math.min(maxScroll, scrollLeft + getScrollAmount());
setArrowsState(nextScroll);
carousel.scrollTo({ left: nextScroll, behavior: 'smooth' });
let last = -1, still = 0;
const wait = setInterval(() => {
const current = Math.round(carousel.scrollLeft);
if (current === last) {
if (++still >= 2) {
clearInterval(wait);
isPredictingScroll = false;
setArrowsState(current);
}
} else {
last = current;
still = 0;
}
}, 50);
};
carousel.addEventListener('scroll', () => {
if (!isPredictingScroll) setArrowsState(carousel.scrollLeft);
});
new ResizeObserver(() => {
if (!isPredictingScroll) setArrowsState(carousel.scrollLeft);
}).observe(carousel);
leftBtn.addEventListener('click', () => handleArrowClick('left'));
rightBtn.addEventListener('click', () => handleArrowClick('right'));
setArrowsState(carousel.scrollLeft);
}
function generateAttributesHTML(str) {
const vals = str.split(',').map(v => v.trim());
const title = ['PVE Power','PVP Power','Energy','Cooldown'];
return `
${vals.map((v, i) => {
let f = v === '-' ? '-' : parseInt(v);
if (i === 2 && !isNaN(f)) f = (f > 0 ? '+' : ) + f;
return `
${title[i]}
${f}${i === 3 && f !== '-' ? ' sec' : }
`;
}).join()}
`;
}
})(); </script>
<style> .character-box {
padding: 24px; color: #fff; font-family: 'Orbitron', 'Noto Sans', Arial, sans-serif; width: 98%; margin: 28px auto; position: relative; user-select: none; background: #1c2025; border-radius: 18px; box-shadow: 0 2px 24px #0008; max-width: 1200px;
} .character-header {
display: flex; align-items: flex-start; gap: 24px; margin-bottom: 10px;
} .character-icon {
width: 88px; height: 88px; border-radius: 9px; object-fit: cover; border: 3px solid #2bd8d3; background: #181b1e;
} .character-info-block {
display: flex; flex-direction: column; gap: 4px;
} .character-name {
font-size: 3.3em; font-weight: 900; letter-spacing: 0.04em; color: #fff; margin-bottom: 2px; text-shadow: 2px 2px 0 #1ca8b6;
} .character-classes {
font-size: 1.12em; color: #2bd8d3; margin-bottom: 3px; font-weight: bold; display: flex; gap: 10px;
} .character-desc {
background: #1a252e; color: #b6eaff; border-radius: 7px; padding: 9px 16px; font-size: 1.21em; margin-top: 5px; box-shadow: 0 1px 4px #0003; max-width: 650px;
}
.character-tabs {
margin: 20px 0 8px 0; display: flex; gap: 16px;
} .character-tab-btn {
padding: 7px 28px; font-size: 1.14em; border: none; border-radius: 6px; background: #393a40; color: #fff; font-weight: bold; cursor: pointer; transition: background .18s; outline: none; letter-spacing: 1px;
} .character-tab-btn.active {
background: #2bd8d3; color: #191c1d;
}
.character-tab-content {
display: none;
} .character-tab-content.active {
display: block; margin-top: 10px;
}
.character-skills-bar {
display: flex; flex-wrap: nowrap; gap: 14px; padding: 6px 0 10px 2px; overflow-x: auto; scrollbar-width: thin; scrollbar-color: #2bd8d3 #181b1e; margin-bottom: 6px;
} .character-skill-icon {
width: 54px; height: 54px; border-radius: 8px; border: 2px solid transparent; cursor: pointer; box-shadow: 0 1px 5px #0004; transition: border 0.2s, box-shadow 0.2s, transform 0.12s; background: #181b1e; display: flex; align-items: center; justify-content: center;
} .character-skill-icon.active {
border: 2.5px solid #2bd8d3; box-shadow: 0 0 0 3px #2bd8d366; transform: scale(1.11);
} .character-skill-icon img {
width: 80%; height: 80%; object-fit: contain;
}
.character-main-content {
display: flex; gap: 24px; margin-top: 10px;
} .character-description-box {
flex: 1 1 60%; display: flex; flex-direction: column; gap: 13px; background: #181b1e; border-radius: 10px; padding: 24px; box-shadow: 0 0 16px #0003; min-width: 350px; max-width: 600px;
} .character-desc-text {
color: #fff; font-size: 1.1em;
} .character-skill-title h3 {
font-size: 2.3em; letter-spacing: 1.6px; margin-bottom: 3px; color: #2bd8d3;
} .character-attributes-cards {
display: flex; gap: 17px; margin-bottom: 9px;
} .character-attribute-card {
background: #2bd8d320; border-radius: 6px; padding: 10px; min-width: 80px; text-align: center; color: #fff; font-weight: 600;
} .character-attribute-title {
font-size: 1.1em; color: #b6eaff;
} .character-attribute-value {
font-size: 1.22em; color: #fff;
}
.character-video-box {
flex: 1 1 40%; display: flex; align-items: center; justify-content: center; background: #181b1e; border-radius: 10px; padding: 24px; box-shadow: 0 0 16px #0003; min-width: 350px; max-width: 600px; min-height: 240px; margin-left: 10px;
}
.character-tooltip-container {
position: absolute; right: 0; top: 50%; transform: translateY(-50%);
} .character-info-btn {
border: none; color: #D3DBDC; background-color: #787878; font-weight: bold; border-radius: 50%; width: 44px; height: 44px; font-family: 'Noto Sans'; cursor: pointer; transition: 0.2s; box-shadow: 0 0 3px #000; font-size: 40px; padding: 0; line-height: 24px; text-align: center;
} .character-tooltip-text {
visibility: hidden; width: 220px; background-color: #222; color: #fff; text-align: left; padding: 8px 10px; border-radius: 8px; position: absolute; z-index: 10; bottom: 130%; left: 50%; transform: translate(-85%, 110%); opacity: 0; transition: opacity 0.3s; font-size: 12px; box-shadow: 0 2px 10px rgba(0,0,0,0.5); pointer-events: none;
} .character-tooltip-container:hover .character-tooltip-text {
visibility: visible; opacity: 1;
}
@media (max-width: 1050px) {
.character-main-content { flex-direction: column; }
.character-video-box, .character-description-box { max-width: 100%; min-width: 0; }
} </style>