171 lines
5.5 KiB
Dart
171 lines
5.5 KiB
Dart
part of 'image.dart';
|
|
|
|
class ImagePlaceholder extends StatelessWidget {
|
|
const ImagePlaceholder({
|
|
super.key,
|
|
this.width,
|
|
this.height,
|
|
this.showBorderRadius = true,
|
|
this.backgroundColor,
|
|
});
|
|
|
|
final double? width;
|
|
final double? height;
|
|
final bool showBorderRadius;
|
|
final Color? backgroundColor;
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
return LayoutBuilder(
|
|
builder: (context, constraints) {
|
|
// Determine the size based on available space or provided dimensions
|
|
final containerWidth = width ?? constraints.maxWidth;
|
|
final containerHeight = height ?? constraints.maxHeight;
|
|
|
|
// Calculate the minimum dimension to determine if we should show simple or detailed version
|
|
final minDimension = math.min(
|
|
containerWidth == double.infinity ? containerHeight : containerWidth,
|
|
containerHeight == double.infinity ? containerWidth : containerHeight,
|
|
);
|
|
|
|
return Container(
|
|
width: containerWidth == double.infinity
|
|
? double.infinity
|
|
: containerWidth,
|
|
height: containerHeight == double.infinity ? null : containerHeight,
|
|
decoration: BoxDecoration(
|
|
color: backgroundColor ?? const Color(0x4DD9D9D9),
|
|
borderRadius: showBorderRadius
|
|
? const BorderRadius.only(
|
|
bottomLeft: Radius.circular(20),
|
|
bottomRight: Radius.circular(20),
|
|
)
|
|
: null,
|
|
),
|
|
child: Center(
|
|
child: minDimension < 150
|
|
? _buildSimpleVersion(minDimension)
|
|
: _buildDetailedVersion(minDimension),
|
|
),
|
|
);
|
|
},
|
|
);
|
|
}
|
|
|
|
// Simple version for small sizes (< 100px)
|
|
Widget _buildSimpleVersion(double size) {
|
|
final iconSize = (size * 0.4).clamp(16.0, 32.0);
|
|
final fontSize = (size * 0.12).clamp(8.0, 12.0);
|
|
|
|
return Column(
|
|
mainAxisAlignment: MainAxisAlignment.center,
|
|
mainAxisSize: MainAxisSize.min,
|
|
children: [
|
|
Container(
|
|
width: iconSize * 1.5,
|
|
height: iconSize * 1.5,
|
|
decoration: BoxDecoration(
|
|
color: Colors.white,
|
|
borderRadius: BorderRadius.circular(iconSize * 0.75),
|
|
),
|
|
child: Center(
|
|
child: Assets.images.logo.image(
|
|
width: iconSize,
|
|
height: iconSize,
|
|
fit: BoxFit.contain,
|
|
),
|
|
),
|
|
),
|
|
if (size > 50) ...[
|
|
SizedBox(height: size * 0.05),
|
|
Text(
|
|
'Enaklo',
|
|
style: TextStyle(
|
|
color: AppColor.primary,
|
|
fontSize: fontSize,
|
|
fontWeight: FontWeight.bold,
|
|
),
|
|
),
|
|
],
|
|
],
|
|
);
|
|
}
|
|
|
|
// Detailed version for larger sizes (>= 100px)
|
|
Widget _buildDetailedVersion(double minDimension) {
|
|
final scaleFactor = minDimension / 200; // Base scale factor
|
|
|
|
// Proportional sizes
|
|
final illustrationSize = (120 * scaleFactor).clamp(80.0, 120.0);
|
|
final illustrationHeight = (160 * scaleFactor).clamp(100.0, 160.0);
|
|
final handWidth = (60 * scaleFactor).clamp(30.0, 60.0);
|
|
final handHeight = (80 * scaleFactor).clamp(40.0, 80.0);
|
|
final cupWidth = (70 * scaleFactor).clamp(35.0, 70.0);
|
|
final cupHeight = (90 * scaleFactor).clamp(45.0, 90.0);
|
|
final logoSize = (40 * scaleFactor).clamp(20.0, 40.0);
|
|
final fontSize = (12 * scaleFactor).clamp(8.0, 12.0);
|
|
|
|
return Container(
|
|
width: illustrationSize,
|
|
height: illustrationHeight,
|
|
decoration: BoxDecoration(
|
|
color: Colors.white,
|
|
borderRadius: BorderRadius.circular(illustrationSize / 2),
|
|
),
|
|
child: Stack(
|
|
children: [
|
|
// Hand
|
|
Positioned(
|
|
bottom: illustrationHeight * 0.125, // 20/160 ratio
|
|
left: illustrationSize * 0.25, // 30/120 ratio
|
|
child: Container(
|
|
width: handWidth,
|
|
height: handHeight,
|
|
decoration: BoxDecoration(
|
|
color: const Color(0xFFFFDBB3),
|
|
borderRadius: BorderRadius.circular(handWidth / 2),
|
|
),
|
|
),
|
|
),
|
|
// Coffee cup
|
|
Positioned(
|
|
top: illustrationHeight * 0.1875, // 30/160 ratio
|
|
left: illustrationSize * 0.208, // 25/120 ratio
|
|
child: Container(
|
|
width: cupWidth,
|
|
height: cupHeight,
|
|
decoration: BoxDecoration(
|
|
color: const Color(0xFFF4E4BC),
|
|
borderRadius: BorderRadius.circular(
|
|
math.max(8.0, 10 * scaleFactor),
|
|
),
|
|
),
|
|
child: Column(
|
|
mainAxisAlignment: MainAxisAlignment.center,
|
|
children: [
|
|
// Logo
|
|
Assets.images.logo.image(
|
|
width: logoSize,
|
|
height: logoSize,
|
|
fit: BoxFit.contain,
|
|
),
|
|
SizedBox(height: math.max(4.0, 8 * scaleFactor)),
|
|
if (cupHeight > 50) // Only show text if cup is big enough
|
|
Text(
|
|
'Enaklo',
|
|
style: TextStyle(
|
|
color: AppColor.primary,
|
|
fontSize: fontSize,
|
|
fontWeight: FontWeight.bold,
|
|
),
|
|
),
|
|
],
|
|
),
|
|
),
|
|
),
|
|
],
|
|
),
|
|
);
|
|
}
|
|
}
|