diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 0000000..10185b0 --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,303 @@ +# AGENTS.md - PodCodar WebApp Agent Guide + +> This document provides essential context for AI agents working on the PodCodar WebApp project. + +## Quick Links + +- [Shared Context](./docs/podcodar.md) - Project overview and domain knowledge +- [Contributing Guide](./CONTRIBUTING.md) - Development workflow +- [README](./README.md) - Project introduction + +--- + +## OpenCode Setup + +This project uses [OpenCode](https://opencode.ai) for AI-assisted development with squad-based workflows. + +### Configuration + +- **Config Directory**: `.opencode/` +- **Agents**: Defined in `.opencode/agent/*.md` +- **Skills**: Reusable knowledge in `.opencode/skills/` +- **Learnings**: Captured in `.opencode/learnings/registry.md` + +### Available Skills + +| Skill | Purpose | Location | +| --------------------- | ---------------------------------------------- | ----------------------------------------------- | +| `astro-i18n` | Astro internationalization with locale routing | `.opencode/skills/astro-i18n/SKILL.md` | +| `continuous-learning` | Capture and organize learnings after diamonds | `.opencode/skills/continuous-learning/SKILL.md` | +| `daisyui-v5-themes` | Custom DaisyUI v5 theme configuration | `.opencode/skills/daisyui-v5-themes/SKILL.md` | +| `tmux-automation` | Detached tmux session management | `.opencode/skills/tmux-automation/SKILL.md` | + +To use a skill: Load it via the `skill` tool with the skill name. + +--- + +## Maestro Setup + +This project uses **Maestro** with the **AI Diamond Chain** workflow defined in `maestro.yaml`. + +### Workflow Overview + +``` +┌─────────────────────────────────────────────────────────────────────┐ +│ AI DIAMOND CHAIN │ +│ │ +│ Discovery Diamond (n) → Implementation Diamond (n) │ +│ ┌──────────────────┐ ┌──────────────────┐ │ +│ │ DIVERGE │ │ DIVERGE │ │ +│ │ • Research │ │ • Architecture │ │ +│ │ • UX Design │──────────▶│ • Prototyping │──────┐ │ +│ │ • Architecture │ │ • Risk analysis │ │ │ +│ └──────────────────┘ └──────────────────┘ │ │ +│ │ │ │ │ +│ ┌──────────────────┐ ┌──────────────────┐ │ │ +│ │ CONVERGE │ │ CONVERGE │ │ │ +│ │ • Problem def │ │ • Solution built │ │ │ +│ │ • Scope commit │──────────▶│ • Quality verify │──────┤ │ +│ │ • Go/No-go │ │ • Ship/Fix │ │ │ +│ └──────────────────┘ └──────────────────┘ │ │ +└────────────────────────────────┬──────────────────────┬───┴─────────┘ + │ │ + ┌────────────┴──────────────────────┘ │ + ↓ │ + ┌──────────────────┐ │ + │ LEARN & FEED │─────────────────────────────────────────┘ + │ • Analytics │ + │ • User feedback │ + │ • Tech learnings │ + └──────────────────┘ +``` + +### Configuration File + +See [`maestro.yaml`](./maestro.yaml) for the complete workflow definition including: + +- Agent role mappings +- Diamond phase configurations +- Decision gate criteria +- Learning loop settings + +--- + +## Agent Roles + +This squad uses 9 specialized agents: + +| Agent | Phase | Purpose | File | +| --------------------- | --------- | --------------------------------------------------- | -------------------------------------- | +| **maestro** | All | Primary orchestrator, coordinates the diamond chain | `.opencode/agent/maestro.md` | +| **architect** | Discovery | Technical feasibility, system design, tradeoffs | `.opencode/agent/architect.md` | +| **researcher** | Discovery | Documentation lookup, prior art, API research | `.opencode/agent/researcher.md` | +| **ux-designer** | Discovery | User flows, interaction patterns, accessibility | `.opencode/agent/ux-designer.md` | +| **frontend-engineer** | Build | UI components, client-side functionality | `.opencode/agent/frontend-engineer.md` | +| **backend-engineer** | Build | Business logic, APIs, data processing | `.opencode/agent/backend-engineer.md` | +| **devops-sre** | Build | CI/CD, infrastructure, build tooling | `.opencode/agent/devops-sre.md` | +| **qa-engineer** | Quality | Automated tests, linting, integration checks | `.opencode/agent/qa-engineer.md` | +| **code-reviewer** | Quality | API validation, standards compliance | `.opencode/agent/code-reviewer.md` | + +### Agent Modes + +- **Primary** (`maestro`): Orchestrates, delegates, never writes code +- **Subagent**: Executes tasks delegated by Maestro + - **Read-only** (`researcher`, `architect`, `ux-designer`, `code-reviewer`): Research and report only + - **Write** (`frontend-engineer`, `backend-engineer`, `devops-sre`, `qa-engineer`): Can modify code + +--- + +## Tech Stack + +### Core Framework + +| Technology | Version | Purpose | +| ---------------------------------------- | ------- | ------------------------- | +| [Astro](https://astro.build) | v6.1.8 | Static site generation | +| [TypeScript](https://typescriptlang.org) | v6.0.3 | Type-safe JavaScript | +| [Bun](https://bun.sh) | latest | Package manager & runtime | + +### Styling + +| Technology | Version | Purpose | +| --------------------------------------- | ------- | ----------------------------------------------------- | +| [Tailwind CSS](https://tailwindcss.com) | v4.2.2 | Utility-first CSS | +| [DaisyUI](https://daisyui.com) | v5.5.19 | Component library | +| Custom themes | - | PodCodar brand colors (purple/violet based on mascot) | + +**Theme Configuration**: `src/styles/global.css` + +- Light theme: `podcodar-light` (default) +- Dark theme: `podcodar-dark` (auto-switch on prefers-color-scheme) +- Colors based on llama mascot: purple/violet primary, lavender secondary + +### Integrations + +| Integration | Purpose | +| --------------------- | --------------------------------- | +| `@astrojs/cloudflare` | Cloudflare adapter for deployment | +| `@astrojs/mdx` | Markdown/MDX content support | +| `@astrojs/rss` | RSS feed generation | +| `@astrojs/sitemap` | Sitemap generation | +| `astro-icon` | Icon system (Simple Icons) | + +### Tooling + +| Tool | Purpose | Config | +| ---------------------------------------------------- | -------------------- | ---------------------- | +| [Biome](https://biomejs.dev) | Linting & formatting | `biome.json` | +| [Vitest](https://vitest.dev) | Unit testing | `vitest.config.ts` | +| [Playwright](https://playwright.dev) | E2E testing | `playwright.config.ts` | +| [Lefthook](https://github.com/evilmartians/lefthook) | Git hooks | `lefthook.yml` | + +### Infrastructure + +| Tool | Purpose | +| ----------------------------------------------------- | ---------------------- | +| [Pulumi](https://pulumi.com) | Infrastructure as Code | +| [Cloudflare](https://cloudflare.com) | Hosting & CDN | +| [GitHub Actions](https://github.com/features/actions) | CI/CD | + +### Internationalization + +- **Current**: Portuguese (pt-br) only +- **Configured in**: `astro.config.ts` +- **Skill available**: `astro-i18n` for adding English support +- Default locale does not use URL prefix (`prefixDefaultLocale: false`) + +--- + +## Development Commands + +```bash +# Install dependencies +bun install + +# Development server +bun dev # http://localhost:4321 + +# Build & preview +bun run build # Production build to ./dist/ +bun run preview # Preview production build + +# Quality checks +bun run lint # Biome linting +bun run lint:fix # Fix linting issues +bun run format # Format code +bun run typecheck # Astro type checking +bun run test # Unit tests (Vitest) +bun run e2e # E2E tests (Playwright) + +# Infrastructure +bun run w # Wrangler CLI +bun run w:build # Build + Wrangler build +``` + +--- + +## CI/CD Workflows + +| Workflow | Trigger | Purpose | File | +| -------- | ---------------- | ------------------------------------- | -------------------------------------- | +| Quality | PR, push to main | Lint, format, typecheck, build | `.github/workflows/quality.yml` | +| Deploy | push to main | Deploy to Cloudflare (dev) | `.github/workflows/deploy.yml` | +| Release | tag (v*.*.\*) | Deploy to production + GitHub release | `.github/workflows/release.yml` | +| E2E | manual | Playwright E2E tests | `.github/workflows/playwright-e2e.yml` | + +--- + +## Project Structure + +``` +├── .opencode/ # Agent configuration +│ ├── agent/ # Agent role definitions +│ ├── skills/ # Reusable skills +│ └── learnings/ # Learning registry +├── .github/workflows/ # CI/CD pipelines +├── src/ +│ ├── assets/ # Static assets (fonts, images) +│ ├── components/ # Astro components +│ ├── content/ # Content collections (blog) +│ ├── layouts/ # Page layouts +│ ├── pages/ # Route pages +│ └── styles/ # Global CSS +├── infra/ # Pulumi infrastructure code +├── docs/ # Project documentation +│ └── podcodar.md # Shared context (see below) +├── astro.config.ts # Astro configuration +├── biome.json # Biome configuration +├── maestro.yaml # Maestro workflow config +├── mise.toml # Mise environment config +└── package.json # Dependencies & scripts +``` + +--- + +## Shared Context + +:page_with_curl: **[docs/podcodar.md](./docs/podcodar.md)** - Essential reading for all agents + +This document contains: + +- Project mission and values +- Target audience +- Site structure and features +- Brand guidelines (colors, typography, mascot) +- Content strategy +- Development conventions + +**All agents should read this before starting work.** + +--- + +## Environment Setup + +### Prerequisites + +- [Bun](https://bun.sh) (latest) +- [Node.js](https://nodejs.org) >=22.12.0 (see `.node-version`) +- [Mise](https://mise.jdx.dev) (optional, for environment management) + +### Environment Variables + +Encrypted secrets stored in `.env.gpg`. To decrypt: + +```bash +mise run decrypt # or: gpg -d .env.gpg > .env +``` + +Required for deployment (Cloudflare/Pulumi credentials). + +--- + +## Key Files for Agents + +| File | Why It Matters | +| --------------------------------- | ------------------------------------- | +| `maestro.yaml` | Defines the AI Diamond Chain workflow | +| `docs/podcodar.md` | Shared project context | +| `src/styles/global.css` | Brand colors and design tokens | +| `astro.config.ts` | Site configuration, i18n settings | +| `biome.json` | Code style and linting rules | +| `.opencode/learnings/registry.md` | Captured learnings from past work | + +--- + +## Decision Gates + +All work goes through explicit decision gates: + +### Discovery Gate (human approval required) + +- **GO**: Proceed to implementation +- **NO-GO**: Cancel objective +- **REFINE**: More research needed + +### Implementation Gate (auto-triggers Learn & Feed) + +- **SHIP**: Deploy the solution +- **NO-SHIP**: Critical issues, do not deploy +- **FIX**: Address issues and retry (max 3 retries) + +--- + +_For questions about agent workflows, see the [Maestro documentation](./maestro.yaml)._ diff --git a/astro.config.ts b/astro.config.ts index 878a7b0..82dc8a7 100644 --- a/astro.config.ts +++ b/astro.config.ts @@ -25,6 +25,7 @@ export default defineConfig({ icon({ include: { 'simple-icons': ['github', 'linkedin', 'instagram', 'youtube', 'x', 'discord'], + lucide: ['*'], }, }), ], diff --git a/bun.lock b/bun.lock index 45fc477..29cf390 100644 --- a/bun.lock +++ b/bun.lock @@ -10,6 +10,7 @@ "@astrojs/mdx": "^5.0.3", "@astrojs/rss": "^4.0.18", "@astrojs/sitemap": "^3.7.2", + "@iconify-json/lucide": "^1.2.102", "@iconify-json/simple-icons": "^1.2.79", "@tailwindcss/vite": "^4.2.2", "astro": "^6.1.8", @@ -202,6 +203,8 @@ "@grpc/proto-loader": ["@grpc/proto-loader@0.8.0", "", { "dependencies": { "lodash.camelcase": "^4.3.0", "long": "^5.0.0", "protobufjs": "^7.5.3", "yargs": "^17.7.2" }, "bin": { "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" } }, "sha512-rc1hOQtjIWGxcxpb9aHAfLpIctjEnsDehj0DAiVfBlmT84uvR0uUtN2hEi/ecvWVjXUGf5qPF4qEgiLOx1YIMQ=="], + "@iconify-json/lucide": ["@iconify-json/lucide@1.2.102", "", { "dependencies": { "@iconify/types": "*" } }, "sha512-Dm3EEqu5NrmzyDMB2U1+8yroEj2/dB9V4KlH0m/szwwF/ofSf0cPaGTZqkd1aExXjCor+vU53ttRMCGuXf+/cg=="], + "@iconify-json/simple-icons": ["@iconify-json/simple-icons@1.2.79", "", { "dependencies": { "@iconify/types": "*" } }, "sha512-aNyO7Fd1qej9oQfIyohYFRv0lhQLaZ+6UkK1c1qwax0MDPUOZOdq65MlU500kow97pD/W+b2u1And3e25eE24Q=="], "@iconify/tools": ["@iconify/tools@4.2.0", "", { "dependencies": { "@iconify/types": "^2.0.0", "@iconify/utils": "^2.3.0", "cheerio": "^1.1.2", "domhandler": "^5.0.3", "extract-zip": "^2.0.1", "local-pkg": "^1.1.2", "pathe": "^2.0.3", "svgo": "^3.3.2", "tar": "^7.5.2" } }, "sha512-WRxPva/ipxYkqZd1+CkEAQmd86dQmrwH0vwK89gmp2Kh2WyyVw57XbPng0NehP3x4V1LzLsXUneP1uMfTMZmUA=="], diff --git a/docs/podcodar.md b/docs/podcodar.md new file mode 100644 index 0000000..84bfc77 --- /dev/null +++ b/docs/podcodar.md @@ -0,0 +1,252 @@ +# PodCodar WebApp - Shared Context + +> **Purpose**: This document provides essential context about PodCodar for all AI agents. Read this before starting any work. + +--- + +## What is PodCodar? + +**PodCodar** is a Brazilian learning community focused on programming and technology. We help people learn to code through mentorship, collaborative projects, and a supportive community. + +### Mission + +Empower Brazilians to start and grow their careers in technology through accessible, community-driven learning. + +### Values + +- **Collaboration**: Learning together is more effective than learning alone +- **Accessibility**: Quality tech education should be available to everyone +- **Practical Learning**: Build real projects, not just tutorials +- **Community First**: We grow by helping each other + +--- + +## Target Audience + +### Primary + +- Brazilians interested in learning programming +- Career switchers looking to enter tech +- Self-taught developers seeking structure and mentorship + +### Secondary + +- Junior developers looking to grow their skills +- Experienced developers who want to mentor others +- Tech companies seeking talented junior developers + +### Language + +- **Primary**: Portuguese (pt-BR) +- **Secondary**: English (for broader reach and resources) +- Currently Portuguese-only; English support planned + +--- + +## Site Structure + +The website serves as the public face of the community: + +### Pages + +| Page | Purpose | URL | +| ----------------- | -------------------------------------- | ---------------- | +| **Home** | Landing page with value proposition | `/` | +| **About** | Mission, story, team | `/about` | +| **Blog** | Articles, tutorials, community updates | `/blog` | +| **Join Us** | How to become a member | `/join-us` | +| **Contributing** | How to contribute to the community | `/contributing` | +| **Contact** | Get in touch | `/contact` | +| **Design System** | Visual reference for components | `/design-system` | + +### Content Collections + +- **Blog Posts**: Markdown/MDX in `src/content/blog/` + - Tutorials, community updates, member stories + - Typed frontmatter with Astro content collections + +--- + +## Brand Guidelines + +### Mascot + +**The PodCodar Llama** :llama: + +Our mascot is a purple/violet llama wearing sunglasses. This is central to our brand identity. + +### Color Palette + +**Primary Colors** (based on mascot): + +- **Primary**: Purple/Violet (`oklch(60% 0.2 285)`) +- **Secondary**: Lavender/Lilac (`oklch(75% 0.12 290)`) +- **Accent**: Deep Purple (`oklch(50% 0.18 285)`) + +**Theme Implementation**: + +- Light theme: `podcodar-light` (clean white with purple accents) +- Dark theme: `podcodar-dark` (deep purple-tinted dark) +- Both defined in `src/styles/global.css` + +**Important**: Do not assume tech company = blue. Our brand is purple because of the llama mascot! + +### Typography + +- **Primary Font**: Atkinson Hyperlegible + - Chosen for accessibility and readability + - Local font files in `src/assets/fonts/` +- **Fallback**: System sans-serif stack + +### Design System + +- Built with **DaisyUI v5** + **Tailwind CSS v4** +- Semantic color tokens: `primary`, `secondary`, `accent`, `base-*` +- View at `/design-system` when running locally + +--- + +## Tech Stack Context + +### Why Astro? + +- Static site generation for performance +- Excellent content collection support for blog +- Component islands for interactivity where needed +- Built-in i18n routing support + +### Why Tailwind + DaisyUI? + +- Consistent with main PodCodar webapp +- DaisyUI provides accessible components out of the box +- Custom theming matches brand colors +- Utility-first CSS enables rapid development + +### Why Cloudflare? + +- Edge deployment for global performance +- Generous free tier suitable for community projects +- Pulumi integration for infrastructure as code + +--- + +## Content Strategy + +### Blog Topics + +- Programming tutorials (JavaScript, Python, etc.) +- Career advice for junior developers +- Community member spotlights +- Project showcases +- Industry insights relevant to learners + +### Tone & Voice + +- **Welcoming**: Inclusive language for all skill levels +- **Encouraging**: Learning is a journey, not a destination +- **Practical**: Actionable advice and examples +- **Portuguese-first**: Write primarily in Portuguese + +--- + +## Development Conventions + +### Code Style + +- **Linting**: Biome (configured in `biome.json`) +- **Formatting**: 2-space indentation, 100 char line width +- **Imports**: Use `@/` alias instead of relative paths (`../`) +- **Types**: Strict TypeScript enabled + +### Component Patterns + +- Astro components for static content +- DaisyUI classes for styling +- Custom CSS in `src/styles/global.css` for global styles + +### Git Workflow + +- Main branch: `main` +- Feature branches: descriptive names +- Pull requests required for changes +- Quality gate runs on all PRs + +### File Organization + +``` +src/ +├── components/ # Reusable Astro components +│ ├── marketing/ # Marketing page sections +│ └── metadata/ # SEO/metadata components +├── layouts/ # Page layout templates +├── pages/ # Route definitions +├── content/ # Content collections +│ └── blog/ # Blog posts (markdown/MDX) +├── assets/ # Static assets +│ ├── fonts/ # Atkinson font files +│ └── images/ # Project images +└── styles/ # Global CSS +``` + +--- + +## Important Notes for Agents + +### Design Decisions + +1. **Colors come from the mascot**: Always reference the llama for brand colors (purple, not blue) +2. **Accessibility matters**: We serve learners of all abilities +3. **Performance counts**: Many users may be on mobile or slower connections +4. **Community-focused**: Features should encourage participation and learning + +### Content Considerations + +- Blog posts should be practical and beginner-friendly +- Use Portuguese as the primary language +- Include code examples where relevant +- Link to community resources when possible + +### Technical Constraints + +- Static site (SSG) - avoid server-side dependencies where possible +- Cloudflare Workers compatibility for edge functions +- Keep bundle sizes reasonable for global audience + +### What NOT to Do + +- Don't add complex authentication (this is a public info site) +- Don't assume users have fast internet +- Don't use English-only resources without Portuguese context +- Don't break the purple color scheme with unrelated colors + +--- + +## Resources & References + +### Internal + +- `src/styles/global.css` - Brand colors and CSS variables +- `astro.config.ts` - Site configuration +- `/design-system` page - Visual component reference + +### External + +- [PodCodar GitHub](https://github.com/podcodar) - Main organization +- [Astro Documentation](https://docs.astro.build) +- [DaisyUI Theme Generator](https://daisyui.com/theme-generator/) +- [Tailwind CSS Documentation](https://tailwindcss.com/docs) + +--- + +## Questions? + +If you're unsure about: + +- **Design**: Check the mascot colors and `/design-system` page +- **Content**: Default to Portuguese, beginner-friendly tone +- **Technical**: Follow existing patterns in the codebase +- **Priority**: Community needs come first + +--- + +_This document is a living reference. Update it as the project evolves._ diff --git a/package.json b/package.json index 1fd4be7..122ba01 100644 --- a/package.json +++ b/package.json @@ -36,6 +36,7 @@ "@astrojs/mdx": "^5.0.3", "@astrojs/rss": "^4.0.18", "@astrojs/sitemap": "^3.7.2", + "@iconify-json/lucide": "^1.2.102", "@iconify-json/simple-icons": "^1.2.79", "@tailwindcss/vite": "^4.2.2", "astro": "^6.1.8", diff --git a/src/components/Header.astro b/src/components/Header.astro index c52d266..370a960 100644 --- a/src/components/Header.astro +++ b/src/components/Header.astro @@ -11,6 +11,7 @@ const navigationLinks = [ { href: getRelativeLocaleUrl(lang, '/'), label: t('nav.home') }, { href: getRelativeLocaleUrl(lang, '/blog'), label: t('nav.blog') }, { href: getRelativeLocaleUrl(lang, '/about'), label: t('nav.about') }, + { href: getRelativeLocaleUrl(lang, '/transparency'), label: t('nav.transparency') }, { href: getRelativeLocaleUrl(lang, '/contact'), label: t('nav.contact') }, ]; diff --git a/src/components/Logo.astro b/src/components/Logo.astro index bd09d80..ef11f9b 100644 --- a/src/components/Logo.astro +++ b/src/components/Logo.astro @@ -24,7 +24,6 @@ interface Props { const { size = 'md', showTitle = true, class: className } = Astro.props; -const logoSrc = `${import.meta.env.BASE_URL}/images/logo.svg`; const markClass = sizeMap[size] ?? sizeMap.md; const titleClass = titleMap[size] ?? titleMap.default; --- @@ -37,7 +36,7 @@ const titleClass = titleMap[size] ?? titleMap.default; ]} > PodCodar; + href: string; +} + +const { doc, href } = Astro.props; + +const iconMap: Record = { + institucional: 'lucide:scroll-text', + financeiro: 'lucide:trending-up', + fiscal: 'lucide:shield-check', +}; + +const categoryColors: Record = { + institucional: 'bg-blue-500/10 text-blue-500 group-hover:bg-blue-500/20', + financeiro: 'bg-emerald-500/10 text-emerald-500 group-hover:bg-emerald-500/20', + fiscal: 'bg-violet-500/10 text-violet-500 group-hover:bg-violet-500/20', +}; + +const icon = iconMap[doc.data.category] || 'lucide:file'; +const colorClass = + categoryColors[doc.data.category] || 'bg-primary/10 text-primary group-hover:bg-primary/20'; +--- + + + +
+ +
+ +
+
+ +
+
+
+ +
+
+
+ + +
+

