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

De Wiki Gla
Ir para navegação Ir para pesquisar
(Criou página com '<style> .utab { font-family: "Segoe UI", Arial, sans-serif; color: #e2ecff; padding: 24px; width: 100%; max-width: 1200px;...')
 
m
 
(23 revisões intermediárias pelo mesmo usuário não estão sendo mostradas)
Linha 1: Linha 1:
<style>
<style>
    /* TabberNeue: mata o vazamento entre abas */
    .tabber__panel:not(.tabber__panel--active) {
        display: none !important;
    }
    .tabber__panel.tabber__panel--active {
        animation: utabTabIn 0.15s ease-out;
    }
    @keyframes utabTabIn {
        from {
            opacity: 0;
        }
        to {
            opacity: 1;
        }
    }
     .utab {
     .utab {
         font-family: "Segoe UI", Arial, sans-serif;
         font-family: "Segoe UI", Arial, sans-serif;
         color: #e2ecff;
         color: #e2ecff;
         padding: 24px;
         padding: 12px 0 0;
         width: 100%;
         width: 100%;
        max-width: 1200px;
        margin: 24px auto;
         min-width: 0;
         min-width: 0;
         overflow: hidden;
         overflow: hidden;
    }
        box-sizing: border-box;
 
         position: relative;
    .mw-tabber-panel .utab {
         min-width: 0;
     }
     }


     .utab__section {
     .utab__section {
        background: #0f1b2d;
         display: none;
        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;
     }
     }


Linha 34: Linha 40:
         margin-bottom: 16px;
         margin-bottom: 16px;
     }
     }


     .utab__levelBtn {
     .utab__levelBtn {
Linha 55: Linha 62:
         border-color: #2e7dd7;
         border-color: #2e7dd7;
         color: #ffffff;
         color: #ffffff;
    }
    .utab--skin .utab__levelBtn {
        padding: 0;
        width: 22px;
        height: 22px;
        border-radius: 999px;
        font-size: 0;
        line-height: 1;
     }
     }


Linha 63: Linha 79:


     .utab__display {
     .utab__display {
         display: grid;
         display: flex;
        grid-template-columns: auto 1fr;
         gap: 18px;
         gap: 18px;
         align-items: start;
         align-items: start;
        transition: opacity 0.35s ease, transform 0.35s ease;
        will-change: opacity, transform;
     }
     }


     .utab__display.is-image-empty {
     .utab__display.is-image-empty .utab__image {
         grid-template-columns: 1fr;
         display: none;
     }
     }


     .utab__display.is-fading {
     .utab__display.is-fading {
         animation: utabFade 0.25s ease;
         animation: utabFade 0.8s ease-in-out;
     }
     }


Linha 82: Linha 99:
         background: #0b1422;
         background: #0b1422;
         padding: 10px;
         padding: 10px;
        flex-shrink: 0;
        max-width: 100%;
        display: flex;
        justify-content: center;
        box-sizing: border-box;
     }
     }


Linha 87: Linha 109:
         display: block;
         display: block;
         height: auto;
         height: auto;
        width: auto;
        max-width: 100%;
        border-radius: 8px;
    }
    .utab__image .utab-responsive-frame {
        width: 100%;
         max-width: 100%;
         max-width: 100%;
        margin: 0 auto;
        padding: 0;
        background: transparent;
        box-shadow: none;
        box-sizing: border-box;
    }
    .utab__image .utab-responsive-frame .thumbinner,
    .utab__image .utab-responsive-frame .thumb,
    .utab__image .utab-responsive-frame figure,
    .utab__image .utab-responsive-frame .mw-file-description {
        max-width: 100% !important;
        width: 100% !important;
        padding: 0 !important;
        margin: 0 auto !important;
        border: 0 !important;
        background: transparent !important;
        box-shadow: none !important;
        box-sizing: border-box;
    }
    .utab__image .utab-responsive-frame img {
        display: block !important;
        max-width: 100% !important;
        width: 100% !important;
        height: auto !important;
        margin: 0 auto !important;
        border: 0 !important;
         border-radius: 8px;
         border-radius: 8px;
     }
     }
Linha 96: Linha 153:


     .utab__stats {
     .utab__stats {
         display: grid;
         display: flex;
         grid-template-columns: 1fr;
         flex-direction: column;
         gap: 10px;
         gap: 10px;
         color: #dbe7ff;
         color: #dbe7ff;
         font-size: 14px;
         font-size: 14px;
    }
        flex: 1;
 
         min-width: 0;
    .utab__stats>.utab__stat {
         grid-column: 1 / -1;
     }
     }


