From 622cc8e53b83806cb8b7db17d201c0ababf1f19b Mon Sep 17 00:00:00 2001 From: Jennie Robinson Faber Date: Thu, 21 May 2026 17:50:48 +0100 Subject: [PATCH] feat(events): markdown body, registered indicator, drop capacity counters - Public event detail page renders description/series-description/content as markdown via useMarkdown, with prose styles; agenda becomes an unordered list with the same custom bullets. - Events list API returns `isRegistered` per event (derived from the requester's registrations, ignoring cancelled rows), and the list page shows a "Registered" tag. Stops exposing the full registrations array in the list response. - Removes the seats/sold-out/limited capacity UI from list and detail pages. - EventTicketPurchase: minor template formatting (self-closing inputs, prettier wrapping). --- app/components/EventTicketPurchase.vue | 43 ++++---- app/pages/events/[slug].vue | 131 ++++++++++++++++++++----- app/pages/events/index.vue | 87 +++++----------- server/api/events/index.get.js | 33 +++++-- 4 files changed, 176 insertions(+), 118 deletions(-) diff --git a/app/components/EventTicketPurchase.vue b/app/components/EventTicketPurchase.vue index 02a6e6a..eede73d 100644 --- a/app/components/EventTicketPurchase.vue +++ b/app/components/EventTicketPurchase.vue @@ -38,14 +38,14 @@
-
Registration

You're Registered!

@@ -349,12 +350,79 @@ useHead(() => ({ margin-bottom: 8px; } .section p { - font-size: 12px; + font-size: 14px; color: var(--text-dim); line-height: 1.7; max-width: 560px; } +.prose { + font-size: 14px; + color: var(--text-dim); + line-height: 1.7; + max-width: 560px; +} +.prose :deep(p) { + margin-bottom: 12px; +} +.prose :deep(p:last-child) { + margin-bottom: 0; +} +.prose :deep(a) { + color: var(--ember); + text-decoration: underline; + text-underline-offset: 2px; +} +.prose :deep(strong) { + color: var(--text-bright); +} +.prose :deep(ul), +.prose :deep(ol) { + list-style: none; + padding: 0; + margin: 8px 0 12px; +} +.prose :deep(ul li), +.prose :deep(ol li) { + position: relative; + padding: 2px 0 2px 16px; + margin-bottom: 4px; +} +.prose :deep(ul li::before) { + content: "›"; + position: absolute; + left: 0; + top: 2px; + color: var(--candle-faint); + font-size: 14px; + line-height: 1.7; +} +.prose :deep(ol) { + counter-reset: prose-item; +} +.prose :deep(ol li) { + counter-increment: prose-item; + padding-left: 28px; +} +.prose :deep(ol li::before) { + content: counter(prose-item) "."; + position: absolute; + left: 0; + top: 2px; + color: var(--candle-faint); +} +.prose :deep(blockquote) { + border-left: 2px solid var(--candle-faint); + padding-left: 12px; + margin: 12px 0; + color: var(--text-faint); +} +.prose :deep(code) { + font-family: "Commit Mono", monospace; + background: var(--input-bg); + padding: 0 4px; +} + .circle-badges { display: flex; gap: 6px; @@ -367,10 +435,27 @@ useHead(() => ({ } .agenda-list { - padding-left: 20px; - font-size: 12px; + list-style: none; + padding: 0; + margin: 8px 0 0; + font-size: 14px; color: var(--text-dim); - line-height: 2; + line-height: 1.7; + max-width: 560px; +} +.agenda-list li { + position: relative; + padding: 2px 0 2px 16px; + margin-bottom: 4px; +} +.agenda-list li::before { + content: "›"; + position: absolute; + left: 0; + top: 2px; + color: var(--candle-faint); + font-size: 14px; + line-height: 1.7; } .speaker { diff --git a/app/pages/events/index.vue b/app/pages/events/index.vue index bfcf9b3..da0ce91 100644 --- a/app/pages/events/index.vue +++ b/app/pages/events/index.vue @@ -45,34 +45,21 @@ cancelled + Registered

{{ event.tagline }}
{{ - event.eventType + eventTypeLabel(event.eventType) }} · {{ formatLocation(event) }}
- - - -
Members @@ -119,15 +106,20 @@