Mudanças entre as edições de "Módulo:Gb"

De Wiki Gla
Ir para navegação Ir para pesquisar
Etiqueta: Revertido
 
(24 revisões intermediárias pelo mesmo usuário não estão sendo mostradas)
Linha 1: Linha 1:
local p = {}
local p = {}


--------------------------------------------------------
function p.main(frame)
-- Função auxiliar: obtém argumento ou valor padrão
     local args = frame:getParent().args
--------------------------------------------------------
local function getArg(args, key, default)
    return mw.text.trim(args[key] or "") ~= "" and args[key] or default
end
 
--------------------------------------------------------
-- Renderiza um único boss (usado internamente)
--------------------------------------------------------
local function renderBoss(args, prefix)
 
     local function g(k, default)
        return getArg(args, prefix .. k, default)
    end
 
    local img        = g("img",        "Placeholder.png")
    local nome      = g("nome",      "Nome do Boss")
    local frase      = g("frase",      "Frase ou lema do boss.")
    local hp        = g("hp",        "???")
    local exp        = g("exp",        "???")
    local nivel      = g("nivel",      "???")
    local fresco    = g("fresco",    "-")
    local forte      = g("forte",      "-")
    local reflete    = g("reflete",    "-")
    local comum      = g("comum",      "")
    local semiraro  = g("semiraro",  "")
    local raro      = g("raro",      "")
    local muitoRaro  = g("muitoraro",  "")
 
    local html = mw.html.create("div")
        :addClass("boss-card")
        :css{
            ["background"] = "#18181b",
            ["border-radius"] = "12px",
            padding = "30px",
            color = "#fff",
            width = "100%",
            ["box-sizing"] = "border-box",
            ["margin-bottom"] = "32px",
            ["font-family"] = "Verdana,sans-serif"
        }
 
    ----------------------------------------------------
    -- Cabeçalho
    ----------------------------------------------------
    html:tag("div")
        :css{ ["font-size"] = "1.5em", ["font-weight"] = "bold", ["margin-bottom"] = "10px" }
        :wikitext(nome)
 
    html:tag("div")
        :css{ ["font-size"] = "95%", color = "#eaa85d", ["font-style"] = "italic", ["margin-bottom"] = "16px" }
        :wikitext('"' .. frase .. '"')
 
    ----------------------------------------------------
    -- Corpo principal
    ----------------------------------------------------
    local main = html:tag("div")
        :css{
            display = "flex",
            ["justify-content"] = "space-between",
            ["align-items"] = "center",
            ["flex-wrap"] = "wrap",
            gap = "20px"
        }
 
    main:tag("div")
        :css{ ["flex"] = "none" }
        :wikitext(string.format("[[Arquivo:%s|90px]]", img))
 
    local statsBox = main:tag("div")
        :css{ ["min-width"] = "200px", ["flex"] = "1" }


     statsBox:tag("div"):wikitext(
     local normal_nivel    = mw.text.trim(args['normal_nivel']    or '140')
        string.format(
    local normal_equip    = mw.text.trim(args['normal_equip']    or 'Set +8')
            '<span style="color:#fb3d3d;font-weight:bold;font-size:1.15em;">&#x2764;&#xFE0F; %s</span> &nbsp; ' ..
    local hard_personagem = mw.text.trim(args['hard_personagem'] or 'personagem 4 ou 5 estrelas (Diamante)')
            '<span style="color:#ffe568;font-weight:bold;font-size:1.08em;">&#x1F4B0; %s</span> &nbsp; ' ..
     local hard_equip      = mw.text.trim(args['hard_equip']      or 'Set +16')
            '<span style="color:#6ca8fb;font-weight:bold;font-size:1.04em;">&#x2694;&#xFE0F; %s</span>',
            hp, exp, nivel
        )
     )


     statsBox:tag("div")
     local root = mw.html.create('div')
        :css{
    root:addClass('gb-wrap')
            ["margin-top"] = "5px",
            ["font-size"] = "90%",
            color = "#cfccff"
        }
        :wikitext(string.format(
            "<b>Frescor:</b> %s &nbsp;&nbsp; <b>Forte:</b> %s &nbsp;&nbsp; <b>Reflete:</b> %s",
            fresco, forte, reflete
        ))


     ----------------------------------------------------
     -- CSS via TemplateStyles (recomendado) ou inline
     -- Tabela de loot
     -- Botões (tabs)
    ----------------------------------------------------
     local btns = root:tag('div'):addClass('gb-btns')
     local loot = html:tag("div")
        :css{
            ["margin-top"] = "20px",
            background = "#232329",
            ["border-radius"] = "10px",
            padding = "18px"
        }


     local tableEl = loot:tag("table")
     btns:tag('button')
         :css{
         :addClass('gb-btn'):addClass('active')
            width = "100%",
        :attr('onclick', "gbSwitch('n',this)")
            color = "#fff",
        :wikitext('Normal ')
            ["table-layout"] = "auto"
        :tag('span'):addClass('gb-badge'):addClass('badge-n')
         }
         :wikitext('Nível ' .. normal_nivel)


     local function row(label, color, content)
     btns:tag('button')
         local tr = tableEl:tag("tr")
         :addClass('gb-btn')
         tr:tag("th")
         :attr('onclick', "gbSwitch('h',this)")
            :css{
        :wikitext('Hard ')
                ["text-align"] = "left",
         :tag('span'):addClass('gb-badge'):addClass('badge-h')
                color = color,
        :wikitext(hard_equip)
                padding = "6px",
                ["font-size"] = "1.07em"
            }
            :wikitext(label)
         tr:tag("td"):wikitext(content)
    end
 
    row("Comum:",      "#f3e8bb", comum)
    row("Semi-Raro:",  "#aeccff", semiraro)
    row("Raro:",      "#e6e5ff", raro)
    row("Muito Raro:", "#f9538f", muitoRaro)
 
    return tostring(html)
