diff --git a/lib/config/menu.dart b/lib/config/menu.dart
index 99f8668f54cc540b33e76d58e7b2d78f276ccdc2..3f3c891ecb2c83d38f0b313dd935bb1f20b75f90 100644
--- a/lib/config/menu.dart
+++ b/lib/config/menu.dart
@@ -1,5 +1,5 @@
-import 'package:easy_localization/easy_localization.dart';
 import 'package:flutter/material.dart';
+import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
 import 'package:unicons/unicons.dart';
 
 import 'package:random/ui/screens/about_page.dart';
diff --git a/lib/config/theme.dart b/lib/config/theme.dart
deleted file mode 100644
index 138460e58f89bc93afb0899d6cfe8f8e662a466f..0000000000000000000000000000000000000000
--- a/lib/config/theme.dart
+++ /dev/null
@@ -1,192 +0,0 @@
-import 'package:flutter/material.dart';
-
-/// Colors from Tailwind CSS (v3.0) - June 2022
-///
-/// https://tailwindcss.com/docs/customizing-colors
-
-const int _primaryColor = 0xFF6366F1;
-const MaterialColor primarySwatch = MaterialColor(_primaryColor, <int, Color>{
-  50: Color(0xFFEEF2FF), // indigo-50
-  100: Color(0xFFE0E7FF), // indigo-100
-  200: Color(0xFFC7D2FE), // indigo-200
-  300: Color(0xFFA5B4FC), // indigo-300
-  400: Color(0xFF818CF8), // indigo-400
-  500: Color(_primaryColor), // indigo-500
-  600: Color(0xFF4F46E5), // indigo-600
-  700: Color(0xFF4338CA), // indigo-700
-  800: Color(0xFF3730A3), // indigo-800
-  900: Color(0xFF312E81), // indigo-900
-});
-
-const int _textColor = 0xFF64748B;
-const MaterialColor textSwatch = MaterialColor(_textColor, <int, Color>{
-  50: Color(0xFFF8FAFC), // slate-50
-  100: Color(0xFFF1F5F9), // slate-100
-  200: Color(0xFFE2E8F0), // slate-200
-  300: Color(0xFFCBD5E1), // slate-300
-  400: Color(0xFF94A3B8), // slate-400
-  500: Color(_textColor), // slate-500
-  600: Color(0xFF475569), // slate-600
-  700: Color(0xFF334155), // slate-700
-  800: Color(0xFF1E293B), // slate-800
-  900: Color(0xFF0F172A), // slate-900
-});
-
-const Color errorColor = Color(0xFFDC2626); // red-600
-
-final ColorScheme lightColorScheme = ColorScheme.light(
-  primary: primarySwatch.shade500,
-  secondary: primarySwatch.shade500,
-  onSecondary: Colors.white,
-  error: errorColor,
-  onSurface: textSwatch.shade500,
-  surface: textSwatch.shade50,
-  surfaceContainerHighest: Colors.white,
-  shadow: textSwatch.shade900.withOpacity(.1),
-);
-
-final ColorScheme darkColorScheme = ColorScheme.dark(
-  primary: primarySwatch.shade500,
-  secondary: primarySwatch.shade500,
-  onSecondary: Colors.white,
-  error: errorColor,
-  onSurface: textSwatch.shade300,
-  surface: const Color(0xFF262630),
-  surfaceContainerHighest: const Color(0xFF282832),
-  shadow: textSwatch.shade900.withOpacity(.2),
-);
-
-final ThemeData lightTheme = ThemeData(
-  colorScheme: lightColorScheme,
-  fontFamily: 'Nunito',
-  textTheme: TextTheme(
-    displayLarge: TextStyle(
-      color: textSwatch.shade700,
-      fontFamily: 'Nunito',
-    ),
-    displayMedium: TextStyle(
-      color: textSwatch.shade600,
-      fontFamily: 'Nunito',
-    ),
-    displaySmall: TextStyle(
-      color: textSwatch.shade500,
-      fontFamily: 'Nunito',
-    ),
-    headlineLarge: TextStyle(
-      color: textSwatch.shade700,
-      fontFamily: 'Nunito',
-    ),
-    headlineMedium: TextStyle(
-      color: textSwatch.shade600,
-      fontFamily: 'Nunito',
-    ),
-    headlineSmall: TextStyle(
-      color: textSwatch.shade500,
-      fontFamily: 'Nunito',
-    ),
-    titleLarge: TextStyle(
-      color: textSwatch.shade700,
-      fontFamily: 'Nunito',
-    ),
-    titleMedium: TextStyle(
-      color: textSwatch.shade600,
-      fontFamily: 'Nunito',
-    ),
-    titleSmall: TextStyle(
-      color: textSwatch.shade500,
-      fontFamily: 'Nunito',
-    ),
-    bodyLarge: TextStyle(
-      color: textSwatch.shade700,
-      fontFamily: 'Nunito',
-    ),
-    bodyMedium: TextStyle(
-      color: textSwatch.shade600,
-      fontFamily: 'Nunito',
-    ),
-    bodySmall: TextStyle(
-      color: textSwatch.shade500,
-      fontFamily: 'Nunito',
-    ),
-    labelLarge: TextStyle(
-      color: textSwatch.shade700,
-      fontFamily: 'Nunito',
-    ),
-    labelMedium: TextStyle(
-      color: textSwatch.shade600,
-      fontFamily: 'Nunito',
-    ),
-    labelSmall: TextStyle(
-      color: textSwatch.shade500,
-      fontFamily: 'Nunito',
-    ),
-  ),
-);
-
-final ThemeData darkTheme = lightTheme.copyWith(
-  colorScheme: darkColorScheme,
-  textTheme: TextTheme(
-    displayLarge: TextStyle(
-      color: textSwatch.shade200,
-      fontFamily: 'Nunito',
-    ),
-    displayMedium: TextStyle(
-      color: textSwatch.shade300,
-      fontFamily: 'Nunito',
-    ),
-    displaySmall: TextStyle(
-      color: textSwatch.shade400,
-      fontFamily: 'Nunito',
-    ),
-    headlineLarge: TextStyle(
-      color: textSwatch.shade200,
-      fontFamily: 'Nunito',
-    ),
-    headlineMedium: TextStyle(
-      color: textSwatch.shade300,
-      fontFamily: 'Nunito',
-    ),
-    headlineSmall: TextStyle(
-      color: textSwatch.shade400,
-      fontFamily: 'Nunito',
-    ),
-    titleLarge: TextStyle(
-      color: textSwatch.shade200,
-      fontFamily: 'Nunito',
-    ),
-    titleMedium: TextStyle(
-      color: textSwatch.shade300,
-      fontFamily: 'Nunito',
-    ),
-    titleSmall: TextStyle(
-      color: textSwatch.shade400,
-      fontFamily: 'Nunito',
-    ),
-    bodyLarge: TextStyle(
-      color: textSwatch.shade200,
-      fontFamily: 'Nunito',
-    ),
-    bodyMedium: TextStyle(
-      color: textSwatch.shade300,
-      fontFamily: 'Nunito',
-    ),
-    bodySmall: TextStyle(
-      color: textSwatch.shade400,
-      fontFamily: 'Nunito',
-    ),
-    labelLarge: TextStyle(
-      color: textSwatch.shade200,
-      fontFamily: 'Nunito',
-    ),
-    labelMedium: TextStyle(
-      color: textSwatch.shade300,
-      fontFamily: 'Nunito',
-    ),
-    labelSmall: TextStyle(
-      color: textSwatch.shade400,
-      fontFamily: 'Nunito',
-    ),
-  ),
-);
-
-final ThemeData appTheme = darkTheme;
diff --git a/lib/cubit/api_cubit.dart b/lib/cubit/api_cubit.dart
index 1835d78d2b08a5c94ef2508bc515dc2ccb7d19cc..d5d954f978967cfe82b6505d211c3168b634e625 100644
--- a/lib/cubit/api_cubit.dart
+++ b/lib/cubit/api_cubit.dart
@@ -1,10 +1,9 @@
-import 'package:equatable/equatable.dart';
+import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
 import 'package:hydrated_bloc/hydrated_bloc.dart';
 
 import 'package:random/models/api_failure.dart';
 import 'package:random/models/api_data.dart';
 import 'package:random/repository/api.dart';
