Skip to content

Commit 749564a

Browse files
committed
enh: production readiness improvements
1 parent af0ad39 commit 749564a

12 files changed

Lines changed: 59 additions & 16 deletions

File tree

public/_headers

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
# Security headers served by Cloudflare Pages on all routes
2+
# See: https://developers.cloudflare.com/pages/configuration/headers/
3+
4+
/*
5+
Content-Security-Policy: default-src 'self'; script-src 'self' 'unsafe-inline' https://static.cloudflareinsights.com; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com; img-src 'self' data: blob:; connect-src 'self' https://static.cloudflareinsights.com; frame-ancestors 'none'; base-uri 'self'; form-action 'self'
6+
X-Frame-Options: DENY
7+
X-Content-Type-Options: nosniff
8+
Referrer-Policy: strict-origin-when-cross-origin
9+
Strict-Transport-Security: max-age=31536000; includeSubDomains; preload

src/assets/og-image.png

178 KB
Loading

src/components/metadata/PageMetadata.astro

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
* Global charset, viewport, favicon, RSS, etc. stay in BaseHead.
55
*/
66
import type { ImageMetadata } from 'astro';
7-
import FallbackImage from '@/assets/blog-placeholder-1.jpg';
7+
import FallbackImage from '@/assets/og-image.png';
88
99
interface Props {
1010
title: string;

src/data/og-default.ts

Lines changed: 0 additions & 7 deletions
This file was deleted.

src/i18n/ui.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,11 @@ export const ui = {
105105
'footer.copyright': 'Todos os direitos reservados.',
106106
'layout.skipToContent': 'Pular para o conteúdo',
107107

108+
// ── 404 page ───────────────────────────────────────────────────────────────
109+
'404.title': 'Ops! Essa página não existe.',
110+
'404.message':
111+
'Parece que você seguiu um link quebrado ou digitou um endereço errado. Volte ao início e continue navegando.',
112+
108113
// ── Home page ─────────────────────────────────────────────────────────────
109114
'home.hero.eyebrow': 'PodCodar',
110115
'home.hero.headline': 'Educação em tecnologia, feita em comunidade',

src/pages/404.astro

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
---
2+
import Logo from '@/components/Logo.astro';
3+
import { LAYOUT_MAIN_FULL_WIDTH } from '@/consts';
4+
import { useTranslations } from '@/i18n/utils';
5+
import Layout from '@/layouts/Layout.astro';
6+
7+
const t = useTranslations();
8+
9+
const title = `404 — ${t('nav.home')}`;
10+
const description = t('404.message');
11+
---
12+
13+
<Layout {title} {description} mainClass={LAYOUT_MAIN_FULL_WIDTH}>
14+
<section class="flex flex-1 flex-col items-center justify-center py-24 text-center">
15+
<!-- PodCodar logo mark (larger, faded for visual interest) -->
16+
<div class="mb-8 opacity-20" aria-hidden="true">
17+
<Logo size="lg" showTitle={false} />
18+
</div>
19+
20+
<!-- 404 error code -->
21+
<p class="mb-4 text-8xl font-bold text-primary">404</p>
22+
23+
<!-- Message -->
24+
<h1 class="mb-4 text-3xl font-bold">{t('404.title')}</h1>
25+
<p class="mb-8 max-w-md text-base-content/70">{t('404.message')}</p>
26+
27+
<!-- Navigation links -->
28+
<nav class="flex flex-wrap justify-center gap-4" aria-label="404 navigation">
29+
<a href="/" class="btn btn-primary no-underline">{t('nav.home')}</a>
30+
<a href="/blog/" class="btn btn-outline btn-primary no-underline">{t('nav.blog')}</a>
31+
<a href="/join-us/" class="btn btn-outline btn-primary no-underline">{t('nav.join_us')}</a>
32+
</nav>
33+
</section>
34+
</Layout>

src/pages/about.astro

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ import {
1313
mission,
1414
projects,
1515
} from '@/data/marketing';
16-
import ogDefaultImage from '@/data/og-default';
16+
1717
import { useTranslations } from '@/i18n/utils';
1818
import Layout from '@/layouts/Layout.astro';
1919
@@ -22,7 +22,7 @@ const title = `${t('nav.about')} — ${SITE_TITLE}`;
2222
const description = t('about.hero.subtitle');
2323
---
2424

25-
<Layout {title} {description} image={ogDefaultImage} mainClass={LAYOUT_MAIN_FULL_WIDTH}>
25+
<Layout {title} {description} mainClass={LAYOUT_MAIN_FULL_WIDTH}>
2626
<!-- Hero Section -->
2727
<HeroSection
2828
eyebrow={t('about.hero.eyebrow')}

src/pages/contact.astro

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import HeroSection from '@/components/ui/HeroSection.astro';
55
import InquiryCard from '@/components/ui/InquiryCard.astro';
66
import SectionHeader from '@/components/ui/SectionHeader.astro';
77
import { SITE_TITLE } from '@/consts';
8+
89
import { socialLinks } from '@/data/social-links';
910
import { CONTACT_EMAIL } from '@/data/transparency';
1011
import { useTranslations } from '@/i18n/utils';

src/pages/contributing.astro

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import DonationWidget from '@/components/donations/DonationWidget';
44
import HeroSection from '@/components/ui/HeroSection.astro';
55
import SectionHeader from '@/components/ui/SectionHeader.astro';
66
import { LAYOUT_MAIN_FULL_WIDTH, SITE_TITLE } from '@/consts';
7-
import ogDefaultImage from '@/data/og-default';
7+
88
import { useTranslations } from '@/i18n/utils';
99
import Layout from '@/layouts/Layout.astro';
1010
@@ -13,7 +13,7 @@ const title = `${t('nav.contributing')} — ${SITE_TITLE}`;
1313
const description = t('contributing.hero.subtitle');
1414
---
1515

16-
<Layout {title} {description} image={ogDefaultImage} mainClass={LAYOUT_MAIN_FULL_WIDTH}>
16+
<Layout {title} {description} mainClass={LAYOUT_MAIN_FULL_WIDTH}>
1717
<!-- Hero Section -->
1818
<HeroSection
1919
eyebrow={t('contributing.hero.eyebrow')}

src/pages/index.astro

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import Section from '@/components/marketing/Section.astro';
77
import TestimonialGrid from '@/components/marketing/TestimonialGrid.astro';
88
import { LAYOUT_MAIN_FULL_WIDTH, SITE_DESCRIPTION, SITE_TITLE } from '@/consts';
99
import { aboutCommunity, activities, howToHelp, mission, testimonials } from '@/data/marketing';
10-
import ogDefaultImage from '@/data/og-default';
10+
1111
import { useTranslations } from '@/i18n/utils';
1212
import Layout from '@/layouts/Layout.astro';
1313
@@ -22,7 +22,7 @@ const heroContent = {
2222
} as const;
2323
---
2424

25-
<Layout title={SITE_TITLE} description={SITE_DESCRIPTION} image={ogDefaultImage} mainClass={LAYOUT_MAIN_FULL_WIDTH}>
25+
<Layout title={SITE_TITLE} description={SITE_DESCRIPTION} mainClass={LAYOUT_MAIN_FULL_WIDTH}>
2626
<Hero content={heroContent} />
2727
<Section id="mission" title={t('home.mission.title')} variant="muted">
2828
<div class="max-w-3xl space-y-4">

0 commit comments

Comments
 (0)