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

De Wiki Gla
Ir para navegação Ir para pesquisar
(Criou página com '.')
 
Linha 1: Linha 1:
.
<div id="widget-cozinha">
  <header>
    <h3>Carrinho de Compras</h3>
  </header>
 
  <section id="carrinho">
    <div id="carrinho-container"></div>
    <div id="carrinho-total" class="carrinho-total"></div>
   
    <div class="acoes">
      <button id="esvaziar-carrinho" class="acao-carrinho">Esvaziar Carrinho</button>
      <button id="mostrar-total" class="acao-carrinho">Mostrar Total</button>
    </div>
   
    <div id="resumo-total" class="resumo-total"></div>
  </section>
 
  <section id="lista-receitas" class="receitas-container">
    <!-- Os cards de receita serão inseridos aqui via JavaScript -->
  </section>
</div>
 
<style>
  /* CSS centralizado para a widget */
  #widget-cozinha {
    font-family: sans-serif;
    background-color: #f7f7f7;
    padding: 16px;
    border: 1px solid #ddd;
    border-radius: 8px;
    max-width: 1000px;
    margin: auto;
  }
 
  #widget-cozinha header h3 {
    margin-bottom: 10px;
    color: #333;
    text-align: center;
  }
 
  .acoes {
    margin-top: 20px;
    display: flex;
    gap: 10px;
    justify-content: center;
  }
 
  .acao-carrinho {
    padding: 8px 16px;
    background-color: #4393ff;
    color: #fff;
    border: none;
    border-radius: 4px;
    cursor: pointer;
  }
 
  .acao-carrinho:hover {
    background-color: #3275c7;
  }
 
  .receitas-container {
    display: flex;
    flex-wrap: wrap;
    gap: 16px;
    margin-top: 20px;
  }
 
  /* Demais estilos para os cards e modais podem ser mantidos com ajustes para retirar emojis */
  .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;
    position: relative;
  }
 
  .remover-item {
    background: none;
    border: none;
    cursor: pointer;
    font-size: 14px;
  }
 
  /* Resto do CSS conforme a necessidade */
</style>
 
