From 55467152c9eaf61dfcc7519ff3b1754e96c0b26d Mon Sep 17 00:00:00 2001 From: Alessandro Autiero Date: Fri, 7 Oct 2022 17:23:30 +0200 Subject: [PATCH] Made build portable --- .../bitsdojo_window-0.1.5/CHANGELOG.md | 45 + dependencies/bitsdojo_window-0.1.5/LICENSE | 21 + dependencies/bitsdojo_window-0.1.5/README.md | 262 + .../lib/bitsdojo_window.dart | 5 + .../lib/src/app_window.dart | 43 + .../lib/src/icons/icons.dart | 114 + .../lib/src/widgets/mouse_state_builder.dart | 71 + .../lib/src/widgets/window_border.dart | 49 + .../lib/src/widgets/window_button.dart | 203 + .../lib/src/widgets/window_caption.dart | 48 + .../bitsdojo_window-0.1.5/pubspec.yaml | 31 + dependencies/fluent_ui-3.12.0/CHANGELOG.md | 897 + dependencies/fluent_ui-3.12.0/LICENSE | 11 + dependencies/fluent_ui-3.12.0/README.md | 1807 ++ .../fluent_ui-3.12.0/analysis_options.yaml | 5 + .../fluent_ui-3.12.0/assets/AcrylicNoise.png | Bin 0 -> 3241 bytes .../fluent_ui-3.12.0/coverage/lcov.info | 7664 ++++++++ .../fluent_ui-3.12.0/fonts/FluentIcons.ttf | Bin 0 -> 499092 bytes .../images/example-showcase.png | Bin 0 -> 21289 bytes .../fluent_ui-3.12.0/lib/fluent_ui.dart | 104 + .../lib/generated/intl/messages_all.dart | 94 + .../lib/generated/intl/messages_ar.dart | 63 + .../lib/generated/intl/messages_de.dart | 66 + .../lib/generated/intl/messages_en.dart | 64 + .../lib/generated/intl/messages_es.dart | 66 + .../lib/generated/intl/messages_fr.dart | 66 + .../lib/generated/intl/messages_hi.dart | 65 + .../lib/generated/intl/messages_pt.dart | 66 + .../lib/generated/intl/messages_ru.dart | 65 + .../lib/generated/intl/messages_zh.dart | 55 + .../fluent_ui-3.12.0/lib/generated/l10n.dart | 326 + .../fluent_ui-3.12.0/lib/l10n/README.md | 1 + .../fluent_ui-3.12.0/lib/l10n/intl_ar.arb | 28 + .../fluent_ui-3.12.0/lib/l10n/intl_de.arb | 27 + .../fluent_ui-3.12.0/lib/l10n/intl_en.arb | 27 + .../fluent_ui-3.12.0/lib/l10n/intl_es.arb | 27 + .../fluent_ui-3.12.0/lib/l10n/intl_fr.arb | 27 + .../fluent_ui-3.12.0/lib/l10n/intl_hi.arb | 27 + .../fluent_ui-3.12.0/lib/l10n/intl_pt.arb | 27 + .../fluent_ui-3.12.0/lib/l10n/intl_ru.arb | 27 + .../fluent_ui-3.12.0/lib/l10n/intl_zh.arb | 27 + .../fluent_ui-3.12.0/lib/src/app.dart | 555 + .../src/controls/form/auto_suggest_box.dart | 515 + .../lib/src/controls/form/combo_box.dart | 1369 ++ .../lib/src/controls/form/form_row.dart | 59 + .../controls/form/pickers/date_picker.dart | 579 + .../src/controls/form/pickers/pickers.dart | 211 + .../controls/form/pickers/time_picker.dart | 504 + .../src/controls/form/selection_controls.dart | 412 + .../lib/src/controls/form/text_box.dart | 1090 ++ .../lib/src/controls/form/text_form_box.dart | 277 + .../lib/src/controls/inputs/buttons/base.dart | 188 + .../src/controls/inputs/buttons/button.dart | 78 + .../inputs/buttons/filled_button.dart | 77 + .../controls/inputs/buttons/icon_button.dart | 77 + .../inputs/buttons/outlined_button.dart | 69 + .../controls/inputs/buttons/text_button.dart | 69 + .../src/controls/inputs/buttons/theme.dart | 295 + .../lib/src/controls/inputs/checkbox.dart | 385 + .../lib/src/controls/inputs/chip.dart | 312 + .../src/controls/inputs/dropdown_button.dart | 233 + .../src/controls/inputs/pill_button_bar.dart | 303 + .../lib/src/controls/inputs/radio_button.dart | 290 + .../lib/src/controls/inputs/rating.dart | 381 + .../lib/src/controls/inputs/slider.dart | 855 + .../lib/src/controls/inputs/split_button.dart | 217 + .../src/controls/inputs/toggle_button.dart | 208 + .../src/controls/inputs/toggle_switch.dart | 426 + .../navigation/bottom_navigation.dart | 294 + .../navigation/navigation_view/body.dart | 268 + .../navigation_view/indicators.dart | 340 + .../navigation/navigation_view/pane.dart | 965 + .../navigation_view/pane_items.dart | 556 + .../navigation/navigation_view/style.dart | 216 + .../navigation/navigation_view/view.dart | 750 + .../lib/src/controls/navigation/tab_view.dart | 810 + .../src/controls/navigation/tree_view.dart | 717 + .../src/controls/surfaces/bottom_sheet.dart | 871 + .../surfaces/calendar/calendar_view.dart | 24 + .../lib/src/controls/surfaces/card.dart | 51 + .../lib/src/controls/surfaces/commandbar.dart | 562 + .../lib/src/controls/surfaces/dialog.dart | 459 + .../lib/src/controls/surfaces/expander.dart | 295 + .../src/controls/surfaces/flyout/content.dart | 208 + .../controls/surfaces/flyout/controller.dart | 44 + .../src/controls/surfaces/flyout/flyout.dart | 291 + .../src/controls/surfaces/flyout/menu.dart | 237 + .../lib/src/controls/surfaces/info_bar.dart | 338 + .../lib/src/controls/surfaces/list_tile.dart | 191 + .../surfaces/progress_indicators.dart | 502 + .../lib/src/controls/surfaces/snackbar.dart | 291 + .../lib/src/controls/surfaces/tooltip.dart | 921 + .../lib/src/controls/utils/divider.dart | 189 + .../lib/src/controls/utils/hover_button.dart | 326 + .../lib/src/controls/utils/info_badge.dart | 83 + .../lib/src/controls/utils/scrollbar.dart | 488 + .../fluent_ui-3.12.0/lib/src/icons.dart | 15497 ++++++++++++++++ .../lib/src/layout/dynamic_overflow.dart | 801 + .../fluent_ui-3.12.0/lib/src/layout/page.dart | 183 + .../lib/src/localization.dart | 228 + .../lib/src/navigation/route.dart | 57 + .../lib/src/styles/acrylic.dart | 582 + .../lib/src/styles/color.dart | 410 + .../lib/src/styles/focus.dart | 275 + .../fluent_ui-3.12.0/lib/src/styles/mica.dart | 74 + .../src/styles/motion/page_transitions.dart | 187 + .../lib/src/styles/theme.dart | 631 + .../lib/src/styles/typography.dart | 241 + .../fluent_ui-3.12.0/lib/src/utils.dart | 123 + .../lib/src/utils/horizontal_scroll_view.dart | 76 + .../fluent_ui-3.12.0/lib/src/utils/label.dart | 66 + .../fluent_ui-3.12.0/lib/src/utils/popup.dart | 524 + dependencies/fluent_ui-3.12.0/pubspec.yaml | 37 + .../fluent_ui-3.12.0/test/app_test.dart | 83 + .../fluent_ui-3.12.0/test/checkbox_test.dart | 37 + .../fluent_ui-3.12.0/test/color_test.dart | 32 + .../fluent_ui-3.12.0/test/divider_test.dart | 55 + .../test/dropdown_button_test.dart | 21 + .../fluent_ui-3.12.0/test/expander_test.dart | 23 + .../fluent_ui-3.12.0/test/icons_test.dart | 15 + .../fluent_ui-3.12.0/test/label_test.dart | 22 + .../test/navigation_view_test.dart | 12 + .../test/radio_button_test.dart | 38 + .../test/toggle_button_test.dart | 41 + .../test/toggle_switch_test.dart | 84 + pubspec.yaml | 7 +- release/README.md | 4 - release/release.bat | 1 + 128 files changed, 54402 insertions(+), 7 deletions(-) create mode 100644 dependencies/bitsdojo_window-0.1.5/CHANGELOG.md create mode 100644 dependencies/bitsdojo_window-0.1.5/LICENSE create mode 100644 dependencies/bitsdojo_window-0.1.5/README.md create mode 100644 dependencies/bitsdojo_window-0.1.5/lib/bitsdojo_window.dart create mode 100644 dependencies/bitsdojo_window-0.1.5/lib/src/app_window.dart create mode 100644 dependencies/bitsdojo_window-0.1.5/lib/src/icons/icons.dart create mode 100644 dependencies/bitsdojo_window-0.1.5/lib/src/widgets/mouse_state_builder.dart create mode 100644 dependencies/bitsdojo_window-0.1.5/lib/src/widgets/window_border.dart create mode 100644 dependencies/bitsdojo_window-0.1.5/lib/src/widgets/window_button.dart create mode 100644 dependencies/bitsdojo_window-0.1.5/lib/src/widgets/window_caption.dart create mode 100644 dependencies/bitsdojo_window-0.1.5/pubspec.yaml create mode 100644 dependencies/fluent_ui-3.12.0/CHANGELOG.md create mode 100644 dependencies/fluent_ui-3.12.0/LICENSE create mode 100644 dependencies/fluent_ui-3.12.0/README.md create mode 100644 dependencies/fluent_ui-3.12.0/analysis_options.yaml create mode 100644 dependencies/fluent_ui-3.12.0/assets/AcrylicNoise.png create mode 100644 dependencies/fluent_ui-3.12.0/coverage/lcov.info create mode 100644 dependencies/fluent_ui-3.12.0/fonts/FluentIcons.ttf create mode 100644 dependencies/fluent_ui-3.12.0/images/example-showcase.png create mode 100644 dependencies/fluent_ui-3.12.0/lib/fluent_ui.dart create mode 100644 dependencies/fluent_ui-3.12.0/lib/generated/intl/messages_all.dart create mode 100644 dependencies/fluent_ui-3.12.0/lib/generated/intl/messages_ar.dart create mode 100644 dependencies/fluent_ui-3.12.0/lib/generated/intl/messages_de.dart create mode 100644 dependencies/fluent_ui-3.12.0/lib/generated/intl/messages_en.dart create mode 100644 dependencies/fluent_ui-3.12.0/lib/generated/intl/messages_es.dart create mode 100644 dependencies/fluent_ui-3.12.0/lib/generated/intl/messages_fr.dart create mode 100644 dependencies/fluent_ui-3.12.0/lib/generated/intl/messages_hi.dart create mode 100644 dependencies/fluent_ui-3.12.0/lib/generated/intl/messages_pt.dart create mode 100644 dependencies/fluent_ui-3.12.0/lib/generated/intl/messages_ru.dart create mode 100644 dependencies/fluent_ui-3.12.0/lib/generated/intl/messages_zh.dart create mode 100644 dependencies/fluent_ui-3.12.0/lib/generated/l10n.dart create mode 100644 dependencies/fluent_ui-3.12.0/lib/l10n/README.md create mode 100644 dependencies/fluent_ui-3.12.0/lib/l10n/intl_ar.arb create mode 100644 dependencies/fluent_ui-3.12.0/lib/l10n/intl_de.arb create mode 100644 dependencies/fluent_ui-3.12.0/lib/l10n/intl_en.arb create mode 100644 dependencies/fluent_ui-3.12.0/lib/l10n/intl_es.arb create mode 100644 dependencies/fluent_ui-3.12.0/lib/l10n/intl_fr.arb create mode 100644 dependencies/fluent_ui-3.12.0/lib/l10n/intl_hi.arb create mode 100644 dependencies/fluent_ui-3.12.0/lib/l10n/intl_pt.arb create mode 100644 dependencies/fluent_ui-3.12.0/lib/l10n/intl_ru.arb create mode 100644 dependencies/fluent_ui-3.12.0/lib/l10n/intl_zh.arb create mode 100644 dependencies/fluent_ui-3.12.0/lib/src/app.dart create mode 100644 dependencies/fluent_ui-3.12.0/lib/src/controls/form/auto_suggest_box.dart create mode 100644 dependencies/fluent_ui-3.12.0/lib/src/controls/form/combo_box.dart create mode 100644 dependencies/fluent_ui-3.12.0/lib/src/controls/form/form_row.dart create mode 100644 dependencies/fluent_ui-3.12.0/lib/src/controls/form/pickers/date_picker.dart create mode 100644 dependencies/fluent_ui-3.12.0/lib/src/controls/form/pickers/pickers.dart create mode 100644 dependencies/fluent_ui-3.12.0/lib/src/controls/form/pickers/time_picker.dart create mode 100644 dependencies/fluent_ui-3.12.0/lib/src/controls/form/selection_controls.dart create mode 100644 dependencies/fluent_ui-3.12.0/lib/src/controls/form/text_box.dart create mode 100644 dependencies/fluent_ui-3.12.0/lib/src/controls/form/text_form_box.dart create mode 100644 dependencies/fluent_ui-3.12.0/lib/src/controls/inputs/buttons/base.dart create mode 100644 dependencies/fluent_ui-3.12.0/lib/src/controls/inputs/buttons/button.dart create mode 100644 dependencies/fluent_ui-3.12.0/lib/src/controls/inputs/buttons/filled_button.dart create mode 100644 dependencies/fluent_ui-3.12.0/lib/src/controls/inputs/buttons/icon_button.dart create mode 100644 dependencies/fluent_ui-3.12.0/lib/src/controls/inputs/buttons/outlined_button.dart create mode 100644 dependencies/fluent_ui-3.12.0/lib/src/controls/inputs/buttons/text_button.dart create mode 100644 dependencies/fluent_ui-3.12.0/lib/src/controls/inputs/buttons/theme.dart create mode 100644 dependencies/fluent_ui-3.12.0/lib/src/controls/inputs/checkbox.dart create mode 100644 dependencies/fluent_ui-3.12.0/lib/src/controls/inputs/chip.dart create mode 100644 dependencies/fluent_ui-3.12.0/lib/src/controls/inputs/dropdown_button.dart create mode 100644 dependencies/fluent_ui-3.12.0/lib/src/controls/inputs/pill_button_bar.dart create mode 100644 dependencies/fluent_ui-3.12.0/lib/src/controls/inputs/radio_button.dart create mode 100644 dependencies/fluent_ui-3.12.0/lib/src/controls/inputs/rating.dart create mode 100644 dependencies/fluent_ui-3.12.0/lib/src/controls/inputs/slider.dart create mode 100644 dependencies/fluent_ui-3.12.0/lib/src/controls/inputs/split_button.dart create mode 100644 dependencies/fluent_ui-3.12.0/lib/src/controls/inputs/toggle_button.dart create mode 100644 dependencies/fluent_ui-3.12.0/lib/src/controls/inputs/toggle_switch.dart create mode 100644 dependencies/fluent_ui-3.12.0/lib/src/controls/navigation/bottom_navigation.dart create mode 100644 dependencies/fluent_ui-3.12.0/lib/src/controls/navigation/navigation_view/body.dart create mode 100644 dependencies/fluent_ui-3.12.0/lib/src/controls/navigation/navigation_view/indicators.dart create mode 100644 dependencies/fluent_ui-3.12.0/lib/src/controls/navigation/navigation_view/pane.dart create mode 100644 dependencies/fluent_ui-3.12.0/lib/src/controls/navigation/navigation_view/pane_items.dart create mode 100644 dependencies/fluent_ui-3.12.0/lib/src/controls/navigation/navigation_view/style.dart create mode 100644 dependencies/fluent_ui-3.12.0/lib/src/controls/navigation/navigation_view/view.dart create mode 100644 dependencies/fluent_ui-3.12.0/lib/src/controls/navigation/tab_view.dart create mode 100644 dependencies/fluent_ui-3.12.0/lib/src/controls/navigation/tree_view.dart create mode 100644 dependencies/fluent_ui-3.12.0/lib/src/controls/surfaces/bottom_sheet.dart create mode 100644 dependencies/fluent_ui-3.12.0/lib/src/controls/surfaces/calendar/calendar_view.dart create mode 100644 dependencies/fluent_ui-3.12.0/lib/src/controls/surfaces/card.dart create mode 100644 dependencies/fluent_ui-3.12.0/lib/src/controls/surfaces/commandbar.dart create mode 100644 dependencies/fluent_ui-3.12.0/lib/src/controls/surfaces/dialog.dart create mode 100644 dependencies/fluent_ui-3.12.0/lib/src/controls/surfaces/expander.dart create mode 100644 dependencies/fluent_ui-3.12.0/lib/src/controls/surfaces/flyout/content.dart create mode 100644 dependencies/fluent_ui-3.12.0/lib/src/controls/surfaces/flyout/controller.dart create mode 100644 dependencies/fluent_ui-3.12.0/lib/src/controls/surfaces/flyout/flyout.dart create mode 100644 dependencies/fluent_ui-3.12.0/lib/src/controls/surfaces/flyout/menu.dart create mode 100644 dependencies/fluent_ui-3.12.0/lib/src/controls/surfaces/info_bar.dart create mode 100644 dependencies/fluent_ui-3.12.0/lib/src/controls/surfaces/list_tile.dart create mode 100644 dependencies/fluent_ui-3.12.0/lib/src/controls/surfaces/progress_indicators.dart create mode 100644 dependencies/fluent_ui-3.12.0/lib/src/controls/surfaces/snackbar.dart create mode 100644 dependencies/fluent_ui-3.12.0/lib/src/controls/surfaces/tooltip.dart create mode 100644 dependencies/fluent_ui-3.12.0/lib/src/controls/utils/divider.dart create mode 100644 dependencies/fluent_ui-3.12.0/lib/src/controls/utils/hover_button.dart create mode 100644 dependencies/fluent_ui-3.12.0/lib/src/controls/utils/info_badge.dart create mode 100644 dependencies/fluent_ui-3.12.0/lib/src/controls/utils/scrollbar.dart create mode 100644 dependencies/fluent_ui-3.12.0/lib/src/icons.dart create mode 100644 dependencies/fluent_ui-3.12.0/lib/src/layout/dynamic_overflow.dart create mode 100644 dependencies/fluent_ui-3.12.0/lib/src/layout/page.dart create mode 100644 dependencies/fluent_ui-3.12.0/lib/src/localization.dart create mode 100644 dependencies/fluent_ui-3.12.0/lib/src/navigation/route.dart create mode 100644 dependencies/fluent_ui-3.12.0/lib/src/styles/acrylic.dart create mode 100644 dependencies/fluent_ui-3.12.0/lib/src/styles/color.dart create mode 100644 dependencies/fluent_ui-3.12.0/lib/src/styles/focus.dart create mode 100644 dependencies/fluent_ui-3.12.0/lib/src/styles/mica.dart create mode 100644 dependencies/fluent_ui-3.12.0/lib/src/styles/motion/page_transitions.dart create mode 100644 dependencies/fluent_ui-3.12.0/lib/src/styles/theme.dart create mode 100644 dependencies/fluent_ui-3.12.0/lib/src/styles/typography.dart create mode 100644 dependencies/fluent_ui-3.12.0/lib/src/utils.dart create mode 100644 dependencies/fluent_ui-3.12.0/lib/src/utils/horizontal_scroll_view.dart create mode 100644 dependencies/fluent_ui-3.12.0/lib/src/utils/label.dart create mode 100644 dependencies/fluent_ui-3.12.0/lib/src/utils/popup.dart create mode 100644 dependencies/fluent_ui-3.12.0/pubspec.yaml create mode 100644 dependencies/fluent_ui-3.12.0/test/app_test.dart create mode 100644 dependencies/fluent_ui-3.12.0/test/checkbox_test.dart create mode 100644 dependencies/fluent_ui-3.12.0/test/color_test.dart create mode 100644 dependencies/fluent_ui-3.12.0/test/divider_test.dart create mode 100644 dependencies/fluent_ui-3.12.0/test/dropdown_button_test.dart create mode 100644 dependencies/fluent_ui-3.12.0/test/expander_test.dart create mode 100644 dependencies/fluent_ui-3.12.0/test/icons_test.dart create mode 100644 dependencies/fluent_ui-3.12.0/test/label_test.dart create mode 100644 dependencies/fluent_ui-3.12.0/test/navigation_view_test.dart create mode 100644 dependencies/fluent_ui-3.12.0/test/radio_button_test.dart create mode 100644 dependencies/fluent_ui-3.12.0/test/toggle_button_test.dart create mode 100644 dependencies/fluent_ui-3.12.0/test/toggle_switch_test.dart diff --git a/dependencies/bitsdojo_window-0.1.5/CHANGELOG.md b/dependencies/bitsdojo_window-0.1.5/CHANGELOG.md new file mode 100644 index 0000000..c022588 --- /dev/null +++ b/dependencies/bitsdojo_window-0.1.5/CHANGELOG.md @@ -0,0 +1,45 @@ +## 0.1.5 + - Runs on Windows 7 +## 0.1.4 + - Updated win32 to 3.0.0 +## 0.1.3 + - Updated ffi to 2.0.0 +## 0.1.2 + - Flutter 3.0 support +## 0.1.1+1 + - Added Linux usage instructions +## 0.1.1 + - Linux support now stable +## 0.1.0+1 + - Fix gtk library name on Linux +## 0.1.0 + - Added null safety support +## 0.0.9 + - Linux support added +## 0.0.8 + - Added macOS readme instructions +## 0.0.7 + - macOS support added +## 0.0.6 + - Works with latest Flutter version (master channel) +## 0.0.5 + - Works with latest Flutter version (dev channel) +## 0.0.4 + - Better integration with other plugins +## 0.0.3 + - Using dpi-aware values for title bar and buttons dimensions + - Dynamically calculating default button padding instead of fixed one +## 0.0.2 + - Added video tutorial link +## 0.0.1 + +* Initial release + - Custom window frame - remove standard Windows titlebar and buttons + - Hide window on startup + - Show/hide window + - Minimize/Maximize/Restore/Close window + - Move window using Flutter widget + - Set window size, minimum size and maximum size + - Set window position + - Set window alignment on screen (center/topLeft/topRight/bottomLeft/bottomRight) + - Set window title diff --git a/dependencies/bitsdojo_window-0.1.5/LICENSE b/dependencies/bitsdojo_window-0.1.5/LICENSE new file mode 100644 index 0000000..93d3f15 --- /dev/null +++ b/dependencies/bitsdojo_window-0.1.5/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2020-2021 Bogdan Hobeanu + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/dependencies/bitsdojo_window-0.1.5/README.md b/dependencies/bitsdojo_window-0.1.5/README.md new file mode 100644 index 0000000..a55b3e1 --- /dev/null +++ b/dependencies/bitsdojo_window-0.1.5/README.md @@ -0,0 +1,262 @@ +# bitsdojo_window + +A [Flutter package](https://pub.dev/packages/bitsdojo_window) that makes it easy to customize and work with your Flutter desktop app window **on Windows, macOS and Linux**. + +Watch the tutorial to get started. Click the image below to watch the video: + +[![IMAGE ALT TEXT](https://img.youtube.com/vi/bee2AHQpGK4/0.jpg)](https://www.youtube.com/watch?v=bee2AHQpGK4 "Click to open") + + + +**Features**: + + - Custom window frame - remove standard Windows/macOS/Linux titlebar and buttons + - Hide window on startup + - Show/hide window + - Move window using Flutter widget + - Minimize/Maximize/Restore/Close window + - Set window size, minimum size and maximum size + - Set window position + - Set window alignment on screen (center/topLeft/topRight/bottomLeft/bottomRight) + - Set window title + +# Getting Started + +Install the package using `pubspec.yaml` + +# For Windows apps + +Inside your application folder, go to `windows\runner\main.cpp` and add these two lines at the beginning of the file: + +```cpp +#include +auto bdw = bitsdojo_window_configure(BDW_CUSTOM_FRAME | BDW_HIDE_ON_STARTUP); +``` + +# For macOS apps + +Inside your application folder, go to `macos\runner\MainFlutterWindow.swift` and add this line after the one saying `import FlutterMacOS` : + +```swift +import FlutterMacOS +import bitsdojo_window_macos // Add this line +``` + +Then change this line from: + +```swift +class MainFlutterWindow: NSWindow { +``` + +to this: + +```swift +class MainFlutterWindow: BitsdojoWindow { +``` + +After changing `NSWindow` to `BitsdojoWindow` add these lines below the line you changed: + +```swift +override func bitsdojo_window_configure() -> UInt { + return BDW_CUSTOM_FRAME | BDW_HIDE_ON_STARTUP +} +``` + +Your code should now look like this: + +```swift +class MainFlutterWindow: BitsdojoWindow { + + override func bitsdojo_window_configure() -> UInt { + return BDW_CUSTOM_FRAME | BDW_HIDE_ON_STARTUP + } + + override func awakeFromNib() { + ... //rest of your code +``` +# + +If you don't want to use a custom frame and prefer the standard window titlebar and buttons, you can remove the `BDW_CUSTOM_FRAME` flag from the code above. + +If you don't want to hide the window on startup, you can remove the `BDW_HIDE_ON_STARTUP` flag from the code above. + +# For Linux apps + +Inside your application folder, go to `linux\my_application.cc` and add this line at the beginning of the file: + +```cpp +#include +``` +Then look for these two lines: + +```cpp +gtk_window_set_default_size(window, 1280, 720); +gtk_widget_show(GTK_WIDGET(window)); +``` +and change them to this: + +```cpp +auto bdw = bitsdojo_window_from(window); // <--- add this line +bdw->setCustomFrame(true); // <-- add this line +//gtk_window_set_default_size(window, 1280, 720); // <-- comment this line +gtk_widget_show(GTK_WIDGET(window)); +``` + +As you can see, we commented the line calling `gtk_window_set_default_size` and added these two lines before `gtk_widget_show(GTK_WIDGET(window));` + +```cpp +auto bdw = bitsdojo_window_from(window); +bdw->setCustomFrame(true); +``` + +# Flutter app integration + +Now go to `lib\main.dart` and add this code in the `main` function right after `runApp(MyApp());` : + +```dart +void main() { + runApp(MyApp()); + + // Add this code below + + doWhenWindowReady(() { + const initialSize = Size(600, 450); + appWindow.minSize = initialSize; + appWindow.size = initialSize; + appWindow.alignment = Alignment.center; + appWindow.show(); + }); +} +``` +This will set an initial size and a minimum size for your application window, center it on the screen and show it on the screen. + +You can find examples in the `example` folder. + +Here is an example that displays this window: +
+Click to expand + +```dart +import 'package:flutter/material.dart'; +import 'package:bitsdojo_window/bitsdojo_window.dart'; + +void main() { + runApp(const MyApp()); + doWhenWindowReady(() { + final win = appWindow; + const initialSize = Size(600, 450); + win.minSize = initialSize; + win.size = initialSize; + win.alignment = Alignment.center; + win.title = "Custom window with Flutter"; + win.show(); + }); +} + +const borderColor = Color(0xFF805306); + +class MyApp extends StatelessWidget { + const MyApp({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return MaterialApp( + debugShowCheckedModeBanner: false, + home: Scaffold( + body: WindowBorder( + color: borderColor, + width: 1, + child: Row( + children: const [LeftSide(), RightSide()], + ), + ), + ), + ); + } +} + +const sidebarColor = Color(0xFFF6A00C); + +class LeftSide extends StatelessWidget { + const LeftSide({Key? key}) : super(key: key); + @override + Widget build(BuildContext context) { + return SizedBox( + width: 200, + child: Container( + color: sidebarColor, + child: Column( + children: [ + WindowTitleBarBox(child: MoveWindow()), + Expanded(child: Container()) + ], + ))); + } +} + +const backgroundStartColor = Color(0xFFFFD500); +const backgroundEndColor = Color(0xFFF6A00C); + +class RightSide extends StatelessWidget { + const RightSide({Key? key}) : super(key: key); + @override + Widget build(BuildContext context) { + return Expanded( + child: Container( + decoration: const BoxDecoration( + gradient: LinearGradient( + begin: Alignment.topCenter, + end: Alignment.bottomCenter, + colors: [backgroundStartColor, backgroundEndColor], + stops: [0.0, 1.0]), + ), + child: Column(children: [ + WindowTitleBarBox( + child: Row( + children: [Expanded(child: MoveWindow()), const WindowButtons()], + ), + ) + ]), + ), + ); + } +} + +final buttonColors = WindowButtonColors( + iconNormal: const Color(0xFF805306), + mouseOver: const Color(0xFFF6A00C), + mouseDown: const Color(0xFF805306), + iconMouseOver: const Color(0xFF805306), + iconMouseDown: const Color(0xFFFFD500)); + +final closeButtonColors = WindowButtonColors( + mouseOver: const Color(0xFFD32F2F), + mouseDown: const Color(0xFFB71C1C), + iconNormal: const Color(0xFF805306), + iconMouseOver: Colors.white); + +class WindowButtons extends StatelessWidget { + const WindowButtons({Key? key}) : super(key: key); + @override + Widget build(BuildContext context) { + return Row( + children: [ + MinimizeWindowButton(colors: buttonColors), + MaximizeWindowButton(colors: buttonColors), + CloseWindowButton(colors: closeButtonColors), + ], + ); + } +} +``` +
+ +# +# ❤️ **Sponsors - friends helping this package** + +I am developing this package in my spare time and any help is appreciated. +If you want to help you can [become a sponsor](https://github.com/sponsors/bitsdojo). + +🙏 Thank you! + +Want to help? [Become a sponsor](https://github.com/sponsors/bitsdojo) diff --git a/dependencies/bitsdojo_window-0.1.5/lib/bitsdojo_window.dart b/dependencies/bitsdojo_window-0.1.5/lib/bitsdojo_window.dart new file mode 100644 index 0000000..0b3205e --- /dev/null +++ b/dependencies/bitsdojo_window-0.1.5/lib/bitsdojo_window.dart @@ -0,0 +1,5 @@ +export 'src/widgets/window_border.dart'; +export 'src/widgets/window_button.dart'; +export 'src/widgets/window_caption.dart'; +export 'src/icons/icons.dart'; +export 'src/app_window.dart'; diff --git a/dependencies/bitsdojo_window-0.1.5/lib/src/app_window.dart b/dependencies/bitsdojo_window-0.1.5/lib/src/app_window.dart new file mode 100644 index 0000000..8ab6e38 --- /dev/null +++ b/dependencies/bitsdojo_window-0.1.5/lib/src/app_window.dart @@ -0,0 +1,43 @@ +import 'package:bitsdojo_window_platform_interface/bitsdojo_window_platform_interface.dart'; +import 'package:bitsdojo_window_platform_interface/method_channel_bitsdojo_window.dart'; +import 'package:bitsdojo_window_windows/bitsdojo_window_windows.dart'; +import 'package:bitsdojo_window_macos/bitsdojo_window_macos.dart'; +import 'package:bitsdojo_window_linux/bitsdojo_window_linux.dart'; +import 'package:flutter/widgets.dart'; +import 'package:flutter/foundation.dart' show kIsWeb; +import 'dart:io' show Platform; + +bool _platformInstanceNeedsInit = true; + +void initPlatformInstance() { + if (!kIsWeb) { + if (BitsdojoWindowPlatform.instance is MethodChannelBitsdojoWindow) { + if (Platform.isWindows) { + BitsdojoWindowPlatform.instance = BitsdojoWindowWindows(); + } else if (Platform.isMacOS) { + BitsdojoWindowPlatform.instance = BitsdojoWindowMacOS(); + } else if (Platform.isLinux) { + BitsdojoWindowPlatform.instance = BitsdojoWindowLinux(); + } + } + } else { + BitsdojoWindowPlatform.instance = BitsdojoWindowPlatformNotImplemented(); + } +} + +BitsdojoWindowPlatform get _platform { + var needsInit = _platformInstanceNeedsInit; + if (needsInit) { + initPlatformInstance(); + _platformInstanceNeedsInit = false; + } + return BitsdojoWindowPlatform.instance; +} + +void doWhenWindowReady(VoidCallback callback) { + _platform.doWhenWindowReady(callback); +} + +DesktopWindow get appWindow { + return _platform.appWindow; +} diff --git a/dependencies/bitsdojo_window-0.1.5/lib/src/icons/icons.dart b/dependencies/bitsdojo_window-0.1.5/lib/src/icons/icons.dart new file mode 100644 index 0000000..c0b00eb --- /dev/null +++ b/dependencies/bitsdojo_window-0.1.5/lib/src/icons/icons.dart @@ -0,0 +1,114 @@ +import 'dart:math'; + +import 'package:flutter/widgets.dart'; + +// Switched to CustomPaint icons by https://github.com/esDotDev + +/// Close +class CloseIcon extends StatelessWidget { + final Color color; + CloseIcon({Key? key, required this.color}) : super(key: key); + @override + Widget build(BuildContext context) => Align( + alignment: Alignment.topLeft, + child: Stack(children: [ + // Use rotated containers instead of a painter because it renders slightly crisper than a painter for some reason. + Transform.rotate( + angle: pi * .25, + child: + Center(child: Container(width: 14, height: 1, color: color))), + Transform.rotate( + angle: pi * -.25, + child: + Center(child: Container(width: 14, height: 1, color: color))), + ]), + ); +} + +/// Maximize +class MaximizeIcon extends StatelessWidget { + final Color color; + MaximizeIcon({Key? key, required this.color}) : super(key: key); + @override + Widget build(BuildContext context) => _AlignedPaint(_MaximizePainter(color)); +} + +class _MaximizePainter extends _IconPainter { + _MaximizePainter(Color color) : super(color); + @override + void paint(Canvas canvas, Size size) { + Paint p = getPaint(color); + canvas.drawRect(Rect.fromLTRB(0, 0, size.width - 1, size.height - 1), p); + } +} + +/// Restore +class RestoreIcon extends StatelessWidget { + final Color color; + RestoreIcon({ + Key? key, + required this.color, + }) : super(key: key); + @override + Widget build(BuildContext context) => _AlignedPaint(_RestorePainter(color)); +} + +class _RestorePainter extends _IconPainter { + _RestorePainter(Color color) : super(color); + @override + void paint(Canvas canvas, Size size) { + Paint p = getPaint(color); + canvas.drawRect(Rect.fromLTRB(0, 2, size.width - 2, size.height), p); + canvas.drawLine(Offset(2, 2), Offset(2, 0), p); + canvas.drawLine(Offset(2, 0), Offset(size.width, 0), p); + canvas.drawLine( + Offset(size.width, 0), Offset(size.width, size.height - 2), p); + canvas.drawLine(Offset(size.width, size.height - 2), + Offset(size.width - 2, size.height - 2), p); + } +} + +/// Minimize +class MinimizeIcon extends StatelessWidget { + final Color color; + MinimizeIcon({Key? key, required this.color}) : super(key: key); + @override + Widget build(BuildContext context) => _AlignedPaint(_MinimizePainter(color)); +} + +class _MinimizePainter extends _IconPainter { + _MinimizePainter(Color color) : super(color); + @override + void paint(Canvas canvas, Size size) { + Paint p = getPaint(color); + canvas.drawLine( + Offset(0, size.height / 2), Offset(size.width, size.height / 2), p); + } +} + +/// Helpers +abstract class _IconPainter extends CustomPainter { + _IconPainter(this.color); + final Color color; + + @override + bool shouldRepaint(covariant CustomPainter oldDelegate) => false; +} + +class _AlignedPaint extends StatelessWidget { + const _AlignedPaint(this.painter, {Key? key}) : super(key: key); + final CustomPainter painter; + + @override + Widget build(BuildContext context) { + return Align( + alignment: Alignment.center, + child: CustomPaint(size: Size(10, 10), painter: painter)); + } +} + +Paint getPaint(Color color, [bool isAntiAlias = false]) => Paint() + ..color = color + ..style = PaintingStyle.stroke + ..isAntiAlias = isAntiAlias + ..strokeWidth = 1; diff --git a/dependencies/bitsdojo_window-0.1.5/lib/src/widgets/mouse_state_builder.dart b/dependencies/bitsdojo_window-0.1.5/lib/src/widgets/mouse_state_builder.dart new file mode 100644 index 0000000..3266758 --- /dev/null +++ b/dependencies/bitsdojo_window-0.1.5/lib/src/widgets/mouse_state_builder.dart @@ -0,0 +1,71 @@ +import 'package:flutter/widgets.dart'; + +typedef MouseStateBuilderCB = Widget Function( + BuildContext context, MouseState mouseState); + +class MouseState { + bool isMouseOver = false; + bool isMouseDown = false; + MouseState(); + @override + String toString() { + return "isMouseDown: ${this.isMouseDown} - isMouseOver: ${this.isMouseOver}"; + } +} + +T? _ambiguate(T? value) => value; + +class MouseStateBuilder extends StatefulWidget { + final MouseStateBuilderCB builder; + final VoidCallback? onPressed; + MouseStateBuilder({Key? key, required this.builder, this.onPressed}) + : super(key: key); + @override + _MouseStateBuilderState createState() => _MouseStateBuilderState(); +} + +class _MouseStateBuilderState extends State { + late MouseState _mouseState; + _MouseStateBuilderState() { + _mouseState = MouseState(); + } + + @override + Widget build(BuildContext context) { + return MouseRegion( + onEnter: (event) { + setState(() { + _mouseState.isMouseOver = true; + }); + }, + onExit: (event) { + setState(() { + _mouseState.isMouseOver = false; + }); + }, + child: GestureDetector( + onTapDown: (_) { + setState(() { + _mouseState.isMouseDown = true; + }); + }, + onTapCancel: () { + setState(() { + _mouseState.isMouseDown = false; + }); + }, + onTap: () { + setState(() { + _mouseState.isMouseDown = false; + _mouseState.isMouseOver = false; + }); + _ambiguate(WidgetsBinding.instance)!.addPostFrameCallback((_) { + if (widget.onPressed != null) { + widget.onPressed!(); + } + }); + }, + onTapUp: (_) {}, + child: widget.builder(context, _mouseState))); + } +} diff --git a/dependencies/bitsdojo_window-0.1.5/lib/src/widgets/window_border.dart b/dependencies/bitsdojo_window-0.1.5/lib/src/widgets/window_border.dart new file mode 100644 index 0000000..5592653 --- /dev/null +++ b/dependencies/bitsdojo_window-0.1.5/lib/src/widgets/window_border.dart @@ -0,0 +1,49 @@ +import 'package:bitsdojo_window_windows/bitsdojo_window_windows.dart' + show WinDesktopWindow; +import 'package:flutter/foundation.dart'; +import 'package:flutter/widgets.dart'; +import '../app_window.dart'; + +class WindowBorder extends StatelessWidget { + final Widget child; + final Color color; + final double? width; + + WindowBorder({Key? key, required this.child, required this.color, this.width}) + : super(key: key); + + @override + Widget build(BuildContext context) { + bool isWindowsApp = + (!kIsWeb) && (defaultTargetPlatform == TargetPlatform.windows); + bool isLinuxApp = + (!kIsWeb) && (defaultTargetPlatform == TargetPlatform.linux); + + // Only show border on Windows and Linux + if (!(isWindowsApp || isLinuxApp)) { + return child; + } + + var borderWidth = width ?? 1; + var topBorderWidth = width ?? 1; + + if (appWindow is WinDesktopWindow) { + appWindow as WinDesktopWindow..setWindowCutOnMaximize(borderWidth.ceil()); + } + + if (isWindowsApp) { + topBorderWidth += 1 / appWindow.scaleFactor; + } + final topBorderSide = BorderSide(color: this.color, width: topBorderWidth); + final borderSide = BorderSide(color: this.color, width: borderWidth); + + return Container( + child: child, + decoration: BoxDecoration( + border: Border( + top: topBorderSide, + left: borderSide, + right: borderSide, + bottom: borderSide))); + } +} diff --git a/dependencies/bitsdojo_window-0.1.5/lib/src/widgets/window_button.dart b/dependencies/bitsdojo_window-0.1.5/lib/src/widgets/window_button.dart new file mode 100644 index 0000000..607c4b9 --- /dev/null +++ b/dependencies/bitsdojo_window-0.1.5/lib/src/widgets/window_button.dart @@ -0,0 +1,203 @@ +import 'package:flutter/material.dart'; + +import './mouse_state_builder.dart'; +import '../icons/icons.dart'; +import '../app_window.dart'; +import 'package:flutter/foundation.dart' show kIsWeb; +import 'dart:io' show Platform; + +typedef WindowButtonIconBuilder = Widget Function( + WindowButtonContext buttonContext); +typedef WindowButtonBuilder = Widget Function( + WindowButtonContext buttonContext, Widget icon); + +class WindowButtonContext { + BuildContext context; + MouseState mouseState; + Color? backgroundColor; + Color iconColor; + WindowButtonContext( + {required this.context, + required this.mouseState, + this.backgroundColor, + required this.iconColor}); +} + +class WindowButtonColors { + late Color normal; + late Color mouseOver; + late Color mouseDown; + late Color iconNormal; + late Color iconMouseOver; + late Color iconMouseDown; + WindowButtonColors( + {Color? normal, + Color? mouseOver, + Color? mouseDown, + Color? iconNormal, + Color? iconMouseOver, + Color? iconMouseDown}) { + this.normal = normal ?? _defaultButtonColors.normal; + this.mouseOver = mouseOver ?? _defaultButtonColors.mouseOver; + this.mouseDown = mouseDown ?? _defaultButtonColors.mouseDown; + this.iconNormal = iconNormal ?? _defaultButtonColors.iconNormal; + this.iconMouseOver = iconMouseOver ?? _defaultButtonColors.iconMouseOver; + this.iconMouseDown = iconMouseDown ?? _defaultButtonColors.iconMouseDown; + } +} + +final _defaultButtonColors = WindowButtonColors( + normal: Colors.transparent, + iconNormal: Color(0xFF805306), + mouseOver: Color(0xFF404040), + mouseDown: Color(0xFF202020), + iconMouseOver: Color(0xFFFFFFFF), + iconMouseDown: Color(0xFFF0F0F0)); + +class WindowButton extends StatelessWidget { + final WindowButtonBuilder? builder; + final WindowButtonIconBuilder? iconBuilder; + late final WindowButtonColors colors; + final bool animate; + final EdgeInsets? padding; + final VoidCallback? onPressed; + + WindowButton( + {Key? key, + WindowButtonColors? colors, + this.builder, + @required this.iconBuilder, + this.padding, + this.onPressed, + this.animate = false}) + : super(key: key) { + this.colors = colors ?? _defaultButtonColors; + } + + Color getBackgroundColor(MouseState mouseState) { + if (mouseState.isMouseDown) return colors.mouseDown; + if (mouseState.isMouseOver) return colors.mouseOver; + return colors.normal; + } + + Color getIconColor(MouseState mouseState) { + if (mouseState.isMouseDown) return colors.iconMouseDown; + if (mouseState.isMouseOver) return colors.iconMouseOver; + return colors.iconNormal; + } + + @override + Widget build(BuildContext context) { + if (kIsWeb) { + return Container(); + } else { + // Don't show button on macOS + if (Platform.isMacOS) { + return Container(); + } + } + final buttonSize = appWindow.titleBarButtonSize; + return MouseStateBuilder( + builder: (context, mouseState) { + WindowButtonContext buttonContext = WindowButtonContext( + mouseState: mouseState, + context: context, + backgroundColor: getBackgroundColor(mouseState), + iconColor: getIconColor(mouseState)); + + var icon = (this.iconBuilder != null) + ? this.iconBuilder!(buttonContext) + : Container(); + double borderSize = appWindow.borderSize; + double defaultPadding = + (appWindow.titleBarHeight - borderSize) / 3 - (borderSize / 2); + // Used when buttonContext.backgroundColor is null, allowing the AnimatedContainer to fade-out smoothly. + var fadeOutColor = + getBackgroundColor(MouseState()..isMouseOver = true).withOpacity(0); + var padding = this.padding ?? EdgeInsets.zero; + var animationMs = + mouseState.isMouseOver ? (animate ? 100 : 0) : (animate ? 200 : 0); + Widget iconWithPadding = Padding(padding: padding, child: icon); + iconWithPadding = AnimatedContainer( + curve: Curves.easeOut, + duration: Duration(milliseconds: animationMs), + color: buttonContext.backgroundColor ?? fadeOutColor, + child: iconWithPadding); + var button = (this.builder != null) + ? this.builder!(buttonContext, icon) + : iconWithPadding; + return SizedBox( + width: 48, height: 48, child: button); + }, + onPressed: () { + if (this.onPressed != null) this.onPressed!(); + }, + ); + } +} + +class MinimizeWindowButton extends WindowButton { + MinimizeWindowButton( + {Key? key, + WindowButtonColors? colors, + VoidCallback? onPressed, + bool? animate}) + : super( + key: key, + colors: colors, + animate: animate ?? false, + iconBuilder: (buttonContext) => + MinimizeIcon(color: buttonContext.iconColor), + onPressed: onPressed ?? () => appWindow.minimize()); +} + +class MaximizeWindowButton extends WindowButton { + MaximizeWindowButton( + {Key? key, + WindowButtonColors? colors, + VoidCallback? onPressed, + bool? animate}) + : super( + key: key, + colors: colors, + animate: animate ?? false, + iconBuilder: (buttonContext) => + MaximizeIcon(color: buttonContext.iconColor), + onPressed: onPressed ?? () => appWindow.maximizeOrRestore()); +} + +class RestoreWindowButton extends WindowButton { + RestoreWindowButton( + {Key? key, + WindowButtonColors? colors, + VoidCallback? onPressed, + bool? animate}) + : super( + key: key, + colors: colors, + animate: animate ?? false, + iconBuilder: (buttonContext) => + RestoreIcon(color: buttonContext.iconColor), + onPressed: onPressed ?? () => appWindow.maximizeOrRestore()); +} + +final _defaultCloseButtonColors = WindowButtonColors( + mouseOver: Color(0xFFD32F2F), + mouseDown: Color(0xFFB71C1C), + iconNormal: Color(0xFF805306), + iconMouseOver: Color(0xFFFFFFFF)); + +class CloseWindowButton extends WindowButton { + CloseWindowButton( + {Key? key, + WindowButtonColors? colors, + VoidCallback? onPressed, + bool? animate}) + : super( + key: key, + colors: colors ?? _defaultCloseButtonColors, + animate: animate ?? false, + iconBuilder: (buttonContext) => + CloseIcon(color: buttonContext.iconColor), + onPressed: onPressed ?? () => appWindow.close()); +} diff --git a/dependencies/bitsdojo_window-0.1.5/lib/src/widgets/window_caption.dart b/dependencies/bitsdojo_window-0.1.5/lib/src/widgets/window_caption.dart new file mode 100644 index 0000000..2a15b59 --- /dev/null +++ b/dependencies/bitsdojo_window-0.1.5/lib/src/widgets/window_caption.dart @@ -0,0 +1,48 @@ +import 'package:flutter/widgets.dart'; +import '../app_window.dart'; +import 'package:flutter/foundation.dart' show kIsWeb; + +class _MoveWindow extends StatelessWidget { + _MoveWindow({Key? key, this.child, this.onDoubleTap}) : super(key: key); + final Widget? child; + final VoidCallback? onDoubleTap; + @override + Widget build(BuildContext context) { + return GestureDetector( + behavior: HitTestBehavior.translucent, + onPanStart: (details) { + appWindow.startDragging(); + }, + onDoubleTap: this.onDoubleTap ?? () => appWindow.maximizeOrRestore(), + child: this.child ?? Container()); + } +} + +class MoveWindow extends StatelessWidget { + final Widget? child; + final VoidCallback? onDoubleTap; + MoveWindow({Key? key, this.child, this.onDoubleTap}) : super(key: key); + @override + Widget build(BuildContext context) { + if (child == null) return _MoveWindow(onDoubleTap: this.onDoubleTap); + return _MoveWindow( + onDoubleTap: this.onDoubleTap, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [Expanded(child: this.child!)]), + ); + } +} + +class WindowTitleBarBox extends StatelessWidget { + final Widget? child; + WindowTitleBarBox({Key? key, this.child}) : super(key: key); + @override + Widget build(BuildContext context) { + if (kIsWeb) { + return Container(); + } + final titlebarHeight = appWindow.titleBarHeight; + return SizedBox(height: titlebarHeight, child: this.child ?? Container()); + } +} diff --git a/dependencies/bitsdojo_window-0.1.5/pubspec.yaml b/dependencies/bitsdojo_window-0.1.5/pubspec.yaml new file mode 100644 index 0000000..47ef658 --- /dev/null +++ b/dependencies/bitsdojo_window-0.1.5/pubspec.yaml @@ -0,0 +1,31 @@ +name: bitsdojo_window +description: A package to help with creating custom windows with Flutter desktop (custom border, titlebar and minimize/maximize/close buttons) and common desktop window operations (show/hide/position on screen) for Windows and macOS +version: 0.1.5 +homepage: https://www.bitsdojo.com +repository: https://github.com/bitsdojo/bitsdojo_window + +environment: + sdk: ">=2.17.0 <3.0.0" + flutter: ">=1.20.0" + +flutter: + plugin: + platforms: + windows: + default_package: bitsdojo_window_windows + macos: + default_package: bitsdojo_window_macos + linux: + default_package: bitsdojo_window_linux + +dependencies: + flutter: + sdk: flutter + bitsdojo_window_platform_interface: ^0.1.2 + #path: ../bitsdojo_window_platform_interface + bitsdojo_window_windows: ^0.1.5 + #path: ../bitsdojo_window_windows + bitsdojo_window_macos: ^0.1.3 + #path: ../bitsdojo_window_macos + bitsdojo_window_linux: ^0.1.3 + #path: ../bitsdojo_window_linux diff --git a/dependencies/fluent_ui-3.12.0/CHANGELOG.md b/dependencies/fluent_ui-3.12.0/CHANGELOG.md new file mode 100644 index 0000000..fe63338 --- /dev/null +++ b/dependencies/fluent_ui-3.12.0/CHANGELOG.md @@ -0,0 +1,897 @@ +Date format: DD/MM/YYYY + +## [3.12.0] - Flutter 3.0 - [13/05/2022] + +- Add support for Flutter 3.0 (Fixes [#186](https://github.com/bdlukaa/fluent_ui/issues/186), [#327](https://github.com/bdlukaa/fluent_ui/issues/327)) + +## [3.11.1] - [30/04/2022] + +- Reworked `DropDownButton` ([#297](https://github.com/bdlukaa/fluent_ui/pull/297)): + - `DropDownButton` now uses `Flyout` and `MenuFlyout` to display the menu + - Added scrolling features and style to `MenuFlyout` + - `MenuFlyout` content height is now properly calculated (Fixes [#210](https://github.com/bdlukaa/fluent_ui/issues/210)) + - `DropDownButtonItem` is deprecated. `MenuFlyoutItem` should be used instead + - Added `DropDownButton.buttonBuilder`, which is able to style the button as you wish. `DropDownButton.buttonStyle` is now deprecated + ```dart + DropDownButton( + items: [...], + // onOpen should be called to open the flyout. If onOpen is null, it means the button + // should be disabled + buttonBuilder: (context, onOpen) { + return Button( + ..., + onPressed: onOpen, + ); + } + ) + ``` +- `TextButton` now uses `textButtonStyle` instead of `outlinedButtonStyle` +- Add `TextFormBox.decoration` ([#312](https://github.com/bdlukaa/fluent_ui/pull/312)) + +## [3.11.0] - Menu Flyouts - [23/04/2022] + +- Implemented `MenuFlyout` ([#266](https://github.com/bdlukaa/fluent_ui/pull/266)) + - Implemented `FlyoutPosition`, which controls where the flyout will be opened according to the child. It can be `above`, `below` or `side` + - `FlyoutOpenMode.longHover`, which makes possible to open the flyout when the user performs a long hover + - Added `Flyout.onOpen` and `Flyout.onClose`. Some convenience callbacks that are called when the flyout is opened or closed, respectively + - Implement `PopupContentSizeInfo`, which provides the information about the content size + - Implemented `MenuFlyoutItem`, `MenuFlyoutSeparator` and `MenuFlyoutSubItem`. They are used inside `MenuFlyout` to render the menu items + - `horizontalPositionDependentBox` is now globally available for use as a top function +- Implemented overflow popup on `NavigationView` for top mode ([#277](https://github.com/bdlukaa/fluent_ui/pull/277)) +- `InfoBadge` now is correctly positioned on top mode ([#296](https://github.com/bdlukaa/fluent_ui/pull/296)) + +## [3.10.3] - [15/04/2022] + +- Do not use duplicated `Scrollbar`s ([#279](https://github.com/bdlukaa/fluent_ui/pull/279/)) +- Allow custom height on `NavigationPane` header. ([#260](https://github.com/bdlukaa/fluent_ui/pull/260/)) +- Allow to define the minimal tab width ([#282](https://github.com/bdlukaa/fluent_ui/pull/282/)) +- Allow applying custom leading Widget to NavigationPane ([#288](https://github.com/bdlukaa/fluent_ui/pull/288/)) +- `TextFormBox.expands` now works properly ([#291]](https://github.com/bdlukaa/fluent_ui/pull/291)) +- Focus on `TextBox` is no longer duplicated ([#290](https://github.com/bdlukaa/fluent_ui/pull/290)) + +## [3.10.2] - [09/04/2022] + +- `NavigationView` without pane no longer throws error ([#276](https://github.com/bdlukaa/fluent_ui/issues/276)) + +## [3.10.1] - [06/04/2022] + +- Fix overflow behavior for `TreeViewItem` ([#270](https://github.com/bdlukaa/fluent_ui/pull/270)) +- Do not animate sticky indicators when parent is updated ([#273](https://github.com/bdlukaa/fluent_ui/pull/273)) +- Add Arabic(ar) localization ([#268](https://github.com/bdlukaa/fluent_ui/pull/268)) + +## [3.10.0] - Localization, Indicators, CommandBar and Flyouts - [02/04/2022] + +- Improves `icons.dart` formatting and its generation ([#215](https://github.com/bdlukaa/fluent_ui/pull/215)) +- Use correct color on `FilledButton` when disabled ([209](https://github.com/bdlukaa/fluent_ui/pull/209)) +- Built-in support for new languages ([#216](https://github.com/bdlukaa/fluent_ui/pull/216)): + - English + - Spanish (reviewed by [@henry2man](https://github.com/henry2man)) + - French (reviewed by [@WinXaito](https://github.com/WinXaito)) + - Brazilian Portuguese (reviewed by [@bdlukaa](https://github.com/bdlukaa)) + - Russian (reviewed by [@raitonoberu](https://github.com/raitonoberu)) + - German (reviewed by [@larsb24](https://github.com/larsb24)) + - Hindi (reviewed by [@alexmercerind](https://github.com/alexmercerind)) + - Simplified Chinese (reviewed by [@zacksleo](https://github.com/zacksleo)) +- Add `useInheritedMediaQuery` property to `FluentApp` ([#211](https://github.com/bdlukaa/fluent_ui/pull/211)) +- `TreeView` updates ([#255](https://github.com/bdlukaa/fluent_ui/pull/225)): + - Optional vertical scrolling by setting `shrinkWrap` to `false` + - TreeViewItem now has a custom primary key (`value` field) + - Added `onSelectionChanged` callback, called when the selection is changed +- Account for enabled on pressing states ([#233](https://github.com/bdlukaa/fluent_ui/pull/233)) +- Implement `CommandBar` ([#232](https://github.com/bdlukaa/fluent_ui/pull/232)) + - Add `DynamicOverflow` layout widget, for one-run horizontal or vertical layout with an overflow widget + - Add `HorizontalScrollView` helper widget, with mouse wheel horizontal scrolling +- Long `content` widget no longer overflow in `ContentDialog` ([#242](https://github.com/bdlukaa/fluent_ui/issues/242)) +- Content state is no longer lost when the pane display mode is changed ([#250](https://github.com/bdlukaa/fluent_ui/pull/250)) +- **BREAKING** Update indicators ([#248](https://github.com/bdlukaa/fluent_ui/pull/248)): + - Added `InheritedNavigationView` + - Updated sticky indicator to match the latest Win 11 UI ([#173](https://github.com/bdlukaa/fluent_ui/issues/173)) + - **BREAKING** Renamed `NavigationPane.indicatorBuilder` to `NavigationPane.indicator` + - **BREAKING** Indicators are no longer built with functions + Before: + ```dart + indicatorBuilder: ({ + required BuildContext context, + required NavigationPane pane, + required Axis axis, + required Widget child, + }) { + if (pane.selected == null) return child; + assert(debugCheckHasFluentTheme(context)); + final theme = NavigationPaneTheme.of(context); + + final left = theme.iconPadding?.left ?? theme.labelPadding?.left ?? 0; + final right = theme.labelPadding?.right ?? theme.iconPadding?.right ?? 0; + + return StickyNavigationIndicator( + index: pane.selected!, + pane: pane, + child: child, + color: theme.highlightColor, + curve: Curves.easeIn, + axis: axis, + topPadding: EdgeInsets.only(left: left, right: right), + ); + } + ``` + + Now: + ```dart + indicator: StickyNavigationIndicator( + color: Colors.blue.lighter, // optional + ), + ``` +- `initiallyExpanded` property on `Expander` works properly ([#252](https://github.com/bdlukaa/fluent_ui/pull/252)) +- **BREAKING** Flyout changes: + - Removed `Flyout.contentWidth` and added `FlyoutContent.constraints`. Now the content will be automatically sized and layed out according to the placement + - Added `Flyout.placement` which takes a `FlyoutPlacement` + - Added `Flyout.openMode` which takes a `FlyoutOpenMode` + - `Flyout.controller` is no longer required. If not provided, a local controller is created to handle the `Flyout.openMode` settings + - **Breaking** `FlyoutController.open` is now a function + - Added `FlyoutController.isOpen`, `FlyoutController.isClosed`, `FlyoutController.close()`, `FlyoutController.open()` and `FlyoutController.toggle()` + - **Breaking** Removed `Popup.contentHeight` +- **BREAKING** Updated typography ([#261](https://github.com/bdlukaa/fluent_ui/pull/261)): + - Renamed `Typography.standart` to `Typography.fromBrightness` + - Renamed `Typography` constructor to `Typography.raw` + - Default color for dark mode is now `const Color(0xE4000000)` + - Updated default font sizes for `display`, `titleLarge`, `title` and `subtitle` +- `TabWidthBehavior.sizeToContent` now works properly ([#218](https://github.com/bdlukaa/fluent_ui/issues/218)) + +## [3.9.1] - Input Update - [25/02/2022] + +- `TextBox` updates: ([#179](https://github.com/bdlukaa/fluent_ui/pull/179)) + - Correctly apply the `style` property + - Correctly apply `decoration` to the background + - Added `foregroundDecoration` and `highlightColor` property. They can not be specified at the same time + - **BREAKING** replaced `maxLengthEnforeced` with `maxLengthEnforcement` +- Expose more propertied to `TextFormBox` +- `AutoSuggestBox` updates: + - Improved fidelity of the suggestions overlay expose more customization properties ([#174](https://github.com/bdlukaa/fluent_ui/issues/174)) + - When a suggestion is picked, the overlay is automatically closed and the text box is unfocused + - Clear button now only shows when the text box is focused +- Add directionality support ([#184](https://github.com/bdlukaa/fluent_ui/pull/184)) +- Correctly apply elevation for `DropDownButton` overlay ([#182](https://github.com/bdlukaa/fluent_ui/issues/182)) +- Show app bar even if `NavigationPane` is not provided on `NavigationView` ([#187](https://github.com/bdlukaa/fluent_ui/issues/187)) +- Ensure `NavigationAppBar.actions` are rendered on the top of the other widgets ([#177](https://github.com/bdlukaa/fluent_ui/issues/177)) +- All Form widgets now have the same height by default +- Only show one scrollbar on `ComboBox` overlay +- Fix opened pane opacity +- Added `menuColor` for theme, which is now used by dropdown button, auto suggest box, tooltip and content dialog +- Added `Card` and `cardColor` for theme +- Update fluent text controls and added support for `SelectableText` ([#196](https://github.com/bdlukaa/fluent_ui/pull/196)) + +## [3.9.0] - Fidelity - [10/02/2022] + +- **BREAKING** Renamed `standartCurve` to `standardCurve` +- **BREAKING** Completly rework `DropDownButton` +- **BREAKING** Removed `CheckboxThemeData.thirdStateIcon` + + Currently, there isn't a fluent icon that is close to the native icon. A local widget *`_ThirdStateDash`* is used +- Do not override material `Theme` on `FluentApp` ([#155](https://github.com/bdlukaa/fluent_ui/pull/154)) +- Slider thumb now doesn't change inner size if hovered while disabled +- Uniform foreground color on `Checkbox` +- Updated `FilledButton` Style +- `ToggleButton` and `FilledButton` now share the same style +- `ScaffoldPage.scrollable` and `ScaffoldPage.withPadding` +- Ensure we use `Typography.body` as the default text style on `BaseButton` ([#120](https://github.com/bdlukaa/fluent_ui/issues/160)) +- Update `ButtonThemeData.uncheckedInputColor` + +## [3.8.0] - Flutter Favorite - [03/02/2022] + +- Tests ([#142](https://github.com/bdlukaa/fluent_ui/pull/142)) +- Added Material Theme to Fluent Theme Builder ([#133](https://github.com/bdlukaa/fluent_ui/issues/133)) +- Add more customization options to PaneItem ([#111](https://github.com/bdlukaa/fluent_ui/issues/111), [#144](https://github.com/bdlukaa/fluent_ui/issues/144)) +- `NavigationView` updates **BREAKING**: + - Properly add item key to `PaneItem` in top mode ([#143](https://github.com/bdlukaa/fluent_ui/issues/143)) + - Items bounds and positions are fetched when the item list is scrolled as well to prevent misalignment + - Added the helper functions `NavigationIndicator.end` and `NavigationIndicator.sticky` + - Use `Curves.easeIn` for sticky navigation indicator by default + - Use the correct accent color for navigation indicators by default + - `EntrancePageTransition` is now the correct page transition used when display mode is top + - Apply correct press effect for `PaneItem` when display mode is top + - **BREAKING** Removed `NavigationPane.defaultNavigationIndicator` + - **BREAKING** Replaced `offsets` and `sizes` with `pane` in `NavigationPane` + + Before: + ```dart + pane: NavigationPane( + indicatorBuilder: ({ + required BuildContext context, + /// The navigation pane corresponding to this indicator + required NavigationPane pane, + /// Corresponds to the current display mode. If top, Axis.vertical + /// is passed, otherwise Axis.vertical + Axis? axis, + /// Corresponds to the pane itself as a widget. The indicator is + /// rendered over the whole pane. + required Widget child, + }) { + if (pane.selected == null) return child; + assert(debugCheckHasFluentTheme(context)); + final theme = NavigationPaneThemeData.of(context); + + axis??= Axis.horizontal; + + return EndNavigationIndicator( + index: pane.selected, + offsets: () => pane.effectiveItems.getPaneItemsOffsets (pane.paneKey), + sizes: pane.effectiveItems.getPaneItemsSizes, + child: child, + color: theme.highlightColor, + curve: theme.animationCurve ?? Curves.linear, + axis: axis, + ); + }, + ), + ``` + + Now: + ```dart + pane: NavigationPane( + indicatorBuilder: ({ + required BuildContext context, + /// The navigation pane corresponding to this indicator + required NavigationPane pane, + /// Corresponds to the current display mode. If top, Axis.vertical + /// is passed, otherwise Axis.vertical + required Axis axis, + /// Corresponds to the pane itself as a widget. The indicator is + /// rendered over the whole pane. + required Widget child, + }) { + if (pane.selected == null) return child; + assert(debugCheckHasFluentTheme(context)); + final theme = NavigationPaneThemeData.of(context); + + return EndNavigationIndicator( + index: pane.selected, + pane: pane, + child: child, + color: theme.highlightColor, + curve: theme.animationCurve ?? Curves.linear, + axis: axis, + ); + }, + ), + ``` + +## [3.7.0] - Breaking changes - [21/01/2022] + +- AutoSuggestBox: ([#130](https://github.com/bdlukaa/fluent_ui/pull/130)) + - It gets opened automatically when it gets focus + - When an item is tapped, the cursor is positioned correctly at the end of the text + - **BREAKING** Now it's not possible to assign a type to `AutoSuggestBox`: + Before: + ```dart + AutoSuggestBox(...), + ``` + Now: + ```dart + AutoSuggestBox(...), + ``` +- Added TextFormBox witch integrates with the Form widget. It has the ability to be validated and to show an error message. +- New FluentIcons gallery showcase in example project ([#123](https://github.com/bdlukaa/fluent_ui/issues/123)) +- Updated FluentIcons as per 30/12/2021 +- **BREAKING** Renamed `FluentIcons.close` to `FluentIcons.chrome_close` +- Fixed rounded corners on the ComboBox widget +- Fixed missing padding before close button on `TabView` ([#122](https://github.com/bdlukaa/fluent_ui/issues/122)) +- Readded tab minimal size for `equal` and `sizeToContent` tab width behaviours ([#122](https://github.com/bdlukaa/fluent_ui/issues/122)) +- `TabView`'s close button now uses `SmallIconButton` +- If a tab is partially off the view, it's scrolled until it's visible +- Fix `IconButton`'s icon size +- Update `OutlinedButton`, `FilledButton` and `TextButton` styles +- Implement lazy tree view ([#139](https://github.com/bdlukaa/fluent_ui/pull/139)) + +## [3.6.0] - TabView Update - [25/12/2021] + +- Implement `TreeView` ([#120](https://github.com/bdlukaa/fluent_ui/pull/120)) +- Fix `Tooltip.useMousePosition` +- Fix `Slider` and `RatingBar` ([#116](https://github.com/bdlukaa/fluent_ui/issues/116)) +- Fix scroll buttons when there are too many tabs in `TabView` ([#92](https://github.com/bdlukaa/fluent_ui/issues/92)) +- Fix button style on tab in `TabView` ([#90](https://github.com/bdlukaa/fluent_ui/issues/90)) +- Added *Close on middle click* on tabs in `TabView` ([#91](https://github.com/bdlukaa/fluent_ui/issues/91)) +- Added `newTabLabel`, `closeTabLabel`, `scrollTabBackward`, `scrollTabForward` to `FluentLocalizations` +- Fix `TabView`'s text when it's too long. Now it's clipped when overflow and line doesn't break +- Added `TabView.closeButtonVisibility`. Defaults to `CloseButtonVisibilityMode.always` +- Updated selected tab paint +- Added `TabView.tabWidthBehavior`. Defaults to `TabWidthBehavior.equal` +- Added `TabView.header` and `TabView.footer` +- `Slider`'s mouse cursor is now [MouseCursor.defer] +- Added `SmallIconButton`, which makes an [IconButton] small if wrapped. It's used by `TextBox` +- Added `ButtonStyle.iconSize` +- **BREAKING** `AutoSuggestBox` updates: + - Added `FluentLocalizations.noResultsFoundLabel`. "No results found" is the default text + - Removed `itemBuilder`, `sorter`, `noResultsFound`, `textBoxBuilder`, `defaultNoResultsFound` and `defaultTextBoxBuilder` + - Added `onChanged`, `trailingIcon`, `clearButtonEnabled` and `placeholder` + - `controller` is now nullable. If null, an internal controller is creted + +## [3.5.2] - [17/12/2021] + +- **BREAKING** Removed `ThemeData.inputMouseCursor` +- **BREAKING** Removed `cursor` from `DatePicker`, `TimePicker`, `ButtonStyle`, `CheckboxThemeData`, `RadioButtonThemeData`, `SliderThemeData`, `ToggleSwitchThemeData`, `NavigationPaneThemeData` +- Scrollbar is not longer shown if `PaneDisplayMode` is `top` +- If open the compact pane, it's not always a overlay +- Added `triggerMode` and `enableFeedback` to `Tooltip`. +- Added `Tooltip.dismissAllToolTips` + +## [3.5.1] - [15/12/2021] + +- Update inputs colors +- `Expander` now properly disposes its resources +- Add the `borderRadius` and `shape` attributes to the `Mica` widget +- Implement `DropDownButton` ([#85](https://github.com/bdlukaa/fluent_ui/issues/85)) + +## [3.5.0] - Flutter 2.8 - [09/12/2021] + +- **BREAKING** Minimal Flutter version is now 2.8 +- `NavigationAppBar.backgroundColor` is now applied correctly. ([#100](https://github.com/bdlukaa/fluent_ui/issues/100)) +- ComboBox's Popup Acrylic can now be disabled if wrapped in a `DisableAcrylic` ([#105](https://github.com/bdlukaa/fluent_ui/issues/105)) +- `NavigationPane` width can now be customizable ([#99](https://github.com/bdlukaa/fluent_ui/issues/99)) +- Implement `PaneItemAction` for `NavigationPane` ([#104](https://github.com/bdlukaa/fluent_ui/issues/104)) + +## [3.4.1] - [08/11/2021] + +- `ContentDialog` constraints can now be customizable ([#86](https://github.com/bdlukaa/fluent_ui/issues/86)) +- Add possibility to disable acrylic by wrapping it in a `DisableAcrylic` ([#89](https://github.com/bdlukaa/fluent_ui/issues/89)) +- Fix `onReaorder null exception` ([#88](https://github.com/bdlukaa/fluent_ui/issues/88)) +- Implement `InfoBadge` +- Implement `Expander` ([#85](https://github.com/bdlukaa/fluent_ui/issues/85)) +- Default `inputMouseCursor` is now `MouseCursor.defer` +- `NavigationView.contentShape` is now rendered at the foreground + +## [3.4.0] - Flexibility - [22/10/2021] + +- `ProgressRing` now spins on the correct direction ([#83](https://github.com/bdlukaa/fluent_ui/issues/83)) +- Added the `backwards` property to `ProgressRing` +- `FluentApp.builder` now works as expected ([#84](https://github.com/bdlukaa/fluent_ui/issues/84)) +- Implemented `NavigationPane.customPane`, which now gives you the ability to create custom panes for `NavigationView` +- **BREAKING** `sizes`, `offsets` and `index` parameters from `NavigationIndicatorBuilder` were replaced by `pane` + +## [3.3.0] - [12/10/2021] + +- Back button now isn't forced when using top navigation mode ([#74](https://github.com/bdlukaa/fluent_ui/issues/74)) +- `PilButtonBar` now accept 2 items ([#66](https://github.com/bdlukaa/fluent_ui/issues/66)) +- Added builder variant to `NavigationBody`. +- Fixed content bug when `AppBar` was not supplied too `NavigationView` + +## [3.2.0] - Flutter 2.5.0 - [15/09/2021] + +- Added missing parameters in `_FluentTextSelectionControls` methods ([#67](https://github.com/bdlukaa/fluent_ui/issues/67)) +- Min Flutter version is now 2.5.0 +- **EXAMPLE APP** Updated the url strategy on web. +- **EXAMPLE APP** Upgraded dependencies +- Format code according to flutter_lints + +## [3.1.0] - Texts and Fixes - [25/08/2021] + +- Updated Typography: + - **BREAKING** Renamed `header` -> `display` + - **BREAKING** Renamed `subHeader` -> `titleLarge` + - **BREAKING** Renamed `base` -> `bodyStrong` + - Added `bodyLarge` + - Updated font size and weight for most of the text styles +- Update `SplitButton` design +- Update `IconButton` design +- Fixed `ToggleSwitch` not showing expanded thumb mode when dragging +- **BREAKING** Remove `CheckboxListTile`, `RadioListTile` and `SwitchListTile`. Use the respective widget with the `content` property + +## [3.0.0] - Windows 11 - [24/08/2021] + +- Update `ToggleButton` design. +- Update `Button` design. +- Update `RadioButton` design. +- Update `ContentDialog` design. +- Update `NavigationView` design: + - **BREAKING:** Acryic is not used anymore. Consequently, `useAcrylic` method was removed. +- Implemented `Mica`, used by the new `NavigationView` +- Added support for horizontal tooltips. Set `Tooltip.displayHorizontally` to true to enable it. +- Updated Acrylic to support the web +- Update `Checkbox` design +- Update `ToggleSwitch` design +- Update `Scrollbar` design +- Update `Slider` design +- Update `InfoBar` design +- Update pickers design (`Combobox`, `DatePicker` and `TimePicker`) + +## [2.2.1] - [26/06/2021] + +- Implement Fluent Selection Controls for `TextBox` ([#49](https://github.com/bdlukaa/fluent_ui/pull/49)) +- `Tooltip` is now displayed when focused ([#45](https://github.com/bdlukaa/fluent_ui/issues/45)) +- AppBar is now displayed when minimal pane is open. +- AppBar's animation now follows the pane animation + +## [2.2.0] - BREAKING CHANGES - [25/06/2021] + +- **BREAKING:** Material `Icons` are not used anymore. Use `FluentIcons` instead. +- **BREAKING:** Reworked the `Acrylic` widget implementation ([#47](https://github.com/bdlukaa/fluent_ui/pull/47)) +- **BREAKING:** Removed the `useAcrylic` property from `NavigationView`. Acrylic is now used by default. +- `PaneDisplayMode.compact` has now a width of 40, not 50. +- Removed `SizeTransition` from `TabView`. + +## [2.1.1] - [03/06/2021] + +- Option to set a default font family on the theme data (`ThemeData.fontFamily`) +- `indicatorBuilder` is correctly applied to the automatic display mode in `NavigationView` +- An overlay is open when the toggle button is pressed on the compact display mode ([#43](https://github.com/bdlukaa/fluent_ui/issues/43)) + +## [2.1.0] - Mobile Update - [01/06/2021] + +- Implemented `BottomNavigation` +- Implemented `BottomSheet` +- Implemented `Chip` +- Implemented `Snackbar` +- Implemented `PillButtonBar` +- New buttons variations: + - `FillButton` + - `OutlinedButton` + - `TextButton` + +--- + +- `PaneItem`s' `build` method is now overridable. You can know customize how the items in `NavigationView` should look like by overriding the method. +- Fixed bug that navigation indicator was not showing on the first frame +- Fixed minimal tooltip not updating when closed the overlay +- **EXAMPLE APP:** Navigation indicator is now configurable on the `Settings` page + +## [2.0.3] - [28/05/2021] + +- Correctly apply items positions to pane indicators, regardless of external factors, such as navigation view app bar ([#41](https://github.com/bdlukaa/fluent_ui/issues/41)) +- Improved `NavigationIndicator`s performance + +## [2.0.2] - [23/05/2021] + +- **BREAKING CHANGES:** Reworked the theme api ([#39](https://github.com/bdlukaa/fluent_ui/pull/39)): + + - Removed the theme extension (`context.theme`). Use `FluentTheme.of(context)` instead + - `ButtonState` is now a class that can receive a value. It now allows lerping between values, making `AnimatedFluentTheme` possible. + + Here's an example of how to migrate your code: + + _Before_: `cursor: (_) => SystemMouseCursors.click,`\ + _Now_: `cursor: ButtonState.all(SystemMouseCursors.click),` + + - All theme datas and `AccentColor` have now a lerp method, in order to make `AnimatedFluentTheme` possible. + - Implemented `AnimatedFluentTheme`, in order to replace `AnimateContainer`s all around the library + - Dedicated theme for each theme data ([#37](https://github.com/bdlukaa/fluent_ui/issues/37)): + - IconTheme + - ButtonTheme + - RadioButtonTheme + - CheckboxTheme + - FocusTheme + - SplitButtonTheme + - ToggleButtonTheme + - ToggleSwitchTheme + - NavigationPaneTheme + - InfoBarTheme + - TooltipTheme + - DividerTheme + - ScrollbarTheme + - `DividerThemeData` now has `verticalMargin` and `horizontalMargin` instead of an axis callback. + - Updated button colors. + - Removed `animationDuration` and `animationCurve` from theme datas (except from `NavigationPaneThemeData`). + - Renamed `copyWith` to `merge` on theme datas (except from `ThemeData`) + - Fixed typo `standart` -> `standard` + - Implement `AnimatedAcrylic` + +## [2.0.1] - [21/05/2021] + +- Minimal flutter version is now 2.2 +- Implement `FluentScrollBehavior`, that automatically adds a scrollbar into listviews ([#35](https://github.com/bdlukaa/fluent_ui/pull/35)) +- Reworked the inputs api ([#38](https://github.com/bdlukaa/fluent_ui/pull/38)): + - A input can have multiple states. Now, if the widget is focused and pressed at the same time, it doesn't lose its focused border. + - Now, the focus is not requested twice when the button is pressed, only once. This fixes a bug introduced in a previous version that combo boxes items we're not being focused. + - Semantics (acessibility) is now applied on all inputs + +## [2.0.0] - [20/05/2021] + +- New way to disable the acrylic blur effect. Just wrap the acrylic widget in a `NoAcrylicBlurEffect` to have it disabled. +- Reworked the Navigation Panel from scratch ([#31](https://github.com/bdlukaa/fluent_ui/pull/31)): + - The legacy `NavigationPanel` and `Scaffold` were removed. Use `NavigationView` and `ScaffoldPage` instead + - Implemented open, compact, top and minimal display modes. + - Custom Selected Indicators +- Implemented fluent localizations ([#30](https://github.com/bdlukaa/fluent_ui/issues/30)) + +## [1.10.1] - [05/05/2021] + +- **FIX** Reworked the combo box widget to improve fidelity. ([#25](https://github.com/bdlukaa/fluent_ui/pull/25)) +- **FIX** Improved `HoverButton` focus management. +- **FIX** Reworked the tooltip widget. Now, if any mouse is connected, the tooltip is displaying according to the pointer position, not to the child's. ([#26](https://github.com/bdlukaa/fluent_ui/pull/26)) +- **FIX** TabView is now scrollable if the size of the tabs overflow the width + +## [1.10.0] - **BREAKING CHANGES** - [03/05/2021] + +- **BREAKING** `InfoHeader` was renamed to `InfoLabel`. You can now set if the label will be rendered above the child or on the side of it. +- **FIX** Fixed `RadioButton` inner color overlaping the border. +- **NEW** `ThemeData.inputMouseCursor` +- **FIDELITY** Switch thumb is now draggable. (Fixes [#22](https://github.com/bdlukaa/fluent_ui/issues/22)) +- **EXAMPLE** Reworked the example app inputs page + +## [1.9.4] - [02/05/2021] + +- **FIX** `CheckboxListTile`, `SwitchListTile` and `RadioListTile` now doesn't focus its leading widget. +- **FIX** `TabView` is now not scrollable +- **FIX** Fixed `Acrylic` blur effect being disabled by default. +- **FIDELITY** Improved `ContentDialog` transition fidelity +- **FIX** Fixed `FocusBorder` for some widgets. It was affecting layout when it shouldn't +- **FIX** `RatingBar` and `Slider` weren't working due to `FocusBorder` +- **NEW** | **FIDELITY** New `Slider` thumb + +## [1.9.3] - [01/05/2021] + +- **NEW** `FocusBorder.renderOutside`. With this property, you can control if the FocusBorder will be rendered over the widget or outside of it. +- **FIX** Fixed `RadioButton`s border when focused +- **FIX** `Color.resolve` now doesn't throw a stack overflow error. +- **BREAKING** Removed `Color.resolveFromBrightness`. This is only available on `AccentColor` +- **EXAMPLE APP** Hability to change the app accent color +- **NEW** `darkest` and `lightest` colors variants in `AccentColor` +- **FIX** Fixed `InfoBar`'s error icon. It now uses `Icons.cancel_outlined` instead of `Icons.close` +- **NEW** `NavigationPanel` now has a `Scrollbar` and the `bottom` property is now properly styled if selected + +## [1.9.2] - [30/04/2021] + +- **FIX** `TabView` tabs can now be reordered (Fixes [#10](https://github.com/bdlukaa/fluent_ui/issues/10)) +- **FIDELITY** If a new `Tab` is added, its now animated +- **FIX** `FocusBorder` now doesn't change the size of the widgets +- **BREAKING** `buttonCursor`, `uncheckedInputColor` and `checkedInputColor` are now moved to `ButtonThemeData` as static functions. + +## [1.9.1] - [29/04/2021] + +- **FIX** Fixed diagnostic tree. (Fixes [#17](https://github.com/bdlukaa/fluent_ui/issues/17)) +- **FIX** | **FIDELITY** `TappableListTile` now changes its color when focused instead of having a border +- **FIDELITY** Improved `Acrylic`'s blur effect fidelity +- **FIX** `Acrylic`'s elevation was being applying margin +- **NEW** `ThemeData.shadowColor`, which is now used by `Acrylic` +- **NEW** You can now globally disable the acrylic blur effect by changing `Acrylic.acrylicEnabled` + +## [1.9.0] - **BREAKING CHANGES** - Theme Update - [29/04/2021] + +The whole theme implementation was reworked on this change. + +- **BREAKING** Renamed `Theme` to `FluentTheme` +- **BREAKING** All the properties in `FluentTheme` now can't be null +- **BREAKING** Renamed all the `Style` occurrences to `ThemeData` +- **BREAKING** `ThemeData.accentColor` is now an `AccentColor` +- **FIX** When providing a custom style to a tooltip, it's now correctly applied to `ThemeData.tooltipStyle` +- **FIX** `debugCheckHasFluentTheme` has now a better error message +- **FIX** `FluentApp` now doesn't throw an error if no `theme` is provided +- **FIX** Reworked `Scrollbar` to improve fidelity. +- **NEW** Color extension methods: `Color.toAccentColor` and `Color.basedOnLuminance` +- **NEW** `Button.builder` + +## [1.8.1] - [16/04/2021] + +- **NEW** In `TabView`, it's now possible use the following shortcuts if `TabView.shortcutsEnabled` is `true` (Follows [this](https://docs.microsoft.com/en-us/windows/uwp/design/controls-and-patterns/tab-view#closing-a-tab)): + 1. `Ctrl + F4` or `Ctrl + W` to close the current tab + 2. `Ctrl + T` to create a new tab + 3. `1-8` to navigate to a tab with the pressed number + 4. `9` to navigate to the last tab and navigate to the last tab +- **NEW** `IconButton.autofocus`, `ToggleButton.autofocus` +- **BREAKING** Renamed all the `semanticsLabel` to `semanticLabel` + +## [1.8.0] - Color Update - [14/04/2021] + +- **NEW** Web version hosted at https://bdlukaa.github.io/fluent_ui +- **NEW** Colors showcase page in example app +- **NEW** Info Colors: + - `Colors.warningPrimaryColor` + - `Colors.warningSecondaryColor` + - `Colors.errorPrimaryColor` + - `Colors.errorSecondaryColor` + - `Colors.successPrimaryColor` + - `Colors.successSecondaryColor` +- **FIX** Reworked all the accent colors (`Colors.accentColors`) with `darkest`, `dark`, `normal`, `light` and `lighter` +- **BREAKING** `Colors.blue` is now an `AccentColor` + +## [1.7.6] - [13/04/2021] + +- **NEW** `Checkbox.autofocus` +- **BREAKING** `Button` refactor: + - Removed `Button.icon` and `Button.trailingIcon` + - Renamed `Button.text` to `Button.child` +- You can now disable the acrylic backdrop effect by setting `enabled` to false +- **NEW** `NavigationPanelBody.animationCurve` and `NavigationPanelBody.animationDuration` + +## [1.7.5] - [13/04/2021] + +- **NEW** `Scrollbar` and `ScrollbarStyle` +- Reworked `FluentApp` to not depend of material anymore. + +## [1.7.4] - [10/04/2021] + +- **FIX** Updated `Icon` widget to use Flutter's default icon widget +- **NEW** Documentation + +## [1.7.3] - [07/04/2021] + +- **FIX** Improved `ListTile` sizing ([#Spacing](https://docs.microsoft.com/en-us/windows/uwp/design/style/spacing)) +- **NEW** `FocusStyle` and support for glow focus +- **NEW** `RatingBar.starSpacing` + +## [1.7.2] - [06/04/2021] + +- **FIX** Animation when using `NavigationPanelBody` now works as expected +- **NEW** `CheckboxListTile`, `SwitchListTile` and `RadioListTile` +- **FIX** It's now not possible to focus a disabled `TextBox` + +## [1.7.1] - [06/04/2021] + +- **FIX** The mouse cursor in a disabled input is now `basic` instead of `forbidden` +- **FIX** `NavigationPanelBody` now doesn't use a `IndexedStack` under the hood because it was interfering in the focus scope +- **FIX** The color of the focus now is the `Style.inactiveColor` +- **FIX** `RadioButton`'s cursor was not being applied correctly +- **NEW** `Button.toggle` +- **FIX** The state provided by `HoverButton` was being `focused` when it shouldn't be +- **FIX** TimePicker showing wrong minute count. It should start from 00 and end in 59 +- **NEW** `TimePicker.minuteIncrement` + +## [1.7.0] - Focus Update - [05/04/2021] + +- **FIXED** Fixed the possibility to give a elevation lower than 0 in `Acrylic` +- **NEW** It's now possible to change the rating of `RatingBar` using the keyboard arrows +- **NEW** Now it's possible to navigate using the keyboard with all focusable widgets + +## [1.6.0] - BREAKING CHANGES - [03/04/2021] + +- Added the missing `Diagnostics` +- Updated all the screenshots +- **BREAKING CHANGE** Uses the material icon library now + + **DEVELOPER NOTE** This was a hard choice, but the material icon library is a robust, bigger library. It contains all the icons the previous library has, and a few many more. + +## [1.5.0] - [02/04/2021] + +- Added `Diagnostics` to many widgets +- **NEW** `AutoSuggestBox` (Follows [this](https://docs.microsoft.com/en-us/windows/uwp/design/controls-and-patterns/auto-suggest-box)) +- **NEW** `Flyout` and `FlyoutContent` (Folllows [this](https://docs.microsoft.com/en-us/windows/uwp/design/controls-and-patterns/dialogs-and-flyouts/flyouts)) +- **FIXED** Popup was being shown off-screen. + + **DEVELOPER NOTE** The solution for this was to make it act like a tooltip: only show the popup above or under the `child`. This was a hard choice, but the only viable option that would work on small screens/devices. This also made `Flyout` easier to implement. This should be changed when multi-window support is available. + +- **FIXED** `DatePicker` incorrectly changing hour +- **NEW** `Colors.accentColors` +- Documentation about [system_theme](https://pub.dev/packages/system_theme) +- **BREAKING** Removed `Pivot` because it's deprecated + +## [1.4.1] - Pickers Update - [30/03/2021] + +- **NEW** `Style.fasterAnimationDuration` +- **FIX** `ComboBox` press effect +- **NEW** `TimePicker` (Follows [this](https://docs.microsoft.com/en-us/windows/uwp/design/controls-and-patterns/time-picker)) +- **NEW** `DatePicker` (Follows [this](https://docs.microsoft.com/en-us/windows/uwp/design/controls-and-patterns/date-picker)) + +## [1.4.0] - [28/03/2021] + +- **NEW** `InfoHeader` +- **NEW** `ComboBox` (Follows [this](https://docs.microsoft.com/en-us/windows/uwp/design/controls-and-patterns/checkbox)) +- **NEW** `TappableListTile` +- **BREAKING** Removed `DropdownButton` and `Button.dropdown` + +## [1.3.4] - [28/03/2021] + +- **NEW** Vertical Slider + +## [1.3.3] - [25/03/2021] + +- **NEW** Indeterminate `ProgressRing` ([@raitonoberu](https://github.com/raitonoberu)) +- **NEW** `ListTile` +- **DIAGNOSTICS** Provide `Diagnostics` support to: + - `Style` + - `NavigationPanelStyle` + - `TooltipStyle` + +## [1.3.2] - Accessibility update - [24/03/2021] + +This version provides the fix for [#5](https://github.com/bdlukaa/fluent_ui/issues/5) + +- `Theme.of` can't be null anymore. Use `Theme.maybeOf` for such +- **NEW** `Style.inactiveBackgroundColor` +- **BREAKING** Replaced `color`, `border`, `borderRadius` from `IconButtonStyle` to `decoration` +- **DIAGNOSTICS** Provide `Diagnostics` support to the following classes: + - ButtonStyle + - Checkbox + - CheckboxStyle + - IconButtonStyle + - RadioButtonStyle + - RatingBar + - SplitButtonStyle + - ToggleButton + - ToggleButtonStyle + - ToggleSwitch + - ToggleSwitchStyle + - Slider + - SliderStyle + - Typography + - Divider + - DividerStyle +- Provide accessibility support to the following widgets: + - Button + - Checkbox + - IconButton + - RadioButton + - RatingBar + - Slider + - ToggleButton + - ToggleSwitch + - TabView + +## [1.3.1] - [23/03/2021] + +- **FIX** `IconButtonStyle`'s `iconStyle` now works properly +- Improved `TabView` icon styling +- **NEW** Indeterminate `ProgressBar` ([@raitonoberu](https://github.com/raitonoberu)) + +## [1.3.0] - [22/03/2021] + +- **NEW** Determinate `ProgressBar` and `ProgressRing` +- **NEW** `TabView` ([#TabView](https://docs.microsoft.com/en-us/windows/uwp/design/controls-and-patterns/tab-view)) + +## [1.2.5] - [21/03/2021] + +- **FIX** Fixed `InfoBar`'s overflow + +## [1.2.4] - [21/03/2021] + +- **BREAKING** `RadioButton`'s `selected` property was renamed to `checked` to match a single pattern between all the other widgets. + +## [1.2.3] - [19/03/2021] + +- **NEW** | **EXAMPLE APP** `Settings` screen +- Improved theme changing +- **FIX** `FluentApp` doesn't lose its state anymore, possibiliting hot relaod. +- **NEW** `showDialog` rework: + - `showDialog` now can return data. (Fixes [#2](https://github.com/bdlukaa/fluent_ui/issues/2)) + - `showDialog.transitionBuilder` + - `showDialog.useRootNavigator` + - `showDialog.routeSettings` + - It's no longer necessary to have the fluent theme to display dialogs using this function. + +## [1.2.2] - [17/03/2021] + +- **BREAKING** Removed `_regular` from the name of the icons. +- **NEW** `InfoBar` (Follows [this](https://docs.microsoft.com/en-us/windows/uwp/design/controls-and-patterns/infobar)) + +## [1.2.1] - [16/03/2021] + +- **NEW** `Divider` + +## [1.2.0] - Timing and easing - Page transitioning - [15/03/2021] + +- **FIDELITY** Improved `ToggleButton` fidelity +- **NEW** `NavigationPanelBody` +- **NEW** Page transitions + - `EntrancePageTransition` ([#PageRefresh](https://docs.microsoft.com/en-us/windows/uwp/design/motion/page-transitions#page-refresh)) + - `DrillInPageTransition` ([#Drill](https://docs.microsoft.com/en-us/windows/uwp/design/motion/page-transitions#drill)) + - `HorizontalSlidePageTransition` ([#HorizontalSlide](https://docs.microsoft.com/en-us/windows/uwp/design/motion/page-transitions#horizontal-slide)) + - `SuppressPageTransition` ([#Supress](https://docs.microsoft.com/en-us/windows/uwp/design/motion/page-transitions#suppress)) +- Add timing and easing to style. (Follows [this](https://docs.microsoft.com/en-us/windows/uwp/design/motion/timing-and-easing)) + - **NEW** `Style.fastAnimationDuration` (Defaults to 150ms) + - **NEW** `Style.mediumAnimationDuration` (Defaults to 300ms) + - **NEW** `Style.slowAnimationDuration` (Defaults to 500ms) + - Default `animationCurve` is now `Curves.easeInOut` (standard) instead of `Curves.linear` + - **BREAKING** Removed `Style.animationDuration` +- Refactored Navigation Panel + +## [1.1.0] - Fidelity update - [14/03/2021] + +- **BREAKING** Removed `Card` widget. Use `Acrylic` instead +- **NEW** `Acrylic` widget ([#Acrylic](https://docs.microsoft.com/en-us/windows/uwp/design/style/acrylic)) +- **NEW** **NAVIGATION PANEL** `bottom` property +- **FIDELITY** Improved the corder radius of some widgets (Follows [this](https://docs.microsoft.com/en-us/windows/uwp/design/style/rounded-corner#page-or-app-wide-cornerradius-changes)) +- **FIX** **FIDELITY** Dark theme hovering color +- Improved documentation + +## [1.0.2] - Typography update - [11/03/2021] + +- **NEW** Typography + - Migrated all the widgets to use typography +- **NEW** Tooltip +- **NEW** Dark theme +- **FIX** Disabled button press effect if disabled +- **FIX** Grey color resulting in green color + +## [1.0.1+1] - [09/03/2021] + +- **NEW** Screenshots + +## [1.0.1] - [07/03/2021] + +- **FIX** `NavigationPanel` navigation index +- **FIX** `Slider`'s inactive color +- **FIDELITY** Scale animation of button press +- **FIDELITY** Improved `Slider` label fidelity +- **NEW** Split Button + +## [1.0.0] - [05/03/2021] + +- **NEW** Null-safety +- **NEW** New Icons Library +- **NEW** `NavigationPanelSectionHeader` and `NavigationPanelTileSeparator` +- **BREAKING** Removed `Snackbar` + +## [0.0.9] - [03/03/2021] + +- Export the icons library +- **NEW** `TextBox` + +## [0.0.8] - [01/03/2021] + +- **NEW** `ContentDialog` 🎉 +- **NEW** `RatingControl` 🎉 +- **NEW** `NavigationPanel` 🎉 +- Improved `Button` fidelity + +## [0.0.7] - [28/02/2021] + +- **NEW** `Slider` 🎉 +- Use physical model for elevation instead of box shadows +- Improved TODO + +## [0.0.6] - [27/02/2021] + +- **FIXED** Button now detect pressing +- **FIXED** `ToggleSwitch` default thumb is now animated +- **FIXED** Improved `ToggleSwitch` fidelity + **FIXED** Darker color for button press. +- **NEW** **THEMING** + - `Style.activeColor` + - `Style.inactiveColor` + - `Style.disabledColor` + - `Style.animationDuration` + - `Style.animationCurve` + +## [0.0.5] - [27/02/2021] + +- `ToggleSwitch` is now stable 🎉 +- **NEW** `DefaultToggleSwitchThumb` +- **NEW** `ToggleButton` +- New toast lib: [fl_toast](https://pub.dev/packages/fl_toast) +- Screenshot on the readme. (Fixes [#1](https://github.com/bdlukaa/fluent_ui/issues/1)) + +## [0.0.4] - [22/02/2021] + +- New fluent icons library: [fluentui_icons](https://pub.dev/packages/fluentui_icons) +- Re-made checkbox with more fidelity +- Refactored the following widgets to follow the theme accent color: + - `Checkbox` + - `ToggleSwitch` + - `RadioButton` +- Added accent colors to widget. Use [this](https://docs.microsoft.com/en-us/windows/uwp/design/style/images/color/windows-controls.svg) as a base + +## [0.0.3] - Theming update - [21/02/2021] + +- **HIGHLIGHT** A whole new [documentation](https://github.com/bdlukaa/fluent_ui/wiki) +- Scaffold now works as expected. +- Improved theming checking +- **NEW** + - `null` (thirdstate) design on `Checkbox`. (Follows [this](https://docs.microsoft.com/en-us/windows/uwp/design/controls-and-patterns/checkbox)) + - Now you can use the `Decoration` to style the inputs +- **BREAKING**: + - Removed `Button.action` + - Removed `Button.compound` + - Removed `Button.primary` + - Removed `Button.contextual` + - Removed `AppBar` + - Now the default theme uses accent color instead of a predefined color (Follows [this](https://docs.microsoft.com/en-us/windows/uwp/design/style/color#accent-color)) +- **FIXED**: + - `ToggleSwitch` can NOT receive null values + +## [0.0.2] - [18/02/2021] + +- The whole library was rewritten following [this](https://docs.microsoft.com/en-us/windows/uwp/design/) +- Tooltip's background color is now opaque (Follows [this](https://docs.microsoft.com/en-us/windows/uwp/design/controls-and-patterns/tooltips)) +- Dropdown button now works as expected +- **FIXED**: + - Snackbar now is dismissed even if pressing or hovering + - Margin is no longer used as part of the clickable button +- **BREAKING**: + - Renamed `Toggle` to `ToggleSwitch` (Follows [this](https://docs.microsoft.com/en-us/windows/uwp/design/controls-and-patterns/toggles)) + - Removed `BottomNavigationBar`. It's recommended to use top navigation (pivots) + - Removed `IconButton.menu` +- **NEW**: + - NavigationPanel (Follows [this](https://docs.microsoft.com/en-us/windows/uwp/design/layout/page-layout#left-nav)) + - Windows project on example + - RadioButton (Follows [this](https://docs.microsoft.com/en-us/windows/uwp/design/controls-and-patterns/radio-button)) + +## [0.0.1] + +- Initial release diff --git a/dependencies/fluent_ui-3.12.0/LICENSE b/dependencies/fluent_ui-3.12.0/LICENSE new file mode 100644 index 0000000..35d0852 --- /dev/null +++ b/dependencies/fluent_ui-3.12.0/LICENSE @@ -0,0 +1,11 @@ +Copyright 2020 Bruno D'Luka + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. \ No newline at end of file diff --git a/dependencies/fluent_ui-3.12.0/README.md b/dependencies/fluent_ui-3.12.0/README.md new file mode 100644 index 0000000..5e48054 --- /dev/null +++ b/dependencies/fluent_ui-3.12.0/README.md @@ -0,0 +1,1807 @@ +
+