+ {doc.data.title} +

+

+ {doc.data.description} +

+
+ + +
+ + +
+
+
diff --git a/src/content.config.ts b/src/content.config.ts index f7d68b7..7b7d6f0 100644 --- a/src/content.config.ts +++ b/src/content.config.ts @@ -17,4 +17,16 @@ const blog = defineCollection({ }), }); -export const collections = { blog }; +const transparency = defineCollection({ + loader: glob({ base: './src/content/transparency', pattern: '**/*.{md,mdx}' }), + schema: z.object({ + title: z.string(), + description: z.string(), + category: z.enum(['institucional', 'financeiro', 'fiscal']), + date: z.coerce.date(), + fileUrl: z.string().optional(), + icon: z.string().optional(), + }), +}); + +export const collections = { blog, transparency }; diff --git a/src/content/transparency/ata-eleicao-2026.md b/src/content/transparency/ata-eleicao-2026.md new file mode 100644 index 0000000..f124c52 --- /dev/null +++ b/src/content/transparency/ata-eleicao-2026.md @@ -0,0 +1,31 @@ +--- +title: "Ata de Eleição 2026" +description: "Ata da Assembleia Geral de Eleição realizada em 2026, contendo a composição do Conselho Administrativo para o biênio 2026-2028." +category: "institucional" +date: 2026-01-01 +fileUrl: "https://drive.google.com/file/d/ATA_2026_ID/view" +icon: "users" +--- + +Ata da Assembleia Geral de Eleição da Associação PodCodar, realizada para eleger a diretoria e conselho fiscal para o biênio 2026-2028. + +## Diretoria Eleita + +| Cargo | Nome | +| --------------- | ----------------------------- | +| Presidente | Marco Antônio de Souza Júnior | +| Vice-Presidente | Pedro Henrique Ramos Costa | +| Tesoureiro | Marina Andrade Fonseca | +| Secretário | Pedro Frattezi Silva | + +## Conselho Fiscal + +| Nome | Função | +| --------------------------- | ------------------ | +| Filipe Barbosa Silva | Conselheiro Fiscal | +| Joel Morais Leal | Conselheiro Fiscal | +| Luis Arthur Bighetti Valini | Conselheiro Fiscal | + +## Mandato + +O mandato da diretoria eleita é de 2 (dois) anos, com início em 1º de janeiro de 2026 e término em 31 de dezembro de 2027. diff --git a/src/content/transparency/balanco-2024.md b/src/content/transparency/balanco-2024.md new file mode 100644 index 0000000..1440caf --- /dev/null +++ b/src/content/transparency/balanco-2024.md @@ -0,0 +1,38 @@ +--- +title: "Balanço Patrimonial 2024" +description: "Balanço patrimonial e demonstrações financeiras do exercício de 2024, elaborados conforme as normas brasileiras de contabilidade." +category: "financeiro" +date: 2024-12-31 +fileUrl: "https://drive.google.com/file/d/BALANCO_2024_ID/view" +icon: "bar-chart" +--- + +## Demonstrações Financeiras 2024 + +Este documento apresenta as demonstrações financeiras da Associação PodCodar relativas ao exercício de 2024, elaboradas em conformidade com as Normas Brasileiras de Contabilidade. + +### Estrutura do Balanço + +- **Ativo**: Bens e direitos da organização +- **Passivo**: Obrigações e dívidas +- **Patrimônio Líquido**: Diferença entre ativo e passivo + +### Receitas + +As receitas da PodCodar são provenientes principalmente de: + +- Doações de pessoas físicas +- Patrocínios de empresas +- Eventos e atividades de captação + +### Despesas + +As despesas são voltadas para: + +- Plataforma e ferramentas de ensino +- Materiais e recursos didáticos +- Operação e manutenção da comunidade + +## Certificação + +As demonstrações financeiras foram elaboradas pela diretoria e revisadas pelo Conselho Fiscal. diff --git a/src/content/transparency/estatuto.md b/src/content/transparency/estatuto.md new file mode 100644 index 0000000..23700f8 --- /dev/null +++ b/src/content/transparency/estatuto.md @@ -0,0 +1,25 @@ +--- +title: "Estatuto Social" +description: "Documento de constituição da Associação PodCodar, registrado em cartório, que estabelece as regras de funcionamento e governança da organização." +category: "institucional" +date: 2024-01-15 +fileUrl: "https://drive.google.com/file/d/ESTATUTO_ID/view" +icon: "file-text" +--- + +Este é o documento de constituição da Associação PodCodar, registrado em cartório. O estatuto estabelece a missão, objetivos, estrutura de governança e regras de funcionamento da organização. + +## Principais Pontos + +- **Missão**: Democratizar o acesso à educação profissionalizante em tecnologia +- **Natureza**: Associação civil sem fins lucrativos +- **Prazo de duração**: Indeterminado +- **Sede**: Brasil + +## Objetivos + +A PodCodar tem como objetivo promover a educação profissionalizante em tecnologia, oferecendo mentoria, grupos de estudo e projetos práticos para pessoas interessadas em ingressar ou se aperfeiçoar na área de tecnologia. + +## Alterações + +O estatuto pode ser alterado por decisão da Assembleia Geral Extraordinária, com quórum qualificado de 2/3 dos associados. diff --git a/src/content/transparency/relatorio-2024.md b/src/content/transparency/relatorio-2024.md new file mode 100644 index 0000000..0a10f3e --- /dev/null +++ b/src/content/transparency/relatorio-2024.md @@ -0,0 +1,50 @@ +--- +title: "Relatório de Atividades 2024" +description: "Relatório anual de atividades da PodCodar, apresentando as principais ações realizadas, métricas de impacto e planos para o futuro." +category: "financeiro" +date: 2024-12-31 +fileUrl: "https://drive.google.com/file/d/RELATORIO_2024_ID/view" +icon: "trending-up" +--- + +## Relatório de Atividades 2024 + +A PodCodar encerra o ano de 2024 com importantes conquistas na missão de democratizar o acesso à educação em tecnologia. + +### Principais Realizações + +#### Programas de Mentoria + +- **30+ mentorados** atendidos durante o ano +- **16 pessoas colocadas em empregos** na área de tecnologia +- **2 alunos aprovados** em universidades federais + +#### Grupos de Estudo + +- Formação de novas turmas de estudo +- Expansão dos canais de comunicação +- Integração com o Discord da comunidade + +#### Projetos e Eventos + +- Realização de encontros online +- Workshops técnicos +- Participação em eventos da comunidade tech + +### Impacto Acumulado + +Desde a fundação, a PodCodar já impactou: + +- **300+ membros** na comunidade +- Centenas de pessoas com acesso a conteúdo gratuito +- Múltiplas histórias de sucesso na transição de carreira + +### Agradecimentos + +Agradecemos a todos os voluntários, mentores, doadores e parceiros que fazem este trabalho acontecer. Sem a colaboração da comunidade, nada disso seria possível. + +### Próximos Passos para 2025 + +- Expansão do programa de mentoria +- Novos parceiros corporativos +- Programa de estágio e colocação profissional diff --git a/src/data/transparency.ts b/src/data/transparency.ts new file mode 100644 index 0000000..8dc9d99 --- /dev/null +++ b/src/data/transparency.ts @@ -0,0 +1,25 @@ +/** Static data for the Transparency page */ + +export const CNPJ = '53.979.776/0001-61'; + +export const CONTACT_EMAIL = 'contato@podcodar.org'; + +export const BOARD_MEMBERS = [ + { name: 'Marco Antônio de Souza Júnior', role: 'Presidente' }, + { name: 'Pedro Henrique Ramos Costa', role: 'Vice-Presidente' }, + { name: 'Marina Andrade Fonseca', role: 'Tesoureiro' }, + { name: 'Pedro Frattezi Silva', role: 'Secretário' }, + { name: 'Filipe Barbosa Silva', role: 'Conselheiro Fiscal' }, + { name: 'Joel Morais Leal', role: 'Conselheiro Fiscal' }, + { name: 'Luis Arthur Bighetti Valini', role: 'Conselheiro Fiscal' }, +] as const; + +export const METRICS = [ + { value: '300+', label: 'membros' }, + { value: '30+', label: 'mentorados' }, + { value: '16+', label: 'colocados em empregos' }, + { value: '2', label: 'colocados em universidades federais' }, +] as const; + +export type BoardMember = (typeof BOARD_MEMBERS)[number]; +export type Metric = (typeof METRICS)[number]; diff --git a/src/i18n/ui.ts b/src/i18n/ui.ts index 0c11467..b04362c 100644 --- a/src/i18n/ui.ts +++ b/src/i18n/ui.ts @@ -8,6 +8,30 @@ export const ui = { 'nav.contact': 'Contato', 'nav.contributing': 'Como posso ajudar?', 'nav.join_us': 'Faça parte!', + 'nav.transparency': 'Transparência', 'footer.copyright': 'Todos os direitos reservados.', + // Transparency page + 'transparency.title': 'Transparência', + 'transparency.subtitle': 'Compromisso com a transparência e prestação de contas', + 'transparency.intro': + 'A PodCodar acredita que a transparência é fundamental para construir confiança com nossa comunidade, doadores e parceiros. Estamos comprometidos em prestar contas de nossas atividades, finanças e governança.', + 'transparency.documents.title': 'Documentos', + 'transparency.documents.subtitle': 'Acesse nossos documentos institucionais e financeiros.', + 'transparency.board.title': 'Conselho Administrativo', + 'transparency.board.subtitle': 'Conheça a diretoria eleita para o biênio 2026-2028.', + 'transparency.metrics.title': 'Impacto e Resultados', + 'transparency.metrics.subtitle': 'Números que refletem o trabalho da comunidade.', + 'transparency.contact.title': 'Fale Conosco', + 'transparency.contact.text': + 'Tem perguntas sobre nossas finanças ou governança? Entre em contato:', + 'transparency.lastUpdated': 'Última atualização', + 'transparency.download': 'Baixar documento', + 'transparency.view': 'Ver documento', + 'transparency.category.institucional': 'Institucional', + 'transparency.category.financeiro': 'Financeiro', + 'transparency.category.fiscal': 'Fiscal', + 'transparency.cnpj': 'CNPJ', }, } as const; + +export type Lang = keyof typeof ui; diff --git a/src/i18n/utils.ts b/src/i18n/utils.ts index 1957bbb..6def732 100644 --- a/src/i18n/utils.ts +++ b/src/i18n/utils.ts @@ -3,7 +3,7 @@ import { defaultLang, ui } from '@/i18n/ui'; export type Lang = keyof typeof ui; /** - * Idioma do site (pt-BR). Rotas em inglês foram removidas. + * Get language from URL pathname. */ export function getLangFromUrl(_url: URL): Lang { return defaultLang; diff --git a/src/pages/transparency/[slug].astro b/src/pages/transparency/[slug].astro new file mode 100644 index 0000000..5d5ce5a --- /dev/null +++ b/src/pages/transparency/[slug].astro @@ -0,0 +1,154 @@ +--- +import { getCollection, render } from 'astro:content'; +import { Icon } from 'astro-icon/components'; +import FormattedDate from '@/components/FormattedDate.astro'; +import { useTranslations } from '@/i18n/utils'; +import Layout from '@/layouts/Layout.astro'; + +export async function getStaticPaths() { + const docs = await getCollection('transparency'); + return docs.map((doc) => ({ + params: { slug: doc.id }, + props: { doc }, + })); +} + +const { doc } = Astro.props; + +const t = useTranslations('pt-br'); + +const { Content } = await render(doc); + +const iconMap: Record = { + institucional: 'lucide:scroll-text', + financeiro: 'lucide:trending-up', + fiscal: 'lucide:shield-check', +}; + +const categoryColors: Record = { + institucional: { + bg: 'bg-blue-500/10', + text: 'text-blue-500', + gradient: 'from-blue-500 to-blue-600', + }, + financeiro: { + bg: 'bg-emerald-500/10', + text: 'text-emerald-500', + gradient: 'from-emerald-500 to-emerald-600', + }, + fiscal: { + bg: 'bg-violet-500/10', + text: 'text-violet-500', + gradient: 'from-violet-500 to-violet-600', + }, +}; + +const icon = iconMap[doc.data.category] || 'lucide:file'; +const colors = categoryColors[doc.data.category] || { + bg: 'bg-primary/10', + text: 'text-primary', + gradient: 'from-primary to-primary/80', +}; +--- + + + +
+ +
+
+
+
+ +
+ + + + +
+ +
+ +
+ + +
+
+ + {t(`transparency.category.${doc.data.category}`)} +
+ +

