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

De Wiki Gla
Ir para navegação Ir para pesquisar
m
m
Linha 116: Linha 116:
         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;
     }
     }


Linha 143: Linha 162:
     .utab__costPoints {
     .utab__costPoints {
         color: #a6b0bf;
         color: #a6b0bf;
    }
    .utab__costIcon {
        display: none;
    }
    .utab__level--source {
        display: none;
     }
     }


Linha 196: Linha 207:
             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; });
         }
         }


Linha 236: Linha 224:
             var label = section.getAttribute("data-tab") || "Níveis";
             var label = section.getAttribute("data-tab") || "Níveis";


             var levels = levelElements.map(function (levelElement, index) {
             // Descrição compartilhada (vem do editor, já parseada server-side)
                var levelNumber = levelElement.getAttribute("data-level") || String(index + 1);
            var descEl = section.querySelector(".utab__desc");
                var contentElement = levelElement.querySelector(".utab__content") || levelElement;
            var descHtml = descEl ? descEl.innerHTML.trim() : "";
                var rawHtml = contentElement.innerHTML.trim();
 
                var contentWrapper = document.createElement("div");
            // Dados por nível (só imagem)
                contentWrapper.innerHTML = rawHtml;
            var levels = levelElements.map(function (el, i) {
                var mediaImage = contentWrapper.querySelector(".utab__mediaImage");
                 var num = el.getAttribute("data-level") || String(i + 1);
                 var imageHtml = mediaImage ? mediaImage.innerHTML.trim() : "";
                 var img = el.querySelector(".utab__mediaImage");
                if (mediaImage) mediaImage.remove();
                 return { level: num, imageHtml: img ? img.innerHTML.trim() : "" };
                 var statsHtml = contentWrapper.innerHTML.trim();
                 return { level: levelNumber, imageHtml: imageHtml, statsHtml: statsHtml };
             });
             });


            // Monta UI fora do section
             var nav = document.createElement("div");
             var nav = document.createElement("div");
             nav.className = "utab__levels";
             nav.className = "utab__levels";
Linha 266: Linha 253:
             utab.appendChild(display);
             utab.appendChild(display);


             var buttons = levels.map(function (level, index) {
             var buttons = levels.map(function (level) {
                 var btn = document.createElement("button");
                 var btn = document.createElement("button");
                 btn.type = "button";
                 btn.type = "button";
Linha 282: Linha 269:
                 btn.addEventListener("keydown", function (e) { handleArrowNavigation(e, buttons, activateLevel); });
                 btn.addEventListener("keydown", function (e) { handleArrowNavigation(e, buttons, activateLevel); });
             });
             });
            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];
                 var current = levels[safe];
                var token = ++renderToken;


                 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");
                 });
                 });


                // Imagem
                 if (current.imageHtml) {
                 if (current.imageHtml) {
                     imageWrap.innerHTML = current.imageHtml;
                     imageWrap.innerHTML = current.imageHtml;
Linha 308: Linha 293:
                 }
                 }


                // Custo (muda por nível)
                 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 = upgradeCosts.filter(function (c) { return c.level === levelNum; })[0];
                 var costHtml = cost ? '<div class="utab__stat utab__stat--cost"><div class="utab__statTitle">Custo do upgrade</div><ul class="utab__statList">' +
                 var costHtml = cost
                     '<li class="utab__costRow"><span class="utab__costBerry"><span class="utab__costText">' + cost.berries + ' berries</span></span></li>' +
                    ? '<div class="utab__stat utab__stat--cost"><div class="utab__statTitle">Custo do upgrade</div><ul class="utab__statList">'
                     (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__costBerry">' + cost.berries + ' berries</span></li>'
                     '<li class="utab__costRow"><span class="utab__costPoints"><span class="utab__costText">' + cost.points + ' pontos</span></span></li></ul></div>' : "";
                     + (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</span></li>'
                    + '</ul></div>'
                    : "";


                 var statsBodyHtml = current.statsHtml ? (hasStatWrapper(current.statsHtml) ? current.statsHtml :
                // Descrição (fixa, compartilhada entre níveis)
                     '<div class="utab__stat utab__stat--desc"><div class="utab__statTitle">Informações</div>' + current.statsHtml + '</div>') : "";
                 var infoHtml = descHtml
                 stats.innerHTML = statsBodyHtml + costHtml;
                     ? '<div class="utab__stat utab__stat--desc"><div class="utab__statTitle">Informações</div><div class="utab__descContent">' + descHtml + '</div></div>'
                    : "";
 
                 stats.innerHTML = infoHtml + costHtml;
                 triggerFade(display);
                 triggerFade(display);


                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();
             }
             }



