Replace solid orange FAB with glassmorphism inner and a conic
gradient border (pink-purple-indigo) with subtle glow halo.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Replace hard-edged color overlay with CSS mask-image fade-out and
increase hero height to 420px for a seamless blend into the aurora
mesh background.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Use layered radial gradients on a dark base (#1B1730) with
backdrop blur for an organic, aurora-like background effect
that better complements the glassmorphism event cards.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Replace solid white event cards with glass-effect cards featuring
backdrop blur, semi-transparent gradient backgrounds, and light
borders that blend with the Electric Dusk gradient background.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
New GET /events/{token}/attendees endpoint returns attendee names when
a valid organizer token is provided (403 otherwise). The frontend
conditionally renders the list below the attendee count for organizers,
silently degrading for visitors.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Group events into five temporal sections with section headers, date subheaders,
and context-aware time display (clock time for upcoming, relative for past).
Includes new useEventGrouping composable, SectionHeader and DateSubheader
components, full unit and E2E test coverage.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Replace card-based event detail view with full-screen gradient layout.
Add hero image with gradient overlay, icon-based meta rows, and
"About" section. Content renders directly on the gradient background
with white text for an app-native feel.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Enable users to see all their saved events on the home screen, sorted
by date with upcoming events first. Key capabilities:
- EventCard with title, relative time display, and organizer/attendee
role badge
- Sortable EventList with past-event visual distinction (faded style)
- Empty state when no events are stored
- Swipe-to-delete gesture with confirmation dialog
- Floating action button for quick event creation
- Rename router param :token → :eventToken across all views
- useRelativeTime composable (Intl.RelativeTimeFormat)
- useEventStorage: add validation, removeEvent(), reactive versioning
- Full E2E and unit test coverage for all new components
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Move feature summaries for 18 unimplemented specs into
.specify/memory/ideen.md before deleting the full spec files.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The Gitea runner cannot reach gitea.com (IPv6 timeout), so switch to
the akkuman/gitea-release-action mirror hosted on GitHub.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Generate changelog from commits between tags and create a Gitea release
using the official gitea-release-action after publishing container images.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Adds ExpiryDateBeforeEventException (400) when expiryDate <= eventDate,
asserts DB row count unchanged after every rejection in integration tests,
and replaces all hardcoded dates in EventServiceTest with TODAY-relative
expressions derived from the fixed Clock.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Adds expiry check to RsvpService using an injected Clock for testability,
handles EventExpiredException in GlobalExceptionHandler as 409 Conflict,
and adds unit + integration tests using relative dates from a fixed clock.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Introduces BottomSheet and RsvpBar components, integrates the RSVP
submission flow into EventDetailView, extends useEventStorage with
saveRsvp/getRsvp, and adds unit tests plus an E2E spec for the RSVP
workflow.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Prevents future regressions where controllers bypass the application layer
and access repositories directly.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The EventController was directly accessing RsvpRepository (an outbound port)
to count attendees, bypassing the application layer. Introduce a dedicated
inbound port and implement it in RsvpService. Remove the now-unused Clock
dependency from RsvpService.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Introduce typed token value objects (EventToken, OrganizerToken,
RsvpToken) and refactor all existing Event code to use them.
Add POST /events/{token}/rsvps endpoint that persists an RSVP and
returns an rsvpToken. Populate attendeeCount in GET /events/{token}
from a real count query instead of hardcoded 0.
Includes: OpenAPI spec, Liquibase migration (rsvps table with
ON DELETE CASCADE), domain model, hexagonal ports/adapters,
service layer, and full test coverage (unit + integration).
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Spec, research decisions, implementation plan, data model,
API contract, and task breakdown for the RSVP feature.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Encodes the workflow for creating PRs, monitoring CI status via
Actions API (cross-referencing head SHA), and merging when green.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The hook used --noEmit which is less strict than CI's --build,
causing type errors to slip through.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Add missing timezone field to CreateEventResponse mock
- Fix createTestRouter signature to accept optional token parameter
- Add non-null assertion for dateField element access
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
New view fetches event via openapi-fetch, formats date/time with
Intl.DateTimeFormat. Skeleton shimmer during loading (CSS-only).
Create form now sends auto-detected timezone.
Unit tests for all five view states, E2E tests with MSW mocks.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Domain: add timezone field to Event and CreateEventCommand.
Ports: new GetEventUseCase inbound port.
Service: implement getByEventToken, validate IANA timezone on create.
Controller: map to GetEventResponse, compute expired flag via Clock.
Persistence: timezone column in JPA entity and mapping.
Tests: integration tests use DTOs + ObjectMapper instead of inline JSON,
GET tests seed DB directly via JpaRepository for isolation.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
OpenAPI: new GetEventResponse schema, timezone on Create request/response.
Liquibase: add timezone VARCHAR(64) NOT NULL DEFAULT 'UTC' column.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Spec, research, data model, API contract, implementation plan, and
task breakdown for the public event detail page.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>