Skip to content

Commit d468996

Browse files
ashleywolfCopilot
andcommitted
Add Ships page for maintainer-relevant GitHub feature releases
New /ships page showing curated GitHub changelog entries relevant to maintainers. Data is managed via content/ships/ships.json. Includes 9 initial ships (Issues, Pull Requests, Copilot, Repository Management). Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
1 parent 49cc02c commit d468996

9 files changed

Lines changed: 320 additions & 0 deletions

File tree

common/routes.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@ export const Y2024 = makePath('/2024')
3030

3131
export const NEWS = makePath("/news")
3232

33+
export const SHIPS = makePath('/ships')
34+
3335
export const PARTNER_PACK = makePath('/partner-pack')
3436

3537
export const SECURITY_CHALLENGE = makePath('/security-challenge')

components/header/Header.jsx

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import IconCalendar from '../../public/icons/calendar'
1212
import IconBooks from '../../public/icons/books'
1313
import BoxGift from '../../public/icons/box-gift'
1414
import IconShield from '../../public/icons/shield'
15+
import Rocket from '../../public/icons/rocket'
1516
import { BREAKPOINTS } from '../../common/constants'
1617

1718
const Header = () => {
@@ -80,6 +81,20 @@ const Header = () => {
8081
</span>
8182
</Link>
8283
</li>
84+
<li>
85+
<Link
86+
href={ROUTES.SHIPS.getPath(year)}
87+
aria-label={getLiteral('navigation:ships')}
88+
className={clsx('header__link', {
89+
['is-active']: pathname === ROUTES.SHIPS.getPath(year),
90+
})}
91+
>
92+
<Rocket />
93+
<span className="header__link-text">
94+
{getLiteral('navigation:ships')}
95+
</span>
96+
</Link>
97+
</li>
8398
<li>
8499
<Link
85100
href={ROUTES.SCHEDULE.getPath(year)}

components/ships/Ships.jsx

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
import Chip from '../chip/Chip'
2+
3+
const formatDate = (dateString) => {
4+
const date = new Date(dateString + 'T00:00:00')
5+
return date.toLocaleDateString('en-US', {
6+
month: 'short',
7+
day: 'numeric',
8+
year: 'numeric',
9+
})
10+
}
11+
12+
const Ships = ({ ships }) => {
13+
if (!ships || ships.length === 0) {
14+
return (
15+
<section className="ships">
16+
<p className="ships__empty">
17+
No ships listed yet. Check back soon!
18+
</p>
19+
</section>
20+
)
21+
}
22+
23+
const sorted = [...ships].sort(
24+
(a, b) => new Date(b.date) - new Date(a.date)
25+
)
26+
27+
return (
28+
<section className="ships">
29+
<div className="ships__grid">
30+
{sorted.map((ship) => (
31+
<article key={ship.url} className="ships__card">
32+
<a
33+
className="ships__link"
34+
href={ship.url}
35+
target="_blank"
36+
rel="noreferrer"
37+
>
38+
<p className="ships__date">{formatDate(ship.date)}</p>
39+
<h3 className="ships__title">
40+
{ship.title}
41+
<svg
42+
className="ships__external-icon"
43+
xmlns="http://www.w3.org/2000/svg"
44+
viewBox="0 0 16 16"
45+
width="14"
46+
height="14"
47+
fill="currentColor"
48+
>
49+
<path d="M3.75 2h3.5a.75.75 0 0 1 0 1.5H4.56l7.22 7.22a.75.75 0 1 1-1.06 1.06L3.5 4.56v2.69a.75.75 0 0 1-1.5 0v-3.5A1.75 1.75 0 0 1 3.75 2z" />
50+
<path d="M13 7.75a.75.75 0 0 1 1.5 0v4.5A1.75 1.75 0 0 1 12.75 14h-9A1.75 1.75 0 0 1 2 12.25v-9C2 2.784 2.784 2 3.75 2h4.5a.75.75 0 0 1 0 1.5h-4.5a.25.25 0 0 0-.25.25v9c0 .138.112.25.25.25h9a.25.25 0 0 0 .25-.25v-4.5z" />
51+
</svg>
52+
</h3>
53+
<p className="ships__description">{ship.description}</p>
54+
<div className="ships__chips">
55+
<Chip label={ship.category} />
56+
</div>
57+
</a>
58+
</article>
59+
))}
60+
</div>
61+
</section>
62+
)
63+
}
64+
65+
export default Ships

components/ships/ships.scss

Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
.ships {
2+
padding: spacing(7) spacing(2);
3+
padding-bottom: spacing(4);
4+
max-width: 1440px;
5+
margin: 0 auto;
6+
7+
@media (min-width: $lg) {
8+
padding-left: spacing(4);
9+
padding-right: spacing(4);
10+
}
11+
12+
&__empty {
13+
text-align: center;
14+
padding: spacing(8) spacing(2);
15+
@extend %body-1;
16+
color: $white-50;
17+
}
18+
19+
&__grid {
20+
display: grid;
21+
grid-template-columns: 1fr;
22+
gap: spacing(3);
23+
24+
@media (min-width: $md) {
25+
grid-template-columns: repeat(2, 1fr);
26+
}
27+
28+
@media (min-width: $lg) {
29+
grid-template-columns: repeat(3, 1fr);
30+
}
31+
}
32+
33+
&__card {
34+
background: $white-20;
35+
border-radius: 12px;
36+
transition: background $simple-fade;
37+
38+
@extend %background-filter;
39+
40+
&:hover {
41+
background: $white-40;
42+
}
43+
}
44+
45+
&__link {
46+
display: block;
47+
padding: spacing(3);
48+
text-decoration: none;
49+
color: inherit;
50+
}
51+
52+
&__date {
53+
margin-bottom: spacing(1);
54+
@extend %subtitle-2;
55+
color: $white-50;
56+
}
57+
58+
&__title {
59+
margin-bottom: spacing(1.5);
60+
@extend %header-5;
61+
display: flex;
62+
align-items: baseline;
63+
gap: spacing(1);
64+
}
65+
66+
&__external-icon {
67+
flex-shrink: 0;
68+
opacity: 0.6;
69+
}
70+
71+
&__description {
72+
margin-bottom: spacing(2);
73+
@extend %body-1;
74+
color: $white-80;
75+
font-size: 0.9375rem;
76+
77+
@media (min-width: $md) {
78+
font-size: 1rem;
79+
}
80+
}
81+
82+
&__chips {
83+
display: flex;
84+
flex-wrap: wrap;
85+
gap: spacing(1);
86+
}
87+
}

content/commons.json

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,11 +67,16 @@
6767
"navigation:library": "Library",
6868
"navigation:partner-pack": "Partner Pack",
6969
"navigation:security-challenge": "Challenge",
70+
"navigation:ships": "Ships",
7071

7172
"page:title": "Maintainer Month",
7273
"page:title-mobile": "MM",
7374
"page:date": "May 2026",
7475

76+
"ships:title": "Ships for Maintainers",
77+
"ships:description": "GitHub features and updates built for open source maintainers.",
78+
"ships:empty": "No ships listed yet. Check back soon!",
79+
7580
"schedule:title": "Schedule",
7681
"schedule:description": "List of all events organized during this year's Maintainer Month",
7782
"schedule:add-event": "Add your activity",

content/ships/ships.json

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
{
2+
"ships": [
3+
{
4+
"url": "https://github.blog/changelog/2026-03-05-hierarchy-view-improvements-and-file-uploads-in-issue-forms/",
5+
"title": "Hierarchy view improvements and file uploads in issue forms",
6+
"description": "Issue forms now support file uploads, and the hierarchy view for sub-issues has been improved with better navigation and visibility.",
7+
"date": "2026-03-05",
8+
"category": "Issues"
9+
},
10+
{
11+
"url": "https://github.blog/changelog/2026-02-26-improved-search-on-the-issues-dashboard",
12+
"title": "Improved search on the issues dashboard",
13+
"description": "The issues dashboard search now supports more filters and delivers faster, more relevant results.",
14+
"date": "2026-02-26",
15+
"category": "Issues"
16+
},
17+
{
18+
"url": "https://github.blog/changelog/2026-02-25-github-copilot-cli-is-now-generally-available",
19+
"title": "GitHub Copilot CLI is now generally available",
20+
"description": "Copilot CLI brings AI-powered coding assistance directly to your terminal with agentic capabilities and MCP extensibility.",
21+
"date": "2026-02-25",
22+
"category": "Copilot"
23+
},
24+
{
25+
"url": "https://github.blog/changelog/2026-02-19-access-all-pull-request-comments-without-leaving-the-new-files-changed-page",
26+
"title": "Access all pull request comments without leaving the Files Changed page",
27+
"description": "View and navigate all PR comments inline on the Files Changed page without switching tabs.",
28+
"date": "2026-02-19",
29+
"category": "Pull Requests"
30+
},
31+
{
32+
"url": "https://github.blog/changelog/2026-02-13-new-repository-settings-for-configuring-pull-request-access/",
33+
"title": "New repository settings for configuring pull request access",
34+
"description": "Maintainers can now configure who has access to create and manage pull requests directly from repository settings.",
35+
"date": "2026-02-13",
36+
"category": "Repository Management"
37+
},
38+
{
39+
"url": "https://github.blog/changelog/2026-02-13-github-agentic-workflows-are-now-in-technical-preview",
40+
"title": "GitHub agentic workflows are now in technical preview",
41+
"description": "Agentic workflows let AI agents autonomously plan, execute, and iterate on tasks across your repositories.",
42+
"date": "2026-02-13",
43+
"category": "Copilot"
44+
},
45+
{
46+
"url": "https://github.blog/changelog/2026-02-05-improved-pull-request-files-changed-february-5-updates",
47+
"title": "Improved pull request Files Changed page",
48+
"description": "The Files Changed experience has been redesigned with better performance, navigation, and review tools.",
49+
"date": "2026-02-05",
50+
"category": "Pull Requests"
51+
},
52+
{
53+
"url": "https://github.blog/changelog/2026-02-05-pinned-comments-on-github-issues",
54+
"title": "Pinned comments on GitHub Issues",
55+
"description": "Maintainers can now pin important comments to the top of an issue for better visibility and context.",
56+
"date": "2026-02-05",
57+
"category": "Issues"
58+
},
59+
{
60+
"url": "https://github.blog/changelog/2026-01-22-faster-loading-for-github-issues",
61+
"title": "Faster loading for GitHub Issues",
62+
"description": "Issues now load significantly faster with improved rendering and data fetching.",
63+
"date": "2026-01-22",
64+
"category": "Issues"
65+
}
66+
]
67+
}

pages/ships.js

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
import { useEffect } from 'react'
2+
import Head from 'next/head'
3+
4+
import { getLiteral } from '../common/i18n'
5+
import Ships from '../components/ships/Ships'
6+
import shipsJSON from '../content/ships/ships.json'
7+
8+
import { useBackground } from '../contexts/BackgroundContext'
9+
10+
const { ships } = shipsJSON
11+
12+
export default function ShipsPage() {
13+
const { setAnimationStep } = useBackground()
14+
15+
useEffect(() => {
16+
setAnimationStep(6)
17+
}, [setAnimationStep])
18+
19+
return (
20+
<div>
21+
<Head>
22+
<title>
23+
{getLiteral('ships:title')} - {getLiteral('meta:title')}
24+
</title>
25+
<meta name="description" content={getLiteral('ships:description')} />
26+
27+
{/* <!-- Facebook Meta Tags --> */}
28+
<meta property="og:title" content={getLiteral('ships:title')} />
29+
<meta
30+
property="og:description"
31+
content={getLiteral('ships:description')}
32+
/>
33+
<meta
34+
property="og:image"
35+
content="https://maintainermonth.github.com/images/og/generic.png"
36+
/>
37+
38+
{/* <!-- Twitter Meta Tags --> */}
39+
<meta name="twitter:card" content="summary_large_image" />
40+
<meta name="twitter:title" content={getLiteral('ships:title')} />
41+
<meta
42+
name="twitter:description"
43+
content={getLiteral('ships:description')}
44+
/>
45+
<meta
46+
name="twitter:image"
47+
content="https://maintainermonth.github.com/images/og/generic.png"
48+
/>
49+
</Head>
50+
51+
<Ships ships={ships} />
52+
</div>
53+
)
54+
}

public/icons/rocket.js

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
import React from 'react'
2+
3+
const Rocket = (props) => (
4+
<svg
5+
xmlns="http://www.w3.org/2000/svg"
6+
viewBox="0 0 24 24"
7+
width="24"
8+
height="24"
9+
fill="none"
10+
stroke="currentColor"
11+
strokeWidth="2"
12+
strokeLinecap="round"
13+
strokeLinejoin="round"
14+
{...props}
15+
>
16+
<path d="M4.5 16.5c-1.5 1.26-2 5-2 5s3.74-.5 5-2c.71-.84.7-2.13-.09-2.91a2.18 2.18 0 0 0-2.91-.09z" />
17+
<path d="M12 15l-3-3a22 22 0 0 1 2-3.95A12.88 12.88 0 0 1 22 2c0 2.72-.78 7.5-6 11a22.35 22.35 0 0 1-4 2z" />
18+
<path d="M9 12H4s.55-3.03 2-4c1.62-1.08 5 0 5 0" />
19+
<path d="M12 15v5s3.03-.55 4-2c1.08-1.62 0-5 0-5" />
20+
</svg>
21+
)
22+
23+
export default Rocket

styles/styles.scss

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@
2828

2929
@import '../components/library-links/library-links';
3030

31+
@import '../components/ships/ships';
32+
3133
@import '../components/not-found/not-found';
3234

3335
@import '../components/partner-pack/offers/offers';

0 commit comments

Comments
 (0)