Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@

# production
/build
/content-labs

# misc
.DS_Store
Expand Down
4 changes: 2 additions & 2 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,9 @@
This version has breaking changes — APIs, conventions, and file structure may all differ from your training data. Read the relevant guide in `node_modules/next/dist/docs/` before writing any code. Heed deprecation notices.
<!-- END:nextjs-agent-rules -->

# Algoria Project Rules & Design System
# Acite Project Rules & Design System

This document outlines the design system, architecture rules, and coding standards for the Algoria project. All AI agents working on this codebase must adhere strictly to these guidelines.
This document outlines the design system, architecture rules, and coding standards for the Acite project. All AI agents working on this codebase must adhere strictly to these guidelines.

## 1. Design System & Aesthetics

Expand Down
10 changes: 5 additions & 5 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
# Algoria
# Acite

![](https://img.shields.io/badge/Versão-1.6.0-black?style=for-the-badge)
![](https://img.shields.io/badge/Versão-2.0.0-black?style=for-the-badge)

Plataforma em português para estudar **algoritmos e decisões em código** através de leitura guiada: catálogo de problemas com várias soluções (brute-force, óptima, alternativa), **code player** linha-a-linha com três níveis de explicação, mini-guias em **Conceitos**, **curso modular** com avaliações locais, hub de **inglês técnico para entrevistas** (conteúdo em inglês) e guias de **engenharia aplicada** (front, back, DevOps, SoftSkills e IA).

<h1 align="center">
<img alt="Algoria Preview" title="Algoria" style="border-radius: 20px; box-shadow: 0 20px 50px rgba(0,0,0,0.3);" src="public/gallery/image1.png" />
<img alt="Acite Preview" title="Acite" style="border-radius: 20px; box-shadow: 0 20px 50px rgba(0,0,0,0.3);" src="/public/preview.webp" />
</h1>

## Funcionalidades
Expand All @@ -30,7 +30,7 @@ Plataforma em português para estudar **algoritmos e decisões em código** atra
## Estrutura do Projeto

```txt
algoria/
acite/
├── app/ # Next.js App Router
│ ├── page.tsx # Landing
│ ├── layout.tsx # Layout global + providers
Expand Down Expand Up @@ -86,7 +86,7 @@ algoria/

### Visão Geral

O Algoria evoluiu para uma arquitetura centrada em **dados dinâmicos via PostgreSQL**. Embora o conteúdo possa ser importado de pastas em `content/` para bootstrapping, a fonte canônica agora reside no banco de dados, permitindo edição em tempo real através do **CMS integrado**. O servidor valida as submissões com **Zod**, gera HTML (Markdown via `marked`) e o **code player** mantém-se como uma ilha interativa no cliente com estado sincronizado via **Zustand**.
O Acite evoluiu para uma arquitetura centrada em **dados dinâmicos via PostgreSQL**. Embora o conteúdo possa ser importado de pastas em `content/` para bootstrapping, a fonte canônica agora reside no banco de dados, permitindo edição em tempo real através do **CMS integrado**. O servidor valida as submissões com **Zod**, gera HTML (Markdown via `marked`) e o **code player** mantém-se como uma ilha interativa no cliente com estado sincronizado via **Zustand**.

### Fluxo de conteúdo → página

Expand Down
1 change: 1 addition & 0 deletions app/admin/content/_components/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -93,6 +93,7 @@ export const ENGINEERING_PILLARS = [
{ value: "devops", label: "DevOps" },
{ value: "softskills", label: "Soft Skills / Carreira" },
{ value: "ia", label: "Inteligência Artificial" },
{ value: "web3", label: "Web3 e Blockchain" },
];

export const CATEGORIES = [
Expand Down
2 changes: 1 addition & 1 deletion app/admin/content/content-examples.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/**
* Real examples from the Algoria platform for each content type.
* Real examples from the Acite platform for each content type.
* These are used by the content editor to show creators how to structure their content.
*/

Expand Down
2 changes: 1 addition & 1 deletion app/admin/layout.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,7 @@ export default async function AdminLayout({
</svg>
</div>
<div className="hidden sm:block">
<p className="text-sm font-bold text-foreground">Algoria Admin</p>
<p className="text-sm font-bold text-foreground">Acite Admin</p>
<p className="text-[10px] tracking-widest text-muted-foreground">
Management Panel
</p>
Expand Down
2 changes: 1 addition & 1 deletion app/admin/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,7 @@ export default async function AdminDashboardPage() {
Dashboard
</h1>
<p className="mt-1 text-sm text-muted-foreground">
Visão geral do estado da plataforma Algoria.
Visão geral do estado da plataforma Acite.
</p>
</div>

Expand Down
4 changes: 2 additions & 2 deletions app/auth/sign-in/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,9 @@ import { buildPublicMetadata } from '@/lib/seo/build-metadata';

export const metadata: Metadata = buildPublicMetadata({
title: 'Iniciar sessão',
description: 'Entra na tua conta Algoria para sincronizar progresso e gerir a subscrição Pro.',
description: 'Entra na tua conta Acite para sincronizar progresso e gerir a subscrição Pro.',
pathname: '/auth/sign-in',
keywords: ['login', 'conta', 'Algoria'],
keywords: ['login', 'conta', 'Acite'],
});

export default function SignInPage() {
Expand Down
4 changes: 2 additions & 2 deletions app/auth/sign-up/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,9 @@ import { buildPublicMetadata } from '@/lib/seo/build-metadata';

export const metadata: Metadata = buildPublicMetadata({
title: 'Criar conta',
description: 'Cria uma conta Algoria para guardar o progresso na nuvem e subscrever o catálogo Pro.',
description: 'Cria uma conta Acite para guardar o progresso na nuvem e subscrever o catálogo Pro.',
pathname: '/auth/sign-up',
keywords: ['registo', 'conta', 'Algoria'],
keywords: ['registo', 'conta', 'Acite'],
});

export default function SignUpPage() {
Expand Down
4 changes: 2 additions & 2 deletions app/changelog/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,9 @@ import { buildPublicMetadata } from "@/lib/seo/build-metadata";
export const metadata: Metadata = buildPublicMetadata({
title: "Novidades",
description:
"Alterações recentes na Algoria: novas funcionalidades, conteúdo e melhorias para quem estuda algoritmos e preparação técnica.",
"Alterações recentes na Acite: novas funcionalidades, conteúdo e melhorias para quem estuda algoritmos e preparação técnica.",
pathname: "/changelog",
keywords: ["changelog", "novidades", "Algoria", "actualizações"],
keywords: ["changelog", "novidades", "Acite", "actualizações"],
});

export const dynamic = "force-dynamic";
Expand Down
25 changes: 15 additions & 10 deletions app/concepts/[slug]/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,10 @@
import { ConceptVisitTracker } from '@/components/concepts/concept-visit-tracker';
import { ContentNavigation } from '@/components/layout/content-navigation';
import { JsonLdScript } from '@/components/seo/json-ld';
import { MarkdownArticle } from '@/components/markdown/markdown-article';

Check warning on line 13 in app/concepts/[slug]/page.tsx

View workflow job for this annotation

GitHub Actions / verify

'MarkdownArticle' is defined but never used
import { Badge } from '@/components/ui/badge';
import { Button } from '@/components/ui/button';
import { MermaidRenderer } from '@/components/markdown/mermaid-renderer';
import { auth } from '@/lib/auth';
import { userHasPro } from '@/lib/billing/entitlements';
import { getConceptAccess, isContentUnlockedForUser } from '@/lib/billing/tiering';
Expand Down Expand Up @@ -45,7 +46,7 @@
difficultyPt,
'conceitos algoritmos',
'fundamentos',
'Algoria',
'Acite',
],
openGraphType: 'article',
});
Expand Down Expand Up @@ -121,15 +122,19 @@
<UpgradePrompt conceptSlug={slug} hideLogin={!!session} />
</div>
) : (
<MarkdownArticle
html={concept.bodyHtml}
className="prose prose-zinc dark:prose-invert max-w-none
prose-h2:text-2xl prose-h2:font-semibold prose-h2:tracking-tight prose-h2:mt-10
prose-h3:text-lg prose-h3:font-semibold
prose-code:text-blue-600 dark:prose-code:text-blue-400
prose-code:before:content-none prose-code:after:content-none
prose-pre:bg-zinc-900 prose-pre:text-zinc-100"
/>
<>
<MermaidRenderer containerId={`concept-article-${slug}`} />
<article
id={`concept-article-${slug}`}
className="prose prose-zinc dark:prose-invert max-w-none
prose-h2:text-2xl prose-h2:font-semibold prose-h2:tracking-tight prose-h2:mt-10
prose-h3:text-lg prose-h3:font-semibold
prose-code:text-blue-600 dark:prose-code:text-blue-400
prose-code:before:content-none prose-code:after:content-none
prose-pre:bg-zinc-900 prose-pre:text-zinc-100"
dangerouslySetInnerHTML={{ __html: concept.bodyHtml }}
/>
</>
)}

{courseSlug && moduleId ? (
Expand Down
2 changes: 1 addition & 1 deletion app/concepts/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ export const metadata: Metadata = buildPublicMetadata({
"two pointers",
"sliding window",
"fundamentos algoritmos",
"Algoria conceitos",
"Acite conceitos",
],
});

Expand Down
2 changes: 1 addition & 1 deletion app/course/[slug]/module/[moduleId]/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ export async function generateMetadata({ params }: { params: Promise<Params> }):
title: `${tabTitle} · ${pack.title}`,
description,
pathname: `/course/${slug}/module/${moduleId}`,
keywords: [tabTitle, pack.title, mod.linkedConceptSlug, 'módulo curso Algoria', 'exercícios fundamentos'],
keywords: [tabTitle, pack.title, mod.linkedConceptSlug, 'módulo curso Acite', 'exercícios fundamentos'],
openGraphType: 'article',
});
}
Expand Down
2 changes: 1 addition & 1 deletion app/course/[slug]/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ export async function generateMetadata({ params }: { params: Promise<Params> }):
title: pack.title,
description: pack.subtitle,
pathname: `/course/${slug}`,
keywords: [pack.title, 'curso guiado algoritmos', 'certificado módulo', 'Algoria curso', ...pack.modules.map((m) => m.certificateTitle)],
keywords: [pack.title, 'curso guiado algoritmos', 'certificado módulo', 'Acite curso', ...pack.modules.map((m) => m.certificateTitle)],
openGraphType: 'article',
});
}
Expand Down
2 changes: 1 addition & 1 deletion app/course/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ export const metadata: Metadata = buildPublicMetadata({
description:
'Percursos com leitura curada, exercícios no browser e certificado modular ao concluir cada avaliação — progresso guardado localmente.',
pathname: '/course',
keywords: ['curso algoritmos', 'fundamentos programação', 'certificado módulo', 'Algoria curso', 'trilha guiada'],
keywords: ['curso algoritmos', 'fundamentos programação', 'certificado módulo', 'Acite curso', 'trilha guiada'],
});

export default async function CoursesIndexPage() {
Expand Down
3 changes: 2 additions & 1 deletion app/engineering-work/[slug]/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ const PILLAR_LABEL: Record<EngineeringWorkPillar, string> = {
devops: "DevOps e sistema",
softskills: "Carreira e Soft Skills",
ia: "Inteligência Artificial",
web3: "Web3 e Blockchain",
};

export async function generateStaticParams(): Promise<Params[]> {
Expand All @@ -62,7 +63,7 @@ export async function generateMetadata({
pillar,
"engenharia software",
"boas práticas produção",
"Algoria guia",
"Acite guia",
],
image: guide.meta.image,
openGraphType: "article",
Expand Down
4 changes: 2 additions & 2 deletions app/explorer/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ interface ExplorerPageProps {
export const metadata = buildPublicMetadata({
title: "Explorar Desenvolvedores",
description:
"Encontra outros desenvolvedores na Algoria, filtra por tecnologias e descobre perfis profissionais.",
"Encontra outros desenvolvedores na Acite, filtra por tecnologias e descobre perfis profissionais.",
pathname: "/explorer",
});

Expand Down Expand Up @@ -86,7 +86,7 @@ export default async function ExplorerPage({
variant="secondary"
className="mb-4 rounded-none bg-primary/10 px-1.5 py-0 font-mono text-[10px] uppercase text-primary"
>
Comunidade Algoria
Comunidade Acite
</Badge>
<h1 className="mb-4 text-4xl font-black uppercase tracking-tighter md:text-6xl">
Explorar Talentos
Expand Down
Binary file modified app/favicon.ico
Binary file not shown.
5 changes: 0 additions & 5 deletions app/icon.svg

This file was deleted.

27 changes: 16 additions & 11 deletions app/interview-en/[slug]/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,9 @@
import { Button } from '@/components/ui/button';
import { ContentNavigation } from '@/components/layout/content-navigation';
import { JsonLdScript } from '@/components/seo/json-ld';
import { MarkdownArticle } from '@/components/markdown/markdown-article';

Check warning on line 10 in app/interview-en/[slug]/page.tsx

View workflow job for this annotation

GitHub Actions / verify

'MarkdownArticle' is defined but never used
import { RequireAuth } from '@/components/auth/require-auth';
import { MermaidRenderer } from '@/components/markdown/mermaid-renderer';
import { getAllInterviewEnglishSlugs, getInterviewEnglishTopic, getAdjacentInterviewEnglish } from '@/lib/content/loader';
import type { InterviewEnglishTrack } from '@/lib/content/schemas';
import { buildPublicMetadata } from '@/lib/seo/build-metadata';
Expand Down Expand Up @@ -50,7 +51,7 @@
'technical English',
'coding interview',
'software interview',
'Algoria',
'Acite',
],
openGraphLocale: 'en_US',
openGraphType: 'article',
Expand Down Expand Up @@ -126,16 +127,20 @@
<UpgradePrompt hideLogin={!!session} />
</div>
) : (
<MarkdownArticle
html={topic.bodyHtml}
className="prose prose-zinc max-w-none dark:prose-invert
prose-h2:mt-10 prose-h2:text-2xl prose-h2:font-semibold prose-h2:tracking-tight
prose-h3:text-lg prose-h3:font-semibold
prose-code:text-blue-600 dark:prose-code:text-blue-400
prose-code:before:content-none prose-code:after:content-none
prose-pre:bg-zinc-900 prose-pre:text-zinc-100
prose-table:text-sm"
/>
<>
<MermaidRenderer containerId={`interview-article-${slug}`} />
<article
id={`interview-article-${slug}`}
className="prose prose-zinc max-w-none dark:prose-invert
prose-h2:mt-10 prose-h2:text-2xl prose-h2:font-semibold prose-h2:tracking-tight
prose-h3:text-lg prose-h3:font-semibold
prose-code:text-blue-600 dark:prose-code:text-blue-400
prose-code:before:content-none prose-code:after:content-none
prose-pre:bg-zinc-900 prose-pre:text-zinc-100
prose-table:text-sm"
dangerouslySetInnerHTML={{ __html: topic.bodyHtml }}
/>
</>
)}

{courseSlug && moduleId ? (
Expand Down
4 changes: 2 additions & 2 deletions app/interview-en/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import {
import { buildPublicMetadata } from "@/lib/seo/build-metadata";

export const metadata: Metadata = buildPublicMetadata({
title: "Technical English for interviews — hub Algoria",
title: "Technical English for interviews — hub Acite",
description:
"English-only hub: vocabulary for data structures & algorithms, live coding talk tracks, behavioral STAR answers and system design phrases for hiring loops.",
pathname: "/interview-en",
Expand All @@ -21,7 +21,7 @@ export const metadata: Metadata = buildPublicMetadata({
"STAR method behavioral",
"system design vocabulary",
"FAANG interview English",
"Algoria",
"Acite",
],
openGraphLocale: "en_US",
});
Expand Down
10 changes: 5 additions & 5 deletions app/layout.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -25,8 +25,8 @@ const geistMono = Geist_Mono({

export const metadata: Metadata = {
title: {
default: "Algoria — aprende algoritmos lendo código, não escrevendo",
template: "%s · Algoria",
default: "Acite — aprende algoritmos lendo código, não escrevendo",
template: "%s · Acite",
},
description:
"Plataforma onde aprendes problemas clássicos de algoritmos linha-a-linha, com explicações em três níveis de profundidade, comparação brute-force vs óptima, e mini-cursos de Big O.",
Expand All @@ -41,7 +41,7 @@ export const metadata: Metadata = {
],
metadataBase: getMetadataBase(),
openGraph: {
title: "Algoria — aprende algoritmos lendo código",
title: "Acite — aprende algoritmos lendo código",
description:
"Linha por linha, com 3 níveis de profundidade. Foco em entender, não em decorar.",
type: "website",
Expand All @@ -59,7 +59,7 @@ export default function RootLayout({
{
"@type": "EducationalOrganization",
"@id": `${origin}/#organization`,
name: "Algoria",
name: "Acite",
url: origin,
description:
"Plataforma para aprender algoritmos e estruturas de dados com leitura guiada de código, preparação para entrevistas e guias de engenharia aplicada.",
Expand All @@ -68,7 +68,7 @@ export default function RootLayout({
"@type": "WebSite",
"@id": `${origin}/#website`,
url: origin,
name: "Algoria",
name: "Acite",
inLanguage: "pt-BR",
publisher: { "@id": `${origin}/#organization` },
},
Expand Down
4 changes: 2 additions & 2 deletions app/leaderboard/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -13,9 +13,9 @@ import { buildPublicMetadata } from "@/lib/seo/build-metadata";
export const metadata: Metadata = buildPublicMetadata({
title: "Leaderboard — Ranking da Comunidade",
description:
"Vê quem está a liderar em XP na Algoria. Compara o teu progresso com o da comunidade e com os teus amigos.",
"Vê quem está a liderar em XP na Acite. Compara o teu progresso com o da comunidade e com os teus amigos.",
pathname: "/leaderboard",
keywords: ["leaderboard", "ranking", "xp", "gamificação", "Algoria"],
keywords: ["leaderboard", "ranking", "xp", "gamificação", "Acite"],
});

async function getLeaderboardData(scope: string, userId?: string) {
Expand Down
Loading
Loading