Deck
Browse the catalog

Experience / Application

Events

  • page
  • play-fn

Your events — the ones you are going to, hosting, or speaking at.

Distinct from the public events index: this is a personal calendar, so it is ordered by what you have to do next rather than by what is popular, and every row says what you are to the event. Hosting a dinner and being in the audience are the same date and completely different weeks.

The next event is lifted out into a hero. On a list where every row looks alike, the one that matters this week is the one that should not — and it is the only place with room for the event's own picture, which is how you recognise it before you have read anything. The event after it rides along underneath, because "and then?" is the second question anyone asks.

The list can be read two ways. Rows are for scanning a calendar down its left edge; cards are for browsing when you are not sure what you are looking for. Search cuts across both, and past events keep their attendance badge — "I spoke at that" is the reason anyone scrolls back.

Not exported from @meetcard/deck — this is a composed screen, built from the components below rather than shipped as one.

Stories

Every preview below is the real component, rendered in this page from the same story Storybook runs. The width control resizes each preview's container; CSS media queries still follow the browser window, so breakpoint behaviour is worth checking in Storybook.

Default
Source
const Default = () => <Events />;

Past events keep their attendance badge — "I spoke at that" is the reason anyone scrolls back — and read newest first.

Past
Source
const Past = () => <Events defaultTab="past" />;

Switching lists. The counts are on the control, so neither is a surprise.

Switching Lists
Source
const SwitchingLists = () => <Events />;

A new account. The empty list points at the next action rather than a void.

No Events
Source
const NoEvents = () => <Events events={[]} />;

Everything is behind you — no featured card, because there is nothing coming to feature.

All Past
Source
const AllPast = () => <Events today="2028-01-01" />;

The page in the shell it actually lives in.

In The Shell
Source
const InTheShell = () => (
  <AppShell currentId="/events">
    <Events />
  </AppShell>
);

Search cuts across the list you are in. It looks at the three things anyone remembers about an event they are trying to find again: what it was called, where it was held, and what town it was in.

Searching
Source
const Searching = () => <Events />;

Nothing matched. The way out is the control that got you here.

Search With No Matches
Source
const SearchWithNoMatches = () => <Events />;

The same events as cards. Rows are for scanning a calendar down its left edge; cards are for browsing when you are not sure what you are after.

Card View
Source
const CardView = () => <Events defaultView="cards" />;

Switching between the two shapes without losing your place in the list.

Switching Views
Source
const SwitchingViews = () => <Events />;

Past events carry what you came away with — the faces and the count. That is the only question anyone asks of an event a year later, and the reason the list is worth scrolling back through.

Past Carries The Cards
Source
const PastCarriesTheCards = () => <Events defaultTab="past" />;

Phone. The cover thumbnails come off the rows — the name needs the width more than the picture does — and the toolbar wraps into stacked controls.

Mobile
Source
const Mobile = () => <Events />;

Props

PropTypeDefaultDescription
defaultTab'upcoming' | 'past''upcoming'Which list opens first.
defaultView'list' | 'cards''list'Which shape the list opens in.
eventsAppEvent[][ { slug: 'revops-summit', name: 'RevOps Summit', date: '2027-05-18', time: '9:00 AM', endTime: '4:30 PM', venue: 'Austin Convention Center', city: 'Austin, Texas', address: '500 E Cesar Chavez St, Austin, Texas', attendance: 'attending', coverSrc: COVERS.revops, host: { name: 'Hannah Davis', detail: 'Community Lead, RevOps Collective' }, going: ['Hannah Davis', 'Marcus Lee', 'Priya Shah'], expected: 420, about: [ 'A full day of operators trading the unglamorous details: routing rules, attribution models, and the spreadsheets nobody admits to running the business on.', 'Bring cards — the hallway track is the real program.', ], schedule: [ { time: '9:00 AM', title: 'Doors and coffee' }, { time: '10:00 AM', title: 'Keynote: Pipeline you can trust' }, { time: '12:30 PM', title: 'Lunch and card exchange' }, { time: '2:00 PM', title: 'Breakouts' }, { time: '4:30 PM', title: 'Closing reception' }, ], }, { slug: 'boulder-climate', name: 'Boulder Climate Happy Hour', date: '2027-06-16', time: '5:30 PM', venue: 'Rayback Collective', city: 'Boulder, Colorado', address: '2775 Valmont Rd, Boulder, Colorado', attendance: 'hosting', coverSrc: COVERS.climate, host: { name: 'Alex Rivera', detail: 'Design Lead, Northwind Studio' }, going: ['Hannah Davis'], expected: 60, about: [ 'Drinks on the patio with the people building climate tools in the Front Range. No panel, no slides.', ], }, { slug: 'saastr-annual', name: 'SaaStr Annual', date: '2027-09-09', time: '10:00 AM', endTime: '6:00 PM', venue: 'Moscone West', city: 'San Francisco, California', address: '800 Howard St, San Francisco, California', attendance: 'speaking', coverSrc: COVERS.saastr, host: { name: 'SaaStr', detail: 'Conference' }, expected: 12_000, about: [ 'The big one. Three halls, a thousand conversations, and a badge scanner you will want to leave in your bag.', ], schedule: [ { time: '10:00 AM', title: 'Opening remarks' }, { time: '11:30 AM', title: 'Panel: What operators actually measure' }, { time: '2:00 PM', title: 'Your session: Designing for the handshake' }, ], }, { slug: 'founders-dinner', name: 'Founders Dinner', date: '2027-11-02', time: '7:00 PM', venue: 'The Wayfarer', city: 'Denver, Colorado', address: '1600 15th St, Denver, Colorado', attendance: 'hosting', host: { name: 'Alex Rivera', detail: 'Design Lead, Northwind Studio' }, expected: 12, about: ['Six to a table, one long conversation, no name badges.'], }, { slug: 'frontend-denver', name: 'Frontend Denver', date: '2027-02-11', time: '6:00 PM', venue: 'Industry RiNo', city: 'Denver, Colorado', address: '3001 Brighton Blvd, Denver, Colorado', attendance: 'attending', host: { name: 'Mira Okafor', detail: 'Organiser' }, exchanged: ['Mira Okafor', 'Theo Marsh', 'June Park', 'Sam Ortiz'], about: ['Two talks and a long hallway track.'], }, { slug: 'saas-north', name: 'SaaS North', date: '2026-11-19', time: '9:30 AM', endTime: '5:00 PM', venue: 'Shaw Centre', city: 'Ottawa, Ontario', address: '55 Colonel By Dr, Ottawa, Ontario', attendance: 'attending', host: { name: 'SaaS North', detail: 'Conference' }, exchanged: [ 'Ada Chen', 'Owen Hale', 'Nora Quinn', 'Arlo Bennett', 'Dev Patel', ], about: ['Canada’s SaaS conference, in the cold.'], }, ]—
todaystring'2027-05-04'ISO date the page reads "upcoming" from. Pinned in stories and tests.

Open in Storybookfor controls, the a11y panel and the interaction runner.