André is a serial entrepreneur with a background in software engineering, working for more than {new Date().getFullYear() - 2006} years, with companies like
Calouste Gulbenkian Foundation, American TV network NBC, and energy drink Monster Energy. He has provided technical direction to countless startups, and
diff --git a/app/routes/_pseo+/explicacoes.$subjectslug.tsx b/app/routes/_pseo+/explicacoes.$subjectslug.tsx
new file mode 100644
index 0000000..ccd09b7
--- /dev/null
+++ b/app/routes/_pseo+/explicacoes.$subjectslug.tsx
@@ -0,0 +1,136 @@
+import { Button } from '~/components/ui/button.tsx'
+import { Icon } from '~/components/ui/icon.tsx'
+import BackgroundDiagonal from './components/bg-diagonal.tsx'
+import BackgroundBlur from './components/bg-blur.tsx'
+import BackgroundSquareLines from './components/bg-square-lines.tsx'
+import collegeLife from '../_marketing+/images/college-life.jpg'
+import andreOnMacBookPro from './images/andre-on-macbook-pro.png'
+import goncaloBarreiros from './images/goncalo-barreiros.png'
+import pauloJorge from './images/paulo-jorge.png'
+import miguelFerreira from './images/miguel-ferreira.png'
+import satisfactionGuarantee from './images/satisfaction-guarantee.png'
+import signatureBlack from './images/signature-black.png'
+import signatureWhite from './images/signature-white.png'
+import { Link, useLoaderData } from '@remix-run/react'
+import { type LoaderFunction, json, type LinksFunction, type V2_MetaFunction, type LoaderArgs } from '@remix-run/node'
+import { Container } from '~/ui_components/layout/container.tsx'
+import { H1 } from '~/ui_components/typography/h1.tsx'
+import { P } from '~/ui_components/typography/p.tsx'
+import { H2 } from '~/ui_components/typography/h2.tsx'
+import { H3 } from '~/ui_components/typography/h3.tsx'
+import { Span } from '~/ui_components/typography/span.tsx'
+import { H4 } from '~/ui_components/typography/h4.tsx'
+import { subjects } from './subject-data.ts'
+import { Ul } from '~/ui_components/typography/ul.tsx'
+
+export const meta: V2_MetaFunction = ({ params }) => {
+ const { subjectslug } = params
+ const subject = subjects.find(s => s.slug === subjectslug)
+ const { slug, name, prerequisites, topics, software, exercises, isTutorable } = subject
+ return [
+ { title: `Explicações de ${name}` },
+ {
+ name: 'description',
+ content: `Procuras explicações de ${name} e queres resultados? Ajudei 650+ alunos a obliterar os exames! Satisfação 100% garantida!`,
+ },
+ {
+ name: 'keywords',
+ content: `explicações, ${name}, tutoria, universidade, estudantes, notas, exames, sucesso, resultados, garantia, tutor, explicador, mentor, explicação, explicadores, mentores, tutorias`,
+ },
+ ]
+}
+
+export const links: LinksFunction = () => {
+ return [
+ {
+ rel: 'preload',
+ href: collegeLife,
+ as: 'image',
+ },
+ {
+ rel: 'canonical',
+ href: `https://andrecasal.com/explicacoes/programacao`,
+ },
+ ]
+}
+
+export async function loader({ params }: LoaderArgs) {
+ const { subjectslug } = params
+ const subject = subjects.find(s => s.slug === subjectslug)!
+ return json({ subject })
+}
+
+const Explicacoes = () => {
+ const { subject } = useLoaderData
+ Aqui tens tudo o que precisas para ter sucesso em {name}!
+ Estas são as coisas que já tens que dominar de forma a estares preparado para {name}: Esta é a lista da matéria para {name}:
+ Explicações de {name}
+
+
+ Pré-requisitos de {name}
+
+
+ {prerequisites.map(prerequisite => (
+
+
+ Tópicos de {name}
+
+
+ {topics.map(({ name, children }) => (
+
+
+ {children.map(({ name }) => (
+
+ ) : null}
+
+ Software útil para {name}
+
+
+ {software.map(({ name, link }) => (
+
+