import React, { useState } from 'react'; import { Map } from '../ui/map'; import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '../ui/card'; import { Tabs, TabsContent, TabsList, TabsTrigger } from '../ui/tabs'; import { Badge } from '../ui/badge'; import { Button } from '../ui/button'; import { Input } from '../ui/input'; import { Alert, AlertDescription } from '../ui/alert'; import { Info, Layers, MapPin, MousePointer2, Pencil } from 'lucide-react'; import { Checkbox } from '../ui/checkbox'; import { Label } from '../ui/label'; import { Switch } from '../ui/switch'; import { FilterableMapExample } from './FilterableMapExample'; import { SimpleFilterableMap } from './SimpleFilterableMap'; import { DrawingMapExample } from './DrawingMapExample'; import { PageHeader } from '../ui/page-header'; /** * MapShowcase - Componente de demonstração completo e organizado * * Organizado em 3 abas principais conforme diretrizes do Design System: * 1. Mapas Simples (Padrão, Layers, Compacto) * 2. Marcadores (Pins, Áreas, Personalização) * 3. Controles (Filtros, Controles Nativos) */ export function MapShowcase() { const [activeTab, setActiveTab] = useState('simple'); const [isTransitioning, setIsTransitioning] = useState(false); const [apiKey, setApiKey] = useState(''); const [inputApiKey, setInputApiKey] = useState(''); // Estados para Layers const [showTraffic, setShowTraffic] = useState(false); const [showTransit, setShowTransit] = useState(false); const [showBicycling, setShowBicycling] = useState(false); // Estados para Controles Nativos const [showZoomControl, setShowZoomControl] = useState(true); const [showMapTypeControl, setShowMapTypeControl] = useState(false); const [showStreetViewControl, setShowStreetViewControl] = useState(false); const [showFullscreenControl, setShowFullscreenControl] = useState(true); // Handler para troca de tabs com cleanup const handleTabChange = (value: string) => { if (value === activeTab) return; setIsTransitioning(true); setTimeout(() => { setActiveTab(value); setIsTransitioning(false); }, 50); }; return (
{/* Header */} {/* Header */} Design System} /> {/* API Key Configuration */} Configuração da API Key Insira sua Google Maps API Key para renderizar os mapas abaixo.
setInputApiKey(e.target.value)} className="max-w-md h-10" />
{/* Tabs Principais */} Mapas Simples Marcadores Controles Desenho {/* 1. Mapas Simples */} {!isTransitioning && activeTab === 'simple' && ( <> {/* Mapa Padrão */} Mapa Padrão Configuração básica do mapa centralizado em uma coordenada específica. {/* Mapa com Layers */} Camadas (Layers) Sobreposição de informações como tráfego, transporte público e ciclovias.
{/* Mapas Compactos */}
São Paulo Rio de Janeiro New York
)}
{/* 2. Marcadores */} {!isTransitioning && activeTab === 'markers' && ( <> {/* Marcadores e Pins */} Marcadores e Pins Exemplos de marcadores personalizados com diferentes cores e informações. {/* Marcador com Conteúdo Rico */} Marcador com Ações Marcador interativo que exibe conteúdo rico (texto, imagem, botões) ao ser clicado.

Xertica HQ

Open
Office View

Sede principal em São Paulo. Espaço moderno para reuniões e eventos.

), }, ]} />
{/* Áreas e Polígonos */} Áreas e Zonas Delimitação de áreas geográficas usando círculos e polígonos. )}
{/* 3. Controles */} {!isTransitioning && activeTab === 'controls' && ( <> {/* Controles Nativos */} Controles do Mapa Personalize a interface do mapa ativando ou desativando controles nativos.
setShowZoomControl(!!c)} />
setShowMapTypeControl(!!c)} />
setShowStreetViewControl(!!c)} />
setShowFullscreenControl(!!c)} />
{/* Filtros Customizados */} Filtros Interativos Exemplo avançado de mapa com controles customizados para filtragem de marcadores. )}
{/* 4. Desenho */} {!isTransitioning && activeTab === 'drawing' && }
{/* Footer Info */}

Documentação

Verifique MAP_SETUP.md para configuração inicial e requisitos de API.

Performance

Utiliza carregamento assíncrono e AdvancedMarkerElement para melhor desempenho.

Design System

Componentes seguem estritamente as variáveis de tokens do globals.css.

); }