From 31b2de2e46049e319bb732db811e2d12551f1faf Mon Sep 17 00:00:00 2001 From: LittleSheep Date: Sun, 17 Aug 2025 13:35:03 +0800 Subject: [PATCH] :lipstick: Update styling of realm list --- lib/screens/realm/realms.dart | 34 ++++-------- lib/widgets/realm/realm_list_tile.dart | 74 ++++++++++++++++++++++++++ 2 files changed, 85 insertions(+), 23 deletions(-) create mode 100644 lib/widgets/realm/realm_list_tile.dart diff --git a/lib/screens/realm/realms.dart b/lib/screens/realm/realms.dart index a6d74538..18b72689 100644 --- a/lib/screens/realm/realms.dart +++ b/lib/screens/realm/realms.dart @@ -22,6 +22,7 @@ import 'package:island/screens/tabs.dart'; import 'package:material_symbols_icons/symbols.dart'; import 'package:riverpod_annotation/riverpod_annotation.dart'; import 'package:styled_widget/styled_widget.dart'; +import 'package:island/widgets/realm/realm_list_tile.dart'; part 'realms.g.dart'; @@ -95,32 +96,19 @@ class RealmListScreen extends HookConsumerWidget { (value) => Column( children: [ Expanded( - child: ListView.builder( - padding: getTabbedPadding(context), + child: ListView.separated( + padding: EdgeInsets.only( + top: 8, + bottom: getTabbedPadding(context).bottom + 8, + ), itemCount: value.length, itemBuilder: (context, item) { - return ListTile( - isThreeLine: true, - leading: ProfilePictureWidget( - fileId: value[item].picture?.id, - fallbackIcon: Symbols.group, - ), - title: Text(value[item].name), - subtitle: Text(value[item].description), - onTap: () { - context.pushNamed( - 'realmDetail', - pathParameters: {'slug': value[item].slug}, - ); - }, - contentPadding: const EdgeInsets.only( - left: 16, - right: 14, - top: 8, - bottom: 8, - ), - ); + return ConstrainedBox( + constraints: const BoxConstraints(maxWidth: 540), + child: RealmListTile(realm: value[item]), + ).center(); }, + separatorBuilder: (_, _) => const Gap(8), ), ), ], diff --git a/lib/widgets/realm/realm_list_tile.dart b/lib/widgets/realm/realm_list_tile.dart new file mode 100644 index 00000000..29599bb7 --- /dev/null +++ b/lib/widgets/realm/realm_list_tile.dart @@ -0,0 +1,74 @@ +import 'package:flutter/material.dart'; +import 'package:gap/gap.dart'; +import 'package:go_router/go_router.dart'; +import 'package:island/models/realm.dart'; +import 'package:island/widgets/content/cloud_files.dart'; +import 'package:material_symbols_icons/symbols.dart'; +import 'package:styled_widget/styled_widget.dart'; + +class RealmListTile extends StatelessWidget { + const RealmListTile({super.key, required this.realm}); + + final SnRealm realm; + + @override + Widget build(BuildContext context) { + return Card( + margin: EdgeInsets.zero, + child: InkWell( + borderRadius: const BorderRadius.all(Radius.circular(8)), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + AspectRatio( + aspectRatio: 16 / 7, + child: Stack( + clipBehavior: Clip.none, + fit: StackFit.expand, + children: [ + ClipRRect( + borderRadius: const BorderRadius.all(Radius.circular(8)), + child: Container( + color: Theme.of(context).colorScheme.surfaceContainer, + child: + realm.background == null + ? const SizedBox.shrink() + : CloudImageWidget(file: realm.background), + ), + ), + Positioned( + bottom: -30, + left: 18, + child: ProfilePictureWidget( + fileId: realm.picture?.id, + fallbackIcon: Symbols.group, + radius: 24, + ), + ), + ], + ), + ), + const Gap(20 + 12), + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + realm.name, + ).textStyle(Theme.of(context).textTheme.titleMedium!), + Text( + realm.description, + ).textStyle(Theme.of(context).textTheme.bodySmall!), + ], + ).padding(horizontal: 24, bottom: 14), + ], + ), + onTap: () { + context.pushNamed( + 'realmDetail', + pathParameters: {'slug': realm.slug}, + ); + }, + ), + ); + } +}