From 842b53028c2cbe3eeace00d59ca875770924114b Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Beno=C3=AEt=20Harrault?= <benoit@harrault.fr>
Date: Fri, 20 Sep 2024 22:01:39 +0200
Subject: [PATCH] Create styled container widget

---
 android/gradle.properties         |  4 +-
 lib/ui/screens/demo_page.dart     | 25 ++++++++++++
 lib/ui/widgets/styles_widget.dart | 66 +++++++++++++++++++++++++++++++
 pubspec.yaml                      |  2 +-
 4 files changed, 94 insertions(+), 3 deletions(-)
 create mode 100644 lib/ui/widgets/styles_widget.dart

diff --git a/android/gradle.properties b/android/gradle.properties
index e848b20..0d6ab80 100644
--- a/android/gradle.properties
+++ b/android/gradle.properties
@@ -1,5 +1,5 @@
 org.gradle.jvmargs=-Xmx1536M
 android.useAndroidX=true
 android.enableJetifier=true
-app.versionName=1.0.53
-app.versionCode=54
+app.versionName=1.0.54
+app.versionCode=55
diff --git a/lib/ui/screens/demo_page.dart b/lib/ui/screens/demo_page.dart
index 06b0cbe..94dcb72 100644
--- a/lib/ui/screens/demo_page.dart
+++ b/lib/ui/screens/demo_page.dart
@@ -6,6 +6,7 @@ import 'package:random/config/theme.dart';
 import 'package:random/cubit/data_cubit.dart';
 import 'package:random/cubit/settings_cubit.dart';
 import 'package:random/ui/widgets/header_app.dart';
+import 'package:random/ui/widgets/styles_widget.dart';
 
 class DemoPage extends StatelessWidget {
   const DemoPage({super.key});
@@ -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 0000000..72f3670
--- /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,
+    );
+  }
+}
diff --git a/pubspec.yaml b/pubspec.yaml
index 7c22ee5..7e90b14 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -3,7 +3,7 @@ description: A random application, for testing purpose only.
 
 publish_to: "none"
 
-version: 1.0.53+54
+version: 1.0.54+55
 
 environment:
   sdk: "^3.0.0"
-- 
GitLab