Mudanças entre as edições de "Widget:Droflax"
| Linha 21: | Linha 21: | ||
const data = await response.json(); | const data = await response.json(); | ||
// Transformar la estructura | // Transformar la estructura incluyendo lvl, time y description | ||
receitas = { | receitas = { | ||
baratie: Object.entries(data.baratie).map(([id, item]) => ({ | baratie: Object.entries(data.baratie).map(([id, item]) => ({ | ||
| Linha 28: | Linha 28: | ||
preco: item.cost, | preco: item.cost, | ||
img: item.thumb, | img: item.thumb, | ||
ingredientes: item.ingredients || [] // | ingredientes: item.ingredients || [], | ||
lvl: item.lvl, // Nuevo campo | |||
tempo: item.time, // Nuevo campo | |||
descricao: item.description // Nuevo campo | |||
})), | })), | ||
alianca: Object.entries(data.alianca).map(([id, item]) => ({ | alianca: Object.entries(data.alianca).map(([id, item]) => ({ | ||
| Linha 35: | Linha 38: | ||
preco: item.cost, | preco: item.cost, | ||
img: item.thumb, | img: item.thumb, | ||
ingredientes: item.ingredients || [] | ingredientes: item.ingredients || [], | ||
lvl: item.lvl, // Nuevo campo | |||
tempo: item.time, // Nuevo campo | |||
descricao: item.description // Nuevo campo | |||
})) | })) | ||
}; | }; | ||
| Linha 62: | Linha 68: | ||
card.className = 'receita-card'; | card.className = 'receita-card'; | ||
card.innerHTML = ` | card.innerHTML = ` | ||
<button class="info-btn" onclick="mostrarModalReceita(this)" | |||
data-descricao="${encodeURIComponent(receita.descricao)}" | |||
data-lvl="${receita.lvl}" | |||
data-tempo="${receita.tempo}">i</button> | |||
<img src="${receita.img}" width="64" height="64" /> | <img src="${receita.img}" width="64" height="64" /> | ||
<div class="receita-nome">${receita.nome}</div> | <div class="receita-nome">${receita.nome}</div> | ||
<div class="receita-preco">${ | <div class="receita-preco">${receita.preco.toLocaleString()} <img src="${berryGif}" alt="Berry" width="25" height="25" style="transform: translateY(-1px);"/></div> | ||
<button onclick="adicionarAoCarrinho('${receita.id}')">➕</button> | <button onclick="adicionarAoCarrinho('${secao}', '${receita.id}')">➕</button> | ||
`; | `; | ||
container.appendChild(card); | container.appendChild(card); | ||
}); | }); | ||
} | |||
function mostrarModalReceita(button) { | |||
const descricao = decodeURIComponent(button.getAttribute('data-descricao')); | |||
const lvl = button.getAttribute('data-lvl'); | |||
const tempo = button.getAttribute('data-tempo'); | |||
const modalHTML = ` | |||
<div class="modal-overlay active" onclick="cerrarModal(event)"> | |||
<div class="modal-content" onclick="event.stopPropagation()"> | |||
<button class="close-modal" onclick="cerrarModal(event)">×</button> | |||
<p><strong>Descrição:</strong> ${descricao.replace(/\n/g, '<br>')}</p> | |||
<p><strong>Nível:</strong> ${lvl}</p> | |||
<p><strong>Tempo:</strong> ${tempo} min</p> | |||
</div> | |||
</div> | |||
`; | |||
document.body.insertAdjacentHTML('beforeend', modalHTML); | |||
document.addEventListener('keydown', (e) => e.key === 'Escape' && cerrarModal(e)); | |||
} | |||
// Función cerrarModal (igual que antes) | |||
function cerrarModal(event) { | |||
event.preventDefault(); | |||
const modal = document.querySelector('.modal-overlay'); | |||
if (modal) { | |||
modal.classList.remove('active'); | |||
setTimeout(() => modal.remove(), 300); | |||
} | |||
} | } | ||
| Linha 259: | Linha 299: | ||
transition: transform 0.2s; | transition: transform 0.2s; | ||
user-select: none; | user-select: none; | ||
position: relative; | |||
} | |||
.modal-overlay { | |||
position: fixed; | |||
top: 0; | |||
left: 0; | |||
right: 0; | |||
bottom: 0; | |||
background-color: rgba(0, 0, 0, 0.5); | |||
display: flex; | |||
justify-content: center; | |||
align-items: center; | |||
z-index: 1000; | |||
opacity: 0; | |||
visibility: hidden; | |||
transition: all 0.3s ease; | |||
} | |||
.modal-overlay.active { | |||
opacity: 1; | |||
visibility: visible; | |||
} | |||
.modal-content { | |||
background-color: white; | |||
padding: 20px; | |||
border-radius: 8px; | |||
width: 300px; | |||
position: relative; | |||
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2); | |||
} | |||
.close-modal { | |||
position: absolute; | |||
top: 10px; | |||
right: 10px; | |||
font-size: 20px; | |||
cursor: pointer; | |||
background: none; | |||
border: none; | |||
} | |||
.info-btn { | |||
position: absolute; | |||
top: 5px; | |||
right: 5px; | |||
background: #4393ff; | |||
color: white; | |||
border: none; | |||
border-radius: 50%; | |||
width: 20px; | |||
height: 20px; | |||
font-size: 12px; | |||
cursor: pointer; | |||
display: flex; | |||
justify-content: center; | |||
align-items: center; | |||
} | } | ||
Edição das 21h42min de 9 de abril de 2025
🛒 Carrinho de Compras
<button id="esvaziar-carrinho" class="acao-carrinho">Esvaziar Carrinho</button> <button id="mostrar-total" class="acao-carrinho">Mostrar Total</button>
<script> // Carrinho const carrinho = {}; let receitas = {}; const berryGif = "https://wiki.gla.com.br/images/thumb/d/d1/Berrynewgif.gif/32px-Berrynewgif.gif";
// Función para cargar las recetas desde el JSON async function cargarReceitas() {
try {
const response = await fetch('https://wiki.gla.com.br/index.php?title=Receitas.json&action=raw');
const data = await response.json();
// Transformar la estructura incluyendo lvl, time y description
receitas = {
baratie: Object.entries(data.baratie).map(([id, item]) => ({
id,
nome: item.nome,
preco: item.cost,
img: item.thumb,
ingredientes: item.ingredients || [],
lvl: item.lvl, // Nuevo campo
tempo: item.time, // Nuevo campo
descricao: item.description // Nuevo campo
})),
alianca: Object.entries(data.alianca).map(([id, item]) => ({
id,
nome: item.nome,
preco: item.cost,
img: item.thumb,
ingredientes: item.ingredients || [],
lvl: item.lvl, // Nuevo campo
tempo: item.time, // Nuevo campo
descricao: item.description // Nuevo campo
}))
};
renderizarReceitas();
} catch (error) {
console.error('Error al cargar las receitas:', error);
alert('No se pudieron cargar las receitas. Por favor, inténtalo más tarde.');
}
}
// Renderizar receitas function renderizarReceitas() {
renderizarSecao('baratie');
renderizarSecao('alianca');
}
function renderizarSecao(secao) {
const container = document.getElementById(`receitas-${secao}`);
if (!container) return;
container.innerHTML = ;
receitas[secao].forEach(receita => {
const card = document.createElement('div');
card.className = 'receita-card';
card.innerHTML = `
<button class="info-btn" onclick="mostrarModalReceita(this)"
data-descricao="${encodeURIComponent(receita.descricao)}"
data-lvl="${receita.lvl}"
data-tempo="${receita.tempo}">i</button>
<img src="${receita.img}" width="64" height="64" />
<button onclick="adicionarAoCarrinho('${secao}', '${receita.id}')">➕</button>
`;
container.appendChild(card);
});
}
function mostrarModalReceita(button) {
const descricao = decodeURIComponent(button.getAttribute('data-descricao'));
const lvl = button.getAttribute('data-lvl');
const tempo = button.getAttribute('data-tempo');
const modalHTML = `
`;
document.body.insertAdjacentHTML('beforeend', modalHTML);
document.addEventListener('keydown', (e) => e.key === 'Escape' && cerrarModal(e));
}
// Función cerrarModal (igual que antes) function cerrarModal(event) {
event.preventDefault();
const modal = document.querySelector('.modal-overlay');
if (modal) {
modal.classList.remove('active');
setTimeout(() => modal.remove(), 300);
}
}
// Funções do carrinho function adicionarAoCarrinho(id) {
const receita = encontrarReceita(id); if (!receita) return;
if (!carrinho[id]) {
carrinho[id] = { ...receita, quantidade: 1 };
} else {
carrinho[id].quantidade++;
}
renderizarCarrinho();
}
function encontrarReceita(id) {
for (const secao in receitas) {
const receita = receitas[secao].find(r => r.id === id);
if (receita) return receita;
}
return null;
}
function alterarQuantidade(id, alteracao) {
if (alteracao === 100) {
carrinho[id].quantidade = 100;
} else {
carrinho[id].quantidade += alteracao;
}
if (carrinho[id].quantidade <= 0) {
delete carrinho[id];
}
renderizarCarrinho();
}
function atualizarQuantidadeManual(id, event) {
const novoValor = parseInt(event.target.value);
if (!isNaN(novoValor) && novoValor >= 0) {
if (novoValor === 0) {
delete carrinho[id];
} else {
carrinho[id].quantidade = novoValor;
}
renderizarCarrinho();
}
}
function esvaziarCarrinho() {
for (const id in carrinho) {
delete carrinho[id];
}
renderizarCarrinho();
const detalhesContainer = document.getElementById('detalhes-carrinho');
if (detalhesContainer) {
detalhesContainer.innerHTML = ;
}
}
function mostrarTotal() {
let detalhesContainer = document.getElementById('detalhes-carrinho');
const resumoTotal = document.getElementById('resumo-total');
if (!detalhesContainer) {
detalhesContainer = document.createElement('div');
detalhesContainer.id = 'detalhes-carrinho';
detalhesContainer.style.marginTop = '20px';
resumoTotal.appendChild(detalhesContainer);
} else {
detalhesContainer.innerHTML = ;
}
detalhesContainer.innerHTML += '
📦 Ingredientes Totais Necessários:
';
// Crear un contenedor para los ingredientes en horizontal
const ingredientesContainer = document.createElement('div');
ingredientesContainer.style.display = 'flex';
ingredientesContainer.style.flexWrap = 'wrap'; // Para que no se desborden si son muchos
ingredientesContainer.style.gap = '10px'; // Espacio entre los items
for (const id in carrinho) {
const item = carrinho[id];
// Usar ingredientes directamente del objeto `item`, que ya tiene `ingredientes` if (!item.ingredientes || item.ingredientes.length === 0) continue;
const ingredientesMultiplicados = {};
item.ingredientes.forEach(([nome, quantidade]) => {
if (!ingredientesMultiplicados[nome]) ingredientesMultiplicados[nome] = 0;
ingredientesMultiplicados[nome] += quantidade * item.quantidade;
});
const receitaDiv = document.createElement('div');
receitaDiv.className = 'detalhe-receita';
receitaDiv.style.border = '1px solid #ccc';
receitaDiv.style.padding = '10px';
receitaDiv.style.borderRadius = '8px';
receitaDiv.style.backgroundColor = '#fff';
receitaDiv.style.width = '250px'; // Establecer un tamaño adecuado para cada receta
receitaDiv.innerHTML = `
${item.quantidade}x ${item.nome}
<img src="${item.img}" width="64" height="64" style="display: block; margin-bottom: 10px;" />
🥣 Ingredientes:
${Object.entries(ingredientesMultiplicados).map(([nome, qtd]) => `
`).join()}
`;
ingredientesContainer.appendChild(receitaDiv); }
detalhesContainer.appendChild(ingredientesContainer);
}
function calcularTotal() {
return Object.values(carrinho).reduce((sum, item) => sum + (item.preco * item.quantidade), 0);
}
function renderizarCarrinho() {
const container = document.getElementById('carrinho-container');
container.innerHTML = ;
let total = 0;
for (const id in carrinho) {
const item = carrinho[id];
const subtotal = item.preco * item.quantidade;
total += subtotal;
const itemDiv = document.createElement('div');
itemDiv.className = 'item-carrinho';
itemDiv.innerHTML = `
<img src="${item.img}" width="40" height="40" />
<button onclick="alterarQuantidade('${id}', -1)">−</button>
<input type="number" value="${item.quantidade}" min="0"
onchange="atualizarQuantidadeManual('${id}', event)">
<button onclick="alterarQuantidade('${id}', 1)">+</button>
<button class="btn-100" onclick="alterarQuantidade('${id}', 100)">x100</button>
<button class="remover-item" onclick="removerDoCarrinho('${id}')">🗑️</button>
`;
container.appendChild(itemDiv);
}
document.getElementById('carrinho-total').innerHTML = total > 0
? `Total: ${total.toLocaleString()} <img src="${berryGif}" alt="Berry" width="25" height="25" style="transform: translateY(-1px);" />`
: ;
}
function removerDoCarrinho(id) {
delete carrinho[id]; renderizarCarrinho();
}
// Event listeners document.getElementById('esvaziar-carrinho').addEventListener('click', esvaziarCarrinho); document.getElementById('mostrar-total').addEventListener('click', mostrarTotal);
// CSS
document.head.insertAdjacentHTML('beforeend', `
<style>
.receitas-container {
display: flex;
flex-wrap: wrap;
gap: 16px;
margin-bottom: 24px;
}
.nome-item, .subtotal{
user-select: none;
}
.receita-card {
width: 150px;
text-align: center;
border: 1px solid #ccc;
border-radius: 8px;
padding: 8px;
background-color: #fff;
box-shadow: 2px 2px 4px rgba(0,0,0,0.1);
transition: transform 0.2s;
user-select: none;
position: relative;
}
.modal-overlay {
position: fixed;
top: 0;
left: 0;
right: 0;
bottom: 0;
background-color: rgba(0, 0, 0, 0.5);
display: flex;
justify-content: center;
align-items: center;
z-index: 1000;
opacity: 0;
visibility: hidden;
transition: all 0.3s ease;
}
.modal-overlay.active {
opacity: 1;
visibility: visible;
}
.modal-content {
background-color: white;
padding: 20px;
border-radius: 8px;
width: 300px;
position: relative;
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2);
}
.close-modal {
position: absolute;
top: 10px;
right: 10px;
font-size: 20px;
cursor: pointer;
background: none;
border: none;
}
.info-btn {
position: absolute;
top: 5px;
right: 5px;
background: #4393ff;
color: white;
border: none;
border-radius: 50%;
width: 20px;
height: 20px;
font-size: 12px;
cursor: pointer;
display: flex;
justify-content: center;
align-items: center;
}
.receita-card:hover {
transform: scale(1.05);
}
.receita-nome {
font-weight: bold;
margin: 4px 0;
min-height: 3em; /* força ocupar duas linhas mesmo se o texto for curto */
line-height: 1.5em;
display: flex;
align-items: center;
justify-content: center;
text-align: center;
}
.receita-preco {
margin-bottom: 6px;
}
.item-carrinho {
display: flex;
align-items: center;
gap: 12px;
padding: 8px;
border: 1px solid #ccc;
border-radius: 8px;
margin-bottom: 8px;
width: 20.5%;
margin-right: 1%;
}
.info-carrinho {
flex: 1;
}
.controle-quantidade {
display: flex;
align-items: center;
gap: 4px;
margin-top: 4px;
}
.controle-quantidade input {
width: 50px;
text-align: center;
padding: 2px;
}
.controle-quantidade button {
width: 24px;
height: 24px;
}
.btn-100 {
width: auto !important;
padding: 0 4px;
margin-left: 4px;
font-size: 12px;
}
.remover-item {
background: none;
border: none;
cursor: pointer;
font-size: 16px;
}
.ingredientes-grid {
display: grid;
grid-template-columns: repeat(2, 1fr); /* Fuerza 2 columnas */
gap: 8px;
margin-top: 5px;
margin-bottom: 10px;
}
.ingrediente-item {
background-color: #f9f9f9;
border: 1px solid #ddd;
border-radius: 4px;
padding: 6px 8px;
font-size: 14px;
text-align: center;
white-space: normal;
overflow: hidden;
text-overflow: unset;
overflow-wrap: break-word;
align-content: center;
}
.acao-carrinho {
padding: 8px 16px;
background-color: #4393ff;
color: white;
border: none;
border-radius: 4px;
cursor: pointer;
}
.acao-carrinho:hover {
background-color: #3275c7;
}
#carrinho-container {
display: flex;
flex-direction: row;
flex-wrap: wrap;
}
.detalhe-receita ul {
padding-left: 20px;
}
.detalhe-receita li {
margin-bottom: 3px;
}
.detalhe-receita {
width: 16%;
justify-items: anchor-center;
}
</style> `);
// Cargar las recetas al iniciar document.addEventListener('DOMContentLoaded', cargarReceitas); </script>