From b0a3f96b4dd97f99c21d19f84835a6589138795c Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 22 Apr 2026 19:21:21 +0000 Subject: [PATCH 1/8] Initial plan From a5d4a46087b6f5274007f2ac920b9aade6634115 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 22 Apr 2026 19:29:48 +0000 Subject: [PATCH 2/8] feat: modularize footer social icons and update official links Agent-Logs-Url: https://github.com/podcodar/webapp/sessions/2a9c85a4-5689-4b4a-b49e-54ae9bbf3ea7 Co-authored-by: marco-souza <4452113+marco-souza@users.noreply.github.com> --- e2e/site.spec.ts | 25 +++++++++++++++++++++++++ src/components/Footer.astro | 25 ++----------------------- src/components/SocialLinks.astro | 20 ++++++++++++++++++++ src/data/social-links.ts | 24 ++++++------------------ 4 files changed, 53 insertions(+), 41 deletions(-) create mode 100644 src/components/SocialLinks.astro diff --git a/e2e/site.spec.ts b/e2e/site.spec.ts index 68f6a45..e7266e8 100644 --- a/e2e/site.spec.ts +++ b/e2e/site.spec.ts @@ -31,6 +31,31 @@ test.describe('Homepage', () => { const footer = page.locator('footer'); await expect(footer).toBeInViewport(); }); + + test('shows only official social links in the footer', async ({ page }) => { + await page.goto('/'); + + const footer = page.locator('footer'); + + await expect(footer.getByRole('link', { name: /podcodar no github/i })).toHaveAttribute( + 'href', + 'https://github.com/podcodar/' + ); + await expect(footer.getByRole('link', { name: /podcodar no linkedin/i })).toHaveAttribute( + 'href', + 'https://www.linkedin.com/company/podcodar/' + ); + await expect(footer.getByRole('link', { name: /podcodar no instagram/i })).toHaveAttribute( + 'href', + 'https://www.instagram.com/podcodar/' + ); + await expect(footer.getByRole('link', { name: /podcodar no youtube/i })).toHaveAttribute( + 'href', + 'https://www.youtube.com/@podcodar5070' + ); + + await expect(footer.getByRole('link')).toHaveCount(4); + }); }); // ────────────────────────────────────────────────────────────────────────────── diff --git a/src/components/Footer.astro b/src/components/Footer.astro index 34be428..140dd31 100644 --- a/src/components/Footer.astro +++ b/src/components/Footer.astro @@ -1,7 +1,6 @@ --- -import { Icon } from 'astro-icon/components'; import Logo from '@/components/Logo.astro'; -import { footerSocialIconify, footerSocialLinks } from '@/data/social-links'; +import SocialLinks from '@/components/SocialLinks.astro'; import { getLangFromUrl, useTranslations } from '@/i18n/utils'; const today = new Date(); @@ -14,25 +13,5 @@ const t = useTranslations(lang);

© {today.getFullYear()} PodCodar. {t('footer.copyright')}

