Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions lib/core/theme/querya_theme.dart
Original file line number Diff line number Diff line change
Expand Up @@ -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({
Expand Down
3 changes: 3 additions & 0 deletions lib/core/ui/querya_control_tokens.dart
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
7 changes: 4 additions & 3 deletions lib/shared/widgets/querya_dialog_card.dart
Original file line number Diff line number Diff line change
@@ -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.
Expand All @@ -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);
Expand Down
25 changes: 13 additions & 12 deletions lib/shared/widgets/querya_dropdown.dart
Original file line number Diff line number Diff line change
Expand Up @@ -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';

Expand All @@ -29,7 +30,7 @@ class QueryaDropdownItem<T> {

/// 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]
Expand Down Expand Up @@ -148,7 +149,7 @@ class _QueryaDropdownState<T> extends material.State<QueryaDropdown<T>> {
return QueryaControlScope.maybeOf(context) ?? QueryaControlSize.lg;
}

List<material.Widget> _menuChildren(ColorScheme cs, QueryaControlSize size) {
List<material.Widget> _menuChildren(QueryaThemeColorScheme cs, QueryaControlSize size) {
if (_cachedMenuChildren != null &&
listEquals(_cachedMenuItems, widget.items) &&
_cachedMenuValue == widget.value &&
Expand All @@ -167,7 +168,7 @@ class _QueryaDropdownState<T> extends material.State<QueryaDropdown<T>> {
material.Widget _triggerLabelText({
required material.BuildContext context,
required String label,
required ColorScheme cs,
required QueryaThemeColorScheme cs,
required bool expand,
required QueryaControlSize size,
}) {
Expand Down Expand Up @@ -199,7 +200,7 @@ class _QueryaDropdownState<T> extends material.State<QueryaDropdown<T>> {

material.Widget _menuItem(
QueryaDropdownItem<T> item,
ColorScheme cs,
QueryaThemeColorScheme cs,
QueryaControlSize size,
) {
return _QueryaDropdownMenuItem<T>(
Expand All @@ -219,7 +220,7 @@ class _QueryaDropdownState<T> extends material.State<QueryaDropdown<T>> {
material.Widget _buildTrigger({
required material.BuildContext context,
required material.MenuController controller,
required ColorScheme cs,
required QueryaThemeColorScheme cs,
required String label,
required double? fieldWidth,
}) {
Expand Down Expand Up @@ -303,18 +304,18 @@ class _QueryaDropdownState<T> extends material.State<QueryaDropdown<T>> {
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 ||
k == LogicalKeyboardKey.space ||
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,
Expand All @@ -339,7 +340,7 @@ class _QueryaDropdownState<T> extends material.State<QueryaDropdown<T>> {

@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
Expand Down Expand Up @@ -501,7 +502,7 @@ class _QueryaDropdownMenuItem<T> extends material.StatefulWidget {
final QueryaDropdownItem<T> item;
final bool selected;
final bool enabled;
final ColorScheme colorScheme;
final QueryaThemeColorScheme colorScheme;
final bool compact;
final QueryaControlSize size;
final material.VoidCallback onPick;
Expand All @@ -516,7 +517,7 @@ class _QueryaDropdownMenuItemState<T>
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) {
Expand Down
2 changes: 0 additions & 2 deletions test/guards/shared_does_not_import_shadcn_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -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',
Expand Down
Loading