Linha 112: Linha 167:
         border-radius: 10px;
         border-radius: 10px;
         padding: 10px 12px;
         padding: 10px 12px;
    }
    .utab--skin .utab__stats {
        display: none;
     }
     }


Linha 131: Linha 190:
         display: list-item;
         display: list-item;
         text-align: left;
         text-align: left;
    }
    .utab__descContent {
        margin-top: 6px;
        line-height: 1.5;
    }
    .utab__descContent ul,
    .utab__descContent ol {
        margin: 4px 0;
        padding-left: 18px;
    }
    .utab__descContent li {
        display: list-item;
    }
    .utab__descContent p {
        margin: 4px 0;
    }
    .utab__descContent h1,
    .utab__descContent h2,
    .utab__descContent h3,
    .utab__descContent h4,
    .utab__descContent h5,
    .utab__descContent h6 {
        color: #a0c4ff;
        border-bottom: none;
        margin: 8px 0 4px;
     }
     }


Linha 158: Linha 247:
     .utab__costPoints {
     .utab__costPoints {
         color: #a6b0bf;
         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;
     }
     }


Linha 180: Linha 252:
         from {
         from {
             opacity: 0;
             opacity: 0;
             transform: translateY(4px);
             transform: translateY(8px);
         }
         }


Linha 189: Linha 261:
     }
     }


     @media (max-width: 720px) {
     @media (max-width: 600px) {
         .utab {
         .utab--skin .utab__levels {
             padding: 16px;
            justify-content: center;
        }
 
        .utab--skin .utab__levelBtn {
             width: 28px;
            height: 28px;
         }
         }


         .utab__display {
         .utab__display {
             grid-template-columns: 1fr;
             flex-direction: column-reverse;
        }
 
        .utab__image {
            max-width: 100%;
            order: -1;
        }
    }
 
    @media (max-width: 900px) {
        .utab__display {
            gap: 24px;
        }
 
        .utab__image {
            max-width: 45%;
        }
 
        .utab__stats {
            gap: 14px;
        }
 
        .utab__stat {
            padding: 12px 14px;
         }
         }
     }
     }
