Scaffold Block Seasons Flutter app

flutter create (com.airkjw.blockseasons, iOS+Android), Riverpod,
shared_preferences, audioplayers, gen-l10n EN/KO wiring, app shell
with Home -> Game placeholder.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
2026-06-11 12:55:59 +09:00
commit 40528238b2
73 changed files with 2520 additions and 0 deletions
+32
View File
@@ -0,0 +1,32 @@
import 'package:flutter/material.dart';
import 'package:flutter_localizations/flutter_localizations.dart';
import 'l10n/gen/app_localizations.dart';
import 'ui/screens/home_screen.dart';
class BlockSeasonsApp extends StatelessWidget {
const BlockSeasonsApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
onGenerateTitle: (context) => AppLocalizations.of(context)!.appTitle,
debugShowCheckedModeBanner: false,
localizationsDelegates: const [
AppLocalizations.delegate,
GlobalMaterialLocalizations.delegate,
GlobalWidgetsLocalizations.delegate,
GlobalCupertinoLocalizations.delegate,
],
supportedLocales: const [Locale('en'), Locale('ko')],
theme: ThemeData(
colorScheme: ColorScheme.fromSeed(
seedColor: const Color(0xFF5B7FFF),
brightness: Brightness.dark,
),
useMaterial3: true,
),
home: const HomeScreen(),
);
}
}
+7
View File
@@ -0,0 +1,7 @@
{
"@@locale": "en",
"appTitle": "Block Seasons",
"play": "Play",
"settings": "Settings",
"comingSoon": "Coming soon"
}
+7
View File
@@ -0,0 +1,7 @@
{
"@@locale": "ko",
"appTitle": "블록 시즌즈",
"play": "플레이",
"settings": "설정",
"comingSoon": "준비 중"
}
+9
View File
@@ -0,0 +1,9 @@
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'app.dart';
void main() {
WidgetsFlutterBinding.ensureInitialized();
runApp(const ProviderScope(child: BlockSeasonsApp()));
}
+17
View File
@@ -0,0 +1,17 @@
import 'package:flutter/material.dart';
import '../../l10n/gen/app_localizations.dart';
/// Placeholder until the board UI lands in Phase 2.
class GameScreen extends StatelessWidget {
const GameScreen({super.key});
@override
Widget build(BuildContext context) {
final l10n = AppLocalizations.of(context)!;
return Scaffold(
appBar: AppBar(title: Text(l10n.appTitle)),
body: Center(child: Text(l10n.comingSoon)),
);
}
}
+48
View File
@@ -0,0 +1,48 @@
import 'package:flutter/material.dart';
import '../../l10n/gen/app_localizations.dart';
import 'game_screen.dart';
class HomeScreen extends StatelessWidget {
const HomeScreen({super.key});
@override
Widget build(BuildContext context) {
final l10n = AppLocalizations.of(context)!;
return Scaffold(
body: SafeArea(
child: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text(
l10n.appTitle,
style: Theme.of(context).textTheme.displaySmall?.copyWith(
fontWeight: FontWeight.bold,
),
),
const SizedBox(height: 48),
FilledButton(
style: FilledButton.styleFrom(
padding: const EdgeInsets.symmetric(
horizontal: 48,
vertical: 16,
),
textStyle: Theme.of(context).textTheme.titleLarge,
),
onPressed: () {
Navigator.of(context).push(
MaterialPageRoute(
builder: (_) => const GameScreen(),
),
);
},
child: Text(l10n.play),
),
],
),
),
),
);
}
}