<script>
  // Variáveis globais
  let receitas = {};
  const carrinho = {};
 
  document.addEventListener('DOMContentLoaded', function() {
    initWidget();
   
    document.getElementById('esvaziar-carrinho').addEventListener('click', esvaziarCarrinho);
    document.getElementById('mostrar-total').addEventListener('click', mostrarTotal);
  });
 
  async function initWidget() {
    try {
      const response = await fetch('https://wiki.gla.com.br/index.php?title=Receitas.json&action=raw');
      const data = await response.json();
      receitas = processarReceitas(data);
      renderizarReceitas();
    } catch (error) {
      console.error('Erro ao carregar receitas:', error);
      alert('Não foi possível carregar as receitas. Tente novamente mais tarde.');
    }
  }
 
  function processarReceitas(data) {
    return {
      baratie: Object.entries(data.baratie).map(([id, item]) => ({
        id,
        nome: item.nome,
        preco: item.cost,
        img: item.thumb,
        ingredientes: item.ingredients || [],
        lvl: item.lvl,
        tempo: item.time,
        descricao: item.description
      })),
      alianca: Object.entries(data.alianca).map(([id, item]) => ({
        id,
        nome: item.nome,
        preco: item.cost,
        img: item.thumb,
        ingredientes: item.ingredients || [],
        lvl: item.lvl,
        tempo: item.time,
        descricao: item.description
      }))
    };
  }
 
  function renderizarReceitas() {
    renderizarSecao('baratie');
    renderizarSecao('alianca');
  }
 
  function renderizarSecao(secao) {
    const container = document.getElementById(`receitas-${secao}`) || document.getElementById('lista-receitas');
    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" />
        <div class="receita-nome">${receita.nome}</div>
        <div class="receita-preco">${receita.preco.toLocaleString()}</div>
        <button onclick="adicionarAoCarrinho('${receita.id}')">Adicionar</button>
      `;
      container.appendChild(card);
    });
  }
 
  // Outras funções de gerenciamento do carrinho, modal e cálculos seguem de forma similar, apenas removendo ou substituindo os emojis.
  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 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" />
        <div class="info-carrinho">
          <div class="nome-item">${item.nome}</div>
          <div class="controle-quantidade">
            <button onclick="alterarQuantidade('${id}', -1)">−</button>
            <input type="number" value="${item.quantidade}" min="0" onchange="atualizarQuantidadeManual('${id}', event)">
            <button onclick="alterarQuantidade('${id}', 1)">+</button>
          </div>
        </div>
        <div class="subtotal">${subtotal.toLocaleString()}</div>
        <button class="remover-item" onclick="removerDoCarrinho('${id}')">Remover</button>
      `;
      container.appendChild(itemDiv);
    }
    document.getElementById('carrinho-total').innerHTML = total > 0
      ? `Total: ${total.toLocaleString()}`
      : '';
  }
 
  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 removerDoCarrinho(id) {
    delete carrinho[id];
    renderizarCarrinho();
  }
 
  function esvaziarCarrinho() {
    Object.keys(carrinho).forEach(id => delete carrinho[id]);
    renderizarCarrinho();
  }
 
  function mostrarTotal() {
    // Implementação similar para calcular e exibir os ingredientes totais necessários
    // usando um layout organizado na seção "resumo-total"
  }
 
  function mostrarModalReceita(button) {
    const descricao = decodeURIComponent(button.getAttribute('data-descricao'));
    const lvl = button.getAttribute('data-lvl');
    const tempo = button.getAttribute('data-tempo');
    const descricaoFormatada = descricao.replace(/\n/g, '<br>').replace(/Tempo de recarga/g, '<br><strong>Tempo de recarga</strong>');
   
    const modalHTML = `
      <div class="modal-overlay active" onclick="fecharModal(event)">
        <div class="modal-content" onclick="event.stopPropagation()">
          <button class="close-modal" onclick="fecharModal(event)">×</button>
          <p><strong>Nível:</strong> ${lvl}</p>
          <p><strong>Tempo de preparo:</strong> ${tempo} min</p>
          <p><strong>Descrição:</strong><br>${descricaoFormatada}</p>
        </div>
      </div>
    `;
    document.body.insertAdjacentHTML('beforeend', modalHTML);
    document.addEventListener('keydown', (e) => e.key === 'Escape' && fecharModal(e));
  }
 
  function fecharModal(event) {
    event.preventDefault();
    const modal = document.querySelector('.modal-overlay');
    if (modal) {
      modal.classList.remove('active');
      setTimeout(() => modal.remove(), 300);
    }
  }
</script>

Edição das 23h41min de 9 de abril de 2025

 <header>

Carrinho de Compras

 </header>
 
 <section id="carrinho">
     <button id="esvaziar-carrinho" class="acao-carrinho">Esvaziar Carrinho</button>
     <button id="mostrar-total" class="acao-carrinho">Mostrar Total</button>
 </section>
 
 <section id="lista-receitas" class="receitas-container">
 </section>

<style>

 /* CSS centralizado para a widget */
 #widget-cozinha {
   font-family: sans-serif;
   background-color: #f7f7f7;
   padding: 16px;
   border: 1px solid #ddd;
   border-radius: 8px;
   max-width: 1000px;
   margin: auto;
 }
 
 #widget-cozinha header h3 {
   margin-bottom: 10px;
   color: #333;
   text-align: center;
 }
 
 .acoes {
   margin-top: 20px;
   display: flex;
   gap: 10px;
   justify-content: center;
 }
 
 .acao-carrinho {
   padding: 8px 16px;
   background-color: #4393ff;
   color: #fff;
   border: none;
   border-radius: 4px;
   cursor: pointer;
 }
 
 .acao-carrinho:hover {
   background-color: #3275c7;
 }
 
 .receitas-container {
   display: flex;
   flex-wrap: wrap;
   gap: 16px;
   margin-top: 20px;
 }
 
 /* Demais estilos para os cards e modais podem ser mantidos com ajustes para retirar emojis */
 .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;
   position: relative;
 }
 
 .remover-item {
   background: none;
   border: none;
   cursor: pointer;
   font-size: 14px;
 }
 
 /* Resto do CSS conforme a necessidade */

