docsUI System

UI System

Watermelon’s visual design is built on Material Design 3 with a custom dark-first palette optimized for music streaming.


Color Tokens

Primary Palette

TokenHexUsage
Watermelon#FF1A4CBrand accent, CTAs, active states
Watermelon Dark#C2002BHover / pressed states
Surface#0A0A0AApp background
Surface Container#141414Cards, sheets
Surface Container High#1C1C1CElevated cards

Utility Colors

PurposeHex
Error#E54545
Success#4ADE80
XP Accent#E2B124
Rank TiersGradient from green → cyan → purple → gold
Rank Legend#FFD700 (gold)
Rank SpectrumLord#00FFFF (cyan)

Dynamic Theming

Material You dynamic colors are supported on Android 12+:

val colorScheme = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
    dynamicDarkColorScheme(context)
} else {
    WatermelonDarkColorScheme
}

Typography

ScaleSizeWeightUsage
Display Large57sp400Splash / Welcome
Headline Large32sp700Screen titles
Title Large22sp600Card titles
Title Medium16sp600Section headers
Body Large16sp400Primary text
Body Medium14sp400Secondary text, descriptions
Label Large14sp500Buttons, badges
Label Medium12sp500Chips, captions
Label Small11sp500Timestamps, metadata

Font: System default (Roboto on Android, Inter on Web)


Spacing Scale

TokenValue
spaceTiny2.dp
spaceXS4.dp
spaceSmall8.dp
spaceMedium16.dp
spaceLarge24.dp
spaceXL32.dp
spaceXXL48.dp

Component Catalog

Buttons

// Primary CTA
Button(
    colors = ButtonDefaults.buttonColors(
        containerColor = Watermelon
    )
) { Text("Play Now") }
 
// Secondary
OutlinedButton(
    border = BorderStroke(1.dp, Watermelon)
) { Text("Add to Queue") }
 
// Icon Button
IconButton(
    onClick = { /* toggle favorite */ }
) { Icon(Icons.Filled.Favorite, null) }

Cards

TypeElevationCorner RadiusBackground
Elevated Card2.dp12.dpSurface Container
Filled Card0.dp12.dpSurface Container
Outlined Card0.dp12.dpBorder 1.dp
Playlist Card4.dp16.dpGradient overlay

Images

ComponentShapeSizeCache
Song thumbnailRoundedCorner(8.dp)56×56.dpCoil memory
Artist imageCircleShape56.dp / 120.dpCoil memory
Playlist coverRoundedCorner(12.dp)160×160.dpCoil disk
Profile avatarCircleShape80.dpCoil disk

Progress Bar

LinearProgressIndicator(
    progress = { currentMs / durationMs },
    color = Watermelon,
    trackColor = SurfaceContainerHigh,
    modifier = Modifier.height(2.dp)
)

Animation Specs

AnimationDurationEasing
Screen enter300msease-out
Screen exit200msease-in
Card press100msspring(stiffness=300)
Mini-player slide250msspring(stiffness=400)
Progress update1slinear (every 500ms tick)
Skeleton shimmer1.5slinear (infinite)
Staggered list50ms/itemease-out

Responsive Breakpoints

NameWidthLayout Change
Compact< 600.dpSingle column, bottom nav
Medium600–840.dp2-column grids, rail nav
Expanded> 840.dp3-column grids, side nav

Icons

Icon set: Material Icons (Rounded variant)

IconNameContext
🏠HomeHome tab
🔍SearchSearch tab
📚LibraryMusicLibrary tab
⚙️SettingsSettings tab
▶️PlayArrowPlay action
⏸️PausePause action
⏭️SkipNextNext track
🔀ShuffleShuffle mode
🔁RepeatRepeat mode
❤️FavoriteLiked state
⬇️DownloadDownload action
🔔NotificationsPush settings

Dark Mode

Watermelon is dark-first — light mode is not supported. The palette is tuned for:

  • OLED black backgrounds (#000000)
  • Reduced eye strain during night listening
  • Battery savings on OLED displays
  • Immersive full-screen player experience