diff --git a/lib/app/app.dart b/lib/app/app.dart index 6b30d595..bba6d3ed 100644 --- a/lib/app/app.dart +++ b/lib/app/app.dart @@ -5,7 +5,7 @@ import 'package:querya_desktop/core/motion/querya_motion_scope.dart'; import 'package:querya_desktop/core/motion/querya_theme_motion.dart'; import 'package:querya_desktop/core/theme/animated_querya_theme.dart'; import 'package:querya_desktop/core/theme/theme_controller.dart'; -import 'package:shadcn_flutter/shadcn_flutter.dart' hide TextExtension; +import 'package:shadcn_flutter/shadcn_flutter.dart' hide Gap, TextExtension; import 'app_lifecycle_cleanup.dart'; import '../features/main_screen/main_screen.dart'; diff --git a/lib/core/editor/querya_code_editor.dart b/lib/core/editor/querya_code_editor.dart index c1988c80..2c116935 100644 --- a/lib/core/editor/querya_code_editor.dart +++ b/lib/core/editor/querya_code_editor.dart @@ -2,7 +2,7 @@ import 'package:flutter/material.dart' as material; import 'package:querya_desktop/core/theme/querya_editor_theme.dart'; import 'package:querya_desktop/core/theme/querya_theme.dart'; import 'package:querya_desktop/core/theme/querya_theme_scope.dart'; -import 'package:shadcn_flutter/shadcn_flutter.dart' hide TextExtension; +import 'package:shadcn_flutter/shadcn_flutter.dart' hide Gap, TextExtension; import 'querya_code_language.dart'; import 'querya_highlight_controller.dart'; diff --git a/lib/core/layout/querya_split_handle.dart b/lib/core/layout/querya_split_handle.dart index 0e7be5c0..0c888f8f 100644 --- a/lib/core/layout/querya_split_handle.dart +++ b/lib/core/layout/querya_split_handle.dart @@ -2,7 +2,7 @@ import 'package:flutter/material.dart' as material; import 'package:flutter/services.dart'; import 'package:querya_desktop/core/motion/querya_motion.dart'; import 'package:querya_desktop/core/motion/querya_motion_context.dart'; -import 'package:shadcn_flutter/shadcn_flutter.dart' hide TextExtension; +import 'package:shadcn_flutter/shadcn_flutter.dart' hide Gap, TextExtension; /// Accessible split-pane handle that supports mouse dragging and arrow keys. /// diff --git a/lib/core/layout/vertical_split_pane.dart b/lib/core/layout/vertical_split_pane.dart index fc969790..5b5f6cdc 100644 --- a/lib/core/layout/vertical_split_pane.dart +++ b/lib/core/layout/vertical_split_pane.dart @@ -1,8 +1,8 @@ +import 'package:flutter/widgets.dart'; import 'package:flutter/material.dart' as material; import 'package:querya_desktop/core/layout/querya_drag_settle.dart'; import 'package:querya_desktop/core/layout/querya_split_handle.dart'; import 'package:querya_desktop/core/motion/querya_spring.dart'; -import 'package:shadcn_flutter/shadcn_flutter.dart' hide TextExtension; /// Counts full rebuilds of [VerticalSplitPane]'s body (cache misses) — should /// only fire when the pane's height or its top/bottom/fraction/etc. inputs diff --git a/lib/core/storage/app_settings.dart b/lib/core/storage/app_settings.dart index 83e38f2a..f035cc97 100644 --- a/lib/core/storage/app_settings.dart +++ b/lib/core/storage/app_settings.dart @@ -1,7 +1,7 @@ import 'dart:convert'; -import 'package:shadcn_flutter/shadcn_flutter.dart' hide TextExtension; +import 'package:shadcn_flutter/shadcn_flutter.dart' hide Gap, TextExtension; import '../motion/querya_motion_scope.dart'; import '../theme/querya_theme_preset.dart'; diff --git a/lib/core/theme/app_theme.dart b/lib/core/theme/app_theme.dart index 3d8f3758..8da7ae8c 100644 --- a/lib/core/theme/app_theme.dart +++ b/lib/core/theme/app_theme.dart @@ -1,4 +1,4 @@ -import 'package:shadcn_flutter/shadcn_flutter.dart' hide TextExtension; +import 'package:shadcn_flutter/shadcn_flutter.dart' hide Gap, TextExtension; import 'querya_theme.dart'; diff --git a/lib/core/theme/parser/querya_theme_color_scheme.dart b/lib/core/theme/parser/querya_theme_color_scheme.dart index fd962e31..9d156974 100644 --- a/lib/core/theme/parser/querya_theme_color_scheme.dart +++ b/lib/core/theme/parser/querya_theme_color_scheme.dart @@ -1,7 +1,7 @@ // ignore_for_file: deprecated_member_use import 'package:flutter/foundation.dart'; -import 'package:shadcn_flutter/shadcn_flutter.dart' hide TextExtension; +import 'package:shadcn_flutter/shadcn_flutter.dart' hide Gap, TextExtension; import '../querya_theme.dart'; import 'color_parser.dart'; diff --git a/lib/core/theme/querya_color_scheme.dart b/lib/core/theme/querya_color_scheme.dart index 177efc15..7b87a0b6 100644 --- a/lib/core/theme/querya_color_scheme.dart +++ b/lib/core/theme/querya_color_scheme.dart @@ -1,4 +1,4 @@ -import 'package:shadcn_flutter/shadcn_flutter.dart' hide TextExtension; +import 'package:shadcn_flutter/shadcn_flutter.dart' hide Gap, TextExtension; import 'querya_theme.dart'; diff --git a/lib/core/theme/querya_theme.dart b/lib/core/theme/querya_theme.dart index 3b3cc333..33c4cfca 100644 --- a/lib/core/theme/querya_theme.dart +++ b/lib/core/theme/querya_theme.dart @@ -1,4 +1,4 @@ -import 'package:shadcn_flutter/shadcn_flutter.dart' hide TextExtension; +import 'package:shadcn_flutter/shadcn_flutter.dart' hide Gap, TextExtension; import 'color_contrast.dart'; import 'parser/vscode_theme_manifest.dart'; diff --git a/lib/core/theme/theme_controller.dart b/lib/core/theme/theme_controller.dart index 711e019c..3c8ce91b 100644 --- a/lib/core/theme/theme_controller.dart +++ b/lib/core/theme/theme_controller.dart @@ -4,7 +4,7 @@ import 'dart:io'; import 'package:flutter/material.dart' as material; import 'package:querya_desktop/core/storage/app_settings.dart'; import 'package:querya_desktop/core/theme/querya_material_theme.dart'; -import 'package:shadcn_flutter/shadcn_flutter.dart' hide TextExtension; +import 'package:shadcn_flutter/shadcn_flutter.dart' hide Gap, TextExtension; import 'parser/apply_token_colors_to_editor.dart'; import 'parser/color_parser.dart'; diff --git a/lib/features/erd/erd_view.dart b/lib/features/erd/erd_view.dart index adc5e310..aa7ad360 100644 --- a/lib/features/erd/erd_view.dart +++ b/lib/features/erd/erd_view.dart @@ -43,7 +43,7 @@ import 'package:querya_desktop/features/erd/widgets/erd_views_menu.dart'; import 'package:querya_desktop/features/erd/widgets/erd_table_card.dart'; import 'package:querya_desktop/shared/widgets/app_toast.dart'; import 'package:querya_desktop/shared/widgets/querya_spinner.dart'; -import 'package:shadcn_flutter/shadcn_flutter.dart' hide TextExtension; +import 'package:shadcn_flutter/shadcn_flutter.dart' hide Gap, TextExtension; // Moved out of this file (#1362); re-exported for existing importers. export 'package:querya_desktop/features/erd/widgets/erd_relation_painter.dart' diff --git a/lib/features/erd/widgets/erd_edge_tip_label.dart b/lib/features/erd/widgets/erd_edge_tip_label.dart index c0eaa35b..30afe693 100644 --- a/lib/features/erd/widgets/erd_edge_tip_label.dart +++ b/lib/features/erd/widgets/erd_edge_tip_label.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart' as material; import 'package:querya_desktop/core/erd/erd_model.dart'; -import 'package:shadcn_flutter/shadcn_flutter.dart' hide TextExtension; +import 'package:shadcn_flutter/shadcn_flutter.dart' hide Gap, TextExtension; /// "orders.customer_id → customers.id" next to the pointer. class ErdEdgeTipLabel extends material.StatelessWidget { diff --git a/lib/features/erd/widgets/erd_group_frame.dart b/lib/features/erd/widgets/erd_group_frame.dart index 0eccb960..dee5b89a 100644 --- a/lib/features/erd/widgets/erd_group_frame.dart +++ b/lib/features/erd/widgets/erd_group_frame.dart @@ -4,7 +4,7 @@ import 'package:flutter/gestures.dart' show DragStartBehavior; import 'package:flutter/material.dart' as material; import 'package:querya_desktop/core/erd/erd_layout.dart'; import 'package:querya_desktop/core/erd/erd_saved_layout.dart'; -import 'package:shadcn_flutter/shadcn_flutter.dart' hide TextExtension; +import 'package:shadcn_flutter/shadcn_flutter.dart' hide Gap, TextExtension; /// A group's frame on the canvas: a tinted box that takes no pointer, and its /// title, which drags the whole group and has the group's menu. diff --git a/lib/features/erd/widgets/erd_group_menu.dart b/lib/features/erd/widgets/erd_group_menu.dart index a8c718d7..004eb802 100644 --- a/lib/features/erd/widgets/erd_group_menu.dart +++ b/lib/features/erd/widgets/erd_group_menu.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart' as material; import 'package:querya_desktop/core/erd/erd_saved_layout.dart'; -import 'package:shadcn_flutter/shadcn_flutter.dart' hide TextExtension; +import 'package:shadcn_flutter/shadcn_flutter.dart' hide Gap, TextExtension; /// Group entries of a card's menu: group it (with the marked tables), add it /// to a group, take it out of its group. diff --git a/lib/features/erd/widgets/erd_note_card.dart b/lib/features/erd/widgets/erd_note_card.dart index ebc9f87a..69b55bad 100644 --- a/lib/features/erd/widgets/erd_note_card.dart +++ b/lib/features/erd/widgets/erd_note_card.dart @@ -3,7 +3,7 @@ import 'package:flutter/material.dart' as material; import 'package:querya_desktop/core/erd/erd_note_text.dart'; import 'package:querya_desktop/core/erd/erd_saved_layout.dart'; import 'package:querya_desktop/core/theme/querya_theme_scope.dart'; -import 'package:shadcn_flutter/shadcn_flutter.dart' hide TextExtension; +import 'package:shadcn_flutter/shadcn_flutter.dart' hide Gap, TextExtension; /// A sticky note on the canvas: draggable by its body, resizable by its /// corner, with an edit / colour / attach / delete menu (#1283). diff --git a/lib/features/erd/widgets/erd_search_panel.dart b/lib/features/erd/widgets/erd_search_panel.dart index ec8eb8dc..f708b87c 100644 --- a/lib/features/erd/widgets/erd_search_panel.dart +++ b/lib/features/erd/widgets/erd_search_panel.dart @@ -1,9 +1,9 @@ +import 'package:flutter/widgets.dart'; import 'package:flutter/material.dart' as material; import 'package:querya_desktop/core/erd/erd_model.dart'; import 'package:querya_desktop/core/theme/querya_theme_scope.dart'; import 'package:querya_desktop/shared/widgets/querya_search_field.dart'; import 'package:querya_desktop/shared/widgets/querya_text.dart'; -import 'package:shadcn_flutter/shadcn_flutter.dart' hide TextExtension; /// Find-a-table field and the tables it matches. Enter picks the first. class ErdSearchPanel extends material.StatelessWidget { diff --git a/lib/features/erd/widgets/erd_table_card.dart b/lib/features/erd/widgets/erd_table_card.dart index a292d7a9..1150e735 100644 --- a/lib/features/erd/widgets/erd_table_card.dart +++ b/lib/features/erd/widgets/erd_table_card.dart @@ -1,10 +1,10 @@ +import 'package:flutter/widgets.dart'; import 'package:flutter/gestures.dart' show DragStartBehavior; import 'package:flutter/material.dart' as material; import 'package:querya_desktop/core/erd/erd_model.dart'; import 'package:querya_desktop/core/theme/querya_theme_scope.dart'; import 'package:querya_desktop/core/theme/querya_typography.dart'; import 'package:querya_desktop/core/erd/erd_layout.dart'; -import 'package:shadcn_flutter/shadcn_flutter.dart' hide TextExtension; /// A card's share of the focus: highlighted, faded, and the column of a /// picked relation on it, if any. diff --git a/lib/features/erd/widgets/erd_table_menu.dart b/lib/features/erd/widgets/erd_table_menu.dart index 4802b980..c5a81341 100644 --- a/lib/features/erd/widgets/erd_table_menu.dart +++ b/lib/features/erd/widgets/erd_table_menu.dart @@ -1,7 +1,7 @@ import 'package:flutter/material.dart' as material; import 'package:flutter/services.dart' show Clipboard, ClipboardData; import 'package:querya_desktop/core/erd/erd_saved_layout.dart'; -import 'package:shadcn_flutter/shadcn_flutter.dart' hide TextExtension; +import 'package:shadcn_flutter/shadcn_flutter.dart' hide Gap, TextExtension; /// The entries of a table card's context menu. abstract final class ErdTableMenu { diff --git a/lib/features/main_screen/querya_window_title_bar.dart b/lib/features/main_screen/querya_window_title_bar.dart index 0219599c..5bd6103a 100644 --- a/lib/features/main_screen/querya_window_title_bar.dart +++ b/lib/features/main_screen/querya_window_title_bar.dart @@ -20,7 +20,8 @@ import 'package:querya_desktop/features/updater/update_dialog.dart'; import 'package:querya_desktop/core/actions/sql_editor_actions.dart'; import 'package:querya_desktop/shared/widgets/querya_icon_button.dart'; import 'package:querya_desktop/shared/widgets/querya_text.dart'; -import 'package:shadcn_flutter/shadcn_flutter.dart' hide TextExtension; +import 'package:gap/gap.dart'; +import 'package:shadcn_flutter/shadcn_flutter.dart' hide Gap, TextExtension; /// Custom bitsdojo title bar styled from [QueryaThemeScope] workbench tokens. class QueryaWindowTitleBar extends StatelessWidget { diff --git a/lib/features/mongodb/mongo_document_tree_view.dart b/lib/features/mongodb/mongo_document_tree_view.dart index c4d88bc9..c601fc9b 100644 --- a/lib/features/mongodb/mongo_document_tree_view.dart +++ b/lib/features/mongodb/mongo_document_tree_view.dart @@ -9,7 +9,8 @@ import 'package:querya_desktop/core/theme/querya_typography.dart'; import 'package:querya_desktop/features/mongodb/mongo_ejson.dart'; import 'package:querya_desktop/features/mongodb/mongo_field_codec.dart'; import 'package:querya_desktop/shared/widgets/app_toast.dart'; -import 'package:shadcn_flutter/shadcn_flutter.dart' hide TextExtension; +import 'package:gap/gap.dart'; +import 'package:shadcn_flutter/shadcn_flutter.dart' hide Gap, TextExtension; import 'package:querya_desktop/core/ui/querya_control_tokens.dart'; import 'package:querya_desktop/shared/widgets/querya_button.dart'; import 'package:querya_desktop/shared/widgets/querya_divider.dart'; diff --git a/lib/features/mongodb/mongo_documents_json_view.dart b/lib/features/mongodb/mongo_documents_json_view.dart index 793958d8..b4aecadb 100644 --- a/lib/features/mongodb/mongo_documents_json_view.dart +++ b/lib/features/mongodb/mongo_documents_json_view.dart @@ -5,7 +5,8 @@ import 'package:querya_desktop/core/editor/querya_code_language.dart'; import 'package:querya_desktop/core/editor/syntax_highlight_service.dart'; import 'package:querya_desktop/features/mongodb/mongo_ejson.dart'; import 'package:querya_desktop/shared/widgets/app_toast.dart'; -import 'package:shadcn_flutter/shadcn_flutter.dart' hide TextExtension; +import 'package:gap/gap.dart'; +import 'package:shadcn_flutter/shadcn_flutter.dart' hide Gap, TextExtension; import 'package:querya_desktop/core/ui/querya_control_tokens.dart'; import 'package:querya_desktop/shared/widgets/querya_button.dart'; import 'package:querya_desktop/shared/widgets/querya_text.dart'; diff --git a/lib/features/mongodb/mongo_documents_table_view.dart b/lib/features/mongodb/mongo_documents_table_view.dart index e82a3982..8a0786a7 100644 --- a/lib/features/mongodb/mongo_documents_table_view.dart +++ b/lib/features/mongodb/mongo_documents_table_view.dart @@ -4,7 +4,8 @@ import 'package:mongo_dart/mongo_dart.dart' show ObjectId; import 'package:querya_desktop/features/mongodb/mongo_ejson.dart'; import 'package:querya_desktop/features/workspace/result_grid_view.dart'; import 'package:querya_desktop/shared/widgets/app_toast.dart'; -import 'package:shadcn_flutter/shadcn_flutter.dart' hide TextExtension; +import 'package:gap/gap.dart'; +import 'package:shadcn_flutter/shadcn_flutter.dart' hide Gap, TextExtension; import 'package:querya_desktop/core/ui/querya_control_tokens.dart'; import 'package:querya_desktop/shared/widgets/querya_button.dart'; import 'package:querya_desktop/shared/widgets/querya_text.dart'; diff --git a/lib/features/settings/preferences_controls.dart b/lib/features/settings/preferences_controls.dart index 264909f5..c3b03514 100644 --- a/lib/features/settings/preferences_controls.dart +++ b/lib/features/settings/preferences_controls.dart @@ -7,7 +7,7 @@ import 'package:querya_desktop/core/layout/ui_scale.dart'; import 'package:querya_desktop/core/storage/app_settings.dart'; import 'package:querya_desktop/shared/widgets/querya_dropdown.dart'; import 'package:querya_desktop/shared/widgets/querya_text.dart'; -import 'package:shadcn_flutter/shadcn_flutter.dart' hide TextExtension; +import 'package:shadcn_flutter/shadcn_flutter.dart' hide Gap, TextExtension; /// Helper / hint copy in Preferences — readable on imported themes. class PreferencesHint extends StatelessWidget { diff --git a/lib/features/settings/theme_picker_button.dart b/lib/features/settings/theme_picker_button.dart index 94c0315b..73729a06 100644 --- a/lib/features/settings/theme_picker_button.dart +++ b/lib/features/settings/theme_picker_button.dart @@ -8,7 +8,7 @@ import 'package:querya_desktop/core/theme/querya_theme.dart'; import 'package:querya_desktop/core/theme/theme_definition.dart'; import 'package:querya_desktop/features/settings/theme_preview_card.dart'; import 'package:querya_desktop/shared/widgets/querya_dropdown_tokens.dart'; -import 'package:shadcn_flutter/shadcn_flutter.dart' hide TextExtension; +import 'package:shadcn_flutter/shadcn_flutter.dart' hide Gap, TextExtension; /// Debounce delay before requesting a hover preview load. const Duration themePreviewDebounce = Duration(milliseconds: 120); diff --git a/lib/features/updater/update_available_badge.dart b/lib/features/updater/update_available_badge.dart index 71e9e098..43a5c97b 100644 --- a/lib/features/updater/update_available_badge.dart +++ b/lib/features/updater/update_available_badge.dart @@ -1,3 +1,4 @@ +import 'package:flutter/widgets.dart'; import 'dart:async' show unawaited; import 'package:flutter/material.dart' as material; @@ -8,7 +9,6 @@ import 'package:querya_desktop/core/theme/querya_theme_scope.dart'; import 'package:querya_desktop/features/updater/update_controller.dart'; import 'package:querya_desktop/features/updater/update_dialog.dart'; import 'package:querya_desktop/shared/widgets/querya_text.dart'; -import 'package:shadcn_flutter/shadcn_flutter.dart' hide TextExtension; /// Soft pulse period for the update chip at Full motion (see F9 / #482). /// diff --git a/lib/features/updater/update_changelog_view.dart b/lib/features/updater/update_changelog_view.dart index a8113ba0..bfc565bb 100644 --- a/lib/features/updater/update_changelog_view.dart +++ b/lib/features/updater/update_changelog_view.dart @@ -1,7 +1,7 @@ import 'dart:convert'; import 'package:flutter/material.dart' as material; -import 'package:shadcn_flutter/shadcn_flutter.dart' hide TextExtension; +import 'package:shadcn_flutter/shadcn_flutter.dart' hide Gap, TextExtension; import 'package:querya_desktop/shared/widgets/querya_text.dart'; /// Lightweight Markdown-ish renderer for GitHub release notes. diff --git a/lib/features/workspace/data_grid_calc_bar.dart b/lib/features/workspace/data_grid_calc_bar.dart index c3de21d4..f4767d57 100644 --- a/lib/features/workspace/data_grid_calc_bar.dart +++ b/lib/features/workspace/data_grid_calc_bar.dart @@ -3,7 +3,8 @@ import 'package:flutter/services.dart'; import 'package:querya_desktop/core/motion/querya_animated_expand.dart'; import 'package:querya_desktop/core/theme/querya_typography.dart'; import 'package:querya_desktop/features/workspace/grid_selection_calc_engine.dart'; -import 'package:shadcn_flutter/shadcn_flutter.dart' hide TextExtension; +import 'package:gap/gap.dart'; +import 'package:shadcn_flutter/shadcn_flutter.dart' hide Gap, TextExtension; /// Status bar footer for Data Grid displaying live selection statistics (Count, Distinct, Sum, Avg, Median, Min, Max). class DataGridCalcBar extends StatelessWidget { diff --git a/lib/features/workspace/data_grid_filter_bar.dart b/lib/features/workspace/data_grid_filter_bar.dart index 74cd2cc6..4b3d8056 100644 --- a/lib/features/workspace/data_grid_filter_bar.dart +++ b/lib/features/workspace/data_grid_filter_bar.dart @@ -4,7 +4,8 @@ import 'package:flutter/services.dart' show KeyDownEvent, LogicalKeyboardKey; import 'package:querya_desktop/core/ui/querya_control_tokens.dart'; import 'package:querya_desktop/shared/widgets/querya_icon_button.dart'; import 'package:querya_desktop/shared/widgets/querya_text.dart'; -import 'package:shadcn_flutter/shadcn_flutter.dart' hide TextExtension; +import 'package:gap/gap.dart'; +import 'package:shadcn_flutter/shadcn_flutter.dart' hide Gap, TextExtension; /// Kind of filter autocomplete suggestion. enum FilterSuggestionKind { diff --git a/lib/features/workspace/data_grid_value_panel.dart b/lib/features/workspace/data_grid_value_panel.dart index f642b5c9..ef187eec 100644 --- a/lib/features/workspace/data_grid_value_panel.dart +++ b/lib/features/workspace/data_grid_value_panel.dart @@ -9,7 +9,8 @@ import 'package:querya_desktop/shared/widgets/querya_button.dart'; import 'package:querya_desktop/shared/widgets/querya_dropdown.dart'; import 'package:querya_desktop/shared/widgets/querya_icon_button.dart'; import 'package:querya_desktop/shared/widgets/querya_text.dart'; -import 'package:shadcn_flutter/shadcn_flutter.dart' hide TextExtension; +import 'package:gap/gap.dart'; +import 'package:shadcn_flutter/shadcn_flutter.dart' hide Gap, TextExtension; import 'xml_html_formatter.dart'; diff --git a/lib/features/workspace/grid/grid_column_sizer.dart b/lib/features/workspace/grid/grid_column_sizer.dart index b319a9c1..c4a19ab1 100644 --- a/lib/features/workspace/grid/grid_column_sizer.dart +++ b/lib/features/workspace/grid/grid_column_sizer.dart @@ -1,6 +1,6 @@ +import 'package:flutter/widgets.dart'; import 'dart:math' as math; -import 'package:shadcn_flutter/shadcn_flutter.dart' hide TextExtension; /// Layout metrics for [VirtualResultGrid]. abstract final class ResultGridMetrics { diff --git a/lib/features/workspace/grid/grid_selection_manager.dart b/lib/features/workspace/grid/grid_selection_manager.dart index c9a03fe9..d1f41d49 100644 --- a/lib/features/workspace/grid/grid_selection_manager.dart +++ b/lib/features/workspace/grid/grid_selection_manager.dart @@ -1,6 +1,6 @@ +import 'package:flutter/widgets.dart'; import 'dart:convert'; -import 'package:shadcn_flutter/shadcn_flutter.dart' hide TextExtension; /// Coordinate of a cell in [VirtualResultGrid]. @immutable diff --git a/lib/features/workspace/grid_cell_editor.dart b/lib/features/workspace/grid_cell_editor.dart index 4ae8b71b..cb8737a3 100644 --- a/lib/features/workspace/grid_cell_editor.dart +++ b/lib/features/workspace/grid_cell_editor.dart @@ -4,7 +4,7 @@ import 'package:querya_desktop/core/motion/querya_motion.dart'; import 'package:querya_desktop/core/motion/querya_motion_context.dart'; import 'package:querya_desktop/core/theme/querya_typography.dart'; import 'package:querya_desktop/features/workspace/grid_data_type_validator.dart'; -import 'package:shadcn_flutter/shadcn_flutter.dart' hide TextExtension; +import 'package:shadcn_flutter/shadcn_flutter.dart' hide Gap, TextExtension; /// Active inline editor widget for a data grid cell. class GridCellEditor extends material.StatefulWidget { diff --git a/lib/features/workspace/query_editor_tab.dart b/lib/features/workspace/query_editor_tab.dart index 83f1674b..60716ef9 100644 --- a/lib/features/workspace/query_editor_tab.dart +++ b/lib/features/workspace/query_editor_tab.dart @@ -1,9 +1,9 @@ +import 'package:flutter/widgets.dart'; import 'package:flutter/material.dart' as material show EdgeInsets, Padding, TextEditingController; import 'package:querya_desktop/core/editor/querya_code_editor.dart'; import 'package:querya_desktop/core/editor/querya_code_language.dart'; import 'package:querya_desktop/features/workspace/sql_editor_chrome.dart'; -import 'package:shadcn_flutter/shadcn_flutter.dart' hide TextExtension; class QueryEditorTab extends StatelessWidget { const QueryEditorTab({ diff --git a/lib/features/workspace/result_grid_view.dart b/lib/features/workspace/result_grid_view.dart index bf1b8cdc..fc3202c4 100644 --- a/lib/features/workspace/result_grid_view.dart +++ b/lib/features/workspace/result_grid_view.dart @@ -24,7 +24,8 @@ import 'package:querya_desktop/features/workspace/grid_cell_popover_inspector.da import 'package:querya_desktop/features/workspace/grid/grid_column_sizer.dart'; import 'package:querya_desktop/features/workspace/grid/grid_selection_manager.dart'; import 'package:querya_desktop/features/workspace/grid/grid_sorting.dart'; -import 'package:shadcn_flutter/shadcn_flutter.dart' hide TextExtension; +import 'package:gap/gap.dart'; +import 'package:shadcn_flutter/shadcn_flutter.dart' hide Gap, TextExtension; export 'package:querya_desktop/features/workspace/grid/grid_column_sizer.dart'; export 'package:querya_desktop/features/workspace/grid/grid_selection_manager.dart'; diff --git a/lib/features/workspace/sql_editor_chrome.dart b/lib/features/workspace/sql_editor_chrome.dart index 9aabd99d..ac030816 100644 --- a/lib/features/workspace/sql_editor_chrome.dart +++ b/lib/features/workspace/sql_editor_chrome.dart @@ -2,7 +2,7 @@ import 'package:flutter/material.dart' as material; import 'package:querya_desktop/core/theme/querya_editor_theme.dart'; import 'package:querya_desktop/core/theme/querya_theme_scope.dart'; import 'package:querya_desktop/core/theme/querya_workbench_theme.dart'; -import 'package:shadcn_flutter/shadcn_flutter.dart' hide TextExtension; +import 'package:shadcn_flutter/shadcn_flutter.dart' hide Gap, TextExtension; /// Outer chrome for SQL editors and the results under them: one rounded card /// with a border. diff --git a/lib/shared/widgets/widgets.dart b/lib/shared/widgets/widgets.dart index 44aced82..716f3d60 100644 --- a/lib/shared/widgets/widgets.dart +++ b/lib/shared/widgets/widgets.dart @@ -42,4 +42,5 @@ export 'package:querya_desktop/core/motion/querya_animated_expand.dart'; export 'package:querya_desktop/core/motion/querya_fade_slide.dart'; export 'package:querya_desktop/core/theme/querya_theme_scope.dart' show QueryaThemeContext; -export 'package:shadcn_flutter/shadcn_flutter.dart' hide TextExtension; +export 'package:gap/gap.dart'; +export 'package:shadcn_flutter/shadcn_flutter.dart' hide Gap, MaxGap, SliverGap, TextExtension; diff --git a/pubspec.yaml b/pubspec.yaml index d6119139..422cf781 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -16,6 +16,8 @@ dependencies: crypto: ^3.0.6 refresh_rate: ^2.0.1 shadcn_flutter: ^0.0.52 + # Spacing widget; shadcn_flutter re-exported it, now taken directly (#1729). + gap: ^3.0.1 bitsdojo_window: ^0.1.6 path: ^1.9.0 path_provider: ^2.1.5 diff --git a/test/guards/shadcn_imports_ratchet_test.dart b/test/guards/shadcn_imports_ratchet_test.dart new file mode 100644 index 00000000..21f75833 --- /dev/null +++ b/test/guards/shadcn_imports_ratchet_test.dart @@ -0,0 +1,105 @@ +import 'dart:io'; + +import 'package:flutter_test/flutter_test.dart'; + +/// Epic #1465: `package:shadcn_flutter` is leaving `lib/`. A ratchet: the files +/// below still import it and may; no other file may start to, and a file +/// that drops the import leaves the list in the same change. +/// +/// `Gap` is the `gap` package's own (#1729): the barrel exports it directly +/// and a file that imports shadcn without a prefix hides shadcn's copy. +void main() { + const allowed = { + 'lib/app/app.dart', + 'lib/app/querya_core_commands.dart', + 'lib/core/editor/querya_code_editor.dart', + 'lib/core/layout/querya_split_handle.dart', + 'lib/core/storage/app_settings.dart', + 'lib/core/theme/app_theme.dart', + 'lib/core/theme/parser/querya_theme_color_scheme.dart', + 'lib/core/theme/querya_color_scheme.dart', + 'lib/core/theme/querya_material_theme.dart', + 'lib/core/theme/querya_theme.dart', + 'lib/core/theme/querya_theme_scope.dart', + 'lib/core/theme/theme_controller.dart', + 'lib/core/theme/theme_editor_draft.dart', + 'lib/features/erd/erd_export_data.dart', + 'lib/features/erd/erd_view.dart', + 'lib/features/erd/widgets/erd_edge_tip_label.dart', + 'lib/features/erd/widgets/erd_group_frame.dart', + 'lib/features/erd/widgets/erd_group_menu.dart', + 'lib/features/erd/widgets/erd_note_card.dart', + 'lib/features/erd/widgets/erd_table_menu.dart', + 'lib/features/extensions/extension_stats_view.dart', + 'lib/features/main_screen/querya_window_title_bar.dart', + 'lib/features/mongodb/mongo_collections_view.dart', + 'lib/features/mongodb/mongo_databases_view.dart', + 'lib/features/mongodb/mongo_document_editor.dart', + 'lib/features/mongodb/mongo_document_tree_view.dart', + 'lib/features/mongodb/mongo_documents_json_view.dart', + 'lib/features/mongodb/mongo_documents_table_view.dart', + 'lib/features/mongodb/mongo_documents_view.dart', + 'lib/features/mongodb/mongo_explorer_view.dart', + 'lib/features/mongodb/mongo_stats_view.dart', + 'lib/features/mysql/mysql_stats_view.dart', + 'lib/features/postgresql/postgres_stats_view.dart', + 'lib/features/redis/editors/redis_hash_editor.dart', + 'lib/features/redis/editors/redis_list_editor.dart', + 'lib/features/redis/editors/redis_set_editor.dart', + 'lib/features/redis/editors/redis_zset_editor.dart', + 'lib/features/redis/redis_databases_view.dart', + 'lib/features/redis/redis_explorer_view.dart', + 'lib/features/redis/redis_key_editor.dart', + 'lib/features/redis/redis_keys_view.dart', + 'lib/features/redis/redis_view.dart', + 'lib/features/settings/preferences_controls.dart', + 'lib/features/settings/theme_picker_button.dart', + 'lib/features/updater/update_changelog_view.dart', + 'lib/features/workspace/data_grid_calc_bar.dart', + 'lib/features/workspace/data_grid_filter_bar.dart', + 'lib/features/workspace/data_grid_value_panel.dart', + 'lib/features/workspace/grid_cell_editor.dart', + 'lib/features/workspace/result_grid_view.dart', + 'lib/features/workspace/sql_editor_chrome.dart', + 'lib/shared/widgets/widgets.dart', + }; + + final importsShadcn = RegExp('package:shadcn_flutter/'); + + Map sources() => { + for (final e in Directory('lib').listSync(recursive: true)) + if (e is File && e.path.endsWith('.dart')) + e.path.replaceAll(r'\', '/'): e.readAsStringSync(), + }; + + test('no new file imports shadcn_flutter', () { + final importing = { + for (final MapEntry(:key, :value) in sources().entries) + if (importsShadcn.hasMatch(value)) key, + }; + expect(importing.difference(allowed), isEmpty, + reason: 'New shadcn imports: use the kit or Flutter (#1465).'); + expect(allowed.difference(importing), isEmpty, + reason: 'These no longer import shadcn: take them off the list.'); + }); + + test('Gap comes from the gap package, not through shadcn', () { + final shadcnImport = RegExp( + r"import 'package:shadcn_flutter/shadcn_flutter\.dart'([^;]*);"); + final offenders = []; + for (final MapEntry(:key, :value) in sources().entries) { + final m = shadcnImport.firstMatch(value); + if (m == null) continue; + final spec = m.group(1)!; + // A prefixed import or a `show` list brings no unprefixed Gap. + if (spec.contains(' as ')) continue; + if (RegExp(r'\bshow\b').hasMatch(spec) && + !RegExp(r'\bGap\b').hasMatch(spec)) { + continue; + } + if (!RegExp(r'hide [^;]*\bGap\b').hasMatch(spec)) offenders.add(key); + } + expect(offenders, isEmpty, + reason: 'Import shadcn with `hide Gap` and take Gap from package:gap.'); + }); +}