From 4dab785cb980875d11d5496dd5e98dd4564d0d95 Mon Sep 17 00:00:00 2001 From: wauputr4 <103489788+wauputr4@users.noreply.github.com> Date: Sun, 14 Jun 2026 06:33:31 +0700 Subject: [PATCH 1/2] Polish home hero and mobile nav --- public/brand/indopensource-hero.jpg | Bin 0 -> 60347 bytes scripts/sync-blog-posts.mjs | 1 + src/components/HomeHero.astro | 15 ++- src/components/ProjectCard.astro | 29 ++++-- src/components/ProjectsDirectory.astro | 23 +++-- src/components/SiteFooter.astro | 2 +- src/components/SiteHeader.astro | 17 ++-- src/data/blog-posts.json | 1 + src/lib/projects.ts | 7 ++ src/pages/blog.astro | 39 +++++--- src/pages/blog/[slug].astro | 10 ++ src/pages/index.astro | 18 +++- src/pages/projects/[slug].astro | 122 +++++++++++++++++++++++++ src/pages/sitemap-index.xml.ts | 5 +- src/styles/global.css | 70 ++++++++++++++ 15 files changed, 308 insertions(+), 51 deletions(-) create mode 100644 public/brand/indopensource-hero.jpg create mode 100644 src/lib/projects.ts create mode 100644 src/pages/projects/[slug].astro diff --git a/public/brand/indopensource-hero.jpg b/public/brand/indopensource-hero.jpg new file mode 100644 index 0000000000000000000000000000000000000000..31a8f7eea047c6aba9809d23ad60cea12d213464 GIT binary patch literal 60347 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 z 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 -
-
+
+

Roadmap website komunitas

-

- IndopenSource.org +

+ Komunitas Open Source Indonesia

-

+

Rumah terbuka untuk merawat daftar proyek, mendokumentasikan falsafah, menulis pembelajaran, dan menghubungkan kontributor open source Indonesia.

