diff --git a/scribe/lib/scribe/ai/presentation/styles/ai_scribe_styles.dart b/scribe/lib/scribe/ai/presentation/styles/ai_scribe_styles.dart index 1bb6d28f7..01b35fa51 100644 --- a/scribe/lib/scribe/ai/presentation/styles/ai_scribe_styles.dart +++ b/scribe/lib/scribe/ai/presentation/styles/ai_scribe_styles.dart @@ -161,6 +161,7 @@ abstract final class AIScribeSizes { static const double submenuSpacing = 6; static const double modalSpacing = 26; static const double modalWithoutContentSpacing = 12; + static const double keyboardSpacing = 12; // Elevation static const double dialogElevation = 8; diff --git a/scribe/lib/scribe/ai/presentation/widgets/modal/ai_scribe_modal_widget.dart b/scribe/lib/scribe/ai/presentation/widgets/modal/ai_scribe_modal_widget.dart index 9ad44f3a5..04d48d42b 100644 --- a/scribe/lib/scribe/ai/presentation/widgets/modal/ai_scribe_modal_widget.dart +++ b/scribe/lib/scribe/ai/presentation/widgets/modal/ai_scribe_modal_widget.dart @@ -73,15 +73,21 @@ class AiScribeModalWidget extends StatelessWidget { if (buttonPosition != null && buttonSize != null) { final keyboardHeight = MediaQuery.of(context).viewInsets.bottom; + final keyboardHeightWithSpacing = keyboardHeight > 0 ? keyboardHeight + AIScribeSizes.keyboardSpacing : 0; final screenSize = MediaQuery.of(context).size; - final availableHeight = screenSize.height - keyboardHeight; - + final availableHeight = screenSize.height - keyboardHeightWithSpacing; + + // in tablet mode where we can encounter keyboard and modal we have issues + // with calculating the modal height and the search bar is frequently behind the keyboard + // that's why we take more space here + final searchBarHeight = keyboardHeight > 0 ? AIScribeSizes.searchBarMaxHeight : AIScribeSizes.searchBarMinHeight; + final maxHeightModal = hasContent - ? AIScribeSizes.searchBarMinHeight + + ? searchBarHeight + AIScribeSizes.fieldSpacing + min(menuActions.length * AIScribeSizes.menuItemHeight, AIScribeSizes.submenuMaxHeight) - : AIScribeSizes.searchBarMinHeight; + : searchBarHeight; final layoutResult = AnchoredModalLayoutCalculator.calculate( input: AnchoredModalLayoutInput( diff --git a/scribe/lib/scribe/ai/presentation/widgets/modal/ai_scribe_suggestion_widget.dart b/scribe/lib/scribe/ai/presentation/widgets/modal/ai_scribe_suggestion_widget.dart index 3af57b73b..328c84e69 100644 --- a/scribe/lib/scribe/ai/presentation/widgets/modal/ai_scribe_suggestion_widget.dart +++ b/scribe/lib/scribe/ai/presentation/widgets/modal/ai_scribe_suggestion_widget.dart @@ -50,8 +50,9 @@ class _AiScribeSuggestionWidgetState extends State @override Widget build(BuildContext context) { final keyboardHeight = MediaQuery.of(context).viewInsets.bottom; + final keyboardHeightWithSpacing = keyboardHeight > 0 ? keyboardHeight + AIScribeSizes.keyboardSpacing : 0; final screenSize = MediaQuery.of(context).size; - final availableHeight = screenSize.height - keyboardHeight; + final availableHeight = screenSize.height - keyboardHeightWithSpacing; final modalWidth = min( screenSize.width * AIScribeSizes.mobileFactor, @@ -97,7 +98,10 @@ class _AiScribeSuggestionWidgetState extends State ), PositionedDirectional( start: layout.left, - bottom: layout.bottom, + // layout.bottom is calculated by taking keyboard into account + // but positionned without taking keyboard into account + // that's why we need to add keyboard height here + bottom: layout.bottom + keyboardHeightWithSpacing, child: _buildModalContainer( width: modalWidth, maxHeight: layout.availableHeight,