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
133 changes: 133 additions & 0 deletions app/changelog/page.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,133 @@
import { GitHubIcon } from '@/components/icons'
import { Badge, Heading, Text } from "@/components/ui";
import { CHANGELOG_ENTRIES } from "@/lib/changelog-data";
import { Metadata } from "next";
import { Header } from "@/components/header";
import { FooterSmall } from "@/components/footer-small";
import { getFullUrl } from '@/lib/constants';


export const metadata: Metadata = {
title: "Changelog | GSoC Orgs",
description: "Stay up to date with the latest features, improvements, and fixes for GSoC Orgs.",
alternates: {
canonical: getFullUrl("/changelog"),
},
};
Comment thread
coderabbitai[bot] marked this conversation as resolved.

export default function ChangelogPage() {

const sortedEntries = [...CHANGELOG_ENTRIES].sort((a, b) => b.timeStamp - a.timeStamp);

// Helper to parse [Text](URL) into Teal Links
const formatChangelogText = (text: string) => {
const linkRegex = /\[([^\]]+)\]\(([^)]+)\)/g;
const parts = [];
let lastIndex = 0;
let match;

while ((match = linkRegex.exec(text)) !== null) {
if (match.index > lastIndex) {
parts.push(text.substring(lastIndex, match.index));
}
parts.push(
<a
key={match.index}
href={match[2]}
target="_blank"
rel="noopener noreferrer"
className="hover:underline text-chart-2 font-medium transition-colors"
>
Comment on lines +34 to +40
Copy link
Copy Markdown

@coderabbitai coderabbitai Bot Jan 30, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

Replace hardcoded teal colors with existing design tokens.
text-teal-600 / dark:text-teal-400 introduce hardcoded colors that can drift from the theme. Please use existing tokenized classes (e.g., text-accent-foreground) so dark/light modes stay consistent.

🎨 Example tokenized swap
- className="text-teal-600 dark:text-teal-400 hover:underline font-medium transition-colors"
+ className="text-accent-foreground hover:underline font-medium transition-colors"
- className="flex items-center gap-1.5 text-xs text-teal-600 dark:text-teal-400 hover:underline transition-colors group"
+ className="flex items-center gap-1.5 text-xs text-accent-foreground hover:underline transition-colors group"
- <GitHubIcon className="w-3 h-3 text-muted-foreground group-hover:text-teal-600" />
+ <GitHubIcon className="w-3 h-3 text-muted-foreground group-hover:text-accent-foreground" />
- className="flex items-center gap-2 text-sm text-teal-600 dark:text-teal-400 font-medium"
+ className="flex items-center gap-2 text-sm text-accent-foreground font-medium"
As per coding guidelines: Use ONLY existing color tokens and design variables, do NOT hardcode colors, do NOT introduce new colors without explicit instruction

Also applies to: 80-83, 121-122

🤖 Prompt for AI Agents
In `@app/changelog/page.tsx` around lines 29 - 35, The anchor elements using
hardcoded color utilities (e.g., the <a key={match.index} href={match[2]} ...
className="text-teal-600 dark:text-teal-400 ...">) must be changed to use
existing design tokens instead of literal teal classes; replace "text-teal-600
dark:text-teal-400" with the tokenized class (for example
"text-accent-foreground" or the appropriate existing token used elsewhere) and
keep the other utilities (hover:underline, font-medium, transition-colors)
intact; apply the same replacement for the other anchor/className occurrences
flagged (the similar className strings around the later anchor usages).

✅ Addressed in commit 4e68fe2

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@Alqamaq use the predefined teal color.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Seems like the humans are having a chat. I'll hop back into my burrow for now. If you need me again, just tag @coderabbitai in a new comment, and I'll come hopping out!

Comment thread
coderabbitai[bot] marked this conversation as resolved.
{match[1]}
</a>
);
lastIndex = linkRegex.lastIndex;
}

if (lastIndex < text.length) {
parts.push(text.substring(lastIndex));
}

return parts.length > 0 ? parts : text;
};

