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

De Wiki Gla
Ir para navegação Ir para pesquisar
m
m
 
(15 revisões intermediárias pelo mesmo usuário não estão sendo mostradas)
Linha 1: Linha 1:
<style>
<style>
     .utab {
     .island-grid {
        font-family: "Segoe UI", Arial, sans-serif;
        color: #e2ecff;
        padding: 24px;
        width: 100%;
        max-width: 1200px;
        margin: 24px auto;
    }
 
    .utab__section {
        background: #0f1b2d;
        border-radius: 14px;
        padding: 20px;
        border: 1px solid #203c5f;
        box-shadow: 0 10px 24px rgba(7, 14, 26, 0.35);
        display: block;
    }
 
    .utab__level {
        display: block;
    }
 
    .utab__levels {
         display: flex;
         display: flex;
         flex-wrap: wrap;
         flex-wrap: wrap;
         gap: 8px;
        justify-content: center;
         margin-bottom: 16px;
         gap: 10px;
         padding: 12px 0;
     }
     }


     .utab__levelBtn {
     .island-banner {
         border: 1px solid #274a74;
         position: relative;
         background: #13243a;
         width: 380px;
         padding: 6px 12px;
         height: 90px;
         border-radius: 10px;
         overflow: hidden;
         font-weight: 600;
         border-radius: 8px;
         color: #cfe1ff;
         box-shadow: rgba(0, 0, 0, 0.24) 0px 3px 10px;
         cursor: pointer;
         cursor: pointer;
         transition: all 0.2s ease;
         transition: transform 0.15s, box-shadow 0.15s;
        display: block;
        box-sizing: border-box;
     }
     }


     .utab__levelBtn:hover {
     .island-banner::before {
         border-color: #4a86d8;
         content: "";
         color: #ffffff;
        position: absolute;
        top: 0;
        left: 0;
        right: 0;
        bottom: 0;
        background: linear-gradient(105deg, rgba(0, 0, 0, 0.65) 0%, rgba(0, 0, 0, 0.35) 40%, rgba(0, 0, 0, 0.1) 70%, transparent 100%);
        pointer-events: none;
         z-index: 1;
     }
     }


     .utab__levelBtn.is-active {
     .island-banner:hover {
         background: #2e7dd7;
         transform: translateY(-2px);
         border-color: #2e7dd7;
         box-shadow: rgba(0, 0, 0, 0.35) 0px 4px 12px;
        color: #ffffff;
     }
     }


     .utab__levelBtn:focus-visible {
     .island-banner .island-chests {
         outline: 2px solid rgba(46, 125, 215, 0.4);
        position: absolute;
         outline-offset: 2px;
        top: 8px;
        left: 8px;
        display: flex;
        flex-wrap: wrap;
        gap: 6px;
         z-index: 2;
         pointer-events: none;
     }
     }


     .utab__display {
     .island-banner .island-chest-group {
        display: grid;
         position: relative;
        grid-template-columns: auto 1fr;
         display: inline-block;
        gap: 18px;
        align-items: start;
    }
 
    .utab__display.is-image-empty {
         grid-template-columns: 1fr;
    }
 
    .utab__display.is-fading {
         animation: utabFade 0.25s ease;
    }
 
    .utab__image {
        border-radius: 12px;
        border: 1px solid #203c5f;
        background: #0b1422;
        padding: 10px;
     }
     }


     .utab__image img {
     .island-banner .island-chest-group img {
         display: block;
         display: block;
        width: auto;
         height: auto;
         height: auto;
        max-width: 100%;
        border-radius: 8px;
     }
     }


     .utab__image.is-empty {
     .island-banner .island-chest-count {
        display: none;
    position: absolute;
     }
     left: 0;          /* era right: 0 */
 
    bottom: 0;
     .utab__stats {
     font-size: 12.5px;  /* era 11px */
        display: grid;
    font-weight: bold;
        grid-template-columns: 1fr;
    color: #fff;
        gap: 10px;
    background: rgba(0, 0, 0, 0.75);
        color: #dbe7ff;
    padding: 1px 3px;
        font-size: 14px;
    border-radius: 3px;
    }
    line-height: 1;
    white-space: nowrap;
    box-shadow: 0 1px 2px rgba(0, 0, 0, 0.3);
    z-index: 10;
}


     .utab__stats>.utab__stat {
     .island-banner .island-title {
         grid-column: 1 / -1;
         position: absolute;
        bottom: 10px;
        left: 8px;
        font-size: 1.35em;
        font-weight: bold;
        color: #fff;
        text-shadow: 0 1px 2px rgba(0, 0, 0, 0.8), 0 2px 4px rgba(0, 0, 0, 0.5);
        line-height: 1.2;
        z-index: 2;
        pointer-events: none;
        text-transform: uppercase;
     }
     }


     .utab__stat {
     @media (max-width: 768px) {
        background: #13243a;
         .island-grid {
        border: 1px solid #274a74;
            flex-direction: column;
        border-radius: 10px;
            align-items: stretch;
        padding: 10px 12px;
    }
 
    .utab__statTitle {
         font-weight: 700;
        color: #8bb8ff;
    }
 
    .utab__statList {
        margin: 6px 0 0;
        padding-left: 18px;
        display: grid;
        gap: 2px;
        list-style: disc;
        list-style-position: outside;
    }
 
    .utab__statList li {
        display: list-item;
        text-align: left;
    }
 
    .utab__costRow {
        position: relative;
    }
 
    .utab__costBerry,
    .utab__costGems,
    .utab__costPoints {
        display: inline-flex;
        align-items: center;
        gap: 6px;
        font-weight: 700;
        line-height: 1.1;
        font-size: 15px;
    }
 
    .utab__costBerry {
        color: #ffd166;
    }
 
    .utab__costGems {
        color: #57d889;
    }
 
    .utab__costPoints {
        color: #a6b0bf;
    }
 
    .utab__costIcon {
        display: none;
    }
 
    .utab__costBerry .utab__costIcon,
    .utab__costGems .utab__costIcon,
    .utab__costPoints .utab__costIcon,
    .utab__costBerry .utab__costText,
    .utab__costGems .utab__costText,
    .utab__costPoints .utab__costText {
        transform: none;
    }
 
    .utab__level--source {
        display: none;
    }
 
    @keyframes utabFade {
        from {
            opacity: 0;
            transform: translateY(4px);
         }
         }


         to {
         .island-banner {
             opacity: 1;
             width: 100%;
             transform: translateY(0);
             max-width: none;
        }
    }
 
    @media (max-width: 720px) {
        .utab {
            padding: 16px;
        }
 
        .utab__display {
            grid-template-columns: 1fr;
         }
         }
     }
     }
