- {user && getLinks().map((link) => (
+ {user && getLinks().map((link) => (
))}
-
- {user ? (
-
-
-

-
- {user.name}
- {getRoleLabel()}
-
-
-
+
+ {user ? (
+
+
+

+
+ {user.name}
+ {getRoleLabel()}
- ) : (
-
- )}
-
+
+
+
+ ) : (
+
+ )}
+
)}
diff --git a/index.html b/index.html
index 39c9083..462537e 100644
--- a/index.html
+++ b/index.html
@@ -4,7 +4,7 @@
-
PhotumManager - Gestão de Eventos
+
PhotumFormaturas - Gestão de Eventos
{
+ const [searchTerm, setSearchTerm] = useState('');
+ const [filter, setFilter] = useState<'all' | 'delivered' | 'archived'>('all');
+
+ const filteredAlbums = MOCK_ALBUMS.filter(album => {
+ const matchesSearch = album.eventName.toLowerCase().includes(searchTerm.toLowerCase()) ||
+ album.clientName.toLowerCase().includes(searchTerm.toLowerCase());
+ const matchesFilter = filter === 'all' || album.status === filter;
+ return matchesSearch && matchesFilter;
+ });
+
+ return (
+
+
+
+
+
Álbuns Entregues
+
Gerencie e compartilhe os álbuns finalizados com seus clientes.
+
+ {/* Placeholder for future actions if needed */}
+
+
+ {/* Filters & Search */}
+
+
+
+ setSearchTerm(e.target.value)}
+ />
+
+
+
+
+
+
+
+
+
+ {/* Albums Grid */}
+
+ {filteredAlbums.map((album) => (
+
+
+

+
+
+
{album.eventName}
+
+ {new Date(album.date).toLocaleDateString()}
+
+
+
+
+ {album.status === 'delivered' ? 'Entregue' : 'Arquivado'}
+
+
+
+
+
+
+
+
Cliente
+
{album.clientName}
+
+
+
Fotos
+
{album.photoCount}
+
+
+
+
+
{album.size}
+
+
+
+
+
+
+
+
+ ))}
+
+
+ {filteredAlbums.length === 0 && (
+
+
+
Nenhum álbum encontrado
+
Tente ajustar seus filtros de busca.
+
+ )}
+
+
+ );
+};
diff --git a/pages/Calendar.tsx b/pages/Calendar.tsx
new file mode 100644
index 0000000..31e2bbb
--- /dev/null
+++ b/pages/Calendar.tsx
@@ -0,0 +1,357 @@
+import React, { useState } from 'react';
+import { Calendar, Clock, MapPin, User, ChevronLeft, ChevronRight } from 'lucide-react';
+
+interface Event {
+ id: string;
+ title: string;
+ date: string;
+ time: string;
+ location: string;
+ client: string;
+ status: 'confirmed' | 'pending' | 'completed';
+ type: 'formatura' | 'casamento' | 'evento';
+}
+
+const MOCK_EVENTS: Event[] = [
+ {
+ id: '1',
+ title: 'Formatura Medicina UFPR',
+ date: '2025-12-15',
+ time: '19:00',
+ location: 'Teatro Guaíra, Curitiba',
+ client: 'Ana Paula Silva',
+ status: 'confirmed',
+ type: 'formatura'
+ },
+ {
+ id: '2',
+ title: 'Casamento Maria & João',
+ date: '2025-12-20',
+ time: '16:00',
+ location: 'Fazenda Vista Alegre',
+ client: 'Maria Santos',
+ status: 'confirmed',
+ type: 'casamento'
+ },
+ {
+ id: '3',
+ title: 'Formatura Direito PUC',
+ date: '2025-12-22',
+ time: '20:00',
+ location: 'Centro de Convenções',
+ client: 'Carlos Eduardo',
+ status: 'pending',
+ type: 'formatura'
+ },
+ {
+ id: '4',
+ title: 'Formatura Engenharia UTFPR',
+ date: '2025-12-28',
+ time: '18:30',
+ location: 'Espaço Nobre Eventos',
+ client: 'Roberto Mendes',
+ status: 'confirmed',
+ type: 'formatura'
+ },
+ {
+ id: '5',
+ title: 'Evento Corporativo Tech Summit',
+ date: '2026-01-10',
+ time: '09:00',
+ location: 'Hotel Bourbon',
+ client: 'TechCorp Ltda',
+ status: 'pending',
+ type: 'evento'
+ },
+ {
+ id: '6',
+ title: 'Formatura Odontologia',
+ date: '2026-01-15',
+ time: '19:30',
+ location: 'Clube Curitibano',
+ client: 'Juliana Costa',
+ status: 'confirmed',
+ type: 'formatura'
+ }
+];
+
+export const CalendarPage: React.FC = () => {
+ const [selectedMonth, setSelectedMonth] = useState(new Date());
+ const [selectedEvent, setSelectedEvent] = useState
(null);
+
+ const getStatusColor = (status: Event['status']) => {
+ switch (status) {
+ case 'confirmed':
+ return 'bg-green-100 text-green-800';
+ case 'pending':
+ return 'bg-yellow-100 text-yellow-800';
+ case 'completed':
+ return 'bg-gray-100 text-gray-800';
+ }
+ };
+
+ const getStatusLabel = (status: Event['status']) => {
+ switch (status) {
+ case 'confirmed':
+ return 'Confirmado';
+ case 'pending':
+ return 'Pendente';
+ case 'completed':
+ return 'Concluído';
+ }
+ };
+
+ const getTypeColor = (type: Event['type']) => {
+ switch (type) {
+ case 'formatura':
+ return 'bg-blue-100 text-blue-800';
+ case 'casamento':
+ return 'bg-pink-100 text-pink-800';
+ case 'evento':
+ return 'bg-purple-100 text-purple-800';
+ }
+ };
+
+ const getTypeLabel = (type: Event['type']) => {
+ switch (type) {
+ case 'formatura':
+ return 'Formatura';
+ case 'casamento':
+ return 'Casamento';
+ case 'evento':
+ return 'Evento';
+ }
+ };
+
+ const formatDate = (dateString: string) => {
+ const date = new Date(dateString + 'T00:00:00');
+ return date.toLocaleDateString('pt-BR', {
+ day: '2-digit',
+ month: 'long',
+ year: 'numeric'
+ });
+ };
+
+ const nextMonth = () => {
+ setSelectedMonth(new Date(selectedMonth.getFullYear(), selectedMonth.getMonth() + 1));
+ };
+
+ const prevMonth = () => {
+ setSelectedMonth(new Date(selectedMonth.getFullYear(), selectedMonth.getMonth() - 1));
+ };
+
+ const currentMonthName = selectedMonth.toLocaleDateString('pt-BR', {
+ month: 'long',
+ year: 'numeric'
+ });
+
+ // Filter events for selected month
+ const monthEvents = MOCK_EVENTS.filter(event => {
+ const eventDate = new Date(event.date + 'T00:00:00');
+ return eventDate.getMonth() === selectedMonth.getMonth() &&
+ eventDate.getFullYear() === selectedMonth.getFullYear();
+ });
+
+ // Sort events by date
+ const sortedEvents = [...MOCK_EVENTS].sort((a, b) =>
+ new Date(a.date).getTime() - new Date(b.date).getTime()
+ );
+
+ return (
+
+
+ {/* Header */}
+
+
+ Minha Agenda
+
+
+ Gerencie seus eventos e compromissos fotográficos
+
+
+
+
+ {/* Calendar Navigation */}
+
+
+
+
+
+ {currentMonthName}
+
+
+
+
+
+
+ Eventos este mês:
+ {monthEvents.length}
+
+
+ Total de eventos:
+ {MOCK_EVENTS.length}
+
+
+
+
+
+
+
+ {/* Events List */}
+
+
+
+
Próximos Eventos
+
+
+
+ {sortedEvents.length === 0 ? (
+
+
+
Nenhum evento agendado
+
+ ) : (
+ sortedEvents.map((event) => (
+
setSelectedEvent(event)}
+ >
+
+
+
+
+ {event.title}
+
+
+ {getTypeLabel(event.type)}
+
+
+
+
+
+ {formatDate(event.date)}
+
+
+
+ {event.time}
+
+
+
+ {event.location}
+
+
+
+ {event.client}
+
+
+
+
+ {getStatusLabel(event.status)}
+
+
+
+ ))
+ )}
+
+
+
+
+
+
+ {/* Event Detail Modal */}
+ {selectedEvent && (
+
setSelectedEvent(null)}
+ >
+
e.stopPropagation()}
+ >
+
+
+
+ {selectedEvent.title}
+
+
+
+ {getTypeLabel(selectedEvent.type)}
+
+
+ {getStatusLabel(selectedEvent.status)}
+
+
+
+
+
+
+
+
+
+ {formatDate(selectedEvent.date)}
+
+
+
+ {selectedEvent.time}
+
+
+
+ {selectedEvent.location}
+
+
+
+ {selectedEvent.client}
+
+
+
+
+
+
+
+
+
+ )}
+
+ );
+};
diff --git a/pages/Finance.tsx b/pages/Finance.tsx
new file mode 100644
index 0000000..ad7309a
--- /dev/null
+++ b/pages/Finance.tsx
@@ -0,0 +1,371 @@
+import React, { useState } from 'react';
+import { DollarSign, TrendingUp, TrendingDown, Calendar, Download, Filter, CreditCard, CheckCircle, Clock, XCircle } from 'lucide-react';
+
+interface Transaction {
+ id: string;
+ type: 'income' | 'expense';
+ category: string;
+ description: string;
+ amount: number;
+ date: string;
+ status: 'paid' | 'pending' | 'overdue';
+ client?: string;
+ event?: string;
+}
+
+const MOCK_TRANSACTIONS: Transaction[] = [
+ {
+ id: '1',
+ type: 'income',
+ category: 'Formatura',
+ description: 'Pagamento Formatura Medicina UFPR',
+ amount: 8500.00,
+ date: '2025-12-01',
+ status: 'paid',
+ client: 'Ana Paula Silva',
+ event: 'Formatura Medicina UFPR'
+ },
+ {
+ id: '2',
+ type: 'income',
+ category: 'Casamento',
+ description: 'Sinal Casamento Maria & João',
+ amount: 3000.00,
+ date: '2025-12-05',
+ status: 'paid',
+ client: 'Maria Santos',
+ event: 'Casamento Maria & João'
+ },
+ {
+ id: '3',
+ type: 'expense',
+ category: 'Equipamento',
+ description: 'Manutenção Câmera Canon',
+ amount: 450.00,
+ date: '2025-12-03',
+ status: 'paid'
+ },
+ {
+ id: '4',
+ type: 'income',
+ category: 'Formatura',
+ description: 'Pagamento Formatura Direito PUC',
+ amount: 7200.00,
+ date: '2025-12-10',
+ status: 'pending',
+ client: 'Carlos Eduardo',
+ event: 'Formatura Direito PUC'
+ },
+ {
+ id: '5',
+ type: 'expense',
+ category: 'Transporte',
+ description: 'Combustível - Eventos Dezembro',
+ amount: 320.00,
+ date: '2025-12-08',
+ status: 'paid'
+ },
+ {
+ id: '6',
+ type: 'income',
+ category: 'Evento Corporativo',
+ description: 'Tech Summit 2026',
+ amount: 5500.00,
+ date: '2025-12-15',
+ status: 'pending',
+ client: 'TechCorp Ltda',
+ event: 'Tech Summit'
+ },
+ {
+ id: '7',
+ type: 'expense',
+ category: 'Software',
+ description: 'Assinatura Adobe Creative Cloud',
+ amount: 180.00,
+ date: '2025-12-01',
+ status: 'paid'
+ },
+ {
+ id: '8',
+ type: 'income',
+ category: 'Formatura',
+ description: 'Saldo Final Formatura Engenharia',
+ amount: 4500.00,
+ date: '2025-11-20',
+ status: 'overdue',
+ client: 'Roberto Mendes',
+ event: 'Formatura Engenharia UTFPR'
+ }
+];
+
+export const FinancePage: React.FC = () => {
+ const [filterType, setFilterType] = useState<'all' | 'income' | 'expense'>('all');
+ const [filterStatus, setFilterStatus] = useState<'all' | 'paid' | 'pending' | 'overdue'>('all');
+
+ const filteredTransactions = MOCK_TRANSACTIONS.filter(transaction => {
+ const matchesType = filterType === 'all' || transaction.type === filterType;
+ const matchesStatus = filterStatus === 'all' || transaction.status === filterStatus;
+ return matchesType && matchesStatus;
+ });
+
+ const totalIncome = MOCK_TRANSACTIONS
+ .filter(t => t.type === 'income' && t.status === 'paid')
+ .reduce((sum, t) => sum + t.amount, 0);
+
+ const totalExpense = MOCK_TRANSACTIONS
+ .filter(t => t.type === 'expense' && t.status === 'paid')
+ .reduce((sum, t) => sum + t.amount, 0);
+
+ const pendingIncome = MOCK_TRANSACTIONS
+ .filter(t => t.type === 'income' && (t.status === 'pending' || t.status === 'overdue'))
+ .reduce((sum, t) => sum + t.amount, 0);
+
+ const balance = totalIncome - totalExpense;
+
+ const getStatusIcon = (status: Transaction['status']) => {
+ switch (status) {
+ case 'paid':
+ return ;
+ case 'pending':
+ return ;
+ case 'overdue':
+ return ;
+ }
+ };
+
+ const getStatusColor = (status: Transaction['status']) => {
+ switch (status) {
+ case 'paid':
+ return 'bg-green-100 text-green-800';
+ case 'pending':
+ return 'bg-yellow-100 text-yellow-800';
+ case 'overdue':
+ return 'bg-red-100 text-red-800';
+ }
+ };
+
+ const getStatusLabel = (status: Transaction['status']) => {
+ switch (status) {
+ case 'paid':
+ return 'Pago';
+ case 'pending':
+ return 'Pendente';
+ case 'overdue':
+ return 'Atrasado';
+ }
+ };
+
+ const formatCurrency = (value: number) => {
+ return new Intl.NumberFormat('pt-BR', {
+ style: 'currency',
+ currency: 'BRL'
+ }).format(value);
+ };
+
+ const formatDate = (dateString: string) => {
+ const date = new Date(dateString + 'T00:00:00');
+ return date.toLocaleDateString('pt-BR', {
+ day: '2-digit',
+ month: 'short',
+ year: 'numeric'
+ });
+ };
+
+ return (
+
+
+ {/* Header */}
+
+
+
+ Financeiro
+
+
+ Acompanhe receitas, despesas e fluxo de caixa
+
+
+
+
+
+ {/* Stats Cards */}
+
+
+
+
{formatCurrency(totalIncome)}
+
Pagamentos recebidos
+
+
+
+
+
{formatCurrency(totalExpense)}
+
Gastos do período
+
+
+
+
+
= 0 ? 'text-brand-gold' : 'text-red-600'}`}>
+ {formatCurrency(balance)}
+
+
Receitas - Despesas
+
+
+
+
+
{formatCurrency(pendingIncome)}
+
Pagamentos pendentes
+
+
+
+ {/* Filters */}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {/* Transactions List */}
+
+
+
Transações
+
+
+
+ {filteredTransactions.length === 0 ? (
+
+
+
Nenhuma transação encontrada
+
+ ) : (
+ filteredTransactions.map((transaction) => (
+
+
+
+
+
+ {transaction.type === 'income' ? (
+
+ ) : (
+
+ )}
+
+
+
+ {transaction.description}
+
+
+ {transaction.category}
+ {transaction.client && (
+ <>
+ •
+ {transaction.client}
+ >
+ )}
+
+
+
+
+
+
+
+
+ {transaction.type === 'income' ? '+' : '-'} {formatCurrency(transaction.amount)}
+
+
+
+ {formatDate(transaction.date)}
+
+
+
+ {getStatusIcon(transaction.status)}
+
+ {getStatusLabel(transaction.status)}
+
+
+
+
+
+ ))
+ )}
+
+
+
+
+ );
+};
diff --git a/pages/Home.tsx b/pages/Home.tsx
index 139526a..2d8616c 100644
--- a/pages/Home.tsx
+++ b/pages/Home.tsx
@@ -3,9 +3,8 @@ import { Button } from '../components/Button';
import { Camera, Heart, Shield, Star } from 'lucide-react';
const HERO_IMAGES = [
- "https://images.unsplash.com/photo-1511285560982-1351cdeb9821?ixlib=rb-1.2.1&auto=format&fit=crop&w=1920&q=80",
- "https://images.unsplash.com/photo-1519741497674-611481863552?ixlib=rb-1.2.1&auto=format&fit=crop&w=1920&q=80",
- "https://images.unsplash.com/photo-1472653431158-6364773b2710?ixlib=rb-1.2.1&auto=format&fit=crop&w=1920&q=80"
+ "/banner2.jpg",
+ "/HOME_01.jpg"
];
interface HomeProps {
@@ -27,7 +26,7 @@ export const Home: React.FC = ({ onEnter }) => {
{/* Hero Section */}
{HERO_IMAGES.map((img, idx) => (
-
@@ -35,8 +34,9 @@ export const Home: React.FC
= ({ onEnter }) => {
))}
-
-
+
+ {/* Text and Buttons - Only visible on first slide */}
+
Eternizando Momentos
@@ -46,7 +46,7 @@ export const Home: React.FC = ({ onEnter }) => {
Gestão completa para eventos inesquecíveis. Do planejamento à entrega do álbum perfeito.
-
{/* Features Section */}
-
-
Por que nós?
- Excelência em cada detalhe
-
-
-
- {[
- { icon:
, title: "Qualidade Impecável", desc: "Equipamentos de última geração e profissionais premiados." },
- { icon: , title: "Segurança Total", desc: "Backup duplo em nuvem e contratos transparentes." },
- { icon: , title: "Atendimento Humanizado", desc: "Entendemos que seu evento é um sonho a ser realizado." }
- ].map((feature, idx) => (
-
-
- {feature.icon}
-
-
{feature.title}
-
{feature.desc}
+
+
Por que nós?
+ Excelência em cada detalhe
+
+
+
+ {[
+ { icon:
, title: "Qualidade Impecável", desc: "Equipamentos de última geração e profissionais premiados." },
+ { icon:
, title: "Segurança Total", desc: "Backup duplo em nuvem e contratos transparentes." },
+ { icon:
, title: "Atendimento Humanizado", desc: "Entendemos que seu evento é um sonho a ser realizado." }
+ ].map((feature, idx) => (
+
+
+ {feature.icon}
- ))}
-
+
{feature.title}
+
{feature.desc}
+
+ ))}
+
{/* Testimonials */}
-
-
-
- "A equipe do Photum superou todas as expectativas. O sistema de acompanhamento nos deixou tranquilos durante todo o processo e as fotos ficaram incríveis."
-
-
- Mariana & Pedro
- Casamento em Campos do Jordão
-
-
+
+
+
+ "A equipe do Photum superou todas as expectativas. O sistema de acompanhamento nos deixou tranquilos durante todo o processo e as fotos ficaram incríveis."
+
+
+ Mariana & Pedro
+ Casamento em Campos do Jordão
+
+
);
diff --git a/pages/Settings.tsx b/pages/Settings.tsx
new file mode 100644
index 0000000..9e592cb
--- /dev/null
+++ b/pages/Settings.tsx
@@ -0,0 +1,482 @@
+import React, { useState } from 'react';
+import { User, Mail, Phone, MapPin, Lock, Bell, Palette, Globe, Save, Camera } from 'lucide-react';
+import { Button } from '../components/Button';
+
+export const SettingsPage: React.FC = () => {
+ const [activeTab, setActiveTab] = useState<'profile' | 'account' | 'notifications' | 'appearance'>('profile');
+ const [profileData, setProfileData] = useState({
+ name: 'João Silva',
+ email: 'joao.silva@photum.com',
+ phone: '(41) 99999-0000',
+ location: 'Curitiba, PR',
+ bio: 'Fotógrafo profissional especializado em eventos e formaturas há mais de 10 anos.',
+ avatar: 'https://i.pravatar.cc/150?img=68'
+ });
+
+ const [notificationSettings, setNotificationSettings] = useState({
+ emailNotifications: true,
+ pushNotifications: true,
+ smsNotifications: false,
+ eventReminders: true,
+ paymentAlerts: true,
+ teamUpdates: false
+ });
+
+ const [appearanceSettings, setAppearanceSettings] = useState({
+ theme: 'light',
+ language: 'pt-BR',
+ dateFormat: 'DD/MM/YYYY',
+ currency: 'BRL'
+ });
+
+ const handleSaveProfile = () => {
+ alert('Perfil atualizado com sucesso!');
+ };
+
+ const handleSaveNotifications = () => {
+ alert('Configurações de notificações salvas!');
+ };
+
+ const handleSaveAppearance = () => {
+ alert('Configurações de aparência salvas!');
+ };
+
+ return (
+
+
+ {/* Header */}
+
+
+ Configurações
+
+
+ Gerencie suas preferências e informações da conta
+
+
+
+
+ {/* Sidebar */}
+
+
+
+
+
+
+ {/* Content */}
+
+
+ {/* Profile Tab */}
+ {activeTab === 'profile' && (
+
+
Informações do Perfil
+
+
+
+
+

+
+
+
+
+
+
{profileData.name}
+
{profileData.email}
+
+ Alterar foto
+
+
+
+
+
+
+
+
+
+
+ setProfileData({ ...profileData, name: e.target.value })}
+ className="w-full pl-10 pr-4 py-3 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-brand-gold"
+ />
+
+
+
+
+
+
+
+ setProfileData({ ...profileData, email: e.target.value })}
+ className="w-full pl-10 pr-4 py-3 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-brand-gold"
+ />
+
+
+
+
+
+
+
+
setProfileData({ ...profileData, phone: e.target.value })}
+ className="w-full pl-10 pr-4 py-3 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-brand-gold"
+ />
+
+
+
+
+
+
+
+ setProfileData({ ...profileData, location: e.target.value })}
+ className="w-full pl-10 pr-4 py-3 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-brand-gold"
+ />
+
+
+
+
+
+
+
+
+
+
+ Salvar Alterações
+
+
+
+
+ )}
+
+ {/* Account Tab */}
+ {activeTab === 'account' && (
+
+
Segurança da Conta
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Atualizar Senha
+
+
+
+
+
Autenticação em Dois Fatores
+
+ Adicione uma camada extra de segurança à sua conta
+
+
+ Ativar 2FA
+
+
+
+
+ )}
+
+ {/* Notifications Tab */}
+ {activeTab === 'notifications' && (
+
+
Preferências de Notificações
+
+
+
+
+
Notificações por Email
+
Receba atualizações por email
+
+
+
+
+
+
+
Notificações Push
+
Receba notificações no navegador
+
+
+
+
+
+
+
SMS
+
Receba mensagens de texto
+
+
+
+
+
+
+
Lembretes de Eventos
+
Receba lembretes antes dos eventos
+
+
+
+
+
+
+
Alertas de Pagamento
+
Notificações sobre pagamentos
+
+
+
+
+
+
+
+ Salvar Preferências
+
+
+
+
+ )}
+
+ {/* Appearance Tab */}
+ {activeTab === 'appearance' && (
+
+
Aparência e Idioma
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Salvar Configurações
+
+
+
+
+ )}
+
+
+
+
+
+ );
+};
diff --git a/pages/Team.tsx b/pages/Team.tsx
new file mode 100644
index 0000000..fb12bf6
--- /dev/null
+++ b/pages/Team.tsx
@@ -0,0 +1,562 @@
+import React, { useState } from 'react';
+import { Users, Camera, Mail, Phone, MapPin, Star, Plus, Search, Filter, User } from 'lucide-react';
+import { Button } from '../components/Button';
+
+interface Photographer {
+ id: string;
+ name: string;
+ email: string;
+ phone: string;
+ location: string;
+ specialties: string[];
+ rating: number;
+ eventsCompleted: number;
+ status: 'active' | 'inactive' | 'busy';
+ avatar: string;
+ joinDate: string;
+}
+
+const MOCK_PHOTOGRAPHERS: Photographer[] = [
+ {
+ id: '1',
+ name: 'Carlos Silva',
+ email: 'carlos.silva@photum.com',
+ phone: '(41) 99999-1111',
+ location: 'Curitiba, PR',
+ specialties: ['Formaturas', 'Eventos Corporativos'],
+ rating: 4.8,
+ eventsCompleted: 45,
+ status: 'active',
+ avatar: 'https://i.pravatar.cc/150?img=12',
+ joinDate: '2023-01-15'
+ },
+ {
+ id: '2',
+ name: 'Ana Paula Mendes',
+ email: 'ana.mendes@photum.com',
+ phone: '(41) 99999-2222',
+ location: 'Curitiba, PR',
+ specialties: ['Casamentos', 'Formaturas'],
+ rating: 4.9,
+ eventsCompleted: 62,
+ status: 'busy',
+ avatar: 'https://i.pravatar.cc/150?img=5',
+ joinDate: '2022-08-20'
+ },
+ {
+ id: '3',
+ name: 'Roberto Costa',
+ email: 'roberto.costa@photum.com',
+ phone: '(41) 99999-3333',
+ location: 'São José dos Pinhais, PR',
+ specialties: ['Formaturas', 'Eventos Sociais'],
+ rating: 4.7,
+ eventsCompleted: 38,
+ status: 'active',
+ avatar: 'https://i.pravatar.cc/150?img=33',
+ joinDate: '2023-03-10'
+ },
+ {
+ id: '4',
+ name: 'Juliana Santos',
+ email: 'juliana.santos@photum.com',
+ phone: '(41) 99999-4444',
+ location: 'Curitiba, PR',
+ specialties: ['Casamentos', 'Ensaios'],
+ rating: 5.0,
+ eventsCompleted: 71,
+ status: 'active',
+ avatar: 'https://i.pravatar.cc/150?img=9',
+ joinDate: '2022-05-12'
+ },
+ {
+ id: '5',
+ name: 'Fernando Oliveira',
+ email: 'fernando.oliveira@photum.com',
+ phone: '(41) 99999-5555',
+ location: 'Pinhais, PR',
+ specialties: ['Eventos Corporativos', 'Formaturas'],
+ rating: 4.6,
+ eventsCompleted: 29,
+ status: 'inactive',
+ avatar: 'https://i.pravatar.cc/150?img=15',
+ joinDate: '2023-07-01'
+ },
+ {
+ id: '6',
+ name: 'Mariana Rodrigues',
+ email: 'mariana.rodrigues@photum.com',
+ phone: '(41) 99999-6666',
+ location: 'Curitiba, PR',
+ specialties: ['Formaturas', 'Eventos Sociais', 'Casamentos'],
+ rating: 4.9,
+ eventsCompleted: 54,
+ status: 'busy',
+ avatar: 'https://i.pravatar.cc/150?img=10',
+ joinDate: '2022-11-05'
+ }
+];
+
+export const TeamPage: React.FC = () => {
+ const [searchTerm, setSearchTerm] = useState('');
+ const [statusFilter, setStatusFilter] = useState<'all' | 'active' | 'busy' | 'inactive'>('all');
+ const [selectedPhotographer, setSelectedPhotographer] = useState(null);
+ const [showAddModal, setShowAddModal] = useState(false);
+ const [newPhotographer, setNewPhotographer] = useState({
+ name: '',
+ email: '',
+ phone: '',
+ location: '',
+ specialties: [] as string[],
+ });
+
+ const getStatusColor = (status: Photographer['status']) => {
+ switch (status) {
+ case 'active':
+ return 'bg-green-100 text-green-800';
+ case 'busy':
+ return 'bg-yellow-100 text-yellow-800';
+ case 'inactive':
+ return 'bg-gray-100 text-gray-800';
+ }
+ };
+
+ const getStatusLabel = (status: Photographer['status']) => {
+ switch (status) {
+ case 'active':
+ return 'Disponível';
+ case 'busy':
+ return 'Em Evento';
+ case 'inactive':
+ return 'Inativo';
+ }
+ };
+
+ const filteredPhotographers = MOCK_PHOTOGRAPHERS.filter(photographer => {
+ const matchesSearch = photographer.name.toLowerCase().includes(searchTerm.toLowerCase()) ||
+ photographer.email.toLowerCase().includes(searchTerm.toLowerCase());
+ const matchesStatus = statusFilter === 'all' || photographer.status === statusFilter;
+ return matchesSearch && matchesStatus;
+ });
+
+ const stats = {
+ total: MOCK_PHOTOGRAPHERS.length,
+ active: MOCK_PHOTOGRAPHERS.filter(p => p.status === 'active').length,
+ busy: MOCK_PHOTOGRAPHERS.filter(p => p.status === 'busy').length,
+ avgRating: (MOCK_PHOTOGRAPHERS.reduce((acc, p) => acc + p.rating, 0) / MOCK_PHOTOGRAPHERS.length).toFixed(1)
+ };
+
+ return (
+
+
+ {/* Header */}
+
+
+ Equipe & Fotógrafos
+
+
+ Gerencie sua equipe de fotógrafos profissionais
+
+
+
+ {/* Stats */}
+
+
+
+
+
Total de Fotógrafos
+
{stats.total}
+
+
+
+
+
+
+
+
Disponíveis
+
{stats.active}
+
+
+
+
+
+
+
+
Em Evento
+
{stats.busy}
+
+
+
+
+
+
+
+
Avaliação Média
+
{stats.avgRating}
+
+
+
+
+
+
+ {/* Filters and Search */}
+
+
+
+
+ setSearchTerm(e.target.value)}
+ className="w-full pl-10 pr-4 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-brand-gold"
+ />
+
+
+ setStatusFilter('all')}
+ className={`px-4 py-2 rounded-md font-medium transition-colors ${statusFilter === 'all'
+ ? 'bg-brand-gold text-white'
+ : 'bg-gray-100 text-gray-700 hover:bg-gray-200'
+ }`}
+ >
+ Todos
+
+ setStatusFilter('active')}
+ className={`px-4 py-2 rounded-md font-medium transition-colors ${statusFilter === 'active'
+ ? 'bg-green-600 text-white'
+ : 'bg-gray-100 text-gray-700 hover:bg-gray-200'
+ }`}
+ >
+ Disponíveis
+
+ setStatusFilter('busy')}
+ className={`px-4 py-2 rounded-md font-medium transition-colors ${statusFilter === 'busy'
+ ? 'bg-yellow-600 text-white'
+ : 'bg-gray-100 text-gray-700 hover:bg-gray-200'
+ }`}
+ >
+ Em Evento
+
+
+
setShowAddModal(true)}>
+
+ Adicionar Fotógrafo
+
+
+
+
+ {/* Photographers Grid */}
+
+ {filteredPhotographers.map((photographer) => (
+
setSelectedPhotographer(photographer)}
+ >
+
+
+
+

+
+
{photographer.name}
+
+
+ {photographer.rating}
+ ({photographer.eventsCompleted} eventos)
+
+
+
+
+ {getStatusLabel(photographer.status)}
+
+
+
+
+
+
+ {photographer.email}
+
+
+
+ {photographer.phone}
+
+
+
+ {photographer.location}
+
+
+
+
+ {photographer.specialties.map((specialty, index) => (
+
+ {specialty}
+
+ ))}
+
+
+
+ ))}
+
+
+ {filteredPhotographers.length === 0 && (
+
+
+
Nenhum fotógrafo encontrado
+
+ )}
+
+
+ {/* Add Photographer Modal */}
+ {showAddModal && (
+
setShowAddModal(false)}
+ >
+
e.stopPropagation()}
+ >
+
+
+ Adicionar Novo Fotógrafo
+
+ setShowAddModal(false)}
+ className="text-gray-400 hover:text-gray-600"
+ >
+ ✕
+
+
+
+
+
+
+ )}
+
+ {/* Photographer Detail Modal */}
+ {selectedPhotographer && (
+
setSelectedPhotographer(null)}
+ >
+
e.stopPropagation()}
+ >
+
+

+
+
+
+
+ {selectedPhotographer.name}
+
+
+
+ {selectedPhotographer.rating}
+
+ ({selectedPhotographer.eventsCompleted} eventos concluídos)
+
+
+
+ {getStatusLabel(selectedPhotographer.status)}
+
+
+
setSelectedPhotographer(null)}
+ className="text-gray-400 hover:text-gray-600"
+ >
+ ✕
+
+
+
+
+
+
+
+
+ {selectedPhotographer.email}
+
+
+
+
{selectedPhotographer.phone}
+
+
+
+ {selectedPhotographer.location}
+
+
+
+
+
Especialidades
+
+ {selectedPhotographer.specialties.map((specialty, index) => (
+
+ {specialty}
+
+ ))}
+
+
+
+
+ setSelectedPhotographer(null)}
+ className="flex-1 px-6 py-3 bg-gray-100 text-gray-700 rounded-md hover:bg-gray-200 transition-colors font-medium"
+ >
+ Fechar
+
+
+ Ver Agenda
+
+
+
+
+ )}
+
+ );
+};
diff --git a/public/HOME_01.jpg b/public/HOME_01.jpg
new file mode 100644
index 0000000..cde0c40
Binary files /dev/null and b/public/HOME_01.jpg differ
diff --git a/public/banner2.jpg b/public/banner2.jpg
new file mode 100644
index 0000000..d540b8d
Binary files /dev/null and b/public/banner2.jpg differ
diff --git a/public/logo.png b/public/logo.png
new file mode 100644
index 0000000..9f3ea3e
Binary files /dev/null and b/public/logo.png differ