Skip to content
Open
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
24 changes: 20 additions & 4 deletions src/pages/projects.astro
Original file line number Diff line number Diff line change
@@ -1,18 +1,34 @@
---
import { getCollection } from 'astro:content';
import Base from '../layouts/Base.astro';
import { Icon } from 'astro-icon/components';
import Card from '../components/Card.astro';

const projects = await getCollection('projects');
projects.sort((a, b) => b.data.year - a.data.year);
---

<Base title="Projects · Carleton Computer Science Showcase">
<h1 class="text-2xl font-bold tracking-tight">Projects</h1>
<p class="text-muted mt-1">
Projects built by Carleton Computer Science students.
</p>
<div
class="flex flex-col gap-4 sm:flex-row sm:items-start sm:justify-between"
>
<div>
<h1 class="text-2xl font-bold tracking-tight">Projects</h1>
<p class="text-muted mt-1">
Projects built by Carleton Computer Science students.
</p>
</div>

<a

@AJaccP AJaccP Jul 25, 2026

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Button looks good overall, but could you pull it out into a shared component at src/components/CTAButton.Astro that takes label and href as props. This helps prevent the two buttons' definitions from drifting (which they slightly have already)

  • /projects has duration-200, /webring doesn't — so the hover fade runs at 200ms on one page and Tailwind's default 150ms on the other.
  • One uses gap-1, the other gap-x-1.

They're minor differences and not actually noticeable right now, but it would still be nice to ensure that both stay consistent.

The frontmatter for the component would be something like:

import { Icon } from 'astro-icon/components';

interface Props {
  label: string;
  href: string;
}

const { label, href } = Astro.props;

The actual would be mostly the same, I'd say use what's on /projects now (the one with duration-200 and gap-1) and swap the hardcoded urls + labels for props ( {href} and {label} )

Then each page can just use the component in place of the , for example:

<CTAButton
  label="Add a project"
  href="https://github.com/CarletonComputerScienceSociety/showcase#adding-a-project"
/>

One more minor fix while you're making these changes:

  • opacity-100 as an explicit class can be removed since that's the default value

href="https://github.com/CarletonComputerScienceSociety/showcase#adding-a-project"
target="_blank"
rel="noopener"
class="bg-accent text-accent-contrast inline-flex w-full items-center justify-center gap-1 rounded-md px-4 py-2 text-center text-sm font-medium opacity-100 transition-opacity duration-200 hover:opacity-90 sm:w-auto sm:shrink-0"
>
<Icon name="lucide:plus" aria-hidden="true" />
<span> Add a project </span>
</a>
</div>
{
/*
FILTER BAR insertion point — "domain + year filter" ticket.
Expand Down
25 changes: 21 additions & 4 deletions src/pages/webring.astro
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
---
import { getCollection } from 'astro:content';
import Base from '../layouts/Base.astro';
import { Icon } from 'astro-icon/components';
import RingGraph from '../components/RingGraph.astro';

const members = await getCollection('webring');
Expand All @@ -11,11 +12,27 @@ const displayUrl = (url: string) =>
---

<Base title="Webring · Carleton Computer Science Showcase">
<h1 class="text-2xl font-bold tracking-tight">Webring</h1>
<p class="text-muted mt-1">
Personal sites of Carleton Computer Science students, linked into a ring.
</p>
<div
class="flex flex-col gap-4 sm:flex-row sm:items-start sm:justify-between"
>
<div>
<h1 class="text-2xl font-bold tracking-tight">Webring</h1>
<p class="text-muted mt-1">
Personal sites of Carleton Computer Science students, linked into a
ring.
</p>
</div>

<a
href="https://github.com/CarletonComputerScienceSociety/showcase#joining-the-webring"
target="_blank"
rel="noopener"
class="bg-accent text-accent-contrast inline-flex w-full items-center justify-center gap-x-1 rounded-md px-4 py-2 text-center text-sm font-medium opacity-100 transition-opacity hover:opacity-90 sm:w-auto sm:shrink-0"
>
<Icon name="lucide:plus" aria-hidden="true" />
<span> Join the webring </span>
</a>
</div>
{
/*
Two-column layout: directory table + graph panel. Stacks on mobile (table
Expand Down
Loading