Components & UX
Component library, navigation patterns, UX flows, and interaction design for www.mavelpoint.com. For color tokens, typography, and breakpoints see the Design System page.
Animations
Keyframe animations, CSS transitions, and motion patterns.
Tailwind Keyframes
Built-in animation classes defined in tailwind.config.js.
animate-marquee
Horizontal infinite scroll
animate-marquee-vertical
Vertical infinite scroll
animate-loading-bar
Progress bar animation
animate-blink
Text blink effect
CSS Animations
Global CSS classes for entrance and effect animations.
.fade-in-up-*
Staggered entrance (200ms–1400ms delays)
.text-gradient
Gradient text effect
.bio-clamp
Line clamp (6 mobile, 15 desktop)
.glass-effect
Glassmorphism with 8px backdrop blur
Framer Motion
React island animation framework.
Used in React islands for:
- • Entrance/exit animations
- • Scroll-triggered reveals
- • AnimatePresence for component transitions
- • prefers-reduced-motion respected
Component Library
Shared primitives and domain-specific composed components. Astro for static content, React for interactive elements.
Component Architecture
Two-tier system: shared primitives reused everywhere, and domain-specific compositions for feature areas.
Shared Primitives
src/components/shared/
Domain Compositions
src/components/ui/
Other Component Groups
Supporting component directories.
analytics/
GA, GTM, Sentry, Meta Pixel, TikTok, Spotify tracking
icons/
Custom SVG icons: BandCamp, Beatport, Shazam
navbar/
NavBarWeb, NavBarPublicProfile, NavBarGeneral
magicui/
Animated UI patterns: BlurFade, Marquee
Component Patterns
Variants, sizes, states, and styling rules for core UI components.
Buttons
4 types, 3 colors, 3 sizes.
Types
Colors
Sizes
sm h-8 • base h-10 • lg h-11
Styling
Primary: bg-lime text-black
Secondary: border border-white-10 text-white
Badges
4 colors, 3 types, 3 sizes.
Colors
Types
Genre Badge Example
bg-lime-15 text-lime text-buttonXs rounded px-2 py-0.5
Cards
Surface, interactive, gradient border, and specialized card types.
Base Surface
bg-black border border-white-10 rounded-xl p-6
Interactive Hover
hover:border-white-20 hover:shadow-xs
Variants
Inputs
3 sizes, 3 statuses, icon support.
Sizes
sm h-10 • base h-11 • lg h-12
Statuses
Base Styling
bg-base-fill border-white-5 → focus: status ring
Tabs
Generic typed component with animated indicator.
Features
- • Generic
<T extends string>for type-safe IDs - • Smooth animated position indicator
- • Variants: primary, secondary
- • Colors: white, lime
Text Components
Responsive typography primitives.
Components
- •
Heading—asprop (h1–h4), responsive mobileSize + desktopSize - •
Paragraph— responsive sizing, weight, optional truncation tooltip - •
TextError— danger-colored via Paragraph
Dependencies & Libraries
Key packages used for interactive components and UI patterns.
Headless UI
Accessible, unstyled interactive components — Dialog, Disclosure, Popover, Listbox. Used for modals, nav menus, dropdowns, and select inputs.
Phosphor Icons
Flexible icon library supporting 6 weight variants: thin, light, regular, bold, fill, duotone. Used across all components via @phosphor-icons/react.
Keen Slider
Performant carousel/slider with touch support. Wrapped in a custom component for consistent API across features.
Leaflet
Map rendering with dark CartoDB tiles and custom red SVG markers. Used on venue pages in display-only mode (interactions disabled).
Nanostores
Cross-component state management: player, tracks, tabs, navigation, collections, industry access, modal vote. Persists across ViewTransitions.
Framer Motion
Animation library for React islands — entrance/exit, scroll triggers, AnimatePresence for component transitions.
UX Flows
Core user journeys, conversion paths, and interaction patterns.
Artist Discovery & Sign-Up
DJ/producer finds MavelPoint and creates an account.
Landing → Value prop → CTA "Join MavelPoint" → app.mavelpoint.com
Entry: Homepage, feature page, or blog. Sign-up happens on the web app. PlatformButton tracks lead/client_potential events.
Industry Professional Evaluates Artist
Promoter/agent reviews an artist EPK profile.
Overview (bio, music) → Tabs (Events, Tracks, Gallery, Press) → Contact/Book CTA
Replaces PDF press kits, scattered SoundCloud/RA/Instagram checks. Everything structured and scannable in one place.
Blog Content → Conversion
Artist finds career advice via Google, converts to user.
Blog article → Contextual CTA → Feature page or sign-up
WordPress-powered with 1hr cache. Value-first approach — deliver content before product mention.
1–2% blog → sign-upEvent Discovery
User explores events and venue details.
Event detail → Lineup, venue, date → Visit/Calendar/Share → Venue map
Dark CartoDB map tiles with custom markers. EventSlugButtonsAction provides visit/calendar/share actions.
Local Circuit (DJ Contests)
Emerging DJs participate in contests, community votes.
Browse contests → Select contest → View participants → Vote or submit entry
Organized by city and promoter. Voting via modalVoteStore. Industry access gating for some features.
Demo Submission
Producer submits tracks to an artist or label.
/artist/[name]/send-demo → Fill form → Submit (rate-limited)
Rate limiting via rateLimiter.ts. Input validation with status-specific error states.
MavelPoint Studio (AI Flyers)
Generate promotional flyers with AI.
/mavelpoint-studio → Upload/describe → Gemini AI generates → Download or email
30s timeout on AI calls. Email delivery via /api/send-flyers-email.
Pricing Evaluation
Artist compares plans and upgrades.
/pricing → Compare plans → Click upgrade → Redirect to app billing
Checkout happens on web app, not marketing site. Highlight recommended plan.
Cross-Page State
Nanostores that persist data across page navigations via Astro ViewTransitions.
| Store | Purpose | Persistence |
|---|---|---|
| playerStore | Music playback state (current track, progress, volume) | Across navigations (ViewTransitions) |
| tracksStore | Track list data and metadata | Across navigations |
| tabsStore | Active tab selection on artist profiles | Across navigations |
| navigationStore | Page navigation state | Across navigations |
| collectionStore | Gallery collection data | Across navigations |
| industryAccessStore | Industry access gating state | Across navigations |
| modalVoteStore | Contest voting modal state | Per-page only |
UX Design Rules
Core principles that guide all user experience decisions.
CTA Above the Fold
Every marketing page must have a visible call-to-action without scrolling.
5-Second Rule
Visitors must understand what MavelPoint does within 5 seconds of landing on any page.
Two Audience Tracks
Artists want to build presence and get booked. Industry wants productivity and data-driven decisions. Each track has different motivations.
Artist Pages Are Their Brand
Minimize MavelPoint chrome on /artist/ and /t/ pages — the artist's identity comes first.
Player Persists
Music playback continues uninterrupted across page transitions via nanostores and Astro ViewTransitions.
Performance Targets
Artist EPK pages < 2s LCP. MavelTree pages < 1s LCP. Third-party scripts offloaded to web workers via Partytown.