From 5bdcff5aba73485f01f72b11be0c022d2ec930b4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Th=C3=A9o=20Poizat?= Date: Tue, 13 Jan 2026 07:46:52 +0100 Subject: [PATCH] Extract Scribe menu item text and icons in components --- scribe/lib/scribe.dart | 3 ++ .../widgets/items/ai_scribe_menu_icon.dart | 24 ++++++++++++++ .../widgets/items/ai_scribe_menu_item.dart | 33 ++----------------- .../items/ai_scribe_menu_submenu_icon.dart | 24 ++++++++++++++ .../widgets/items/ai_scribe_menu_text.dart | 20 +++++++++++ 5 files changed, 74 insertions(+), 30 deletions(-) create mode 100644 scribe/lib/scribe/ai/presentation/widgets/items/ai_scribe_menu_icon.dart create mode 100644 scribe/lib/scribe/ai/presentation/widgets/items/ai_scribe_menu_submenu_icon.dart create mode 100644 scribe/lib/scribe/ai/presentation/widgets/items/ai_scribe_menu_text.dart diff --git a/scribe/lib/scribe.dart b/scribe/lib/scribe.dart index f032511d8..fd54766cb 100644 --- a/scribe/lib/scribe.dart +++ b/scribe/lib/scribe.dart @@ -34,6 +34,9 @@ export 'scribe/ai/presentation/widgets/context_menu/ai_scribe_context_menu_item. export 'scribe/ai/presentation/widgets/context_menu/ai_scribe_submenu.dart'; export 'scribe/ai/presentation/widgets/items/ai_scribe_menu_item.dart'; export 'scribe/ai/presentation/widgets/items/ai_scribe_submenu_item.dart'; +export 'scribe/ai/presentation/widgets/items/ai_scribe_menu_icon.dart'; +export 'scribe/ai/presentation/widgets/items/ai_scribe_menu_submenu_icon.dart'; +export 'scribe/ai/presentation/widgets/items/ai_scribe_menu_text.dart'; export 'scribe/ai/presentation/widgets/modal/ai_scribe_modal_widget.dart'; export 'scribe/ai/presentation/widgets/modal/ai_scribe_suggestion_widget.dart'; export 'scribe/ai/presentation/widgets/modal/suggestion/ai_scribe_suggestion_error.dart'; diff --git a/scribe/lib/scribe/ai/presentation/widgets/items/ai_scribe_menu_icon.dart b/scribe/lib/scribe/ai/presentation/widgets/items/ai_scribe_menu_icon.dart new file mode 100644 index 000000000..40123a0a5 --- /dev/null +++ b/scribe/lib/scribe/ai/presentation/widgets/items/ai_scribe_menu_icon.dart @@ -0,0 +1,24 @@ +import 'package:core/presentation/extensions/color_extension.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_svg/flutter_svg.dart'; + +class AiScribeMenuIcon extends StatelessWidget { + final String iconPath; + + const AiScribeMenuIcon({super.key, required this.iconPath}); + + @override + Widget build(BuildContext context) { + return Padding( + padding: const EdgeInsetsDirectional.only(end: 12), + child: SvgPicture.asset( + iconPath, + width: 20, + height: 20, + fit: BoxFit.fill, + colorFilter: + AppColor.gray424244.withValues(alpha: 0.72).asFilter(), + ), + ); + } +} \ No newline at end of file diff --git a/scribe/lib/scribe/ai/presentation/widgets/items/ai_scribe_menu_item.dart b/scribe/lib/scribe/ai/presentation/widgets/items/ai_scribe_menu_item.dart index 86e601c79..aabf19bff 100644 --- a/scribe/lib/scribe/ai/presentation/widgets/items/ai_scribe_menu_item.dart +++ b/scribe/lib/scribe/ai/presentation/widgets/items/ai_scribe_menu_item.dart @@ -1,7 +1,6 @@ import 'package:core/presentation/extensions/color_extension.dart'; import 'package:core/presentation/resources/image_paths.dart'; import 'package:flutter/material.dart'; -import 'package:flutter_svg/flutter_svg.dart'; import 'package:scribe/scribe.dart'; typedef OnHoverAction = void Function(bool); @@ -38,36 +37,10 @@ class AiScribeMenuItem extends StatelessWidget { child: Row( children: [ if (menuAction.actionIcon != null) - Padding( - padding: const EdgeInsetsDirectional.only(end: 12), - child: SvgPicture.asset( - menuAction.actionIcon!, - width: 20, - height: 20, - fit: BoxFit.fill, - colorFilter: - AppColor.gray424244.withValues(alpha: 0.72).asFilter(), - ), - ), - Flexible( - child: Text( - menuAction.actionName, - style: AIScribeTextStyles.menuItem, - maxLines: 1, - overflow: TextOverflow.ellipsis, - ), - ), + AiScribeMenuIcon(iconPath: menuAction.actionIcon!), + AiScribeMenuText(text: menuAction.actionName), if (menuAction.hasSubmenu) - Padding( - padding: const EdgeInsetsDirectional.only(start: 3), - child: SvgPicture.asset( - imagePaths.icArrowRight, - width: 16, - height: 16, - fit: BoxFit.fill, - colorFilter: AppColor.gray777778.asFilter(), - ), - ), + AiScribeMenuSubmenuIcon(imagePaths: imagePaths), ], ), ), diff --git a/scribe/lib/scribe/ai/presentation/widgets/items/ai_scribe_menu_submenu_icon.dart b/scribe/lib/scribe/ai/presentation/widgets/items/ai_scribe_menu_submenu_icon.dart new file mode 100644 index 000000000..413acccc7 --- /dev/null +++ b/scribe/lib/scribe/ai/presentation/widgets/items/ai_scribe_menu_submenu_icon.dart @@ -0,0 +1,24 @@ +import 'package:core/presentation/extensions/color_extension.dart'; +import 'package:core/presentation/resources/image_paths.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_svg/flutter_svg.dart'; + +class AiScribeMenuSubmenuIcon extends StatelessWidget { + final ImagePaths imagePaths; + + const AiScribeMenuSubmenuIcon({super.key, required this.imagePaths}); + + @override + Widget build(BuildContext context) { + return Padding( + padding: const EdgeInsetsDirectional.only(start: 3), + child: SvgPicture.asset( + imagePaths.icArrowRight, + width: 16, + height: 16, + fit: BoxFit.fill, + colorFilter: AppColor.gray777778.asFilter(), + ), + ); + } +} \ No newline at end of file diff --git a/scribe/lib/scribe/ai/presentation/widgets/items/ai_scribe_menu_text.dart b/scribe/lib/scribe/ai/presentation/widgets/items/ai_scribe_menu_text.dart new file mode 100644 index 000000000..5f6fcdaf8 --- /dev/null +++ b/scribe/lib/scribe/ai/presentation/widgets/items/ai_scribe_menu_text.dart @@ -0,0 +1,20 @@ +import 'package:flutter/material.dart'; +import 'package:scribe/scribe.dart'; + +class AiScribeMenuText extends StatelessWidget { + final String text; + + const AiScribeMenuText({super.key, required this.text}); + + @override + Widget build(BuildContext context) { + return Flexible( + child: Text( + text, + style: AIScribeTextStyles.menuItem, + maxLines: 1, + overflow: TextOverflow.ellipsis, + ), + ); + } +} \ No newline at end of file