Skip to content

Ratings, event chat and announcements, no negative spots, and a real design system - #19

Merged
Hef50 merged 1 commit into
mainfrom
claude/project-state-oml8d3
Aug 13, 2026
Merged

Ratings, event chat and announcements, no negative spots, and a real design system#19
Hef50 merged 1 commit into
mainfrom
claude/project-state-oml8d3

Conversation

@Hef50

@Hef50 Hef50 commented Aug 13, 2026

Copy link
Copy Markdown
Owner

1. No more negative spots

EventCard printed capacity - RSVPs raw, so an over-subscribed event advertised "-6 spots left". Every capacity display now goes through one clamped helper (getAvailableSpots / getClaimedSpots / isEventFull) and reads "Full" at zero. Seed capacities that sat below their own RSVP counts were given headroom, leaving 17 events genuinely sold out.

2. Past events, with ratings

My Events now opens on Past — the tab with something to do. Each past event carries a 1–5 star rating with an optional note, saved per user on the device, plus:

  • a "Not yet rated (n)" filter chip
  • search across past events
  • the same rating card on the event page once an event is over
  • a running count in the header ("You've rated 3 events")

3. Upcoming events aren't the default

Upcoming lives behind the same segmented control (with its count), so the list you land on is never mixed with events that haven't happened. Browsing (Find) leads with upcoming events and keeps past ones below rather than at the top.

4. Chat and announcements for people who signed up

Every event has a thread: attendees message each other, hosts post announcements that pin above the conversation. Access is gated to going/maybe/host in the UI and enforced in the database — new RLS policies in supabase/migrations/004_event_messages.sql mean a non-attendee cannot read or write the thread even by calling the API directly. With no Supabase project configured the thread falls back to device storage, so the feature works end to end in demo mode (and says so).

5. Design system

The UI had no shared vocabulary — every screen invented its own font sizes, paddings and radii, and several used emoji as icons. Research-backed tokens now live in constants/design.ts and reach components through useAppTheme():

  • Spacing: 8pt grid with 4pt half-steps (the convention IBM Carbon, Fluent and Polaris all enforce)
  • Type: a fixed 11-step scale modelled on Apple's HIG text styles, each step carrying its own weight, line height and tracking, headings 1.5–2× body
  • Radii, a shadow ramp that goes flat in dark mode (shadows read as dirt on dark surfaces — separation comes from stepped surfaces and hairlines instead)
  • 44pt minimum tap targets

Applied across Home, Find, My Events, the agenda and both card components: one card language (date tile → headline title → quiet metadata → footer), real icon glyphs instead of emoji, staggered entrances and press feedback, and a tab bar that respects the home indicator.

Verification

  • tsc 0 errors, ESLint clean, 62/62 unit tests (18 new: capacity clamp, rating store, message store).
  • pnpm build succeeds; postexport flattens 37 vendor assets.
  • Headless iPhone-profile run in America/New_York, light and dark: sign in → RSVP → rate a past event → post to an event thread, with screenshots at each step.

🤖 Generated with Claude Code

https://claude.ai/code/session_011nrgpkJbvZ9JCf2VA2kKvJ


Generated by Claude Code

…l design tokens

Spots remaining:
- Every capacity display now routes through one clamped helper, so an
  over-subscribed event reads "Full" instead of "-6 spots left". Seed
  capacities that sat below their own RSVP counts were given headroom, leaving
  a handful genuinely sold out.

Past events and ratings:
- My Events opens on Past, where each event carries a 1-5 star rating with an
  optional note, saved per user on the device. Upcoming events are behind the
  same control rather than shown by default, plus a "Not yet rated" filter and
  search over past events. The event page grows the same rating card once the
  event is over.

Chat and announcements:
- Each event has a thread for the people going: attendees message each other,
  hosts post announcements that pin above the conversation. Access is gated to
  going/maybe/host in the UI and enforced in the database by new RLS policies
  (supabase/migrations/004_event_messages.sql). With no Supabase project the
  thread falls back to device storage so the feature still works end to end.

Design system:
- New constants/design.ts holds the tokens the app was missing: an 8pt spacing
  scale with 4pt half-steps, a fixed type scale modelled on Apple's HIG text
  styles (each step with its own weight, line height and tracking), radii, a
  shadow ramp that goes flat in dark mode, and a 44pt minimum tap target.
  useAppTheme() now hands screens colours, type, space, radii and elevation.
- Home, Find, My Events, the agenda and both card components were rebuilt on
  those tokens: one card language (date tile, headline title, quiet metadata),
  emoji icons replaced with real icon glyphs, staggered entrances and press
  feedback everywhere, and a tab bar that respects the home indicator.
- Browsing leads with upcoming events; past ones stay findable below.

18 new unit tests cover the capacity clamp, the rating store and the message
store; the suite is 62/62.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011nrgpkJbvZ9JCf2VA2kKvJ
@Hef50
Hef50 merged commit 9c07852 into main Aug 13, 2026
2 checks passed
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