feat: Add instructions for local development and deployment

Updates README.md with clear steps for running the AI Studio app locally, including prerequisites and commands.
Introduces a .env.example file to guide users on API key configuration.
Adds a .gitignore file to prevent unnecessary files from being committed.
Updates asset files (images) with new metadata.
This commit is contained in:
cauefaleiros
2026-04-02 14:28:00 -03:00
parent 7a99d85283
commit 5e29b80159
17 changed files with 443 additions and 8 deletions

9
.env.example Normal file
View File

@@ -0,0 +1,9 @@
# GEMINI_API_KEY: Required for Gemini AI API calls.
# AI Studio automatically injects this at runtime from user secrets.
# Users configure this via the Secrets panel in the AI Studio UI.
GEMINI_API_KEY="MY_GEMINI_API_KEY"
# APP_URL: The URL where this applet is hosted.
# AI Studio automatically injects this at runtime with the Cloud Run service URL.
# Used for self-referential links, OAuth callbacks, and API endpoints.
APP_URL="MY_APP_URL"

8
.gitignore vendored Normal file
View File

@@ -0,0 +1,8 @@
node_modules/
build/
dist/
coverage/
.DS_Store
*.log
.env*
!.env.example

View File

@@ -1,11 +1,20 @@
<div align="center">
<img width="1200" height="475" alt="GHBanner" src="https://github.com/user-attachments/assets/0aa67016-6eaf-458a-adb2-6e31a0763ed6" />
<h1>Built with AI Studio</h2>
<p>The fastest path from prompt to production with Gemini.</p>
<a href="https://aistudio.google.com/apps">Start building</a>
</div>
# Run and deploy your AI Studio app
This contains everything you need to run your app locally.
View your app in AI Studio: https://ai.studio/apps/895b5e6f-2f53-4698-8c85-254822f236ac
## Run Locally
**Prerequisites:** Node.js
1. Install dependencies:
`npm install`
2. Set the `GEMINI_API_KEY` in [.env.local](.env.local) to your Gemini API key
3. Run the app:
`npm run dev`

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
assets/logo-faleiros-tv.png Normal file

Binary file not shown.

BIN
assets/tv-quebrada.png Normal file

Binary file not shown.

314
index.html Normal file
View File

