new updates

This commit is contained in:
headpatsyou 2026-01-24 12:28:19 +00:00
parent 60233483b2
commit a57b4213d2
7 changed files with 218 additions and 28 deletions

View file

@ -22,4 +22,4 @@ Em qualquer das modalidades, o processo de filiação é realizado mediante o pr
### 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.
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.

144
package-lock.json generated
View file

@ -16,6 +16,7 @@
"react-dom": "19.2.3",
"react-markdown": "^10.1.0",
"rehype-autolink-headings": "^7.1.0",
"rehype-raw": "^7.0.0",
"rehype-slug": "^6.0.0",
"remark-gfm": "^4.0.1"
},
@ -4293,6 +4294,26 @@
"node": ">= 0.4"
}
},
"node_modules/hast-util-from-parse5": {
"version": "8.0.3",
"resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-8.0.3.tgz",
"integrity": "sha512-3kxEVkEKt0zvcZ3hCRYI8rqrgwtlIOFMWkbclACvjlDw8Li9S2hk/d51OI0nr/gIpdMHNepwgOKqZ/sy0Clpyg==",
"license": "MIT",
"dependencies": {
"@types/hast": "^3.0.0",
"@types/unist": "^3.0.0",
"devlop": "^1.0.0",
"hastscript": "^9.0.0",
"property-information": "^7.0.0",
"vfile": "^6.0.0",
"vfile-location": "^5.0.0",
"web-namespaces": "^2.0.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/unified"
}
},
"node_modules/hast-util-heading-rank": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/hast-util-heading-rank/-/hast-util-heading-rank-3.0.0.tgz",
@ -4319,6 +4340,44 @@
"url": "https://opencollective.com/unified"
}
},
"node_modules/hast-util-parse-selector": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-4.0.0.tgz",
"integrity": "sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==",
"license": "MIT",
"dependencies": {
"@types/hast": "^3.0.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/unified"
}
},
"node_modules/hast-util-raw": {
"version": "9.1.0",
"resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-9.1.0.tgz",
"integrity": "sha512-Y8/SBAHkZGoNkpzqqfCldijcuUKh7/su31kEBp67cFY09Wy0mTRgtsLYsiIxMJxlu0f6AA5SUTbDR8K0rxnbUw==",
"license": "MIT",
"dependencies": {
"@types/hast": "^3.0.0",
"@types/unist": "^3.0.0",
"@ungap/structured-clone": "^1.0.0",
"hast-util-from-parse5": "^8.0.0",
"hast-util-to-parse5": "^8.0.0",
"html-void-elements": "^3.0.0",
"mdast-util-to-hast": "^13.0.0",
"parse5": "^7.0.0",
"unist-util-position": "^5.0.0",
"unist-util-visit": "^5.0.0",
"vfile": "^6.0.0",
"web-namespaces": "^2.0.0",
"zwitch": "^2.0.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/unified"
}
},
"node_modules/hast-util-to-jsx-runtime": {
"version": "2.3.6",
"resolved": "https://registry.npmjs.org/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.3.6.tgz",
@ -4346,6 +4405,25 @@
"url": "https://opencollective.com/unified"
}
},
"node_modules/hast-util-to-parse5": {
"version": "8.0.1",
"resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-8.0.1.tgz",
"integrity": "sha512-MlWT6Pjt4CG9lFCjiz4BH7l9wmrMkfkJYCxFwKQic8+RTZgWPuWxwAfjJElsXkex7DJjfSJsQIt931ilUgmwdA==",
"license": "MIT",
"dependencies": {
"@types/hast": "^3.0.0",
"comma-separated-tokens": "^2.0.0",
"devlop": "^1.0.0",
"property-information": "^7.0.0",
"space-separated-tokens": "^2.0.0",
"web-namespaces": "^2.0.0",
"zwitch": "^2.0.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/unified"
}
},
"node_modules/hast-util-to-string": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/hast-util-to-string/-/hast-util-to-string-3.0.1.tgz",
@ -4372,6 +4450,23 @@
"url": "https://opencollective.com/unified"
}
},
"node_modules/hastscript": {
"version": "9.0.1",
"resolved": "https://registry.npmjs.org/hastscript/-/hastscript-9.0.1.tgz",
"integrity": "sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w==",
"license": "MIT",
"dependencies": {
"@types/hast": "^3.0.0",
"comma-separated-tokens": "^2.0.0",
"hast-util-parse-selector": "^4.0.0",
"property-information": "^7.0.0",
"space-separated-tokens": "^2.0.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/unified"
}
},
"node_modules/hermes-estree": {
"version": "0.25.1",
"resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.25.1.tgz",
@ -4399,6 +4494,16 @@
"url": "https://opencollective.com/unified"
}
},
"node_modules/html-void-elements": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-3.0.0.tgz",
"integrity": "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==",
"license": "MIT",
"funding": {
"type": "github",
"url": "https://github.com/sponsors/wooorm"
}
},
"node_modules/htmlparser2": {
"version": "10.0.0",
"resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-10.0.0.tgz",
@ -7095,6 +7200,21 @@
"url": "https://opencollective.com/unified"
}
},
"node_modules/rehype-raw": {
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/rehype-raw/-/rehype-raw-7.0.0.tgz",
"integrity": "sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==",
"license": "MIT",
"dependencies": {
"@types/hast": "^3.0.0",
"hast-util-raw": "^9.0.0",
"vfile": "^6.0.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/unified"
}
},
"node_modules/rehype-slug": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/rehype-slug/-/rehype-slug-6.0.0.tgz",
@ -8312,6 +8432,20 @@
"url": "https://opencollective.com/unified"
}
},
"node_modules/vfile-location": {
"version": "5.0.3",
"resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-5.0.3.tgz",
"integrity": "sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==",
"license": "MIT",
"dependencies": {
"@types/unist": "^3.0.0",
"vfile": "^6.0.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/unified"
}
},
"node_modules/vfile-message": {
"version": "4.0.3",
"resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.3.tgz",
@ -8326,6 +8460,16 @@
"url": "https://opencollective.com/unified"
}
},
"node_modules/web-namespaces": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-2.0.1.tgz",
"integrity": "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==",
"license": "MIT",
"funding": {
"type": "github",
"url": "https://github.com/sponsors/wooorm"
}
},
"node_modules/whatwg-encoding": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz",

