xertica-ui 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/App.tsx +182 -0
- package/README.md +330 -0
- package/assets/xertica-logo.svg +38 -0
- package/assets/xertica-x-logo.svg +21 -0
- package/bin/cli.ts +193 -0
- package/components/AssistenteXertica.tsx +2003 -0
- package/components/AudioPlayer.tsx +203 -0
- package/components/CodeBlock.tsx +242 -0
- package/components/DocumentEditor.tsx +504 -0
- package/components/ForgotPasswordPage.tsx +170 -0
- package/components/FormattedDocument.tsx +87 -0
- package/components/HomeContent.tsx +123 -0
- package/components/HomePage.tsx +70 -0
- package/components/LanguageSelector.tsx +54 -0
- package/components/LoginPage.tsx +199 -0
- package/components/MarkdownMessage.tsx +62 -0
- package/components/ModernChatInput.tsx +502 -0
- package/components/PodcastPlayer.tsx +409 -0
- package/components/ResetPasswordPage.tsx +234 -0
- package/components/Sidebar.tsx +489 -0
- package/components/TemplateContent.tsx +629 -0
- package/components/TemplatePage.tsx +70 -0
- package/components/ThemeToggle.tsx +65 -0
- package/components/VerifyEmailPage.tsx +187 -0
- package/components/XerticaLogo.tsx +69 -0
- package/components/XerticaOrbe.tsx +1339 -0
- package/components/XerticaXLogo.tsx +53 -0
- package/components/examples/DrawingMapExample.tsx +530 -0
- package/components/examples/FilterableMapExample.tsx +380 -0
- package/components/examples/LocationPickerExample.tsx +330 -0
- package/components/examples/MapExamples.tsx +280 -0
- package/components/examples/MapShowcase.tsx +446 -0
- package/components/examples/RouteMapExamples.tsx +329 -0
- package/components/examples/SimpleFilterableMap.tsx +192 -0
- package/components/examples/index.ts +52 -0
- package/components/figma/ImageWithFallback.tsx +27 -0
- package/components/index.ts +44 -0
- package/components/media/AudioPlayer.tsx +278 -0
- package/components/media/FloatingMediaWrapper.tsx +166 -0
- package/components/media/VideoPlayer.tsx +285 -0
- package/components/ui/accordion.tsx +66 -0
- package/components/ui/alert-dialog.tsx +159 -0
- package/components/ui/alert.tsx +91 -0
- package/components/ui/aspect-ratio.tsx +11 -0
- package/components/ui/avatar.tsx +65 -0
- package/components/ui/badge.tsx +55 -0
- package/components/ui/breadcrumb.tsx +109 -0
- package/components/ui/button.tsx +78 -0
- package/components/ui/calendar.tsx +235 -0
- package/components/ui/card.tsx +92 -0
- package/components/ui/carousel.tsx +241 -0
- package/components/ui/chart.tsx +353 -0
- package/components/ui/checkbox.tsx +32 -0
- package/components/ui/collapsible.tsx +33 -0
- package/components/ui/command.tsx +177 -0
- package/components/ui/context-menu.tsx +252 -0
- package/components/ui/dialog.tsx +138 -0
- package/components/ui/drawer.tsx +134 -0
- package/components/ui/dropdown-menu.tsx +257 -0
- package/components/ui/empty.tsx +90 -0
- package/components/ui/file-upload.tsx +152 -0
- package/components/ui/form.tsx +195 -0
- package/components/ui/google-maps-loader.tsx +379 -0
- package/components/ui/hover-card.tsx +44 -0
- package/components/ui/index.ts +242 -0
- package/components/ui/input-otp.tsx +77 -0
- package/components/ui/input.tsx +38 -0
- package/components/ui/label.tsx +24 -0
- package/components/ui/map-config.ts +12 -0
- package/components/ui/map-layers.tsx +129 -0
- package/components/ui/map.exports.ts +31 -0
- package/components/ui/map.tsx +412 -0
- package/components/ui/menubar.tsx +276 -0
- package/components/ui/navigation-menu.tsx +162 -0
- package/components/ui/notification-badge.tsx +61 -0
- package/components/ui/page-header.tsx +229 -0
- package/components/ui/pagination.tsx +127 -0
- package/components/ui/popover.tsx +48 -0
- package/components/ui/progress.tsx +31 -0
- package/components/ui/radio-group.tsx +56 -0
- package/components/ui/rating.tsx +102 -0
- package/components/ui/resizable.tsx +405 -0
- package/components/ui/route-map.tsx +246 -0
- package/components/ui/scroll-area.tsx +58 -0
- package/components/ui/search.tsx +70 -0
- package/components/ui/select.tsx +176 -0
- package/components/ui/separator.tsx +28 -0
- package/components/ui/sheet.tsx +138 -0
- package/components/ui/sidebar.tsx +726 -0
- package/components/ui/simple-map.tsx +92 -0
- package/components/ui/skeleton.tsx +13 -0
- package/components/ui/slider.tsx +58 -0
- package/components/ui/sonner.tsx +77 -0
- package/components/ui/stats-card.tsx +84 -0
- package/components/ui/stepper.tsx +126 -0
- package/components/ui/switch.tsx +34 -0
- package/components/ui/table.tsx +116 -0
- package/components/ui/tabs.tsx +66 -0
- package/components/ui/textarea.tsx +26 -0
- package/components/ui/timeline.tsx +140 -0
- package/components/ui/toggle-group.tsx +71 -0
- package/components/ui/toggle.tsx +46 -0
- package/components/ui/tooltip.tsx +61 -0
- package/components/ui/tree-view.tsx +123 -0
- package/components/ui/use-mobile.ts +24 -0
- package/components/ui/utils.ts +6 -0
- package/components/ui/xertica-assistant.tsx +1420 -0
- package/contexts/ApiKeyContext.tsx +123 -0
- package/contexts/AssistenteContext.tsx +118 -0
- package/contexts/BrandColorsContext.tsx +551 -0
- package/contexts/LanguageContext.tsx +36 -0
- package/contexts/ThemeContext.tsx +85 -0
- package/dist/cli.js +20922 -0
- package/eslint.config.js +41 -0
- package/guidelines/Guidelines.md +61 -0
- package/hooks/useTheme.ts +4 -0
- package/imports/Podcast.tsx +389 -0
- package/imports/XerticaAi.tsx +46 -0
- package/imports/XerticaX.tsx +20 -0
- package/imports/svg-aueiaqngck.ts +11 -0
- package/imports/svg-v9krss1ozd.ts +16 -0
- package/imports/svg-vhrdofe3qe.ts +5 -0
- package/index.css +4448 -0
- package/index.html +14 -0
- package/main.tsx +10 -0
- package/package.json +119 -0
- package/postcss.config.js +6 -0
- package/routes.tsx +33 -0
- package/styles/globals.css +15 -0
- package/styles/xertica/app-overrides/chat.css +61 -0
- package/styles/xertica/app-overrides/scrollbar.css +33 -0
- package/styles/xertica/base.css +70 -0
- package/styles/xertica/integrations/google-maps.css +76 -0
- package/styles/xertica/integrations/sonner.css +73 -0
- package/styles/xertica/theme-map.css +88 -0
- package/styles/xertica/tokens.css +190 -0
- package/tsconfig.json +31 -0
- package/tsconfig.node.json +10 -0
- package/utils/gemini.ts +140 -0
- package/vite-env.d.ts +12 -0
- package/vite.config.ts +36 -0
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import React, { useState } from 'react';
|
|
2
|
+
import { useLocation, useNavigate } from 'react-router';
|
|
3
|
+
import { Sidebar } from './Sidebar';
|
|
4
|
+
import { TemplateContent } from './TemplateContent';
|
|
5
|
+
import { AssistenteXertica } from './AssistenteXertica';
|
|
6
|
+
|
|
7
|
+
interface TemplatePageProps {
|
|
8
|
+
user: { email: string } | null;
|
|
9
|
+
onLogout: () => void;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export function TemplatePage({ user, onLogout }: TemplatePageProps) {
|
|
13
|
+
const [sidebarExpanded, setSidebarExpanded] = useState(false);
|
|
14
|
+
const [assistenteExpanded, setAssistenteExpanded] = useState(false);
|
|
15
|
+
const location = useLocation();
|
|
16
|
+
const navigate = useNavigate();
|
|
17
|
+
|
|
18
|
+
// Função para alternar a sidebar - fecha o assistente se estiver aberto
|
|
19
|
+
const handleToggleSidebar = () => {
|
|
20
|
+
if (!sidebarExpanded && assistenteExpanded) {
|
|
21
|
+
// Se a sidebar vai abrir e o assistente está aberto, fechar o assistente
|
|
22
|
+
setAssistenteExpanded(false);
|
|
23
|
+
}
|
|
24
|
+
setSidebarExpanded(!sidebarExpanded);
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
// Função para alternar o assistente - fecha a sidebar se estiver aberta
|
|
28
|
+
const handleToggleAssistente = () => {
|
|
29
|
+
if (!assistenteExpanded && sidebarExpanded) {
|
|
30
|
+
// Se o assistente vai abrir e a sidebar está aberta, fechar a sidebar
|
|
31
|
+
setSidebarExpanded(false);
|
|
32
|
+
}
|
|
33
|
+
setAssistenteExpanded(!assistenteExpanded);
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
// Função para abrir assistente com tab específica - fecha a sidebar se estiver aberta
|
|
37
|
+
const handleToggleAssistenteWithTab = (tab: string) => {
|
|
38
|
+
if (!assistenteExpanded) {
|
|
39
|
+
if (sidebarExpanded) {
|
|
40
|
+
// Se o assistente vai abrir e a sidebar está aberta, fechar a sidebar
|
|
41
|
+
setSidebarExpanded(false);
|
|
42
|
+
}
|
|
43
|
+
setAssistenteExpanded(true);
|
|
44
|
+
}
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
return (
|
|
48
|
+
<div className="h-screen flex bg-muted overflow-hidden relative">
|
|
49
|
+
<Sidebar
|
|
50
|
+
expanded={sidebarExpanded}
|
|
51
|
+
onToggle={handleToggleSidebar}
|
|
52
|
+
user={user}
|
|
53
|
+
onLogout={onLogout}
|
|
54
|
+
location={location}
|
|
55
|
+
navigate={navigate}
|
|
56
|
+
/>
|
|
57
|
+
<TemplateContent
|
|
58
|
+
sidebarExpanded={sidebarExpanded}
|
|
59
|
+
assistenteExpanded={assistenteExpanded}
|
|
60
|
+
onToggleSidebar={handleToggleSidebar}
|
|
61
|
+
onToggleAssistente={handleToggleAssistente}
|
|
62
|
+
/>
|
|
63
|
+
<AssistenteXertica
|
|
64
|
+
isExpanded={assistenteExpanded}
|
|
65
|
+
onToggle={handleToggleAssistente}
|
|
66
|
+
onToggleWithTab={handleToggleAssistenteWithTab}
|
|
67
|
+
/>
|
|
68
|
+
</div>
|
|
69
|
+
);
|
|
70
|
+
}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { Sun, Moon } from 'lucide-react';
|
|
3
|
+
import { Button } from './ui/button';
|
|
4
|
+
import { useTheme } from '../contexts/ThemeContext';
|
|
5
|
+
|
|
6
|
+
interface ThemeToggleProps {
|
|
7
|
+
size?: 'sm' | 'md' | 'lg';
|
|
8
|
+
variant?: 'default' | 'outline' | 'ghost';
|
|
9
|
+
className?: string;
|
|
10
|
+
showLabel?: boolean;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export function ThemeToggle({
|
|
14
|
+
size = 'md',
|
|
15
|
+
variant = 'ghost',
|
|
16
|
+
className = '',
|
|
17
|
+
showLabel = false
|
|
18
|
+
}: ThemeToggleProps) {
|
|
19
|
+
const { theme, toggleTheme, isDark } = useTheme();
|
|
20
|
+
|
|
21
|
+
const getSizeClasses = () => {
|
|
22
|
+
switch (size) {
|
|
23
|
+
case 'sm':
|
|
24
|
+
return 'h-8 w-8 p-0';
|
|
25
|
+
case 'lg':
|
|
26
|
+
return 'h-12 w-12 p-0';
|
|
27
|
+
default:
|
|
28
|
+
return 'h-9 w-9 p-0';
|
|
29
|
+
}
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
const getIconSize = () => {
|
|
33
|
+
switch (size) {
|
|
34
|
+
case 'sm':
|
|
35
|
+
return 'h-3 w-3';
|
|
36
|
+
case 'lg':
|
|
37
|
+
return 'h-6 w-6';
|
|
38
|
+
default:
|
|
39
|
+
return 'h-4 w-4';
|
|
40
|
+
}
|
|
41
|
+
};
|
|
42
|
+
|
|
43
|
+
const buttonClasses = showLabel ? 'flex items-center gap-2 px-3 py-2' : getSizeClasses();
|
|
44
|
+
|
|
45
|
+
return (
|
|
46
|
+
<Button
|
|
47
|
+
variant={variant}
|
|
48
|
+
onClick={toggleTheme}
|
|
49
|
+
className={`group ${buttonClasses} transition-all duration-200 hover:scale-105 ${className}`}
|
|
50
|
+
title={isDark ? 'Alternar para tema claro' : 'Alternar para tema escuro'}
|
|
51
|
+
>
|
|
52
|
+
{isDark ? (
|
|
53
|
+
<>
|
|
54
|
+
<Sun className={`${getIconSize()} text-[var(--primary)] group-hover:opacity-80`} />
|
|
55
|
+
{showLabel && <span>Tema Claro</span>}
|
|
56
|
+
</>
|
|
57
|
+
) : (
|
|
58
|
+
<>
|
|
59
|
+
<Moon className={`${getIconSize()} text-muted-foreground group-hover:text-foreground`} />
|
|
60
|
+
{showLabel && <span>Tema Escuro</span>}
|
|
61
|
+
</>
|
|
62
|
+
)}
|
|
63
|
+
</Button>
|
|
64
|
+
);
|
|
65
|
+
}
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
import React, { useState } from 'react';
|
|
2
|
+
import { Button } from './ui/button';
|
|
3
|
+
import { XerticaLogo } from './XerticaLogo';
|
|
4
|
+
import { ImageWithFallback } from './figma/ImageWithFallback';
|
|
5
|
+
import { LanguageSelector } from './LanguageSelector';
|
|
6
|
+
import { ArrowLeft, Mail, CheckCircle2, Lock } from 'lucide-react';
|
|
7
|
+
import { useNavigate, useLocation } from 'react-router';
|
|
8
|
+
|
|
9
|
+
export function VerifyEmailPage() {
|
|
10
|
+
const navigate = useNavigate();
|
|
11
|
+
const location = useLocation();
|
|
12
|
+
const email = location.state?.email || 'seu@email.com';
|
|
13
|
+
const [isResending, setIsResending] = useState(false);
|
|
14
|
+
const [resendSuccess, setResendSuccess] = useState(false);
|
|
15
|
+
|
|
16
|
+
const handleResend = async () => {
|
|
17
|
+
setIsResending(true);
|
|
18
|
+
setResendSuccess(false);
|
|
19
|
+
|
|
20
|
+
// Simula reenvio de email
|
|
21
|
+
await new Promise(resolve => setTimeout(resolve, 1500));
|
|
22
|
+
|
|
23
|
+
setIsResending(false);
|
|
24
|
+
setResendSuccess(true);
|
|
25
|
+
|
|
26
|
+
// Remove mensagem de sucesso após 3 segundos
|
|
27
|
+
setTimeout(() => setResendSuccess(false), 3000);
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
const handleSocialLogin = (provider: string) => {
|
|
31
|
+
// Simula login social/SSO
|
|
32
|
+
console.log(`Login com ${provider}`);
|
|
33
|
+
// Aqui seria implementada a integração real com cada provedor
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
return (
|
|
37
|
+
<div className="min-h-screen flex">
|
|
38
|
+
{/* Lado esquerdo - Imagem de fundo completa */}
|
|
39
|
+
<div className="hidden lg:flex lg:flex-1 relative overflow-hidden">
|
|
40
|
+
{/* Imagem de fundo preenchendo todo o espaço */}
|
|
41
|
+
<ImageWithFallback
|
|
42
|
+
src="https://images.unsplash.com/photo-1563986768609-322da13575f3?w=1200&h=800&fit=crop&auto=format"
|
|
43
|
+
alt="Email e comunicação"
|
|
44
|
+
className="absolute inset-0 w-full h-full object-cover"
|
|
45
|
+
/>
|
|
46
|
+
|
|
47
|
+
{/* Overlay com gradiente */}
|
|
48
|
+
<div className="absolute inset-0 bg-[image:var(--gradient-diagonal)] opacity-80" />
|
|
49
|
+
</div>
|
|
50
|
+
|
|
51
|
+
{/* Lado direito - Conteúdo */}
|
|
52
|
+
<div className="flex-1 flex items-center justify-center px-4 sm:px-6 lg:px-8 lg:flex-none lg:w-1/2 relative bg-muted">
|
|
53
|
+
{/* Seletor de idioma no canto superior direito */}
|
|
54
|
+
<div className="absolute top-4 right-4 z-20">
|
|
55
|
+
<LanguageSelector variant="minimal" showIcon={false} />
|
|
56
|
+
</div>
|
|
57
|
+
|
|
58
|
+
{/* Gradiente de fundo para mobile */}
|
|
59
|
+
<div className="absolute inset-0 lg:hidden bg-[image:var(--gradient-diagonal)] opacity-10 dark:opacity-5" />
|
|
60
|
+
|
|
61
|
+
<div className="w-full max-w-sm space-y-6 relative z-10">
|
|
62
|
+
{/* Header do formulário */}
|
|
63
|
+
<div className="text-center">
|
|
64
|
+
<div className="flex items-center justify-center mb-4">
|
|
65
|
+
<XerticaLogo
|
|
66
|
+
className="h-12 w-auto text-primary dark:text-foreground"
|
|
67
|
+
variant="theme"
|
|
68
|
+
/>
|
|
69
|
+
</div>
|
|
70
|
+
|
|
71
|
+
{/* Ícone de email */}
|
|
72
|
+
<div className="flex items-center justify-center mb-4">
|
|
73
|
+
<div className="p-4 bg-primary/10 rounded-[var(--radius)]">
|
|
74
|
+
<Mail className="w-12 h-12 text-primary" />
|
|
75
|
+
</div>
|
|
76
|
+
</div>
|
|
77
|
+
|
|
78
|
+
<h2 className="text-sm text-muted-foreground">Verifique seu email</h2>
|
|
79
|
+
<p className="mt-2 text-muted-foreground">
|
|
80
|
+
Enviamos instruções para redefinir sua senha para:
|
|
81
|
+
</p>
|
|
82
|
+
<p className="mt-1 text-primary">
|
|
83
|
+
{email}
|
|
84
|
+
</p>
|
|
85
|
+
</div>
|
|
86
|
+
|
|
87
|
+
{/* Instruções */}
|
|
88
|
+
<div className="bg-accent rounded-[var(--radius)] p-4 space-y-3">
|
|
89
|
+
<p className="text-muted-foreground">
|
|
90
|
+
Siga as instruções no email para redefinir sua senha. O link expira em 24 horas.
|
|
91
|
+
</p>
|
|
92
|
+
<div className="flex items-start gap-2 text-muted-foreground">
|
|
93
|
+
<CheckCircle2 className="w-4 h-4 mt-0.5 flex-shrink-0 text-[var(--chart-2)]" />
|
|
94
|
+
<span className="text-sm">Verifique a caixa de spam se não encontrar o email</span>
|
|
95
|
+
</div>
|
|
96
|
+
</div>
|
|
97
|
+
|
|
98
|
+
{/* Mensagem de sucesso ao reenviar */}
|
|
99
|
+
{resendSuccess && (
|
|
100
|
+
<div className="bg-[var(--chart-2)]/10 border border-[var(--chart-2)]/20 rounded-[var(--radius)] p-3 flex items-center gap-2">
|
|
101
|
+
<CheckCircle2 className="w-5 h-5 text-[var(--chart-2)] flex-shrink-0" />
|
|
102
|
+
<span className="text-sm text-[var(--chart-2)]">Email reenviado com sucesso!</span>
|
|
103
|
+
</div>
|
|
104
|
+
)}
|
|
105
|
+
|
|
106
|
+
{/* Botões de ação */}
|
|
107
|
+
<div className="space-y-3">
|
|
108
|
+
<p className="text-center text-muted-foreground">
|
|
109
|
+
Não recebeu o email?
|
|
110
|
+
</p>
|
|
111
|
+
<Button
|
|
112
|
+
variant="outline"
|
|
113
|
+
className="w-full"
|
|
114
|
+
onClick={handleResend}
|
|
115
|
+
disabled={isResending}
|
|
116
|
+
>
|
|
117
|
+
{isResending ? 'Reenviando...' : 'Reenviar email'}
|
|
118
|
+
</Button>
|
|
119
|
+
|
|
120
|
+
<Button
|
|
121
|
+
type="button"
|
|
122
|
+
onClick={() => navigate('/login')}
|
|
123
|
+
variant="outline"
|
|
124
|
+
className="w-full text-muted-foreground hover:text-foreground"
|
|
125
|
+
>
|
|
126
|
+
<ArrowLeft className="w-4 h-4 mr-2" />
|
|
127
|
+
Voltar para login
|
|
128
|
+
</Button>
|
|
129
|
+
</div>
|
|
130
|
+
|
|
131
|
+
{/* Divider */}
|
|
132
|
+
<div className="relative">
|
|
133
|
+
<div className="absolute inset-0 flex items-center">
|
|
134
|
+
<div className="w-full border-t border-border"></div>
|
|
135
|
+
</div>
|
|
136
|
+
<div className="relative flex justify-center text-sm">
|
|
137
|
+
<span className="bg-muted px-2 text-muted-foreground">
|
|
138
|
+
ou continuar com
|
|
139
|
+
</span>
|
|
140
|
+
</div>
|
|
141
|
+
</div>
|
|
142
|
+
|
|
143
|
+
{/* Opções de login social/SSO */}
|
|
144
|
+
<div className="space-y-3">
|
|
145
|
+
{/* Google */}
|
|
146
|
+
<Button
|
|
147
|
+
type="button"
|
|
148
|
+
variant="outline"
|
|
149
|
+
className="w-full justify-center"
|
|
150
|
+
onClick={() => handleSocialLogin('Google')}
|
|
151
|
+
>
|
|
152
|
+
<svg className="w-5 h-5 mr-2" viewBox="0 0 48 48" xmlns="http://www.w3.org/2000/svg">
|
|
153
|
+
<path fill="#EA4335" d="M24 9.5c3.54 0 6.71 1.22 9.21 3.6l6.85-6.85C35.9 2.38 30.47 0 24 0 14.62 0 6.51 5.38 2.56 13.22l7.98 6.19C12.43 13.72 17.74 9.5 24 9.5z"></path>
|
|
154
|
+
<path fill="#4285F4" d="M46.98 24.55c0-1.57-.15-3.09-.38-4.55H24v9.02h12.94c-.58 2.96-2.26 5.48-4.78 7.18l7.73 6c4.51-4.18 7.09-10.36 7.09-17.65z"></path>
|
|
155
|
+
<path fill="#FBBC05" d="M10.53 28.59c-.48-1.45-.76-2.99-.76-4.59s.27-3.14.76-4.59l-7.98-6.19C.92 16.46 0 20.12 0 24c0 3.88.92 7.54 2.56 10.78l7.97-6.19z"></path>
|
|
156
|
+
<path fill="#34A853" d="M24 48c6.48 0 11.93-2.13 15.89-5.81l-7.73-6c-2.15 1.45-4.92 2.3-8.16 2.3-6.26 0-11.57-4.22-13.47-9.91l-7.98 6.19C6.51 42.62 14.62 48 24 48z"></path>
|
|
157
|
+
<path fill="none" d="M0 0h48v48H0z"></path>
|
|
158
|
+
</svg>
|
|
159
|
+
<span>Entrar com Google</span>
|
|
160
|
+
</Button>
|
|
161
|
+
|
|
162
|
+
{/* MT Login */}
|
|
163
|
+
<Button
|
|
164
|
+
type="button"
|
|
165
|
+
variant="outline"
|
|
166
|
+
className="w-full justify-center"
|
|
167
|
+
onClick={() => handleSocialLogin('MT Login')}
|
|
168
|
+
>
|
|
169
|
+
<Lock className="w-5 h-5 mr-2 text-[var(--chart-4)]" />
|
|
170
|
+
<span>Entrar com MT Login</span>
|
|
171
|
+
</Button>
|
|
172
|
+
|
|
173
|
+
{/* gov.br */}
|
|
174
|
+
<Button
|
|
175
|
+
type="button"
|
|
176
|
+
variant="outline"
|
|
177
|
+
className="w-full justify-center font-normal"
|
|
178
|
+
onClick={() => handleSocialLogin('gov.br')}
|
|
179
|
+
>
|
|
180
|
+
<span>Entrar com <strong className="font-semibold">gov.br</strong></span>
|
|
181
|
+
</Button>
|
|
182
|
+
</div>
|
|
183
|
+
</div>
|
|
184
|
+
</div>
|
|
185
|
+
</div>
|
|
186
|
+
);
|
|
187
|
+
}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
|
|
3
|
+
interface XerticaLogoProps {
|
|
4
|
+
className?: string;
|
|
5
|
+
color?: string;
|
|
6
|
+
variant?: 'default' | 'white' | 'theme';
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
export function XerticaLogo({
|
|
10
|
+
className = "w-auto h-8",
|
|
11
|
+
color,
|
|
12
|
+
variant = 'default'
|
|
13
|
+
}: XerticaLogoProps) {
|
|
14
|
+
|
|
15
|
+
// Determinar a cor baseada na variante
|
|
16
|
+
const getColor = () => {
|
|
17
|
+
if (color) return color;
|
|
18
|
+
|
|
19
|
+
switch (variant) {
|
|
20
|
+
case 'white':
|
|
21
|
+
return '#FFFFFF';
|
|
22
|
+
case 'theme':
|
|
23
|
+
return 'currentColor';
|
|
24
|
+
default:
|
|
25
|
+
return 'var(--primary)';
|
|
26
|
+
}
|
|
27
|
+
};
|
|
28
|
+
return (
|
|
29
|
+
<svg
|
|
30
|
+
className={className}
|
|
31
|
+
fill="none"
|
|
32
|
+
preserveAspectRatio="xMidYMid meet"
|
|
33
|
+
viewBox="0 0 1543 289"
|
|
34
|
+
xmlns="http://www.w3.org/2000/svg"
|
|
35
|
+
>
|
|
36
|
+
<g id="Xertica.ai">
|
|
37
|
+
<path d="M1352.82 239.808V285.425H1304.73V239.808H1352.82Z" fill={getColor()} />
|
|
38
|
+
<path d="M814.8 284.848H766.711V77.4971H814.8V284.848Z" fill={getColor()} />
|
|
39
|
+
<path d="M1543 284.438H1514.2V160.28H1543V284.438Z" fill={getColor()} />
|
|
40
|
+
<path
|
|
41
|
+
clipRule="evenodd"
|
|
42
|
+
d="M1432.83 157.796C1446.98 157.796 1459.14 162.515 1468.58 170.709V160.28H1497.38V284.438H1468.58V274.01C1459.14 282.451 1446.98 286.921 1432.83 286.921C1395.1 286.921 1368.29 260.352 1368.29 222.359C1368.29 184.616 1395.1 157.796 1432.83 157.796ZM1432.83 183.778C1410.79 183.778 1396.27 199.061 1396.27 222.359C1396.27 245.658 1410.79 260.94 1432.83 260.94C1454.63 260.94 1468.9 245.658 1468.9 222.359C1468.9 199.06 1454.63 183.778 1432.83 183.778Z"
|
|
43
|
+
fill={getColor()}
|
|
44
|
+
fillRule="evenodd"
|
|
45
|
+
/>
|
|
46
|
+
<path d="M947.87 73.3516C1002.88 73.3516 1044.42 107.647 1053.57 159.234H1004.68C997.221 132.988 976.34 117.308 947.87 117.308C911.387 117.308 887.337 142.612 887.337 181.176C887.337 219.739 911.387 245.036 947.87 245.036C976.34 245.036 997.221 229.356 1004.68 203.109H1053.57C1044.47 254.701 1003.26 289 947.87 289C884.853 289 840.078 244.626 840.078 181.176C840.078 118.142 884.854 73.3516 947.87 73.3516Z" fill={getColor()} />
|
|
47
|
+
<path d="M88.4971 39.8242L157.353 142.191L83.5371 251.524L60.9277 284.854H0L96.3154 142.191L5.37695 7H66.3047L88.4971 39.8242Z" fill={getColor()} />
|
|
48
|
+
<path d="M254.314 284.855H193.387L151.914 223.71L182.548 178.551L254.314 284.855Z" fill={getColor()} />
|
|
49
|
+
<path
|
|
50
|
+
clipRule="evenodd"
|
|
51
|
+
d="M1179.14 73.3477C1202.77 73.3477 1223.08 81.2286 1238.84 94.9121V77.4971H1286.94V284.847H1238.84V267.431C1223.09 281.528 1202.77 288.992 1179.14 288.992C1116.12 288.992 1071.35 244.622 1071.35 181.172C1071.35 118.139 1116.12 73.3478 1179.14 73.3477ZM1179.14 117.308C1142.66 117.308 1118.61 142.604 1118.61 181.172C1118.61 219.739 1142.66 245.035 1179.14 245.035C1215.21 245.035 1238.84 219.739 1238.84 181.172C1238.84 142.605 1215.21 117.308 1179.14 117.308Z"
|
|
52
|
+
fill={getColor()}
|
|
53
|
+
fillRule="evenodd"
|
|
54
|
+
/>
|
|
55
|
+
<path d="M1543 145.383H1514.2V118.067H1543V145.383Z" fill={getColor()} />
|
|
56
|
+
<path d="M672.466 77.501H736.31V121.457H672.466V211.448C672.466 230.939 682.415 240.891 702.313 240.891H736.309V284.852H698.999C649.246 284.851 625.203 259.968 625.203 211.449V7H672.466V77.501Z" fill={getColor()} />
|
|
57
|
+
<path d="M814.8 52.6172H766.711V7H814.8V52.6172Z" fill={getColor()} />
|
|
58
|
+
<path
|
|
59
|
+
clipRule="evenodd"
|
|
60
|
+
d="M354.069 73.3516C417.086 73.3517 461.864 118.143 461.864 181.176C461.864 187.396 461.031 193.615 460.204 199.422H295.197C301.829 228.864 323.392 246.696 354.069 246.696C372.724 246.696 389.309 241.721 399.675 226.376H452.742C441.132 265.774 400.501 288.996 354.069 288.996C291.053 288.996 246.274 244.626 246.273 181.176C246.273 118.142 291.053 73.3516 354.069 73.3516ZM354.068 115.65C325.044 115.65 303.902 131.826 296.44 158.78H410.863C403.819 131.826 382.672 115.65 354.068 115.65Z"
|
|
61
|
+
fill={getColor()}
|
|
62
|
+
fillRule="evenodd"
|
|
63
|
+
/>
|
|
64
|
+
<path d="M596.957 121.453H562.962C543.064 121.453 533.114 131.409 533.114 150.899V284.847H485.852V150.899C485.852 102.38 509.894 77.4972 559.647 77.4971H596.957V121.453Z" fill={getColor()} />
|
|
65
|
+
<path d="M182.552 98.6992L151.922 53.3906L188.014 0H248.941L182.552 98.6992Z" fill={getColor()} />
|
|
66
|
+
</g>
|
|
67
|
+
</svg>
|
|
68
|
+
);
|
|
69
|
+
}
|