@@ -0,0 +1,314 @@
<!doctype html>
<html lang="pt-BR" class="scroll-smooth">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Faleiros TV - Assistência Técnica Especializada</title>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap" rel="stylesheet">
<script src="https://unpkg.com/@tailwindcss/browser@4"></script>
</head>
<body>
<div id="root">
<div class="font-sans text-[#2D3748] bg-white">
<!-- Header -->
<header class="sticky top-0 z-50 bg-white/95 backdrop-blur-sm border-b border-gray-100 py-4 px-6 md:px-12 flex justify-between items-center">
<div class="flex items-center">
<img src="/logo-faleiros-tv.png" alt="Faleiros TV" class="h-10 md:h-12" />
</div>
<nav class="hidden md:flex space-x-8">
<a href="#inicio" class="text-[#2D3748] hover:text-[#00AEEF] font-medium transition-colors">Início</a>
<a href="#servicos" class="text-[#2D3748] hover:text-[#00AEEF] font-medium transition-colors">Serviços</a>
<a href="#como-funciona" class="text-[#2D3748] hover:text-[#00AEEF] font-medium transition-colors">Como Funciona</a>
<a href="#avaliacoes" class="text-[#2D3748] hover:text-[#00AEEF] font-medium transition-colors">Avaliações</a>
</nav>
</header>
<!-- Hero Section -->
<section id="inicio" class="relative bg-gray-900 py-24 md:py-32 px-6 md:px-12 flex items-center justify-center min-h-[600px]">
<div class="absolute inset-0 overflow-hidden">
<img
src="/banner-faleiros-tv-1.jpg"
alt="Assistência Técnica"
class="w-full h-full object-cover"
/>
<div class="absolute inset-0 bg-gradient-to-r from-[#0A2540]/80 to-[#0A2540]/50"></div>
</div>
<div class="relative z-10 max-w-3xl text-center">
<h1 class="text-3xl sm:text-4xl md:text-5xl lg:text-6xl font-bold text-white mb-6 leading-tight">
Assistência Técnica Especializada em TVs e Eletrodomésticos
</h1>
<p class="text-lg md:text-xl text-gray-200 mb-10 leading-relaxed max-w-2xl mx-auto">
Serviço rápido, transparente e com garantia. Devolva a vida aos seus aparelhos com a equipe mais qualificada da região.
</p>
<a href="https://wa.me/5516991285847" target="_blank" rel="noopener noreferrer" class="inline-block bg-[#00AEEF] hover:bg-[#007BB5] text-white font-semibold py-4 px-8 rounded-lg text-lg transition-colors shadow-lg cursor-pointer">
Agendar Avaliação
</a>
</div>
</section>
<!-- Trust Bar -->
<section class="bg-[#F8FAFC] border-b border-gray-200 py-8 px-6 md:px-12">
<div class="max-w-6xl mx-auto grid grid-cols-1 md:grid-cols-3 gap-6 text-center">
<div class="flex flex-col items-center justify-center">
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="w-8 h-8 text-[#00AEEF] mb-3"><path d="M14.7 6.3a1 1 0 0 0 0 1.4l1.6 1.6a1 1 0 0 0 1.4 0l3.77-3.77a6 6 0 0 1-7.94 7.94l-6.91 6.91a2.12 2.12 0 0 1-3-3l6.91-6.91a6 6 0 0 1 7.94-7.94l-3.76 3.76z"/></svg>
<h3 class="font-semibold text-[#2D3748] text-lg">Atendimento a Domicílio</h3>
</div>
<div class="flex flex-col items-center justify-center">
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="w-8 h-8 text-[#00AEEF] mb-3"><path d="M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2-1 4-2 7-2 2.82 0 5.3 1.02 7 2a1 1 0 0 1 1 1v7z"/><path d="m9 12 2 2 4-4"/></svg>
<h3 class="font-semibold text-[#2D3748] text-lg">Garantia de Serviço</h3>
</div>
<div class="flex flex-col items-center justify-center">
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="w-8 h-8 text-[#00AEEF] mb-3"><path d="M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2"/><circle cx="9" cy="7" r="4"/><polyline points="16 11 18 13 22 9"/></svg>
<h3 class="font-semibold text-[#2D3748] text-lg">Técnicos Qualificados</h3>
</div>
</div>
</section>
<!-- Services Section -->
<section id="servicos" class="py-20 px-6 md:px-12 bg-white">
<div class="max-w-6xl mx-auto">
<h2 class="text-3xl md:text-4xl font-bold text-center text-[#2D3748] mb-16">Nossos Serviços</h2>
<div class="grid grid-cols-1 md:grid-cols-3 gap-8">
<!-- Service 1 -->
<div class="bg-white rounded-xl border border-gray-100 shadow-sm hover:shadow-md transition-shadow overflow-hidden flex flex-col">
<div class="h-48 overflow-hidden">
<img src="/instalação-de-tv.jpg" alt="Conserto de TVs" class="w-full h-full object-cover" />
</div>
<div class="p-8 flex-grow flex flex-col">
<h3 class="text-xl font-bold text-[#2D3748] mb-4">Conserto de TVs</h3>
<p class="text-[#2D3748]/80 leading-relaxed flex-grow">
Especialistas em Smart TVs, LED, OLED e QLED. Resolvemos problemas de imagem, som, conectividade e placa principal com peças originais e diagnóstico preciso.
</p>
<a href="https://wa.me/5516991285847" target="_blank" rel="noopener noreferrer" class="text-[#00AEEF] underline font-semibold hover:text-[#007BB5] mt-6 inline-block">Agendar avaliação</a>
</div>
</div>
<!-- Service 2 -->
<div class="bg-white rounded-xl border border-gray-100 shadow-sm hover:shadow-md transition-shadow overflow-hidden flex flex-col">
<div class="h-48 overflow-hidden">
<img src="/conserto-microondas.png" alt="Conserto de Micro-ondas" class="w-full h-full object-cover" />
</div>
<div class="p-8 flex-grow flex flex-col">
<h3 class="text-xl font-bold text-[#2D3748] mb-4">Conserto de Micro-ondas</h3>
<p class="text-[#2D3748]/80 leading-relaxed flex-grow">
Reparo completo para micro-ondas que não esquentam, apresentam falhas no painel ou problemas no prato giratório. Segurança e eficiência em cada conserto.
</p>
<a href="https://wa.me/5516991285847" target="_blank" rel="noopener noreferrer" class="text-[#00AEEF] underline font-semibold hover:text-[#007BB5] mt-6 inline-block">Agendar avaliação</a>
</div>
</div>
<!-- Service 3 -->
<div class="bg-white rounded-xl border border-gray-100 shadow-sm hover:shadow-md transition-shadow overflow-hidden flex flex-col">
<div class="h-48 overflow-hidden">
<img src="/conserto-eletrodomesticos.png" alt="Eletrodomésticos" class="w-full h-full object-cover" />
</div>
<div class="p-8 flex-grow flex flex-col">
<h3 class="text-xl font-bold text-[#2D3748] mb-4">Eletrodomésticos</h3>
<p class="text-[#2D3748]/80 leading-relaxed flex-grow">
Manutenção preventiva e corretiva para diversos eletrodomésticos da sua casa. Aumente a vida útil dos seus aparelhos com nosso serviço especializado.
</p>
<a href="https://wa.me/5516991285847" target="_blank" rel="noopener noreferrer" class="text-[#00AEEF] underline font-semibold hover:text-[#007BB5] mt-6 inline-block">Agendar avaliação</a>
</div>
</div>
</div>
</div>
</section>
<!-- Interruption Banner -->
<section class="relative bg-[#0A2540] py-16 px-6 md:px-12 overflow-hidden">
<div class="absolute inset-0 opacity-20">
<!-- Imagem removida para teste -->
</div>
<div class="relative z-10 max-w-5xl mx-auto text-center px-4">
<h2 class="text-2xl md:text-3xl lg:text-4xl font-bold text-white mb-8 whitespace-normal md:whitespace-nowrap">
Sua TV quebrou e não compensa consertar? Nós compramos!
</h2>
<a href="https://wa.me/5516991285847" target="_blank" rel="noopener noreferrer" class="inline-block bg-transparent border-2 border-white text-white hover:bg-white hover:text-[#0A2540] font-semibold py-3 px-8 rounded-lg text-lg transition-colors cursor-pointer">
Quero vender minha TV
</a>
</div>
</section>
<!-- How It Works Section -->
<section id="como-funciona" class="py-20 px-6 md:px-12 bg-white">
<div class="max-w-6xl mx-auto">
<h2 class="text-3xl md:text-4xl font-bold text-center text-[#2D3748] mb-16">Como Funciona</h2>
<div class="grid grid-cols-1 md:grid-cols-3 gap-12">
<div class="flex flex-col items-center text-center">
<div class="w-16 h-16 bg-[#F8FAFC] rounded-full flex items-center justify-center mb-6 border border-gray-100">
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="w-8 h-8 text-[#00AEEF]"><path d="M7.9 20A9 9 0 1 0 4 16.1L2 22Z"/></svg>
</div>
<h3 class="text-xl font-bold text-[#2D3748] mb-4">1. Contato</h3>
<p class="text-[#2D3748]/80 leading-relaxed">
Fale conosco e descreva o problema do seu aparelho. Nossa equipe fará um pré-atendimento rápido para entender sua necessidade.
</p>
</div>
<div class="flex flex-col items-center text-center">
<div class="w-16 h-16 bg-[#F8FAFC] rounded-full flex items-center justify-center mb-6 border border-gray-100">
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="w-8 h-8 text-[#00AEEF]"><circle cx="11" cy="11" r="8"/><path d="m21 21-4.3-4.3"/></svg>
</div>
<h3 class="text-xl font-bold text-[#2D3748] mb-4">2. Avaliação</h3>
<p class="text-[#2D3748]/80 leading-relaxed">
Um técnico especializado fará uma avaliação detalhada do equipamento, identificando a causa raiz e apresentando um orçamento transparente.
</p>
</div>
<div class="flex flex-col items-center text-center">
<div class="w-16 h-16 bg-[#F8FAFC] rounded-full flex items-center justify-center mb-6 border border-gray-100">
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="w-8 h-8 text-[#00AEEF]"><path d="M12.22 2h-.44a2 2 0 0 0-2 2v.18a2 2 0 0 1-1 1.73l-.43.25a2 2 0 0 1-2 0l-.15-.08a2 2 0 0 0-2.73.73l-.22.38a2 2 0 0 0 .73 2.73l.15.1a2 2 0 0 1 1 1.72v.51a2 2 0 0 1-1 1.74l-.15.09a2 2 0 0 0-.73 2.73l.22.38a2 2 0 0 0 2.73.73l.15-.08a2 2 0 0 1 2 0l.43.25a2 2 0 0 1 1 1.73V20a2 2 0 0 0 2 2h.44a2 2 0 0 0 2-2v-.18a2 2 0 0 1 1-1.73l.43-.25a2 2 0 0 1 2 0l.15.08a2 2 0 0 0 2.73-.73l.22-.39a2 2 0 0 0-.73-2.73l-.15-.08a2 2 0 0 1-1-1.74v-.5a2 2 0 0 1 1-1.74l.15-.09a2 2 0 0 0 .73-2.73l-.22-.38a2 2 0 0 0-2.73-.73l-.15.08a2 2 0 0 1-2 0l-.43-.25a2 2 0 0 1-1-1.73V4a2 2 0 0 0-2-2z"/><circle cx="12" cy="12" r="3"/></svg>
</div>
<h3 class="text-xl font-bold text-[#2D3748] mb-4">3. Conserto</h3>
<p class="text-[#2D3748]/80 leading-relaxed">
Após sua aprovação, realizamos o reparo utilizando peças de qualidade e testamos o aparelho para garantir o funcionamento perfeito.
</p>
</div>
</div>
</div>
</section>
<!-- Social Proof (Google Reviews) -->
<section id="avaliacoes" class="py-20 px-6 md:px-12 bg-[#F8FAFC]">
<div class="max-w-6xl mx-auto">
<div class="text-center mb-16">
<h2 class="text-3xl md:text-4xl font-bold text-[#2D3748] mb-4">O que dizem nossos clientes</h2>
<p class="text-lg text-[#2D3748]/70">Excelência comprovada por nossos clientes</p>
</div>
<div class="grid grid-cols-1 md:grid-cols-3 gap-8">
<!-- Review 1 -->
<div class="bg-white p-8 rounded-xl shadow-sm border border-gray-100 flex flex-col h-full">
<div class="flex items-center mb-4">
<div class="flex text-yellow-400">
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="currentColor" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="w-5 h-5 fill-current"><polygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26 12 2"/></svg>
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="currentColor" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="w-5 h-5 fill-current"><polygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26 12 2"/></svg>
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="currentColor" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="w-5 h-5 fill-current"><polygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26 12 2"/></svg>
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="currentColor" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="w-5 h-5 fill-current"><polygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26 12 2"/></svg>
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="currentColor" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="w-5 h-5 fill-current"><polygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26 12 2"/></svg>
</div>
</div>
<p class="text-[#2D3748]/80 leading-relaxed mb-6 italic flex-grow">
"Excelente atendimento na Faleiros TV! Levei minha Airfryer que não ligava mais e o conserto foi super rápido e com preço justo. Voltarei com certeza."
</p>
<p class="font-bold text-[#2D3748] mt-auto">- João Pedro</p>
</div>
<!-- Review 2 -->
<div class="bg-white p-8 rounded-xl shadow-sm border border-gray-100 flex flex-col h-full">
<div class="flex items-center mb-4">
<div class="flex text-yellow-400">
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="currentColor" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="w-5 h-5 fill-current"><polygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26 12 2"/></svg>
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="currentColor" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="w-5 h-5 fill-current"><polygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26 12 2"/></svg>
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="currentColor" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="w-5 h-5 fill-current"><polygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26 12 2"/></svg>
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="currentColor" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="w-5 h-5 fill-current"><polygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26 12 2"/></svg>
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="currentColor" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="w-5 h-5 fill-current"><polygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26 12 2"/></svg>
</div>
</div>
<p class="text-[#2D3748]/80 leading-relaxed mb-6 italic flex-grow">
"Minha TV parou de dar imagem e eles resolveram o problema no mesmo dia. Profissionais honestos e muito capacitados. Recomendo a todos!"
</p>
<p class="font-bold text-[#2D3748] mt-auto">- Maria Fernanda</p>
</div>
<!-- Review 3 -->
<div class="bg-white p-8 rounded-xl shadow-sm border border-gray-100 flex flex-col h-full">
<div class="flex items-center mb-4">
<div class="flex text-yellow-400">
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="currentColor" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="w-5 h-5 fill-current"><polygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26 12 2"/></svg>
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="currentColor" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="w-5 h-5 fill-current"><polygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26 12 2"/></svg>
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="currentColor" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="w-5 h-5 fill-current"><polygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26 12 2"/></svg>
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="currentColor" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="w-5 h-5 fill-current"><polygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26 12 2"/></svg>
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="currentColor" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="w-5 h-5 fill-current"><polygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26 12 2"/></svg>
</div>
</div>
<p class="text-[#2D3748]/80 leading-relaxed mb-6 italic flex-grow">
"Consertaram meu micro-ondas que estava fazendo um barulho estranho. O técnico explicou exatamente qual era o defeito. Assistência de total confiança."
</p>
<p class="font-bold text-[#2D3748] mt-auto">- Ricardo Gomes</p>
</div>
</div>
</div>
</section>
<!-- Footer -->
<footer class="bg-[#1A202C] text-gray-300 py-16 px-6 md:px-12">
<div class="max-w-6xl mx-auto grid grid-cols-1 md:grid-cols-12 gap-8 lg:gap-12">
<div class="md:col-span-12 lg:col-span-5">
<img src="/logo-faleiros-tv-negativada.png" alt="Faleiros TV" class="h-12 mb-6" />
<p class="text-gray-400 leading-relaxed max-w-sm">
Assistência técnica especializada em TVs e eletrodomésticos.<br />
Qualidade, transparência e garantia em cada serviço prestado.
</p>
</div>
<div class="md:col-span-6 lg:col-span-4">
<h4 class="text-white font-bold text-lg mb-6">Contato</h4>
<ul class="space-y-4">
<li class="flex items-start">
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="w-5 h-5 mr-3 text-[#00AEEF] shrink-0 mt-0.5"><path d="M22 16.92v3a2 2 0 0 1-2.18 2 19.79 19.79 0 0 1-8.63-3.07 19.5 19.5 0 0 1-6-6 19.79 19.79 0 0 1-3.07-8.67A2 2 0 0 1 4.11 2h3a2 2 0 0 1 2 1.72 12.84 12.84 0 0 0 .7 2.81 2 2 0 0 1-.45 2.11L8.09 9.91a16 16 0 0 0 6 6l1.27-1.27a2 2 0 0 1 2.11-.45 12.84 12.84 0 0 0 2.81.7A2 2 0 0 1 22 16.92z"/></svg>
<span>(16) 99128-5847</span>
</li>
<li class="flex items-start">
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="w-5 h-5 mr-3 text-[#00AEEF] shrink-0 mt-0.5"><path d="M20 10c0 6-8 12-8 12s-8-6-8-12a8 8 0 0 1 16 0Z"/><circle cx="12" cy="10" r="3"/></svg>
<span>R. Cap. Luís de Faria Batista, 106<br />Planalto Verde, Ribeirão Preto - SP<br />14056-284</span>
</li>
</ul>
</div>
<div class="md:col-span-6 lg:col-span-3">
<h4 class="text-white font-bold text-lg mb-6">Horário</h4>
<ul class="space-y-4">
<li class="flex items-start">
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="w-5 h-5 mr-3 text-[#00AEEF] shrink-0 mt-0.5"><circle cx="12" cy="12" r="10"/><polyline points="12 6 12 12 16 14"/></svg>
<div>
<p>Segunda a Sexta</p>
<p class="text-gray-400">08:00 às 18:00</p>
</div>
</li>
<li class="flex items-start">
<div class="w-5 h-5 mr-3 shrink-0"></div>
<div>
<p>Sábado</p>
<p class="text-gray-400">08:00 às 12:00</p>
</div>
</li>
</ul>
</div>
</div>
<div class="max-w-6xl mx-auto mt-12 pt-8 border-t border-gray-800 text-center text-gray-500 text-sm">
<p>&copy; 2026 Agência Compor. Todos os direitos reservados.</p>
</div>
</footer>
<!-- Floating WhatsApp Button -->
<a
id="whatsapp-button"
href="https://wa.me/5516991285847"
target="_blank"
rel="noopener noreferrer"
class="fixed bottom-6 right-6 bg-[#25D366] hover:bg-[#1EBE5D] text-white rounded-full p-3 sm:py-3 sm:px-5 flex items-center shadow-xl hover:shadow-2xl transition-all duration-300 z-50 group translate-y-20 opacity-0 pointer-events-none sm:translate-y-0 sm:opacity-100 sm:pointer-events-auto"
>
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="currentColor" class="w-6 h-6 sm:mr-2"><path d="M17.472 14.382c-.297-.149-1.758-.867-2.03-.967-.273-.099-.471-.148-.67.15-.197.297-.767.966-.94 1.164-.173.199-.347.223-.644.075-.297-.15-1.255-.463-2.39-1.475-.883-.788-1.48-1.761-1.653-2.059-.173-.297-.018-.458.13-.606.134-.133.298-.347.446-.52.149-.174.198-.298.298-.497.099-.198.05-.371-.025-.52-.075-.149-.669-1.612-.916-2.207-.242-.579-.487-.5-.669-.51-.173-.008-.371-.01-.57-.01-.198 0-.52.074-.792.372-.272.297-1.04 1.016-1.04 2.479 0 1.462 1.065 2.875 1.213 3.074.149.198 2.096 3.2 5.077 4.487.709.306 1.262.489 1.694.625.712.227 1.36.195 1.871.118.571-.085 1.758-.719 2.006-1.413.248-.694.248-1.289.173-1.413-.074-.124-.272-.198-.57-.347m-5.421 7.403h-.004a9.87 9.87 0 01-5.031-1.378l-.361-.214-3.741.982.998-3.648-.235-.374a9.86 9.86 0 01-1.51-5.26c.001-5.45 4.436-9.884 9.888-9.884 2.64 0 5.122 1.03 6.988 2.898a9.825 9.825 0 012.893 6.994c-.003 5.45-4.437 9.884-9.885 9.884m8.413-18.297A11.815 11.815 0 0012.05 0C5.495 0 .16 5.335.157 11.892c0 2.096.547 4.142 1.588 5.945L.057 24l6.305-1.654a11.882 11.882 0 005.683 1.448h.005c6.554 0 11.89-5.335 11.893-11.893a11.821 11.821 0 00-3.48-8.413z"/></svg>
<span class="hidden sm:block font-semibold">Fale Conosco</span>
</a>
</div>
</div>
<script>
document.addEventListener('DOMContentLoaded', () => {
const whatsappBtn = document.getElementById('whatsapp-button');
if (whatsappBtn) {
const handleScroll = () => {
// Show button after scrolling down just a little bit (150px)
if (window.scrollY > 150) {
whatsappBtn.classList.remove('translate-y-20', 'opacity-0', 'pointer-events-none');
whatsappBtn.classList.add('translate-y-0', 'opacity-100', 'pointer-events-auto');
} else {
whatsappBtn.classList.add('translate-y-20', 'opacity-0', 'pointer-events-none');
whatsappBtn.classList.remove('translate-y-0', 'opacity-100', 'pointer-events-auto');
}
};
window.addEventListener('scroll', handleScroll, { passive: true });
// Check initial scroll position
handleScroll();
}
});
</script>
<script type="module" src="/src/main.tsx"></script>
</body>
</html>

