+ {/* Trick to keep image fixed */}
+ {/* Fix for width calculation in simple implementation: better to just let it fit container */}
+ {/* Layer to prevent drag issues */}
+
+
+
+ {/* Handle */}
+
+
+
+
+
+
+ {/* Labels */}
+
ANTES
+
DEPOIS
+
+ {/* Alternative slider logic for better compatibility if custom drag fails often */}
+ setSliderPosition(Number(e.target.value))}
+ className="absolute inset-0 w-full h-full opacity-0 cursor-ew-resize z-20"
+ />
+
+);
\ No newline at end of file
diff --git a/contexts/DataContext.tsx b/contexts/DataContext.tsx
new file mode 100644
index 0000000..0781e21
--- /dev/null
+++ b/contexts/DataContext.tsx
@@ -0,0 +1,123 @@
+import React, { createContext, useContext, useState, useEffect } from 'react';
+import {
+ PROMISES, SERVICES, PACKAGES, SPECIAL_OFFERS,
+ GALLERY_IMAGES, STATS, WHY_CHOOSE_ITEMS, TESTIMONIALS,
+ TEAM, FAQS, BLOG_POSTS, DEFAULT_SETTINGS, DEFAULT_VISIBILITY, CLIENT_LOGOS, DEFAULT_TEXTS,
+ DEFAULT_HEADER, DEFAULT_FOOTER, BEFORE_AFTER_ITEMS
+} from '../data';
+import { supabase, isSupabaseConfigured } from '../lib/supabase';
+import { GlobalSettings, SectionVisibility, SectionTexts, HeaderConfig, FooterConfig, BeforeAfterItem } from '../types';
+
+// Estado inicial combina todos os dados
+const INITIAL_DATA = {
+ settings: DEFAULT_SETTINGS,
+ visibility: DEFAULT_VISIBILITY,
+ hero: {
+ title: "Manutenção e Reparos Automotivos",
+ subtitle: "24h de atendimento • Especialistas em todas as marcas • Garantia em todos os serviços.",
+ bgImage: "https://images.unsplash.com/photo-1625047509168-a7026f36de04?auto=format&fit=crop&q=80&w=1920",
+ buttonText: "Agendar Agora"
+ },
+ texts: DEFAULT_TEXTS, // Novos textos
+ header: DEFAULT_HEADER, // Config do Menu
+ footer: DEFAULT_FOOTER, // Config do Rodapé
+ promises: PROMISES,
+ services: SERVICES,
+ packages: PACKAGES,
+ specialOffers: SPECIAL_OFFERS,
+ gallery: GALLERY_IMAGES,
+ beforeAfter: BEFORE_AFTER_ITEMS, // Nova seção
+ stats: STATS,
+ whyChoose: WHY_CHOOSE_ITEMS,
+ testimonials: TESTIMONIALS,
+ team: TEAM,
+ faqs: FAQS,
+ blog: BLOG_POSTS,
+ clients: CLIENT_LOGOS
+};
+
+type DataType = typeof INITIAL_DATA;
+
+interface DataContextType {
+ data: DataType;
+ updateData: (section: keyof DataType, newData: any) => Promise;
+ isLoading: boolean;
+ getWhatsAppLink: (message?: string) => string;
+}
+
+const DataContext = createContext(undefined);
+
+export const DataProvider: React.FC<{ children: React.ReactNode }> = ({ children }) => {
+ const [data, setData] = useState(INITIAL_DATA);
+ const [isLoading, setIsLoading] = useState(true);
+
+ // Carregar dados ao iniciar
+ useEffect(() => {
+ loadData();
+ }, []);
+
+ const loadData = async () => {
+ try {
+ if (isSupabaseConfigured()) {
+ const { data: dbData, error } = await supabase.from('site_content').select('*').single();
+ if (dbData && !error) {
+ // Merge with initial data to ensure new fields are present if DB is old
+ setData(prev => ({
+ ...INITIAL_DATA,
+ ...dbData.content,
+ texts: { ...INITIAL_DATA.texts, ...dbData.content.texts },
+ header: { ...INITIAL_DATA.header, ...dbData.content.header },
+ footer: { ...INITIAL_DATA.footer, ...dbData.content.footer }
+ }));
+ }
+ } else {
+ const localData = localStorage.getItem('car_site_data');
+ if (localData) {
+ const parsedData = JSON.parse(localData);
+ setData(prev => ({
+ ...INITIAL_DATA,
+ ...parsedData,
+ texts: { ...INITIAL_DATA.texts, ...parsedData.texts },
+ header: { ...INITIAL_DATA.header, ...parsedData.header },
+ footer: { ...INITIAL_DATA.footer, ...parsedData.footer }
+ }));
+ }
+ }
+ } catch (error) {
+ console.error("Erro ao carregar dados", error);
+ } finally {
+ setIsLoading(false);
+ }
+ };
+
+ const updateData = async (section: keyof DataType, newData: any) => {
+ const updatedFullData = { ...data, [section]: newData };
+ setData(updatedFullData);
+
+ if (isSupabaseConfigured()) {
+ await supabase.from('site_content').upsert({ id: 1, content: updatedFullData });
+ } else {
+ localStorage.setItem('car_site_data', JSON.stringify(updatedFullData));
+ }
+ };
+
+ const getWhatsAppLink = (message: string = '') => {
+ const phone = data.settings.whatsappNumber.replace(/\D/g, '');
+ const encodedMessage = encodeURIComponent(message);
+ return `https://wa.me/${phone}?text=${encodedMessage}`;
+ };
+
+ return (
+
+ {children}
+
+ );
+};
+
+export const useData = () => {
+ const context = useContext(DataContext);
+ if (context === undefined) {
+ throw new Error('useData must be used within a DataProvider');
+ }
+ return context;
+};
\ No newline at end of file
diff --git a/data.ts b/data.ts
new file mode 100644
index 0000000..fa7d134
--- /dev/null
+++ b/data.ts
@@ -0,0 +1,373 @@
+import { NavItem, Service, PromiseItem, Package, Stat, Testimonial, TeamMember, FaqItem, BlogPost, SpecialOffer, WhyChooseItem, GlobalSettings, SectionVisibility, ClientLogo, SectionTexts, HeaderConfig, FooterConfig, BeforeAfterItem } from './types';
+
+// Mantemos NAV_ITEMS como fallback ou para inicialização
+export const NAV_ITEMS: NavItem[] = [
+ { label: 'Início', href: '/' },
+ { label: 'Sobre', href: '/sobre' },
+ { label: 'Promoções', href: '/promocoes' },
+ { label: 'Serviços', href: '/servicos' },
+ { label: 'Blog', href: '/blog' },
+ { label: 'Contato', href: '/contato' },
+];
+
+export const PROMISES: PromiseItem[] = [
+ { icon: 'Search', title: 'Transparência Total', description: 'Você acompanha cada etapa do reparo.' },
+ { icon: 'ShieldCheck', title: 'Garantia Vitalícia', description: 'Garantia em serviços selecionados.' },
+ { icon: 'Award', title: 'Equipe Certificada', description: 'Mecânicos treinados nas melhores montadoras.' },
+ { icon: 'Clock', title: 'Entrega Pontual', description: 'Respeitamos seu tempo rigorosamente.' },
+ { icon: 'Wrench', title: 'Peças Originais', description: 'Utilizamos apenas peças de reposição de qualidade.' },
+ { icon: 'Users', title: 'Atendimento Premium', description: 'Sala de espera VIP e café enquanto aguarda.' },
+];
+
+export const SERVICES: Service[] = [
+ { id: 1, title: 'Troca de Óleo', description: 'Lubrificantes de alta performance para maior durabilidade.', image: 'https://images.unsplash.com/photo-1487754180451-c456f719a1fc?auto=format&fit=crop&q=80&w=600' },
+ { id: 2, title: 'Freios e ABS', description: 'Diagnóstico completo e troca de pastilhas e discos.', image: 'https://images.unsplash.com/photo-1486262715619-67b85e0b08d3?auto=format&fit=crop&q=80&w=600' },
+ { id: 3, title: 'Motor e Câmbio', description: 'Reparos complexos, retífica e manutenção preventiva.', image: 'https://images.unsplash.com/photo-1619642751034-765dfdf7c58e?auto=format&fit=crop&q=80&w=600' },
+ { id: 4, title: 'Ar-condicionado', description: 'Higienização, carga de gás e reparo de compressores.', image: 'https://images.unsplash.com/photo-1504222490245-4366323443c8?auto=format&fit=crop&q=80&w=600' },
+ { id: 5, title: 'Bateria e Elétrica', description: 'Check-up elétrico completo e troca de baterias.', image: 'https://images.unsplash.com/photo-1503376763036-066120622c74?auto=format&fit=crop&q=80&w=600' },
+ { id: 6, title: 'Suspensão e Pneus', description: 'Alinhamento 3D, balanceamento e amortecedores.', image: 'https://images.unsplash.com/photo-1580273916550-e323be2ed532?auto=format&fit=crop&q=80&w=600' },
+];
+
+export const PACKAGES: Package[] = [
+ {
+ name: 'Básico',
+ price: 170,
+ features: ['Troca de Óleo (até 4L)', 'Filtro de Óleo', 'Check-up de 15 itens', 'Lavagem Externa Simples'],
+ recommended: false,
+ },
+ {
+ name: 'Padrão',
+ price: 250,
+ features: ['Tudo do Básico', 'Filtro de Ar', 'Alinhamento e Balanceamento', 'Rodízio de Pneus', 'Higienização de Ar'],
+ recommended: true,
+ },
+ {
+ name: 'Premium',
+ price: 350,
+ features: ['Tudo do Padrão', 'Cristalização de Vidros', 'Polimento de Faróis', 'Check-up Completo (50 itens)', 'Leva e Traz (Raio 10km)'],
+ recommended: false,
+ },
+];
+
+export const SPECIAL_OFFERS: SpecialOffer[] = [
+ {
+ id: 1,
+ title: 'Kit 4 Pneus Aro 13 Westlake Zuper Eco Z-108 175/70R13 82T',
+ image: 'https://images.unsplash.com/photo-1578844251758-2f71da64522f?auto=format&fit=crop&q=80&w=400',
+ price: 'R$ 899,90',
+ installment: '12x de R$ 88,22 sem juros',
+ rating: 4.8,
+ reviews: 262,
+ specs: { fuel: 'E', grip: 'E', noise: '70dB' }
+ },
+ {
+ id: 2,
+ title: 'Kit 4 Pneus Aro 14 Pirelli Cinturato P1 175/65R14 82T',
+ image: 'https://images.unsplash.com/photo-1578844251758-2f71da64522f?auto=format&fit=crop&q=80&w=400',
+ price: 'R$ 1.199,90',
+ installment: '12x de R$ 117,63 sem juros',
+ rating: 4.9,
+ reviews: 415,
+ specs: { fuel: 'C', grip: 'C', noise: '69dB' }
+ },
+ {
+ id: 3,
+ title: 'Kit 4 Pneus Aro 15 Michelin Primacy 4 195/60R15 88V',
+ image: 'https://images.unsplash.com/photo-1578844251758-2f71da64522f?auto=format&fit=crop&q=80&w=400',
+ price: 'R$ 2.450,00',
+ installment: '12x de R$ 240,19 sem juros',
+ rating: 5.0,
+ reviews: 189,
+ specs: { fuel: 'B', grip: 'A', noise: '68dB' }
+ },
+ {
+ id: 4,
+ title: 'Kit 4 Pneus Aro 16 Bridgestone Turanza 205/55R16 91V',
+ image: 'https://images.unsplash.com/photo-1578844251758-2f71da64522f?auto=format&fit=crop&q=80&w=400',
+ price: 'R$ 2.890,90',
+ installment: '12x de R$ 283,42 sem juros',
+ rating: 4.7,
+ reviews: 310,
+ specs: { fuel: 'E', grip: 'C', noise: '71dB' }
+ }
+];
+
+export const GALLERY_IMAGES = [
+ 'https://images.unsplash.com/photo-1492144534655-ae79c964c9d7?auto=format&fit=crop&q=80&w=500',
+ 'https://images.unsplash.com/photo-1597505294881-133d26a1b212?auto=format&fit=crop&q=80&w=500',
+ 'https://images.unsplash.com/photo-1615906655593-ad0386982a0f?auto=format&fit=crop&q=80&w=500',
+ 'https://images.unsplash.com/photo-1494976388531-d1058494cdd8?auto=format&fit=crop&q=80&w=500',
+ 'https://images.unsplash.com/photo-1530046339160-71153320c0f6?auto=format&fit=crop&q=80&w=500',
+ 'https://images.unsplash.com/photo-1517524008697-84bbe3c3fd98?auto=format&fit=crop&q=80&w=500',
+ 'https://images.unsplash.com/photo-1583121274602-3e2820c69888?auto=format&fit=crop&q=80&w=500',
+ 'https://images.unsplash.com/photo-1517026575992-5e117c86699f?auto=format&fit=crop&q=80&w=500',
+];
+
+export const BEFORE_AFTER_ITEMS: BeforeAfterItem[] = [
+ {
+ id: 1,
+ title: "Martelinho de Ouro",
+ imageBefore: "https://images.unsplash.com/photo-1626856557876-2e8c14040956?auto=format&fit=crop&q=80&w=800",
+ imageAfter: "https://images.unsplash.com/photo-1626856557833-255017006841?auto=format&fit=crop&q=80&w=800"
+ },
+ {
+ id: 2,
+ title: "Polimento Cristalizado",
+ imageBefore: "https://images.unsplash.com/photo-1601362840469-51e4d8d58785?auto=format&fit=crop&q=80&w=800",
+ imageAfter: "https://images.unsplash.com/photo-1601362840464-5ea2b733b82d?auto=format&fit=crop&q=80&w=800"
+ }
+];
+
+export const STATS: Stat[] = [
+ { label: 'Anos de Experiência', value: '20+' },
+ { label: 'Carros Reparados', value: '3500+' },
+ { label: 'Técnicos Especialistas', value: '15+' },
+ { label: 'Clientes Satisfeitos', value: '3000+' },
+];
+
+export const TESTIMONIALS: Testimonial[] = [
+ { name: 'Carlos Mendes', role: 'Empresário', stars: 5, text: 'O atendimento foi impecável. Resolveram o problema do meu carro que outras três oficinas não conseguiram.', image: 'https://images.unsplash.com/photo-1507003211169-0a1dd7228f2d?auto=format&fit=crop&q=80&w=100' },
+ { name: 'Fernanda Lima', role: 'Médica', stars: 5, text: 'Rápido, limpo e transparente. Adorei receber as fotos das peças trocadas pelo WhatsApp.', image: 'https://images.unsplash.com/photo-1494790108377-be9c29b29330?auto=format&fit=crop&q=80&w=100' },
+ { name: 'Roberto Silva', role: 'Motorista Uber', stars: 5, text: 'Melhor custo-benefício da região. O pacote de revisão padrão salvou meu orçamento.', image: 'https://images.unsplash.com/photo-1500648767791-00dcc994a43e?auto=format&fit=crop&q=80&w=100' },
+];
+
+export const TEAM: TeamMember[] = [
+ { name: 'João Ferreira', role: 'Engenheiro Mecânico Chefe', image: 'https://images.unsplash.com/photo-1560250097-0b93528c311a?auto=format&fit=crop&q=80&w=300' },
+ { name: 'Ana Souza', role: 'Especialista em Elétrica', image: 'https://images.unsplash.com/photo-1573496359142-b8d87734a5a2?auto=format&fit=crop&q=80&w=300' },
+ { name: 'Marcos Oliveira', role: 'Técnico de Suspensão', image: 'https://images.unsplash.com/photo-1530268729831-4b0b9e170218?auto=format&fit=crop&q=80&w=300' },
+ { name: 'Ricardo Santos', role: 'Gerente de Oficina', image: 'https://images.unsplash.com/photo-1472099645785-5658abf4ff4e?auto=format&fit=crop&q=80&w=300' },
+];
+
+export const FAQS: FaqItem[] = [
+ { question: 'Quanto tempo leva uma revisão básica?', answer: 'Geralmente, uma revisão básica (troca de óleo e filtros) é realizada em cerca de 45 a 60 minutos.' },
+ { question: 'Vocês trabalham com todas as seguradoras?', answer: 'Sim, atendemos as principais seguradoras do mercado para reparos de funilaria e pintura.' },
+ { question: 'Oferecem garantia nos serviços?', answer: 'Todos os nossos serviços possuem garantia mínima de 3 meses, e algumas peças têm garantia vitalícia do fabricante.' },
+ { question: 'Posso agendar online?', answer: 'Com certeza! Utilize o botão "Agendar Agora" no topo do site para escolher o melhor horário.' },
+ { question: 'Aceitam quais formas de pagamento?', answer: 'Aceitamos cartões de crédito em até 10x, débito, PIX e dinheiro.' },
+ { question: 'Buscam o carro em casa?', answer: 'Sim, possuímos serviço de Leva e Traz em um raio de 10km da oficina.' },
+];
+
+export const BLOG_POSTS: BlogPost[] = [
+ {
+ id: 1,
+ title: 'Sinais que seu freio precisa de atenção',
+ excerpt: 'Chiados, pedal baixo ou vibrações? Saiba identificar os problemas antes que seja tarde.',
+ content: `
+
O sistema de freios é, sem dúvida, o componente de segurança mais crítico do seu veículo. Ignorar os primeiros sinais de desgaste pode levar a reparos caros e, pior, a situações perigosas na estrada. Aqui estão os principais sinais de que seus freios precisam de uma visita à oficina:
+
+
1. Ruídos Estranhos
+
Se você ouvir um guincho agudo ao frear, é provável que o indicador de desgaste das pastilhas esteja tocando o disco. Já um som de moagem metálica indica que as pastilhas acabaram totalmente e o metal está raspando no metal - uma emergência imediata.
+
+
2. Vibração no Pedal ou Volante
+
Sentir o pedal do freio ou o volante tremer ao frear geralmente indica discos de freio empenados. Isso ocorre devido ao superaquecimento ou desgaste irregular.
+
+
3. Pedal "Baixo" ou "Mole"
+
Se você precisa pisar até o fundo para o carro parar, pode haver ar no sistema hidráulico, vazamento de fluido ou desgaste excessivo das pastilhas.
+
+
Na CAR Auto Center, realizamos uma inspeção completa do sistema de freios gratuitamente. Agende sua revisão hoje mesmo!
+ `,
+ image: 'https://images.unsplash.com/photo-1486262715619-67b85e0b08d3?auto=format&fit=crop&q=80&w=800',
+ date: '12 Out 2023'
+ },
+ {
+ id: 2,
+ title: 'Como economizar combustível na cidade',
+ excerpt: 'Dicas práticas de direção e manutenção que podem reduzir seu consumo em até 20%.',
+ content: `
+
Com o preço do combustível em alta, cada quilômetro conta. Felizmente, pequenas mudanças nos hábitos de direção e na manutenção do veículo podem gerar uma economia significativa no final do mês.
+
+
Mantenha os Pneus Calibrados
+
Pneus murchos aumentam a resistência à rolagem, forçando o motor a trabalhar mais. Verifique a calibração semanalmente.
+
+
Evite Acelerações Bruscas
+
Sair do sinal verde acelerando fundo consome muito mais combustível do que uma aceleração gradual. Tente manter uma velocidade constante sempre que possível.
+
+
Troque as Marchas no Tempo Certo
+
Esticar demais as marchas eleva o giro do motor desnecessariamente. Consulte o manual do proprietário para saber a rotação ideal de troca.
+
+
Manutenção em Dia
+
Velas desgastadas, filtros de ar sujos e óleo velho podem aumentar o consumo em até 10%. Mantenha suas revisões em dia com a CAR Auto Center.
+ `,
+ image: 'https://images.unsplash.com/photo-1616422285623-13ff0162193c?auto=format&fit=crop&q=80&w=800',
+ date: '05 Nov 2023'
+ },
+ {
+ id: 3,
+ title: 'A importância da troca de óleo regular',
+ excerpt: 'Entenda por que o óleo é o sangue do motor e o que acontece se você atrasar a troca.',
+ content: `
+
O óleo do motor tem funções vitais: lubrificar, limpar, resfriar e vedar as partes internas do motor. Com o tempo, ele perde suas propriedades e acumula impurezas.
+
+
O que acontece se não trocar?
+
O óleo velho se transforma em uma borra espessa que entope os canais de lubrificação. Isso causa atrito excessivo, superaquecimento e pode levar à fundição do motor.
+
+
Sintético vs. Mineral
+
Sempre respeite a especificação da montadora. Óleos sintéticos tendem a ter maior durabilidade e oferecer melhor proteção em altas temperaturas.
+
+
Não arrisque o coração do seu carro. A troca de óleo é o serviço de manutenção preventiva mais barato e importante que você pode fazer.