-import 'package:random/utils/tools.dart';
 
 part 'api_state.dart';
 
diff --git a/lib/main.dart b/lib/main.dart
index b4a2c31cd3ff8f43041e32e164f696c875460e15..b774645e53b8c1ad5dd9fc9681efa91cdbaf39e6 100644
--- a/lib/main.dart
+++ b/lib/main.dart
@@ -1,13 +1,8 @@
 import 'dart:io';
 
-import 'package:easy_localization/easy_localization.dart';
 import 'package:flutter/material.dart';
-import 'package:flutter_bloc/flutter_bloc.dart';
-import 'package:hive/hive.dart';
-import 'package:hydrated_bloc/hydrated_bloc.dart';
-import 'package:path_provider/path_provider.dart';
+import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
 
-import 'package:random/config/theme.dart';
 import 'package:random/cubit/api_cubit.dart';
 import 'package:random/cubit/bottom_nav_cubit.dart';
 import 'package:random/cubit/data_cubit.dart';
diff --git a/lib/models/game/game.dart b/lib/models/game/game.dart
index 56cde71b0ab48c4dfd0fe6c7bbee10b842395852..966b251b144be0e2ad3a980e120114ca7e37c78d 100644
--- a/lib/models/game/game.dart
+++ b/lib/models/game/game.dart
@@ -1,9 +1,10 @@
 import 'dart:math';
 
+import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
+
 import 'package:random/models/game/game_board.dart';
 import 'package:random/models/game/game_cell.dart';
 import 'package:random/models/game/game_settings.dart';
