diff --git a/lib/ui/screens/demo_page.dart b/lib/ui/screens/demo_page.dart index 06b0cbe3f57ea01b271a7a2c8d94faa757fae773..c72ebf1d2869b8d0a0624f9f5af6bc1c218415d6 100644 --- a/lib/ui/screens/demo_page.dart +++ b/lib/ui/screens/demo_page.dart @@ -1,5 +1,6 @@ import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:random/ui/widgets/styles_widget.dart'; import 'package:unicons/unicons.dart'; import 'package:random/config/theme.dart'; @@ -29,6 +30,30 @@ class DemoPage extends StatelessWidget { fakeApiCall(), const SizedBox(height: 20), const AppHeader(text: 'BOTTOM'), + const StyledWidget( + child: SizedBox.square( + dimension: 40, + child: Center(child: Text('default')), + ), + ), + const SizedBox(height: 8), + const StyledWidget( + borderRadius: 0, + borderWidth: 12, + // depth: 8, + lowerColor: Colors.red, + upperColor: Colors.yellow, + child: Center(child: Text('custom 1')), + ), + const SizedBox(height: 8), + const StyledWidget( + borderRadius: 10, + borderWidth: 20, + depth: 20, + lowerColor: Colors.blueGrey, + upperColor: Colors.blue, + child: Center(child: Text('custom 2')), + ), ], ), ); diff --git a/lib/ui/widgets/styles_widget.dart b/lib/ui/widgets/styles_widget.dart new file mode 100644 index 0000000000000000000000000000000000000000..72f3670d44a0f0546aaef6ab51b248d1b707f58f --- /dev/null +++ b/lib/ui/widgets/styles_widget.dart @@ -0,0 +1,66 @@ +import 'package:flutter/material.dart'; + +class StyledWidget extends StatelessWidget { + const StyledWidget({ + super.key, + required this.child, + this.borderWidth = 10, + this.borderRadius = 4, + this.depth = 5, + this.lowerColor, + this.upperColor, + }); + + final Widget child; + final double borderWidth; + final double borderRadius; + final int depth; + final Color? lowerColor; + final Color? upperColor; + + Widget nestedContainers({ + required Widget child, + required int containerDepth, + required Color lowerColor, + required Color upperColor, + }) { + final double singleBorderWidth = borderWidth / depth; + final Color borderColor = + Color.lerp(upperColor, lowerColor, (containerDepth / depth - 0.5).abs() * 2) ?? + Colors.white; + + final double radius = borderRadius + borderRadius * (containerDepth / depth); + + return Container( + decoration: BoxDecoration( + color: borderColor, + border: Border.all( + color: borderColor, + width: singleBorderWidth, + ), + borderRadius: BorderRadius.circular(radius), + ), + child: containerDepth == 0 + ? Padding( + padding: const EdgeInsets.all(8), + child: child, + ) + : nestedContainers( + child: child, + containerDepth: containerDepth - 1, + lowerColor: lowerColor, + upperColor: upperColor, + ), + ); + } + + @override + Widget build(BuildContext context) { + return nestedContainers( + child: child, + containerDepth: depth, + lowerColor: lowerColor ?? Theme.of(context).colorScheme.onPrimary, + upperColor: upperColor ?? Theme.of(context).colorScheme.onSecondary, + ); + } +}