Edição das 20h03min de 7 de fevereiro de 2026

<style>

   .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;
   }
   .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__levelBtn:focus-visible {
       outline: 2px solid rgba(46, 125, 215, 0.4);
       outline-offset: 2px;
   }
   .utab__display {
       display: flex;
       gap: 18px;
       align-items: start;
   }
   .utab__display.is-image-empty .utab__image {
       display: none;
   }
   .utab__display.is-fading {
       animation: utabFade 0.25s ease;
   }
   .utab__image {
       border-radius: 12px;
       border: 1px solid #203c5f;
       background: #0b1422;
       padding: 10px;
       flex-shrink: 0;
       max-width: 50%;
   }
   .utab__image img {
       display: block;
       height: auto;
       max-width: 100%;
       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__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__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(4px);
       }
       to {
           opacity: 1;
           transform: translateY(0);
       }
   }
   @media (max-width: 600px) {
       .utab__display {
           flex-direction: column;
       }
       .utab__image {
           max-width: 100%;
       }
   }

</style>

<script>

   (function () {
       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: "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(utab) {
           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";
           // Descrição compartilhada (vem do editor, já parseada server-side)
           var descEl = section.querySelector(".utab__desc");
           var descHtml = descEl ? descEl.innerHTML.trim() : "";
           // Dados por nível (só imagem)
           var levels = levelElements.map(function (el, i) {
               var num = el.getAttribute("data-level") || String(i + 1);
               var img = el.querySelector(".utab__mediaImage");
               return { level: num, imageHtml: img ? img.innerHTML.trim() : "" };
           });
           // Monta UI fora do section
           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) {
               var btn = document.createElement("button");
               btn.type = "button";
               btn.className = "utab__levelBtn";
               btn.textContent = "Nv " + level.level;
               btn.setAttribute("role", "tab");
               btn.setAttribute("aria-selected", "false");
               btn.setAttribute("tabindex", "-1");
               nav.appendChild(btn);
               return btn;
           });
           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));
               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");
               });
               // Imagem
               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");
               }
               // Custo (muda por nível)
               var levelNum = parseInt(current.level, 10);
               var cost = upgradeCosts.filter(function (c) { return c.level === levelNum; })[0];
               var costHtml = cost

 ? '

Custo do upgrade
    ' + '
  • ' + cost.berries + ' berries
  • ' + (cost.gems ? '
  • ' + cost.gems + ' gemas
  • ' : ) + '
  • ' + cost.points + ' pontos
  • ' + '

'

                   : "";
               // Descrição (fixa, compartilhada entre níveis)
               var infoHtml = descHtml

 ? '

Informações
' + descHtml + '

'

                   : "";
               stats.innerHTML = infoHtml + costHtml;
               triggerFade(display);
               if (shouldFocus) buttons[safe].focus();
           }
           activateLevel(0, false);
       }
       function initWidgets() {
           [].slice.call(document.querySelectorAll(".utab")).forEach(buildLevelUI);
       }
       if (document.readyState === "loading") {
           document.addEventListener("DOMContentLoaded", initWidgets);
       } else {
           initWidgets();
       }
   })();

</script>