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..11f5b3db 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.colors; + 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 3ac22a32..53c9b942 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, }) { @@ -303,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 || @@ -311,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, @@ -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.colors; 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 2ca4887e..6da5d350 100644 --- a/test/guards/shared_does_not_import_shadcn_test.dart +++ b/test/guards/shared_does_not_import_shadcn_test.dart @@ -15,8 +15,6 @@ void main() { 'lib/shared/widgets/export_menu_button.dart', 'lib/shared/widgets/querya_action_button.dart', 'lib/shared/widgets/querya_action_menu.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',