import 'package:flutter/material.dart'; import 'package:shadcn_ui/shadcn_ui.dart'; import '../theme/app_text.dart'; import '../theme/spacing.dart'; Future showLoginRequiredDialog( BuildContext context, { required String title, required String description, String cancelLabel = '取消', String confirmLabel = '去登录', }) { final cs = ShadTheme.of(context).colorScheme; return showModalBottomSheet( context: context, isScrollControlled: true, backgroundColor: Colors.transparent, barrierColor: Colors.black.withValues(alpha: 0.5), builder: (ctx) => Container( width: double.infinity, decoration: BoxDecoration( color: cs.background, borderRadius: const BorderRadius.only( topLeft: Radius.circular(Spacing.radiusCard), topRight: Radius.circular(Spacing.radiusCard), ), border: Border.all(color: cs.border), ), padding: const EdgeInsets.fromLTRB(20, 12, 20, 20), child: SafeArea( top: false, child: Column( mainAxisSize: MainAxisSize.min, crossAxisAlignment: CrossAxisAlignment.start, children: [ Center( child: Container( width: 38, height: 4, margin: const EdgeInsets.only(bottom: 16), decoration: BoxDecoration( color: cs.border, borderRadius: BorderRadius.circular(9999), ), ), ), Text( title, style: TextStyle( fontSize: 19, fontWeight: FontWeight.w700, color: cs.foreground, ), ), const SizedBox(height: 8), Text( description, style: AppText.body.copyWith( fontSize: 13, height: 1.6, color: cs.mutedForeground, ), ), const SizedBox(height: 22), _LoginSheetButton( label: confirmLabel, primary: true, onTap: () => Navigator.of(ctx).pop(true), ), const SizedBox(height: 12), _LoginSheetButton( label: cancelLabel, primary: false, onTap: () => Navigator.of(ctx).pop(false), ), ], ), ), ), ); } class _LoginSheetButton extends StatelessWidget { const _LoginSheetButton({ required this.label, required this.primary, required this.onTap, }); final String label; final bool primary; final VoidCallback onTap; @override Widget build(BuildContext context) { final cs = ShadTheme.of(context).colorScheme; return GestureDetector( onTap: onTap, behavior: HitTestBehavior.opaque, child: Container( width: double.infinity, height: 52, alignment: Alignment.center, decoration: BoxDecoration( color: primary ? cs.primary : cs.secondary, borderRadius: BorderRadius.circular(12), border: primary ? null : Border.all(color: cs.border), ), child: Text( label, style: TextStyle( fontSize: 16, fontWeight: FontWeight.w600, color: primary ? cs.primaryForeground : cs.foreground, ), ), ), ); } }