</style>
</style>
{assign var=section value=$section|default:$1|lower}
<div class="utab">
    {if !$section || $section == "designer"}
    <section class="utab__section" data-tab="Designer">
        <div class="utab__level" data-level="1">
            <div class="utab__content">
                <div class="utab__mediaImage">[[File:Designer_lvl1.png]]</div>
                <ul class="utab__statList">
                    <li>1 pilar de artefato disponível</li>
                    <li>27 símbolos disponíveis</li>
                    <li>1 plano de fundo disponível</li>
                    <li>6 cores disponíveis</li>
                    <li>2% de EXP</li>
                    <li>4% de sorte</li>
                    <li>5% de pontos de aliança</li>
                </ul>
            </div>
        </div>
        <div class="utab__level" data-level="2">
            <div class="utab__content">
                <div class="utab__mediaImage">[[File:Designer_lvl2.png]]</div>
                <ul class="utab__statList">
                    <li>2 pilares de artefato disponíveis</li>
                    <li>9 planos de fundo disponíveis</li>
                    <li>47 símbolos disponíveis</li>
                    <li>12 cores disponíveis</li>
                    <li>4% de EXP</li>
                    <li>9% de sorte</li>
                    <li>12% de pontos de aliança</li>
                </ul>
            </div>
        </div>
        <div class="utab__level" data-level="3">
            <div class="utab__content">
                <div class="utab__mediaImage">[[File:Designer_lvl3.png]]</div>
                <ul class="utab__statList">
                    <li>2 pilares de artefato disponíveis</li>
                    <li>34 planos de fundo disponíveis</li>
                    <li>72 símbolos disponíveis</li>
                    <li>30 cores disponíveis</li>
                    <li>6% de EXP</li>
                    <li>15% de sorte</li>
                    <li>22% de pontos de aliança</li>
                </ul>
            </div>
        </div>
        <div class="utab__level" data-level="4">
            <div class="utab__content">
                <div class="utab__mediaImage">[[File:Designer_lvl4.png]]</div>
                <ul class="utab__statList">
                    <li>3 pilares de artefato disponíveis</li>
                    <li>34 planos de fundo disponíveis</li>
                    <li>92 símbolos disponíveis</li>
                    <li>30 cores disponíveis</li>
                    <li>8% de EXP</li>
                    <li>22% de sorte</li>
                    <li>35% de pontos de aliança</li>
                </ul>
            </div>
        </div>
        <div class="utab__level" data-level="5">
            <div class="utab__content">
                <div class="utab__mediaImage">[[File:Designer_lvl5.png]]</div>
                <ul class="utab__statList">
                    <li>4 pilares de artefato disponíveis</li>
                    <li>34 planos de fundo disponíveis</li>
                    <li>112 símbolos disponíveis</li>
                    <li>30 cores disponíveis</li>
                    <li>10% de EXP</li>
                    <li>30% de sorte</li>
                    <li>50% de pontos de aliança</li>
                </ul>
            </div>
        </div>
    </section>
    {/if}
    {if !$section || $section == "cofre"}
    <section class="utab__section" data-tab="Cofre">
        <div class="utab__level" data-level="1">
            <div class="utab__content">
                <div class="utab__mediaImage">[[File:Cofre_lvl1.png]]</div>
                <ul class="utab__statList">
                    <li>10% de bônus pra aliança</li>
                </ul>
            </div>
        </div>
        <div class="utab__level" data-level="2">
            <div class="utab__content">
                <div class="utab__mediaImage">[[File:Cofre_lvl2.png]]</div>
                <ul class="utab__statList">
                    <li>+ 100 espaços extra no cofre</li>
                    <li>25% de bônus pra aliança</li>
                </ul>
            </div>
        </div>
        <div class="utab__level" data-level="3">
            <div class="utab__content">
                <div class="utab__mediaImage">[[File:Cofre_lvl3.png]]</div>
                <ul class="utab__statList">
                    <li>+ 200 espaços extra no cofre</li>
                    <li>45% de bônus pra aliança</li>
                </ul>
            </div>
        </div>
        <div class="utab__level" data-level="4">
            <div class="utab__content">
                <div class="utab__mediaImage">[[File:Cofre_lvl4.png]]</div>
                <ul class="utab__statList">
                    <li>+ 300 espaços extra no cofre</li>
                    <li>75% de bônus pra aliança</li>
                </ul>
            </div>
        </div>
        <div class="utab__level" data-level="5">
            <div class="utab__content">
                <div class="utab__mediaImage">[[File:Cofre_lvl5.png]]</div>
                <ul class="utab__statList">
                    <li>+ 400 espaços extra no cofre</li>
                    <li>100% de bônus pra aliança</li>
                </ul>
            </div>
        </div>
    </section>
    {/if}
    {if !$section || $section == "salao principal"}
    <section class="utab__section" data-tab="Salão Principal">
        <div class="utab__level" data-level="1">
            <div class="utab__content">
                <div class="utab__mediaImage">[[File:SalaoPrincipal_lvl1.png]]</div>
                <ul class="utab__statList">
                    <li>Descrição do nível 1</li>
                </ul>
            </div>
        </div>
        <div class="utab__level" data-level="2">
            <div class="utab__content">
                <div class="utab__mediaImage">[[File:SalaoPrincipal_lvl2.png]]</div>
                <ul class="utab__statList">
                    <li>Descrição do nível 2</li>
                </ul>
            </div>
        </div>
        <div class="utab__level" data-level="3">
            <div class="utab__content">
                <div class="utab__mediaImage">[[File:SalaoPrincipal_lvl3.png]]</div>
                <ul class="utab__statList">
                    <li>Descrição do nível 3</li>
                </ul>
            </div>
        </div>
        <div class="utab__level" data-level="4">
            <div class="utab__content">
                <div class="utab__mediaImage">[[File:SalaoPrincipal_lvl4.png]]</div>
                <ul class="utab__statList">
                    <li>Descrição do nível 4</li>
                </ul>
            </div>
        </div>
        <div class="utab__level" data-level="5">
            <div class="utab__content">
                <div class="utab__mediaImage">[[File:SalaoPrincipal_lvl5.png]]</div>
                <ul class="utab__statList">
                    <li>Descrição do nível 5</li>
                </ul>
            </div>
        </div>
    </section>
    {/if}
    {if !$section || $section == "quartos"}
    <section class="utab__section" data-tab="Quartos">
        <div class="utab__level" data-level="1">
            <div class="utab__content">
                <div class="utab__mediaImage">[[File:Quartos_lvl1.png]]</div>
                <ul class="utab__statList">
                    <li>Descrição do nível 1</li>
                </ul>
            </div>
        </div>
        <div class="utab__level" data-level="2">
            <div class="utab__content">
                <div class="utab__mediaImage">[[File:Quartos_lvl2.png]]</div>
                <ul class="utab__statList">
                    <li>Descrição do nível 2</li>
                </ul>
            </div>
        </div>
        <div class="utab__level" data-level="3">
            <div class="utab__content">
                <div class="utab__mediaImage">[[File:Quartos_lvl3.png]]</div>
                <ul class="utab__statList">
                    <li>Descrição do nível 3</li>
                </ul>
            </div>
        </div>
        <div class="utab__level" data-level="4">
            <div class="utab__content">
                <div class="utab__mediaImage">[[File:Quartos_lvl4.png]]</div>
                <ul class="utab__statList">
                    <li>Descrição do nível 4</li>
                </ul>
            </div>
        </div>
        <div class="utab__level" data-level="5">
            <div class="utab__content">
                <div class="utab__mediaImage">[[File:Quartos_lvl5.png]]</div>
                <ul class="utab__statList">
                    <li>Descrição do nível 5</li>
                </ul>
            </div>
        </div>
    </section>
    {/if}
    {if !$section || $section == "sala de guerra"}
    <section class="utab__section" data-tab="Sala de Guerra">
        <div class="utab__level" data-level="1">
            <div class="utab__content">
                <div class="utab__mediaImage">[[File:SalaDeGuerra_lvl1.png]]</div>
                <ul class="utab__statList">
                    <li>Descrição do nível 1</li>
                </ul>
            </div>
        </div>
        <div class="utab__level" data-level="2">
            <div class="utab__content">
                <div class="utab__mediaImage">[[File:SalaDeGuerra_lvl2.png]]</div>
                <ul class="utab__statList">
                    <li>Descrição do nível 2</li>
                </ul>
            </div>
        </div>
        <div class="utab__level" data-level="3">
            <div class="utab__content">
                <div class="utab__mediaImage">[[File:SalaDeGuerra_lvl3.png]]</div>
                <ul class="utab__statList">
                    <li>Descrição do nível 3</li>
                </ul>
            </div>
        </div>
        <div class="utab__level" data-level="4">
            <div class="utab__content">
                <div class="utab__mediaImage">[[File:SalaDeGuerra_lvl4.png]]</div>
                <ul class="utab__statList">
                    <li>Descrição do nível 4</li>
                </ul>
            </div>
        </div>
        <div class="utab__level" data-level="5">
            <div class="utab__content">
                <div class="utab__mediaImage">[[File:SalaDeGuerra_lvl5.png]]</div>
                <ul class="utab__statList">
                    <li>Descrição do nível 5</li>
                </ul>
            </div>
        </div>
    </section>
    {/if}
    {if !$section || $section == "treinamento"}
    <section class="utab__section" data-tab="Treinamento">
        <div class="utab__level" data-level="1">
            <div class="utab__content">
                <div class="utab__mediaImage">[[File:Treinamento_lvl1.png]]</div>
                <ul class="utab__statList">
                    <li>Descrição do nível 1</li>
                </ul>
            </div>
        </div>
        <div class="utab__level" data-level="2">
            <div class="utab__content">
                <div class="utab__mediaImage">[[File:Treinamento_lvl2.png]]</div>
                <ul class="utab__statList">
                    <li>Descrição do nível 2</li>
                </ul>
            </div>
        </div>
        <div class="utab__level" data-level="3">
            <div class="utab__content">
                <div class="utab__mediaImage">[[File:Treinamento_lvl3.png]]</div>
                <ul class="utab__statList">
                    <li>Descrição do nível 3</li>
                </ul>
            </div>
        </div>
        <div class="utab__level" data-level="4">
            <div class="utab__content">
                <div class="utab__mediaImage">[[File:Treinamento_lvl4.png]]</div>
                <ul class="utab__statList">
                    <li>Descrição do nível 4</li>
                </ul>
            </div>
        </div>
        <div class="utab__level" data-level="5">
            <div class="utab__content">
                <div class="utab__mediaImage">[[File:Treinamento_lvl5.png]]</div>
                <ul class="utab__statList">
                    <li>Descrição do nível 5</li>
                </ul>
            </div>
        </div>
    </section>
    {/if}
    {if !$section || $section == "ferreiro"}
    <section class="utab__section" data-tab="Ferreiro">
        <div class="utab__level" data-level="1">
            <div class="utab__content">
                <div class="utab__mediaImage">[[File:Ferreiro_lvl1.png]]</div>
                <ul class="utab__statList">
                    <li>Descrição do nível 1</li>
                </ul>
            </div>
        </div>
        <div class="utab__level" data-level="2">
            <div class="utab__content">
                <div class="utab__mediaImage">[[File:Ferreiro_lvl2.png]]</div>
                <ul class="utab__statList">
                    <li>Descrição do nível 2</li>
                </ul>
            </div>
        </div>
        <div class="utab__level" data-level="3">
            <div class="utab__content">
                <div class="utab__mediaImage">[[File:Ferreiro_lvl3.png]]</div>
                <ul class="utab__statList">
                    <li>Descrição do nível 3</li>
                </ul>
            </div>
        </div>
        <div class="utab__level" data-level="4">
            <div class="utab__content">
                <div class="utab__mediaImage">[[File:Ferreiro_lvl4.png]]</div>
                <ul class="utab__statList">
                    <li>Descrição do nível 4</li>
                </ul>
            </div>
        </div>
        <div class="utab__level" data-level="5">
            <div class="utab__content">
                <div class="utab__mediaImage">[[File:Ferreiro_lvl5.png]]</div>
                <ul class="utab__statList">
                    <li>Descrição do nível 5</li>
                </ul>
            </div>
        </div>
    </section>
    {/if}
    {if !$section || $section == "cozinha"}
    <section class="utab__section" data-tab="Cozinha">
        <div class="utab__level" data-level="1">
            <div class="utab__content">
                <div class="utab__mediaImage">[[File:Cozinha_lvl1.png]]</div>
                <ul class="utab__statList">
                    <li>Descrição do nível 1</li>
                </ul>
            </div>
        </div>
        <div class="utab__level" data-level="2">
            <div class="utab__content">
                <div class="utab__mediaImage">[[File:Cozinha_lvl2.png]]</div>
                <ul class="utab__statList">
                    <li>Descrição do nível 2</li>
                </ul>
            </div>
        </div>
        <div class="utab__level" data-level="3">
            <div class="utab__content">
                <div class="utab__mediaImage">[[File:Cozinha_lvl3.png]]</div>
                <ul class="utab__statList">
                    <li>Descrição do nível 3</li>
                </ul>
            </div>
        </div>
        <div class="utab__level" data-level="4">
            <div class="utab__content">
                <div class="utab__mediaImage">[[File:Cozinha_lvl4.png]]</div>
                <ul class="utab__statList">
                    <li>Descrição do nível 4</li>
                </ul>
            </div>
        </div>
        <div class="utab__level" data-level="5">
            <div class="utab__content">
                <div class="utab__mediaImage">[[File:Cozinhalvl5.gif]]</div>
                <ul class="utab__statList">
                    <li>Descrição do nível 5</li>
                </ul>
            </div>
        </div>
    </section>
    {/if}