fluent_ui

+

+ + + + + + + + + + + + +

+

+ Design beautiful native windows apps using Flutter +

+
+ +Unofficial implementation of Fluent UI for [Flutter](flutter.dev). It's written based on the [official documentation](https://docs.microsoft.com/en-us/windows/uwp/design/) + +### You can check the web version of it [here](https://bdlukaa.github.io/fluent_ui/) + +![Example Showcase](images/example-showcase.png) + +### Content + +- [Motivation](#motivation) +- [Sponsors](#sponsors) +- [Installation](#installation) + - [Badge](#badge) +- [Style](#style) + - [Icons](#icons) + - [Colors](#colors) + - [Accent color](#accent-color) + - [Brightness](#brightness) + - [Visual Density](#visual-density) + - [Typograpy](#typography) + - [Font](#font) + - [Type ramp](#type-ramp) + - [Reveal Focus](#reveal-focus) +- [Motion](#motion) + - [Page Transitions](#page-transitions) +- [Navigation](#navigation) + - [Navigation View](#navigation-view) + - [App Bar](#app-bar) + - [Navigation Pane](#navigation-pane) + - [Navigation Body](#navigation-body) + - [Info Badge](#info-badge) + - [Tab View](#tab-view) + - [Bottom Navigation](#bottom-navigation) +- [Inputs](#inputs) + - [Button](#button) + - [Filled Button](#filled-button) + - [Icon Button](#icon-button) + - [Outlined Button](#outlined-button) + - [Text Button](#outlined-button) + - [Split Button](#split-button) + - [Toggle Button](#toggle-button) + - [Checkbox](#checkbox) + - [Toggle Switch](#toggle-switch) + - [Radio Buttons](#radio-buttons) + - [DropDown Button](#dropdown-button) + - [Slider](#slider) + - [Choosing between vertical and horizontal sliders](#choosing-between-vertical-and-horizontal-sliders) +- [Forms](#forms) + - [TextBox](#textbox) + - [Auto Suggest Box](#auto-suggest-box) + - [Combo Box](#combo-box) +- [Widgets](#widgets) + - [Tooltip](#tooltip) + - [Content Dialog](#content-dialog) + - [Expander](#expander) + - [Flyout](#flyout) + - **TODO** [Teaching tip]() + - [Acrylic](#acrylic) + - [InfoBar](#infobar) + - **TODO** [Calendar View](#calendar-view) + - **TODO** [Calendar Date Picker]() + - [Date Picker](#date-picker) + - [Time Picker](#time-picker) + - [Progress Bar and Progress Ring](#progress-bar-and-progress-ring) + - [Scrollbar](#scrollbar) + - [List Tile](#list-tile) + - [Info Label](#info-label) + - [TreeView](#treeview) + - [Scrollable tree view](#scrollable-tree-view) + - [Lazily load nodes](#lazily-load-nodes) + - [CommandBar](#commandbar) +- [Mobile Widgets](#mobile-widgets) + - [Chip](#chip) + - [Pill Button Bar](#pill-button-bar) + - [Snackbar](#snackbar) +- [Layout Widgets](#layout-widgets) + - [DynamicOverflow](#dynamicoverflow) +- [Equivalents with the material library](#equivalents-with-the-material-library) +- [Localization](#Localization) +- [Contribution](#contribution) + - [Contributing new localizations](#contributing-new-localizations) + - [Acknowledgements](#acknowledgements) + +## Motivation + +Since Flutter has stable Windows support, it's necessary to have support to its UI guidelines to build apps with fidelity, the same way it has support for Material and Cupertino. +See [this](https://github.com/flutter/flutter/issues/46481) for more info on the offical fluent ui support + +See also: + +- [Material UI for Flutter](https://flutter.dev/docs/development/ui/widgets/material) +- [Cupertino UI for Flutter](https://flutter.dev/docs/development/ui/widgets/cupertino) +- [MacOS UI for Flutter](https://github.com/GroovinChip/macos_ui) + +## Sponsors + +Want to be a sponsor? Become one [here](https://patreon.com/bdlukaa) + +These are our really cool sponsors! + +phorcys420   + +## Installation + +Add the package to your dependencies: + +```yaml +dependencies: + fluent_ui: ^3.10.0 +``` + +OR: + +```yaml +dependencies: + fluent_ui: + git: https://github.com/bdlukaa/fluent_ui.git +``` + +You can see the example app [here](https://bdlukaa.github.io/fluent_ui//) + +Finally, run `dart pub get` to download the package. + +Projects using this library should use the stable channel of Flutter + +### Badge + +Are you using this library on your app? You can use a badge to tell others: + + + + + +Add the following code to your `README.md` or to your website: + +```html + + + +``` + +--- + +# Style + +[Learn more about Fluent Style](https://docs.microsoft.com/en-us/windows/uwp/design/style/) + +You can use the `FluentTheme` widget to, well... theme your widgets. You can style your widgets in two ways: + +1. Using the `FluentApp` widget + +```dart +FluentApp( + title: 'MyApp', + theme: ThemeData( + ... + ), +) +``` + +2. Using the `FluentTheme` widget + +```dart +FluentTheme( + theme: ThemeData( + ... + ), + child: ..., +), +``` + +## Icons + +![Icons Preview](https://github.com/microsoft/fluentui-system-icons/raw/master/art/readme-banner.png) + +Inside your app, you use icons to represent an action, such as copying text or navigating to the settings page. This library includes an icon library with it, so you can just call `FluentIcons.[icon_name]` in any `Icon` widget: + +```dart +Icon(FluentIcons.add), +``` + +For a complete reference of current icons, please check the [online demo](https://bdlukaa.github.io/fluent_ui/) and click on "Icons". + +The online demo has a search box and also supports clipboard copy in order to find every icon as fast as possible. + +![](https://docs.microsoft.com/en-us/windows/uwp/design/style/images/icons/inside-icons.png) + +## Colors + +This library also includes the Fluent UI colors with it, so you can just call `Colors.[color_name]`: + +```dart +TextStyle(color: Colors.black), +``` + +Avaiable colors: + +- `Colors.transparent` +- `Colors.white` +- `Colors.black` +- `Colors.grey` +- `Colors.yellow` +- `Colors.orange` +- `Colors.red` +- `Colors.magenta` +- `Colors.purple` +- `Colors.blue` +- `Colors.teal` +- `Colors.green` + +### Accent color + +Common controls use an accent color to convey state information. [Learn more](https://docs.microsoft.com/en-us/windows/uwp/design/style/color#accent-color). + +By default, the accent color is `Colors.blue`. However, you can also customize your app's accent color to reflect your brand: + +```dart +ThemeData( + accentColor: Colors.blue, +) +``` + +To use the system's accent color, you can use the plugin [system_theme](https://pub.dev/packages/system_theme) made by me :). It has support for (as of 04/01/2021) Android, Web and Windows. + +```dart +import 'package:system_theme/system_theme.dart'; + +ThemeData( + accentColor: SystemTheme.accentInstance.accent.toAccentColor(), +) +``` + +## Brightness + +You can change the theme brightness to change the color of your app to + +1. `Brightness.light` + + ![Light theme](https://docs.microsoft.com/en-us/windows/uwp/design/style/images/color/light-theme.svg) + +2. `Brightness.dark` + + ![Dark theme](https://docs.microsoft.com/en-us/windows/uwp/design/style/images/color/dark-theme.svg) + +It defaults to the brightness of the device. (`MediaQuery.of(context).platformBrightness`) + +```dart +ThemeData( + brightness: Brightness.light, // or Brightness.dark +), +``` + +## Visual Density + +Density, in the context of a UI, is the vertical and horizontal "compactness" of the components in the UI. It is unitless, since it means different things to different UI components. + +The default for visual densities is zero for both vertical and horizontal densities. It does not affect text sizes, icon sizes, or padding values. + +For example, for buttons, it affects the spacing around the child of the button. For lists, it affects the distance between baselines of entries in the list. For chips, it only affects the vertical size, not the horizontal size. + +```dart +ThemeData( + visualDensity: VisualDensity.adaptivePlatformDensity, +), +``` + +The following widgets make use of visual density: + +- Chip +- PillButtonBar +- Snackbar + +## Typography + +To set a typography, you can use the `ThemeData` class combined with the `Typography` class: + +```dart +ThemeData( + typography: Typography( + caption: TextStyle( + fontSize: 12, + color: Colors.black, + fontWeight: FontWeight.normal, + ), + ), +) +``` + +### Font + +You should use one font throughout your app's UI, and we recommend sticking with the default font for Windows apps, **Segoe UI Variable**. It's designed to maintain optimal legibility across sizes and pixel densities and offers a clean, light, and open aesthetic that complements the content of the system. [Learn more](https://docs.microsoft.com/en-us/windows/apps/design/style/typography#font) + +![Font Segoe UI Showcase](https://docs.microsoft.com/en-us/windows/apps/design/style/images/type/segoe-sample.svg) + + +### Type ramp + +The Windows type ramp establishes crucial relationships between the type styles on a page, helping users read content easily. All sizes are in effective pixels. [Learn more](https://docs.microsoft.com/en-us/windows/apps/design/style/typography#type-ramp) + +![Windows Type Ramp](https://docs.microsoft.com/en-us/windows/apps/design/style/images/type/text-block-type-ramp.svg) + +## Reveal Focus + +Reveal Focus is a lighting effect for [10-foot experiences](https://docs.microsoft.com/en-us/windows/uwp/design/devices/designing-for-tv), such as Xbox One and television screens. It animates the border of focusable elements, such as buttons, when the user moves gamepad or keyboard focus to them. It's turned off by default, but it's simple to enable. [Learn more](https://docs.microsoft.com/en-us/windows/uwp/design/style/reveal-focus) + +Reveal Focus calls attention to focused elements by adding an animated glow around the element's border: + +![Reveal Focus Preview](https://docs.microsoft.com/en-us/windows/uwp/design/style/images/traveling-focus-fullscreen-light-rf.gif) + +This is especially helpful in 10-foot scenarios where the user might not be paying full attention to the entire TV screen. + +### Enabling it + +Reveal Focus is off by default. To enable it, change the `focusTheme` in your app `ThemeData`: + +```dart +theme: ThemeData( + focusTheme: FocusThemeData( + glowFactor: 4.0, + ), +), +``` + +To enable it in a 10 foot screen, use the method `is10footScreen`: + +```dart +import 'dart:ui' as ui; + +theme: ThemeData( + focusTheme: FocusThemeData( + glowFactor: is10footScreen(ui.window.physicalSize.width) ? 2.0 : 0.0, + ), +), +``` + +Go to the [example](/example) project to a full example + +### Why isn't Reveal Focus on by default? + +As you can see, it's fairly easy to turn on Reveal Focus when the app detects it's running on 10 foot screen. So, why doesn't the system just turn it on for you? Because Reveal Focus increases the size of the focus visual, which might cause issues with your UI layout. In some cases, you'll want to customize the Reveal Focus effect to optimize it for your app. + +### Customizing Reveal Focus + +You can customize the focus border, border radius and glow color: + +```dart +focusTheme: FocusStyle( + borderRadius: BorderRadius.zero, + glowColor: theme.accentColor?.withOpacity(0.2), + glowFactor: 0.0, + border: BorderSide( + width: 2.0, + color: theme.inactiveColor ?? Colors.transparent, + ), +), +``` + +To customize it to a single widget, wrap the widget in a `FocusTheme` widget, and change the options you want: + +```dart +FocusTheme( + data: FocusThemeData(...), + child: Button( + text: Text('Custom Focus Button'), + onPressed: () {}, + ) +), +``` + +# Motion + +This package widely uses animation in the widgets. The animation duration and curve can be defined on the app theme. + +## Page transitions + +Page transitions navigate users between pages in an app, providing feedback as the relationship between pages. Page transitions help users understand if they are at the top of a navigation hierarchy, moving between sibling pages, or navigating deeper into the page hierarchy. + +It's recommended to widely use page transitions on `NavigationView`, that can be implemented using the widget `NavigationBody`. + +This library gives you the following implementations to navigate between your pages: + +#### Entrance + +Entrance is a combination of a slide up animation and a fade in animation for the incoming content. Use entrance when the user is taken to the top of a navigational stack, such as navigating between tabs or left-nav items. + +The desired feeling is that the user has started over. + +Avaiable with the widget `EntrancePageTransition`, it produces the following effect: + +![Entrance Page Transition Preview](https://docs.microsoft.com/en-us/windows/uwp/design/motion/images/page-refresh.gif) + +#### Drill In + +Use drill when users navigate deeper into an app, such as displaying more information after selecting an item. + +The desired feeling is that the user has gone deeper into the app. + +Avaiable with the widget `DrillInPageTransition`, it produces the following effect: + +![Drill Page Transition Preview](https://docs.microsoft.com/en-us/windows/uwp/design/motion/images/drill.gif) + +#### Horizontal + +It's avaiable with the widget `HorizontalSlidePageTransition`. + +# Navigation + +The default Flutter Navigation is available on the `FluentApp` widget, that means you can simply call `Navigator.push` and `Navigator.pop` to navigate between routes. See [navigate to a new screen and back](https://flutter.dev/docs/cookbook/navigation/navigation-basics) + +## Navigation View + +The NavigationView control provides top-level navigation for your app. It adapts to a variety of screen sizes and supports both _top_ and _left_ navigation styles. + +![Navigation Panel](https://docs.microsoft.com/en-us/windows/uwp/design/controls-and-patterns/images/nav-view-header.png) + +### App Bar + +The app bar is the top app bar that every desktop nowadays have. + +```dart +NavigationView( + appBar: NavigationAppBar( + title: Text('Nice App Title :)'), + actions: Row(children: [ + /// These actions are usually the minimize, maximize and close window + ]), + /// If automaticallyImplyLeading is true, a 'back button' will be added to + /// app bar. This property can be overritten by [leading] + automaticallyImplyLeading: true, + ), + ... +) +``` + +### Navigation Pane + +The pane is the pane that can be displayed at the left or at the top. + +```dart +NavigationView( + ..., + pane: NavigationPane( + /// The current selected index + selected: index, + /// Called whenever the current index changes + onChanged: (i) => setState(() => index = i), + displayMode: PaneDisplayMode.auto, + ), + ... +) +``` + +You can change the `displayMode` to make it fit the screen. + +| Name | Screenshot | Info | +| ------- | ----------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| Top | ![](https://docs.microsoft.com/en-us/windows/uwp/design/controls-and-patterns/images/displaymode-top.png) | The pane is positioned above the content. We recommend top navigation when:
- You have 5 or fewer top-level navigation categories that are equally important, and any additional top-level navigation categories that end up in the dropdown overflow menu are considered less important.
- You need to show all navigation options on screen. - You want more space for your app content.
- Icons cannot clearly describe your app's navigation categories.
| +| Open | ![](https://docs.microsoft.com/en-us/windows/uwp/design/controls-and-patterns/images/displaymode-left.png) | The pane is expanded and positioned to the left of the content. We recommend _open_ navigation when:
- You have 5-10 equally important top-level navigation categories.
- You want navigation categories to be very prominent, with less space for other app content. | +| Compact | ![](https://docs.microsoft.com/en-us/windows/uwp/design/controls-and-patterns/images/displaymode-leftcompact.png) | The pane shows only icons until opened and is positioned to the left of the content. | +| Minimal | ![](https://docs.microsoft.com/en-us/windows/uwp/design/controls-and-patterns/images/displaymode-leftminimal.png) | Only the menu button is shown until the pane is opened. When opened, it's positioned to the left of the content. | +| Auto | ![](https://docs.microsoft.com/en-us/windows/uwp/design/controls-and-patterns/images/displaymode-auto.png) | By default, `displayMode` is set to `auto`. In Auto mode, the NavigationView adapts between `minimal` when the window is narrow, to `compact`, and then `open` as the window gets wider. | + +You can customize the selected indicator. By default `StickyNavigationIndicator` is used, but you can also use the old windows indicator: + +```dart +pane: NavigationPane( + indicator: const EndNavigationIndicator(), +) +``` + +### Navigation body + +A navigation body is used to implement page transitions into a navigation view. It knows what is the current display mode of the parent `NavigationView`, if any, and define the page transitions accordingly. + +For top mode, the horizontal page transition is used. For the others, drill in page transition is used. + +You can also supply a builder function to create the pages instead of a list of widgets. For this use the `NavigationBody.builder` constructor. + +```dart +int _currentIndex = 0; + +NavigationView( + ..., + content: NavigationBody(index: _currentIndex, children: [...]), +) +``` + +You can use `NavigationBody.builder` + +```dart +NavigationView( + ..., + content: NavigationBody.builder( + index: _currentIndex, + itemBuilder: (context, index) { + return ...; + } + ) +) +``` + +`ScaffoldPage` is usually used with the navigation body as its children: + +```dart +NavigationBody( + index: _currentIndex, + children: [ + const ScaffoldPage( + topBar: PageHeader(header: Text('Your Songs')) + ) + ], +) +``` + +### Info Badge + +Badging is a non-intrusive and intuitive way to display notifications or bring focus to an area within an app - whether that be for notifications, indicating new content, or showing an alert. An `InfoBadge` is a small piece of UI that can be added into an app and customized to display a number, icon, or a simple dot. [Learn more](https://docs.microsoft.com/en-us/windows/apps/design/controls/info-badge) + +![InfoBadge Preview](https://docs.microsoft.com/en-us/windows/apps/design/controls/images/infobadge/infobadge-example-1.png) + +InfoBadge is built into `NavigationView`, but can also be placed as a standalone widget, allowing you to place InfoBadge into any control or piece of UI of your choosing. When you use an `InfoBadge` somewhere other than `NavigationView`, you are responsible for programmatically determining when to show and dismiss the `InfoBadge`, and where to place the `InfoBadge`. + +Here's an example of how to add an info badge to a `PaneItem`: + +```dart +NavigationView( + ..., + pane: NavigationPane( + ... + children: [ + PaneItem( + icon: Icon(FluentIcons.more), + title: const Text('Others'), + infoBadge: const InfoBadge( + source: Text('9'), + ), + ), + ], + ), + ... +) +``` + +Which produces the folllowing effects in the display modes: + +| Open | Compact | Top | +| ---- | ------- | --- | +| ![Open InfoBadge Preview](https://docs.microsoft.com/en-us/windows/apps/design/controls/images/infobadge/navview-expanded.png) | ![Compact InfoBadge Preview](https://docs.microsoft.com/en-us/windows/apps/design/controls/images/infobadge/navview-compact.png) | ![Top InfoBadge Preview](https://docs.microsoft.com/en-us/windows/apps/design/controls/images/infobadge/navview-top.png) | + +## Tab View + +The TabView control is a way to display a set of tabs and their respective content. TabViews are useful for displaying several pages (or documents) of content while giving a user the capability to rearrange, open, or close new tabs. [Learn more](https://docs.microsoft.com/en-us/windows/uwp/design/controls-and-patterns/tab-view) + +Here's an example of how to create a tab view: + +```dart +SizedBox( + height: 600, + child: TabView( + currentIndex: currentIndex, + onChanged: (index) => setState(() => currentIndex = index), + onNewPressed: () { + setState(() => tabs++); + }, + tabs: List.generate(tabs, (index) { + return Tab( + text: Text('Tab $index'), + closeIcon: FluentIcons.chrome_close, + ); + }), + bodies: List.generate( + tabs, + (index) => Container( + color: index.isEven ? Colors.red : Colors.yellow, + ), + ), + ), +), +``` + +The code above produces the following: + +![TabView Preview](https://docs.microsoft.com/en-us/windows/uwp/design/controls-and-patterns/images/tabview/tab-introduction.png) + +## Bottom Navigation + +The bottom navigation displays icons and optional text at the bottom of the screen for switching between different primary destinations in an app. This is commomly used on small screens. [Learn more](https://developer.microsoft.com/pt-br/fluentui#/controls/android/bottomnavigation) + +Here's an example of how to create a bottom navigation: + +```dart +int index = 0; + +ScaffoldPage( + content: NavigationBody(index: index, children: [ + Container(), + Container(), + Container(), + ]), + bottomBar: BottomNavigation( + index: index, + onChanged: (i) => setState(() => index = i), + items: [ + BottomNavigationItem( + icon: Icon(Icons.two_k), + selectedIcon: Icon(Icons.two_k_plus), + title: Text('Both'), + ), + BottomNavigationItem( + icon: Icon(Icons.phone_android_outlined), + selectedIcon: Icon(Icons.phone_android), + title: Text('Android'), + ), + BottomNavigationItem( + icon: Icon(Icons.phone_iphone_outlined), + selectedIcon: Icon(Icons.phone_iphone), + title: Text('iOS'), + ), + ], + ) +) + +``` + +# Inputs + +Inputs are widgets that reacts to user interection. On most of the inputs you can set `onPressed` or `onChanged` to `null` to disable it. + +## Button + +A button gives the user a way to trigger an immediate action. [Learn more](https://docs.microsoft.com/en-us/windows/apps/design/controls/buttons) + +Here's an example of how to create a basic button: + +```dart +Button( + child: Text('Standard XAML button'), + // Set onPressed to null to disable the button + onPressed: () { + print('button pressed'); + } +) +``` + +The code above produces the following: + +![Button](https://docs.microsoft.com/en-us/windows/apps/design/controls/images/button.png) + +You can also use some alternative buttons: + +### Filled Button + +This button is identical to the `Button`, but with accent color fill in background + +```dart +FilledButton( + child: Text('FILLED BUTTON'), + onPressed: () { + print('pressed filled button'); + }, +), +``` + +### Icon Button + +This button is used to display an `Icon` as content. It's optmized to show icons. + +```dart +IconButton( + icon: Icon(FluentIcons.add), + onPressed: () { + print('pressed icon button'); + }, +), +``` + +### Outlined Button + + ```dart + OutlinedButton( + child: Text('OUTLINED BUTTON'), + onPressed: () { + print('pressed outlined button'); + }, + ), + ``` + +### Text Button + +```dart +TextButton( + child: Text('TEXT BUTTON'), + onPressed: () { + print('pressed text button'); + }, +), +``` + +## Split Button + +A Split Button has two parts that can be invoked separately. One part behaves like a standard button and invokes an immediate action. The other part invokes a flyout that contains additional options that the user can choose from. [Learn more](https://docs.microsoft.com/en-us/windows/apps/design/controls/buttons#create-a-split-button) + +You can use a `SplitButtonBar` to create a Split Button. It takes two `Button`s in the `buttons` property. You can also customize the button spacing by changing the property `interval` in its theme. + +Here's an example of how to create a split button: + +```dart +const double splitButtonHeight = 25.0; + +SplitButtonBar( + style: SplitButtonThemeData( + interval: 1, // the default value is one + ), + // There need to be at least 2 items in the buttons, and they must be non-null + buttons: [ + SizedBox( + height: splitButtonHeight, + child: Button( + child: Container( + height: 24, + width: 24, + color: FluentTheme.of(context).accentColor, + ), + onPressed: () {}, + ), + ), + IconButton( + icon: const SizedBox( + height: splitButtonHeight, + child: const Icon(FluentIcons.chevron_down, size: 10.0), + ), + onPressed: () {}, + ), + ], +) +``` + +The code above produces the following button: + +![SplitButtonBar Preview](https://docs.microsoft.com/en-us/windows/apps/design/controls/images/split-button-rtb.png) + +## Toggle Button + +A button that can be on or off. + +Here's an example of how to create a basic toggle button: + +```dart +bool _value = false; + +ToggleButton( + child: Text('Toggle Button'), + checked: _value, + onChanged: (value) => setState(() => _value = value), +) +``` + +## Checkbox + +A check box is used to select or deselect action items. It can be used for a single item or for a list of multiple items that a user can choose from. The control has three selection states: unselected, selected, and indeterminate. Use the indeterminate state when a collection of sub-choices have both unselected and selected states. [Learn more](https://docs.microsoft.com/en-us/windows/uwp/design/controls-and-patterns/checkbox) + +Here's an example of how to create a checkbox: + +```dart +bool _checked = true; + +Checkbox( + checked: _checked, + onChanged: (value) => setState(() => _checked = value), +) +``` + +#### Handling its states + +| State | Property | Value | +| ------------- | --------- | -------- | +| checked | checked | `true` | +| unchecked | checked | `false` | +| indeterminate | checked | `null` | +| enabled | onChanged | non-null | +| disabled | onChanged | `null` | + +![](https://docs.microsoft.com/en-us/windows/apps/design/controls/images/templates-checkbox-states-default.png) + +## Toggle Switch + +The toggle switch represents a physical switch that allows users to turn things on or off, like a light switch. Use toggle switch controls to present users with two mutually exclusive options (such as on/off), where choosing an option provides immediate results. [Learn more](https://docs.microsoft.com/en-us/windows/uwp/design/controls-and-patterns/toggles) + +Here's an example of how to create a basic toggle switch: + +```dart +bool _checked = false; + +ToggleSwitch( + checked: _checked, + onChanged: (v) => setState(() => _checked = v), + content: Text(_checked ? 'On' : 'Off'); +) +``` + +![](https://docs.microsoft.com/en-us/windows/uwp/design/controls-and-patterns/images/toggleswitches01.png) + +## Radio Buttons + +Radio buttons, also called option buttons, let users select one option from a collection of two or more mutually exclusive, but related, options. Radio buttons are always used in groups, and each option is represented by one radio button in the group. + +In the default state, no radio button in a RadioButtons group is selected. That is, all radio buttons are cleared. However, once a user has selected a radio button, the user can't deselect the button to restore the group to its initial cleared state. + +The singular behavior of a RadioButtons group distinguishes it from check boxes, which support multi-selection and deselection, or clearing. + +[Learn more](https://docs.microsoft.com/en-us/windows/uwp/design/controls-and-patterns/radio-button) + +Here's an example of how to create a basic set of radio buttons: + +```dart +int _currentIndex = -1; + +final List radioButtons = [ + 'RadioButton 1', + 'RadioButton 2', + 'RadioButton 3', +]; + +Column( + children: List.generate(radioButtons.length, (index) { + return RadioButton( + checked: _currentIndex == index, + // set onChanged to null to disable the button + onChanged: (value) => setState(() => _currentIndex = index), + content: Text(radioButtons[index]), + ); + }), +), +``` + +The code above produces the following: + +![Radio Buttons](https://docs.microsoft.com/en-us/windows/uwp/design/controls-and-patterns/images/controls/radio-button.png) + +## DropDown button + +A DropDownButton is a button that shows a chevron as a visual indicator that it has an attached flyout that contains more options. [Learn more](https://docs.microsoft.com/en-us/windows/apps/design/controls/buttons#create-a-drop-down-button) + +![DropDown Button](https://docs.microsoft.com/en-us/windows/apps/design/controls/images/drop-down-button-align.png) + +Here's an example of how to create a drop down button: + +```dart +DropDownButton( + leading: const Icon(FluentIcons.align_left), + title: const Text('Alignment'), + items: [ + DropDownButtonItem( + title: const Text('Left'), + leading: const Icon(FluentIcons.align_left), + onTap: () => debugPrint('left'), + ), + DropDownButtonItem( + title: const Text('Center'), + leading: const Icon(FluentIcons.align_center), + onTap: () => debugPrint('center'), + ), + DropDownButtonItem( + title: const Text('Right'), + leading: const Icon(FluentIcons.align_right), + onTap: () => debugPrint('right'), + ), + ], +); +``` + +## Slider + +A slider is a control that lets the user select from a range of values by moving a thumb control along a track. [Learn more](https://docs.microsoft.com/en-us/windows/uwp/design/controls-and-patterns/slider) + +A slider is a good choice when you know that users think of the value as a relative quantity, not a numeric value. For example, users think about setting their audio volume to low or medium—not about setting the value to 2 or 5. + +Don't use a slider for binary settings. Use a [toggle switch](#toggle-switches) instead. + +Here's an example of how to create a basic slider: + +```dart +double _sliderValue = 0; + +SizedBox( + // The default width is 200. + // The slider does not have its own widget, so you have to add it yourself. + // The slider always try to be as big as possible + width: 200, + child: Slider( + max: 100, + value: _sliderValue, + onChanged: (v) => setState(() => _sliderValue = v), + // Label is the text displayed above the slider when the user is interacting with it. + label: '${_sliderValue.toInt()}', + ), +) +``` + +The code above produces the following: + +![Slider Preview](https://docs.microsoft.com/en-us/windows/apps/design/controls/images/controls/slider.png) + +### Choosing between vertical and horizontal sliders + +You can set `vertical` to `true` to create a vertical slider + +| Horizontal | Vertical | +| ----------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------- | +| If the control is used to seek within media, like in a video app. | if the slider represents a real-world value that is normally shown vertically (such as temperature). | + +## Rating Bar + +> The property `starSpacing` was not implemented yet + +The rating control allows users to view and set ratings that reflect degrees of satisfaction with content and services. [Learn more](https://docs.microsoft.com/en-us/windows/uwp/design/controls-and-patterns/rating) + +### Example + +```dart +double rating = 0.0; + +RatingBar( + rating: rating, + onChanged: (v) => setState(() => rating = v), +) +``` + +You can set `amount` to change the amount of stars. The `rating` must be less than the stars and more than 0. You can also change the `icon`, its size and color. You can make the bar read only by setting `onChanged` to `null`. + +![](https://docs.microsoft.com/en-us/windows/uwp/design/controls-and-patterns/images/rating_rs2_doc_ratings_intro.png) + +# Forms + +A form is a group of controls that collect and submit data from users. Forms are typically used for settings pages, surveys, creating accounts, and much more. + +## TextBox + +A Text Box lets a user type text into an app. It's typically used to capture a single line of text, but can be configured to capture multiple lines of text. The text displays on the screen in a simple, uniform, plaintext format. [Learn more](https://docs.microsoft.com/en-us/windows/apps/design/controls/text-box) + +![TextBox Preview](https://docs.microsoft.com/en-us/windows/apps/design/controls/images/text-box.png) + +You can use the [Forms screen](example/lib/screens/forms.dart) in the example app for reference. + +You can use the widget `TextBox` to create text boxes: + +```dart +TextBox( + controller: ..., + header: 'Notes', + placeholder: 'Type your notes here', +), +``` + +Which produces the following: + +![TextBox Example Preview](https://docs.microsoft.com/en-us/windows/apps/design/controls/images/text-box-ex1.png) + +If you want to validate the text box, use a `TextFormBox`: + +```dart +TextFormBox( + placeholder: 'Your email', + validator: (text) { + if (text == null || text.isEmpty) return 'Provide an email'; + } +), +``` + +## Auto Suggest Box + +Use an AutoSuggestBox to provide a list of suggestions for a user to select from as they type. [Learn more](https://docs.microsoft.com/en-us/windows/uwp/design/controls-and-patterns/auto-suggest-box) + +### Example + +```dart +final autoSuggestBox = TextEditingController(); + +AutoSuggestBox( + controller: autoSuggestBox, + items: [ + 'Blue', + 'Green', + 'Red', + 'Yellow', + 'Grey', + ], + onSelected: (text) { + print(text); + }, + textBoxBuilder: (context, controller, focusNode, key) { + const BorderSide _kDefaultRoundedBorderSide = BorderSide( + style: BorderStyle.solid, + width: 0.8, + ); + return TextBox( + key: key, + controller: controller, + focusNode: focusNode, + suffixMode: OverlayVisibilityMode.editing, + suffix: IconButton( + icon: Icon(FluentIcons.close), + onPressed: () { + controller.clear(); + focusNode.unfocus(); + }, + ), + placeholder: 'Type a color', + ); + }, +) +``` + +The code above produces the following: + +![Auto suggest box example](https://docs.microsoft.com/en-us/windows/uwp/design/controls-and-patterns/images/controls_autosuggest_expanded01.png) + +### Screenshots + +![](https://docs.microsoft.com/en-us/windows/uwp/design/controls-and-patterns/images/control-examples/auto-suggest-box-groove.png) +![](https://docs.microsoft.com/en-us/windows/uwp/design/controls-and-patterns/images/controls_autosuggest_noresults.png) + +## Combo Box + +Use a combo box (also known as a drop-down list) to present a list of items that a user can select from. A combo box starts in a compact state and expands to show a list of selectable items. A ListBox is similar to a combo box, but is not collapsible/does not have a compact state. [Learn more](https://docs.microsoft.com/en-us/windows/apps/design/controls/combo-box) + +Here's an example of how to create a basic combo box: + +```dart + +final values = ['Blue', 'Green', 'Yellow', 'Red']; +String? comboBoxValue; + +SizedBox( + width: 200, + child: Combobox( + placeholder: Text('Selected list item'), + isExpanded: true, + items: values + .map((e) => ComboboxItem( + value: e, + child: Text(e), + )) + .toList(), + value: comboBoxValue, + onChanged: (value) { + // print(value); + if (value != null) setState(() => comboBoxValue = value); + }, + ), +), +``` + +The code above produces the following: + +![Combo box Preview](https://docs.microsoft.com/en-us/windows/apps/design/controls/images/combo-box-no-selection.png) + +# Widgets + +## Tooltip + +A tooltip is a short description that is linked to another control or object. Tooltips help users understand unfamiliar objects that aren't described directly in the UI. They display automatically when the user moves focus to, presses and holds, or hovers the mouse pointer over a control. The tooltip disappears after a few seconds, or when the user moves the finger, pointer or keyboard/gamepad focus. [Learn more](https://docs.microsoft.com/en-us/windows/apps/design/controls/tooltips) + +To add a tooltip to a widget, wrap it in a `Tooltip` widget: + +```dart +Tooltip( + message: 'Click to perform an action', + child: Button( + child: Text('Button with tooltip'), + onPressed: () { + print('Pressed button with tooltip'); + } + ), +) +``` + +It's located above or below the `child` widget. You can specify the preffered location when both locations are available using the `preferBelow` property. + +![Tooltip Preview](https://docs.microsoft.com/en-us/windows/apps/design/controls/images/controls/tool-tip.png) + +## Content Dialog + +Dialogs are modal UI overlays that provide contextual app information. They block interactions with the app window until being explicitly dismissed. They often request some kind of action from the user. [Learn more](https://docs.microsoft.com/en-us/windows/uwp/design/controls-and-patterns/dialogs-and-flyouts/dialogs) + +You can create a Dialog with the widget `ContentDialog`: + +```dart +ContentDialog( + title: Text('No WiFi connection'), + content: Text('Check your connection and try again'), + actions: [ + Button( + child: Text('Ok'), + onPressed: () { + Navigator.pop(context); + } + ) + ], +), +``` + +The code above produces the following: + +![No Wifi Connection Dialog](https://docs.microsoft.com/en-us/windows/apps/design/controls/images/dialogs/dialog_rs2_one_button.png) + +You can display the dialog as an overlay by calling the function `showDialog`: + +```dart +showDialog( + context: context, + builder: (context) { + return ContentDialog(...); + }, +); +``` + +![Delete File Dialog](https://docs.microsoft.com/en-us/windows/apps/design/controls/images/dialogs/dialog_rs2_delete_file.png)\ +![Subscribe to App Service Dialog](https://docs.microsoft.com/en-us/windows/apps/design/controls/images/dialogs/dialog_rs2_three_button_default.png)\ + +## Expander + +Expander lets you show or hide less important content that's related to a piece of primary content that's always visible. Items contained in the `header` are always visible. The user can expand and collapse the `content` area, where secondary content is displayed, by interacting with the header. When the content area is expanded, it pushes other UI elements out of the way; it does not overlay other UI. The Expander can expand upwards or downwards. + +Both the `header` and `content` areas can contain any content, from simple text to complex UI layouts. For example, you can use the control to show additional options for an item. + +![](https://docs.microsoft.com/en-us/windows/apps/design/controls/images/expander-default.gif) + +Use an Expander when some primary content should always be visible, but related secondary content may be hidden until needed. This UI is commonly used when display space is limited and when information or options can be grouped together. Hiding the secondary content until it's needed can also help to focus the user on the most important parts of your app. + +Here's an example of how to create an expander: + +```dart +Expander( + header: const Text('This thext is in header'), + content: const Text('This is the content'), + direction: ExpanderDirection.down, // (optional). Defaults to ExpanderDirection.down + initiallyExpanded: false, // (false). Defaults to false +), +``` + +Open and close the expander programatically: + +```dart +final _expanderKey = GlobalKey(); + +Expander( + header: const Text('This thext is in header'), + content: const Text('This is the content'), +), + +// Call this function to close the expander +void close() { + _expanderKey.currentState?.open = false; +} +``` + +## Flyout + +A flyout is a light dismiss container that can show arbitrary UI as its content. Flyouts can contain other flyouts or context menus to create a nested experience. + +![Flyout Opened Above Button 3](https://docs.microsoft.com/en-us/windows/apps/design/controls/images/flyout-smoke.png) + +```dart +final flyoutController = FlyoutController(); + +Flyout( + controller: flyoutController, + content: const FlyoutContent( + constraints: BoxConstraints(maxWidth: 100), + child: Text('The Flyout for Button 3 has LightDismissOverlayMode enabled'), + ), + child: Button( + child: Text('Button 3'), + onPressed: flyoutController.open, + ), +); + +@override +void dispose() { + // Dispose the controller to free up resources + flyoutController.dispose(); + super.dispose(); +} +``` + +## Acrylic + +Acrylic is a type of Brush that creates a translucent texture. You can apply acrylic to app surfaces to add depth and help establish a visual hierarchy. [Learn more](https://docs.microsoft.com/en-us/windows/uwp/design/style/acrylic) + +![Acrylic](https://docs.microsoft.com/en-us/windows/uwp/design/style/images/header-acrylic.svg) + +| Do | Don't | +| ----------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Do use acrylic as the background material of non-primary app surfaces like navigation panes. | Don't put desktop acrylic on large background surfaces of your app - this breaks the mental model of acrylic being used primarily for transient surfaces. | +| Do extend acrylic to at least one edge of your app to provide a seamless experience by subtly blending with the app’s surroundings. | Don’t place in-app and background acrylics directly adjacent to avoid visual tension at the seams. | +| | Don't place multiple acrylic panes with the same tint and opacity next to each other because this results in an undesirable visible seam. | +| | Don’t place accent-colored text over acrylic surfaces. | + +```dart +SizedBox( + height: ..., + width: ..., + child: Acrylic( + child: Button( + child: Text('Mom it\'s me hehe <3'), + onPressed: () { + print('button inside acrylic pressed'); + } + ), + ), +), +``` + +![Acrylic preview](https://docs.microsoft.com/en-us/windows/uwp/design/style/images/luminosityversustint.png) + +## InfoBar + +The `InfoBar` control is for displaying app-wide status messages to users that are highly visible yet non-intrusive. There are built-in Severity levels to easily indicate the type of message shown as well as the option to include your own call to action or hyperlink button. Since the InfoBar is inline with other UI content the option is there for the control to always be visible or dismissed by the user. + +You can easility create it using the `InfoBar` widget and theme it using `InfoBarThemeData`. It has built-in support for both light and dark theme: + +```dart +bool _visible = true; + +if (_visible) + InfoBar( + title: Text('Update available'), + content: Text('Restart the app to apply the latest update.'), // optional + severity: InfoBarSeverity.info, // optional. Default to InfoBarSeverity.info + onClose: () { + // Dismiss the info bar + setState(() => _visible = false); + } + ), +``` + +Which produces the following: + +![InfoBar Preview](https://docs.microsoft.com/en-us/windows/apps/design/controls/images/infobar-default-title-message.png) + +## Date Picker + +The date picker gives you a standardized way to let users pick a localized date value using touch, mouse, or keyboard input. [Learn more](https://docs.microsoft.com/en-us/windows/apps/design/controls/date-picker) + +The entry point displays the chosen date, and when the user selects the entry point, a picker surface expands vertically from the middle for the user to make a selection. The date picker overlays other UI; it doesn't push other UI out of the way. + +We use [intl](https://pub.dev/packages/intl) to format the dates. You can [change the current locale](https://pub.dev/packages/intl#current-locale) to change formatting + +Here's an example of how to create a basic date picker: + +```dart +DateTime date = DateTime.now(); + +SizedBox( + width: 295, + child: DatePicker( + header: 'Date of birth', + selected: date, + onChanged: (v) => setState(() => date = v), + ), +); +``` + +Which produces the following: + +![DatePicker Preview](https://docs.microsoft.com/en-us/windows/apps/design/controls/images/controls-datepicker-expand.gif) + +## Time Picker + +The time picker gives you a standardized way to let users pick a time value using touch, mouse, or keyboard input. [Learn more](https://docs.microsoft.com/en-us/windows/apps/design/controls/time-picker) + +Use a time picker to let a user pick a single time value. + +Here's an example of how to create a basic time picker: + +```dart +DateTime date = DateTime.now(); + +SizedBox( + width: 240, + child: TimePicker( + header: 'Arrival time', + selected: date, + onChanged: (v) => setState(() => date = v), + ), +), +``` + +The code above produces the following: + +![Time Picker Preview](https://docs.microsoft.com/en-us/windows/apps/design/controls/images/controls-timepicker-expand.gif) + +## Progress Bar and Progress Ring + +A progress control provides feedback to the user that a long-running operation is underway. It can mean that the user cannot interact with the app when the progress indicator is visible, and can also indicate how long the wait time might be, depending on the indicator used. + +Here's an example of how to create a ProgressBar: + +```dart +ProgressBar(value: 35) +``` + +![Determinate Progress Bar](https://docs.microsoft.com/en-us/windows/uwp/design/controls-and-patterns/images/progressbar-determinate.png) + +You can omit the `value` property to create an indeterminate progress bar: + +![Indeterminate Progress Bar](https://docs.microsoft.com/en-us/windows/uwp/design/controls-and-patterns/images/progressbar-indeterminate.gif) + +Indeterminate Progress Bar is a courtesy of [@raitonubero](https://github.com/raitonoberu). Show him some love + +Here's an example of how to create a progress ring: + +```dart +ProgressRing(value: 35) +``` + +![Determinate Progress Ring](https://docs.microsoft.com/en-us/windows/uwp/design/controls-and-patterns/images/progress_ring.jpg) + +You can omit the `value` property to create an indeterminate progress ring: + +![Indeterminate Progress Ring](https://docs.microsoft.com/en-us/windows/uwp/design/controls-and-patterns/images/progressring-indeterminate.gif) + +Both Indeterminate ProgressBar and Indeterminate ProgressRing is a courtesy of [@raitonubero](https://github.com/raitonoberu). Show him some love ❤ + +## Scrollbar + +A scrollbar thumb indicates which portion of a [ScrollView] is actually visible. [Learn more](https://docs.microsoft.com/en-us/windows/uwp/design/controls-and-patterns/scroll-controls) + +Depending on the situation, the scrollbar uses two different visualizations, shown in the following illustration: the panning indicator (left) and the traditional scrollbar (right). + +> Note that the arrows aren't visible. See [this](https://github.com/flutter/flutter/issues/80370) and [this](https://github.com/bdlukaa/fluent_ui/issues/14) issues for more info. + +![Scrollbar Panning Indicator](https://docs.microsoft.com/en-us/windows/apps/design/controls/images/scrollbar-panning.png) +![Traditional Scrollbar](https://docs.microsoft.com/en-us/windows/apps/design/controls/images/scrollbar-traditional.png) + +> When the scrollbar is visible it is overlaid as 16px on top of the content inside your ScrollView. In order to ensure good UX design you will want to ensure that no interactive content is obscured by this overlay. Additionally if you would prefer not to have UX overlap, leave 16px of padding on the edge of the viewport to allow for the scrollbar. + +Here's an example of how to add a scrollbar to a ScrollView: + +```dart +final _controller = ScrollController(); + +Scrollbar( + controller: _controller, + child: ListView.builder( + /// You can add a padding to the view to avoid having the scrollbar over the UI elements + padding: EdgeInsets.only(right: 16.0), + itemCount: 100, + itemBuilder: (context, index) { + return ListTile(title: Text('$index')); + } + ), +) +``` + +Which produces the following: + +![Scrollbar Preview](https://docs.microsoft.com/en-us/windows/uwp/design/controls-and-patterns/images/conscious-scroll.gif) + +You can change the `isAlwaysVisible` property to either enable or disable the fade effect. It's disabled by default. + +## List Tile + +You can use a `ListTile` in a `ListView`. + +### Example + +```dart +final people = { + 'Mass in B minor': 'Johann Sebastian Bach', + 'Third Symphony': 'Ludwig van Beethoven', + 'Serse': 'George Frideric Hendel', +}; + +ListView.builder( + itemCount: people.length, + itemBuilder: (context, index) { + final title = people.keys.elementAt(index); + final subtitle = people[title]; + return ListTile( + leading: CircleAvatar(), + title: Text(title), + subtitle: Text(subtitle!), + ); + } +), +``` + +The code above produces the following: + +![Double Line Example](https://docs.microsoft.com/en-us/windows/uwp/design/controls-and-patterns/images/listitems/doublelineexample.png) + +If you want to create a tappable tile, use `TappableListTile` instead. + +## Info Label + +You can use an `InfoLabel` to tell the user the purpose of something. + +Here's an example of how to add an info header to a combobox: + +```dart +InfoLabel( + label: 'Colors', + child: ComboBox(...), +), +``` + +The code above produces the following: + +![InfoHeader Preview](https://docs.microsoft.com/en-us/windows/apps/design/controls/images/combo-box-no-selection.png) + +Some widgets, such as `ComboBox` and `TextBox`, already come with a `header` property, so you can use them easily with them: + +```dart +ComboBox( + header: 'Control header', + ... +) +``` + +This will produce the same as the image above. + +## TreeView + +The `TreeView` control enables a hierarchical list with expanding and collapsing nodes that contain nested items. It can be used to illustrate a folder structure or nested relationships in your UI. [Learn More](https://docs.microsoft.com/en-us/windows/apps/design/controls/tree-view) + +The tree view uses a combination of indentation and icons to represent the nested relationship between parent nodes and child nodes. Collapsed nodes use a chevron pointing to the right, and expanded nodes use a chevron pointing down. + +![TreeView Simple](https://docs.microsoft.com/en-us/windows/apps/design/controls/images/treeview-simple.png) + +You can include an icon in the tree view item data template to represent nodes. For example, if you show a file system hierarchy, you could use folder icons for the parent notes and file icons for the leaf nodes. + +![TreeView Icons](https://docs.microsoft.com/en-us/windows/apps/design/controls/images/treeview-icons.png) + +Each `TreeViewItem` can optionally take a `value` allowing you to store an arbitrary identifier with each item. This can be used in conjunction with `onSelectionChanged` to easily identify which items were selected without having to deconstruct the content widget. + +Here's an example of how to create a tree view: + +```dart +TreeView( + items: [ + TreeViewItem( + content: const Text('Work Documents'), + children: [ + TreeViewItem(content: const Text('XYZ Functional Spec')), + TreeViewItem(content: const Text('Feature Schedule')), + TreeViewItem(content: const Text('Overall Project Plan')), + TreeViewItem(content: const Text('Feature Resources Allocation')), + ], + ), + TreeViewItem( + content: const Text('Personal Documents'), + children: [ + TreeViewItem( + content: const Text('Home Remodel'), + children: [ + TreeViewItem(content: const Text('Contractor Contact Info')), + TreeViewItem(content: const Text('Paint Color Scheme')), + TreeViewItem(content: const Text('Flooring weedgrain type')), + TreeViewItem(content: const Text('Kitchen cabinet style')), + ], + ), + ], + ), + ], + onItemInvoked: (item) => debugPrint(item), // (optional) + // (optional). Can be TreeViewSelectionMode.single or TreeViewSelectionMode.multiple + selectionMode: TreeViewSelectionMode.none, +), +``` + +### Scrollable tree view + +Vertical scrolling can be enabled for a tree view by setting the `shrinkWrap` property to false. +If you have many items, consider setting `itemExtent`, `cacheExtent`, and/or `usePrototypeItem` +for much better performance. + +### Lazily load nodes + +Load nodes as required by the user + +```dart +late List items; + +@override +void initState() { + super.initState(); + items = [ + TreeViewItem( + content: const Text('Parent node'), + children: [], // REQUIRED. An initial list of children must be provided. It must be mutable + onInvoked: (item) async { + // If the node is already populated, return + if (item.children.isNotEmpty) return; + setState(() => item.loading = true); + // Fetch more nodes from an async source, such as an API or device storage + final List nodes = await fetchNodes(); + setState(() { + item.loading = false; + item.children.addAll(nodes); + }); + } + ) + ]; +} + +TreeView( + items: items, +); +``` + +## CommandBar + +A `CommandBar` control provides quick access to common tasks. This could be application-level or page-level commands. [Learn More](https://docs.microsoft.com/en-us/windows/apps/design/controls/command-bar) + +![CommandBar Simple](https://docs.microsoft.com/en-us/windows/apps/design/controls/images/controls-appbar-icons.png) + +The `CommandBar` is composed of a number of `CommandBarItem` objects, which could be `CommandBarButton`, a `CommandBarSeparator`, or any custom object (e.g., a "split button" object). Sub-class `CommandBarItem` to create your own custom items. + +Each `CommandBarItem` widget knows how to render itself in three different modes: +- `CommandBarItemDisplayMode.inPrimary`: Displayed horizontally in primary area +- `CommandBarItemDisplayMode.inPrimaryCompact`: More compact horizontal display (e.g., only the icon is displayed for `CommandBarButton`) +- `CommandBarItemDisplayMode.inSecondary`: Displayed within flyout menu `ListView` + +The "primary area" of the command bar displays items horizontally. The "secondary area" of the command bar is a flyout menu accessed via an "overflow widget" (by default, a "more" button). You can specify items that should be displayed for each area. The overflow widget will only be displayed if there are items in the secondary area (including any items that dynamically overflowed into the secondary area, if dynamic overflow is enabled). + +Whether or not the "compact" mode is selected for items displayed in the primary area is determined by an optional width breakpoint. If set, if the width of the widget is less than the breakpoint, it will render each primary `CommandBarItem` using the compact mode. + +Different behaviors can be selected when the width of the `CommandBarItem` widgets exceeds the constraints, as determined by the specified `CommandBarOverflowBehavior`, including dynamic overflow (putting primary items into the secondary area on overflow), wrapping, clipping, scrolling, and no wrapping (will overflow). + +The horizontal and vertical alignment can also be customized via the `mainAxisAlignment` and `crossAxisAlignment` properties. The main axis alignment respects current directionality. + +A `CommandBarCard` can be used to create a raised card around a `CommandBar`. While this is not officially part of the Fluent design language, the concept is commonly used in the Office desktop apps for the app-level command bar. + +Here is an example of a right-aligned command bar that has additional items in the secondary area: + +```dart +CommandBar( + mainAxisAlignment: MainAxisAlignment.end, + overflowBehavior: CommandBarOverflowBehavior.dynamicOverflow, + compactBreakpointWidth: 768, + primaryItems: [ + CommandBarButton( + icon: const Icon(FluentIcons.add), + label: const Text('Add'), + onPressed: () {}, + ), + CommandBarButton( + icon: const Icon(FluentIcons.edit), + label: const Text('Edit'), + onPressed: () {}, + ), + CommandBarButton( + icon: const Icon(FluentIcons.delete), + label: const Text('Edit'), + onPressed: () {}, + ), + ], + secondaryItems: [ + CommandBarButton( + icon: const Icon(FluentIcons.archive), + label: const Text('Archive'), + onPressed: () {}, + ), + CommandBarButton( + icon: const Icon(FluentIcons.move), + label: const Text('Move'), + onPressed: () {}, + ), + ], +), +``` + +To put a tooltip on any other kind of `CommandBarItem` (or otherwise wrap it in another widget), use `CommandBarBuilderItem`: + +```dart +CommandBarBuilderItem( + builder: (context, mode, w) => Tooltip( + message: "Create something new!", + child: w, + ), + wrappedItem: CommandBarButton( + icon: const Icon(FluentIcons.add), + label: const Text('Add'), + onPressed: () {}, + ), +), +``` + +More complex examples, including command bars with items that align to each side of a carded bar, are in the example app. + +# Mobile Widgets + +Widgets with focus on mobile. Based on the official documentation and source code for [iOS](https://developer.microsoft.com/pt-br/fluentui#/controls/ios) and [Android](https://developer.microsoft.com/pt-br/fluentui#/controls/android). Most of the widgets above can adapt to small screens, and will fit on all your devices. + +## Bottom Sheet + +Bottom Sheet is used to display a modal list of menu items. They slide up over the main app content as a result of a user triggered action. [Learn more](https://developer.microsoft.com/pt-br/fluentui#/controls/android/bottomsheet) + +Here's an example of how to display a bottom sheet: + +```dart +showBottomSheet( + context: context, + builder: (context) { + return BottomSheet( + // header: ..., + description: Text('Description or Details here'), + children: [ + ..., + // Usually a `ListTile` or `TappableListTile` + ], + ); + }, +), +``` + +To close it, just call `Navigator.of(context).pop()` + +![Bottom Sheet Showcase](https://static2.sharepointonline.com/files/fabric/fabric-website/images/controls/android/updated/img_bottomsheet_01_light.png?text=LightMode) + +## Chip + +Chips are compact representations of entities (most commonly, people) that can be clicked, deleted, or dragged easily. + +Here's an example of how to create a chip: + +```dart +Chip( + image: CircleAvatar(size: 12.0), + text: Text('Chip'), +), +Chip.selected( + image: FlutterLogo(size: 14.0), + text: Text('Chip'), +) +``` + +![Light Chips](https://user-images.githubusercontent.com/45696119/119724339-f9a00700-be44-11eb-940b-1966eefe3798.png) + +![Dark Chips](https://user-images.githubusercontent.com/45696119/119724337-f9077080-be44-11eb-9b73-e1dc4ffbeefd.png) + +## Pill Button Bar + +A Pill Button Bar is a horizontal scrollable list of pill-shaped text buttons in which only one button can be selected at a given time. + +Here's an example of how to create a pill button bar: + +```dart +int index = 0; + +PillButtonBar( + selected: index, + onChanged: (i) => setState(() => index = i), + items: [ + PillButtonBarItem(text: Text('All')), + PillButtonBarItem(text: Text('Mail')), + PillButtonBarItem(text: Text('Peopl')), + PillButtonBarItem(text: Text('Events')), + ] +) +``` + +![Light PillButtonBar](https://static2.sharepointonline.com/files/fabric/fabric-website/images/controls/ios/updated/img_pillbar_01_light.png?text=LightMode) + +![Dark PillButtonBar](https://static2.sharepointonline.com/files/fabric/fabric-website/images/controls/ios/updated/img_pillbar_01_dark.png?text=DarkMode) + +## Snackbar + +Snackbars provide a brief message about an operation at the bottom of the screen. They can contain a custom action or view or use a style geared towards making special announcements to your users. + +Here's an example of how to display a snackbar at the bottom of the screen: + +```dart +showSnackbar( + context, + Snackbar( + content: Text('A new update is available!'), + ), +); +``` + +![Snackbar Example](https://static2.sharepointonline.com/files/fabric/fabric-website/images/controls/android/updated/img_snackbar_01_standard_dark.png?text=DarkMode) + +--- + +# Layout Widgets + +Widgets that help to layout other widgets. + +## DynamicOverflow + +`DynamicOverflow` widget is similar to the `Wrap` widget, but only lays out children widgets in a single run, and if there is not room to display them all, it will hide widgets that don't fit, and display the "overflow widget" at the end. Optionally, the "overflow widget" can be displayed all the time. Displaying the overflow widget will take precedence over any children widgets. + +This is used to implement the dynamic overflow mode for `CommandBar`, but could be useful on its own. It supports both horizontal and vertical layout modes, and various main axis and cross axis alignments. + +# Equivalents with the material library + +The list of equivalents between this library and `flutter/material.dart` + +| Material | Fluent | +| ------------------------- | ---------------- | +| TextButton | Button | +| IconButton | IconButton | +| Checkbox | Checkbox | +| RadioButton | RadioButton | +| - | RatingBar | +| - | SplitButton | +| - | ToggleButton | +| Switch | ToggleSwitch | +| TextField | TextBox | +| TextFormField | TextFormBox | +| DropdownButton | Combobox | +| PopupMenuButton | DropDownButton | +| - | AutoSuggestBox | +| AlertDialog | ContentDialog | +| MaterialBanner | InfoBar | +| Tooltip | Tooltip | +| - | Flyout | +| Drawer | NavigationPane | +| BottomNavigation | BottomNavigation | +| Divider | Divider | +| VerticalDivider | Divider | +| Material | Acrylic | +| ListTile | ListTile | +| CheckboxListTile | CheckboxListTile | +| SwitchListTile | SwitchListTile | +| LinearProgressIndicator | ProgressBar | +| CircularProgressIndicator | ProgressRing | +| \_DatePickerDialog | DatePicker | +| \_TimePickerDialog | TimePicker | +| Scaffold | ScaffoldPage | +| AppBar | NavigationAppBar | +| Drawer | NavigationView | +| Chip | Chip | +| Snackbar | Snackbar | +| - | PillButtonBar | +| ExpansionPanel | Expander | + +## Localization + +FluentUI widgets currently supports out-of-the-box an wide number of languages, including: + +- Arabic +- English +- French +- German +- Hindi +- Portuguese +- Russian +- Simplified Chinese +- Spanish + +## Contribution + +Feel free to [file an issue](https://github.com/bdlukaa/fluent_ui/issues/new) if you find a problem or [make pull requests](https://github.com/bdlukaa/fluent_ui/pulls). + +All contributions are welcome :) + +### Contributing new localizations + +In [PR#216](https://github.com/bdlukaa/fluent_ui/pull/216) we added support for new localizations in FluentUI Widgets. + +If you want to contribute adding new localizations please follow this steps: + +- [Fork the repo](https://github.com/bdlukaa/fluent_ui/fork) +- Copy `lib/l10n/intl_en.arb` file into `lib/l10n` folder with a new language code, following [this list of ISO 859-1 codes](https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes) +- Update the contents in the newly created file. Specially, please update the `@locale` value with the corresponding ISO code. +- Then update the `localization.dart:defaultSupportedLocales` list, adding an entry for each new locale +- If your IDE doesn't have any of the `intl` plugins ([Intl plugin for Android Studio/IntelliJ](https://plugins.jetbrains.com/plugin/13666-flutter-intl) / [Flutter Intl for VSCode](https://marketplace.visualstudio.com/items?itemName=localizely.flutter-intl) ) please run your project and code generation will take place. +- When you're done, [make a new pull request](https://github.com/bdlukaa/fluent_ui/pulls) + +More about [Localization in the Flutter Official Documentation](https://docs.flutter.dev/development/accessibility-and-localization/internationalization) + +### Acknowledgements + +Irrespective of order, thanks to all the people below for contributing with the project. It means a lot to me :) + +- [@HrX03](https://github.com/HrX03) for the `Acrylic`, `FluentIcons` generator and `_FluentTextSelectionControls` implementation. +- [@raitonubero](https://github.com/raitonoberu) `ProgressBar` and `ProgressRing` implementation +- [@alexmercerind](https://github.com/alexmercerind) for the [flutter_acrylic](https://github.com/alexmercerind/flutter_acrylic) plugin, used on the example app +- [@leanflutter](https://github.com/leanflutter) for the [window_manager](https://github.com/leanflutter/window_manager) plugin, used on the example app. +- [@henry2man](https://github.com/henry2man) for the [localization support](https://github.com/bdlukaa/fluent_ui/pull/216) +- [@klondikedragon](https://github.com/klondikedragon) for [`CommandBar` implementation](https://github.com/bdlukaa/fluent_ui/pull/232) diff --git a/dependencies/fluent_ui-3.12.0/analysis_options.yaml b/dependencies/fluent_ui-3.12.0/analysis_options.yaml new file mode 100644 index 0000000..e3f2b56 --- /dev/null +++ b/dependencies/fluent_ui-3.12.0/analysis_options.yaml @@ -0,0 +1,5 @@ +include: package:flutter_lints/flutter.yaml + +linter: + rules: + library_private_types_in_public_api: false \ No newline at end of file diff --git a/dependencies/fluent_ui-3.12.0/assets/AcrylicNoise.png b/dependencies/fluent_ui-3.12.0/assets/AcrylicNoise.png new file mode 100644 index 0000000000000000000000000000000000000000..41de173d9014b38f8290acf270c490b37fc79a60 GIT binary patch literal 3241 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

#3bpk;r#TW7Scw^n`|mYgesXwRnALdez$1 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 literal 0 HcmV?d00001 diff --git a/dependencies/fluent_ui-3.12.0/images/example-showcase.png b/dependencies/fluent_ui-3.12.0/images/example-showcase.png new file mode 100644 index 0000000000000000000000000000000000000000..b197d981a1ddb548714e39caba82568fd927516c GIT binary patch literal 21289 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 LibraryLoader(); +Map _deferredLibraries = { + 'ar': () => new Future.value(null), + 'de': () => new Future.value(null), + 'en': () => new Future.value(null), + 'es': () => new Future.value(null), + 'fr': () => new Future.value(null), + 'hi': () => new Future.value(null), + 'pt': () => new Future.value(null), + 'ru': () => new Future.value(null), + 'zh': () => new Future.value(null), +}; + +MessageLookupByLibrary? _findExact(String localeName) { + switch (localeName) { + case 'ar': + return messages_ar.messages; + case 'de': + return messages_de.messages; + case 'en': + return messages_en.messages; + case 'es': + return messages_es.messages; + case 'fr': + return messages_fr.messages; + case 'hi': + return messages_hi.messages; + case 'pt': + return messages_pt.messages; + case 'ru': + return messages_ru.messages; + case 'zh': + return messages_zh.messages; + default: + return null; + } +} + +/// User programs should call this before using [localeName] for messages. +Future initializeMessages(String localeName) async { + var availableLocale = Intl.verifiedLocale( + localeName, (locale) => _deferredLibraries[locale] != null, + onFailure: (_) => null); + if (availableLocale == null) { + return new Future.value(false); + } + var lib = _deferredLibraries[availableLocale]; + await (lib == null ? new Future.value(false) : lib()); + initializeInternalMessageLookup(() => new CompositeMessageLookup()); + messageLookup.addLocale(availableLocale, _findGeneratedMessagesFor); + return new Future.value(true); +} + +bool _messagesExistFor(String locale) { + try { + return _findExact(locale) != null; + } catch (e) { + return false; + } +} + +MessageLookupByLibrary? _findGeneratedMessagesFor(String locale) { + var actualLocale = + Intl.verifiedLocale(locale, _messagesExistFor, onFailure: (_) => null); + if (actualLocale == null) return null; + return _findExact(actualLocale); +} diff --git a/dependencies/fluent_ui-3.12.0/lib/generated/intl/messages_ar.dart b/dependencies/fluent_ui-3.12.0/lib/generated/intl/messages_ar.dart new file mode 100644 index 0000000..05f3107 --- /dev/null +++ b/dependencies/fluent_ui-3.12.0/lib/generated/intl/messages_ar.dart @@ -0,0 +1,63 @@ +// DO NOT EDIT. This is code generated via package:intl/generate_localized.dart +// This is a library that provides messages for a ar locale. All the +// messages from the main program should be duplicated here with the same +// function name. + +// Ignore issues from commonly used lints in this file. +// ignore_for_file:unnecessary_brace_in_string_interps, unnecessary_new +// ignore_for_file:prefer_single_quotes,comment_references, directives_ordering +// ignore_for_file:annotate_overrides,prefer_generic_function_type_aliases +// ignore_for_file:unused_import, file_names, avoid_escaping_inner_quotes +// ignore_for_file:unnecessary_string_interpolations, unnecessary_string_escapes + +import 'package:intl/intl.dart'; +import 'package:intl/message_lookup_by_library.dart'; + +final messages = new MessageLookup(); + +typedef String MessageIfAbsent(String messageStr, List args); + +class MessageLookup extends MessageLookupByLibrary { + String get localeName => 'ar'; + + final messages = _notInlinedMessages(_notInlinedMessages); + static Map _notInlinedMessages(_) => { + "backButtonTooltip": MessageLookupByLibrary.simpleMessage("رجوع"), + "clickToSearch": MessageLookupByLibrary.simpleMessage("انقر للبحث"), + "closeButtonLabel": MessageLookupByLibrary.simpleMessage("إغلاق"), + "closeNavigationTooltip": + MessageLookupByLibrary.simpleMessage("إغلاق الواجهة"), + "closeTabLabelSuffix": + MessageLookupByLibrary.simpleMessage("إغلاق علامة التبويب"), + "closeWindowTooltip": MessageLookupByLibrary.simpleMessage("إغلاق"), + "copyActionLabel": MessageLookupByLibrary.simpleMessage("نسخ"), + "copyActionTooltip": MessageLookupByLibrary.simpleMessage( + "انسخ المحتوى المحدد إلى الحافظة"), + "cutActionLabel": MessageLookupByLibrary.simpleMessage("قص"), + "cutActionTooltip": MessageLookupByLibrary.simpleMessage( + "قم بإزالة المحتوى المحدد وضعه في الحافظة"), + "dialogLabel": MessageLookupByLibrary.simpleMessage("مربع حوار"), + "minimizeWindowTooltip": MessageLookupByLibrary.simpleMessage("تصغير"), + "modalBarrierDismissLabel": + MessageLookupByLibrary.simpleMessage("استبعاد"), + "newTabLabel": + MessageLookupByLibrary.simpleMessage("إضافة علامة تبويب جديدة"), + "noResultsFoundLabel": + MessageLookupByLibrary.simpleMessage("لم يتم العثور على نتائج"), + "openNavigationTooltip": + MessageLookupByLibrary.simpleMessage("فتح الواجهة"), + "pasteActionLabel": MessageLookupByLibrary.simpleMessage("لصق"), + "pasteActionTooltip": MessageLookupByLibrary.simpleMessage( + "إدراج محتويات الحافظة إلى الموقع الحالي"), + "restoreWindowTooltip": MessageLookupByLibrary.simpleMessage("إسترجاع"), + "scrollTabBackwardLabel": MessageLookupByLibrary.simpleMessage( + "تمرير قائمة علامة التبويب للخلف"), + "scrollTabForwardLabel": MessageLookupByLibrary.simpleMessage( + "تمرير قائمة علامة التبويب إلى الأمام"), + "searchLabel": MessageLookupByLibrary.simpleMessage("بحث"), + "selectAllActionLabel": + MessageLookupByLibrary.simpleMessage("تحديد الكل"), + "selectAllActionTooltip": + MessageLookupByLibrary.simpleMessage("تحديد المحتوى بالكامل") + }; +} diff --git a/dependencies/fluent_ui-3.12.0/lib/generated/intl/messages_de.dart b/dependencies/fluent_ui-3.12.0/lib/generated/intl/messages_de.dart new file mode 100644 index 0000000..07b49e8 --- /dev/null +++ b/dependencies/fluent_ui-3.12.0/lib/generated/intl/messages_de.dart @@ -0,0 +1,66 @@ +// DO NOT EDIT. This is code generated via package:intl/generate_localized.dart +// This is a library that provides messages for a de locale. All the +// messages from the main program should be duplicated here with the same +// function name. + +// Ignore issues from commonly used lints in this file. +// ignore_for_file:unnecessary_brace_in_string_interps, unnecessary_new +// ignore_for_file:prefer_single_quotes,comment_references, directives_ordering +// ignore_for_file:annotate_overrides,prefer_generic_function_type_aliases +// ignore_for_file:unused_import, file_names, avoid_escaping_inner_quotes +// ignore_for_file:unnecessary_string_interpolations, unnecessary_string_escapes + +import 'package:intl/intl.dart'; +import 'package:intl/message_lookup_by_library.dart'; + +final messages = new MessageLookup(); + +typedef String MessageIfAbsent(String messageStr, List args); + +class MessageLookup extends MessageLookupByLibrary { + String get localeName => 'de'; + + final messages = _notInlinedMessages(_notInlinedMessages); + static Map _notInlinedMessages(_) => { + "backButtonTooltip": MessageLookupByLibrary.simpleMessage("Zurück"), + "clickToSearch": + MessageLookupByLibrary.simpleMessage("Zum Suchen klicken"), + "closeButtonLabel": MessageLookupByLibrary.simpleMessage("Schließen"), + "closeNavigationTooltip": + MessageLookupByLibrary.simpleMessage("Navigation schließen"), + "closeTabLabelSuffix": + MessageLookupByLibrary.simpleMessage("Tab schließen"), + "closeWindowTooltip": MessageLookupByLibrary.simpleMessage("Schließen"), + "copyActionLabel": MessageLookupByLibrary.simpleMessage("Kopieren"), + "copyActionTooltip": MessageLookupByLibrary.simpleMessage( + "Ausgewählten Inhalt in die Zwischenablage kopieren"), + "cutActionLabel": MessageLookupByLibrary.simpleMessage("Ausschneiden"), + "cutActionTooltip": MessageLookupByLibrary.simpleMessage( + "Ausgewählten Inhalt entfernen und in die Zwischenablage legen"), + "dialogLabel": MessageLookupByLibrary.simpleMessage("Dialog"), + "minimizeWindowTooltip": + MessageLookupByLibrary.simpleMessage("Minimieren"), + "modalBarrierDismissLabel": + MessageLookupByLibrary.simpleMessage("Schließen"), + "newTabLabel": + MessageLookupByLibrary.simpleMessage("Neuen Tab hinzufügen"), + "noResultsFoundLabel": + MessageLookupByLibrary.simpleMessage("Keine Ergebnisse gefunden"), + "openNavigationTooltip": + MessageLookupByLibrary.simpleMessage("Navigation öffnen"), + "pasteActionLabel": MessageLookupByLibrary.simpleMessage("Einfügen"), + "pasteActionTooltip": MessageLookupByLibrary.simpleMessage( + "Fügt den Inhalt der Zwischenablage an der aktuellen Stelle ein"), + "restoreWindowTooltip": + MessageLookupByLibrary.simpleMessage("Wiederherstellen"), + "scrollTabBackwardLabel": MessageLookupByLibrary.simpleMessage( + "Tab-Liste rückwärts scrollen"), + "scrollTabForwardLabel": + MessageLookupByLibrary.simpleMessage("Tabliste vorwärts scrollen"), + "searchLabel": MessageLookupByLibrary.simpleMessage("Suchen"), + "selectAllActionLabel": + MessageLookupByLibrary.simpleMessage("Alles auswählen"), + "selectAllActionTooltip": + MessageLookupByLibrary.simpleMessage("Alle Inhalte auswählen") + }; +} diff --git a/dependencies/fluent_ui-3.12.0/lib/generated/intl/messages_en.dart b/dependencies/fluent_ui-3.12.0/lib/generated/intl/messages_en.dart new file mode 100644 index 0000000..852f779 --- /dev/null +++ b/dependencies/fluent_ui-3.12.0/lib/generated/intl/messages_en.dart @@ -0,0 +1,64 @@ +// DO NOT EDIT. This is code generated via package:intl/generate_localized.dart +// This is a library that provides messages for a en locale. All the +// messages from the main program should be duplicated here with the same +// function name. + +// Ignore issues from commonly used lints in this file. +// ignore_for_file:unnecessary_brace_in_string_interps, unnecessary_new +// ignore_for_file:prefer_single_quotes,comment_references, directives_ordering +// ignore_for_file:annotate_overrides,prefer_generic_function_type_aliases +// ignore_for_file:unused_import, file_names, avoid_escaping_inner_quotes +// ignore_for_file:unnecessary_string_interpolations, unnecessary_string_escapes + +import 'package:intl/intl.dart'; +import 'package:intl/message_lookup_by_library.dart'; + +final messages = new MessageLookup(); + +typedef String MessageIfAbsent(String messageStr, List args); + +class MessageLookup extends MessageLookupByLibrary { + String get localeName => 'en'; + + final messages = _notInlinedMessages(_notInlinedMessages); + static Map _notInlinedMessages(_) => { + "backButtonTooltip": MessageLookupByLibrary.simpleMessage("Back"), + "clickToSearch": + MessageLookupByLibrary.simpleMessage("Click to search"), + "closeButtonLabel": MessageLookupByLibrary.simpleMessage("Close"), + "closeNavigationTooltip": + MessageLookupByLibrary.simpleMessage("Close Navigation"), + "closeTabLabelSuffix": + MessageLookupByLibrary.simpleMessage("Close tab"), + "closeWindowTooltip": MessageLookupByLibrary.simpleMessage("Close"), + "copyActionLabel": MessageLookupByLibrary.simpleMessage("Copy"), + "copyActionTooltip": MessageLookupByLibrary.simpleMessage( + "Copy the selected content to the clipboard"), + "cutActionLabel": MessageLookupByLibrary.simpleMessage("Cut"), + "cutActionTooltip": MessageLookupByLibrary.simpleMessage( + "Remove the selected content and put it in the clipboard"), + "dialogLabel": MessageLookupByLibrary.simpleMessage("Dialog"), + "minimizeWindowTooltip": + MessageLookupByLibrary.simpleMessage("Minimize"), + "modalBarrierDismissLabel": + MessageLookupByLibrary.simpleMessage("Dismiss"), + "newTabLabel": MessageLookupByLibrary.simpleMessage("Add new tab"), + "noResultsFoundLabel": + MessageLookupByLibrary.simpleMessage("No results found"), + "openNavigationTooltip": + MessageLookupByLibrary.simpleMessage("Open Navigation"), + "pasteActionLabel": MessageLookupByLibrary.simpleMessage("Paste"), + "pasteActionTooltip": MessageLookupByLibrary.simpleMessage( + "Inserts the contents of the clipboard at the current location"), + "restoreWindowTooltip": MessageLookupByLibrary.simpleMessage("Restore"), + "scrollTabBackwardLabel": + MessageLookupByLibrary.simpleMessage("Scroll tab list backward"), + "scrollTabForwardLabel": + MessageLookupByLibrary.simpleMessage("Scroll tab list forward"), + "searchLabel": MessageLookupByLibrary.simpleMessage("Search"), + "selectAllActionLabel": + MessageLookupByLibrary.simpleMessage("Select all"), + "selectAllActionTooltip": + MessageLookupByLibrary.simpleMessage("Select all content") + }; +} diff --git a/dependencies/fluent_ui-3.12.0/lib/generated/intl/messages_es.dart b/dependencies/fluent_ui-3.12.0/lib/generated/intl/messages_es.dart new file mode 100644 index 0000000..969e9b7 --- /dev/null +++ b/dependencies/fluent_ui-3.12.0/lib/generated/intl/messages_es.dart @@ -0,0 +1,66 @@ +// DO NOT EDIT. This is code generated via package:intl/generate_localized.dart +// This is a library that provides messages for a es locale. All the +// messages from the main program should be duplicated here with the same +// function name. + +// Ignore issues from commonly used lints in this file. +// ignore_for_file:unnecessary_brace_in_string_interps, unnecessary_new +// ignore_for_file:prefer_single_quotes,comment_references, directives_ordering +// ignore_for_file:annotate_overrides,prefer_generic_function_type_aliases +// ignore_for_file:unused_import, file_names, avoid_escaping_inner_quotes +// ignore_for_file:unnecessary_string_interpolations, unnecessary_string_escapes + +import 'package:intl/intl.dart'; +import 'package:intl/message_lookup_by_library.dart'; + +final messages = new MessageLookup(); + +typedef String MessageIfAbsent(String messageStr, List args); + +class MessageLookup extends MessageLookupByLibrary { + String get localeName => 'es'; + + final messages = _notInlinedMessages(_notInlinedMessages); + static Map _notInlinedMessages(_) => { + "backButtonTooltip": MessageLookupByLibrary.simpleMessage("Volver"), + "clickToSearch": + MessageLookupByLibrary.simpleMessage("Haz clic para buscar"), + "closeButtonLabel": MessageLookupByLibrary.simpleMessage("Cerrar"), + "closeNavigationTooltip": + MessageLookupByLibrary.simpleMessage("Cerrar Navegador"), + "closeTabLabelSuffix": + MessageLookupByLibrary.simpleMessage("Cerrar pestaña"), + "closeWindowTooltip": MessageLookupByLibrary.simpleMessage("Cerrar"), + "copyActionLabel": MessageLookupByLibrary.simpleMessage("Copiar"), + "copyActionTooltip": MessageLookupByLibrary.simpleMessage( + "Copiar el contenido seleccionado al portapapeles"), + "cutActionLabel": MessageLookupByLibrary.simpleMessage("Cortar"), + "cutActionTooltip": MessageLookupByLibrary.simpleMessage( + "Cortar el contenido seleccionado y ponerlo en el portapapeles"), + "dialogLabel": MessageLookupByLibrary.simpleMessage("Diálogo"), + "minimizeWindowTooltip": + MessageLookupByLibrary.simpleMessage("Minimizar"), + "modalBarrierDismissLabel": + MessageLookupByLibrary.simpleMessage("Cancelar"), + "newTabLabel": + MessageLookupByLibrary.simpleMessage("Añadir nueva pestaña"), + "noResultsFoundLabel": MessageLookupByLibrary.simpleMessage( + "No se encontraron resultados"), + "openNavigationTooltip": + MessageLookupByLibrary.simpleMessage("Abrir Navegador"), + "pasteActionLabel": MessageLookupByLibrary.simpleMessage("Pegar"), + "pasteActionTooltip": MessageLookupByLibrary.simpleMessage( + "Insertar el contenido del portapapeles en la posición actual"), + "restoreWindowTooltip": + MessageLookupByLibrary.simpleMessage("Restaurar"), + "scrollTabBackwardLabel": + MessageLookupByLibrary.simpleMessage("Hacer scroll hacia atrás"), + "scrollTabForwardLabel": + MessageLookupByLibrary.simpleMessage("Hacer scroll hacia delante"), + "searchLabel": MessageLookupByLibrary.simpleMessage("Buscar"), + "selectAllActionLabel": + MessageLookupByLibrary.simpleMessage("Seleccionar todo"), + "selectAllActionTooltip": MessageLookupByLibrary.simpleMessage( + "Seleccionar todo el contenido") + }; +} diff --git a/dependencies/fluent_ui-3.12.0/lib/generated/intl/messages_fr.dart b/dependencies/fluent_ui-3.12.0/lib/generated/intl/messages_fr.dart new file mode 100644 index 0000000..6c50723 --- /dev/null +++ b/dependencies/fluent_ui-3.12.0/lib/generated/intl/messages_fr.dart @@ -0,0 +1,66 @@ +// DO NOT EDIT. This is code generated via package:intl/generate_localized.dart +// This is a library that provides messages for a fr locale. All the +// messages from the main program should be duplicated here with the same +// function name. + +// Ignore issues from commonly used lints in this file. +// ignore_for_file:unnecessary_brace_in_string_interps, unnecessary_new +// ignore_for_file:prefer_single_quotes,comment_references, directives_ordering +// ignore_for_file:annotate_overrides,prefer_generic_function_type_aliases +// ignore_for_file:unused_import, file_names, avoid_escaping_inner_quotes +// ignore_for_file:unnecessary_string_interpolations, unnecessary_string_escapes + +import 'package:intl/intl.dart'; +import 'package:intl/message_lookup_by_library.dart'; + +final messages = new MessageLookup(); + +typedef String MessageIfAbsent(String messageStr, List args); + +class MessageLookup extends MessageLookupByLibrary { + String get localeName => 'fr'; + + final messages = _notInlinedMessages(_notInlinedMessages); + static Map _notInlinedMessages(_) => { + "backButtonTooltip": MessageLookupByLibrary.simpleMessage("Retour"), + "clickToSearch": + MessageLookupByLibrary.simpleMessage("Cliquez pour rechercher"), + "closeButtonLabel": MessageLookupByLibrary.simpleMessage("Fermer"), + "closeNavigationTooltip": + MessageLookupByLibrary.simpleMessage("Fermer le navigateur"), + "closeTabLabelSuffix": + MessageLookupByLibrary.simpleMessage("Fermer l\'onglet"), + "closeWindowTooltip": MessageLookupByLibrary.simpleMessage("Fermer"), + "copyActionLabel": MessageLookupByLibrary.simpleMessage("Copier"), + "copyActionTooltip": MessageLookupByLibrary.simpleMessage( + "Copier le contenu sélectionné dans le presse-papier"), + "cutActionLabel": MessageLookupByLibrary.simpleMessage("Couper"), + "cutActionTooltip": MessageLookupByLibrary.simpleMessage( + "Couper le contenu sélectionné et le mettre dans le presse-papier"), + "dialogLabel": MessageLookupByLibrary.simpleMessage("Dialogue"), + "minimizeWindowTooltip": + MessageLookupByLibrary.simpleMessage("Réduire"), + "modalBarrierDismissLabel": + MessageLookupByLibrary.simpleMessage("Annuler"), + "newTabLabel": + MessageLookupByLibrary.simpleMessage("Ajouter un nouvel onglet"), + "noResultsFoundLabel": + MessageLookupByLibrary.simpleMessage("Aucun résultat trouvé"), + "openNavigationTooltip": + MessageLookupByLibrary.simpleMessage("Ouvrir le navigateur"), + "pasteActionLabel": MessageLookupByLibrary.simpleMessage("Coller"), + "pasteActionTooltip": MessageLookupByLibrary.simpleMessage( + "Coller le contenu du presse-papier à la position actuelle"), + "restoreWindowTooltip": + MessageLookupByLibrary.simpleMessage("Restaurer"), + "scrollTabBackwardLabel": + MessageLookupByLibrary.simpleMessage("Défiler vers l\'arrière"), + "scrollTabForwardLabel": + MessageLookupByLibrary.simpleMessage("Défiler vers l\'avant"), + "searchLabel": MessageLookupByLibrary.simpleMessage("Rechercher"), + "selectAllActionLabel": + MessageLookupByLibrary.simpleMessage("Tout sélectionner"), + "selectAllActionTooltip": + MessageLookupByLibrary.simpleMessage("Sélectionner tout le contenu") + }; +} diff --git a/dependencies/fluent_ui-3.12.0/lib/generated/intl/messages_hi.dart b/dependencies/fluent_ui-3.12.0/lib/generated/intl/messages_hi.dart new file mode 100644 index 0000000..41a9141 --- /dev/null +++ b/dependencies/fluent_ui-3.12.0/lib/generated/intl/messages_hi.dart @@ -0,0 +1,65 @@ +// DO NOT EDIT. This is code generated via package:intl/generate_localized.dart +// This is a library that provides messages for a hi locale. All the +// messages from the main program should be duplicated here with the same +// function name. + +// Ignore issues from commonly used lints in this file. +// ignore_for_file:unnecessary_brace_in_string_interps, unnecessary_new +// ignore_for_file:prefer_single_quotes,comment_references, directives_ordering +// ignore_for_file:annotate_overrides,prefer_generic_function_type_aliases +// ignore_for_file:unused_import, file_names, avoid_escaping_inner_quotes +// ignore_for_file:unnecessary_string_interpolations, unnecessary_string_escapes + +import 'package:intl/intl.dart'; +import 'package:intl/message_lookup_by_library.dart'; + +final messages = new MessageLookup(); + +typedef String MessageIfAbsent(String messageStr, List args); + +class MessageLookup extends MessageLookupByLibrary { + String get localeName => 'hi'; + + final messages = _notInlinedMessages(_notInlinedMessages); + static Map _notInlinedMessages(_) => { + "backButtonTooltip": MessageLookupByLibrary.simpleMessage("वापस"), + "clickToSearch": + MessageLookupByLibrary.simpleMessage("खोजने के लिए क्लिक करें"), + "closeButtonLabel": MessageLookupByLibrary.simpleMessage("बंद करें"), + "closeNavigationTooltip": + MessageLookupByLibrary.simpleMessage("नेविगेशन बंद करें"), + "closeTabLabelSuffix": + MessageLookupByLibrary.simpleMessage("टैब बंद करें"), + "closeWindowTooltip": MessageLookupByLibrary.simpleMessage("बंद करें"), + "copyActionLabel": MessageLookupByLibrary.simpleMessage("कॉपी"), + "copyActionTooltip": MessageLookupByLibrary.simpleMessage( + "सेलेक्टेड कंटेंट क्लिपबोर्ड पर कॉपी करें"), + "cutActionLabel": MessageLookupByLibrary.simpleMessage("कट"), + "cutActionTooltip": MessageLookupByLibrary.simpleMessage( + "सिलेक्टेड कंटेंट यहाँ से हटा कर क्लिपबोर्ड पर कॉपी करें"), + "dialogLabel": MessageLookupByLibrary.simpleMessage("डायलॉग"), + "minimizeWindowTooltip": + MessageLookupByLibrary.simpleMessage("मिनीमाइज करें"), + "modalBarrierDismissLabel": + MessageLookupByLibrary.simpleMessage("हटाएँ"), + "newTabLabel": MessageLookupByLibrary.simpleMessage("नया टैब ऐड करें"), + "noResultsFoundLabel": + MessageLookupByLibrary.simpleMessage("कोई रिजल्ट नहीं मिला"), + "openNavigationTooltip": + MessageLookupByLibrary.simpleMessage("नेविगेशन खोलें"), + "pasteActionLabel": MessageLookupByLibrary.simpleMessage("पेस्ट"), + "pasteActionTooltip": MessageLookupByLibrary.simpleMessage( + "क्लिपबोर्ड का कंटेंट इस लोकेशन पर पेस्ट करें"), + "restoreWindowTooltip": + MessageLookupByLibrary.simpleMessage("वापिस लाएं"), + "scrollTabBackwardLabel": + MessageLookupByLibrary.simpleMessage("टैब लिस्ट पीछे स्क्रॉल करें"), + "scrollTabForwardLabel": + MessageLookupByLibrary.simpleMessage("टैब लिस्ट आगे स्क्रॉल करें"), + "searchLabel": MessageLookupByLibrary.simpleMessage("खोजें"), + "selectAllActionLabel": + MessageLookupByLibrary.simpleMessage("सब-कुछ सेलेक्ट करें"), + "selectAllActionTooltip": + MessageLookupByLibrary.simpleMessage("सारा कंटेंट सेलेक्ट करें") + }; +} diff --git a/dependencies/fluent_ui-3.12.0/lib/generated/intl/messages_pt.dart b/dependencies/fluent_ui-3.12.0/lib/generated/intl/messages_pt.dart new file mode 100644 index 0000000..b47b654 --- /dev/null +++ b/dependencies/fluent_ui-3.12.0/lib/generated/intl/messages_pt.dart @@ -0,0 +1,66 @@ +// DO NOT EDIT. This is code generated via package:intl/generate_localized.dart +// This is a library that provides messages for a pt locale. All the +// messages from the main program should be duplicated here with the same +// function name. + +// Ignore issues from commonly used lints in this file. +// ignore_for_file:unnecessary_brace_in_string_interps, unnecessary_new +// ignore_for_file:prefer_single_quotes,comment_references, directives_ordering +// ignore_for_file:annotate_overrides,prefer_generic_function_type_aliases +// ignore_for_file:unused_import, file_names, avoid_escaping_inner_quotes +// ignore_for_file:unnecessary_string_interpolations, unnecessary_string_escapes + +import 'package:intl/intl.dart'; +import 'package:intl/message_lookup_by_library.dart'; + +final messages = new MessageLookup(); + +typedef String MessageIfAbsent(String messageStr, List args); + +class MessageLookup extends MessageLookupByLibrary { + String get localeName => 'pt'; + + final messages = _notInlinedMessages(_notInlinedMessages); + static Map _notInlinedMessages(_) => { + "backButtonTooltip": MessageLookupByLibrary.simpleMessage("Voltar"), + "clickToSearch": + MessageLookupByLibrary.simpleMessage("Clique para pesquisar"), + "closeButtonLabel": MessageLookupByLibrary.simpleMessage("Fechar"), + "closeNavigationTooltip": + MessageLookupByLibrary.simpleMessage("Fechar navegação"), + "closeTabLabelSuffix": + MessageLookupByLibrary.simpleMessage("Fechar guia"), + "closeWindowTooltip": MessageLookupByLibrary.simpleMessage("Fechar"), + "copyActionLabel": MessageLookupByLibrary.simpleMessage("Copiar"), + "copyActionTooltip": MessageLookupByLibrary.simpleMessage( + "Copiar conteúdo selecionado para a área de transferência"), + "cutActionLabel": MessageLookupByLibrary.simpleMessage("Cortar"), + "cutActionTooltip": MessageLookupByLibrary.simpleMessage( + "Recortar o conteúdo selecionado e colocá-lo na área de transferência"), + "dialogLabel": MessageLookupByLibrary.simpleMessage("Caixa de diálogo"), + "minimizeWindowTooltip": + MessageLookupByLibrary.simpleMessage("Minimizar"), + "modalBarrierDismissLabel": + MessageLookupByLibrary.simpleMessage("Cancelar"), + "newTabLabel": + MessageLookupByLibrary.simpleMessage("Adicionar nova guia"), + "noResultsFoundLabel": + MessageLookupByLibrary.simpleMessage("Nenhum resultado encontrado"), + "openNavigationTooltip": + MessageLookupByLibrary.simpleMessage("Abrir navegação"), + "pasteActionLabel": MessageLookupByLibrary.simpleMessage("Colar"), + "pasteActionTooltip": MessageLookupByLibrary.simpleMessage( + "Colar o conteúdo da área de transferência na posição atual"), + "restoreWindowTooltip": + MessageLookupByLibrary.simpleMessage("Restaurar"), + "scrollTabBackwardLabel": + MessageLookupByLibrary.simpleMessage("Rolar para trás"), + "scrollTabForwardLabel": + MessageLookupByLibrary.simpleMessage("Rolar para frente"), + "searchLabel": MessageLookupByLibrary.simpleMessage("Pesquisar"), + "selectAllActionLabel": + MessageLookupByLibrary.simpleMessage("Selecionar tudo"), + "selectAllActionTooltip": + MessageLookupByLibrary.simpleMessage("Selecionar tudo") + }; +} diff --git a/dependencies/fluent_ui-3.12.0/lib/generated/intl/messages_ru.dart b/dependencies/fluent_ui-3.12.0/lib/generated/intl/messages_ru.dart new file mode 100644 index 0000000..f7dede3 --- /dev/null +++ b/dependencies/fluent_ui-3.12.0/lib/generated/intl/messages_ru.dart @@ -0,0 +1,65 @@ +// DO NOT EDIT. This is code generated via package:intl/generate_localized.dart +// This is a library that provides messages for a ru locale. All the +// messages from the main program should be duplicated here with the same +// function name. + +// Ignore issues from commonly used lints in this file. +// ignore_for_file:unnecessary_brace_in_string_interps, unnecessary_new +// ignore_for_file:prefer_single_quotes,comment_references, directives_ordering +// ignore_for_file:annotate_overrides,prefer_generic_function_type_aliases +// ignore_for_file:unused_import, file_names, avoid_escaping_inner_quotes +// ignore_for_file:unnecessary_string_interpolations, unnecessary_string_escapes + +import 'package:intl/intl.dart'; +import 'package:intl/message_lookup_by_library.dart'; + +final messages = new MessageLookup(); + +typedef String MessageIfAbsent(String messageStr, List args); + +class MessageLookup extends MessageLookupByLibrary { + String get localeName => 'ru'; + + final messages = _notInlinedMessages(_notInlinedMessages); + static Map _notInlinedMessages(_) => { + "backButtonTooltip": MessageLookupByLibrary.simpleMessage("Назад"), + "clickToSearch": + MessageLookupByLibrary.simpleMessage("Нажмите для поиска"), + "closeButtonLabel": MessageLookupByLibrary.simpleMessage("Закрыть"), + "closeNavigationTooltip": + MessageLookupByLibrary.simpleMessage("Закрыть панель навигации"), + "closeTabLabelSuffix": + MessageLookupByLibrary.simpleMessage("Закрыть вкладку"), + "closeWindowTooltip": MessageLookupByLibrary.simpleMessage("Закрыть"), + "copyActionLabel": MessageLookupByLibrary.simpleMessage("Копировать"), + "copyActionTooltip": + MessageLookupByLibrary.simpleMessage("Скопировать в буфер обмена"), + "cutActionLabel": MessageLookupByLibrary.simpleMessage("Вырезать"), + "cutActionTooltip": MessageLookupByLibrary.simpleMessage( + "Вырезать и поместить в буфер обмена"), + "dialogLabel": MessageLookupByLibrary.simpleMessage("Диалог"), + "minimizeWindowTooltip": + MessageLookupByLibrary.simpleMessage("Свернуть"), + "modalBarrierDismissLabel": + MessageLookupByLibrary.simpleMessage("Отмена"), + "newTabLabel": MessageLookupByLibrary.simpleMessage("Новая вкладка"), + "noResultsFoundLabel": + MessageLookupByLibrary.simpleMessage("Результаты не найдены"), + "openNavigationTooltip": + MessageLookupByLibrary.simpleMessage("Открыть панель навигации"), + "pasteActionLabel": MessageLookupByLibrary.simpleMessage("Вставить"), + "pasteActionTooltip": MessageLookupByLibrary.simpleMessage( + "Вставить содержимое буфера обмена"), + "restoreWindowTooltip": + MessageLookupByLibrary.simpleMessage("Восстановить"), + "scrollTabBackwardLabel": + MessageLookupByLibrary.simpleMessage("Прокрутить назад"), + "scrollTabForwardLabel": + MessageLookupByLibrary.simpleMessage("Прокрутить вперед"), + "searchLabel": MessageLookupByLibrary.simpleMessage("Поиск"), + "selectAllActionLabel": + MessageLookupByLibrary.simpleMessage("Выбрать все"), + "selectAllActionTooltip": + MessageLookupByLibrary.simpleMessage("Выбрать все") + }; +} diff --git a/dependencies/fluent_ui-3.12.0/lib/generated/intl/messages_zh.dart b/dependencies/fluent_ui-3.12.0/lib/generated/intl/messages_zh.dart new file mode 100644 index 0000000..935debb --- /dev/null +++ b/dependencies/fluent_ui-3.12.0/lib/generated/intl/messages_zh.dart @@ -0,0 +1,55 @@ +// DO NOT EDIT. This is code generated via package:intl/generate_localized.dart +// This is a library that provides messages for a zh locale. All the +// messages from the main program should be duplicated here with the same +// function name. + +// Ignore issues from commonly used lints in this file. +// ignore_for_file:unnecessary_brace_in_string_interps, unnecessary_new +// ignore_for_file:prefer_single_quotes,comment_references, directives_ordering +// ignore_for_file:annotate_overrides,prefer_generic_function_type_aliases +// ignore_for_file:unused_import, file_names, avoid_escaping_inner_quotes +// ignore_for_file:unnecessary_string_interpolations, unnecessary_string_escapes + +import 'package:intl/intl.dart'; +import 'package:intl/message_lookup_by_library.dart'; + +final messages = new MessageLookup(); + +typedef String MessageIfAbsent(String messageStr, List args); + +class MessageLookup extends MessageLookupByLibrary { + String get localeName => 'zh'; + + final messages = _notInlinedMessages(_notInlinedMessages); + static Map _notInlinedMessages(_) => { + "backButtonTooltip": MessageLookupByLibrary.simpleMessage("返回"), + "clickToSearch": MessageLookupByLibrary.simpleMessage("点击搜索"), + "closeButtonLabel": MessageLookupByLibrary.simpleMessage("关闭"), + "closeNavigationTooltip": MessageLookupByLibrary.simpleMessage("关闭导航"), + "closeTabLabelSuffix": MessageLookupByLibrary.simpleMessage("关闭标签"), + "closeWindowTooltip": MessageLookupByLibrary.simpleMessage("关闭"), + "copyActionLabel": MessageLookupByLibrary.simpleMessage("复制"), + "copyActionTooltip": + MessageLookupByLibrary.simpleMessage("将选中的内容复制到剪贴板"), + "cutActionLabel": MessageLookupByLibrary.simpleMessage("剪切"), + "cutActionTooltip": + MessageLookupByLibrary.simpleMessage("将选中的内容剪切到剪贴板"), + "dialogLabel": MessageLookupByLibrary.simpleMessage("对话"), + "minimizeWindowTooltip": MessageLookupByLibrary.simpleMessage("最小化"), + "modalBarrierDismissLabel": MessageLookupByLibrary.simpleMessage("取消"), + "newTabLabel": MessageLookupByLibrary.simpleMessage("添加新标签"), + "noResultsFoundLabel": MessageLookupByLibrary.simpleMessage("没有找到结果"), + "openNavigationTooltip": MessageLookupByLibrary.simpleMessage("打开导航"), + "pasteActionLabel": MessageLookupByLibrary.simpleMessage("粘贴"), + "pasteActionTooltip": + MessageLookupByLibrary.simpleMessage("在当前位置插入剪贴板的内容"), + "restoreWindowTooltip": MessageLookupByLibrary.simpleMessage("恢复"), + "scrollTabBackwardLabel": + MessageLookupByLibrary.simpleMessage("向后滚动标签列表"), + "scrollTabForwardLabel": + MessageLookupByLibrary.simpleMessage("向前滚动标签列表"), + "searchLabel": MessageLookupByLibrary.simpleMessage("搜索"), + "selectAllActionLabel": MessageLookupByLibrary.simpleMessage("全选"), + "selectAllActionTooltip": MessageLookupByLibrary.simpleMessage("选择所有内容") + }; +} diff --git a/dependencies/fluent_ui-3.12.0/lib/generated/l10n.dart b/dependencies/fluent_ui-3.12.0/lib/generated/l10n.dart new file mode 100644 index 0000000..5507c49 --- /dev/null +++ b/dependencies/fluent_ui-3.12.0/lib/generated/l10n.dart @@ -0,0 +1,326 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND +import 'package:flutter/material.dart'; +import 'package:intl/intl.dart'; +import 'intl/messages_all.dart'; + +// ************************************************************************** +// Generator: Flutter Intl IDE plugin +// Made by Localizely +// ************************************************************************** + +// ignore_for_file: non_constant_identifier_names, lines_longer_than_80_chars +// ignore_for_file: join_return_with_assignment, prefer_final_in_for_each +// ignore_for_file: avoid_redundant_argument_values, avoid_escaping_inner_quotes + +class S { + S(); + + static S? _current; + + static S get current { + assert(_current != null, + 'No instance of S was loaded. Try to initialize the S delegate before accessing S.current.'); + return _current!; + } + + static const AppLocalizationDelegate delegate = AppLocalizationDelegate(); + + static Future load(Locale locale) { + final name = (locale.countryCode?.isEmpty ?? false) + ? locale.languageCode + : locale.toString(); + final localeName = Intl.canonicalizedLocale(name); + return initializeMessages(localeName).then((_) { + Intl.defaultLocale = localeName; + final instance = S(); + S._current = instance; + + return instance; + }); + } + + static S of(BuildContext context) { + final instance = S.maybeOf(context); + assert(instance != null, + 'No instance of S present in the widget tree. Did you add S.delegate in localizationsDelegates?'); + return instance!; + } + + static S? maybeOf(BuildContext context) { + return Localizations.of(context, S); + } + + /// `Back` + String get backButtonTooltip { + return Intl.message( + 'Back', + name: 'backButtonTooltip', + desc: '', + args: [], + ); + } + + /// `Close` + String get closeButtonLabel { + return Intl.message( + 'Close', + name: 'closeButtonLabel', + desc: '', + args: [], + ); + } + + /// `Search` + String get searchLabel { + return Intl.message( + 'Search', + name: 'searchLabel', + desc: '', + args: [], + ); + } + + /// `Close Navigation` + String get closeNavigationTooltip { + return Intl.message( + 'Close Navigation', + name: 'closeNavigationTooltip', + desc: '', + args: [], + ); + } + + /// `Open Navigation` + String get openNavigationTooltip { + return Intl.message( + 'Open Navigation', + name: 'openNavigationTooltip', + desc: '', + args: [], + ); + } + + /// `Click to search` + String get clickToSearch { + return Intl.message( + 'Click to search', + name: 'clickToSearch', + desc: '', + args: [], + ); + } + + /// `Dismiss` + String get modalBarrierDismissLabel { + return Intl.message( + 'Dismiss', + name: 'modalBarrierDismissLabel', + desc: '', + args: [], + ); + } + + /// `Minimize` + String get minimizeWindowTooltip { + return Intl.message( + 'Minimize', + name: 'minimizeWindowTooltip', + desc: '', + args: [], + ); + } + + /// `Restore` + String get restoreWindowTooltip { + return Intl.message( + 'Restore', + name: 'restoreWindowTooltip', + desc: '', + args: [], + ); + } + + /// `Close` + String get closeWindowTooltip { + return Intl.message( + 'Close', + name: 'closeWindowTooltip', + desc: '', + args: [], + ); + } + + /// `Dialog` + String get dialogLabel { + return Intl.message( + 'Dialog', + name: 'dialogLabel', + desc: '', + args: [], + ); + } + + /// `Cut` + String get cutActionLabel { + return Intl.message( + 'Cut', + name: 'cutActionLabel', + desc: '', + args: [], + ); + } + + /// `Copy` + String get copyActionLabel { + return Intl.message( + 'Copy', + name: 'copyActionLabel', + desc: '', + args: [], + ); + } + + /// `Paste` + String get pasteActionLabel { + return Intl.message( + 'Paste', + name: 'pasteActionLabel', + desc: '', + args: [], + ); + } + + /// `Select all` + String get selectAllActionLabel { + return Intl.message( + 'Select all', + name: 'selectAllActionLabel', + desc: '', + args: [], + ); + } + + /// `Add new tab` + String get newTabLabel { + return Intl.message( + 'Add new tab', + name: 'newTabLabel', + desc: '', + args: [], + ); + } + + /// `Close tab` + String get closeTabLabelSuffix { + return Intl.message( + 'Close tab', + name: 'closeTabLabelSuffix', + desc: '', + args: [], + ); + } + + /// `Scroll tab list backward` + String get scrollTabBackwardLabel { + return Intl.message( + 'Scroll tab list backward', + name: 'scrollTabBackwardLabel', + desc: '', + args: [], + ); + } + + /// `Scroll tab list forward` + String get scrollTabForwardLabel { + return Intl.message( + 'Scroll tab list forward', + name: 'scrollTabForwardLabel', + desc: '', + args: [], + ); + } + + /// `No results found` + String get noResultsFoundLabel { + return Intl.message( + 'No results found', + name: 'noResultsFoundLabel', + desc: '', + args: [], + ); + } + + /// `Copy the selected content to the clipboard` + String get copyActionTooltip { + return Intl.message( + 'Copy the selected content to the clipboard', + name: 'copyActionTooltip', + desc: '', + args: [], + ); + } + + /// `Remove the selected content and put it in the clipboard` + String get cutActionTooltip { + return Intl.message( + 'Remove the selected content and put it in the clipboard', + name: 'cutActionTooltip', + desc: '', + args: [], + ); + } + + /// `Inserts the contents of the clipboard at the current location` + String get pasteActionTooltip { + return Intl.message( + 'Inserts the contents of the clipboard at the current location', + name: 'pasteActionTooltip', + desc: '', + args: [], + ); + } + + /// `Select all content` + String get selectAllActionTooltip { + return Intl.message( + 'Select all content', + name: 'selectAllActionTooltip', + desc: '', + args: [], + ); + } +} + +class AppLocalizationDelegate extends LocalizationsDelegate { + const AppLocalizationDelegate(); + + List get supportedLocales { + return const [ + Locale.fromSubtags(languageCode: 'en'), + Locale.fromSubtags(languageCode: 'ar'), + Locale.fromSubtags(languageCode: 'de'), + Locale.fromSubtags(languageCode: 'es'), + Locale.fromSubtags(languageCode: 'fr'), + Locale.fromSubtags(languageCode: 'hi'), + Locale.fromSubtags(languageCode: 'pt'), + Locale.fromSubtags(languageCode: 'ru'), + Locale.fromSubtags(languageCode: 'zh'), + ]; + } + + @override + bool isSupported(Locale locale) => _isSupported(locale); + @override + Future load(Locale locale) => S.load(locale); + @override + bool shouldReload(AppLocalizationDelegate old) => false; + + bool _isSupported(Locale locale) { + for (var supportedLocale in supportedLocales) { + if (supportedLocale.languageCode == locale.languageCode) { + return true; + } + } + return false; + } +} diff --git a/dependencies/fluent_ui-3.12.0/lib/l10n/README.md b/dependencies/fluent_ui-3.12.0/lib/l10n/README.md new file mode 100644 index 0000000..c9c940a --- /dev/null +++ b/dependencies/fluent_ui-3.12.0/lib/l10n/README.md @@ -0,0 +1 @@ +Every `.arb` localization must have a corresponding entry in `localization.dart:defaultSupportedLocales` list. \ No newline at end of file diff --git a/dependencies/fluent_ui-3.12.0/lib/l10n/intl_ar.arb b/dependencies/fluent_ui-3.12.0/lib/l10n/intl_ar.arb new file mode 100644 index 0000000..b89950b --- /dev/null +++ b/dependencies/fluent_ui-3.12.0/lib/l10n/intl_ar.arb @@ -0,0 +1,28 @@ +{ + "@@locale": "ar", + "backButtonTooltip": "رجوع", + "closeButtonLabel": "إغلاق", + "searchLabel": "بحث", + "closeNavigationTooltip": "إغلاق الواجهة", + "openNavigationTooltip": "فتح الواجهة", + "clickToSearch": "انقر للبحث", + "modalBarrierDismissLabel": "استبعاد", + "minimizeWindowTooltip": "تصغير", + "restoreWindowTooltip": "إسترجاع", + "closeWindowTooltip": "إغلاق", + "dialogLabel": "مربع حوار", + "cutActionLabel": "قص", + "copyActionLabel": "نسخ", + "pasteActionLabel": "لصق", + "selectAllActionLabel": "تحديد الكل", + "newTabLabel": "إضافة علامة تبويب جديدة", + "closeTabLabelSuffix": "إغلاق علامة التبويب", + "scrollTabBackwardLabel": "تمرير قائمة علامة التبويب للخلف", + "scrollTabForwardLabel": "تمرير قائمة علامة التبويب إلى الأمام", + "noResultsFoundLabel": "لم يتم العثور على نتائج", + "copyActionTooltip": "انسخ المحتوى المحدد إلى الحافظة", + "cutActionTooltip": "قم بإزالة المحتوى المحدد وضعه في الحافظة", + "pasteActionTooltip": "إدراج محتويات الحافظة إلى الموقع الحالي", + "selectAllActionTooltip": "تحديد المحتوى بالكامل" +} + diff --git a/dependencies/fluent_ui-3.12.0/lib/l10n/intl_de.arb b/dependencies/fluent_ui-3.12.0/lib/l10n/intl_de.arb new file mode 100644 index 0000000..822233c --- /dev/null +++ b/dependencies/fluent_ui-3.12.0/lib/l10n/intl_de.arb @@ -0,0 +1,27 @@ +{ + "@@locale": "de", + "backButtonTooltip": "Zurück", + "closeButtonLabel": "Schließen", + "searchLabel": "Suchen", + "closeNavigationTooltip": "Navigation schließen", + "openNavigationTooltip": "Navigation öffnen", + "clickToSearch": "Zum Suchen klicken", + "modalBarrierDismissLabel": "Schließen", + "minimizeWindowTooltip": "Minimieren", + "restoreWindowTooltip": "Wiederherstellen", + "closeWindowTooltip": "Schließen", + "dialogLabel": "Dialog", + "cutActionLabel": "Ausschneiden", + "copyActionLabel": "Kopieren", + "pasteActionLabel": "Einfügen", + "selectAllActionLabel": "Alles auswählen", + "newTabLabel": "Neuen Tab hinzufügen", + "closeTabLabelSuffix": "Tab schließen", + "scrollTabBackwardLabel": "Tab-Liste rückwärts scrollen", + "scrollTabForwardLabel": "Tabliste vorwärts scrollen", + "noResultsFoundLabel": "Keine Ergebnisse gefunden", + "copyActionTooltip": "Ausgewählten Inhalt in die Zwischenablage kopieren", + "cutActionTooltip": "Ausgewählten Inhalt entfernen und in die Zwischenablage legen", + "pasteActionTooltip": "Fügt den Inhalt der Zwischenablage an der aktuellen Stelle ein", + "selectAllActionTooltip": "Alle Inhalte auswählen" +} \ No newline at end of file diff --git a/dependencies/fluent_ui-3.12.0/lib/l10n/intl_en.arb b/dependencies/fluent_ui-3.12.0/lib/l10n/intl_en.arb new file mode 100644 index 0000000..d385aae --- /dev/null +++ b/dependencies/fluent_ui-3.12.0/lib/l10n/intl_en.arb @@ -0,0 +1,27 @@ +{ + "@@locale": "en", + "backButtonTooltip": "Back", + "closeButtonLabel": "Close", + "searchLabel": "Search", + "closeNavigationTooltip": "Close Navigation", + "openNavigationTooltip": "Open Navigation", + "clickToSearch": "Click to search", + "modalBarrierDismissLabel": "Dismiss", + "minimizeWindowTooltip": "Minimize", + "restoreWindowTooltip": "Restore", + "closeWindowTooltip": "Close", + "dialogLabel": "Dialog", + "cutActionLabel": "Cut", + "copyActionLabel": "Copy", + "pasteActionLabel": "Paste", + "selectAllActionLabel": "Select all", + "newTabLabel": "Add new tab", + "closeTabLabelSuffix": "Close tab", + "scrollTabBackwardLabel": "Scroll tab list backward", + "scrollTabForwardLabel": "Scroll tab list forward", + "noResultsFoundLabel": "No results found", + "copyActionTooltip": "Copy the selected content to the clipboard", + "cutActionTooltip": "Remove the selected content and put it in the clipboard", + "pasteActionTooltip": "Inserts the contents of the clipboard at the current location", + "selectAllActionTooltip": "Select all content" +} diff --git a/dependencies/fluent_ui-3.12.0/lib/l10n/intl_es.arb b/dependencies/fluent_ui-3.12.0/lib/l10n/intl_es.arb new file mode 100644 index 0000000..bc48ce9 --- /dev/null +++ b/dependencies/fluent_ui-3.12.0/lib/l10n/intl_es.arb @@ -0,0 +1,27 @@ +{ + "@@locale": "es", + "backButtonTooltip": "Volver", + "closeButtonLabel": "Cerrar", + "searchLabel": "Buscar", + "closeNavigationTooltip": "Cerrar Navegador", + "openNavigationTooltip": "Abrir Navegador", + "clickToSearch": "Haz clic para buscar", + "modalBarrierDismissLabel": "Cancelar", + "minimizeWindowTooltip": "Minimizar", + "restoreWindowTooltip": "Restaurar", + "closeWindowTooltip": "Cerrar", + "dialogLabel": "Diálogo", + "cutActionLabel": "Cortar", + "copyActionLabel": "Copiar", + "pasteActionLabel": "Pegar", + "selectAllActionLabel": "Seleccionar todo", + "newTabLabel": "Añadir nueva pestaña", + "closeTabLabelSuffix": "Cerrar pestaña", + "scrollTabBackwardLabel": "Hacer scroll hacia atrás", + "scrollTabForwardLabel": "Hacer scroll hacia delante", + "noResultsFoundLabel": "No se encontraron resultados", + "copyActionTooltip": "Copiar el contenido seleccionado al portapapeles", + "cutActionTooltip": "Cortar el contenido seleccionado y ponerlo en el portapapeles", + "pasteActionTooltip": "Insertar el contenido del portapapeles en la posición actual", + "selectAllActionTooltip": "Seleccionar todo el contenido" +} diff --git a/dependencies/fluent_ui-3.12.0/lib/l10n/intl_fr.arb b/dependencies/fluent_ui-3.12.0/lib/l10n/intl_fr.arb new file mode 100644 index 0000000..1ad601b --- /dev/null +++ b/dependencies/fluent_ui-3.12.0/lib/l10n/intl_fr.arb @@ -0,0 +1,27 @@ +{ + "@@locale": "fr", + "backButtonTooltip": "Retour", + "closeButtonLabel": "Fermer", + "searchLabel": "Rechercher", + "closeNavigationTooltip": "Fermer le navigateur", + "openNavigationTooltip": "Ouvrir le navigateur", + "clickToSearch": "Cliquez pour rechercher", + "modalBarrierDismissLabel": "Annuler", + "minimizeWindowTooltip": "Réduire", + "restoreWindowTooltip": "Restaurer", + "closeWindowTooltip": "Fermer", + "dialogLabel": "Dialogue", + "cutActionLabel": "Couper", + "copyActionLabel": "Copier", + "pasteActionLabel": "Coller", + "selectAllActionLabel": "Tout sélectionner", + "newTabLabel": "Ajouter un nouvel onglet", + "closeTabLabelSuffix": "Fermer l'onglet", + "scrollTabBackwardLabel": "Défiler vers l'arrière", + "scrollTabForwardLabel": "Défiler vers l'avant", + "noResultsFoundLabel": "Aucun résultat trouvé", + "copyActionTooltip": "Copier le contenu sélectionné dans le presse-papier", + "cutActionTooltip": "Couper le contenu sélectionné et le mettre dans le presse-papier", + "pasteActionTooltip": "Coller le contenu du presse-papier à la position actuelle", + "selectAllActionTooltip": "Sélectionner tout le contenu" +} \ No newline at end of file diff --git a/dependencies/fluent_ui-3.12.0/lib/l10n/intl_hi.arb b/dependencies/fluent_ui-3.12.0/lib/l10n/intl_hi.arb new file mode 100644 index 0000000..f12cc49 --- /dev/null +++ b/dependencies/fluent_ui-3.12.0/lib/l10n/intl_hi.arb @@ -0,0 +1,27 @@ +{ + "@@locale": "hi", + "backButtonTooltip": "वापस", + "closeButtonLabel": "बंद करें", + "searchLabel": "खोजें", + "closeNavigationTooltip": "नेविगेशन बंद करें", + "openNavigationTooltip": "नेविगेशन खोलें", + "clickToSearch": "खोजने के लिए क्लिक करें", + "modalBarrierDismissLabel": "हटाएँ", + "minimizeWindowTooltip": "मिनीमाइज करें", + "restoreWindowTooltip": "वापिस लाएं", + "closeWindowTooltip": "बंद करें", + "dialogLabel": "डायलॉग", + "cutActionLabel": "कट", + "copyActionLabel": "कॉपी", + "pasteActionLabel": "पेस्ट", + "selectAllActionLabel": "सब-कुछ सेलेक्ट करें", + "newTabLabel": "नया टैब ऐड करें", + "closeTabLabelSuffix": "टैब बंद करें", + "scrollTabBackwardLabel": "टैब लिस्ट पीछे स्क्रॉल करें", + "scrollTabForwardLabel": "टैब लिस्ट आगे स्क्रॉल करें", + "noResultsFoundLabel": "कोई रिजल्ट नहीं मिला", + "copyActionTooltip": "सेलेक्टेड कंटेंट क्लिपबोर्ड पर कॉपी करें", + "cutActionTooltip": "सिलेक्टेड कंटेंट यहाँ से हटा कर क्लिपबोर्ड पर कॉपी करें", + "pasteActionTooltip": "क्लिपबोर्ड का कंटेंट इस लोकेशन पर पेस्ट करें", + "selectAllActionTooltip": "सारा कंटेंट सेलेक्ट करें" +} \ No newline at end of file diff --git a/dependencies/fluent_ui-3.12.0/lib/l10n/intl_pt.arb b/dependencies/fluent_ui-3.12.0/lib/l10n/intl_pt.arb new file mode 100644 index 0000000..e3d7b8a --- /dev/null +++ b/dependencies/fluent_ui-3.12.0/lib/l10n/intl_pt.arb @@ -0,0 +1,27 @@ +{ + "@@locale": "pt", + "backButtonTooltip": "Voltar", + "closeButtonLabel": "Fechar", + "searchLabel": "Pesquisar", + "closeNavigationTooltip": "Fechar navegação", + "openNavigationTooltip": "Abrir navegação", + "clickToSearch": "Clique para pesquisar", + "modalBarrierDismissLabel": "Cancelar", + "minimizeWindowTooltip": "Minimizar", + "restoreWindowTooltip": "Restaurar", + "closeWindowTooltip": "Fechar", + "dialogLabel": "Caixa de diálogo", + "cutActionLabel": "Cortar", + "copyActionLabel": "Copiar", + "pasteActionLabel": "Colar", + "selectAllActionLabel": "Selecionar tudo", + "newTabLabel": "Adicionar nova guia", + "closeTabLabelSuffix": "Fechar guia", + "scrollTabBackwardLabel": "Rolar para trás", + "scrollTabForwardLabel": "Rolar para frente", + "noResultsFoundLabel": "Nenhum resultado encontrado", + "copyActionTooltip": "Copiar conteúdo selecionado para a área de transferência", + "cutActionTooltip": "Recortar o conteúdo selecionado e colocá-lo na área de transferência", + "pasteActionTooltip": "Colar o conteúdo da área de transferência na posição atual", + "selectAllActionTooltip": "Selecionar tudo" +} \ No newline at end of file diff --git a/dependencies/fluent_ui-3.12.0/lib/l10n/intl_ru.arb b/dependencies/fluent_ui-3.12.0/lib/l10n/intl_ru.arb new file mode 100644 index 0000000..b8d7b8a --- /dev/null +++ b/dependencies/fluent_ui-3.12.0/lib/l10n/intl_ru.arb @@ -0,0 +1,27 @@ +{ + "@@locale": "ru", + "backButtonTooltip": "Назад", + "closeButtonLabel": "Закрыть", + "searchLabel": "Поиск", + "closeNavigationTooltip": "Закрыть панель навигации", + "openNavigationTooltip": "Открыть панель навигации", + "clickToSearch": "Нажмите для поиска", + "modalBarrierDismissLabel": "Отмена", + "minimizeWindowTooltip": "Свернуть", + "restoreWindowTooltip": "Восстановить", + "closeWindowTooltip": "Закрыть", + "dialogLabel": "Диалог", + "cutActionLabel": "Вырезать", + "copyActionLabel": "Копировать", + "pasteActionLabel": "Вставить", + "selectAllActionLabel": "Выбрать все", + "newTabLabel": "Новая вкладка", + "closeTabLabelSuffix": "Закрыть вкладку", + "scrollTabBackwardLabel": "Прокрутить назад", + "scrollTabForwardLabel": "Прокрутить вперед", + "noResultsFoundLabel": "Результаты не найдены", + "copyActionTooltip": "Скопировать в буфер обмена", + "cutActionTooltip": "Вырезать и поместить в буфер обмена", + "pasteActionTooltip": "Вставить содержимое буфера обмена", + "selectAllActionTooltip": "Выбрать все" +} \ No newline at end of file diff --git a/dependencies/fluent_ui-3.12.0/lib/l10n/intl_zh.arb b/dependencies/fluent_ui-3.12.0/lib/l10n/intl_zh.arb new file mode 100644 index 0000000..314988d --- /dev/null +++ b/dependencies/fluent_ui-3.12.0/lib/l10n/intl_zh.arb @@ -0,0 +1,27 @@ +{ + "@@locale": "zh", + "backButtonTooltip": "返回", + "closeButtonLabel": "关闭", + "searchLabel": "搜索", + "closeNavigationTooltip": "关闭导航", + "openNavigationTooltip": "打开导航", + "clickToSearch": "点击搜索", + "modalBarrierDismissLabel": "取消", + "minimizeWindowTooltip": "最小化", + "restoreWindowTooltip": "恢复", + "closeWindowTooltip": "关闭", + "dialogLabel": "对话", + "cutActionLabel": "剪切", + "copyActionLabel": "复制", + "pasteActionLabel": "粘贴", + "selectAllActionLabel": "全选", + "newTabLabel": "添加新标签", + "closeTabLabelSuffix": "关闭标签", + "scrollTabBackwardLabel": "向后滚动标签列表", + "scrollTabForwardLabel": "向前滚动标签列表", + "noResultsFoundLabel": "没有找到结果", + "copyActionTooltip": "将选中的内容复制到剪贴板", + "cutActionTooltip": "将选中的内容剪切到剪贴板", + "pasteActionTooltip": "在当前位置插入剪贴板的内容", + "selectAllActionTooltip": "选择所有内容" +} \ No newline at end of file diff --git a/dependencies/fluent_ui-3.12.0/lib/src/app.dart b/dependencies/fluent_ui-3.12.0/lib/src/app.dart new file mode 100644 index 0000000..f60f5bf --- /dev/null +++ b/dependencies/fluent_ui-3.12.0/lib/src/app.dart @@ -0,0 +1,555 @@ +import 'package:fluent_ui/fluent_ui.dart'; +import 'package:flutter/material.dart' as m; +import 'package:flutter_localizations/flutter_localizations.dart'; + +/// An application that uses fluent design. +/// +/// A convenience widget that wraps a number of widgets that are commonly +/// required for fluent design applications. +/// +/// The [FluentApp] configures the top-level [Navigator] to search for routes +/// in the following order: +/// +/// 1. For the `/` route, the [home] property, if non-null, is used. +/// +/// 2. Otherwise, the [routes] table is used, if it has an entry for the route. +/// +/// 3. Otherwise, [onGenerateRoute] is called, if provided. It should return a +/// non-null value for any _valid_ route not handled by [home] and [routes]. +/// +/// 4. Finally if all else fails [onUnknownRoute] is called. +/// +/// If a [Navigator] is created, at least one of these options must handle the +/// `/` route, since it is used when an invalid [initialRoute] is specified on +/// startup (e.g. by another application launching this one with an intent on +/// Android; see [dart:ui.PlatformDispatcher.defaultRouteName]). +/// +/// This widget also configures the observer of the top-level [Navigator] (if +/// any) to perform [Hero] animations. +/// +/// If [home], [routes], [onGenerateRoute], and [onUnknownRoute] are all null, +/// and [builder] is not null, then no [Navigator] is created. +class FluentApp extends StatefulWidget { + /// Creates a FluentApp. + /// + /// At least one of [home], [routes], [onGenerateRoute], or [builder] must be + /// non-null. If only [routes] is given, it must include an entry for the + /// [Navigator.defaultRouteName] (`/`), since that is the route used when the + /// application is launched with an intent that specifies an otherwise + /// unsupported route. + /// + /// This class creates an instance of [WidgetsApp]. + /// + /// The boolean arguments, [routes], and [navigatorObservers], must not be null. + const FluentApp({ + Key? key, + this.navigatorKey, + this.onGenerateRoute, + this.onGenerateInitialRoutes, + this.onUnknownRoute, + this.navigatorObservers = const [], + this.initialRoute, + this.home, + this.routes = const {}, + this.builder, + this.title = '', + this.onGenerateTitle, + this.color, + this.locale, + this.localizationsDelegates, + this.localeListResolutionCallback, + this.localeResolutionCallback, + this.supportedLocales = defaultSupportedLocales, + this.showPerformanceOverlay = false, + this.checkerboardRasterCacheImages = false, + this.checkerboardOffscreenLayers = false, + this.showSemanticsDebugger = false, + this.debugShowCheckedModeBanner = true, + this.shortcuts, + this.actions, + this.theme, + this.darkTheme, + this.themeMode, + this.restorationScopeId, + this.scrollBehavior = const FluentScrollBehavior(), + this.useInheritedMediaQuery = false, + }) : routeInformationProvider = null, + routeInformationParser = null, + routerDelegate = null, + backButtonDispatcher = null, + super(key: key); + + /// Creates a [FluentApp] that uses the [Router] instead of a [Navigator]. + FluentApp.router({ + Key? key, + this.theme, + this.darkTheme, + this.themeMode, + this.routeInformationProvider, + required this.routeInformationParser, + required this.routerDelegate, + BackButtonDispatcher? backButtonDispatcher, + this.builder, + this.title = '', + this.onGenerateTitle, + required Color this.color, + this.locale, + this.localizationsDelegates, + this.localeListResolutionCallback, + this.localeResolutionCallback, + this.supportedLocales = defaultSupportedLocales, + this.showPerformanceOverlay = false, + this.checkerboardRasterCacheImages = false, + this.checkerboardOffscreenLayers = false, + this.showSemanticsDebugger = false, + this.debugShowCheckedModeBanner = true, + this.shortcuts, + this.actions, + this.restorationScopeId, + this.scrollBehavior = const FluentScrollBehavior(), + this.useInheritedMediaQuery = false, + }) : assert(routeInformationParser != null && routerDelegate != null, + 'The routeInformationParser and routerDelegate cannot be null.'), + assert(supportedLocales.isNotEmpty), + navigatorObservers = null, + backButtonDispatcher = + backButtonDispatcher ?? RootBackButtonDispatcher(), + navigatorKey = null, + onGenerateRoute = null, + home = null, + onGenerateInitialRoutes = null, + onUnknownRoute = null, + routes = null, + initialRoute = null, + super(key: key); + + /// Default visual properties, like colors fonts and shapes, for this app's + /// fluent widgets. + /// + /// A second [darkTheme] [ThemeData] value, which is used to provide a dark + /// version of the user interface can also be specified. [themeMode] will + /// control which theme will be used if a [darkTheme] is provided. + /// + /// The default value of this property is the value of `ThemeData(brightness: Brightness.light)`. + final ThemeData? theme; + + /// The [ThemeData] to use when a 'dark mode' is requested by the system. + /// + /// Some host platforms allow the users to select a system-wide 'dark mode', + /// or the application may want to offer the user the ability to choose a + /// dark theme just for this application. This is theme that will be used for + /// such cases. [themeMode] will control which theme will be used. + /// + /// This theme should have a [ThemeData.brightness] set to [Brightness.dark]. + /// + /// Uses [theme] instead when null. Defaults to the value of + /// [ThemeData(brightness: Brightness.light)] when both [darkTheme] and [theme] are null. + final ThemeData? darkTheme; + + /// Determines which theme will be used by the application if both [theme] + /// and [darkTheme] are provided. + /// + /// If set to [ThemeMode.system], the choice of which theme to use will + /// be based on the user's system preferences. If the [MediaQuery.platformBrightnessOf] + /// is [Brightness.light], [theme] will be used. If it is [Brightness.dark], + /// [darkTheme] will be used (unless it is null, in which case [theme] + /// will be used. + /// + /// If set to [ThemeMode.light] the [theme] will always be used, + /// regardless of the user's system preference. + /// + /// If set to [ThemeMode.dark] the [darkTheme] will be used + /// regardless of the user's system preference. If [darkTheme] is null + /// then it will fallback to using [theme]. + /// + /// The default value is [ThemeMode.system]. + final ThemeMode? themeMode; + + /// {@macro flutter.widgets.widgetsApp.navigatorKey} + final GlobalKey? navigatorKey; + + /// {@macro flutter.widgets.widgetsApp.home} + final Widget? home; + + /// The application's top-level routing table. + /// + /// When a named route is pushed with [Navigator.pushNamed], the route name is + /// looked up in this map. If the name is present, the associated + /// [WidgetBuilder] is used to construct a [FluentPageRoute] that performs + /// an appropriate transition, including [Hero] animations, to the new route. + /// + /// {@macro flutter.widgets.widgetsApp.routes} + final Map? routes; + + /// {@macro flutter.widgets.widgetsApp.initialRoute} + final String? initialRoute; + + /// {@macro flutter.widgets.widgetsApp.onGenerateRoute} + final RouteFactory? onGenerateRoute; + + /// {@macro flutter.widgets.widgetsApp.onGenerateInitialRoutes} + final InitialRouteListFactory? onGenerateInitialRoutes; + + /// {@macro flutter.widgets.widgetsApp.onUnknownRoute} + final RouteFactory? onUnknownRoute; + + /// {@macro flutter.widgets.widgetsApp.navigatorObservers} + final List? navigatorObservers; + + /// {@macro flutter.widgets.widgetsApp.routeInformationProvider} + final RouteInformationProvider? routeInformationProvider; + + /// {@macro flutter.widgets.widgetsApp.routeInformationParser} + final RouteInformationParser? routeInformationParser; + + /// {@macro flutter.widgets.widgetsApp.routerDelegate} + final RouterDelegate? routerDelegate; + + /// {@macro flutter.widgets.widgetsApp.backButtonDispatcher} + final BackButtonDispatcher? backButtonDispatcher; + + /// {@macro flutter.widgets.widgetsApp.builder} + /// + /// Fluent specific features such as [showDialog] and [showMenu], and widgets + /// such as [Tooltip], [PopupMenuButton], also require a [Navigator] to properly + /// function. + final TransitionBuilder? builder; + + /// {@macro flutter.widgets.widgetsApp.title} + /// + /// This value is passed unmodified to [WidgetsApp.title]. + final String title; + + /// {@macro flutter.widgets.widgetsApp.onGenerateTitle} + /// + /// This value is passed unmodified to [WidgetsApp.onGenerateTitle]. + final GenerateAppTitle? onGenerateTitle; + + /// {@macro flutter.widgets.widgetsApp.color} + final Color? color; + + /// {@macro flutter.widgets.widgetsApp.locale} + final Locale? locale; + + /// {@macro flutter.widgets.widgetsApp.localizationsDelegates} + final Iterable>? localizationsDelegates; + + /// {@macro flutter.widgets.widgetsApp.localeListResolutionCallback} + /// + /// This callback is passed along to the [WidgetsApp] built by this widget. + final LocaleListResolutionCallback? localeListResolutionCallback; + + /// {@macro flutter.widgets.LocaleResolutionCallback} + /// + /// This callback is passed along to the [WidgetsApp] built by this widget. + final LocaleResolutionCallback? localeResolutionCallback; + + /// {@macro flutter.widgets.widgetsApp.supportedLocales} + /// + /// It is passed along unmodified to the [WidgetsApp] built by this widget. + final Iterable supportedLocales; + + /// Turns on a performance overlay. + /// + /// See also: + /// + /// * + final bool showPerformanceOverlay; + + /// Turns on checkerboarding of raster cache images. + final bool checkerboardRasterCacheImages; + + /// Turns on checkerboarding of layers rendered to offscreen bitmaps. + final bool checkerboardOffscreenLayers; + + /// Turns on an overlay that shows the accessibility information + /// reported by the framework. + final bool showSemanticsDebugger; + + /// {@macro flutter.widgets.widgetsApp.debugShowCheckedModeBanner} + final bool debugShowCheckedModeBanner; + + /// {@macro flutter.widgets.widgetsApp.shortcuts} + /// {@tool snippet} + /// This example shows how to add a single shortcut for + /// [LogicalKeyboardKey.select] to the default shortcuts without needing to + /// add your own [Shortcuts] widget. + /// + /// Alternatively, you could insert a [Shortcuts] widget with just the mapping + /// you want to add between the [FluentApp] and its child and get the same + /// effect. + /// + /// ```dart + /// Widget build(BuildContext context) { + /// return FluentApp( + /// shortcuts: { + /// ...WidgetsApp.defaultShortcuts, + /// LogicalKeySet(LogicalKeyboardKey.select): const ActivateIntent(), + /// }, + /// color: const Color(0xFFFF0000), + /// builder: (BuildContext context, Widget? child) { + /// return const Placeholder(); + /// }, + /// ); + /// } + /// ``` + /// {@end-tool} + /// {@macro flutter.widgets.widgetsApp.shortcuts.seeAlso} + final Map? shortcuts; + + /// {@macro flutter.widgets.widgetsApp.actions} + /// {@tool snippet} + /// This example shows how to add a single action handling an + /// [ActivateAction] to the default actions without needing to + /// add your own [Actions] widget. + /// + /// Alternatively, you could insert a [Actions] widget with just the mapping + /// you want to add between the [FluentApp] and its child and get the same + /// effect. + /// + /// ```dart + /// Widget build(BuildContext context) { + /// return FluentApp( + /// actions: >{ + /// ... WidgetsApp.defaultActions, + /// ActivateAction: CallbackAction( + /// onInvoke: (Intent intent) { + /// // Do something here... + /// return null; + /// }, + /// ), + /// }, + /// color: const Color(0xFFFF0000), + /// builder: (BuildContext context, Widget? child) { + /// return const Placeholder(); + /// }, + /// ); + /// } + /// ``` + /// {@end-tool} + /// {@macro flutter.widgets.widgetsApp.actions.seeAlso} + final Map>? actions; + + /// {@macro flutter.widgets.widgetsApp.restorationScopeId} + final String? restorationScopeId; + + /// {@macro flutter.material.materialApp.scrollBehavior} + /// + /// See also: + /// + /// * [ScrollConfiguration], which controls how [Scrollable] widgets behave + /// in a subtree. + final ScrollBehavior scrollBehavior; + + static bool showPerformanceOverlayOverride = false; + + static bool debugShowWidgetInspectorOverride = false; + + static bool debugAllowBannerOverride = true; + + /// {@macro flutter.widgets.widgetsApp.useInheritedMediaQuery} + final bool useInheritedMediaQuery; + + @override + _FluentAppState createState() => _FluentAppState(); +} + +class _FluentAppState extends State { + late HeroController _heroController; + + @override + void initState() { + super.initState(); + _heroController = HeroController(); + } + + // Combine the Localizations for Material with the ones contributed + // by the localizationsDelegates parameter, if any. Only the first delegate + // of a particular LocalizationsDelegate.type is loaded so the + // localizationsDelegate parameter can be used to override + // _FluentLocalizationsDelegate. + Iterable> get _localizationsDelegates sync* { + if (widget.localizationsDelegates != null) { + yield* widget.localizationsDelegates!; + } + yield DefaultFluentLocalizations.delegate; + yield GlobalMaterialLocalizations.delegate; + yield GlobalWidgetsLocalizations.delegate; + } + + bool get _usesRouter => widget.routerDelegate != null; + + @override + Widget build(BuildContext context) { + final result = _buildApp(context); + return ScrollConfiguration( + behavior: widget.scrollBehavior, + child: HeroControllerScope( + controller: _heroController, + child: result, + ), + ); + } + + ThemeData theme(BuildContext context) { + final mode = widget.themeMode ?? ThemeMode.system; + final platformBrightness = MediaQuery.platformBrightnessOf(context); + final usedarkStyle = mode == ThemeMode.dark || + (mode == ThemeMode.system && platformBrightness == Brightness.dark); + + ThemeData data = () { + late ThemeData result; + if (usedarkStyle) { + result = widget.darkTheme ?? widget.theme ?? ThemeData(); + } else { + result = widget.theme ?? ThemeData(); + } + return result; + }(); + return data; + } + + Widget _builder(BuildContext context, Widget? child) { + final themeData = theme(context); + final mTheme = context.findAncestorWidgetOfExactType(); + return m.AnimatedTheme( + data: mTheme?.data ?? + m.ThemeData( + brightness: themeData.brightness, + canvasColor: themeData.cardColor, + textSelectionTheme: TextSelectionThemeData( + selectionColor: themeData.accentColor + .resolveFromBrightness(themeData.brightness) + .withOpacity(0.8), + cursorColor: themeData.inactiveColor, + ), + ), + child: AnimatedFluentTheme( + curve: themeData.animationCurve, + data: themeData, + child: widget.builder != null + ? Builder( + builder: (BuildContext context) { + // Why are we surrounding a builder with a builder? + // + // The widget.builder may contain code that invokes + // Theme.of(), which should return the theme we selected + // above in AnimatedTheme. However, if we invoke + // widget.builder() directly as the child of AnimatedTheme + // then there is no Context separating them, and the + // widget.builder() will not find the theme. Therefore, we + // surround widget.builder with yet another builder so that + // a context separates them and Theme.of() correctly + // resolves to the theme we passed to AnimatedTheme. + return widget.builder!(context, child); + }, + ) + : child ?? const SizedBox.shrink(), + ), + ); + } + + Widget _buildApp(BuildContext context) { + final fluentColor = widget.color ?? Colors.blue; + if (_usesRouter) { + return WidgetsApp.router( + key: GlobalObjectKey(this), + routeInformationProvider: widget.routeInformationProvider, + routeInformationParser: widget.routeInformationParser!, + routerDelegate: widget.routerDelegate!, + backButtonDispatcher: widget.backButtonDispatcher, + builder: _builder, + title: widget.title, + onGenerateTitle: widget.onGenerateTitle, + color: fluentColor, + locale: widget.locale, + localeResolutionCallback: widget.localeResolutionCallback, + localeListResolutionCallback: widget.localeListResolutionCallback, + supportedLocales: widget.supportedLocales, + showPerformanceOverlay: widget.showPerformanceOverlay, + checkerboardRasterCacheImages: widget.checkerboardRasterCacheImages, + checkerboardOffscreenLayers: widget.checkerboardOffscreenLayers, + showSemanticsDebugger: widget.showSemanticsDebugger, + debugShowCheckedModeBanner: widget.debugShowCheckedModeBanner, + shortcuts: widget.shortcuts, + actions: widget.actions, + restorationScopeId: widget.restorationScopeId, + localizationsDelegates: _localizationsDelegates, + useInheritedMediaQuery: widget.useInheritedMediaQuery, + ); + } + + return WidgetsApp( + key: GlobalObjectKey(this), + navigatorKey: widget.navigatorKey, + navigatorObservers: widget.navigatorObservers!, + home: widget.home, + routes: widget.routes!, + initialRoute: widget.initialRoute, + onGenerateRoute: widget.onGenerateRoute, + onGenerateInitialRoutes: widget.onGenerateInitialRoutes, + onUnknownRoute: widget.onUnknownRoute, + builder: _builder, + title: widget.title, + onGenerateTitle: widget.onGenerateTitle, + color: fluentColor, + locale: widget.locale, + localeResolutionCallback: widget.localeResolutionCallback, + localeListResolutionCallback: widget.localeListResolutionCallback, + supportedLocales: widget.supportedLocales, + showPerformanceOverlay: widget.showPerformanceOverlay, + checkerboardRasterCacheImages: widget.checkerboardRasterCacheImages, + checkerboardOffscreenLayers: widget.checkerboardOffscreenLayers, + showSemanticsDebugger: widget.showSemanticsDebugger, + debugShowCheckedModeBanner: widget.debugShowCheckedModeBanner, + shortcuts: widget.shortcuts, + actions: widget.actions, + restorationScopeId: widget.restorationScopeId, + localizationsDelegates: _localizationsDelegates, + useInheritedMediaQuery: widget.useInheritedMediaQuery, + pageRouteBuilder: (RouteSettings settings, WidgetBuilder builder) { + return FluentPageRoute(settings: settings, builder: builder); + }, + ); + } +} + +/// Describes how [Scrollable] widgets behave for [FluentApp]s. +/// +/// {@macro flutter.widgets.scrollBehavior} +/// +/// When using the desktop platform, if the [Scrollable] widget scrolls in the +/// [Axis.vertical], a [Scrollbar] is applied. +/// +/// See also: +/// +/// * [ScrollBehavior], the default scrolling behavior extended by this class. +class FluentScrollBehavior extends ScrollBehavior { + /// Creates a FluentScrollBehavior that decorates [Scrollable]s with + /// [Scrollbar]s based on the current platform and provided [ScrollableDetails]. + const FluentScrollBehavior(); + + @override + Widget buildScrollbar(context, child, details) { + // When modifying this function, consider modifying the implementation in + // the base class as well. + switch (axisDirectionToAxis(details.direction)) { + case Axis.horizontal: + return child; + case Axis.vertical: + switch (getPlatform(context)) { + case TargetPlatform.linux: + case TargetPlatform.macOS: + case TargetPlatform.windows: + return Scrollbar( + controller: details.controller, + child: child, + ); + case TargetPlatform.android: + case TargetPlatform.fuchsia: + case TargetPlatform.iOS: + return child; + } + } + } +} diff --git a/dependencies/fluent_ui-3.12.0/lib/src/controls/form/auto_suggest_box.dart b/dependencies/fluent_ui-3.12.0/lib/src/controls/form/auto_suggest_box.dart new file mode 100644 index 0000000..52483d7 --- /dev/null +++ b/dependencies/fluent_ui-3.12.0/lib/src/controls/form/auto_suggest_box.dart @@ -0,0 +1,515 @@ +import 'dart:ui' as ui; +import 'package:fluent_ui/fluent_ui.dart'; + +import 'package:flutter/foundation.dart'; + +enum TextChangedReason { + /// Whether the text in an [AutoSuggestBox] was changed by user input + userInput, + + /// Whether the text in an [AutoSuggestBox] was changed because the user + /// chose the suggestion + suggestionChosen, +} + +// TODO: Navigate through items using keyboard (https://github.com/bdlukaa/fluent_ui/issues/19) + +/// An AutoSuggestBox provides a list of suggestions for a user to select from +/// as they type. +/// +/// ![AutoSuggestBox Preview](https://docs.microsoft.com/en-us/windows/apps/design/controls/images/controls-autosuggest-expanded-01.png) +/// +/// See also: +/// +/// * +/// * [TextBox], which is used by this widget to enter user text input +/// * [Overlay], which is used to show the suggestion popup +class AutoSuggestBox extends StatefulWidget { + /// Creates a fluent-styled auto suggest box. + const AutoSuggestBox({ + Key? key, + required this.items, + this.controller, + this.onChanged, + this.onSelected, + this.leadingIcon, + this.trailingIcon, + this.clearButtonEnabled = true, + this.placeholder, + this.placeholderStyle, + this.style, + this.decoration, + this.foregroundDecoration, + this.highlightColor, + this.cursorColor, + this.cursorHeight, + this.cursorRadius, + this.cursorWidth = 1.5, + this.showCursor, + this.keyboardAppearance, + this.scrollPadding = const EdgeInsets.all(20.0), + this.selectionHeightStyle = ui.BoxHeightStyle.tight, + this.selectionWidthStyle = ui.BoxWidthStyle.tight, + }) : super(key: key); + + /// The list of items to display to the user to pick + final List items; + + /// The controller used to have control over what to show on + /// the [TextBox]. + final TextEditingController? controller; + + /// Called when the text is updated + final void Function(String text, TextChangedReason reason)? onChanged; + + /// Called when the user selected a value. + final ValueChanged? onSelected; + + /// A widget displayed at the start of the text box + /// + /// Usually an [IconButton] or [Icon] + final Widget? leadingIcon; + + /// A widget displayed at the end of the text box + /// + /// Usually an [IconButton] or [Icon] + final Widget? trailingIcon; + + /// Whether the close button is enabled + /// + /// Defauls to true + final bool clearButtonEnabled; + + /// The text shown when the text box is empty + /// + /// See also: + /// + /// * [TextBox.placeholder] + final String? placeholder; + + /// The style of [placeholder] + /// + /// See also: + /// + /// * [TextBox.placeholderStyle] + final TextStyle? placeholderStyle; + + /// The style to use for the text being edited. + final TextStyle? style; + + /// Controls the [BoxDecoration] of the box behind the text input. + final BoxDecoration? decoration; + + /// Controls the [BoxDecoration] of the box in front of the text input. + /// + /// If [highlightColor] is provided, this must not be provided + final BoxDecoration? foregroundDecoration; + + /// The highlight color of the text box. + /// + /// If [foregroundDecoration] is provided, this must not be provided. + final Color? highlightColor; + + /// {@macro flutter.widgets.editableText.cursorWidth} + final double cursorWidth; + + /// {@macro flutter.widgets.editableText.cursorHeight} + final double? cursorHeight; + + /// {@macro flutter.widgets.editableText.cursorRadius} + final Radius? cursorRadius; + + /// The color of the cursor. + /// + /// The cursor indicates the current location of text insertion point in + /// the field. + final Color? cursorColor; + + /// {@macro flutter.widgets.editableText.showCursor} + final bool? showCursor; + + /// Controls how tall the selection highlight boxes are computed to be. + /// + /// See [ui.BoxHeightStyle] for details on available styles. + final ui.BoxHeightStyle selectionHeightStyle; + + /// Controls how wide the selection highlight boxes are computed to be. + /// + /// See [ui.BoxWidthStyle] for details on available styles. + final ui.BoxWidthStyle selectionWidthStyle; + + /// The appearance of the keyboard. + /// + /// This setting is only honored on iOS devices. + /// + /// If unset, defaults to the brightness of [ThemeData.primaryColorBrightness]. + final Brightness? keyboardAppearance; + + /// {@macro flutter.widgets.editableText.scrollPadding} + final EdgeInsets scrollPadding; + + @override + _AutoSuggestBoxState createState() => _AutoSuggestBoxState(); + + @override + void debugFillProperties(DiagnosticPropertiesBuilder properties) { + super.debugFillProperties(properties); + properties.add(IterableProperty('items', items)); + properties.add(ObjectFlagProperty?>( + 'onSelected', + onSelected, + ifNull: 'disabled', + )); + properties.add(FlagProperty( + 'clearButtonEnabled', + value: clearButtonEnabled, + defaultValue: true, + ifFalse: 'clear button disabled', + )); + } + + static List defaultItemSorter(String text, List items) { + return items.where((element) { + return element.toString().toLowerCase().contains(text.toLowerCase()); + }).toList(); + } +} + +class _AutoSuggestBoxState extends State { + final FocusNode focusNode = FocusNode(); + OverlayEntry? _entry; + final LayerLink _layerLink = LayerLink(); + final GlobalKey _textBoxKey = GlobalKey(); + + late TextEditingController controller; + final FocusScopeNode overlayNode = FocusScopeNode(); + + final clearGlobalKey = GlobalKey(); + + @override + void initState() { + super.initState(); + controller = widget.controller ?? TextEditingController(); + controller.addListener(() { + if (!mounted) return; + if (controller.text.length < 2) setState(() {}); + }); + focusNode.addListener(_handleFocusChanged); + } + + @override + void dispose() { + focusNode.removeListener(_handleFocusChanged); + if (widget.controller == null) { + controller.dispose(); + } + super.dispose(); + } + + void _handleFocusChanged() { + final hasFocus = focusNode.hasFocus; + if (!hasFocus) { + _dismissOverlay(); + } else { + _showOverlay(); + } + setState(() {}); + } + + void _insertOverlay() { + _entry = OverlayEntry(builder: (context) { + final context = _textBoxKey.currentContext; + if (context == null) return const SizedBox.shrink(); + final box = _textBoxKey.currentContext!.findRenderObject() as RenderBox; + final child = Positioned( + width: box.size.width, + child: CompositedTransformFollower( + link: _layerLink, + showWhenUnlinked: false, + offset: Offset(0, box.size.height + 0.8), + child: SizedBox( + width: box.size.width, + child: FluentTheme( + data: FluentTheme.of(context), + child: _AutoSuggestBoxOverlay( + node: overlayNode, + controller: controller, + items: widget.items, + onSelected: (String item) { + widget.onSelected?.call(item); + controller.text = item; + controller.selection = TextSelection.collapsed( + offset: item.length, + ); + widget.onChanged?.call(item, TextChangedReason.userInput); + + // After selected, the overlay is dismissed and the text box is + // unfocused + _dismissOverlay(); + focusNode.unfocus(); + }, + ), + ), + ), + ), + ); + + return child; + }); + + if (_textBoxKey.currentContext != null) { + Overlay.of(context)?.insert(_entry!); + if (mounted) setState(() {}); + } + } + + void _dismissOverlay() { + _entry?.remove(); + _entry = null; + } + + void _showOverlay() { + if (_entry == null && !(_entry?.mounted ?? false)) { + _insertOverlay(); + } + } + + @override + Widget build(BuildContext context) { + assert(debugCheckHasFluentTheme(context)); + assert(debugCheckHasFluentLocalizations(context)); + + return CompositedTransformTarget( + link: _layerLink, + child: Actions( + actions: { + DirectionalFocusIntent: _DirectionalFocusAction(), + }, + child: TextBox( + key: _textBoxKey, + controller: controller, + focusNode: focusNode, + placeholder: widget.placeholder, + placeholderStyle: widget.placeholderStyle, + clipBehavior: + _entry != null ? Clip.none : Clip.antiAliasWithSaveLayer, + prefix: widget.leadingIcon, + clearGlobalKey: clearGlobalKey, + suffix: Row(mainAxisSize: MainAxisSize.min, children: [ + if (widget.trailingIcon != null) widget.trailingIcon!, + if (widget.clearButtonEnabled && controller.text.isNotEmpty) + Padding( + padding: const EdgeInsetsDirectional.only(start: 2.0), + child: IconButton( + key: clearGlobalKey, + icon: const Icon(FluentIcons.chrome_close), + onPressed: () { + controller.clear(); + focusNode.unfocus(); + }, + ), + ), + ]), + suffixMode: OverlayVisibilityMode.always, + onChanged: (text) { + widget.onChanged?.call(text, TextChangedReason.userInput); + _showOverlay(); + }, + style: widget.style, + decoration: widget.decoration, + foregroundDecoration: widget.foregroundDecoration, + highlightColor: widget.highlightColor, + cursorColor: widget.cursorColor, + cursorHeight: widget.cursorHeight, + cursorRadius: widget.cursorRadius, + cursorWidth: widget.cursorWidth, + showCursor: widget.showCursor, + scrollPadding: widget.scrollPadding, + selectionHeightStyle: widget.selectionHeightStyle, + selectionWidthStyle: widget.selectionWidthStyle, + ), + ), + ); + } +} + +class _DirectionalFocusAction extends DirectionalFocusAction { + @override + void invoke(covariant DirectionalFocusIntent intent) { + // if (!intent.ignoreTextFields || !_isForTextField) { + // primaryFocus!.focusInDirection(intent.direction); + // } + debugPrint(intent.direction.toString()); + } +} + +class _AutoSuggestBoxOverlay extends StatelessWidget { + const _AutoSuggestBoxOverlay({ + Key? key, + required this.items, + required this.controller, + required this.onSelected, + required this.node, + }) : super(key: key); + + final List items; + final TextEditingController controller; + final ValueChanged onSelected; + final FocusScopeNode node; + + @override + Widget build(BuildContext context) { + final theme = FluentTheme.of(context); + final localizations = FluentLocalizations.of(context); + return FocusScope( + node: node, + child: Container( + constraints: const BoxConstraints(maxHeight: 380), + decoration: ShapeDecoration( + shape: const RoundedRectangleBorder( + borderRadius: BorderRadius.vertical( + bottom: Radius.circular(4.0), + ), + ), + color: theme.menuColor, + shadows: [ + BoxShadow( + color: Colors.black.withOpacity(0.05), + offset: const Offset(-1, 1), + blurRadius: 2.0, + spreadRadius: 3.0, + ), + BoxShadow( + color: Colors.black.withOpacity(0.05), + offset: const Offset(1, 1), + blurRadius: 2.0, + spreadRadius: 3.0, + ), + ], + ), + child: ValueListenableBuilder( + valueListenable: controller, + builder: (context, value, _) { + final items = AutoSuggestBox.defaultItemSorter( + value.text, + this.items, + ); + late Widget result; + if (items.isEmpty) { + result = Padding( + padding: const EdgeInsets.only(bottom: 4.0), + child: _AutoSuggestBoxOverlayTile( + text: localizations.noResultsFoundLabel), + ); + } else { + result = ListView( + key: ValueKey(items.length), + shrinkWrap: true, + padding: const EdgeInsets.only(bottom: 4.0), + children: List.generate(items.length, (index) { + final item = items[index]; + return _AutoSuggestBoxOverlayTile( + text: '$item', + onSelected: () => onSelected(item), + ); + }), + ); + } + return result; + }, + ), + ), + ); + } +} + +class _AutoSuggestBoxOverlayTile extends StatefulWidget { + const _AutoSuggestBoxOverlayTile({ + Key? key, + required this.text, + this.onSelected, + }) : super(key: key); + + final String text; + final VoidCallback? onSelected; + + @override + __AutoSuggestBoxOverlayTileState createState() => + __AutoSuggestBoxOverlayTileState(); +} + +class __AutoSuggestBoxOverlayTileState extends State<_AutoSuggestBoxOverlayTile> + with SingleTickerProviderStateMixin { + late AnimationController controller; + final node = FocusNode(); + + @override + void initState() { + super.initState(); + controller = AnimationController( + vsync: this, + duration: const Duration(milliseconds: 125), + ); + controller.forward(); + } + + @override + void dispose() { + controller.dispose(); + node.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + final theme = FluentTheme.of(context); + return HoverButton( + focusNode: node, + onPressed: widget.onSelected, + margin: const EdgeInsets.only(top: 4.0, left: 4.0, right: 4.0), + builder: (context, states) => Stack( + children: [ + Container( + height: 36.0, + padding: const EdgeInsets.symmetric(horizontal: 10.0), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(4.0), + color: ButtonThemeData.uncheckedInputColor( + theme, + states.isDisabled ? {ButtonStates.none} : states, + ), + ), + alignment: AlignmentDirectional.centerStart, + child: EntrancePageTransition( + animation: Tween( + begin: 0.75, + end: 1.0, + ).animate(CurvedAnimation( + parent: controller, + curve: Curves.easeOut, + )), + vertical: true, + child: Text( + widget.text, + style: theme.typography.body, + ), + ), + ), + if (states.isFocused) + Positioned( + top: 11.0, + bottom: 11.0, + left: 0.0, + child: Container( + width: 3.0, + decoration: BoxDecoration( + color: theme.accentColor, + borderRadius: BorderRadius.circular(4.0), + ), + ), + ), + ], + ), + ); + } +} diff --git a/dependencies/fluent_ui-3.12.0/lib/src/controls/form/combo_box.dart b/dependencies/fluent_ui-3.12.0/lib/src/controls/form/combo_box.dart new file mode 100644 index 0000000..1a5a95d --- /dev/null +++ b/dependencies/fluent_ui-3.12.0/lib/src/controls/form/combo_box.dart @@ -0,0 +1,1369 @@ +import 'dart:math' as math; +import 'dart:ui' show window; + +import 'package:flutter/foundation.dart'; +import 'package:flutter/rendering.dart'; +import 'package:flutter/services.dart'; + +import 'package:fluent_ui/fluent_ui.dart'; + +import 'pickers/pickers.dart'; + +const Duration _kComboboxMenuDuration = Duration(milliseconds: 300); +const double _kMenuItemHeight = kPickerHeight; +const EdgeInsets _kMenuItemPadding = EdgeInsets.symmetric(horizontal: 12.0); +const EdgeInsetsGeometry _kAlignedButtonPadding = EdgeInsets.only( + top: 4.0, + bottom: 4.0, + right: 8.0, + left: 12.0, +); +const EdgeInsets _kAlignedMenuMargin = EdgeInsets.zero; +const EdgeInsets _kListPadding = EdgeInsets.symmetric(vertical: 8.0); +const double kMinInteractiveDimension = 48.0; + +/// A builder to customize combobox buttons. +/// +/// Used by [Combobox.selectedItemBuilder]. +typedef ComboboxBuilder = List Function(BuildContext context); + +class _ComboboxMenuPainter extends CustomPainter { + _ComboboxMenuPainter({ + this.selectedIndex, + required this.resize, + required this.getSelectedItemOffset, + required Color backgroundColor, + required double elevation, + }) : _painter = BoxDecoration( + // If you add an image here, you must provide a real + // configuration in the paint() function and you must provide some sort + // of onChanged callback here. + // color: color, + borderRadius: BorderRadius.circular(6.0), + border: Border.all(width: 0.25), + color: backgroundColor, + boxShadow: kElevationToShadow[elevation], + ).createBoxPainter(), + super(repaint: resize); + + final int? selectedIndex; + final Animation resize; + final ValueGetter getSelectedItemOffset; + final BoxPainter _painter; + + @override + void paint(Canvas canvas, Size size) { + final double selectedItemOffset = getSelectedItemOffset(); + final Tween top = Tween( + begin: selectedItemOffset.clamp(0.0, size.height - _kMenuItemHeight), + end: 0.0, + ); + + final Tween bottom = Tween( + begin: + (top.begin! + _kMenuItemHeight).clamp(_kMenuItemHeight, size.height), + end: size.height, + ); + + final Rect rect = Rect.fromLTRB( + 0.0, top.evaluate(resize), size.width, bottom.evaluate(resize)); + + _painter.paint(canvas, rect.topLeft, ImageConfiguration(size: rect.size)); + } + + @override + bool shouldRepaint(_ComboboxMenuPainter oldPainter) { + return oldPainter.selectedIndex != selectedIndex || + oldPainter.resize != resize; + } +} + +// Do not use the platform-specific default scroll configuration. +// Combobox menus should never overscroll or display an overscroll indicator. +class _ComboboxScrollBehavior extends FluentScrollBehavior { + const _ComboboxScrollBehavior(); + + @override + TargetPlatform getPlatform(BuildContext context) => defaultTargetPlatform; + + @override + Widget buildViewportChrome( + BuildContext context, Widget child, AxisDirection axisDirection) => + child; + + @override + ScrollPhysics getScrollPhysics(BuildContext context) => + const ClampingScrollPhysics(); +} + +// The widget that is the button wrapping the menu items. +class _ComboboxItemButton extends StatefulWidget { + const _ComboboxItemButton({ + Key? key, + this.padding, + required this.route, + required this.buttonRect, + required this.constraints, + required this.itemIndex, + }) : super(key: key); + + final _ComboboxRoute route; + final EdgeInsets? padding; + final Rect buttonRect; + final BoxConstraints constraints; + final int itemIndex; + + @override + _ComboboxItemButtonState createState() => _ComboboxItemButtonState(); +} + +class _ComboboxItemButtonState extends State<_ComboboxItemButton> { + void _handleFocusChange(bool focused) { + final bool inTraditionalMode; + switch (FocusManager.instance.highlightMode) { + case FocusHighlightMode.touch: + inTraditionalMode = false; + break; + case FocusHighlightMode.traditional: + inTraditionalMode = true; + break; + } + + if (focused && inTraditionalMode) { + final _MenuLimits menuLimits = widget.route.getMenuLimits( + widget.buttonRect, widget.constraints.maxHeight, widget.itemIndex); + widget.route.scrollController!.animateTo( + menuLimits.scrollOffset, + curve: Curves.easeInOut, + duration: const Duration(milliseconds: 100), + ); + } + } + + void _handleOnTap() { + final ComboboxItem comboboxMenuItem = + widget.route.items[widget.itemIndex].item!; + + if (comboboxMenuItem.onTap != null) { + comboboxMenuItem.onTap!(); + } + + Navigator.pop( + context, + _ComboboxRouteResult(comboboxMenuItem.value), + ); + } + + static final Map _webShortcuts = + { + LogicalKeySet(LogicalKeyboardKey.enter): const ActivateIntent(), + }; + + @override + Widget build(BuildContext context) { + assert(debugCheckHasFluentTheme(context)); + Widget child = HoverButton( + autofocus: widget.itemIndex == widget.route.selectedIndex, + builder: (context, states) { + final theme = FluentTheme.of(context); + return Padding( + padding: const EdgeInsets.only(right: 6.0, left: 6.0, bottom: 4.0), + child: Stack(fit: StackFit.loose, children: [ + Container( + decoration: BoxDecoration( + color: () { + if (states.isFocused) { + return ButtonThemeData.uncheckedInputColor( + theme, + {ButtonStates.hovering}, + ); + } + return ButtonThemeData.uncheckedInputColor(theme, states); + }(), + borderRadius: BorderRadius.circular(4.0), + ), + padding: widget.padding, + child: widget.route.items[widget.itemIndex], + ), + if (states.isFocused) + AnimatedPositioned( + duration: theme.fastAnimationDuration, + curve: theme.animationCurve, + top: states.isPressing ? 10.0 : 8.0, + bottom: states.isPressing ? 10.0 : 8.0, + child: Container( + width: 3.0, + decoration: BoxDecoration( + color: theme.accentColor + .resolveFromReverseBrightness(theme.brightness), + borderRadius: BorderRadius.circular(50.0), + ), + ), + ), + ]), + ); + }, + onPressed: _handleOnTap, + onFocusChange: _handleFocusChange, + ); + if (kIsWeb) { + // On the web, enter doesn't select things, *except* in a