@@ -24,6 +24,5 @@ import { withBase } from '../lib/urls'; Roadmap GitHub
-
diff --git a/src/components/ProjectCard.astro b/src/components/ProjectCard.astro index 39ad4fb..f747535 100644 --- a/src/components/ProjectCard.astro +++ b/src/components/ProjectCard.astro @@ -23,19 +23,28 @@ interface Project { interface Props { project: Project; + compact?: boolean; } -const { project } = Astro.props; +import { withBase } from '../lib/urls'; +import { projectSlug } from '../lib/projects'; + +const { project, compact = false } = Astro.props; const status = project.archived ? 'Archived' : project.language || 'Project'; const updatedDate = project.pushedAt || project.updatedAt; const updatedLabel = updatedDate ? new Intl.DateTimeFormat('id-ID', { dateStyle: 'medium' }).format(new Date(updatedDate)) : ''; const visibleTopics = (project.topics || []).slice(0, 4); +const detailUrl = withBase(`/projects/${projectSlug(project.fullName)}/`); +const repoName = project.fullName.split('/').at(-1) || project.fullName; ---
+
{ project.ownerAvatarUrl && ( @@ -57,12 +67,12 @@ const visibleTopics = (project.topics || []).slice(0, 4); /> ) } -
+
{status} { project.latestRelease ? ( - + Latest {project.latestRelease.tagName} ) : updatedLabel ? ( @@ -70,23 +80,24 @@ const visibleTopics = (project.topics || []).slice(0, 4); ) : null }
-

- {project.fullName} + {project.owner &&

{project.owner}

} +

+ {repoName}

{project.description}

{ visibleTopics.length > 0 && ( -
+
{visibleTopics.map((topic) => #{topic})}
) } -
+
{project.stars.toLocaleString('id-ID')} stars {project.forks.toLocaleString('id-ID')} forks {updatedLabel && Update {updatedLabel}} - {project.homepage && Homepage} + {project.homepage && Homepage}
diff --git a/src/components/ProjectsDirectory.astro b/src/components/ProjectsDirectory.astro index 873b613..eb41ac8 100644 --- a/src/components/ProjectsDirectory.astro +++ b/src/components/ProjectsDirectory.astro @@ -34,11 +34,19 @@ const topics = [...new Set(projects.flatMap((project) => project.topics || []))]
-
-
diff --git a/src/pages/projects/[slug].astro b/src/pages/projects/[slug].astro new file mode 100644 index 0000000..c24dc19 --- /dev/null +++ b/src/pages/projects/[slug].astro @@ -0,0 +1,122 @@ +--- +import BaseLayout from '../../layouts/BaseLayout.astro'; +import BaseButton from '../../components/BaseButton.astro'; +import ProjectCard from '../../components/ProjectCard.astro'; +import projects from '../../data/projects.json'; +import { projectSlug } from '../../lib/projects'; + +export function getStaticPaths() { + return projects.map((project) => ({ + params: { slug: projectSlug(project.fullName) }, + props: { project } + })); +} + +const { project } = Astro.props; +const updatedDate = project.pushedAt || project.updatedAt; +const updatedLabel = updatedDate + ? new Intl.DateTimeFormat('id-ID', { dateStyle: 'medium' }).format(new Date(updatedDate)) + : ''; +const starHistoryUrl = `https://api.star-history.com/svg?repos=${encodeURIComponent(project.fullName)}&type=Date`; +const readmeApiUrl = `https://api.github.com/repos/${project.fullName}/readme`; +const repoName = project.fullName.split('/').at(-1) || project.fullName; +--- + + +
+
+
+

Project detail

+
+ {project.ownerAvatarUrl && {`${project.owner}} +
+ {project.owner &&

{project.owner}

} +

{repoName}

+

{project.description}

+
+
+
+ {project.language && {project.language}} + {project.stars.toLocaleString('id-ID')} stars + {project.forks.toLocaleString('id-ID')} forks + {updatedLabel && Update {updatedLabel}} + {project.latestRelease && Latest {project.latestRelease.tagName}} +
+
+ Buka GitHub + {project.homepage && Homepage} + Kembali +
+
+ +
+
+ +
+
+
+
+
+

README

+

Dokumentasi repo

+
+ GitHub +
+
+

Memuat README dari GitHub...

+
+
+ + +
+
+
+ + diff --git a/src/pages/sitemap-index.xml.ts b/src/pages/sitemap-index.xml.ts index e7b9586..eb915a7 100644 --- a/src/pages/sitemap-index.xml.ts +++ b/src/pages/sitemap-index.xml.ts @@ -1,4 +1,6 @@ import blogPosts from '../data/blog-posts.json'; +import projects from '../data/projects.json'; +import { projectSlug } from '../lib/projects'; const pages = [ '/', @@ -10,12 +12,13 @@ const pages = [ ]; const blogPages = blogPosts.map((post) => `/blog/${post.slug}/`); +const projectPages = projects.map((project) => `/projects/${projectSlug(project.fullName)}/`); export function GET() { const body = ` ${pages - .concat(blogPages) + .concat(blogPages, projectPages) .map((page) => ` ${new URL(page, 'https://indopensource.org').toString()} `) diff --git a/src/styles/global.css b/src/styles/global.css index 65c7716..2eb0639 100644 --- a/src/styles/global.css +++ b/src/styles/global.css @@ -67,6 +67,76 @@ @apply font-bold text-brand hover:text-brand-dark; } + .prose-readme { + @apply max-w-full overflow-hidden leading-7; + } + + .prose-readme h1, + .prose-readme h2, + .prose-readme h3 { + @apply mt-8 mb-3 leading-tight text-ink; + } + + .prose-readme h1 { + @apply text-3xl font-extrabold; + } + + .prose-readme h2 { + @apply border-b border-line pb-2 text-2xl font-extrabold; + } + + .prose-readme h3 { + @apply text-xl font-bold; + } + + .prose-readme p { + @apply my-4; + } + + .prose-readme img, + .prose-readme svg, + .prose-readme video { + @apply max-w-full; + } + + .prose-readme ul, + .prose-readme ol { + @apply my-4 space-y-2 pl-6; + } + + .prose-readme ul { + @apply list-disc; + } + + .prose-readme ol { + @apply list-decimal; + } + + .prose-readme a { + @apply font-bold text-brand hover:text-brand-dark; + } + + .prose-readme code { + @apply rounded bg-canvas px-1.5 py-0.5 text-sm text-ink; + } + + .prose-readme pre { + @apply my-5 max-w-full overflow-x-auto rounded-lg bg-ink p-4 text-sm leading-6 text-paper; + } + + .prose-readme pre code { + @apply bg-transparent p-0 text-paper; + } + + .prose-readme table { + @apply my-5 block max-w-full overflow-x-auto text-sm; + } + + .prose-readme th, + .prose-readme td { + @apply border border-line px-3 py-2; + } + .motion-line { fill: none; stroke: currentColor; From 1ffedbd76d4b0599332b01776eb00a5778f0a911 Mon Sep 17 00:00:00 2001 From: wauputr4 <103489788+wauputr4@users.noreply.github.com> Date: Sun, 14 Jun 2026 07:46:15 +0700 Subject: [PATCH 2/2] Configure GitHub Pages custom domain --- .github/workflows/deploy-pages.yml | 2 +- .github/workflows/sync-content.yml | 2 +- README.md | 6 +++--- public/CNAME | 1 + 4 files changed, 6 insertions(+), 5 deletions(-) create mode 100644 public/CNAME diff --git a/.github/workflows/deploy-pages.yml b/.github/workflows/deploy-pages.yml index 519aaca..1956763 100644 --- a/.github/workflows/deploy-pages.yml +++ b/.github/workflows/deploy-pages.yml @@ -39,7 +39,7 @@ jobs: - name: Build site env: - ASTRO_BASE: /indopensource.org + ASTRO_BASE: / run: npm run build - name: Upload artifact diff --git a/.github/workflows/sync-content.yml b/.github/workflows/sync-content.yml index bf945f2..1f3539f 100644 --- a/.github/workflows/sync-content.yml +++ b/.github/workflows/sync-content.yml @@ -85,7 +85,7 @@ jobs: - name: Validate build env: - ASTRO_BASE: /indopensource.org + ASTRO_BASE: / run: npm run build - name: Commit synced data diff --git a/README.md b/README.md index 54562a2..21bb92c 100644 --- a/README.md +++ b/README.md @@ -59,8 +59,7 @@ MVP awal berfokus pada homepage sebagai pintu masuk roadmap IndopenSource: - Deployment memakai GitHub Pages bawaan repo lewat GitHub Actions. Rilis pre-release bisa dibuat dari tag `v0.1.0-mvp` setelah workflow Pages hijau. -URL default sebelum custom domain aktif adalah -`https://indopensource.github.io/indopensource.org/`. +URL produksi setelah custom domain aktif adalah `https://indopensource.org/`. ## Deployment @@ -69,7 +68,8 @@ GitHub Pages memakai workflow `.github/workflows/deploy-pages.yml`. - Build command: `npm run build` - Output directory: `dist` - Source: GitHub Actions -- Default Pages base path: `/indopensource.org` +- Custom domain: `indopensource.org` +- Pages base path: `/` Aktifkan Pages di repository settings dengan source `GitHub Actions`, lalu push ke `main` atau jalankan workflow `Deploy to GitHub Pages` secara manual. diff --git a/public/CNAME b/public/CNAME new file mode 100644 index 0000000..5ae4734 --- /dev/null +++ b/public/CNAME @@ -0,0 +1 @@ +indopensource.org