diff --git a/example/lib/main.dart b/example/lib/main.dart index d12c9aa49..27c706ec6 100644 --- a/example/lib/main.dart +++ b/example/lib/main.dart @@ -1,12 +1,11 @@ import 'package:flutter/material.dart'; -import 'package:provider/provider.dart'; import 'package:yaru/yaru.dart'; +import 'package:yaru_widgets/yaru_widgets.dart'; -import 'src/example.dart'; -import 'src/provider/icon_size_provider.dart'; -import 'src/provider/search_provider.dart'; +import 'src/app.dart'; -void main() { +Future main() async { + await YaruWindowTitleBar.ensureInitialized(); runApp(_MyApp()); } @@ -19,16 +18,8 @@ class _MyApp extends StatelessWidget { debugShowCheckedModeBanner: false, theme: yaru.theme, darkTheme: yaru.darkTheme, - home: MultiProvider( - providers: [ - ChangeNotifierProvider( - create: (_) => IconViewProvider(), - ), - ChangeNotifierProvider( - create: (_) => SearchProvider(), - ), - ], - builder: (context, child) => const Example(), + home: App.create( + context: context, ), ), ); diff --git a/example/lib/src/app.dart b/example/lib/src/app.dart new file mode 100644 index 000000000..6f9441e7e --- /dev/null +++ b/example/lib/src/app.dart @@ -0,0 +1,134 @@ +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; +import 'package:yaru_icons/yaru_icons.dart'; +import 'package:yaru_widgets/yaru_widgets.dart'; + +import 'icon_items.dart'; +import 'icon_view.dart'; +import 'provider/icon_view_model.dart'; + +class App extends StatefulWidget { + const App({super.key}); + + static Widget create({ + required BuildContext context, + }) { + return ChangeNotifierProvider( + create: (_) => IconViewModel(), + child: const App(), + ); + } + + @override + State createState() => _AppState(); +} + +class _AppState extends State { + @override + Widget build(BuildContext context) { + final iconSize = context.select((m) => m.iconSize); + final isMinIconSize = + context.select((m) => m.isMinIconSize); + final isMaxIconSize = + context.select((m) => m.isMaxIconSize); + final gridView = context.select((m) => m.gridView); + final searchActive = + context.select((m) => m.searchActive); + + return Scaffold( + appBar: YaruWindowTitleBar( + title: YaruSearchTitleField( + searchActive: searchActive, + width: 250, + title: const Text( + 'Flutter Yaru Icons Demo', + ), + onSearchActive: context.read().toggleSearch, + onClear: context.read().toggleSearch, + onChanged: context.read().onSearchChanged, + ), + actions: [ + Tooltip( + message: gridView ? 'Toggle list view' : 'Toggle grid view', + child: IconButton( + onPressed: context.read().toggleGridView, + icon: gridView + ? const Icon(YaruIcons.unordered_list) + : const Icon(YaruIcons.app_grid), + ), + ), + Tooltip( + message: 'Decrease icon size', + child: IconButton( + onPressed: isMinIconSize + ? null + : context.read().decreaseIconSize, + icon: const Icon(YaruIcons.minus), + ), + ), + Text('${iconSize.truncate()}px'), + Tooltip( + message: 'Increase icon size', + child: IconButton( + onPressed: isMaxIconSize + ? null + : context.read().increaseIconSize, + icon: const Icon(YaruIcons.plus), + ), + ), + ], + ), + body: YaruNavigationPage( + length: 3, + itemBuilder: (context, index, selected) { + const style = YaruNavigationRailStyle.labelled; + + switch (index) { + case 0: + return YaruNavigationRailItem( + icon: const Icon(YaruIcons.image), + label: const Text('Static icons'), + tooltip: 'Static icons', + style: style, + ); + case 1: + return YaruNavigationRailItem( + icon: const Icon(YaruIcons.video), + label: const Text('Animated icons'), + tooltip: 'Animated icons', + style: style, + ); + case 2: + return YaruNavigationRailItem( + icon: const Icon(YaruIcons.rule_and_pen), + label: const Text('Widget icons'), + tooltip: 'Widget icons', + style: style, + ); + default: + throw 'Invalid index'; + } + }, + pageBuilder: (context, index) { + List iconItems; + + switch (index) { + case 0: + iconItems = IconItems.static; + break; + case 1: + iconItems = IconItems.animated; + break; + case 2: + iconItems = IconItems.widget; + break; + default: + throw 'Invalid index'; + } + + return IconView(iconItems: iconItems); + }, + ), + ); + } +} diff --git a/example/lib/src/common/clickable_icon.dart b/example/lib/src/common/clickable_icon.dart index 9d6c900d0..887c2bdc5 100644 --- a/example/lib/src/common/clickable_icon.dart +++ b/example/lib/src/common/clickable_icon.dart @@ -1,22 +1,20 @@ import 'package:flutter/material.dart'; -import 'package:provider/provider.dart'; -import '../provider/icon_size_provider.dart'; +import '../icon_items.dart'; import 'icon_dialog.dart'; -import 'icon_item.dart'; class ClickableIcon extends StatelessWidget { const ClickableIcon({ super.key, required this.iconItem, + required this.iconSize, }); final IconItem iconItem; + final double iconSize; @override Widget build(BuildContext context) { - final iconViewProvider = Provider.of(context); - return AspectRatio( aspectRatio: 1, child: InkWell( @@ -29,7 +27,7 @@ class ClickableIcon extends StatelessWidget { child: Center( child: iconItem.iconBuilder( context, - iconViewProvider.iconSize, + iconSize, ), ), ), diff --git a/example/lib/src/common/icon_dialog.dart b/example/lib/src/common/icon_dialog.dart index db74385aa..24f50e686 100644 --- a/example/lib/src/common/icon_dialog.dart +++ b/example/lib/src/common/icon_dialog.dart @@ -1,8 +1,8 @@ import 'package:flutter/material.dart'; import 'package:yaru_widgets/yaru_widgets.dart'; +import '../icon_items.dart'; import '../utils.dart'; -import 'icon_item.dart'; import 'icon_usage.dart'; const _iconDialogSizes = [ diff --git a/example/lib/src/common/icon_grid.dart b/example/lib/src/common/icon_grid.dart index 2a661adbc..35577757d 100644 --- a/example/lib/src/common/icon_grid.dart +++ b/example/lib/src/common/icon_grid.dart @@ -1,35 +1,38 @@ import 'package:flutter/material.dart'; -import 'package:provider/provider.dart'; -import '../provider/icon_size_provider.dart'; +import '../icon_items.dart'; import '../utils.dart'; import 'clickable_icon.dart'; -import 'icon_item.dart'; class IconGrid extends StatelessWidget { const IconGrid({ super.key, required this.iconItems, + required this.iconSize, }); final List iconItems; + final double iconSize; @override Widget build(BuildContext context) { - final iconViewProvider = Provider.of(context); - return GridView.builder( gridDelegate: SliverGridDelegateWithMaxCrossAxisExtent( - maxCrossAxisExtent: iconViewProvider.iconSize * 1.5, + maxCrossAxisExtent: iconSize * 1.5, ), padding: const EdgeInsets.all(8), itemCount: iconItems.length, - itemBuilder: (context, index) => Tooltip( - verticalOffset: iconViewProvider.iconSize / 2, - waitDuration: const Duration(milliseconds: 250), - message: beautifyIconName(iconItems[index].name), - child: ClickableIcon(iconItem: iconItems[index]), - ), + itemBuilder: (context, index) { + return Tooltip( + verticalOffset: iconSize / 2, + waitDuration: const Duration(milliseconds: 250), + message: beautifyIconName(iconItems[index].name), + child: ClickableIcon( + iconItem: iconItems[index], + iconSize: iconSize, + ), + ); + }, ); } } diff --git a/example/lib/src/common/icon_item.dart b/example/lib/src/common/icon_item.dart deleted file mode 100644 index e9360af44..000000000 --- a/example/lib/src/common/icon_item.dart +++ /dev/null @@ -1,13 +0,0 @@ -import 'package:flutter/widgets.dart'; - -class IconItem { - IconItem({ - required this.name, - required this.usage, - required this.iconBuilder, - }); - - final String name; - final String usage; - final Widget Function(BuildContext context, double iconSize) iconBuilder; -} diff --git a/example/lib/src/common/icon_table.dart b/example/lib/src/common/icon_table.dart index 85e6f9b05..8ecbdade0 100644 --- a/example/lib/src/common/icon_table.dart +++ b/example/lib/src/common/icon_table.dart @@ -1,10 +1,8 @@ import 'package:flutter/material.dart'; -import 'package:provider/provider.dart'; -import '../provider/icon_size_provider.dart'; +import '../icon_items.dart'; import '../utils.dart'; import 'clickable_icon.dart'; -import 'icon_item.dart'; import 'icon_usage.dart'; @immutable @@ -12,14 +10,14 @@ class IconTable extends StatelessWidget { const IconTable({ super.key, required this.iconItems, + required this.iconSize, }); final List iconItems; + final double iconSize; @override Widget build(BuildContext context) { - final iconViewProvider = Provider.of(context); - return ListView.builder( padding: const EdgeInsets.all(16), itemCount: iconItems.length, @@ -28,8 +26,11 @@ class IconTable extends StatelessWidget { Row( children: [ SizedBox.square( - dimension: iconViewProvider.iconSize * 1.5, - child: ClickableIcon(iconItem: iconItems[index]), + dimension: iconSize * 1.5, + child: ClickableIcon( + iconItem: iconItems[index], + iconSize: iconSize, + ), ), const SizedBox( width: 16, diff --git a/example/lib/src/common/search_entry.dart b/example/lib/src/common/search_entry.dart deleted file mode 100644 index bce62256b..000000000 --- a/example/lib/src/common/search_entry.dart +++ /dev/null @@ -1,61 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; -import 'package:yaru_icons/yaru_icons.dart'; - -class SearchEntry extends StatelessWidget implements PreferredSizeWidget { - const SearchEntry({ - super.key, - required this.appBarHeight, - required this.controller, - required this.focusNode, - required this.onChanged, - required this.onEscape, - }); - - final double appBarHeight; - final TextEditingController? controller; - final FocusNode? focusNode; - final void Function(String)? onChanged; - final void Function() onEscape; - - @override - Widget build(BuildContext context) { - return RawKeyboardListener( - focusNode: FocusNode(), - onKey: (event) { - if (event.logicalKey == LogicalKeyboardKey.escape) { - onEscape(); - return; - } - }, - child: TextField( - decoration: InputDecoration( - enabledBorder: InputBorder.none, - focusedBorder: UnderlineInputBorder( - borderSide: BorderSide( - color: Theme.of(context).colorScheme.primary, - ), - borderRadius: BorderRadius.zero, - ), - prefixIcon: const Icon( - YaruIcons.magnifying_glass, - size: 24, - ), - prefixIconConstraints: BoxConstraints.expand( - width: 40, - height: appBarHeight, - ), - hintText: 'Search icons...', - ), - textAlignVertical: TextAlignVertical.center, - autofocus: true, - controller: controller, - focusNode: focusNode, - onChanged: onChanged, - ), - ); - } - - @override - Size get preferredSize => Size(0, appBarHeight); -} diff --git a/example/lib/src/example.dart b/example/lib/src/example.dart deleted file mode 100644 index b0a30617d..000000000 --- a/example/lib/src/example.dart +++ /dev/null @@ -1,182 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:provider/provider.dart'; -import 'package:yaru_colors/yaru_colors.dart'; -import 'package:yaru_icons/yaru_icons.dart'; -import 'package:yaru_widgets/yaru_widgets.dart'; - -import 'common/icon_grid.dart'; -import 'common/icon_table.dart'; -import 'common/search_entry.dart'; -import 'icon_items.dart'; -import 'provider/icon_size_provider.dart'; -import 'provider/search_provider.dart'; - -class Example extends StatelessWidget { - const Example({super.key}); - - @override - Widget build(BuildContext context) { - final iconViewProvider = Provider.of(context); - final searchProvider = Provider.of(context); - - return Scaffold( - appBar: AppBar( - leading: const Icon( - YaruIcons.ubuntu_logo, - color: YaruColors.orange, - ), - title: Text( - 'Flutter Yaru Icons Demo (${iconViewProvider.iconSize.truncate()}px)', - ), - actions: [ - Tooltip( - message: iconViewProvider.gridView - ? 'Toggle list view' - : 'Toggle grid view', - child: TextButton( - onPressed: iconViewProvider.toggleGridView, - child: iconViewProvider.gridView - ? const Icon(YaruIcons.unordered_list) - : const Icon(YaruIcons.app_grid), - ), - ), - Tooltip( - message: searchProvider.search - ? 'Hide search entry' - : 'Show search entry', - child: TextButton( - onPressed: searchProvider.toggleSearch, - child: const Icon(YaruIcons.magnifying_glass), - ), - ), - Tooltip( - message: 'Decrease icon size', - child: TextButton( - onPressed: iconViewProvider.minIconSize - ? null - : iconViewProvider.decreaseIconSize, - child: const Icon(YaruIcons.minus), - ), - ), - Tooltip( - message: 'Increase icon size', - child: TextButton( - onPressed: iconViewProvider.maxIconSize - ? null - : iconViewProvider.increaseIconSize, - child: const Icon(YaruIcons.plus), - ), - ) - ], - bottom: searchProvider.search - ? SearchEntry( - appBarHeight: Theme.of(context).appBarTheme.toolbarHeight!, - onEscape: searchProvider.onEscape, - controller: searchProvider.textEntryController, - focusNode: searchProvider.textEntryFocusNode, - onChanged: searchProvider.onSearchChanged, - ) - : null, - ), - body: YaruNavigationPage( - length: 3, - itemBuilder: (context, index, selected) { - const style = YaruNavigationRailStyle.labelled; - - switch (index) { - case 0: - return YaruNavigationRailItem( - icon: const Icon(YaruIcons.image), - label: const Text('Static icons'), - tooltip: 'Static icons', - style: style, - ); - case 1: - return YaruNavigationRailItem( - icon: const Icon(YaruIcons.video), - label: const Text('Animated icons'), - tooltip: 'Animated icons', - style: style, - ); - case 2: - return YaruNavigationRailItem( - icon: const Icon(YaruIcons.rule_and_pen), - label: const Text('Widget icons'), - tooltip: 'Widget icons', - style: style, - ); - default: - throw 'Invalid index'; - } - }, - pageBuilder: (context, index) { - switch (index) { - case 0: - return const _IconView(); - case 1: - return const _AnimatedIconView(); - case 2: - return const _WidgetIconView(); - default: - throw 'Invalid index'; - } - }, - ), - ); - } -} - -class _IconView extends StatelessWidget { - const _IconView(); - - @override - Widget build(BuildContext context) { - final iconViewProvider = Provider.of(context); - final searchProvider = Provider.of(context); - - final localIconItems = searchProvider.filteredIconItems != null - ? searchProvider.filteredIconItems! - : iconItems; - - return iconViewProvider.gridView - ? IconGrid(iconItems: localIconItems) - : IconTable(iconItems: localIconItems); - } -} - -class _AnimatedIconView extends StatelessWidget { - const _AnimatedIconView(); - - @override - Widget build(BuildContext context) { - final iconViewProvider = Provider.of(context); - final searchProvider = Provider.of(context); - - final localAnimatedIconItems = - searchProvider.filteredAnimatedIconItems != null - ? searchProvider.filteredAnimatedIconItems! - : animatedIconItems; - - return iconViewProvider.gridView - ? IconGrid(iconItems: localAnimatedIconItems) - : IconTable(iconItems: localAnimatedIconItems); - } -} - -class _WidgetIconView extends StatelessWidget { - const _WidgetIconView(); - - @override - Widget build(BuildContext context) { - final iconViewProvider = Provider.of(context); - final searchProvider = Provider.of(context); - - final localWidgetIconItems = searchProvider.filteredWidgetIconItems != null - ? searchProvider.filteredWidgetIconItems! - : widgetIconItems; - - return iconViewProvider.gridView - ? IconGrid(iconItems: localWidgetIconItems) - : IconTable(iconItems: localWidgetIconItems); - } -} diff --git a/example/lib/src/icon_items.dart b/example/lib/src/icon_items.dart index 3fa267b41..88705ea54 100644 --- a/example/lib/src/icon_items.dart +++ b/example/lib/src/icon_items.dart @@ -1,12 +1,20 @@ import 'package:flutter/material.dart'; import 'package:yaru_icons/yaru_icons.dart'; -import 'common/icon_item.dart'; +class IconItem { + const IconItem({ + required this.name, + required this.usage, + required this.iconBuilder, + }); -final _iconNames = YaruIcons.all.keys.toList(); + final String name; + final String usage; + final Widget Function(BuildContext context, double iconSize) iconBuilder; +} -final List iconItems = [ - for (final iconName in _iconNames) +final List _staticIconItems = [ + for (final iconName in YaruIcons.all.keys.toList()) IconItem( name: iconName, usage: 'YaruIcons.$iconName', @@ -17,7 +25,7 @@ final List iconItems = [ ) ]; -final List animatedIconItems = [ +final List _animatedIconItems = [ IconItem( name: 'Ok', usage: 'YaruAnimatedOkIcon()', @@ -109,7 +117,7 @@ final List animatedIconItems = [ ), ]; -final List widgetIconItems = [ +final List _widgetIconItems = [ IconItem( name: 'Placeholder', usage: 'YaruPlaceholderIcon()', @@ -118,3 +126,9 @@ final List widgetIconItems = [ ), ), ]; + +abstract class IconItems { + static List static = _staticIconItems; + static List animated = _animatedIconItems; + static List widget = _widgetIconItems; +} diff --git a/example/lib/src/icon_view.dart b/example/lib/src/icon_view.dart new file mode 100644 index 000000000..4a0812ab6 --- /dev/null +++ b/example/lib/src/icon_view.dart @@ -0,0 +1,44 @@ +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; + +import 'common/icon_grid.dart'; +import 'common/icon_table.dart'; +import 'icon_items.dart'; +import 'provider/icon_view_model.dart'; + +class IconView extends StatelessWidget { + const IconView({ + super.key, + required this.iconItems, + }); + + final List iconItems; + + @override + Widget build(BuildContext context) { + final searchActive = + context.select((m) => m.searchActive); + final searchQuery = + context.select((m) => m.searchQuery); + final gridView = context.select((m) => m.gridView); + final iconSize = context.select((m) => m.iconSize); + + final localIconItems = searchActive + ? iconItems.where((iconItem) { + return iconItem.name + .toLowerCase() + .contains(searchQuery.toLowerCase()); + }).toList() + : iconItems; + + return gridView + ? IconGrid( + iconItems: localIconItems, + iconSize: iconSize, + ) + : IconTable( + iconItems: localIconItems, + iconSize: iconSize, + ); + } +} diff --git a/example/lib/src/provider/icon_size_provider.dart b/example/lib/src/provider/icon_size_provider.dart deleted file mode 100644 index a88ed6a9d..000000000 --- a/example/lib/src/provider/icon_size_provider.dart +++ /dev/null @@ -1,36 +0,0 @@ -import 'package:flutter/material.dart'; - -class IconViewProvider extends ChangeNotifier { - bool _gridView = true; - bool get gridView => _gridView; - - void toggleGridView() { - _gridView = !_gridView; - notifyListeners(); - } - - double _iconSize = 48; - double get iconSize => _iconSize; - - set iconSize(double iconSize) { - _iconSize = iconSize; - notifyListeners(); - } - - void increaseIconSize() { - if (!maxIconSize) { - _iconSize += 8; - notifyListeners(); - } - } - - void decreaseIconSize() { - if (!minIconSize) { - _iconSize -= 8; - notifyListeners(); - } - } - - bool get minIconSize => _iconSize <= 16 ? true : false; - bool get maxIconSize => _iconSize >= 128 ? true : false; -} diff --git a/example/lib/src/provider/icon_view_model.dart b/example/lib/src/provider/icon_view_model.dart new file mode 100644 index 000000000..a494e50b4 --- /dev/null +++ b/example/lib/src/provider/icon_view_model.dart @@ -0,0 +1,58 @@ +import 'package:flutter/material.dart'; + +class IconViewModel extends ChangeNotifier { + bool _gridView = true; + bool get gridView => _gridView; + + void toggleGridView() { + _gridView = !_gridView; + notifyListeners(); + } + + double _iconSize = 48; + double get iconSize => _iconSize; + + set iconSize(double iconSize) { + _iconSize = iconSize; + notifyListeners(); + } + + void increaseIconSize() { + if (!isMaxIconSize) { + _iconSize += 8; + notifyListeners(); + } + } + + void decreaseIconSize() { + if (!isMinIconSize) { + _iconSize -= 8; + notifyListeners(); + } + } + + bool get isMinIconSize => _iconSize <= 16 ? true : false; + bool get isMaxIconSize => _iconSize >= 128 ? true : false; + + bool _searchActive = false; + bool get searchActive => _searchActive; + + void toggleSearch() { + _searchActive = !_searchActive; + + if (!_searchActive) { + _searchQuery = ''; + } + + notifyListeners(); + } + + String _searchQuery = ''; + String get searchQuery => _searchQuery; + + void onSearchChanged(String? value) { + _searchQuery = value ?? ''; + + notifyListeners(); + } +} diff --git a/example/lib/src/provider/search_provider.dart b/example/lib/src/provider/search_provider.dart deleted file mode 100644 index badc9785d..000000000 --- a/example/lib/src/provider/search_provider.dart +++ /dev/null @@ -1,87 +0,0 @@ -import 'package:flutter/material.dart'; - -import '../common/icon_item.dart'; -import '../icon_items.dart'; - -class SearchProvider extends ChangeNotifier { - List? filteredIconItems; - List? filteredAnimatedIconItems; - List? filteredWidgetIconItems; - - final textEntryController = TextEditingController(); - final textEntryFocusNode = FocusNode(); - - bool _search = false; - bool get search => _search; - - @override - void dispose() { - textEntryController.dispose(); - textEntryFocusNode.dispose(); - - super.dispose(); - } - - void _escape() { - filteredIconItems = null; - filteredAnimatedIconItems = null; - filteredWidgetIconItems = null; - textEntryController.clear(); - textEntryFocusNode.unfocus(); - } - - void toggleSearch() { - _search = !_search; - - if (_search) { - textEntryFocusNode.requestFocus(); - } else { - _escape(); - } - - notifyListeners(); - } - - void onEscape() { - _escape(); - _search = !_search; - - notifyListeners(); - } - - void onSearchChanged(String value) { - if (value == '') { - filteredIconItems = null; - filteredAnimatedIconItems = null; - filteredWidgetIconItems = null; - textEntryController.clear(); - - notifyListeners(); - } - - filteredIconItems = []; - filteredIconItems!.addAll( - iconItems.where((iconItem) { - return iconItem.name.toLowerCase().contains(value.toLowerCase()); - }), - ); - - filteredAnimatedIconItems = []; - filteredAnimatedIconItems!.addAll( - animatedIconItems.where((animatedIconItem) { - return animatedIconItem.name - .toLowerCase() - .contains(value.toLowerCase()); - }), - ); - - filteredWidgetIconItems = []; - filteredWidgetIconItems!.addAll( - widgetIconItems.where((widgetIconItem) { - return widgetIconItem.name.toLowerCase().contains(value.toLowerCase()); - }), - ); - - notifyListeners(); - } -} diff --git a/example/linux/my_application.cc b/example/linux/my_application.cc index 634f4c519..c3f3cf377 100644 --- a/example/linux/my_application.cc +++ b/example/linux/my_application.cc @@ -48,18 +48,22 @@ static void my_application_activate(GApplication* application) { gtk_window_set_title(window, "example"); } + GdkGeometry geometry_min; + geometry_min.min_width = 480; + geometry_min.min_height = 320; + gtk_window_set_geometry_hints(window, nullptr, &geometry_min, GDK_HINT_MIN_SIZE); gtk_window_set_default_size(window, 1280, 720); - gtk_widget_show(GTK_WIDGET(window)); g_autoptr(FlDartProject) project = fl_dart_project_new(); fl_dart_project_set_dart_entrypoint_arguments(project, self->dart_entrypoint_arguments); FlView* view = fl_view_new(project); - gtk_widget_show(GTK_WIDGET(view)); gtk_container_add(GTK_CONTAINER(window), GTK_WIDGET(view)); fl_register_plugins(FL_PLUGIN_REGISTRY(view)); + gtk_widget_show(GTK_WIDGET(window)); + gtk_widget_show(GTK_WIDGET(view)); gtk_widget_grab_focus(GTK_WIDGET(view)); } diff --git a/example/pubspec.yaml b/example/pubspec.yaml index d205b6b73..3ecc852b6 100644 --- a/example/pubspec.yaml +++ b/example/pubspec.yaml @@ -11,12 +11,13 @@ environment: dependencies: flutter: sdk: flutter + handy_window: ^0.3.1 provider: ^6.0.3 - yaru: ^0.5.2 + yaru: ^0.9.0 yaru_colors: ^0.1.3 yaru_icons: path: ../ - yaru_widgets: ^2.0.1 + yaru_widgets: ^2.6.0 dependency_overrides: yaru_icons: