From 59f8663633080dfcc8ec37f2d9a1a6242c9c6767 Mon Sep 17 00:00:00 2001 From: ZhuchkaTriplesix Date: Sun, 11 Oct 2026 07:13:23 +0300 Subject: [PATCH 1/3] refactor(ui): QueryaDropdown and QueryaDialogCard no longer import shadcn Add QueryaThemeColorScheme (the type of QueryaTheme.colorScheme) so widgets can name the scheme without the UI library, and a surface radius token for the dialog card (14, the value shadcn's radiusXxl gave). Both files leave the shadcn allow-list. Part of #1365. --- lib/core/theme/querya_theme.dart | 4 ++++ lib/core/ui/querya_control_tokens.dart | 3 +++ lib/shared/widgets/querya_dialog_card.dart | 7 ++++--- lib/shared/widgets/querya_dropdown.dart | 19 ++++++++++--------- .../shared_does_not_import_shadcn_test.dart | 2 -- 5 files changed, 21 insertions(+), 14 deletions(-) diff --git a/lib/core/theme/querya_theme.dart b/lib/core/theme/querya_theme.dart index 2a96df06..312da035 100644 --- a/lib/core/theme/querya_theme.dart +++ b/lib/core/theme/querya_theme.dart @@ -6,6 +6,10 @@ import 'querya_colors.dart'; import 'querya_editor_theme.dart'; import 'querya_workbench_theme.dart'; +/// The type of [QueryaTheme.colorScheme], nameable by widgets that must not +/// import the UI library behind it. +typedef QueryaThemeColorScheme = ColorScheme; + /// Full Querya theme: workbench chrome + editor tokens + shadcn [ColorScheme]. class QueryaTheme { const QueryaTheme({ diff --git a/lib/core/ui/querya_control_tokens.dart b/lib/core/ui/querya_control_tokens.dart index 76a2b0ed..12bb702d 100644 --- a/lib/core/ui/querya_control_tokens.dart +++ b/lib/core/ui/querya_control_tokens.dart @@ -20,6 +20,9 @@ abstract final class QueryaControlMetrics { /// One corner radius for buttons, icon buttons, dropdown triggers, search /// fields and tab pills. static const double radius = 6; + + /// Corner radius of dialog cards and other floating surfaces. + static const double surfaceRadius = 14; } /// One of the three control sizes of the Querya UI kit. Buttons, icon buttons, diff --git a/lib/shared/widgets/querya_dialog_card.dart b/lib/shared/widgets/querya_dialog_card.dart index 29f71fd8..35d94e14 100644 --- a/lib/shared/widgets/querya_dialog_card.dart +++ b/lib/shared/widgets/querya_dialog_card.dart @@ -1,5 +1,6 @@ import 'package:flutter/material.dart' as material; -import 'package:shadcn_flutter/shadcn_flutter.dart'; +import 'package:querya_desktop/core/theme/querya_theme_scope.dart'; +import 'package:querya_desktop/core/ui/querya_control_tokens.dart'; /// Dialog shell: [Material] popover fill (ListTile ink host) under the same /// [Container] constraints as the pre-migration shell. @@ -21,8 +22,8 @@ class QueryaDialogCard extends material.StatelessWidget { @override material.Widget build(material.BuildContext context) { - final theme = Theme.of(context).colorScheme; - final radius = Theme.of(context).radiusXxl; + final theme = context.queryaTheme.colorScheme; + final radius = QueryaControlMetrics.surfaceRadius; final borderRadius = material.BorderRadius.circular(radius); final textStyle = material.DefaultTextStyle.of(context).style; final iconTheme = material.IconTheme.of(context); diff --git a/lib/shared/widgets/querya_dropdown.dart b/lib/shared/widgets/querya_dropdown.dart index 3ac22a32..3975d51f 100644 --- a/lib/shared/widgets/querya_dropdown.dart +++ b/lib/shared/widgets/querya_dropdown.dart @@ -6,9 +6,10 @@ import 'package:flutter/services.dart'; import 'package:querya_desktop/core/layout/ui_scale.dart'; 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_theme.dart'; +import 'package:querya_desktop/core/theme/querya_theme_scope.dart'; import 'package:querya_desktop/core/ui/querya_control_tokens.dart'; import 'package:querya_desktop/shared/widgets/querya_dropdown_tokens.dart'; -import 'package:shadcn_flutter/shadcn_flutter.dart'; export 'querya_dropdown_tokens.dart'; @@ -29,7 +30,7 @@ class QueryaDropdownItem { /// Stable dropdown built on [material.MenuAnchor] (no Overlay portal). /// -/// Visual metrics: [QueryaDropdownTokens]. Colors from shadcn [ColorScheme]. +/// Visual metrics: [QueryaDropdownTokens]. Colors from shadcn [QueryaThemeColorScheme]. /// /// **Exit motion:** item pick and trigger-toggle delay [MenuController.close] /// so fade-slide can run. Outside-tap / focus-loss closes via [MenuAnchor] @@ -148,7 +149,7 @@ class _QueryaDropdownState extends material.State> { return QueryaControlScope.maybeOf(context) ?? QueryaControlSize.lg; } - List _menuChildren(ColorScheme cs, QueryaControlSize size) { + List _menuChildren(QueryaThemeColorScheme cs, QueryaControlSize size) { if (_cachedMenuChildren != null && listEquals(_cachedMenuItems, widget.items) && _cachedMenuValue == widget.value && @@ -167,7 +168,7 @@ class _QueryaDropdownState extends material.State> { material.Widget _triggerLabelText({ required material.BuildContext context, required String label, - required ColorScheme cs, + required QueryaThemeColorScheme cs, required bool expand, required QueryaControlSize size, }) { @@ -199,7 +200,7 @@ class _QueryaDropdownState extends material.State> { material.Widget _menuItem( QueryaDropdownItem item, - ColorScheme cs, + QueryaThemeColorScheme cs, QueryaControlSize size, ) { return _QueryaDropdownMenuItem( @@ -219,7 +220,7 @@ class _QueryaDropdownState extends material.State> { material.Widget _buildTrigger({ required material.BuildContext context, required material.MenuController controller, - required ColorScheme cs, + required QueryaThemeColorScheme cs, required String label, required double? fieldWidth, }) { @@ -339,7 +340,7 @@ class _QueryaDropdownState extends material.State> { @override material.Widget build(material.BuildContext context) { - final cs = Theme.of(context).colorScheme; + final cs = context.queryaTheme.colorScheme; final label = _labelFor(widget.value); final fieldWidth = widget.expandToParent ? null @@ -501,7 +502,7 @@ class _QueryaDropdownMenuItem extends material.StatefulWidget { final QueryaDropdownItem item; final bool selected; final bool enabled; - final ColorScheme colorScheme; + final QueryaThemeColorScheme colorScheme; final bool compact; final QueryaControlSize size; final material.VoidCallback onPick; @@ -516,7 +517,7 @@ class _QueryaDropdownMenuItemState bool _hovered = false; bool _focused = false; - material.Widget _leading(material.BuildContext context, ColorScheme cs) { + material.Widget _leading(material.BuildContext context, QueryaThemeColorScheme cs) { final slot = context.scaled(QueryaDropdownTokens.selectedCheckSlotWidth); final checkSize = context.scaled(QueryaDropdownTokens.selectedCheckSize); if (widget.selected) { diff --git a/test/guards/shared_does_not_import_shadcn_test.dart b/test/guards/shared_does_not_import_shadcn_test.dart index ba5afc60..760109a5 100644 --- a/test/guards/shared_does_not_import_shadcn_test.dart +++ b/test/guards/shared_does_not_import_shadcn_test.dart @@ -17,8 +17,6 @@ void main() { 'lib/shared/widgets/querya_action_button.dart', 'lib/shared/widgets/querya_action_menu.dart', 'lib/shared/widgets/querya_badge.dart', - 'lib/shared/widgets/querya_dialog_card.dart', - 'lib/shared/widgets/querya_dropdown.dart', 'lib/shared/widgets/querya_empty_state.dart', 'lib/shared/widgets/querya_icon_button.dart', 'lib/shared/widgets/querya_modal_dialog.dart', From 604d666cb711070cdcc0f9421626277ac27d1cfd Mon Sep 17 00:00:00 2001 From: ZhuchkaTriplesix Date: Sun, 11 Oct 2026 07:19:20 +0300 Subject: [PATCH 2/3] fix(ui): material.KeyEventResult in the dropdown, const radius in the dialog card --- lib/shared/widgets/querya_dialog_card.dart | 2 +- lib/shared/widgets/querya_dropdown.dart | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/shared/widgets/querya_dialog_card.dart b/lib/shared/widgets/querya_dialog_card.dart index 35d94e14..e36aaf96 100644 --- a/lib/shared/widgets/querya_dialog_card.dart +++ b/lib/shared/widgets/querya_dialog_card.dart @@ -23,7 +23,7 @@ class QueryaDialogCard extends material.StatelessWidget { @override material.Widget build(material.BuildContext context) { final theme = context.queryaTheme.colorScheme; - final radius = QueryaControlMetrics.surfaceRadius; + const radius = QueryaControlMetrics.surfaceRadius; final borderRadius = material.BorderRadius.circular(radius); final textStyle = material.DefaultTextStyle.of(context).style; final iconTheme = material.IconTheme.of(context); diff --git a/lib/shared/widgets/querya_dropdown.dart b/lib/shared/widgets/querya_dropdown.dart index 3975d51f..0920b4a4 100644 --- a/lib/shared/widgets/querya_dropdown.dart +++ b/lib/shared/widgets/querya_dropdown.dart @@ -304,7 +304,7 @@ class _QueryaDropdownState extends material.State> { onFocusChange: (f) => setState(() => _triggerFocused = f), onKeyEvent: (node, event) { if (!widget.enabled || event is! KeyDownEvent) { - return KeyEventResult.ignored; + return material.KeyEventResult.ignored; } final k = event.logicalKey; if (k == LogicalKeyboardKey.enter || @@ -312,10 +312,10 @@ class _QueryaDropdownState extends material.State> { k == LogicalKeyboardKey.arrowDown) { if (!controller.isOpen) { controller.open(); - return KeyEventResult.handled; + return material.KeyEventResult.handled; } } - return KeyEventResult.ignored; + return material.KeyEventResult.ignored; }, child: material.GestureDetector( behavior: material.HitTestBehavior.opaque, From 181657bf7fb6ef9f4fc85b5fc767225a6d84edf2 Mon Sep 17 00:00:00 2001 From: ZhuchkaTriplesix Date: Sun, 11 Oct 2026 07:28:00 +0300 Subject: [PATCH 3/3] fix(ui): read the colour scheme with context.colors, which needs no QueryaThemeScope Widgets in tests and dialogs can be built under the UI library's theme without a QueryaThemeScope; context.queryaTheme asserts there. context.colors is the same scheme the old code read. --- lib/shared/widgets/querya_dialog_card.dart | 2 +- lib/shared/widgets/querya_dropdown.dart | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/shared/widgets/querya_dialog_card.dart b/lib/shared/widgets/querya_dialog_card.dart index e36aaf96..11f5b3db 100644 --- a/lib/shared/widgets/querya_dialog_card.dart +++ b/lib/shared/widgets/querya_dialog_card.dart @@ -22,7 +22,7 @@ class QueryaDialogCard extends material.StatelessWidget { @override material.Widget build(material.BuildContext context) { - final theme = context.queryaTheme.colorScheme; + final theme = context.colors; const radius = QueryaControlMetrics.surfaceRadius; final borderRadius = material.BorderRadius.circular(radius); final textStyle = material.DefaultTextStyle.of(context).style; diff --git a/lib/shared/widgets/querya_dropdown.dart b/lib/shared/widgets/querya_dropdown.dart index 0920b4a4..53c9b942 100644 --- a/lib/shared/widgets/querya_dropdown.dart +++ b/lib/shared/widgets/querya_dropdown.dart @@ -340,7 +340,7 @@ class _QueryaDropdownState extends material.State> { @override material.Widget build(material.BuildContext context) { - final cs = context.queryaTheme.colorScheme; + final cs = context.colors; final label = _labelFor(widget.value); final fieldWidth = widget.expandToParent ? null