</div>
<script>
<script>
     function handleArrowNavigation(event, buttons, activate) {
     (function () {
         const keys = ["ArrowLeft", "ArrowRight", "ArrowUp", "ArrowDown", "Home", "End"];
         function applyBackgrounds() {
        if (!keys.includes(event.key)) {
            document.querySelectorAll('.island-banner[data-bgimg]').forEach(function (el) {
             return;
                var filename = el.getAttribute('data-bgimg');
                if (!filename) return;
                var url;
                if (typeof mw !== 'undefined' && mw.util && mw.util.getUrl) {
                    url = mw.util.getUrl('Especial:FilePath/' + filename);
                } else {
                    url = '/index.php?title=Especial:FilePath/' + encodeURIComponent(filename);
                }
                el.style.backgroundImage = 'url(' + url + ')';
                el.style.backgroundSize = 'cover';
                el.style.backgroundPosition = 'center';
                el.style.backgroundRepeat = 'no-repeat';
             });
         }
         }
 
        function initClickable() {
        event.preventDefault();
            document.querySelectorAll('.island-banner[data-href]').forEach(function (el) {
        const currentIndex = buttons.findIndex((button) => button === document.activeElement);
                if (el._icClick) return;
        if (currentIndex === -1) {
                el._icClick = true;
             return;
                el.setAttribute('role', 'link');
                el.setAttribute('tabindex', '0');
                el.addEventListener('click', function () {
                    var href = el.getAttribute('data-href');
                    if (href) window.location.href = href;
                });
                el.addEventListener('keydown', function (e) {
                    if (e.key === 'Enter' || e.key === ' ') {
                        e.preventDefault();
                        var href = el.getAttribute('data-href');
                        if (href) window.location.href = href;
                    }
                });
             });
         }
         }
 
         function run() {
        let nextIndex = currentIndex;
             applyBackgrounds();
         if (event.key === "Home") {
             initClickable();
             nextIndex = 0;
        } else if (event.key === "End") {
            nextIndex = buttons.length - 1;
        } else if (event.key === "ArrowLeft" || event.key === "ArrowUp") {
            nextIndex = (currentIndex - 1 + buttons.length) % buttons.length;
        } else if (event.key === "ArrowRight" || event.key === "ArrowDown") {
             nextIndex = (currentIndex + 1) % buttons.length;
         }
         }
 
         if (document.readyState === 'loading') {
         activate(nextIndex, true);
             document.addEventListener('DOMContentLoaded', run);
    }
         } else {
 
             run();
    function triggerFade(element) {
        element.classList.remove("is-fading");
        void element.offsetWidth;
        element.classList.add("is-fading");
    }
 
    function hasWikitext(value) {
        return typeof value === "string" && (value.includes("[[") || value.includes("{{"));
    }
 
    function hasStatWrapper(html) {
        if (typeof html !== "string") {
            return false;
        }
        return /class=["'][^"']*\butab__stat\b/.test(html);
    }
 
    function parseWikitextCached(raw, cacheKey, target) {
        if (!raw || !hasWikitext(raw)) {
            return Promise.resolve(raw);
        }
        if (target[cacheKey]) {
            return Promise.resolve(target[cacheKey]);
        }
        if (!window.mw || !mw.Api) {
            return Promise.resolve(raw);
        }
 
        const api = new mw.Api();
        return api
            .post({
                action: "parse",
                text: raw,
                contentmodel: "wikitext",
                prop: "text",
                formatversion: 2
            })
            .then((response) => {
                const html = response?.parse?.text || response?.parse?.text?.["*"] || raw;
                target[cacheKey] = html;
                return html;
            })
             .catch(() => raw);
    }
 
    const upgradeCosts = [
        { level: 1, berries: "50.000", gems: "10", points: "400" },
        { level: 2, berries: "250.000", gems: "10", points: "1.500" },
        { level: 3, berries: "400.000", gems: "20", points: "3.000" },
        { level: 4, berries: "1.000.000", gems: "50", points: "12.500" },
        { level: 5, berries: "1.800.000", gems: "90", points: "28.000" }
    ];
 
    function buildLevelUI(section) {
        const levelElements = Array.from(section.querySelectorAll(".utab__level"));
        if (!levelElements.length) {
            return;
        }
 
        const label = section.dataset.tab || "Níveis";
        const levels = levelElements.map((levelElement, index) => {
            const levelNumber = levelElement.dataset.level || String(index + 1);
            const contentElement = levelElement.querySelector(".utab__content") || levelElement;
            const rawHtml = contentElement.innerHTML.trim();
            const contentWrapper = document.createElement("div");
            contentWrapper.innerHTML = rawHtml;
            const mediaImage = contentWrapper.querySelector(".utab__mediaImage");
            const imageHtml = mediaImage ? mediaImage.innerHTML.trim() : "";
            if (mediaImage) {
                mediaImage.remove();
            }
            const statsHtml = contentWrapper.innerHTML.trim();
 
            return {
                level: levelNumber,
                imageHtml,
                statsHtml
            };
        });
 
        levelElements.forEach((levelElement) => {
            levelElement.classList.add("utab__level--source");
        });
 
        const nav = document.createElement("div");
        nav.className = "utab__levels";
        nav.setAttribute("role", "tablist");
        nav.setAttribute("aria-label", `Níveis de ${label}`);
 
        const display = document.createElement("div");
        display.className = "utab__display";
 
        const imageWrap = document.createElement("div");
        imageWrap.className = "utab__image";
 
        const stats = document.createElement("div");
        stats.className = "utab__stats";
 
        display.appendChild(imageWrap);
        display.appendChild(stats);
 
        const buttons = levels.map((level, index) => {
            const button = document.createElement("button");
            button.type = "button";
            button.className = "utab__levelBtn";
            button.textContent = `Nv ${level.level}`;
            button.setAttribute("role", "tab");
            button.setAttribute("aria-selected", "false");
            button.setAttribute("tabindex", "-1");
            button.addEventListener("click", () => activateLevel(index, true));
            button.addEventListener("keydown", (event) => handleArrowNavigation(event, buttons, activateLevel));
            nav.appendChild(button);
            return button;
         });
 
        section.prepend(display);
        section.prepend(nav);
 
        let renderToken = 0;
 
        function activateLevel(index, shouldFocus) {
            if (!levels.length) {
                return;
            }
 
            const safeIndex = Math.max(0, Math.min(index, levels.length - 1));
            const current = levels[safeIndex];
            const token = ++renderToken;
 
            buttons.forEach((button, buttonIndex) => {
                const isActive = buttonIndex === safeIndex;
                button.classList.toggle("is-active", isActive);
                button.setAttribute("aria-selected", isActive ? "true" : "false");
                button.setAttribute("tabindex", isActive ? "0" : "-1");
            });
 
            if (current.imageHtml) {
                imageWrap.innerHTML = current.imageHtml;
                imageWrap.classList.remove("is-empty");
                display.classList.remove("is-image-empty");
            } else {
                imageWrap.innerHTML = "";
                imageWrap.classList.add("is-empty");
                display.classList.add("is-image-empty");
            }
 
            const levelNumber = Number(current.level);
            const cost = upgradeCosts.find((item) => item.level === levelNumber);
            const costHtml = cost
                ? `
                    <div class="utab__stat utab__stat--cost">
                        <div class="utab__statTitle">Custo do upgrade</div>
                        <ul class="utab__statList">
                            <li class="utab__costRow">
                                <span class="utab__costBerry">
                                    <span class="utab__costText">${cost.berries} berries</span>
                                </span>
                            </li>
                            ${cost.gems ? `
                                <li class="utab__costRow">
                                    <span class="utab__costGems">
                                        <span class="utab__costText">${cost.gems} gemas</span>
                                    </span>
                                </li>
                            ` : ""}
                            <li class="utab__costRow">
                                <span class="utab__costPoints">
                                    <span class="utab__costText">${cost.points} pontos</span>
                                </span>
                            </li>
                        </ul>
                    </div>
                `
                : "";
            const statsBodyHtml = current.statsHtml
                ? (hasStatWrapper(current.statsHtml)
                    ? current.statsHtml
                    : `
                        <div class="utab__stat utab__stat--desc">
                            <div class="utab__statTitle">Informações</div>
                            ${current.statsHtml}
                        </div>
                    `)
                : "";
 
            stats.innerHTML = `${statsBodyHtml}${costHtml}`;
             triggerFade(display);
 
            const shouldParse =
                (current.imageHtml && hasWikitext(current.imageHtml)) ||
                (current.statsHtml && hasWikitext(current.statsHtml));
 
            if (shouldParse) {
                Promise.all([
                    parseWikitextCached(current.imageHtml, "parsedImageHtml", current),
                    parseWikitextCached(current.statsHtml, "parsedStatsHtml", current)
                ]).then(([parsedImage, parsedStats]) => {
                    if (renderToken !== token) {
                        return;
                    }
                    if (parsedImage && parsedImage !== current.imageHtml) {
                        imageWrap.innerHTML = parsedImage;
                        imageWrap.classList.remove("is-empty");
                        display.classList.remove("is-image-empty");
                    }
                    if (parsedStats && parsedStats !== current.statsHtml) {
                        const parsedBodyHtml = hasStatWrapper(parsedStats)
                            ? parsedStats
                            : `
                                <div class="utab__stat utab__stat--desc">
                                    <div class="utab__statTitle">Informações</div>
                                    ${parsedStats}
                                </div>
                            `;
                        stats.innerHTML = `${parsedBodyHtml}${costHtml}`;
                    }
                });
            }
 
            if (shouldFocus) {
                buttons[safeIndex].focus();
            }
         }
         }
 
     })();
        activateLevel(0, false);
    }
 
    function initWidgets() {
        document.querySelectorAll(".utab").forEach((widget) => {
            widget.querySelectorAll(".utab__section").forEach(buildLevelUI);
        });
     }
 
    if (document.readyState === "loading") {
        document.addEventListener("DOMContentLoaded", initWidgets);
    } else {
        initWidgets();
    }
</script>
</script>

Edição atual tal como às 00h06min de 13 de março de 2026

<style>

   .island-grid {
       display: flex;
       flex-wrap: wrap;
       justify-content: center;
       gap: 10px;
       padding: 12px 0;
   }
   .island-banner {
       position: relative;
       width: 380px;
       height: 90px;
       overflow: hidden;
       border-radius: 8px;
       box-shadow: rgba(0, 0, 0, 0.24) 0px 3px 10px;
       cursor: pointer;
       transition: transform 0.15s, box-shadow 0.15s;
       display: block;
       box-sizing: border-box;
   }
   .island-banner::before {
       content: "";
       position: absolute;
       top: 0;
       left: 0;
       right: 0;
       bottom: 0;
       background: linear-gradient(105deg, rgba(0, 0, 0, 0.65) 0%, rgba(0, 0, 0, 0.35) 40%, rgba(0, 0, 0, 0.1) 70%, transparent 100%);
       pointer-events: none;
       z-index: 1;
   }
   .island-banner:hover {
       transform: translateY(-2px);
       box-shadow: rgba(0, 0, 0, 0.35) 0px 4px 12px;
   }
   .island-banner .island-chests {
       position: absolute;
       top: 8px;
       left: 8px;
       display: flex;
       flex-wrap: wrap;
       gap: 6px;
       z-index: 2;
       pointer-events: none;
   }
   .island-banner .island-chest-group {
       position: relative;
       display: inline-block;
   }
   .island-banner .island-chest-group img {
       display: block;
       width: auto;
       height: auto;
   }
   .island-banner .island-chest-count {
   position: absolute;
   left: 0;          /* era right: 0 */
   bottom: 0;
   font-size: 12.5px;  /* era 11px */
   font-weight: bold;
   color: #fff;
   background: rgba(0, 0, 0, 0.75);
   padding: 1px 3px;
   border-radius: 3px;
   line-height: 1;
   white-space: nowrap;
   box-shadow: 0 1px 2px rgba(0, 0, 0, 0.3);
   z-index: 10;

}

   .island-banner .island-title {
       position: absolute;
       bottom: 10px;
       left: 8px;
       font-size: 1.35em;
       font-weight: bold;
       color: #fff;
       text-shadow: 0 1px 2px rgba(0, 0, 0, 0.8), 0 2px 4px rgba(0, 0, 0, 0.5);
       line-height: 1.2;
       z-index: 2;
       pointer-events: none;
       text-transform: uppercase;
   }
   @media (max-width: 768px) {
       .island-grid {
           flex-direction: column;
           align-items: stretch;
       }
       .island-banner {
           width: 100%;
           max-width: none;
       }
   }

</style> <script>

   (function () {
       function applyBackgrounds() {
           document.querySelectorAll('.island-banner[data-bgimg]').forEach(function (el) {
               var filename = el.getAttribute('data-bgimg');
               if (!filename) return;
               var url;
               if (typeof mw !== 'undefined' && mw.util && mw.util.getUrl) {
                   url = mw.util.getUrl('Especial:FilePath/' + filename);
               } else {
                   url = '/index.php?title=Especial:FilePath/' + encodeURIComponent(filename);
               }
               el.style.backgroundImage = 'url(' + url + ')';
               el.style.backgroundSize = 'cover';
               el.style.backgroundPosition = 'center';
               el.style.backgroundRepeat = 'no-repeat';
           });
       }
       function initClickable() {
           document.querySelectorAll('.island-banner[data-href]').forEach(function (el) {
               if (el._icClick) return;
               el._icClick = true;
               el.setAttribute('role', 'link');
               el.setAttribute('tabindex', '0');
               el.addEventListener('click', function () {
                   var href = el.getAttribute('data-href');
                   if (href) window.location.href = href;
               });
               el.addEventListener('keydown', function (e) {
                   if (e.key === 'Enter' || e.key === ' ') {
                       e.preventDefault();
                       var href = el.getAttribute('data-href');
                       if (href) window.location.href = href;
                   }
               });
           });
       }
       function run() {
           applyBackgrounds();
           initClickable();
       }
       if (document.readyState === 'loading') {
           document.addEventListener('DOMContentLoaded', run);
       } else {
           run();
       }
   })();

</script>