Skip to content

polish(events): solid Brand Navy hero, polished EventCard, dignified empty states#18

Open
f1shyfang wants to merge 1 commit into
mainfrom
polish/events
Open

polish(events): solid Brand Navy hero, polished EventCard, dignified empty states#18
f1shyfang wants to merge 1 commit into
mainfrom
polish/events

Conversation

@f1shyfang
Copy link
Copy Markdown
Owner

Summary

Polish pass on /events plus the shared EventCard it leans on. Critique score moved from 22/40 → 34/40.

Page (events/page.tsx, EventsClient.tsx)

  • Hero rebuilt as a solid Brand Navy cover (was bg-gradient-to-r from-blue-600 via-blue-700 to-indigo-800 with floating white opacity orbs — SaaS landing-template anti-pattern).
  • Sticky tab nav: Brand Navy active state with aria-current and focus-visible: rings.
  • Three contextual empty states (no events at all → Subscribe + Get in touch; filter returns nothing → Show all; past archive empty → warm copy, no CTA). All with brand-voice copy and Brand Navy CTAs.
  • .animate-fade-in-up rewritten as a true reduced-motion-aware animation. scrollIntoView calls now pass behavior: 'auto' when prefers-reduced-motion: reduce.
  • Tab counters now show total upcoming/past, not the filtered subset — chrome stays stable as filters change.
  • Page background flattened to bg-white; gradient underline bars under each h2 deleted; hierarchy carried by typography and spacing.

EventCard (shared component)

  • Whole-card clickability in default variant (was CTA-only). Home variant gets title parity with line-clamp-2 min-h-[3.25rem].
  • Relative dates: "Today · 7:00 pm", "Tomorrow", "Friday · in 4 days", falling back to absolute "Fri 9 May" beyond a week.
  • Graceful degrade: missing description, image, category, or link each render a deliberate fallback (not blank space).
  • EventSkeleton rebuilt to match the polished card; new EventHomeSkeleton for the home carousel.
  • CATEGORY_COLORS tightened to Record<Event['category'], string> so future category additions become tsc errors.

EventFilterButton (shared)

  • Solid Brand Navy active state (was bg-gradient-to-r from-blue-500 to-blue-600 with shadow-blue-500/25 glow).
  • aria-pressed toggle semantics, motion-safe scale, hairline border, focus-visible ring.

Shared utilities

  • formatRelativeEventDate added to CEUS/src/lib/utils.ts.
  • CALENDAR_SUBSCRIBE_URL moved to CEUS/src/lib/links.ts. (Duplicated with polish/home so each PR is independently mergeable; identical content auto-merges.)

Test plan

  • npm run dev/events — verify hero is solid Brand Navy, no gradient or orbs
  • Filter by each category; verify counters stay stable
  • Trigger the empty filter result (search a category with no events); verify "Show all" CTA appears
  • Set prefers-reduced-motion: reduce; verify card-entrance animation is static and tab-scroll is instant
  • On an event with a near-term date, verify relative wording reads naturally
  • On an event with empty description or no facebookEventLink, verify graceful fallback

Verification

  • tsc --noEmit: clean
  • eslint: clean

Merge note

This PR shares two trivially-mergeable files with polish/home: CEUS/src/lib/links.ts (new, identical content) and CEUS/src/index.css is not duplicated here. Either merge order works.

🤖 Generated with Claude Code

…states

The /events page hero was a SaaS-template gradient with floating
white orbs and palette-foreign indigo. Replaced with a calm solid
Brand Navy cover plus eyebrow + balanced h1 + concrete-noun subtitle
and two on-brand CTAs.

EventCard polished end-to-end: whole-card clickability in the default
variant (was CTA-only); home variant title parity with line-clamp-2;
relative date framing ("Tomorrow", "Friday in 4 days"); EventCardSkeleton
matching the polished card; graceful degrade when description, image,
category, or link is missing. CATEGORY_COLORS tightened to a
Record<Event['category'], string> so future category additions become
tsc errors.

EventFilterButton: solid Brand Navy active state (was gradient with
blue glow), aria-pressed toggle semantics, motion-safe scale, hairline
border, focus-visible ring.

Three contextual empty states (no events at all, filter returns nothing,
past archive empty), each with brand-voice copy and Brand Navy CTAs.
Animation transitions wrapped in prefers-reduced-motion guards
(scrollIntoView, .animate-fade-in-up). Stable tab counters so chrome
doesn't flicker as filters change.

formatRelativeEventDate added to src/lib/utils.ts. CALENDAR_SUBSCRIBE_URL
moved to src/lib/links.ts (duplicated with polish/home for independent
mergeability; identical content auto-merges).

tsc --noEmit: clean. eslint: clean.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Copilot AI review requested due to automatic review settings May 29, 2026 11:27
@vercel
Copy link
Copy Markdown

vercel Bot commented May 29, 2026

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
ceus-website Ready Ready Preview, Comment May 29, 2026 11:28am

Copy link
Copy Markdown

Copilot AI left a comment

Choose a reason for hiding this comment

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

Pull request overview

This PR polishes the /events experience and shared event presentation components with updated Brand Navy styling, richer empty states, relative event dates, and card interaction improvements.

Changes:

  • Reworks the events page hero, sticky section navigation, filters, empty states, and reduced-motion-aware scrolling.
  • Updates EventCard, filter buttons, and skeletons to match the new visual treatment and fallback behavior.
  • Adds shared event utilities and a centralized calendar subscribe link.

Reviewed changes

Copilot reviewed 8 out of 8 changed files in this pull request and generated 2 comments.

Show a summary per file
File Description
CEUS/src/app/events/page.tsx Updates page metadata description.
CEUS/src/app/events/EventsClient.tsx Rebuilds the events page UI, filters, tabs, empty states, and scrolling behavior.
CEUS/src/components/EventCard.tsx Updates card variants, relative dates, whole-card linking, and fallback rendering.
CEUS/src/components/EventFilterButton.tsx Restyles filter buttons and adds toggle semantics.
CEUS/src/components/skeletons/Skeletons.tsx Reworks event skeletons and adds a home event skeleton.
CEUS/src/lib/utils.ts Adds formatRelativeEventDate.
CEUS/src/lib/links.ts Adds shared calendar subscription URL constant.
CEUS/.impeccable/critique/2026-05-29T05-48-45Z__ceus-src-components-eventcard-tsx.md Adds design critique documentation for EventCard.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

{eventsToRender.map((event, index) => (
<div
key={`${sectionType}-${event.id}`}
className="animate-fade-in-up motion-safe:opacity-0"
const EventCard: React.FC<EventCardProps> = ({ event, variant = 'default' }) => {
const formattedDate = formatEventDate(event.date);
const relativeDate = formatRelativeEventDate(event.date);
const hasLink = Boolean(event.facebookEventLink);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants