site main page updates

This commit is contained in:
headpatsyou 2026-01-10 20:17:53 +00:00
parent cc093701b2
commit 60233483b2
13 changed files with 300 additions and 77 deletions

68
content/pt/privacidade.md Normal file
View file

@ -0,0 +1,68 @@
---
# Política de Privacidade
---
# Política de Privacidade
**Última atualização: 10 de janeiro de 2026**
## 1. Introdução
Esta Política de Privacidade explica como o website powerlifting.pt trata os seus dados quando o visita. O website é operado pela comfy.solutions em nome da Associação Portuguesa de Powerlifting (APP).
Esta política está em conformidade com o Regulamento Geral sobre a Proteção de Dados (RGPD).
## 2. Que Dados Recolhemos
### Analytics Anónimos
Utilizamos o Plausible Community Edition para compreender como o website é utilizado. Esta ferramenta recolhe apenas dados agregados e completamente anónimos:
- Páginas visitadas
- Origem do tráfego
- Tipo de dispositivo e browser
- País/região (aproximado)
**O Plausible não utiliza cookies, não regista IPs, não recolhe dados pessoais e não rastreia utilizadores entre websites.**
Porque não recolhemos dados pessoais através do Plausible, não precisamos do seu consentimento para analytics.
### Links para Conteúdo Externo
O website contém links para galerias fotográficas geridas por plataformas externas. Para questões sobre fotografias, aceda a https://fotos.pavaogenial.pt/
## 3. Como Usamos os Dados
Os dados anónimos de analytics servem apenas para melhorar o website e compreender como é utilizado.
**Não vendemos, partilhamos ou usamos os seus dados para qualquer outro fim.**
## 4. Os Seus Direitos
Ao abrigo do RGPD, tem direitos sobre os seus dados pessoais (acesso, retificação, eliminação, etc.). No entanto, como este website não recolhe dados pessoais identificáveis, não existem dados pessoais seus para aceder ou eliminar.
Se tiver questões sobre privacidade, contacte-nos:
- **Email: privacidade@comfy.solutions**
- **Assunto: GDPR APPortugal**
Pode também apresentar reclamação junto da CNPD (Comissão Nacional de Proteção de Dados) em www.cnpd.pt
## 5. Cookies
Este website não utiliza cookies.
## 6. Segurança
O website utiliza HTTPS para proteger a ligação entre o seu dispositivo e o nosso servidor.
## 7. Links Externos
O website contém links para outros websites. Não somos responsáveis pelas políticas de privacidade desses websites.
## 8. Contactos
**Proteção de dados:**
- privacidade@comfy.solutions (Assunto: GDPR APPortugal)
**Questões gerais:**
- website@powerlifting.pt

View file