Linha 202: Linha 302:
<script>
<script>
     (function () {
     (function () {
        /* Garante que o script só roda UMA VEZ mesmo carregado N vezes */
        if (window.__utabLoaded) return;
        window.__utabLoaded = true;
         function handleArrowNavigation(event, buttons, activate) {
         function handleArrowNavigation(event, buttons, activate) {
             var keys = ["ArrowLeft", "ArrowRight", "ArrowUp", "ArrowDown", "Home", "End"];
             var keys = ["ArrowLeft", "ArrowRight", "ArrowUp", "ArrowDown", "Home", "End"];
Linha 220: Linha 324:
             element.offsetWidth;
             element.offsetWidth;
             element.classList.add("is-fading");
             element.classList.add("is-fading");
        }
        function hasWikitext(value) {
            return typeof value === "string" && (value.indexOf("[[") !== -1 || value.indexOf("{{") !== -1);
        }
        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);
            var api = new mw.Api();
            return api.post({ action: "parse", text: raw, contentmodel: "wikitext", prop: "text", formatversion: 2 })
                .then(function (r) {
                    var html = (r && r.parse && r.parse.text) ? (r.parse.text["*"] || r.parse.text) : raw;
                    target[cacheKey] = html;
                    return html;
                })
                .catch(function () { return raw; });
         }
         }


         var upgradeCosts = [
         var upgradeCosts = [
             { level: 1, berries: "50.000", gems: "10", points: "400" },
             { level: 1, berries: "50.000", gems: null, points: "400" },
             { level: 2, berries: "250.000", gems: "10", points: "1.500" },
             { level: 2, berries: "250.000", gems: "10", points: "1.500" },
             { level: 3, berries: "400.000", gems: "20", points: "3.000" },
             { level: 3, berries: "400.000", gems: "20", points: "3.000" },
Linha 253: Linha 334:
         ];
         ];


         function buildLevelUI(section) {
        function shouldRebuild(utab) {
            var levelCount = utab.querySelectorAll(".utab__level").length;
            var buttonCount = utab.querySelectorAll(".utab__levelBtn").length;
            return levelCount > 0 && levelCount !== buttonCount;
        }
 
        function cleanupUI(utab) {
            var nav = utab.querySelector(".utab__levels");
            if (nav) nav.remove();
            var display = utab.querySelector(".utab__display");
            if (display) display.remove();
        }
 
         function buildLevelUI(utab, force) {
            if (utab.getAttribute("data-utab-init") && !force) return;
            if (force) cleanupUI(utab);
            utab.setAttribute("data-utab-init", "1");
            var section = utab.querySelector(".utab__section");
            if (!section) return;
             var levelElements = [].slice.call(section.querySelectorAll(".utab__level"));
             var levelElements = [].slice.call(section.querySelectorAll(".utab__level"));
             if (!levelElements.length) return;
             if (!levelElements.length) return;
             var label = section.dataset.tab || "Níveis";
             var label = section.getAttribute("data-tab") || "Níveis";
             var levels = levelElements.map(function (levelElement, index) {
            var isSkin = utab.getAttribute("data-utab-skin") === "1";
                 var levelNumber = levelElement.dataset.level || String(index + 1);
 
                 var contentElement = levelElement.querySelector(".utab__content") || levelElement;
             var levels = levelElements.map(function (el, i) {
                 var rawHtml = contentElement.innerHTML.trim();
                 var num = el.getAttribute("data-level") || String(i + 1);
                var contentWrapper = document.createElement("div");
                 var skinName = el.getAttribute("data-skin-name") || "";
                contentWrapper.innerHTML = rawHtml;
                 var img = el.querySelector(".utab__mediaImage");
                 var mediaImage = contentWrapper.querySelector(".utab__mediaImage");
                 var desc = el.querySelector(".utab__desc");
                 var imageHtml = mediaImage ? mediaImage.innerHTML.trim() : "";
                 return {
                if (mediaImage) mediaImage.remove();
                    level: num,
                var statsHtml = contentWrapper.innerHTML.trim();
                    name: skinName,
                 return { level: levelNumber, imageHtml: imageHtml, statsHtml: statsHtml };
                    imageHtml: img ? img.innerHTML.trim() : "",
                    descHtml: desc ? desc.innerHTML.trim() : ""
                 };
             });
             });
            levelElements.forEach(function (el) { el.classList.add("utab__level--source"); });


             var nav = document.createElement("div");
             var nav = document.createElement("div");
Linha 276: Linha 375:
             nav.setAttribute("role", "tablist");
             nav.setAttribute("role", "tablist");
             nav.setAttribute("aria-label", "Níveis de " + label);
             nav.setAttribute("aria-label", "Níveis de " + label);


             var display = document.createElement("div");
             var display = document.createElement("div");
Linha 286: Linha 386:
             display.appendChild(stats);
             display.appendChild(stats);


             var buttons = levels.map(function (level, index) {
            utab.appendChild(nav);
            utab.appendChild(display);
 
             var buttons = levels.map(function (level, i) {
                 var btn = document.createElement("button");
                 var btn = document.createElement("button");
                 btn.type = "button";
                 btn.type = "button";
                 btn.className = "utab__levelBtn";
                 btn.className = "utab__levelBtn";
                 btn.textContent = "Nv " + level.level;
                 if (isSkin) {
                    var name = level.name || ("Skin " + (i + 1));
                    btn.setAttribute("aria-label", name);
                    btn.setAttribute("title", name);
                } else {
                    btn.textContent = "Nv " + level.level;
                }
                 btn.setAttribute("role", "tab");
                 btn.setAttribute("role", "tab");
                 btn.setAttribute("aria-selected", "false");
                 btn.setAttribute("aria-selected", "false");
Linha 297: Linha 406:
                 return btn;
                 return btn;
             });
             });
            var activeIndex = -1;


             buttons.forEach(function (btn, index) {
             buttons.forEach(function (btn, index) {
Linha 302: Linha 413:
                 btn.addEventListener("keydown", function (e) { handleArrowNavigation(e, buttons, activateLevel); });
                 btn.addEventListener("keydown", function (e) { handleArrowNavigation(e, buttons, activateLevel); });
             });
             });
            section.insertBefore(display, section.firstChild);
            section.insertBefore(nav, section.firstChild);
            var renderToken = 0;


             function activateLevel(index, shouldFocus) {
             function activateLevel(index, shouldFocus) {
                 if (!levels.length) return;
                 if (!levels.length) return;
                 var safeIndex = Math.max(0, Math.min(index, levels.length - 1));
                 var safe = Math.max(0, Math.min(index, levels.length - 1));
                 var current = levels[safeIndex];
                 if (safe === activeIndex) {
                 var token = ++renderToken;
                    if (shouldFocus) buttons[safe].focus();
                    return;
                }
                 var current = levels[safe];


                 buttons.forEach(function (btn, i) {
                 buttons.forEach(function (btn, i) {
                     var isActive = i === safeIndex;
                     var active = i === safe;
                     btn.classList.toggle("is-active", isActive);
                     btn.classList.toggle("is-active", active);
                     btn.setAttribute("aria-selected", isActive ? "true" : "false");
                     btn.setAttribute("aria-selected", active ? "true" : "false");
                     btn.setAttribute("tabindex", isActive ? "0" : "-1");
                     btn.setAttribute("tabindex", active ? "0" : "-1");
                 });
                 });


                 if (current.imageHtml) {
                 if (current.imageHtml) {
                     imageWrap.innerHTML = current.imageHtml;
                     imageWrap.innerHTML = '<div class="utab-responsive-frame">' + current.imageHtml + "</div>";
                     imageWrap.classList.remove("is-empty");
                     imageWrap.classList.remove("is-empty");
                     display.classList.remove("is-image-empty");
                     display.classList.remove("is-image-empty");
Linha 332: Linha 441:


                 var levelNum = parseInt(current.level, 10);
                 var levelNum = parseInt(current.level, 10);
                 var cost = upgradeCosts.filter(function (c) { return c.level === levelNum; })[0];
                 var cost = isSkin
                 var costHtml = cost ? '<div class="utab__stat utab__stat--cost"><div class="utab__statTitle">Custo do upgrade</div><ul class="utab__statList">' +
                    ? null
                     '<li class="utab__costRow"><span class="utab__costBerry"><span class="utab__costText">' + cost.berries + ' berries</span></span></li>' +
                    : upgradeCosts.filter(function (c) { return c.level === levelNum; })[0];
                     (cost.gems ? '<li class="utab__costRow"><span class="utab__costGems"><span class="utab__costText">' + cost.gems + ' gemas</span></span></li>' : '') +
                var costTitle = "Custos de Melhoria";
                     '<li class="utab__costRow"><span class="utab__costPoints"><span class="utab__costText">' + cost.points + ' pontos</span></span></li></ul></div>' : "";
                 var costHtml = cost
                    ? '<div class="utab__stat utab__stat--cost"><div class="utab__statTitle">' + costTitle + '</div><ul class="utab__statList">'
                     + '<li class="utab__costRow"><span class="utab__costBerry">' + cost.berries + ' Berries</span></li>'
                     + (cost.gems ? '<li class="utab__costRow"><span class="utab__costGems">' + cost.gems + ' Gemas</span></li>' : '')
                     + '<li class="utab__costRow"><span class="utab__costPoints">' + cost.points + ' Pontos de Aliança</span></li>'
                    + '</ul></div>'
                    : "";


                 var statsBodyHtml = current.statsHtml ? (hasStatWrapper(current.statsHtml) ? current.statsHtml :
                 var infoHtml = (!isSkin && current.descHtml)
                     '<div class="utab__stat utab__stat--desc"><div class="utab__statTitle">Informações</div>' + current.statsHtml + '</div>') : "";
                     ? '<div class="utab__stat utab__stat--desc"><div class="utab__statTitle">Informações</div><div class="utab__descContent">' + current.descHtml + '</div></div>'
                 stats.innerHTML = statsBodyHtml + costHtml;
                    : "";
 
                 stats.innerHTML = infoHtml + costHtml;
                 triggerFade(display);
                 triggerFade(display);
                activeIndex = safe;


                if ((current.imageHtml && hasWikitext(current.imageHtml)) || (current.statsHtml && hasWikitext(current.statsHtml))) {
                 if (shouldFocus) buttons[safe].focus();
                    Promise.all([
                        parseWikitextCached(current.imageHtml, "parsedImageHtml", current),
                        parseWikitextCached(current.statsHtml, "parsedStatsHtml", current)
                    ]).then(function (results) {
                        if (renderToken !== token) return;
                        var parsedImage = results[0], parsedStats = results[1];
                        if (parsedImage && parsedImage !== current.imageHtml) {
                            imageWrap.innerHTML = parsedImage;
                            imageWrap.classList.remove("is-empty");
                            display.classList.remove("is-image-empty");
                        }
                        if (parsedStats && parsedStats !== current.statsHtml) {
                            var 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();
             }
             }


Linha 370: Linha 468:


         function initWidgets() {
         function initWidgets() {
             [].slice.call(document.querySelectorAll(".utab")).forEach(function (widget) {
             [].slice.call(document.querySelectorAll(".utab")).forEach(function (utab) {
                 [].slice.call(widget.querySelectorAll(".utab__section")).forEach(buildLevelUI);
                 if (utab.getAttribute("data-utab-init")) {
                    if (shouldRebuild(utab)) {
                        buildLevelUI(utab, true);
                    }
                    return;
                }
                buildLevelUI(utab, false);
             });
             });
         }
         }


        /* Roda quando DOM estiver pronto */
         if (document.readyState === "loading") {
         if (document.readyState === "loading") {
             document.addEventListener("DOMContentLoaded", initWidgets);
             document.addEventListener("DOMContentLoaded", initWidgets);
         } else {
         } else {
             initWidgets();
             initWidgets();
        }
        window.addEventListener("load", initWidgets);
        document.addEventListener("click", function (event) {
            if (!event.target.closest(".tabber__tab")) return;
            window.setTimeout(initWidgets, 0);
        });
        /* Observa novos .utab que apareçam depois (ex: tabber lazy-load) */
        if (window.MutationObserver) {
            new MutationObserver(function () { initWidgets(); })
                .observe(document.documentElement, { childList: true, subtree: true });
         }
         }
     })();
     })();
</script>
</script>

Edição atual tal como às 16h12min de 9 de fevereiro de 2026

<style>

   /* TabberNeue: mata o vazamento entre abas */
   .tabber__panel:not(.tabber__panel--active) {
       display: none !important;
   }
   .tabber__panel.tabber__panel--active {
       animation: utabTabIn 0.15s ease-out;
   }
   @keyframes utabTabIn {
       from {
           opacity: 0;
       }
       to {
           opacity: 1;
       }
   }
   .utab {
       font-family: "Segoe UI", Arial, sans-serif;
       color: #e2ecff;
       padding: 12px 0 0;
       width: 100%;
       min-width: 0;
       overflow: hidden;
       box-sizing: border-box;
       position: relative;
   }
   .utab__section {
       display: none;
   }
   .utab__levels {
       display: flex;
       flex-wrap: wrap;
       gap: 8px;
       margin-bottom: 16px;
   }


   .utab__levelBtn {
       border: 1px solid #274a74;
       background: #13243a;
       padding: 6px 12px;
       border-radius: 10px;
       font-weight: 600;
       color: #cfe1ff;
       cursor: pointer;
       transition: all 0.2s ease;
   }
   .utab__levelBtn:hover {
       border-color: #4a86d8;
       color: #ffffff;
   }
   .utab__levelBtn.is-active {
       background: #2e7dd7;
       border-color: #2e7dd7;
       color: #ffffff;
   }
   .utab--skin .utab__levelBtn {
       padding: 0;
       width: 22px;
       height: 22px;
       border-radius: 999px;
       font-size: 0;
       line-height: 1;
   }
   .utab__levelBtn:focus-visible {
       outline: 2px solid rgba(46, 125, 215, 0.4);
       outline-offset: 2px;
   }
   .utab__display {
       display: flex;
       gap: 18px;
       align-items: start;
       transition: opacity 0.35s ease, transform 0.35s ease;
       will-change: opacity, transform;
   }
   .utab__display.is-image-empty .utab__image {
       display: none;
   }
   .utab__display.is-fading {
       animation: utabFade 0.8s ease-in-out;
   }
   .utab__image {
       border-radius: 12px;
       border: 1px solid #203c5f;
       background: #0b1422;
       padding: 10px;
       flex-shrink: 0;
       max-width: 100%;
       display: flex;
       justify-content: center;
       box-sizing: border-box;
   }
   .utab__image img {
       display: block;
       height: auto;
       width: auto;
       max-width: 100%;
       border-radius: 8px;
   }
   .utab__image .utab-responsive-frame {
       width: 100%;
       max-width: 100%;
       margin: 0 auto;
       padding: 0;
       background: transparent;
       box-shadow: none;
       box-sizing: border-box;
   }
   .utab__image .utab-responsive-frame .thumbinner,
   .utab__image .utab-responsive-frame .thumb,
   .utab__image .utab-responsive-frame figure,
   .utab__image .utab-responsive-frame .mw-file-description {
       max-width: 100% !important;
       width: 100% !important;
       padding: 0 !important;
       margin: 0 auto !important;
       border: 0 !important;
       background: transparent !important;
       box-shadow: none !important;
       box-sizing: border-box;
   }
   .utab__image .utab-responsive-frame img {
       display: block !important;
       max-width: 100% !important;
       width: 100% !important;
       height: auto !important;
       margin: 0 auto !important;
       border: 0 !important;
       border-radius: 8px;
   }
   .utab__image.is-empty {
       display: none;
   }
   .utab__stats {
       display: flex;
       flex-direction: column;
       gap: 10px;
       color: #dbe7ff;
       font-size: 14px;
       flex: 1;
       min-width: 0;
   }
   .utab__stat {
       background: #13243a;
       border: 1px solid #274a74;
       border-radius: 10px;
       padding: 10px 12px;
   }
   .utab--skin .utab__stats {
       display: none;
   }
   .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__descContent {
       margin-top: 6px;
       line-height: 1.5;
   }
   .utab__descContent ul,
   .utab__descContent ol {
       margin: 4px 0;
       padding-left: 18px;
   }
   .utab__descContent li {
       display: list-item;
   }
   .utab__descContent p {
       margin: 4px 0;
   }
   .utab__descContent h1,
   .utab__descContent h2,
   .utab__descContent h3,
   .utab__descContent h4,
   .utab__descContent h5,
   .utab__descContent h6 {
       color: #a0c4ff;
       border-bottom: none;
       margin: 8px 0 4px;
   }
   .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;
   }
   @keyframes utabFade {
       from {
           opacity: 0;
           transform: translateY(8px);
       }
       to {
           opacity: 1;
           transform: translateY(0);
       }
   }
   @media (max-width: 600px) {
       .utab--skin .utab__levels {
           justify-content: center;
       }
       .utab--skin .utab__levelBtn {
           width: 28px;
           height: 28px;
       }
       .utab__display {
           flex-direction: column-reverse;
       }
       .utab__image {
           max-width: 100%;
           order: -1;
       }
   }
   @media (max-width: 900px) {
       .utab__display {
           gap: 24px;
       }
       .utab__image {
           max-width: 45%;
       }
       .utab__stats {
           gap: 14px;
       }
       .utab__stat {
           padding: 12px 14px;
       }
   }

</style>

<script>

   (function () {
       /* Garante que o script só roda UMA VEZ mesmo carregado N vezes */
       if (window.__utabLoaded) return;
       window.__utabLoaded = true;
       function handleArrowNavigation(event, buttons, activate) {
           var keys = ["ArrowLeft", "ArrowRight", "ArrowUp", "ArrowDown", "Home", "End"];
           if (keys.indexOf(event.key) === -1) return;
           event.preventDefault();
           var currentIndex = buttons.indexOf(document.activeElement);
           if (currentIndex === -1) return;
           var nextIndex = currentIndex;
           if (event.key === "Home") 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;
           activate(nextIndex, true);
       }
       function triggerFade(element) {
           element.classList.remove("is-fading");
           element.offsetWidth;
           element.classList.add("is-fading");
       }
       var upgradeCosts = [
           { level: 1, berries: "50.000", gems: null, 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 shouldRebuild(utab) {
           var levelCount = utab.querySelectorAll(".utab__level").length;
           var buttonCount = utab.querySelectorAll(".utab__levelBtn").length;
           return levelCount > 0 && levelCount !== buttonCount;
       }
       function cleanupUI(utab) {
           var nav = utab.querySelector(".utab__levels");
           if (nav) nav.remove();
           var display = utab.querySelector(".utab__display");
           if (display) display.remove();
       }
       function buildLevelUI(utab, force) {
           if (utab.getAttribute("data-utab-init") && !force) return;
           if (force) cleanupUI(utab);
           utab.setAttribute("data-utab-init", "1");
           var section = utab.querySelector(".utab__section");
           if (!section) return;
           var levelElements = [].slice.call(section.querySelectorAll(".utab__level"));
           if (!levelElements.length) return;
           var label = section.getAttribute("data-tab") || "Níveis";
           var isSkin = utab.getAttribute("data-utab-skin") === "1";
           var levels = levelElements.map(function (el, i) {
               var num = el.getAttribute("data-level") || String(i + 1);
               var skinName = el.getAttribute("data-skin-name") || "";
               var img = el.querySelector(".utab__mediaImage");
               var desc = el.querySelector(".utab__desc");
               return {
                   level: num,
                   name: skinName,
                   imageHtml: img ? img.innerHTML.trim() : "",
                   descHtml: desc ? desc.innerHTML.trim() : ""
               };
           });
           var nav = document.createElement("div");
           nav.className = "utab__levels";
           nav.setAttribute("role", "tablist");
           nav.setAttribute("aria-label", "Níveis de " + label);


           var display = document.createElement("div");
           display.className = "utab__display";
           var imageWrap = document.createElement("div");
           imageWrap.className = "utab__image";
           var stats = document.createElement("div");
           stats.className = "utab__stats";
           display.appendChild(imageWrap);
           display.appendChild(stats);
           utab.appendChild(nav);
           utab.appendChild(display);
           var buttons = levels.map(function (level, i) {
               var btn = document.createElement("button");
               btn.type = "button";
               btn.className = "utab__levelBtn";
               if (isSkin) {
                   var name = level.name || ("Skin " + (i + 1));
                   btn.setAttribute("aria-label", name);
                   btn.setAttribute("title", name);
               } else {
                   btn.textContent = "Nv " + level.level;
               }
               btn.setAttribute("role", "tab");
               btn.setAttribute("aria-selected", "false");
               btn.setAttribute("tabindex", "-1");
               nav.appendChild(btn);
               return btn;
           });
           var activeIndex = -1;
           buttons.forEach(function (btn, index) {
               btn.addEventListener("click", function () { activateLevel(index, true); });
               btn.addEventListener("keydown", function (e) { handleArrowNavigation(e, buttons, activateLevel); });
           });
           function activateLevel(index, shouldFocus) {
               if (!levels.length) return;
               var safe = Math.max(0, Math.min(index, levels.length - 1));
               if (safe === activeIndex) {
                   if (shouldFocus) buttons[safe].focus();
                   return;
               }
               var current = levels[safe];
               buttons.forEach(function (btn, i) {
                   var active = i === safe;
                   btn.classList.toggle("is-active", active);
                   btn.setAttribute("aria-selected", active ? "true" : "false");
                   btn.setAttribute("tabindex", active ? "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");
               }
               var levelNum = parseInt(current.level, 10);
               var cost = isSkin
                   ? null
                   : upgradeCosts.filter(function (c) { return c.level === levelNum; })[0];
               var costTitle = "Custos de Melhoria";
               var costHtml = cost

 ? '

' + costTitle + '
    ' + '
  • ' + cost.berries + ' Berries
  • ' + (cost.gems ? '
  • ' + cost.gems + ' Gemas
  • ' : ) + '
  • ' + cost.points + ' Pontos de Aliança
  • ' + '

'

                   : "";
               var infoHtml = (!isSkin && current.descHtml)

 ? '

Informações
' + current.descHtml + '

'

                   : "";
               stats.innerHTML = infoHtml + costHtml;
               triggerFade(display);
               activeIndex = safe;
               if (shouldFocus) buttons[safe].focus();
           }
           activateLevel(0, false);
       }
       function initWidgets() {
           [].slice.call(document.querySelectorAll(".utab")).forEach(function (utab) {
               if (utab.getAttribute("data-utab-init")) {
                   if (shouldRebuild(utab)) {
                       buildLevelUI(utab, true);
                   }
                   return;
               }
               buildLevelUI(utab, false);
           });
       }
       /* Roda quando DOM estiver pronto */
       if (document.readyState === "loading") {
           document.addEventListener("DOMContentLoaded", initWidgets);
       } else {
           initWidgets();
       }
       window.addEventListener("load", initWidgets);
       document.addEventListener("click", function (event) {
           if (!event.target.closest(".tabber__tab")) return;
           window.setTimeout(initWidgets, 0);
       });
       /* Observa novos .utab que apareçam depois (ex: tabber lazy-load) */
       if (window.MutationObserver) {
           new MutationObserver(function () { initWidgets(); })
               .observe(document.documentElement, { childList: true, subtree: true });
       }
   })();

</script>