mnemo_cards/mnemo_cards_web_v2/lib/utils/responsive.dart
2025-11-11 02:55:41 +03:00

65 lines
1.7 KiB
Dart

import 'package:flutter/material.dart';
/// Responsive utilities for different screen sizes
class Responsive {
/// Mobile: < 600px
static bool isMobile(BuildContext context) =>
MediaQuery.of(context).size.width < 600;
/// Tablet: 600px - 1200px
static bool isTablet(BuildContext context) =>
MediaQuery.of(context).size.width >= 600 &&
MediaQuery.of(context).size.width < 1200;
/// Desktop: >= 1200px
static bool isDesktop(BuildContext context) =>
MediaQuery.of(context).size.width >= 1200;
/// Get maximum content width based on screen size
static double getMaxWidth(BuildContext context) {
if (isDesktop(context)) return 1200;
if (isTablet(context)) return 900;
return double.infinity;
}
/// Get grid cross axis count based on screen size
static int getGridCrossAxisCount(BuildContext context) {
if (isDesktop(context)) return 4;
if (isTablet(context)) return 3;
return 2;
}
/// Get responsive padding
static EdgeInsets getPagePadding(BuildContext context) {
if (isDesktop(context)) {
return const EdgeInsets.symmetric(horizontal: 32, vertical: 24);
}
if (isTablet(context)) {
return const EdgeInsets.symmetric(horizontal: 24, vertical: 16);
}
return const EdgeInsets.all(16);
}
}
/// Widget that constrains content width for better readability on large screens
class ResponsiveCenter extends StatelessWidget {
const ResponsiveCenter({
required this.child,
super.key,
});
final Widget child;
@override
Widget build(BuildContext context) {
return Center(
child: ConstrainedBox(
constraints: BoxConstraints(
maxWidth: Responsive.getMaxWidth(context),
),
child: child,
),
);
}
}