refactor: renomear PawLink → PetLink em todos os ficheiros

This commit is contained in:
2026-05-21 09:17:09 +01:00
parent e62dc9d6e6
commit c9f4faf0a7
23 changed files with 58 additions and 58 deletions

View File

@@ -45,7 +45,7 @@ export async function POST(request: Request) {
// Email de boas-vindas (não bloqueia)
sendEmail({
to: user.email,
subject: 'Bem-vindo à PawLink 🐾',
subject: 'Bem-vindo à PetLink 🐾',
html: buildWelcomeHtml({ userName: user.name }),
}).catch(console.error);

View File

@@ -58,7 +58,7 @@ export default function ForgotPasswordPage() {
>
<div style={{ display: 'flex', alignItems: 'center', gap: '8px', marginBottom: '28px' }}>
<PawPrint size={20} style={{ color: 'var(--terra)' }} />
<span className="logo" style={{ fontSize: '18px' }}>PawLink</span>
<span className="logo" style={{ fontSize: '18px' }}>PetLink</span>
</div>
<h1 style={{ fontFamily: 'var(--font-display)', fontWeight: 900, fontSize: '26px', color: 'var(--soil)', marginBottom: '8px', lineHeight: 1.15 }}>

View File

@@ -42,7 +42,7 @@ export default function LoginPage() {
color: 'var(--color-terra)',
}}
>
PawLink
PetLink
</span>
</div>
@@ -186,7 +186,7 @@ export default function LoginPage() {
opacity: loading ? 0.75 : 1,
cursor: loading ? 'not-allowed' : 'pointer',
}}
aria-label="Entrar na conta PawLink"
aria-label="Entrar na conta PetLink"
>
{loading ? (
<span style={{ display: 'flex', alignItems: 'center', gap: '8px' }}>

View File

@@ -82,7 +82,7 @@ export default function RegisterPage() {
Conta criada!
</h1>
<p style={{ fontFamily: 'var(--font-body)', color: 'var(--soil-mid)', marginBottom: '24px', lineHeight: 1.6 }}>
Bem-vindo/a à PawLink. podes explorar animais e fazer adopções.
Bem-vindo/a à PetLink. podes explorar animais e fazer adopções.
</p>
<Link href="/auth/login" className="btn btn-primary" style={{ justifyContent: 'center' }}>
Entrar na conta
@@ -106,7 +106,7 @@ export default function RegisterPage() {
{/* Marca */}
<div style={{ display: 'flex', alignItems: 'center', gap: '8px', marginBottom: '28px' }}>
<PawPrint size={20} style={{ color: 'var(--terra)' }} />
<span className="logo" style={{ fontSize: '18px' }}>PawLink</span>
<span className="logo" style={{ fontSize: '18px' }}>PetLink</span>
</div>
<h1 style={{ fontFamily: 'var(--font-display)', fontWeight: 900, fontSize: '28px', color: 'var(--soil)', marginBottom: '6px', lineHeight: 1.15 }}>
@@ -201,7 +201,7 @@ export default function RegisterPage() {
className="btn btn-primary"
disabled={loading}
style={{ width: '100%', justifyContent: 'center', marginTop: '8px', opacity: loading ? 0.75 : 1, cursor: loading ? 'not-allowed' : 'pointer' }}
aria-label="Criar conta PawLink"
aria-label="Criar conta PetLink"
>
{loading ? 'A criar conta…' : 'Criar conta'}
</button>

View File

@@ -2,7 +2,7 @@
@import "tailwindcss";
@import "tw-animate-css";
/* ─── PawLink Design System — Editorial Orgânico ────────────── */
/* ─── PetLink Design System — Editorial Orgânico ────────────── */
:root {
/* ── Núcleo da paleta ─────────────────────────── */

View File

@@ -27,21 +27,21 @@ const fragmentMono = Fragment_Mono({
export const metadata: Metadata = {
title: {
default: 'PawLink — Adopção de Animais em Portugal',
template: '%s | PawLink',
default: 'PetLink — Adopção de Animais em Portugal',
template: '%s | PetLink',
},
description:
'Encontra o teu companheiro para a vida. PawLink conecta adoptantes, doadores e canis em todo o território português.',
'Encontra o teu companheiro para a vida. PetLink conecta adoptantes, doadores e canis em todo o território português.',
keywords: ['adopção animais', 'canis portugal', 'adoptar cão', 'adoptar gato', 'doação canil'],
authors: [{ name: 'PawLink' }],
creator: 'PawLink',
metadataBase: new URL('https://pawlink.pt'),
authors: [{ name: 'PetLink' }],
creator: 'PetLink',
metadataBase: new URL('https://petlink.pt'),
openGraph: {
type: 'website',
locale: 'pt_PT',
url: 'https://pawlink.pt',
siteName: 'PawLink',
title: 'PawLink — Adopção de Animais em Portugal',
url: 'https://petlink.pt',
siteName: 'PetLink',
title: 'PetLink — Adopção de Animais em Portugal',
description: 'Encontra o teu companheiro para a vida.',
},
};

View File

@@ -92,7 +92,7 @@ export default function AnimalsPage() {
marginBottom: '12px',
}}
>
PawLink · Adopção
PetLink · Adopção
</p>
<div

View File

@@ -4,7 +4,7 @@ import type { Metadata } from 'next';
export const metadata: Metadata = {
title: 'Fazer uma Doação',
description: 'Doa ração, brinquedos ou apoio financeiro a canis parceiros PawLink em Portugal.',
description: 'Doa ração, brinquedos ou apoio financeiro a canis parceiros PetLink em Portugal.',
};
const donationTypes = [
@@ -224,7 +224,7 @@ export default function DonatePage() {
maxWidth: '400px',
}}
>
Para fazer uma doação precisas de ter conta PawLink. É grátis, rápido e seguro.
Para fazer uma doação precisas de ter conta PetLink. É grátis, rápido e seguro.
</p>
<div style={{ display: 'flex', gap: '10px', flexWrap: 'wrap' }}>
<Link href="/auth/register" className="btn-primary" style={{ fontSize: '13px', padding: '12px 20px', minHeight: '44px' }}>

View File

@@ -3,8 +3,8 @@ import Link from 'next/link';
import { PawPrint, Home } from 'lucide-react';
export const metadata: Metadata = {
title: 'Painel do Canil | PawLink',
description: 'Área de gestão do canil na plataforma PawLink.',
title: 'Painel do Canil | PetLink',
description: 'Área de gestão do canil na plataforma PetLink.',
};
export default function ShelterLayout({ children }: { children: React.ReactNode }) {
@@ -28,7 +28,7 @@ export default function ShelterLayout({ children }: { children: React.ReactNode
<Link href="/shelter/dashboard" style={{ display: 'flex', alignItems: 'center', gap: '8px', textDecoration: 'none' }}>
<PawPrint size={20} style={{ color: 'var(--terra)' }} />
<span style={{ fontFamily: 'var(--font-display)', fontStyle: 'italic', fontWeight: 700, fontSize: '17px', color: 'var(--terra)' }}>
PawLink Canil
PetLink Canil
</span>
</Link>
<Link

View File

@@ -35,7 +35,7 @@ export default function Footer() {
color: 'var(--color-terra)',
}}
>
PawLink
PetLink
</span>
</div>
<p
@@ -156,7 +156,7 @@ export default function Footer() {
>
Feito com
<Heart size={12} style={{ color: 'var(--color-terra)', fill: 'var(--color-terra)' }} />
em Portugal · PawLink © {new Date().getFullYear()}
em Portugal · PetLink © {new Date().getFullYear()}
</p>
<p
style={{

View File

@@ -28,9 +28,9 @@ export default function Header() {
<>
<header className={`header${scrolled ? ' scrolled' : ''}`}>
{/* Logo */}
<Link href="/" className="logo" aria-label="PawLink — Início">
<Link href="/" className="logo" aria-label="PetLink — Início">
<PawPrint size={22} strokeWidth={2.5} />
PawLink
PetLink
</Link>
{/* Hambúrguer animado */}

View File

@@ -93,10 +93,10 @@ export default function SideMenu({ open, onClose }: SideMenuProps) {
className="logo"
onClick={onClose}
style={{ fontSize: '18px' }}
aria-label="PawLink — Início"
aria-label="PetLink — Início"
>
<PawPrint size={18} strokeWidth={2.5} />
PawLink
PetLink
</Link>
<button
onClick={onClose}

View File

@@ -8,9 +8,9 @@ Os canis dependem maioritariamente de redes sociais e contacto telefónico para
---
## 1.2 A Solução — PawLink
## 1.2 A Solução — PetLink
**PawLink** é uma plataforma web que centraliza a adopção de animais e a gestão de doações para canis em todo o território português. A plataforma conecta potenciais adoptantes, doadores e canis numa interface intuitiva, segura e moderna.
**PetLink** é uma plataforma web que centraliza a adopção de animais e a gestão de doações para canis em todo o território português. A plataforma conecta potenciais adoptantes, doadores e canis numa interface intuitiva, segura e moderna.
**Missão:** Reduzir o número de animais em canis portugueses através da tecnologia, tornando a adopção responsável e a doação de bens o caminho mais fácil e natural.
@@ -23,7 +23,7 @@ Os canis dependem maioritariamente de redes sociais e contacto telefónico para
| Adoptante | Adulto(a) +18 anos, residente em Portugal | Encontrar animal compatível próximo da sua localidade |
| Doador | Pessoa física ou empresa | Contribuir financeiramente ou com bens para canis |
| Canil / Associação | Instituição de protecção animal | Gerir animais, reservas e doações recebidas |
| Administrador | Equipa PawLink | Supervisionar toda a plataforma e garantir qualidade |
| Administrador | Equipa PetLink | Supervisionar toda a plataforma e garantir qualidade |
---

View File

@@ -70,4 +70,4 @@
- A plataforma deve estar em conformidade com o **RGPD** (Regulamento Geral sobre a Protecção de Dados) e legislação portuguesa
- Os pagamentos devem ser processados por um fornecedor certificado **PCI DSS** (Stripe)
- O registo é **exclusivo para maiores de 18 anos** — validação obrigatória no servidor
- Apenas canis registados e verificados pela equipa PawLink podem listar animais para adopção
- Apenas canis registados e verificados pela equipa PetLink podem listar animais para adopção

View File

@@ -2,7 +2,7 @@
## 3.1 Visão Geral
A arquitectura da PawLink segue o padrão de aplicação web moderna com separação clara entre frontend, backend e serviços externos. Adoptamos uma abordagem **server-first** com Next.js, que permite renderização no servidor (SSR) para melhor SEO e desempenho inicial, combinada com componentes interactivos no cliente onde necessário.
A arquitectura da PetLink segue o padrão de aplicação web moderna com separação clara entre frontend, backend e serviços externos. Adoptamos uma abordagem **server-first** com Next.js, que permite renderização no servidor (SSR) para melhor SEO e desempenho inicial, combinada com componentes interactivos no cliente onde necessário.
```
┌─────────────────────────────────────────────────────────────┐

View File

@@ -81,7 +81,7 @@ NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY="pk_test_..."
# Email
RESEND_API_KEY="re_..."
RESEND_FROM_EMAIL="noreply@pawlink.pt"
RESEND_FROM_EMAIL="noreply@petlink.pt"
# Supabase Storage
NEXT_PUBLIC_SUPABASE_URL="https://xxx.supabase.co"
@@ -106,7 +106,7 @@ Next.js tem o ecossistema mais maduro para aplicações React complexas com SSR.
### Porque PostgreSQL em vez de MongoDB?
Os dados da PawLink são fortemente relacionais (utilizador → reserva → animal → canil). Uma base de dados relacional como PostgreSQL garante integridade referencial por defeito, suporta transacções ACID (críticas para reservas e pagamentos) e tem melhor suporte a queries complexas com joins.
Os dados da PetLink são fortemente relacionais (utilizador → reserva → animal → canil). Uma base de dados relacional como PostgreSQL garante integridade referencial por defeito, suporta transacções ACID (críticas para reservas e pagamentos) e tem melhor suporte a queries complexas com joins.
### Porque Tailwind CSS em vez de CSS Modules ou Styled Components?

View File

@@ -148,7 +148,7 @@ Todos os uploads são validados antes de armazenar no Supabase Storage:
## 7.3 Conformidade com o RGPD
| Princípio RGPD | Implementação na PawLink |
| Princípio RGPD | Implementação na PetLink |
|---|---|
| **Consentimento explícito** | Checkbox obrigatório no registo com link para Política de Privacidade. Consentimento separado para emails de marketing (opcional). |
| **Finalidade limitada** | Dados pessoais usados apenas para adopção e doação — não partilhados com terceiros excepto processadores necessários (Stripe, Resend). |
@@ -175,7 +175,7 @@ Não são usados cookies de rastreamento ou publicidade.
## 7.4 Segurança dos Pagamentos
- Dados de cartão **nunca passam pelos servidores da PawLink** — tratados directamente pelo Stripe via Payment Element
- Dados de cartão **nunca passam pelos servidores da PetLink** — tratados directamente pelo Stripe via Payment Element
- Stripe é certificado **PCI DSS Level 1** — o mais elevado nível de conformidade
- Webhooks Stripe verificados com **assinatura HMAC-SHA256** — previne falsificação de eventos de pagamento
- Montantes validados no servidor antes de criar PaymentIntent — cliente não pode alterar o valor

View File

@@ -64,7 +64,7 @@ interface MatchContext {
// lib/ai/prompts.ts
export const MATCH_SYSTEM_PROMPT = `
És um especialista em adopção responsável de animais da plataforma PawLink,
És um especialista em adopção responsável de animais da plataforma PetLink,
em Portugal. O teu papel é ajudar utilizadores a encontrar o animal de estimação
mais compatível com o seu estilo de vida.
@@ -135,7 +135,7 @@ O assistente responde em tempo real usando **streaming** para melhor experiênci
```typescript
export const SUPPORT_SYSTEM_PROMPT = `
És o assistente virtual da PawLink, uma plataforma portuguesa de adopção de
És o assistente virtual da PetLink, uma plataforma portuguesa de adopção de
animais e doação a canis. Chamas-te Paws.
PAPEL:
@@ -148,7 +148,7 @@ LIMITAÇÕES:
- Não tens acesso a informação em tempo real sobre animais específicos ou
disponibilidade actual (sugere usar os filtros da plataforma)
- Não podes processar pagamentos ou fazer reservas directamente
- Para questões técnicas graves, sugere contacto via email: suporte@pawlink.pt
- Para questões técnicas graves, sugere contacto via email: suporte@petlink.pt
TOM:
- Caloroso, encorajador e amigável
@@ -193,7 +193,7 @@ export function SupportChat() {
initialMessages: [{
id: 'welcome',
role: 'assistant',
content: 'Olá! Sou o Paws, o assistente da PawLink. Como posso ajudar-te hoje? 🐾'
content: 'Olá! Sou o Paws, o assistente da PetLink. Como posso ajudar-te hoje? 🐾'
}]
});

View File

@@ -248,7 +248,7 @@ import { test, expect } from '@playwright/test';
test('fluxo completo de adopção', async ({ page }) => {
// Login
await page.goto('/login');
await page.fill('[name="email"]', 'teste@pawlink.pt');
await page.fill('[name="email"]', 'teste@petlink.pt');
await page.fill('[name="password"]', 'Password123!');
await page.click('[type="submit"]');

View File

@@ -35,7 +35,7 @@ Canis base Brinquedos Match inteligente Internacionali
| Email de confirmação de reserva (react-email + Resend) | Crítica | 3 dias | Reservas |
| Área de conta: histórico de adopções e definições | Média | 4 dias | Auth |
| Menu lateral + modo escuro/claro | Média | 3 dias | — |
| Deploy inicial na Vercel + domínio pawlink.pt | Alta | 1 dia | Tudo acima |
| Deploy inicial na Vercel + domínio petlink.pt | Alta | 1 dia | Tudo acima |
| **Total Fase 1** | | **~10 semanas** | |
---

View File

@@ -1,4 +1,4 @@
# PawLink — Registo de Progresso
# PetLink — Registo de Progresso
## ⚡ HANDOFF — PRÓXIMA SESSÃO COMEÇA AQUI
@@ -176,7 +176,7 @@
| Supabase Storage | ✅ Configurado | Upload de fotos ainda não implementado na UI |
| Vercel | ⏳ Por configurar | — |
| Stripe | ✅ Configurado | Integração Fase 2 |
| Resend | ✅ Configurado | Verificar domínio @pawlink.pt |
| Resend | ✅ Configurado | Verificar domínio @petlink.pt |
| Anthropic Claude API | ✅ Configurado | Integração Fase 3 |
| Upstash Redis | ✅ Configurado | Rate limiting ainda não implementado |
| Cloudflare | ⏳ Por configurar | — |

View File

@@ -1,4 +1,4 @@
# 🐾 PawLink — Documentação do Projecto
# 🐾 PetLink — Documentação do Projecto
**Plataforma de Adopção e Doação Animal**
Prova de Aptidão Profissional (PAP) — Ano Lectivo 2024/2025

View File

@@ -2,7 +2,7 @@ import { Resend } from 'resend';
const resend = new Resend(process.env.RESEND_API_KEY);
const FROM = process.env.RESEND_FROM_EMAIL ?? 'noreply@pawlink.pt';
const FROM = process.env.RESEND_FROM_EMAIL ?? 'noreply@petlink.pt';
export interface SendEmailOptions {
to: string;
@@ -12,7 +12,7 @@ export interface SendEmailOptions {
export async function sendEmail({ to, subject, html }: SendEmailOptions) {
const { data, error } = await resend.emails.send({
from: `PawLink <${FROM}>`,
from: `PetLink <${FROM}>`,
to,
subject,
html,
@@ -35,13 +35,13 @@ export function buildReservationConfirmationHtml(opts: {
return `
<!DOCTYPE html>
<html lang="pt">
<head><meta charset="UTF-8"><title>Confirmação de Reserva — PawLink</title></head>
<head><meta charset="UTF-8"><title>Confirmação de Reserva — PetLink</title></head>
<body style="margin:0;padding:0;background:#F9F4ED;font-family:Georgia,serif;">
<table width="100%" cellpadding="0" cellspacing="0">
<tr><td align="center" style="padding:40px 16px;">
<table width="560" cellpadding="0" cellspacing="0" style="background:#EFE6D8;border-radius:16px;overflow:hidden;">
<tr><td style="background:#C4501A;padding:28px 36px;">
<span style="color:white;font-size:22px;font-style:italic;font-weight:700;">PawLink</span>
<span style="color:white;font-size:22px;font-style:italic;font-weight:700;">PetLink</span>
</td></tr>
<tr><td style="padding:36px;">
<h1 style="margin:0 0 12px;color:#231408;font-size:28px;">Reserva confirmada! 🐾</h1>
@@ -59,11 +59,11 @@ export function buildReservationConfirmationHtml(opts: {
</td></tr>
</table>
<p style="margin:0;color:#5C4033;font-size:14px;line-height:1.6;">
Lembra-te de levar um documento de identificação. Se precisares de alterar ou cancelar, acede à tua área de conta em <a href="https://pawlink.pt/main/account" style="color:#C4501A;">pawlink.pt</a>.
Lembra-te de levar um documento de identificação. Se precisares de alterar ou cancelar, acede à tua área de conta em <a href="https://petlink.pt/main/account" style="color:#C4501A;">petlink.pt</a>.
</p>
</td></tr>
<tr><td style="padding:20px 36px;border-top:1px solid #E4D8C8;">
<p style="margin:0;color:#9C8070;font-size:12px;">© 2025 PawLink · Portugal · <a href="https://pawlink.pt/privacy" style="color:#9C8070;">Privacidade</a></p>
<p style="margin:0;color:#9C8070;font-size:12px;">© 2025 PetLink · Portugal · <a href="https://petlink.pt/privacy" style="color:#9C8070;">Privacidade</a></p>
</td></tr>
</table>
</td></tr>
@@ -76,23 +76,23 @@ export function buildWelcomeHtml(opts: { userName: string }): string {
return `
<!DOCTYPE html>
<html lang="pt">
<head><meta charset="UTF-8"><title>Bem-vindo ao PawLink</title></head>
<head><meta charset="UTF-8"><title>Bem-vindo ao PetLink</title></head>
<body style="margin:0;padding:0;background:#F9F4ED;font-family:Georgia,serif;">
<table width="100%" cellpadding="0" cellspacing="0">
<tr><td align="center" style="padding:40px 16px;">
<table width="560" cellpadding="0" cellspacing="0" style="background:#EFE6D8;border-radius:16px;overflow:hidden;">
<tr><td style="background:#C4501A;padding:28px 36px;">
<span style="color:white;font-size:22px;font-style:italic;font-weight:700;">PawLink</span>
<span style="color:white;font-size:22px;font-style:italic;font-weight:700;">PetLink</span>
</td></tr>
<tr><td style="padding:36px;">
<h1 style="margin:0 0 12px;color:#231408;font-size:28px;">Bem-vindo, ${opts.userName}! 🐾</h1>
<p style="margin:0 0 20px;color:#5C4033;font-size:16px;line-height:1.6;">
A tua conta PawLink está pronta. Começa a explorar animais à espera de uma família como a tua.
A tua conta PetLink está pronta. Começa a explorar animais à espera de uma família como a tua.
</p>
<a href="https://pawlink.pt/main/animals" style="display:inline-block;background:#C4501A;color:white;padding:14px 28px;border-radius:100px;text-decoration:none;font-size:14px;letter-spacing:0.08em;text-transform:uppercase;">Explorar animais</a>
<a href="https://petlink.pt/main/animals" style="display:inline-block;background:#C4501A;color:white;padding:14px 28px;border-radius:100px;text-decoration:none;font-size:14px;letter-spacing:0.08em;text-transform:uppercase;">Explorar animais</a>
</td></tr>
<tr><td style="padding:20px 36px;border-top:1px solid #E4D8C8;">
<p style="margin:0;color:#9C8070;font-size:12px;">© 2025 PawLink · Portugal</p>
<p style="margin:0;color:#9C8070;font-size:12px;">© 2025 PetLink · Portugal</p>
</td></tr>
</table>
</td></tr>