Mudanças entre as edições de "Widget:Droflax"

De Wiki Gla
Ir para navegação Ir para pesquisar
 
(203 revisões intermediárias por 2 usuários não estão sendo mostradas)
Linha 1: Linha 1:
<div class="personaje-box">
<div class="language-switch">
    <div class="personaje-header">
  <a data-lang="pt"><img src="https://upload.wikimedia.org/wikipedia/en/0/05/Flag_of_Brazil.svg" width="32" height="24"></a>
        <div class="personaje-topbar">
  <a data-lang="es"><img src="https://upload.wikimedia.org/wikipedia/commons/9/9a/Flag_of_Spain.svg" width="32" height="24"></a>
            <div class="personaje-nome-box">
  <a data-lang="en"><img src="https://upload.wikimedia.org/wikipedia/en/a/a4/Flag_of_the_United_States.svg" width="32" height="24"></a>
                <img src="/images/6/63/Franky_ts_medal.png" class="topbar-icon" alt="Ícono">
  <a data-lang="pl"><img src="https://upload.wikimedia.org/wikipedia/en/1/12/Flag_of_Poland.svg" width="32" height="24"></a>
                <div class="personaje-nome-category">
                    <div class="nome"></div>
                    <div class="classes"></div>
                </div>
            </div>
            <div class="topbar-description">Franky (TS) é um personagem do tier diamante.</div>
        </div>
        <div class="personaje-tabs">
            <button class="tab-btn" data-tab="arma">Arma</button>
            <button class="tab-btn active" data-tab="habilidades">Habilidades</button>
            <button class="tab-btn" data-tab="skins">Skins</button>
        </div>
    </div>
    <img class="art-personaje" alt="Arte del personaje">
    <div class="tab-content active" id="habilidades">
        <div class="cuadros-container"></div>
        <div class="habilidades-container">
            <div class="habilidades-details">
                <div class="descripcion-container"></div>
            </div>
            <div class="video-container"></div>
        </div>
    </div>
    <div class="tab-content" id="skins"></div>
</div>
</div>