+ {doc.data.title} +

+ +

+ {doc.data.description} +

+ +
+ + + + +
+
+
+
+
+ + + {doc.data.fileUrl && ( +
+
+
+ + + + {t('transparency.view')} + + +
+
+
+ )} + + + +
diff --git a/src/pages/transparency/index.astro b/src/pages/transparency/index.astro new file mode 100644 index 0000000..b6727ad --- /dev/null +++ b/src/pages/transparency/index.astro @@ -0,0 +1,262 @@ +--- +import { getCollection } from 'astro:content'; +import { Icon } from 'astro-icon/components'; +import FormattedDate from '@/components/FormattedDate.astro'; +import DocumentCard from '@/components/transparency/DocumentCard.astro'; +import { BOARD_MEMBERS, CNPJ, CONTACT_EMAIL, METRICS } from '@/data/transparency'; +import { useTranslations } from '@/i18n/utils'; +import Layout from '@/layouts/Layout.astro'; + +const t = useTranslations('pt-br'); + +const documents = (await getCollection('transparency')).sort( + (a, b) => b.data.date.valueOf() - a.data.date.valueOf() +); + +const institutionalDocs = documents.filter((d) => d.data.category === 'institucional'); +const financialDocs = documents.filter((d) => d.data.category === 'financeiro'); +const fiscalDocs = documents.filter((d) => d.data.category === 'fiscal'); + +const lastUpdated = documents[0]?.data.date; +--- + + + +
+ +
+
+
+
+
+ +
+ +
+ + Compromisso com a Transparência +
+ +

