Data User 0 Com.zoho.Notebook Files Untitled
Data User 0 Com.zoho.Notebook Files Untitled
DOCTYPE html>
<html lang="pt-BR">
<head>
<meta charset="UTF-8">
<script src="https://cdn.tailwindcss.com"></script>
<style>
*{
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
color: #2c3e50;
.container {
max-width: 1200px;
margin: 0 auto;
padding: 20px;
.header {
backdrop-filter: blur(10px);
border-radius: 15px;
padding: 30px;
text-align: center;
margin-bottom: 30px;
.header h1 {
color: #043451;
font-size: 2.5rem;
margin-bottom: 10px;
.header p {
color: #8f1133;
font-size: 1.1rem;
font-weight: 600;
.contact-info {
margin-top: 15px;
display: flex;
justify-content: center;
gap: 30px;
flex-wrap: wrap;
.contact-item {
color: #043451;
display: flex;
align-items: center;
gap: 8px;
font-weight: 500;
.main-content {
display: grid;
.form-section, .orcamento-summary {
backdrop-filter: blur(10px);
border-radius: 15px;
padding: 30px;
box-shadow: 0 8px 32px rgba(0, 0, 0, 0.15);
.orcamento-summary {
height: fit-content;
position: sticky;
top: 20px;
.form-group {
margin-bottom: 25px;
.form-group label {
display: block;
margin-bottom: 8px;
font-weight: 600;
color: #043451;
width: 100%;
font-size: 16px;
transition: all 0.3s ease;
outline: none;
border-color: #fc7016;
.btn {
color: white;
border: none;
padding: 12px 24px;
border-radius: 8px;
font-size: 16px;
font-weight: 600;
cursor: pointer;
transition: all 0.3s ease;
display: inline-flex;
align-items: center;
gap: 8px;
margin-right: 10px;
}
.btn:hover {
transform: translateY(-2px);
.btn-secondary {
.btn-success {
background: linear-gradient(135deg, #28a745 0%, #20c997 100%);
.checkbox-group {
display: grid;
gap: 15px;
margin-top: 15px;
}
.checkbox-item {
display: flex;
align-items: flex-start;
gap: 10px;
padding: 15px;
background: #f8f9fa;
border-radius: 8px;
cursor: pointer;
transition: all 0.3s ease;
.checkbox-item:hover {
background: #e9ecef;
border-color: #fc7016;
.checkbox-item input[type="checkbox"] {
width: 18px;
height: 18px;
margin-top: 2px;
.servico-config {
background: #f8f9fa;
border-radius: 8px;
padding: 20px;
margin-bottom: 15px;
border-left: 4px solid #fc7016;
.servico-header {
font-size: 1.2rem;
font-weight: 600;
color: #043451;
margin-bottom: 15px;
.summary-item {
display: flex;
justify-content: space-between;
align-items: center;
padding: 12px 0;
border-bottom: 1px solid #e9ecef;
.summary-total {
font-size: 1.3rem;
font-weight: 700;
color: #043451;
padding-top: 15px;
margin-top: 15px;
}
.step-indicator {
display: flex;
justify-content: center;
margin-bottom: 30px;
gap: 20px;
}
.step {
display: flex;
flex-direction: column;
align-items: center;
font-size: 14px;
}
.step.active {
color: white;
}
.step-number {
width: 40px;
height: 40px;
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
margin-bottom: 8px;
font-weight: 600;
.step.active .step-number {
background: #fc7016;
color: white;
.modal {
display: none;
position: fixed;
z-index: 1000;
left: 0;
top: 0;
width: 100%;
height: 100%;
background: rgba(0,0,0,0.5);
backdrop-filter: blur(5px);
.modal-content {
background: white;
margin: 5% auto;
padding: 30px;
border-radius: 15px;
width: 90%;
max-width: 600px;
.close {
color: #aaa;
float: right;
font-size: 28px;
font-weight: bold;
cursor: pointer;
.close:hover {
color: #8f1133;
.alert-warning {
background: #fff3cd;
padding: 15px;
border-radius: 8px;
margin-bottom: 20px;
.alert-warning strong {
color: #8f1133;
.config-section {
margin-bottom: 20px;
padding: 15px;
background: #fff;
border-radius: 8px;
.config-section h4 {
color: #043451;
margin-bottom: 10px;
font-size: 1.1rem;
}
.main-content {
grid-template-columns: 1fr;
}
.header h1 {
font-size: 2rem;
.contact-info {
flex-direction: column;
align-items: center;
gap: 15px;
}
</style>
</head>
<body>
<div class="container">
<div class="header">
<h1>Franco Romeu</h1>
<div class="contact-info">
<div class="contact-item">
<span> 📞 </span>
</div>
<div class="contact-item">
<span> ✉️</span>
<span>romeudifranco@gmail.com</span>
</div>
</div>
</div>
<div class="alert-warning">
Este valor será descontado do orçamento final. O preço final será definido após a visita té
</div>
<div class="step-indicator">
<div class="step-number">1</div>
<span>Medidas</span>
</div>
<span>Serviços</span>
</div>
<div class="step" id="step3">
<div class="step-number">3</div>
<span>Detalhes</span>
</div>
<span>Orçamento</span>
</div>
</div>
<div class="main-content">
<div class="form-section">
<div id="etapa1">
<h2>Informações Básicas</h2>
<div class="form-group">
<select id="ambiente">
<option value="cozinha">Cozinha</option>
<option value="banheiro">Banheiro</option>
<option value="quarto">Quarto</option>
<option value="sala">Sala</option>
<option value="escritorio">Escritório</option>
<option value="lavanderia">Lavanderia</option>
<option value="garagem">Garagem</option>
</select>
</div>
<div class="form-group">
<label for="metragem">Metragem (m²):</label>
</div>
<h2>Selecione os Serviços</h2>
</div>
</div>
<div id="configuracaoServicos">
</div>
</div>
</div>
<h2>Finalizar Orçamento</h2>
<div class="form-group">
</div>
<div class="form-group">
<label for="telefoneCliente">Telefone:</label>
<div class="form-group">
<label for="emailCliente">E-mail:</label>
</div>
<div class="form-group">
<label for="observacoes">Observações:</label>
</div>
<div style="margin-top: 30px;">
</div>
</div>
</div>
<div class="orcamento-summary">
<h3>Resumo do Orçamento</h3>
<div id="resumoServicos">
<p style="text-align: center; color: #666; margin: 20px 0;">
</p>
</div>
<div class="summary-total">
<div class="summary-item">
<span>Subtotal:</span>
</div>
<div class="summary-item">
<span>Visita Técnica:</span>
<span>R$ 99,00</span>
</div>
<div class="summary-item" style="border-top: 2px solid #fc7016; padding-top: 10px;">
<span><strong>Total:</strong></span>
<div class="summary-item">
<span>Entrada (10%):</span>
</div>
</div>
</div>
</div>
</div>
<div class="modal-content">
<div class="alert-warning">
</div>
<div id="detalhesOrcamento"></div>
<div style="margin-top: 20px; text-align: center;">
</div>
</div>
</div>
<script>
const catalogos = {
massa_corrida: {
preco_base: 25,
configuracoes: {
condicao_parede: {
opcoes: [
},
tipo_tinta: {
opcoes: [
}
},
pintura: {
nome: "Pintura",
unidade: "m²",
preco_base: 20,
configuracoes: {
condicao_superficie: {
opcoes: [
},
tipo_tinta: {
opcoes: [
{ nome: "Tinta Acrílica Padrão", adicional: 0 },
]
}
},
revestimento: {
nome: "Revestimento",
unidade: "m²",
preco_base: 60,
configuracoes: {
condicao_piso: {
},
tipo_revestimento: {
opcoes: [
{ nome: "Cerâmica Padrão", adicional: 0 },
]
}
},
forro_gesso: {
preco_base: 75,
configuracoes: {
condicao_teto: {
},
tipo_estrutura: {
opcoes: [
{ nome: "Laje de Concreto", adicional: 0 },
]
},
tipo_forro: {
opcoes: [
}
}
},
eletrica: {
unidade: "ponto",
preco_base: 45,
configuracoes: {
tipo_instalacao: {
opcoes: [
{ nome: "Ponto Novo Simples", adicional: 0 },
]
},
tipo_parede: {
opcoes: [
},
tipo_fio: {
nome: "Tipo de Fio",
opcoes: [
}
}
},
instalacao_pia: {
nome: "Instalação de Pia",
unidade: "item",
preco_base: 180,
configuracoes: {
tipo_cuba: {
nome: "Tipo de Cuba",
opcoes: [
},
tipo_torneira: {
opcoes: [
{ nome: "Torneira Fria", adicional: 0 },
}
}
},
drywall: {
nome: "Drywall",
unidade: "m²",
preco_base: 80,
configuracoes: {
tipo_estrutura: {
opcoes: [
{ nome: "Estrutura Galvanizada", adicional: 0 },
},
tipo_chapa: {
opcoes: [
}
};
// Estado da aplicação
let etapaAtual = 1;
// Funções principais
function proximaEtapa(novaEtapa) {
if (etapaAtual === 1) {
if (!ambiente || !metragem) {
return;
}
}
return;
}
document.getElementById(`etapa${etapaAtual}`).style.display = 'none';
document.getElementById(`step${etapaAtual}`).classList.remove('active');
etapaAtual = novaEtapa;
document.getElementById(`etapa${etapaAtual}`).style.display = 'block';
document.getElementById(`step${etapaAtual}`).classList.add('active');
if (etapaAtual === 2) {
carregarServicos();
gerarConfiguracaoServicos();
function voltarEtapa(novaEtapa) {
document.getElementById(`etapa${etapaAtual}`).style.display = 'none';
document.getElementById(`step${etapaAtual}`).classList.remove('active');
etapaAtual = novaEtapa;
document.getElementById(`etapa${etapaAtual}`).style.display = 'block';
document.getElementById(`step${etapaAtual}`).classList.add('active');
function toggleServico(servicoKey) {
if (checkbox.checked) {
Object.keys(servico.configuracoes).forEach(configKey => {
configuracoes[configKey] = 0; // Primeira opção
});
servicosSelecionados.push({
id: servicoKey,
configuracoes: configuracoes,
quantidade: 1
});
} else {
atualizarResumo();
function carregarServicos() {
container.innerHTML = '';
Object.keys(catalogos).forEach(key => {
const servico = catalogos[key];
div.className = 'checkbox-item';
div.innerHTML = `
<strong>${servico.nome}</strong><br>
</label>
`;
container.appendChild(div);
});
function gerarConfiguracaoServicos() {
const container = document.getElementById('configuracaoServicos');
container.innerHTML = '';
servicosSelecionados.forEach((servicoSelecionado, index) => {
div.className = 'servico-config';
configHTML += `
<div class="form-group">
</div>
`;
configHTML += `
<div class="form-group">
<label for="config_${index}_${configKey}">${config.nome}:</label>
<select id="config_${index}_${configKey}"
${config.opcoes.map((opcao, i) => `
</option>
`).join('')}
</select>
</div>
`;
});
div.innerHTML = configHTML;
container.appendChild(div);
});
servicosSelecionados[index].quantidade = parseFloat(novaQuantidade);
atualizarResumo();
servicosSelecionados[index].configuracoes[configKey] = opcaoIndex;
atualizarResumo();
function atualizarResumo() {
if (servicosSelecionados.length === 0) {
return;
let subtotal = 0;
servicosSelecionados.forEach(servicoSelecionado => {
Object.keys(servico.configuracoes).forEach(configKey => {
precoServico += adicional;
});
subtotal += valorServico;
html += `
<div class="summary-item">
<span>${servico.nome} (${quantidade} ${servico.unidade})</span>
</div>
`;
});
container.innerHTML = html;
function finalizarOrcamento() {
return;
let resumoHTML = `
<p><strong>Nome:</strong> ${nome}</p>
<p><strong>Telefone:</strong> ${telefone}</p>
<p><strong>E-mail:</strong> ${email}</p>
`;
let subtotal = 0;
servicosSelecionados.forEach(servicoSelecionado => {
Object.keys(servico.configuracoes).forEach(configKey => {
precoServico += adicional;
});
subtotal += valorServico;
resumoHTML += `
`;
});
resumoHTML += `
</div>
</p>
`;
document.getElementById('detalhesOrcamento').innerHTML = resumoHTML;
document.getElementById('modalSucesso').style.display = 'block';
function fecharModal() {
document.getElementById('modalSucesso').style.display = 'none';
function gerarPDF() {
}
function novoOrcamento() {
// Resetar o formulário
document.getElementById('etapa1').style.display = 'block';
document.getElementById('etapa2').style.display = 'none';
document.getElementById('etapa3').style.display = 'none';
document.getElementById('etapa4').style.display = 'none';
document.getElementById('step1').classList.add('active');
document.getElementById('step2').classList.remove('active');
document.getElementById('step3').classList.remove('active');
document.getElementById('step4').classList.remove('active');
etapaAtual = 1;
servicosSelecionados = [];
// Limpar campos
document.getElementById('ambiente').value = '';
document.getElementById('metragem').value = '';
document.getElementById('nomeCliente').value = '';
document.getElementById('telefoneCliente').value = '';
document.getElementById('emailCliente').value = '';
document.getElementById('observacoes').value = '';
// Resetar checkboxes
checkboxes.forEach(checkbox => {
checkbox.checked = false;
});
// Resetar resumo
document.getElementById('resumoServicos').innerHTML =
'<p style="text-align: center; color: #666; margin: 20px 0;">Selecione os serviços para ver
document.getElementById('valorSubtotal').textContent = 'R$ 0,00';
// Fechar modal
fecharModal();
// Inicializar a página
document.addEventListener('DOMContentLoaded', function() {
carregarServicos();
});
</script>
</body>
</html>