Music Creation Page: - Vinyl 3D flip to view lyrics, tonearm animation, glow rotation effect - Circular SVG progress ring, speech bubble feedback, confirm dialog - Playlist modal, free creation input, lyrics formatting optimization - MiniMax API real music generation with SSE streaming progress Backend: - FastAPI proxy server.py for MiniMax API calls - Music + lyrics file persistence to Capybara music/ directory - GET /api/playlist endpoint for auto-building playlist from files UI/UX Refinements: - frontend-design skill compliance across all pages - Glassmorphism effects, modal interactions, scroll tap prevention - iPhone 12 Pro responsive layout (390x844) Flutter Development Preparation: - Installed flutter-expert skill with 6 reference docs - Added 5 Cursor Rules: official Flutter, clean architecture, UI performance, testing, Dart standards Assets: - 9 Capybara music MP3 files + lyrics TXT files - MiniMax API documentation Co-authored-by: Cursor <cursoragent@cursor.com>
119 lines
2.7 KiB
Markdown
119 lines
2.7 KiB
Markdown
# Project Structure
|
|
|
|
## Feature-Based Structure
|
|
|
|
```
|
|
lib/
|
|
├── main.dart
|
|
├── app.dart
|
|
├── core/
|
|
│ ├── constants/
|
|
│ │ ├── colors.dart
|
|
│ │ └── strings.dart
|
|
│ ├── theme/
|
|
│ │ ├── app_theme.dart
|
|
│ │ └── text_styles.dart
|
|
│ ├── utils/
|
|
│ │ ├── extensions.dart
|
|
│ │ └── validators.dart
|
|
│ └── errors/
|
|
│ └── failures.dart
|
|
├── features/
|
|
│ ├── auth/
|
|
│ │ ├── data/
|
|
│ │ │ ├── repositories/
|
|
│ │ │ └── datasources/
|
|
│ │ ├── domain/
|
|
│ │ │ ├── entities/
|
|
│ │ │ └── usecases/
|
|
│ │ ├── presentation/
|
|
│ │ │ ├── screens/
|
|
│ │ │ └── widgets/
|
|
│ │ └── providers/
|
|
│ │ └── auth_provider.dart
|
|
│ └── home/
|
|
│ ├── data/
|
|
│ ├── domain/
|
|
│ ├── presentation/
|
|
│ └── providers/
|
|
├── shared/
|
|
│ ├── widgets/
|
|
│ │ ├── buttons/
|
|
│ │ ├── inputs/
|
|
│ │ └── cards/
|
|
│ ├── services/
|
|
│ │ ├── api_service.dart
|
|
│ │ └── storage_service.dart
|
|
│ └── models/
|
|
│ └── user.dart
|
|
└── routes/
|
|
└── app_router.dart
|
|
```
|
|
|
|
## pubspec.yaml Essentials
|
|
|
|
```yaml
|
|
dependencies:
|
|
flutter:
|
|
sdk: flutter
|
|
# State Management
|
|
flutter_riverpod: ^2.5.0
|
|
riverpod_annotation: ^2.3.0
|
|
# Navigation
|
|
go_router: ^14.0.0
|
|
# Networking
|
|
dio: ^5.4.0
|
|
# Code Generation
|
|
freezed_annotation: ^2.4.0
|
|
json_annotation: ^4.8.0
|
|
# Storage
|
|
shared_preferences: ^2.2.0
|
|
hive_flutter: ^1.1.0
|
|
|
|
dev_dependencies:
|
|
flutter_test:
|
|
sdk: flutter
|
|
build_runner: ^2.4.0
|
|
riverpod_generator: ^2.4.0
|
|
freezed: ^2.5.0
|
|
json_serializable: ^6.8.0
|
|
flutter_lints: ^4.0.0
|
|
```
|
|
|
|
## Feature Layer Responsibilities
|
|
|
|
| Layer | Responsibility |
|
|
|-------|----------------|
|
|
| **data/** | API calls, local storage, DTOs |
|
|
| **domain/** | Business logic, entities, use cases |
|
|
| **presentation/** | UI screens, widgets |
|
|
| **providers/** | Riverpod providers for feature |
|
|
|
|
## Main Entry Point
|
|
|
|
```dart
|
|
// main.dart
|
|
void main() async {
|
|
WidgetsFlutterBinding.ensureInitialized();
|
|
await Hive.initFlutter();
|
|
runApp(const ProviderScope(child: MyApp()));
|
|
}
|
|
|
|
// app.dart
|
|
class MyApp extends ConsumerWidget {
|
|
const MyApp({super.key});
|
|
|
|
@override
|
|
Widget build(BuildContext context, WidgetRef ref) {
|
|
final router = ref.watch(routerProvider);
|
|
|
|
return MaterialApp.router(
|
|
routerConfig: router,
|
|
theme: AppTheme.light,
|
|
darkTheme: AppTheme.dark,
|
|
themeMode: ThemeMode.system,
|
|
);
|
|
}
|
|
}
|
|
```
|