Conversation
- Roll over all 2025 references to 2026 (theme TBD) - Fix hero section text/button overlap on mobile (#259) - Fix horizontal scroll on medium screens (#250) - Add responsive breakpoints for schedule page - Clarify README: use npm run dev, add Node version requirement (#272, #297) Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- Change overflow-x: hidden to overflow-x: clip on layout__content so position: sticky on the header works correctly (hidden creates an implicit scroll container that breaks sticky positioning) - Add box-sizing: border-box to event cards for consistent sizing - Make markdown-rendered <p> tags inline inside line-clamped text so -webkit-line-clamp works correctly with rendered descriptions Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- api/events.js: Add explicit handling for 'TBD' and 'all-day' time
values in frontmatter. Add timeDisplay field ('specific', 'tbd',
'all-day') to formatEventDateTime output.
- DateTimeChip: Show clean 'TBD' or 'All Day' label without PT
conversion row when times aren't specific.
- EventDetail: Show date range chip for multi-day events.
- EventsList: Pass timeDisplay prop; use dash separator in date range.
- useIncomingEvents: Multi-day events remain 'upcoming' until endDate
passes.
- CONTRIBUTING.md: Document optional UTCStartTime/UTCEndTime and
endDate fields.
- commons.json: Add 'message:all-day' i18n literal.
Fixes #245, fixes #242
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…ue template - Move 38 event files from content/events/ to content/2025/events/ - Create pages/2025/schedule/ routing for archived 2025 events - Fix bug: pages/2023/ and pages/2024/ incorrectly referenced 2022 events - Add iCalendar/ICS feed generation at build time (#88) - Add skip-to-content link, ARIA landmarks, heading hierarchy, focus styles (#64) - Update issue template: times optional for TBD/all-day, add workshop type - Empty content/events/ ready for 2026 submissions Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- Add cross-env for Windows-compatible NODE_ENV in build script (#272) - Footer social icons now wrap on narrow screens instead of overflowing Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
This reverts commit f672c98.
- Schedule page shows 'coming soon' message when no events exist - Library page shows empty state message when no resources - Theme changed to 'Coming Soon' placeholder until 2026 theme is decided - Removed Council import from homepage (no council for 2026) Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
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>
- Ships tests: validate required fields, date format, URL format, description length - Event parsing tests: TBD defaults, all-day handling, multi-day endDate, validation errors Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- Add box-sizing, overflow-wrap, word-break for long titles - Add min-width: 0 on cards to prevent grid blowout Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- Remove yarn.lock (project uses npm) - Remove smoothscroll-polyfill (unnecessary in modern browsers) - Fix next.config.js: add outputFileTracingRoot - Fix package.json: start script uses serve for static export - Fix all title tag warnings across 11 pages (template literals) - Fix img lint warnings in Offers.jsx - Fix archived year pages (2023/2024) to reference correct content - Update CONTRIBUTING.md example to 2026 - Add previous-years note to news page Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- Fix calendar API timezone handling - Fix events API error handling - Fix EventsList rendering edge case - Update Ships component layout - Update commons.json and partner-pack content - Add test coverage for event edge cases - Update dependencies Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- Use getEvents() in schedule/[slug].js instead of raw fs.readdirSync (getEvents already handles missing directories gracefully) - Add serve as pinned devDependency instead of npx Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Update meta:title and page:date from 2025 to 2026. These were missed in the initial year rollover and caused the page header and meta tags to still display 2025. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Abby Cabunoc Mayes <abbycabs@github.com>
- Revert jsconf offer headline and promo code to 2025 (past offers) - Revert security-challenge.js to 2025 (page removed from nav) - Add comment on 2024/index.js explaining 2023 home content fallback Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Adds file-type >=21.3.1 to overrides to fix the transitive dependency vulnerability through jimp. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
file-type >=21.3.1 changed its exports structure, breaking @jimp/core's import of file-type/core.js. The Dependabot alert for file-type needs to be resolved by upgrading jimp instead. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
There was a problem hiding this comment.
Pull request overview
Updates the Maintainer Month site for the 2026 rollover and addresses CodeQL/lint/test issues by refreshing content, adding new pages/features (Ships + ICS), and improving accessibility and event parsing behavior.
Changes:
- Adds a new Ships page backed by
content/ships/ships.jsonplus tests and styling. - Enhances the Schedule with build-time ICS generation and improves event parsing to support TBD / all-day times and multi-day events.
- Performs the 2026 content rollover, archives 2025 events under
content/2025/events/, and adds routing for the 2025 schedule archive.
Reviewed changes
Copilot reviewed 60 out of 100 changed files in this pull request and generated 3 comments.
Show a summary per file
| File | Description |
|---|---|
| tests/ships.test.js | Adds validation tests for ships JSON entries. |
| tests/events.test.js | Makes event-directory tests tolerant of missing content/events. |
| tests/event-parsing.test.js | Adds coverage for TBD/all-day/valid time parsing and error cases. |
| styles/styles.scss | Registers Ships component styles in global stylesheet. |
| styles/base.scss | Improves focus styles + adds skip-link and screen-reader utility classes. |
| public/maintainer-month-2026.ics | Adds placeholder ICS file (to be overwritten during build). |
| public/icons/rocket.js | Adds Rocket icon used in navigation. |
| pages/ships.js | Adds /ships page that renders Ships data. |
| pages/schedule/index.js | Generates ICS file during static build and renders schedule list. |
| pages/schedule/[slug].js | Uses getEvents() for static paths instead of direct FS listing. |
| pages/partner-pack.js | Updates partner pack messaging for 2026 partner outreach. |
| pages/news.js | Adds a “previous years” note above existing news links. |
| pages/_app.js | Removes smoothscroll polyfill usage. |
| pages/2025/schedule/index.js | Adds 2025 schedule archive index route. |
| pages/2025/schedule/[slug].js | Adds 2025 event detail routes reading from content/2025/events. |
| pages/2024/schedule/index.js | Fixes 2024 schedule to pull 2024 events. |
| pages/2024/schedule/[slug].js | Fixes 2024 event paths/props to read 2024 content. |
| pages/2024/index.js | Fixes 2024 home routing/content sourcing and schedule link. |
| pages/2023/schedule/index.js | Fixes 2023 schedule to pull 2023 events. |
| pages/2023/schedule/[slug].js | Fixes 2023 event paths/props to read 2023 content. |
| pages/2023/index.js | Fixes 2023 home routing/content sourcing and schedule link. |
| pages/2022/schedule/index.js | Title formatting cleanup for 2022 schedule page. |
| pages/2022/schedule/[slug].js | Title formatting cleanup for 2022 event detail page. |
| package.json | Adds ics, cross-env, serve; updates build/start scripts; removes smoothscroll polyfill. |
| package-lock.json | Locks new dependencies for ICS generation and static serving. |
| next.config.js | Adds outputFileTracingRoot for workspace root warnings. |
| content/ships/ships.json | Adds ships data source for the Ships page. |
| content/partner-pack/offers/bootdev.md | Updates Boot.dev offer link to 2026 URL. |
| content/partner-pack/index.md | Updates partner pack metadata to 2026. |
| content/home/5-events.md | Updates home schedule title to 2026. |
| content/home/2-about.md | Updates theme placeholder text for 2026. |
| content/home/1-hero.md | Updates hero date to May 2026. |
| content/events/2025-05-30-Effection.md | Removes/archives an event from the current-year events folder. |
| content/commons.json | Rolls literals to 2026 + adds Ships + all-day + schedule empty/ICS strings. |
| content/2025/events/pycon-us-2025.md | Adds archived 2025 event content. |
| content/2025/events/2025-05-30-effection.md | Adds archived 2025 event content. |
| content/2025/events/2025-05-30-Libre-Sign.md | Adds archived 2025 event content. |
| content/2025/events/2025-05-28-Deskree.md | Adds archived 2025 event content. |
| content/2025/events/2025-05-27-CRA.md | Adds archived 2025 event content. |
| content/2025/events/2025-05-26-Cultivating-Design.md | Adds archived 2025 event content. |
| content/2025/events/2025-05-24-FSF-40-Chennai.md | Adds archived 2025 event content. |
| content/2025/events/2025-05-24-FOSS-Meetup-Lucknow.md | Adds archived 2025 event content. |
| content/2025/events/2025-05-24-FOSS-Meetup-Bengaluru.md | Adds archived 2025 event content. |
| content/2025/events/2025-05-23-nuxt-ai.md | Adds archived 2025 event content. |
| content/2025/events/2025-05-23-Build-CLI.md | Adds archived 2025 event content. |
| content/2025/events/2025-05-21-kotlinconf.md | Adds archived 2025 event content. |
| content/2025/events/2025-05-21-OSI.md | Adds archived 2025 event content. |
| content/2025/events/2025-05-21-NGINX.md | Adds archived 2025 event content. |
| content/2025/events/2025-05-19-Swift-Craft.md | Adds archived 2025 event content. |
| content/2025/events/2025-05-19-05F5.md | Adds archived 2025 event content. |
| content/2025/events/2025-05-17-FOSS-City-Meetup-Kanpur.md | Adds archived 2025 event content. |
| content/2025/events/2025-05-16-supermemoryai.md | Adds archived 2025 event content. |
| content/2025/events/2025-05-16-Querido-Diario.md | Adds archived 2025 event content. |
| content/2025/events/2025-05-16-Open-Source-European-Commission.md | Adds archived 2025 event content. |
| content/2025/events/2025-05-16-Cyber-Security.md | Adds archived 2025 event content. |
| content/2025/events/2025-05-14-CloudFoundry.md | Adds archived 2025 event content. |
| content/2025/events/2025-05-13-RustWeek.md | Adds archived 2025 event content. |
| content/2025/events/2025-05-10-FOSS-United-Hyderabad.md | Adds archived 2025 event content. |
| content/2025/events/2025-05-09-whopays.md | Adds archived 2025 event content. |
| content/2025/events/2025-05-09-convex.md | Adds archived 2025 event content. |
| content/2025/events/2025-05-09-Localization.md | Adds archived 2025 event content. |
| content/2025/events/2025-05-09-Diciotech.md | Adds archived 2025 event content. |
| content/2025/events/2025-05-07-PyTorch.md | Adds archived 2025 event content. |
| content/2025/events/2025-05-06-OS-Pledge.md | Adds archived 2025 event content. |
| content/2025/events/2025-05-06-Licensing-SBOMs.md | Adds archived 2025 event content. |
| content/2025/events/2025-05-06-Innersource-China.md | Adds archived 2025 event content. |
| content/2025/events/2025-05-06-GOSIM-AI.md | Adds archived 2025 event content. |
| content/2025/events/2025-05-02-typewind.md | Adds archived 2025 event content. |
| content/2025/events/2025-05-02-NPCI.md | Adds archived 2025 event content. |
| content/2025/events/2025-05-02-Cookie-Cutter.md | Adds archived 2025 event content. |
| content/2025/events/2025-05-01-OpenSearch.md | Adds archived 2025 event content. |
| content/2025/events/2025-05-01-OpenPath.md | Adds archived 2025 event content. |
| components/ships/ships.scss | Adds styling for Ships page layout/cards. |
| components/ships/Ships.jsx | Implements Ships list UI with sorting and empty state. |
| components/partner-pack/offers/Offers.jsx | Adds lint suppression comments for <img> usage (currently broken JSX). |
| components/library-links/LibraryLinks.jsx | Adds an empty state when there are no links. |
| components/layout/layout.scss | Prevents horizontal overflow + suppresses focus outline on main. |
| components/layout/Layout.jsx | Adds skip-to-content link + landmarks and focusable main target. |
| components/home/hero/hero.scss | Adjusts hero overflow/background sizing and responsive spacing. |
| components/home/get-involved/ExampleCard.jsx | Fixes heading hierarchy (h2→h3). |
| components/home/events/useIncomingEvents.js | Keeps multi-day events “upcoming” until end date passes. |
| components/home/events/Events.jsx | Removes unused Council import and dead commented usage. |
| components/home/council/Council.jsx | Updates council heading to 2026. |
| components/home/about/About.jsx | Updates theme header and heading level. |
| components/header/Header.jsx | Replaces security-challenge nav item with Ships + adds nav aria-label. |
| components/footer/footer.scss | Improves footer social layout for wrapping and centering. |
| components/footer/Footer.jsx | Adds role="contentinfo" to footer. |
| components/events-list/events-list.scss | Adds header actions + ICS button + card/grid improvements and focus styles. |
| components/events-list/EventsList.jsx | Adds ICS download link, improves semantics, and adds schedule empty state. |
| components/event-detail/event-detail.scss | Adds wrapper styling for heading/link semantics change. |
| components/event-detail/EventDetail.jsx | Supports multi-day date display + uses DateTimeChip timeDisplay + improves heading semantics. |
| components/date-time-chip/DateTimeChip.jsx | Adds timeDisplay handling for all-day/TBD and adjusts rendering logic. |
| components/chip/chip.scss | Prevents chip overflow and enables ellipsis truncation. |
| common/routes.js | Adds SHIPS route constant. |
| api/events.js | Adds TBD/all-day parsing + multi-day support + timeDisplay metadata. |
| api/calendar.js | Adds ICS generation from parsed events. |
| README.md | Updates docs for Node 20+, dev command, build output, and 2026 copyright. |
| Participation.md | Updates Maintainer Month year references to 2026. |
| CONTRIBUTING.md | Updates event naming, documents optional times, and adds endDate guidance. |
| .github/ISSUE_TEMPLATE/add-to-calendar.yml | Makes times optional, documents TBD/all-day, and adds workshop type. |
Comments suppressed due to low confidence (2)
components/partner-pack/offers/Offers.jsx:89
- The
/* eslint-disable-next-line ... */comment inside themapreturn is not wrapped in JSX comment braces, which makes this block invalid JSX and will fail to compile. Use{/* eslint-disable-next-line ... */}or move the disable comment above themap()/component instead.
<div className="partner-logos">
{sortedPartnerOffers.map((offer, index) => (
/* eslint-disable-next-line @next/next/no-img-element */
<img
key={index}
src={`/images/partners/${offer.logo}`}
alt={offer.name}
/>
components/date-time-chip/DateTimeChip.jsx:55
- In the
'specific'branch, the chip always renders astart - endrange even when one side is still'TBD'(which can happen when only one of the times is provided/valid). This results in output likeTBD - 3:00 pm. Either guard this branch so it only renders when both start/end are specific, or render a single time / fallback to the'tbd'display when one side is missing.
return (
<div className="datetime-chip">
{startTime ? (
<p className="datetime-chip__time">
<span className="datetime-chip__icon">
<IconClock />
</span>
{`${startTime.utc} - ${endTime.utc}`}
<span className="datetime-chip__timezone">
{getLiteral('timezone:utc')}
</span>
</p>
) : null}
{endTime ? (
<p className="datetime-chip__time">
<span className="datetime-chip__icon">
<IconClock />
</span>
{`${startTime.pt} - ${endTime.pt}`}
<span className="datetime-chip__timezone">
{getLiteral('timezone:pt')}
</span>
</p>
) : null}
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
| <Link | ||
| href={ROUTES.SECURITY_CHALLENGE.getPath(year)} | ||
| aria-label={getLiteral('navigation:security-challenge')} | ||
| href={ROUTES.SHIPS.getPath(year)} | ||
| aria-label={getLiteral('navigation:ships')} | ||
| className={clsx('header__link', { | ||
| ['is-active']: pathname === ROUTES.SECURITY_CHALLENGE.getPath(year), | ||
| ['is-active']: pathname === ROUTES.SHIPS.getPath(year), | ||
| })} | ||
| > |
There was a problem hiding this comment.
ROUTES.SHIPS.getPath(year) will generate year-prefixed URLs (e.g. /2025/ships) on archive routes, but there is no corresponding pages/{year}/ships route in the repo. This will produce broken navigation on year-scoped pages; consider linking to the non-year route (/ships) or adding year-specific Ships pages/routes.
See below for a potential fix:
href={ROUTES.SHIPS.path}
aria-label={getLiteral('navigation:ships')}
className={clsx('header__link', {
['is-active']: pathname === ROUTES.SHIPS.path,
| } | ||
|
|
||
| const timeDisplay = | ||
| hasSpecificStartTime || hasSpecificEndTime ? 'specific' : 'tbd' |
There was a problem hiding this comment.
timeDisplay is set to 'specific' when either the start or end time parses, which allows cases like “start time set, end time missing/TBD” (or vice versa) to be treated as a specific time range. This flows through to DateTimeChip and can render confusing output like 2:00 pm - TBD. Consider only setting timeDisplay: 'specific' when both start and end times are valid, or adjust the UI to handle partial times explicitly.
| hasSpecificStartTime || hasSpecificEndTime ? 'specific' : 'tbd' | |
| hasSpecificStartTime && hasSpecificEndTime ? 'specific' : 'tbd' |
| if (hasTime) { | ||
| const [startHour, startMinute] = event.UTCStartTime.split(':').map(Number) | ||
| icsEvent.start = [EVENT_YEAR, startMonth, startDay, startHour, startMinute] | ||
| icsEvent.startInputType = 'utc' | ||
|
|
||
| if (!isTBDValue(event.UTCEndTime) && !isAllDayValue(event.UTCEndTime)) { | ||
| const [endHour, endMinute] = event.UTCEndTime.split(':').map(Number) | ||
|
|
||
| if (event.endDate && event.endDate !== event.date) { | ||
| const { month: endMonth, day: endDay } = parseDateParts(event.endDate) | ||
| icsEvent.end = [EVENT_YEAR, endMonth, endDay, endHour, endMinute] | ||
| } else { | ||
| icsEvent.end = [EVENT_YEAR, startMonth, startDay, endHour, endMinute] | ||
| } | ||
| icsEvent.startOutputType = 'utc' | ||
| icsEvent.endInputType = 'utc' | ||
| icsEvent.endOutputType = 'utc' | ||
| } else { | ||
| icsEvent.duration = { hours: 1 } | ||
| } |
There was a problem hiding this comment.
When an event has a start time but no end time, this code sets a duration but does not set startOutputType. That can cause the generated .ics to be interpreted/exported in local time depending on the ics library defaults, while the end-time branch forces UTC. Make the time-handling consistent by setting startOutputType: 'utc' whenever startInputType is 'utc' (including the duration case).
Closes #377
creating a local branch PR to fix codeql errors