5
metadata.json Normal file
View File

@@ -0,0 +1,5 @@
{
"name": "",
"description": "",
"requestFramePermissions": []
}

34
package.json Normal file
View File

@@ -0,0 +1,34 @@
{
"name": "react-example",
"private": true,
"version": "0.0.0",
"type": "module",
"scripts": {
"dev": "vite --port=3000 --host=0.0.0.0",
"build": "vite build",
"preview": "vite preview",
"clean": "rm -rf dist",
"lint": "tsc --noEmit"
},
"dependencies": {
"@google/genai": "^1.29.0",
"@tailwindcss/vite": "^4.1.14",
"@vitejs/plugin-react": "^5.0.4",
"lucide-react": "^0.546.0",
"react": "^19.0.0",
"react-dom": "^19.0.0",
"vite": "^6.2.0",
"express": "^4.21.2",
"dotenv": "^17.2.3",
"motion": "^12.23.24"
},
"devDependencies": {
"@types/node": "^22.14.0",
"autoprefixer": "^10.4.21",
"tailwindcss": "^4.1.14",
"tsx": "^4.21.0",
"typescript": "~5.8.2",
"vite": "^6.2.0",
"@types/express": "^4.17.21"
}
}

5
src/index.css Normal file
View File

@@ -0,0 +1,5 @@
@import "tailwindcss";
html {
scroll-behavior: smooth;
}

