Mudanças entre as edições de "Módulo:Droflax"
Ir para navegação
Ir para pesquisar
(Limpou toda a página) Etiquetas: Reversão manual anulando |
|||
| Linha 1: | Linha 1: | ||
local p = {} | |||
function p.render(frame) | |||
local args = frame:getParent().args | |||
-- Datos básicos | |||
local nome = args.nome or '' | |||
local tier = args.tier or '' | |||
local classe = args.classe or '' | |||
local image = args.image or '' | |||
-- Procesar habilidades | |||
local habilidades = {} | |||
for i = 1, 21 do | |||
local hab = { | |||
nome = args['hab' .. i .. '-nome'], | |||
icon = args['hab' .. i .. '-icon'], | |||
level = args['hab' .. i .. '-level'], | |||
desc = args['hab' .. i .. '-desc'], | |||
atr = args['hab' .. i .. '-atr'], | |||
video = args['hab' .. i .. '-video'] | |||
} | |||
if hab.nome and hab.nome ~= '' then | |||
table.insert(habilidades, hab) | |||
end | |||
end | |||
-- Procesar skins | |||
local skins = {} | |||
for i = 1, 11 do | |||
local skin = { | |||
image = args['skin' .. i .. '-image'], | |||
banner = args['skin' .. i .. '-banner'], | |||
tooltip = args['skin' .. i .. '-tooltip'] | |||
} | |||
if skin.image and skin.image ~= '' then | |||
table.insert(skins, skin) | |||
end | |||
end | |||
-- Generar HTML | |||
local html = mw.html.create('div') | |||
:addClass('personaje-box') | |||
:attr('id', 'personaje-' .. mw.uri.encode(nome)) | |||
-- Header | |||
local header = html:tag('div'):addClass('personaje-header') | |||
local topbar = header:tag('div'):addClass('personaje-topbar') | |||
local nomeBox = topbar:tag('div'):addClass('personaje-nome-box') | |||
nomeBox:tag('img') | |||
:attr('src', '/images/6/63/Franky_ts_medal.png') | |||
:addClass('topbar-icon') | |||
local nomeCategory = nomeBox:tag('div'):addClass('personaje-nome-category') | |||
nomeCategory:tag('div'):addClass('nome'):wikitext(nome) | |||
nomeCategory:tag('div'):addClass('classes'):wikitext(classe) | |||
header:tag('div') | |||
:addClass('topbar-description') | |||
:wikitext(nome .. ' (' .. tier .. ') é um personagem do tier ' .. tier:lower() .. '.') | |||
-- Tabs | |||
local tabs = header:tag('div'):addClass('personaje-tabs') | |||
tabs:tag('button') | |||
:addClass('tab-btn') | |||
:attr('data-tab', 'arma') | |||
:wikitext('Arma') | |||
tabs:tag('button') | |||
:addClass('tab-btn active') | |||
:attr('data-tab', 'habilidades') | |||
:wikitext('Habilidades') | |||
tabs:tag('button') | |||
:addClass('tab-btn') | |||
:attr('data-tab', 'skins') | |||
:wikitext('Skins') | |||
-- Imagen del personaje | |||
html:tag('img') | |||
:addClass('art-personaje') | |||
:attr('src', image) | |||
:attr('alt', 'Arte del personaje') | |||
-- Tab content: Habilidades | |||
local habContent = html:tag('div') | |||
:addClass('tab-content active') | |||
:attr('id', 'habilidades') | |||
-- Contenedor de cuadros (iconos de habilidades) | |||
local cuadrosContainer = habContent:tag('div'):addClass('cuadros-container') | |||
for i, hab in ipairs(habilidades) do | |||
cuadrosContainer:tag('div') | |||
:addClass('cuadro') | |||
:attr('data-hab-index', i) | |||
:attr('title', hab.nome) | |||
:tag('img') | |||
:attr('src', hab.icon) | |||
:attr('alt', hab.nome) | |||
:css('width', '100%') | |||
:css('height', '100%') | |||
:css('object-fit', 'cover') | |||
end | |||
local habContainer = habContent:tag('div'):addClass('habilidades-container') | |||
-- Detalles de habilidad | |||
local habDetails = habContainer:tag('div'):addClass('habilidades-details') | |||
habDetails:tag('div'):addClass('descripcion-container') | |||
-- Video container | |||
habContainer:tag('div'):addClass('video-container') | |||
-- Tab content: Skins | |||
local skinsContent = html:tag('div') | |||
:addClass('tab-content') | |||
:attr('id', 'skins') | |||
local cardSkins = skinsContent:tag('div'):addClass('card-skins') | |||
cardSkins:tag('span') | |||
:addClass('card-skins-title') | |||
:wikitext('SKINS & SPOTLIGHTS') | |||
local carouselWrapper = cardSkins:tag('div'):addClass('skins-carousel-wrapper') | |||
carouselWrapper:tag('button') | |||
:addClass('skins-arrow left') | |||
:wikitext('«') | |||
local carousel = carouselWrapper:tag('div'):addClass('skins-carousel') | |||
for i, skin in ipairs(skins) do | |||
local skinCard = carousel:tag('div'):addClass('skin-card') | |||
skinCard:tag('img') | |||
:addClass('skins--imageBanner') | |||
:attr('src', skin.banner) | |||
:attr('alt', 'banner') | |||
skinCard:tag('img') | |||
:addClass('skins--imageSkin') | |||
:attr('src', skin.image) | |||
:attr('alt', 'skin') | |||
end | |||
carouselWrapper:tag('button') | |||
:addClass('skins-arrow right') | |||
:wikitext('»') | |||
-- Datos para el widget (JSON en data attributes) | |||
local dataContainer = html:tag('script') | |||
:attr('type', 'application/json') | |||
:attr('id', 'personaje-data-' .. mw.uri.encode(nome)) | |||
local data = { | |||
nome = nome, | |||
tier = tier, | |||
classe = classe, | |||
image = image, | |||
habilidades = habilidades, | |||
skins = skins | |||
} | |||
dataContainer:wikitext(mw.text.jsonEncode(data)) | |||
-- CSS inline (o mejor referencia a MediaWiki:Common.css) | |||
html:tag('style'):wikitext([[ | |||
.personaje-box { | |||
padding: 16px; | |||
color: #000; | |||
font-family: 'Segoe UI', sans-serif; | |||
width: 90%; | |||
margin: auto; | |||
position: relative; | |||
user-select: none; | |||
} | |||
.personaje-topbar { | |||
display: flex; | |||
flex-direction: column; | |||
align-items: flex-start; | |||
padding: 8px 16px; | |||
} | |||
.personaje-nome-box { | |||
display: flex; | |||
align-items: center; | |||
gap: 8px; | |||
} | |||
.topbar-icon { | |||
width: 90px; | |||
height: 90px; | |||
object-fit: none; | |||
background: #60dae2; | |||
} | |||
.nome { | |||
font-size: 60px; | |||
font-family: 'Orbitron', sans-serif; | |||
font-weight: 900; | |||
} | |||
.topbar-description { | |||
font-size: 16px; | |||
margin-top: 6px; | |||
background: #6AF3FB; | |||
width: fit-content; | |||
padding-inline: 16px; | |||
border-radius: 0 10px 10px 0; | |||
} | |||
.personaje-tabs { | |||
margin: 4px 0 4px 8px; | |||
display: flex; | |||
gap: 12px; | |||
justify-content: flex-start; | |||
} | |||
.tab-btn { | |||
padding: 8px 20px; | |||
background: #333; | |||
color: white; | |||
border: none; | |||
border-radius: 8px; | |||
font-size: 20px; | |||
cursor: pointer; | |||
} | |||
.tab-btn.active { | |||
background: #156bc7; | |||
font-weight: bold; | |||
} | |||
.tab-content { | |||
display: none; | |||
background: #26211cd6; | |||
padding: 0 8px 8px; | |||
} | |||
.tab-content.active { | |||
display: block; | |||
} | |||
.art-personaje { | |||
width: 665px; | |||
position: absolute; | |||
right: 1rem; | |||
top: 0.4rem; | |||
z-index: 9; | |||
} | |||
.cuadros-container { | |||
display: flex; | |||
flex-wrap: nowrap; | |||
gap: 10px; | |||
width: 56%; | |||
overflow-x: auto; | |||
overflow-y: hidden; | |||
padding: 10px 0 3px 1px; | |||
margin-bottom: 6px; | |||
} | |||
.cuadro { | |||
flex: 0 0 auto; | |||
width: 50px; | |||
height: 50px; | |||
border-radius: 5px; | |||
cursor: pointer; | |||
transition: transform 0.2s, box-shadow 0.2s; | |||
} | |||
.cuadro.activo { | |||
box-shadow: 0 0 10px 3px rgba(255, 255, 0, 0.5); | |||
border: 1px solid #FFD700; | |||
} | |||
.habilidades-container { | |||
display: flex; | |||
gap: 20px; | |||
} | |||
.habilidades-details { | |||
flex: 1; | |||
display: flex; | |||
flex-direction: column; | |||
gap: 10px; | |||
width: 50%; | |||
justify-content: center; | |||
} | |||
.descripcion-container { | |||
min-height: 25.1rem; | |||
max-height: 50%; | |||
padding: 4px 16px; | |||
background: #26211C; | |||
border-radius: 8px; | |||
position: relative; | |||
box-shadow: 0 0 7px rgb(255 255 255 / 82%), 0 0 5px rgb(255 255 255 / 96%); | |||
color: #fff; | |||
backdrop-filter: blur(2px); | |||
} | |||
.video-container { | |||
width: 43%; | |||
height: fit-content; | |||
display: flex; | |||
align-items: center; | |||
justify-content: center; | |||
background-color: #000; | |||
align-self: center; | |||
border-radius: 2%; | |||
box-shadow: 0 0 7px rgb(255 255 255 / 82%), 0 0 5px rgb(255 255 255 / 96%); | |||
} | |||
.tier-diamond .personaje-header { | |||
background: linear-gradient(145deg, rgba(160,250,255,0.2), rgba(80,180,200,0.5)); | |||
background-color: #4b8292; | |||
box-shadow: inset 0 0 8px rgba(255,255,255,0.1), 0 0 15px rgba(100,255,255,0.25); | |||
} | |||
]]) | |||
-- Agregar clase de tier | |||
local tierClass = { | |||
['bronze'] = 'tier-bronze', ['bronce'] = 'tier-bronze', | |||
['silver'] = 'tier-silver', ['prata'] = 'tier-silver', | |||
['gold'] = 'tier-gold', ['ouro'] = 'tier-gold', | |||
['diamond'] = 'tier-diamond', ['diamante'] = 'tier-diamond' | |||
} | |||
if tierClass[tier:lower()] then | |||
html:addClass(tierClass[tier:lower()]) | |||
end | |||
return tostring(html) | |||
end | |||
return p | |||
Edição das 15h46min de 20 de julho de 2025
A documentação para este módulo pode ser criada em Módulo:Droflax/doc
local p = {}
function p.render(frame)
local args = frame:getParent().args
-- Datos básicos
local nome = args.nome or ''
local tier = args.tier or ''
local classe = args.classe or ''
local image = args.image or ''
-- Procesar habilidades
local habilidades = {}
for i = 1, 21 do
local hab = {
nome = args['hab' .. i .. '-nome'],
icon = args['hab' .. i .. '-icon'],
level = args['hab' .. i .. '-level'],
desc = args['hab' .. i .. '-desc'],
atr = args['hab' .. i .. '-atr'],
video = args['hab' .. i .. '-video']
}
if hab.nome and hab.nome ~= '' then
table.insert(habilidades, hab)
end
end
-- Procesar skins
local skins = {}
for i = 1, 11 do
local skin = {
image = args['skin' .. i .. '-image'],
banner = args['skin' .. i .. '-banner'],
tooltip = args['skin' .. i .. '-tooltip']
}
if skin.image and skin.image ~= '' then
table.insert(skins, skin)
end
end
-- Generar HTML
local html = mw.html.create('div')
:addClass('personaje-box')
:attr('id', 'personaje-' .. mw.uri.encode(nome))
-- Header
local header = html:tag('div'):addClass('personaje-header')
local topbar = header:tag('div'):addClass('personaje-topbar')
local nomeBox = topbar:tag('div'):addClass('personaje-nome-box')
nomeBox:tag('img')
:attr('src', '/images/6/63/Franky_ts_medal.png')
:addClass('topbar-icon')
local nomeCategory = nomeBox:tag('div'):addClass('personaje-nome-category')
nomeCategory:tag('div'):addClass('nome'):wikitext(nome)
nomeCategory:tag('div'):addClass('classes'):wikitext(classe)
header:tag('div')
:addClass('topbar-description')
:wikitext(nome .. ' (' .. tier .. ') é um personagem do tier ' .. tier:lower() .. '.')
-- Tabs
local tabs = header:tag('div'):addClass('personaje-tabs')
tabs:tag('button')
:addClass('tab-btn')
:attr('data-tab', 'arma')
:wikitext('Arma')
tabs:tag('button')
:addClass('tab-btn active')
:attr('data-tab', 'habilidades')
:wikitext('Habilidades')
tabs:tag('button')
:addClass('tab-btn')
:attr('data-tab', 'skins')
:wikitext('Skins')
-- Imagen del personaje
html:tag('img')
:addClass('art-personaje')
:attr('src', image)
:attr('alt', 'Arte del personaje')
-- Tab content: Habilidades
local habContent = html:tag('div')
:addClass('tab-content active')
:attr('id', 'habilidades')
-- Contenedor de cuadros (iconos de habilidades)
local cuadrosContainer = habContent:tag('div'):addClass('cuadros-container')
for i, hab in ipairs(habilidades) do
cuadrosContainer:tag('div')
:addClass('cuadro')
:attr('data-hab-index', i)
:attr('title', hab.nome)
:tag('img')
:attr('src', hab.icon)
:attr('alt', hab.nome)
:css('width', '100%')
:css('height', '100%')
:css('object-fit', 'cover')
end
local habContainer = habContent:tag('div'):addClass('habilidades-container')
-- Detalles de habilidad
local habDetails = habContainer:tag('div'):addClass('habilidades-details')
habDetails:tag('div'):addClass('descripcion-container')
-- Video container
habContainer:tag('div'):addClass('video-container')
-- Tab content: Skins
local skinsContent = html:tag('div')
:addClass('tab-content')
:attr('id', 'skins')
local cardSkins = skinsContent:tag('div'):addClass('card-skins')
cardSkins:tag('span')
:addClass('card-skins-title')
:wikitext('SKINS & SPOTLIGHTS')
local carouselWrapper = cardSkins:tag('div'):addClass('skins-carousel-wrapper')
carouselWrapper:tag('button')
:addClass('skins-arrow left')
:wikitext('«')
local carousel = carouselWrapper:tag('div'):addClass('skins-carousel')
for i, skin in ipairs(skins) do
local skinCard = carousel:tag('div'):addClass('skin-card')
skinCard:tag('img')
:addClass('skins--imageBanner')
:attr('src', skin.banner)
:attr('alt', 'banner')
skinCard:tag('img')
:addClass('skins--imageSkin')
:attr('src', skin.image)
:attr('alt', 'skin')
end
carouselWrapper:tag('button')
:addClass('skins-arrow right')
:wikitext('»')
-- Datos para el widget (JSON en data attributes)
local dataContainer = html:tag('script')
:attr('type', 'application/json')
:attr('id', 'personaje-data-' .. mw.uri.encode(nome))
local data = {
nome = nome,
tier = tier,
classe = classe,
image = image,
habilidades = habilidades,
skins = skins
}
dataContainer:wikitext(mw.text.jsonEncode(data))
-- CSS inline (o mejor referencia a MediaWiki:Common.css)
html:tag('style'):wikitext([[
.personaje-box {
padding: 16px;
color: #000;
font-family: 'Segoe UI', sans-serif;
width: 90%;
margin: auto;
position: relative;
user-select: none;
}
.personaje-topbar {
display: flex;
flex-direction: column;
align-items: flex-start;
padding: 8px 16px;
}
.personaje-nome-box {
display: flex;
align-items: center;
gap: 8px;
}
.topbar-icon {
width: 90px;
height: 90px;
object-fit: none;
background: #60dae2;
}
.nome {
font-size: 60px;
font-family: 'Orbitron', sans-serif;
font-weight: 900;
}
.topbar-description {
font-size: 16px;
margin-top: 6px;
background: #6AF3FB;
width: fit-content;
padding-inline: 16px;
border-radius: 0 10px 10px 0;
}
.personaje-tabs {
margin: 4px 0 4px 8px;
display: flex;
gap: 12px;
justify-content: flex-start;
}
.tab-btn {
padding: 8px 20px;
background: #333;
color: white;
border: none;
border-radius: 8px;
font-size: 20px;
cursor: pointer;
}
.tab-btn.active {
background: #156bc7;
font-weight: bold;
}
.tab-content {
display: none;
background: #26211cd6;
padding: 0 8px 8px;
}
.tab-content.active {
display: block;
}
.art-personaje {
width: 665px;
position: absolute;
right: 1rem;
top: 0.4rem;
z-index: 9;
}
.cuadros-container {
display: flex;
flex-wrap: nowrap;
gap: 10px;
width: 56%;
overflow-x: auto;
overflow-y: hidden;
padding: 10px 0 3px 1px;
margin-bottom: 6px;
}
.cuadro {
flex: 0 0 auto;
width: 50px;
height: 50px;
border-radius: 5px;
cursor: pointer;
transition: transform 0.2s, box-shadow 0.2s;
}
.cuadro.activo {
box-shadow: 0 0 10px 3px rgba(255, 255, 0, 0.5);
border: 1px solid #FFD700;
}
.habilidades-container {
display: flex;
gap: 20px;
}
.habilidades-details {
flex: 1;
display: flex;
flex-direction: column;
gap: 10px;
width: 50%;
justify-content: center;
}
.descripcion-container {
min-height: 25.1rem;
max-height: 50%;
padding: 4px 16px;
background: #26211C;
border-radius: 8px;
position: relative;
box-shadow: 0 0 7px rgb(255 255 255 / 82%), 0 0 5px rgb(255 255 255 / 96%);
color: #fff;
backdrop-filter: blur(2px);
}
.video-container {
width: 43%;
height: fit-content;
display: flex;
align-items: center;
justify-content: center;
background-color: #000;
align-self: center;
border-radius: 2%;
box-shadow: 0 0 7px rgb(255 255 255 / 82%), 0 0 5px rgb(255 255 255 / 96%);
}
.tier-diamond .personaje-header {
background: linear-gradient(145deg, rgba(160,250,255,0.2), rgba(80,180,200,0.5));
background-color: #4b8292;
box-shadow: inset 0 0 8px rgba(255,255,255,0.1), 0 0 15px rgba(100,255,255,0.25);
}
]])
-- Agregar clase de tier
local tierClass = {
['bronze'] = 'tier-bronze', ['bronce'] = 'tier-bronze',
['silver'] = 'tier-silver', ['prata'] = 'tier-silver',
['gold'] = 'tier-gold', ['ouro'] = 'tier-gold',
['diamond'] = 'tier-diamond', ['diamante'] = 'tier-diamond'
}
if tierClass[tier:lower()] then
html:addClass(tierClass[tier:lower()])
end
return tostring(html)
end
return p