</style>

<script>

 // Variáveis globais
 let receitas = {};
 const carrinho = {};
 document.addEventListener('DOMContentLoaded', function() {
   initWidget();
   
   document.getElementById('esvaziar-carrinho').addEventListener('click', esvaziarCarrinho);
   document.getElementById('mostrar-total').addEventListener('click', mostrarTotal);
 });
 
 async function initWidget() {
   try {
     const response = await fetch('https://wiki.gla.com.br/index.php?title=Receitas.json&action=raw');
     const data = await response.json();
     receitas = processarReceitas(data);
     renderizarReceitas();
   } catch (error) {
     console.error('Erro ao carregar receitas:', error);
     alert('Não foi possível carregar as receitas. Tente novamente mais tarde.');
   }
 }
 
 function processarReceitas(data) {
   return {
     baratie: Object.entries(data.baratie).map(([id, item]) => ({
       id,
       nome: item.nome,
       preco: item.cost,
       img: item.thumb,
       ingredientes: item.ingredients || [],
       lvl: item.lvl,
       tempo: item.time,
       descricao: item.description
     })),
     alianca: Object.entries(data.alianca).map(([id, item]) => ({
       id,
       nome: item.nome,
       preco: item.cost,
       img: item.thumb,
       ingredientes: item.ingredients || [],
       lvl: item.lvl,
       tempo: item.time,
       descricao: item.description
     }))
   };
 }
 
 function renderizarReceitas() {
   renderizarSecao('baratie');
   renderizarSecao('alianca');
 }
 
 function renderizarSecao(secao) {
   const container = document.getElementById(`receitas-${secao}`) || document.getElementById('lista-receitas');
   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" />
${receita.nome}
${receita.preco.toLocaleString()}
       <button onclick="adicionarAoCarrinho('${receita.id}')">Adicionar</button>
     `;
     container.appendChild(card);
   });
 }
 
 // Outras funções de gerenciamento do carrinho, modal e cálculos seguem de forma similar, apenas removendo ou substituindo os emojis.
 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 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" />
${item.nome}
           <button onclick="alterarQuantidade('${id}', -1)">−</button>
           <input type="number" value="${item.quantidade}" min="0" onchange="atualizarQuantidadeManual('${id}', event)">
           <button onclick="alterarQuantidade('${id}', 1)">+</button>
${subtotal.toLocaleString()}
       <button class="remover-item" onclick="removerDoCarrinho('${id}')">Remover</button>
     `;
     container.appendChild(itemDiv);
   }
   document.getElementById('carrinho-total').innerHTML = total > 0
     ? `Total: ${total.toLocaleString()}`
     : ;
 }
 
 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 removerDoCarrinho(id) {
   delete carrinho[id];
   renderizarCarrinho();
 }
 
 function esvaziarCarrinho() {
   Object.keys(carrinho).forEach(id => delete carrinho[id]);
   renderizarCarrinho();
 }
 
 function mostrarTotal() {
   // Implementação similar para calcular e exibir os ingredientes totais necessários
   // usando um layout organizado na seção "resumo-total"
 }
 
 function mostrarModalReceita(button) {
   const descricao = decodeURIComponent(button.getAttribute('data-descricao'));
   const lvl = button.getAttribute('data-lvl');
   const tempo = button.getAttribute('data-tempo');
   const descricaoFormatada = descricao.replace(/\n/g, '
').replace(/Tempo de recarga/g, '
Tempo de recarga'); const modalHTML = `
   `;
   document.body.insertAdjacentHTML('beforeend', modalHTML);
   document.addEventListener('keydown', (e) => e.key === 'Escape' && fecharModal(e));
 }
 
 function fecharModal(event) {
   event.preventDefault();
   const modal = document.querySelector('.modal-overlay');
   if (modal) {
     modal.classList.remove('active');
     setTimeout(() => modal.remove(), 300);
   }
 }

</script>