end
 
--------------------------------------------------------
-- Função principal: suporta 1 boss ou vários bosses
--------------------------------------------------------
function p.bosses(frame)
    local args = frame:getParent().args
    local html = mw.html.create()


     -- CSS responsivo
     -- Painel Normal
     html:wikitext([[
     local pn = root:tag('div'):addClass('gb-panel'):addClass('active'):attr('id', 'gbpanel-n')
<style>
    pn:tag('div'):addClass('gb-title'):wikitext('Requisitos — Normal')
@media screen and (max-width: 650px) {
    local ln = pn:tag('ul'):addClass('gb-list')
  .boss-card {
     ln:tag('li')
     text-align: center !important;
        :tag('span'):addClass('gb-dot'):addClass('dot-n'):done()
  }
        :tag('span'):wikitext('Nível mínimo: '):tag('b'):wikitext(normal_nivel)
}
    ln:tag('li')
</style>
        :tag('span'):addClass('gb-dot'):addClass('dot-n'):done()
    ]])
        :tag('span'):wikitext('Equipamento recomendado: '):tag('b'):wikitext(normal_equip)


     ----------------------------------------------------
     -- Painel Hard
     -- Detecta quantos bosses existem no bloco
     local ph = root:tag('div'):addClass('gb-panel'):attr('id', 'gbpanel-h')
     ----------------------------------------------------
     ph:tag('div'):addClass('gb-title'):wikitext('Requisitos — Hard')
     local n = 0
     local lh = ph:tag('ul'):addClass('gb-list')
     for k, _ in pairs(args) do
     lh:tag('li')
         local num = string.match(k, "^(%d+)nome$")
         :tag('span'):addClass('gb-dot'):addClass('dot-h'):done()
         if num then
         :tag('span'):wikitext('Recomendado utilizar um '):tag('b'):wikitext(hard_personagem)
            num = tonumber(num)
    lh:tag('li')
            if num > n then n = num end
        :tag('span'):addClass('gb-dot'):addClass('dot-h'):done()
         end
         :tag('span'):wikitext('Equipamento recomendado: '):tag('b'):wikitext(hard_equip)
    end


     ----------------------------------------------------
     -- Script
     -- Se não encontrar numéricos, renderiza boss único
     local script = mw.html.create('script')
     ----------------------------------------------------
     script:wikitext([[
    if n == 0 then
function gbSwitch(tab,btn){
        html:wikitext(renderBoss(args, ""))
['n','h'].forEach(function(t){document.getElementById('gbpanel-'+t).classList.remove('active');});
        return tostring(html)
document.querySelectorAll('.gb-btn').forEach(function(b){b.classList.remove('active');});
    end
document.getElementById('gbpanel-'+tab).classList.add('active');
btn.classList.add('active');
}]])


     ----------------------------------------------------
     -- CSS inline
     -- Renderizar vários bosses
     local style = mw.html.create('style')
     ----------------------------------------------------
     style:wikitext([[
    for i = 1, n do
.gb-wrap{font-family:sans-serif;max-width:600px}
        html:wikitext(renderBoss(args, tostring(i)))
.gb-btns{display:flex;border-bottom:2px solid #a2a9b1;margin-bottom:0}
    end
.gb-btn{padding:8px 22px;font-size:14px;font-weight:bold;color:#54595d;background:transparent;border:none;border-bottom:3px solid transparent;margin-bottom:-2px;cursor:pointer;display:flex;align-items:center;gap:6px}
.gb-btn:hover{color:#202122}
.gb-btn.active{color:#202122;border-bottom-color:#3680b0}
.gb-badge{font-size:11px;padding:2px 8px;border-radius:20px;font-weight:bold}
.badge-n{background:#ddeeff;color:#185FA5}
.badge-h{background:#fce8e8;color:#a32d2d}
.gb-panel{display:none;padding:14px 2px}
.gb-panel.active{display:block}
.gb-title{font-size:11px;font-weight:bold;color:#72777d;text-transform:uppercase;letter-spacing:.06em;margin-bottom:10px}
.gb-list{list-style:none;padding:0;margin:0;display:flex;flex-direction:column;gap:8px}
.gb-list li{display:flex;align-items:flex-start;gap:8px;font-size:14px;color:#202122;line-height:1.5}
.gb-dot{width:7px;height:7px;border-radius:50%;flex-shrink:0;margin-top:5px}
.dot-n{background:#3680b0}
.dot-h{background:#e24b4a}
@media(max-width:480px){.gb-btn{padding:8px 14px;font-size:13px}}]])


     return tostring(html)
     return tostring(style) .. tostring(root) .. tostring(script)
end
end


return p
return p

Edição atual tal como às 04h47min de 17 de março de 2026

A documentação para este módulo pode ser criada em Módulo:Gb/doc

local p = {}

function p.main(frame)
    local args = frame:getParent().args

    local normal_nivel    = mw.text.trim(args['normal_nivel']    or '140')
    local normal_equip    = mw.text.trim(args['normal_equip']    or 'Set +8')
    local hard_personagem = mw.text.trim(args['hard_personagem'] or 'personagem 4 ou 5 estrelas (Diamante)')
    local hard_equip      = mw.text.trim(args['hard_equip']      or 'Set +16')

    local root = mw.html.create('div')
    root:addClass('gb-wrap')

    -- CSS via TemplateStyles (recomendado) ou inline
    -- Botões (tabs)
    local btns = root:tag('div'):addClass('gb-btns')

    btns:tag('button')
        :addClass('gb-btn'):addClass('active')
        :attr('onclick', "gbSwitch('n',this)")
        :wikitext('Normal ')
        :tag('span'):addClass('gb-badge'):addClass('badge-n')
        :wikitext('Nível ' .. normal_nivel)

    btns:tag('button')
        :addClass('gb-btn')
        :attr('onclick', "gbSwitch('h',this)")
        :wikitext('Hard ')
        :tag('span'):addClass('gb-badge'):addClass('badge-h')
        :wikitext(hard_equip)

    -- Painel Normal
    local pn = root:tag('div'):addClass('gb-panel'):addClass('active'):attr('id', 'gbpanel-n')
    pn:tag('div'):addClass('gb-title'):wikitext('Requisitos — Normal')
    local ln = pn:tag('ul'):addClass('gb-list')
    ln:tag('li')
        :tag('span'):addClass('gb-dot'):addClass('dot-n'):done()
        :tag('span'):wikitext('Nível mínimo: '):tag('b'):wikitext(normal_nivel)
    ln:tag('li')
        :tag('span'):addClass('gb-dot'):addClass('dot-n'):done()
        :tag('span'):wikitext('Equipamento recomendado: '):tag('b'):wikitext(normal_equip)

    -- Painel Hard
    local ph = root:tag('div'):addClass('gb-panel'):attr('id', 'gbpanel-h')
    ph:tag('div'):addClass('gb-title'):wikitext('Requisitos — Hard')
    local lh = ph:tag('ul'):addClass('gb-list')
    lh:tag('li')
        :tag('span'):addClass('gb-dot'):addClass('dot-h'):done()
        :tag('span'):wikitext('Recomendado utilizar um '):tag('b'):wikitext(hard_personagem)
    lh:tag('li')
        :tag('span'):addClass('gb-dot'):addClass('dot-h'):done()
        :tag('span'):wikitext('Equipamento recomendado: '):tag('b'):wikitext(hard_equip)

    -- Script
    local script = mw.html.create('script')
    script:wikitext([[
function gbSwitch(tab,btn){
['n','h'].forEach(function(t){document.getElementById('gbpanel-'+t).classList.remove('active');});
document.querySelectorAll('.gb-btn').forEach(function(b){b.classList.remove('active');});
document.getElementById('gbpanel-'+tab).classList.add('active');
btn.classList.add('active');
}]])

    -- CSS inline
    local style = mw.html.create('style')
    style:wikitext([[
.gb-wrap{font-family:sans-serif;max-width:600px}
.gb-btns{display:flex;border-bottom:2px solid #a2a9b1;margin-bottom:0}
.gb-btn{padding:8px 22px;font-size:14px;font-weight:bold;color:#54595d;background:transparent;border:none;border-bottom:3px solid transparent;margin-bottom:-2px;cursor:pointer;display:flex;align-items:center;gap:6px}
.gb-btn:hover{color:#202122}
.gb-btn.active{color:#202122;border-bottom-color:#3680b0}
.gb-badge{font-size:11px;padding:2px 8px;border-radius:20px;font-weight:bold}
.badge-n{background:#ddeeff;color:#185FA5}
.badge-h{background:#fce8e8;color:#a32d2d}
.gb-panel{display:none;padding:14px 2px}
.gb-panel.active{display:block}
.gb-title{font-size:11px;font-weight:bold;color:#72777d;text-transform:uppercase;letter-spacing:.06em;margin-bottom:10px}
.gb-list{list-style:none;padding:0;margin:0;display:flex;flex-direction:column;gap:8px}
.gb-list li{display:flex;align-items:flex-start;gap:8px;font-size:14px;color:#202122;line-height:1.5}
.gb-dot{width:7px;height:7px;border-radius:50%;flex-shrink:0;margin-top:5px}
.dot-n{background:#3680b0}
.dot-h{background:#e24b4a}
@media(max-width:480px){.gb-btn{padding:8px 14px;font-size:13px}}]])

    return tostring(style) .. tostring(root) .. tostring(script)
end

return p