-
- { - footerSocialLinks.map((link) => ( - - {link.label} - - )) - } -
+ diff --git a/src/components/SocialLinks.astro b/src/components/SocialLinks.astro new file mode 100644 index 0000000..6555721 --- /dev/null +++ b/src/components/SocialLinks.astro @@ -0,0 +1,20 @@ +--- +import { Icon } from 'astro-icon/components'; +import { socialIconify, socialLinks } from '@/data/social-links'; +--- + +
+ { + socialLinks.map((link) => ( + + {link.label} + + )) + } +
diff --git a/src/data/social-links.ts b/src/data/social-links.ts index 3485ace..d274147 100644 --- a/src/data/social-links.ts +++ b/src/data/social-links.ts @@ -1,9 +1,9 @@ /** * Footer / social presence. Update hrefs if a handle or invite URL changes. */ -export type SocialNetwork = 'github' | 'linkedin' | 'instagram' | 'youtube' | 'x' | 'discord'; +export type SocialNetwork = 'github' | 'linkedin' | 'instagram' | 'youtube'; -export type FooterSocialLink = { +export type SocialLink = { href: string; /** Screen reader label (pt-BR). */ label: string; @@ -11,19 +11,17 @@ export type FooterSocialLink = { }; /** Iconify ids for `astro-icon` + `@iconify-json/simple-icons`. */ -export const footerSocialIconify: Record = { +export const socialIconify: Record = { github: 'simple-icons:github', linkedin: 'simple-icons:linkedin', instagram: 'simple-icons:instagram', youtube: 'simple-icons:youtube', - x: 'simple-icons:x', - discord: 'simple-icons:discord', }; -export const footerSocialLinks: FooterSocialLink[] = [ +export const socialLinks: SocialLink[] = [ { network: 'github', - href: 'https://github.com/podcodar', + href: 'https://github.com/podcodar/', label: 'PodCodar no GitHub', }, { @@ -38,17 +36,7 @@ export const footerSocialLinks: FooterSocialLink[] = [ }, { network: 'youtube', - href: 'https://www.youtube.com/@podcodar', + href: 'https://www.youtube.com/@podcodar5070', label: 'PodCodar no YouTube', }, - { - network: 'x', - href: 'https://x.com/podcodar', - label: 'PodCodar no X', - }, - { - network: 'discord', - href: 'https://discord.com/invite/podcodar', - label: 'PodCodar no Discord', - }, ]; From 0529e96123173561975be9317219ef208b9f6854 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 22 Apr 2026 19:31:24 +0000 Subject: [PATCH 3/8] test: scope footer social link assertions to social icons container Agent-Logs-Url: https://github.com/podcodar/webapp/sessions/2a9c85a4-5689-4b4a-b49e-54ae9bbf3ea7 Co-authored-by: marco-souza <4452113+marco-souza@users.noreply.github.com> --- e2e/site.spec.ts | 14 +++++++------- src/components/SocialLinks.astro | 2 +- src/data/social-links.ts | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/e2e/site.spec.ts b/e2e/site.spec.ts index e7266e8..5b494a5 100644 --- a/e2e/site.spec.ts +++ b/e2e/site.spec.ts @@ -35,26 +35,26 @@ test.describe('Homepage', () => { test('shows only official social links in the footer', async ({ page }) => { await page.goto('/'); - const footer = page.locator('footer'); + const socialLinks = page.locator('footer').getByTestId('social-links'); - await expect(footer.getByRole('link', { name: /podcodar no github/i })).toHaveAttribute( + await expect(socialLinks.getByRole('link', { name: /podcodar no github/i })).toHaveAttribute( 'href', 'https://github.com/podcodar/' ); - await expect(footer.getByRole('link', { name: /podcodar no linkedin/i })).toHaveAttribute( + await expect(socialLinks.getByRole('link', { name: /podcodar no linkedin/i })).toHaveAttribute( 'href', 'https://www.linkedin.com/company/podcodar/' ); - await expect(footer.getByRole('link', { name: /podcodar no instagram/i })).toHaveAttribute( + await expect(socialLinks.getByRole('link', { name: /podcodar no instagram/i })).toHaveAttribute( 'href', 'https://www.instagram.com/podcodar/' ); - await expect(footer.getByRole('link', { name: /podcodar no youtube/i })).toHaveAttribute( + await expect(socialLinks.getByRole('link', { name: /podcodar no youtube/i })).toHaveAttribute( 'href', - 'https://www.youtube.com/@podcodar5070' + 'https://www.youtube.com/@podcodar5070/' ); - await expect(footer.getByRole('link')).toHaveCount(4); + await expect(socialLinks.getByRole('link')).toHaveCount(4); }); }); diff --git a/src/components/SocialLinks.astro b/src/components/SocialLinks.astro index 6555721..f9daad5 100644 --- a/src/components/SocialLinks.astro +++ b/src/components/SocialLinks.astro @@ -3,7 +3,7 @@ import { Icon } from 'astro-icon/components'; import { socialIconify, socialLinks } from '@/data/social-links'; --- -
+
{ socialLinks.map((link) => ( Date: Wed, 22 Apr 2026 16:36:03 -0300 Subject: [PATCH 4/8] fix: social network listing --- src/data/social-links.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/data/social-links.ts b/src/data/social-links.ts index c735c02..2a7d8d4 100644 --- a/src/data/social-links.ts +++ b/src/data/social-links.ts @@ -1,7 +1,9 @@ /** * Footer / social presence. Update hrefs if a handle or invite URL changes. */ -export type SocialNetwork = 'github' | 'linkedin' | 'instagram' | 'youtube'; +const SOCIAL_LINKS = ['github', 'linkedin', 'instagram', 'youtube'] as const; + +export type SocialNetwork = (typeof SOCIAL_LINKS)[number]; export type SocialLink = { href: string; From e804d6a19b41963cf75b2a60f66218f2ad8e2156 Mon Sep 17 00:00:00 2001 From: Marco Souza Date: Wed, 22 Apr 2026 16:49:43 -0300 Subject: [PATCH 5/8] fix: remove one of the metrics --- src/data/transparency.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/data/transparency.ts b/src/data/transparency.ts index 8dc9d99..d607ebf 100644 --- a/src/data/transparency.ts +++ b/src/data/transparency.ts @@ -18,7 +18,6 @@ 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]; From 92ad94ea6409e43902a6c74d61bd41469516666d Mon Sep 17 00:00:00 2001 From: Marco Souza Date: Sat, 25 Apr 2026 15:18:26 -0300 Subject: [PATCH 6/8] feat: add mobile-friendly navigation with drawer menu - Add MobileMenu component with DaisyUI drawer (80% width) - Refactor Header.astro for responsive layout: - Mobile (<1024px): Logo left, Hamburger+CTA right in a flex row - Desktop (1024px+): Original layout preserved (Logo+Nav left, CTAs right) - Drawer contains: logo + nav links (top), empty space (center), CTAs (bottom) - Add i18n keys for menu labels - Pure CSS implementation using DaisyUI drawer Closes #252 --- src/components/Header.astro | 69 ++++++++++++++--------- src/components/MobileMenu.astro | 99 +++++++++++++++++++++++++++++++++ src/i18n/ui.ts | 2 + 3 files changed, 144 insertions(+), 26 deletions(-) create mode 100644 src/components/MobileMenu.astro diff --git a/src/components/Header.astro b/src/components/Header.astro index 370a960..d7c8dbe 100644 --- a/src/components/Header.astro +++ b/src/components/Header.astro @@ -1,6 +1,7 @@ --- import { getRelativeLocaleUrl } from 'astro:i18n'; import Logo from '@/components/Logo.astro'; +import MobileMenu from '@/components/MobileMenu.astro'; import { getLangFromUrl, useTranslations } from '@/i18n/utils'; const lang = getLangFromUrl(Astro.url); @@ -26,33 +27,49 @@ const ctaLinks = { class="mx-auto flex w-full max-w-5xl flex-wrap items-center justify-between gap-3 rounded-lg bg-base-100/80 px-4 py-2 shadow-md backdrop-blur-sm" aria-label="Primary" > -
- - + + -
- - {ctaLinks.secondary.label} - - - {ctaLinks.primary.label} - + + + diff --git a/src/components/MobileMenu.astro b/src/components/MobileMenu.astro new file mode 100644 index 0000000..946c353 --- /dev/null +++ b/src/components/MobileMenu.astro @@ -0,0 +1,99 @@ +--- +import { getRelativeLocaleUrl } from 'astro:i18n'; +import Logo from '@/components/Logo.astro'; +import { getLangFromUrl, useTranslations } from '@/i18n/utils'; + +interface Props { + navigationLinks: Array<{ href: string; label: string }>; + ctaLinks: { + secondary: { href: string; label: string }; + primary: { href: string; label: string }; + }; + pathname: string; +} + +const { navigationLinks, ctaLinks, pathname } = Astro.props; +const lang = getLangFromUrl(Astro.url); +const t = useTranslations(lang); +--- + +
+ + + +
+ +
+ + +
+ +
+ +
+
+ +
+ +
+ + +
+ + + +
+
+
diff --git a/src/i18n/ui.ts b/src/i18n/ui.ts index b04362c..94e91e1 100644 --- a/src/i18n/ui.ts +++ b/src/i18n/ui.ts @@ -9,6 +9,8 @@ export const ui = { 'nav.contributing': 'Como posso ajudar?', 'nav.join_us': 'Faça parte!', 'nav.transparency': 'Transparência', + 'nav.menu': 'Menu', + 'nav.close_menu': 'Fechar menu', 'footer.copyright': 'Todos os direitos reservados.', // Transparency page 'transparency.title': 'Transparência', From 68c6bd811a84f2a3d1f124a91808d73ebfd3b154 Mon Sep 17 00:00:00 2001 From: Marco Souza Date: Sun, 26 Apr 2026 09:05:37 -0300 Subject: [PATCH 7/8] enh: improve UI --- src/components/Header.astro | 10 +++++++--- src/components/MobileMenu.astro | 5 ++--- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/src/components/Header.astro b/src/components/Header.astro index d7c8dbe..5b62143 100644 --- a/src/components/Header.astro +++ b/src/components/Header.astro @@ -29,11 +29,15 @@ const ctaLinks = { >
+
+ +
+
+
- {ctaLinks.primary.label} @@ -42,9 +46,9 @@ const ctaLinks = {