View file

@ -17,6 +17,7 @@
"react-dom": "19.2.3",
"react-markdown": "^10.1.0",
"rehype-autolink-headings": "^7.1.0",
"rehype-raw": "^7.0.0",
"rehype-slug": "^6.0.0",
"remark-gfm": "^4.0.1"
},

View file

@ -118,8 +118,14 @@ p { font-size: 1rem; line-height: 1.6; color: var(--foreground); }
max-width: 100%;
overflow-wrap: break-word;
word-wrap: break-word;
word-break: break-word;
hyphens: auto;
hyphens: none;
word-break: normal;
}
.markdown-content * {
word-break: normal;
hyphens: none;
overflow-wrap: break-word;
}
.markdown-content h1,
.markdown-content h2,
@ -160,12 +166,21 @@ p { font-size: 1rem; line-height: 1.6; color: var(--foreground); }
margin-bottom: 0.75rem;
overflow-wrap: break-word;
word-wrap: break-word;
word-break: normal;
hyphens: none;
-webkit-hyphenate-character: "";
}
.markdown-content ul { padding-left: 1.25rem; list-style: disc; }
.markdown-content ol { padding-left: 1.25rem; list-style: decimal; }
.markdown-content li {
word-break: normal;
hyphens: none;
overflow-wrap: break-word;
}
.markdown-content a {
text-decoration: underline;
word-break: break-all;
word-break: normal;
overflow-wrap: break-word;
color: #0066cc;
}
@ -258,6 +273,16 @@ p { font-size: 1rem; line-height: 1.6; color: var(--foreground); }
display: block;
}
/* Markdown iframes */
.markdown-iframe {
max-width: 100%;
width: 100%;
height: 600px;
margin: 1.5rem 0;
border: 1px solid var(--color-border);
border-radius: 8px;
}
/* Layout utilities */
.container {
width: 100%;

View file

@ -68,10 +68,9 @@ export default function PtHome() {
</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 className="grid grid-cols-2 gap-3">
<a className="btn bg-[var(--color-red)] text-white hover:opacity-90 px-4 text-center" href="/pt/competicoes/resultados" aria-label="Ver resultados oficiais">Resultados</a>
<a className="btn bg-[var(--color-green)] text-white hover:opacity-90 px-4 text-center" href="/pt/competicoes/calendario" aria-label="Ver fotos das competições">Fotos</a>
</div>
</div>
</div>

View file

@ -2,10 +2,11 @@
import React, { useEffect, useState } from "react";
type Meet = { id: string; name: string; date?: string; location?: string; signupUrl?: string };
type Event = { title: string; date?: string; location?: string; signupUrl?: string };
export function ListView() {
const [meets, setMeets] = useState<Meet[]>([]);
const [future, setFuture] = useState<Meet[]>([]);
const [meets, setMeets] = useState<Meet[]>([]);
const [future, setFuture] = useState<Event[]>([]);
useEffect(() => {
(async () => {
@ -23,23 +24,39 @@ export function ListView() {
return (
<section aria-labelledby="list-title">
<h2 id="list-title" className="text-xl font-semibold">Lista de Competições</h2>
<ul className="mt-2 space-y-2">
{future.map((m) => (
<li key={`future-${m.name}`} className="border p-3">
<strong>{m.name}</strong>
{m.date && <span className="ml-2">{m.date}</span>}
{m.location && <span className="ml-2"> {m.location}</span>}
{m.signupUrl && (
<a className="ml-3 underline" href={m.signupUrl} target="_blank" rel="noopener noreferrer">Inscrição</a>
)}
</li>
))}
{meets.map((m) => (
<li key={m.id} className="border p-3">
<strong>{m.name}</strong>
</li>
))}
</ul>
{future.length > 0 && (
<div className="mt-6">
<h3 className="text-lg font-semibold text-green-700 mb-3">Próximas Competições</h3>
<ul className="space-y-2">
{future.map((m) => (
<li key={`future-${m.title}`} className="border-l-4 border-l-green-500 bg-green-50 p-3">
<strong>{m.title}</strong>
{m.date && <span className="ml-2 text-gray-700">{m.date}</span>}
{m.location && <span className="ml-2 text-gray-700"> {m.location}</span>}
{m.signupUrl && (
<a className="ml-3 underline text-green-600 hover:text-green-800" href={m.signupUrl} target="_blank" rel="noopener noreferrer">Inscrição</a>
)}
</li>
))}
</ul>
</div>
)}
{meets.length > 0 && (
<div className="mt-6">
<h3 className="text-lg font-semibold text-gray-600 mb-3">Competições Passadas</h3>
<ul className="space-y-2">
{meets.map((m) => (
<li key={m.id} className="border-l-4 border-l-gray-300 bg-gray-50 p-3">
<strong className="text-gray-700">{m.name}</strong>
{m.date && <span className="ml-2 text-gray-600">{m.date}</span>}
{m.location && <span className="ml-2 text-gray-600"> {m.location}</span>}
</li>
))}
</ul>
</div>
)}
</section>
);
}

View file

@ -5,6 +5,7 @@ import type { Components } from "react-markdown";
import remarkGfm from "remark-gfm";
import rehypeSlug from "rehype-slug";
import rehypeAutolinkHeadings from "rehype-autolink-headings";
import rehypeRaw from "rehype-raw";
type MarkdownRendererProps = {
contentPath: string;
@ -86,13 +87,16 @@ export function MarkdownRenderer({ contentPath, onHeadings }: MarkdownRendererPr
img: ({ src, alt, ...props }) => (
<img src={src} alt={alt || ""} className="markdown-img" loading="lazy" {...props} />
),
iframe: ({ src, ...props }: any) => (
<iframe src={src} className="markdown-iframe" {...props} />
),
};
return (
<article ref={articleRef} className="markdown-content" aria-label="Conteúdo">
<ReactMarkdown
remarkPlugins={[remarkGfm]}
rehypePlugins={[rehypeSlug, [rehypeAutolinkHeadings, { behavior: "wrap" }]]}
rehypePlugins={[rehypeRaw, rehypeSlug, [rehypeAutolinkHeadings, { behavior: "wrap" }]]}
components={components}
>
{source}