1
src/main.tsx Normal file
View File

@@ -0,0 +1 @@
import './index.css';

26
tsconfig.json Normal file
View File

@@ -0,0 +1,26 @@
{
"compilerOptions": {
"target": "ES2022",
"experimentalDecorators": true,
"useDefineForClassFields": false,
"module": "ESNext",
"lib": [
"ES2022",
"DOM",
"DOM.Iterable"
],
"skipLibCheck": true,
"moduleResolution": "bundler",
"isolatedModules": true,
"moduleDetection": "force",
"allowJs": true,
"jsx": "react-jsx",
"paths": {
"@/*": [
"./*"
]
},
"allowImportingTsExtensions": true,
"noEmit": true
}
}

24
vite.config.ts Normal file
View File

@@ -0,0 +1,24 @@
import tailwindcss from '@tailwindcss/vite';
import react from '@vitejs/plugin-react';
import path from 'path';
import {defineConfig, loadEnv} from 'vite';
export default defineConfig(({mode}) => {
const env = loadEnv(mode, '.', '');
return {
plugins: [react(), tailwindcss()],
define: {
'process.env.GEMINI_API_KEY': JSON.stringify(env.GEMINI_API_KEY),
},
resolve: {
alias: {
'@': path.resolve(__dirname, '.'),
},
},
server: {
// HMR is disabled in AI Studio via DISABLE_HMR env var.
// Do not modify—file watching is disabled to prevent flickering during agent edits.
hmr: process.env.DISABLE_HMR !== 'true',
},
};
});