Files
mih_package_toolkit/lib/src/mih_package_tool_body.dart
2026-03-20 09:35:49 +02:00

135 lines
4.1 KiB
Dart

import 'package:flutter/material.dart';
import 'package:mih_package_toolkit/src/mih_colors.dart';
/// A structural container for individual pages within a [MihPackage].
///
/// [MihPackageToolBody] acts as the primary wrapper for page content. It
/// provides consistent layout rules, including:
/// * **Responsive Padding**: Automatically adjusts horizontal and vertical
/// spacing based on screen size and the presence of a border.
/// * **Optional Framing**: Can display a rounded border using [borderOn].
/// * **Theme Integration**: Border and background colors sync with [MihColors].
///
/// This widget is typically used as an item in the `appBody` list of a [MihPackage].
///
/// ### Example:
/// ```dart
/// MihPackageToolBody(
/// backgroundColor: Colors.white,
/// borderOn: true,
/// borderColor: Colors.blue,
/// bodyItem: Center(child: Text("Page Content")),
/// )
/// ```
class MihPackageToolBody extends StatefulWidget {
/// The background color of the content area.
final Color backgroundColor;
/// The color of the outer border. Defaults to [MihColors.secondary] if null.
final Color? borderColor;
/// Whether to display a 3.0 width rounded border around the content.
final bool? borderOn;
/// The main widget to be displayed inside this body container.
final Widget bodyItem;
/// Custom horizontal padding. Defaults to 10.0 if [borderOn] is true,
/// otherwise 0.0.
final double? innerHorizontalPadding;
/// Whether to use Dark Mode styling for default border colors.
final bool? darkMode;
const MihPackageToolBody({
super.key,
required this.backgroundColor,
this.borderColor,
this.borderOn,
required this.bodyItem,
this.darkMode,
this.innerHorizontalPadding,
});
@override
State<MihPackageToolBody> createState() => _MihPackageToolBodyState();
}
class _MihPackageToolBodyState extends State<MihPackageToolBody> {
/// Internal padding value calculated based on the border state.
late double _innerBodyPadding;
/// Calculates horizontal padding based on [MediaQuery] and [widget.borderOn].
double getHorizontalPaddingSize(Size screenSize) {
if (screenSize.width > 800) {
if (widget.borderOn != null && widget.borderOn!) {
return widget.innerHorizontalPadding ?? 10;
} else {
return widget.innerHorizontalPadding ?? 0;
}
} else {
// mobile
if (widget.borderOn != null && widget.borderOn!) {
return widget.innerHorizontalPadding ?? 10;
} else {
return widget.innerHorizontalPadding ?? 0;
}
}
}
/// Calculates vertical padding (bottom only) when a border is active.
double getVerticalPaddingSize(Size screenSize) {
// mobile
if (widget.borderOn != null && widget.borderOn!) {
return 10;
} else {
return 0;
}
}
/// Generates the [BoxDecoration] for the container, handling border
/// visibility and color.
Decoration? getBoder() {
if (widget.borderOn != null && widget.borderOn!) {
_innerBodyPadding = 10.0;
return BoxDecoration(
color: widget.backgroundColor,
borderRadius: BorderRadius.circular(25.0),
border: Border.all(
color: widget.borderColor ??
MihColors.secondary(darkMode: widget.darkMode),
width: 3.0,
),
);
} else {
_innerBodyPadding = 0.0;
return BoxDecoration(
color: widget.backgroundColor,
borderRadius: BorderRadius.circular(0),
border: Border.all(color: widget.backgroundColor, width: 3.0),
);
}
}
@override
Widget build(BuildContext context) {
Size screenSize = MediaQuery.sizeOf(context);
return Padding(
padding: EdgeInsets.only(
left: getHorizontalPaddingSize(screenSize),
right: getHorizontalPaddingSize(screenSize),
bottom: getVerticalPaddingSize(screenSize),
top: 0,
),
child: Container(
height: screenSize.height,
decoration: getBoder(),
child: Padding(
padding: EdgeInsets.all(_innerBodyPadding),
child: widget.bodyItem,
),
),
);
}
}