Acordos Internacionais
Revisão em 19h21min de 25 de julho de 2025 por Fiquemsabendo (discussão | contribs) (Criou a página com "import React, { useState, useEffect } from 'react'; import { Search, Globe, FileText, AlertCircle, ExternalLink, Calendar, MapPin, DollarSign, Shield, Users, Database, Downl...")
import React, { useState, useEffect } from 'react'; import { Search, Globe, FileText, AlertCircle, ExternalLink, Calendar, MapPin, DollarSign, Shield, Users, Database, Download, Copy, CheckCircle } from 'lucide-react';
// Dados estruturados do documento const ACORDOS_DATA = {
definicao: {
titulo: "Acordos Internacionais",
descricao: "Documentos pelos quais um Estado ou uma organização internacional assume obrigações e adquire direitos perante outros no âmbito internacional.",
tipos: ["Tratados", "Convenções", "Acordos", "Protocolos"],
caracteristicas: [
"Estabelecem regras concretas para parcerias",
"Criam compromisso jurídico",
"Definem formas de cooperação futura"
]
},
casos: [
{
id: 'bbnj',
nome: "Acordo BBNJ",
descricao: "Biodiversidade Marinha em Áreas Além da Jurisdição Nacional",
ano: 2023,
status: "Assinado - Aguardando Ratificação",
propostas: [
"Criação de áreas marinhas protegidas",
"Avaliações de impacto ambiental",
"Financiamento baseado em exploração genética marinha",
"Incentivo à cooperação científica"
],
participantes: ["Brasil", "Vários países"]
},
{
id: 'norman401',
nome: "Norman-401 - Sanções Ambientais",
descricao: "Prevenção da Poluição por Embarcações e Plataformas",
periodo: "2019-2024",
orgao: "Marinha do Brasil",
dados: [
"Registros por distritos navais",
"Incidentes com derramamento de óleo",
"Identificação de embarcações",
"Valores de multas",
"Sistema Sisauto"
]
},
{
id: 'vtmis',
nome: "Sistema VTMIS - Ilha da Moela",
descricao: "Sistema de Gerenciamento de Tráfego de Embarcações",
ano: 2025,
parceiros: ["Autoridade Portuária de Santos", "Marinha do Brasil"],
local: "Guarujá, SP",
equipamentos: [
"Radar marítimo",
"Estação meteorológica",
"Câmeras eletro-ópticas",
"Antenas de comunicação"
]
}
],
recursos: [
{
nome: "Concórdia",
url: "https://concordia.itamaraty.gov.br",
orgao: "Ministério das Relações Exteriores",
funcoes: [
"Consulta de atos internacionais",
"Textos em idiomas originais",
"Status de ratificação"
]
},
{
nome: "Cooperação Internacional",
url: "https://www.gov.br/mre/pt-br/assuntos/cooperacao-internacional",
subseções: [
"Agência Brasileira de Cooperação",
"Cooperação educacional",
"Cooperação esportiva",
"Cooperação humanitária",
"Cooperação técnica"
]
},
{
nome: "Marinha do Brasil",
url: "https://www.marinha.mil.br/",
agencia: "https://www.agencia.marinha.mil.br/index.php/internacional"
}
],
modeloPedidoLAI: {
titulo: "Modelo de Pedido LAI - Norman-401",
itens: [
"Ano de ocorrência e local da infração",
"Tipo de infração cometida",
"Identificação do navio infrator",
"Valor das multas aplicadas",
"Dados estatísticos consolidados por ano"
]
}
};
// Componente Principal const AcordosInternacionaisApp = () => {
const [activeTab, setActiveTab] = useState('overview');
const [searchTerm, setSearchTerm] = useState();
const [selectedCase, setSelectedCase] = useState(null);
const [dateRange, setDateRange] = useState({ inicio: , fim: });
const [pedidoText, setPedidoText] = useState();
const [copied, setCopied] = useState(false);
// Componente de Header const Header = () => (
<Globe className="mx-auto mb-4 h-16 w-16" />
Acordos Internacionais
Sistema de Consulta e Gestão de Tratados
);
// Componente de Navegação
const Navigation = () => {
const tabs = [
{ id: 'overview', label: 'Visão Geral', icon: Globe },
{ id: 'cases', label: 'Casos', icon: FileText },
{ id: 'resources', label: 'Recursos', icon: Database },
{ id: 'lai', label: 'Pedido LAI', icon: AlertCircle }
];
return (
{tabs.map(tab => {
const Icon = tab.icon;
return (
<button
key={tab.id}
onClick={() => setActiveTab(tab.id)}
className={`flex-1 flex items-center justify-center p-4 font-medium transition-all duration-300 ${
activeTab === tab.id
? 'bg-blue-600 text-white shadow-lg'
: 'text-gray-600 hover:bg-gray-200'
}`}
>
<Icon className="w-5 h-5 mr-2" />
{tab.label}
</button>
);
})}
); };
// Componente de Busca const SearchBar = () => (
<Search className="absolute left-3 top-3 h-5 w-5 text-gray-400" />
<input
type="text"
placeholder="Buscar acordos, países, termos..."
value={searchTerm}
onChange={(e) => setSearchTerm(e.target.value)}
className="w-full pl-10 pr-4 py-3 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent"
/>
);
// Componente de Estatísticas
const StatsCards = () => {
const stats = [
{ label: 'Países Parceiros', value: '195+', icon: Users, color: 'bg-blue-500' },
{ label: 'Acordos Ativos', value: '1000+', icon: FileText, color: 'bg-green-500' },
{ label: 'Áreas de Cooperação', value: '50+', icon: Globe, color: 'bg-purple-500' }
];
return (
{stats.map((stat, index) => {
const Icon = stat.icon;
return (
<Icon className="h-8 w-8 text-white" />
{stat.label}
{stat.value}
);
})}
); };
// Componente de Definição const DefinitionCard = () => (
<FileText className="mr-2 h-6 w-6 text-blue-600" /> O que são Acordos Internacionais?
{ACORDOS_DATA.definicao.descricao}
Tipos Comuns:
-
{ACORDOS_DATA.definicao.tipos.map((tipo, index) => (
-
{tipo}
))}
Características:
-
{ACORDOS_DATA.definicao.caracteristicas.map((carac, index) => (
- <CheckCircle className="w-4 h-4 text-green-500 mr-2" /> {carac} ))}
);
// Componente de Casos const CasesView = () => (
{ACORDOS_DATA.casos.map((caso, index) => (
{caso.nome}
{caso.descricao}
{caso.ano && (
<Calendar className="w-4 h-4 mr-1" />
{caso.ano}
)}
{caso.periodo && (
<Calendar className="w-4 h-4 mr-1" />
{caso.periodo}
)}
{caso.status && (
<AlertCircle className="w-4 h-4 mr-1" />
{caso.status}
)}
{caso.local && (
<MapPin className="w-4 h-4 mr-2" />
{caso.local}
)}
{caso.propostas && (
Propostas:
-
{caso.propostas.map((proposta, idx) => (
- <Shield className="w-4 h-4 text-green-500 mr-2" /> {proposta} ))}
)}
{caso.dados && (
Dados Coletados:
{caso.dados.map((dado, idx) => (
<Database className="w-4 h-4 text-blue-500 mr-2" />
{dado}
))}
)}
{caso.equipamentos && (
Equipamentos:
{caso.equipamentos.map((equip, idx) => (
<Shield className="w-4 h-4 text-purple-500 mr-2" />
{equip}
))}
)}
{(caso.participantes || caso.parceiros) && (
{caso.participantes ? 'Participantes:' : 'Parceiros:'}
{(caso.participantes || caso.parceiros).map((part, idx) => (
{part}
))}
)}
))}
);
// Componente de Recursos const ResourcesView = () => (
{ACORDOS_DATA.recursos.map((recurso, index) => (
<ExternalLink className="mr-2 h-6 w-6 text-blue-600" /> {recurso.nome}
{recurso.orgao && (
Órgão: {recurso.orgao}
)}
{recurso.funcoes && (
Funcionalidades:
-
{recurso.funcoes.map((func, idx) => (
- <CheckCircle className="w-4 h-4 text-green-500 mr-2" /> {func} ))}
)}
{recurso.subseções && (
Subseções:
{recurso.subseções.map((sub, idx) => (
<FileText className="w-4 h-4 text-blue-500 mr-2" />
{sub}
))}
)}
<a
href={recurso.url}
target="_blank"
rel="noopener noreferrer"
className="inline-flex items-center px-4 py-2 bg-blue-600 text-white rounded-lg hover:bg-blue-700 transition-colors"
>
<ExternalLink className="w-4 h-4 mr-2" />
Acessar
</a>
{recurso.agencia && (
<a
href={recurso.agencia}
target="_blank"
rel="noopener noreferrer"
className="inline-flex items-center px-4 py-2 bg-gray-600 text-white rounded-lg hover:bg-gray-700 transition-colors"
>
<ExternalLink className="w-4 h-4 mr-2" />
Agência
</a>
)}
))}
);
// Componente de Pedido LAI
const LAIRequestView = () => {
const generateRequest = () => {
const template = `Solicito dados referentes à aplicação da Norma da Autoridade Marítima para Prevenção da Poluição Ambiental por Embarcações e Instalações de Apoio – Norman-401, no período de ${dateRange.inicio ? new Date(dateRange.inicio).toLocaleDateString('pt-BR') : '[DD/MM/AAAA]'} a ${dateRange.fim ? new Date(dateRange.fim).toLocaleDateString('pt-BR') : '[DD/MM/AAAA]'}, com base na Lei nº 12.527/2011 (Lei de Acesso à Informação), sobre descumprimento de normas ambientais por embarcações internacionais no Brasil, incluindo:
${ACORDOS_DATA.modeloPedidoLAI.itens.map((item, index) => `${index + 1}. ${item};`).join('\n')}`;
setPedidoText(template); };
const copyToClipboard = () => {
navigator.clipboard.writeText(pedidoText);
setCopied(true);
setTimeout(() => setCopied(false), 2000);
};
return (
<AlertCircle className="mr-2 h-6 w-6 text-red-600" /> Gerador de Pedido LAI
<label className="block text-sm font-medium text-gray-700 mb-2">
Data de Início
</label>
<input
type="date"
value={dateRange.inicio}
onChange={(e) => setDateRange({...dateRange, inicio: e.target.value})}
className="w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500"
/>
<label className="block text-sm font-medium text-gray-700 mb-2">
Data Final
</label>
<input
type="date"
value={dateRange.fim}
onChange={(e) => setDateRange({...dateRange, fim: e.target.value})}
className="w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500"
/>
<button
onClick={generateRequest}
className="w-full md:w-auto px-6 py-3 bg-blue-600 text-white rounded-lg hover:bg-blue-700 transition-colors mb-4"
>
Gerar Pedido
</button>
{pedidoText && (
<label className="block text-sm font-medium text-gray-700 mb-2">
Texto do Pedido:
</label>
<textarea
value={pedidoText}
onChange={(e) => setPedidoText(e.target.value)}
rows={12}
className="w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 font-mono text-sm"
/>
<button
onClick={copyToClipboard}
className="mt-2 flex items-center px-4 py-2 bg-green-600 text-white rounded-lg hover:bg-green-700 transition-colors"
>
{copied ? <CheckCircle className="w-4 h-4 mr-2" /> : <Copy className="w-4 h-4 mr-2" />}
{copied ? 'Copiado!' : 'Copiar Texto'}
</button>
)}
Itens Solicitados no Pedido
-
{ACORDOS_DATA.modeloPedidoLAI.itens.map((item, index) => (
- {index + 1} {item} ))}
); };
// Função para renderizar conteúdo baseado na aba ativa
const renderContent = () => {
switch(activeTab) {
case 'overview':
return (
<SearchBar />
<StatsCards />
<DefinitionCard />
);
case 'cases':
return <CasesView />;
case 'resources':
return <ResourcesView />;
case 'lai':
return <LAIRequestView />;
default:
return null;
}
};
return (
<Header />
<Navigation />
{renderContent()}
);
};
export default AcordosInternacionaisApp;