return (
<>
<Header />
<div className="max-w-5xl mx-auto py-12 px-6">

<header className="mb-16 mt-[60px] border-b border-border pb-8">
<Heading className="text-3xl md:text-5xl tracking-tighter font-regular max-w-xl">Changelog</Heading>
<Text className="text-base leading-relaxed text-muted-foreground max-w-xl lg:max-w-lg mt-4">The latest updates and improvements.</Text>
</header>

<div className="space-y-20 relative">
{/* The Timeline Line */}
<div className="absolute left-[11px] md:left-[155px] top-2 bottom-0 w-px bg-border hidden sm:block" />

{sortedEntries.map((entry) => (
<article key={entry.timeStamp} className="relative grid grid-cols-1 md:grid-cols-[140px_1fr] gap-8 md:gap-12 pb-16 border-b border-border last:border-0">

{/* Left Column: Date & Version */}
<div className="md:sticky md:top-24 h-fit">
<div className="flex flex-row md:flex-col items-center md:items-end gap-3 md:gap-1">
<time className="text-sm font-semibold text-foreground whitespace-nowrap">{entry.date}</time>
<Badge variant="secondary" className="text-[10px] font-bold bg-muted text-muted-foreground border-border uppercase">
{entry.version}
</Badge>
</div>
<div className="hidden md:flex flex-col items-end gap-2 mt-4">
{entry.prLinks.map((pr, i) => (
<a
key={i}
href={pr.link}
target="_blank"
rel='noopener noreferrer'
className="flex items-center gap-1.5 text-xs text-chart-2 hover:underline transition-colors group"
>
<GitHubIcon className="w-3 h-3" />
<span>{pr.number}</span>
</a>
))}
</div>
</div>

{/* Right Column: Content */}
<div className="space-y-6">
<div className="space-y-2">
<Heading className="text-2xl md:text-3xl font-medium">{entry.title}</Heading>
<Text className="text-muted-foreground leading-relaxed">{entry.summary}</Text>
</div>

<ul className="space-y-3">
{entry.changes.map((change, i) => (
<li key={i} className="flex items-start gap-3">
<div className="mt-2 w-1.5 h-1.5 rounded-full shrink-0 bg-foreground" />
<span className="text-[15px] text-foreground/90">{formatChangelogText(change.text)}</span>
</li>
))}
</ul>

{/* Mobile PR Link */}
<div className="flex md:hidden flex-wrap gap-x-4 gap-y-2 pt-4 border-t border-border">
{entry.prLinks.map((pr, i) => (
<a
key={i}
href={pr.link}
className="flex items-center gap-2 text-sm text-chart-2 font-medium"
>
<GitHubIcon className="w-4 h-4" />
{pr.number}
</a>
))}
</div>
</div>
</article>
))}
</div>

</div>
<FooterSmall />
</>
);
}
4 changes: 4 additions & 0 deletions components/footer-common.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -134,6 +134,10 @@ export const FOOTER_NAVIGATION_ITEMS = [
title: "Terms and Conditions",
href: "/terms-and-conditions",
},
{
title: "Changelog",
href: "/changelog",
},
// {
// title: "Blog",
// href: "/blog",
Expand Down
51 changes: 51 additions & 0 deletions lib/changelog-data.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
export interface ChangelogEntry {
date: string,
timeStamp: number,
version: string,
title: string,
summary: string,
prLinks: { link: string, number: string }[],
changes: {
type: 'feat' | 'fix' | 'docs' | 'style' | 'refactor' | 'perf' | 'test' | 'chore',
text: string
}[],

}
export const CHANGELOG_ENTRIES: ChangelogEntry[] = [
{
date: "Jan 29, 2026",
timeStamp: 20260129,
version: "v1.1.0",
title: "Dark Mode & UI Stabilization",
summary: "Refined the dashboard's visual hierarchy by introducing a refined color system and fixing high-contrast issues in dark mode.",
prLinks: [
{ link: "https://github.com/...", number: "#1" },
{ link: "https://github.com/...", number: "#2" },
{ link: "https://github.com/...", number: "#3" },
],

changes: [
{ type: 'fix', text: 'Sidebar background now correctly renders black in dark mode' },
{ type: 'feat', text: 'Added new [filtering system](https://github.com/...) for better organization discovery.' },
{ type: 'refactor', text: 'Standardized border variables across all card components' }
]
},
{
date: "Feb 15, 2026",
timeStamp: 20260215,
version: "v1.1.0",
title: "Dark Mode & UI Stabilization",
summary: "Refined the dashboard's visual hierarchy by introducing a refined color system and fixing high-contrast issues in dark mode.",
prLinks: [
{ link: "https://github.com/...", number: "#3" },
{ link: "https://github.com/...", number: "#4" },
{ link: "https://github.com/...", number: "#5" },
{ link: "https://github.com/...", number: "#6" },
],
changes: [
{ type: 'fix', text: 'Sidebar background now correctly renders black in dark mode' },
{ type: 'feat', text: ' Added new [filtering system](https://github.com/...) for better organization discovery.' },
{ type: 'refactor', text: 'Standardized border variables across all card components' }
]
}
];
Loading