diff --git a/app/cases/[slug]/page.tsx b/app/cases/[slug]/page.tsx
index 5c6c558..053fdb7 100644
--- a/app/cases/[slug]/page.tsx
+++ b/app/cases/[slug]/page.tsx
@@ -109,6 +109,14 @@ export default async function CasePage({ params }: CasePageProps) {
{caseStudy.detail?.answer.text ?? caseStudy.summary}
+ {caseStudy.role ? (
+
+
+ Minha participação:
+ {" "}
+ {caseStudy.role}
+
+ ) : null}
{!caseStudy.detail ? (
{caseStudy.impact}
diff --git a/app/components/Projects.tsx b/app/components/Projects.tsx
index c7b296c..e4e48a2 100644
--- a/app/components/Projects.tsx
+++ b/app/components/Projects.tsx
@@ -91,6 +91,12 @@ export default function Projects({
{caseStudy.impact}
)}
+ {caseStudy?.role && (
+
+
Minha participação
+
{caseStudy.role}
+
+ )}
{project.technologies.slice(0, 5).map((tech) => (
diff --git a/lib/site-content.test.ts b/lib/site-content.test.ts
index 1fc6fe2..7808125 100644
--- a/lib/site-content.test.ts
+++ b/lib/site-content.test.ts
@@ -96,3 +96,14 @@ it("does not publish the unavailable Twins Lab demo", () => {
caseStudies.find((item) => item.id === "twins-lab")?.demoUrl,
).toBeUndefined();
});
+
+it("keeps AS Serviços as a project (code only) and states the author's participation", () => {
+ const asServicos = caseStudies.find(({ id }) => id === "as-servicos");
+ expect(asServicos?.demoUrl).toBeNull();
+ expect(asServicos?.githubUrl).toBe(
+ "https://github.com/evandrodevbr/as-servicos",
+ );
+ expect(asServicos?.role).toMatch(/primeira landing page/i);
+ expect(asServicos?.role).toMatch(/animações 3D/i);
+ expect(asServicos?.role).toMatch(/painel para controle de projetos/i);
+});
diff --git a/lib/site-content.ts b/lib/site-content.ts
index d46784e..22a9fec 100644
--- a/lib/site-content.ts
+++ b/lib/site-content.ts
@@ -75,6 +75,8 @@ export interface CaseStudyContent {
stack: string[];
demoUrl?: string | null;
githubUrl?: string | null;
+ /** Papel do autor quando o projeto não é só dele (texto editorial, sem fonte pública). */
+ role?: string;
detail?: CaseStudyDetail;
}
@@ -659,8 +661,9 @@ export const caseStudies: CaseStudyContent[] = [
impact:
"Representar engenharia física e software na mesma narrativa visual sem depender de um modelo 3D pronto.",
stack: ["Next.js 16", "Three.js", "TypeScript"],
- demoUrl: "https://asservicos.com",
+ demoUrl: null,
githubUrl: "https://github.com/evandrodevbr/as-servicos",
+ role: "Desenvolvimento da primeira landing page do site, com animações 3D, e de um painel para controle de projetos.",
detail: {
answer: {
text: "Site institucional em Next.js 16 que representa quatro frentes de engenharia com uma cena Three.js gerada em código: uma casa wireframe e uma placa-mãe ligadas ao progresso da rolagem.",
diff --git a/public/portfolio-data.json b/public/portfolio-data.json
index 96704f0..2f3f67e 100644
--- a/public/portfolio-data.json
+++ b/public/portfolio-data.json
@@ -264,13 +264,13 @@
"category": "web",
"level": "senior",
"status": "Código público",
- "demoUrl": "https://asservicos.com",
+ "demoUrl": null,
"githubUrl": "https://github.com/evandrodevbr/as-servicos",
"badges": ["Three.js", "WebGL", "Código público"],
"featured": true,
"metrics": {
"complexity": 5,
- "teamSize": "Individual"
+ "teamSize": "Em equipe"
}
}
],