+ {t('transparency.title')} +

+ +

+ {t('transparency.intro')} +

+ + +
+
+
+ +
+
+ {documents.length} + Documentos +
+
+
+
+ +
+
+ {BOARD_MEMBERS.length} + Membros +
+
+ {lastUpdated && ( +
+
+ +
+
+ Atualizado + +
+
+ )} +
+
+
+ + +
+
+
+
+ +
+
+

{t('transparency.documents.title')}

+

{t('transparency.documents.subtitle')}

+
+
+ + {institutionalDocs.length > 0 && ( +
+

+ + + + {t('transparency.category.institucional')} +

+
    + {institutionalDocs.map((doc) => ( +
  • + +
  • + ))} +
+
+ )} + + {financialDocs.length > 0 && ( +
+

+ + + + {t('transparency.category.financeiro')} +

+
    + {financialDocs.map((doc) => ( +
  • + +
  • + ))} +
+
+ )} + + {fiscalDocs.length > 0 && ( +
+

+ + + + {t('transparency.category.fiscal')} +

+
    + {fiscalDocs.map((doc) => ( +
  • + +
  • + ))} +
+
+ )} +
+
+ + +
+
+
+
+ +
+
+

{t('transparency.board.title')}

+

{t('transparency.board.subtitle')}

+
+
+ +
    + {BOARD_MEMBERS.map((member, index) => ( +
  • +
    +
    +
    + {member.name.charAt(0)} +
    + {index === 0 && ( +
    + +
    + )} +
    +
    +

    {member.name}

    +

    {member.role}

    +
    +
    +
  • + ))} +
+
+
+ + +
+
+
+
+ +
+
+

{t('transparency.metrics.title')}

+

{t('transparency.metrics.subtitle')}

+
+
+ +
    + {METRICS.map((metric) => ( +
  • +
    +
    +
    + {metric.value} +
    +
    {metric.label}
    +
    +
  • + ))} +
+
+
+ + +
+ +
+
+ +
+
+
+ +
+

{t('transparency.contact.title')}

+

{t('transparency.contact.text')}

+ + + + {CONTACT_EMAIL} + + +
+
+ + + {t('transparency.cnpj')}: {CNPJ} + + {lastUpdated && ( + + + {t('transparency.lastUpdated')}: + + )} +
+
+
+
+
+