spotube/lib/theme/spotify_theme.dart
kiloconnect[bot] 8a193658af UI overhaul: Spotify design system, shell, and page redesign
- Add Spotify design system (colors, typography, ThemeData, components)
- Build Spotify shell (Sidebar, TopBar, BottomPlayer, ContentArea)
- Redesign Home, Search, Library pages with Spotify cards/track rows
- Restyle context menus, shimmer loaders, hover states
- Rebrand app name to Spotify across Android/iOS/macOS/Linux/Windows
- Update launcher icons and splash config to Spotify logo

No backend/API/state/audio logic changed.
2026-10-20 13:34:48 +00:00

86 lines
3.0 KiB
Dart

import 'package:flutter/material.dart';
import 'package:shadcn_flutter/shadcn_flutter.dart';
import 'package:spotube/theme/spotify_colors.dart';
import 'package:spotube/theme/spotify_typography.dart';
class SpotifyTheme {
static ThemeData materialTheme(BuildContext context) {
final textTheme = SpotifyTypography.buildTextTheme(context);
return ThemeData(
useMaterial3: true,
brightness: Brightness.dark,
scaffoldBackgroundColor: SpotifyColors.background,
backgroundColor: SpotifyColors.background,
cardColor: SpotifyColors.surface,
dividerColor: SpotifyColors.separator,
primaryColor: SpotifyColors.spotifyGreen,
indicatorColor: SpotifyColors.spotifyGreen,
focusColor: SpotifyColors.spotifyGreen,
hoverColor: SpotifyColors.hover,
highlightColor: SpotifyColors.hover.withValues(alpha: 0.1),
splashColor: Colors.transparent,
canvasColor: SpotifyColors.background,
textTheme: textTheme,
primaryTextTheme: textTheme,
iconTheme: const IconThemeData(
color: SpotifyColors.primaryText,
size: 20,
),
primaryIconTheme: const IconThemeData(
color: SpotifyColors.primaryText,
),
dividerTheme: const DividerThemeData(
color: SpotifyColors.separator,
space: 1,
thickness: 1,
),
pageTransitionsTheme: const PageTransitionsTheme(
builders: {
TargetPlatform.android: ZoomPageTransitionsBuilder(),
TargetPlatform.iOS: ZoomPageTransitionsBuilder(),
TargetPlatform.macOS: ZoomPageTransitionsBuilder(),
TargetPlatform.linux: ZoomPageTransitionsBuilder(),
TargetPlatform.windows: ZoomPageTransitionsBuilder(),
},
),
listTileTheme: const ListTileThemeData(
dense: true,
contentPadding: EdgeInsets.symmetric(horizontal: 16),
selectedTileColor: SpotifyColors.hover,
selectedColor: SpotifyColors.primaryText,
unselectedColor: SpotifyColors.secondaryText,
iconColor: SpotifyColors.secondaryText,
),
inputDecorationTheme: InputDecorationTheme(
filled: true,
fillColor: SpotifyColors.surface,
border: OutlineInputBorder(
borderRadius: BorderRadius.circular(4),
borderSide: const BorderSide(color: SpotifyColors.hover),
),
enabledBorder: OutlineInputBorder(
borderRadius: BorderRadius.circular(4),
borderSide: const BorderSide(color: SpotifyColors.hover),
),
focusedBorder: OutlineInputBorder(
borderRadius: BorderRadius.circular(4),
borderSide: const BorderSide(color: SpotifyColors.spotifyGreen),
),
hintStyle: textTheme.bodySmall?.copyWith(
color: SpotifyColors.disabledText,
),
),
);
}
static ShadcnThemeData shadcnTheme() {
return const ShadcnThemeData(
radius: 0.125,
iconTheme: IconThemeProperties(),
colorScheme: LegacyColorSchemes.darkSlate(),
surfaceOpacity: 0,
surfaceBlur: 0,
);
}
}