// LinksPage.jsx — Shared page content. Renders both mobile & desktop variants.
// Mobile: single column, cards stacked. Desktop: split — photo left, content right.
const RED = '#710014';
const CREAM = '#f2f1ed';
const PEACH = '#eee9e2';
const RED_DEEP = '#5a0010';
const RED_SOFT = '#8a1a2e';
// Links content
const LINKS = [
{
title: (<>Mapa de Sessão >),
plainTitle: 'Mapa de Sessão',
desc: 'Conduza sessões em ACT com mais clareza, sem depender de improviso.',
kicker: 'Material',
href: 'https://ingrydsimoes.com.br/mapa-de-sessao-act-v2/',
},
{
title: (<>Supervisão Individual >),
plainTitle: 'Supervisão Individual',
desc: 'Supervisão clínica 1:1 em Terapia de Aceitação e Compromisso.',
kicker: 'Atendimento',
href: 'https://docs.google.com/forms/d/e/1FAIpQLSfWXsLWJFTHvqu8F0YNirtSHs6z4j7krOX6xbNAOhIgnst8gQ/viewform',
},
{
title: (<>Cartas às Valentes >),
plainTitle: 'Cartas às Valentes',
desc: 'Minha newsletter gratuita — cartas mensais sobre clínica, ACT e coragem.',
kicker: 'Newsletter',
href: 'https://ingrydsimoes.substack.com/',
},
{
title: (<>Canal no YouTube >),
plainTitle: 'YouTube',
desc: '',
kicker: 'Vídeos',
href: 'https://www.youtube.com/@IngrydSimoes',
},
];
const SOCIAL = [
{ name: 'Instagram', href: 'https://www.instagram.com/ingrydsimoes/' },
{ name: 'YouTube', href: 'https://www.youtube.com/@IngrydSimoes' },
{ name: 'Spotify', href: 'https://open.spotify.com/show/0t9hCojdwbtqfolzcneLHk' },
{ name: 'Substack', href: 'https://ingrydsimoes.substack.com/' },
];
// Credentials pulled from current site
const CREDENTIALS = [
<>Pós-graduada em ACT (Terapia de Aceitação e Compromisso)>,
<>Pós-graduada em Avaliação Psicológica e Psicodiagnóstico>,
<>Aprofundamento clínico avançado em ACT com Steven C. Hayes >,
<>Membro da comunidade internacional ACBS >,
];
// ─────────────────────────────────────────────────────────────
// Arrow icon (hand-drawn feel, thin stroke)
// ─────────────────────────────────────────────────────────────
function Arrow({ size = 18, color = 'currentColor' }) {
return (
);
}
// ─────────────────────────────────────────────────────────────
// Small round avatar
// ─────────────────────────────────────────────────────────────
function Avatar({ size = 96, border = CREAM, src = 'assets/ingryd.webp' }) {
return (
);
}
// ─────────────────────────────────────────────────────────────
// Scrolling marquee — "@ingrydsimoes · psicóloga · ..." strip
// ─────────────────────────────────────────────────────────────
function Marquee({ items, speed = 40, color = CREAM, bg = 'transparent', border = false, italic = true, size = 13 }) {
const line = items.join(' · ');
return (
{Array.from({ length: 6 }).map((_, i) => (
{line} ·
))}
);
}
// ─────────────────────────────────────────────────────────────
// Editorial hero headline — the "O que considero indispensável" vibe
// Mix of regular + italic + bold. Tight line-height, big sizes.
// ─────────────────────────────────────────────────────────────
function EditorialTitle({ size = 64, color = CREAM, align = 'left', maxWidth = 'none' }) {
return (
Psicóloga {' '}
que acredita
em ciência ,{' '}
raciocínio clínico
e {' '}
responsabilidade.
);
}
// ─────────────────────────────────────────────────────────────
// LinkCard — creme card with kicker label + editorial title + description + arrow
// On hover: subtle slide of arrow + card lift
// ─────────────────────────────────────────────────────────────
function LinkCard({ link, index, size = 'md' }) {
const [hover, setHover] = React.useState(false);
const pad = size === 'sm' ? '18px 20px' : '22px 24px';
const titleSize = size === 'sm' ? 22 : 28;
return (
setHover(true)}
onMouseLeave={() => setHover(false)}
style={{
display: 'block', position: 'relative',
padding: pad, borderRadius: 14,
background: CREAM, color: RED,
textDecoration: 'none',
border: `1px solid ${RED}10`,
transform: hover ? 'translateY(-2px)' : 'translateY(0)',
boxShadow: hover
? '0 14px 30px rgba(0,0,0,0.22)'
: '0 4px 14px rgba(0,0,0,0.14)',
transition: 'transform .25s cubic-bezier(.2,.7,.3,1), box-shadow .25s',
overflow: 'hidden',
}}>
{String(index + 1).padStart(2, '0')} — {link.kicker}
{link.title}
{link.desc &&
{link.desc}
}
);
}
// ─────────────────────────────────────────────────────────────
// Credentials block (italic + bold mix)
// ─────────────────────────────────────────────────────────────
function Credentials({ align = 'center', size = 13 }) {
return (
{CREDENTIALS.map((c, i) => (
{c}
))}
);
}
// ─────────────────────────────────────────────────────────────
// CRP line
// ─────────────────────────────────────────────────────────────
function CRP({ color = PEACH }) {
return (
CRP 06/206396
);
}
// ──────────────────────────────────────────────────────────────
// Social icons
// ──────────────────────────────────────────────────────────────
function SocialIcon({ name, size = 22, color = 'currentColor' }) {
const s = size;
if (name === 'Instagram') {
return (
);
}
if (name === 'YouTube') {
return (
);
}
if (name === 'Spotify') {
return (
);
}
if (name === 'Substack') {
return (
);
}
return null;
}
function SocialButton({ name, href, color = CREAM }) {
const [hover, setHover] = React.useState(false);
return (
setHover(true)}
onMouseLeave={() => setHover(false)}
aria-label={name}
style={{
display: 'inline-flex', alignItems: 'center', gap: 8,
padding: '10px 16px', borderRadius: 999,
border: `1px solid ${color}${hover ? '80' : '40'}`,
color, textDecoration: 'none',
background: hover ? `${color}14` : 'transparent',
transition: 'background .2s, border-color .2s, transform .2s',
transform: hover ? 'translateY(-1px)' : 'translateY(0)',
fontFamily: '"Helvetica Neue", Helvetica, Arial, sans-serif',
fontSize: 12, letterSpacing: '0.18em', textTransform: 'uppercase',
fontWeight: 500,
}}>
{name}
);
}
function SocialRow({ color = CREAM, align = 'flex-start' }) {
return (
{SOCIAL.map((s, i) => (
))}
);
}
// ─────────────────────────────────────────────────────────────
// MOBILE PAGE — designed for a 390×844 iPhone
// ─────────────────────────────────────────────────────────────
function MobileLinksPage() {
return (
{/* Top marquee */}
{/* Hero image (editorial) */}
{/* overlay gradient */}
{/* overlay name */}
psicóloga · crp 06/206396
Ingryd {' '}
Simões
{/* Editorial tagline */}
O que {' '}
considero
indispensável
para
uma {' '}
clínica
responsável.
{/* Credentials */}
{/* Links */}
{LINKS.map((l, i) => )}
{/* Social */}
{/* Bottom marquee */}
{/* Footer */}
Ingryd Simões
© Todos os direitos reservados 2026 .
);
}
// ─────────────────────────────────────────────────────────────
// DESKTOP PAGE — 1280 wide, editorial split layout
// ─────────────────────────────────────────────────────────────
function DesktopLinksPage() {
return (
{/* Top bar marquee */}
{/* Main split */}
{/* LEFT — editorial photo + headline */}
{/* Kicker */}
psicóloga · crp 06/206396
{/* Big name */}
Ingryd
Simões
{/* Photo */}
{/* frame caption */}
retrato — 2026
@ingrydsimoes
{/* Editorial tagline */}
O que
considero {' '}
indispensável {' '}
para uma
clínica {' '}
responsável.
{/* RIGHT — credentials + links */}
{/* Section label */}
{/* Credentials */}
{CREDENTIALS.map((c, i) => (
{c}
))}
{/* Social */}
{/* Section label 2 */}
{/* Links */}
{LINKS.map((l, i) => )}
{/* Big editorial footer quote */}
ciência ,{' '}
raciocínio clínico
&
responsabilidade
na
clínica.
{/* Bottom marquee */}
{/* Footer */}
Ingryd Simões
© Todos os direitos reservados 2026 .
);
}
// Export to window for multi-script use
Object.assign(window, {
MobileLinksPage, DesktopLinksPage,
LinkCard, Credentials, CRP, Marquee, Avatar, Arrow,
SocialIcon, SocialButton, SocialRow,
LINKS_COLORS: { RED, CREAM, PEACH, RED_DEEP, RED_SOFT },
});