<script type="text/javascript">
<style>
    (function () {
.language-switch {
        const dataEl = document.getElementById('persona-data');
  display: flex;
        if (!dataEl) return console.error('Persona widget: no se encontró #persona-data');
  gap: 6px;
 
  margin: 8px 0;
        // Extracción de datos optimizada
  justify-content: center;
        const { nome = '', tier = '', classe = '', image = '', habilidadesRaw = '', skinsRaw = '' } = dataEl.dataset;
}
        const rawHabs = habilidadesRaw.replace(/<!--[\s\S]*?-->/g, '').trim();
.language-switch img {
    const rawSkins = skinsRaw.replace(/<!--[\s\S]*?-->/g, '').trim();
  border: 1px solid #ccc;
 
  border-radius: 6px;
        // Procesamiento de habilidades
  cursor: pointer;
        const habilidades = rawHabs.split('||').filter(Boolean).map(line => {
  transition: transform 0.2s ease, border-color 0.2s ease;
            const habData = {};
}
            line.split('|').filter(Boolean).forEach(part => {
.language-switch img:hover {
                const [key, ...valParts] = part.split('=');
  transform: scale(1.1);
                if (key && valParts.length) habData[key.trim()] = valParts.join('=').trim();
  border-color: #333;
            });
}
 
.language-switch img.active {
            const { nome, icon, level, desc = '', atr, video = '' } = habData;
  border-color: #000;
            if (!nome || !icon || !level || !atr) {
}
                return console.warn("Habilidad omitida por falta de campos obligatorios:", line), null;
</style>
            }
            return {
                nome, icon, level: parseInt(level),
                descripcion: desc.replace(/'''(.*?)'''/g, '<b>$1</b>'),
                atributos: atr, video
            };
        }).filter(Boolean);
 
        // Procesamiento de skins
        const skins = rawSkins.split('||').filter(Boolean).map(line => {
            const obj = {};
            line.split('|').filter(Boolean).forEach(part => {
                const [key, ...rest] = part.split('=');
                if (key && rest.length) obj[key.trim()] = rest.join('=').trim();
            });
            return obj.image && obj.tooltip ? { image: obj.image, tooltip: obj.tooltip } :
                (console.error("Error en la skin (falta image o tooltip):", line), null);
        }).filter(Boolean);
 
        // Asignación de tier
        const tierClass = ({
            'bronze': 'tier-bronze', 'bronce': 'tier-bronze',
            'silver': 'tier-silver', 'prata': 'tier-silver',
            'gold': 'tier-gold', 'ouro': 'tier-gold',
            'diamond': 'tier-diamond', 'diamante': 'tier-diamond'
        })[tier.toLowerCase()] || '';
 
        // Actualización del DOM
        document.querySelector('.nome').textContent = nome;
        document.querySelector('img.art-personaje').src = image;
        if (tierClass) document.querySelector('.personaje-box').classList.add(tierClass);
 
        // Manejo de pestañas
        document.querySelectorAll('.tab-btn').forEach(btn => {
            btn.addEventListener('click', () => {
                document.querySelectorAll('.tab-btn, .tab-content').forEach(el =>
                    el.classList.remove('active'));
                btn.classList.add('active');
                document.getElementById(btn.dataset.tab).classList.add('active');
            });
        });
 
        // Renderización de skins
        document.getElementById('skins').innerHTML = generarHTMLSkins(skins);
        activarFlechasCarrusel();


        // Renderización de habilidades
<script>
        const cuadrosContainer = document.querySelector('.cuadros-container');
(function () {
        const [descripcionContainer, videoContainer] = [
  let currentLang = 'pt'; // idioma por defecto
            '.descripcion-container', '.video-container'
        ].map(sel => document.querySelector(sel));


        const cuadros = habilidades.map(hab => {
  const langSwitch = document.querySelector('.language-switch');
            const div = document.createElement('div');
  if (langSwitch) {
            div.className = 'cuadro';
    langSwitch.querySelectorAll('a[data-lang]').forEach(btn => {
            div.innerHTML = `<img src="${hab.icon}" alt="${hab.nome}" loading="lazy">`;
      btn.addEventListener('click', () => {
            div.title = hab.nome;
        currentLang = btn.dataset.lang;
        langSwitch.querySelectorAll('img').forEach(img => img.classList.remove('active'));
        btn.querySelector('img').classList.add('active');


            div.addEventListener('click', () => {
        const active = document.querySelector('.skill-icon.active');
                descripcionContainer.innerHTML = `
        if (active) active.click();
                <div class="titulo-habilidad">
      });
                    <h3>${hab.nome}</h3>
    });
                    <div class="tooltip-container">
                        <button class="info-btn">i</button>
                        <span class="tooltip-text">
                            Información adicional sobre la habilidad, consejos o efectos especiales.
                        </span>
                    </div>
                </div>
                ${generarHTMLAtributos(hab.atributos)}
                <div class="desc">${hab.descripcion}</div>`;


                videoContainer.innerHTML = hab.video ? `
    // Activar la bandera por defecto
                <video width="100%" controls playsinline>
    const defaultBtn = langSwitch.querySelector('a[data-lang="pt"] img');
                    <source src="${hab.video}" type="video/webm">
    if (defaultBtn) defaultBtn.classList.add('active');
                </video>` : '';
  }


                cuadros.forEach(c => c.classList.remove('activo'));
  const oldClicks = document.querySelectorAll('.skill-icon');
                div.classList.add('activo');
  oldClicks.forEach(el => {
            });
    el.addEventListener('click', () => {
            return div;
      const name = el.dataset.nome || '';
        });
      const rawDesc = el.dataset.desc || '';
      let descText = '';


         cuadros.forEach(c => cuadrosContainer.appendChild(c));
      try {
         if (cuadros.length) cuadros[0].click();
         const obj = JSON.parse(rawDesc);
         descText = obj[currentLang] || obj['pt'] || '';
      } catch (e) {
        descText = rawDesc; // fallback si no es un JSON
      }


        // Funciones auxiliares
      const attrs = el.dataset.atr || '';
        function generarHTMLAtributos(str) {
      const descBox = document.querySelector('.desc-box');
            const [vals, labels, icons] = [
      if (descBox) {
                str.split(',').map(v => v.trim()),
        descBox.innerHTML = `<div class="skill-title"><h3>${name}</h3></div>${renderAttributes(attrs)}<div class="desc">${descText}</div>`;
                ['Poder PVE', 'Poder PVP', 'Energía', 'Recarga'],
      }
                [
    });
                    '/images/7/7a/Icon-pve.png',
  });
                    '/images/5/5f/Icon-pvp.png',
})();
                    '/images/3/38/Icon-energy.png',
                    '/images/b/b1/Icon-cooldown.png'
                ]
            ];
 
            return `<div class="attribute--cardsContainer">${vals.map((v, i) => {
                let f = v === '-' ? '-' : parseInt(v);
                if (i === 1 && !isNaN(f)) f = (f > 0 ? '+' : '') + f;
                return `<span class="simple-tooltip" data-tooltip="<p><b>${labels[i]}</b></p>">
                <div class="cardAttribute">
                    <img src="${icons[i]}" class="cardAttribute--icon" loading="lazy">
                    <h2 class="cardAttribute--value">${f}${i === 0 && f !== '-' ? ' seg' : ''}</h2>
                </div>
            </span>`;
            }).join('')}</div>`;
        }
 
        function generarHTMLSkins(lista) {
            return `<div class="card-skins">
            <span class="card-skins-title">SKINS & SPOTLIGHTS</span>
            <div class="skins-carousel-wrapper">
                <button class="skins-arrow left">«</button>
                <div class="skins-carousel">
                    ${lista.map(skin => `<div class="skin-card">
                        <img class="skins--imageBanner" src="https://one-piece-artworks.com/app/view/assets/img/geNiZAK" alt="banner" loading="lazy">
                        <img class="skins--imageSkin" src="${skin.image}" alt="skin" loading="lazy">
                    </div>`).join('')}
                </div>
                <button class="skins-arrow right">»</button>
            </div>
        </div>`;
        }
 
        function activarFlechasCarrusel() {
            const carousel = document.querySelector('.skins-carousel');
            const [leftBtn, rightBtn] = ['.skins-arrow.left', '.skins-arrow.right'].map(sel =>
                document.querySelector(sel));
 
            const getScrollAmount = () => carousel.clientWidth * 0.6;
 
            const updateArrows = (scrollLeft) => {
                const maxScrollLeft = carousel.scrollWidth - carousel.clientWidth;
                const hasLeft = scrollLeft > 5;
                const hasRight = scrollLeft < maxScrollLeft - 5;
 
                [leftBtn, rightBtn].forEach((btn, i) => {
                    btn.style.display = [hasLeft, hasRight][i] ? 'inline-block' : 'none';
                });
 
                carousel.parentElement.classList.toggle('has-left', hasLeft);
                carousel.parentElement.classList.toggle('has-right', hasRight);
            };
 
            const handleArrowClick = (direction) => {
                const scrollLeft = carousel.scrollLeft;
                const maxScrollLeft = carousel.scrollWidth - carousel.clientWidth;
                const nextScroll = direction === 'left' ?
                    Math.max(0, scrollLeft - getScrollAmount()) :
                    Math.min(maxScrollLeft, scrollLeft + getScrollAmount());
 
                carousel.scrollTo({ left: nextScroll, behavior: 'smooth' });
                updateArrows(nextScroll);
            };
 
            leftBtn.addEventListener('click', () => handleArrowClick('left'));
            rightBtn.addEventListener('click', () => handleArrowClick('right'));
            carousel.addEventListener('scroll', () => updateArrows(carousel.scrollLeft));
            new ResizeObserver(() => updateArrows(carousel.scrollLeft)).observe(carousel);
            updateArrows(carousel.scrollLeft);
        }
 
        cuadrosContainer.addEventListener('wheel', (e) => {
            if (e.deltaY) {
                e.preventDefault();
                cuadrosContainer.scrollLeft += e.deltaY;
            }
        });
 
        dataEl.remove();
    })();
</script>
</script>
<style>
    .personaje-box {
        padding: 16px;
        color: #000;
        font-family: 'Segoe UI', sans-serif;
        width: 90%;
        margin: auto;
    }
    .personaje-header {
        display: flex;
        flex-direction: column;
        gap: 10px;
    }
    .personaje-topbar {
        display: flex;
        flex-direction: column;
        align-items: flex-start;
        padding: 8px 16px;
    }
    .personaje-nome-box {
        display: flex;
        align-items: center;
        gap: 8px;
    }
    .topbar-icon {
        width: 90px;
        height: 90px;
        object-fit: none;
        background: #60dae2;
    }
    .nome {
        font: 900 60px/1 'Orbitron', sans-serif;
    }
    .topbar-description {
        font-size: 16px;
        margin-top: 6px;
        background: #6AF3FB;
        width: fit-content;
        padding-inline: 16px;
        border-radius: 0 10px 10px 0;
    }
    .art-personaje {
        width: 665px;
        position: absolute;
        right: 5%;
        top: 0.8%;
        z-index: 9;
    }
    .personaje-tabs {
        margin: 4px 0 4px 8px;
        display: flex;
        gap: 12px;
        justify-content: flex-start;
    }
    .tab-btn {
        padding: 8px 20px;
        background: #333;
        color: white;
        border: none;
        border-radius: 8px;
        font-size: 20px;
        cursor: pointer;
    }
    .tab-btn.active {
        background: #156bc7;
        font-weight: bold;
    }
    .tab-content {
        display: none;
        background: #26211cd6;
        padding: 0 8px 8px;
    }
    .tab-content.active {
        display: block;
    }
    .habilidades-container {
        display: flex;
        gap: 20px;
    }
    .habilidades-details {
        flex: 1;
        display: flex;
        flex-direction: column;
        gap: 10px;
        width: 50%;
        justify-content: center;
    }
    .cuadros-container {
        display: flex;
        flex-wrap: nowrap;
        gap: 10px;
        width: 56%;
        overflow-x: auto;
        padding: 10px 0 3px 1px;
        scrollbar-width: thin;
        scrollbar-color: #ababab transparent;
        margin-bottom: 6px;
        scroll-behavior: smooth;
    }
    .cuadros-container::-webkit-scrollbar {
        height: 6px;
    }
    .cuadros-container::-webkit-scrollbar-thumb {
        background-color: #151515;
        border-radius: 3px;
    }
    .cuadro {
        flex: 0 0 auto;
        width: 50px;
        height: 50px;
        border-radius: 5px;
        cursor: pointer;
        transition: transform 0.2s, box-shadow 0.2s;
    }
    .cuadro.activo {
        box-shadow: 0 0 10px 3px rgba(255, 255, 0, 0.5);
        border: 1px solid #FFD700;
        animation: glow 2s ease-in-out infinite;
    }
    .titulo-habilidad {
        position: relative;
        display: flex;
        justify-content: center;
        align-items: center;
        margin-bottom: 8px;
        padding-right: 32px;
    }
    .titulo-habilidad h3 {
        font-size: 1.6em;
        color: white;
        text-align: center;
        margin: 0;
        width: 100%;
    }
    .tooltip-container {
        position: absolute;
        right: 0;
        top: 50%;
        transform: translateY(-50%);
    }
    .info-btn {
        border: none;
        color: #D3DBDC;
        background-color: #787878;
        font-weight: bold;
        border-radius: 50%;
        width: 44px;
        height: 44px;
        font: bold 40px/24px 'Noto Sans';
        cursor: pointer;
        transition: 0.2s;
        box-shadow: 0 0 3px #000;
        text-align: center;
    }
    .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;
    }
    .tooltip-container:hover .tooltip-text {
        visibility: visible;
        opacity: 1;
    }
    .descripcion-container {
        min-height: 25.1rem;
        max-height: 50%;
        padding: 4px 16px 20px !important;
        background: #26211C;
        border-radius: 8px;
        position: relative;
        box-shadow: 0 0 7px rgba(255, 255, 255, 0.82), 0 0 5px rgba(255, 255, 255, 0.96);
        color: #fff;
        backdrop-filter: blur(2px);
        transition: all 0.3s ease;
        text-shadow: -1px -1px 0 #000, 1px -1px 0 #000, -1px 1px 0 #000, 1px 1px 0 #000;
    }
    .desc {
        overflow-y: auto;
        max-height: inherit;
        margin: 10px 0 0;
    }
    .desc,
    .desc * {
        font-size: inherit !important;
        line-height: inherit;
    }
    .video-container {
        width: 43%;
        height: fit-content;
        display: flex;
        align-items: center;
        justify-content: center;
        background-color: #000;
        border-radius: 2%;
        box-shadow: 0 0 7px rgba(255, 255, 255, 0.82), 0 0 5px rgba(255, 255, 255, 0.96);
        z-index: 999;
    }
    .attribute--cardsContainer {
        display: flex;
        justify-content: center;
        gap: 20px;
        flex-wrap: wrap;
    }
    .cardAttribute {
        width: 80px;
        height: 90px;
        background-color: #473838;
        border-radius: 8px;
        display: flex;
        flex-direction: column;
        align-items: center;
        justify-content: center;
        text-align: center;
        padding: 5px;
        box-shadow: 0 3px 7px rgba(0, 0, 0, 0.5);
        transition: transform 0.2s;
        border: 1px solid rgba(0, 0, 0, 0.28);
    }
    .cardAttribute--icon {
        height: 28px;
        margin-bottom: 14px;
    }
    .cardAttribute--value {
        font: bold 14px/1 sans-serif;
        margin: 0;
        color: white;
    }
    .attribute-title,
    .card-skins-title {
        font: 1.4em/1 sans-serif;
        text-align: center;
        letter-spacing: 1px;
        border-bottom: 2px solid #9d9c9c;
        color: white !important;
        padding-bottom: 8px;
        margin-bottom: 16px;
        width: 75%;
    }
    .card-skins {
        padding: 16px;
        border-radius: 12px;
        box-shadow: 0 2px 6px rgba(0, 0, 0, 0.1);
    }
    .skins-carousel-wrapper {
        min-height: 21.1rem;
        max-height: 60%;
        padding: 4px 16px 20px !important;
        background: #26211C;
        border-radius: 8px;
        position: relative;
        box-shadow: 0 0 7px rgba(255, 255, 255, 0.82), 0 0 5px rgba(255, 255, 255, 0.96);
        color: #fff;
        backdrop-filter: blur(2px);
        display: flex;
        gap: 10px;
        justify-content: center;
        align-items: center;
        z-index: 99;
    }
    .skins-carousel-wrapper::before,
    .skins-carousel-wrapper::after {
        content: '';
        position: absolute;
        top: 0;
        width: 60px;
        height: 100%;
        pointer-events: none;
        transition: opacity 0.4s ease;
        z-index: 3;
    }
    .skins-carousel-wrapper::before {
        left: 0;
        background: linear-gradient(to right, rgba(0, 0, 0, 0) 0%, rgba(0, 0, 0, 1) 100%);
        opacity: 0;
    }
    .skins-carousel-wrapper::after {
        right: 0;
        background: linear-gradient(to left, rgba(0, 0, 0, 0) 0%, rgba(0, 0, 0, 1) 100%);
        opacity: 0;
    }
    .skins-carousel-wrapper.has-left::before,
    .skins-carousel-wrapper.has-right::after {
        opacity: 1;
    }
    .skins-carousel {
        display: flex;
        gap: 16px;
        overflow-x: auto;
        scroll-behavior: smooth;
        padding: 10px 0;
        flex-grow: 1;
        -ms-overflow-style: none;
        scrollbar-width: none;
    }
    .skins-carousel::-webkit-scrollbar {
        display: none;
    }
    .skin-card {
        position: relative;
        width: 200px;
        height: 320px;
        flex: 0 0 auto;
        border: 2px solid #697EC9;
        border-radius: 8px;
        overflow: hidden;
        box-shadow: 0 0 8px rgba(0, 242, 255, 0.44);
        background: #111;
    }
    .skin-card::before {
        content: '';
        position: absolute;
        top: 0;
        left: 0;
        width: 100%;
        height: 100%;
        pointer-events: none;
        border-radius: inherit;
        z-index: 2;
        box-shadow: inset 0 0 12px 6px rgba(180, 180, 180, 0.25);
    }
    .skins--imageBanner {
        width: 100%;
        height: 109%;
        scale: 1.1;
        object-fit: cover;
        filter: brightness(0.5);
    }
    .skins--imageSkin {
        position: absolute;
        bottom: 10px;
        left: 50%;
        transform: translateX(-50%);
        height: 140px;
        width: auto;
        z-index: 2;
        transition: transform 0.2s;
    }
    .skins--imageSkin:hover {
        transform: translateX(-50%) scale(1.05);
    }
    .skins-arrow {
        background: none;
        border: none;
        color: white;
        font-size: 36px;
        cursor: pointer;
        padding: 8px;
        z-index: 5;
        transition: 0.2s;
    }
    .skins-arrow.left {
        margin-right: 8px;
    }
    .skins-arrow.right {
        margin-left: 8px;
    }
    .tier-diamond .personaje-header {
        background:
            linear-gradient(145deg, rgba(160, 250, 255, 0.2), rgba(80, 180, 200, 0.5)),
            url("data:image/svg+xml,%3Csvg width='30' height='30' viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3E%3Cpolygon points='15,2 18,11 28,11 20,17 23,27 15,21 7,27 10,17 2,11 12,11' fill='%23ffffff' fill-opacity='0.25'/%3E%3C/svg%3E");
        background-color: #4b8292;
        background-blend-mode: soft-light;
        background-size: 45px 45px;
        box-shadow: inset 0 0 8px rgba(255, 255, 255, 0.1), 0 0 15px rgba(100, 255, 255, 0.25);
        animation: moveStars 5s linear infinite;
        padding-bottom: 10px;
        position: relative;
        overflow: hidden;
    }
    @keyframes glow {
        0%,
        100% {
            box-shadow: 0 0 2px 1px rgba(255, 255, 0, 0.35);
        }
        50% {
            box-shadow: 0 0 4px 2px rgba(255, 255, 0, 0.7);
        }
    }
    @keyframes moveStars {
        0% {
            background-position: 0 0;
        }
        100% {
            background-position: 90px -90px;
        }
    }
    @media (max-aspect-ratio: 3/4) {
        .habilidades-container {
            flex-direction: column-reverse;
        }
        .habilidades-details {
            width: 96%;
            align-self: center;
        }
        .video-container {
            width: 80%;
            border-radius: 3%;
            margin-top: 2%;
        }
        .art-personaje {
            right: 2%;
            width: 290px;
            top: 1.45vh;
        }
        .tab-btn {
            font-size: 30px;
            padding: 14px 22px;
        }
        .cuadro {
            width: 80px;
            height: 80px;
        }
        .personaje-box {
            padding: 32px;
        }
        .descripcion-container {
            padding: 22px !important;
        }
        .descripcion-container h3 {
            font-size: 2.5em;
            margin-top: -12px;
        }
        .desc {
            font-size: 30px;
            line-height: 1.5;
            width: 100%;
        }
    }
</style>

Edição atual tal como às 06h05min de 31 de agosto de 2025

 <a data-lang="pt"><img src="https://upload.wikimedia.org/wikipedia/en/0/05/Flag_of_Brazil.svg" width="32" height="24"></a>
 <a data-lang="es"><img src="https://upload.wikimedia.org/wikipedia/commons/9/9a/Flag_of_Spain.svg" width="32" height="24"></a>
 <a data-lang="en"><img src="https://upload.wikimedia.org/wikipedia/en/a/a4/Flag_of_the_United_States.svg" width="32" height="24"></a>
 <a data-lang="pl"><img src="https://upload.wikimedia.org/wikipedia/en/1/12/Flag_of_Poland.svg" width="32" height="24"></a>

<style> .language-switch {

 display: flex;
 gap: 6px;
 margin: 8px 0;
 justify-content: center;

} .language-switch img {

 border: 1px solid #ccc;
 border-radius: 6px;
 cursor: pointer;
 transition: transform 0.2s ease, border-color 0.2s ease;

} .language-switch img:hover {

 transform: scale(1.1);
 border-color: #333;

} .language-switch img.active {

 border-color: #000;

} </style>

<script> (function () {

 let currentLang = 'pt'; // idioma por defecto
 const langSwitch = document.querySelector('.language-switch');
 if (langSwitch) {
   langSwitch.querySelectorAll('a[data-lang]').forEach(btn => {
     btn.addEventListener('click', () => {
       currentLang = btn.dataset.lang;
       langSwitch.querySelectorAll('img').forEach(img => img.classList.remove('active'));
       btn.querySelector('img').classList.add('active');
       const active = document.querySelector('.skill-icon.active');
       if (active) active.click();
     });
   });
   // Activar la bandera por defecto
   const defaultBtn = langSwitch.querySelector('a[data-lang="pt"] img');
   if (defaultBtn) defaultBtn.classList.add('active');
 }
 const oldClicks = document.querySelectorAll('.skill-icon');
 oldClicks.forEach(el => {
   el.addEventListener('click', () => {
     const name = el.dataset.nome || ;
     const rawDesc = el.dataset.desc || ;
     let descText = ;
     try {
       const obj = JSON.parse(rawDesc);
       descText = obj[currentLang] || obj['pt'] || ;
     } catch (e) {
       descText = rawDesc; // fallback si no es un JSON
     }
     const attrs = el.dataset.atr || ;
     const descBox = document.querySelector('.desc-box');
     if (descBox) {

descBox.innerHTML = `

${name}

${renderAttributes(attrs)}

${descText}

`;

     }
   });
 });

})(); </script>