@ -335,7 +335,7 @@ A necessidade de usar essa substância ou método não se deve ao uso anterior d
#### A quem me candidato para uma AUT?
Se foi identificado como [Atleta de Nível Internacional](https://www.powerlifting.sport/anti-doping/ipf-anti-doping-rules), deve candidatar-se à IPF para que uma AUT seja concedida antes do uso do seu medicamento. Se já tem uma AUT concedida pela sua Organização Nacional Antidopagem (ONAD), pode solicitar que a IPF reconheça a AUT concedida pela sua ONAD. Por favor, envie a sua AUT para o [CAUT da IPF](https://www.powerlifting.sport/anti-doping/tue#) e envie cópia para o [Antidopagem da IPF](https://www.powerlifting.sport/anti-doping/tue#).
Se foi identificado como [Atleta de Nível Internacional](https://www.powerlifting.sport/anti-doping/ipf-anti-doping-rules), deve candidatar-se à IPF para que uma AUT seja concedida antes do uso do seu medicamento. Se já tem uma AUT concedida pela sua Organização Nacional Antidopagem (ONAD), pode solicitar que a IPF reconheça a AUT concedida pela sua ONAD. Por favor, envie a sua AUT para o [CAUT da IPF](mailto:josephine.ip@powerlifting.sport) e envie cópia para o [Antidopagem da IPF](mailto:ipfantidoping@cces.ca).
Se não é um Atleta de Nível Internacional, deve candidatar-se à sua Organização Nacional Antidopagem para uma AUT. Se a IPF optar por recolher uma amostra sua (um atleta que não é de Nível Internacional) e estiver a usar uma Substância Proibida ou Método Proibido por razões terapêuticas, ser-lhe-á permitido candidatar-se à IPF para uma AUT retroativa se ainda não tiver uma concedida pela sua ONAD.
@ -370,7 +370,7 @@ A evidência deve ser tão objetiva quanto possível nas circunstâncias clínic
A sua candidatura deve ser submetida em inglês. A IPF não será responsável por custos de tradução, se aplicável.
3. Submeta a sua candidatura e documentação médica relevante ao [CAUT da IPF](https://www.powerlifting.sport/anti-doping/tue#) e envie cópia para o [Antidopagem da IPF](https://www.powerlifting.sport/anti-doping/tue#).
3. Submeta a sua candidatura e documentação médica relevante ao [CAUT da IPF](mailto:josephine.ip@powerlifting.sport) e envie cópia para o [Antidopagem da IPF](mailto:ipfantidoping@cces.ca).
4. Uma vez que uma candidatura de AUT tenha sido devidamente recebida em forma adequada, a candidatura de AUT será revista por pelo menos 3 membros do CAUT da IPF. Caso o formulário de candidatura não esteja devidamente preenchido, ou caso falte documentação médica obrigatória, será devidamente informado e a sua candidatura de AUT não será aceite até ser adequadamente submetida.
@ -382,7 +382,7 @@ A sua candidatura deve ser submetida em inglês. A IPF não será responsável p
Se tem uma AUT concedida pela sua ONAD, pode solicitar que a IPF a reconheça de duas formas:
* Envie o seu pedido para o [CAUT da IPF](https://www.powerlifting.sport/anti-doping/tue#) e envie cópia para o [Antidopagem da IPF](https://www.powerlifting.sport/anti-doping/tue#).
* Envie o seu pedido para o [CAUT da IPF](mailto:josephine.ip@powerlifting.sport) e envie cópia para o [Antidopagem da IPF](mailto:ipfantidoping@cces.ca).
* Pergunte à sua ONAD se podem ajudá-lo a notificar a IPF do seu pedido de reconhecimento através do ADAMS.
#### A IPF reconhece automaticamente AUTs concedidas por ONADs ou outras Federações Internacionais?
@ -391,12 +391,13 @@ Não. A IPF não reconhecerá automaticamente AUTs concedidas por ONADs ou outra
A IPF reconhecerá AUTs concedidas por outros Signatários do Código (ONADs ou Federações Internacionais) desde que as AUTs tenham sido processadas de acordo com a Norma Internacional para Autorizações de Uso Terapêutico e as candidaturas, documentação de apoio e decisões sejam devidamente reportadas no ADAMS.
O seu pedido de reconhecimento deve ser submetido ao [CAUT da IPF](https://www.powerlifting.sport/anti-doping/tue#) e enviar cópia para o [Antidopagem da IPF](https://www.powerlifting.sport/anti-doping/tue#) por escrito citando o seu número de referência de AUT do ADAMS.
O seu pedido de reconhecimento deve ser submetido ao [CAUT da IPF](mailto:josephine.ip@powerlifting.sport) e enviar cópia para o [Antidopagem da IPF](mailto:ipfantidoping@cces.ca) por escrito citando o seu número de referência de AUT do ADAMS.
#### E se a AUT da minha ONAD não for reconhecida pela IPF?
Você e/ou a sua ONAD têm 21 dias a partir da data da decisão para encaminhar o assunto à AMA para revisão. O endereço de email para questões e/ou para enviar o pedido de revisão é: medical(@)wada-ama.org. Alternativamente, pode enviar para:
```
WADA Medical Department
World Anti-Doping Agency
Stock Exchange Tower
@ -404,6 +405,7 @@ Stock Exchange Tower
P.O. Box 120
Montreal (Quebec) H4Z 1B7
Canada
```
A mesma informação que foi fornecida à sua ONAD deve ser submetida à AMA. Por favor, use um método online seguro a menos que envie por correio registado.
@ -417,6 +419,7 @@ Uma decisão de negar uma candidatura de AUT incluirá uma explicação escrita
Você e/ou a sua ONAD podem encaminhar o assunto à AMA para revisão no prazo de 21 dias após a notificação da decisão do CAUT da IPF. Deve enviar a mesma informação que submeteu a nós, e na qual a decisão de negar a AUT foi baseada, através de um método online seguro ou por correio registado para:
```
WADA Medical Department
World Anti-Doping Agency
Stock Exchange Tower
@ -424,6 +427,7 @@ Stock Exchange Tower
P.O. Box 120
Montreal (Quebec) H4Z 1B7
Canada
```
O endereço de email para questões e/ou para enviar o pedido de revisão é: medical(at)wada-ama.org

View file

@ -2,21 +2,24 @@
# frontmatter can be added later if needed
---
# Associação Portuguesa de Powerlifting
# Quem Somos
A Associação Portuguesa de Powerlifting (APP) é a entidade que promove e organiza o powerlifting em Portugal, seguindo as regras e padrões internacionais.
## Quem é a APP?
## Missão
A Associação Portuguesa de Powerlifting (APP) é a entidade nacional filiada na [International Powerlifting Federation (IPF)](https://powerlifting.sport/) em Portugal. Rege-se pelos princípios, regulamentos e orientações da IPF, procedendo às adaptações necessárias ao enquadramento nacional.
Promover o desenvolvimento do powerlifting em Portugal de forma inclusiva, segura e acessível, garantindo o cumprimento das normas da IPF e da WADA.
Compete à APP a tutela e o desenvolvimento do powerlifting testado (com controlo antidopagem) em território nacional, sendo responsável pela organização de competições de âmbito regional e nacional, bem como pela gestão do acesso dos atletas portugueses a provas nacionais e internacionais, através de um sistema de qualificação devidamente regulamentado.
## Valores
## Como posso-me filliar a APP?
- Integridade
- Inclusão
- Segurança
- Transparência
### Atletas
## Contacto
> As filiações para o ano de 2026 estão disponíveis até dia 31 de Janeiro, 2026.
Consulte a página de Contatos para obter informação de contacto.
A filiação de atletas encontra-se aberta a todos os interessados em participar nos eventos organizados pela Associação Portuguesa de Powerlifting (APP). A mesma pode ser efetuada a título individual ou através da filiação enquanto membro de um clube integrado na APP.
Em qualquer das modalidades, o processo de filiação é realizado mediante o preenchimento da Ficha de Filiação, disponível [neste formulário](https://docs.google.com/forms/d/e/1FAIpQLSern59XIm_KL4wagw-_978X-RcKCZnKUUE3TMwOK0rTQ0w60w/viewform) e na [página oficial da APP na rede social Instagram.](https://www.instagram.com/aportugalpowerlifting)
### Treinadores
Todos os interessados em acompanhar o(s) seu(s) atleta(s) na sala de aquecimento em dias de competição, deverão proceder à submissão da Ficha de Afiliação de Treinador [neste formulário](https://docs.google.com/forms/d/e/1FAIpQLSewmaQoyk6qfVimEgoEv9Jay_S7ItOOFOYKIat56CZgSrTVVQ/viewform) e na [página oficial da APP na rede social Instagram.](https://www.instagram.com/aportugalpowerlifting), de forma a lhes ser atribuída uma credencial, sem a qual não será permitida a circulação na área de aquecimento.

View file

@ -0,0 +1,9 @@
{
"active": true,
"header": "Afiliações abertas",
"paragraph": "As afiliações estão disponíveis para atletas e treinadores até 31 de Janeiro",
"hasLink": true,
"buttonLabel": "Saber mais",
"buttonLink": "http://localhost:3000/pt/sobre/quem-somos#como-posso-me-filliar-a-app",
"color": "green"
}

View file

@ -8,7 +8,6 @@ export default function AboutPage() {
return (
<div className="grid grid-cols-1 md:grid-cols-[1fr_280px] gap-6 lg:gap-8">
<div className="min-w-0">
<h1 className="text-2xl font-bold">About</h1>
<MarkdownRenderer contentPath={"en/sobre/quem-somos.md"} onHeadings={setHeadings} />
</div>
<aside className="min-w-0">

View file

@ -132,6 +132,18 @@ p { font-size: 1rem; line-height: 1.6; color: var(--foreground); }
scroll-margin-top: 110px; /* Account for header + subnav on mobile + padding */
overflow-wrap: break-word;
word-wrap: break-word;
color: var(--color-green);
font-weight: bold;
}
.markdown-content h1 a,
.markdown-content h2 a,
.markdown-content h3 a,
.markdown-content h4 a,
.markdown-content h5 a,
.markdown-content h6 a {
color: var(--color-green);
text-decoration: none;
}
@media (min-width: 768px) {
@ -154,6 +166,7 @@ p { font-size: 1rem; line-height: 1.6; color: var(--foreground); }
.markdown-content a {
text-decoration: underline;
word-break: break-all;
color: #0066cc;
}
/* Markdown blockquote */
@ -272,6 +285,9 @@ p { font-size: 1rem; line-height: 1.6; color: var(--foreground); }
inset: 0;
z-index: 1;
}
.hero-overlay .carousel-controls {
z-index: 2;
}
.hero-overlay .carousel-viewport {
height: 100%;
}

View file

@ -3,8 +3,10 @@ import { Inter } from "next/font/google";
import "./globals.css";
import Link from "next/link";
import Image from "next/image";
import Script from "next/script";
import { Navigation } from "@/components/layout/Navigation";
import { SubnavBar } from "@/components/layout/SubnavBar";
import InfoBanner from "@/components/layout/InfoBanner";
const inter = Inter({ subsets: ["latin"], variable: "--font-inter" });
@ -21,6 +23,17 @@ export default function RootLayout({
}>) {
return (
<html lang="pt" data-theme="light">
<head>
<Script
defer
data-domain="powerlifting.pt"
src="https://plausible.comfy.solutions/js/script.file-downloads.hash.outbound-links.js"
strategy="afterInteractive"
/>
<Script id="plausible-init" strategy="afterInteractive">
{`window.plausible = window.plausible || function() { (window.plausible.q = window.plausible.q || []).push(arguments) }`}
</Script>
</head>
<body className={`${inter.variable} font-sans antialiased`}>
{/* Skip to main content link */}
<a href="#main-content" className="skip-link">Saltar para o conteúdo</a>
@ -47,6 +60,8 @@ export default function RootLayout({
<SubnavBar />
</header>
<InfoBanner />
<main id="main-content" className="container py-6" role="main">
{children}
</main>

View file

@ -8,7 +8,6 @@ export default function AcessibilidadePage() {
return (
<div className="grid grid-cols-1 md:grid-cols-[1fr_280px] gap-6 lg:gap-8">
<div className="min-w-0">
<h1 className="text-2xl font-bold">Declaração de Acessibilidade</h1>
<MarkdownRenderer contentPath={"pt/acessibilidade.md"} onHeadings={setHeadings} />
</div>
<aside className="min-w-0">

View file

@ -8,7 +8,6 @@ export default function AvisosLegaisPage() {
return (
<div className="grid grid-cols-1 md:grid-cols-[1fr_280px] gap-6 lg:gap-8">
<div className="min-w-0">
<h1 className="text-2xl font-bold">Avisos Legais</h1>
<MarkdownRenderer contentPath={"pt/avisos-legais.md"} onHeadings={setHeadings} />
</div>
<aside className="min-w-0">

View file

@ -6,7 +6,7 @@ export default function PtHome() {
<section className="hero-overlay" aria-labelledby="home-title">
<ImageCarousel />
<div className="hero-content">
<div className="container">
<div className="container container-wide">
<h1 id="home-title" className="title">Associação Portuguesa de Powerlifting</h1>
<p className="subtitle">Acessível. Transparente. Para todos os atletas.</p>
<div className="mt-4 flex gap-2">
@ -16,23 +16,93 @@ export default function PtHome() {
</div>
</div>
</section>
<section className="hero" aria-label="Destaques do APP">
<div className="container">
<div className="mt-8 grid gap-4 md:grid-cols-3">
<div className="border p-4 rounded-md">
<h3 className="font-semibold">Quem Somos</h3>
<p className="muted">Conheça a APP e a nossa missão.</p>
<a className="underline mt-2 inline-block" href="/pt/sobre/quem-somos">Ler mais</a>
<section className="hero hero-compact" aria-label="Destaques do APP">
<div className="container container-wide">
<div className="space-y-6">
<div className="space-y-6">
<div className="border rounded-md overflow-hidden bg-white">
<div className="bg-[var(--color-green)] text-white px-6 py-4 flex flex-col gap-1 md:flex-row md:items-center md:justify-between" style={{ color: "#fff" }}>
<div>
<p className="text-xs font-semibold tracking-[0.08em] uppercase text-white" style={{ color: "#fff" }}>Boas-vindas</p>
<h2 className="text-xl md:text-2xl font-bold text-white" style={{ color: "#fff" }}>Aqui é casa para atletas, treinadores e clubes</h2>
</div>
<div className="border p-4 rounded-md">
<a className="btn btn-outline bg-white text-[var(--color-green)] border-white shadow-sm" href="/pt/sobre/quem-somos" aria-label="Falar com a APP">Falar connosco</a>
</div>
<div className="p-6 space-y-4">
<p className="muted">Boas-vindas ao site da Associação Portuguesa de Powerlifting! Estás na casa para todos os recursos relacionados com powerlifting na IPF, em português.</p>
<div className="flex flex-wrap gap-2 text-sm">
<span className="rounded-full px-3 py-1 bg-[rgba(0,106,61,0.08)] text-[var(--color-green)]">Calendário e inscrições</span>
<span className="rounded-full px-3 py-1 bg-[rgba(192,0,33,0.08)] text-[var(--color-red)]">Regras e anti-doping</span>
<span className="rounded-full px-3 py-1 bg-[rgba(0,0,0,0.06)]">Dúvidas frequentes</span>
<span className="rounded-full px-3 py-1 bg-[rgba(0,106,61,0.08)] text-[var(--color-green)]">Contacto direto</span>
</div>
<div className="grid gap-3 md:grid-cols-3">
<div className="border rounded-md overflow-hidden">
<div className="bg-[var(--color-red)] text-white px-4 py-2 flex items-center justify-between">
<h3 className="font-semibold">Calendário</h3>
<span className="text-xs font-semibold uppercase tracking-[0.08em]">Próximas provas</span>
</div>
<div className="p-4 space-y-2 bg-[rgba(192,0,33,0.06)]">
<p className="text-sm text-[var(--foreground)]">Encontre a sua próxima prova.</p>
<a className="btn btn-outline px-3 text-[var(--color-red)] border-[rgba(192,0,33,0.35)]" href="/pt/competicoes/calendario">Abrir calendário</a>
</div>
</div>
<div className="border rounded-md overflow-hidden">
<div className="bg-[#f2b600] text-[var(--foreground)] px-4 py-2 flex items-center justify-between">
<h3 className="font-semibold">Regras</h3>
<p className="muted">IPF Rule Book e Anti-Doping.</p>
<a className="underline mt-2 inline-block" href="/pt/regras/ipf-rule-book">Consultar</a>
<span className="text-xs font-semibold uppercase tracking-[0.08em]">IPF</span>
</div>
<div className="border p-4 rounded-md">
<div className="p-4 space-y-2 bg-[rgba(242,182,0,0.14)]">
<p className="text-sm text-[var(--foreground)]">IPF Rule Book e orientações.</p>
<a className="btn btn-outline px-3 text-[#b88700] border-[rgba(242,182,0,0.45)]" href="/pt/regras/ipf-rule-book">Ver regras</a>
</div>
</div>
<div className="border rounded-md overflow-hidden">
<div className="bg-[var(--color-green)] text-white px-4 py-2 flex items-center justify-between">
<h3 className="font-semibold">FAQ</h3>
<p className="muted">Perguntas frequentes para atletas e treinadores.</p>
<a className="underline mt-2 inline-block" href="/pt/perguntas">Explorar</a>
<span className="text-xs font-semibold uppercase tracking-[0.08em]">Dúvidas</span>
</div>
<div className="p-4 space-y-2 bg-[rgba(0,106,61,0.08)]">
<p className="text-sm text-[var(--foreground)]">Equipamento, pesagens, logística.</p>
<a className="btn btn-outline px-3 text-[var(--color-green)] border-[rgba(0,106,61,0.35)]" href="/pt/perguntas">Abrir FAQ</a>
</div>
</div>
</div>
<div className="flex flex-wrap gap-2">
<a className="btn btn-primary px-4" href="/pt/competicoes/calendario" aria-label="Ver calendário oficial">Ver calendário</a>
<a className="btn btn-outline px-4" href="/pt/competicoes/resultados" aria-label="Ver resultados oficiais">Resultados</a>
<a className="btn btn-outline px-4" href="/pt/perguntas" aria-label="Ver perguntas frequentes">FAQ</a>
</div>
</div>
</div>
<div className="grid gap-4 md:grid-cols-2">
<div className="border rounded-md overflow-hidden">
<div className="bg-[var(--color-red)] text-white px-4 py-2 flex items-center justify-between">
<h3 className="font-semibold">Preparar a próxima prova</h3>
<span className="text-xs font-semibold uppercase tracking-[0.08em]">Passo a passo</span>
</div>
<div className="p-6">
<ol className="space-y-3 text-sm">
<li><span className="font-semibold text-[var(--color-red)]">1.</span> Escolha a prova e confirme standards da categoria.</li>
<li><span className="font-semibold text-[var(--color-red)]">2.</span> Revise o IPF Rule Book e as orientações anti-doping.</li>
<li><span className="font-semibold text-[var(--color-red)]">3.</span> Tire dúvidas no FAQ e alinhe equipamento e pesagens.</li>
</ol>
</div>
</div>
<div className="border rounded-md overflow-hidden">
<div className="bg-[#f2b600] text-[var(--foreground)] px-4 py-2 flex items-center justify-between">
<h3 className="font-semibold">Documentos e ajuda</h3>
<span className="text-xs font-semibold uppercase tracking-[0.08em]">Acesso rápido</span>
</div>
<div className="p-6 flex flex-wrap gap-2 text-sm">
<a className="btn btn-outline px-3" href="/pt/competicoes/calendario">Calendário e inscrições</a>
<a className="btn btn-outline px-3" href="/pt/competicoes/resultados">Resultados oficiais</a>
<a className="btn btn-outline px-3" href="/pt/regras/anti-doping">Guia anti-doping</a>
<a className="btn btn-outline px-3" href="/pt/sobre/quem-somos">Quem somos e contactos</a>
</div>
</div>
</div>
</div>
</div>
</div>

View file

@ -1,38 +1,18 @@
export default function PrivacidadePage() {
"use client";
import { useState } from "react";
import { MarkdownRenderer } from "@/components/markdown/MarkdownRenderer";
import { TableOfContents } from "@/components/markdown/TableOfContents";
export default function PrivacidadePage() {
const [headings, setHeadings] = useState([] as { id: string; text: string; level: number }[]);
return (
<section aria-labelledby="privacy-title" className="markdown-content">
<h1 id="privacy-title">Política de Privacidade</h1>
<p>Última atualização: 6 de janeiro de 2026</p>
<h2>Recolha e Utilização de Dados</h2>
<p>
A Associação Portuguesa de Powerlifting (APP) compromete-se a proteger a privacidade dos utilizadores
do seu website. Esta política descreve como recolhemos, utilizamos e protegemos os seus dados pessoais.
</p>
<h2>Dados Recolhidos</h2>
<p>
Recolhemos apenas os dados essenciais para o funcionamento do website e para responder às suas solicitações.
Estes dados podem incluir nome, email e informações de contacto quando submetidas voluntariamente.
</p>
<h2>Proteção de Dados</h2>
<p>
Implementamos medidas de segurança adequadas para proteger os seus dados pessoais contra acesso não autorizado,
alteração, divulgação ou destruição.
</p>
<h2>Direitos dos Utilizadores</h2>
<p>
De acordo com o RGPD, tem o direito de aceder, retificar ou eliminar os seus dados pessoais.
Para exercer estes direitos, contacte-nos através da página de Contatos.
</p>
<h2>Cookies</h2>
<p>
Este website utiliza apenas cookies essenciais para o seu funcionamento. Não utilizamos cookies
de rastreamento ou publicidade.
</p>
</section>
<div className="grid grid-cols-1 md:grid-cols-[1fr_280px] gap-6 lg:gap-8">
<div className="min-w-0">
<MarkdownRenderer contentPath={"pt/privacidade.md"} onHeadings={setHeadings} />
</div>
<aside className="min-w-0">
<TableOfContents headings={headings} />
</aside>
</div>
);
}

View file

@ -13,7 +13,6 @@ export default function QuemSomosPage() {
return (
<div className="grid grid-cols-1 md:grid-cols-[1fr_280px] gap-6 lg:gap-8">
<div className="min-w-0">
<h1 className="text-2xl font-bold">Quem Somos</h1>
<MarkdownRenderer
contentPath={"pt/sobre/quem-somos.md"}
onHeadings={setHeadings}

View file

@ -0,0 +1,62 @@
'use client';
import { useEffect, useState } from 'react';
interface BannerConfig {
active: boolean;
header: string;
paragraph: string;
hasLink: boolean;
buttonLabel?: string;
buttonLink?: string;
color: 'red' | 'yellow' | 'green';
}
export default function InfoBanner() {
const [config, setConfig] = useState<BannerConfig | null>(null);
useEffect(() => {
fetch('/config/banner.json')
.then(res => res.json())
.then(data => setConfig(data))
.catch(err => console.error('Failed to load banner config:', err));
}, []);
if (!config || !config.active) return null;
const colorMap = {
red: {
bg: 'bg-[var(--color-red)]',
text: 'text-white',
button: 'bg-white bg-opacity-25 hover:bg-opacity-35 text-[var(--color-red)]',
},
yellow: {
bg: 'bg-[#f2b600]',
text: 'text-[var(--foreground)]',
button: 'bg-white bg-opacity-30 hover:bg-opacity-40 text-[var(--foreground)]',
},
green: {
bg: 'bg-[var(--color-green)]',
text: 'text-white',
button: 'bg-white bg-opacity-25 hover:bg-opacity-35 text-[var(--color-green)]',
},
};
const colors = colorMap[config.color];
return (
<div className={`${colors.bg} ${colors.text} px-12 py-2.5 flex items-center justify-between gap-6 text-sm`}>
<div>
<strong>{config.header}</strong> <span className="mx-2"></span> {config.paragraph}
</div>
{config.hasLink && config.buttonLink && (
<a
href={config.buttonLink}
className={`flex-shrink-0 px-3 py-1 rounded font-semibold transition whitespace-nowrap ${colors.button}`}
>
{config.buttonLabel}
</a>
)}
</div>
);
}