diff --git a/devtools_options.yaml b/devtools_options.yaml new file mode 100644 index 0000000..fa0b357 --- /dev/null +++ b/devtools_options.yaml @@ -0,0 +1,3 @@ +description: This file stores settings for Dart & Flutter DevTools. +documentation: https://docs.flutter.dev/tools/devtools/extensions#configure-extension-enablement-states +extensions: diff --git a/lib/domain/2024/qa_type.dart b/lib/domain/2024/qa_type.dart index c8d47de..cb808f7 100644 --- a/lib/domain/2024/qa_type.dart +++ b/lib/domain/2024/qa_type.dart @@ -2,7 +2,7 @@ enum QAType { translation( question: '英語が得意ではないのですが、日本語への翻訳はございますか?', answer: - '日本語字幕を生成AIでリアルタイム生成した映像へのリンクを提供し、必要な方はご自身のPCで見れるようにする方向性で調整中です。ただ、通信と翻訳のレイテンシを踏まえるとラグが10秒程度発生すると考えられます。あくまでも補助的な位置付けとお考えください。', + '日本語字幕を生成AIでリアルタイム生成した映像をモニターに投影する予定です。', ), live( question: 'Do you have live streaming?', diff --git a/lib/domain/sponsor_type.dart b/lib/domain/sponsor_type.dart index f3c204a..a096306 100644 --- a/lib/domain/sponsor_type.dart +++ b/lib/domain/sponsor_type.dart @@ -68,6 +68,16 @@ enum SilverSponsorType { url: 'https://flutterflow.io/', logoAssetName: 'resources/images/flutterflow.png', ), + mercari( + name: 'mercari', + url: 'https://about.mercari.com/', + logoAssetName: 'resources/images/mercari.png', + ), + dcm( + name: 'DCM', + url: 'https://dcm.dev', + logoAssetName: 'resources/images/dcm.png', + ), ; const SilverSponsorType({ @@ -81,6 +91,26 @@ enum SilverSponsorType { final String logoAssetName; } +enum AppSponsorType { + nekologic( + name: 'Nekologic', + url: 'https://neko-logic.com', + logoAssetName: 'resources/images/nekologic.png', + ), + ; + + const AppSponsorType({ + required this.name, + required this.url, + required this.logoAssetName, + }); + + final String name; + final String url; + final String logoAssetName; +} + + enum CommunitySponsorType { ibj( name: 'IBJ', @@ -92,6 +122,11 @@ enum CommunitySponsorType { url: 'https://twitter.com/blendthink', logoAssetName: 'resources/images/blendthink.png', ), + shorebird( + name: 'shorebird', + url: 'https://shorebird.dev/', + logoAssetName: 'resources/images/shorebird.png', + ), ; const CommunitySponsorType({ diff --git a/lib/presentation/lp_page.dart b/lib/presentation/lp_page.dart index fefa26d..3d7e83b 100644 --- a/lib/presentation/lp_page.dart +++ b/lib/presentation/lp_page.dart @@ -8,6 +8,7 @@ import 'lp_header_appbar.dart'; import 'lp_model.dart'; import 'lp_organizers_widget.dart'; import 'lp_outline_widget.dart'; +import 'lp_qa_widget.dart'; import 'lp_schedule_widget.dart'; import 'lp_speakers_widget.dart'; import 'lp_sponsors_widget.dart'; @@ -41,8 +42,8 @@ class LPPage extends StatelessWidget { const SpeakersWidget(), const SponsorsWidget(), const VenueWidget(), + const QAWidget(), const About2024Widget(), - //QAWidget(), const OrganizersWidget(), FooterWidget(isMobile: model.isMobile), ], diff --git a/lib/presentation/lp_sponsors_widget.dart b/lib/presentation/lp_sponsors_widget.dart index b455492..8c23bf2 100644 --- a/lib/presentation/lp_sponsors_widget.dart +++ b/lib/presentation/lp_sponsors_widget.dart @@ -28,10 +28,10 @@ class SponsorsWidget extends StatelessWidget { SelectableText( 'Gold', style: Theme.of(context).textTheme.displayLarge?.copyWith( - fontSize: isMobile ? 28 : 56, - height: 1, - color: AppColor.primaryYellowColor, - ), + fontSize: isMobile ? 28 : 56, + height: 1, + color: AppColor.primaryYellowColor, + ), ), SizedBox(height: isMobile ? 16 : 24), GridView.count( @@ -64,14 +64,29 @@ class SponsorsWidget extends StatelessWidget { .map((sponsor) => SilverSponsorItemWidget(type: sponsor)) .toList(), ), + SizedBox(height: isMobile ? 80 : 90), + SelectableText( + 'App Sponsor', + style: Theme.of(context).textTheme.displayLarge?.copyWith( + fontSize: isMobile ? 28 : 56, + height: 1, + color: Colors.white, + ), + ), + SizedBox(height: isMobile ? 16 : 24), + SizedBox( + width: isMobile ? 120 : 270, + height: isMobile ? 120 : 270, + child: const AppSponsorItemWidget(type: AppSponsorType.nekologic), + ), const SizedBox(height: 80), SelectableText( 'Community', style: Theme.of(context).textTheme.displayLarge?.copyWith( - fontSize: isMobile ? 28 : 56, - height: 1, - color: Colors.white, - ), + fontSize: isMobile ? 28 : 56, + height: 1, + color: Colors.white, + ), ), SizedBox(height: isMobile ? 16 : 24), GridView.count( @@ -89,20 +104,20 @@ class SponsorsWidget extends StatelessWidget { SelectableText( 'We\'re looking for sponsors!', style: Theme.of(context).textTheme.displayLarge?.copyWith( - fontSize: isMobile ? 28 : 56, - height: 1, - color: Colors.white, - ), + fontSize: isMobile ? 28 : 56, + height: 1, + color: Colors.white, + ), ), SizedBox(height: isMobile ? 16 : 24), SelectableText( 'Support FlutterNinjas in a way that suits you.\n' - 'Community Sponsorship offers logo display only, while higher tiers come with additional benefits.\n' - 'You can complete your Community Sponsorship online now. For Silver or higher, please contact us for details.', + 'Community Sponsorship offers logo display only, while higher tiers come with additional benefits.\n' + 'You can complete your Community Sponsorship online now. For Silver or higher, please contact us for details.', style: Theme.of(context).textTheme.titleMedium!.copyWith( - color: Colors.white, - fontWeight: FontWeight.normal, - ), + color: Colors.white, + fontWeight: FontWeight.normal, + ), textAlign: TextAlign.center, ), const SizedBox(height: 16), @@ -204,6 +219,31 @@ class SilverSponsorItemWidget extends StatelessWidget { } } +class AppSponsorItemWidget extends StatelessWidget { + const AppSponsorItemWidget({ + super.key, + required this.type, + }); + final AppSponsorType type; + + @override + Widget build(BuildContext context) { + final isMobile = context.watch().isMobile; + + return InkWell( + onTap: () { + launchUrlString(type.url); + }, + child: Padding( + padding: EdgeInsets.all(isMobile ? 8 : 40), + child: Image.asset( + type.logoAssetName, + ), + ), + ); + } +} + class CommunitySponsorItemWidget extends StatelessWidget { const CommunitySponsorItemWidget({ super.key, @@ -227,4 +267,4 @@ class CommunitySponsorItemWidget extends StatelessWidget { ), ); } -} \ No newline at end of file +} diff --git a/lib/presentation/lp_tickets_widget.dart b/lib/presentation/lp_tickets_widget.dart index 5b2d32d..975a4fe 100644 --- a/lib/presentation/lp_tickets_widget.dart +++ b/lib/presentation/lp_tickets_widget.dart @@ -25,30 +25,17 @@ class TicketsWidget extends StatelessWidget { ), const SizedBox(height: 16), SelectableText( - 'The ticket contains\n・2 days of FlutterNinjas💻\n・Asking the speakers🙋‍️\n・Coffee and some drinks☕️\n・Lunch for 2 days🍙\n・Dinner for 2nd day🥘\n・Pre-party🥳 \n・Slack community💬\n・Might get some special gifts🎁\n\nThe earlier you buy, the more you save.', + 'The ticket contains\n・2 days of FlutterNinjas💻\n・Asking the speakers🙋‍️\n・Coffee and some drinks☕️\n・Lunch for 2 days🍙\n・Dinner for 2nd day🥘\n・Pre-party🥳 \n・Slack community💬\n・Might get some special gifts🎁', style: Theme.of(context).textTheme.titleMedium!.copyWith( color: Colors.white, ), ), const SizedBox(height: 32), - isMobile - ? const Column( - children: [ - Regular(), - SizedBox(height: 32), - LateBird(), - ], - ) - : const Row( - children: [ - Expanded( - child: Regular(), - ), - Expanded( - child: LateBird(), - ), - ], - ), + const SizedBox( + width: 300, + child: LateBird(), + ), + ], ), ); diff --git a/lib/presentation/lp_venue_widget.dart b/lib/presentation/lp_venue_widget.dart index 8ec20d4..7cf24a1 100644 --- a/lib/presentation/lp_venue_widget.dart +++ b/lib/presentation/lp_venue_widget.dart @@ -86,24 +86,113 @@ class VenueWidget extends StatelessWidget { ) ], ), - // const SizedBox(height: 80), - // SelectableText( - // 'Floor Map', - // style: Theme.of(context).textTheme.displayLarge?.copyWith( - // fontSize: isMobile ? 28 : 56, - // height: 1, - // color: Colors.white, - // ), - // ), - // const SizedBox( - // height: 16, - // ), - // Image.asset( - // 'resources/images/floor_map.png', - // fit: BoxFit.cover, - // ), + const SizedBox(height: 40), + SelectableText( + 'Floor Map', + style: Theme.of(context).textTheme.displayLarge?.copyWith( + fontSize: isMobile ? 28 : 56, + height: 1, + color: Colors.white, + ), + ), + const SizedBox( + height: 16, + ), + Image.asset( + 'resources/images/floor_map_2025.png', + fit: BoxFit.cover, + ), + const SizedBox(height: 40), + SelectableText( + 'Entertainment', + style: Theme.of(context).textTheme.displayLarge?.copyWith( + fontSize: isMobile ? 28 : 56, + height: 1, + color: Colors.white, + ), + ), + const SizedBox( + height: 16, + ), + Text('We have some entertainment for you!', + style: Theme.of(context).textTheme.titleMedium!.copyWith( + color: Colors.white, + fontWeight: FontWeight.normal, + ), + textAlign: TextAlign.center, + ), + const SizedBox( + height: 40, + ), + const Wrap( + alignment: WrapAlignment.center, + spacing: 24, + runSpacing: 24, + children: [ + EntertainmentWidget( + imageName: 'resources/images/nailist_kyoro.jpg', + title: 'Nail artist KYORO', + ), + EntertainmentWidget( + imageName: 'resources/images/dj_nissei.jpg', + title: 'DJ 日聖', + ), + EntertainmentWidget( + imageName: 'resources/images/flutter_quiz.png', + title: 'Flutter Quiz', + ), + EntertainmentWidget( + imageName: 'resources/images/boardgame.jpg', + title: 'Boardgame', + ), + EntertainmentWidget( + imageName: 'resources/images/snack.jpg', + title: 'Snack & Coffee', + ), + EntertainmentWidget( + imageName: 'resources/images/oden.png', + title: 'ODEN', + ), + ], + ), ], ), ); } } + +class EntertainmentWidget extends StatelessWidget { + const EntertainmentWidget({ + super.key, + required this.imageName, + required this.title, + }); + + final String imageName; + final String title; + + @override + Widget build(BuildContext context) { + return Column( + children: [ + Image.asset( + imageName, + fit: BoxFit.cover, + width: 110, + height: 110, + ), + const SizedBox( + height: 8, + ), + Text(title, + style: Theme.of(context).textTheme.titleMedium!.copyWith( + color: Colors.white, + fontWeight: FontWeight.normal, + fontSize: 12, + ), + textAlign: TextAlign.center, + ), + ], + ); + } +} diff --git a/resources/images/boardgame.jpg b/resources/images/boardgame.jpg new file mode 100644 index 0000000..fce869c Binary files /dev/null and b/resources/images/boardgame.jpg differ diff --git a/resources/images/dj_nissei.jpg b/resources/images/dj_nissei.jpg new file mode 100644 index 0000000..060f279 Binary files /dev/null and b/resources/images/dj_nissei.jpg differ diff --git a/resources/images/floor_map_2025.png b/resources/images/floor_map_2025.png new file mode 100644 index 0000000..dff6ab8 Binary files /dev/null and b/resources/images/floor_map_2025.png differ diff --git a/resources/images/flutter_quiz.png b/resources/images/flutter_quiz.png new file mode 100644 index 0000000..00dc6b6 Binary files /dev/null and b/resources/images/flutter_quiz.png differ diff --git a/resources/images/mercari.png b/resources/images/mercari.png new file mode 100644 index 0000000..ebb03c5 Binary files /dev/null and b/resources/images/mercari.png differ diff --git a/resources/images/nailist_kyoro.jpg b/resources/images/nailist_kyoro.jpg new file mode 100644 index 0000000..189efd9 Binary files /dev/null and b/resources/images/nailist_kyoro.jpg differ diff --git a/resources/images/nekologic.png b/resources/images/nekologic.png new file mode 100644 index 0000000..abdc3cc Binary files /dev/null and b/resources/images/nekologic.png differ diff --git a/resources/images/oden.png b/resources/images/oden.png new file mode 100644 index 0000000..47192c3 Binary files /dev/null and b/resources/images/oden.png differ diff --git a/resources/images/revenuecat.png b/resources/images/revenuecat.png index 74e679e..ea1a6f3 100644 Binary files a/resources/images/revenuecat.png and b/resources/images/revenuecat.png differ diff --git a/resources/images/shorebird.png b/resources/images/shorebird.png new file mode 100644 index 0000000..bf4f819 Binary files /dev/null and b/resources/images/shorebird.png differ diff --git a/resources/images/snack.jpg b/resources/images/snack.jpg new file mode 100644 index 0000000..8b3b895 Binary files /dev/null and b/resources/images/snack.jpg differ