-import 'package:random/utils/tools.dart';
 
 class Game {
   GameBoard board;
diff --git a/lib/models/game/game_board.dart b/lib/models/game/game_board.dart
index 03e0611add32fe11850d28241f9220f738c706e5..8f0135e140001d5c6cfe05dd14579e90790bb3ee 100644
--- a/lib/models/game/game_board.dart
+++ b/lib/models/game/game_board.dart
@@ -1,8 +1,9 @@
 import 'dart:math';
 
+import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
+
 import 'package:random/models/game/game_cell.dart';
 import 'package:random/models/game/game_settings.dart';
-import 'package:random/utils/tools.dart';
 
 class GameBoard {
   final List<List<GameCell>> cells;
diff --git a/lib/models/interface_type.dart b/lib/models/interface_type.dart
index 29763214791351f2cfa0663ce0a2d20afea9b169..1ea9b3a3630e9dcc9a9b22498e8fb504673b9f59 100644
--- a/lib/models/interface_type.dart
+++ b/lib/models/interface_type.dart
@@ -1,5 +1,5 @@
-import 'package:easy_localization/easy_localization.dart';
 import 'package:flutter/material.dart';
+import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
 
 enum InterfaceType {
   basic,
diff --git a/lib/network/api.dart b/lib/network/api.dart
index 92a90e027bb81abd4859ede8af3b7162a185a242..3496021784e3e3d503e40a63a9a2aa5b73026eda 100644
--- a/lib/network/api.dart
+++ b/lib/network/api.dart
@@ -1,9 +1,9 @@
 import 'dart:io';
 
 import 'package:dio/dio.dart';
+import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
 
 import 'package:random/models/api_failure.dart';
-import 'package:random/utils/tools.dart';
 
 class ApiService {
   final Dio _dio = Dio();
diff --git a/lib/repository/api.dart b/lib/repository/api.dart
index 7530d1f66bca91d8c7e951e89d0e70e55f15613a..14dba656419ad7e84b8eae96fd9643e523a574c1 100644
--- a/lib/repository/api.dart
+++ b/lib/repository/api.dart
@@ -1,6 +1,7 @@
+import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
+
 import 'package:random/models/api_data.dart';
 import 'package:random/network/api.dart';
-import 'package:random/utils/tools.dart';
 
 class ApiRepository {
   const ApiRepository({required this.apiService});
diff --git a/lib/ui/helpers/app_titles.dart b/lib/ui/helpers/app_titles.dart
deleted file mode 100644
index b98107b12fabc3114ebfbec994166b588abcf1ad..0000000000000000000000000000000000000000
--- a/lib/ui/helpers/app_titles.dart
+++ /dev/null
@@ -1,32 +0,0 @@
-import 'package:easy_localization/easy_localization.dart';
-import 'package:flutter/material.dart';
-
-class AppHeader extends StatelessWidget {
-  const AppHeader({super.key, required this.text});
-
-  final String text;
-
-  @override
-  Widget build(BuildContext context) {
-    return Text(
-      tr(text),
-      textAlign: TextAlign.start,
-      style: Theme.of(context).textTheme.headlineMedium!.apply(fontWeightDelta: 2),
-    );
-  }
-}
-
-class AppTitle extends StatelessWidget {
-  const AppTitle({super.key, required this.text});
-
-  final String text;
-
-  @override
-  Widget build(BuildContext context) {
-    return Text(
-      tr(text),
-      textAlign: TextAlign.start,
-      style: Theme.of(context).textTheme.titleLarge!.apply(fontWeightDelta: 2),
-    );
-  }
-}
diff --git a/lib/ui/helpers/styled_button.dart b/lib/ui/helpers/styled_button.dart
deleted file mode 100644
index 7f2807fea93a587abf6b9bf3e06cd93f304d534c..0000000000000000000000000000000000000000
--- a/lib/ui/helpers/styled_button.dart
+++ /dev/null
@@ -1,210 +0,0 @@
-import 'package:auto_size_text/auto_size_text.dart';
-import 'package:flutter/material.dart';
-
-import 'package:random/utils/color_extensions.dart';
-
-class StyledButton extends StatelessWidget {
-  const StyledButton({
-    super.key,
-    required this.color,
-    required this.onPressed,
-    this.onLongPress,
-    required this.child,
-  });
-
-  final Color color;
-  final VoidCallback? onPressed;
-  final VoidCallback? onLongPress;
-  final Widget child;
-
-  factory StyledButton.text({
-    Key? key,
-    required VoidCallback? onPressed,
-    VoidCallback? onLongPress,
-    required String caption,
-    required Color color,
-  }) {
-    final Widget captionWidget = AutoSizeText(
-      caption,
-      maxLines: 1,
-      style: TextStyle(
-        inherit: true,
-        fontWeight: FontWeight.w900,
-        color: color.darken(60),
-        shadows: [
-          Shadow(
-            blurRadius: 5.0,
-            color: color.lighten(60),
-            offset: const Offset(2, 2),
-          ),
-          Shadow(
-            blurRadius: 5.0,
-            color: color.lighten(60),
-            offset: const Offset(2, -2),
-          ),
-          Shadow(
-            blurRadius: 5.0,
-            color: color.lighten(60),
-            offset: const Offset(-2, 2),
-          ),
-          Shadow(
-            blurRadius: 5.0,
-            color: color.lighten(60),
-            offset: const Offset(-2, -2),
-          ),
-        ],
-      ),
-    );
-
-    return StyledButton(
-      color: color,
-      onPressed: onPressed,
-      onLongPress: onLongPress,
-      child: captionWidget,
-    );
-  }
-
-  factory StyledButton.icon({
-    Key? key,
-    required VoidCallback? onPressed,
-    VoidCallback? onLongPress,
-    required Icon icon,
-    required Color color,
-    required double iconSize,
-  }) {
-    return StyledButton(
-      color: color,
-      onPressed: onPressed,
-      onLongPress: onLongPress,
-      child: Icon(
-        icon.icon,
-        color: icon.color ?? color.darken(60),
-        size: iconSize,
-        shadows: [
-          Shadow(
-            blurRadius: 5.0,
-            color: color.lighten(60),
-            offset: const Offset(2, 2),
-          ),
-          Shadow(
-            blurRadius: 5.0,
-            color: color.lighten(60),
-            offset: const Offset(2, -2),
-          ),
-          Shadow(
-            blurRadius: 5.0,
-            color: color.lighten(60),
-            offset: const Offset(-2, 2),
-          ),
-          Shadow(
-            blurRadius: 5.0,
-            color: color.lighten(60),
-            offset: const Offset(-2, -2),
-          ),
-        ],
-      ),
-    );
-  }
-
-  @override
-  Widget build(BuildContext context) {
-    const double borderWidth = 4;
-    final Color borderColor = color.darken(40);
-    const double borderRadius = 10;
-
-    return Container(
-      margin: const EdgeInsets.all(2),
-      padding: const EdgeInsets.all(2),
-      decoration: BoxDecoration(
-        color: color,
-        border: Border.all(
-          color: borderColor,
-          width: borderWidth,
-        ),
-        borderRadius: BorderRadius.circular(borderRadius),
-      ),
-      child: CustomPaint(
-        painter: StyledButtonPainter(
-          baseColor: color,
-        ),
-        child: MaterialButton(
-          onPressed: onPressed,
-          onLongPress: onLongPress,
-          padding: const EdgeInsets.all(8),
-          materialTapTargetSize: MaterialTapTargetSize.shrinkWrap,
-          minWidth: 40,
-          child: child,
-        ),
-      ),
-    );
-  }
-}
-
-class StyledButtonPainter extends CustomPainter {
-  StyledButtonPainter({
-    required this.baseColor,
-  });
-
-  final Color baseColor;
-
-  @override
-  void paint(Canvas canvas, Size size) {
-    final Color lightColor = baseColor.lighten(20);
-    final Color darkColor = baseColor.darken(20);
-
-    final Paint paint = Paint()..style = PaintingStyle.fill;
-
-    const double cornerRadius = 6;
-
-    Path topPath = Path()
-      ..moveTo(cornerRadius, 0)
-      ..lineTo(size.width - cornerRadius, 0)
-      ..arcToPoint(
-        Offset(size.width, cornerRadius),
-        radius: const Radius.circular(cornerRadius),
-      )
-      ..lineTo(size.width, size.height * .35)
-      ..quadraticBezierTo(
-        size.width * .4,
-        size.height * .1,
-        0,
-        size.height * .3,
-      )
-      ..lineTo(0, cornerRadius)
-      ..arcToPoint(
-        const Offset(cornerRadius, 0),
-        radius: const Radius.circular(cornerRadius),
-      );
-
-    Path bottomPath = Path()
-      ..moveTo(cornerRadius, size.height)
-      ..lineTo(size.width - cornerRadius, size.height)
-      ..arcToPoint(
-        Offset(size.width, size.height - cornerRadius),
-        radius: const Radius.circular(cornerRadius),
-        clockwise: false,
-      )
-      ..lineTo(size.width, size.height * .7)
-      ..quadraticBezierTo(
-        size.width * .6,
-        size.height * .9,
-        0,
-        size.height * .7,
-      )
-      ..lineTo(0, size.height - cornerRadius)
-      ..arcToPoint(
-        Offset(cornerRadius, size.height),
-        radius: const Radius.circular(cornerRadius),
-        clockwise: false,
-      );
-
-    paint.color = lightColor;
-    canvas.drawPath(topPath, paint);
-
-    paint.color = darkColor;
-    canvas.drawPath(bottomPath, paint);
-  }
-
-  @override
-  bool shouldRepaint(CustomPainter oldDelegate) => false;
-}
diff --git a/lib/ui/helpers/styled_container.dart b/lib/ui/helpers/styled_container.dart
deleted file mode 100644
index a68c78c4d1cd8aea88d6f231cf4a20c7acbe4d7d..0000000000000000000000000000000000000000
--- a/lib/ui/helpers/styled_container.dart
+++ /dev/null
@@ -1,66 +0,0 @@
-import 'package:flutter/material.dart';
-
-class StyledContainer extends StatelessWidget {
-  const StyledContainer({
-    super.key,
-    required this.child,
-    this.borderWidth = 20,
-    this.borderRadius = 6,
-    this.depth = 7,
-    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.surface,
-      upperColor: upperColor ?? Theme.of(context).colorScheme.onSurface,
-    );
-  }
-}
diff --git a/lib/ui/painters/cell_painter.dart b/lib/ui/painters/cell_painter.dart
index cd5aed74fa6545ddd1b566f6552c713cb84b0d84..4696f7c7a9684e62ebfa07b92d0bab585746b4a7 100644
--- a/lib/ui/painters/cell_painter.dart
+++ b/lib/ui/painters/cell_painter.dart
@@ -1,9 +1,9 @@
 import 'dart:ui' as ui;
 
 import 'package:flutter/material.dart';
+import 'package:flutter_custom_toolbox/utils/color_extensions.dart';
 
 import 'package:random/config/app_colors.dart';
-import 'package:random/utils/color_extensions.dart';
 
 class CellPainter extends CustomPainter {
   const CellPainter({required this.value});
diff --git a/lib/ui/screens/about_page.dart b/lib/ui/screens/about_page.dart
index f183a4a3c2b0920fd770e3bebdbd853c2cb6df66..af793342fd8ee72d894a72c3283e98b60e3de1d0 100644
--- a/lib/ui/screens/about_page.dart
+++ b/lib/ui/screens/about_page.dart
@@ -15,7 +15,7 @@ class AboutPage extends StatelessWidget {
       mainAxisSize: MainAxisSize.max,
       children: <Widget>[
         const SizedBox(height: 8),
-        const AppHeader(text: 'about_title'),
+        const AppHeaderCustom(text: 'about_title'),
         const Text('about_content').tr(),
         FutureBuilder<PackageInfo>(
           future: PackageInfo.fromPlatform(),
diff --git a/lib/ui/screens/api_page.dart b/lib/ui/screens/api_page.dart
index 1441faca93091a16f5a52c7bc35b0a3a4edc2c37..a77abd867f62ec785bbdb0a4de5cba701b71e1dd 100644
--- a/lib/ui/screens/api_page.dart
+++ b/lib/ui/screens/api_page.dart
@@ -18,7 +18,7 @@ class ApiPage extends StatelessWidget {
         physics: const BouncingScrollPhysics(),
         children: <Widget>[
           const SizedBox(height: 8),
-          const AppHeader(text: 'api_page_title'),
+          const AppHeaderCustom(text: 'api_page_title'),
           const SizedBox(height: 20),
           BlocBuilder<ApiDataCubit, ApiDataState>(
             builder: (BuildContext context, ApiDataState apiDataState) {
diff --git a/lib/ui/screens/demo_page.dart b/lib/ui/screens/demo_page.dart
index 4b5018cf22fa2534189b372c5a77585ab4bc7c12..03b5ef45a399ba821b955adb7b03ebd1fad58c2b 100644
--- a/lib/ui/screens/demo_page.dart
+++ b/lib/ui/screens/demo_page.dart
@@ -1,14 +1,11 @@
 import 'package:flutter/material.dart';
 import 'package:flutter_bloc/flutter_bloc.dart';
+import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
 import 'package:unicons/unicons.dart';
 
-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/helpers/styled_button.dart';
-import 'package:random/ui/helpers/styled_container.dart';
-import 'package:random/utils/tools.dart';
 
 class DemoPage extends StatelessWidget {
   const DemoPage({super.key});
@@ -22,7 +19,7 @@ class DemoPage extends StatelessWidget {
         physics: const BouncingScrollPhysics(),
         children: <Widget>[
           const SizedBox(height: 8),
-          const AppHeader(text: 'TOP'),
+          const AppHeaderCustom(text: 'TOP'),
           const SizedBox(height: 20),
           StyledContainer(
             child: persistedCounterBlock(BlocProvider.of<DataCubit>(context)),
@@ -48,7 +45,7 @@ class DemoPage extends StatelessWidget {
           const SizedBox(height: 8),
           fakeApiCall(),
           const SizedBox(height: 8),
-          const AppHeader(text: 'BOTTOM'),
+          const AppHeaderCustom(text: 'BOTTOM'),
           const SizedBox(height: 8),
           Row(
             mainAxisAlignment: MainAxisAlignment.spaceBetween,
diff --git a/lib/ui/screens/graph_page.dart b/lib/ui/screens/graph_page.dart
index e26f8a247061d3722439f8a0757d16801b4fd720..3b6d7700f06e03edc7bc0bf3a8395d4ed3294096 100644
--- a/lib/ui/screens/graph_page.dart
+++ b/lib/ui/screens/graph_page.dart
@@ -1,7 +1,7 @@
 import 'package:flutter/material.dart';
+import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
 
 import 'package:random/ui/painters/graph_painter.dart';
-import 'package:random/utils/tools.dart';
 
 class GraphPage extends StatefulWidget {
   const GraphPage({super.key});
diff --git a/lib/ui/screens/settings_page.dart b/lib/ui/screens/settings_page.dart
index 195d012e26cb923cc59b0b4521985e1f080a369f..6995b4275ca4b7121cc9c228a297f7ec392390ff 100644
--- a/lib/ui/screens/settings_page.dart
+++ b/lib/ui/screens/settings_page.dart
@@ -14,7 +14,7 @@ class SettingsPage extends StatelessWidget {
       mainAxisSize: MainAxisSize.max,
       children: <Widget>[
         SizedBox(height: 8),
-        AppHeader(text: 'settings_title'),
+        AppHeaderCustom(text: 'settings_title'),
         SizedBox(height: 8),
         SettingsForm(),
       ],
diff --git a/lib/ui/widgets/api_data.dart b/lib/ui/widgets/api_data.dart
index 669de42d97f3bdc88bb9628fb9d51843164fdae2..763fe8ac842c2d5c05f4b164e35d7ef91834ca91 100644
--- a/lib/ui/widgets/api_data.dart
+++ b/lib/ui/widgets/api_data.dart
@@ -1,7 +1,8 @@
 import 'package:flutter/material.dart';
+import 'package:flutter_custom_toolbox/widgets/show_error.dart';
+
 import 'package:random/models/api_data.dart';
 import 'package:random/models/api_status.dart';
-import 'package:random/ui/widgets/error.dart';
 
 class ApiDataWidget extends StatelessWidget {
   const ApiDataWidget({
diff --git a/lib/ui/widgets/app_bar.dart b/lib/ui/widgets/app_bar.dart
index 0d60da6f68207caaec25e048927f3bba420b32d3..7343f6f2e141e5471145ac1a16ecc7804f939d3d 100644
--- a/lib/ui/widgets/app_bar.dart
+++ b/lib/ui/widgets/app_bar.dart
@@ -8,7 +8,7 @@ class StandardAppBar extends StatelessWidget implements PreferredSizeWidget {
   @override
   Widget build(BuildContext context) {
     return AppBar(
-      title: const AppHeader(text: 'app_name'),
+      title: const AppHeaderCustom(text: 'app_name'),
       actions: const [
         //
       ],
diff --git a/lib/ui/widgets/debug_bloc.dart b/lib/ui/widgets/debug_bloc.dart
deleted file mode 100644
index cbc6dfeacf71bf10c6ba3435ece3233f73201a97..0000000000000000000000000000000000000000
--- a/lib/ui/widgets/debug_bloc.dart
+++ /dev/null
@@ -1,28 +0,0 @@
-import 'package:flutter/material.dart';
-
-class DebugBloc extends StatelessWidget {
-  const DebugBloc({super.key, required this.content});
-
-  final String content;
-
-  @override
-  Widget build(BuildContext context) {
-    return Container(
-      decoration: BoxDecoration(
-        color: Colors.red,
-        border: Border.all(
-          color: Colors.grey,
-          width: 2,
-        ),
-      ),
-      child: Padding(
-        padding: const EdgeInsets.all(5),
-        child: Text(
-          content,
-          textAlign: TextAlign.start,
-          style: const TextStyle(fontSize: 13),
-        ),
-      ),
-    );
-  }
-}
diff --git a/lib/ui/widgets/error.dart b/lib/ui/widgets/error.dart
deleted file mode 100644
index 9aacdcb7d4796e332b8a3160284aa8ced0e4f1c3..0000000000000000000000000000000000000000
--- a/lib/ui/widgets/error.dart
+++ /dev/null
@@ -1,17 +0,0 @@
-import 'package:easy_localization/easy_localization.dart';
-import 'package:flutter/material.dart';
-
-class ShowErrorWidget extends StatelessWidget {
-  const ShowErrorWidget({super.key, required this.message});
-
-  final String message;
-
-  @override
-  Widget build(BuildContext context) {
-    return Text(
-      '⚠️ ${tr(message)}',
-      textAlign: TextAlign.start,
-      style: const TextStyle(color: Colors.red),
-    );
-  }
-}
diff --git a/lib/ui/widgets/game/game_board.dart b/lib/ui/widgets/game/game_board.dart
index 3a092b3f77339f2d84930a605b50939ee5d43119..21bd65e532d0dda0040ed9d9bac7be7c0b0a13db 100644
--- a/lib/ui/widgets/game/game_board.dart
+++ b/lib/ui/widgets/game/game_board.dart
@@ -1,12 +1,11 @@
 import 'package:flutter/material.dart';
-import 'package:flutter_bloc/flutter_bloc.dart';
+import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
 
 import 'package:random/cubit/game_cubit.dart';
 import 'package:random/models/game/game.dart';
 import 'package:random/models/game/game_settings.dart';
 import 'package:random/ui/painters/cell_painter.dart';
 import 'package:random/ui/widgets/game/game_score.dart';
-import 'package:random/utils/tools.dart';
 
 class GameBoardWidget extends StatefulWidget {
   const GameBoardWidget({
diff --git a/lib/ui/widgets/header_app.dart b/lib/ui/widgets/header_app.dart
index 39bfa864db714a3ea04cf42a2486b1ccd7fb8482..f07e8471004aa98def0a87f1c75cad3fe53e33b6 100644
--- a/lib/ui/widgets/header_app.dart
+++ b/lib/ui/widgets/header_app.dart
@@ -7,8 +7,8 @@ import 'package:random/cubit/api_cubit.dart';
 import 'package:random/cubit/settings_cubit.dart';
 import 'package:random/models/interface_type.dart';
 
-class AppHeader extends StatelessWidget {
-  const AppHeader({super.key, required this.text});
+class AppHeaderCustom extends StatelessWidget {
+  const AppHeaderCustom({super.key, required this.text});
 
   final String text;
 
diff --git a/lib/ui/widgets/settings_form.dart b/lib/ui/widgets/settings_form.dart
index facc79d4ad75a3d4e3840340a9be0f0fecd6df31..df8cf61fa47d784868ca824d59977f84b495e2b0 100644
--- a/lib/ui/widgets/settings_form.dart
+++ b/lib/ui/widgets/settings_form.dart
@@ -1,10 +1,8 @@
-import 'package:easy_localization/easy_localization.dart';
 import 'package:flutter/material.dart';
-import 'package:flutter_bloc/flutter_bloc.dart';
+import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
 import 'package:unicons/unicons.dart';
 
 import 'package:random/cubit/settings_cubit.dart';
-import 'package:random/config/theme.dart';
 import 'package:random/models/interface_type.dart';
 import 'package:random/ui/widgets/theme_card.dart';
 
diff --git a/lib/ui/widgets/take_picture_widget.dart b/lib/ui/widgets/take_picture_widget.dart
index 1bcc14e0c051f3288a84bba8035fdd7a4eebda06..015e3d9fdb0653c5ae1f9e3ce3602bfca12bd581 100644
--- a/lib/ui/widgets/take_picture_widget.dart
+++ b/lib/ui/widgets/take_picture_widget.dart
@@ -2,10 +2,10 @@ import 'dart:io';
 
 import 'package:camera/camera.dart';
 import 'package:flutter/material.dart';
+import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
 import 'package:unicons/unicons.dart';
 
 import 'package:random/utils/picture_storage.dart';
-import 'package:random/utils/tools.dart';
 
 class TakePictureWidget extends StatefulWidget {
   const TakePictureWidget({super.key});
diff --git a/lib/utils/color_extensions.dart b/lib/utils/color_extensions.dart
deleted file mode 100644
index 4e55e338f0d3ed98b233d1ef887b7b3e17e29d97..0000000000000000000000000000000000000000
--- a/lib/utils/color_extensions.dart
+++ /dev/null
@@ -1,33 +0,0 @@
-import 'dart:ui';
-
-extension ColorExtension on Color {
-  Color darken([int percent = 40]) {
-    assert(1 <= percent && percent <= 100);
-    final value = 1 - percent / 100;
-    return Color.fromARGB(
-      alpha,
-      (red * value).round(),
-      (green * value).round(),
-      (blue * value).round(),
-    );
-  }
-
-  Color lighten([int percent = 40]) {
-    assert(1 <= percent && percent <= 100);
-    final value = percent / 100;
-    return Color.fromARGB(
-      alpha,
-      (red + ((255 - red) * value)).round(),
-      (green + ((255 - green) * value)).round(),
-      (blue + ((255 - blue) * value)).round(),
-    );
-  }
-
-  Color avg(Color other) {
-    final red = (this.red + other.red) ~/ 2;
-    final green = (this.green + other.green) ~/ 2;
-    final blue = (this.blue + other.blue) ~/ 2;
-    final alpha = (this.alpha + other.alpha) ~/ 2;
-    return Color.fromARGB(alpha, red, green, blue);
-  }
-}
diff --git a/lib/utils/picture_storage.dart b/lib/utils/picture_storage.dart
index 9914680b03f5689dc48c0ce08e00033062515b11..08c9c5bceac7b605798e6494dc20a3a4a2512c91 100644
--- a/lib/utils/picture_storage.dart
+++ b/lib/utils/picture_storage.dart
@@ -2,8 +2,7 @@ import 'dart:io';
 
 import 'package:path/path.dart';
 import 'package:path_provider/path_provider.dart';
-
-import 'package:random/utils/tools.dart';
+import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
 
 class PictureStorage {
   Future<String> get _localPath async {
diff --git a/lib/utils/tools.dart b/lib/utils/tools.dart
deleted file mode 100644
index fd48b2b009b80b22248d6e7f08a63e96c4065bd7..0000000000000000000000000000000000000000
--- a/lib/utils/tools.dart
+++ /dev/null
@@ -1,7 +0,0 @@
-import 'package:flutter/foundation.dart';
-
-void printlog(String message) {
-  if (!kReleaseMode) {
-    debugPrint(message);
-  }
-}
diff --git a/pubspec.lock b/pubspec.lock
index b5faee9652e50d9d40a4cfba9c95de0aa31260e3..7bc2e35332c880d774236486cfa44e9a181a77af 100644
--- a/pubspec.lock
+++ b/pubspec.lock
@@ -18,7 +18,7 @@ packages:
     source: hosted
     version: "2.11.0"
   auto_size_text:
-    dependency: "direct main"
+    dependency: transitive
     description:
       name: auto_size_text
       sha256: "3f5261cd3fb5f2a9ab4e2fc3fba84fd9fcaac8821f20a1d4e71f557521b22599"
@@ -138,7 +138,7 @@ packages:
     source: hosted
     version: "2.0.0"
   easy_localization:
-    dependency: "direct main"
+    dependency: transitive
     description:
       name: easy_localization
       sha256: fa59bcdbbb911a764aa6acf96bbb6fa7a5cf8234354fc45ec1a43a0349ef0201
@@ -154,7 +154,7 @@ packages:
     source: hosted
     version: "0.0.2"
   equatable:
-    dependency: "direct main"
+    dependency: transitive
     description:
       name: equatable
       sha256: c2b87cb7756efdf69892005af546c56c0b5037f54d2a88269b4f347a505e3ca2
@@ -183,13 +183,22 @@ packages:
     source: sdk
     version: "0.0.0"
   flutter_bloc:
-    dependency: "direct main"
+    dependency: transitive
     description:
       name: flutter_bloc
       sha256: b594505eac31a0518bdcb4b5b79573b8d9117b193cc80cc12e17d639b10aa27a
       url: "https://pub.dev"
     source: hosted
     version: "8.1.6"
+  flutter_custom_toolbox:
+    dependency: "direct main"
+    description:
+      path: "."
+      ref: "3-add-exports-for-base-dependencies"
+      resolved-ref: e69ee8e46831d18fe5ee8a06573f106b42c7e8b6
+      url: "https://git.harrault.fr/android/flutter-toolbox.git"
+    source: git
+    version: "0.1.0"
   flutter_lints:
     dependency: "direct dev"
     description:
@@ -217,7 +226,7 @@ packages:
     source: sdk
     version: "0.0.0"
   hive:
-    dependency: "direct main"
+    dependency: transitive
     description:
       name: hive
       sha256: "8dcf6db979d7933da8217edcec84e9df1bdb4e4edc7fc77dbd5aa74356d6d941"
@@ -241,7 +250,7 @@ packages:
     source: hosted
     version: "4.0.2"
   hydrated_bloc:
-    dependency: "direct main"
+    dependency: transitive
     description:
       name: hydrated_bloc
       sha256: af35b357739fe41728df10bec03aad422cdc725a1e702e03af9d2a41ea05160c
@@ -313,7 +322,7 @@ packages:
     source: hosted
     version: "1.9.0"
   path_provider:
-    dependency: "direct main"
+    dependency: transitive
     description:
       name: path_provider
       sha256: fec0d61223fba3154d87759e3cc27fe2c8dc498f6386c6d6fc80d1afdd1bf378
@@ -534,5 +543,5 @@ packages:
     source: hosted
     version: "1.1.0"
 sdks:
-  dart: ">=3.5.0 <4.0.0"
+  dart: ">=3.5.3 <4.0.0"
   flutter: ">=3.24.0"
diff --git a/pubspec.yaml b/pubspec.yaml
index 5e3fcb2ce413e24066d339751bb3b887941a841d..9f7c92921713c629ca58fef66c226c8e0ab2a075 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -12,15 +12,21 @@ dependencies:
   flutter:
     sdk: flutter
 
+  # common
+  flutter_custom_toolbox:
+    git:
+      url: https://git.harrault.fr/android/flutter-toolbox.git
+      ref: 3-add-exports-for-base-dependencies
+    #   ref: 0.0.2
+
   # base
-  auto_size_text: ^3.0.0
-  easy_localization: ^3.0.1
-  equatable: ^2.0.5
-  flutter_bloc: ^8.1.1
-  hive: ^2.2.3
-  hydrated_bloc: ^9.0.0
+#   easy_localization: ^3.0.1
+#   equatable: ^2.0.5
+#   flutter_bloc: ^8.1.1
+#   hive: ^2.2.3
+#   hydrated_bloc: ^9.0.0
   package_info_plus: ^8.0.0
-  path_provider: ^2.0.11
+#   path_provider: ^2.0.11
   unicons: ^3.0.0
 
   # specific